From c41633bf789ceab6b8bde7ce12bd6730a8d4bb64 Mon Sep 17 00:00:00 2001 From: zhangzq Date: Wed, 17 Jun 2026 18:52:27 +0800 Subject: [PATCH] =?UTF-8?q?add:=E6=B7=BB=E5=8A=A0=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E4=B8=8B=E7=BA=BF=E5=85=A5=E5=BA=93=E5=9B=9E=E4=BC=A0=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BB=BB=E5=8A=A1=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/dao/Structattr.java | 3 + .../service/impl/StructattrServiceImpl.java | 5 +- .../controller/MesStructLineController.java | 2 +- .../service/impl}/StructOfflineService.java | 47 +++- .../nl/wms/pm_manage/SourceBillTypeEnum.java | 1 + .../PReceivingListenerHandler.java | 34 +++ .../listenerHandler/PReceivingParams.java | 19 ++ .../service/core/tasks/BWIPInTask.java | 200 ++++++++++++++++++ 8 files changed, 298 insertions(+), 13 deletions(-) rename nladmin-system/wms-server/src/main/java/org/nl/wms/{sch_manage/service/core/tasks => ext_manage/service/impl}/StructOfflineService.java (74%) create mode 100644 nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/preceiving/listenerHandler/PReceivingListenerHandler.java create mode 100644 nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/preceiving/listenerHandler/PReceivingParams.java create mode 100644 nladmin-system/wms-server/src/main/java/org/nl/wms/sch_manage/service/core/tasks/BWIPInTask.java diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/basedata_manage/service/dao/Structattr.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/basedata_manage/service/dao/Structattr.java index 4009b7a..5922d06 100644 --- a/nladmin-system/wms-server/src/main/java/org/nl/wms/basedata_manage/service/dao/Structattr.java +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/basedata_manage/service/dao/Structattr.java @@ -1,5 +1,7 @@ package org.nl.wms.basedata_manage.service.dao; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -182,6 +184,7 @@ public class Structattr implements Serializable { /** * 存储载具号 */ + @TableField(value = "storagevehicle_code", updateStrategy = FieldStrategy.IGNORED) private String storagevehicle_code; /** diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java index 7d47577..715d34e 100644 --- a/nladmin-system/wms-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java @@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.nl.common.domain.query.PageQuery; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.IdUtil; @@ -191,7 +192,9 @@ public class StructattrServiceImpl extends ServiceImpl() .eq(IOStorInvDis::getIostorinv_id, iostorinv_id) .select(IOStorInvDis::getIostorinvdis_id)); - Map divPointParam = new HashMap<>(); - divPointParam.put("point_code", offlineDTO.getUnloadPort()); - ArrayList> tableMater = new ArrayList<>(); - HashMap materRow = new HashMap<>(); - materRow.put("iostorinv_id", iostorinv_id); // 入库单明细ID - materRow.put("iostorinvdis_id", ioStorInvDis.getIostorinvdis_id()); // 分配明细ID(如果有) - materRow.put("storagevehicle_code", storagevehicleCode); // 载具编码 - tableMater.add(materRow); - divPointParam.put("tableMater", tableMater); - iInBillService.divPoint(divPointParam); + //判断是否已经分配好货位 + List disSet = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<>(IOStorInvDis.class) + .eq(IOStorInvDis::getIostorinv_id,iostorinv_id) + .eq(IOStorInvDis::getStoragevehicle_code, storagevehicleCode) + .and(wrapper -> wrapper.isNotNull(IOStorInvDis::getStruct_code).or().ne(IOStorInvDis::getStruct_code, ""))); + if (CollectionUtils.isEmpty(disSet)) { + throw new BadRequestException("该明细还没分配货位,请先分配货位"); + } + //创建任务 + JSONObject task_form = new JSONObject(); + task_form.put("task_type", "BWIPInTask"); + task_form.put("TaskCode", CodeUtil.getNewCode("TASK_CODE")); + task_form.put("PickingLocation", schBasePoint.getPoint_code()); + task_form.put("PlacedLocation", disSet.get(0).getStruct_code()); + task_form.put("vehicle_code", storagevehicleCode); + BWIPInTask bwipInTask = SpringContextHolder.getBean("BWIPInTask"); + String task_id = bwipInTask.create(task_form); + //更新详情数据 + ioStorInvDisMapper.update(null, new LambdaUpdateWrapper<>(IOStorInvDis.class) + .set(IOStorInvDis::getWork_status, IOSEnum.INBILL_DIS_STATUS.code("生成")) + .set(IOStorInvDis::getTask_id, task_id) + .set(IOStorInvDis::getIs_issued, BaseDataEnum.IS_YES_NOT.code("是")) + .set(IOStorInvDis::getPoint_code, schBasePoint.getPoint_code()) + .eq(IOStorInvDis::getIostorinv_id, iostorinv_id) + .eq(IOStorInvDis::getStoragevehicle_code, storagevehicleCode) + .ne(IOStorInvDis::getWork_status, IOSEnum.INBILL_DIS_STATUS.code("完成"))); } } diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/SourceBillTypeEnum.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/SourceBillTypeEnum.java index 9cc22a1..3684771 100644 --- a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/SourceBillTypeEnum.java +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/SourceBillTypeEnum.java @@ -13,6 +13,7 @@ import org.nl.common.exception.BadRequestException; public enum SourceBillTypeEnum { PM_DEMADN("pm_demand","出库需求单"), PM_PURCHASE("pm_purchase","采购入库单"), + PM_RECEIVING("p_receiving","生产入库"), UNDEFINE("","未定义"), ; /** diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/preceiving/listenerHandler/PReceivingListenerHandler.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/preceiving/listenerHandler/PReceivingListenerHandler.java new file mode 100644 index 0000000..ea67360 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/preceiving/listenerHandler/PReceivingListenerHandler.java @@ -0,0 +1,34 @@ +package org.nl.wms.pm_manage.preceiving.listenerHandler; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.nl.wms.pm_manage.demand.service.IPmDemandService; +import org.nl.wms.pm_manage.demand.service.dao.PmDemand; +import org.nl.wms.pm_manage.demand.service.enums.DemandStatus; +import org.nl.wms.pm_manage.listener.core.BaseFormListenerHandler; +import org.nl.wms.warehouse_manage.enums.IOSEnum; +import org.nl.wms.warehouse_manage.stockReturn.service.IPmStockReturnService; +import org.nl.wms.warehouse_manage.stockReturn.service.dao.PmStockReturn; +import org.nl.wms.warehouse_manage.stockReturn.service.enums.StockReturnStatusEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component("p_receiving") +public class PReceivingListenerHandler extends BaseFormListenerHandler { + @Autowired + IPmDemandService iPmDemandService; + @Autowired + IPmStockReturnService iPmStockReturnService; + @Override + public void onApplicationEvent(PReceivingParams params) { + final PmStockReturn stockReturn = new PmStockReturn(); + stockReturn.setCreate_time(DateUtil.now()); + stockReturn.setRequest_type(IOSEnum.BILL_TYPE.code("生产入库")); + stockReturn.setStatus(StockReturnStatusEnum.TODO.getCode()); + stockReturn.setRequest_data(JSON.toJSONString(params)); + iPmStockReturnService.save(stockReturn); + //需求单昨晚,执行调拨流程 + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/preceiving/listenerHandler/PReceivingParams.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/preceiving/listenerHandler/PReceivingParams.java new file mode 100644 index 0000000..1defe3e --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/preceiving/listenerHandler/PReceivingParams.java @@ -0,0 +1,19 @@ +package org.nl.wms.pm_manage.preceiving.listenerHandler; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Map; + +@Data +public class PReceivingParams { + private String billCode; + private String sectCode; + private Map materialQty; + + public PReceivingParams(String billCode, Map materialQty,String sectCode) { + this.billCode = billCode; + this.materialQty = materialQty; + this.sectCode = sectCode; + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/sch_manage/service/core/tasks/BWIPInTask.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/sch_manage/service/core/tasks/BWIPInTask.java new file mode 100644 index 0000000..340c72e --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/sch_manage/service/core/tasks/BWIPInTask.java @@ -0,0 +1,200 @@ +package org.nl.wms.sch_manage.service.core.tasks; + +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 com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.IdUtil; +import org.nl.common.utils.SecurityUtils; +import org.nl.wms.basedata_manage.enums.BaseDataEnum; +import org.nl.wms.pm_manage.SourceBillTypeEnum; +import org.nl.wms.pm_manage.listener.PmManageEvent; +import org.nl.wms.pm_manage.preceiving.listenerHandler.PReceivingParams; +import org.nl.wms.sch_manage.enums.TaskStatus; +import org.nl.wms.sch_manage.service.ISchBaseTaskService; +import org.nl.wms.sch_manage.service.core.AbstractTask; +import org.nl.wms.sch_manage.service.core.AcsTaskDto; +import org.nl.wms.sch_manage.service.core.TaskType; +import org.nl.wms.sch_manage.service.dao.SchBaseTask; +import org.nl.wms.warehouse_manage.enums.IOSEnum; +import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService; +import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDis; +import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +;import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @Author: Liuxy + * @Description: 入库任务类 + * @Date: 2025/5/25 + */ +@Component(value = "BWIPInTask") +@TaskType("BWIPInTask") +public class BWIPInTask extends AbstractTask { + @Autowired + private ISchBaseTaskService taskService; + @Resource + private IInBillService rawAssistIStorService; + @Resource + private IOStorInvDisMapper ioStorInvDisMapper; + @Autowired + private ApplicationEventPublisher eventPublisher; + + @Override + public String create(JSONObject json) { + SchBaseTask task = new SchBaseTask(); + task.setTask_id(IdUtil.getStringId()); + task.setTask_code(json.getString("TaskCode")); + task.setTask_status(TaskStatus.CREATE.getCode()); + task.setConfig_code(json.getString("task_type")); + task.setPoint_code1(json.getString("PickingLocation")); + task.setPoint_code2(json.getString("PlacedLocation")); + task.setVehicle_code(json.getString("vehicle_code")); + task.setGroup_id(json.getString("group_id")); + task.setRequest_param(json.toString()); + task.setPriority(json.getString("Priority")); + task.setCreate_id(SecurityUtils.getCurrentUserId()); + task.setCreate_name(SecurityUtils.getCurrentNickName()); + task.setCreate_time(DateUtil.now()); + taskService.save(task); + return task.getTask_id(); + } + + @Override + public AcsTaskDto sendAcsParam(String taskId) { + SchBaseTask taskDao = taskService.getById(taskId); + // 组织下发给acs的数据 + AcsTaskDto acsTaskDto = new AcsTaskDto(); + acsTaskDto.setExt_task_uuid(taskDao.getTask_id()); + acsTaskDto.setTask_code(taskDao.getTask_code()); + acsTaskDto.setStart_device_code(taskDao.getPoint_code1()); + acsTaskDto.setNext_device_code(taskDao.getPoint_code2()); + if (taskDao.getPoint_code2().contains("-")) { + acsTaskDto.setNext_device_code(taskDao.getPoint_code2().replace('-', '_')); + } + acsTaskDto.setPriority(taskDao.getPriority()); + acsTaskDto.setTask_type("1"); + + return acsTaskDto; + } + + @Override + 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("该任务已取消!"); + } + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + taskService.updateById(taskObj); + } + if (status.equals(TaskStatus.FINISHED)) { + this.finishTask(taskObj); + } + if (status.equals(TaskStatus.CANCELED)) { + this.cancelTask(taskObj); + } + + } + + @Override + @Transactional + public void forceFinish(String taskCode) { + SchBaseTask task = taskService.getByCode(taskCode); + // 任务完成 + task.setTask_status(TaskStatus.FINISHED.getCode()); + task.setRemark("已完成"); + taskService.updateById(task); + rawAssistIStorService.taskFinish(task); + //推送入库单 + List ioStorInvDis = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<>(IOStorInvDis.class) + .eq(IOStorInvDis::getTask_id, task.getTask_id()) + ); + Map materialQtyMap = new HashMap<>(); + for (IOStorInvDis dis : ioStorInvDis) { + String materialCode = dis.getMaterial_code(); + BigDecimal planQty = dis.getPlan_qty(); + if (materialCode != null && planQty != null) { + materialQtyMap.merge(materialCode, planQty, BigDecimal::add); + } + } + eventPublisher.publishEvent(new PmManageEvent(SourceBillTypeEnum.PM_RECEIVING.getBillType(),new PReceivingParams( + ioStorInvDis.get(0).getIostorinvdis_id(),materialQtyMap,ioStorInvDis.get(0).getSect_code()))); + } + + @Override + public void cancel(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + if (!TaskStatus.CREATE.getCode().equals(taskObj.getTask_status())) { + throw new BadRequestException("任务状态必须为生成才能取消任务"); + } + this.cancelTask(taskObj); + } + + @Transactional(rollbackFor = Exception.class) + public void finishTask(SchBaseTask task) { + // 任务完成 + task.setTask_status(TaskStatus.FINISHED.getCode()); + task.setRemark("已完成"); + taskService.updateById(task); + rawAssistIStorService.taskFinish(task); + //推送入库单 + List ioStorInvDis = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<>(IOStorInvDis.class) + .eq(IOStorInvDis::getTask_id, task.getTask_id()) + ); + Map materialQtyMap = new HashMap<>(); + for (IOStorInvDis dis : ioStorInvDis) { + String materialCode = dis.getMaterial_code(); + BigDecimal planQty = dis.getPlan_qty(); + if (materialCode != null && planQty != null) { + materialQtyMap.merge(materialCode, planQty, BigDecimal::add); + } + } + eventPublisher.publishEvent(new PmManageEvent(SourceBillTypeEnum.PM_RECEIVING.getBillType(),new PReceivingParams( + ioStorInvDis.get(0).getIostorinvdis_id(),materialQtyMap,ioStorInvDis.get(0).getSect_code()))); + } + + @Transactional(rollbackFor = Exception.class) + public void cancelTask(SchBaseTask taskObj) { + // 取消任务 + taskService.update(new LambdaUpdateWrapper() + .set(SchBaseTask::getIs_delete, BaseDataEnum.IS_YES_NOT.code("是")) + .set(SchBaseTask::getTask_status, TaskStatus.CANCELED.getCode()) + .set(SchBaseTask::getRemark,"已取消") + .eq(SchBaseTask::getTask_id,taskObj.getTask_id()) + ); + //分配表清除任务 + ioStorInvDisMapper.update(new IOStorInvDis(),new LambdaUpdateWrapper<>(IOStorInvDis.class) + .set(IOStorInvDis::getTask_id,null) + .set(IOStorInvDis::getPoint_code,null) + .set(IOStorInvDis::getIs_issued,0) + .set(IOStorInvDis::getWork_status, IOSEnum.INBILL_DIS_STATUS.code("未生成")) + .eq(IOStorInvDis::getTask_id,taskObj.getTask_id()) + ); + + // 更新任务状态 + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setRemark("已取消"); + taskService.updateById(taskObj); + } +}