SCTMES_V5/mes_in_sct/app/action/SetMaterialInputCompleted.php

149 lines
5.7 KiB
PHP
Raw Normal View History

2025-06-14 18:55:09 +08:00
<?php
namespace app\action;
use libs\listener\Event;
use libs\db\Db;
use Exception;
// 物料投料完成,指当次投料物料已使用完成,可能会上新物料
class SetMaterialInputCompleted
{
public function execute($post)
{
return $this->do_set_material_input_completed($post);
}
/*
制片段设备物料投料完成出现以下场景:
一、全部投入物料都结束完成
二、某一个投入物料结束;结束当前物料,新物料投入
三、当前投入物料实际还未结束。新工单过来需要投入其他bom物料
接口api示例
{
"action": "set_material_input_completed",
"param": {
"workingsubclass": "ZJ", # 工序单元
"device_code": "FJZJ-1", # 设备编码
"in": [{
"item_code":"tongbo", #物料编码
"item_batch": "fengezi-1", #物料批次
}]
}
}
*/
/*
*
* 1.获取请求体设备编码参数
* 2.判断工序单元、设备编码是存在?根据设备编码查询批次工序日志表,判断该设备是否存在生产中物料信息
* 3.检查投料完成物料是否存在投料物料列表中
* 4.更新投料物料状态为完成
*/
private function do_set_material_input_completed($post)
{
// 验证数据
$param = $post['param'];
try{
if(empty($param["workingsubclass"])){
throw new Exception("缺少workingsubclass参数");
}
if(empty($param["device_code"])){
throw new Exception("缺少device_code参数");
}
if(empty($param["is_material_finished"])){
throw new Exception("缺少is_material_finished参数");
}
if(empty($param["in"]) || count($param["in"]) < 0){
throw new Exception("缺少in参数");
}
//1.获取请求体设备编码参数
$workingsubclass = $param["workingsubclass"];
$is_material_finished = $param["is_material_finished"];
$device_code = $param["device_code"];
$param_in = $param["in"];
// 判断in结构参数是否上传
foreach($param_in as $key=>$values){
if(empty($values["item_code"])){
throw new Exception("上传的in结构内".($key+1)."个item_code参数缺少数据");
}
if(empty($values["item_batch"])){
throw new Exception("上传的in结构内".($key+1)."个item_batch参数缺少数据");
}
}
//2.判断工序单元、设备编码是存在?根据设备编码查询批次工序日志表,判断该设备是否存在生产中物料信息
$sql = "SELECT id FROM hf_mes_process_workingsubclass WHERE code='".$workingsubclass."'";
$ret = Db::fetch($sql);
if(empty($ret)){
throw new Exception("工序单元[$workingsubclass]不存在");
}
$sql = "SELECT id FROM hf_mes_device WHERE code='".$device_code."'";
$ret = Db::fetch($sql);
if(empty($ret)){
throw new Exception("设备编码[$device_code]不存在");
}
$sql = "SELECT * FROM hf_mes_bkv_batch_process_log WHERE workingsubclass='".$workingsubclass."' AND device_code='".$device_code."' AND status=0";
$ret = Db::fetchAll($sql);
if(empty($ret)){
throw new Exception("工序单元[$workingsubclass]下设备[$device_code]不存在的投料物料信息,请先检查是否存在投料信息");
}
$bkv_batch_process_log_item_code = array_column($ret,'item_code');
$bkv_batch_process_log_item_code_batch = array_column($ret,"item_batch",'item_code');
$bkv_batch_process_log_item_code_all_data = array_column($ret,null,'item_code'); //记录优先的id后续用于复制一条新的数据
//记录替换物料的信息item_id
$item_replace = [];
//3.检查投料完成物料是否存在投料物料列表中
$missing_material = [];
foreach($param_in as $key=>$val){
if(!in_array($val['item_code'],$bkv_batch_process_log_item_code) ){
$missing_material[]=$val['item_code'];
}
}
if(count($missing_material)>0){
throw new Exception("上传param中in结构物料[".implode(',',$missing_material)."]不存在的投料物料信息,请先检查是否存在投料信息");
}
}catch(Exception $e){
throw new Exception($e->getMessage());
}
// 开启事务
Db::beginTrans();
try {
$status = 1;
if($is_material_finished == 2 ){
$status = -2;
}
// 4.更新投料物料状态为完成
foreach($param_in as $key=>$val){
$sql = "UPDATE hf_mes_bkv_batch_process_log SET status=$status,finish_time='".date('Y-m-d H:i:s')."' WHERE workingsubclass='".$workingsubclass."' AND item_code='".$val['item_code']."' AND device_code='".$device_code."' AND status=0";
$row = Db::query($sql);
if ($row === NULL) {
throw new Exception("更新物料[{$val['item_code']}]状态为1失败");
}
}
} catch (Exception $e) {
Db::rollBackTrans();
throw new Exception($e->getMessage());
}
Db::commitTrans();
return '';
}
}