<?php
namespace model\sample;
use League\Csv\Exception;
use \model\pro\pro;
use \model\pro\cate;
use \model\pro\factory;
use \model\collocation;
use \model\history;
use \model\element;
use \model\customer;
use \model\audit;
use model\sample\sampleDate;
use \model\interIO\plm;
use \model\user\power;
use GuzzleHttp\Client;
class sample extends \model
{
    public $table = 'sample';
    public $key = 's_id';
    public $cate = null;
    public $factory = null;
    public $collocation = null;
    public $customer = null;
    public $area = null;
    public $make = null;
    public $user = null;
    public $history = null;
    public $power = null;
    public $join = [];
    public $findCaches = []; //查询临时缓存
    public $sampleDate;
    public $plmstate = [];
    public $plmstateText = [];
    public function __construct ()
    {
		parent::__construct();
        $this->cate = new cate();
        $this->factory = new factory();
        $this->collocation = new collocation();
        $this->history = new history();
        $this->power = new power();
        $this->customer = new customer();
        $this->area = new element('m_area');
        $this->make = new element('m_make');
        $this->user = new element('user');
        $this->sampleDate = new sampleDate();
		$this->plmstate = [
			  1=>"待校对",
			 10=>"取消开发",
			 11=>"已校对不开发",
			 12=>"取消核对",
			 50=>"已校对待开发",
			 51=>"开发中",
			 52=>"确认中",
			200=>"开发完成"
		];
		$this->plmstateText = [
              //0 => lg("未提交"),
              0 => '',
			  1=>lg("待校对"),
			 10=>lg("取消开发"),
			 11=>lg("已校对不开发"),
			 12=>lg("取消核对"),
			 50=>lg("已校对待开发"),
			 51=>lg("开发中"),
			 52=>lg("确认中"),
			200=>lg("开发完成")
		];
		//邮件发送时使用
		$this->plmstateTextLangs = [
              //0 => "未提交|Unsubmitted",
              0 => "",
			  1=>"待校对|Depending to Check",
			 10=>"取消开发|Cancel the development",
			 11=>"已校对不开发|Reviewed not developed",
			 12=>"取消核对|Cancel the check",
			 50=>"已校对待开发|Reviewed for development",
			 51=>"开发中|Developing",
			 52=>"确认中|Confirming",
			200=>"开发完成|Finish Development"
		];
	}
	
	/*
	* @method 通过文本获取状态值
	*/
	function get_s_state_sub($str)
	{
	    foreach($this->plmstate as $k=>$v)
	    {
	        if($v==trim($str)){
	            return $k;
	        }
	    }
	}
	
	/*
	* @method 检测基本号码
	* @param $fid 品牌ID
	* @param $number 号码
	*/
	function checkBaseNumber($sid,$fid,$number)
	{
	    $data = [];
	    if($fid!=0 && (!is_numeric($fid) || !$this->db->has('pro_factory',['pf_id'=>$fid])) ){
	        $fid = $this->db->get('pro_factory','pf_id',['pf_name'=>$fid]);
	    }
	    if($find = $this->db->get($this->table,'s_plmseq',['s_id[!]'=>$sid,'s_apply_brand'=>$fid,'s_apply_number_format'=>formatNum($number)])){
	        $data[] =  lg('综合样品申请号码') . ' ' . $find;
	    }
        //s_arri_number
        if(empty($fid)){
            if ($find = $this->db->get($this->table, 's_plmseq', ['s_id[!]' => $sid,
                'OR' => [
                    's_formatnum' => formatNum($number),
                    's_apply_number' => $number,
                    's_arri_number' => $number
                ]
            ])) {
                $data[] = lg('综合样品到样号码') . ' ' . $find;
            }
        } else {
            if ($find = $this->db->get($this->table, 's_plmseq', ['s_id[!]' => $sid, 's_arri_brand' => $fid,
                'OR' => [
                    's_formatnum' => formatNum($number),
                    's_apply_number' => $number,
                    's_arri_number' => $number
                ]
            ])) {
                $data[] = lg('综合样品到样号码') . ' ' . $find;
            }
        }
		return $data;
	}
    /*
	* @method 检测基本号码条数
	* @param $fid 品牌ID
	* @param $number 号码
	*/
    function checkBaseNumberCount($number, $plmseq = '')
    {
        $where = [
            'OR' => [
                's_formatnum' => formatNum($number),
                's_apply_number' => $number,
                's_arri_number' => $number
            ]
        ];
        if ($plmseq) {
            $where['s_plmseq[!]'] = $plmseq;
        }
        $data = $this->db->select($this->table, 's_plmseq', $where);
        return $data;
    }

    /*
	* @method 检测号码
	* @param $fid 品牌ID
	* @param $number 号码
	*/
    function checkSampleNumber($sid, $fid, $number, $changeSame = true)
    {
        $data = [];
        if (!is_numeric($fid) || !$this->db->has('pro_factory', ['pf_id' => $fid])) {
            $fid = $this->db->get('pro_factory', 'pf_id', ['pf_name' => $fid]);
        }
        if ($find = $this->db->get($this->table, 's_plmseq', ['s_id[!]' => $sid, 's_apply_brand' => $fid, 's_apply_number_format' => formatNum($number)])) {
            $data[] =  lg('综合样品申请号码') . ' ' . $find;
        }
        //s_arri_number
        if ($find = $this->db->get($this->table, 's_plmseq', ['s_id[!]' => $sid, 's_arri_brand' => $fid, 's_formatnum' => formatNum($number)])) {
            $data[] = lg('综合样品到样号码') . ' ' . $find;
        }
        if ($find = $this->db->get('sample_numidx', 'sn_s_id', ['sn_s_id[!]' => $sid, 'sn_pro_factory' => $fid, 'sn_numfomart' => formatNum($number)])) {
            $srow = $this->getRowByKey($find);
            if (!empty($srow))
                $data[] = lg('综合样品交叉索引') . ' ' . $srow['s_plmseq'];
        }
        if ($this->db->count('sample_numidx', ['sn_s_id' => $sid, 'sn_pro_factory' => $fid, 'sn_numfomart' => formatNum($number)]) > 1) {
            $data[] = lg('当前交叉索引重复');
        }
        if ($changeSame) {
            if ($data) {
                $this->setValue($sid, 's_issame', 1);
            } else {
                $this->setValue($sid, 's_issame', 0);
            }
        }
        return $data;
    }
    /*
	* @method 检测号码 不带品牌
	* @param $number 号码
	*/
    function checkSampleNumberNoFac($number, $sid = '')
    {
        $data = [];
        if ($find = $this->db->get($this->table, 's_plmseq', ['s_id[!]' => $sid, 's_apply_number_format' => formatNum($number), 's_apply_number' => $number])) {
            $data[] =  lg('综合样品申请号码') . ' ' . $find;
        }
        if ($find = $this->db->get($this->table, 's_plmseq', ['s_id[!]' => $sid, 's_formatnum' => formatNum($number), 's_arri_number' => $number])) {
            $data[] = lg('综合样品到样号码') . ' ' . $find;
        }
        if ($find = $this->db->get('sample_numidx', 'sn_s_id', ['sn_s_id[!]' => $sid, 'sn_numfomart' => formatNum($number)])) {
            $srow = $this->getRowByKey($find);
            if (!empty($srow))
                $data[] = lg('综合样品交叉索引') . ' ' . $srow['s_plmseq'];
        }
        if ($find = $this->db->get('pro_numidx', 'pn_p_id', ['pn_formart' => formatNum($number)])) {
            $p_outnum = $this->db->get('pro', 'p_outnum', ['p_id' => $find]);
            if (!empty($p_outnum))
                $data[] = lg('产品库') . ' GSP: ' . $p_outnum;
        }
        return $data;
    }

    function list($rules, $where='',$page=0,$pagesize=0,$sidx='',$sord='asc',$orderby=''){
	    $req = \mvc::$req;
        $table = $this->table.'(s)';
        $this->fields = ['s.*'];
        $this->join = [];
        $this->where = [];
        $this->group = [];
        $this->searchNumber = '';
        if (is_string($where)) {
            $where = $this->filter2medoo($where,function(&$field,&$op,&$data){
                switch($field){
                    case 's_check1':
                        if($data=='-1'){
                            $field = 's_check1_no_reason';
                            $op = '!';
                            $data = '';
                        }elseif($data=='0'){
                            $op = 'sql';
                            $data = "s_check1=0 AND s_check1_no_reason=''";
                        }
                        break;
                    case 's_check2':
                        if($data=='-1'){
                            $field = 's_check2_no_reason';
                            $op = '!';
                            $data = '';
                        }elseif($data=='0'){
                            $op = 'sql';
                            $data = "s_check2=0 AND s_check2_no_reason=''";
                        }
                        break;
                    case 's_check3':
                        if($data=='-1'){
                            $field = 's_check3_no_reason';
                            $op = '!';
                            $data = '';
                        }elseif($data=='0'){
                            $op = 'sql';
                            $data = "s_check3=0 AND s_check3_no_reason=''";
                        }
                        break;
                    case 's_check_sales':
                        if($data=='-1'){
                            $field = 's_check_sales_reason';
                            $op = '!';
                            $data = '';
                        }elseif($data=='0'){
                            $op = 'sql';
                            $data = "s_check_sales=0 AND s_check_sales_reason=''";
                        }
                        break;
                    case 's_check_tech':
                        if($data=='-1'){
                            $field = 's_check_tech_reason';
                            $op = '!';
                            $data = '';
                        }elseif($data=='0'){
                            $op = 'sql';
                            $data = "s_check_tech=0 AND s_check_tech_reason=''";
                        }
                        break;
                    case 's_state_sub':
                        $op = 'eq';
                        break;
                    case 's_cate_parent':
                        $field = 's_cate';
                        $op = 'eq';
                        $data = $this->cate->likeAndChilds($data);
                        if(empty($data)) $data = [0];
                        break;
                    case 's_cate':
                        $op = 'eq';
                        $data = $this->cate->like($data);
                        if(empty($data)) $data = [0];
                        break;
                    case 's_sales_area':
                        $op = 'sql'; //find_in_set
                        $data = " FIND_IN_SET('".$data."',s_sales_area) ";
                        //dd($data);
                        //$data = $this->collocation->like($data);
                        //if(empty($data)) $data = [0];
                        break;
                    case 's_apply_brand':
                    case 's_arri_brand':
                        $op = 'eq';
                        $data = $this->factory->like($data);
                        break;  
                    case 's_apply_number':
                        //$field = 's_apply_number_format';
                        //$data = formatNum($data);
                        switch ($op) {
                            case 'eq':
                                $data = "(s_apply_number='" . str_replace("'", "\'", $data) . "' OR s_apply_number_format='" . formatNum($data) . "')";
                                break;
                            case 'cn':
                                $data = "(s_apply_number like '" . str_replace("'", "\'", $data) . "%' OR s_apply_number_format like '" . formatNum($data) . "%')";
                                break;
                            case 'bw':
                                $data = "(s_apply_number like '%" . str_replace("'", "\'", $data) . "%' OR s_apply_number_format like '%" . formatNum($data) . "%')";
                                break;
                        }
                        $op = 'sql';
                        break;    
                    case 's_arri_number':
                        //$field = 's_formatnum';
                        //$data = formatNum($data);
                        switch ($op) {
                            case 'eq':
                                $data = "(s_arri_number='" . str_replace("'", "\'", $data) . "' OR s_formatnum='" . formatNum($data) . "')";
                                break;
                            case 'cn':
                                $data = "(s_arri_number like '" . str_replace("'", "\'", $data) . "%' OR s_formatnum like '" . formatNum($data) . "%')";
                                break;
                            case 'bw':
                                $data = "(s_arri_number like '%" . str_replace("'", "\'", $data) . "%' OR s_formatnum like '%" . formatNum($data) . "%')";
                                break;
                        }
                        $op = 'sql';
                        break;    
                    case 's_customer_code':
                    case 's_customer_name':
                        $field = 's_customer_name';
                        $op = 'eq';
                        $data = $this->customer->like($data,['ct_code','ct_name']);
                        break;    
                    case 's_apply_user':
                    case 's_sign_opuser':
                        $op = 'eq';
                        $data = $this->user->like($data,['au_name']);
                        break;
                    case 's_apply_type':
                    case 's_model_src':
                    case 's_model_vio_src':
                    case 's_channel':
                    case 's_purc_state':
                    case 's_supp_currency':
                        if(!is_numeric($data)){
                            $op = 'eq';
                            $data = $this->collocation->like(trim($data));
                            if(empty($data)) $data = [0];
                        }
                        break;
                    case 's_apply_depa':
                    case 's_apply_area':
                        if(is_numeric($data)){
                            if($trow = $this->collocation->getRowByKey($data)){
                                $op = 'sql';
                                $data = qgprintf("({1}='{2}' OR {1}='{3}')",$field,$trow['cn_name'],$trow['en_name']);
                            }else{
                                $op = null;
                            }
                        }
                        break;
                    case 's_photos_has':
                        $op = 'sql';
                        if ($data == '1') {
                            $data = "s_photos<>''";
                        } else if ($data == '0') {
                            $data = "s_photos=''";
                        }
                        break;
                    case 's_photos_hasTow':
                        $op = 'sql';
                        if ($data == '1') {
                            $data = "s_photos<>'' AND s_state_sub = 200 AND s_state_main IN ('Y1','Y2') AND (SELECT COUNT(1) AS total WHERE JSON_CONCAT(s_photos, '>' , 'file_id') AND HAVING total > 1)";
                        } else if ($data == '2') {
                            $data = "s_photos<>'' AND s_state_main = 'Y3' AND (SELECT COUNT(1) AS total WHERE JSON_CONCAT(s_photos, '>' , 'file_id') AND HAVING total > 2)";
                        }
                        break;
                    case 'sn_number':
                        $this->searchNumber = explode(',',$data); 
                        foreach($this->searchNumber as $k=>$v){
                            $this->searchNumber[$k] = trim($v);
                        }
                        $this->searchNumber = array_unique($this->searchNumber);
                        $this->searchFormatNumber = formatNums($data); 
                        $this->fields[] = 'sn_number';
                        $this->join['[>]sample_numidx'] = ['s.s_id'=>'sn_s_id'];
                        $this->where['OR #sn_number'] = [
                            's_plmseq['.$this->getMedooOp($op).']' => $this->searchFormatNumber,
                            's_innum['.$this->getMedooOp($op).']' => $this->searchNumber,
                            's_outnum['.$this->getMedooOp($op).']' => $this->searchFormatNumber,
                            's_apply_number_format[' . $this->getMedooOp($op) . ']' => $this->searchFormatNumber,
                            's_formatnum[' . $this->getMedooOp($op) . ']' => $this->searchFormatNumber,
                            's_arri_number[' . $this->getMedooOp($op) . ']' => $this->searchFormatNumber,
                            'sn_numfomart['.$this->getMedooOp($op).']' => $this->searchFormatNumber,
                        ];
                        $this->group[] = 's.s_id';
                        $op = null;
                        break;
                    case 'hasnumidx':
                        if($data=='1'){
                            $op = 'sql';
                            $data = " exists (select 1 from sample_numidx where sn_s_id = s_id limit 1)";
                        }elseif($data=='0'){
                            $op = 'sql';
                            $data = " not exists (select 1 from sample_numidx where sn_s_id = s_id limit 1)";
                        }
                        break;
                    case 'hasmodel':
                        if($data=='1'){
                            $op = 'sql';
                            $data = " exists (select 1 from sample_model_link where sml_s_id = s_id limit 1)";
                        }elseif($data=='0'){
                            $op = 'sql';
                            $data = " not exists (select 1 from sample_model_link where sml_s_id = s_id limit 1)";
                        }
                        break;
                    case 'hasfollow':
                        if($data=='1'){
                            $op = 'sql';
                            $data = " exists (select 1 from sample_follow where sf_s_id = s_id and sf_au_id='".getOpuser()."' limit 1)";
                        }elseif($data=='0'){
                            $op = 'sql';
                            $data = " not exists (select 1 from sample_follow where sf_s_id = s_id and sf_au_id='".getOpuser()."' limit 1)";
                        }
                        break;
                    case 'modeltext':
                        $this->fields['modeltext']=raw("CONCAT(mk.mk_".LG_NAME.",' ',smt.sm_series)");
                        $this->join['[>]sample_model_txt(smt)'] = ['s.s_id'=>'smt_s_id'];
                        $this->join['[>]m_make(mk)'] = ['smt.sm_make'=>'mk_id'];
                        $this->where['OR #sample_model_txt'] = [
                            'mk.mk_'.LG_NAME.'['.$this->getMedooOp($op).']' => $data,
                            'smt.sm_series['.$this->getMedooOp($op).']' => $data,
                        ];
                        $op = null;
                        $data = null;
                        break;
                    case 'state_a': //待采购
                        if($data=='1'){
                            $op = 'sql';
                            $data = " s_stop=0 AND s_check3 = 1 AND s_has_purc = 0";
                        }elseif($data=='0'){
                            $op = 'sql';
                            $data = " NOT(s_stop=0 AND s_check3 = 1 AND s_has_purc = 0)";
                        }
                        break;
                    case 'state_b': //已采购待到样
                        if($data=='1'){
                            $op = 'sql';
                            $data = " s_stop=0 AND s_has_purc = 1 AND s_purc_state <> ".SAPMLE_DEFINE['到样'];
                        }elseif($data=='0'){
                            $op = 'sql';
                            $data = " NOT(s_stop=0 AND s_has_purc = 1 AND s_purc_state <> ".SAPMLE_DEFINE['到样'].")";
                        }
                        break;
                    case 'state_c': //待校对
                        if($data=='1'){
                            $op = 'sql';
                            $data = " s_stop=0 AND s_check_sales = 1 AND s_state_sub <= 1";
                        }elseif($data=='0'){ //待校对
                            $op = 'sql';
                            $data = " NOT(s_stop=0 AND s_check_sales = 1 AND s_state_sub <= 1)";
                        }
                        break;
                }
                if(($op=='eq' || $op =='cn') && $data=='') $op = null;
            });
        }
        if($sidx=='sn_number'){
            if(!in_array('sn_number',$this->fields)){
                $sidx = '';
            }
        }elseif($sidx=='modeltext'){
            if(!isset($this->join['[>]sample_model_txt(smt)'])){
                $this->fields['modeltext']=raw("CONCAT(mk.mk_".LG_NAME.",' ',smt.sm_series)");
                $this->join['[>]sample_model_txt(smt)'] = ['s.s_id'=>'smt_s_id'];
                $this->join['[>]m_make(mk)'] = ['smt.sm_make'=>'mk_id'];
            }
            
        }
        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
        if(isset($where['ORDER'])) {
            if (isset($where['ORDER']['s_arri_number'])) {
                $tmp = $where['ORDER']['s_arri_number'];
                $where['ORDER']['s_arri_number'] = "@REPLACE(REPLACE(REPLACE(s_arri_number,'.',''),' ',''),'-','') " . $tmp;
            }
        }
        if($rules['oddno']){
            $where['s_oddno[=]'] = $rules['oddno'];
        }
        if($rules['outnum']){
            $where['s_outnum'] = $rules['outnum'];
        }
        if($rules['p_innum']){
            $where['s_outnum'] = $rules['p_innum'];
        }
        
        if(!empty($rules['numbers'])){
            $this->searchNumber = explode(',',$rules['numbers']); 
            foreach($this->searchNumber as $k=>$v){
                $this->searchNumber[$k] = trim($v);
            }
            $this->searchNumber = array_unique($this->searchNumber);
            $this->searchFormatNumber = formatNums($rules['numbers']); 
            $this->fields[] = 'sn_number';
            $this->join['[>]sample_numidx'] = ['s.s_id'=>'sn_s_id'];
            $this->where['OR #sn_number'] = [
                's_plmseq'.($rules['numlike'] ?'[~]':'') => $this->searchFormatNumber,
                's_innum'.($rules['numlike'] ?'[~]':'') => $this->searchNumber,
                's_outnum'.($rules['numlike'] ?'[~]':'') => $this->searchFormatNumber,
                's_apply_number_format'.($rules['numlike'] ?'[~]':'') => $this->searchFormatNumber,
                's_formatnum' . ($rules['numlike'] ? '[~]' : '') => $this->searchFormatNumber,
                's_code' . ($rules['numlike'] ? '[~]' : '') => $this->searchNumber,
                'sn_numfomart'.($rules['numlike'] ?'[~]':'') => $this->searchFormatNumber,
            ];
            $this->group[] = 's.s_id';
        }
        //进度条件
        $where = array_merge($where, $this->processWhere($rules['process']));
        if($rules['process'] != 'all' && \mvc::$req['block']!='noEditAll' && !isset($where['s_stop']) && !isset($rules['outnum'])){
            $where['s_stop'] = 0;
        }else if($rules['process']=='all'){
            $this->join['[>]sample_tech'] = ['s.s_id'=>'st_s_id'];
            $this->fields[] = 'SUSER06'; //PLM开发完成时间
            $this->fields[] = 'SUSER01'; //PLM核对结论
            $this->fields[] = 'HTIME'; //PLM核对时间
            $this->fields[] = 'SUSER03'; //PLM技术GSP型号
            $this->fields[] = 'ASUSER08'; //PLMABS
            $this->fields[] = 'WXTX'; //PLM评审特性
            $this->fields[] = 'ASUSER12'; //PLM类似报价
            $this->fields[] = 'ASUSER09'; //PLM客户确认栏
            $this->fields[] = 'PROTYPE'; //PLM样品描述
            $this->fields[] = 'ASUSER13'; //PLM初步校对意见
            $this->fields[] = 'SMEMO'; //PLM备注
            $this->fields[] = 'JDR'; //PLM核对人
            $this->fields[] = 'WQLDM'; //PLM外球笼是否单卖
            $this->fields[] = 'NQLDM'; //PLM内球笼是否单卖
            $this->fields[] = 'WQLXLDM'; //PLM外球笼维修包是否单卖
            $this->fields[] = 'NQLXLDM'; //PLM内球笼维修包是否单卖
            $this->fields[] = 'DESCRIBE'; //PLM描述
            $this->fields[] = 'KFBZ'; //PLM开发任务备注
        }
        if(!empty($rules['myonly'])){
            $where['OR #myonly'] = [
                'RAW1'=> raw(" exists (select 1 from sample_follow where sf_s_id = s_id and sf_au_id='".getOpuser()."' limit 1)"),
                's_apply_user'=>getOpuser(),
                's_sign_opuser'=>getOpuser(),
            ];
        }
		//零件查询
		if(isset($rules['p_cate']) && !empty($rules['p_cate'])){
		    if(!is_array($rules['p_cate'])) $rules['p_cate'] = explode(',',$rules['p_cate']);
			$where['s_cate'] = $rules['p_cate'];
		}
        if(!empty($rules['cates'])){
            $where['s_cate'] = isset($where['s_cate']) ? array_merge($where['s_cate'],$rules['cates']) : $rules['cates'];
        }
        
        //完全使用rules操作条件
        if(!empty($rules['where'])){
            $where = array_merge($where, $rules['where']);
        }
        
		$this->where = array_merge($this->where,$where);
		
		if($this->group){
		    $this->where['GROUP'] = $this->group;
		}
		//dd($this->where);
		if($page>0 && $pagesize>0){
            if(empty($this->join)){
                $pages = $this->paging($table,$this->where,$page,$pagesize);
            }else{
                $pages = $this->paging($table,$this->join,'s_id',$this->where,$page,$pagesize);
            }
			$this->where["LIMIT"] = [$pages['limit'],$pagesize];
		}
        if(empty($this->join)){
            $rows = $this->db->select($table,$this->fields,$this->where);
        }else{
            $rows = $this->db->select($table,$this->join,$this->fields,$this->where);
        }
        //dd($this->where,$this->db->last());
        if(!empty($rows)) foreach($rows as $k=>&$row){
            $row = $this->getRowInfo($row);
            if($this->searchFormatNumber){
                if(strpos(implode(',',$this->searchFormatNumber),$row['s_plmseq'])!==false){
                    $row['sn_number'] = lg('流水号');
                }else if($row['s_outnum'] && strpos(implode(',',$this->searchFormatNumber),$row['s_outnum'])!==false){
                    $row['sn_number'] = lg('外部编码') . ': ' . $row['s_apply_number'];
                }else if($row['s_innum'] && strpos(implode(',',$this->searchNumber),$row['s_innum'])!==false){
                    $row['sn_number'] = lg('内部编码') . ': ' . $row['s_innum'];
                }else if($row['s_apply_number_format'] && strpos(implode(',',$this->searchFormatNumber),$row['s_apply_number_format'])!==false){
                    $row['sn_number'] = lg('申请号码') . ': ' . $row['s_apply_number'];
                } else if ($row['s_formatnum'] && strpos(implode(',', $this->searchFormatNumber), $row['s_formatnum']) !== false) {
                    $row['sn_number'] = lg('到样号码') . ': ' . $row['s_arri_number'];
                } else if ($row['s_code'] && strpos(implode(',', $this->searchFormatNumber), $row['s_code']) !== false) {
                    $row['sn_number'] = lg('样品预编码') . ': ' . $row['s_code'];
                }else{
                    $row['sn_number'] = lg('交叉号') . ': ' . $row['sn_number'];
                }
            }
            $hasNum = $this->db->get('sample_numidx','sn_id',['sn_s_id'=>$row['s_id'],'LIMIT'=>[0,1]]);
            $row['numidx'] = ($hasNum) ? '1' : '0';
            //待采购
            $row['state_a'] = ($row['s_stop']=='0' && $row['s_check3']=='1' && $row['s_has_purc']=='0') ? '1' : '0';
            //已采购待到样
            $row['state_b'] = ($row['s_stop']=='0' && $row['s_has_purc']=='1' && $row['s_purc_state'] != SAPMLE_DEFINE['到样']) ? '1' : '0';
            //待校对
            $row['state_c'] = ($row['s_stop']=='0' && $row['s_check_sales']=='1' && $row['s_state_sub'] <= '1') ? '1' : '0';
            //文本车型
            if(!isset($this->join['[>]sample_model_txt(smt)'])){
                $tmpRow = $this->db->get('sample_model_txt',['[>]m_make'=>['sm_make'=>'mk_id']],['mk_'.LG_NAME.'(make)','sm_series'],['smt_s_id'=>$row['s_id'],'LIMIT'=>[0,1]]);
                $row['modeltext'] = $tmpRow['make'].' '.$tmpRow['sm_series'];
            }
            if($req['isExport']){
                $tmpRows = $this->db->select('sample_numidx',[
                    '[>]pro_factory'=>['sn_pro_factory'=>'pf_id']
                ],
                ['pf_name','sn_number'],
                [
                    'pf_is_gsp'=>0,
                    'sn_s_id'=>$row['s_id'],
                ]);
                $numbers = '';
                foreach($tmpRows as $tmpRow){
                    if($numbers!='') $numbers .= " \r\n";
                    $numbers .= $tmpRow['pf_name'].': '.$tmpRow['sn_number'];
                }
                $row['numidxText'] = $numbers;
            }
        }
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $rows
		];
		return $data;
	}

	/**
	 * 进度查询条件
	 * @param int $process 进度
	 * @return array
	 */
	function processWhere($process){
	    $where = [];
	    switch($process){
	        case "1";
	            $pwcode = 'A210';
                $where['s_stop'] = 0;
                $where['s_check3'] = 0;
                if(!\p::isAdmin()){
                    //未提交的只能自己看
                    $where['OR #s_apply_comp'] = [
                        's_apply_comp' => 1,
                        'AND #s_apply_comp' => [
                            's_apply_comp' => 0,
                            's_apply_user' => getOpuser()
                        ]
                    ];
                }
	        break;
	        case "1-edit";
	            $pwcode = 'A210';
                $where['s_stop'] = 0;
                $where['s_check3'] = 0;
                if(!\p::isAdmin()){
                    //未提交的只能自己看
                    $where['OR #s_apply_comp'] = [
                        's_apply_comp' => 1,
                        'AND #s_apply_comp' => [
                            's_apply_comp' => 0,
                            's_apply_user' => getOpuser()
                        ]
                    ];
                }
	        break;
	        case "2";
	            $pwcode = 'A220';
                $where['s_check3'] = 1;
                $where['s_stop'] = 0;
                $where['s_form'] = 0;
                $where['s_has_comein'] = 0;
	        break;
	        case "2-edit";
	            $pwcode = 'A220';
                $where['s_stop'] = 0;
                $where['s_apply_comp'] = 1;
                $where['s_check3'] = 1;
	        break;
	        case "3";
	            $pwcode = 'A230';
                $where['s_check3'] = 1;
                $where['s_stop'] = 0;
                //$where['s_purc_state[!]'] = 10040;
                $where['s_has_purc'] = 1;
                $where['OR'] = [
                    's_form' => 1,
                    's_purc_state' => SAPMLE_DEFINE['到样'],
                    ];
                $where['s_check_tech'] = 0;
                if(!\p::isAdmin() && !\p::has('A2B0','done')){
                    //未提交的只能自己看, 管理员与样品大权限除外
                    $where['OR #s_has_comein'] = [
                        's_has_comein' => 1,
                        'AND #s_has_comein' => [
                            's_has_comein' => 0,
                            'OR #s_has_comein2' => [
                                's_apply_user' => getOpuser(),
                                's_sign_opuser #1' => getOpuser(),
                                's_sign_opuser #2' => getActiveOpuserName(),
                                's_sign_opuser #3' => '', 
                            ]
                        ]
                    ];
                }
	        case "3-edit";
	            $pwcode = 'A230';
                $where['s_check3'] = 1;
                $where['s_stop'] = 0;
                //$where['s_purc_state[!]'] = 10040;
                $where['s_has_purc'] = 1;
                $where['OR'] = [
                    's_form' => 1,
                    's_purc_state' => SAPMLE_DEFINE['到样'],
                    ];
                if(!\p::isAdmin() && !\p::has('A2B0','done')){
                    //未提交的只能自己看
                    $where['OR #s_has_comein'] = [
                        's_has_comein' => 1,
                        'AND #s_has_comein' => [
                            's_has_comein' => 0,
                            'OR #s_has_comein2' => [
                                's_apply_user' => getOpuser(),
                                's_sign_opuser #1' => getOpuser(),
                                's_sign_opuser #2' => '',
                            ]
                        ]
                    ];
                }
	        break;
	        case "4";
	            $pwcode = 'A240';
                $where['s_check_tech'] = 1;
    			$where['s_stop'] = 0;
                //$where['s_p_id'] = 0;
                $where['s_state_sub[!]'] = [200,10,11,12];
	        break;
	        case "5";
	            $pwcode = 'A250';
    			$where['s_stop'] = 1;
                $where['s_outnum'] = '';
                $where['s_oddno[!]'] = '';
                //$where['s_state_sub[!]'] = [1,10,11,12];
                $where['s_state_sub'] = 200;
                $where['s_innum[!]'] = '';
            break;
	        case "change";
	            $pwcode = 'A400';
	        case "no-edit";
                ;
	        break;
	    }
        if($pwcode!=''){
    	     //权限 - 用户
            $userWhere = \p::userWhere($pwcode);
            if(!\p::isAdmin() && !\p::has('A2B0',['done']) && $userWhere){
                $where['OR #power_user'] = [
                    's_apply_user' => $userWhere,
                    's_sign_opuser' => $userWhere,
                    's_purc_user' => $userWhere
                ];
            }
            //权限 - 品名
            $cates = \p::cates($pwcode);
            if(!\p::isAdmin() && !\p::has('A2B0',['done']) && $cates){
                $cates = explode(',',$cates);
                array_push($cates,'0');
    			$where['AND #power_cate'] = ['s_cate'=>$cates];
            }
        }
        return $where;
	}
	/**
	 * 各状态数量统计
	 * @return array
	 */
	function getStateCount(){
	    $data = [];
        for($i=1;$i<=5;$i++){
            $data[$i] = $this->db->count($this->table,$this->key,$this->processWhere($i));
        }
        return $data;
	}
	

	/**
	 * 通过主键返回行记录
	 * @param var $key 如ID
	 * @return array
	 */
	function getRowByKey($key,$fields=null){
        return $this->getRowByFieldValue($this->key,$key);
	}

	/**
	 * 通过指定字段值返回行记录
	 * @param string $field
	 * @param string $value
	 * @return array
	 */
	function getRowByFieldValue($field,$value,$fields=null){
        return $this->db->get($this->table,'*',[$field=>$value]);
	}

	/**
	 * 通过指定客户名称与号码返回行记录
	 * @param string $customerName 客户名称
	 * @param string $number
	 * @return array
	 */
	function getRowByCustomerAndNumber($customerName,$number){
		$tRow = $this->customer->getRowByFieldValue('ct_name',$customerName);
		if($tRow){
			$where = [
				's_customer_name' => $tRow['ct_id'],
				's_formatnum'=> formatNum($number)
			];
			return $this->db->get($this->table,'*',$where);
		}else{
			return [];
		}
	}

	/**
	 * 取下一个样品单号
	 * @return string
	 */
	function getOddnoNext(){
        $fix = 'YP'.date('-y-m-');
        return $this->getSeqNext($fix,'s_oddno',4);
	}

	/**
	 * 取下一个样品预编码
	 * @return string
	 */
	function getCodeNext(){
        $fix = 'ZGY'.date('-y-m-');
        return $this->getSeqNext($fix,'s_code',4);
	}

	/**
	 * 取下一个PLM流水号
	 * @return string
	 */
	function getPlmSeqNext(){
        $fix = date('Ymd');
        return $this->getSeqNext($fix,'s_plmseq',4);
	}

	/**
	 * 取下一个序列号
     * @param string $fix 前缀
     * @param string $field 字段
     * @param string $lengh 流水号长度
	 * @return string
	 */
	function getSeqNext($fix,$field,$lengh=4){
        $where[$field.'[=~]'] = $fix;
        $where['ORDER'][$field] ='DESC';
        $value = $this->db->get($this->table,$field,$where);
        if(!empty($value)){
            $value = ltrim(substr($value,-$lengh),'0') + 1;
            $value = $fix.str_pad($value,$lengh,'0',STR_PAD_LEFT);
        }else{
            $value = $fix.str_pad('1',$lengh,'0',STR_PAD_LEFT);
        }
        return $value;
	}

    /**
     * 得到样品记录全量信息
     * @param id|row $var id或者行记录
     * @return array
     * @return string
     */
	function getRowInfo($var){
        $row = $var;
		if(!is_array($var)){
            $row = $this->getRowByKey($var);
        }
        if($row['s_check1_no_reason']){
            $row['s_check1'] = -1;
        }
        if($row['s_check2_no_reason']){
            $row['s_check2'] = -1;
        }
        if($row['s_check3_no_reason']){
            $row['s_check3'] = -1;
        }
        if($row['s_check_sales_reason']){
            $row['s_check_sales'] = -1;
        }
        if($row['s_check_tech_reason']){
            $row['s_check_tech'] = -1;
        }
        //产品线与品名
        if(!empty($row['s_cate'])){
            $data = $this->getCateText($row['s_cate']);
            $row['captions'] = $data;
        }
        //子状态
        if($row['s_state_sub']!=''){
            $row['captions']['s_state_sub'] = $this->plmstateText[$row['s_state_sub']];
        }
        //照片
        $row['s_photos_has'] = ($row['s_photos']=='') ? 0 : 1;
        //车型来源
        if(!empty($row['s_model_src'])){
            $row['captions']['s_model_src'] = $this->getCollocationText($row['s_model_src']);
        }
        //申请时保有量来
        if (!empty($row['s_model_vio']) && empty($row['s_comein_model_vio'])) {
            $row['s_comein_model_vio'] = $row['s_model_vio'];
        }
        //申请时保有量来源
        if (!empty($row['s_model_vio_src'])) {
            $row['captions']['s_model_vio_src'] = $this->getCollocationText($row['s_model_vio_src']);
            if (empty($row['s_comein_model_vio_src'])) {
                $row['s_comein_model_vio_src'] = $row['s_model_vio_src'];
            }
        }
        //登记保有量来源
        if (!empty($row['s_comein_model_vio_src'])) {
            $row['captions']['s_comein_model_vio_src'] = $this->getCollocationText($row['s_comein_model_vio_src']);
        }
        //可销售区域
        /*
        if(!empty($row['s_sales_area'])){
            $collRows = $this->area->getRowsByKeys($row['s_sales_area']);
            $capton = '';
            foreach($collRows as $ck=>$cv){
                if($capton!='') $capton.=',';
                $capton .= $cv[LG_NAME];
            }
            $row['captions']['s_sales_area'] =$capton;
        }*/
        if(!empty($row['s_sales_area'])){
            $tmpArr = explode(',',$row['s_sales_area']);
            $caption = '';
            foreach($tmpArr as $v){
                if($caption!='') $caption .= ', ';
                $caption .= $this->getCollocationText($v);
            }
            $row['captions']['s_sales_area'] =$caption;
        }
        //申请类型
        if(!empty($row['s_apply_type'])){
            $row['captions']['s_apply_type'] = $this->getCollocationText($row['s_apply_type']);
        }
        //申请品牌
        if(!empty($row['s_apply_brand'])){
            $facRow = $this->factory->getRowByKey($row['s_apply_brand']);
            $row['captions']['s_apply_brand'] = ($facRow[CateName()]) ? $facRow[CateName()] : $facRow['pf_name'];
        }
        //客户名称
        if(!empty($row['s_customer_name'])){
            $trow = $this->customer->getRowByKey($row['s_customer_name']);
            $row['captions']['s_customer_name'] = ($trow['ct_name']) ? $trow['ct_name'] : '';
            $row['captions']['s_customer_code'] = ($trow['ct_code']) ? $trow['ct_code'] : '';
        }
        //PLM类别
        if(!empty($row['s_plmcate'])){
            $row['captions']['s_plmcate'] = $this->getCollocationText($row['s_plmcate']);
        }
        //PLM账号
        if(!empty($row['s_plmuser'])){
            $row['captions']['s_plmuser'] = $this->getCollocationText($row['s_plmuser']);
        }
        //上传单位
        if(!empty($row['s_upunit'])){
            $row['captions']['s_upunit'] = $this->getCollocationText($row['s_upunit']);
        }
        //采购渠道
        if(!empty($row['s_channel'])){
            $row['captions']['s_channel'] = $this->getCollocationText($row['s_channel']);
        }
        //采购状态
        if(!empty($row['s_purc_state'])){
            $row['captions']['s_purc_state'] = $this->getCollocationText($row['s_purc_state']);
        }
        //币种
        if(!empty($row['s_supp_currency'])){
            $row['captions']['s_supp_currency'] = $this->getCollocationText($row['s_supp_currency']);
        }
        //北美编码品牌
        if(!empty($row['s_usa_make'])){
            $trow = $this->make->getRowByKey($row['s_usa_make']);
            $row['captions']['s_usa_make'] = $trow['name'];
        }
        //到样品牌
        if(!empty($row['s_arri_brand'])){
            $facRow = $this->factory->getRowByKey($row['s_arri_brand']);
            $row['captions']['s_arri_brand'] = !empty($facRow[LG_NAME]) ? $facRow[LG_NAME] : $facRow['pf_name'];
        }
        //来样方式
        if(!empty($row['s_sign_type'])){
            $row['captions']['s_sign_type'] = $this->getCollocationText($row['s_sign_type']);
        }
        //样品所在地
        if(!empty($row['s_sign_address'])){
            $row['captions']['s_sign_address'] = $this->getCollocationText($row['s_sign_address']);
        }
        //核对类型
        if(!empty($row['s_check_type'])){
            $row['captions']['s_check_type'] = $this->getCollocationText($row['s_check_type']);
        }

        //申请人姓名
        $row['captions']['s_apply_user'] = '';
        if(!empty($row['s_apply_user'])){
            $row['captions']['s_apply_user'] = $this->getUser($row['s_apply_user']);
        }
        //指定采购人姓名
        $row['captions']['s_purc_user'] = '';
        if(!empty($row['s_purc_user'])){
            $row['captions']['s_purc_user'] = $this->getUser($row['s_purc_user']);
        }
        //登记人姓名
        $row['captions']['s_sign_opuser'] = '';
        if(!empty($row['s_sign_opuser'])){
            $row['captions']['s_sign_opuser'] = $this->getUser($row['s_sign_opuser']);
        }

        //是否有交叉号
        $row['hasnumidx'] = $this->db->has('sample_numidx',['sn_s_id'=>$row['s_id']]) ? 1:'';
        
        //是否有车型
        $row['hasmodel'] = $this->db->has('sample_model_link',['sml_s_id'=>$row['s_id']]) ? 1:'';
        
        //是否有关注
        $row['hasfollow'] = $this->db->has('sample_follow',['sf_s_id'=>$row['s_id'],'sf_au_id'=>getOpuser()]) ? 1:0;
       //其他编码
		if(!empty($row['s_auto_nums']))
		{
			$row['s_auto_nums'] = json_decode($row['s_auto_nums'], true);
			if(!empty($row['s_auto_nums'])){
				foreach($row['s_auto_nums'] as $ak=>$av)
				{
					$row['s_auto_nums_'.strtolower($ak)] = is_array($av[0])? $av[0]['num']: $av['num'];
				}
			}
		}
        return $row;
	}

    function getCateText($value){
        if(isset($this->findCaches['cate'][$value])){
            $cateRow = $this->findCaches['cate'][$value];
        }else{
            $cateRow = $this->cate->getRowByKey($value);
            $this->findCaches['cate'][$value] = $cateRow;
        }
        if(isset($this->findCaches['parent'][$cateRow['parent_id']])){
            $cateParentRow = $this->findCaches['parent'][$cateRow['parent_id']];
        }else{
            $cateParentRow = $this->cate->getRowByKey($cateRow['parent_id']);
            $this->findCaches['parent'][$cateRow['parent_id']] = $cateParentRow;
        }
        return [
            's_cate' => $cateRow[LG_NAME],
            's_cate_parent' => $cateParentRow[LG_NAME],
        ];
    }
	//
    function getUser($value){
        if(isset($this->findCaches['user'][$value])){
            $userRow = $this->findCaches['user'][$value];
        }else{
			$userRow = $this->user->getRowBykey($value);
			$this->findCaches['user'][$value] = $userRow;
		}
		return $userRow['au_name'];
    }

    function getCollocationText($value,&$code=null){
        if(isset($this->findCaches['collocation'][$value])){
            $collRow = $this->findCaches['collocation'][$value];
        }else{
            $collRow = $this->collocation->getNode($value);
            $this->findCaches['collocation'][$value] = $collRow;
        }
        if($code!==null) $code = $collRow['code'];
        return $collRow[LG_NAME];
    }
	/**
	 * 新增一行
	 * @param $isNew 是不是新订单中的第一条
	 */
	function addRow($oddno,$ccu=null,$type='new',$isNew=false){
        if($type=='new')
            $item = [
                's_form'=> 0,
                's_oddno'=> $oddno,
                's_code'=> $this->getCodeNext(),
                's_plmseq'=> $this->getPlmSeqNext(),
                's_apply_date'=> getNowDate(),
                's_apply_user'=> getOpuser(),
                's_apply_depa'=> $_SESSION['user']['au_depa_name'],
                's_apply_area'=> $_SESSION['user']['au_area_name'],
                'create_time'=> getNowTime(),
                'update_time'=> getNowTime(),
            ];
        else if($type=='comein'){
            $item = [
                's_form'=> 1,
                's_apply_comp'=> 1,
                's_check1'=> 1,
                's_check2'=> 1,
                's_check3'=> 1,
                's_oddno'=> $oddno,
				's_has_purc'=>1,
				's_purc_state'=>10039,
				's_state_main'=>'YJ',
                's_plmseq'=> $this->getPlmSeqNext(),
                's_apply_date'=> getNowDate(),
                's_apply_user'=> getOpuser(),
                's_apply_depa'=> $_SESSION['user']['au_depa_name'],
                's_apply_area'=> $_SESSION['user']['au_area_name'],
                's_sign_opuser'=> getOpuser(),
                's_sign_time'=> getNowDate(),
                'create_time'=> getNowTime(),
                'update_time'=> getNowTime(),
            ];
        }
        
        //如果是新订单中的第一条，检查订单号有没有被使用
        if($isNew=='1'){
            if($this->db->has('sample',['s_oddno'=>$item['s_oddno']])){
                $item['s_oddno'] = $this->getOddnoNext();
            }
        }
        //dd($isNew);
        if(!empty($ccu)){
            $item['s_apply_brand'] = '1'; //1:OE
            $item['s_ccu'] = $ccu['sccu_code'];
            $item['s_apply_number'] = $ccu['sccu_oe'];
        }
        $this->db->begin();
		$this->db->insert('sample',$item);
        $id = $this->db->id();

		//ccu车型
		if(!empty($ccu['sccu_model']))
		{
			$modelTxt = [
				'smt_s_id'=>$id,
				'sm_make'=>$ccu['sccu_model'],
				'opuser'=>getOpuser(),
				'create_time'=> getNowTime(),
				'update_time'=> getNowTime(),
			];
			$this->db->insert('sample_model_txt',$modelTxt);
		}
        $this->db->end();
        return ['id'=>$id,'oddno'=>$item['s_oddno']];
	}

	/**
	 * 重复项检测
	 * @return array
	 */
	function checkRepeat($row){
	    $result = false;
	    //预编码唯一
	    if(!$result && exists($row['s_code'])){
    	    $result = $this->db->has($this->table,['s_code'=>trim($row['s_code'])]);
	    }
	    
	    //流水号唯一
	    if(!$result && exists($row['s_plmseq'])){
    	    $result = $this->db->has($this->table,['s_plmseq'=>trim($row['s_plmseq'])]);
	    }
	    
	    //申请编码与客户名称唯一
	    if(!$result && exists($row['s_apply_number']) && exists($row['s_customer_name'])){
    	    ;//$result = $this->db->has($this->table,['s_apply_number'=>formatNum($row['s_apply_number']),'s_customer_name'=>trim($row['s_customer_name'])]);
	    }
	    
	    //到样编码与客户名称唯一
	    if(!$result && exists($row['s_arri_number']) && exists($row['s_customer_name'])){
    	    $result = $this->db->has($this->table,[
                    's_arri_number'=>formatNum($row['s_arri_number']),
                    's_customer_name'=>trim($row['s_customer_name'])
                ]
            );
	    }
	    return $result;
	}
	
	function checkRepeatByCode($code){
	    return $this->checkRepeat(['s_code'=>$code]);
	}
	
	function checkRepeatBySeq($seq){
	    return $this->checkRepeat(['s_plmseq'=>$seq]);
	}
	
	function checkRepeatByApply($s_customer_name,$s_apply_number){
	    return $this->checkRepeat(['s_customer_name'=>$s_customer_name,'s_apply_number'=>$s_apply_number]);
	}
	
	function checkRepeatByArri($s_customer_name,$s_arri_number){
	    return $this->checkRepeat(['s_customer_name'=>$s_customer_name,'s_arri_number'=>$s_arri_number]);
	}

	/**
	 * edit ceil 值修改
	 * @return array
	 */
	function setValue($key,$field,$value,$remark=''){
        $result = 200;
        if($field=='s_purc_state'){
            if($value==SAPMLE_DEFINE['停购']){
                $this->setValue($key,'s_stop_fag',1);
                $this->setValue($key,'s_state_main','Y0');
            } else if ($value == SAPMLE_DEFINE['到样']) {
                $this->setValue($key, 's_state_main', 'YJ');
                $row = $this->getRowByKey($key);
                if ($row['s_apply_type'] == '11824') {
                    // 如果是 申请类型 = 产品对比分析, 如果到样了，则结束样品
                    $this->setValue($key, 's_stop', 1);
                }
            } else if ($value == SAPMLE_DEFINE['在途']) {
                $this->setValue($key, 's_downorder_time', date('Y-m-d'));
            }else{
                $this->setValue($key,'s_stop_fag',0);
                //$this->setValue($key,'s_state_main','');
            }
            $arr = array_flip(SAPMLE_DEFINE);
            $this->history->addRow('sample',$key,'采购状态','['.$arr[$value].'] '.$remark,true);
        }else if($field=='s_apply_remark'){
			$this->db->update($this->table,['s_custrequ'=>$value],[$this->key=>$key]);
        } else if ($field == 's_remark') {
            //申请人备注自动同步到客户要求
            $this->db->update($this->table, ['s_proof_catagroup' => $value], [$this->key => $key]);
        } else if ($field == 's_refgsp_no') {
            //申请人配对型号自动同步到登记配对型号
            $this->db->update($this->table, ['s_refgsp_no2' => $value], [$this->key => $key]);
        }else if($field=='s_cate'){
			if(empty($value)){
			    return -11; //品名不能为空
			}
        }else if($field=='s_apply_number' || $field=='s_customer_name' || $field == 's_arri_number' || $field == 's_apply_brand' || $field == 's_arri_brand'){
            //申请编码与客户名称唯一，到样编码与客户名称唯一
            $row = $this->getRowByKey($key);
            $customer = $row['s_customer_name'];
            $applyBand = $row['s_apply_brand'];
            $apply_number = $row['s_apply_number'];
            $arriBrand = $row['s_arri_brand'];
            $arri_number = $row['s_arri_number'];
            if($field=='s_apply_number'){
                $apply_number = $value;
            }else if($field=='s_arri_number'){
                $arri_number = $value;
            } else if ($field == 's_customer_name') {
                $customer = $value;
            } else if ($field == 's_apply_brand') {
                $applyBand = $value;
            } else if ($field == 's_arri_brand') {
                $arriBrand = $value;
            }
            //GSP品牌 有两个id
            if ($applyBand == '2' || $applyBand == '2095') {
                $applyBand = [2, 2905];
            }
            if ($arriBrand == '2' || $arriBrand == '2095') {
                $arriBrand = [2, 2905];
            }
            if($apply_number!='' && !empty($customer)){
                $where = [
                    's_id[!]'=> $key,
                    's_customer_name'=> $customer,
                    'OR' => [
                        'AND #1' => [
                            's_apply_brand' => $applyBand,
                            'OR' => [
                                's_apply_number' => $apply_number,
                                's_apply_number_format' => formatNum($apply_number),
                            ],
                        ],
                        'AND #2' => [
                            's_arri_brand' => $applyBand,
                            'OR' => [
                                's_arri_number' => $apply_number,
                                's_formatnum' => formatNum($apply_number),
                            ],
                        ],
                    ],
                ];
                if($this->db->get($this->table,'s_id',$where)){
                    $result = -1; //重复的申请号
                }
            }
			
            if($result==200 && $arri_number!='' && !empty($customer)){
                $where = [
                    's_id[!]' => $key,
                    's_customer_name' => $customer,
                    'OR' => [
                        'AND #1' => [
                            's_apply_brand' => $arriBrand,
                            'OR' => [
                                's_apply_number' => $arri_number,
                                's_apply_number_format' => formatNum($arri_number),
                            ],
                        ],
                        'AND #2' => [
                            's_arri_brand' => $arriBrand,
                            'OR' => [
                                's_arri_number' => $arri_number,
                                's_formatnum' => formatNum($arri_number),
                            ],
                        ],
                    ],
                ];
                $findRow = $this->db->get($this->table, 's_plmseq', $where); 
                if($findRow){
                    $result = [-2, $findRow]; //重复的到样号 
                }
            }

			
            if ($result == 200 && $field == 's_apply_number') {
                $this->db->update($this->table, ['s_apply_number_format' => formatNum($apply_number)], [$this->key => $key]);
            }
            if ($result == 200 && $field == 's_arri_number') {
				$findRow = $this->db->get($this->table, 's_plmseq', ['s_arri_brand'=>$arriBrand, 's_arri_number'=>$arri_number, 's_id[!]'=>$key]);
				if($findRow){
					$result = [-10, $findRow];
				}else{
					$findRow = $this->db->get($this->table, 's_plmseq', ['s_arri_number'=>$arri_number, 's_id[!]'=>$key]);
					if($findRow) $result = [-11, $findRow];
				}
                $this->db->update($this->table, ['s_formatnum' => formatNum($arri_number), $field=>$value], [$this->key => $key]);
            }
        }else if($field=='s_state_sub'){
			$row = $this->getRowByKey($key);
            $old_s_stop = $row['s_stop'];
			$old_s_state_sub = $row['s_state_sub'];
            $this->db->update($this->table,[$field=>$value],[$this->key=>$key,'s_stop'=>0]);
			$value *= 1;
			if($value==200){
				if($row['s_innum']!=''){
					//开发完成
					//$this->db->begin();
					$this->db->update($this->table,[$field=>$value,'s_state_main'=>'Y1','s_stop'=>1],[$this->key=>$key]);
                    if ($old_s_state_sub != 200 || $old_s_state_sub != '200') { //如果之前不是开发完成
                        //消息记录与在线提醒
                        errorLog($row, 'SAMPLE_200');
                        $this->sendMessage($row, $value);
                    }
                    \mvc::$exitif = false;
					$res = $this->changSampleByInnum($key, $row['s_innum']);
    				if(!empty($row['s_innum'])){
    					$pro = make(pro::class);
    				    $pro->setProductBySampleOnlyToPro($row['s_innum']);
    				}
					//$this->db->end();
					if($res['code']==0) $result== -4;
					\mvc::$exitif = true;
                    //if ($old_s_stop == 0 || $old_s_stop == '0') { //如果之前没有终止
				}else{
					$result = -5; //缺少内部编码
				}
			}else if(in_array($value,[10,11,12])){
			    
				$this->db->update($this->table,['s_state_sub'=>$value,'s_stop'=>'1'],[$this->key=>$key]);
				
				//取消开发
				//$this->db->begin(); 事件与触发器有冲突
				if(in_array($value,[10,12])){
    				$this->setValue($key,'s_state_main','Y0');
				}if($value==11){ //已校对不开发
    				$this->setValue($key,'s_state_main','Y1');
    				if(!empty($row['s_innum'])){
    					$pro = make(pro::class);
    				    $pro->setProductBySampleOnlyToPro($row['s_innum']);
    				}
				}
				
				if($row['s_innum']){
				    if($pcodeRow = $this->db->get('p_code',['pc_p_id','pc_outnum'],['pc_innum'=>$row['s_innum']])){
				        $this->db->update($this->table,['s_p_id'=>$pcodeRow['pc_p_id'],'s_outnum'=>$pcodeRow['pc_outnum']],[$this->key=>$key]);
				    }
				}
				//$this->db->end();
				//$this->refreshOutnum();

                //消息记录与在线提醒
                if($old_s_stop==0 || $old_s_stop=='0'){ //如果没有终止
                    //消息记录与在线提醒
                    $this->sendMessage($row,$value);
                }
                $this->sampleDate->setValue($key, "sdate_plm_{$value}_date", getNowDate());
                return $result;
			}
		}
        if($result== 200) $this->db->update($this->table,[$field=>$value],[$this->key=>$key]);

        // 各状态日期
        switch ($field) {
            case 's_apply_date': # 申请日期
                $this->sampleDate->setValue($key, 'sdate_apply_date', getNowDate());
                break;
            case 's_downorder_time': # 下单日期(采购)
                $this->sampleDate->setValue($key, 'sdate_downorder_date', getNowDate());
                break;
            case 's_arrival_time': # 到样日期
                $this->sampleDate->setValue($key, 'sdate_arrival_date', getNowDate());
                break;
            case 's_sign_time': # 登记日期
                $this->sampleDate->setValue($key, 'sdate_sign_date', getNowDate());
                break;
            case 's_state_sub': # PLM 子状态
                if (in_array($value, [1, 10, 11,12, 50, 51, 52, 200])) {
                    $this->sampleDate->setValue($key, "sdate_plm_{$value}_date", getNowDate());
                }
                break;
        }
		return $result;
	}

    /**
	  * @method 发送邮件消息记录与在线提醒
	  * @param  $row  array  样品记录
	  * @param  $sub_state int 子状态 
	  * @return array
	  */
	function sendMessage($row, $sub_state)
	{
	    $item = $this->getRowInfo($row['s_id']);
	    list($cnStateText,$enStateText) = explode('|',$this->plmstateTextLangs[$sub_state]);
        $factoryRow = ['cn_name'=>'','en_name'=>''];
	    if($item['s_arri_brand']){
	        $factoryRow = $this->db->get('pro_factory','*',['pf_id'=>$item['s_arri_brand']]);
	    }
        $title = $row['s_plmseq'].': Sample '.$enStateText.'(样品'.$cnStateText.')';
	    $br = "\r\n <br /> \r\n";
	    $msg  = '';
	    $msg .= '<b>Sample' . ' ' . $row['s_plmseq'].' '.$enStateText.'</b>';
	    $msg .= $br;
	    $msg .= 'Applicant: ' . ' ' . $item['s_apply_user'];
	    $msg .= $br;
	    $msg .= 'Brand: ' . ' ' . $factoryRow['pf_name'];
	    $msg .= $br;
	    $msg .= 'Sample NO.: ' . ' ' . $row['s_arri_number'];
	    $msg .= $br;
	    $msg .= $br;
	    $msg .= '<b>样品' . ' ' . $row['s_plmseq'].' '.$cnStateText.'</b>';;
	    $msg .= $br;
	    $msg .= '申请人: ' . ' ' . $item['captions']['s_apply_user'];
	    $msg .= $br;
	    $msg .= '到样品牌: ' . ' ' . $factoryRow['pf_name'];
	    $msg .= $br;
	    $msg .= '到样号码: ' . ' ' . $row['s_arri_number'];
	    $msg .= $br;
        $msgArr =  [
        	'amsg_title'=> $title,
        	'amsg_body'=> $msg,
        	'amsg_send_mail'=>1,
			'amsg_send_sms'=> 1
        ];
        $toUsers =[
            $row['s_apply_user'],
            $row['s_purc_user'],
            $row['s_purc_opuser'],
            $row['s_sign_opuser']
        ];
        $followUsers = $this->getFollowBySid($row['s_id']);
        if($followUsers){
            $toUsers = array_merge($toUsers,$followUsers);
        }
        $toUsers = array_unique($toUsers);
        foreach ($toUsers as $key => $value) {
            if (!$value) {
                unset($toUsers[$key]);
            }
        }
        if($toUsers) {
            makeOne(\model\message::class)->send($toUsers, $msgArr, true);
            socketSendMsg($toUsers, $msgArr);
        }
	}


    /**
	  * @method 发送邮件消息记录与在线提醒 整单
	  * @param  $row  array  样品记录
	  * @return array
	  */
	function sendMessageOrder($row)
	{   
	    $states = [10,11,12,200];
	    if(empty($row['s_oddno']) && in_array($row['s_state_sub'],$states)) {
	        $this->sendMessage($row,$row['s_state_sub']);
	        return;
	    }
	    $allCount = $this->db->count('sample',[
	        's_oddno' => $row['s_oddno']
	    ]);
	    $endCount = $this->db->count('sample',[
	        's_oddno' => $row['s_oddno'],
	        'OR'=>[
	                's_stop'=> 1,
	                's_state_sub'=> $states,
	            ]
	    ]);
	    if($allCount != $endCount){
	        return;
	    }
	    $item = $this->getRowInfo($row['s_id']);
	    $title = $row['s_oddno'].': Sample [ '.$row['s_oddno'].' ] Completed';
	    $br = "\r\n <br /> \r\n";
	    $msg  = '';
	    $msg .= $title;
	    $msg .= $br;
	    $msg .= 'Applicant: ' . ' ' . $item['s_apply_user'];
	    $msg .= $br;
	    $msg .= $br;
	    $msg .= $br;
	    $msg .= '申请人: ' . ' ' . $item['captions']['s_apply_user'];
	    $msg .= $br;
        $msgArr =  [
        	'amsg_title'=> $title,
        	'amsg_body'=> $msg,
        	'amsg_send_mail'=>1,
			'amsg_send_sms'=> 1
        ];
        $toUsers =[
            $row['s_apply_user'],
            $row['s_purc_user'],
            $row['s_purc_opuser'],
            $row['s_sign_opuser']
        ];
        $followUsers = $this->getFollowBySid($row['s_id']);
        if($followUsers){
            $toUsers = array_merge($toUsers,$followUsers);
            $toUsers = array_unique($toUsers);
        }
        makeOne(\model\message::class)->send($toUsers, $msgArr, true);
        socketSendMsg($toUsers,$msgArr);
	}

	function sendMessageCustom($row, $title,$msg='')
	{
	    if($msg=='') $msg = $title;
        $msgArr =  [
        	'amsg_title'=> $title,
        	'amsg_body'=> $msg,
        	'amsg_send_mail'=>1,
			'amsg_send_sms'=> 1
        ];
        $toUsers =[
            $row['s_apply_user'],
            $row['s_purc_user'],
            $row['s_purc_opuser'],
            $row['s_sign_opuser']
        ];
        $followUsers = $this->getFollowBySid($row['s_id']);
        if($followUsers){
            $toUsers = array_merge($toUsers,$followUsers);
            $toUsers = array_unique($toUsers);
        }
        makeOne(\model\message::class)->send($toUsers,$msgArr);
        socketSendMsg($toUsers,$msgArr);
	}

    /**
	  * @method 通过CCU编码批量添加样品
	  * @param  $oddno  string  [必填] 单号
	  * @param  $codeArr array  [必填] ['11-00106-0106', '11-00152-0152']
	  * @author soul
	  */
	function addAnyByCuucode($oddno, $codeArr)
	{
		$arr = [];
		$formatArr = [];
		foreach($codeArr as $k=>$v)
		{
			$formatArr[formatNum($v)] = $v;
		}
		if(!empty($formatArr))
		{
			$where['s_check2'] = 0;
			$where = [
				'sccu_code_format'=>array_keys($formatArr)
			];
			$arr = $this->db->select('sample_ccu', ['sccu_code', 'sccu_oe', 'sccu_model'], $where);
			$this->db->begin();
			foreach($arr as $row)
			{
				$this->addRow($oddno, $row);
			}
			$this->db->end();
		}
		return $arr;
	}

    /**检测上传
     * @param 
     * @return
     */
	public function uploadCheck($filecount,$reqfilename,$reqfilesize,$uploadID,$extname,$category,$item,$params)
	{
		$sid = $params['sid'];
		if(empty($sid)) {
			throw new \Exception ( '上传产品图片时，样品ID丢失' );
		}
		$cfg = \mvc::$cfg['upload']['category'][$category]['items'][$item];
		
		$count = 0;
		$s_photos = $this->db->get('sample','s_photos',['s_id'=>$sid]);
		if($s_photos){
		    if($s_photos=='') $s_photos = '[]';
    		$tmpArr = json_decode($s_photos);
    		$arr = [];
    		foreach($tmpArr as $v){
    		    $arr[] = $v;
    		}
			$count = count($arr);
		}
		if( ($count+1) > $cfg['maxfile']){
			return lg('超出此项的最大允许的文件数量') .','. lg('最大允许').' '.$cfg['maxfile'].' '.lg('个文件');
		}else{
			return true;
		}
	}


    /**接收上传的图片处理
     * @param 
     * @return
     */
	public function uploadGet($fileid,$filename,$dir,$filebase,$extname,$category,$item,$params)
	{
		$sid = $params['sid'];
		if(empty($sid)) {
			throw new \Exception ( '上传图片时，样品ID丢失' );
		}
		$cfg = \mvc::$cfg['upload']['category'][$category]['items'][$item];
		if($cfg['tojpeg']) $extname = 'jpg';
		$s_photos = $this->db->get('sample','s_photos',['s_id'=>$sid]);
		if(empty($s_photos)) $s_photos = '[]'; 
		$tmpArr = json_decode($s_photos);
		$arr = [];
		foreach($tmpArr as $v){
		    $arr[] = $v;
		}
		array_push($arr,[
			'fileid'=>$fileid,
			'filename'=>$dir.'/'.$filebase.'.'.$extname
		]);
		$this->db->update('sample',['s_photos'=>json_encode($arr)],['s_id'=>$sid]);
	}

	/**
	 * 删除记录
	 * @param string|int|array $ids, id集数组或字符串，字符串用 , 号分隔
	 * @return bool
	 */
	function deleteRows($ids){
	    if(empty($ids)){
	        return [false,lg('没有记录')];
	    }
        if(!is_array($ids)){
            $ids = explode(',',$ids);
        }
        $where = [
            $this->key=>$ids,
            'OR'=>[
                'AND #1'=>[
                    's_form'=>0,
                    's_apply_comp'=>0,
                ],
                'AND #2'=>[
                    's_form'=>1,
                    's_has_comein'=>0,
                ],
            ],
        ];
        $result = 200;
        if(!empty($ids) && $this->rowCount($where)!=count($ids)){
	        return [false,lg('存在已进入下一流程的记录不能删除')];
        }else{
            /*
            //检查重复标记后，再删除
            $rows = $this->db->select($this->table
                ,['[>]sample_numidx'=>['s_id'=>'sn_s_id']]
                ,['s_apply_brand','s_apply_number_format','s_arri_brand','s_formatnum','sn_pro_factory','sn_numfomart']
                ,[$this->key=>$ids]
             );*/
            $this->db->begin();
            //$this->db->delete('history',['h_mod'=>'sample','h_mod_id'=>$ids]);
            $this->history->addRowForDelete('sample', $ids, 'delete', '删除样品');
            $this->db->delete('sample_supplier',['ss_s_id'=>$ids]);
            $this->db->delete('sample_process',['sp_s_id'=>$ids]);
            $this->db->delete('sample_numidx',['sn_s_id'=>$ids]);
            $this->db->delete('sample_devechange',['sb_id'=>$ids]);
            $this->db->delete('sample_develop_change',['sdc_s_id'=>$ids]);
            $this->db->delete('sample_model_link',['sml_s_id'=>$ids]);
            $this->db->delete('sample_model_txt',['smt_s_id'=>$ids]);
            $this->db->delete('sample_tech',['st_s_id'=>$ids]);
            $this->db->delete($this->table,$where);
            $this->db->end();
	        return [true,''];
        }
	}
	/**
	 * 申请完成操作
	 * @param string|int|array $ids  id集数组或字符串，字符串用 , 号分隔
	 * @param int $value 0或者1
	 * @return bool
	 */
	function applyComp($ids,$value){
        if(!is_array($ids)){
            $ids = explode(',',$ids);
        }
        $where = [
            $this->key=>$ids,
            's_apply_comp'=>0,
        ];
        $result = 200;
        $this->db->begin();
        $rows = $this->db->select($this->table,'*',$where);
        if(empty($rows)) $result = 404;
        $sendIds = [];
		$msg = [];
        foreach($rows as $k=>$row){
            if(!empty($row['s_cate']) && !empty($row['s_apply_type']) && !empty($row['s_apply_brand']) && !empty($row['s_apply_number']) && !empty($row['s_customer_name']) ){
                if($value=='1'){
					$chk = $this->db->get('sample', ['s_id'], ['s_arri_brand'=>$row['s_arri_brand'], 's_arri_number'=>$row['s_arri_number'], 's_id[!]'=>$row['s_id']]);
					if($chk){
						$msg[] = '到样品牌+到样号码重复'.$row['s_arri_brand'].':'.$row['s_arri_number'];
					}else{
						$chk = $this->db->get('sample', ['s_id'], ['s_arri_number'=>$row['s_arri_number'], 's_id[!]'=>$row['s_id']]);
						if($chk) $msg[] = '到样号码重复'.$row['s_arri_number'];
					}
                    $this->history->addRow('sample',$row[$this->key],'申请样品','',true);
                    $this->db->update(
                        $this->table,
                        [
                        's_apply_comp'=>$value,
                        's_check1'=>0,
                        's_check2'=>0,
                        's_check3'=>0,
                        's_check_sales'=>0,
                        's_check_tech'=>0,
                        's_check1_yes_reason'=>'',
                        's_check2_yes_reason'=>'',
                        's_check3_yes_reason'=>'',
                        's_check1_no_reason'=>'',
                        's_check2_no_reason'=>'',
                        's_check3_no_reason'=>'',
                        's_check_sales_reason'=>'',
                        's_check_tech_reason'=>''
                        ],
                        [$this->key=>$row[$this->key]]
                    );
                    $sendIds[] = $row[$this->key];
                }else{
                    $this->db->update($this->table,['s_apply_comp'=>$value],[$this->key=>$row[$this->key]]);
                }
            }else{
                 $result = 300;
            }
        }
        $this->db->end();
        if ($sendIds) {
            $this->sendMailToProlineChecker($sendIds, '申请');
        }
        return ['code'=>$result, 'msg'=>$msg];
	}
    /**
     * 申请人退回
     *
     * @param [type] $ids
     * @param [type] $value
     * @return void
     */
    function applyBack($ids, $value, $remark)
    {
        if (!is_array($ids)) {
            $ids = explode(',', $ids);
        }
        $where = [
            $this->key => $ids,
            's_apply_comp' => 1,
            's_check_tech' => 0,
            's_stop' => 0,
            's_apply_user' => getOpuser()
        ];
        $result = 200;
        $rows = $this->db->select($this->table, '*', $where);
        if (empty($rows)) {
            $result = 404;
        } else {
            $this->db->begin();
            $updateData = [
                's_apply_comp' => 0,
                's_check1' => 0,
                's_check2' => 0,
                's_check3' => 0,
                's_has_purc' => 0,
                's_has_comein' => 0,
                's_check_sales' => 0,
            ];
            foreach ($rows as $k => $row) {
                $this->history->addRow('sample', $row[$this->key], '申请人退回', $remark, true);
                $this->db->update($this->table, $updateData, [$this->key => $row[$this->key]]);
            }
            $this->sendMailToProlineCheckerLot($ids, '申请人退回');
            $this->db->end();
        }
        return $result;
    }
    /**
     * 登记人退回
     *
     * @param [type] $ids
     * @param [type] $value
     * @return void
     */
    function comeinBack($ids, $value, $remark)
    {
        if (!is_array($ids)) {
            $ids = explode(',', $ids);
        }
        $where = [
            $this->key => $ids,
            's_has_comein' => 1,
            's_check_tech' => 0,
            's_stop' => 0,
            's_sign_opuser' => getOpuser()
        ];
        $result = 200;
        $rows = $this->db->select($this->table, '*', $where);
        if (empty($rows)) {
            $result = 404;
        } else {
            $this->db->begin();
            $updateData = [
                's_has_comein' => 0,
                's_check_sales' => 0,
            ];
            foreach ($rows as $k => $row) {
                $this->history->addRow('sample', $row[$this->key], '登记人退回', $remark, true);
                $this->db->update($this->table, $updateData, [$this->key => $row[$this->key]]);
            }
            $this->sendMailToProlineCheckerLot($ids, '登记人退回');
            $this->db->end();
        }
        return $result;
    }
    /**
     * 初审
     * @param string|int|array $ids  id集数组或字符串，字符串用 , 号分隔
     * @param int $value 0或者1
     * @return bool
     */
	function check1($ids,$value,$remark=''){
        if(!is_array($ids)){
            $ids = explode(',',$ids);
        }
        $where[$this->key] = $ids;
        $where['s_apply_comp'] = 1;
        $where['s_check1'] = 0;
        if($value=='1'){
            $action = '初审';
        }else{
            $action = '初审驳回';
        }
        $this->db->begin();
		$rows = $this->db->select($this->table,'*',$where);
        if(empty($rows)){ 
            return [404,''];
        }
        foreach($rows as $row){
            if(empty($row['s_cate']) || 
               empty($row['s_customer_name']) || 
               empty($row['s_apply_brand']) || 
               empty($row['s_apply_number'])){
                return [300,$row['s_plmseq']];
            }
        }
        
        foreach($rows as $row){
            $this->history->addRow('sample',$row['s_id'],$action,$remark,true);
            if($value=='0'){
                //重复sendMailToProlineChecker发送了邮件 $this->sendMessageCustom($row, $row['s_plmseq']. " ".$action,$remark);
            }
        }
        if($value=='1'){
		    $this->db->update($this->table,['s_check1'=>1,'s_check1_yes_reason'=>$remark,'s_check1_no_reason'=>''],$where);
            $this->sendMailToProlineChecker($ids, '初审');
        }else{
		    $this->db->update($this->table,['s_apply_comp'=>0,'s_check1_yes_reason'=>'','s_check1_no_reason'=>$remark],$where);
            $this->sendMailToProlineChecker($ids, '初审驳回');
        }
        $this->db->end();
        return [200,''];
	}
	/**
	 * 复审
	 * @param string|int|array $ids  id集数组或字符串，字符串用 , 号分隔
	 * @param int $value 0或者1
	 * @return bool
	 */
	function check2($ids,$value,$remark=''){
        if(!is_array($ids)){
            $ids = explode(',',$ids);
        }
        $where[$this->key] = $ids;
        $where['s_check1'] = 1;
        if($value=='1'){
            $where['s_check2'] = 0;
            $action = '复审';
        }else{
            $action = '复审驳回';
        }
        $result = 200;
        $this->db->begin();
		$rows = $this->db->select($this->table,$this->key,$where);
        if(empty($rows)) $result = 404;
        foreach($rows as $key){
            $this->history->addRow('sample',$key,$action,$remark,true);
            if($value=='0'){
                //重复sendMailToProlineChecker发送了邮件 $this->sendMessageCustom($row, $row['s_plmseq']. " ".$action,$remark);
            }
        }
        if($value=='1'){
            $this->sendMailToProlineChecker($ids, $action);
            $this->db->update($this->table,['s_check2'=>1,'s_check2_yes_reason'=>$remark,'s_check2_no_reason'=>''],$where);
        }else{
            $s_check2 = 0;
            /*
            if(strpos($remark,lg('不采购'))>-1){
                $s_check2 = -1;
            }*/
            $this->db->update($this->table,['s_check1'=>0, 's_check2'=>$s_check2,'s_check2_yes_reason'=>'','s_check2_no_reason'=>$remark],$where); //两者一样
        }
        $this->db->end();
        return $result;
	}
	/**
	 * 终审
	 * @param string|int|array $ids  id集数组或字符串，字符串用 , 号分隔
	 * @param int $value 0或者1
	 * @return bool
	 */
	function check3($ids,$value,$remark=''){
        if(!is_array($ids)){
            $ids = explode(',',$ids);
        }
        $where[$this->key] = $ids;
        $where['s_check2'] = 1;
        $where['s_check_tech'] = 0;
        if($value=='1'){
            $action = '终审';
        }elseif($value=='-1'){
            $action = '终审不采购';
        }else{
            $action = '终审驳回';
        }
        $result = 200;
        $this->db->begin();
		$rows = $this->db->select($this->table,$this->key,$where);
        if(empty($rows)) $result = 404;
        foreach($rows as $key){
            $this->history->addRow('sample',$key,$action,$remark,true);
            if($value=='0'){
                //重复sendMailToProlineChecker发送了邮件 $this->sendMessageCustom($row, $row['s_plmseq']. " ".$action,$remark);
            }
        }
        if($value=='1'){
		    $this->db->update($this->table,['s_check3'=>1,'s_check3_yes_reason'=>$remark,'s_check3_no_reason'=>''],$where);
            $this->sendMailToProlineChecker($ids, '终审');
        }else if($value=='-1'){
		    $this->db->update($this->table,['s_stop'=>1,'s_check3_yes_reason'=>'','s_check3_no_reason'=>'','s_stop_cause'=>$remark],$where);
            $this->sendMailToProlineChecker($ids, '终审不采购');
        }else{
            $s_check3 = 0;
            /*
            if(strpos($remark,lg('不采购'))>-1){
                $s_check3 = -1;
            }*/
		    $this->db->update($this->table,['s_check2'=>0,'s_check3'=>$s_check3,'s_check3_yes_reason'=>'','s_check3_no_reason'=>$remark],$where);
            $this->sendMailToProlineChecker($ids, '终审驳回');
        }
        $this->db->end();
        return $result;
	}
	/**
	 * 采购完成操作
	 * @param string|int|array $ids  id集数组或字符串，字符串用 , 号分隔
	 * @param int $value 0或者1
	 * @return bool
	 */
	function purcComp($ids,$value){
        if(!is_array($ids)){
            $ids = explode(',',$ids);
        }
        $where = [
            $this->key=>$ids,
            's_check3'=>1,
            's_has_purc'=>0,
        ];
        $result = 200;
        $this->db->begin();
        $rows = $this->db->select($this->table,'*',$where);
        if(empty($rows)) $result = 404;
        foreach($rows as $k=>$row){
            if(!empty($row['s_purc_state'])){
                if($value=='1'){
                    $this->history->addRow('sample',$row[$this->key],'采购录入','',false);
                    /*
                    $this->db->update(
                        $this->table,
                        ['s_has_purc' => 1, 's_purc_opuser' => getOpuser(), 's_downorder_time' => getNowDate()],
                        [$this->key => $row[$this->key]]
                    );
                    */
                    $this->db->update(
                        $this->table,
                        ['s_has_purc' => 1, 's_purc_opuser' => getOpuser()],
                        [$this->key => $row[$this->key]]
                    );
                }
            }
        }
        $this->db->end();
        return $result;
	}
	/**
	 * 采购状态更改
	 * @param string|int|array $ids  id集数组或字符串，字符串用 , 号分隔
	 * @param int $value 0或者1
	 * @return bool
	 */
	function purcState($ids,$value,$remark){
        if(!is_array($ids)){
            $ids = explode(',',$ids);
        }
        $where = [
            $this->key=>$ids,
            's_check3'=>1,
            's_has_comein'=>0,
        ];
        $result = 200;
        $this->db->begin();
        $rows = $this->db->select($this->table,'*',$where);
        if(empty($rows)) $result = 404;
        foreach($rows as $k=>$row){
            if(\p::isAdmin() || $row['s_purc_user']=='' || getOpuser()==$row['s_purc_user']){
                if($row['s_purc_state'] != $value){
                    $this->setValue($row[$this->key],'s_purc_state',$value,$remark);
                }
                if(SAPMLE_DEFINE['停购']*1 == $value*1){
                    $this->setValue($row[$this->key],'s_stop_reason',$remark);
                    //$this->sendMailToProlineChecker($row['s_id'], '停购'); 移到停购审核
                }
            }
        }
        $this->db->end();
        return $result;
	}
	/**
	 * 停购审核
	 * @param string|int|array $ids  id集数组或字符串，字符串用 , 号分隔
	 * @param int $value 0或者1
	 * @return bool
	 */
	function purcStop($ids,$value,$remark){
        if(!is_array($ids)){
            $ids = explode(',',$ids);
        }
        $where = [
            $this->key=>$ids,
            's_purc_state'=>SAPMLE_DEFINE['停购'],
            's_stop'=>0,
            's_stop_fag'=>1,
        ];
        $result = 200;
        $this->db->begin();
        $rows = $this->db->select($this->table,'*',$where);
        if(empty($rows)) $result = 404;
        foreach($rows as $row){
            if($value=='1'){
                $this->db->update($this->table,['s_stop'=>1],[$this->key=>$row[$this->key]]);
                $this->history->addRow('sample',$row[$this->key],'停购审核',$remark,true);
                $this->sendMailToProlineChecker($row['s_id'], '停购审核');
            }else{
                $this->db->update($this->table,['s_stop_fag'=>0,'s_purc_state'=>null],[$this->key=>$row[$this->key]]);
                $this->history->addRow('sample',$row[$this->key],'停购审核不通过',$remark,true);
            }
        }
        $this->db->end();
        return $result;
	}
	/**
	 * 客户来样登记新增时状态处理
	 * @param int $id  id
	 * @return bool
	 */
	function comeinNewState($id){
        $where = [$this->key=>$id];
        $this->db->update($this->table,[
            's_form'=>1,
            's_apply_comp'=>1,
            's_check1'=>1,
            's_check2'=>1,
            's_check3'=>1,
            's_state_main'=>'YJ',
            's_has_purc'=>1,
            's_sign_opuser'=>getOpuser()
         ],$where);
    }
	/**
	 * 登记完成操作
	 * @param string|int|array $ids  id集数组或字符串，字符串用 , 号分隔
	 * @param int $value 0或者1
	 * @return bool
	 */
	function comeinComp($ids,$value){
        if(!is_array($ids)){
            $ids = explode(',',$ids);
        }
        $where = [
            $this->key=>$ids,
            'OR'=>['s_form'=>1,'s_has_purc'=>1],
            's_has_comein'=>0,
        ];
        $result = 200;
        $this->db->begin();
        $rows = $this->db->select($this->table,'*',$where);
        if(empty($rows)) $result = 404;
        $sendIds = [];
        foreach($rows as $k=>$row){
            if(
                !empty($row['s_cate']) && 
                $row['s_cate']!='0' && 
                !empty($row['s_sign_type']) && 
                !empty($row['s_customer_name']) && 
                !empty($row['s_sign_address']) && 
                !empty($row['s_arri_brand']) && 
                !empty($row['s_arri_number']) 
                //&& $row['s_requqty'] != ''
            ){
                if($value=='1'){
                    $this->history->addRow('sample',$row[$this->key],'登记录入','',false);

                    $this->db->update($this->table,[
                        's_has_comein'=>1,'s_sign_opuser'=>getOpuser(),'s_sign_time'=>getNowDate(),
                        's_check_sales'=>0,
                        's_check_tech'=>0,
                        's_check_sales_reason'=>'',
                        's_check_tech_reason'=>''
                        ],[$this->key=>$row[$this->key]]);
                    $sendIds[] = $row['s_id'];
                }
            }else{
                 $result = 300;
            }
        }
        $this->db->end();
        if ($sendIds) {
            $this->sendMailToProlineChecker($sendIds, '登记');
        }
        return $result;
	}
	/**
	 * 目录组审核
	 * @param string|int|array $ids  id集数组或字符串，字符串用 , 号分隔
	 * @param int $value 0或者1
	 * @return bool
	 */
	function checkSales($ids,$value,$remark=''){
        if(!is_array($ids)){
            $ids = explode(',',$ids);
        }
        $where[$this->key] = $ids;
        if($value=='1'){
            $where['s_has_comein'] = 1;
            $where['s_check_sales'] = 0;
            $action = '目录组通过';
        }else{
            $where['s_has_comein'] = 1;
            $where['s_check_tech'] = 0;
            $action = '目录组驳回';
        }
       
        $this->db->begin();
		$rows = $this->db->select($this->table,'*',$where);
        if(empty($rows)){ 
            //return [404,''];
        }
        foreach($rows as $row){
            if(empty($row['s_cate']) || 
               empty($row['s_customer_name']) || 
               empty($row['s_arri_brand']) || 
               empty($row['s_arri_number'])){
                return [300,$row['s_plmseq']];
            }
        }
        $sendIds = [];
        foreach($rows as $row){
            $key = $row['s_id'];
            $this->history->addRow('sample',$key,$action,$remark,true);
            if($value=='0'){
                //重复sendMailToProlineChecker发送了邮件 $this->sendMessageCustom($row, $row['s_plmseq']. " ".$action,$remark);
            }
            if($value=='1'){
                $this->db->update($this->table, ['s_check_sales' => 1, 's_check_sales_reason' => ''], [$this->key => $key]);
                $this->db->update($this->table, ['s_state_sub' => 1], [$this->key => $key, 's_state_sub[<]' => 1]);
                $this->sampleDate->setValue($key, 'sdate_check_sales_date', date('Y-m-d')); # 目录组 通过日期
                $sendIds[] = $row['s_id'];
            }else{
                $this->db->update($this->table,['s_check_sales'=>0,'s_has_comein'=>0,'s_check_sales_reason'=>$remark],[$this->key=>$key]);
                $this->sampleDate->setValue($key, 'sdate_check_sales_date', null); # 目录组 通过日期
                $this->sendMailToProlineChecker($row['s_id'], '目录组驳回');
            }
        }
        $this->db->end();
        if ($sendIds) {
            $this->sendMailToProlineChecker($sendIds, '技术部通过');
        }
        return [200,''];
	}
	/**
	 * 技术部审核
	 * @param string|int|array $ids  id集数组或字符串，字符串用 , 号分隔
	 * @param int $value 0或者1
	 * @return bool
	 */
	function checkTech($ids,$value,$data,$isAdmin){
        if(!is_array($ids)){
            $ids = explode(',',$ids);
        }
        $where[$this->key] = $ids;
        if($value=='1'){
            $where['s_check_sales'] = 1;
            $where['s_check_tech'] = 0;
            $action = '技术部通过';
        }else{
            $where['s_check_sales'] = 1;
            $where['s_check_tech'] = 0; //已通过的，不允许驳回
            $where['s_stop'] = 0;
            $action = '技术部驳回';
        }
        $result = 200;
		$rows = $this->db->select($this->table,'*',$where);
        if(empty($rows)) $result = 404;
        $reason = '';
        if(isset($data['reason'])){
            $reason =$data['reason'];
            unset($data['reason']);
        }
        $guid = guid();
        $sendIds = [];
        foreach($rows as $k=>$row){
            $hasBorrow = $this->db->has('sample_borrow', ['sbo_sid' => $row['s_id']]); // 是否有借样
            if ($hasBorrow && $value == '0') {
                $result = 301;
            } else if(!empty($row['s_cate']) && !empty(trim($row['s_customer_name'])) && !empty(trim($row['s_arri_brand'])) && !empty(formatNum($row['s_arri_number']))){
                if($value=='1'){
                    $back = [
                        'code'=> '',
                        'msg'=> ''
                    ];

                    $this->db->begin();
                    $saveData = $data;
                    $saveData['s_check_tech'] = 1;
                    $saveData['s_check_tech_reason'] = '';
                    $saveData['s_state_sub'] = 1;
                    $this->history->addRow('sample', $row['s_id'], $action, $reason, true);
                    $this->db->update($this->table, $saveData, [$this->key => $row[$this->key], 's_check_tech' => 0]);
                    $this->sampleDate->setValue($row[$this->key], 'sdate_check_tech_date', getNowDate()); # 技术部通过日期
                    $this->db->end();

					if($isAdmin){
					    $back['code'] = 1;
					}else{
					    $back = $this->toplm($row,$data,$guid);
					}
					if($back['code']==1){
                        /*
						$this->db->begin();
						$this->history->addRow('sample',$row['s_id'],$action,$reason,true);
						$saveData = $data;
						$saveData['s_check_tech'] = 1;
						$saveData['s_check_tech_reason'] = '';
						$saveData['s_state_sub'] = 1;
						$this->db->update($this->table,$saveData,[$this->key=>$row[$this->key],'s_check_tech'=>0]);
                        $this->sampleDate->setValue($row[$this->key], 'sdate_check_tech_date', getNowDate()); # 技术部通过日期
						$this->db->end();
                        */
                        $sendIds[] = $row['s_id'];
                    }else{
                        $backSaveData['s_check_tech'] = 0;
                        $backSaveData['s_state_sub'] = 0;
                        $this->db->update($this->table, $backSaveData, [$this->key => $row[$this->key]]);
						$msg = $back['msg'];
                        $this->history->addRow('sample', $row['s_id'], '调用PLM', $msg, true);
						if(empty($msg)) $msg = "PLM 提供的接口无法正常访问, 请联系 PLM 负责人.<br>调用接口 code 未返回1 且 msg 没有任何值";
						errorLog($msg,'API_PLM');
						exitJson(lg('[调用 PLM]')."<br>\r\n".$msg);
					}
                }else{
			        $this->db->begin();
	                $this->history->addRow('sample',$row['s_id'],$action,$reason,true);
                    if($value=='0'){
                        //重复sendMailToProlineChecker发送了邮件 $this->sendMessageCustom($row, $row['s_plmseq']. " ".$action,$reason);
                    }
                    $this->db->update($this->table,['s_check_sales'=>0,'s_state_sub'=>0,'s_check_tech'=>0,'s_check_tech_reason'=>substr($reason,0,99)],[$this->key=>$row[$this->key]]);
                    $this->sampleDate->setValue($row[$this->key], 'sdate_check_tech_date', null); # 技术部通过日期
                    $this->sendMailToProlineChecker($row['s_id'], '技术部驳回');
                    $this->db->end();
                }
            }else{
                $result = 300;
            }
        }
        if ($sendIds) {
            $this->sendMailToProlineChecker($sendIds, '技术部通过');
        }
        return $result;
	}

    /**
     * 写入 plm
     */
	public function toplm($row,$plmselect,$guid)
    {
        $cateRow = $this->cate->getRowByKey($row['s_cate']);
        $CPMC = $cateRow['cn_name'];

		$collRow = $this->collocation->getNode($plmselect['s_plmcate']);
		$PLMCATE = $collRow['cn_name'];

		$collRow = $this->collocation->getNode($plmselect['s_plmuser']);
		$CREATOR = $collRow['cn_name'];

		$collRow = $this->collocation->getNode($plmselect['s_upunit']); 
		$QF = $collRow['cn_name'];

		$collRow = $this->customer->getRowByKey($row['s_customer_name']);
		$CUSNAME = $collRow['ct_name'];
		$ASUSER06 = $collRow['ct_code'];

		$collRow = $this->factory->getRowByKey($row['s_arri_brand']);
		$ASUSER03 = $collRow['pf_name'];
		if($ASUSER03=='OUTNUM'){
		    $ASUSER03 = 'GSP';
		}

		$collRow = $this->collocation->getNode($row['s_sign_type']);
		$ASUSER04 = $collRow['cn_name'];

		$collRow = $this->collocation->getNode($row['s_check_type']);
		$HDLX = $collRow['cn_name'];

		//图片
		$PHOTOS = '';
		$PHOTOSINFO = '';
		if($row['s_photos']!=''){
			$arr = [];
			$fileids = [];
			$s_photos = json_decode($row['s_photos'],true);
			if(!empty($s_photos)){
				foreach($s_photos as $photo){
					$fileids[] = $photo['fileid'];
					$arr[] = 'http://'.\mvc::$cfg['localServer'].'/'.ltrim(\mvc::$cfg['path']['files'],'/').'/'.str_replace(' ','%20',$photo['filename']);
				}
			}
			$PHOTOS = implode(',',$arr);
			if($fileids){
				//按顺序返回原始文件名
				$frows = $this->db->select('files','*',['fileid'=>$fileids]);
				$arr=[];
				foreach($fileids as $fileid){
					foreach($frows as $frow){
						if($frow['fileid']==$fileid){
							$arr[] = str_replace('_','^',$frow['fileremark']);
						}
					}
				}
				$PHOTOSINFO = implode(',',$arr);
			}
		}
		//OE
		//$OEHM = $this->db->get('sample_numidx','sn_number',['sn_s_id'=>$row['s_id'],'sn_pro_factory'=>1]);
		//$OEHM = formatNum($OEHM);
		$OEHM_rows = $this->db->select('sample_numidx',['sn_number'],['sn_s_id'=>$row['s_id'],'sn_pro_factory'=>1]);
		$OEHM = '';
		foreach ($OEHM_rows as $OEHM_item){
		    if($OEHM!='') $OEHM.='/';
    		$OEHM .= trim($OEHM_item['sn_number']);//formatNum($OEHM);
            $len = strlen($OEHM);
            if ($len >= (1024 - 50)) {
                break;
            }
		}
		//大车型
		$ASUSER01 = $this->db->get('sample_model_link','sml_mm_id',['sml_s_id'=>$row['s_id']]);
		if(!empty($ASUSER01)){
		    $modelRow = makeOne(\model\carmodel::class)->getModelInfo($ASUSER01);
			$ASUSER01 = sprintf("%s %s %s",$modelRow['mk_name'],$modelRow['ms_name'],$modelRow['mm_name'],$modelRow['mm_disp']);
		}else{
			$ASUSER01 = $this->db->get('m_make'
				,['[>]sample_model_txt' => ['mk_id'=>'sm_make']]
				,'m_make.name'
				,['smt_s_id'=>$row['s_id']]
			);
		}
		$au_name = $this->db->get('gsp_adm_user','au_name',['au_id'=>$row['s_apply_user']]);
        $s_proof_catagroup = $row['s_proof_catagroup'] ?: ''; //目录组校对意见s_refgsp_no2
        if ($row['s_refgsp_no2']) {
            $s_proof_catagroup .= ' 配对型号: ' . $row['s_refgsp_no2']; //合并 配对型号
        }
        $put = [
			"CREATOR"=>$CREATOR, //plm帐号
			"NO"=> trim($row['s_arri_number']),
			"CUSNAME"=> trim($CUSNAME),
			"ASUSER03"=> $ASUSER03 ?: '',//"样品品牌",
			"ASUSER04"=> $ASUSER04 ?: '',//"来样方式",
			"ASUSER01"=> $ASUSER01 ?: '',//"适用车型",
			"ASUSER06"=> $ASUSER06,//"客户代码",
			"ASUSER11"=> $row['s_custrequ'] ?: '',//"客户开发要求",
			"AREA"=> $row['s_apply_area'] ?: '',//"客户区域",
			//"MONITOR"=> $row['s_apply_user'] ?: '',//"业务员",
			"MONITOR"=> $au_name ?: $row['s_apply_user'],//"业务员",
			"ASUSER07"=> ($row['s_arrival_time']) ?: $row['s_sign_time'],//"样品接收日期",
			"SCBJDYJ"=> $s_proof_catagroup ?: '',//"目录组校对意见",
			"CPMC"=> $CPMC ?: '',//"产品名称",
			"OEHM"=> $OEHM ?: '',//"OE号码",
			"CKGSP"=> $s_proof_catagroup ?: '',//目录组校对意见 对接PLM的 "参考GSP型号",
			"LRTIME"=>$row['create_time'] ?: '',//"录入时间",
			"SCBBZ"=>$row['s_apply_remark'] ?: '',//"市场部备注",
			"ZT"=> $row['s_oddno'] ?: '',//"项目号",
			"QF"=> $QF ?: '',//上传单位
			"ASUSER02"=> $row['s_plmseq'] ?: '',//"流水编号",
			"HDLX"=> $HDLX ?: '',//"核对类型",
			"PCH"=> $guid,//$row['s_oddno'] ?: '',//"单号",
			"NAME"=> $PLMCATE ?: '',//"PLM类别",
			"PHOTOS"=> $PHOTOS ?: '',
			"PHOTOSINFO"=> $PHOTOSINFO ?: ''
		];
		$io = new \model\io();
		$result = $io->plm('sipmweb/ProductServlet',$put);
		$result['params'] = $put;
		return $result;
	}

    /**
     * 来自 plm 状态与样品回复
     */
	public function fromplm($params)
    {
        //$this->db->begin();
        $audit = new audit();
		$state = true;
		$msg = '';
		$customer_name = substr($params['customer_name'],0,255);
		$number = substr(formatNum($params['number']),0,255);
		$brand = substr($params['aSUSER03'],0,255);
        $plmseq = !empty($params['extfields']['ASUSER02'])? substr(trim($params['extfields']['ASUSER02']),0,255): "";
		if($number=='') $number = substr(formatNum($params['SUSER03']),0,255);
		
		$state_main = substr(safeString($params['state_main']),0,255);
		$state_sub = substr(safeString($params['state_sub']),0,255);
		$innum = substr(trim($params['innum']),0,255); //此处号码不去格式
		$update = $params['update'];
		$extfields = [];
		$insertData = [];
		if(isset($params['extfields'])){
    		foreach($params['extfields'] as $k=>$v){
    		    $extfields[strtoupper($k)] = substr(trim($v),0,255);
    		}
		}else{
		    $params['extfields'] = '';
		}
		if($innum!=''){
	        $extfields['SUSER03'] = $innum;
		}else{
		    $innum = empty($extfields['SUSER03']) ? "" : $extfields['SUSER03'];
		}
		
		$s_state_sub = array_search($state_sub,$this->plmstate);
		
		 //已校对不开发,已校对待开发
		if(($s_state_sub==11 || $s_state_sub==50) && $innum==''){
			$state = false; $msg = $state_sub . ' 状态下, GSP内部编码不能为空';
		}
		
		if( ($s_state_sub==51) && $extfields['SUSER06']==''){ //开发中
			$state = false; $msg = $state_sub . ' [开发完成时间]不能为空';
		}
		if(($plmseq == '') && ($customer_name=='' || $number=='' || $brand=='')){
			$state = false; $msg = '样品流水号 或者 (客户名称+到样品牌+到样号码)不能为空';
		}
		if($state && $customer_name){
			$customer_id = $this->customer->eqname($customer_name);
			if(empty($customer_id)){
				$state = false; $msg = '客户名称不存在';
			}
		}
		if($state){
            if ($plmseq) {
                $row = $this->db->get($this->table, '*', ['s_plmseq' => $plmseq]);
                if (empty($row)) {
                    $state = false;
                    $msg = '样品流水号不存在: ' . $plmseq;
                    $seq = '';
                } else {
                    $seq = $row['s_plmseq'];
                }
            } elseif ($brand && $number) {
                $s_arri_brand_ids = $this->db->select('pro_factory', 'pf_id', ['OR' => [
                    'pf_name' => $brand,
                    'cn_name' => $brand,
                    'en_name' => $brand,
                ]]);
                $row = $this->db->get($this->table, '*', [
                    's_customer_name' => $customer_id,
                    's_arri_brand' => $s_arri_brand_ids,
                    'OR' => [
                        's_formatnum' => $number,
                        's_arri_number' => $params['number']
                    ],
                    'ORDER' => ['s_id' => 'DESC']
                ]);
                if (empty($row)) {
                    $state = false;
                    $msg = '客户名称&到样品牌&到样号码不存在';
                    $seq = '';
                } else {
                    $seq = $row['s_plmseq'];
                }
            }
		}
		if($s_state_sub===false){
			$state = false; $msg = '未定义的子状态名,所有状态为: ['.implode(',',$this->plmstate).']';
		}else{
		    if(in_array($s_state_sub,[10,12])){
    		    $state_main = 'Y0';
		    }else if(in_array($s_state_sub,[11])){
    		    $state_main = 'Y1';
		    }else if(in_array($s_state_sub,[200])){
    		    $state_main = 'Y1';
		    }else{
    		    $state_main = 'YJ';
		    }
		}
		if($update!='状态' && $update!='全量'){
			$state = false; $msg = 'update值只能是 "状态" 或者 "全量"';
		}
			
		if($state && $innum!='' && !empty($row)){
		    $s_innum = $this->getValue($row['s_id'],'s_innum');
		    if($s_innum==''){
			    $this->setValue($row['s_id'],'s_innum',$innum);
		    }else if($innum!=$s_innum){
				$state = false; $msg = "[{$row['s_plmseq']}] GSP型号(内部编码,技术部编码)，与前次不符合, 前次[{$s_innum}] 现在[{$innum}]";
		    }
		}
		
		if($state && !empty($row)){
			foreach($extfields as $key=>$value){
				$extfields[$key] = substr(safeString($value),0,255);
			}
            $techRow = $this->db->get('sample_tech', '*', ['st_s_id' => $row['s_id']]);
			//$hasTech = $this->db->has('sample_tech',['st_s_id'=>$row['s_id']]);
            $hasTech = !empty($techRow);
			if($state && ($update=='状态' || $hasTech)){
			    //如果是只更新“状态”或者 有技术部回复
			    $updateData = [
			        'state_main'=>$state_main,
			        'state_sub'=>$state_sub,
			        'update_time'=> getNowTime()
			    ];
			    if($extfields['SMEMO']!='' && $row['s_stop'] != 1){
			        $updateData['SMEMO'] = $extfields['SMEMO'];
			    }
                if($row['s_state_sub']!=200 && $row['s_stop']!=1){
                    if($extfields['WQLDM']!=''){
                        $updateData['WQLDM'] = $extfields['WQLDM'];
                    }
                    if($extfields['NQLDM']!=''){
                        $updateData['NQLDM'] = $extfields['NQLDM'];
                    }
                    if($extfields['WQLXLDM']!=''){
                        $updateData['WQLXLDM'] = $extfields['WQLXLDM'];
                    }
                    if($extfields['NQLXLDM']!=''){
                        $updateData['NQLXLDM'] = $extfields['NQLXLDM'];
                    }
                }
			    if($s_state_sub==51){
			        $updateData['SUSER06'] = $extfields['SUSER06'];
			    }
				$this->db->update(
					'sample_tech',
					$updateData,
					['st_s_id' => $row['s_id']]
				);
                //if ($techRow['state_main'] != $state_main && $techRow['state_sub'] != $state_sub) {
                    $audit->add('update', 'sample_tech', $row['s_id'], $updateData, 'api', 'plm/sampleStateChange');
                //}
			}else if($state){ //$update=='全量' 或者 没有技术部回复
    			$insertData = array_merge($extfields,[
    				'st_s_id'=>$row['s_id'],
    				'state_main'=>$state_main,
    				'state_sub'=>$state_sub,
    				'innum'=>$innum,
    				'create_time'=> getNowTime(),
    				'update_time'=> getNowTime()
    			]);
                if ($this->db->insert('sample_tech', $insertData) === false) {
                    $state = false;
                    $msg = $this->db->last();
                }
                $audit->add('insert', 'sample_tech', $row['s_id'], $insertData, 'api', 'plm/sampleStateChange');
				if(in_array($state_main,['YJ','Y0','Y1'])){
					$this->setValue($row['s_id'],'s_state_main',$state_main);
				}
			}
			if($state){
			    //再次查是否有技术部回复
    			$hasTech = $this->db->has('sample_tech',['st_s_id'=>$row['s_id']]);
    			//取消开发,已校对不开发,取消核对,开发完成
        		if(($s_state_sub==10 || $s_state_sub==11 || $s_state_sub==12 || $s_state_sub==200) && !$hasTech){
        			$state = false; $msg = $state_sub . ' 状态下, 缺少技术内容回复';
        		}
				if($state && $row['s_stop'] == 0){
					$r = $this->setValue($row['s_id'],'s_state_sub',$s_state_sub);
					if($r==-5){
						//开发完成状态，再次检查内部编码
						$state = false; $msg = '缺少GSP型号(内部编码,技术部编码)';
					}
                }
			}
		}
		if($state==false)
		{
			$taskArr = [
				'at_api'=>'plm',
				'at_api_fun'=>'plm/fromplm',
				'at_status'=>1,
				'at_count'=>1,
				'at_unikey'=>'',
				'at_post'=>json_encode($params, JSON_UNESCAPED_UNICODE),
				'at_result'=>json_encode(['state'=>$state,'msg'=>$msg, 'seq'=>$seq], JSON_UNESCAPED_UNICODE),
				'at_update_time'=>getNowTime(),
				'at_create_time'=>getNowTime()
			];
			$this->db->insert('api_task', $taskArr);
    		errorLog([$seq,$msg,$params],'FROMPLM');
		}
		if(true)
		{
			$taskArr = [
				'at_api'=>'plm',
				'at_api_fun'=>'plm/fromplm',
				'at_status'=> $state ? 1 : -1,
				'at_count'=>1,
				'at_unikey'=>'',
				'at_post'=>json_encode($params, JSON_UNESCAPED_UNICODE),
				'at_result'=>json_encode(['state'=>$state,'msg'=>$msg, 'seq'=>$seq], JSON_UNESCAPED_UNICODE),
				'at_update_time'=>getNowTime(),
				'at_create_time'=>getNowTime()
			];
			//$this->db->insert('api_fromplm_task', $taskArr);
    		errorLog([$seq,$msg,$params],'FROMPLM');
		}
        //$this->db->end();
		return ['state'=>$state,'msg'=>$msg];
	}
    /**
     * 访问api
     * @param $id
     * @return bool
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
	
	public function api($id)
    {
        //TODO 待完成
        try {
            $url =  $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['HTTP_HOST'].''.HOST.'/interIO/test/index.php';
            $data = $this->db->get($this->table,'*',[$this->key => $id]);
            $trow = $this->customer->getRowByKey($data['s_customer_name']);
            $facRow = $this->factory->getRowByKey($data['s_arri_brand']);
            $cate = $this->getCateText($data['s_cate']);
            $post = [
                's_arri_number' => $data['s_arri_number'],
                's_customer_name' => $trow['ct_name'],
                's_arri_brand' => $facRow['pf_name'],
                's_type' => $data['s_type'],
                's_model_src' => $this->getCollocationText($data['s_model_src']),
                's_customer_code' => $trow['ct_code'],
                's_custrequ' => $data['s_custrequ'],
                's_apply_area' => $data['s_apply_area'],
                's_apply_user' => $data['s_apply_user'],
                's_apply_date' => $data['s_apply_date'],
                's_proof_catagroup' => $data['s_proof_catagroup'],
                's_cate' => $cate['s_cate'],
                's_cate_parent' => $cate['s_cate_parent'],
                's_refgsp_no' => $data['s_refgsp_no'],
                'sc_sign_time' => $data['sc_sign_time'],
                's_remark' => $data['s_remark'],
                's_oddno' => $data['s_oddno'],
                's_photos' => $data['s_photos'],
                'plmuser' => $this->getCollocationText($data['s_plmuser']),
                's_upunit' => $this->getCollocationText($data['s_upunit']),
                's_plmseq' => $data['s_plmseq'],
                'plmcate' => $this->getCollocationText($data['s_plmcate']),
                's_check_type' => $this->getCollocationText($data['s_check_type']),
            ];

            $client = new Client(['timeout' => 10]);


            $header = [
                'Accept:application/json, text/javascript, */*; q=0.01',
                'Accept-Encoding:gzip, deflate',
                'Accept-Language:zh-CN',
                'Content-Type:application/json',
                'Expect:'
            ];

            $response = $client->request('POST',$url,['headers' => $header,'form_params' => $post]);

            $data = $response->getBody()->getContents();

            if(\mvc::isJson($data)){
                $data = json_decode($data,true);
                if($data['result'] == 'success'){

                    $result = $this->db->update($this->table,['s_is_send_plm' => 1],[$this->key => $id]);

                    if($result !== false){
                        return true;
                    }

                    return false;
                }
                return false;
            }
            return false;
        }catch (Exception $e) {
            return false;
        }
		return false;
    }

	/**
	 * 样品进程列表
	 * @return array
	 */
    public function getProcessList($rules, $where='',$page=0,$pagesize=0,$sidx='',$sord='asc',$orderby=''){
        $fields = '*';
        $where = $this->filter2medoo($where,function(&$field,&$op,&$data){
            switch($field){
                case 's_cate':
                    $op = 'eq';
                    $data = $this->cate->like($data);
                    if(empty($data)) $data = [0];
                    break;
                case 's_sales_area':
                    $op = 'ld'; //find_in_set
                    $data = $this->collocation->like($data);
                    if(empty($data)) $data = [0];
                    break;
                case 's_apply_type':
                case 's_customer_name':
                case 's_model_src':
                case 's_model_vio_src':
                case 's_channel':
                case 's_purc_state':
                case 's_supp_currency':
                    $op = 'eq';
                    $data = $this->collocation->like($data);
                    if(empty($data)) $data = [0];
                    break;
                case 's_photos':
                    if($data=='1'){
                        $op = 'nn';
                        $data = '';
                    }else if($data=='0'){
                        $op = 'eq';
                        $data = '';
                    }
                    break;
                case 'numidx':
                    if($data=='1'){
                        $op = 'sql';
                        $data = " exists (select 1 from sample_numidx where sn_s_id = s_id limit 1)";
                    }else{
                        $op = 'sql';
                        $data = " not exists (select 1 from sample_numidx where sn_s_id = s_id limit 1)";
                    }
                    break;
            }
        });
        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
        //dd($where);
		if($page>0 && $pagesize>0){
			$pages = $this->paging($this->table,$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}

		$rows = $this->db->select($this->table,$fields,$where);
        //dump($where,$this->db->last(),$rows);
        if(!empty($rows)) foreach($rows as $k=>&$row){
            $row = $this->getRowInfo($row);
            $s_check1_opuser = '';
            $s_check1_remark = '';
            $s_check1_date = '';
            $hisRow = $this->history->getOne('sample','初审',$row['s_id']);
            if(empty($hisRow)){
                $hisRow = $this->history->getOne('sample','初审不通过',$row['s_id']);
                if(!empty($hisRow)){
                    $s_check1_opuser = $hisRow['opuser'];
                    $s_check1_remark = 'NO: '.$hisRow['h_remark'];
                    $s_check1_date = date(\mvc::$cfg['datetimeformat'],strtotime($hisRow['opuser']));
                }
            }else{
                $s_check1_opuser = $hisRow['opuser'];
                $s_check1_remark = 'YES';
                $s_check1_date = date(\mvc::$cfg['dateformat'],strtotime($hisRow['create_time']));
            }
            $s_check2_opuser = '';
            $s_check2_remark = '';
            $s_check2_date = '';
            $hisRow = $this->history->getOne('sample','复审',$row['s_id']);
            if(empty($hisRow)){
                $hisRow = $this->history->getOne('sample','复审不通过',$row['s_id']);
                if(!empty($hisRow)){
                    $s_check2_opuser = $hisRow['opuser'];
                    $s_check2_remark = 'NO: '.$hisRow['h_remark'];
                    $s_check2_date = date(\mvc::$cfg['dateformat'],strtotime($hisRow['create_time']));
                }
            }else{
                $s_check2_opuser = $hisRow['opuser'];
                $s_check2_remark = 'YES';
                $s_check2_date = date(\mvc::$cfg['dateformat'],strtotime($hisRow['create_time']));
            }
            $s_check3_opuser = '';
            $s_check3_remark = '';
            $s_check3_date = '';
            $hisRow = $this->history->getOne('sample','终审',$row['s_id']);
            if(empty($hisRow)){
                $hisRow = $this->history->getOne('sample','终审不通过',$row['s_id']);
                if(!empty($hisRow)){
                    $s_check3_opuser = $hisRow['opuser'];
                    $s_check3_remark = 'NO: '.$hisRow['h_remark'];
                    $s_check3_date = date(\mvc::$cfg['dateformat'],strtotime($hisRow['create_time']));
                }
            }else{
                $s_check3_opuser = $hisRow['opuser'];
                $s_check3_remark = 'YES';
                $s_check3_date = date(\mvc::$cfg['dateformat'],strtotime($hisRow['create_time']));
            }
            $row['s_check1_opuser'] = $s_check1_opuser;
            $row['s_check1_remark'] = $s_check1_remark;
            $row['s_check1_date']   = $s_check1_date;
            $row['s_check2_opuser'] = $s_check2_opuser;
            $row['s_check2_remark'] = $s_check2_remark;
            $row['s_check2_date']   = $s_check1_date;
            $row['s_check3_opuser'] = $s_check3_opuser;
            $row['s_check3_remark'] = $s_check3_remark;
            $row['s_check3_date']   = $s_check1_date;
        }
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $rows
		];
		return $data;
	}

    /**
     * TODO 待完善
     * @param $data
     * @return false|\PDOStatement|string
     */
	public function setSampleStatus($data)
    {
        /*
        $ctId = $this->db->get('customer','ct_id',['ct_name' => $data['customer_name']]);
        $sId = $this->db->get($this->table,'s_id',['s_arri_number' => $data['sample_no'],'s_customer_name' => $ctId]);
        if($sId <= 0){
            return '找不到该样品';
        }
        $this->db->update($this->table,['s_state_main' => $data['main_state'],'s_state_sub' => $data['sub_state']],['s_id' => $sId]);
        unset($data['s_state_main'],$data['s_state_sub']);
        if($this->db->has('tech',['s_id' => $sId])){
            return $this->db->update('tech',$data,['s_id' => $sId]);
        }else{
            return $this->db->insert('tech',$data);
        }
        */
    }


	/**
	  * 通过内部编码将样品设置为编码状态
	  * @param  $s_id  int  [必填] 样品ID
	  * @param  $innum  string  [必填] 内部编码
	  * @author soul
	  */
	public function changSampleByInnum($s_id, $innum, $outnum='', $isSendMail = false)
	{
	    set_time_limit(120);
	    
		$samArr = $this->db->get('sample', '*', ['s_id'=>$s_id]);
		if(!empty($samArr) && !empty($innum))
		{
            $where = [];
            $where['OR']['pc_innum'] = $innum;
            if ($outnum) {
                $where['OR']['pc_outnum'] = $outnum;
            }
            $row = $this->db->get('p_code', '*', $where);
			if(!empty($row))
			{
				$row = $this->db->get('p_code', '*', ['pc_innum'=>$innum, 'ck3'=>1]);
				if(!empty($row))
				{
					$set = [
						's_outnum'=>$row['pc_outnum'],
						's_p_id'=>$row['pc_p_id']
					];
					$this->db->update('sample', $set, ['s_id' => $s_id]);
				}
				return ['code'=>1,'data'=>'内部编码已经存在'];
			}
			//$this->db->Begin();
			$set = [
				's_stop'=>1,
				's_innum'=>$innum,
				'update_time'=>$datetime
			];
			$this->db->update('sample', $set, ['s_id' => $s_id]);

			//编码库
			$opuser = getOpuser();
			$datetime = getNowTime();
			$add = [
				'pc_cate'=>$samArr['s_cate'],
				'pc_innum'=>$innum,
				'pc_state_main'=>$samArr['s_state_main'],
				'pc_state_sub'=>$samArr['s_state_sub'],
				'pc_rule_1'=>$samArr['s_procode_ext'],
				'pc_rule_a'=>$samArr['s_procode_a'],
				'pc_rule_b'=>$samArr['s_procode_b'],
				'pc_rule_c'=>$samArr['s_procode_c'],
				'pc_pf_id'=>$samArr['s_arri_brand'],
				'pc_fno'=>$samArr['s_arri_number'],
				'pc_s_id'=>$samArr['s_id'],
				'pc_samseq'=>$samArr['s_plmseq'],
				'opuser'=>$opuser,
				'update_time'=>$datetime
			];
			$pcArr = $this->db->get('p_code', '*', ['pc_s_id'=>$s_id]);
			if(!empty($pcArr))
			{//只变更待审状态的
				$this->db->update('p_code', $add, ['ck3'=>0, 'pc_id' =>$pcArr['pc_id']]);
				$pc_id = $pcArr['pc_id'];
			}
			else
			{
				$add['create_time'] = $datetime;
				$this->db->insert('p_code',$add);
				$pc_id = $this->db->id();
			}
            /*
			$json = ioGetJson(\mvc::$cfg['plmReadParamUrl'].$innum,null,null,10);
			if(empty($json)){
    			$json = ioGetJson(\mvc::$cfg['plmReadParamUrl'].$innum,null,null,10);
			}
			if($json){
			    $this->db->replace('p_code_param',['pcp_pc_id' =>$pc_id,'pcp_param'=>json_encode($json)],['pcp_pc_id']);
			}*/
            $this->db->replace('p_code_param', ['pcp_pc_id' => $pc_id, 'pcp_param' => $pcArr], ['pcp_pc_id']);
			$pro = new \model\pro\pro();
			$pro->autoBuildCode([$pc_id],true, $isSendMail);
			//$this->db->End();
			return ['code'=>1,'data'=>''];
		}
		return ['code'=>0,'msg'=>'样品不存在'];
	}

	/**
	  * @method 变更样品的产品编码
	  * @param  id  int  [必填] 样品ID
	  * @author soul
	  */
	public function saveSampleProCode($s_id, $autonums)
	{
		$samArr = $this->db->get('sample', '*', ['s_id'=>$s_id]);
		if(empty($samArr)) exitJson('样品不存在');
		$opuser = getOpuser();
		$datetime = getNowTime();
		$set = [
			's_auto_nums'=>json_encode($autonums),
			'update_time'=>$datetime
		];
		$this->db->update('sample', $set, ['s_id' => $s_id]);
		return [];
	}


	/**
	  * @method 重新生成样品的产品编码
	  * @param  s_id  int  [必填] 样品ID
	  * @param  auto  int  [必填] 0|1
	  * @param  pcr_id  int  [选填] auto = 0 时必填
	  * @author soul
	  */
	public function resetSampleProCode($s_id, $auto, $pcr_id = 0)
	{
		$samArr = $this->db->get('sample', '*', ['s_id'=>$s_id]);
		if(empty($samArr)) exitJson('样品不存在');
		if(empty($samArr['s_innum'])) exitJson('内部编码不存在');
		$codeRule = new \model\pro\codeRule();
		if($auto)
		{
			$codeArr = $codeRule->createCode($samArr['s_plmseq'], $samArr['s_innum']);
		}
		else
		{
			$codeArr = $codeRule->createCode($samArr['s_plmseq'], $samArr['s_innum'], $pcr_id);
		}
		if($codeArr['code']==1)
		{
			$opuser = getOpuser();
			$datetime = getNowTime();
			$set = [
				's_stop'=>1,
				's_auto_nums'=>json_encode($codeArr['data']),
				'update_time'=>$datetime
			];
			$this->db->update('sample', $set, ['s_id' => $s_id]);
			return $codeArr;
		}else{
			exitJson($codeArr['msg']);
		}
	}

	/**
	  * @method 样品回复
	  * @param  s_id  int  [必填] 样品ID
	  */
	public function getTech($s_id){
		return $this->db->get('sample_tech', '*', ['st_s_id' => $s_id]);
	}
	
	/**
	 * 通过指定条件返回行记录集,带技术部回复
	 * @param array $where //条件数组
	 * @return array
	 */
	function getSampleAndTechRowsByWhere($where,$fields=null,$group=null){
		$join['[>]sample_tech(t)'] = ['s.s_id'=>'st_s_id'];
		return $this->db->select($this->table.'(s)',$join,['s.*',
		't.SUSER06','t.SUSER01','t.HTIME','t.SUSER03','t.ASUSER08','t.WXTX','t.ASUSER12','t.ASUSER09','t.PROTYPE','t.ASUSER13','t.SMEMO','t.JDR','t.WQLDM','t.NQLDM','t.WQLXLDM','t.NQLXLDM','t.DESCRIBE','t.KFBZ'
		],$where);
	}

	/**
	 * 通过指定条件返回多少条记录,带技术部回复
	 * @param array $where //条件数组
	 * @return int
	 */
	function getSampleAndTechCountByWhere($where,$group=null){
		if($group!=null) $where['GROUP'] = $group;
		$join['[>]sample_tech(t)'] = ['s.s_id'=>'st_s_id'];
		return $this->db->count($this->table.'(s)',$where);
	}
	
	/**
	 * 修改技术部回复
	 */
	function changeTech($sid,$field,$value){
	    $result= [true,''];
	    $this->db->Begin();
	    if($field=='SUSER03'){
	        /*
    	    if($this->db->has('p_code',['pc_s_id'=>$sid])){
    	        $result= [false,lg('失败: 样品已入编码库')];
    	    }else{
        	    $this->db->update('sample_tech',['innum'=>$value,'SUSER03'=>$value],['st_s_id'=>$sid]);
    	        if($pcRow = $this->db->get('p_code','*',['pc_innum'=>$value])){
   	                $this->db->update('sample',['s_p_id'=>$pcRow['pc_id'],'s_outnum'=>$pcRow['pc_outnum'],'s_innum'=>$pcRow['pc_innum']],['s_id'=>$sid]);
    	        }
    	    }*/
    	    $this->db->update('sample_tech',['innum'=>$value,'SUSER03'=>$value],['st_s_id'=>$sid]);
	        if($pcRow = $this->db->get('p_code','*',['pc_innum'=>$value])){
                   $this->db->update('sample',['s_p_id'=>$pcRow['pc_id'],'s_outnum'=>$pcRow['pc_outnum'],'s_innum'=>$pcRow['pc_innum'],'s_state_main'=>$pcRow['pc_state_main']],['s_id'=>$sid]);
	        }else{
                   $this->db->update('sample',['s_p_id'=>0,'s_outnum'=>'','s_innum'=>$value],['s_id'=>$sid]);
	        }
	    }else{
	        $this->db->update('sample_tech',[$field=>$value],['st_s_id'=>$sid]);
	    }
	    $this->db->End();
	    return $result;
	}

    /**
     * 刷新外部编码
     * @return 
     */
    function refreshOutnum()
    {
        set_time_limit(120);
        $sql = "UPDATE sample
        JOIN sample_tech ON st_s_id = s_id
        SET s_innum = TRIM(SUSER03)
        WHERE s_innum='' AND SUSER03<>'' AND SUSER03 COLLATE utf8mb4_bin REGEXP '[\u4e00-\u9fa5]' AND s_stop=1
        ";
        $this->db->query($sql);

        $sql = "UPDATE sample  
        JOIN p_code ON pc_innum = s_innum AND p_code.ck3=1
        SET s_outnum = pc_outnum
        WHERE s_innum<>'' and s_stop=1";
        return $this->db->query($sql);
    }

    /**
     * 样品去格式编码刷新完成
     * @return 
     */
    function refreshFormatNum()
    {
        set_time_limit(3600);
        $rows = $this->db->select('sample', ['s_id', 's_apply_number', 's_arri_number']);
        foreach ($rows as $row) {
            $apply_formatnum = formatNum($row['s_apply_number']);
            if ($apply_formatnum == '') {
                $apply_formatnum = $row['s_apply_number'];
            }
            $arri_formatnum = formatNum($row['s_arri_number']);
            if ($arri_formatnum == '') {
                $arri_formatnum = $row['s_arri_number'];
            }
            $this->db->update('sample', ['s_apply_number_format' => $apply_formatnum, 's_formatnum' => $arri_formatnum], ['s_id' => $row['s_id']]);
        }
    }

    /**
     * 样品去格式编码刷新完成
     * @return 
     */
    function refreshPcode()
    {
        set_time_limit(3600);
        $pro = make(pro::class);
        $rows = $this->db->select('sample', ['s_id', 's_innum', 's_outnum'], ['s_state_sub' => '200', 's_p_id[<]' => '1']);
        foreach ($rows as $row) {
            $this->db->begin();
            $res = $this->changSampleByInnum($row['s_id'], $row['s_innum'], $row['s_outnum'], true);
            $pro->setProductBySampleOnlyToPro($row['s_innum']);
            $this->db->end();
        }
    }

	/**
	 * 写入样品关注
	 */
	public function addFollowRow($ids)
	{
        $uid = getOpuser();
        if($uid && $ids){
            foreach($ids as $s_id){
                $this->db->replace('sample_follow',['sf_s_id'=>$s_id,'sf_au_id'=>$uid],['sf_s_id','sf_au_id']);
            }
        }
        return true;
	}
	
	/**
	 * 删除样品关注
	 */
	public function deleteFollowRow($ids)
	{
        $uid = getOpuser();
        if($uid && $ids){
            $this->db->delete('sample_follow',['sf_s_id'=>$ids,'sf_au_id'=>$uid]);
        }
        return true;
	}
	
	/**
	 * 获取样品关注-通用用户
	 */
	public function getFollowByUid($uid)
	{
	    $rows = $this->db->select('sample_follow','sf_s_id',['sf_au_id'=>$uid]);
	    return $rows;
	}
	
	/**
	 * 获取样品关注-通用样品
	 */
	public function getFollowBySid($sid)
	{
	    $rows = $this->db->select('sample_follow','sf_au_id',['sf_s_id'=>$sid]);
	    return $rows;
	}
	
	/**
	 * 整单进度
	 */
	function getOrdList($rules, $where='',$page=0,$pagesize=0,$sidx='',$sord='asc',$orderby=''){
	    $req = \mvc::$req;
        $table = $this->table.'(s)';
        $this->fields = ['s.*'];
        $this->join = [];
        $this->where = [];
        $this->group = [];
        $this->searchNumber = '';
        $othWhere = [];
        $where = $this->filter2medoo($where,function(&$field,&$op,&$data)use(&$othWhere){
            $medooOp = $this->getMedooOp($op);
            switch($field){
                case 's_customer_code':
                case 's_customer_name':
					$field = 's_customer_name';
                    $op = 'eq';
                    $data = $this->customer->like($data,['ct_code','ct_name']);
                    break;    
                case 's_apply_user':
                case 's_sign_opuser':
                    $op = 'eq';
                    $data = $this->user->like($data,['au_name']);
                    break;
                case 'days':
                case 'total':
                    $othWhere['HAVING'][$field.'['.$medooOp.']'] = $data;
                    $op=null;
                    break;
                default:
                    if(substr($field,0,2)==='t_'){
                        $othWhere['HAVING'][$field.'['.$medooOp.']'] = $data;
                        $op=null;
                    }
            }
			if(($op=='eq' || $op =='cn') && $data=='') $op = null;
        });
        
        
        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
        $this->fields[] = "@(SELECT DATEDIFF(NOW(),MIN(s_apply_date)) FROM sample WHERE s_oddno=s.s_oddno) as days";
        $this->fields[] = "@(SELECT COUNT(1) FROM sample WHERE s_oddno=s.s_oddno) as total";
        $stateArr = ['s_apply_comp','s_check1', 's_check2', 's_check3','s_check_sales','s_check_tech','s_stop'
            ,'s_has_purc','s_has_comein'
        ];
        
        foreach($stateArr as $colname){
            $this->fields[] = "@(SELECT COUNT(1) FROM sample WHERE s_oddno=s.s_oddno AND ".$colname."=1) as t_".$colname;
        }
        $this->fields[] = "@(SELECT COUNT(1) FROM sample WHERE s_oddno=s.s_oddno AND s_check1_no_reason<>'') as t_s_check1_not";
        $this->fields[] = "@(SELECT COUNT(1) FROM sample WHERE s_oddno=s.s_oddno AND s_check2_no_reason<>'') as t_s_check2_not";
        $this->fields[] = "@(SELECT COUNT(1) FROM sample WHERE s_oddno=s.s_oddno AND s_check3_no_reason<>'') as t_s_check3_not";
        $this->fields[] = "@(SELECT COUNT(1) FROM sample WHERE s_oddno=s.s_oddno AND s_check_sales_reason<>'') as t_s_check_sales_not";
        $this->fields[] = "@(SELECT COUNT(1) FROM sample WHERE s_oddno=s.s_oddno AND s_check_tech_reason<>'') as t_s_check_tech_not";
        
        $this->fields[] = "@(SELECT COUNT(1) FROM sample WHERE s_oddno=s.s_oddno AND s_state_main='YJ') as t_s_state_main_yj";
        $this->fields[] = "@(SELECT COUNT(1) FROM sample WHERE s_oddno=s.s_oddno AND s_state_sub=1) as t_s_state_sub_1";
        $this->fields[] = "@(SELECT COUNT(1) FROM sample WHERE s_oddno=s.s_oddno AND s_state_sub=50) as t_s_state_sub_50";
        $this->fields[] = "@(SELECT COUNT(1) FROM sample WHERE s_oddno=s.s_oddno AND s_state_sub=51) as t_s_state_sub_51";
        $this->fields[] = "@(SELECT COUNT(1) FROM sample WHERE s_oddno=s.s_oddno AND s_state_sub=200) as t_s_state_sub_200";
        
        $where['s_oddno[!]'] = '';
        $where['GROUP'] = 's_oddno';
        $where = array_merge($where,$othWhere);
        
        $this->where = array_merge($this->where,$where);

		if($page>0 && $pagesize>0){
			$this->db->get($table,$this->fields,$where);
			$query = $this->db->last();
            $pos = strrpos($query,'LIMIT');
            $query = substr($query,0,$pos);
			$records = $this->db->count("@(".$query.") groupCount");
    		$pages['page'] = $page; //当前页码
    		$pages['pagesize'] = $pagesize; //一页多少条
    		$pages['total'] = ceil($records / $pagesize); //总页码数
    		$pages['records'] = $records; //总记录数
    		$pages['limit'] = ($page-1) * $pagesize;	
            //dd($this->db->last(),$pages);
			$this->where["LIMIT"] = [$pages['limit'],$pagesize];
		}
        if(empty($this->join)){
            $rows = $this->db->select($table,$this->fields,$this->where);
        }else{
            $rows = $this->db->select($table,$this->join,$this->fields,$this->where);
        }
        //dump($this->db->last(),$where);
        if(!empty($rows)) foreach($rows as $k=>&$row){
            $row = $this->getRowInfo($row);
        }
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $rows
		];
		return $data;
	}
	
    public function sendMailToProlineCheckerLot($ids, $type) {
        if (!is_array($ids)) {
            $ids = [$ids];
        }
        $ids = array_unique($ids);
        $toUsers = [];
        $title = '样品: ' . $type . ' 批量'; //
        $br = "\r\n <br /> \r\n";
        $msg  = '';
        $msg .= '<b>' . $title . '</b>';
        $msg .= $br;

        $rows = $this->db->select('sample', '*', ['s_id' => $ids]);
        foreach ($rows as $row) {
            if (in_array($type, [
                '申请人退回',
            ])) {
                $toUsers[] = $row['s_apply_user'];
            } else if (in_array($type, [
                '登记人退回',
            ])) {
                $toUsers[] = $row['s_sign_opuser'];
            }
            $msg .= '流水号: ' . $row['s_plmseq'] . $br;
        }
        $msgArr =  [
            'amsg_title' => $title,
            'amsg_body' => $msg,
            'amsg_send_mail' => 1,
            'amsg_send_sms' => 1
        ];
        if (empty($toUsers)) {
            return;
        }
        $toUsers = array_unique($toUsers);
        makeOne(\model\message::class)->send($toUsers, $msgArr, false);
        socketSendMsg($toUsers, $msgArr);
    }

    public function sendMailToProlineChecker($ids, $type)
    {
        if ($type == '终审') {
            return;// 不通知
        }
        if (!is_array($ids)) {
            $ids = [$ids];
        }
        $ids = array_unique($ids);

        //产品线整合, 一个产品线一个邮件
        $list = [];
        foreach ($ids as $sid) {
            $row = $this->getRowInfo($sid);
            $prolineId = $this->db->get('pro_cate', 'parent_id', ['id' => $row['s_cate']]);
            $checkuserRow = $this->db->get('sample_proline_checkuser', '*', ['splu_proline_id' => $prolineId]);
            $toUsers = [];
            $history = new history();
            $hisArr = $history->getList('sample', $sid);
            if ($type == '申请') {
                $toUsers[] = $checkuserRow['splu_chk1_uid'];
            } else if ($type == '初审') {
                $toUsers[] = $checkuserRow['splu_chk2_uid'];
            } else if ($type == '复审') {
                $toUsers[] = $checkuserRow['splu_chk3_uid'];
            } else if ($type == '终审') {
                $toUsers[] = $checkuserRow['splu_purc_uid'];
                $toUsers[] = $checkuserRow['splu_catalog_uid'];
            } else if ($type == '采购') {
                $toUsers[] = $checkuserRow['splu_catalog_uid'];
            } else if ($type == '登记') {
                $toUsers[] = $checkuserRow['splu_catalog_uid'];
            } else if ($type == '目录组审核') {
                $toUsers[] = $checkuserRow['splu_tech_uid'];
            } else if (in_array($type, [
                '目录组驳回',
            ])) {
                $toUsers[] = $row['s_sign_opuser'];
            } else if (in_array($type, [
                '终审驳回',
            ])) {
                $findKey = array_search('复审', array_column($hisArr, 'h_action'));
                if ($findKey) {
                    $toUsers[] = $hisArr[$findKey]['opuser'];
                }
            } else if (in_array($type, [
                '停购',
                '停购审核',
                '终审不采购',
            ])) {
                $findKey = array_search('复审', array_column($hisArr, 'h_action'));
                if ($findKey) {
                    $toUsers[] = $hisArr[$findKey]['opuser'];
                }
                $toUsers[] = $row['s_apply_user'];
            } else if (in_array($type, [
                '复审驳回',
            ])) {
                $findKey = array_search('初审', array_column($hisArr, 'h_action'));
                if ($findKey) {
                    $toUsers[] = $hisArr[$findKey]['opuser'];
                }
            } else if (in_array($type, [
                '初审驳回',
                '申请人退回',
            ])) {
                $toUsers[] = $row['s_apply_user'];
            } else if (in_array($type, [
                '登记人退回',
            ])) {
                $toUsers[] = $row['s_sign_opuser'];
            } else if (in_array($type, [
                '技术部驳回',
            ])) {
                $findKey = array_search('目录组通过', array_column($hisArr, 'h_action'));
                if ($findKey) {
                    $toUsers[] = $hisArr[$findKey]['opuser'];
                }
            }
            if (!isset($list[$prolineId])) {
                $list[$prolineId]['toUsers'] = $toUsers;
            } else {
                $list[$prolineId]['toUsers'] = array_merge($list[$prolineId]['toUsers'], $toUsers);
            }
            $list[$prolineId]['rows'][] = $row;
            $list[$prolineId]['toUsers'] = array_unique($list[$prolineId]['toUsers']);
        }
        foreach ($list as $prolineId => $item) {
            $toUsers = $item['toUsers'];
            $rows = $item['rows'];
            if (empty($toUsers)) {
                continue;
            }
            $prolineName = $this->db->get('pro_cate', 'cn_name', ['id' => $prolineId]);

            $title = '样品: ' . $prolineName . ' ' . $type; //. ' 上一个节点至今 ' . $preDays . ' 天';
            $br = "\r\n <br /> \r\n";
            $msg  = '';
            $msg .= '<b>' . $title . ' 流水号列表如下 ' . '</b>';
            $msg .= $br;
            foreach ($rows as $row) {
                $msg .= $row['s_plmseq'] . $br;
            }
            $msgArr =  [
                'amsg_title' => $title,
                'amsg_body' => $msg,
                'amsg_send_mail' => 1,
                'amsg_send_sms' => 1
            ];
            $toUsers = array_unique($toUsers);
            //dd($toUsers, $msgArr);
            makeOne(\model\message::class)->send($toUsers, $msgArr, false);
            socketSendMsg($toUsers, $msgArr);
        }
    }    
}
