diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java index 0fe289f..b4d50f1 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java @@ -17,6 +17,8 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.Map; + /** * @author ludj * @date 2021-07-21 @@ -51,6 +53,17 @@ public class AcsToWmsController { return new ResponseEntity<>(acsToWmsService.apply(whereJson), HttpStatus.OK); } + @PostMapping("/manipulatorApply") + @Log("ACS机械手给WMS发送任务") + @ApiOperation("ACS机械手给WMS发送任务") + public ResponseEntity manipulatorApply(@RequestBody Map whereJson) { + acsToWmsService.manipulatorApply(whereJson); + JSONObject result = new JSONObject(); + result.put("status", HttpStatus.OK.value()); + result.put("message", "发送任务成功"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + @PostMapping("/againApply") @Log("二次申请任务") @ApiOperation("二次申请任务") diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java index 17e9538..800a8c6 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java @@ -51,4 +51,10 @@ public interface AcsToWmsService { */ JSONObject apply(JSONObject whereJson); + /** + * ACS机械手给WMS发送任务 + * 组盘 + * @param whereJson + */ + void manipulatorApply(Map whereJson); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index 40fd615..4d24a98 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -1,6 +1,7 @@ package org.nl.wms.ext.acs.service.impl; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; @@ -8,6 +9,7 @@ import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.SpringContextHolder; import org.nl.wms.ext.acs.service.AcsToWmsService; @@ -15,14 +17,16 @@ import org.nl.wms.log.LokiLog; import org.nl.wms.log.LokiLogType; import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.service.TaskService; -import org.nl.wms.sch.tasks.callEmpty.GjxCallEmpVehicleTask; -import org.nl.wms.sch.tasks.callEmpty.YqxCallEmpVehicleTask; -import org.nl.wms.sch.tasks.callMaterial.YqxCallMaterialTask; -import org.nl.wms.sch.tasks.sendEmpty.HtSendEmpVehicleTask; -import org.nl.wms.sch.tasks.sendEmpty.YqxSendEmpVehicleTask; -import org.nl.wms.sch.tasks.sendMaterial.GjxSendMaterialTask; -import org.nl.wms.sch.tasks.sendMaterial.HkxSendMaterialTask; -import org.nl.wms.sch.tasks.sendMaterial.YqxSendMaterialTask; +import org.nl.wms.sch.tasks.callEmpty.FjCallEmptyVehicleTask; +import org.nl.wms.sch.tasks.callEmpty.HnCallEmptyVehicleTask; +import org.nl.wms.sch.tasks.callEmpty.YzjCallEmptyVehicleTask; +import org.nl.wms.sch.tasks.callMaterial.FjCallMaterialTask; +import org.nl.wms.sch.tasks.callMaterial.SzCallMaterialTask; +import org.nl.wms.sch.tasks.callMaterial.YzjCallMaterialTask; +import org.nl.wms.sch.tasks.sendEmpty.DpSendEmpVehicleTask; +import org.nl.wms.sch.tasks.sendEmpty.FjSendEmpVehicleTask; +import org.nl.wms.sch.tasks.sendEmpty.YzjSendEmpVehicleTask; +import org.nl.wms.sch.tasks.sendMaterial.*; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -170,133 +174,235 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Transactional(rollbackFor = Exception.class) public JSONObject apply(JSONObject whereJson) { String type = whereJson.getString("type"); - String point_code = whereJson.getString("point_code"); - String vehicle_type = whereJson.getString("vehicle_type"); + String point_code = whereJson.getString("device_code"); String vehicle_code = whereJson.getString("vehicle_code"); - //载具数量 - String vehicle_num = whereJson.getString("vehicle_num"); - //物料数量 - String material_num = whereJson.getString("material_num"); + String is_full = whereJson.getString("is_full"); + String weight = whereJson.getString("weight"); + String qty = whereJson.getString("qty"); + if (ObjectUtil.isEmpty(type)) throw new BadRequestException("类型不能为空"); if (ObjectUtil.isEmpty(point_code)) throw new BadRequestException("点位不能为空"); + // 参数统一获取 + JSONObject param = new JSONObject(); + param.put("vehicle_code", vehicle_code); + param.put("is_full", is_full); + param.put("weight", weight); + param.put("qty", qty); + /* * 根据type判断是什么业务类型: - * 1.共挤线申请空盘 - * 2.共挤线满托入库 - * 3.油漆线申请空盘 - * 4.油漆线申请物料 - * 5.油漆线空盘入库 - * 6.一楼空盘入库 (有载具号) - * 7.油漆线->输送线(油漆线满料) - * 8.豪凯自动线下料入库 + * 1.混碾机送料入库-困料货架 + * 2.混碾机呼叫空托盘 + * 3.压制机下料位叫料出库 + * 4.压制机下料位送空托盘 + * 5.压制机满料入库 + * 6.压制机呼叫空钢托盘 + * 7.烧制叫料出库 + * 8.烧制送料入库 + * 9.分拣叫料出库 + * 10.分拣送空钢托盘 + * 11.分拣送料入库 + * 12.分拣呼叫木托盘 + * 13.叠盘区送空钢托盘 */ - if (StrUtil.equals(type, "1")) { - // 1.共挤线申请空盘: 调用空托盘出库处理类创建任务 - if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); - - JSONObject param = new JSONObject(); - param.put("point_code2", point_code); - param.put("vehicle_type", vehicle_type); - param.put("vehicle_code", vehicle_code); - param.put("qty", material_num); - // 创建任务 - GjxCallEmpVehicleTask taskBean = SpringContextHolder.getBean(GjxCallEmpVehicleTask.class); - taskBean.createTask(param); - - } else if (StrUtil.equals(type, "2")) { - // 2.共挤线满托入库: 调用物料入库处理类创建任务 - if (ObjectUtil.isEmpty(material_num) || (StrUtil.equals(material_num, "0"))) - throw new BadRequestException("物料数量不能为空或者为0"); - - JSONObject param = new JSONObject(); - param.put("point_code1", point_code); // 满料位 - param.put("qty", material_num); // 满料位 - param.put("vehicle_type", vehicle_type); - param.put("vehicle_code", vehicle_code); - - GjxSendMaterialTask taskBean = SpringContextHolder.getBean(GjxSendMaterialTask.class); - String task_id = taskBean.createTask(param); // 创建任务 - } else if (StrUtil.equals(type, "3")) { - // 3.油漆线申请空盘: 调用空托盘出库处理类创建任务 - if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); - - JSONObject param = new JSONObject(); - param.put("point_code2", point_code); - param.put("vehicle_code", vehicle_code); - param.put("qty", vehicle_num); - // 创建任务 - YqxCallEmpVehicleTask taskBean = SpringContextHolder.getBean(YqxCallEmpVehicleTask.class); - String task_id = taskBean.createTask(param); - } else if (StrUtil.equals(type, "4")) { - // 4.油漆线申请物料: 调用物料出库库处理类创建任务 - JSONObject param = new JSONObject(); - param.put("point_code2", point_code); // 叫料点 - param.put("io_type", "2"); - param.put("vehicle_type", vehicle_type); - param.put("vehicle_code", vehicle_code); - param.put("material_num", material_num); - // 创建任务 - YqxCallMaterialTask taskBean = SpringContextHolder.getBean(YqxCallMaterialTask.class); - String task_id = taskBean.createTask(param); - - } else if (StrUtil.equals(type, "5")) { - // 5.油漆线空盘入库: 调用空托盘入库处理类创建任务 - if (ObjectUtil.isEmpty(point_code)) throw new BadRequestException("点位不能为空"); - if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); - if (ObjectUtil.isEmpty(vehicle_type)) throw new BadRequestException("载具类型不能为空"); - - JSONObject param = new JSONObject(); - param.put("point_code1", point_code); - param.put("qty", vehicle_num); - param.put("vehicle_type", vehicle_type); - param.put("vehicle_code", vehicle_code); - // 创建任务 - YqxSendEmpVehicleTask taskBean = SpringContextHolder.getBean(YqxSendEmpVehicleTask.class); - taskBean.createTask(param); - - - } else if (StrUtil.equals(type, "6")) { - // 6.一楼空盘入库 (有载具号): 调用空托盘入库处理类创建任务 - if (ObjectUtil.isEmpty(vehicle_code)) throw new BadRequestException("载具号不能为空"); - JSONObject param = new JSONObject(); - - // 查询载具号对应的数量 - JSONObject jsonVeQty = new JSONObject(); - if (ObjectUtil.isEmpty(vehicle_num)) { - if (ObjectUtil.isEmpty(jsonVeQty)) throw new BadRequestException("请先手持扫码"); - } else { - jsonVeQty.put("qty", vehicle_num); - } - - param.put("qty", jsonVeQty.getString("qty")); - param.put("point_code1", point_code); - param.put("vehicle_code", vehicle_code); - param.put("vehicle_type", vehicle_type); - // 创建任务 - HtSendEmpVehicleTask taskBean = SpringContextHolder.getBean(HtSendEmpVehicleTask.class); - String task_id = taskBean.createTask(param); - - } else if (StrUtil.equals(type, "7")) { - JSONObject param = new JSONObject(); - param.put("point_code1", point_code); - param.put("vehicle_code", vehicle_code); - param.put("vehicle_type", vehicle_type); - param.put("qty", material_num); - // 1.生成起点确定的任务 - SpringContextHolder.getBean(YqxSendMaterialTask.class).createTask(param); - } else if (StrUtil.equals(type, "8")) { - // 8.豪凯自动线下料入库 - JSONObject param = new JSONObject(); - param.put("point_code1", point_code); - param.put("vehicle_code", vehicle_code); - param.put("vehicle_type", vehicle_type); - param.put("qty", material_num); - HkxSendMaterialTask taskBean = SpringContextHolder.getBean(HkxSendMaterialTask.class); - String task_id = taskBean.createTask(param); - + switch (type) { + case "1": + // 1.混碾机送料入库:混碾机物料送到困料货架 + if (ObjectUtil.isEmpty(point_code)) throw new BadRequestException("设备号不能为空"); + // 创建任务 + param.put("point_code1", point_code); // 起点 + SpringContextHolder.getBean(HnSendMaterialTask.class).createTask(param); + break; + case "2": + if (ObjectUtil.isEmpty(point_code)) throw new BadRequestException("设备号不能为空"); + param.put("point_code2", point_code); // 终点 + // 创建任务 + SpringContextHolder.getBean(HnCallEmptyVehicleTask.class).createTask(param); + break; + case "3": + // 压制机叫料任务 + param.put("point_code2", point_code); // 终点 + // 创建任务 + SpringContextHolder.getBean(YzjCallMaterialTask.class).createTask(param); + break; + case "4": + // 压制机送空托盘 + param.put("point_code1", point_code); // 起点 + // 创建任务 + SpringContextHolder.getBean(YzjSendEmpVehicleTask.class).createTask(param); + break; + case "5": + // 压制机满料入库 + param.put("point_code1", point_code); // 起点 + // 创建任务 + SpringContextHolder.getBean(YzjSendMaterialTask.class).createTask(param); + break; + case "6": + // 压制机呼叫空托盘 + param.put("point_code2", point_code); // 终点 + // 创建任务 + SpringContextHolder.getBean(YzjCallEmptyVehicleTask.class).createTask(param); + break; + case "7": + // 烧制叫料出库 + param.put("point_code2", point_code); // 终点 + SpringContextHolder.getBean(SzCallMaterialTask.class).createTask(param); + break; + case "8": + // 烧制送料入库 + param.put("point_code1", point_code); // 起点 + SpringContextHolder.getBean(SzSendMaterialTask.class).createTask(param); + break; + case "9": + // 分拣叫料出库 + param.put("point_code2", point_code); // 终点 + SpringContextHolder.getBean(FjCallMaterialTask.class).createTask(param); + break; + case "10": + // 分拣送钢托盘 + param.put("point_code1", point_code); // 起点 + SpringContextHolder.getBean(FjSendEmpVehicleTask.class).createTask(param); + break; + case "11": + // 分拣送料入库 + param.put("point_code1", point_code); // 起点 + SpringContextHolder.getBean(FjSendMaterialTask.class).createTask(param); + break; + case "12": + // 分拣呼叫木托盘 + param.put("point_code2", point_code); // 起点 + SpringContextHolder.getBean(FjCallEmptyVehicleTask.class).createTask(param); + break; + case "13": + // 叠盘区送空钢托盘 + param.put("point_code1", point_code); // 起点 + SpringContextHolder.getBean(DpSendEmpVehicleTask.class).createTask(param); + break; } return null; } + + /** + * ACS机械手给WMS发送任务 + * 组盘 + * + * @param jsonObject + */ + @Override + public void manipulatorApply(Map jsonObject) { + //组盘 + JSONObject produceInfoByCode = new JSONObject(); + String device_code = (String) jsonObject.get("device_code"); + String vehicle_code = (String) jsonObject.get("vehicle_code"); + String qty = String.valueOf(jsonObject.get("qty")); + produceInfoByCode = this.getProduceInfoByCode(device_code); + String material_id = (String) produceInfoByCode.get("material_id"); + String cust_id = (String) produceInfoByCode.get("cust_id"); + String producetask_id = (String) produceInfoByCode.get("producetask_id"); + WQLObject.getWQLObject("st_buss_vehiclegroup").delete("vehicle_code ='" + vehicle_code + "'"); + // 如果上报不了,则去点位上取(木托盘情况) + if (StrUtil.equals("0", vehicle_code)) { + vehicle_code = produceInfoByCode.getString("vehicle_code"); + } + JSONObject materialObj = WQLObject + .getWQLObject("MD_ME_Material") + .query("material_id='" + material_id + "'") + .uniqueResult(0); + JSONObject groubObj = new JSONObject(); + groubObj.put("group_id", IdUtil.getSnowflake(1, 1).nextId()); + + groubObj.put("vehicle_code", vehicle_code); + groubObj.put("material_uuid", material_id); + groubObj.put("material_code", materialObj.getString("material_code")); + groubObj.put("material_name", materialObj.getString("material_name")); + groubObj.put("cust_id", cust_id); + groubObj.put("qty", qty); + groubObj.put("producetask_id", producetask_id); + groubObj.put("AlongSide", jsonObject.get("AlongSide")); + groubObj.put("BshortSide", jsonObject.get("BshortSide")); + groubObj.put("Htrapezoidal", jsonObject.get("Htrapezoidal")); + groubObj.put("Wthickness", jsonObject.get("Wthickness")); + groubObj.put("tray_qty", jsonObject.get("tray_qty")); + groubObj.put("crib_category", jsonObject.get("crib_category")); + groubObj.put("tray_high", jsonObject.get("tray_high")); + groubObj.put("palletX1_line", jsonObject.get("palletX1_line")); + groubObj.put("palletY1_row", jsonObject.get("palletY1_row")); + groubObj.put("palletA1_angle", jsonObject.get("palletA1_angle")); + groubObj.put("palletX2_line", jsonObject.get("palletX2_line")); + groubObj.put("palletY2_row", jsonObject.get("palletY2_row")); + groubObj.put("palletA2_angle", jsonObject.get("palletA2_angle")); + groubObj.put("palletX3_line", jsonObject.get("palletX3_line")); + groubObj.put("palletY3_row", jsonObject.get("palletY3_row")); + groubObj.put("pressCribX1_line", jsonObject.get("pressCribX1_line")); + groubObj.put("palletA3_angle", jsonObject.get("palletA3_angle")); + groubObj.put("pressCribY1_row", jsonObject.get("pressCribY1_row")); + groubObj.put("pressCribA1_angle", jsonObject.get("pressCribA1_angle")); + groubObj.put("pressCribX2_line", jsonObject.get("pressCribX2_line")); + groubObj.put("pressCribY2_row", jsonObject.get("pressCribY2_row")); + groubObj.put("pressCribA2_angle", jsonObject.get("pressCribA2_angle")); + groubObj.put("pressCribX3_line", jsonObject.get("pressCribX3_line")); + groubObj.put("pressCribY3_row", jsonObject.get("pressCribY3_row")); + groubObj.put("pressCribA3_angle", jsonObject.get("pressCribA3_angle")); + groubObj.put("Zoffset", jsonObject.get("Zoffset")); + groubObj.put("pallet_layerQty", jsonObject.get("pallet_layerQty")); + groubObj.put("pressCrib_layerQty", jsonObject.get("pressCrib_layerQty")); + groubObj.put("codeLayerX1_interval", jsonObject.get("codeLayerX1_interval")); + groubObj.put("codeLayerY1_interval", jsonObject.get("codeLayerY1_interval")); + groubObj.put("pressCrib_layerQty", jsonObject.get("pressCrib_layerQty")); + groubObj.put("codeLayerX2_interval", jsonObject.get("codeLayerX2_interval")); + groubObj.put("codeLayerY2_interval", jsonObject.get("codeLayerY2_interval")); + groubObj.put("codeLayerX3_interval", jsonObject.get("codeLayerX3_interval")); + groubObj.put("codeLayerY3_interval", jsonObject.get("codeLayerY3_interval")); + groubObj.put("codeLayerY1_offset", jsonObject.get("codeLayerY1_offset")); + groubObj.put("codeLayerX1_offset", jsonObject.get("codeLayerX1_offset")); + groubObj.put("codeLayerX3_interval", jsonObject.get("codeLayerX3_interval")); + groubObj.put("codeLayerX2_offset", jsonObject.get("codeLayerX2_offset")); + groubObj.put("codeLayerX3_offset", jsonObject.get("codeLayerX3_offset")); + groubObj.put("codeLayerY3_offset", jsonObject.get("codeLayerY3_offset")); + groubObj.put("pressLayerX1_interval", jsonObject.get("pressLayerX1_interval")); + groubObj.put("pressLayerY1_interval", jsonObject.get("pressLayerY1_interval")); + groubObj.put("pressLayerX2_interval", jsonObject.get("pressLayerX2_interval")); + groubObj.put("pressLayerY2_interval", jsonObject.get("pressLayerY2_interval")); + groubObj.put("pressLayerX3_interval", jsonObject.get("pressLayerX3_interval")); + groubObj.put("pressLayerY3_interval", jsonObject.get("pressLayerY3_interval")); + groubObj.put("pressLayerX1_offset", jsonObject.get("pressLayerX1_offset")); + groubObj.put("pressLayerY1_offset", jsonObject.get("pressLayerY1_offset")); + groubObj.put("pressLayerX2_offset", jsonObject.get("pressLayerX2_offset")); + groubObj.put("pressLayerY2_offset", jsonObject.get("pressLayerY2_offset")); + groubObj.put("pressLayerX3_offset", jsonObject.get("pressLayerX3_offset")); + groubObj.put("pressLayerY3_offset", jsonObject.get("pressLayerY3_offset")); + groubObj.put("one_cribTotal", jsonObject.get("one_cribTotal")); + groubObj.put("two_cribTotal", jsonObject.get("two_cribTotal")); + groubObj.put("one_qty", jsonObject.get("one_qty")); + groubObj.put("two_qty", jsonObject.get("two_qty")); + groubObj.put("tool_coordinate", jsonObject.get("tool_coordinate")); + groubObj.put("create_id", SecurityUtils.getCurrentUserId()); + groubObj.put("create_name", SecurityUtils.getCurrentNickName()); + groubObj.put("create_time", DateUtil.now()); + WQLObject.getWQLObject("st_buss_vehiclegroup").insert(groubObj); + // 判断是分拣还是压制的送料入库 + if (device_code.startsWith("FJCD")) { + jsonObject.put("type", "11"); + } else { + jsonObject.put("type", "5"); + } + this.apply((JSONObject) jsonObject); + } + + private JSONObject getProduceInfoByCode(String code) { + //根据 设备点位去找生产任务信息 + //1 根据点位去找设备,去找对应的设备信息 + JSONObject pointObj = WQLObject.getWQLObject("sch_base_point").query("point_code ='" + code + "'").uniqueResult(0); + String device_code = pointObj.getString("device_code"); + //2 根据设备去找对应的生产任务 1-未生产、2-已下发、3-生产中、4-暂停、5-完成 + JSONObject productTaskObj = WQLObject.getWQLObject("PDM_BD_WorkOrder") + .query("device_code ='" + device_code + "' and producetask_status in ('3','2','4')", "seq_no") + .uniqueResult(0); + if (ObjectUtil.isEmpty(productTaskObj)) { + throw new BadRequestException("未找到点位为'" + code + "'的生产任务!"); + } + return productTaskObj; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionIOEnum.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionIOEnum.java new file mode 100644 index 0000000..04969a8 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionIOEnum.java @@ -0,0 +1,37 @@ +package org.nl.wms.sch.manage; + +/** + * @author: lyd + * @description: 库存出入库枚举 + * @Date: 2022/11/15 + */ +public enum RegionIOEnum { + // 出入库 + IO_TYPE_IN("1", "入库"), + IO_TYPE_OUT("2", "出库"), + // 订单状态 + BILL_STATUS_GENERATE("1", "生成"), + BILL_STATUS_EXECUTION("2", "执行中"), + BILL_STATUS_FINISH("3", "完成"), + // 创建模式 1-PC产生、2-ACS申请、3-手持创建、4-外部接口产生 + CREATE_MODE_PC("1", "PC产生"), + CREATE_MODE_ACS("2", "ACS申请"), + CREATE_MODE_PDA("3", "手持创建"), + CREATE_MODE_INTERFACE("4", "外部接口产生"); + + private final String code; + private final String name; + + RegionIOEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/UnitEnum.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/UnitEnum.java new file mode 100644 index 0000000..1a73425 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/UnitEnum.java @@ -0,0 +1,30 @@ +package org.nl.wms.sch.manage; + +/** + * @author: lyd + * @description: 计量单位枚举 + * @Date: 2022/11/15 + */ +public enum UnitEnum { + KG("1", "千克"), + ZHONG("4", "盅"), + BLOCK("3", "块"), + TOU("5", "托") +// KG("5", "千克"), + ; + private final String code; + private final String name; + + UnitEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/UpdateTaskStatusEnum.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/UpdateTaskStatusEnum.java new file mode 100644 index 0000000..0ab99ae --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/UpdateTaskStatusEnum.java @@ -0,0 +1,28 @@ +package org.nl.wms.sch.manage; + +/** + * @author: lyd + * @description: 更新任务状态 + * @Date: 2022/11/15 + */ +public enum UpdateTaskStatusEnum { + CANCEL("0","取消任务"), + EXECUTION("1","任务执行中"), + FORCEFINISH("2", "强制完成任务"); + + private final String code; + private final String name; + + UpdateTaskStatusEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/FjCallEmptyVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/FjCallEmptyVehicleTask.java new file mode 100644 index 0000000..325859b --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/FjCallEmptyVehicleTask.java @@ -0,0 +1,283 @@ +package org.nl.wms.sch.tasks.callEmpty; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.RegionIOEnum; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.manage.UpdateTaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.util.IdUtil; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author: lyd + * @description: 分拣呼叫木托盘 + * @Date: 2022/11/14 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class FjCallEmptyVehicleTask extends AbstractAcsTask { + private final String THIS_CLASS = FjCallEmptyVehicleTask.class.getName(); + /** + * 添加任务进行下发 + * + * @return + */ + @Override + public List addTask() { + return null; + } + + /** + * @param task 代表一条任务对象 + * @param status 代表wcs任务完成状态: //0:acs,取消,:执行中,2:完成 + * @return + * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 + * @author ldjun + * @created 2019年4月17日 下午8:51:50 + */ + @Override + public void updateTaskStatus(JSONObject task, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); + + JSONObject requestObj = task.getJSONObject("request_param"); + String task_id = task.getString("task_id"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + String point_code1 = task.getString("point_code1"); + + if (StrUtil.equals(status, UpdateTaskStatusEnum.CANCEL.getCode())) { + /* + * 取消任务 + */ + if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + if (ObjectUtil.isNotEmpty(point_code1)) { + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("remark", "已取消"); + taskTab.update(taskObj); + + JSONObject startPoint = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + startPoint.put("lock_type", "1"); + pointTab.update(startPoint); + } + } + + if (StrUtil.equals(status, UpdateTaskStatusEnum.EXECUTION.getCode())) { + // 更新任务状态为执行中 + taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("car_no", task.getString("car_no")); + taskTab.update(taskObj); + } + + if (StrUtil.equals(status, UpdateTaskStatusEnum.FORCEFINISH.getCode())) { + /* + * 更改任务状态为完成 + */ + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); + taskObj.put("update_optname", SecurityUtils.getCurrentUsername()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + + JSONObject startPoint = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + if (startPoint.getString("point_type").equals("1")) { // 包装缓存位 + // 插入出库单 + JSONObject regionIoObj = new JSONObject(); + regionIoObj.put("iostorinv_id", IdUtil.getLongId()); + regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); + regionIoObj.put("buss_date", DateUtil.today()); + regionIoObj.put("io_type", RegionIOEnum.IO_TYPE_OUT.getCode()); // 出库 + regionIoObj.put("region_id", startPoint.getString("region_id")); + regionIoObj.put("region_code", startPoint.getString("region_code")); + regionIoObj.put("region_name", startPoint.getString("region_name")); + regionIoObj.put("material_id", taskObj.getString("material_id")); + regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); + regionIoObj.put("qty", requestObj.getString("qty")); + regionIoObj.put("bill_status", RegionIOEnum.BILL_STATUS_FINISH.getCode()); + regionIoObj.put("start_point_code", taskObj.getString("point_code1")); + regionIoObj.put("end_point_code", taskObj.getString("point_code2")); + regionIoObj.put("create_mode", RegionIOEnum.CREATE_MODE_ACS.getCode()); + regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); + regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); + regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); + regionIoObj.put("create_time", DateUtil.now()); + regionIoTab.insert(regionIoObj); + // 点位更新,起点:空位,解锁; + startPoint.put("point_status", "1"); + startPoint.put("lock_type", "1"); + startPoint.put("task_id", ""); + startPoint.put("pcsn", ""); + startPoint.put("ivt_qty", "0"); + startPoint.put("material_id", ""); + startPoint.put("instorage_time", ""); + startPoint.put("is_full", "2"); + startPoint.put("standing_time", "0"); + startPoint.put("vehicle_type", ""); + startPoint.put("vehicle_code", ""); + } else { // 钢托盘每次就一个 --- 如果是堆叠位5需要更新设备状态?? + startPoint.put("point_status", "1"); + startPoint.put("lock_type", "1"); + startPoint.put("vehicle_qty", "0"); + } + pointTab.update(startPoint); + } + } + + /** + * @param form 创建任务需要的参数 + * @return 返回任务标识 + */ + @Override + public String createTask(JSONObject form) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); // 生产工单表 + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); //点位基础表 + + //任务表【SCH_BASE_Task】 + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + form.getString("point_code2") + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + form.getString("point_code2") + "存在未完成的任务"); + + + String point_code2 = form.getString("point_code2"); + String sub_device_code = point_code2.substring(0, point_code2.indexOf("_")); + + String device_code = pointTab.query("point_code = '" + sub_device_code + "'").uniqueResult(0).getString("device_code"); + + JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); + + SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("") + .task_name("分拣呼叫木托盘") + .task_status(TaskStatusEnum.SURE_END.getCode()) + .point_code2(point_code2) + .acs_task_type("2") + .vehicle_code(form.getString("vehicle_code")) + .vehicle_type(workOrderObj.getString("vehicle_type")) + .vehicle_qty(form.getIntValue("qty")) + .task_group_id(org.nl.wms.util.IdUtil.getLongId()) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + /** + * @returninvoke + * @discription 确定任务起点 + * @author ldjun + * @created 2020年6月12日 下午6:01:30 + */ + @Override + public void findStartPoint() { + // 先找包装暂存区是否有半满托的,没有就呼叫空的木托盘 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 + JSONArray taskArr = taskTab.query("is_delete = '0' and handle_class = '" + this.THIS_CLASS + "' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + // 创建任务 + JSONObject taskObj = taskArr.getJSONObject(i); + String vehicle_type = taskObj.getString("vehicle_type"); + // 寻找入窑暂存区是否有半托 + JSONObject noFull = new JSONObject(); + noFull.put("flag", "1"); + noFull.put("region_code", "BZZCQ"); + noFull.put("material_id", taskObj.getString("material_id")); + JSONObject noFullPoint = WQL.getWO("QSCH_fjCallEmptyVehicle_01").addParamMap(noFull).process().uniqueResult(0); + if (ObjectUtil.isNotEmpty(noFullPoint)) { // 找到半满托盘,叫料出库 + taskObj.put("update_time", DateUtil.now()); + taskObj.put("point_code1", noFullPoint.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskTab.update(taskObj); + + //锁住起点 + noFullPoint.put("task_id", taskObj.getString("task_id")); + noFullPoint.put("lock_type", "2"); + pointTab.update(noFullPoint); + } else { // 没有就呼叫空的木托盘 + JSONObject param = new JSONObject(); + param.put("flag", "2"); + param.put("region_code", "BZZCQ"); + param.put("vehicle_type", vehicle_type); + JSONObject kmtPoint = WQL.getWO("QSCH_fjCallEmptyVehicle_01").addParamMap(param).process().uniqueResult(0); + if (ObjectUtil.isNotEmpty(kmtPoint)) { + taskObj.put("update_time", DateUtil.now()); + taskObj.put("point_code1", kmtPoint.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskTab.update(taskObj); + + //锁住起点 + kmtPoint.put("task_id", taskObj.getString("task_id")); + kmtPoint.put("lock_type", "2"); + pointTab.update(kmtPoint); + } else { + taskObj.put("remark", "未找到可用的载具!"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } + } + } + } + + /** + * @param task_id 任务标识 + * @return + * @discription 强制结束完成任务 + * @author ldjun + * @created 2020年6月19日 上午10:34:58 + */ + @Override + public void forceFinish(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + this.updateTaskStatus(taskObj,"2"); + else { + throw new BadRequestException("未找到该任务或者任务已完成!"); + } + } + + /** + * 取消任务,货物搬回原点 + * + * @param task_id + */ + @Override + public void cancel(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + this.updateTaskStatus(taskObj,"0"); + else { + throw new BadRequestException("未找到该任务或者任务已完成!"); + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/GjxCallEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/GjxCallEmpVehicleTask.java deleted file mode 100644 index 72950a2..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/GjxCallEmpVehicleTask.java +++ /dev/null @@ -1,444 +0,0 @@ -package org.nl.wms.sch.tasks.callEmpty; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.sch.tasks.RegionTypeEnum; -import org.nl.wms.util.IdUtil; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -@Service -@RequiredArgsConstructor -@Slf4j -/** - * 共挤线申请空盘 - */ -public class GjxCallEmpVehicleTask extends AbstractAcsTask { - private final String THIS_CLASS = GjxCallEmpVehicleTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject taskObj, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = taskObj.getString("task_id"); - JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - if (StrUtil.equals(status, "0")) { - /* - * 取消删除 - * 1.终点为叠盘架更新起点点位、等待点点位、叠盘架点位 - * 2.终点为供给线更新叠盘架点位 - */ - if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code2"); - - JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - // 终点在叠盘架 - if (StrUtil.equals(jsonEnd.getString("region_id"), RegionTypeEnum.DPJQB.getId())) { - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - // 判断此起点是否是等待点 - if (!StrUtil.equals(jsonStart.getString("col_num"), "9")) { - // 如果不是等待点更新等待点状态 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + jsonStart.getString("region_id") + - "' and block_num = '" + jsonStart.getString("block_num") + - "' and row_num = '" + jsonStart.getString("row_num") + - "' and col_num = '9'").uniqueResult(0); - - jsonEmpWait.put("lock_type", "1"); - pointTab.update(jsonEmpWait); - } - jsonStart.put("lock_type", "1"); - pointTab.update(jsonStart); - - // 更新终点(叠盘架状态) - jsonEnd.put("lock_type", "1"); - pointTab.update(jsonEnd); - - } else { - // 终点在供给线 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - jsonStart.put("lock_type", "1"); - pointTab.update(jsonStart); - } - - taskTab.delete("task_id = '" + task_id + "'"); - } - - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - // 更新任务状态为执行中 - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("car_no", taskObj.getString("car_no")); - taskTab.update(jsonTask); - } - - if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { - /* - * 更改任务状态为完成 - * 1.终点为叠盘架更新叠盘架数量、起点点位状态、等待位状态,更新任务组状态 - * 2.终点为供给线,更新起点载数量 - */ - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); - jsonTask.put("update_optname", SecurityUtils.getCurrentUsername()); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - - // 判断终点在哪里 - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code2"); - - JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - // 终点在叠盘架 - if (StrUtil.equals(jsonEnd.getString("region_id"), RegionTypeEnum.DPJQB.getId())) { - // 更新起点点位状态 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - // 判断起点是不是养生A区空载具 - if (StrUtil.equals(jsonStart.getString("region_id"), RegionTypeEnum.YSAQKTPQ01.getId())) { - // 判断此起点是否是等待点 - if (!StrUtil.equals(jsonStart.getString("col_num"), "9")) { - // 如果不是等待点更新等待点状态 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + jsonStart.getString("region_id") + - "' and block_num = '" + jsonStart.getString("block_num") + - "' and row_num = '" + jsonStart.getString("row_num") + - "' and col_num = '9'").uniqueResult(0); - - jsonEmpWait.put("lock_type", "1"); - pointTab.update(jsonEmpWait); - } - } - - jsonStart.put("point_status", "1"); - jsonStart.put("lock_type", "1"); - jsonStart.put("vehicle_type", ""); - jsonStart.put("vehicle_code", ""); - jsonStart.put("vehicle_qty", 0); - pointTab.update(jsonStart); - - // 更新终点(叠盘架状态) - jsonEnd.put("vehicle_qty", NumberUtil.add(jsonEnd.getString("vehicle_qty"), jsonTask.getString("vehicle_qty"))); - jsonEnd.put("lock_type", "1"); - jsonEnd.put("point_status", "2"); - jsonEnd.put("vehicle_type", jsonTask.getString("vehicle_type")); - pointTab.update(jsonEnd); - - // 更新任务组状态 - JSONObject jsonTask2 = taskTab.query("task_group_id = '" + jsonTask.getString("task_group_id") + "' and task_id <> '" + jsonTask.getString("task_id") + "'").uniqueResult(0); - jsonTask2.put("point_code1", jsonEnd.getString("point_code")); - jsonTask2.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskTab.update(jsonTask2); - } else { - // 终点在供给线线: 更新起点(叠盘架)数量 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - jsonStart.put("vehicle_qty", NumberUtil.sub(jsonStart.getString("vehicle_qty"), "1")); - jsonStart.put("lock_type", "1"); - if (StrUtil.equals(jsonStart.getString("vehicle_qty"), "0")) { - jsonStart.put("point_status", "1"); - jsonStart.put("vehicle_type", ""); - } - pointTab.update(jsonStart); - } - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void findStartPoint() { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 - - JSONArray taskArr = taskTab.query("is_delete = '0' and handle_class = '" + this.THIS_CLASS + "' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - // 创建任务 - JSONObject jsonTask = taskArr.getJSONObject(i); - String vehicle_type = jsonTask.getString("vehicle_type"); - - // 找叠盘架是否与对应的载具类型 - JSONObject jsonDpjStart = pointTab.query("region_id = '" + RegionTypeEnum.DPJQB.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and vehicle_qty <> '0'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDpjStart)) { - // 判断叠盘架是否有任务 有就下一个任务 - boolean is_point = this.isTask(jsonDpjStart.getString("point_code")); - if (!is_point) continue; - - // 更新任务起点 - jsonTask.put("point_code1", jsonDpjStart.getString("point_code")); - jsonTask.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskTab.update(jsonTask); - - // 起点上锁 - jsonDpjStart.put("lock_type", 2); - pointTab.update(jsonDpjStart); - - } else { - // 判断叠盘架载具数量是否是0 - JSONObject jsonDpjStart2 = pointTab.query("region_id = '" + RegionTypeEnum.DPJQB.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and vehicle_qty = '0'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonDpjStart2)) continue; - - // 判断叠盘架是否有任务 - boolean is_point = this.isTask(jsonDpjStart2.getString("point_code")); - if (!is_point) continue; - - // 找叠盘架暂存位是否有空托盘 - JSONObject map = new JSONObject(); - map.put("flag", "1"); - map.put("vehicle_type", vehicle_type); - - JSONObject jsonZcKtp = WQL.getWO("QSCH_GjxCallEmpVehicleTask").addParamMap(map).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonZcKtp)) { - // 创建任务:空载具暂存位 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("暂存位->叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonZcKtp.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonZcKtp.getString("vehicle_code")) - .vehicle_type(jsonZcKtp.getString("vehicle_type")) - .vehicle_qty(jsonZcKtp.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁定起点 - jsonZcKtp.put("lock_type", "2"); - pointTab.update(jsonZcKtp); - } else { - // 空托盘暂存区没有就到养生A区找: 先找到出库等待点 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + - "' and col_num = '9' and can_vehicle_type = '" + vehicle_type + - "' and is_used = '1' and is_delete = '0'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonEmpWait)) continue; - - JSONObject jsonStartPoint = pointTab.query("region_id = '" + jsonEmpWait.getString("region_id") + - "' and block_num = '" + jsonEmpWait.getString("block_num") + - "' and row_num = '" + jsonEmpWait.getString("row_num") + - "' and point_status = '2' and lock_type = '1' order by out_empty_seq DESC").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonStartPoint)) continue; - - // 判断找到的空载具点位是否是等待点 - if (StrUtil.equals(jsonEmpWait.getString("point_code"), jsonStartPoint.getString("point_code"))) { - // 创建 养生A区空载具等待点 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("养生A区-> 叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonStartPoint.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonStartPoint.getString("vehicle_code")) - .vehicle_type(jsonStartPoint.getString("vehicle_type")) - .vehicle_qty(jsonStartPoint.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁起点 - jsonStartPoint.put("lock_type", "2"); - pointTab.update(jsonStartPoint); - } else { - // 判断等待点是否是 未锁定、为空载具 - if (StrUtil.equals(jsonEmpWait.getString("lock_type"), "1")) { - // 创建 养生A区空载具 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("养生A区>叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonStartPoint.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonStartPoint.getString("vehicle_code")) - .vehicle_type(jsonStartPoint.getString("vehicle_type")) - .vehicle_qty(jsonStartPoint.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁起点 - jsonStartPoint.put("lock_type", "2"); - pointTab.update(jsonStartPoint); - // 锁等待点 - jsonEmpWait.put("lock_type", "2"); - pointTab.update(jsonEmpWait); - } else { - continue; - } - } - } - } - } - - } - - - @Override - @Transactional(rollbackFor = Exception.class) -// 虽然是养生A区,应该有二次申请,但是通过判断叠盘架是否有任务来判断做限制 - public String createTask(JSONObject form) { - /* - * 1.先生成确定终点的任务 - * 2.通过findStartPoint()找起点 - * 3.下发给ACS - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); // 生产工单表 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); //点位基础表 - - //任务表【SCH_BASE_Task】 - //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + form.getString("point_code2") + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + form.getString("point_code2") + "存在未完成的任务"); - - - - - String point_code2 = form.getString("point_code2"); - String sub_device_code = point_code2.substring(0, point_code2.indexOf("_")); - - String device_code = pointTab.query("point_code = '" + sub_device_code + "'").uniqueResult(0).getString("device_code"); - - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .task_name("共挤线叫空载具") - .task_status(TaskStatusEnum.SURE_END.getCode()) - .point_code2(point_code2) - .acs_task_type("2") - .vehicle_code(form.getString("vehicle_code")) - .vehicle_type(workOrderObj.getString("vehicle_type")) - .vehicle_qty(form.getIntValue("qty")) - .task_group_id(IdUtil.getLongId()) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void forceFinish(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"2"); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } - } - - @Override - public void cancel(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"0"); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList resultList = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - - String point_code1 = json.getString("point_code1"); - //判断起点是否属于养生A区 - if (point_code1.startsWith("2")) { - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - point_code1 = point_code1.substring(0, 4) + "1" + point_code1.substring(4, 9); - } - - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(point_code1) - .next_device_code(json.getString("point_code3")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - resultList.add(dto); - } - return resultList; - } - - @Transactional(rollbackFor = Exception.class) - public boolean isTask(String point_code) { - /* - * 判断点位是否有任务存在 - */ - WQLObject tab = WQLObject.getWQLObject("SCH_BASE_Task"); - - boolean result; - - JSONObject jsonPointCode1 = tab.query("point_code1 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode2 = tab.query("point_code2 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode3 = tab.query("point_code3 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode4 = tab.query("point_code4 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonPointCode1) && ObjectUtil.isEmpty(jsonPointCode2) && ObjectUtil.isEmpty(jsonPointCode3) && ObjectUtil.isEmpty(jsonPointCode4)) { - result = true; - } else { - result = false; - } - - return result; - } - - -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/HnCallEmptyVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/HnCallEmptyVehicleTask.java new file mode 100644 index 0000000..ff6bec8 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/HnCallEmptyVehicleTask.java @@ -0,0 +1,261 @@ +package org.nl.wms.sch.tasks.callEmpty; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.sch.tasks.RegionTypeEnum; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author: lyd + * @description: 混碾呼叫空托盘 + * @Date: 2022/11/9 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class HnCallEmptyVehicleTask extends AbstractAcsTask { + + private final String THIS_CLASS = HnCallEmptyVehicleTask.class.getName(); + + /** + * 添加任务进行下发 + * + * @return + */ + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList acsTaskArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { // 任务 + JSONObject json = arr.getJSONObject(i); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + acsTaskArr.add(dto); + } + return acsTaskArr; + } + + /** + * @param task 代表一条任务对象 + * @param status 代表wcs任务完成状态: //0:acs,取消,:执行中,2:完成 + * @return + * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 + * @author ldjun + * @created 2019年4月17日 下午8:51:50 + */ + @Override + public void updateTaskStatus(JSONObject task, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String task_id = task.getString("task_id"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + if (StrUtil.equals(status, "0")) { + /* + * 取消任务 + */ + if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + + String point_code1 = task.getString("point_code1"); + if (ObjectUtil.isEmpty(point_code1)) { + JSONObject endPoint = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + endPoint.put("lock_type", "1"); + pointTab.update(endPoint); + } + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("remark", "已取消"); + taskTab.update(taskObj); + } + + if ("1".equals(status)) { + // 更新任务状态为执行中 + taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("car_no", task.getString("car_no")); + taskTab.update(taskObj); + } + + if (StrUtil.equals(status, "2")) { + /* + * 更改任务状态为完成 + */ + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); + taskObj.put("update_optname", SecurityUtils.getCurrentUsername()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + + /** + * 点位更新,起点:空位,解锁; + */ + String point_code1 = taskObj.getString("point_code1"); + JSONObject startPoint = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + startPoint.put("point_status", "1"); + startPoint.put("lock_type", "1"); + pointTab.update(startPoint); + } + } + + /** + * @param form 创建任务需要的参数 + * @return 返回任务标识 + */ + @Override + public String createTask(JSONObject form) { + /* + * 1.先生成确定终点的任务 + * 2.通过findStartPoint()找起点 + * 3.下发给ACS + */ + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); // 生产工单表 + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); //点位基础表 + + //任务表【SCH_BASE_Task】 + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + form.getString("point_code2") + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + form.getString("point_code2") + "存在未完成的任务"); + + + String point_code2 = form.getString("point_code2"); + String sub_device_code = point_code2.substring(0, point_code2.indexOf("_")); + + String device_code = pointTab.query("point_code = '" + sub_device_code + "'").uniqueResult(0).getString("device_code"); + + JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); + + SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("") + .task_name("混碾机叫空载具") + .task_status(TaskStatusEnum.SURE_END.getCode()) + .point_code2(point_code2) + .acs_task_type("2") + .vehicle_code(form.getString("vehicle_code")) + .vehicle_type(workOrderObj.getString("vehicle_type")) + .vehicle_qty(form.getIntValue("qty")) + .task_group_id(org.nl.wms.util.IdUtil.getLongId()) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + /** + * @returninvoke + * @discription 确定任务起点 + * @author ldjun + * @created 2020年6月12日 下午6:01:30 + */ + @Override + public void findStartPoint() { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 + + JSONArray taskArr = taskTab.query("is_delete = '0' and handle_class = '" + this.THIS_CLASS + "' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + // 创建任务 + JSONObject taskObj = taskArr.getJSONObject(i); + String vehicle_type = taskObj.getString("vehicle_type"); + JSONObject param1 = new JSONObject(); + param1.put("flag", "1"); + param1.put("region_code", "KLHJ"); + param1.put("vehicle_type", "%" + vehicle_type + "%"); + // 直接到困料货架找一个空载具 + JSONObject startPoint = WQL.getWO("QSCH_hnCallEmptyVehicle_01").addParamMap(param1).process().uniqueResult(0); + if (ObjectUtil.isEmpty(startPoint)) { + taskObj.put("remark", "困料货架无可用载具!"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } else { + taskObj.put("update_time", DateUtil.now()); + taskObj.put("point_code1", startPoint.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskTab.update(taskObj); + + //锁住起点 + startPoint.put("task_id", taskObj.getString("task_id")); + startPoint.put("lock_type", "2"); + pointTab.update(startPoint); + } + } + } + + /** + * @param task_id 任务标识 + * @return + * @discription 强制结束完成任务 + * @author ldjun + * @created 2020年6月19日 上午10:34:58 + */ + @Override + public void forceFinish(String task_id) { + /* + * 强制完成 + */ + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + this.updateTaskStatus(taskObj,"2"); + else { + throw new BadRequestException("未找到该任务或者任务已完成!"); + } + } + + /** + * 取消任务,货物搬回原点 + * + * @param task_id + */ + @Override + public void cancel(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + this.updateTaskStatus(taskObj,"0"); + else { + throw new BadRequestException("未找到该任务或者任务已完成!"); + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YqxCallEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YqxCallEmpVehicleTask.java deleted file mode 100644 index 97e5e37..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YqxCallEmpVehicleTask.java +++ /dev/null @@ -1,450 +0,0 @@ -package org.nl.wms.sch.tasks.callEmpty; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.sch.tasks.RegionTypeEnum; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -@Service -@RequiredArgsConstructor -@Slf4j -public class YqxCallEmpVehicleTask extends AbstractAcsTask { - private final String THIS_CLASS = YqxCallEmpVehicleTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject taskObj, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = taskObj.getString("task_id"); - JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - if (StrUtil.equals(status, "0")) { - /* - * 取消删除 - * 1.终点为叠盘架更新起点点位、等待点点位、叠盘架点位 - * 2.终点为油漆线更新叠盘架点位 - */ - if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code2"); - - JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - // 终点在叠盘架 - if (StrUtil.equals(jsonEnd.getString("region_id"), RegionTypeEnum.DPJQB.getId())) { - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - // 判断此起点是否是等待点 - if (!StrUtil.equals(jsonStart.getString("col_num"), "9")) { - // 如果不是等待点更新等待点状态 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + jsonStart.getString("region_id") + - "' and block_num = '" + jsonStart.getString("block_num") + - "' and row_num = '" + jsonStart.getString("row_num") + - "' and col_num = '9'").uniqueResult(0); - - jsonEmpWait.put("lock_type", "1"); - pointTab.update(jsonEmpWait); - } - jsonStart.put("lock_type", "1"); - pointTab.update(jsonStart); - - // 更新终点(叠盘架状态) - jsonEnd.put("lock_type", "1"); - pointTab.update(jsonEnd); - - } else { - // 终点在油漆线 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - jsonStart.put("lock_type", "1"); - pointTab.update(jsonStart); - } - - taskTab.delete("task_id = '" + task_id + "'"); - } - - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - // 更新任务状态为执行中 - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("car_no", taskObj.getString("car_no")); - taskTab.update(jsonTask); - } - - if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { - /* - * 更改任务状态为完成 - * 1.终点为叠盘架更新叠盘架数量、起点点位状态、等待位状态,更新任务组状态 - * 2.终点为油漆线,更新起点载具数量 - */ - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); - jsonTask.put("update_optname", SecurityUtils.getCurrentUsername()); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - - // 判断终点在哪里 - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code2"); - - JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - // 终点在叠盘架 - if (StrUtil.equals(jsonEnd.getString("region_id"), RegionTypeEnum.DPJQA.getId())) { - // 更新起点点位状态 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - // 判断起点是不是养生A区空载具 - if (StrUtil.equals(jsonStart.getString("region_id"), RegionTypeEnum.YSAQKTPQ01.getId())) { - // 判断此起点是否是等待点 - if (!StrUtil.equals(jsonStart.getString("col_num"), "9")) { - // 如果不是等待点更新等待点状态 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + jsonStart.getString("region_id") + - "' and block_num = '" + jsonStart.getString("block_num") + - "' and row_num = '" + jsonStart.getString("row_num") + - "' and col_num = '9'").uniqueResult(0); - - jsonEmpWait.put("lock_type", "1"); - pointTab.update(jsonEmpWait); - } - } - - jsonStart.put("point_status", "1"); - jsonStart.put("lock_type", "1"); - jsonStart.put("vehicle_type", ""); - jsonStart.put("vehicle_code", ""); - jsonStart.put("vehicle_qty", 0); - pointTab.update(jsonStart); - - // 更新终点(叠盘架状态) - jsonEnd.put("vehicle_qty", NumberUtil.add(jsonEnd.getString("vehicle_qty"),jsonTask.getString("vehicle_qty"))); - jsonEnd.put("lock_type", "1"); - jsonEnd.put("point_status", "2"); - jsonEnd.put("vehicle_type", jsonTask.getString("vehicle_type")); - pointTab.update(jsonEnd); - - // 更新任务组状态 - JSONObject jsonTask2 = taskTab.query("task_group_id = '" + jsonTask.getString("task_group_id") + "' and task_id <> '" + jsonTask.getString("task_id") + "'").uniqueResult(0); - // 判断叠盘架数量是否 < 需求数量 (暂时只能<需求数量) - if (jsonEnd.getIntValue("vehicle_qty") < jsonTask2.getIntValue("vehicle_qty")) { - jsonTask2.put("vehicle_qty", jsonEnd.getIntValue("vehicle_qty")); - } - jsonTask2.put("point_code1", jsonEnd.getString("point_code")); - jsonTask2.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskTab.update(jsonTask2); - } else { - // 终点在油漆线: 更新起点(叠盘架)数量 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - jsonStart.put("vehicle_qty",NumberUtil.sub(jsonStart.getString("vehicle_qty"),jsonTask.getString("vehicle_qty"))); - jsonStart.put("lock_type", "1"); - if (StrUtil.equals(jsonStart.getString("vehicle_qty"),"0")) { - jsonStart.put("point_status", "1"); - jsonStart.put("vehicle_type", ""); - } - pointTab.update(jsonStart); - } - } - } - - /** - * 虽然是养生A区,应该有二次申请,但是通过判断叠盘架是否有任务来判断做限制 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void findStartPoint() { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 - - JSONArray taskArr = taskTab.query("is_delete = '0' and handle_class = '" + this.THIS_CLASS + "' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - // 创建任务 - JSONObject jsonTask = taskArr.getJSONObject(i); - String vehicle_type = jsonTask.getString("vehicle_type"); - - // 找叠盘架是否与对应的载具类型 - JSONObject jsonDpjStart = pointTab.query("region_id = '" + RegionTypeEnum.DPJQA.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and vehicle_qty <> '0'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDpjStart)) { - // 判断叠盘架是否有任务 有就下一个任务 - boolean is_point = this.isTask(jsonDpjStart.getString("point_code")); - if (!is_point) continue; - - // 判断叠盘架数量是否 < 需求数量 (暂时只能<需求数量) - if (jsonDpjStart.getIntValue("vehicle_qty") < jsonTask.getIntValue("vehicle_qty")) { - jsonTask.put("vehicle_qty", jsonDpjStart.getIntValue("vehicle_qty")); - } - - // 起点上锁 - jsonDpjStart.put("lock_type", "2"); - pointTab.update(jsonDpjStart); - - // 更新任务起点 - jsonTask.put("point_code1", jsonDpjStart.getString("point_code")); - jsonTask.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskTab.update(jsonTask); - - - } else { - // 判断叠盘架载具数量是否是0 - JSONObject jsonDpjStart2 = pointTab.query("region_id = '" + RegionTypeEnum.DPJQA.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and vehicle_qty = '0'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonDpjStart2)) continue; - - // 判断叠盘架是否有任务 - boolean is_point = this.isTask(jsonDpjStart2.getString("point_code")); - if (!is_point) continue; - - // 找叠盘架暂存位是否有空托盘 - JSONObject map = new JSONObject(); - map.put("flag", "1"); - map.put("vehicle_type", vehicle_type); - - JSONObject jsonZcKtp = WQL.getWO("QSCH_YqxCallEmpVehicleTask").addParamMap(map).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonZcKtp)) { - // 创建任务:空载具暂存位 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("暂存位>叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonZcKtp.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonZcKtp.getString("vehicle_code")) - .vehicle_type(jsonZcKtp.getString("vehicle_type")) - .vehicle_qty(jsonZcKtp.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁定起点 - jsonZcKtp.put("lock_type", "2"); - pointTab.update(jsonZcKtp); - } else { - // 空托盘暂存区没有就到养生A区找: 先找到出库等待点 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + - "' and col_num = '9' and can_vehicle_type = '" + vehicle_type + - "' and is_used = '1' and is_delete = '0'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonEmpWait)) continue; - - JSONObject jsonStartPoint = pointTab.query("region_id = '" + jsonEmpWait.getString("region_id") + - "' and block_num = '" + jsonEmpWait.getString("block_num") + - "' and row_num = '" + jsonEmpWait.getString("row_num") + - "' and point_status = '2' and lock_type = '1' order by out_empty_seq DESC").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonStartPoint)) continue; - - // 判断找到的空载具点位是否是等待点 - if (StrUtil.equals(jsonEmpWait.getString("point_code"), jsonStartPoint.getString("point_code"))) { - // 创建 养生A区空载具等待点 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("养生A区>叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonStartPoint.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonStartPoint.getString("vehicle_code")) - .vehicle_type(jsonStartPoint.getString("vehicle_type")) - .vehicle_qty(jsonStartPoint.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁起点 - jsonStartPoint.put("lock_type", "2"); - pointTab.update(jsonStartPoint); - } else { - // 判断等待点是否是 未锁定 - if (StrUtil.equals(jsonEmpWait.getString("lock_type"), "1")) { - // 创建 养生A区空载具 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("养生A区>叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonStartPoint.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonStartPoint.getString("vehicle_code")) - .vehicle_type(jsonStartPoint.getString("vehicle_type")) - .vehicle_qty(jsonStartPoint.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁起点 - jsonStartPoint.put("lock_type", "2"); - pointTab.update(jsonStartPoint); - // 锁等待点 - jsonEmpWait.put("lock_type", "2"); - pointTab.update(jsonEmpWait); - } else { - continue; - - } - } - } - } - } - - } - - @Override - @Transactional(rollbackFor = Exception.class) - public String createTask(JSONObject form) { - /* - * 1.先生成确定终点的任务 - * 2.通过findStartPoint()找起点 - * 3.下发给ACS - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); // 生产工单表 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); //点位基础表 - - //任务表【SCH_BASE_Task】 - //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + form.getString("point_code2") + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + form.getString("point_code2") + "存在未完成的任务"); - - - - - String point_code2 = form.getString("point_code2"); - String sub_device_code = point_code2.substring(0, point_code2.indexOf("_")); - - String device_code = pointTab.query("point_code = '" + sub_device_code + "'").uniqueResult(0).getString("device_code"); - - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .task_name("油漆线叫空载具") - .task_status(TaskStatusEnum.SURE_END.getCode()) - .point_code2(point_code2) - .acs_task_type("2") - .vehicle_code(form.getString("vehicle_code")) - .vehicle_type(workOrderObj.getString("vehicle_type")) - .vehicle_qty(form.getIntValue("qty")) - .task_group_id(org.nl.wms.util.IdUtil.getLongId()) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void forceFinish(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"2"); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } - } - - - @Override - public void cancel(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"0"); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '"+THIS_CLASS+"' and task_status = '"+TaskStatusEnum.START_AND_POINT.getCode()+"' and is_delete ='0'").getResultJSONArray(0); - - ArrayList resultList = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - String point_code1 = json.getString("point_code1"); - //判断起点是否属于养生A区 - if (point_code1.startsWith("2")) { - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - point_code1 = point_code1.substring(0, 4) + "1" + point_code1.substring(4, 9); - } - - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(point_code1) - .next_device_code(json.getString("point_code3")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - resultList.add(dto); - } - return resultList; - } - - @Transactional(rollbackFor = Exception.class) - public boolean isTask(String point_code) { - /* - * 判断点位是否有任务存在 - */ - WQLObject tab = WQLObject.getWQLObject("SCH_BASE_Task"); - - boolean result; - - JSONObject jsonPointCode1 = tab.query("point_code1 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode2 = tab.query("point_code2 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode3 = tab.query("point_code3 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode4 = tab.query("point_code4 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonPointCode1) && ObjectUtil.isEmpty(jsonPointCode2) && ObjectUtil.isEmpty(jsonPointCode3) && ObjectUtil.isEmpty(jsonPointCode4)) { - result = true; - } else { - result = false; - } - - return result; - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YzjCallEmptyVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YzjCallEmptyVehicleTask.java new file mode 100644 index 0000000..4aaa9c3 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YzjCallEmptyVehicleTask.java @@ -0,0 +1,310 @@ +package org.nl.wms.sch.tasks.callEmpty; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.util.IdUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author: lyd + * @description: 压制机呼叫空钢托盘 + * @Date: 2022/11/10 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class YzjCallEmptyVehicleTask extends AbstractAcsTask { + private final String THIS_CLASS = YzjCallEmptyVehicleTask.class.getName(); + /** + * 添加任务进行下发 + * + * @return + */ + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList acsTaskArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { // 任务 + JSONObject json = arr.getJSONObject(i); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + acsTaskArr.add(dto); + } + return acsTaskArr; + } + + /** + * @param task 代表一条任务对象 + * @param status 代表wcs任务完成状态: //0:acs,取消,1:执行中,2:完成 + * @return + * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 + * @author ldjun + * @created 2019年4月17日 下午8:51:50 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject task, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); + + JSONObject requestObj = task.getJSONObject("request_param"); + String task_id = task.getString("task_id"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + String point_code1 = task.getString("point_code1"); + + if (StrUtil.equals(status, "0")) { + /* + * 取消任务 + */ + if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + if (ObjectUtil.isNotEmpty(point_code1)) { + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("remark", "已取消"); + taskTab.update(taskObj); + + JSONObject startPoint = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + startPoint.put("lock_type", "1"); + pointTab.update(startPoint); + } + } + + if ("1".equals(status)) { + // 更新任务状态为执行中 + taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("car_no", task.getString("car_no")); + taskTab.update(taskObj); + } + + if (StrUtil.equals(status,"2")) { + /* + * 更改任务状态为完成 + */ + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); + taskObj.put("update_optname", SecurityUtils.getCurrentUsername()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + + JSONObject startPoint = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + if (point_code1.startsWith("L")) { // 入窑缓存位 + // 插入出库单 + JSONObject regionIoObj = new JSONObject(); + regionIoObj.put("iostorinv_id", IdUtil.getLongId()); + regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); + regionIoObj.put("buss_date", DateUtil.today()); + regionIoObj.put("io_type", "2"); // 出库 + regionIoObj.put("region_id", startPoint.getString("region_id")); + regionIoObj.put("region_code", startPoint.getString("region_code")); + regionIoObj.put("region_name", startPoint.getString("region_name")); + regionIoObj.put("material_id", taskObj.getString("material_id")); + regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); + regionIoObj.put("qty", requestObj.getString("qty")); + regionIoObj.put("bill_status", "3"); + regionIoObj.put("start_point_code", taskObj.getString("point_code1")); + regionIoObj.put("end_point_code", taskObj.getString("point_code2")); + regionIoObj.put("create_mode", "2"); + regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); + regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); + regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); + regionIoObj.put("create_time", DateUtil.now()); + regionIoTab.insert(regionIoObj); + // 点位更新,起点:空位,解锁; + startPoint.put("point_status", "1"); + startPoint.put("lock_type", "1"); + startPoint.put("task_id", ""); + startPoint.put("pcsn", ""); + startPoint.put("ivt_qty", "0"); + startPoint.put("material_id", ""); + startPoint.put("instorage_time", ""); + startPoint.put("is_full", "2"); + startPoint.put("standing_time", "0"); + startPoint.put("vehicle_type", ""); + startPoint.put("vehicle_code", ""); + } else { // 钢托盘每次就一个 --- 如果是堆叠位5需要更新设备状态?? + startPoint.put("point_status", "1"); + startPoint.put("lock_type", "1"); + startPoint.put("vehicle_qty", "0"); + } + pointTab.update(startPoint); + } + } + + /** + * @param form 创建任务需要的参数 + * @return 返回任务标识 + */ + @Override + public String createTask(JSONObject form) { + /* + * 1.先生成确定终点的任务 + * 2.通过findStartPoint()找起点 + * 3.下发给ACS + */ + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); // 生产工单表 + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); //点位基础表 + + //任务表【SCH_BASE_Task】 + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + form.getString("point_code2") + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + form.getString("point_code2") + "存在未完成的任务"); + + + String point_code2 = form.getString("point_code2"); + String sub_device_code = point_code2.substring(0, point_code2.indexOf("_")); + + String device_code = pointTab.query("point_code = '" + sub_device_code + "'").uniqueResult(0).getString("device_code"); + + JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); + + SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("") + .task_name("压制机叫空载具") + .task_status(TaskStatusEnum.SURE_END.getCode()) + .point_code2(point_code2) + .acs_task_type("2") + .vehicle_code(form.getString("vehicle_code")) + .vehicle_type(workOrderObj.getString("vehicle_type")) + .vehicle_qty(form.getIntValue("qty")) + .task_group_id(org.nl.wms.util.IdUtil.getLongId()) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + /** + * @returninvoke + * @discription 确定任务起点 + * @author ldjun + * @created 2020年6月12日 下午6:01:30 + */ + @Override + public void findStartPoint() { + // 找托盘:先找库存上是否有半满托盘,如果没有就到KGTDDW05找空钢托盘 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 + JSONArray taskArr = taskTab.query("is_delete = '0' and handle_class = '" + this.THIS_CLASS + "' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + // 创建任务 + JSONObject taskObj = taskArr.getJSONObject(i); + String vehicle_type = taskObj.getString("vehicle_type"); + // 寻找入窑暂存区是否有半托 + JSONObject noFull = new JSONObject(); + noFull.put("flag", "1"); + noFull.put("region_code", "RYZCQ"); + noFull.put("material_id", taskObj.getString("material_id")); + JSONObject noFullPoint = WQL.getWO("QSCH_yzjCallEmptyVehicle_01").addParamMap(noFull).process().uniqueResult(0); + if (ObjectUtil.isNotEmpty(noFullPoint)) { // 找到半满托盘,叫料出库 + taskObj.put("update_time", DateUtil.now()); + taskObj.put("point_code1", noFullPoint.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskTab.update(taskObj); + + //锁住起点 + noFullPoint.put("task_id", taskObj.getString("task_id")); + noFullPoint.put("lock_type", "2"); + pointTab.update(noFullPoint); + } else { // 到KGTDDW05找空钢托盘 + JSONObject param = new JSONObject(); + param.put("flag", "2"); + param.put("region_code", "KGTCPQ"); + param.put("point_code", "KGTDDW05"); + JSONObject kgtPoint = WQL.getWO("QSCH_yzjCallEmptyVehicle_01").addParamMap(param).process().uniqueResult(0); + if (ObjectUtil.isNotEmpty(kgtPoint)) { + taskObj.put("update_time", DateUtil.now()); + taskObj.put("point_code1", kgtPoint.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskTab.update(taskObj); + + //锁住起点 + kgtPoint.put("task_id", taskObj.getString("task_id")); + kgtPoint.put("lock_type", "2"); + pointTab.update(kgtPoint); + } else { + taskObj.put("remark", "未找到可用的载具!"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } + } + } + } + + /** + * @param task_id 任务标识 + * @return + * @discription 强制结束完成任务 + * @author ldjun + * @created 2020年6月19日 上午10:34:58 + */ + @Override + public void forceFinish(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + this.updateTaskStatus(taskObj,"2"); + else { + throw new BadRequestException("未找到该任务或者任务已完成!"); + } + } + + /** + * 取消任务,货物搬回原点 + * + * @param task_id + */ + @Override + public void cancel(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + this.updateTaskStatus(taskObj,"0"); + else { + throw new BadRequestException("未找到该任务或者任务已完成!"); + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_GjxCallEmpVehicleTask.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_GjxCallEmpVehicleTask.wql deleted file mode 100644 index b76c2fb..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_GjxCallEmpVehicleTask.wql +++ /dev/null @@ -1,60 +0,0 @@ -[交易说明] - 交易名: 共挤线申请空盘 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.vehicle_type TYPEAS s_string - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - QUERY - SELECT - * - FROM - SCH_BASE_Point - WHERE - is_used = '1' - AND is_delete = '0' - AND lock_type = '1' - AND point_status = '2' - AND region_code = 'KTPHCQB01' - - OPTION 输入.vehicle_type <> "" - can_vehicle_type = 输入.vehicle_type - ENDOPTION - - ENDSELECT - ENDQUERY - ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_fjCallEmptyVehicle_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_fjCallEmptyVehicle_01.wql new file mode 100644 index 0000000..5c66b1f --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_fjCallEmptyVehicle_01.wql @@ -0,0 +1,88 @@ +[交易说明] + 交易名: 分拣码垛呼叫空载具 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.region_code TYPEAS s_string + 输入.material_id TYPEAS s_string + 输入.vehicle_type TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + IF 输入.flag = "1" + QUERY + SELECT + p.point_id, + p.point_code, + p.point_name + FROM + SCH_BASE_Point p + WHERE + lock_type = '1' + AND is_used = '1' + AND is_delete = '0' + AND is_full = '2' + AND point_status = '3' + AND point_type = '1' + OPTION 输入.region_code <> "" + p.region_code = 输入.region_code + ENDOPTION + ORDER BY col_num,row_num,layer_num + ENDSELECT + ENDQUERY + ENDIF + IF 输入.flag = "2" + QUERY + SELECT + p.point_id, + p.point_code, + p.point_name + FROM + SCH_BASE_Point p + WHERE + lock_type = '1' + AND is_used = '1' + AND is_delete = '0' + AND point_status = '2' + AND point_type = '2' + OPTION 输入.region_code <> "" + p.region_code = 输入.region_code + ENDOPTION + OPTION 输入.vehicle_type <> "" + p.vehicle_type = 输入.vehicle_type + ENDOPTION + ORDER BY col_num,row_num,layer_num + ENDSELECT + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_hnCallEmptyVehicle_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_hnCallEmptyVehicle_01.wql new file mode 100644 index 0000000..2dcd046 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_hnCallEmptyVehicle_01.wql @@ -0,0 +1,65 @@ +[交易说明] + 交易名: 混碾机呼叫空载具 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.region_code TYPEAS s_string + 输入.material_id TYPEAS s_string + 输入.vehicle_type TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## +IF 输入.flag = "1" + QUERY + SELECT + p.point_id, + p.point_code, + p.point_name + FROM + SCH_BASE_Point p + WHERE + lock_type = '1' + AND is_used = '1' + AND is_delete = '0' + AND point_status = '2' + OPTION 输入.vehicle_type <> "" + p.can_vehicle_type like 输入.vehicle_type + ENDOPTION + OPTION 输入.region_code <> "" + p.region_code = 输入.region_code + ENDOPTION + ORDER BY col_num,row_num,layer_num + ENDSELECT + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_yzjCallEmptyVehicle_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_yzjCallEmptyVehicle_01.wql new file mode 100644 index 0000000..c92d852 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_yzjCallEmptyVehicle_01.wql @@ -0,0 +1,85 @@ +[交易说明] + 交易名:压制机呼叫空钢托盘 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.region_code TYPEAS s_string + 输入.material_id TYPEAS s_string + 输入.point_code TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + IF 输入.flag = "1" + QUERY + SELECT + p.point_id, + p.point_code, + p.point_name + FROM + SCH_BASE_Point p + WHERE + lock_type = '1' + AND is_used = '1' + AND is_full = '2' + AND is_delete = '0' + AND point_status = '2' + OPTION 输入.region_code <> "" + p.region_code = 输入.region_code + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + IF 输入.flag = "2" + QUERY + SELECT + p.point_id, + p.point_code, + p.point_name + FROM + SCH_BASE_Point p + WHERE + lock_type = '1' + AND is_used = '1' + AND is_delete = '0' + AND point_status = '2' + AND vehicle_qty > '0' + OPTION 输入.region_code <> "" + p.region_code = 输入.region_code + ENDOPTION + OPTION 输入.point_code <> "" + p.point_code = 输入.point_code + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/FjCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/FjCallMaterialTask.java new file mode 100644 index 0000000..c091d03 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/FjCallMaterialTask.java @@ -0,0 +1,271 @@ +package org.nl.wms.sch.tasks.callMaterial; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.util.IdUtil; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author: lyd + * @description: 分拣叫料出库 + * @Date: 2022/11/11 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class FjCallMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = FjCallMaterialTask.class.getName(); + /** + * 添加任务进行下发 + * + * @return + */ + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList acsTaskArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { // 任务 + JSONObject json = arr.getJSONObject(i); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + acsTaskArr.add(dto); + } + return acsTaskArr; + } + + /** + * @param task 代表一条任务对象 + * @param status 代表wcs任务完成状态: //0:acs,取消,:执行中,2:完成 + * @return + * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 + * @author ldjun + * @created 2019年4月17日 下午8:51:50 + */ + @Override + public void updateTaskStatus(JSONObject task, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String task_id = task.getString("task_id"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + // 物料点 + JSONObject material_point = pointTab.query("point_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); + //任务取消 + if (StrUtil.equals(status, "0")) { + // 取消删除任务 + if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("remark", "已取消"); + taskTab.update(taskObj); + + if (ObjectUtil.isNotEmpty(material_point)) { + // 点位解锁 + material_point.put("lock_type", "1"); + pointTab.update(material_point); + } + } + + if ("1".equals(status)) { + // 更新任务状态为执行中 + taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("car_no", taskObj.getString("car_no")); + taskTab.update(taskObj); + } + + if (StrUtil.equals(status, "2")) { + // 更改任务状态为完成 + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + + JSONObject requestObj = task.getJSONObject("request_param"); + + //区域出入表【st_ivt_regionIO】 + WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); + JSONObject regionIoObj = new JSONObject(); + regionIoObj.put("iostorinv_id", IdUtil.getLongId()); + regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); + regionIoObj.put("buss_date", DateUtil.today()); + regionIoObj.put("io_type", "2"); // 出库 + regionIoObj.put("region_id", material_point.getString("region_id")); + regionIoObj.put("region_code", material_point.getString("region_code")); + regionIoObj.put("region_name", material_point.getString("region_name")); + regionIoObj.put("material_id", taskObj.getString("material_id")); + regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); + regionIoObj.put("qty", requestObj.getString("qty")); + regionIoObj.put("bill_status", "3"); + regionIoObj.put("start_point_code", taskObj.getString("point_code1")); + regionIoObj.put("end_point_code", taskObj.getString("point_code2")); + regionIoObj.put("create_mode", "2"); + regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); + regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); + regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); + regionIoObj.put("create_time", DateUtil.now()); + regionIoTab.insert(regionIoObj); + + //完成后 + // 物料点位解锁 并设置空位 + material_point.put("lock_type", "1"); + material_point.put("point_status", "1"); + material_point.put("task_id", ""); + material_point.put("pcsn", ""); + material_point.put("ivt_qty", "0"); + material_point.put("material_id", ""); + material_point.put("instorage_time", ""); + material_point.put("is_full", "2"); + material_point.put("standing_time", "0"); + material_point.put("vehicle_type", ""); + material_point.put("vehicle_code", ""); + pointTab.update(material_point); + } + } + + /** + * @param form 创建任务需要的参数 + * @return 返回任务标识 + */ + @Override + public String createTask(JSONObject form) { + String point_code2 = form.getString("point_code2"); + String vehicle_type = form.getString("vehicle_type"); + String vehicle_code = form.getString("vehicle_code"); + String qty = form.getString("material_num"); + + //生产工单表【PDM_BD_WorkOrder】 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + //任务表【SCH_BASE_Task】 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + point_code2 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code2 + "存在未完成的任务"); + //点位基础表【SCH_BASE_Point】 + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); + String device_code = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0).getString("device_code"); + JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); + + SchTaskDto dto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("task_type") + .task_name("分拣出库") + .material_qty(qty) + .task_status(TaskStatusEnum.SURE_END.getCode()) + .point_code2(point_code2) + .vehicle_code(vehicle_code) + .material_info_id(workOrderObj.getLong("workorder_id")) + .material_id(workOrderObj.getLong("material_id")) + .vehicle_type(vehicle_type) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .request_param(form.toJSONString()) + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + + //创建好立即下发 + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + /** + * @returninvoke + * @discription 确定任务起点 + * @author ldjun + * @created 2020年6月12日 下午6:01:30 + */ + @Override + public void findStartPoint() { + // 到出窑缓存区找一托物料 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 + JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + JSONObject taskObj = taskArr.getJSONObject(i); + String material_id = taskObj.getString("material_id"); + String vehicle_type = taskObj.getString("vehicle_type"); + JSONObject queryParam = new JSONObject(); + queryParam.put("flag", "1"); + queryParam.put("material_id", material_id); + queryParam.put("region_code", "CYZCQ"); + queryParam.put("vehicle_type", "%" + vehicle_type + "%"); + // 到出窑暂存区找 + JSONObject json1 = WQL.getWO("QSCH_cyCallMaterial_01").addParamMap(queryParam).process().uniqueResult(0); + if (ObjectUtil.isNotEmpty(json1)) { + // 拿到点位 + JSONObject material_point = pointTab.query("point_id = '" + json1.getString("point_id") + "' and lock_type = '1'").uniqueResult(0); + if (ObjectUtil.isEmpty(material_point)) throw new BadRequestException("数据错误,请校验!"); + // 物料点位上锁 + material_point.put("lock_type", "2"); + pointTab.update(material_point); + + taskObj.put("point_code1", material_point.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("acs_task_type", "2"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } else { + taskObj.put("remark", "出窑暂存区无所需物料"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } + + } + } + + /** + * @param task_id 任务标识 + * @return + * @discription 强制结束完成任务 + * @author ldjun + * @created 2020年6月19日 上午10:34:58 + */ + @Override + public void forceFinish(String task_id) { + + } + + /** + * 取消任务,货物搬回原点 + * + * @param task_id + */ + @Override + public void cancel(String task_id) { + + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/SzCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/SzCallMaterialTask.java new file mode 100644 index 0000000..5ca6a3a --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/SzCallMaterialTask.java @@ -0,0 +1,283 @@ +package org.nl.wms.sch.tasks.callMaterial; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.util.IdUtil; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author: lyd + * @description: 烧制工序叫料 - 入窑位 + * @Date: 2022/11/10 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class SzCallMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = SzCallMaterialTask.class.getName(); + /** + * 添加任务进行下发 + * + * @return + */ + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList acsTaskArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { // 任务 + JSONObject json = arr.getJSONObject(i); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + acsTaskArr.add(dto); + } + return acsTaskArr; + } + + /** + * @param task 代表一条任务对象 + * @param status 代表wcs任务完成状态: //0:acs,取消,:执行中,2:完成 + * @return + * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 + * @author ldjun + * @created 2019年4月17日 下午8:51:50 + */ + @Override + public void updateTaskStatus(JSONObject task, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String task_id = task.getString("task_id"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + // 物料点 + JSONObject material_point = pointTab.query("point_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); + //任务取消 + if (StrUtil.equals(status, "0")) { + // 取消删除任务 + if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("remark", "已取消"); + taskTab.update(taskObj); + + if (ObjectUtil.isNotEmpty(material_point)) { + // 点位解锁 + material_point.put("lock_type", "1"); + pointTab.update(material_point); + } + } + + if ("1".equals(status)) { + // 更新任务状态为执行中 + taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("car_no", taskObj.getString("car_no")); + taskTab.update(taskObj); + } + + if (StrUtil.equals(status, "2")) { + // 更改任务状态为完成 + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + + JSONObject requestObj = task.getJSONObject("request_param"); + + //区域出入表【st_ivt_regionIO】 + WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); + JSONObject regionIoObj = new JSONObject(); + regionIoObj.put("iostorinv_id", IdUtil.getLongId()); + regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); + regionIoObj.put("buss_date", DateUtil.today()); + regionIoObj.put("io_type", "2"); // 出库 + regionIoObj.put("region_id", material_point.getString("region_id")); + regionIoObj.put("region_code", material_point.getString("region_code")); + regionIoObj.put("region_name", material_point.getString("region_name")); + regionIoObj.put("material_id", taskObj.getString("material_id")); + regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); + regionIoObj.put("qty", requestObj.getString("qty")); + regionIoObj.put("bill_status", "3"); + regionIoObj.put("start_point_code", taskObj.getString("point_code1")); + regionIoObj.put("end_point_code", taskObj.getString("point_code2")); + regionIoObj.put("create_mode", "2"); + regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); + regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); + regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); + regionIoObj.put("create_time", DateUtil.now()); + regionIoTab.insert(regionIoObj); + + //完成后 + // 物料点位解锁 并设置空位 + material_point.put("lock_type", "1"); + material_point.put("point_status", "1"); + material_point.put("task_id", ""); + material_point.put("pcsn", ""); + material_point.put("ivt_qty", "0"); + material_point.put("material_id", ""); + material_point.put("instorage_time", ""); + material_point.put("is_full", "2"); + material_point.put("standing_time", "0"); + material_point.put("vehicle_type", ""); + material_point.put("vehicle_code", ""); + pointTab.update(material_point); + } + } + + /** + * @param form 创建任务需要的参数 + * @return 返回任务标识 + */ + @Override + public String createTask(JSONObject form) { + String point_code2 = form.getString("point_code2"); + String vehicle_type = form.getString("vehicle_type"); + String vehicle_code = form.getString("vehicle_code"); + String qty = form.getString("material_num"); + + //生产工单表【PDM_BD_WorkOrder】 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + //任务表【SCH_BASE_Task】 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + point_code2 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code2 + "存在未完成的任务"); + //点位基础表【SCH_BASE_Point】 + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); + String device_code = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0).getString("device_code"); + JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); + + SchTaskDto dto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("task_type") + .task_name("烧制出库") + .material_qty(qty) + .task_status(TaskStatusEnum.SURE_END.getCode()) + .point_code2(point_code2) + .vehicle_code(vehicle_code) + .material_info_id(workOrderObj.getLong("workorder_id")) + .material_id(workOrderObj.getLong("material_id")) + .vehicle_type(vehicle_type) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .request_param(form.toJSONString()) + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + + //创建好立即下发 + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + /** + * @returninvoke + * @discription 确定任务起点 + * @author ldjun + * @created 2020年6月12日 下午6:01:30 + */ + @Override + public void findStartPoint() { + // 到入窑缓存区找一托物料 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 + JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + JSONObject taskObj = taskArr.getJSONObject(i); + String material_id = taskObj.getString("material_id"); + String vehicle_type = taskObj.getString("vehicle_type"); + JSONObject queryParam = new JSONObject(); + queryParam.put("flag", "1"); + queryParam.put("material_id", material_id); + queryParam.put("region_code", "RYZCQ"); + queryParam.put("vehicle_type", "%" + vehicle_type + "%"); + // 到入窑暂存区找,优先找满拖的 + JSONObject json1 = WQL.getWO("QSCH_szCallMaterial_01").addParamMap(queryParam).process().uniqueResult(0); + if (ObjectUtil.isNotEmpty(json1)) { + // 拿到点位 + JSONObject material_point = pointTab.query("point_id = '" + json1.getString("point_id") + "' and lock_type = '1'").uniqueResult(0); + if (ObjectUtil.isEmpty(material_point)) throw new BadRequestException("数据错误,请校验!"); + // 物料点位上锁 + material_point.put("lock_type", "2"); + pointTab.update(material_point); + + taskObj.put("point_code1", material_point.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("acs_task_type", "2"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } else { + taskObj.put("remark", "入窑暂存区无所需物料"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } + + } + } + + /** + * @param task_id 任务标识 + * @return + * @discription 强制结束完成任务 + * @author ldjun + * @created 2020年6月19日 上午10:34:58 + */ + @Override + public void forceFinish(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + this.updateTaskStatus(taskObj,"2"); + else { + throw new BadRequestException("未找到该任务或者任务已完成!"); + } + } + + /** + * 取消任务,货物搬回原点 + * + * @param task_id + */ + @Override + public void cancel(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + this.updateTaskStatus(taskObj,"0"); + else { + throw new BadRequestException("未找到该任务或者任务已完成!"); + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YzjCallMaterialTask.java similarity index 81% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YzjCallMaterialTask.java index 7c31707..a939bce 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YzjCallMaterialTask.java @@ -19,24 +19,60 @@ import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.tasks.AcsTaskDto; import org.nl.wms.util.IdUtil; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; - /** - *油漆线叫料 + * @author: lyd + * @description: 压制机叫料工序 + * @Date: 2022/11/10 */ @Service @RequiredArgsConstructor @Slf4j -public class YqxCallMaterialTask extends AbstractAcsTask { - private final String THIS_CLASS = YqxCallMaterialTask.class.getName(); - - +public class YzjCallMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = YzjCallMaterialTask.class.getName(); + /** + * 添加任务进行下发 + * + * @return + */ + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList acsTaskArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { // 任务 + JSONObject json = arr.getJSONObject(i); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + acsTaskArr.add(dto); + } + return acsTaskArr; + } + + /** + * @param task 代表一条任务对象 + * @param status 代表wcs任务完成状态: //0:acs,取消,:执行中,2:完成 + * @return + * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 + * @author ldjun + * @created 2019年4月17日 下午8:51:50 + */ @Override - @Transactional(rollbackFor = Exception.class) public void updateTaskStatus(JSONObject task, String status) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); @@ -82,13 +118,13 @@ public class YqxCallMaterialTask extends AbstractAcsTask { regionIoObj.put("iostorinv_id", IdUtil.getLongId()); regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); regionIoObj.put("buss_date", DateUtil.today()); - regionIoObj.put("io_type", "2"); + regionIoObj.put("io_type", "2"); // 出库 regionIoObj.put("region_id", material_point.getString("region_id")); regionIoObj.put("region_code", material_point.getString("region_code")); regionIoObj.put("region_name", material_point.getString("region_name")); regionIoObj.put("material_id", taskObj.getString("material_id")); regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); - regionIoObj.put("qty", requestObj.getString("material_num")); + regionIoObj.put("qty", requestObj.getString("qty")); regionIoObj.put("bill_status", "3"); regionIoObj.put("start_point_code", taskObj.getString("point_code1")); regionIoObj.put("end_point_code", taskObj.getString("point_code2")); @@ -104,91 +140,28 @@ public class YqxCallMaterialTask extends AbstractAcsTask { material_point.put("lock_type", "1"); material_point.put("point_status", "1"); material_point.put("task_id", ""); + material_point.put("pcsn", ""); + material_point.put("ivt_qty", "0"); material_point.put("material_id", ""); + material_point.put("instorage_time", ""); + material_point.put("is_full", "2"); + material_point.put("standing_time", "0"); material_point.put("vehicle_type", ""); material_point.put("vehicle_code", ""); pointTab.update(material_point); } - } + /** + * @param form 创建任务需要的参数 + * @return 返回任务标识 + */ @Override - public void findStartPoint() { - /* - * 根据业务找对应的起点 - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 - JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - JSONObject taskObj = taskArr.getJSONObject(i); - String material_id = taskObj.getString("material_id"); - String vehicle_type = taskObj.getString("vehicle_type"); - JSONObject queryParam = new JSONObject(); - queryParam.put("flag", "1"); - queryParam.put("material_id", material_id); - queryParam.put("region_code", "YSQA01"); - queryParam.put("vehicle_type", "%" + vehicle_type + "%"); - //1、根据物料id查找养生A区物料点 - JSONObject json1 = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(queryParam).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(json1)) { - // 拿到点位 - JSONObject material_point = pointTab.query("point_id = '" + json1.getString("point_id") + "' and lock_type = '1'").uniqueResult(0); - if (ObjectUtil.isEmpty(material_point)) throw new BadRequestException("数据错误,请校验!"); - // 物料点位上锁 - material_point.put("lock_type", "2"); - pointTab.update(material_point); - - taskObj.put("point_code1", material_point.getString("point_code")); - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskObj.put("acs_task_type", "2"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } else { - taskObj.put("remark", "养生A区无所需物料"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } - - } - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList acsTaskArr = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - String point_code =json.getString("point_code1"); - String newPoint = point_code.substring(0, 4) + "1" + point_code.substring(4, 9); - - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(newPoint) - .next_device_code(json.getString("point_code3")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - acsTaskArr.add(dto); - } - return acsTaskArr; - } - - @Override - public String createTask(JSONObject whereJson) { - String point_code2 = whereJson.getString("point_code2"); - String vehicle_type = whereJson.getString("vehicle_type"); - String vehicle_code = whereJson.getString("vehicle_code"); - String qty = whereJson.getString("material_num"); + public String createTask(JSONObject form) { + String point_code2 = form.getString("point_code2"); + String vehicle_type = form.getString("vehicle_type"); + String vehicle_code = form.getString("vehicle_code"); + String qty = form.getString("material_num"); //生产工单表【PDM_BD_WorkOrder】 WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); @@ -207,7 +180,7 @@ public class YqxCallMaterialTask extends AbstractAcsTask { .task_id(IdUtil.getLongId()) .task_code(CodeUtil.getNewCode("TASK_CODE")) .task_type("task_type") - .task_name("油漆线叫料") + .task_name("压制机叫料") .material_qty(qty) .task_status(TaskStatusEnum.SURE_END.getCode()) .point_code2(point_code2) @@ -217,7 +190,7 @@ public class YqxCallMaterialTask extends AbstractAcsTask { .vehicle_type(vehicle_type) .handle_class(THIS_CLASS) .create_time(DateUtil.now()) - .request_param(whereJson.toJSONString()) + .request_param(form.toJSONString()) .build(); JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); taskTab.insert(json); @@ -227,6 +200,60 @@ public class YqxCallMaterialTask extends AbstractAcsTask { return String.valueOf(dto.getTask_id()); } + /** + * @returninvoke + * @discription 确定任务起点 + * @author ldjun + * @created 2020年6月12日 下午6:01:30 + */ + @Override + public void findStartPoint() { + /* + * 根据业务找对应的起点,直接到困料货架获取 + */ + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 + JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + JSONObject taskObj = taskArr.getJSONObject(i); + String material_id = taskObj.getString("material_id"); + String vehicle_type = taskObj.getString("vehicle_type"); + JSONObject queryParam = new JSONObject(); + queryParam.put("flag", "1"); + queryParam.put("material_id", material_id); + queryParam.put("region_code", "KLHJ"); + queryParam.put("vehicle_type", "%" + vehicle_type + "%"); + //1、 + JSONObject json1 = WQL.getWO("QSCH_yzjCallMaterial_01").addParamMap(queryParam).process().uniqueResult(0); + if (ObjectUtil.isNotEmpty(json1)) { + // 拿到点位 + JSONObject material_point = pointTab.query("point_id = '" + json1.getString("point_id") + "' and lock_type = '1'").uniqueResult(0); + if (ObjectUtil.isEmpty(material_point)) throw new BadRequestException("数据错误,请校验!"); + // 物料点位上锁 + material_point.put("lock_type", "2"); + pointTab.update(material_point); + + taskObj.put("point_code1", material_point.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("acs_task_type", "2"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } else { + taskObj.put("remark", "困料货架无所需物料"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } + + } + } + + /** + * @param task_id 任务标识 + * @return + * @discription 强制结束完成任务 + * @author ldjun + * @created 2020年6月19日 上午10:34:58 + */ @Override public void forceFinish(String task_id) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); @@ -238,7 +265,11 @@ public class YqxCallMaterialTask extends AbstractAcsTask { } } - + /** + * 取消任务,货物搬回原点 + * + * @param task_id + */ @Override public void cancel(String task_id) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); @@ -246,7 +277,7 @@ public class YqxCallMaterialTask extends AbstractAcsTask { if (ObjectUtil.isNotEmpty(taskObj)) this.updateTaskStatus(taskObj,"0"); else { - throw new BadRequestException("任务已完成不能取消!"); + throw new BadRequestException("未找到该任务或者任务已完成!"); } } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_cyCallMaterial_01.wql similarity index 94% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_cyCallMaterial_01.wql index 915bfd8..3ea0e4d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_cyCallMaterial_01.wql @@ -1,5 +1,5 @@ [交易说明] - 交易名: 共挤线满料请求 + 交易名: 分拣叫料 所属模块: 功能简述: 版权所有: @@ -55,6 +55,7 @@ p.is_used = '1' AND is_delete = '0' AND lock_type='1' + AND point_status = '3' OPTION 输入.material_id <> "" p.material_id = 输入.material_id ENDOPTION @@ -64,7 +65,7 @@ OPTION 输入.vehicle_type <> "" p.can_vehicle_type like 输入.vehicle_type ENDOPTION - ORDER BY block_num,col_num desc,row_num + ORDER BY col_num,row_num,layer_num ENDSELECT ENDQUERY ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_gjxSendMaterial_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_szCallMaterial_01.wql similarity index 54% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_gjxSendMaterial_01.wql rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_szCallMaterial_01.wql index 29b1351..b4bbdc9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_gjxSendMaterial_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_szCallMaterial_01.wql @@ -1,5 +1,5 @@ [交易说明] - 交易名: 共挤线满料请求 + 交易名: 烧制叫料 所属模块: 功能简述: 版权所有: @@ -40,25 +40,23 @@ ########################################## # 3、业务主过程 # ########################################## - - IF 输入.flag = "1" - QUERY - SELECT - p.point_id, - p.point_code, - p.point_name, - p.block_num, - p.col_num, - p.row_num + IF 输入.flag = "1" + QUERY + SELECT + p.point_id, + p.point_code, + p.point_name, + p.block_num, + p.col_num, + p.row_num FROM - SCH_BASE_Point p - where - p.is_used = '1' + SCH_BASE_Point p + WHERE + p.is_used = '1' AND is_delete = '0' - AND lock_type = '1' + AND lock_type='1' AND point_status = '3' - and col_num>1 - OPTION 输入.material_id <> "" + OPTION 输入.material_id <> "" p.material_id = 输入.material_id ENDOPTION OPTION 输入.region_code <> "" @@ -67,34 +65,7 @@ OPTION 输入.vehicle_type <> "" p.can_vehicle_type like 输入.vehicle_type ENDOPTION - ORDER BY block_num,row_num,col_num - ENDSELECT - ENDQUERY + ORDER BY is_full desc,col_num,row_num,layer_num + ENDSELECT + ENDQUERY ENDIF - - IF 输入.flag = "2" - QUERY - SELECT - block_num, - row_num, - COUNT(*) AS sum - FROM - SCH_BASE_Point p - WHERE - p.is_delete = '0' - AND is_used = '1' - AND region_code = 'YSQA01' - AND point_status = '1' - AND lock_type = '1' - OPTION 输入.vehicle_type <> "" - p.can_vehicle_type like 输入.vehicle_type - ENDOPTION - GROUP BY block_num,row_num - HAVING sum = 9 - ORDER BY block_num,row_num - ENDSELECT - ENDQUERY - ENDIF - - - diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yzjCallMaterial_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yzjCallMaterial_01.wql new file mode 100644 index 0000000..685eb23 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yzjCallMaterial_01.wql @@ -0,0 +1,71 @@ +[交易说明] + 交易名: 压制机叫料 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.region_code TYPEAS s_string + 输入.material_id TYPEAS s_string + 输入.vehicle_type TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + IF 输入.flag = "1" + QUERY + SELECT + p.point_id, + p.point_code, + p.point_name, + p.block_num, + p.col_num, + p.row_num + FROM + SCH_BASE_Point p + WHERE + p.is_used = '1' + AND is_delete = '0' + AND lock_type='1' + AND point_status = '3' + OPTION 输入.material_id <> "" + p.material_id = 输入.material_id + ENDOPTION + OPTION 输入.region_code <> "" + p.region_code = 输入.region_code + ENDOPTION + OPTION 输入.vehicle_type <> "" + p.can_vehicle_type like 输入.vehicle_type + ENDOPTION + ORDER BY col_num desc,row_num,layer_num + ENDSELECT + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/DpSendEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/DpSendEmpVehicleTask.java new file mode 100644 index 0000000..c8b57e5 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/DpSendEmpVehicleTask.java @@ -0,0 +1,203 @@ +package org.nl.wms.sch.tasks.sendEmpty; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author: lyd + * @description: 叠盘送空载具 + * @Date: 2022/11/15 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class DpSendEmpVehicleTask extends AbstractAcsTask { + private final String THIS_CLASS = DpSendEmpVehicleTask.class.getName(); + /** + * 添加任务进行下发 + * + * @return + */ + @Override + public List addTask() { + return null; + } + + /** + * @param taskObj 代表一条任务对象 + * @param status 代表wcs任务完成状态: //0:acs,取消,:执行中,2:完成 + * @return + * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 + * @author ldjun + * @created 2019年4月17日 下午8:51:50 + */ + @Override + public void updateTaskStatus(JSONObject taskObj, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String task_id = taskObj.getString("task_id"); + String point_code1 = taskObj.getString("point_code1"); + String point_code2 = taskObj.getString("point_code2"); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + if (StrUtil.equals(status, "0")) { + // 取消删除任务 + if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + // 解锁终点位置 + if (ObjectUtil.isNotEmpty(point_code2)) { // 未找到终点的取消只需要完成任务就行 + JSONObject point2 = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + point2.put("lock_type", "1"); + pointTab.update(point2); + } + // 任务设置为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("remark", "已取消"); + taskTab.update(jsonTask); + } + + if ("1".equals(status)) { + // 更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("car_no", taskObj.getString("car_no")); + taskTab.update(jsonTask); + } + + if (StrUtil.equals(status, "2")) { + // 更改任务状态为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); + jsonTask.put("update_optname", SecurityUtils.getCurrentUsername()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + // 释放点位 + if (ObjectUtil.isNotEmpty(point_code2)) { // 防止只有确定起点的任务完成 + JSONObject point_2 = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + point_2.put("lock_type", "1"); + point_2.put("point_status", "2"); + point_2.put("vehicle_code", jsonTask.getString("vehicle_code")); + point_2.put("vehicle_qty", NumberUtil.add(point_2.getString("vehicle_qty"), jsonTask.getString("vehicle_qty"))); + point_2.put("instorage_time", DateUtil.now()); + point_2.put("is_full", "1"); + point_2.put("ivt_qty", "0"); + point_2.put("pcsn", ""); + point_2.put("material_id", ""); + point_2.put("standing_time", "0"); + pointTab.update(point_2); + // 起点设置为空位 + JSONObject point_1 = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + point_1.put("point_status", "1"); + point_1.put("point_status", "1"); + point_1.put("point_status", "1"); + pointTab.update(point_1); + } + } + } + + /** + * @param form 创建任务需要的参数 + * @return 返回任务标识 + */ + @Override + public String createTask(JSONObject form) { + // 送到KGTDDW01 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + + String point_code1 = form.getString("point_code1"); + + SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("") + .task_name("叠盘空钢托盘入库") + .task_status(TaskStatusEnum.SURE_START.getCode()) + .point_code1(point_code1) + .vehicle_code(form.getString("vehicle_code")) + .vehicle_type(form.getString("vehicle_type")) + .vehicle_qty(form.getIntValue("qty")) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + /** + * @return + * @discription 确定下一点位 + * @author ldjun + * @created 2020年6月12日 下午6:01:06 + */ + @Override + public void findNextPoint() { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + JSONObject taskObj = taskArr.getJSONObject(i); + // 直接找 + JSONObject endPoint = pointTab.query("point_code = 'KGTDDW01' AND lock_type = '1' AND is_used='1'").uniqueResult(0); + if (ObjectUtil.isEmpty(endPoint)) { + taskObj.put("remark", "钢托盘堆叠位不可用!"); + taskObj.put("task_status", TaskStatusEnum.SURE_START.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } else { + taskObj.put("update_time", DateUtil.now()); + taskObj.put("point_code2", endPoint.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskTab.update(taskObj); + + //锁住终点 + endPoint.put("task_id", taskObj.getString("task_id")); + endPoint.put("lock_type", "2"); + pointTab.update(endPoint); + } + } + } + + /** + * @param task_id 任务标识 + * @return + * @discription 强制结束完成任务 + * @author ldjun + * @created 2020年6月19日 上午10:34:58 + */ + @Override + public void forceFinish(String task_id) { + + } + + /** + * 取消任务,货物搬回原点 + * + * @param task_id + */ + @Override + public void cancel(String task_id) { + + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/FjSendEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/FjSendEmpVehicleTask.java new file mode 100644 index 0000000..e09e1ea --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/FjSendEmpVehicleTask.java @@ -0,0 +1,197 @@ +package org.nl.wms.sch.tasks.sendEmpty; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author: lyd + * @description: 分拣送空钢托盘 + * @Date: 2022/11/11 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class FjSendEmpVehicleTask extends AbstractAcsTask { + private final String THIS_CLASS = FjSendEmpVehicleTask.class.getName(); + /** + * 添加任务进行下发 + * + * @return + */ + @Override + public List addTask() { + return null; + } + + /** + * @param taskObj 代表一条任务对象 + * @param status 代表wcs任务完成状态: //0:acs,取消,:执行中,2:完成 + * @return + * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 + * @author ldjun + * @created 2019年4月17日 下午8:51:50 + */ + @Override + public void updateTaskStatus(JSONObject taskObj, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String task_id = taskObj.getString("task_id"); + String point_code2 = taskObj.getString("point_code2"); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + if (StrUtil.equals(status, "0")) { + // 取消删除任务 + if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + // 解锁终点位置 + if (ObjectUtil.isNotEmpty(point_code2)) { // 未找到终点的取消只需要完成任务就行 + JSONObject point2 = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + point2.put("lock_type", "1"); + pointTab.update(point2); + } + // 任务设置为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("remark", "已取消"); + taskTab.update(jsonTask); + } + + if ("1".equals(status)) { + // 更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("car_no", taskObj.getString("car_no")); + taskTab.update(jsonTask); + } + + if (StrUtil.equals(status, "2")) { + // 更改任务状态为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); + jsonTask.put("update_optname", SecurityUtils.getCurrentUsername()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + // 释放点位 + if (ObjectUtil.isNotEmpty(point_code2)) { // 防止只有确定起点的任务完成 + JSONObject point_2 = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + point_2.put("lock_type", "1"); + point_2.put("point_status", "2"); + point_2.put("vehicle_code", jsonTask.getString("vehicle_code")); + point_2.put("vehicle_qty", NumberUtil.add(point_2.getString("vehicle_qty"), jsonTask.getString("vehicle_qty"))); + point_2.put("instorage_time", DateUtil.now()); + point_2.put("is_full", "1"); + point_2.put("ivt_qty", "0"); + point_2.put("pcsn", ""); + point_2.put("material_id", ""); + point_2.put("standing_time", "0"); + pointTab.update(point_2); + } + } + } + + /** + * @param form 创建任务需要的参数 + * @return 返回任务标识 + */ + @Override + public String createTask(JSONObject form) { + // 送到叠盘区:KGTDTW01 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + + String point_code1 = form.getString("point_code1"); + + SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("") + .task_name("分拣空钢托盘入库") + .task_status(TaskStatusEnum.SURE_START.getCode()) + .point_code1(point_code1) + .vehicle_code(form.getString("vehicle_code")) + .vehicle_type(form.getString("vehicle_type")) + .vehicle_qty(form.getIntValue("qty")) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + /** + * @return + * @discription 确定下一点位 + * @author ldjun + * @created 2020年6月12日 下午6:01:06 + */ + @Override + public void findNextPoint() { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + JSONObject taskObj = taskArr.getJSONObject(i); + // 直接找 + JSONObject endPoint = pointTab.query("point_code = 'KGTDTW01' AND lock_type = '1' AND is_used='1'").uniqueResult(0); + if (ObjectUtil.isEmpty(endPoint)) { + taskObj.put("remark", "钢托盘叠托位不可用!"); + taskObj.put("task_status", TaskStatusEnum.SURE_START.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } else { + taskObj.put("update_time", DateUtil.now()); + taskObj.put("point_code2", endPoint.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskTab.update(taskObj); + + //锁住终点 + endPoint.put("task_id", taskObj.getString("task_id")); + endPoint.put("lock_type", "2"); + pointTab.update(endPoint); + } + } + } + + /** + * @param task_id 任务标识 + * @return + * @discription 强制结束完成任务 + * @author ldjun + * @created 2020年6月19日 上午10:34:58 + */ + @Override + public void forceFinish(String task_id) { + + } + + /** + * 取消任务,货物搬回原点 + * + * @param task_id + */ + @Override + public void cancel(String task_id) { + + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/HnSendEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/HnSendEmpVehicleTask.java new file mode 100644 index 0000000..cbe5126 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/HnSendEmpVehicleTask.java @@ -0,0 +1,196 @@ +package org.nl.wms.sch.tasks.sendEmpty; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author: lyd + * @description: 混碾送空盅 + * @Date: 2022/11/15 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class HnSendEmpVehicleTask extends AbstractAcsTask { + private final String THIS_CLASS = HnSendEmpVehicleTask.class.getName(); + /** + * 添加任务进行下发 + * + * @return + */ + @Override + public List addTask() { + return null; + } + + /** + * @param taskObj 代表一条任务对象 + * @param status 代表wcs任务完成状态: //0:acs,取消,:执行中,2:完成 + * @return + * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 + * @author ldjun + * @created 2019年4月17日 下午8:51:50 + */ + @Override + public void updateTaskStatus(JSONObject taskObj, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String task_id = taskObj.getString("task_id"); + String point_code2 = taskObj.getString("point_code2"); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + if (StrUtil.equals(status, "0")) { + // 取消删除任务 + if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + // 解锁终点位置 + if (ObjectUtil.isNotEmpty(point_code2)) { // 未找到终点的取消只需要完成任务就行 + JSONObject point2 = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + point2.put("lock_type", "1"); + pointTab.update(point2); + } + // 任务设置为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("remark", "已取消"); + taskTab.update(jsonTask); + } + + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("car_no", taskObj.getString("car_no")); + taskTab.update(jsonTask); + } + + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + // 更改任务状态为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); + jsonTask.put("update_optname", SecurityUtils.getCurrentUsername()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + // 释放点位 + if (ObjectUtil.isNotEmpty(point_code2)) { // 防止只有确定起点的任务完成 + JSONObject point_2 = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + point_2.put("lock_type", "1"); + point_2.put("point_status", "2"); + point_2.put("vehicle_code", jsonTask.getString("vehicle_code")); + point_2.put("vehicle_qty", "1"); // 混碾送的空盅一个放一个位置,所以只设一个 + point_2.put("instorage_time", DateUtil.now()); + point_2.put("is_full", "1"); + point_2.put("ivt_qty", "0"); + point_2.put("pcsn", ""); + point_2.put("material_id", ""); + point_2.put("standing_time", "0"); + pointTab.update(point_2); + } + } + } + + /** + * @param form 创建任务需要的参数 + * @return 返回任务标识 + */ + @Override + public String createTask(JSONObject form) { + // 送到困料货架,盅 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + + String point_code1 = form.getString("point_code1"); + + SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("") + .task_name("分拣空钢托盘入库") + .task_status(TaskStatusEnum.SURE_START.getCode()) + .point_code1(point_code1) + .vehicle_code(form.getString("vehicle_code")) + .vehicle_type(form.getString("vehicle_type")) + .vehicle_qty(form.getIntValue("qty")) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + /** + * @return + * @discription 确定下一点位 + * @author ldjun + * @created 2020年6月12日 下午6:01:06 + */ + @Override + public void findNextPoint() { + // 找困料货架 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + JSONObject taskObj = taskArr.getJSONObject(i); + // 直接找 + JSONObject endPoint = pointTab.query("region_code = 'KLHJ' AND lock_type = '1' AND is_used='1' AND point_type = '1'").uniqueResult(0); + if (ObjectUtil.isEmpty(endPoint)) { + taskObj.put("remark", "困料货架无可用货位!"); + taskObj.put("task_status", TaskStatusEnum.SURE_START.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } else { + taskObj.put("update_time", DateUtil.now()); + taskObj.put("point_code2", endPoint.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskTab.update(taskObj); + + //锁住终点 + endPoint.put("task_id", taskObj.getString("task_id")); + endPoint.put("lock_type", "2"); + pointTab.update(endPoint); + } + } + } + + /** + * @param task_id 任务标识 + * @return + * @discription 强制结束完成任务 + * @author ldjun + * @created 2020年6月19日 上午10:34:58 + */ + @Override + public void forceFinish(String task_id) { + + } + + /** + * 取消任务,货物搬回原点 + * + * @param task_id + */ + @Override + public void cancel(String task_id) { + + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YzjSendEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YzjSendEmpVehicleTask.java new file mode 100644 index 0000000..663b92e --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YzjSendEmpVehicleTask.java @@ -0,0 +1,231 @@ +package org.nl.wms.sch.tasks.sendEmpty; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.sch.tasks.RegionTypeEnum; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author: lyd + * @description: 压制机送空托盘入库 + * @Date: 2022/11/10 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class YzjSendEmpVehicleTask extends AbstractAcsTask { + private final String THIS_CLASS = YzjSendEmpVehicleTask.class.getName(); + /** + * 添加任务进行下发 + * + * @return + */ + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList acsTaskArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { // 任务 + JSONObject json = arr.getJSONObject(i); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + acsTaskArr.add(dto); + } + return acsTaskArr; + } + + /** + * @param taskObj 代表一条任务对象 + * @param status 代表wcs任务完成状态: //0:acs,取消,:执行中,2:完成 + * @return + * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 + * @author ldjun + * @created 2019年4月17日 下午8:51:50 + */ + @Override + public void updateTaskStatus(JSONObject taskObj, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String task_id = taskObj.getString("task_id"); + String point_code2 = taskObj.getString("point_code2"); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + if (StrUtil.equals(status, "0")) { + // 取消删除任务 + if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + // 解锁终点位置 + if (ObjectUtil.isNotEmpty(point_code2)) { // 未找到终点的取消只需要完成任务就行 + JSONObject point2 = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + point2.put("lock_type", "1"); + pointTab.update(point2); + } + // 任务设置为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("remark", "已取消"); + taskTab.update(jsonTask); + } + + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("car_no", taskObj.getString("car_no")); + taskTab.update(jsonTask); + } + + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + // 更改任务状态为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); + jsonTask.put("update_optname", SecurityUtils.getCurrentUsername()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + // 释放点位 + if (ObjectUtil.isNotEmpty(point_code2)) { // 防止只有确定起点的任务完成 + JSONObject point_2 = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + point_2.put("lock_type", "1"); + point_2.put("point_status", "2"); + point_2.put("vehicle_code", jsonTask.getString("vehicle_code")); + point_2.put("vehicle_qty", "1"); + point_2.put("instorage_time", DateUtil.now()); + point_2.put("is_full", "1"); + point_2.put("ivt_qty", "0"); + point_2.put("pcsn", ""); + point_2.put("material_id", ""); + point_2.put("standing_time", "0"); + pointTab.update(point_2); + } + } + } + + /** + * @param form 创建任务需要的参数 + * @return 返回任务标识 + */ + @Override + public String createTask(JSONObject form) { + /* + * 1.先生成确定起点的任务 + * 2.通过findNextPoint()找终点 + * 3.下发给ACS + */ + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + + String point_code1 = form.getString("point_code1"); + + SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("") + .task_name("压制机空盘入库") + .task_status(TaskStatusEnum.SURE_START.getCode()) + .point_code1(point_code1) + .vehicle_code(form.getString("vehicle_code")) + .vehicle_type(form.getString("vehicle_type")) + .vehicle_qty(form.getIntValue("qty")) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + /** + * @return + * @discription 确定下一点位 + * @author ldjun + * @created 2020年6月12日 下午6:01:06 + */ + @Override + public void findNextPoint() { + /* + * 根据业务找对应的终点 + */ + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + JSONObject taskObj = taskArr.getJSONObject(i); + String vehicle_type = taskObj.getString("vehicle_type"); + JSONObject param1 = new JSONObject(); + param1.put("flag", "1"); + param1.put("region_code", "KLHJ"); + param1.put("vehicle_type", "%" + vehicle_type + "%"); + //1、查找困料货架是否有空位,将空桶送过去,由于一个货架只放一个,不需要判定,有空位即可放 + JSONObject endPoint = WQL.getWO("QSCH_hnSendEmptyVehicle_01").addParamMap(param1).process().uniqueResult(0); + if (ObjectUtil.isEmpty(endPoint)) { + taskObj.put("remark", "困料货架无可用货位!"); + taskObj.put("task_status", TaskStatusEnum.SURE_START.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } else { + taskObj.put("update_time", DateUtil.now()); + taskObj.put("point_code2", endPoint.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskTab.update(taskObj); + + //锁住终点 + endPoint.put("task_id", taskObj.getString("task_id")); + endPoint.put("lock_type", "2"); + pointTab.update(endPoint); + } + } + } + + /** + * @param task_id 任务标识 + * @return + * @discription 强制结束完成任务 + * @author ldjun + * @created 2020年6月19日 上午10:34:58 + */ + @Override + public void forceFinish(String task_id) { + + } + + /** + * 取消任务,货物搬回原点 + * + * @param task_id + */ + @Override + public void cancel(String task_id) { + + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/wql/QSCH_hnSendEmptyVehicle_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/wql/QSCH_hnSendEmptyVehicle_01.wql new file mode 100644 index 0000000..92cd9e6 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/wql/QSCH_hnSendEmptyVehicle_01.wql @@ -0,0 +1,71 @@ +[交易说明] + 交易名: 压制机送空盘 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.region_code TYPEAS s_string + 输入.material_id TYPEAS s_string + 输入.vehicle_type TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + IF 输入.flag = "1" + QUERY + SELECT + p.point_id, + p.point_code, + p.point_name, + p.block_num, + p.col_num, + p.row_num + FROM + SCH_BASE_Point p + WHERE + p.is_used = '1' + AND is_delete = '0' + AND lock_type='1' + AND point_status = '1' + OPTION 输入.material_id <> "" + p.material_id = 输入.material_id + ENDOPTION + OPTION 输入.region_code <> "" + p.region_code = 输入.region_code + ENDOPTION + OPTION 输入.vehicle_type <> "" + p.can_vehicle_type like 输入.vehicle_type + ENDOPTION + ORDER BY col_num desc,row_num,layer_num + ENDSELECT + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/FjSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/FjSendMaterialTask.java new file mode 100644 index 0000000..7c88607 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/FjSendMaterialTask.java @@ -0,0 +1,281 @@ +package org.nl.wms.sch.tasks.sendMaterial; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.sch.tasks.sendEmpty.FjSendEmpVehicleTask; +import org.nl.wms.util.IdUtil; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author: lyd + * @description: 分拣送料入库 + * @Date: 2022/11/14 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class FjSendMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = FjSendEmpVehicleTask.class.getName(); + /** + * 添加任务进行下发 + * + * @return + */ + @Override + public List addTask() { + return null; + } + + /** + * @param taskObj 代表一条任务对象 + * @param status 代表wcs任务完成状态: //0:acs,取消,:执行中,2:完成 + * @return + * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 + * @author ldjun + * @created 2019年4月17日 下午8:51:50 + */ + @Override + public void updateTaskStatus(JSONObject task, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String task_id = task.getString("task_id"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + //任务取消 + if (StrUtil.equals(status, "0")) { + // 取消删除任务 + if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + String point_code2 = taskObj.getString("point_code2"); + if (ObjectUtil.isEmpty(point_code2)) { + JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + endPoint.put("lock_type", "1"); + pointTab.update(endPoint); + } + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("remark", "已取消"); + taskTab.update(taskObj); + } + + if ("1".equals(status)) { + // 更新任务状态为执行中 + taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("car_no", taskObj.getString("car_no")); + taskTab.update(taskObj); + } + + if (StrUtil.equals(status, "2")) { + // 更改任务状态为完成 + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); + taskObj.put("update_optname", SecurityUtils.getCurrentUsername()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + + String point_code2 = taskObj.getString("point_code2"); + JSONObject point2Obj = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + JSONObject requestObj = task.getJSONObject("request_param"); + //工单标识 + String workorder_id = requestObj.getString("material_info_id"); + //生产工单表【PDM_BD_WorkOrder】 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + JSONObject workorderObj = workOrderTab.query("workorder_id", workorder_id).uniqueResult(0); + + if (!point_code2.equals("BZX01")) { // 半满到包装暂存区,记录库存 + //区域出入表【st_ivt_regionIO】 + WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); + JSONObject regionIoObj = new JSONObject(); + regionIoObj.put("iostorinv_id", IdUtil.getLongId()); + regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); + regionIoObj.put("buss_date", DateUtil.today()); + regionIoObj.put("io_type", "1"); + regionIoObj.put("region_id", point2Obj.getString("region_id")); + regionIoObj.put("region_code", point2Obj.getString("region_code")); + regionIoObj.put("region_name", point2Obj.getString("region_name")); + regionIoObj.put("material_id", taskObj.getString("material_id")); + regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); + regionIoObj.put("qty", requestObj.getString("qty")); + regionIoObj.put("bill_status", "3"); + regionIoObj.put("start_point_code", taskObj.getString("point_code1")); + regionIoObj.put("end_point_code", taskObj.getString("point_code3")); + regionIoObj.put("create_mode", "2"); + regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); + regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); + regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); + regionIoObj.put("create_time", DateUtil.now()); + regionIoTab.insert(regionIoObj); + //完成后入库 + point2Obj.put("instorage_time", DateUtil.now()); + point2Obj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); + point2Obj.put("ivt_qty", requestObj.getString("qty")); + point2Obj.put("standing_time", workorderObj.getString("standing_time")); + point2Obj.put("material_id", workorderObj.getString("material_id")); + point2Obj.put("vehicle_type", workorderObj.getString("vehicle_type")); + point2Obj.put("vehicle_code", taskObj.getString("vehicle_code")); + point2Obj.put("is_full", requestObj.getString("is_full")); + point2Obj.put("point_status", "3"); + } + // 终点解锁 + point2Obj.put("lock_type", "1"); + pointTab.update(point2Obj); + } + } + + /** + * @param form 创建任务需要的参数 + * @return 返回任务标识 + */ + @Override + public String createTask(JSONObject form) { + String point_code1 = form.getString("point_code1"); + String vehicle_code = form.getString("vehicle_code"); + String qty = form.getString("qty"); + String is_full = form.getString("is_full"); + String weight = form.getString("weight"); + //任务表【SCH_BASE_Task】 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); + + //生产工单表【PDM_BD_WorkOrder】 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + //点位基础表【SCH_BASE_Point】 + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); + // 混碾机设备编码 + String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); + JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); + + SchTaskDto dto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("task_type") + .task_name("分拣入库") + .material_qty(qty) + .task_status(TaskStatusEnum.SURE_START.getCode()) + .point_code1(point_code1) + .vehicle_code(vehicle_code) + .vehicle_type(workOrderObj.getString("vehicle_type")) + .material_info_id(workOrderObj.getLong("workorder_id")) + .material_id(workOrderObj.getLong("material_id")) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .request_param(form.toJSONString()) + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + //创建好立即下发 + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + /** + * @return + * @discription 确定下一点位 + * @author ldjun + * @created 2020年6月12日 下午6:01:06 + */ + @Override + public void findNextPoint() { + // 判断是否满拖:半满->包装暂存区,满->包装线 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + JSONObject taskObj = taskArr.getJSONObject(i); + JSONObject requestObj = taskObj.getJSONObject("request_param"); + if (requestObj.getString("is_full").equals("1")) { + JSONObject endPoint = pointTab.query("point_code = 'BZX01' AND lock_type = '1'").uniqueResult(0); + // 满拖就到包装线 + taskObj.put("update_time", DateUtil.now()); + taskObj.put("point_code2", endPoint.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskTab.update(taskObj); + + //锁住终点 + endPoint.put("task_id", taskObj.getString("task_id")); + endPoint.put("lock_type", "2"); + pointTab.update(endPoint); + } else { + // 半满拖就去包装暂存区 + String vehicle_type = taskObj.getString("vehicle_type"); + JSONObject param1 = new JSONObject(); + param1.put("flag", "1"); + param1.put("region_code", "BZZCQ"); + param1.put("vehicle_type", "%" + vehicle_type + "%"); + //1、查找困料货架是否有响应的载具类型和对应的物料 + JSONObject endPoint = WQL.getWO("QSCH_fjCallEmptyVehicle_01").addParamMap(param1).process().uniqueResult(0); + if (ObjectUtil.isEmpty(endPoint)) { + taskObj.put("remark", "包装暂存区无可用货位!"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } else { + taskObj.put("update_time", DateUtil.now()); + taskObj.put("point_code2", endPoint.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskTab.update(taskObj); + + //锁住终点 + endPoint.put("task_id", taskObj.getString("task_id")); + endPoint.put("lock_type", "2"); + pointTab.update(endPoint); + } + } + } + } + + /** + * @param task_id 任务标识 + * @return + * @discription 强制结束完成任务 + * @author ldjun + * @created 2020年6月19日 上午10:34:58 + */ + @Override + public void forceFinish(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + this.updateTaskStatus(taskObj,"2"); + else { + throw new BadRequestException("未找到该任务或者任务已完成!"); + } + } + + /** + * 取消任务,货物搬回原点 + * + * @param task_id + */ + @Override + public void cancel(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + this.updateTaskStatus(taskObj,"0"); + else { + throw new BadRequestException("未找到该任务或者任务已完成!"); + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java deleted file mode 100644 index 176be07..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java +++ /dev/null @@ -1,379 +0,0 @@ -package org.nl.wms.sch.tasks.sendMaterial; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.util.IdUtil; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - - -/** - * 共挤线送料任务服务 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class GjxSendMaterialTask extends AbstractAcsTask { - private final String THIS_CLASS = GjxSendMaterialTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject task, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = task.getString("task_id"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - //任务取消 - if (StrUtil.equals(status, "0")) { - // 取消删除任务 - if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("remark", "已取消"); - taskTab.update(taskObj); - - //释放相关电位信息 - JSONObject param1 = new JSONObject(); - param1.put("lock_type", "1"); - param1.put("task_id", ""); - param1.put("material_id", ""); - pointTab.update(param1, "task_id = '" + taskObj.getString("task_id") + "'"); - } - - if ("1".equals(status)) { - // 更新任务状态为执行中 - taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskObj.put("car_no", taskObj.getString("car_no")); - taskTab.update(taskObj); - } - - if (StrUtil.equals(status, "2")) { - - //判断状态, - if (StrUtil.equals("2", taskObj.getString("task_status"))) { - // 更改任务状态为完成 - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - return; - } - // 更改任务状态为完成 - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - - - String point_code2 = taskObj.getString("point_code2"); - JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - JSONObject requestObj = task.getJSONObject("request_param"); - //工单标识 - String workorder_id = requestObj.getString("material_info_id"); - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - JSONObject workorderObj = workOrderTab.query("workorder_id", workorder_id).uniqueResult(0); - - - //区域出入表【st_ivt_regionIO】 - WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); - JSONObject regionIoObj = new JSONObject(); - regionIoObj.put("iostorinv_id", IdUtil.getLongId()); - regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); - regionIoObj.put("buss_date", DateUtil.today()); - regionIoObj.put("io_type", "1"); - regionIoObj.put("region_id", endPoint.getString("region_id")); - regionIoObj.put("region_code", endPoint.getString("region_code")); - regionIoObj.put("region_name", endPoint.getString("region_name")); - regionIoObj.put("material_id", taskObj.getString("material_id")); - regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); - regionIoObj.put("qty", requestObj.getString("qty")); - regionIoObj.put("bill_status", "3"); - regionIoObj.put("start_point_code", taskObj.getString("point_code1")); - regionIoObj.put("end_point_code", taskObj.getString("point_code2")); - regionIoObj.put("create_mode", "2"); - regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); - regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); - regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); - regionIoObj.put("create_time", DateUtil.now()); - regionIoTab.insert(regionIoObj); - - - //完成后入库 - // 点位解锁 - endPoint.put("lock_type", "1"); - endPoint.put("point_status", "3"); - endPoint.put("material_id", taskObj.getString("material_id")); - endPoint.put("instorage_time", DateUtil.now()); - endPoint.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); - endPoint.put("ivt_qty", requestObj.getString("qty")); - endPoint.put("standing_time", workorderObj.getString("standing_time")); - endPoint.put("vehicle_code", taskObj.getString("vehicle_code")); - endPoint.put("vehicle_type", taskObj.getString("vehicle_type")); - pointTab.update(endPoint); - //释放整列货位 - JSONObject param = new JSONObject(); - param.put("lock_type", "1"); - pointTab.update(param, "task_id = '" + task_id + "'"); - - } - - } - - @Override - public void findNextPoint() { - //判断共挤线是否有执行中的任务,如果任务数>=3,则不生成任务 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - /* - * 根据业务找对应的终点 - */ - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - JSONObject taskObj = taskArr.getJSONObject(i); - String material_id = taskObj.getString("material_id"); - String vehicle_type = taskObj.getString("vehicle_type"); - JSONObject param1 = new JSONObject(); - param1.put("flag", "1"); - param1.put("material_id", material_id); - param1.put("region_code", "YSQA01"); - param1.put("vehicle_type", "%" + vehicle_type + "%"); - //1、查找库区类是否有响应的载具类型和对应的物料 - JSONObject json1 = WQL.getWO("QSCH_gjxSendMaterial_01").addParamMap(param1).process().uniqueResult(0); - - - //判断是否有到同一列的相同物料SKU的AGV任务,如果有,则等待 - JSONArray taskIngs = taskTab.query("is_delete='0' and material_id = '" + material_id + "' and (task_status = '4' or task_status = '5' or task_status = '6' )").getResultJSONArray(0); - - if (ObjectUtil.isNotEmpty(taskIngs)) { - JSONObject taskIng = taskIngs.getJSONObject(0); - if (ObjectUtil.isNotEmpty(taskIng) && ObjectUtil.isNotEmpty(json1)) { - JSONObject point2 = pointTab.query("point_code = '" + taskIng.getString("point_code2") + "'").uniqueResult(0); - if (StrUtil.equals(point2.getString("block_num"), json1.getString("block_num")) - && StrUtil.equals(point2.getString("row_num"), json1.getString("row_num"))) { - taskObj.put("remark", "相应列有AGV在工作,等待执行!"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } - } - } - - - if (ObjectUtil.isNotEmpty(json1)) { - Integer block_num = json1.getInteger("block_num"); - Integer col_num = json1.getInteger("col_num"); - Integer row_num = json1.getInteger("row_num"); - - JSONObject firstRow = pointTab.query("block_num = '" + block_num + "' and row_num = '" + row_num + "' and col_num ='" + (col_num - 1) + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(firstRow)) throw new BadRequestException("数据错误,请校验!"); - taskObj.put("point_code2", firstRow.getString("point_code")); - taskObj.put("update_time", DateUtil.now()); - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - //二楼普通任务 - taskTab.update(taskObj); - //锁住相关货位 - JSONObject point = new JSONObject(); - point.put("lock_type", "2"); - point.put("task_id", taskObj.getString("task_id")); - pointTab.update(point, "block_num = '" + block_num + "' and row_num = '" + row_num + "' and col_num <= '" + (col_num - 1) + "'"); - - } else {//找空位入 - if (ObjectUtil.isNotEmpty(taskIngs) && taskIngs.size() > 1) { - taskObj.put("remark", "相应列有AGV在工作,等待执行!"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - continue; - } - - JSONObject param2 = new JSONObject(); - param2.put("flag", "2"); - param2.put("region_code", "YSQA01"); - param2.put("vehicle_type", "%" + vehicle_type + "%"); - //1、查找整列为空的货位 - JSONObject json2 = WQL.getWO("QSCH_gjxSendMaterial_01").addParamMap(param2).process().uniqueResult(0); - if (ObjectUtil.isEmpty(json2)) { - taskObj.put("remark", "养生A区无可用货位"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } else { - Integer block_num = json2.getInteger("block_num"); - Integer row_num = json2.getInteger("row_num"); - JSONObject firstRow = pointTab.query("block_num = '" + block_num + "' and row_num = '" + row_num + "' and col_num ='9'").uniqueResult(0); - taskObj.put("point_code2", firstRow.getString("point_code")); - //二楼普通任务 - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - //锁住相关货位 - JSONObject point = new JSONObject(); - point.put("lock_type", "2"); - point.put("task_id", taskObj.getString("task_id")); - pointTab.update(point, "block_num = '" + block_num + "' and row_num = '" + row_num + "' and col_num <= '" + 9 + "'"); - - } - } - - } - } - - @Override - public List addTask() { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = taskTab.query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList acsTaskArr = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - String point_code = json.getString("point_code2"); - String newPoint = point_code.substring(0, 4) + "1" + point_code.substring(4, 9); - - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(json.getString("point_code1")) - .next_device_code(newPoint) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - acsTaskArr.add(dto); - } - return acsTaskArr; - } - - @Override - public String createTask(JSONObject whereJson) { - String point_code1 = whereJson.getString("point_code1"); - String vehicle_type = whereJson.getString("vehicle_type"); - String vehicle_code = whereJson.getString("vehicle_code"); - String qty = whereJson.getString("qty"); - - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - - //任务表【SCH_BASE_Task】 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); - - String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); - - - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - - SchTaskDto dto = SchTaskDto.builder() - .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("task_type") - .task_name("共挤线满料") - .task_status(TaskStatusEnum.SURE_START.getCode()) - .point_code1(point_code1) - .acs_task_type("2")//2楼AGV普通任务 - .vehicle_code(vehicle_code) - .material_qty(qty) - .material_info_id(workOrderObj.getLong("workorder_id")) - .material_id(workOrderObj.getLong("material_id")) - .vehicle_type(vehicle_type) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .request_param(whereJson.toJSONString()) - .build(); - - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - //创建好立即下发 - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - @Override - public void forceFinish(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status < " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) { - this.updateTaskStatus(taskObj, "2"); - } else { - throw new BadRequestException("任务已删除或者已完成!"); - } - - } - - - @Override - public void cancel(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) { - this.updateTaskStatus(taskObj, "0"); - } else { - throw new BadRequestException("任务已完成不能取消!"); - } - } - - //TODO 暂时不用二次申请 - @Transactional(rollbackFor = Exception.class) - @Override - public String againApply(String task_id) { - /* - * 再次下发任务处理方法 - * 涉及业务:入空载具、出空载具、入物料、出物料 - */ - - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); // 点位表 - - JSONObject taskObj = taskTab.query("task_id ='" + task_id + "'").uniqueResult(0); - - JSONObject jsonPoint3 = pointTab.query("point_code = '" + taskObj.getString("point_code3") + "'").uniqueResult(0); - //提前更新这列货位状态,方便生成往这列的任务 - jsonPoint3.put("point_status", "3"); - jsonPoint3.put("material_id", taskObj.getString("material_id")); - pointTab.update(jsonPoint3); - //释放相关货位 - JSONObject point = new JSONObject(); - point.put("lock_type", "1"); - point.put("task_id", ""); - pointTab.update(point, "task_id = '" + taskObj.getString("task_id") + "'"); - - - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - String point_code = taskObj.getString("point_code3"); - String newPoint = point_code.substring(0, 4) + "1" + point_code.substring(4, 9); - return newPoint; - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HkxSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HnSendMaterialTask.java similarity index 80% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HkxSendMaterialTask.java rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HnSendMaterialTask.java index 5419c5f..a9e3180 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HkxSendMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HnSendMaterialTask.java @@ -19,25 +19,61 @@ import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.tasks.AcsTaskDto; import org.nl.wms.util.IdUtil; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; - /** - * 豪凯自动线线送料任务服务 + * @author: lyd + * @description: 混碾机送料 + * @Date: 2022/11/9 */ @Service @RequiredArgsConstructor @Slf4j -public class HkxSendMaterialTask extends AbstractAcsTask { - - private final String THIS_CLASS = HkxSendMaterialTask.class.getName(); - +public class HnSendMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = HnSendMaterialTask.class.getName(); + /** + * 添加任务进行下发 + * + * @return + */ + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList acsTaskArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { // 任务 + JSONObject json = arr.getJSONObject(i); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + acsTaskArr.add(dto); + } + return acsTaskArr; + } + + /** + * @param task 代表一条任务对象 + * @param status 代表wcs任务完成状态: //0:acs,取消,:执行中,2:完成 + * @return + * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 + * @author ldjun + * @created 2019年4月17日 下午8:51:50 + */ @Override - @Transactional(rollbackFor = Exception.class) public void updateTaskStatus(JSONObject task, String status) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); @@ -73,6 +109,8 @@ public class HkxSendMaterialTask extends AbstractAcsTask { if (StrUtil.equals(status, "2")) { // 更改任务状态为完成 taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); + taskObj.put("update_optname", SecurityUtils.getCurrentUsername()); taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); @@ -114,22 +152,77 @@ public class HkxSendMaterialTask extends AbstractAcsTask { point2Obj.put("ivt_qty", requestObj.getString("qty")); point2Obj.put("standing_time", workorderObj.getString("standing_time")); point2Obj.put("material_id", workorderObj.getString("material_id")); + point2Obj.put("vehicle_type", workorderObj.getString("vehicle_type")); point2Obj.put("vehicle_code", taskObj.getString("vehicle_code")); + point2Obj.put("is_full", requestObj.getString("is_full")); // 终点解锁 point2Obj.put("lock_type", "1"); point2Obj.put("point_status", "3"); - // 载具类型 - point2Obj.put("vehicle_type", taskObj.getString("vehicle_type")); pointTab.update(point2Obj); } - } + /** + * @param form 创建任务需要的参数 + * @return 返回任务标识 + * 混碾机送料到困料货架 + */ + @Override + public String createTask(JSONObject form) { + String point_code1 = form.getString("point_code1"); + String vehicle_code = form.getString("vehicle_code"); + String qty = form.getString("qty"); + String is_full = form.getString("is_full"); + String weight = form.getString("weight"); + //任务表【SCH_BASE_Task】 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); + + //生产工单表【PDM_BD_WorkOrder】 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + //点位基础表【SCH_BASE_Point】 + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); + // 混碾机设备编码 + String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); + JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); + + SchTaskDto dto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("task_type") + .task_name("混碾机满料") + .material_qty(qty) + .task_status(TaskStatusEnum.SURE_START.getCode()) + .point_code1(point_code1) + .vehicle_code(vehicle_code) + .vehicle_type(workOrderObj.getString("vehicle_type")) + .material_info_id(workOrderObj.getLong("workorder_id")) + .material_id(workOrderObj.getLong("material_id")) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .request_param(form.toJSONString()) + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + //创建好立即下发 + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + /** + * @return + * @discription 确定下一点位 + * @author ldjun + * @created 2020年6月12日 下午6:01:06 + */ @Override public void findNextPoint() { - /* - * 根据业务找对应的终点 + /** + * 根据业务找到相应的终点 */ WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); @@ -139,12 +232,12 @@ public class HkxSendMaterialTask extends AbstractAcsTask { String vehicle_type = taskObj.getString("vehicle_type"); JSONObject param1 = new JSONObject(); param1.put("flag", "1"); - param1.put("region_code", "CPQYA01"); + param1.put("region_code", "KLHJ"); param1.put("vehicle_type", "%" + vehicle_type + "%"); - //1、查找库区类是否有响应的载具类型和对应的物料 - JSONObject endPoint = WQL.getWO("QSCH_hkxSendMaterial_01").addParamMap(param1).process().uniqueResult(0); + //1、查找困料货架是否有响应的载具类型和对应的物料 + JSONObject endPoint = WQL.getWO("QSCH_hnCallEmptyVehicle_01").addParamMap(param1).process().uniqueResult(0); if (ObjectUtil.isEmpty(endPoint)) { - taskObj.put("remark", "成品区无可用货位!"); + taskObj.put("remark", "困料货架无可用货位!"); taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); } else { @@ -163,88 +256,32 @@ public class HkxSendMaterialTask extends AbstractAcsTask { } } - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList acsTaskArr = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(json.getString("point_code1")) - .next_device_code(json.getString("point_code3")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - acsTaskArr.add(dto); - } - return acsTaskArr; - } - - @Override - public String createTask(JSONObject whereJson) { - String point_code1 = whereJson.getString("point_code1"); - String vehicle_type = whereJson.getString("vehicle_type"); - String vehicle_code = whereJson.getString("vehicle_code"); - String qty = whereJson.getString("qty"); - - - //任务表【SCH_BASE_Task】 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); - - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); - - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - SchTaskDto dto = SchTaskDto.builder() - .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("task_type") - .task_name("豪凯线满料") - .material_qty(qty) - .task_status(TaskStatusEnum.SURE_START.getCode()) - .point_code1(point_code1) - .vehicle_code(vehicle_code) - .material_info_id(workOrderObj.getLong("workorder_id")) - .material_id(workOrderObj.getLong("material_id")) - .vehicle_type(vehicle_type) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .request_param(whereJson.toJSONString()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - //创建好立即下发 - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - + /** + * @param task_id 任务标识 + * @return + * @discription 强制结束完成任务 + * @author ldjun + * @created 2020年6月19日 上午10:34:58 + */ @Override public void forceFinish(String task_id) { + /* + * 强制完成 + */ WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj, "2"); + this.updateTaskStatus(taskObj,"2"); + else { + throw new BadRequestException("未找到该任务或者任务已完成!"); + } } - + /** + * 取消任务,货物搬回原点 + * + * @param task_id + */ @Override public void cancel(String task_id) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/SendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/SendMaterialTask.java new file mode 100644 index 0000000..1e0f711 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/SendMaterialTask.java @@ -0,0 +1,230 @@ +package org.nl.wms.sch.tasks.sendMaterial; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.util.IdUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author: lyd + * @description: + * @Date: 2022/11/10 + */ +public class SendMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = this.getClass().getName(); + + /** + * 添加任务进行下发 + * + * @return + */ + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList acsTaskArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { // 任务 + JSONObject json = arr.getJSONObject(i); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + acsTaskArr.add(dto); + } + return acsTaskArr; + } + + /** + * @param task 代表一条任务对象 + * @param status 代表wcs任务完成状态: //0:acs,取消,:执行中,2:完成 + * @return + * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 + * @author ldjun + * @created 2019年4月17日 下午8:51:50 + */ + @Override + public void updateTaskStatus(JSONObject task, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String task_id = task.getString("task_id"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + //任务取消 + if (StrUtil.equals(status, "0")) { + // 取消删除任务 + if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + String point_code2 = taskObj.getString("point_code2"); + if (ObjectUtil.isEmpty(point_code2)) { + JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + endPoint.put("lock_type", "1"); + pointTab.update(endPoint); + } + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("remark", "已取消"); + taskTab.update(taskObj); + } + + if ("1".equals(status)) { + // 更新任务状态为执行中 + taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("car_no", taskObj.getString("car_no")); + taskTab.update(taskObj); + } + + if (StrUtil.equals(status, "2")) { + // 更改任务状态为完成 + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); + taskObj.put("update_optname", SecurityUtils.getCurrentUsername()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + + String point_code2 = taskObj.getString("point_code2"); + JSONObject point2Obj = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + JSONObject requestObj = task.getJSONObject("request_param"); + //工单标识 + String workorder_id = requestObj.getString("material_info_id"); + //生产工单表【PDM_BD_WorkOrder】 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + JSONObject workorderObj = workOrderTab.query("workorder_id", workorder_id).uniqueResult(0); + + //区域出入表【st_ivt_regionIO】 + WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); + JSONObject regionIoObj = new JSONObject(); + regionIoObj.put("iostorinv_id", IdUtil.getLongId()); + regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); + regionIoObj.put("buss_date", DateUtil.today()); + regionIoObj.put("io_type", "1"); + regionIoObj.put("region_id", point2Obj.getString("region_id")); + regionIoObj.put("region_code", point2Obj.getString("region_code")); + regionIoObj.put("region_name", point2Obj.getString("region_name")); + regionIoObj.put("material_id", taskObj.getString("material_id")); + regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); + regionIoObj.put("qty", requestObj.getString("qty")); + regionIoObj.put("bill_status", "3"); + regionIoObj.put("start_point_code", taskObj.getString("point_code1")); + regionIoObj.put("end_point_code", taskObj.getString("point_code3")); + regionIoObj.put("create_mode", "2"); + regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); + regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); + regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); + regionIoObj.put("create_time", DateUtil.now()); + regionIoTab.insert(regionIoObj); + + //完成后入库 + point2Obj.put("instorage_time", DateUtil.now()); + point2Obj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); + point2Obj.put("ivt_qty", requestObj.getString("qty")); + point2Obj.put("standing_time", workorderObj.getString("standing_time")); + point2Obj.put("material_id", workorderObj.getString("material_id")); + point2Obj.put("vehicle_type", workorderObj.getString("vehicle_type")); + point2Obj.put("vehicle_code", taskObj.getString("vehicle_code")); + point2Obj.put("is_full", requestObj.getString("is_full")); + + // 终点解锁 + point2Obj.put("lock_type", "1"); + point2Obj.put("point_status", "3"); + pointTab.update(point2Obj); + } + + } + + /** + * @param form 创建任务需要的参数 + * @return 返回任务标识 + */ + @Override + public String createTask(JSONObject form) { + String point_code1 = form.getString("point_code1"); + String vehicle_code = form.getString("vehicle_code"); + String qty = form.getString("qty"); + String is_full = form.getString("is_full"); + String weight = form.getString("weight"); + //任务表【SCH_BASE_Task】 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); + + //生产工单表【PDM_BD_WorkOrder】 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + //点位基础表【SCH_BASE_Point】 + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); + // 混碾机设备编码 + String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); + JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); + + SchTaskDto dto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("task_type") + .task_name("混碾机满料") + .material_qty(qty) + .task_status(TaskStatusEnum.SURE_START.getCode()) + .point_code1(point_code1) + .vehicle_code(vehicle_code) + .vehicle_type(workOrderObj.getString("vehicle_type")) + .material_info_id(workOrderObj.getLong("workorder_id")) + .material_id(workOrderObj.getLong("material_id")) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .request_param(form.toJSONString()) + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + //创建好立即下发 + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + /** + * @param task_id 任务标识 + * @return + * @discription 强制结束完成任务 + * @author ldjun + * @created 2020年6月19日 上午10:34:58 + */ + @Override + public void forceFinish(String task_id) { + + } + + /** + * 取消任务,货物搬回原点 + * + * @param task_id + */ + @Override + public void cancel(String task_id) { + + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/SzSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/SzSendMaterialTask.java new file mode 100644 index 0000000..0bb88e4 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/SzSendMaterialTask.java @@ -0,0 +1,290 @@ +package org.nl.wms.sch.tasks.sendMaterial; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.util.IdUtil; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author: lyd + * @description: 烧制满料入库 + * @Date: 2022/11/10 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class SzSendMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = SzSendMaterialTask.class.getName(); + /** + * 添加任务进行下发 + * + * @return + */ + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList acsTaskArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { // 任务 + JSONObject json = arr.getJSONObject(i); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + acsTaskArr.add(dto); + } + return acsTaskArr; + } + + /** + * @param task 代表一条任务对象 + * @param status 代表wcs任务完成状态: //0:acs,取消,:执行中,2:完成 + * @return + * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 + * @author ldjun + * @created 2019年4月17日 下午8:51:50 + */ + @Override + public void updateTaskStatus(JSONObject task, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String task_id = task.getString("task_id"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + //任务取消 + if (StrUtil.equals(status, "0")) { + // 取消删除任务 + if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + String point_code2 = taskObj.getString("point_code2"); + if (ObjectUtil.isEmpty(point_code2)) { + JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + endPoint.put("lock_type", "1"); + pointTab.update(endPoint); + } + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("remark", "已取消"); + taskTab.update(taskObj); + } + + if ("1".equals(status)) { + // 更新任务状态为执行中 + taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("car_no", taskObj.getString("car_no")); + taskTab.update(taskObj); + } + + if (StrUtil.equals(status, "2")) { + // 更改任务状态为完成 + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); + taskObj.put("update_optname", SecurityUtils.getCurrentUsername()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + + String point_code2 = taskObj.getString("point_code2"); + JSONObject point2Obj = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + JSONObject requestObj = task.getJSONObject("request_param"); + //工单标识 + String workorder_id = requestObj.getString("material_info_id"); + //生产工单表【PDM_BD_WorkOrder】 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + JSONObject workorderObj = workOrderTab.query("workorder_id", workorder_id).uniqueResult(0); + + //区域出入表【st_ivt_regionIO】 + WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); + JSONObject regionIoObj = new JSONObject(); + regionIoObj.put("iostorinv_id", IdUtil.getLongId()); + regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); + regionIoObj.put("buss_date", DateUtil.today()); + regionIoObj.put("io_type", "1"); // 入库 + regionIoObj.put("region_id", point2Obj.getString("region_id")); + regionIoObj.put("region_code", point2Obj.getString("region_code")); + regionIoObj.put("region_name", point2Obj.getString("region_name")); + regionIoObj.put("material_id", taskObj.getString("material_id")); + regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); + regionIoObj.put("qty", requestObj.getString("qty")); + regionIoObj.put("bill_status", "3"); + regionIoObj.put("start_point_code", taskObj.getString("point_code1")); + regionIoObj.put("end_point_code", taskObj.getString("point_code3")); + regionIoObj.put("create_mode", "2"); + regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); + regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); + regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); + regionIoObj.put("create_time", DateUtil.now()); + regionIoTab.insert(regionIoObj); + + //完成后入库 + point2Obj.put("instorage_time", DateUtil.now()); + point2Obj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); + point2Obj.put("ivt_qty", requestObj.getString("qty")); + point2Obj.put("standing_time", workorderObj.getString("standing_time")); + point2Obj.put("material_id", workorderObj.getString("material_id")); + point2Obj.put("vehicle_type", workorderObj.getString("vehicle_type")); + point2Obj.put("vehicle_code", taskObj.getString("vehicle_code")); + point2Obj.put("is_full", requestObj.getString("is_full")); + + // 终点解锁 + point2Obj.put("lock_type", "1"); + point2Obj.put("point_status", "3"); + pointTab.update(point2Obj); + } + } + + /** + * @param form 创建任务需要的参数 + * @return 返回任务标识 + * 压制机送料入窑缓存货架 + */ + @Override + public String createTask(JSONObject form) { + String point_code1 = form.getString("point_code1"); + String vehicle_code = form.getString("vehicle_code"); + String qty = form.getString("qty"); + String is_full = form.getString("is_full"); + String weight = form.getString("weight"); + //任务表【SCH_BASE_Task】 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); + + //生产工单表【PDM_BD_WorkOrder】 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + //点位基础表【SCH_BASE_Point】 + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); + // 压制机设备编码 + String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); + JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); + + SchTaskDto dto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("task_type") + .task_name("烧制入库") + .material_qty(qty) + .task_status(TaskStatusEnum.SURE_START.getCode()) + .point_code1(point_code1) + .vehicle_code(vehicle_code) + .vehicle_type(workOrderObj.getString("vehicle_type")) + .material_info_id(workOrderObj.getLong("workorder_id")) + .material_id(workOrderObj.getLong("material_id")) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .request_param(form.toJSONString()) + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + //创建好立即下发 + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + /** + * @return + * @discription 确定下一点位 + * @author ldjun + * @created 2020年6月12日 下午6:01:06 + */ + @Override + public void findNextPoint() { + // 查找出窑缓存货架 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + JSONObject taskObj = taskArr.getJSONObject(i); + String vehicle_type = taskObj.getString("vehicle_type"); + JSONObject param1 = new JSONObject(); + param1.put("flag", "1"); + param1.put("region_code", "CYZCQ"); + param1.put("vehicle_type", "%" + vehicle_type + "%"); + //1、查找出窑缓存区的空位 + JSONObject endPoint = WQL.getWO("QSCH_szSendMaterial_01").addParamMap(param1).process().uniqueResult(0); + if (ObjectUtil.isEmpty(endPoint)) { + taskObj.put("remark", "出窑暂存区无可用货位!"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } else { + taskObj.put("update_time", DateUtil.now()); + taskObj.put("point_code2", endPoint.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskTab.update(taskObj); + + //锁住终点 + endPoint.put("task_id", taskObj.getString("task_id")); + endPoint.put("lock_type", "2"); + pointTab.update(endPoint); + } + } + } + + /** + * @param task_id 任务标识 + * @return + * @discription 强制结束完成任务 + * @author ldjun + * @created 2020年6月19日 上午10:34:58 + */ + @Override + public void forceFinish(String task_id) { + /* + * 强制完成 + */ + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + this.updateTaskStatus(taskObj,"2"); + else { + throw new BadRequestException("未找到该任务或者任务已完成!"); + } + } + + /** + * 取消任务,货物搬回原点 + * + * @param task_id + */ + @Override + public void cancel(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + this.updateTaskStatus(taskObj,"0"); + else { + throw new BadRequestException("未找到该任务或者任务已完成!"); + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YqxSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YqxSendMaterialTask.java deleted file mode 100644 index c28b8e4..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YqxSendMaterialTask.java +++ /dev/null @@ -1,275 +0,0 @@ -package org.nl.wms.sch.tasks.sendMaterial; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.modules.wql.util.SpringContextHolder; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.service.PointService; -import org.nl.wms.sch.service.dto.PointDto; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.sch.tasks.RegionTypeEnum; -import org.nl.wms.util.IdUtil; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - - -/** - * 油漆线送物料 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class YqxSendMaterialTask extends AbstractAcsTask { - private final String THIS_CLASS = YqxSendMaterialTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject taskObj, String status) { - /** - *改变任务状态 - **/ - String task_id = taskObj.getString("task_id"); - WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - JSONObject jsonTask = taskTab.query("task_id='" + task_id + "'").uniqueResult(0); - - if (StrUtil.equals(status, "0")) { - //取消任务,释放相关点位的锁 - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code2"); - JSONObject param = new JSONObject(); - param.put("lock_type", "1"); - param.put("task_id", ""); - pointTab.update(param, "point_code = '" + point_code1 + "'"); - pointTab.update(param, "point_code = '" + point_code2 + "'"); - - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("remark", "已取消"); - taskTab.update(jsonTask); - } - - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - //更新任务状态为执行中 - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("car_no", taskObj.getString("car_no")); - taskTab.update(jsonTask); - } - - if (TaskStatusEnum.FINISHED.getCode().equals(status)) { - // 更新任务状态为完成 - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("taskfinish_mode", taskObj.getString("taskfinish_mode")); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("remark", "任务执行完成"); - taskTab.update(jsonTask); - - - //取消任务,释放相关点位的锁 - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code2"); - JSONObject param = new JSONObject(); - param.put("lock_type", "1"); - param.put("task_id", ""); - - pointTab.update(param, "point_code = '" + point_code1 + "'"); - - param.put("point_status", "3"); - pointTab.update(param, "point_code = '" + point_code2 + "'"); - } - - } - - @Override - public void findNextPoint() { - String task_status = TaskStatusEnum.SURE_START.getCode(); - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - JSONArray taskArry = taskTab.query("task_status='" + task_status + "' AND handle_class='" + THIS_CLASS + "' AND is_delete='0' ").getResultJSONArray(0); - for (int i = 0; i < taskArry.size(); i++) { - JSONObject taskObj = taskArry.getJSONObject(i); - String task_id = taskObj.getString("task_id"); - - JSONObject param = new JSONObject(); - param.put("flag", "1"); - JSONObject endPoint = WQL.getWO("QSCH_yqxSendMaterial_01").addParamMap(param).process().uniqueResult(0); - if (ObjectUtil.isEmpty(endPoint)) { - taskObj.put("remark", "电梯无可用点"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } else { - //锁住点位 - endPoint.put("lock_type", "2"); - endPoint.put("task_id", task_id); - pointTab.update(endPoint); - - //修改任务状态 - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskObj.put("point_code2", endPoint.getString("point_code")); - taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); - taskObj.put("update_optname", SecurityUtils.getCurrentNickName()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public String createTask(JSONObject whereJson) { - String point_code1 = whereJson.getString("point_code1"); - String vehicle_type = whereJson.getString("vehicle_type"); - String vehicle_code = whereJson.getString("vehicle_code"); - String qty = whereJson.getString("qty"); - - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - - //任务表【SCH_BASE_Task】 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); - - - String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); - - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - SchTaskDto dto = SchTaskDto.builder() - .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("task_type") - .task_name("油漆线满料") - .task_status(TaskStatusEnum.SURE_START.getCode()) - .point_code1(point_code1) - .vehicle_code(vehicle_code) - .material_info_id(workOrderObj.getLong("workorder_id")) - .material_id(workOrderObj.getLong("material_id")) - .vehicle_type(vehicle_type) - .handle_class(THIS_CLASS) - .material_qty(qty) - .create_time(DateUtil.now()) - .request_param(whereJson.toJSONString()) - .build(); - //任务表【SCH_BASE_Task】 - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - //创建好立即下发 - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - - @Override - public void forceFinish(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"2"); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } - } - - @Override - public void cancel(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"0"); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } - } - - @Transactional(rollbackFor = Exception.class) - public JSONObject findEndPoint(JSONObject json) { - String point_code1 = json.getString("point_code1"); - - WQLObject regionTab = WQLObject.getWQLObject("SCH_BASE_Region"); - - // 根据起点判断是什么区域 然后要入到什么区 - PointDto startDto = SpringContextHolder.getBean(PointService.class).findByCode(point_code1); - if (ObjectUtil.isEmpty(startDto)) throw new BadRequestException("起点点位不存在"); - JSONObject jsonStartRegion = regionTab.query("region_id = '" + startDto.getRegion_id() + "'").uniqueResult(0); - - /* - * 物料入库业务:目前只有2个业务,如果区域不正确则报错 - * 1.共挤线 --> 养生区A - * 2.豪凯线 --> 成品区 - */ - String point_code2 = ""; - if (StrUtil.equals(jsonStartRegion.getString("region_code"), RegionTypeEnum.GJQY.getCode())) { - JSONObject map = new JSONObject(); - map.put("flag", "2"); - map.put("region_code", RegionTypeEnum.YSQA.getCode()); - JSONObject jsonEndPoint = WQL.getWO("ST_REGION_IN_01").addParamMap(map).process().uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonEndPoint)) throw new BadRequestException("仓位不足"); - point_code2 = jsonEndPoint.getString("point_code"); - } else if (StrUtil.equals(jsonStartRegion.getString("region_code"), RegionTypeEnum.HKQY.getCode())) { - JSONObject map = new JSONObject(); - map.put("flag", "2"); - map.put("region_code", RegionTypeEnum.CPQYA.getCode()); - JSONObject jsonEndPoint = WQL.getWO("ST_REGION_IN_01").addParamMap(map).process().uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonEndPoint)) throw new BadRequestException("仓位不足"); - point_code2 = jsonEndPoint.getString("point_code"); - } - - JSONObject resuft = new JSONObject(); - resuft.put("point_code2", point_code2); - return resuft; - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList acsTaskArr = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(json.getString("point_code1")) - .next_device_code(json.getString("point_code3")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - acsTaskArr.add(dto); - } - return acsTaskArr; - } - -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YzjSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YzjSendMaterialTask.java new file mode 100644 index 0000000..d2a902f --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YzjSendMaterialTask.java @@ -0,0 +1,294 @@ +package org.nl.wms.sch.tasks.sendMaterial; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.util.IdUtil; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author: lyd + * @description: 压制机满料入库 + * @Date: 2022/11/10 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class YzjSendMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = YzjSendMaterialTask.class.getName(); + /** + * 添加任务进行下发 + * + * @return + */ + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList acsTaskArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { // 任务 + JSONObject json = arr.getJSONObject(i); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + acsTaskArr.add(dto); + } + return acsTaskArr; + } + + /** + * @param task 代表一条任务对象 + * @param status 代表wcs任务完成状态: //0:acs,取消,:执行中,2:完成 + * @return + * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 + * @author ldjun + * @created 2019年4月17日 下午8:51:50 + */ + @Override + public void updateTaskStatus(JSONObject task, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String task_id = task.getString("task_id"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + //任务取消 + if (StrUtil.equals(status, "0")) { + // 取消删除任务 + if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + String point_code2 = taskObj.getString("point_code2"); + if (ObjectUtil.isEmpty(point_code2)) { + JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + endPoint.put("lock_type", "1"); + pointTab.update(endPoint); + } + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("remark", "已取消"); + taskTab.update(taskObj); + } + + if ("1".equals(status)) { + // 更新任务状态为执行中 + taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("car_no", taskObj.getString("car_no")); + taskTab.update(taskObj); + } + + if (StrUtil.equals(status, "2")) { + // 更改任务状态为完成 + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); + taskObj.put("update_optname", SecurityUtils.getCurrentUsername()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + + String point_code2 = taskObj.getString("point_code2"); + JSONObject point2Obj = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + JSONObject requestObj = task.getJSONObject("request_param"); + //工单标识 + String workorder_id = requestObj.getString("material_info_id"); + //生产工单表【PDM_BD_WorkOrder】 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + JSONObject workorderObj = workOrderTab.query("workorder_id", workorder_id).uniqueResult(0); + + //区域出入表【st_ivt_regionIO】 + WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); + JSONObject regionIoObj = new JSONObject(); + regionIoObj.put("iostorinv_id", IdUtil.getLongId()); + regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); + regionIoObj.put("buss_date", DateUtil.today()); + regionIoObj.put("io_type", "1"); // 入库 + regionIoObj.put("region_id", point2Obj.getString("region_id")); + regionIoObj.put("region_code", point2Obj.getString("region_code")); + regionIoObj.put("region_name", point2Obj.getString("region_name")); + regionIoObj.put("material_id", taskObj.getString("material_id")); + regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); + regionIoObj.put("qty", requestObj.getString("qty")); + regionIoObj.put("bill_status", "3"); + regionIoObj.put("start_point_code", taskObj.getString("point_code1")); + regionIoObj.put("end_point_code", taskObj.getString("point_code3")); + regionIoObj.put("create_mode", "2"); + regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); + regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); + regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); + regionIoObj.put("create_time", DateUtil.now()); + regionIoTab.insert(regionIoObj); + + //完成后入库 + point2Obj.put("instorage_time", DateUtil.now()); + point2Obj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); + point2Obj.put("ivt_qty", requestObj.getString("qty")); + point2Obj.put("standing_time", workorderObj.getString("standing_time")); + point2Obj.put("material_id", workorderObj.getString("material_id")); + point2Obj.put("vehicle_type", workorderObj.getString("vehicle_type")); + point2Obj.put("vehicle_code", taskObj.getString("vehicle_code")); + point2Obj.put("is_full", requestObj.getString("is_full")); + + // 终点解锁 + point2Obj.put("lock_type", "1"); + point2Obj.put("point_status", "3"); + pointTab.update(point2Obj); + } + } + + /** + * @param form 创建任务需要的参数 + * @return 返回任务标识 + * 压制机送料入窑缓存货架 + */ + @Override + public String createTask(JSONObject form) { + String point_code1 = form.getString("point_code1"); + String vehicle_code = form.getString("vehicle_code"); + String qty = form.getString("qty"); + String is_full = form.getString("is_full"); + String weight = form.getString("weight"); + //任务表【SCH_BASE_Task】 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); + + //生产工单表【PDM_BD_WorkOrder】 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + //点位基础表【SCH_BASE_Point】 + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); + // 压制机设备编码 + String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); + JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); + + SchTaskDto dto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("task_type") + .task_name("压制机满料") + .material_qty(qty) + .task_status(TaskStatusEnum.SURE_START.getCode()) + .point_code1(point_code1) + .vehicle_code(vehicle_code) + .vehicle_type(workOrderObj.getString("vehicle_type")) + .material_info_id(workOrderObj.getLong("workorder_id")) + .material_id(workOrderObj.getLong("material_id")) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .request_param(form.toJSONString()) + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + //创建好立即下发 + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + /** + * @return + * @discription 确定下一点位 + * @author ldjun + * @created 2020年6月12日 下午6:01:06 + */ + @Override + public void findNextPoint() { + /** + * 根据业务找到相应的终点 + */ + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + JSONObject taskObj = taskArr.getJSONObject(i); + String vehicle_type = taskObj.getString("vehicle_type"); + JSONObject param1 = new JSONObject(); + param1.put("flag", "1"); + param1.put("region_code", "RYZCQ"); + param1.put("vehicle_type", "%" + vehicle_type + "%"); + //1、查找入窑暂存货架的空位 + JSONObject endPoint = WQL.getWO("QSCH_yzSendMaterial_01").addParamMap(param1).process().uniqueResult(0); + if (ObjectUtil.isEmpty(endPoint)) { + taskObj.put("remark", "困料货架无可用货位!"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } else { + taskObj.put("update_time", DateUtil.now()); + taskObj.put("point_code2", endPoint.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskTab.update(taskObj); + + //锁住终点 + endPoint.put("task_id", taskObj.getString("task_id")); + endPoint.put("lock_type", "2"); + pointTab.update(endPoint); + } + + + } + } + + /** + * @param task_id 任务标识 + * @return + * @discription 强制结束完成任务 + * @author ldjun + * @created 2020年6月19日 上午10:34:58 + */ + @Override + public void forceFinish(String task_id) { + /* + * 强制完成 + */ + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + this.updateTaskStatus(taskObj,"2"); + else { + throw new BadRequestException("未找到该任务或者任务已完成!"); + } + } + + /** + * 取消任务,货物搬回原点 + * + * @param task_id + */ + @Override + public void cancel(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + this.updateTaskStatus(taskObj,"0"); + else { + throw new BadRequestException("未找到该任务或者任务已完成!"); + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_fjCallEmptyVehicle_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_fjCallEmptyVehicle_01.wql new file mode 100644 index 0000000..b85146d --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_fjCallEmptyVehicle_01.wql @@ -0,0 +1,66 @@ +[交易说明] + 交易名: 分拣送料 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.region_code TYPEAS s_string + 输入.material_id TYPEAS s_string + 输入.vehicle_type TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## +IF 输入.flag = "1" + QUERY + SELECT + p.point_id, + p.point_code, + p.point_name + FROM + SCH_BASE_Point p + WHERE + lock_type = '1' + AND is_used = '1' + AND is_delete = '0' + AND point_status = '1' + AND point_type = '1' + OPTION 输入.vehicle_type <> "" + p.can_vehicle_type like 输入.vehicle_type + ENDOPTION + OPTION 输入.region_code <> "" + p.region_code = 输入.region_code + ENDOPTION + ORDER BY col_num,row_num,layer_num + ENDSELECT + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_hkxSendMaterial_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_hnSendMaterial_01.wql similarity index 96% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_hkxSendMaterial_01.wql rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_hnSendMaterial_01.wql index 69e7b81..592893c 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_hkxSendMaterial_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_hnSendMaterial_01.wql @@ -1,5 +1,5 @@ [交易说明] - 交易名: 豪凯线送料请求 + 交易名: 混碾机送料 所属模块: 功能简述: 版权所有: @@ -40,8 +40,7 @@ ########################################## # 3、业务主过程 # ########################################## - - IF 输入.flag = "1" +IF 输入.flag = "1" QUERY SELECT p.point_id, @@ -64,6 +63,3 @@ ENDSELECT ENDQUERY ENDIF - - - diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_yqxSendMaterial_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_szSendMaterial_01.wql similarity index 77% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_yqxSendMaterial_01.wql rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_szSendMaterial_01.wql index 0e1582e..e840e78 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_yqxSendMaterial_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_szSendMaterial_01.wql @@ -1,5 +1,5 @@ [交易说明] - 交易名: 油漆线送料请求 + 交易名: 烧制入库 所属模块: 功能简述: 版权所有: @@ -40,8 +40,7 @@ ########################################## # 3、业务主过程 # ########################################## - - IF 输入.flag = "1" +IF 输入.flag = "1" QUERY SELECT p.point_id, @@ -53,10 +52,14 @@ lock_type = '1' AND is_used = '1' AND is_delete = '0' - and (point_code = 'SSX01A2' or point_code = 'SSX02A1') + AND point_status = '1' + OPTION 输入.vehicle_type <> "" + p.can_vehicle_type like 输入.vehicle_type + ENDOPTION + OPTION 输入.region_code <> "" + p.region_code = 输入.region_code + ENDOPTION + ORDER BY col_num,row_num,layer_num ENDSELECT ENDQUERY ENDIF - - - diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_YqxCallEmpVehicleTask.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_yzSendMaterial_01.wql similarity index 51% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_YqxCallEmpVehicleTask.wql rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_yzSendMaterial_01.wql index 8163667..5bfd567 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_YqxCallEmpVehicleTask.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_yzSendMaterial_01.wql @@ -1,5 +1,5 @@ [交易说明] - 交易名: 油漆线申请空盘 + 交易名: 压制机送料 所属模块: 功能简述: 版权所有: @@ -13,8 +13,11 @@ ################################################# ## 表字段对应输入参数 ################################################# - 输入.flag TYPEAS s_string - 输入.vehicle_type TYPEAS s_string + 输入.flag TYPEAS s_string + 输入.region_code TYPEAS s_string + 输入.material_id TYPEAS s_string + 输入.vehicle_type TYPEAS s_string + [临时表] --这边列出来的临时表就会在运行期动态创建 @@ -37,24 +40,26 @@ ########################################## # 3、业务主过程 # ########################################## - - IF 输入.flag = "1" - QUERY - SELECT - * - FROM - SCH_BASE_Point - WHERE - is_used = '1' - AND is_delete = '0' - AND lock_type = '1' - AND point_status = '2' - AND region_code = 'KTPHCQA01' - - OPTION 输入.vehicle_type <> "" - can_vehicle_type = 输入.vehicle_type +IF 输入.flag = "1" + QUERY + SELECT + p.point_id, + p.point_code, + p.point_name + FROM + SCH_BASE_Point p + WHERE + lock_type = '1' + AND is_used = '1' + AND is_delete = '0' + AND point_status = '1' + OPTION 输入.vehicle_type <> "" + p.can_vehicle_type like 输入.vehicle_type ENDOPTION - - ENDSELECT - ENDQUERY - ENDIF \ No newline at end of file + OPTION 输入.region_code <> "" + p.region_code = 输入.region_code + ENDOPTION + ORDER BY col_num,row_num,layer_num + ENDSELECT + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/bill/service/impl/RegionIoServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/bill/service/impl/RegionIoServiceImpl.java index 9d00621..520913b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/bill/service/impl/RegionIoServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/bill/service/impl/RegionIoServiceImpl.java @@ -5,9 +5,7 @@ import lombok.RequiredArgsConstructor; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.WQL; import org.nl.modules.wql.util.SpringContextHolder; -import org.nl.wms.sch.service.RegionService; import org.nl.wms.sch.tasks.cpOut.CpOutTask; -import org.nl.wms.sch.tasks.sendMaterial.HkxSendMaterialTask; import org.nl.wms.st.bill.service.RegionIoService; import org.nl.wms.st.bill.service.dto.RegionIoDto; import org.springframework.stereotype.Service; @@ -22,7 +20,6 @@ import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.wql.core.bean.ResultBean; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.WqlUtil; import lombok.extern.slf4j.Slf4j; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls b/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls index 0c2e02a..1248824 100644 Binary files a/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls and b/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls differ diff --git a/lms/nladmin-ui/src/views/wms/pdm/device/index.vue b/lms/nladmin-ui/src/views/wms/pdm/device/index.vue index f192457..114447e 100644 --- a/lms/nladmin-ui/src/views/wms/pdm/device/index.vue +++ b/lms/nladmin-ui/src/views/wms/pdm/device/index.vue @@ -48,8 +48,12 @@ - - + + + +