From 1332a4ea96ff46190a1fbedfbe8c1b2b6c72b645 Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Tue, 16 Dec 2025 17:29:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=B7=E7=A2=BE=E7=BC=BA=E7=A9=BA?= =?UTF-8?q?=E3=80=81=E6=BB=A1=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notice/impl/SysNoticeServiceImpl.java | 2 + .../acs/service/dto/to/wms/AcsResponse.java | 2 +- .../acs/service/impl/AcsToWmsServiceImpl.java | 4 +- .../workorder/service/dao/PdmBdWorkorder.java | 14 + .../service/impl/SchBaseTaskServiceImpl.java | 2 +- .../task_manage/task/tasks/hn/HNMLTask.java | 222 +++++------ .../task_manage/task/tasks/hn/HNQKTask.java | 370 ++++++++++-------- .../task/tasks/hn/mapper/HNMapper.java | 12 + .../task/tasks/hn/mapper/HNMapper.xml | 75 ++++ .../main/resources/config/application-dev.yml | 2 +- .../src/views/wms/pdm/workerorder/index.vue | 10 +- 11 files changed, 433 insertions(+), 282 deletions(-) diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/impl/SysNoticeServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/impl/SysNoticeServiceImpl.java index dc906f5..b287466 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/impl/SysNoticeServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/impl/SysNoticeServiceImpl.java @@ -23,6 +23,7 @@ import org.nl.system.service.notice.ISysNoticeService; import org.nl.system.service.notice.dao.SysNotice; import org.nl.system.service.notice.dao.mapper.SysNoticeMapper; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -158,6 +159,7 @@ public class SysNoticeServiceImpl extends ServiceImpl sysNotices = sysNoticeMapper.selectList(new LambdaQueryWrapper() .eq(SysNotice::getNotice_title, title) diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/to/wms/AcsResponse.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/to/wms/AcsResponse.java index 68cb703..57ec32a 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/to/wms/AcsResponse.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/dto/to/wms/AcsResponse.java @@ -18,7 +18,7 @@ public class AcsResponse extends BaseResponse { public static AcsResponse requestRefuse(String message) { AcsResponse result = new AcsResponse(); - result.setCode(HttpStatus.HTTP_BAD_REQUEST); + result.setCode(HttpStatus.HTTP_OK); result.setMessage(message); result.setResponseDate(DateUtil.now()); return result; diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index fde49d7..aa6a2af 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -154,8 +154,8 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { result.setMessage(message); result.setRequestNo(requestNo); // 消息通知 - noticeService.createNotice("异常信息:" + message, "acsApply: " + param.getString("request_medthod_code"), - NoticeTypeEnum.EXCEPTION.getCode()); +// noticeService.createNotice(message, "ACS请求" + param.getString("request_medthod_code") + "出错", +// NoticeTypeEnum.EXCEPTION.getCode()); } // acs对接记录 interactRecordService.saveRecord(requestMethodName, param, result, GeneralDefinition.ACS_LMS); diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/dao/PdmBdWorkorder.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/dao/PdmBdWorkorder.java index b33315e..21eaaf6 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/dao/PdmBdWorkorder.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pdm/workorder/service/dao/PdmBdWorkorder.java @@ -106,6 +106,20 @@ public class PdmBdWorkorder implements Serializable { private Integer unqualified_qty; private Integer priority; + /** + * 实际新料重量 + */ + private BigDecimal real_new_weight; + + /** + * 实际旧料重量 + */ + private BigDecimal real_old_weight; + /** + * 比例 + */ + private Integer material_ratio; + @TableField(exist = false) private String material_name; diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java index 3e80cfa..96c0be7 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java @@ -69,7 +69,7 @@ public class SchBaseTaskServiceImpl extends ServiceImpl 困料输送线 - * 混碾没有工单,也可能获取不到压机工单(统一用获取不到压机工单,全部由要料记录表) + * @desc 混碾满料任务: 混碾机 -> 困料货架 + * 混碾有工单 */ -@Component(value = "HLMLTask") -@TaskType("HLMLTask") +@Component(value = "HNMLTask") @Slf4j public class HNMLTask extends AbstractTask { - private static final String TASK_CONFIG_CODE = "HLMLTask"; + private static final String TASK_CONFIG_CODE = "HNMLTask"; @Autowired private ISchBasePointService pointService; @Autowired @@ -115,32 +115,17 @@ public class HNMLTask extends AbstractTask { // 找终点 SchBasePoint point = findNextPoint(nextRegionStr, jsonObject); if (ObjectUtil.isEmpty(point)) { - task.setRemark("未存在生产该料的压机!"); + task.setRemark("未存在可用的睏料货架!"); taskService.updateById(task); // 消息通知 noticeService.createNotice(task.getRemark(), TASK_CONFIG_CODE + task.getPoint_code1(), NoticeTypeEnum.WARN.getCode()); continue; } - if (ObjectUtil.isNotEmpty(point.getTask_warn())) { - task.setRemark(point.getTask_warn()); - taskService.updateById(task); - // 消息通知 - noticeService.createNotice("找不到困料点", TASK_CONFIG_CODE + task.getPoint_code1(), NoticeTypeEnum.WARN.getCode()); - continue; - } - log.info("任务【" + task.getTask_code() + "】叫料标识:{}", point.getRecord_id()); - // 叫料完成 - requestMaterialRecordService.callMaterialFinish(point.getRecord_id(), jsonObject.getBigDecimal("weight")); - // 要料记录 - jsonObject.put("record_id", point.getRecord_id()); // 设置终点并修改创建成功状态 task.setPoint_code2(point.getPoint_code()); task.setTask_status(TaskStatus.CREATED.getCode()); task.setRemark(""); - task.setVehicle_type(GeneralDefinition.MATERIAL_CUP); - // 告知acs去左边右边 - int number = getNumber(point); - task.setResponse_param(new JSONObject().fluentPut("direction", number).toJSONString()); + task.setVehicle_type(point.getVehicle_type()); task.setRequest_param(jsonObject.toString()); taskService.updateById(task); @@ -151,17 +136,39 @@ public class HNMLTask extends AbstractTask { } - private static int getNumber(SchBasePoint point) { - // 获取设备编码 - String deviceCode = point.getDevice_code(); - int number = Integer.parseInt(deviceCode.replaceAll("[^0-9]", "")); - // 1左边2右边 - number = (number % 2) == 0 ? 2 : (number % 2); - return number; + @Override + @Transactional(rollbackFor = Exception.class) + public void createCompletion(SchBaseTask task) { + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + TaskUtils.setUpdateByAcs(task); + List nextRegionStr = Arrays.stream(taskConfig.getNext_region_str().split(",")) + .collect(Collectors.toList()); + String requestParam = task.getRequest_param(); + JSONObject jsonObject = JSONObject.parseObject(requestParam); + // 找终点 + SchBasePoint point = findNextPoint(nextRegionStr, jsonObject); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未存在可用的睏料货架!"); + throw new BadRequestException("未存在可用的睏料货架!"); + + } + // 设置组盘 - 需要的话由子类自行实现 + task.setGroup_id(setGroupPlate(jsonObject)); + // 设置终点并修改创建成功状态 + task.setPoint_code2(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setRemark(""); + task.setVehicle_type(point.getVehicle_type()); + task.setRequest_param(jsonObject.toString()); + taskService.save(task); + + point.setIng_task_code(task.getTask_code()); + PointUtils.setUpdateByAcs(point); + pointService.updateById(point); } /** - * 根据压机工单的原料编码以及点位的更新时间 * * @param nextRegionStr * @param requestParam @@ -170,28 +177,29 @@ public class HNMLTask extends AbstractTask { private SchBasePoint findNextPoint(List nextRegionStr, JSONObject requestParam) { String materialCode = requestParam.getString("material_code"); Assert.notNull(materialCode, "物料编码不能为空!"); - materialCode = materialCode.substring(0, 12); - // 获取要料表中的数据,获取对应物料(要料表存的是泥料) update: 先工单优先级后时间 - List list = requestMaterialRecordService.getLeftJoinWorkOrderList(materialCode); - if (list.size() == 0) { - SchBasePoint point = new SchBasePoint(); - point.setTask_warn("压机要料表找不到数据,请排查泥料号:[" + materialCode + "]"); - return point; + // 工单 + String workorderCode = requestParam.getString("workorder_code"); + PdmBdWorkorder order = workorderService.getByCode(workorderCode); + if (order.getStanding_time() == 0) { + // 不需要静置,直接往布料机上。先判断困料货架没有这个物料且没任务往对应布料机送才可以 + // 查找公共睏料货架是否存在相同泥料的物料 + List checkPoints = hnMapper.getCommonHjPoint(order.getRaw_material_code(), order.getVehicle_type()); + if (checkPoints.size() == 0) { + // 查找可以放的布料机 + checkPoints = hnMapper.getCanUseBlj(order.getRaw_material_code(), order.getVehicle_type()); + if (checkPoints.size() > 0) { + // 往布料机送 + SchBasePoint point = checkPoints.get(0); + return point; + } + } } - // 要料数据 - PdmBdRequestMaterialRecord requestMaterialRecord = list.get(0); - // 根据设备号查找对应的工单点位 - LambdaQueryWrapper lam = new QueryWrapper().lambda(); - lam.eq(SchBasePoint::getRegion_code, "LZKLX") - .eq(SchBasePoint::getPoint_type, "5") - .like(SchBasePoint::getParent_point_code, requestMaterialRecord.getDevice_code()); - List points = pointService.list(lam); + // 先判断专属货架是否有空位 + List points = hnMapper.findEmptyPointForHNML(order.getRaw_material_code(), order.getVehicle_type()); if (points.size() == 0) { return null; } SchBasePoint point = points.get(0); - point.setDevice_code(requestMaterialRecord.getDevice_code()); - point.setRecord_id(requestMaterialRecord.getRecord_id()); return point; } @@ -217,62 +225,57 @@ public class HNMLTask extends AbstractTask { public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { // 获取参数 String endPoint = taskObj.getPoint_code2(); + String startPoint = taskObj.getPoint_code1(); SchBasePoint endPointObj = pointService.getById(endPoint); - String responseParam = taskObj.getResponse_param(); - String requestParam = taskObj.getRequest_param(); - JSONObject responseObj = JSONObject.parseObject(responseParam); - JSONObject requestObj = JSONObject.parseObject(requestParam); - // 要把数据存到组盘表。压制工单放进去, + SchBasePoint startPointObj = pointService.getById(startPoint); SchBaseVehiclematerialgroup groupEntity = vehiclematerialgroupService.getOne( new LambdaQueryWrapper() - .eq(SchBaseVehiclematerialgroup::getGroup_id, taskObj.getGroup_id()) - .last("FOR UPDATE")); - if (ObjectUtil.isEmpty(groupEntity)) { - // 找不到组盘信息 - throw new BadRequestException("找不到组盘信息"); - } + .eq(SchBaseVehiclematerialgroup::getGroup_id, taskObj.getGroup_id())); +// Assert.notNull(groupEntity, ExceptionConstant.GROUP_INFORMATION_NOT_FOUND); // 终点去除正在执行的任务, 设置载具编码、载具类型、载具数量 if (ObjectUtil.isNotEmpty(endPointObj)) { endPointObj.setIng_task_code(""); + endPointObj.setPoint_status(PointStatusEnum.FULL_POINT.getCode()); endPointObj.setVehicle_qty(1); + endPointObj.setVehicle_code(taskObj.getVehicle_code()); + endPointObj.setVehicle_type(taskObj.getVehicle_type()); PointUtils.setUpdateByType(endPointObj, taskFinishedType); pointService.updateById(endPointObj); - // 终点为公用点位,需要获取左右方向 - String parentPointCode = endPointObj.getParent_point_code(); - String[] split = parentPointCode.split(","); - if (split.length > 1) { - parentPointCode = split[responseObj.getInteger("direction") - 1]; - } - // 找到父点位 - SchBasePoint yjDevice = pointService.getOne(new LambdaQueryWrapper() - .eq(SchBasePoint::getPoint_code, parentPointCode)); - // 父点位(设备)需要切换成非空状态 - PointUtils.setUpdateByType(yjDevice, taskFinishedType); - yjDevice.setPoint_status(PointStatusEnum.FULL_POINT.getCode()); - pointService.updateById(yjDevice); - PdmBdRequestMaterialRecord materialRecord = requestMaterialRecordService - .getById(requestObj.getString("record_id")); - // 找压机工单 -> 根据压机要料表对应的工单 - PdmBdWorkorder one = workorderService.getByCode(materialRecord.getWorkorder_id()); - if (ObjectUtil.isNotEmpty(one)) { - // remove: 给组盘数据设置批次:压制工单+混砂机号+碾次 - groupEntity.setWorkorder_code(one.getWorkorder_code()); - groupEntity.setPoint_code(endPointObj.getPoint_code()); - groupEntity.setPoint_name(endPointObj.getPoint_name()); - groupEntity.setMove_way(groupEntity.getMove_way() + " -> " + endPointObj.getPoint_code()); - groupEntity.setMaterial_id(one.getMaterial_id()); - // mark: *根据压机的工单物料标识查找静置时间, 先根据工单,在根据物料信息 - MdBaseMaterial mdBaseMaterial = materialService.getById(one.getMaterial_id()); - groupEntity.setStanding_time(one.getStanding_time() == 0 - ? mdBaseMaterial.getStanding_time() : one.getStanding_time()); + // 更新工单上的实际重量 + // 更新混碾工单 + PdmBdWorkorder workOrderObj = workorderService.getByCode(groupEntity.getWorkorder_code()); + workOrderObj.setReal_weight(workOrderObj.getReal_weight().add(groupEntity.getMaterial_weight())); + TaskUtils.setWorkOrderUpdateByType(workOrderObj, taskFinishedType); + workorderService.updateById(workOrderObj); + // 更新组盘数据 + groupEntity.setPoint_code(endPointObj.getPoint_code()); + groupEntity.setPoint_name(endPointObj.getPoint_name()); + groupEntity.setMove_way(groupEntity.getMove_way() + " -> " + endPointObj.getPoint_code()); + groupEntity.setTask_code(taskObj.getTask_code()); + TaskUtils.setGroupUpdateByType(groupEntity, taskFinishedType); + vehiclematerialgroupService.updateById(groupEntity); + // 如果终点是布料机,那就是需要将压机工单对应(大小)料的真实值相加 + if ("YZ".equals(endPointObj.getRegion_code())) { + PdmBdWorkorder productionTask = workorderService.getDeviceDockingProductionTask(endPoint); + switch (taskObj.getVehicle_type()) { + case "DLZ": + productionTask.setReal_new_weight(productionTask.getReal_new_weight() + .add(groupEntity.getMaterial_weight())); + break; + case "XLZ": + productionTask.setReal_old_weight(productionTask.getReal_old_weight() + .add(groupEntity.getMaterial_weight())); + break; + default: + throw new BadRequestException("点位区域配置错误!"); + } + TaskUtils.setWorkOrderUpdateByType(productionTask, taskFinishedType); + workorderService.updateById(productionTask); } + // 清空起点 + PointUtils.setUpdateByType(startPointObj, taskFinishedType); + PointUtils.clearPoint(startPointObj); } - // 更新组盘数据 - groupEntity.setGroup_bind_material_status(GroupBindMaterialStatusEnum.BOUND.getValue()); - groupEntity.setTask_code(taskObj.getTask_code()); - TaskUtils.setGroupUpdateByType(groupEntity, taskFinishedType); - vehiclematerialgroupService.updateById(groupEntity); - // 起点清空 - 由ACS请求修改 taskObj.setRemark(GeneralDefinition.TASK_FINISH); taskObj.setTask_status(TaskStatus.FINISHED.getCode()); taskObj.setFinished_type(taskFinishedType.getCode()); @@ -310,18 +313,9 @@ public class HNMLTask extends AbstractTask { // 吨袋号(泥料号+2位年+月日时分+设备号+碾次) // LMS组盘时生成混料批次:压制工单+混砂机号+碾次 String vehicleCode = TaskUtils.defaultVehicleCode(param.getString("vehicle_code")); - String vehicleType = param.getString("vehicle_type"); // 泥料物料对应不出物料标识 // 泥料编码: 吨袋号,泥料前 - String packNo = param.getString("material_code"); - String materialCode = packNo.substring(0, 12); - // todo: 如果没找到就报错,就不创建组盘信息 - // 碾次 - String mixTimes = packNo.substring(18, packNo.length()); - // 载具类型默认料盅 - if (vehicleType == null || vehicleType.equals(GeneralDefinition.NO)) { - vehicleType = GeneralDefinition.MATERIAL_CUP; - } + String materialCode = param.getString("material_code"); String deviceCode = param.getString("device_code"); BigDecimal weight = param.getBigDecimal("weight"); SchBasePoint basePoint = pointService.getOne(new LambdaQueryWrapper() @@ -333,15 +327,22 @@ public class HNMLTask extends AbstractTask { if (vehicleCode == null || vehicleCode.equals(GeneralDefinition.NO)) { throw new BadRequestException("载具编码不能为空"); } - // 找到相同组盘信息就直接返回id,避免任务取消组盘信息还存在,重复插入 - // 找到不直接返回,用那条数据进行修改 - // 解绑同载具的信息 - vehiclematerialgroupService.unBindingSameVehicleMaterialToMes(vehicleCode, vehicleType); + String vehicleType = basePoint.getVehicle_type(); + String workorderCode = param.getString("workorder_code"); + PdmBdWorkorder order = workorderService.getByCode(workorderCode); + + // 找到相同组盘信息就修改,避免任务取消组盘信息还存在,重复插入 + SchBaseVehiclematerialgroup groupInfo = vehiclematerialgroupService + .getGroupInfo(vehicleCode, vehicleType, GroupBindMaterialStatusEnum.BOUND.getValue()); + if (ObjectUtil.isNotEmpty(groupInfo)) { + throw new BadRequestException("载具号[" + vehicleCode + "]组盘信息已存在"); + } SchBaseVehiclematerialgroup groupEntity = new SchBaseVehiclematerialgroup(); groupEntity.setGroup_id(IdUtil.getSnowflake(1, 1).nextIdStr()); // 要把数据存到组盘表 // 物料标识等任务完成后赋值 - groupEntity.setMaterial_id(GeneralDefinition.UNKNOWN); + groupEntity.setWorkorder_code(workorderCode); + groupEntity.setMaterial_id(order.getMaterial_id()); groupEntity.setRedundance_material_code(materialCode); groupEntity.setCreate_id(GeneralDefinition.ACS_ID); groupEntity.setCreate_name(GeneralDefinition.ACS_NAME); @@ -352,10 +353,11 @@ public class HNMLTask extends AbstractTask { groupEntity.setPoint_code(basePoint.getPoint_code()); groupEntity.setPoint_name(basePoint.getPoint_name()); groupEntity.setMove_way(basePoint.getPoint_code()); - groupEntity.setMix_times(mixTimes); +// groupEntity.setMix_times(mixTimes); groupEntity.setInstorage_time(DateUtil.now()); + groupEntity.setStanding_time(order.getStanding_time()); // update: 11/15批次修改成吨袋号 - groupEntity.setPcsn(packNo); + groupEntity.setPcsn(DateUtil.format(new Date(), "yyyyMMdd")); groupEntity.setMaterial_weight(ObjectUtil.isNotEmpty(weight) ? weight : BigDecimal.valueOf(0)); @@ -363,7 +365,7 @@ public class HNMLTask extends AbstractTask { groupEntity.setGroup_status(GroupStatusEnum.IN_STORAGE.getType()); groupEntity.setIs_delete(false); // 对于混碾的组盘 暂时存吨袋号 - groupEntity.setExt_data(packNo); +// groupEntity.setExt_data(packNo); vehiclematerialgroupService.save(groupEntity); return groupEntity.getGroup_id(); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNQKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNQKTask.java index 2199e04..8afd477 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNQKTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNQKTask.java @@ -1,166 +1,204 @@ -//package org.nl.wms.sch.task_manage.task.tasks.hn; -// -//import cn.hutool.core.date.DateUtil; -//import cn.hutool.core.util.ObjectUtil; -//import com.alibaba.fastjson.JSONObject; -//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -//import org.nl.common.exception.BadRequestException; -//import org.nl.wms.pdm.workorder.service.IPdmBdWorkorderService; -//import org.nl.wms.sch.point.service.ISchBasePointService; -//import org.nl.wms.sch.point.service.dao.SchBasePoint; -//import org.nl.wms.sch.task.service.ISchBaseTaskService; -//import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; -//import org.nl.wms.sch.task.service.dao.SchBaseTask; -//import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; -//import org.nl.wms.sch.task_manage.AbstractTask; -//import org.nl.wms.sch.task_manage.GeneralDefinition; -//import org.nl.wms.sch.task_manage.enums.PointStatusEnum; -//import org.nl.wms.sch.task_manage.task.TaskType; -//import org.nl.wms.sch.task_manage.task.core.TaskStatus; -//import org.nl.wms.util.PointUtils; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.stereotype.Component; -//import org.springframework.transaction.annotation.Transactional; -// -//import java.util.Arrays; -//import java.util.List; -//import java.util.stream.Collectors; -// -///** -// * @Author: lyd -// * @Description: 混料缺空:呼叫空载具 -// * @Date: 2023/5/19 -// */ -//@Deprecated -//@Component -//@TaskType("--") -//public class HNQKTask extends AbstractTask { -// private static String TASK_CONFIG_CODE = "--"; -// private static String EMPTY_ZHONG = "1"; -// -// @Autowired -// private ISchBasePointService pointService; -// @Autowired -// private ISchBaseTaskService taskService; -// @Autowired -// private ISchBaseTaskconfigService taskConfigService; -// @Autowired -// private IPdmBdWorkorderService workorderService; -// -// /** -// * 具体业务 -// */ -// @Override -// @Transactional(rollbackFor = Exception.class) -// public void create() { -// // 获取任务 -// List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); -// // 配置信息 -// SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() -// .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); -// for (SchBaseTask task : tasks) { -// List startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(",")).collect(Collectors.toList()); -// // 找起点 -// String extGroupData = task.getExt_group_data(); -// JSONObject jsonObject = JSONObject.parseObject(extGroupData); -// SchBasePoint point = findStartPoint(startRegionStr, jsonObject); -// if (ObjectUtil.isEmpty(point)) { -// task.setRemark("未找到所需点位!"); -// taskService.update(task); -// // 消息通知 -// continue; -// } -// // 设置终点并修改创建成功状态 -// task.setPoint_code1(point.getPoint_code()); -// task.setRemark(""); -// task.setTask_status(TaskStatus.CREATED.getCode()); -// taskService.update(task); -// -// point.setIng_task_code(task.getTask_code()); -// pointService.update(point); -// -// //下发 -//// this.renotifyAcs(task); -// } -// } -// -// /** -// * 找起点, 通过料盅睏料线区域的空盅位置找到空盅 -// * -// * @param startRegionStr -// * @param extGroupData -// * @return -// */ -// private SchBasePoint findStartPoint(List startRegionStr, JSONObject extGroupData) { -// LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); -// lam.in(SchBasePoint::getRegion_code, startRegionStr) -// .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_VEHICLE.getCode()) -// .eq(SchBasePoint::getPoint_type, EMPTY_ZHONG) -// .and(la -> la.isNull(SchBasePoint::getIng_task_code) // 当前执行的任务为空或者NULL,有数据表示锁住 -// .or() -// .eq(SchBasePoint::getIng_task_code, "")) -// .orderByAsc(SchBasePoint::getIn_order_seq) -// .orderByAsc(SchBasePoint::getPoint_code); -// List schBasePoints = pointService.list(lam); -// return ObjectUtil.isNotEmpty(schBasePoints) ? schBasePoints.get(0) : null; -// } -// -// @Override -// @Transactional(rollbackFor = Exception.class) -// protected void updateStatus(String task_code, TaskStatus status) { -// // 校验任务 -// SchBaseTask taskObj = taskService.getByCode(task_code); -// if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { -// throw new BadRequestException("该任务已完成!"); -// } -// if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { -// throw new BadRequestException("该任务已取消!"); -// } -// // 获取参数 -// String startPoint = taskObj.getPoint_code1(); -// String endPoint = taskObj.getPoint_code2(); -// SchBasePoint startPointObj = pointService.getById(startPoint); -// SchBasePoint endPointObj = pointService.getById(endPoint); -// // 根据传来的类型去对任务进行操作 -// if (status.equals(TaskStatus.EXECUTING)) { -// taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); -// taskObj.setRemark("执行中"); -// } -// if (status.equals(TaskStatus.FINISHED)) { -// // 起点清空 -// if (ObjectUtil.isNotEmpty(startPointObj)) { -// PointUtils.clearPoint(startPointObj); -// taskObj.setVehicle_code(startPointObj.getVehicle_code()); -// endPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode()); -// endPointObj.setVehicle_type("1"); -// endPointObj.setVehicle_code(startPointObj.getVehicle_code()); -// endPointObj.setVehicle_qty(1); -// endPointObj.setUpdate_time(DateUtil.now()); -// pointService.updateById(endPointObj); -// } -// // 任务完成 -// taskObj.setTask_status(TaskStatus.FINISHED.getCode()); -// taskObj.setRemark(GeneralDefinition.TASK_FINISH); -// } -// if (status.equals(TaskStatus.CANCELED)) { -// // 起点解锁 -// if (ObjectUtil.isNotEmpty(startPointObj)) { -// startPointObj.setIng_task_code(""); -// pointService.update(startPointObj); -// } -// taskObj.setTask_status(TaskStatus.CANCELED.getCode()); -// } -// taskService.update(taskObj); -// } -// -// @Override -// public void forceFinish(String task_code) { -// this.updateStatus(task_code, TaskStatus.FINISHED); -// } -// -// @Override -// public void cancel(String task_code) { -// this.updateStatus(task_code, TaskStatus.CANCELED); -// } -//} -// +package org.nl.wms.sch.task_manage.task.tasks.hn; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.nl.common.exception.BadRequestException; +import org.nl.system.service.notice.ISysNoticeService; +import org.nl.wms.pdm.workorder.service.IPdmBdWorkorderService; +import org.nl.wms.pdm.workorder.service.dao.PdmBdWorkorder; +import org.nl.wms.sch.point.service.ISchBasePointService; +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.nl.wms.sch.task.service.ISchBaseTaskService; +import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; +import org.nl.wms.sch.task.service.dao.SchBaseTask; +import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; +import org.nl.wms.sch.task_manage.AbstractTask; +import org.nl.wms.sch.task_manage.GeneralDefinition; +import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum; +import org.nl.wms.sch.task_manage.enums.PointStatusEnum; +import org.nl.wms.sch.task_manage.task.TaskType; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.util.PointUtils; +import org.nl.wms.util.TaskUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author: lyd + * @Description: 混料缺空:混料呼叫空盅 + * 根据工单指定的料盅类型来申请 + * @Date: 2023/5/19 + */ +@Component(value = "HNQKTask") +@TaskType("HNQKTask") +public class HNQKTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "HNQKTask"; + + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private IPdmBdWorkorderService workorderService; + @Autowired + private ISysNoticeService noticeService; + + /** + * 具体业务 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void create() { + // 获取任务 + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + for (SchBaseTask task : tasks) { + List startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(",")).collect(Collectors.toList()); + // 找起点 + String extGroupData = task.getExt_group_data(); + JSONObject jsonObject = JSONObject.parseObject(extGroupData); + SchBasePoint point = findStartPoint(startRegionStr, jsonObject); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("睏料货架没有所需的空盅!"); + taskService.update(task); + // 消息通知 + continue; + } + // 设置终点并修改创建成功状态 + task.setPoint_code1(point.getPoint_code()); + task.setRemark(""); + task.setTask_status(TaskStatus.CREATED.getCode()); + taskService.update(task); + + point.setIng_task_code(task.getTask_code()); + pointService.update(point); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void createCompletion(SchBaseTask task) { + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + TaskUtils.setUpdateByAcs(task); + List startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(",")) + .collect(Collectors.toList()); + // 找起点 + String requestParam = task.getRequest_param(); + JSONObject jsonObject = JSONObject.parseObject(requestParam); + SchBasePoint point = findStartPoint(startRegionStr, jsonObject); + if (ObjectUtil.isEmpty(point)) { + // 消息通知 + noticeService.createNotice("睏料货架没有所需的空盅!", task.getPoint_code2() + "混碾呼叫空盅任务失败", + NoticeTypeEnum.WARN.getCode()); + throw new BadRequestException("睏料货架没有所需的空盅, " + task.getPoint_code2() + "混碾呼叫空盅任务失败, 未找到所需点位!"); + } + // 设置终点并修改创建成功状态 + task.setPoint_code1(point.getPoint_code()); + task.setVehicle_code(point.getVehicle_code()); + task.setRemark(""); + task.setVehicle_type(point.getVehicle_type()); + task.setTask_status(TaskStatus.CREATED.getCode()); + taskService.save(task); + + point.setIng_task_code(task.getTask_code()); + PointUtils.setUpdateByAcs(point); + pointService.updateById(point); + } + + /** + * 找起点, 通过料盅睏料线区域的空盅位置找到空盅 + * + * @param startRegionStr + * @param extGroupData + * @return + */ + private SchBasePoint findStartPoint(List startRegionStr, JSONObject extGroupData) { + // workorder_code + String workorderCode = extGroupData.getString("workorder_code"); + PdmBdWorkorder order = workorderService.getByCode(workorderCode); + // 先找专属货架再找公共货架 + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.in(SchBasePoint::getRegion_code, startRegionStr) + .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_VEHICLE.getCode()) + .eq(SchBasePoint::getVehicle_type, order.getVehicle_type()) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .orderByAsc(SchBasePoint::getPoint_type) + .orderByAsc(SchBasePoint::getPoint_code); + List schBasePoints = pointService.list(lam); + return ObjectUtil.isNotEmpty(schBasePoints) ? schBasePoints.get(0) : null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + protected void updateStatus(String task_code, TaskStatus status) { + // 校验任务 + SchBaseTask taskObj = taskService.getByCode(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + // 获取参数 + String startPoint = taskObj.getPoint_code1(); + String endPoint = taskObj.getPoint_code2(); + SchBasePoint startPointObj = pointService.getById(startPoint); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + } + if (status.equals(TaskStatus.FINISHED)) { + // 起点清空 + if (ObjectUtil.isNotEmpty(startPointObj)) { + PointUtils.clearPoint(startPointObj); + taskObj.setVehicle_code(startPointObj.getVehicle_code()); + endPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode()); + endPointObj.setVehicle_type(taskObj.getVehicle_type()); + endPointObj.setVehicle_code(taskObj.getVehicle_code()); + endPointObj.setVehicle_qty(1); + endPointObj.setUpdate_time(DateUtil.now()); + pointService.updateById(endPointObj); + } + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark(GeneralDefinition.TASK_FINISH); + } + if (status.equals(TaskStatus.CANCELED)) { + // 起点解锁 + if (ObjectUtil.isNotEmpty(startPointObj)) { + startPointObj.setIng_task_code(""); + pointService.update(startPointObj); + } + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + } + taskService.update(taskObj); + } + + @Override + public void forceFinish(String task_code) { + this.updateStatus(task_code, TaskStatus.FINISHED); + } + + @Override + public void cancel(String task_code) { + this.updateStatus(task_code, TaskStatus.CANCELED); + } +} + diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.java index 2ebf5a3..533a43e 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.java @@ -17,4 +17,16 @@ public interface HNMapper extends BaseMapper { // 通过工单与点位更新 List findPointForHNMLAndWorkOrder(List regionCode, String materialCode); + + /** + * 根据泥料和料盅类型获取空点位 + * @param rawMaterialCode + * @param vehicleType + * @return + */ + List findEmptyPointForHNML(String rawMaterialCode, String vehicleType); + + List getCommonHjPoint(String rawMaterialCode, String vehicleType); + + List getCanUseBlj(String rawMaterialCode, String vehicleType); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.xml index 4c32dab..ebb91c3 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.xml +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/mapper/HNMapper.xml @@ -50,4 +50,79 @@ AND p2.point_code IS NOT NULL + + + diff --git a/lms/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml b/lms/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml index 299221e..eff53a1 100644 --- a/lms/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml +++ b/lms/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml @@ -13,7 +13,7 @@ spring: # url: jdbc:log4jdbc:mysql://${DB_HOST:10.93.41.198}:${DB_PORT:3306}/${DB_NAME:rl_mg_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true # username: ${DB_USER:root} # password: ${DB_PWD:123456} - url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:rtmg_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true + url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:lnhx_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true username: ${DB_USER:root} password: ${DB_PWD:12356} type: com.alibaba.druid.pool.DruidDataSource diff --git a/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue b/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue index bf99455..103bb94 100644 --- a/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue +++ b/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue @@ -271,7 +271,14 @@ style="width: 240px;" /> - + + + +