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 f5a18b6..f5b9cb1 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 @@ -21,13 +21,13 @@ import org.nl.wms.pdm.service.dto.DeviceDto; import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.service.PointService; import org.nl.wms.sch.service.TaskService; -import org.nl.wms.sch.service.dto.TaskDto; -import org.nl.wms.sch.tasks.PointToPointTask; import org.nl.wms.sch.tasks.callEmpty.GjxCallEmpVehicleTask; import org.nl.wms.sch.tasks.callMaterial.YqxCallMaterial; +import org.nl.wms.sch.tasks.callEmpty.YqxCallEmpVehicleTask; import org.nl.wms.sch.tasks.sendEmpty.HtSendEmpVehicleTask; import org.nl.wms.sch.tasks.sendEmpty.YqxSendEmpVehicleTask; -import org.nl.wms.sch.tasks.sendMaterial.GjxSendMaterial; +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.springframework.http.HttpStatus; import org.springframework.stereotype.Service; @@ -60,8 +60,9 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { for (int i = 0; i < array.size(); i++) { JSONObject row = array.getJSONObject(i); String task_id = row.getString("task_id"); - TaskDto taskDto = taskService.findById(task_id); - String processing_class = taskDto.getHandle_class(); + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + // 任务处理类 + String processing_class = taskObj.getString("handle_class"); //1:执行中,2:完成 ,3:acs取消 String acs_task_status = row.getString("task_status"); String message = ""; @@ -106,7 +107,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { json.put("task_id", task_id); json.put("message", message); errArr.add(json); - } } @@ -121,20 +121,23 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @LokiLog(type = LokiLogType.ACS_TO_LMS) @Override public String againApply(String task_id) { - log.info("输入参数:"+task_id); + log.info("输入参数:" + task_id); WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); String point_code = ""; + String message = ""; try { Class clz = Class.forName(jsonTask.getString("handle_class")); Object obj = clz.newInstance(); - Method m = obj.getClass().getDeclaredMethod("againApply",String.class); - point_code = (String) m.invoke(obj,task_id); + Method m = obj.getClass().getDeclaredMethod("againApply", String.class); + point_code = (String) m.invoke(obj, task_id); } catch (Exception e) { - + e.printStackTrace(); + message = e.getMessage(); + log.info("二次申请失败:{}", message); } - log.info("输出参数:"+point_code); + log.info("输出参数:" + point_code); return point_code; } @@ -183,8 +186,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { WQLObject taskTab = WQLObject.getWQLObject("sch_base_task");// 任务表 WQLObject regionTab = WQLObject.getWQLObject("ST_IVT_regionIO"); // 区域出入库表 WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); // 点位表 -// WQLObject veQtyTab = WQLObject.getWQLObject("PDM_BI_vehicleQty"); // 托盘对应数量表 - /* * 根据type判断是什么业务类型: @@ -194,7 +195,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { * 4.油漆线申请物料 * 5.油漆线空盘入库 * 6.一楼空盘入库 (有载具号) - * 7.油漆线->输送线 + * 7.油漆线->输送线(油漆线满料) * 8.豪凯自动线下料入库 */ if (StrUtil.equals(type, "1")) { @@ -207,7 +208,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { param.put("qty", qty); // 创建任务 GjxCallEmpVehicleTask taskBean = SpringContextHolder.getBean(GjxCallEmpVehicleTask.class); - taskBean.createTask(param); + taskBean.createTask(param); } else if (StrUtil.equals(type, "2")) { // 2.共挤线满托入库: 调用物料入库处理类创建任务 @@ -220,7 +221,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { param.put("vehicle_type", vehicle_type); param.put("vehicle_code", vehicle_code); - GjxSendMaterial taskBean = SpringContextHolder.getBean(GjxSendMaterial.class); + GjxSendMaterialTask taskBean = SpringContextHolder.getBean(GjxSendMaterialTask.class); String task_id = taskBean.createTask(param); // 创建任务 } else if (StrUtil.equals(type, "3")) { // 3.油漆线申请空盘: 调用空托盘出库处理类创建任务 @@ -230,7 +231,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { param.put("point_code2", point_code); param.put("qty", qty); // 创建任务 - GjxCallEmpVehicleTask taskBean = SpringContextHolder.getBean(GjxCallEmpVehicleTask.class); + YqxCallEmpVehicleTask taskBean = SpringContextHolder.getBean(YqxCallEmpVehicleTask.class); String task_id = taskBean.createTask(param); } else if (StrUtil.equals(type, "4")) { // 4.油漆线申请物料: 调用物料出库库处理类创建任务 @@ -255,7 +256,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { param.put("vehicle_type", vehicle_type); // 创建任务 YqxSendEmpVehicleTask taskBean = SpringContextHolder.getBean(YqxSendEmpVehicleTask.class); - taskBean.createTask(param); + taskBean.createTask(param); } else if (StrUtil.equals(type, "6")) { @@ -283,12 +284,12 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { JSONObject param = new JSONObject(); param.put("point_code1", point_code); // 1.生成起点确定的任务 - SpringContextHolder.getBean(PointToPointTask.class).createTask(param); + SpringContextHolder.getBean(YqxSendMaterialTask.class).createTask(param); } else if (StrUtil.equals(type, "8")) { // 8.豪凯自动线下料入库 JSONObject param = new JSONObject(); param.put("point_code1", point_code); - YqxSendMaterialTask taskBean = SpringContextHolder.getBean(YqxSendMaterialTask.class); + HkxSendMaterialTask taskBean = SpringContextHolder.getBean(HkxSendMaterialTask.class); String task_id = taskBean.createTask(param); } @@ -327,7 +328,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { Long end_region_id = SpringContextHolder.getBean(PointService.class).findByCode(point_code2).getRegion_id(); jsonRegion.put("end_region_id", String.valueOf(end_region_id)); - jsonRegion.put("create_mode", "02"); + jsonRegion.put("create_mode", "2"); jsonRegion.put("create_id", SecurityUtils.getCurrentUserId()); jsonRegion.put("create_name", SecurityUtils.getCurrentNickName()); jsonRegion.put("create_time", DateUtil.now()); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/SchTaskDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/SchTaskDto.java index 38de98a..313d52d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/SchTaskDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/SchTaskDto.java @@ -27,6 +27,10 @@ public class SchTaskDto implements Serializable { * 任务编码 */ private String task_code; + /** + * 任务名称 + */ + private String task_name; /** * 任务类型 @@ -103,7 +107,7 @@ public class SchTaskDto implements Serializable { */ private Integer sort_seq; //物料数量 - private Integer material_qty; + private String material_qty; /** * 任务完成类型 @@ -135,31 +139,6 @@ public class SchTaskDto implements Serializable { */ private String remark; - /** - * 备注1 - */ - private String remark2; - - /** - * 备注2 - */ - private String remark3; - - /** - * 是否删除 - */ - private String is_delete; - - /** - * 创建时间 - */ - private String create_time; - - /** - * 修改时间 - */ - private String update_time; - /** * 车号 */ @@ -179,4 +158,44 @@ public class SchTaskDto implements Serializable { * 下发任务的请求参数 */ private String response_param; + + + /** + * 是否删除 + */ + private String is_delete; + + /** + * 创建人 + */ + private Long create_id; + + /** + * 创建人 + */ + private String create_name; + /** + * 创建方式 + */ + private String create_mode; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改人 + */ + private Long update_optid; + + /** + * 修改人 + */ + private String update_optname; + + /** + * 修改时间 + */ + private String update_time; } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/TaskService.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/TaskService.java index e8f4398..222cbc7 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/TaskService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/TaskService.java @@ -1,10 +1,8 @@ package org.nl.wms.sch.service; -import org.nl.wms.sch.service.dto.TaskDto; import org.springframework.data.domain.Pageable; -import java.util.List; import java.util.Map; /** @@ -23,34 +21,11 @@ public interface TaskService { */ Map queryAll(Map whereJson, Pageable page); - /** - * 查询所有数据不分页 - * - * @param whereJson 条件参数 - * @return List - */ - List queryAll(Map whereJson); - - /** - * 根据ID查询 - * - * @param task_id - * @return Task - */ - TaskDto findById(String task_id); - - /** - * 根据编码查询 - * - * @param code code - * @return Task - */ - TaskDto findByCode(String code); - /** * 任务操作 * * @param param */ void operation(Map param); + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java index 612099e..f429446 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java @@ -13,20 +13,26 @@ import lombok.extern.slf4j.Slf4j; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; import org.nl.modules.wql.util.WqlUtil; import org.nl.wms.basedata.service.ClassstandardService; import org.nl.wms.basedata.service.dto.ClassstandardDto; import org.nl.wms.sch.service.PointService; import org.nl.wms.sch.service.RegionService; import org.nl.wms.sch.service.TaskService; -import org.nl.wms.sch.service.dto.TaskDto; +import org.nl.wms.sch.tasks.callEmpty.GjxCallEmpVehicleTask; +import org.nl.wms.sch.tasks.callMaterial.CallMaterialTask; +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.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -92,16 +98,16 @@ public class TaskServiceImpl implements TaskService { //点位基础表【SCH_BASE_Point】 WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - for ( int i = 0; i < content.size(); i++) { + for (int i = 0; i < content.size(); i++) { JSONObject taskObj = content.getJSONObject(i); String point_code1 = taskObj.getString("point_code1"); - if (ObjectUtil.isNotEmpty(point_code1)){ + if (ObjectUtil.isNotEmpty(point_code1)) { JSONObject point1 = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); taskObj.put("point1_region_name", point1.getString("region_name")); } String point_code2 = taskObj.getString("point_code2"); - if (ObjectUtil.isNotEmpty(point_code2)){ + if (ObjectUtil.isNotEmpty(point_code2)) { JSONObject point2 = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); taskObj.put("point2_region_name", point2.getString("region_name")); } @@ -111,37 +117,13 @@ public class TaskServiceImpl implements TaskService { return json; } - @Override - public List queryAll(Map whereJson) { - WQLObject wo = WQLObject.getWQLObject("sch_base_task"); - JSONArray arr = wo.query().getResultJSONArray(0); - List list = arr.toJavaList(TaskDto.class); - return list; - } - - @Override - public TaskDto findById(String task_id) { - WQLObject wo = WQLObject.getWQLObject("sch_base_task"); - JSONObject json = wo.query("task_id = '" + task_id + "'").uniqueResult(0); - final TaskDto obj = json.toJavaObject(TaskDto.class); - return obj; - } - - @Override - public TaskDto findByCode(String code) { - WQLObject wo = WQLObject.getWQLObject("sch_base_task"); - JSONObject json = wo.query("task_code ='" + code + "'").uniqueResult(0); - final TaskDto obj = json.toJavaObject(TaskDto.class); - return obj; - } - @Override public void operation(Map map) { String task_id = MapUtil.getStr(map, "task_id"); String method_name = MapUtil.getStr(map, "method_name"); - TaskDto dto = this.findById(task_id); + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); // 任务处理类 - String processing_class = dto.getHandle_class(); + String processing_class = taskObj.getString("handle_class"); String message = ""; // 根据任务类型获取对应的任务操作类 try { 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 index 217556a..95ae0cf 100644 --- 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 @@ -2,8 +2,10 @@ package org.nl.wms.sch.tasks.callEmpty; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; +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; @@ -13,12 +15,15 @@ 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 @@ -41,7 +46,47 @@ public class GjxCallEmpVehicleTask extends AbstractAcsTask { 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("row_num"), "9")) { + // 如果不是等待点更新等待点状态 + JSONObject jsonEmpWait = pointTab.query("region_id = '" + jsonStart.getString("region_id") + + "' and block_num = '" + jsonStart.getString("block_num") + + "' and col_num = '" + jsonStart.getString("col_num") + + "' and row_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 + "'"); } @@ -54,56 +99,70 @@ public class GjxCallEmpVehicleTask extends AbstractAcsTask { } 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 end_point_code = jsonTask.getString("point_code2"); - String start_point_code = jsonTask.getString("point_code1"); - JSONObject endPoint = pointTab.query("point_code = '" + end_point_code + "'").uniqueResult(0); - //从空托盘缓存B区或养生A区搬运到叠盘架 - if (StrUtil.equals("DPJQB01", endPoint.getString("region_code"))) { - //解锁起点 - JSONObject startPoint = new JSONObject(); - startPoint.put("lock_type", "1"); - startPoint.put("point_status", "1"); - startPoint.put("update_time", DateUtil.now()); - pointTab.update(startPoint, "point_code = '" + start_point_code + "'"); - //更新终点点位状态 - endPoint.put("point_status", "2"); - endPoint.put("lock_type", "00"); - endPoint.put("vehicle_qty", jsonTask.getString("vehicle_qty")); - endPoint.put("vehicle_type", jsonTask.getString("vehicle_type")); - endPoint.put("update_time", DateUtil.now()); - pointTab.update(endPoint); - } else { - JSONObject startPoint = pointTab.query("point_code = '" + start_point_code + "'").uniqueResult(0); - Integer vehicle_qty = startPoint.getInteger("vehicle_qty"); - int after_qty = vehicle_qty - 1; - startPoint.put("lock_type", "1"); - startPoint.put("vehicle_qty", after_qty); - if (after_qty > 0) { - startPoint.put("point_status", "2"); - } else { - startPoint.put("point_status", "1"); + // 判断终点在哪里 + 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("row_num"), "9")) { + // 如果不是等待点更新等待点状态 + JSONObject jsonEmpWait = pointTab.query("region_id = '" + jsonStart.getString("region_id") + + "' and block_num = '" + jsonStart.getString("block_num") + + "' and col_num = '" + jsonStart.getString("col_num") + + "' and row_num = '9'").uniqueResult(0); + + jsonEmpWait.put("lock_type", "1"); + pointTab.update(jsonEmpWait); } - startPoint.put("update_time", DateUtil.now()); - pointTab.update(startPoint, "point_code = '" + start_point_code + "'"); + + 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"); + 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"); + pointTab.update(jsonStart); } } } - @Override - public List addTask() { - return null; - } @Override + @Transactional(rollbackFor = Exception.class) public void findStartPoint() { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + 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++) { @@ -111,74 +170,122 @@ public class GjxCallEmpVehicleTask extends AbstractAcsTask { JSONObject jsonTask = taskArr.getJSONObject(i); String vehicle_type = jsonTask.getString("vehicle_type"); - //判断叠盘位是否有另外任务 - JSONObject taskObj = taskTab.query("is_delete='0' and handle_class='" + this.THIS_CLASS + "' and task_status <>'" + TaskStatusEnum.FINISHED.getCode() + "' and task_id <> " + jsonTask.getLong("task_id")).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) continue; + // 找叠盘架是否与对应的载具类型 + 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); - //判断叠盘架是否有载具 - JSONObject dpjPoint = pointTab.query("is_used ='1' and lock_type='00' and is_delete='0' and region_code='DPJQB01' and vehicle_qty >0 and can_vehicle_type like '%" + vehicle_type + "%'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(dpjPoint)) { - jsonTask.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - jsonTask.put("point_code1", dpjPoint.getString("point_code")); - jsonTask.put("update_time", DateUtil.now()); + 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); taskTab.update(jsonTask); - //锁住点位 - dpjPoint.put("lock_type", "2"); - pointTab.update(dpjPoint); } else { - //查找叠盘架编码 - JSONObject dpjPoint1 = pointTab.query("is_delete='0' and region_code='DPJQB01' and can_vehicle_type like '%" + vehicle_type + "%'").uniqueResult(0); + // 判断叠盘架载具数量是否是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; - //叠盘架无载具:1-判断是否有在执行中的堆叠任务,有则等堆叠任务完成以后再去,否则去去缓存位和养生A区找 - JSONObject ddTask = taskTab.query("is_delete='0' and point_code2 = '" + dpjPoint1.getString("point_code") + "'" + " and task_status <> '7' ").uniqueResult(0); - if (ObjectUtil.isNotEmpty(ddTask)) continue; + // 判断叠盘架是否有任务 + boolean is_point = this.isTask(jsonDpjStart2.getString("point_code")); + if (!is_point) continue; - //去缓存位和养生A区找,生成到叠盘架的任务 - JSONObject whereParam = new JSONObject(); - whereParam.put("flag", "1"); - whereParam.put("vehicle_type", '%' + jsonTask.getString("vehicle_type") + "%"); - JSONObject outJsonObj = WQL.getWO("QSCH_GjxCallEmpVehicleTask").addParamMap(whereParam).process().uniqueResult(0); + // 找叠盘架暂存位是否有空托盘 + JSONObject map = new JSONObject(); + map.put("flag", "1"); + map.put("vehicle_type", vehicle_type); - // 空托盘缓存货架或者养生A区------>叠盘架B区 - JSONObject param = new JSONObject(); - Long task_id = IdUtil.getSnowflake(1, 1).nextId(); - Long task_group_id = IdUtil.getSnowflake(1, 1).nextId(); - param.put("task_id", task_id); - param.put("task_code", CodeUtil.getNewCode("TASK_CODE")); - param.put("vehicle_type", vehicle_type); - param.put("priority", 100); - param.put("handle_class", THIS_CLASS); - param.put("task_type", "kzj"); - param.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - param.put("task_group_id", task_group_id); - param.put("sort_seq", 1); - param.put("point_code1", outJsonObj.getString("point_code")); - param.put("point_code2", dpjPoint1.getString("point_code")); - param.put("create_name", SecurityUtils.getCurrentUsername()); - param.put("create_id", SecurityUtils.getCurrentUserId()); - param.put("create_time", DateUtil.now()); - taskTab.insert(param); + 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("") + .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 row_num = '9' and can_vehicle_type = '" + vehicle_type + + "' and is_used = '1' and is_delete = '0'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonEmpWait)) continue; - //锁住起点 - outJsonObj.put("lock_type", "2"); - pointTab.update(outJsonObj); - this.notifyAcs(String.valueOf(task_id)); + JSONObject jsonStartPoint = pointTab.query("region_id = '" + jsonEmpWait.getString("region_id") + + "' and block_num = '" + jsonEmpWait.getString("block_num") + + "' and col_num = '" + jsonEmpWait.getString("col_num") + + "' and point_status = '2' and lock_type = '1' order by out_empty_seq DESC").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonStartPoint)) continue; - - jsonTask.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - jsonTask.put("point_code1", outJsonObj.getString("point_code")); - jsonTask.put("sort_seq", 2); - jsonTask.put("task_group_id", task_group_id); - jsonTask.put("remark", "叠盘架无载具!"); - taskTab.update(jsonTask); - - //锁住点位 - dpjPoint1.put("lock_type", "2"); - pointTab.update(outJsonObj); + // 判断找到的空载具点位是否是等待点 + 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("") + .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("") + .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; + } + } + } } - - } } @@ -187,41 +294,40 @@ public class GjxCallEmpVehicleTask extends AbstractAcsTask { @Override @Transactional(rollbackFor = Exception.class) public String createTask(JSONObject form) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + /* + * 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"); //点位基础表 - String end_point_code = form.getString("point_code2"); - String vehicle_type = form.getString("vehicle_type"); + String point_code2 = form.getString("point_code1"); - // 终点不能为空 - if (ObjectUtil.isEmpty(end_point_code)) { - throw new BadRequestException("终点不能为空"); - } else { - // 判断终点是否有正在执行的任务 - JSONObject beforTaskObj = taskTab.query("is_delete='0' and point_code2='" + end_point_code + "' and task_status <>'" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(beforTaskObj)) - throw new BadRequestException("存在任务号为'" + beforTaskObj.getString("task_code") + "' 未完成!"); - } - // 创建任务 - JSONObject jsonTask = new JSONObject(); - Long task_id = IdUtil.getSnowflake(1, 1).nextId(); - jsonTask.put("task_id", task_id); - jsonTask.put("task_code", CodeUtil.getNewCode("TASK_CODE")); - jsonTask.put("handle_class", THIS_CLASS); - jsonTask.put("vehicle_type", vehicle_type); + String device_code = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0).getString("device_code"); - jsonTask.put("point_code2", end_point_code); - jsonTask.put("create_name", SecurityUtils.getCurrentUsername()); - jsonTask.put("create_id", SecurityUtils.getCurrentUserId()); - jsonTask.put("create_time", DateUtil.now()); + 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("该设备当前未生产或者已删除"); - //见基础分类表的任务分类 - jsonTask.put("task_type", "gjxsqkp"); - jsonTask.put("task_status", TaskStatusEnum.SURE_END.getCode()); - jsonTask.put("point_code1", ""); - taskTab.insert(jsonTask); + SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("") + .task_status(TaskStatusEnum.SURE_END.getCode()) + .point_code2(point_code2) + .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.findStartPoint(); - return String.valueOf(task_id); +// this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); } @Override @@ -236,4 +342,54 @@ public class GjxCallEmpVehicleTask 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 resultList = 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(); + 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/YqxCallEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YqxCallEmpVehicleTask.java index 98c5697..db94cc2 100644 --- 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 @@ -6,6 +6,7 @@ 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; @@ -17,6 +18,7 @@ import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.SpringContextHolder; import org.nl.wms.pdm.service.DeviceService; import org.nl.wms.pdm.service.dto.DeviceDto; +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; @@ -27,6 +29,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.List; @Service @@ -36,7 +39,6 @@ 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) { @@ -47,7 +49,47 @@ public class YqxCallEmpVehicleTask extends AbstractAcsTask { 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.DPJQA.getId())) { + JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + // 判断此起点是否是等待点 + if (!StrUtil.equals(jsonStart.getString("row_num"), "9")) { + // 如果不是等待点更新等待点状态 + JSONObject jsonEmpWait = pointTab.query("region_id = '" + jsonStart.getString("region_id") + + "' and block_num = '" + jsonStart.getString("block_num") + + "' and col_num = '" + jsonStart.getString("col_num") + + "' and row_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 + "'"); } @@ -60,107 +102,244 @@ public class YqxCallEmpVehicleTask extends AbstractAcsTask { } 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); - PointService point = SpringContextHolder.getBean(PointService.class); - // 校验起点是否存在 - PointDto point_code1 = point.findByCode(jsonTask.getString("point_code1")); - if (ObjectUtil.isEmpty(point_code1)) throw new BadRequestException("未找到可用点位:" + point_code1); - // 校验终点是否存在 - PointDto point_code2 = point.findByCode(jsonTask.getString("point_code2")); - if (ObjectUtil.isEmpty(point_code1)) throw new BadRequestException("未找到可用点位:" + point_code2); + // 判断终点在哪里 + String point_code1 = jsonTask.getString("point_code1"); + String point_code2 = jsonTask.getString("point_code2"); - // 1.更新点位数量 2.解锁点位 - int vehicle_qty = JSONObject.parseObject(JSON.toJSONString(point_code1)).getIntValue("vehicle_qty"); - BigDecimal vehicle_qty_point = NumberUtil.sub(String.valueOf(vehicle_qty), String.valueOf(1)); + 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); + // 判断此起点是否是等待点 + if (!StrUtil.equals(jsonStart.getString("row_num"), "9")) { + // 如果不是等待点更新等待点状态 + JSONObject jsonEmpWait = pointTab.query("region_id = '" + jsonStart.getString("region_id") + + "' and block_num = '" + jsonStart.getString("block_num") + + "' and col_num = '" + jsonStart.getString("col_num") + + "' and row_num = '9'").uniqueResult(0); - point_code1.setVehicle_qty(vehicle_qty_point); - if (StrUtil.equals(vehicle_qty_point.toString(), "0")) { - point_code1.setPoint_status("00"); - point_code1.setVehicle_type(""); + 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"); + 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"); + pointTab.update(jsonStart); } - point_code1.setLock_type("00"); - pointTab.update(JSONObject.parseObject(JSON.toJSONString(point_code1))); } } + @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")); + } + + // 更新任务起点 + jsonTask.put("point_code1", jsonDpjStart.getString("point_code")); + jsonTask.put("task_status", TaskStatusEnum.START_AND_POINT); + 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("") + .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 row_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 col_num = '" + jsonEmpWait.getString("col_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("") + .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("") + .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) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String point_code1 = form.getString("point_code1"); - String point_code2 = form.getString("point_code2"); - String qty = form.getString("qty"); - String vehicle_type = form.getString("vehicle_type"); - - // 出库终点不能为空 - if (ObjectUtil.isEmpty(point_code2)) { - throw new BadRequestException("终点不能为空"); - } else { - // 判断终点是否有正在执行的任务 - JSONObject beforTaskObj = taskTab.query("is_delete='0' and point_code2='" + point_code2 + "' and task_status <>'" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(beforTaskObj)) - throw new BadRequestException("存在任务号为'" + beforTaskObj.getString("task_code") + "' 未完成!"); - } - // 载具数量不能为空 - if (ObjectUtil.isEmpty(qty)) throw new BadRequestException("载具数量不能为空"); - /* - * 1. 点对点: 起点和终点都确定,直接创建任务 - * 2. 终点确定: 需要找到对应起点,在创建任务 具体找起点货位的规则在findBeginPoint()中 + * 1.先生成确定终点的任务 + * 2.通过findStartPoint()找起点 + * 3.下发给ACS */ - //起点不确定 - if (ObjectUtil.isEmpty(point_code1)) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); // 生产工单表 + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); //点位基础表 - JSONObject param = new JSONObject(); - param.put("point_code2",point_code2); - param.put("vehicle_qty",qty); + String point_code2 = form.getString("point_code1"); + String device_code = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0).getString("device_code"); - JSONObject json = this.findBeginPoint(param); - point_code1 = json.getString("start_point_code"); - vehicle_type = json.getString("vehicle_type"); - } else { - // 判断终点是否是空位 - JSONObject jsonPoint = pointTab.query("point_code = '" + point_code1 + "' and lock_type = '00' and point_status <> '02' and is_delete = '0' and is_used = '1'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonPoint)) throw new BadRequestException("起点点位不可用或不存在"); - } + 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_status(TaskStatusEnum.SURE_END.getCode()) + .point_code2(point_code2) + .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); - - // 创建任务 - JSONObject jsonTask = new JSONObject(); - String task_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - - jsonTask.put("task_id", task_id); - - jsonTask.put("task_code", CodeUtil.getNewCode("TASK_CODE")); - jsonTask.put("task_type", "04"); - jsonTask.put("task_status", "01"); - jsonTask.put("point_code1", point_code1); - jsonTask.put("point_code2", point_code2); - jsonTask.put("handle_class", THIS_CLASS); - jsonTask.put("vehicle_type", vehicle_type); - jsonTask.put("create_name", SecurityUtils.getCurrentUsername()); - jsonTask.put("create_id", SecurityUtils.getCurrentUserId()); - jsonTask.put("create_time", DateUtil.now()); - jsonTask.put("acs_task_type", "1"); - taskTab.insert(jsonTask); - - // 锁定起点点位 - JSONObject jsonPoint = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - jsonPoint.put("lock_type", "02"); - pointTab.update(jsonPoint); - - return task_id; + this.findStartPoint(); +// this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); } @Override @@ -171,128 +350,57 @@ public class YqxCallEmpVehicleTask extends AbstractAcsTask { } - @Override public void cancel(String task_id) { } - @Transactional(rollbackFor = Exception.class) - public JSONObject findBeginPoint(JSONObject json) { - String point_code2 = json.getString("point_code2"); - String vehicle_qty = json.getString("vehicle_qty"); - if (ObjectUtil.isEmpty(point_code2)) throw new BadRequestException("终点不能为空"); - if (ObjectUtil.isEmpty(vehicle_qty)) throw new BadRequestException("载具数量不能为空"); - - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - WQLObject regionTab = WQLObject.getWQLObject("SCH_BASE_Region"); - WQLObject orderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - // 根据终点区域判断优先的起点区域 - JSONObject jsonPointEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonPointEnd)) throw new BadRequestException("终点点位不存在"); - JSONObject jsonRegionEnd = regionTab.query("region_id ='" + jsonPointEnd.getString("region_id") + "'").uniqueResult(0); - - // 根据起点找到对应设备,根据设备查询工单表中 - 正在运行的工单中的载具类型 - String device_code = point_code2.substring(0, point_code2.indexOf("_")); - - DeviceService deviceBean = SpringContextHolder.getBean(DeviceService.class); - DeviceDto deviceDto = deviceBean.findByCode(device_code); - if (ObjectUtil.isEmpty(deviceDto)) throw new BadRequestException("此设备不存在"); - JSONObject jsonOrder = orderTab.query("device_id = '" + deviceDto.getDevice_id() + "' and order_status = '02' and is_delete = '0'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonOrder)) throw new BadRequestException("此设备未在生产中或不存在"); - - //当前设备所需要的载具类型 - String vehicle_type = jsonOrder.getString("vehicle_type"); - /* - * 空托盘出库任务: - * 1.叠盘架B区、养生A区 --> 共挤线 (优先级:1叠盘架B区 2养生A区) - * 2.叠盘架A区、养生A区 --> 油漆线 (优先级:1叠盘架A区 2养生A区) - */ - String point_code1 = ""; - JSONObject map = new JSONObject(); - if (StrUtil.equals(jsonRegionEnd.getString("region_code"), RegionTypeEnum.GJQY.getCode())) { - //1、判断是否有拆托盘任务。 - taskTab.query("task_type= 'gjxsqkp' "); - - //2、判断是否有到该叠盘位的堆叠任务。 - - - - //1、判断叠盘架B是否有对应类型的空载具 - JSONObject jsonDpjB = pointTab.query("point_status ='2' and lock_type='00' and can_vehicle_type = '" + vehicle_type + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonDpjB)) {//没有则去空托盘缓存区B和养生A区找 - - } - - - // 共挤线呼叫空托盘业务:查找叠盘架B区是否有满足条件的点位 - map.put("flag", "1"); - map.put("vehicle_qty", vehicle_qty); - map.put("vehicle_type", jsonOrder.getString("vehicle_type")); - map.put("region_code", RegionTypeEnum.DPJQB.getCode()); - JSONObject jsonStartPointDPB = WQL.getWO("ST_VEHICLE_OUT_02").addParamMap(map).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonStartPointDPB)) { - point_code1 = jsonStartPointDPB.getString("point_code"); - } else { - // 为空说明叠盘架B区没有,则去养生A区找 : 只能找数量为1的空托盘 - map.put("flag", "3"); - map.put("region_code", RegionTypeEnum.YSQA.getCode()); - JSONObject jsonStartPointYSA = WQL.getWO("ST_VEHICLE_OUT_02").addParamMap(map).process().uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonStartPointYSA)) { - point_code1 = jsonStartPointYSA.getString("point_code"); - } else { - throw new BadRequestException("没有满足需求数量的点位"); - /* // 如果没有则需要从养生区A区里找到 > 1的货位 出库到叠盘架B中 - map.put("flag", "1"); - map.put("region_code", RegionTypeEnum.YSQA.getCode()); - // 起点 - JSONObject jsonStart = WQL.getWO("ST_VEHICLE_OUT_02").addParamMap(map).process().uniqueResult(0); - if (ObjectUtil.isEmpty(jsonStart)) throw new BadRequestException("没有满足需求数量的点位"); - // 终点 - JSONObject jsonEnd = pointTab.query("region_id = '" + RegionTypeEnum.DPJQB.getId() + "' and point_status = '00' and lock_type = '00' and is_used = '1' and is_delete = '0'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonEnd)) throw new BadRequestException("叠盘架B货位不足"); - - JSONObject parem = new JSONObject(); - parem.put("point_code1",jsonStart.getString("point_code")); - parem.put("point_code2",jsonEnd.getString("point_code")); - parem.put("qty",jsonStart.getString("vehicle_qty")); - parem.put("vehicle_type",jsonStart.getString("vehicle_qty")); - String task_id = this.createTask(parem); - - // 生成 叠盘架 -> 共挤线的任务 返回叠盘架B的点位code - point_code1 = jsonEnd.getString("point_code");*/ - } - - } - - } else if (StrUtil.equals(jsonRegionEnd.getString("region_code"), RegionTypeEnum.YQQY.getCode())) { - // 油漆线呼叫空托盘业务:查找叠盘架A区是否有满足条件的点位 - map.put("flag", "1"); - map.put("vehicle_qty", vehicle_qty); - map.put("vehicle_type", jsonOrder.getString("vehicle_type")); - map.put("region_code", RegionTypeEnum.DPJQA.getCode()); - JSONObject jsonStartPointDPA = WQL.getWO("ST_VEHICLE_OUT_02").addParamMap(map).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonStartPointDPA)) { - point_code1 = jsonStartPointDPA.getString("point_code"); - } else { - // 为空说明叠盘架A区没有,则去养生A区找 - map.put("flag", "3"); - map.put("region_code", RegionTypeEnum.YSQA.getCode()); - JSONObject jsonStartPointYSA = WQL.getWO("ST_VEHICLE_OUT_02").addParamMap(map).process().uniqueResult(0); - if (ObjectUtil.isEmpty(jsonStartPointYSA)) throw new BadRequestException("没有满足需求数量的点位"); - point_code1 = jsonStartPointYSA.getString("point_code"); - } - } - JSONObject resuft = new JSONObject(); - resuft.put("point_code1", point_code1); - resuft.put("vehicle_type", jsonOrder.getString("vehicle_type")); - return resuft; - } - @Override public List addTask() { - return null; + /* + * 下发给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); + 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(); + 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/wql/QSCH_GjxCallEmpVehicleTask.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_GjxCallEmpVehicleTask.wql index d8774b0..b76c2fb 100644 --- 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 @@ -14,9 +14,7 @@ ## 表字段对应输入参数 ################################################# 输入.flag TYPEAS s_string - 输入.vehicle_qty TYPEAS s_string - 输入.vehicle_type TYPEAS s_string - 输入.region_code TYPEAS s_string + 输入.vehicle_type TYPEAS s_string [临时表] --这边列出来的临时表就会在运行期动态创建 @@ -42,72 +40,21 @@ IF 输入.flag = "1" QUERY - SELECT - p.point_id, - p.point_code, - p.point_name - FROM - SCH_BASE_Point p - WHERE - p.is_used = '1' - AND p.is_delete = '0' - AND p.lock_type = '00' - AND p.point_status = '2' - and region_code in ('KTPHCQB01','YSQA01') + 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 <> "" - p.vehicle_type like 输入.vehicle_type + can_vehicle_type = 输入.vehicle_type ENDOPTION - order by out_empty_seq,p.vehicle_qty - ENDSELECT ENDQUERY - ENDIF - - IF 输入.flag = "3" - QUERY - SELECT - point.* - FROM - sch_base_point point - LEFT JOIN SCH_BASE_Region region ON point.region_id = region.region_id - WHERE - point.lock_type = '00' - AND point.point_status = '01' - AND IFNULL(point.vehicle_qty,0) == 输入.vehicle_qty - - OPTION 输入.region_code <> "" - region.region_code = 输入.region_code - ENDOPTION - - OPTION 输入.vehicle_type <> "" - point.vehicle_type = 输入.vehicle_type - ENDOPTION - - order by point.point_code DESC - - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "2" - QUERY - SELECT - point.* - FROM - sch_base_point point - LEFT JOIN SCH_BASE_Region region ON point.region_id = region.region_id - WHERE - point.lock_type = '00' - AND point.point_status = '00' - - OPTION 输入.region_code <> "" - region.region_code = 输入.region_code - ENDOPTION - - order by point.point_code DESC - - ENDSELECT - ENDQUERY - ENDIF + ENDIF \ No newline at end of file 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/callEmpty/wql/QSCH_YqxCallEmpVehicleTask.wql new file mode 100644 index 0000000..8163667 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_YqxCallEmpVehicleTask.wql @@ -0,0 +1,60 @@ +[交易说明] + 交易名: 油漆线申请空盘 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为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 = 'KTPHCQA01' + + 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/sendMaterial/GjxSendMaterial.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java similarity index 98% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterial.java rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java index 6925c17..b042d82 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterial.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java @@ -13,11 +13,9 @@ 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.tasks.AcsTaskDto; import org.nl.wms.util.IdUtil; import org.springframework.stereotype.Service; @@ -33,8 +31,9 @@ import java.util.List; @Service @RequiredArgsConstructor @Slf4j -public class GjxSendMaterial extends AbstractAcsTask { - private final String THIS_CLASS = GjxSendMaterial.class.getName(); +public class GjxSendMaterialTask extends AbstractAcsTask { + + private final String THIS_CLASS = GjxSendMaterialTask.class.getName(); @Override @@ -254,6 +253,7 @@ public class GjxSendMaterial extends AbstractAcsTask { .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) @@ -279,7 +279,7 @@ public class GjxSendMaterial extends AbstractAcsTask { 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"); } 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/HkxSendMaterialTask.java new file mode 100644 index 0000000..3a85d27 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HkxSendMaterialTask.java @@ -0,0 +1,250 @@ +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 HkxSendMaterialTask extends AbstractAcsTask { + + private final String THIS_CLASS = HkxSendMaterialTask.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("已完成不能取消!"); + } + 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_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); + + + //完成后入库 + //仓位库存表【ST_IVT_StructIvt】 + WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); + JSONObject ivtObj = new JSONObject(); + ivtObj.put("stockrecord_id", IdUtil.getLongId()); + ivtObj.put("point_id", point2Obj.getString("point_id")); + ivtObj.put("point_code", point2Obj.getString("point_code")); + ivtObj.put("point_name", point2Obj.getString("point_name")); + ivtObj.put("region_id", point2Obj.getString("region_id")); + ivtObj.put("region_code", point2Obj.getString("region_code")); + ivtObj.put("region_name", point2Obj.getString("region_name")); + ivtObj.put("instorage_time", DateUtil.now()); + ivtObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); + ivtObj.put("ivt_qty", requestObj.getString("qty")); + ivtObj.put("standing_time", workorderObj.getString("standing_time")); + ivtObj.put("material_id", workorderObj.getString("material_id")); + ivtTab.insert(ivtObj); + } + + } + + @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", "CPQYA01"); + param1.put("vehicle_type", "%" + vehicle_type + "%"); + //1、查找库区类是否有响应的载具类型和对应的物料 + JSONObject endPoint = WQL.getWO("QSCH_hkxSendMaterial_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); + } + + + } + } + + @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"); + + //生产工单表【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("豪凯线满料") + .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(); + //任务表【SCH_BASE_Task】 + WQLObject taskTab = WQLObject.getWQLObject("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"); + } + + + @Override + public void cancel(String task_id) { + + } +} 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 6e23a71..9bf6525 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 @@ -1,9 +1,9 @@ package org.nl.wms.sch.tasks.sendMaterial; 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.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; @@ -14,18 +14,18 @@ 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.PointFindUtil; +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.service.impl.PointServiceImpl; 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.HashMap; +import java.util.ArrayList; import java.util.List; @@ -47,11 +47,23 @@ public class YqxSendMaterialTask extends AbstractAcsTask { **/ 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")) { - // 取消删除任务 - taskTab.delete("task_id = '" + task_id + "'"); + //取消任务,释放相关点位的锁 + String point_code1 = jsonTask.getString("point_code1"); + String point_code2 = jsonTask.getString("point_code1"); + 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)) { @@ -60,12 +72,6 @@ public class YqxSendMaterialTask extends AbstractAcsTask { jsonTask.put("update_time", DateUtil.now()); jsonTask.put("car_no", taskObj.getString("car_no")); taskTab.update(jsonTask); - HashMap map = new HashMap(); - map.put("update_optid", SecurityUtils.getCurrentUserId()); - map.put("update_optname", SecurityUtils.getCurrentNickName()); - map.put("update_time", DateUtil.now()); - map.put("bill_status", "40"); - WQLObject.getWQLObject("ST_IVT_regionIO").update(map, "task_id='" + jsonTask.getString("task_id") + "'"); } if (TaskStatusEnum.FINISHED.getCode().equals(status)) { @@ -74,49 +80,20 @@ public class YqxSendMaterialTask extends AbstractAcsTask { jsonTask.put("taskfinish_mode", taskObj.getString("taskfinish_mode")); jsonTask.put("update_time", DateUtil.now()); jsonTask.put("remark", "任务执行完成"); - ///审核单据 增加库存 改变出入库表的状态 - WQLObject mstTab = WQLObject.getWQLObject("ST_IVT_regionIO"); - JSONObject mstObj = mstTab.query("task_id='" + task_id + "' and is_delete='0'").uniqueResult(0); - //审核 加库存可和用数量 - mstObj.put("bill_status", "50"); - mstObj.put("confirm_optid", SecurityUtils.getCurrentUserId()); - mstObj.put("confirm_optname", SecurityUtils.getCurrentNickName()); - mstObj.put("confirm_time", DateUtil.now()); - mstTab.update(mstObj); - - String iostorinv_id = mstObj.getString("iostorinv_id"); - String bill_code = mstObj.getString("bill_code"); - String bill_type_scode = mstObj.getString("bill_type"); - String point_code2 = mstObj.getString("end_point_code"); - String point_code1 = mstObj.getString("point_code1"); - - - PointServiceImpl pointService = SpringContextHolder.getBean(PointServiceImpl.class); - PointDto nextPointDto = pointService.findByCode(point_code2); - if (ObjectUtil.isNull(nextPointDto)) { - throw new BadRequestException("未找到可用点位:" + point_code2); - } - PointDto startPointDto = pointService.findByCode(point_code1); - if (ObjectUtil.isNull(startPointDto)) { - throw new BadRequestException("未找到可用点位:" + point_code1); - } - // 解锁点位 - String vehicle_code = jsonTask.getString("vehicle_code"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - JSONObject endpointObj = pointTab.query("point_code='" + jsonTask.getString("point_code2") + "'").uniqueResult(0); - endpointObj.put("lock_type", "1"); - endpointObj.put("point_status", "02"); - endpointObj.put("vehicle_code", vehicle_code); - endpointObj.put("vehicle_type", jsonTask.getString("vehicle_type")); - pointTab.update(endpointObj); taskTab.update(jsonTask); - /* JSONObject startPointObj = pointTab.query("point_code='" + jsonTask.getString("point_code1") + "'").uniqueResult(0); - startPointObj.put("lock_type", "1"); - startPointObj.put("point_status", "00"); - startPointObj.put("vehicle_code", ""); - pointTab.update(startPointObj); - taskTab.update(jsonTask);*/ + + //取消任务,释放相关点位的锁 + String point_code1 = jsonTask.getString("point_code1"); + String point_code2 = jsonTask.getString("point_code1"); + 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 + "'"); } } @@ -125,108 +102,77 @@ public class YqxSendMaterialTask extends AbstractAcsTask { 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"); - //1 将任务修改为分配 2将终点写入,完成分配,3 加锁点位 - //找一个合适的仓位 - WQLObject ProcedureIOStable = WQLObject.getWQLObject("ST_IVT_regionIO"); - JSONObject IosObj = ProcedureIOStable.query("task_id='" + task_id + "' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(IosObj)) { - throw new BadRequestException("未找到任务号为'" + taskObj.getString("task_code") + "'的入库单据!"); - } + JSONObject param = new JSONObject(); - param.put("material_id", IosObj.getString("material_id")); - param.put("area_type", IosObj.getString("end_area")); - param.put("vehicle_code", IosObj.getString("vehicle_code")); - JSONObject inStructObj = PointFindUtil.getInStruct(param); - if (ObjectUtil.isEmpty(inStructObj)) { - throw new BadRequestException("未找到合适的入库仓位!"); + 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("update_optid", SecurityUtils.getCurrentUserId()); + taskObj.put("update_optname", SecurityUtils.getCurrentNickName()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); } - //修改单据状态,将终点填入 - IosObj.put("bill_status", "20"); - IosObj.put("end_point_code", inStructObj.getString("struct_code")); - ProcedureIOStable.update(IosObj); - //终点加锁 - HashMap lock_map = new HashMap(); - lock_map.put("lock_type", "2"); - WQLObject.getWQLObject("sch_base_point").update(lock_map, "point_code = '" + inStructObj.getString("struct_code") + "'"); - //修改任务状态 - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - 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 form) { - //请求参数 载具、起点、终点 - String vehicle_code = form.getString("vehicle_code"); - String vehicle_type = form.getString("vehicle_type"); - String point_code1 = form.getString("point_code1"); - String point_code2 = form.getString("point_code2"); + 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"); - WQLObject taskTable = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject iosTable = WQLObject.getWQLObject("ST_IVT_regionIO"); + //生产工单表【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("该设备当前未生产或者已删除"); - if (StrUtil.isEmpty(point_code1)) { - throw new BadRequestException("起点不能为空!"); - } - //判断起点有没有未完成的指令 - JSONObject beforTaskObj = taskTable. - query("is_delete='0' and point_code1='" + point_code1 + "' and task_status <>'" + TaskStatusEnum.FINISHED.getCode() + "'") - .uniqueResult(0); - if (ObjectUtil.isNotEmpty(beforTaskObj)) { - throw new BadRequestException("存在指令号为'" + beforTaskObj.getString("task_code") + "' 未完成!"); - } + 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】 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); - - if (StrUtil.isEmpty(point_code2)) { - // 终点为空需要找终点 - JSONObject param = new JSONObject(); - param.put("point_code1", point_code1); - JSONObject endPoint = this.findEndPoint(param); - point_code2 = endPoint.getString("point_code2"); - } - - //终点点加锁 - WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); - JSONObject endPointObj = pointTable.query("point_code='" + point_code2 + "'").uniqueResult(0); - endPointObj.put("lock_type", "2"); - pointTable.update(endPointObj); - - // 创建任务 - PointService pointService = SpringContextHolder.getBean(PointService.class); - - JSONObject taskObj = new JSONObject(); - CodeUtil.getNewCode("TASK_CODE"); - Long task_id = IdUtil.getSnowflake(1, 1).nextId(); - taskObj.put("task_id", task_id); - taskObj.put("task_code", CodeUtil.getNewCode("TASK_CODE")); - taskObj.put("task_type", "01"); - taskObj.put("vehicle_type", vehicle_type); - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskObj.put("point_code1", point_code1); - PointDto startPoint = pointService.findByCode(point_code1); - taskObj.put("start_area", startPoint.getRegion_id()); - taskObj.put("request_param", form.toJSONString()); - taskObj.put("point_code2", point_code2); - PointDto nextPoint = pointService.findByCode(point_code2); - taskObj.put("next_area", nextPoint.getRegion_id()); - taskObj.put("vehicle_code", vehicle_code); - taskObj.put("handle_class", THIS_CLASS); - taskObj.put("is_auto_issue", "1"); - taskObj.put("create_name", SecurityUtils.getCurrentUsername()); - taskObj.put("create_id", SecurityUtils.getCurrentUserId()); - taskObj.put("create_time", DateUtil.now()); - taskObj.put("is_delete", "0"); - taskTable.insert(taskObj); - return String.valueOf(task_id); + //创建好立即下发 + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); } @@ -283,7 +229,28 @@ public class YqxSendMaterialTask extends AbstractAcsTask { @Override public List addTask() { - return null; + /* + * 下发给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/wql/QSCH_hkxSendMaterial_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_hkxSendMaterial_01.wql new file mode 100644 index 0000000..eb1abda --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_hkxSendMaterial_01.wql @@ -0,0 +1,68 @@ +[交易说明] + 交易名: 豪凯线送料请求 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为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' + OPTION 输入.vehicle_type <> "" + p.can_vehicle_type like 输入.vehicle_type + ENDOPTION + OPTION 输入.region_code <> "" + p.region_code = 输入.region_code + ENDOPTION + ORDER BY row_num,col_num,layer_num + 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_yqxSendMaterial_01.wql new file mode 100644 index 0000000..0e1582e --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_yqxSendMaterial_01.wql @@ -0,0 +1,62 @@ +[交易说明] + 交易名: 油漆线送料请求 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为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_code = 'SSX01A2' or point_code = 'SSX02A1') + ENDSELECT + ENDQUERY + ENDIF + + + 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 02b9b58..6db139e 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-system/src/main/resources/logback-spring.xml b/lms/nladmin-system/src/main/resources/logback-spring.xml index ac1dd00..dbc1ded 100644 --- a/lms/nladmin-system/src/main/resources/logback-spring.xml +++ b/lms/nladmin-system/src/main/resources/logback-spring.xml @@ -81,37 +81,40 @@ https://juejin.cn/post/6844903775631572999 - - - - - - - - - - + + + + + + + - + - + - + - + + + + + + + @@ -119,27 +122,57 @@ https://juejin.cn/post/6844903775631572999 - + - + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lms/nladmin-ui/src/views/wms/sch/task/index.vue b/lms/nladmin-ui/src/views/wms/sch/task/index.vue index abfa16d..46edee5 100644 --- a/lms/nladmin-ui/src/views/wms/sch/task/index.vue +++ b/lms/nladmin-ui/src/views/wms/sch/task/index.vue @@ -116,19 +116,19 @@ - + + - + -