$val){ if($workingsubclass == $val[4]){ $new_process_code = $process[$key-1][2]; $new_process_idx = $process[$key-1][0]; $new_next_process_code = $val[2]; break; } $sql = "SELECT code FROM hf_mes_technology_process_result_param WHERE process_id=".$val[1]; $ret = Db::fetchAll($sql); if(empty($ret)){ continue; } foreach($ret as $k => $v){ $process_param[] = '"'.$val[2].'.'.$v['code'].'"'; } } // 修改tray_map表的date_log foreach ($date_log as $k => $v) { if ($k > $new_process_idx) { $date_log[$k]['beginTime'] = ""; $date_log[$k]['endTime'] = ""; $date_log[$k]['device_code'] = ""; } } } catch (Exception $e) { throw new Exception($e->getMessage()); } // 开启事务 Db::beginTrans(); try { // 4、之前工序所有数据新增到bkv表、battery_map表、tray_map表、process_log表 // 4.1、针对tray_map表拿之前的数据,除lot、active、process_code、process_idx、next_process_code、date_log、tray_unique_value、create_time,其他沿用原来的 $sql = "SELECT column_name FROM information_schema.COLUMNS WHERE TABLE_NAME = 'hf_mes_production_tray_map' AND column_name <> 'id' ORDER BY ordinal_position"; $ret = Db::fetchAll($sql); $key_str = implode(",",array_column($ret, 'column_name')); $sql = "SELECT $key_str FROM hf_mes_production_tray_map WHERE tray='$tray' AND lot='$lot' AND batch='$batch' LIMIT 1"; $ret = Db::fetch($sql); if(empty($ret)){ throw new Exception("查找tray_map数据失败"); } $new_log = time(); $ret['lot'] = $new_log; $ret['active'] = 1; $ret['process_code'] = $new_process_code; $ret['process_idx'] = $new_process_idx; $ret['next_process_code'] = $new_next_process_code; $ret['date_log'] = json_encode($date_log, JSON_UNESCAPED_UNICODE); $ret['tray_unique_value'] = "{$batch}_{$subbatch}_{$tray}_{$new_log}"; $ret['create_time'] = date("Y-m-d H:i:s"); $k_str = ""; $v_str = ""; foreach($ret as $k => $v){ $k_str .= "$k,"; if($v === '' || $v === NULL){ $v_str .= "Null,"; }else{ $v_str .= "'$v',"; } } $k_str = rtrim($k_str, ","); $v_str = rtrim($v_str, ","); // 写入tray_map数据 $sql = sprintf( "INSERT INTO \"%s\" %s VALUES %s;", 'hf_mes_production_tray_map', "({$k_str})", "({$v_str})" ); $row = Db::query($sql); if ($row === NULL) { throw new Exception("写入tray_map数据失败"); } // 4.2、针对battery_map表拿之前的数据,除lot、battery_unique_value、workingsubclass,其他沿用原来的 $sql = "SELECT column_name FROM information_schema.COLUMNS WHERE TABLE_NAME = 'hf_mes_production_battery_map' AND column_name <> 'id' ORDER BY ordinal_position"; $ret = Db::fetchAll($sql); $key_str = implode(",",array_column($ret, 'column_name')); $sql = "SELECT $key_str FROM hf_mes_production_battery_map WHERE tray='$tray' AND lot='$lot' AND batch='$batch' ORDER BY id ASC"; $ret = Db::fetchAll($sql); if(empty($ret)){ throw new Exception("查找battery_map数据失败"); } $batterys_v_str = ""; foreach($ret as $val){ $v_str = ""; // 如果电池ID在再投电池内,则复制原来的数据 if(in_array($val['battery_id'],$rebatch_battery_ids)){ foreach($val as $k => $v){ if($k == 'battery_unique_value'){ $v_str .= "'{$batch}_{$subbatch}_{$tray}_{$new_log}_{$val['battery_id']}',"; }else if($k == 'lot'){ $v_str .= "'$new_log',"; }else if($k == 'workingsubclass'){ $v_str .= "'$workingsubclass',"; }else{ if($v === '' || $v === NULL){ $v_str .= "Null,"; }else{ $v_str .= "'$v',"; } } } } // else{ // // 电池不需要再投,默认是0 // foreach($val as $k => $v){ // if($k == 'battery_id'){ // $v_str .= "'0',"; // }else if($k == 'battery_unique_value'){ // $v_str .= "'{$batch}_{$subbatch}_{$tray}_{$new_log}_0',"; // }else if($k == 'lot'){ // $v_str .= "'$new_log',"; // }else if($k == 'workingsubclass'){ // $v_str .= "'$workingsubclass',"; // }else if($k == 'batch' || $k == 'subbatch' || $k == 'tray'){ // $v_str .= "'$v',"; // }else{ // $v_str .= "Null,"; // } // } // } if($v_str != ""){ $v_str = rtrim($v_str, ","); $batterys_v_str .= "({$v_str}),"; } } $batterys_v_str = rtrim($batterys_v_str, ","); // 写入battery_map数据 $sql = sprintf( "INSERT INTO \"%s\" %s VALUES %s;", 'hf_mes_production_battery_map', "({$key_str})", "{$batterys_v_str}" ); $row = Db::query($sql); if ($row === NULL) { throw new Exception("写入battery_map数据失败"); } // 4.3、针对bkv表拿之前的数据,除lot、class、classname、process_code、process_idx、next_process_code、工序NG,其他沿用原来的 $sql = "SELECT column_name FROM information_schema.COLUMNS WHERE TABLE_NAME = 'hf_mes_tmp_bkv_".$subbatch."' AND column_name <> 'id' AND column_name NOT LIKE '%.%' ORDER BY ordinal_position"; $ret = Db::fetchAll($sql); // 合并再投工序之前工序结果参数字段 $key_str = implode(",",array_merge(array_column($ret, 'column_name'),$process_param)); $sql = "SELECT $key_str FROM \"hf_mes_tmp_bkv_".$subbatch."\" WHERE tray='$tray' AND lot='$lot' ORDER BY id ASC"; $ret = Db::fetchAll($sql); if(empty($ret)){ throw new Exception("查找bkv表数据失败"); } $batterys_v_str = ""; foreach($ret as $val){ $v_str = ""; // 如果电池ID在再投电池内,则复制原来的数据 if(in_array($val['battery_id'],$rebatch_battery_ids)){ foreach($val as $k => $v){ if($k == 'lot'){ $v_str .= "'$new_log',"; }else if($k == 'process_code'){ $v_str .= "'$new_process_code',"; }else if($k == 'process_idx'){ $v_str .= "'$new_process_idx',"; }else if($k == 'next_process_code'){ $v_str .= "'$new_next_process_code',"; }else if($k == 'class' || $k == 'classname' || strpos($k, '.NG') !== false){ // 清掉class、classname、工序NG $v_str .= "Null,"; }else{ if($v === '' || $v === NULL){ $v_str .= "Null,"; }else{ $v_str .= "'$v',"; } } } }else{ // 电池不需要再投,默认是0 foreach($val as $k => $v){ if($k == 'battery_id'){ $v_str .= "'0',"; }else if($k == 'lot'){ $v_str .= "'$new_log',"; }else if($k == 'tray'){ $v_str .= "'$v',"; }else{ $v_str .= "Null,"; } } } $v_str = rtrim($v_str, ","); $batterys_v_str .= "({$v_str}),"; } $batterys_v_str = rtrim($batterys_v_str, ","); // 写入bkv表数据 $sql = sprintf( "INSERT INTO \"%s\" %s VALUES %s;", config('app.bkv_prefix') . $subbatch, "({$key_str})", "{$batterys_v_str}" ); $row = Db::query($sql); if ($row === NULL) { throw new Exception("写入bkv表数据失败"); } // 4.4、针对process_log表拿之前的数据,除lot、class、classname、ng_code、last_status,其他沿用原来的 $sql = "SELECT column_name FROM information_schema.COLUMNS WHERE TABLE_NAME = 'hf_mes_bkv_batch_process_log' AND column_name <> 'id' ORDER BY ordinal_position"; $ret = Db::fetchAll($sql); $key_str = implode(",",array_column($ret, 'column_name')); // 在再投电池内,找出电池最后一条process_log数据(兼容是跳工序做的电池场景) $batterys_v_str = ""; foreach($rebatch_battery_ids as $battery_id){ $sql = "SELECT $key_str FROM hf_mes_bkv_batch_process_log WHERE item_id='$battery_id' ORDER BY id DESC LIMIT 1"; $ret = Db::fetch($sql); if(empty($ret)){ throw new Exception("查找process_log表数据失败"); } $v_str = ""; foreach($ret as $k => $v){ if($k == 'lot'){ $v_str .= "'$new_log',"; }else if($k == 'class' || $k == 'classname'){ // 清掉工序NG $v_str .= "Null,"; }else if($k == 'ng_code'){ // 清掉工序NG $v_str .= "0,"; }else if($k == 'last_status'){ $v_str .= "1,"; }else{ if($v === '' || $v === NULL){ $v_str .= "Null,"; }else{ $v_str .= "'$v',"; } } } $v_str = rtrim($v_str, ","); $batterys_v_str .= "({$v_str}),"; } $batterys_v_str = rtrim($batterys_v_str, ","); // 写入process_log表数据 $sql = sprintf( "INSERT INTO \"%s\" %s VALUES %s;", 'hf_mes_bkv_batch_process_log', "({$key_str})", "{$batterys_v_str}" ); $row = Db::query($sql); if ($row === NULL) { throw new Exception("写入process_log表数据失败"); } // 5、更改之前tray_map表托盘、bkv表电池状态为未激活;process_log表last_status=0 // 5.1、更改之前tray_map表托盘状态为未激活 $sql = sprintf( "UPDATE \"%s\" SET active=0 WHERE batch='%s' AND tray='%s' AND lot='%s'", 'hf_mes_production_tray_map', $batch, $tray, $lot ); $row = Db::query($sql); if ($row === NULL) { throw new Exception("更新tray_map表数据失败"); } // 5.2、更改之前bkv表电池状态为未激活 $sql = sprintf( "UPDATE \"%s\" SET active=0 WHERE tray='%s' AND lot='%s'", config('app.bkv_prefix') . $subbatch, $tray, $lot ); $row = Db::query($sql); if ($row === NULL) { throw new Exception("更新bkv表数据失败"); } // 5.3、更改之前process_log表last_status=0 foreach($rebatch_battery_ids as $battery_id){ $sql = sprintf( "UPDATE \"%s\" SET last_status=0 WHERE item_id='%s' AND tray='%s' AND lot='%s'", 'hf_mes_bkv_batch_process_log', $battery_id, $tray, $lot ); $row = Db::query($sql); if ($row === NULL) { throw new Exception("更新process_log表数据失败"); } } } catch (Exception $e) { Db::rollBackTrans(); throw new Exception($e->getMessage()); } Db::commitTrans(); return ''; } }