<?php
namespace app\adminVue\controller;

use app\BaseController;
use think\facade\Db;
use think\facade\Cache;
use think\facade\Session;
use think\Request;
use app\admin\model\LeOutput;

class MfgUpdate extends TokenCheck
{   
    // 员工个人考勤上传
    public function memberSingleAttendance(){
        $data = input('post.');
        $date = strtotime($data['kq_date']);
        $control = Db::name('team_base')->where(array('mid'=>9,'content'=>1))->value('mark');
        if($control=='false'&&session('admin')['job']==9&&time()-$date>3600*35){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'不允许考勤日第二天11点以后进行考勤提报及修改！')));
        }
        if(isset($data['id']) && $data['id']>0){
            $data = array_intersect_key($data,['id'=>0,'kq_status'=>0,'worktime'=>0,'overtime'=>0,'mark'=>0]);
            Db::name('le_attendance')->save($data);
            $tid = Db::name('le_attendance')->where('id',$data['id'])->value('tid');
        }else{
            $info = Db::name('member_list')->find($data['mid']);
            $tid = $info['tid'];
            $data['kq_date'] = $date;
            $data = array_intersect_key($data,['kq_date'=>0,'mid'=>0,'kq_status'=>0,'worktime'=>0,'overtime'=>0,'mark'=>0]);
            $info = array_intersect_key($info,['tid'=>0,'poid'=>0,'temp_skill_id'=>0,'changed'=>0,'indirect'=>0,'position_mark'=>0]);
            $data = array_merge($data,$info);
            $data['create_time'] = time();
            $data['update_time'] = time();
            $tid_info = Db::name('team_list')->find($data['tid']);
            $data['shift'] = $tid_info['shift'];
            $data['shift_type'] = $tid_info['shift_type'];
            Db::name('le_attendance')->insert($data);
        }
        $this->le_update_kq($tid,$date);
        exit(json_encode(array('code'=>0,'msg'=>'考勤提报成功！')));
    }
    // 班组考勤上传
    public function memberTeamAttendance(){
        $data = input('post.');
        $control = Db::name('team_base')->where(array('mid'=>9,'content'=>1))->value('mark');
        foreach ($data as $k => $v) {
            if($control=='false'&&time()-$v['kq_date']>3600*35){
                http_response_code(440);
                exit(json_encode(array('code'=>1,'msg'=>'不允许考勤日第二天11点以后进行考勤提报及修改！')));
            }
            if($v['kq_id']==0){
                unset($v['id']);
                $v['create_time'] = time();
            }
            $v = array_diff_key($v,['eid'=>0,'ename'=>0,'kq_id'=>0,'team'=>0,'order'=>0,'poid_type'=>0,'position'=>0,'unself'=>0]);
            $v['update_time'] = time();
            Db::name('le_attendance')->save($v);
            $tid = $v['tid'];
            $date = $v['kq_date'];
        }
        $this->le_update_kq($tid,$date);
        exit(json_encode(array('code'=>0,'msg'=>'班组考勤提报成功！')));
    }
    //新建班组
    public function createTeam(){
        $data = input('post.');
        $data['line'] = $data['line'][1];
        $data['aid'] = $data['aid'][2];
        $record = Db::name('team_list')->where('team',$data['team'])->find();
        if($record){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'班组名已存在，请重新输入！')));
        }else{
            Db::name('team_list')->insert($data);
            exit(json_encode(array('code'=>0,'msg'=>'班组新增成功！')));
        }        
    }
    //修改班组班别状态
    public function teamshiftChange(){
        Db::name('team_list')->where('id',input('post.id'))->update(['shift'=>input('post.shift')]);
        exit(json_encode(array('code'=>0,'msg'=>'班别已改成'.(input('post.shift')==1?'白班':'夜班'))));
    }
    //修改班组班别类型状态
    public function teamShiftTypeChange(){
        Db::name('team_list')->where('id',input('post.id'))->update(['shift_type'=>input('post.shift_type')]);
        exit(json_encode(array('code'=>0,'msg'=>'考勤班别修改成功！')));
    }
    
    //修改班组状态
    public function teamStatusChange(){
        Db::name('team_list')->where('id',input('post.id'))->update(['status'=>input('post.status')]);
        exit(json_encode(array('code'=>0,'msg'=>'班组已'.(input('post.status')==1?'启用':'停用'))));
    }
    //修改班组班长
    public function teamLeaderChange(){
        Db::name('team_list')->where('id',input('post.id'))->update(['aid'=>input('post.aid')]);
        $name = Db::name('admin_user')->where('id',input('post.aid'))->value('truename');
        exit(json_encode(array('code'=>0,'msg'=>'班长修改成功！','name'=>$name)));
    }
    //员工技能熟练度更新
    public function skillLevelChange(){
        Db::name('member_skill')->where('id',input('post.id'))->update(['level'=>input('post.level')]);
        exit(json_encode(array('code'=>0,'msg'=>'熟练度已更新！')));
    }
    //班长给员工添加普通岗位技能
    public function addNormalSkill(){
        $data = input('post.');
        if($data['skill_id']==''){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'岗位技能不能为空！'))); 
        }
        $data['level'] = 1;
        $data['skill_type'] = 0;
        $data['mark'] = session('admin')['truename'].'于'.date('Y-m-d H:i:s').'添加此技能';
        $record = Db::name('member_skill')->where(array('mid'=>$data['mid'],'skill_id'=>$data['skill_id'],'status'=>1))->find();
        if($record){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'该员工已有此岗位技能，请确认！')));
        }else{
            Db::name('member_skill')->insert($data);
            exit(json_encode(array('code'=>0,'msg'=>'额外普通技能添加成功！'))); 
        }
    }
    //班长给员工设置本岗位技能
    public function setMemberSelfSkill(){
        Db::name('member_skill')->where(array('mid'=>input('post.mid'),'on_self'=>1))->update(['on_self'=>0]);
        Db::name('member_skill')->where('id',input('post.id'))->update(['on_self'=>1]);
        exit(json_encode(array('code'=>0,'msg'=>'本岗位设置成功')));
    }
    //班长删除员工的普通岗位技能
    public function deleteNormalSkill(){
        Db::name('member_skill')->where('id',input('post.id'))->update(['status'=>0,'mark'=>session('admin')['truename'].'于'.date('Y-m-d H:i:s').'删除此技能']);
        exit(json_encode(array('code'=>0,'msg'=>'本岗位设置成功')));
    }
    //班长申请员工调动
    public function teamMemberTransfer(){
        $data = input('post.');
        $list['out_aid'] = session('admin')['id'];
        $list['in_aid'] = $data['in_aid'];
        $list['out_tid'] = $data['tid'];
        $list['apply_date'] = time();
        $list['number'] = count($data['transfer']);
        $list['apply_date'] = time();
        $apply_id = Db::name('member_transfer_list')->insertGetId($list);
        foreach ($data['transfer'] as $k => $v){
            Db::name('member_transfer_record')->insert(array('apply_id'=>$apply_id,'mid'=>$v['id']));
            Db::name('member_list')->where('id',$v['id'])->update(array('lock'=>'1'));
        }
        exit(json_encode(array('code'=>0,'msg'=>'提交成功')));
    }
    //组员岗位变更
    public function MemberPositionUpdate(){
        $data = input('post.');
        $poid_info = Db::name('team_plan_position')->find($data['poid']);
        $skill_need = Db::name('team_plan_position_skills')->where('status',1)->where('p_id',$data['poid'])->column('skill_id');
        $skill_need_name = '';
        if($skill_need){
            $mid_skills = Db::name('member_skill')->where(array('mid'=>$data['id'],'status'=>1))->column('skill_id');
            $error_skills = [];
            foreach ($skill_need as $k => $v) {
                if(in_array($v,$mid_skills)==false){
                    array_push($error_skills,$v);
                }
            }
            if(count($error_skills)>0){
                $skills_name = Db::name('quality_base')->whereIn('id',$error_skills)->column('content');
                $name = join(',',$skills_name);
                http_response_code(440);
                exit(json_encode(array('code'=>1,'msg'=>'您登记的员工无以下技能!<br>'.$name.'')));
            }
            $skills_name = Db::name('quality_base')->whereIn('id',$skill_need)->column('content');
            $skill_need_name = join(',',$skills_name);
        }
        $res['id'] = $data['id'];
        $res['poid'] = $data['poid'];
        $res['indirect'] = $poid_info['type']>4?2:1;
        Db::name('member_list')->save($res);
        exit(json_encode(array('code'=>0,'msg'=>'岗位设置成功！','positiontype'=>$poid_info['type'],'skill_need_name'=>$skill_need_name)));
    }
    //组员临时岗位技能保存
    public function memberTempSkillsSave(){
        $data = input('post.');
        $data['creator'] = session('admin')['id'];
        $data['create_time'] = time();
        $mid_skills = Db::name('member_skill')->where(array('mid'=>$data['mid'],'status'=>1))->column('skill_id');
        $need_skills = $data['skills'];
        $error_skills = [];
        foreach ($data['skills'] as $k => $v) {
            if(in_array($v,$mid_skills)==false){
                array_push($error_skills,$v);
            }
        }
        if(count($error_skills)>0){
            $skills_name = Db::name('quality_base')->whereIn('id',$error_skills)->column('content');
            $name = join(',',$skills_name);
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'您登记的员工无以下技能！<br>'.$name)));
        }
        $data['skills'] = join(',',$data['skills']);
        $id = Db::name('team_plan_position_temp')->insertGetId($data);
        if($id){
            Db::name('member_list')->where('id',$data['mid'])->update(['poid'=>801,'changed'=>2,'temp_skill_id'=>$id]);
            $skills_name = Db::name('quality_base')->whereIn('id',$need_skills)->column('content');
            $name = join(',',$skills_name);
            exit(json_encode(array('code'=>0,'temp_skill_id'=>$id,'skill_need_name'=>$name)));
        }else{
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'添加临时岗位失败，请联系管理员！')));
        }
    }
    //员工转岗设置
    public function memberChangedSave(){
        $data = input('post.');
        Db::name('member_list')->where('id',$data['id'])->update(['changed'=>$data['changed']]);
        exit(json_encode(array('code'=>0,'msg'=>'转岗类型已更改')));
    }
    //员工岗位备注设置
    public function memberMarkSave(){
        $data = input('post.');
        Db::name('member_list')->where('id',$data['id'])->update(['mark'=>$data['mark']]);
        exit(json_encode(array('code'=>0,'msg'=>'岗位备注已保存')));
    }
    //班组产能方案设置
    public function teamPlanSave(){
        $data['id'] = input('post.tid');
        $data['plan_id'] = input('post.plan_id');
        $plan_info = Db::name('team_plan_capacity')->find($data['plan_id']);
        $plan_info = array_intersect_key($plan_info,['hc_idl'=>0,'hc_design'=>0,'hc_support'=>0,'hc_audit'=>0,'le_design'=>0,'le_actual'=>0]);
        $data = array_merge($data,$plan_info);
        Db::name('team_list')->save($data);
        $skill_list = Db::name('team_plan_position')->where(array('plan_id'=>$data['plan_id'],'status'=>1))->column('id');
        $member_list = Db::name('member_list')->where(array('tid'=>$data['id'],'status'=>1))->field('id')->lists();
        $skill_list_unused = $skill_list;
        foreach ($member_list as $key => $value) {
            Db::name('member_list')->update(['id'=>$member_list[$key]['id'],'poid'=>0]);
            $member_skill_list = Db::name('member_position_record')->where('mid',$value['id'])->order('number desc')->column('poid');
            if(count($member_skill_list)>0){
                foreach ($member_skill_list as $k => $v) {
                    if(in_array($v,$skill_list_unused)){
                        Db::name('member_list')->update(['id'=>$value['id'],'poid'=>$v]);
                        $skill_list_unused = array_diff($skill_list_unused,['used'=>$v]);
                        break;
                    }
                }
            } 
        }
        $member_unset = Db::name('member_list')->where(array('tid'=>$data['id'],'status'=>1,'poid'=>0))->field('id')->column('id');
        if(count($member_unset)>0){
            foreach ($member_unset as $key => $value) {
                $member_skill_list = Db::name('member_position_record')->where('mid',$value)->lists();
                if(count($member_skill_list)>0){
                    foreach ($member_skill_list as $k => $v) {
                        $member_set = Db::name('member_list')->where(array('tid'=>$data['id'],'status'=>1,'poid'=>$v['poid']))->find();
                         if($member_set){
                        $member_set_skill_list = Db::name('member_position_record')->where(array('mid'=>$member_set['id']))->lists();
                        if(count($member_set_skill_list)>1){
                            foreach ($member_set_skill_list as $i => $val) {
                                if(in_array($val['poid'],$skill_list_unused)){
                                    Db::name('member_list')->update(['id'=>$member_set['id'],'poid'=>$val['poid']]);
                                    Db::name('member_list')->update(['id'=>$value,'poid'=>$member_set['poid']]);
                                    $skill_list_unused = array_diff($skill_list_unused,['used'=>$val['poid']]);
                                    break;
                                }
                            }
                        }
                    }
                    }
                } 
            }
        }
        exit(json_encode(array('code'=>0,'msg'=>'产能方案修改成功！')));
    }
    //班组信息保存
    public function teamInfoSave(){
        $data = input('post.');
        Db::name('team_list')->save($data);
        exit(json_encode(array('code'=>0,'msg'=>'更新成功！')));
    }
    //人员调动单删除/撤回
    public function transferListDelete(){
        if(session('admin')['id']==input('post.in_aid')){
            $status = 2;
        }else{
            $status = 3;
        }
        $mid_list = Db::name('member_transfer_record')->where('apply_id',input('post.id'))->field('id,mid')->lists();
        foreach ($mid_list as $k => $v){
            Db::name('member_transfer_record')->where('id',$v['id'])->update(array('status'=>$status));
            Db::name('member_list')->where('id',$v['mid'])->update(array('lock'=>0));
        }
        Db::name('member_transfer_list')->where(array('id'=>input('post.id')))->update(array('due_date'=>time(),'status'=>$status));
        exit(json_encode(array('code'=>0,'msg'=>($status==2?'退回':'撤回').'成功')));
    }
    //人员调动保存
    public function teamTransferDetailSave(){
        $data = input('post.');
        foreach ($data as $k => $v){
           $res = array_intersect_key($v,['id'=>0,'in_tid'=>0]);
           $res['status'] = 1;
           Db::name('member_transfer_record')->save($res);
           $re['id'] = $v['mid'];
           $re['poid'] = 0;
           $re['changed'] = 2;
           $re['lock'] = 0;
           $re['tid'] = $res['in_tid'];
           Db::name('member_list')->save($re);
           $apply_id = $v['apply_id'];
        }
        Db::name('member_transfer_list')->where(array('id'=>$apply_id))->update(array('due_date'=>time(),'status'=>1));
        exit(json_encode(array('code'=>0,'msg'=>'调动完成！')));
    }
    //新增工时借用单
    public function createLent(){
        $data = input('post.');
        if(!$this->le_control($data['eff_date'])){
            exit(json_encode(array('code'=>2,'msg'=>'请注意，借用日期第二天中午11点以后不允许再进行工时借出！')));
        }
        $data['out_aid'] = session('admin')['id'];
        $data['sub_time'] = time();
        $data['eff_date'] = strtotime($data['eff_date']);
        $lent_end = Db::name('le_report')->where(array('tid'=>$data['out_tid'],'le_date'=>$data['eff_date']))->find();
        if(!$lent_end||($lent_end&&$lent_end['input']==0&&$lent_end['idl_wt']==0&&$lent_end['idl_ot']==0)){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'无相应班组考勤记录，请确认！')));
        }
        $used = 0;
        $lent_max = $lent_end['input'];
        $used_list = Db::name('le_lent')->where(array('eff_date'=>$data['eff_date'],'out_tid'=>$data['out_tid']))->where('status','>',0)->where('status','<',3)->cates('id');
        foreach ($used_list as $k => $v) {
            $used = $used + $v['hours'];
            if($v['status']==2){
                $lent_max = $lent_max + $v['hours'];
            }else{
                $lent_end['input'] = $lent_end['input'] - $v['hours'];
            }
        }
        if($data['hours']>$lent_end['input']){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'本班组直接考勤工时'.$lent_max.'小时，已借出工时'.$used.'小时，<br>剩余可借出工时 '.$lent_end['input'].' 小时！')));
        }
        if($data['type']==1){
            $data['item'] = 0;
        }else{
            $item_info = Db::name('le_lent_order')->find($data['item']);
            if($data['hours']>($item_info['hours']-$item_info['used'])){
                exit(json_encode(array('code'=>2,'msg'=>'您选择的项目剩余工时低于您填写的工时，请确认！')));
            }
            foreach ($data['attendanceData'] as $k => $v) {
                $v = array_intersect_key($v,['mid'=>0,'out_wt'=>0,'out_ot'=>0]);
                $v['item'] = $data['item'];
                $v['eff_date'] = $data['eff_date'];
                Db::name('le_lent_order_detail')->save($v);
                Db::name('le_lent_order')->where('id',$data['item'])->update(['used'=>$item_info['used']+$data['hours']]);
            }
            $data['status'] = 2;
            $data['due_time'] = $data['sub_time'];
        }
        $data = array_diff_key($data,['type'=>0,'attendanceData'=>0]);
        Db::name('le_lent')->insert($data);
        $this->le_update_kq($data['out_tid'],$data['eff_date']);
        exit(json_encode(array('code'=>0,'msg'=>'新增工时单完成！')));
    }
    //考勤控制
    private function le_control($data){
        //考勤控制
        $control = Db::name('team_base')->where(array('mid'=>9,'content'=>3))->value('mark');
        if($control=='false'&&time()>strtotime($data)+3600*35){
            return false;
        }else{
            return true;
        }
    }
    //工时借用单确认
    public function lentConfirm(){
        $post = input('post.');
        $data = array_intersect_key($post,['id'=>0,'in_tid'=>0,'status'=>0]);
        $data['due_time'] = time();
        $data['item'] = 0;
        if($data['in_tid']==51){
            $data['in_tid'] = 0;
        }
        Db::name('le_lent')->save($data);
        if($data['in_tid']>0){
            $this->le_update_kq($post['in_tid'],strtotime($post['eff_date']));
        }
        $this->le_update_kq($post['out_tid'],strtotime($post['eff_date']));
        exit(json_encode(array('code'=>0,'msg'=>'该借用工时已确认！')));
    }
    //工时单取消
    public function lentDelete(){
        Db::name('le_lent')->where('id',input('post.id'))->update(['status'=>session('admin')['id']==input('post.out_aid')?3:4]);
        exit(json_encode(array('code'=>0,'msg'=>'该借用工时单已取消！')));
    }
    //产出表格内容保存
    public function outputSave(){
        $info = input('post.');
        $pid_info = Db::name('le_product_list')->find($info['pid']);
        if($info['id']=='new'){
            $tid_info = Db::name('team_list')->find($info['tid']);
            if($tid_info['mark']=='KSK'){
                http_response_code(440);
                exit(json_encode(array('code'=>1,'msg'=>'KSK产品不允许直接修改产品数量！')));
            }
            $out = array_intersect_key($info,['pid'=>0,'out_pp'=>0,'owner'=>0,'pp_id'=>0,'jph'=>0,'shift'=>0]);
            $out['project'] = $pid_info['project'];
            $out['line'] = $tid_info['line'];
            $out['family'] = $pid_info['family'];
            $out['tid'] = $info['tid'];
            $out['aid'] = session('admin')['id'];
            $out['ppdate'] = strtotime($info['le_date']);
            $out['update'] = time();
            $out['out_mfg'] = $info['out_mfg'];
            $out['ramp_up'] = round((int)strstr($info['ramp_up'],'%',true)/100,3);
            $out['pp_fo'] = $out['out_pp']*$pid_info['fap'];
            $out['mfg_co'] = $out['out_mfg']*$pid_info['ccp'];
            $out['mfg_lo'] = $out['out_mfg']*$pid_info['lpp'];
            $out['mfg_fo'] = $out['out_mfg']*$pid_info['fap'];
            $Output = new LeOutput;
            $Output->save($out);
            exit(json_encode(array('code'=>0,'msg'=>'产出提报完成！','id'=>$Output->id)));
        }else{
            $Output = LeOutput::find($info['id']);
            $pid_info = Db::name('le_product_list')->find($info['pid']);
            $Output->out_mfg = $info['out_mfg'];
            $Output->update = time();
            $Output->mfg_co = $info['out_mfg']*$pid_info['ccp'];
            $Output->mfg_lo = $info['out_mfg']*$pid_info['lpp'];
            $Output->mfg_fo = $info['out_mfg']*$pid_info['fap'];
            $Output->save();
            exit(json_encode(array('code'=>0,'msg'=>'产出修改完成！')));
        }
    }
    //产出记录备注保存
    public function outputMarkSave(){
        Db::name('le_output')->where('id',input('post.id'))->update(['mfgmark'=>input('post.mfgmark')]);
        exit(json_encode(array('code'=>0,'msg'=>'产出备注成功！')));
    }
    //非计划产出提报
    public function unplanOuttputAdd(){
        $data = input('post.');
        $data['ppdate'] = strtotime($data['ppdate']);
        //考勤控制
        $control = Db::name('team_base')->where(array('mid'=>9,'content'=>2))->value('mark');
        if($control=='false'&&time()-$data['ppdate']>86400*1.5){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'不允许考勤日第二天12点以后进行产出修改！')));
        }
        //考勤控制结束
        $record = Db::name('le_output')->where(array('tid'=>$data['tid'],'ppdate'=>$data['ppdate'],'pid'=>$data['pid']))->find();
        if($record){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'此产品有排产或已经提报过，请返回班组产出列表确认！')));
        }else{
            $data['update'] = time();
            $data['aid'] = session('admin')['id'];
            $data['shift'] = Db::name('team_list')->where('id',$data['tid'])->value('shift');
            $data['ramp_up'] = round((int)$data['ramp_up']/100,3);
            $data['owner'] = session('admin')['id'];
            $pid_info = Db::name('le_product_list')->find($data['pid']);
            $data['mfg_co'] = $data['out_mfg']*$pid_info['ccp'];
            $data['mfg_lo'] = $data['out_mfg']*$pid_info['lpp'];
            $data['mfg_fo'] = $data['out_mfg']*$pid_info['fap'];
            $data['line'] = Db::name('team_base')->where('id',$data['family'])->value('mark');
            $data = array_diff_key($data,['project_name'=>0,'family_name'=>0,'cpd'=>0,'desc'=>0]);
            $Output = new LeOutput;
            $Output->save($data);
            exit(json_encode(array('code'=>0,'msg'=>'计划外产出提报完成！')));
        }
    }
    //删除考勤
    public function attendanceDelete(){
        $data = input('post.');
        Db::name('le_attendance')->delete($data['id']);
        $this->le_update_kq($data['tid'],strtotime($data['kq_date']));
        exit(json_encode(array('code'=>0,'msg'=>'考勤删除成功！')));
    }
    //删除产出
    public function outputDelete(){
        $data = input('post.');
        $Output = LeOutput::find($data['id']);
        $Output->delete();
        exit(json_encode(array('code'=>0,'msg'=>'产出删除成功！')));
    }
    //考勤提报状态控制
    public function leSubmitControl(){
        $data = input('post.');
        Db::name('team_base')->where('id',464)->update(['mark' => ($data['attencance']==1?'true':'false')]);
        Db::name('team_base')->where('id',465)->update(['mark' => ($data['output']==1?'true':'false')]);
        Db::name('team_base')->where('id',466)->update(['mark' => ($data['lent']==1?'true':'false')]);
        exit(json_encode(array('code'=>0,'msg'=>'设置成功！')));
    }
    //KSK产出提报
    public function kskOutputUpload(){
        $data = input('post.');
        $ppdate = strtotime($data['le_date']);
        $list = array_column($data['output'],'order');
        // print_r($data['output']);die;
        $order = Db::name('le_ksk_order')->whereIn('order',$list)->column('bom','order');
        $order_update = Db::name('le_ksk_order')->whereIn('order',$list)->column('order');
        $dif = array_values(array_diff($list, $order_update));
        if(count($dif)>0){
            http_response_code(440);
            $name = join(',',$dif);
            exit(json_encode(array('code'=>1,'msg'=>'部分订单在系统内未找到！<br>'.$name)));
        }
        $bom = Db::name('le_ksk_bom')->whereIn('bom',array_unique($order))->cates('bom');
        $unused = [];
        foreach ($list as $k => $v) {
            if($v!==''){
                $arr[$k]['ccp'] = $bom[$order[$v]]['ccp'];
                $arr[$k]['lpp'] = $bom[$order[$v]]['lpp'];
                $arr[$k]['fap'] = $bom[$order[$v]]['fap'];
                $arr[$k]['modules'] = $bom[$order[$v]]['modules'];
                $arr[$k]['order'] = $v;
            }else{
                array_push($unused,$v);
            }
        }
        if(count($unused)>0){
            http_response_code(440);
            $name = join(',',$unused);
            exit(json_encode(array('code'=>2,'msg'=>'部分订单无对应BOM数据！'.$name)));
        }
        $ccp = array_sum(array_column($arr,'ccp'));
        $lpp = array_sum(array_column($arr,'lpp'));
        $fap = array_sum(array_column($arr,'fap'));
        $modules = array_sum(array_column($arr,'modules'));
        $team_info = Db::name('team_list')->find($data['tid']);
        $record = Db::name('le_output')->where(array('tid'=>$data['tid'],'ppdate'=>$ppdate,'status'=>1))->find();
        if($record){
            // print_r($fap);       
            $Output = LeOutput::find($record['id']);
            $Output->mfg_co = $ccp;
            $Output->mfg_lo = $lpp;
            $Output->mfg_fo = $fap;
            $Output->out_mfg = count($arr);
            $Output->modules = $modules;
            $Output->save();
            
        }else{
            $ksk['project'] = $team_info['project'];
            $ksk['line'] = $team_info['line'];
            $ksk['shift'] = $team_info['shift'];
            $ksk['tid'] = $team_info['id'];
            $ksk['aid'] = session('admin')['id'];
            $ksk['ppdate'] = $ppdate;
            $ksk['mfg_co'] = $ccp;
            $ksk['mfg_lo'] = $lpp;
            $ksk['mfg_fo'] = $fap;
            $ksk['out_mfg'] = count($list);
            $ksk['modules'] = $modules;
            $ksk['update'] = time();
            $ksk['owner'] = $ksk['aid'];
            $ksk['family'] = Db::name('team_family')->where('tid',$ksk['tid'])->value('family');
            $ksk['pid'] = Db::name('le_product_list')->where(array('project'=>$ksk['project'],'family'=>$ksk['family']))->value('id');
            $jph = Db::name('team_plan_jph')->where(array('project'=>$ksk['project'],'pid'=>$ksk['pid']))->find();
            if(!$jph){
                exit(json_encode(array('code'=>1,'msg'=>'无JPH设置相关数据！')));
            }
            $shift = substr($team_info['team'],-1);
            if(isset($jph[$shift])==false){
                exit(json_encode(array('code'=>1,'msg'=>'未设置你所选班组生产该项产品的JPH！')));
            }
            $ksk['jph'] = $jph[$shift];
            //添加KSK产出计划信息
            $pp = array_intersect_key($ksk,['project'=>0,'ppdate'=>0,'family'=>0,'shift'=>0,'pid'=>0,'jph'=>0,'ramp_up'=>0,'update'=>0]);
            $pp['out_pp'] = $ksk['out_mfg'];
            $pp['mark'] = 'KSK计划添加';
            $pp['owner'] = Db::name('le_pp')->where(array('family'=>$pp['family'],'status'=>1))->order('ppdate desc')->value('owner');
            //添加KSK产出计划结束
            $Output = new LeOutput;
            $Output->save($ksk);
            $pp_record = Db::name('le_pp')->where(array('pid'=>$pp['pid'],'shift'=>$pp['shift'],'ppdate'=>$pp['ppdate'],'status'=>1))->find();
            if(!$pp_record){
                Db::name('le_pp')->save($pp);
            }
        }
        $order_list = Db::name('le_ksk_order')->whereIn('order',$list)->column('id');
        $now = time();
        foreach ($order_list as $k => $v) {
            $record = [];
            $record['id'] = $v; 
            $record['update'] = $now;
            $record['work_date'] = $ppdate;
            $record['tid'] = $data['tid'];
            Db::name('le_ksk_order')->save($record);
        }
        exit(json_encode(array('code'=>0,'msg'=>'KSK产出提报完成！总产出'.count($list).'根')));
    }
    //产出刷新
    public function outputFlash(){
        $flash =input('post.');
        if(count($flash['flash'])>0){
            foreach ($flash['flash'] as $k => $v) {
                $save = array_intersect_key($v, ['id'=>0,'out_pp'=>0,'pp_fo'=>0,'out_pp'=>0,'pp_id'=>0]);
                $save['ramp_up'] =  round((int)strstr($v['ramp_up'],'%',true)/100,3); 
                Db::name('le_output')->save($save);
            }
        }
        $tid = $flash['tid'];
        $date = strtotime($flash['le_date']);
        $this->le_update_kq($tid,$date);
        $tid_info = Db::name('team_list')->find($tid);
        $level = Db::name('team_base')->where('id',$tid_info['project'])->value('content');
        if($level<4){
            $team_le_report = Db::name('le_report')->where(array('tid'=>$tid,'le_date'=>$date))->find();
            $out_list = Db::name('le_output')->where(array('tid'=>$tid,'ppdate'=>$date))->where('out_mfg','>',0)->lists();
            if(count($out_list)>0){
                $familys = Db::name('team_base')->where(array('mid'=>3,'mark'=>$tid_info['line']))->column('id');
                $pp_list = Db::name('le_pp')->where(array('ppdate'=>$date,'status'=>1,'shift'=>$team_le_report['shift']))->whereIn('family',$familys)->lists();
                $pid_info = Db::name('le_product_list')->whereIn('id',array_column($pp_list,'pid'))->cates('id');
                foreach ($pp_list as $k => $v) {
                    $pp_list[$k]['pp_fo_before'] = $v['out_pp']*$pid_info[$v['pid']]['fap'];
                    $pp_list[$k]['pp_fo_after'] = $v['out_pp']*$pid_info[$v['pid']]['fap']*$v['ramp_up'];
                }
                $data['shift'] = $out_list[0]['shift'];
                $data['ramp_up'] = array_sum(array_column($pp_list,'pp_fo_before'))>0?round(array_sum(array_column($pp_list,'pp_fo_after'))/array_sum(array_column($pp_list,'pp_fo_before')),3):1;
                $data['cc_output'] = array_sum(array_column($out_list,'mfg_co'));
                $data['lp_output'] = array_sum(array_column($out_list,'mfg_lo'));
                $data['output'] = array_sum(array_column($out_list,'mfg_fo'));
                $data['output_plan'] = array_sum(array_column($out_list,'pp_fo'));
                $record_id = Db::name('le_report')->where(array('tid'=>$tid,'le_date'=>$date))->value('id');
                $data['le_target'] = $tid_info['le_actual']>0?$tid_info['le_actual']*$data['ramp_up']:0;
                Db::name('le_report')->where('id',$record_id)->update($data);
            }else{
                Db::name('le_report')->where('id',$record_id)->update(['cc_output'=>0,'lp_output'=>0,'output'=>0]);
            }
            //项目总LE_REPORT
            $project = Db::name('team_list')->where('id',$tid)->value('project');
            $le_all = Db::name('le_report')->where(array('project'=>$project,'le_date'=>$date))->where('tid','>',0)->cates('tid');
            foreach ($le_all as $k => $v) {
                $le_all[$k]['in_plan'] = $v['input']==0?0:$v['hc_target'];
                $le_all[$k]['out_plan'] = ($v['hc_target']>0&&$v['input']>0?$v['hc_target']:0)*($v['le_target']>0?$v['le_target']:0);
                $le_all[$k]['out_target'] = $le_all[$k]['out_plan']/$v['ramp_up'];
            }
            $le_target_p = array_sum(array_column($le_all,'out_plan'))>0&&array_sum(array_column($le_all,'in_plan'))>0?round(array_sum(array_column($le_all,'out_plan'))/array_sum(array_column($le_all,'in_plan')),3):'';
            $project_rampup = array_sum(array_column($le_all,'out_plan'))>0&&array_sum(array_column($le_all,'out_target'))>0?round(array_sum(array_column($le_all,'out_plan'))/array_sum(array_column($le_all,'out_target')),3):'';
            $output = array_sum(array_column($le_all,'output'));
            $cc_output = array_sum(array_column($le_all,'cc_output'));
            $lp_output = array_sum(array_column($le_all,'lp_output'));
            $ftq_info = Db::name('team_list')->where('project',$project)->column('ftq_target','id');
            $out_all = Db::name('le_output')->where('ppdate',$date)->whereIn('tid',array_keys($ftq_info))->lists();
            foreach ($out_all as $k => $v) {
                if(isset($ftq_out[$v['tid']]['out'])==false){
                    $ftq_out[$v['tid']]['out'] = 0;
                }
                if($v['modules']>1){
                    $ftq_out[$v['tid']]['out'] = $ftq_out[$v['tid']]['out'] + $v['modules'];
                }else{
                    $ftq_out[$v['tid']]['out'] = $ftq_out[$v['tid']]['out'] + $v['out_mfg'];
                }
            }
            foreach ($ftq_out as $k => $v) {
                if($ftq_info[$k]>0){
                    $ftq_out[$k]['ftq'] = $v['out']*$ftq_info[$k];
                }else{
                    unset($ftq_out[$k]);
                }
            }
            $ftq_target_p = array_sum(array_column($ftq_out,'out'))>0?round(array_sum(array_column($ftq_out,'ftq'))/array_sum(array_column($ftq_out,'out')),0):0;
            $project_record = Db::name('le_report')->where(array('project'=>$project,'tid'=>0,'le_date'=>$date))->find();
            if($project_record){
                Db::name('le_report')->where('id',$project_record['id'])->update(['ramp_up'=>$project_rampup,'le_target'=>$le_target_p,'output'=>$output,'cc_output'=>$cc_output,'lp_output'=>$lp_output,'ftq_target'=>$ftq_target_p]);
            }else{
                Db::name('le_report')->insert(array('project'=>$project,'tid'=>0,'aid'=>0,'le_date'=>$date,'output'=>$output,'ramp_up'=>$project_rampup,'le_target'=>$le_target_p,'cc_output'=>$cc_output,'lp_output'=>$lp_output,'ftq_target'=>$ftq_target_p));
            }
            $cc_record = Db::name('le_report')->where(array('project'=>11,'tid'=>0,'le_date'=>$date))->find();
            $cclp_output_all = Db::name('le_report')->where(array('le_date'=>$date,'tid'=>0))->where('project','<>',11)->where('project','<>',73)->lists();
            Db::name('le_report')->where('id',$cc_record['id'])->update(['output'=>array_sum(array_column($cclp_output_all,'cc_output'))]);
            $lp_record = Db::name('le_report')->where(array('project'=>73,'tid'=>0,'le_date'=>$date))->find();
            Db::name('le_report')->where('id',$lp_record['id'])->update(['output'=>array_sum(array_column($cclp_output_all,'lp_output'))]);
        }
        exit(json_encode(array('code'=>0,'msg'=>'计划及爬坡刷新完成')));
    }
    //LP看板关闭
    public function lpCloseUpdate(){
        $data = input('post.');
        $mark = session('admin')['truename'].'理由：'.$data['mark'];
        $info = Db::name('member_list')->where('eid',session('admin')['username'])->value('tid');
        if(!$info){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'仅生产部班长或机动工可操作！')));
        }
        $shift = Db::name('team_list')->find($info);
        if($shift['shift']==2){
            if(time()<3600*12+strtotime('today')){
                $end_date = strtotime('yesterday');
            }else{
                $end_date = strtotime('today');
            }
        }else{
            $end_date = strtotime('today');
        }
        Db::name('lp_work_plan')->where('id',$data['id'])->update(['update'=>time(),'num'=>$data['output'],'status'=>0,'mark'=>$mark,'end_date'=>$end_date]);
        Db::name('lp_wip')->where(array('status'=>1,'kanban'=>$data['kanban']))->update(['status'=>0]);
        exit(json_encode(array('code'=>0,'msg'=>'操作成功！')));
    }
    //SAP标签上传
    public function sapLabelUpdate(){
        $list = input('post.');
        $data = $list['data'];
        $sys = Db::name('mfg_sap_label')->whereIn('s_id',array_column($data,'s_id'))->lists();
        if($sys){
            http_response_code(440);
            $sid = array_column($sys,'s_id');
            $name = join('<br>',$sid);
            exit(json_encode(array('code'=>2,'msg'=>'以下标签已存在！<br>'.$name,'data'=>$sid)));
        }
        $num_info = Db::name('le_product_list')->whereIn('dpn',array_unique(array_column($data,'dpn')))->column('box_num','dpn');
        $res['creator'] = session('admin')['id'];
        $res['create_time'] = time();
        foreach ($data as $k => $v) {
            $res['s_id'] = $v['s_id'];
            $res['dpn'] = $v['dpn'];
            $res['type'] = $list['type'];
            $res['num'] = isset($v['num'])?$v['num']:(isset($num_info[$v['dpn']])?$num_info[$v['dpn']]:null);
            Db::name('mfg_sap_label')->insert($res);
        }
        exit(json_encode(array('code'=>0,'msg'=>'操作成功！')));
    }
    //SAP标签销毁
    public function sapLabelDelete(){
        $data = input('post.');
        $s_id = array_column($data,'s_id');
        $sys = Db::name('mfg_sap_label')->whereIn('s_id',$s_id)->lists();
        $diff = array_diff($s_id,array_column($sys,'s_id'));
        if($diff){
            http_response_code(440);
            $name = join('<br>',$diff);
            exit(json_encode(array('code'=>2,'msg'=>'以下标签未录入！<br>'.$name,'data'=>$diff)));
        }
        $un_out = [];
        foreach ($sys as $k => $v) {
            if($v['status']==2){
                array_push($un_out,$v['s_id']);
            }
        }
        if(count($un_out)>0){
            http_response_code(440);
            $name = join('<br>',$un_out);
            exit(json_encode(array('code'=>2,'msg'=>'以下标签未退回！<br>'.$name,'data'=>$un_out)));
        }
        $res['check_aid'] = session('admin')['id'];
        $res['check_time'] = time();
        foreach ($sys as $k => $v) {
            $res['id'] = $v['id'];
            $res['status'] = 4;
            Db::name('mfg_sap_label')->save($res);
            $re[$k]['标签编号'] = $v['s_id'];
        }
        exit(json_encode(array('code'=>0,'msg'=>'操作成功！','list'=>$re)));
    }
    //LP预控制表更新
    public function lpCheckDataUpdate(){
        $data = input('post.');
        $data['mark'] = session('admin')['truename'].'于'.date('Y-m-d H:i:s',time()).'更改！';
        Db::name('lp_test')->save($data);
        exit(json_encode(array('code'=>0,'msg'=>'操作成功！')));
    }
    //班组考勤信息刷新 
    public function teamAttendanceFlash(){
        $data = input('post.');
        $this->le_update_kq($data['tid'],strtotime($data['kq_date']));
        exit(json_encode(array('code'=>0,'msg'=>'操作成功！')));
    }




















    //考勤自动汇总更新
    private function le_update_kq($tid,$date){
        $tid_info = Db::name('team_list')->find($tid);
        $level = Db::name('team_base')->where('id',$tid_info['project'])->value('content');
        if($level<4){
            $lent_in = Db::name('le_lent')->where(array('eff_date'=>$date,'status'=>2,'in_tid'=>$tid))->lists();
            $lent_out = Db::name('le_lent')->where(array('eff_date'=>$date,'status'=>2,'out_tid'=>$tid))->lists();
            $data['lent'] = array_sum(array_column($lent_in,'hours'))-array_sum(array_column($lent_out,'hours'));
            $kq = Db::name('le_attendance')->where(array('tid'=>$tid,'kq_date'=>$date))->lists();
            $data['dl_wt'] = 0;
            $data['dl_ot'] = 0;
            $data['idl_wt'] = 0;
            $data['idl_ot'] = 0;   
            $data['hc_idl'] = 0;
            $data['hc_idl_work'] = 0;
            $data['hc_actual'] = 0;
            $data['hc_work'] = 0;
            $data['hc_audit'] = 0;
            $poid_info = Db::name('team_plan_position')->whereIn('id',array_column($kq,'poid'))->column('type','id');
            foreach ($kq as $k => $v) {
                if($v['indirect']==1){
                    if(($v['worktime']+$v['overtime']) > 0){
                        if($v['poid']>0&&isset($poid_info[$v['poid']])){
                            if($poid_info[$v['poid']]<4){
                                $data['dl_wt'] = $data['dl_wt'] + $v['worktime'];
                                $data['dl_ot'] = $data['dl_ot'] + $v['overtime'];
                                $data['hc_work'] = $data['hc_work'] + 1;
                            }else{
                                $data['hc_audit'] = $data['hc_audit'] + 1;
                            }
                        }else{
                            $data['dl_wt'] = $data['dl_wt'] + $v['worktime'];
                            $data['dl_ot'] = $data['dl_ot'] + $v['overtime'];
                            $data['hc_work'] = $data['hc_work'] + 1;
                        }
                    }
                    $data['hc_actual'] = $data['hc_actual'] + 1;
                }else{
                    if(($v['worktime']+$v['overtime']) > 0){
                        $data['idl_wt'] = $data['idl_wt'] + $v['worktime'];
                        $data['idl_ot'] = $data['idl_ot'] + $v['overtime']; 
                        $data['hc_idl_work'] = $data['hc_idl_work'] + 1;
                    }
                    $data['hc_idl'] = $data['hc_idl'] + 1;
                }
            }

            $data['input'] = $data['dl_wt']+$data['dl_ot']+$data['lent'];
            $record = Db::name('le_report')->where(array('tid'=>$tid,'le_date'=>$date))->find();
            $tid_info = Db::name('team_list')->find($tid);
            if($record){
                $data['id'] = $record['id'];
                Db::name('le_report')->save($data);
            }else{
                $info = array_intersect_key($tid_info,['project'=>0,'tid'=>0,'plan_id'=>0,'aid'=>0,'ftq_target'=>0,'shift'=>0,'le_target'=>0,'hc_target'=>0]);
                $info['tid'] = $tid;
                $info['le_date'] = $date;
                $info['le_target'] = $tid_info['le_actual'];
                $info['hc_target'] = $tid_info['hc_design']+$tid_info['hc_support']+$tid_info['hc_design_edit']+$tid_info['hc_support_edit'];
                $info['hc_idl_target'] = $tid_info['hc_idl']+$tid_info['hc_idl_edit'];
                $info['hc_audit_target'] = $tid_info['hc_audit'];
                $data = array_merge($data,$info);
                Db::name('le_report')->insert($data);
            }
            $project_info = Db::name('le_report')->where(array('project'=>$tid_info['project'],'le_date'=>$date))->where('tid','>',0)->lists();
            if(!$project_info){
                exit(json_encode(array('code'=>1,'msg'=>'数据库查询异常,请联系管理员!')));
            }
            $project['dl_wt'] = array_sum(array_column($project_info,'dl_wt'));
            $project['dl_ot'] = array_sum(array_column($project_info,'dl_ot'));
            $project['idl_wt'] = array_sum(array_column($project_info,'idl_wt'));
            $project['idl_ot'] = array_sum(array_column($project_info,'idl_ot'));
            $project['hc_actual'] = array_sum(array_column($project_info,'hc_actual'));
            $project['hc_idl'] = array_sum(array_column($project_info,'hc_idl'));
            $project['hc_idl_work'] = array_sum(array_column($project_info,'hc_idl_work'));
            $project['hc_idl'] = array_sum(array_column($project_info,'hc_idl'));
            $project['hc_work'] = array_sum(array_column($project_info,'hc_work'));
            $project['hc_audit'] = array_sum(array_column($project_info,'hc_audit'));
            $project['hc_target'] = 0;
            $project['hc_audit_target'] = 0;
            $project['hc_idl_target'] = 0;
            foreach ($project_info as $k => $v) {
                if($v['input']>0){
                    $project['hc_target'] = $project['hc_target'] + (float)$v['hc_target'];
                    $project['hc_audit_target'] = $project['hc_audit_target'] + (float)$v['hc_audit_target'];
                    $project['hc_idl_target'] = $project['hc_idl_target'] + (float)$v['hc_idl_target'];
                }
            }
            $tid_list = Db::name('team_list')->where(array('project'=>$tid_info['project'],'status'=>1))->column('id');
            $lent_in = Db::name('le_lent')->where(array('eff_date'=>$date,'status'=>2))->whereIn('in_tid',$tid_list)->column('hours');
            $lent_out = Db::name('le_lent')->where(array('eff_date'=>$date,'status'=>2))->whereIn('out_tid',$tid_list)->column('hours');
            $project['lent'] = array_sum($lent_in)-array_sum($lent_out);
            $project['input'] = $project['dl_wt']+$project['dl_ot']+$project['lent'];
            $record = Db::name('le_report')->where(array('tid'=>0,'le_date'=>$date,'project'=>$tid_info['project']))->find();
            if($record){
                Db::name('le_report')->where('id',$record['id'])->update($project);
            }else{
                $project['tid'] = 0;
                $project['project'] = $tid_info['project'];
                $project['le_date'] = $date;
                $project['aid'] = 0;
                if($project['project']==11||$project['project']==73){
                    $list = Db::name('team_list')->where(array('project'=>$tid_info['project'],'status'=>1))->lists();
                    foreach ($list as $k => $v) {
                        $list[$k]['hc_out_target'] = ((float)$v['hc_design']+(float)$v['hc_design_edit'])*($v['le_design']>0?$v['le_design']:0);
                        $list[$k]['hc_in_target'] = (float)$v['hc_design']+(float)$v['hc_design_edit'];
                    }
                    $project['le_target'] = array_sum(array_column($list,'hc_in_target'))>0?round(array_sum(array_column($list,'hc_out_target'))/array_sum(array_column($list,'hc_in_target')),3):0;
                }
                Db::name('le_report')->insert($project);
            }
        }
    }
}
