<?php
namespace app\adminVue\controller;

use app\BaseController;
use think\facade\Db;
use think\facade\Cache;
use think\facade\Session;
use think\Request;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

class DesignUpdate extends TokenCheck
{   
    // 盘点地址上传
    public function addressUpload(){
        $data = input('post.data');
        $inv_plan = Db::name('onsite_base')->where(array('mid'=>260,'mark'=>1))->find();
        if($inv_plan){
            $limit = explode('~',$inv_plan['content']);
            if($limit[0]-time()<86400*3){
                exit(json_encode(array('code'=>1,'msg'=>'距离盘点不足3天，地址更新已关闭')));
            }
        }
        $project = Db::name('team_base')->where('id',input('post.project'))->value('title');
        $line_base = Db::name('team_base')->where(array('mid'=>2,'mark'=>input('post.project')))->column('id','title');
        $lines = array_keys($line_base);
        $un_project = [];
        $un_line = [];
        $super = [];
        $other = [];
        $normal = [];
        foreach ($data as $k => $v) {
            if(isset($v['project'])==false||$v['project']!==$project){
                array_push($un_project,$v['project']);
            }else{
                $data[$k]['project'] = input('post.project');
            }
            if(isset($v['line'])==false||in_array($v['line'],$lines)===false){
                array_push($un_line,$v['line']);
            }else{
                $data[$k]['line'] = $line_base[$v['line']];
            }
            if(isset($v['super'])){
                if($v['super']==='是'){
                    array_push($super,$v['kanban']);
                    array_push($other,$v['kanban']);
                }else{
                    unset($data[$k]['super']);
                }
            }elseif (isset($v['compose'])){
                if($v['compose']==='是'){
                    array_push($other,$v['kanban']);
                }else{
                    unset($data[$k]['compose']);
                }
            }elseif (isset($v['pull_line'])) {
                if($v['pull_line']==='是'){
                    array_push($other,$v['kanban']);
                }else{
                    unset($data[$k]['pull_line']);
                }
            }elseif (isset($v['copper'])) {
                if($v['copper']==='是'){
                    array_push($other,$v['kanban']);
                }else{
                    unset($data[$k]['copper']);
                }
            }elseif (isset($v['wire'])) {
                if($v['wire']==='是'){
                    array_push($other,$v['kanban']);
                }else{
                    unset($data[$k]['wire']);
                }
            }else{
                array_push($normal,$v['kanban']);
            }
        }
        if(count($un_project)>0){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'以下项目不属于本次上传内容，请确认！<br>'.join('<br>',$un_project))));
        }
        if(count($un_line)>0){
            exit(json_encode(array('code'=>2,'msg'=>'以下产线名异常，请确认！<br>'.join('<br>',$un_line))));
        }
        //超级看板
        $super_list = Db::name('onsite_inventory_super')->where('project',input('post.project'))->column('kanban');
        $super_list = array_unique($super_list);
        $kanban_diff = array_diff($super,$super_list);
        if(count($kanban_diff)>0){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'以下超级看板无对应BOM，请先上传!<br>'.join('<br>',$kanban_diff))));
        }
        //物料号验证
        $kanban = Db::name('onsite_inventory_base')->column('kanban');
        $kanban_diff = array_diff($normal,$kanban);
        if(count($kanban_diff)>0){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'以下看板号/物料号系统中不存在，请联系PCL!<br>'.join('<br>',$kanban_diff))));
        }
        //特殊看板验证
        $kanban_diff = array_intersect($other,$kanban);
        if(count($kanban_diff)>0){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'以下特殊看板在正常看板清单，请确认!<br>'.join('<br>',$kanban_diff))));
        }
        //位置号重复验证
        foreach ($data as $k => $v) {
            if(strstr($v['location'],'批量')==false){
                $res[$k] = $v['line'].'-'.$v['location'];
            }else{
                $re[$k] = $v['line'].'-'.$v['location'].'-'.$v['kanban'];
            }
        }
        if(isset($res)&&count($res)>0){
            $location_diff = array_diff_key($res,array_unique($res));
            if(count($location_diff)>0){
                http_response_code(440);
                exit(json_encode(array('code'=>1,'msg'=>'以下位置重复出现，请确认!<br>'.join('<br>',$location_diff))));
            }
        }
        if(isset($re)&&count($re)>0){
            $location_diff = array_diff_key($re,array_unique($re));
            if(count($location_diff)>0){
                http_response_code(440);
                exit(json_encode(array('code'=>1,'msg'=>'以下批量Kanban重复出现，请确认!<br>'.join('<br>',$location_diff))));
            }
        }
        
        //位置信息验证
        $location_list = array_unique(array_column($data,'location'));
        $err_list = [];
        foreach ($location_list as $k => $v) {
            $arr = explode('-',$v);
            if(count($arr)<2){
                array_push($err_list,$v);
            }
        }
        if(count($err_list)>0){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'以下位置格式错误，请确认！<br>'.join('<br>',$err_list))));
        }
        //当前位置信息
        $location = Db::name('onsite_inventory')->where('project',input('post.project'))->field('id,line,rack,location,kanban')->lists();
        foreach ($location as $k => $v) {
            if($v['location']=='批量'){
                $location_info[$v['line'].$v['rack'].'-'.$v['location'].$v['kanban']] = $v['id'];
            }else{
                $location_info[$v['line'].$v['rack'].'-'.$v['location']] = $v['id'];
            }
        }
        //存入
        $add_list = [];
        foreach ($data as $k => $v) {
            $add = $v;
            $add['owner'] = session('admin')['id'];
            $add['update'] = time();
            $arr = explode('-',$v['location']);
            $location = array_pop($arr);
            $rack = join('-',$arr);
            $rack = str_replace('&', '/', $rack);
            $add['rack'] = strtoupper($rack);
            $add['location'] = strtoupper($location);
            if($v['project']===11){
                $str = mb_substr($add['rack'], -1, 1, 'UTF-8');
                if( $str === '前' || $str === '后' ){
                    $add['rack'] = mb_substr($add['rack'], 0, -1, 'UTF-8');
                    $add['location'] = $str.$add['location'];
                }
            }
            $add['kanban'] = strtoupper($v['kanban']);
            if($location=='批量'){
                if(isset($location_info[$v['line'].strtoupper($v['location']).$add['kanban']])==false){
                    array_push($add_list,$add);
                }
            }else{
                if(isset($location_info[$v['line'].strtoupper($v['location'])])){
                    $add['id'] = $location_info[$v['line'].strtoupper($v['location'])];
                }                   
                array_push($add_list,$add);
            }
        }
        foreach ($add_list as $k => $v) {
            Db::name('onsite_inventory')->save($v);
        }
        exit(json_encode(array('code'=>0,'msg'=>'上传成功！')));
    }
    // 超级看板上传
    public function superUpload(){
        $data = input('post.data');
        $project = input('post.project');
        $error = [];
        foreach ($data as $k => $v) {
            if($v['kanban']===$v['children']){
                array_push($error,$v['kanban']);
            }
        }
        if(count($error)>0){
            exit(json_encode(array('code'=>1,'msg'=>'超级Kanban与子Kanban相同，请确认！<br>'.join('<br>',$error))));
        }
        $children = array_unique(array_column($data,'children'));
        $sys_children = Db::name('onsite_inventory_base')->whereIn('kanban',$children)->column('kanban');
        $diff = array_diff($children,$sys_children);
        if(count($diff)>0){
                exit(json_encode(array('code'=>1,'msg'=>'以下子看板数据库不存在，请确认！<br>'.join('<br>',$diff))));
        }
        $old = Db::name('onsite_inventory_super')->whereIn('kanban',array_unique(array_column($data,'kanban')))->lists();
        foreach ($old as $k => $v) {
            Db::name('onsite_inventory_super')->where('id',$v['id'])->delete();
        }
        $owner = session('admin')['id'];
        $now = time();
        foreach ($data as $k => $v) {
            $v['project'] = $project;
            $v['owner'] = $owner;
            $v['update'] = $now;
            Db::name('onsite_inventory_super')->insert($v);
        }
        exit(json_encode(array('code'=>0,'msg'=>'上传成功！')));
    }
    // 盘点地址删除
    public function addressDelete(){
        $data = input('post.');
        if($data['type']===1){
            $record = Db::name('onsite_inventory')->where(['project'=>$data['project'],'owner'=>session('admin')['id']])->count();
            if($record>0){
                Db::name('onsite_inventory')->where(['project'=>$data['project'],'owner'=>session('admin')['id']])->delete();
            }else{
                http_response_code(440);
                exit(json_encode(array('code'=>1,'msg'=>'未查询到您有此项目任何上传记录！')));
            }
        }else{
            $record = Db::name('onsite_inventory')->where('project',$data['project'])->count();
            if($record>0){
                $aids = array_unique(Db::name('onsite_inventory')->where('project',$data['project'])->column('owner'));
                Db::name('onsite_inventory')->where('project',$data['project'])->delete();
                $project_name = Db::name('team_base')->where('id',$data['project'])->value('title');
                if(count($aids)>1||in_array(session('admin')['id'],$aids)==false){
                    //发送邮件
                    $mail['to'] = $aids;
                    $html1 = 'Dear All：<br>'.session('admin')['truename'].'于'.date('Y-m-d H:i:s').'清除项目 '. $project_name.' 所有盘点地址，请重新上传！<br>';
                    $mail['title'] = '盘点地址删除通知';
                    $html2 = '<h3>OMS运营管理系统后台请 <a href="http://10.243.226.7/admin/home/home">点击进入</a> ！</h3><p>tips: 请使用谷歌浏览器或其他高级浏览器，如未安装，请自行下载安装，也可<a href="http://10.243.226.7/static/download/chrome_installer.exe" download="chrome_installer.exe">点击下载</a>安装谷歌浏览器</p>';
                    $mail['content'] = 'Dear '.$html1.$html2;
                    $mail_model = new send();
                    $res = $mail_model->sendMail($mail);
                }
            }else{
                http_response_code(440);
                exit(json_encode(array('code'=>1,'msg'=>'未查询到此项目有任何上传记录！')));
            }
        }
        exit(json_encode(array('code'=>0,'msg'=>'删除成功！')));
    }
    //超级看板删除
    public function superDelete(){
        $data = input('post.');
        if($data['type']===1){
            $record = Db::name('onsite_inventory_super')->where(['project'=>$data['project'],'owner'=>session('admin')['id']])->count();
            if($record>0){
                Db::name('onsite_inventory_super')->where(['project'=>$data['project'],'owner'=>session('admin')['id']])->delete();
            }else{
                http_response_code(440);
                exit(json_encode(array('code'=>1,'msg'=>'未查询到您有此项目任何上传记录！')));
            }
        }else{
            $record = Db::name('onsite_inventory_super')->where('project',$data['project'])->count();
            if($record>0){
                $aids = array_unique(Db::name('onsite_inventory_super')->where('project',$data['project'])->column('owner'));
                Db::name('onsite_inventory_super')->where('project',$data['project'])->delete();
                if(count($aids)>1||in_array(session('admin')['id'],$aids)==false){
                    $project_name = Db::name('team_base')->where('id',$data['project'])->value('title');
                    //发送邮件
                    $mail['to'] = $aids;
                    $html1 = 'Dear All：<br>'.session('admin')['truename'].'于'.date('Y-m-d H:i:s').'清除项目 '. $project_name.' 所有超级看板BOM，请重新上传！<br>';
                    $mail['title'] = '超级看板BOM删除通知';
                    $mail['content'] = 'Dear '.$html1.$html2;
                    $mail_model = new send();
                    $res = $mail_model->sendMail($mail);
                }
            }else{
                http_response_code(440);
                exit(json_encode(array('code'=>1,'msg'=>'未查询到此项目有任何上传记录！')));
            }
        }
        exit(json_encode(array('code'=>0,'msg'=>'删除成功！')));
    }
    //复盘ID上传
     public function invRecheckUpload(){
        $data = input('post.');
        $ids = array_column($data,'i_id');
        $list = Db::name('onsite_inventory_record')->whereIn('i_id',$ids)->field('id,i_id')->lists();
        $num = count($ids) - count($list);
        if($num > 0){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'有 '.$num.' 个地址无盘点记录！')));
        }
        $type = Db::name('onsite_inventory')->whereIn('id',array_column($list,'i_id'))->field('id,kanban,type')->cates('id');
        $diff = [];
        foreach ($type as $k => $v) {
            if($v['type']!=1){
               array_push($diff,$v['kanban']);
            }
        }
        if(count($diff)>0){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'以下物料的盘点类型不是计数，请确认！<br>'.join('<br>',$diff))));
        }
        foreach ($list as $k => $v) {
            Db::name('onsite_inventory_record')->where('id',$v['id'])->update(['recheck'=>2]);
        }
        exit(json_encode(array('code'=>0,'msg'=>'上传成功(共创建'.count($list).'条复盘数据！)')));
    }
    //盘点时间更新
    public function invEventSave(){
        $data = input('post.');
        if($data['mark'] === 3){
            $list = Db::name('onsite_inventory_record')->lists();
            foreach ($list as $key => $value) {
                Db::name('onsite_inventory_record')->delete($value['id']);
            }
            
        }else{
            $data['id'] = 260;
            $data['mid'] = 260;
            $data['content'] = strtotime($data['content'][0]).'~'.strtotime($data['content'][1]);
            Db::name('onsite_base')->save($data);
        }
        exit(json_encode(array('code'=>0,'msg'=>'保存成功！')));
    }
    //盘点数据更改
    public function invRecordUpdate(){
        $plan_id = Db::name('onsite_base')->where(array('mid'=>260,'mark'=>1))->value('id');
        if(!$plan_id){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'无初盘事件！')));
        }
        $data = input('post.');
        $info =  Db::name('onsite_inventory_record')->find($data['id']);
        if($data['num']>0 && $data['num']!=$info['num']){
            $str1 = '盘点数量1由'.(int)$info['num'].'更改到'.$data['num'].',';
        }else{
            $str1 = '';
        }
        if($data['num1']>0 && $data['num1']!=$info['num1']){
            $str2 = '盘点数量2由'.(int)$info['num1'].'更改到'.$data['num1'].'!';
        }else{
            $str2 = '';
        }
        if($str1===''&&$str2===''){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'无修改,无需保存！')));
        }
        $res['id'] = $data['id'];
        $res['num'] = $data['num'];
        $res['num1'] = $data['num1'];
        $res['mark'] = $info['mark'].'由'.session('admin')['truename'].'于'.date('Y-m-d H:i:s').'将'.$str1.$str2;
        Db::name('onsite_inventory_record')->save($res);
        exit(json_encode(array('code'=>0,'msg'=>'保存成功！')));
    }
    //盘点重复数据清除
    public function invDoubleClear(){
        $list =  Db::name('onsite_inventory_record')->field('id,i_id,num,num1')->lists();
        $i = 0;
        foreach ($list as $k => $v) {
            if(isset($inv[$v['i_id']])){
                Db::name('onsite_inventory_record')->delete($inv[$v['i_id']]);
                ++$i;
            }
            $inv[$v['i_id']] = $v['id'];
        }
        exit(json_encode(array('code'=>0,'msg'=>'清理成功,共清理'.$i.'条重复数据！')));
    }

    
}
