diff --git a/lms/nladmin-system/src/main/java/org/nl/config/MapOf.java b/lms/nladmin-system/src/main/java/org/nl/config/MapOf.java new file mode 100644 index 0000000..47c1dec --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/config/MapOf.java @@ -0,0 +1,20 @@ +package org.nl.config; + + +import java.io.Serializable; +import java.util.HashMap; + +/* + * @author ZZQ + * @Date 2022/11/29 2:55 下午 + */ +public class MapOf implements Serializable { + + public static HashMap of(K... key){ + HashMap map = new HashMap<>(); + for (int i = 0; i < (key.length & ~1); i=i+2) { + map.put(key[i],key[i+1]); + } + return map; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/YqxhcqCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/YqxhcqCallMaterialTask.java new file mode 100644 index 0000000..c5204d9 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/YqxhcqCallMaterialTask.java @@ -0,0 +1,339 @@ +package org.nl.wms.sch.tasks.autoTask; + +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.config.MapOf; +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: 2023/2/25 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class YqxhcqCallMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = YqxhcqCallMaterialTask.class.getName(); + @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"); + if (ObjectUtil.isEmpty(point_code)) { + // 证明是等待点 + point_code = json.getString("point_code3"); + } + String newPoint = point_code.substring(0, 4) + "2" + point_code.substring(4, 10); + + 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_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; + } + + @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); + // 物料点 + JSONObject material_point = pointTab.query("point_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); + // 等待点 + JSONObject wait_point = pointTab.query("point_code = '" + taskObj.getString("point_code3") + "'").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.isEmpty(material_point)) return; + // 点位解锁 + 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()); + taskObj.put("remark", "任务完成"); + taskTab.update(taskObj); + + if (ObjectUtil.isEmpty(material_point)) return; + +// 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", taskObj.getString("material_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("material_id", ""); + material_point.put("vehicle_type", ""); + material_point.put("vehicle_code", ""); + pointTab.update(material_point); + + // 油漆线缓存点位更新 + JSONObject yqx_point = pointTab.query("point_code = '" + taskObj.getString("point_code2") + "'").uniqueResult(0); + yqx_point.put("point_status", "3"); + yqx_point.put("material_id", taskObj.getString("material_id")); + yqx_point.put("vehicle_type", taskObj.getString("vehicle_type")); + yqx_point.put("material_qty", taskObj.getString("material_qty")); + yqx_point.put("vehicle_qty", taskObj.getString("vehicle_qty")); + pointTab.update(yqx_point); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void autoCreate() { + // 自动叫料 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); +// JSONArray allPoints = pointTab.query("region_code = 'YQXHCQ' AND lock_type = '1'" + +// " AND is_used = '1' AND is_delete = '0'").getResultJSONArray(0); +// String hcs = ""; +// for (int i = 0; i < allPoints.size(); i++) { +// hcs = hcs + "'" + allPoints.getJSONObject(i).getString("point_code") + "'"; +// if (i < allPoints.size()) hcs = hcs + ","; +// } + // 限制只搬一次 +// JSONObject oneTask = taskTab.query("point_code2 in ('YQXHC01','YQXHC02','YQXHC03') AND " + +// "is_delete='0' AND task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "' FOR UPDATE").uniqueResult(0); +// if (ObjectUtil.isNotEmpty(oneTask)) return; + // 找终点:四个缓存区按顺序获取一个 + JSONObject endPoint = WQL.getWO("YQX_AUTOTASK").addParamMap(MapOf.of("flag","1")).process().uniqueResult(0); +// JSONObject endPoint = pointTab.query("region_code = 'YQXHCQ' AND point_status = '1' AND lock_type = '1'" + +// " AND is_used = '1' AND is_delete = '0'", "point_code").uniqueResult(0); + if (ObjectUtil.isEmpty(endPoint)) return; + String point_code2 = endPoint.getString("point_code"); + // 判断任务 + 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 + "存在未完成的任务"); + // 判断工单 + JSONObject workOrderObj = workOrderTab.query("device_code = '" + endPoint.getString("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("油漆线叫料") + .acs_task_type("2")//2楼AGV普通任务 + .priority("7") + .task_status(TaskStatusEnum.SURE_END.getCode()) + .point_code2(point_code2) + .vehicle_qty(1) + .material_info_id(workOrderObj.getLong("workorder_id")) + .material_id(workOrderObj.getLong("material_id")) + .vehicle_type(workOrderObj.getString("vehicle_type")) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .remark("任务创建成功") + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void findStartPoint() { + // 到养生A区找起点:根据物料、载具类型去查找,均在工单中 + 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 ); + // 查找养生A区,如果最后一个位置有货,直接搬走,如果没货,就作为等待点。先让agv到达等待点 + // 1、根据物料id查找养生A区物料点 + JSONObject materialPoint = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(queryParam).process().uniqueResult(0); + if (ObjectUtil.isNotEmpty(materialPoint)) { + // 2、判断是否在等待点,如果不是,先去等待点,是直接搬运 + // 2.1、获取当前快排列的等待点 row:排 + JSONObject waitPoint = WQL.getWO("QSCH_yqxCallMAterial_01") + .addParamMap(MapOf.of("flag", "2", "block_num", materialPoint.getString("block_num"), + "row_num", materialPoint.getString("row_num"))).process() + .uniqueResult(0); + if (ObjectUtil.isEmpty(waitPoint)) throw new BadRequestException("油漆线缓存区判断等待点异常!"); + // 2.2、判断等待点 + if (!waitPoint.getString("waitcol").equals(materialPoint.getString("col_num"))) { + // 获取等待点 + JSONObject waitPoints = pointTab.query("block_num = '" + materialPoint.getString("block_num") + "' " + + "AND row_num = '" + materialPoint.getString("row_num") + "' " + + "AND col_num = '" + waitPoint.getString("waitcol") + "' " + + "AND is_used = '1' " + + "AND is_delete = '0' " + + "AND lock_type = '1'").uniqueResult(0); + if (ObjectUtil.isEmpty(waitPoints)) { + taskObj.put("remark", "等待点已被占用"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + continue; + } + // 等待点上锁 +// waitPoints.put("lock_type", "2"); + pointTab.update(waitPoints); + + taskObj.put("point_code3", waitPoints.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("acs_task_type", "3"); + taskObj.put("remark", "等待点"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + continue; + } + // 是等待点直接搬走 + // 物料点位上锁 + materialPoint.put("lock_type", "2"); + pointTab.update(materialPoint); + + taskObj.put("point_code1", materialPoint.getString("point_code")); + taskObj.put("material_qty", materialPoint.getString("ivt_qty")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("acs_task_type", "2"); + taskObj.put("remark", "等待点搬运物料"); + 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 String createTask(JSONObject whereJson) { + return null; + } + + @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.isEmpty(taskObj)) throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj,"2"); + } + + @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.isEmpty(taskObj)) throw new BadRequestException("任务已完成不能取消!"); + this.updateTaskStatus(taskObj,"0"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String againApply(String task_id) { + // 二次下发任务 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 + JSONObject hcTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(hcTask)) throw new BadRequestException("任务ID: " + task_id + "的任务不存在!"); + JSONObject waitPoint = pointTab.query("point_code = '" + hcTask.getString("point_code3") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(waitPoint)) throw new BadRequestException("油漆线二次下发等待点编码错误!"); + JSONObject materialPoint = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(MapOf.of( + "flag", "3", "material_id", hcTask.getString("material_id"), + "region_code", "YSQA01", "vehicle_type", hcTask.getString("vehicle_type"), + "block_num", hcTask.getString("block_num"), "col_num", hcTask.getString("col_num") + )).process().uniqueResult(0); + if (ObjectUtil.isEmpty(materialPoint)) throw new BadRequestException("养生A区暂无所需物料!"); + String pointCode = materialPoint.getString("point_code"); + // 修改任务 + hcTask.put("point_code1", pointCode); + hcTask.put("remark", "养生A区:" + pointCode); + taskTab.update(hcTask); + // 锁住点位 + materialPoint.put("lock_type", "2"); + pointTab.update(materialPoint); + // 点位处理 + //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) + String newPoint = pointCode.substring(0, 4) + "2" + pointCode.substring(4, 10); + return newPoint; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/wql/YQX_AUTOTASK.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/wql/YQX_AUTOTASK.wql new file mode 100644 index 0000000..8f0f5a9 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/wql/YQX_AUTOTASK.wql @@ -0,0 +1,61 @@ +[交易说明] + 交易名: 共挤线满料请求 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为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.* + FROM + SCH_BASE_Point p + WHERE + p.region_code = 'YQXHCQ' + AND p.point_status = '1' + AND p.lock_type = '1' + AND p.is_used = '1' + AND p.is_delete = '0' + AND p.point_code NOT IN ( SELECT t.point_code2 FROM sch_base_task t WHERE t.point_code2 IN ( + SELECT point_code FROM sch_base_point p2 WHERE p2.region_code = 'YQXHCQ' + ) AND task_status <> '7') + ORDER BY p.point_code + ENDSELECT + ENDQUERY + ENDIF 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/YqxCallMaterialTask.java index c73c43c..9c7c9e4 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/YqxCallMaterialTask.java @@ -56,6 +56,7 @@ public class YqxCallMaterialTask extends AbstractAcsTask { taskTab.update(taskObj); // 点位解锁 + if (ObjectUtil.isEmpty(material_point)) return; material_point.put("lock_type", "1"); pointTab.update(material_point); } @@ -74,7 +75,7 @@ public class YqxCallMaterialTask extends AbstractAcsTask { taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); - JSONObject requestObj = task.getJSONObject("request_param"); +// JSONObject requestObj = task.getJSONObject("request_param"); //区域出入表【st_ivt_regionIO】 WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); @@ -88,7 +89,7 @@ public class YqxCallMaterialTask extends AbstractAcsTask { 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", taskObj.getString("material_qty")); regionIoObj.put("bill_status", "3"); regionIoObj.put("start_point_code", taskObj.getString("point_code1")); regionIoObj.put("end_point_code", taskObj.getString("point_code2")); @@ -101,9 +102,9 @@ public class YqxCallMaterialTask extends AbstractAcsTask { //完成后 // 物料点位解锁 并设置空位 + if (ObjectUtil.isEmpty(material_point)) return; material_point.put("lock_type", "1"); material_point.put("point_status", "1"); - material_point.put("task_id", ""); material_point.put("material_id", ""); material_point.put("vehicle_type", ""); material_point.put("vehicle_code", ""); @@ -124,28 +125,23 @@ public class YqxCallMaterialTask extends AbstractAcsTask { 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("region_code = 'YQXHCQ' AND material_id = '" + material_id + "' " + + "AND vehicle_type = '" + vehicle_type + "' AND is_used = '1' AND lock_type = '1' AND is_delete = '0'", "point_code").uniqueResult(0); + if (ObjectUtil.isNotEmpty(material_point)) { // 拿到点位 - 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("material_qty", material_point.getString("ivt_qty")); taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); taskObj.put("acs_task_type", "2"); + taskObj.put("remark", ""); taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); } else { - taskObj.put("remark", "养生A区无所需物料"); + taskObj.put("remark", "油漆线缓存区无所需物料"); taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); } @@ -165,13 +161,13 @@ public class YqxCallMaterialTask extends AbstractAcsTask { 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) + "2" + point_code.substring(4, 10); +// String newPoint = point_code.substring(0, 4) + "2" + point_code.substring(4, 10); 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) + .start_device_code(point_code) .next_device_code(json.getString("point_code2")) .vehicle_code(json.getString("vehicle_code")) .vehicle_type(json.getString("vehicle_type")) @@ -186,9 +182,6 @@ public class YqxCallMaterialTask extends AbstractAcsTask { @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"); //生产工单表【PDM_BD_WorkOrder】 WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); @@ -208,11 +201,10 @@ public class YqxCallMaterialTask extends AbstractAcsTask { .task_code(CodeUtil.getNewCode("TASK_CODE")) .task_type("task_type") .task_name("油漆线叫料") - .material_qty(qty) + .acs_task_type("2")//2楼AGV普通任务 .priority("8") .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(workOrderObj.getString("vehicle_type")) @@ -232,11 +224,8 @@ public class YqxCallMaterialTask extends AbstractAcsTask { 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("未找到该任务或者任务已完成!"); - } + if (ObjectUtil.isEmpty(taskObj)) throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj,"2"); } @@ -244,10 +233,7 @@ public class YqxCallMaterialTask extends AbstractAcsTask { 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("任务已完成不能取消!"); - } + if (ObjectUtil.isEmpty(taskObj)) throw new BadRequestException("任务已完成不能取消!"); + this.updateTaskStatus(taskObj,"0"); } } 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_yqxCallMAterial_01.wql index 915bfd8..f9d59ca 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_yqxCallMAterial_01.wql @@ -13,10 +13,13 @@ ################################################# ## 表字段对应输入参数 ################################################# - 输入.flag TYPEAS s_string - 输入.region_code TYPEAS s_string - 输入.material_id 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 + 输入.block_num TYPEAS s_string + 输入.row_num TYPEAS s_string + 输入.col_num TYPEAS s_string [临时表] @@ -62,7 +65,60 @@ p.region_code = 输入.region_code ENDOPTION OPTION 输入.vehicle_type <> "" - p.can_vehicle_type like 输入.vehicle_type + p.vehicle_type = 输入.vehicle_type + ENDOPTION + ORDER BY block_num,col_num desc,row_num + ENDSELECT + ENDQUERY + ENDIF + IF 输入.flag = "2" + QUERY + SELECT + MAX(p.col_num) waitCol + FROM + SCH_BASE_Point p + WHERE + 1 = 1 + OPTION 输入.block_num <> "" + p.block_num = 输入.block_num + ENDOPTION + OPTION 输入.row_num <> "" + p.row_num = 输入.row_num + ENDOPTION + AND p.is_used = '1' + AND p.is_delete = '0' + ENDSELECT + ENDQUERY + ENDIF + IF 输入.flag = "3" + 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' + OPTION 输入.material_id <> "" + p.material_id = 输入.material_id + ENDOPTION + OPTION 输入.region_code <> "" + p.region_code = 输入.region_code + ENDOPTION + OPTION 输入.vehicle_type <> "" + p.vehicle_type = 输入.vehicle_type + ENDOPTION + OPTION 输入.col_num <> "" + p.col_num = 输入.col_num + ENDOPTION + OPTION 输入.row_num <> "" + p.row_num = 输入.row_num ENDOPTION ORDER BY block_num,col_num desc,row_num ENDSELECT diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/remark.txt b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/remark.txt new file mode 100644 index 0000000..26e870a --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/remark.txt @@ -0,0 +1,254 @@ +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 org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + + +/** + *油漆线叫料 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class YqxCallMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = YqxCallMaterialTask.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); + // 物料点 + 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); + + // 点位解锁 + 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("material_num")); + 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("material_id", ""); + material_point.put("vehicle_type", ""); + material_point.put("vehicle_code", ""); + pointTab.update(material_point); + } + + } + + @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) + "2" + point_code.substring(4, 10); + + 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_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; + } + + @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"); + + //生产工单表【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) + .acs_task_type("2")//2楼AGV普通任务 + .priority("8") + .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(workOrderObj.getString("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("任务已完成不能取消!"); + } + } +} 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 index 7e301b8..f111ac8 100644 --- 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 @@ -159,9 +159,11 @@ public class YqxSendMaterialTask extends AbstractAcsTask { String vehicleType = workOrderObj.getString("vehicle_type"); if (ObjectUtil.isEmpty(vehicleType)) throw new BadRequestException("载具类型不能为空"); //JSONObject jsonObject = pointTab.query("region_code = 'YQQY01' and point_type = '4' and can_vehicle_type = '" + vehicleType + "'").uniqueResult(0); - JSONObject jsonObject = pointTab.query("region_code = 'YQQY01' and point_type = '4' and can_vehicle_type = '" + vehicleType + "' FOR UPDATE").uniqueResult(0); + // 根据工单的载具类型去找到物料下料点 + JSONObject jsonObject = pointTab.query("region_code = 'YQQY01' and point_type = '4' and can_vehicle_type = '" + vehicleType + "'").uniqueResult(0); if (ObjectUtil.isEmpty(jsonObject)) throw new BadRequestException("找不到油漆线物料下料起点"); String startPointCode = jsonObject.getString("point_code"); + if (!startPointCode.equals(point_code1)) return null; //判断当前点是否有未完成的任务 JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + startPointCode + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + startPointCode + "存在未完成的任务"); diff --git a/lms/nladmin-ui/src/views/wms/sch/point/index.vue b/lms/nladmin-ui/src/views/wms/sch/point/index.vue index 54dda10..13ceca5 100644 --- a/lms/nladmin-ui/src/views/wms/sch/point/index.vue +++ b/lms/nladmin-ui/src/views/wms/sch/point/index.vue @@ -199,9 +199,9 @@ :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" - width="520px" + width="540px" > - + @@ -274,8 +274,19 @@ - + + + + + + + + - + +