From 460e0632d475540bbc56f37a60e1b6eff98ba42c Mon Sep 17 00:00:00 2001 From: zhengxuming Date: Mon, 4 Aug 2025 09:23:47 +0800 Subject: [PATCH] =?UTF-8?q?add:MES=E4=BA=A7=E7=BA=BF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MesToWmsController.java | 3 +- .../dto/mes/MesBackMaterialRequestDto.java | 46 ++ .../dto/mes/MesCallMaterialRequestDto.java | 25 +- .../wms/ext_manage/dto/mes/MesResponse.java | 4 +- .../nl/wms/ext_manage/enums/EXTConstant.java | 5 + .../ext_manage/service/MesToWmsService.java | 3 +- .../ext_manage/service/WmsToMesService.java | 18 + .../service/impl/MesToWmsServiceImpl.java | 399 +++++++++++++++++- .../service/impl/WmsToMesServiceImpl.java | 57 +++ .../controller/PdaIosInController.java | 14 +- .../ios_manage/service/PdaIosInService.java | 9 + .../service/impl/PdaIosInServiceImpl.java | 44 +- .../nl/wms/sch_manage/enums/StatusEnum.java | 2 +- .../service/ISchBasePointService.java | 9 + .../service/impl/SchBasePointServiceImpl.java | 15 +- .../util/tasks/zw/DownEmptyUpFullTask.java | 311 ++++++++++++++ .../service/util/tasks/zw/InBillTask.java | 2 + .../util/tasks/zw/SeparateMaterialTask.java | 246 +++++++++++ .../system_manage/enums/SysParamConstant.java | 5 + .../controller/OutBillController.java | 31 ++ .../dto/MesManualBackMaterialRequestDto.java | 46 ++ .../dto/MesManualCallMaterialRequestDto.java | 45 ++ .../service/impl/InBillServiceImpl.java | 2 + .../service/impl/OutBillServiceImpl.java | 85 ++++ 24 files changed, 1391 insertions(+), 35 deletions(-) create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/dto/mes/MesBackMaterialRequestDto.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/WmsToMesService.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/WmsToMesServiceImpl.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/zw/DownEmptyUpFullTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/zw/SeparateMaterialTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/dto/MesManualBackMaterialRequestDto.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/dto/MesManualCallMaterialRequestDto.java diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/controller/MesToWmsController.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/controller/MesToWmsController.java index 614913a..feed6ef 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/controller/MesToWmsController.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/controller/MesToWmsController.java @@ -3,6 +3,7 @@ package org.nl.wms.ext_manage.controller; import cn.dev33.satoken.annotation.SaIgnore; import lombok.extern.slf4j.Slf4j; import org.nl.common.logging.annotation.Log; +import org.nl.wms.ext_manage.dto.mes.MesBackMaterialRequestDto; import org.nl.wms.ext_manage.dto.mes.MesCallMaterialRequestDto; import org.nl.wms.ext_manage.service.MesToWmsService; import org.springframework.http.HttpStatus; @@ -36,7 +37,7 @@ public class MesToWmsController { @PostMapping("/backMaterial") @SaIgnore @Log("MES请求退料/空桶") - public ResponseEntity backMaterial(@RequestBody @Validated MesCallMaterialRequestDto param) { + public ResponseEntity backMaterial(@RequestBody @Validated MesBackMaterialRequestDto param) { return new ResponseEntity<>(mesToWmsService.backMaterial(param), HttpStatus.OK); } } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/dto/mes/MesBackMaterialRequestDto.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/dto/mes/MesBackMaterialRequestDto.java new file mode 100644 index 0000000..02a1069 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/dto/mes/MesBackMaterialRequestDto.java @@ -0,0 +1,46 @@ +package org.nl.wms.ext_manage.dto.mes; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class MesBackMaterialRequestDto { + @NotBlank(message = "设备号不可为空") + private String device_code; + + @NotBlank(message = "料桶号不可为空") + private String vehicle_code; + + @NotBlank(message = "物料编码不可为空") + private String material_code; + + @NotBlank(message = "批次") + private String pcsn; + + private String qty_unit_name; + + @NotBlank(message = "数量不可为空") + private String qty; + + @NotBlank(message = "供应商编码不可为空") + private String supp_code; + + @NotBlank(message = "供应商名称不可为空") + private String supp_name; + + private String remark; + + @NotBlank(message = "任务号不可为空") + private String task_code; + + @NotBlank(message = "任务类型不可为空") + private String task_type; + + /** + * 是否是人工发起,如果是,则不需要反馈给MES + * + */ + private Boolean isManual; + +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/dto/mes/MesCallMaterialRequestDto.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/dto/mes/MesCallMaterialRequestDto.java index 7fc9d7d..cfc89da 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/dto/mes/MesCallMaterialRequestDto.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/dto/mes/MesCallMaterialRequestDto.java @@ -4,22 +4,22 @@ import lombok.Data; import javax.validation.constraints.NotBlank; @Data public class MesCallMaterialRequestDto { - @NotBlank(message = "设备号不为空") + @NotBlank(message = "设备号不可为空") private String device_code; - @NotBlank(message = "货位号不为空") + @NotBlank(message = "货位号不可为空") private String struct_code; - @NotBlank(message = "物料编码不为空") + @NotBlank(message = "物料编码不可为空") private String material_code; - @NotBlank(message = "料桶号不为空") + @NotBlank(message = "料桶号不可为空") private String vehicle_code; - @NotBlank(message = "组盘标识不为空") + @NotBlank(message = "组盘标识不可为空") private String storagevehicleext_id; - @NotBlank(message = "物料编码不为空") + @NotBlank(message = "物料编码不可为空") private String pcsn; private String qty_unit_name; @@ -28,12 +28,21 @@ public class MesCallMaterialRequestDto { private String remark; - @NotBlank(message = "任务号不为空") + @NotBlank(message = "任务号不可为空") private String task_code; - @NotBlank(message = "任务类型不为空") + + @NotBlank(message = "任务类型不可为空") private String task_type; + @NotBlank(message = "供应商编码不可为空") private String supp_code; + @NotBlank(message = "供应商名称不可为空") private String supp_name; + + /** + * 是否是人工发起,如果是,则不需要反馈给MES + * + */ + private Boolean isManual; } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/dto/mes/MesResponse.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/dto/mes/MesResponse.java index 26b85af..ffceed9 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/dto/mes/MesResponse.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/dto/mes/MesResponse.java @@ -39,7 +39,7 @@ public class MesResponse { public static MesResponse requestOk() { return MesResponse.builder() .message("操作成功!") - .status(0) + .status(200) .build(); } @@ -51,7 +51,7 @@ public class MesResponse { return MesResponse.builder() .message("操作成功!") .data(data) - .status(0) + .status(200) .build(); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/enums/EXTConstant.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/enums/EXTConstant.java index 7ae9132..6ab5e33 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/enums/EXTConstant.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/enums/EXTConstant.java @@ -21,4 +21,9 @@ public class EXTConstant { * ACS下发任务接口地址 */ public final static String SEND_TASK_ACS_API = "api/wms/task"; + + /** + * 回传MES接口地址 + */ + public final static String UPLOAD_MES_API = ""; } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/MesToWmsService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/MesToWmsService.java index efc5276..b1a8d1b 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/MesToWmsService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/MesToWmsService.java @@ -1,5 +1,6 @@ package org.nl.wms.ext_manage.service; +import org.nl.wms.ext_manage.dto.mes.MesBackMaterialRequestDto; import org.nl.wms.ext_manage.dto.mes.MesCallMaterialRequestDto; import org.nl.wms.ext_manage.dto.mes.MesResponse; @@ -24,5 +25,5 @@ public interface MesToWmsService { * @param * @return MesResponse */ - MesResponse backMaterial(MesCallMaterialRequestDto dto); + MesResponse backMaterial(MesBackMaterialRequestDto dto); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/WmsToMesService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/WmsToMesService.java new file mode 100644 index 0000000..23ba55b --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/WmsToMesService.java @@ -0,0 +1,18 @@ +package org.nl.wms.ext_manage.service; + +import com.alibaba.fastjson.JSONObject; + +/** + *

+ * WMS调用MES 服务类 + *

+ * + * @author zhengxuming + * @since 2025年7月31日20:27:58 + */ +public interface WmsToMesService { + + + JSONObject uploadMes(JSONObject whereJson); + +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/MesToWmsServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/MesToWmsServiceImpl.java index 3bfcc71..2a5b22e 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/MesToWmsServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/MesToWmsServiceImpl.java @@ -1,36 +1,60 @@ package org.nl.wms.ext_manage.service.impl; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.SecurityUtils; +import org.nl.wms.basedata_manage.service.IMdMeMaterialbaseService; +import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleinfoService; +import org.nl.wms.basedata_manage.service.ISectattrService; +import org.nl.wms.basedata_manage.service.IStructattrService; +import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase; +import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleinfo; +import org.nl.wms.basedata_manage.service.dao.Sectattr; +import org.nl.wms.basedata_manage.service.dao.Structattr; +import org.nl.wms.ext_manage.dto.mes.MesBackMaterialRequestDto; import org.nl.wms.ext_manage.dto.mes.MesCallMaterialRequestDto; import org.nl.wms.ext_manage.dto.mes.MesResponse; -import org.nl.wms.ext_manage.enums.ResultAcsStatus; -import org.nl.wms.ext_manage.service.AcsToWmsService; import org.nl.wms.ext_manage.service.MesToWmsService; -import org.nl.wms.ext_manage.service.util.AcsResponse; +import org.nl.wms.pda_manage.ios_manage.service.PdaIosInService; +import org.nl.wms.sch_manage.enums.StatusEnum; import org.nl.wms.sch_manage.enums.TaskStatus; import org.nl.wms.sch_manage.service.ISchBasePointService; import org.nl.wms.sch_manage.service.ISchBaseTaskService; import org.nl.wms.sch_manage.service.dao.SchBasePoint; import org.nl.wms.sch_manage.service.dao.SchBaseTask; -import org.nl.wms.sch_manage.service.util.AbstractTask; import org.nl.wms.sch_manage.service.util.TaskFactory; +import org.nl.wms.system_manage.service.dict.ISysDictService; +import org.nl.wms.system_manage.service.dict.dao.Dict; +import org.nl.wms.warehouse_manage.enums.IOSConstant; +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.IOutBillService; +import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDtl; +import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDtlMapper; +import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService; +import org.nl.wms.warehouse_manage.service.dao.GroupPlate; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Arrays; -import java.util.Map; +import javax.annotation.Resource; +import java.util.*; import java.util.concurrent.TimeUnit; +import static org.nl.common.utils.ValidationUtil.assertNotBlankJson; +import static org.nl.wms.warehouse_manage.enums.IOSEnum.GROUP_PLATE_STATUS; + /** *

* MES调用WMS 实现类 @@ -49,6 +73,23 @@ public class MesToWmsServiceImpl implements MesToWmsService { @Autowired private RedissonClient redissonClient; + @Autowired + private IStructattrService structattrService; + + @Autowired + private ISectattrService sectattrService; + + @Autowired + private IMdMeMaterialbaseService materialbaseService; + + @Autowired + private IMdPbGroupplateService iMdPbGroupplateService; + + @Resource + private IOutBillService outBillService; + + @Autowired + private IOStorInvDtlMapper ioStorInvDtlMapper; /* * 任务服务 */ @@ -57,6 +98,27 @@ public class MesToWmsServiceImpl implements MesToWmsService { @Autowired private ISchBasePointService pointService; + @Autowired + private PdaIosInService pdaIosInService; + + @Autowired + private ISectattrService iSectattrService; + + @Autowired + private IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService; + + /** + * 入库服务 + */ + @Autowired + private IInBillService iRawAssistIStorService; + + /** + * 字典服务 + */ + @Autowired + private ISysDictService dictService; + /** * 任务工厂服务 */ @@ -65,18 +127,250 @@ public class MesToWmsServiceImpl implements MesToWmsService { @Override @SneakyThrows + @Transactional(rollbackFor = Exception.class) public MesResponse callMaterial(MesCallMaterialRequestDto dto) { log.info("MES下发设备叫料信息输入参数:-------------------: {}", dto); RLock lock = redissonClient.getLock(dto.getTask_code()); boolean tryLock = lock.tryLock(1, TimeUnit.SECONDS); try { if (tryLock) { - log.info("MES下发设备叫料信息输入参数:--------------------------------------" + MesResponse.requestOk()); - //1、判断当前节点的左右子节点是否存在执行中的任务,如果有则报错 - // - //2、 + String pointCode = dto.getDevice_code(); + SchBasePoint outPoint = pointService.getById(pointCode); + if (null == outPoint) { + throw new BadRequestException("设备【" + pointCode + "】不存在!"); + } + if(!"1".equals(outPoint.getPoint_type())){ + throw new BadRequestException("设备【" + dto.getStruct_code() + "】有误,请传入作业区设备!"); + } + // 出库的仓位 + Structattr outStructAttr = structattrService.getByCode(dto.getStruct_code()); + if (ObjectUtil.isEmpty(outStructAttr)) { + throw new BadRequestException("仓位【" + dto.getStruct_code() + "】不存在!"); + } + + //1、单独上料,2、下空桶上满料 + if("1".equals(dto.getTask_type())){ + log.info("单独上料叫料,请求参数:【{}】", JSONObject.toJSONString(dto)); + //判断点位和仓位是否有正在执行的任务 + List schBaseTaskList = iSchBaseTaskService.list(new LambdaQueryWrapper() + .eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO) + .and(wp -> wp + .eq(SchBaseTask::getPoint_code2, pointCode) + .or() + .eq(SchBaseTask::getPoint_code1, dto.getStruct_code()) + ) + .le(SchBaseTask::getTask_status, TaskStatus.EXECUTING.getCode())); + if(CollectionUtils.isNotEmpty(schBaseTaskList)){ + throw new BadRequestException("存在正在执行的点位,请核对!"); + } + + MdMeMaterialbase materialbase = materialbaseService.getByCode(dto.getMaterial_code(),false); + if (ObjectUtil.isEmpty(materialbase)) { + throw new BadRequestException("物料【" + dto.getMaterial_code() + "】不存在!"); + } + GroupPlate groupPlate = iMdPbGroupplateService.getOne(new LambdaQueryWrapper() + .eq(GroupPlate::getStoragevehicle_code, outStructAttr.getStoragevehicle_code()) + .eq(GroupPlate::getStatus, "01")); + if (ObjectUtil.isEmpty(groupPlate)) { + throw new BadRequestException("托盘[" + outStructAttr.getStoragevehicle_code() + "]组盘信息不存在!"); + } + // 1、创建出库单、明细、分配明细 + JSONObject insertInvObj = new JSONObject(); + JSONArray tableData = new JSONArray(); + JSONObject table = new JSONObject(); + tableData.add(table); + insertInvObj.put("stor_id", outStructAttr.getStor_id()); + insertInvObj.put("stor_code", outStructAttr.getStor_code()); + insertInvObj.put("bill_status", "10"); + insertInvObj.put("total_qty", groupPlate.getQty()); + insertInvObj.put("detail_count", 1); + insertInvObj.put("bill_type", StatusEnum.IOBILL_TYPE_OUT.code("单独上料出库")); + insertInvObj.put("biz_date", DateUtil.format(new Date(), "yyyy-MM-dd")); + insertInvObj.put("tableData", tableData); + table.put("turnout_struct_code", outStructAttr.getStruct_code()); + table.put("turnout_sect_code", outStructAttr.getSect_code()); + table.put("turnout_sect_name", outStructAttr.getSect_name()); + table.put("sect_id", outStructAttr.getSect_id()); + table.put("struct_id", outStructAttr.getStruct_id()); + table.put("group_id", groupPlate.getGroup_id()); + table.put("storagevehicle_code", outStructAttr.getStoragevehicle_code()); + table.put("storagevehicle_type", outStructAttr.getStoragevehicle_type()); + table.put("material_id", materialbase.getMaterial_id()); + table.put("pcsn", groupPlate.getPcsn()); + table.put("qty", groupPlate.getQty()); + table.put("qty_unit_id", groupPlate.getQty_unit_id()); + table.put("qty_unit_name", groupPlate.getQty_unit_name()); + table.put("fronzen_qty", 0); + table.put("status", "01"); + table.put("material_code", materialbase.getMaterial_code()); + table.put("material_name", materialbase.getMaterial_name()); + table.put("material_spec", materialbase.getMaterial_spec()); + String invId = outBillService.insertDtl(insertInvObj); + // 调用手工分配 + JSONObject param = new JSONObject(); + JSONObject row = new JSONObject(); + JSONArray rows = new JSONArray(); + rows.add(row); + param.put("rows", rows); + IOStorInvDtl dtl = ioStorInvDtlMapper.selectOne(new LambdaQueryWrapper() + .eq(IOStorInvDtl::getIostorinv_id, invId)); + param.put("row", dtl); + row.put("storagevehicle_code", outStructAttr.getStoragevehicle_code()); + row.put("pcsn", groupPlate.getPcsn()); + row.put("qty", groupPlate.getQty()); + row.put("qty_unit_name", groupPlate.getQty_unit_name()); + row.put("frozen_qty", groupPlate.getFrozen_qty()); + row.put("struct_id", outStructAttr.getStruct_id()); + row.put("struct_code", outStructAttr.getStruct_code()); + row.put("struct_name", outStructAttr.getStruct_name()); + row.put("sect_id", outStructAttr.getSect_id()); + row.put("sect_code", outStructAttr.getSect_code()); + row.put("sect_name", outStructAttr.getSect_name()); + row.put("material_code", groupPlate.getMaterial_code()); + row.put("material_name", groupPlate.getMaterial_name()); + row.put("edit", true); + outBillService.manualDiv(param); + + // 创建任务 + JSONObject taskParam = new JSONObject(); + taskParam.put("iostorinv_id", invId); + taskParam.put("point_code", dto.getStruct_code()); + taskParam.put("point_code2", pointCode ); + taskParam.put("group_id", groupPlate.getGroup_id() ); + taskParam.put("task_code", dto.getTask_code() ); + if(dto.getIsManual()){ + taskParam.put("create_mode", "手动" ); + } else{ + taskParam.put("create_mode", "自动" ); + } + outBillService.allSetPoint(taskParam); + return MesResponse.requestOk(); + } else if("2".equals(dto.getTask_type())){ + //下空桶上满料 4个点 需要拆成2个任务,组装成一组 + log.info("下空桶上满料叫料,请求参数:【{}】", JSONObject.toJSONString(dto)); + + //点位作业位生产完后,满料状态->空料状态 + pointService.update(new LambdaUpdateWrapper() + .set(SchBasePoint::getPoint_status, "2") + .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) + .set(SchBasePoint::getUpdate_time, DateUtil.now()) + .eq(SchBasePoint::getPoint_code, outPoint.getPoint_code())); + + SchBasePoint queryPoint = new SchBasePoint(); + queryPoint.setPoint_type("2"); + queryPoint.setParent_point_code(outPoint.getPoint_code()); + + //得到作业区下面的两个 + List sonSchBasePointList = pointService.getSonPointList(queryPoint); + if(!(sonSchBasePointList!=null&&sonSchBasePointList.size()==2)){ + throw new BadRequestException("作业位"+ outPoint.getPoint_code()+"的周转位不为2个,请核对!"); + } + + //判断点位和仓位是否有正在执行的任务 + List schBaseTaskList = iSchBaseTaskService.list(new LambdaQueryWrapper() + .eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO) + .and(wp -> wp + .eq(SchBaseTask::getPoint_code1, dto.getStruct_code()) + .or() + .eq(SchBaseTask::getPoint_code2, dto.getDevice_code()) + .or() + .eq(SchBaseTask::getPoint_code3, sonSchBasePointList.get(0).getPoint_code()) + .or() + .eq(SchBaseTask::getPoint_code4, sonSchBasePointList.get(1).getPoint_code()) + ) + .le(SchBaseTask::getTask_status, TaskStatus.EXECUTING.getCode())); + if (CollectionUtils.isNotEmpty(schBaseTaskList)) { + throw new BadRequestException("存在正在执行的点位,请核对!"); + } + + MdMeMaterialbase materialbase = materialbaseService.getByCode(dto.getMaterial_code(),false); + if (ObjectUtil.isEmpty(materialbase)) { + throw new BadRequestException("物料【" + dto.getMaterial_code() + "】不存在!"); + } + GroupPlate groupPlate = iMdPbGroupplateService.getOne(new LambdaQueryWrapper() + .eq(GroupPlate::getStoragevehicle_code, outStructAttr.getStoragevehicle_code()) + .eq(GroupPlate::getStatus, "01")); + if (ObjectUtil.isEmpty(groupPlate)) { + throw new BadRequestException("托盘[" + outStructAttr.getStoragevehicle_code() + "]组盘信息不存在!"); + } + // 1、创建出库单、明细、分配明细 + JSONObject insertInvObj = new JSONObject(); + JSONArray tableData = new JSONArray(); + JSONObject table = new JSONObject(); + tableData.add(table); + insertInvObj.put("stor_id", outStructAttr.getStor_id()); + insertInvObj.put("stor_code", outStructAttr.getStor_code()); + insertInvObj.put("bill_status", "10"); + insertInvObj.put("total_qty", groupPlate.getQty()); + insertInvObj.put("detail_count", 1); + insertInvObj.put("bill_type", StatusEnum.IOBILL_TYPE_OUT.code("下空桶上满料出库")); + insertInvObj.put("biz_date", DateUtil.format(new Date(), "yyyy-MM-dd")); + insertInvObj.put("tableData", tableData); + table.put("turnout_struct_code", outStructAttr.getStruct_code()); + table.put("turnout_sect_code", outStructAttr.getSect_code()); + table.put("turnout_sect_name", outStructAttr.getSect_name()); + table.put("sect_id", outStructAttr.getSect_id()); + table.put("struct_id", outStructAttr.getStruct_id()); + table.put("group_id", groupPlate.getGroup_id()); + table.put("storagevehicle_code", outStructAttr.getStoragevehicle_code()); + table.put("storagevehicle_type", outStructAttr.getStoragevehicle_type()); + table.put("material_id", materialbase.getMaterial_id()); + table.put("pcsn", groupPlate.getPcsn()); + table.put("qty", groupPlate.getQty()); + table.put("qty_unit_id", groupPlate.getQty_unit_id()); + table.put("qty_unit_name", groupPlate.getQty_unit_name()); + table.put("fronzen_qty", 0); + table.put("status", "01"); + table.put("material_code", materialbase.getMaterial_code()); + table.put("material_name", materialbase.getMaterial_name()); + table.put("material_spec", materialbase.getMaterial_spec()); + String invId = outBillService.insertDtl(insertInvObj); + // 调用手工分配 + JSONObject param = new JSONObject(); + JSONObject row = new JSONObject(); + JSONArray rows = new JSONArray(); + rows.add(row); + param.put("rows", rows); + IOStorInvDtl dtl = ioStorInvDtlMapper.selectOne(new LambdaQueryWrapper() + .eq(IOStorInvDtl::getIostorinv_id, invId)); + param.put("row", dtl); + row.put("storagevehicle_code", outStructAttr.getStoragevehicle_code()); + row.put("pcsn", groupPlate.getPcsn()); + row.put("qty", groupPlate.getQty()); + row.put("qty_unit_name", groupPlate.getQty_unit_name()); + row.put("frozen_qty", groupPlate.getFrozen_qty()); + row.put("struct_id", outStructAttr.getStruct_id()); + row.put("struct_code", outStructAttr.getStruct_code()); + row.put("struct_name", outStructAttr.getStruct_name()); + row.put("sect_id", outStructAttr.getSect_id()); + row.put("sect_code", outStructAttr.getSect_code()); + row.put("sect_name", outStructAttr.getSect_name()); + row.put("material_code", groupPlate.getMaterial_code()); + row.put("material_name", groupPlate.getMaterial_name()); + row.put("edit", true); + outBillService.manualDiv(param); + + // 创建任务 + + JSONObject taskParam = new JSONObject(); + taskParam.put("iostorinv_id", invId); + taskParam.put("point_code", dto.getStruct_code()); + taskParam.put("point_code2", sonSchBasePointList.get(0).getPoint_code() ); + taskParam.put("point_code3", dto.getDevice_code() ); + taskParam.put("point_code4", sonSchBasePointList.get(1).getPoint_code() ); + taskParam.put("group_id", groupPlate.getGroup_id() ); + taskParam.put("task_code", dto.getTask_code() ); + if(dto.getIsManual()){ + taskParam.put("create_mode", "手动" ); + } else{ + taskParam.put("create_mode", "自动" ); + } + outBillService.allSetPoint(taskParam); + return MesResponse.requestOk(); + } return MesResponse.requestOk(); } else { throw new BadRequestException("任务标识为:" + dto.getTask_code() + "的任务正在操作中!"); @@ -90,13 +384,34 @@ public class MesToWmsServiceImpl implements MesToWmsService { @Override @SneakyThrows - public MesResponse backMaterial(MesCallMaterialRequestDto dto) { - log.info("MES下发设备叫料信息输入参数:-------------------: {}", dto); + public MesResponse backMaterial(MesBackMaterialRequestDto dto) { + log.info("MES下发设备退料信息输入参数:-------------------: {}", dto); RLock lock = redissonClient.getLock(dto.getTask_code()); boolean tryLock = lock.tryLock(1, TimeUnit.SECONDS); try { if (tryLock) { - log.info("MES下发设备叫料信息输入参数:--------------------------------------" + MesResponse.requestOk()); + log.info("MES下发设备退料信息输入参数:--------------------------------------" + MesResponse.requestOk()); + + //根据料桶号去载具表匹配料桶类型 + MdPbStoragevehicleinfo mdPbStoragevehicleinfo = iMdPbStoragevehicleinfoService.getByCode(dto.getVehicle_code()); + + if(mdPbStoragevehicleinfo == null){ + throw new BadRequestException("未找到载具编码为:" + dto.getVehicle_code() + "的载具!"); + } + + //通过料桶号的料桶类型,匹配确认入库库区 + Dict dict= dictService.getDictByCodeAndValue("storagevehicle_type",mdPbStoragevehicleinfo.getStoragevehicle_type()); + if(dict==null){ + throw new BadRequestException("未找到载具编码为" + dto.getVehicle_code() + "的载具入库库区,请检查字典中是否维护!"); + } + + Sectattr sectattr = sectattrService.findByCode(dict.getPara1()); + //通过 + JSONObject param = new JSONObject(); + param.put("vehicle_code",dto.getVehicle_code()); + param.put("site_code",dto.getDevice_code()); + param.put("sect_id",sectattr.getSect_id()); + pdaIosInService.confirmIn(param); return MesResponse.requestOk(); } else { throw new BadRequestException("任务标识为:" + dto.getTask_code() + "的任务正在操作中!"); @@ -107,4 +422,60 @@ public class MesToWmsServiceImpl implements MesToWmsService { } } } + + /** + * 组织入库插入数据 + * @param whereJson { + * storagevehicle_code:载具编码 + * point_code:点位编码 + * sect_code:库区 + * } + * @return Map + */ + private Map organizeInsertData(JSONObject whereJson) { + // 查询组盘明细 + List plateDaoList = iMdPbGroupplateService.list( + new QueryWrapper().lambda() + .eq(GroupPlate::getStoragevehicle_code, whereJson.getString("vehicle_code")) + .eq(GroupPlate::getStatus, GROUP_PLATE_STATUS.code("组盘")) + ); + if (ObjectUtil.isEmpty(plateDaoList)) { + throw new BadRequestException("当前没有可入库的物料!"); + } + // 总数量 + Double total_qty = plateDaoList.stream() + .map(row -> row.getQty().doubleValue()) + .reduce(Double::sum).orElse(0.0); + + // 查询库区 + Sectattr sectDao = iSectattrService.getById(whereJson.getString("sect_id")); + // 组织主表数据 + Map jsonMst = new HashMap<>(); + jsonMst.put("stor_id", sectDao.getStor_id()); + jsonMst.put("bill_status", IOSEnum.BILL_STATUS.code("生成")); + jsonMst.put("total_qty", total_qty); + jsonMst.put("detail_count", 1); + if(!jsonMst.containsKey("bill_type")) { + jsonMst.put("bill_type", StatusEnum.IOBILL_TYPE_IN.code("来料入库")); + } + jsonMst.put("biz_date", DateUtil.now()); + // 组织明细数据 + ArrayList tableData = new ArrayList<>(); + HashMap dtl = new HashMap<>(); + GroupPlate plateDao = plateDaoList.get(0); + MdMeMaterialbase materDao = materialbaseService.getByCode(plateDao.getMaterial_id(), true); + dtl.put("storagevehicle_code", plateDao.getStoragevehicle_code()); + dtl.put("material_id", materDao.getMaterial_id()); + dtl.put("material_code", materDao.getMaterial_code()); + dtl.put("material_name", materDao.getMaterial_name()); + dtl.put("pcsn", plateDao.getPcsn()); + dtl.put("qty_unit_id", plateDao.getQty_unit_id()); + dtl.put("qty_unit_name", plateDao.getQty_unit_name()); + dtl.put("qty", String.valueOf(total_qty)); + dtl.put("plan_qty", String.valueOf(total_qty)); + // 调用新增 + tableData.add(dtl); + jsonMst.put("tableData",tableData); + return jsonMst; + } } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/WmsToMesServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/WmsToMesServiceImpl.java new file mode 100644 index 0000000..13d88fe --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/WmsToMesServiceImpl.java @@ -0,0 +1,57 @@ +package org.nl.wms.ext_manage.service.impl; + +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; +import org.nl.config.SpringContextHolder; +import org.nl.wms.ext_manage.enums.EXTConstant; +import org.nl.wms.ext_manage.service.WmsToMesService; +import org.nl.wms.ext_manage.service.util.AcsResponse; +import org.nl.wms.sch_manage.service.util.AcsTaskDto; +import org.nl.wms.system_manage.enums.SysParamConstant; +import org.nl.wms.system_manage.service.param.impl.SysParamServiceImpl; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * WMS调用Mes 实现类 + *

+ * + * @author zhengxuming + * @since 2025年7月31日20:28:16 + */ +@Slf4j +@Service +public class WmsToMesServiceImpl implements WmsToMesService { + + @Override + public JSONObject uploadMes(JSONObject whereJson) { + log.info("uploadMes回传接口输入参数为:-------------------" + whereJson.toString()); + JSONObject result = new JSONObject(); + + String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode(SysParamConstant.ERP_URL).getValue(); + url = url + EXTConstant.UPLOAD_MES_API; + + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(whereJson)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + log.info("uploadMes回传接口输出参数为:-------------------" + result.toString()); + + + Integer status = result.getInteger("status"); + if (status != HttpStatus.OK.value()) { + throw new BadRequestException(result.getString("message")); + } + + } catch (Exception e) { + throw new BadRequestException("MES提示错误:" + e.getMessage()); + } + return result; + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/controller/PdaIosInController.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/controller/PdaIosInController.java index e0c76af..8fb1cd7 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/controller/PdaIosInController.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/controller/PdaIosInController.java @@ -47,6 +47,18 @@ public class PdaIosInController { return new ResponseEntity<>(pdaIosInService.groupPlate(whereJson),HttpStatus.OK); } + /** + * 原料入库组盘查询 + * @param whereJson + * @return + */ + @PostMapping("/getPlate") + @Log("查询组盘明细") + public ResponseEntity getPlate(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaIosInService.getPlate(whereJson), HttpStatus.OK); + } + + @PostMapping("/getPlateDtl") @Log("查询明细") public ResponseEntity getPlateDtl(@RequestBody JSONObject whereJson) { @@ -115,7 +127,7 @@ public class PdaIosInController { throw new IllegalArgumentException("请传入参数!"); } for(ZwConfirmInParamDto paramDto : dto.getParamList()){ - if(StringUtils.isBlank(paramDto.getVehicle_code())||StringUtils.isBlank(paramDto.getSite_code())) + if(StringUtils.isBlank(paramDto.getVehicle_code()) || StringUtils.isBlank(paramDto.getSite_code())) throw new IllegalArgumentException("载具且卸货区点位不能为空!"); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/PdaIosInService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/PdaIosInService.java index a441c8f..d9ecf12 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/PdaIosInService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/PdaIosInService.java @@ -40,6 +40,15 @@ public interface PdaIosInService { */ PdaResponse getPlateDtl(JSONObject whereJson); + /** + * 原料入库组盘查询明细 + * @param whereJson { + * storagevehicle_code : 载具编码 + * } + * @return PdaResponse + */ + PdaResponse getPlate(JSONObject whereJson); + /** * 删除明细 * @param whereJson { diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/impl/PdaIosInServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/impl/PdaIosInServiceImpl.java index 929b0a2..e44185e 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/impl/PdaIosInServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda_manage/ios_manage/service/impl/PdaIosInServiceImpl.java @@ -34,10 +34,13 @@ import org.nl.wms.pda_manage.ios_manage.service.PdaIosOutService; import org.nl.wms.pda_manage.util.PdaResponse; import org.nl.wms.sch_manage.enums.StatusEnum; import org.nl.wms.sch_manage.enums.TaskEnum; +import org.nl.wms.sch_manage.enums.TaskStatus; import org.nl.wms.sch_manage.service.ISchBasePointService; import org.nl.wms.sch_manage.service.ISchBaseRegionService; +import org.nl.wms.sch_manage.service.ISchBaseTaskService; import org.nl.wms.sch_manage.service.dao.SchBasePoint; import org.nl.wms.sch_manage.service.dao.SchBaseRegion; +import org.nl.wms.sch_manage.service.dao.SchBaseTask; import org.nl.wms.sch_manage.service.dao.mapper.SchBasePointMapper; import org.nl.wms.sch_manage.service.util.AbstractTask; import org.nl.wms.sch_manage.service.util.tasks.BackInTask; @@ -173,6 +176,9 @@ public class PdaIosInServiceImpl implements PdaIosInService { @Autowired private SysDictMapper sysDictMapper; + @Autowired + private ISchBaseTaskService iSchBaseTaskService; + /** * 区域服务 @@ -237,6 +243,17 @@ public class PdaIosInServiceImpl implements PdaIosInService { return PdaResponse.requestParamOk(mdPbGroupplateMapper.getDtl(whereJson)); } + @Override + public PdaResponse getPlate(JSONObject whereJson) { + //如果未组盘,则报错 + List jsonObjectList = mdPbGroupplateMapper.getDtl(whereJson); + if(CollectionUtils.isEmpty(jsonObjectList)){ + throw new BadRequestException("未找到该载具的组盘信息,请核对!"); + } + + return PdaResponse.requestParamOk(jsonObjectList); + } + @Override @Transactional public PdaResponse deleteDtl(JSONObject whereJson) { @@ -458,10 +475,26 @@ public class PdaIosInServiceImpl implements PdaIosInService { //循环判断每个 如果有问题,则抛出异常 String lastSchBasePoint = null; - Integer priority = 0 ; + Integer taskGroupSeq = 0 ; + String taskGroupId = IdUtil.getStringId(); List jsonObjectList = new ArrayList<>(); for (ZwConfirmInParamDto paramDto : dto.getParamList()) { - priority++; + + //判断点位和仓位是否有正在执行的任务 + List schBaseTaskList = iSchBaseTaskService.list(new LambdaQueryWrapper() + .eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO) + .and(wp -> wp + .eq(SchBaseTask::getPoint_code2, paramDto.getSite_code()) + .or() + .eq(SchBaseTask::getPoint_code3, paramDto.getSite_code()) + ) + .le(SchBaseTask::getTask_status, TaskStatus.EXECUTING.getCode())); + + if(CollectionUtils.isNotEmpty(schBaseTaskList)){ + throw new BadRequestException("存在正在执行任务的点位"+paramDto.getSite_code()); + } + + taskGroupSeq++; //当前点位 String schBasePointString = lastSchBasePoint; JSONObject whereJson = new JSONObject(); @@ -529,7 +562,10 @@ public class PdaIosInServiceImpl implements PdaIosInService { whereJson.put("sch_base_point", schBasePointString); whereJson.put("bill_type",StatusEnum.IOBILL_TYPE_IN.code("来料入库")); - whereJson.put("priority",priority); + whereJson.put("priority","1"); + + whereJson.put("task_group_seq",taskGroupSeq); + whereJson.put("task_group_id",taskGroupId); jsonObjectList.add(whereJson); //下一个的托盘放置点为本次的起点 @@ -882,6 +918,8 @@ public class PdaIosInServiceImpl implements PdaIosInService { jsonMst.put("point_code2", whereJson.getString("sch_base_point")); jsonMst.put("point_code3", whereJson.getString("point_code")); jsonMst.put("priority", whereJson.getString("priority")); + jsonMst.put("task_group_seq", whereJson.getString("task_group_seq")); + jsonMst.put("task_group_id", whereJson.getString("task_group_id")); jsonMst.put("vehicle_code", whereJson.getString("vehicle_code")); // 组织明细数据 IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne( diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/enums/StatusEnum.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/enums/StatusEnum.java index 9db35b0..33074d7 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/enums/StatusEnum.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/enums/StatusEnum.java @@ -32,7 +32,7 @@ public enum StatusEnum { IOBILL_TYPE_OUT(ForkMap.of("销售出库", "20", "outStorageTask", "生产出库", "21", "outStorageTask", "调拨出库", "22", "outStorageTask", "拣选出库", "23", "conveyorOutStorageTask", "盘点出库", "24", "outStorageTask", "出库拣选", "25", "toPickPlatformTask", "退货出库", "26", "outStorageTask", "托盘出库", "40", "outStorageTask", "二楼CTU出库", "81", "inStorageTask", "二楼出库AGV搬运", - "82", "inStorageTask", "二楼空架AGV搬运", "83", "inStorageTask")), + "82", "inStorageTask", "二楼空架AGV搬运", "83", "inStorageTask", "单独上料出库", "1013", "inStorageTask", "下空桶上满料出库", "1014", "inStorageTask")), IOBILL_TYPE_MOVE(ForkMap.of("移库", "50", "moveStorageTask", "异常位移库", "51", "moveStorageTask")), diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java index 76f4bd6..9c807f9 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java @@ -69,6 +69,15 @@ public interface ISchBasePointService extends IService { */ List getPointList(SchBasePoint region); + /** + * 获取子点位 + * + * @param parentPoint 父节点 + * @return List + */ + List getSonPointList(SchBasePoint parentPoint); + + /** * 解锁/上锁 * diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java index 12e3f76..b9aceec 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java @@ -31,10 +31,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -194,6 +191,16 @@ public class SchBasePointServiceImpl extends ServiceImpl getSonPointList(SchBasePoint parentPoint) { + return pointMapper.selectList(new LambdaQueryWrapper() + .like(SchBasePoint::getParent_point_code, parentPoint.getParent_point_code()) + //点位类型,根据传入的值是否为空增加判断 + .eq(StringUtils.isNotBlank(parentPoint.getPoint_type()), SchBasePoint::getPoint_type, parentPoint.getPoint_type()) + .eq(SchBasePoint::getIs_has_workder, true) + .orderByAsc(SchBasePoint::getPoint_code)); + } + @Override @Transactional(rollbackFor = Exception.class) public void changeLock(JSONObject points) { diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/zw/DownEmptyUpFullTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/zw/DownEmptyUpFullTask.java new file mode 100644 index 0000000..899d8e1 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/zw/DownEmptyUpFullTask.java @@ -0,0 +1,311 @@ +package org.nl.wms.sch_manage.service.util.tasks.zw; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +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.basedata_manage.service.IStructattrService; +import org.nl.wms.basedata_manage.service.dao.Structattr; +import org.nl.wms.ext_manage.service.WmsToMesService; +import org.nl.wms.sch_manage.enums.TaskStatus; +import org.nl.wms.sch_manage.service.ISchBasePointService; +import org.nl.wms.sch_manage.service.ISchBaseTaskService; +import org.nl.wms.sch_manage.service.dao.SchBasePoint; +import org.nl.wms.sch_manage.service.dao.SchBaseTask; +import org.nl.wms.sch_manage.service.util.AbstractTask; +import org.nl.wms.sch_manage.service.util.AcsTaskDto; +import org.nl.wms.sch_manage.service.util.TaskType; +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.nl.wms.warehouse_manage.service.IMdPbGroupplateService; +import org.nl.wms.warehouse_manage.service.dao.GroupPlate; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.List; + +; + +/** + * @Author: zhengxuming + * @Description: 下空桶上满料 + * @Date: 2025年7月31日16:07:59 + */ +@Component(value = "DownEmptyUpFullTask") +@TaskType("DownEmptyUpFullTask") +public class DownEmptyUpFullTask extends AbstractTask { + + /** + * 任务服务类 + */ + @Resource + private ISchBaseTaskService taskService; + + + @Resource + private IInBillService rawAssistIStorService; + + + @Resource + private IOStorInvDisMapper ioStorInvDisMapper; + + @Resource + private IMdPbGroupplateService iMdPbGroupplateService; + + @Resource + private ISchBasePointService pointService; + + @Resource + private WmsToMesService wmsToMesService; + + + + /** + * 仓位服务 + */ + @Resource + private IStructattrService iStructattrService; + + + @Override + public String create(JSONObject json) { + SchBaseTask task = new SchBaseTask(); + task.setTask_id(IdUtil.getStringId()); + task.setTask_code(json.getString("task_code")); + task.setTask_status(TaskStatus.CREATE.getCode()); + task.setConfig_code(json.getString("task_type")); + task.setPoint_code1(json.getString("point_code1")); + task.setPoint_code2(json.getString("point_code2")); + task.setPoint_code3(json.getString("point_code3")); + task.setPoint_code4(json.getString("point_code4")); + task.setVehicle_code(json.getString("vehicle_code")); + task.setVehicle_code2(json.getString("vehicle_code2")); + task.setTask_group_id(json.getString("task_group_id")); + task.setTask_group_seq(json.getBigDecimal("task_group_seq")); + task.setGroup_id(json.getString("group_id")); + task.setRequest_param(json.toString()); + task.setPriority("1"); + task.setCreate_id(SecurityUtils.getCurrentUserId()); + task.setCreate_name(SecurityUtils.getCurrentNickName()); + task.setCreate_time(DateUtil.now()); + task.setCreate_mode(json.getString("create_mode")); + 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()); + acsTaskDto.setStart_device_code2(taskDao.getPoint_code3()); + acsTaskDto.setNext_device_code2(taskDao.getPoint_code4()); + 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 + public void forceFinish(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.finishTask(taskObj); + } + + @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); + } + + @Override + public void backMes(String task_code) { + + } + + + @Transactional(rollbackFor = Exception.class) + public void finishTask(SchBaseTask taskObj) { + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("已完成"); + taskService.updateById(taskObj); + + //如果是序列1 + if(taskObj.getTask_group_seq().compareTo(new BigDecimal(1))==0){ + //点位2 + pointService.update(new LambdaUpdateWrapper() + .set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code()) + .set(SchBasePoint::getPoint_status, "3") + .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) + .set(SchBasePoint::getUpdate_time, DateUtil.now()) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2())); + //点位3 + pointService.update(new LambdaUpdateWrapper() + .set(SchBasePoint::getVehicle_code, null) + .set(SchBasePoint::getPoint_status, "1") + .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) + .set(SchBasePoint::getUpdate_time, DateUtil.now()) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code3())); + //点位4 + pointService.update(new LambdaUpdateWrapper() + .set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code2()) + .set(SchBasePoint::getPoint_status, "2") + .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) + .set(SchBasePoint::getUpdate_time, DateUtil.now()) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code4())); + + } + //如果是序列2 + else{ + //点位2 + pointService.update(new LambdaUpdateWrapper() + .set(SchBasePoint::getVehicle_code, null) + .set(SchBasePoint::getPoint_status, "1") + .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) + .set(SchBasePoint::getUpdate_time, DateUtil.now()) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1())); + //点位3 + pointService.update(new LambdaUpdateWrapper() + .set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code()) + .set(SchBasePoint::getPoint_status, "3") + .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) + .set(SchBasePoint::getUpdate_time, DateUtil.now()) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2())); + //点位4 + pointService.update(new LambdaUpdateWrapper() + .set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code2()) + .set(SchBasePoint::getPoint_status, "1") + .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) + .set(SchBasePoint::getUpdate_time, DateUtil.now()) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code3())); + + //点位1 + iStructattrService.update(new LambdaUpdateWrapper() + .set(Structattr::getStoragevehicle_code, taskObj.getVehicle_code2()) + .set(Structattr::getOccupancy_state, "2") + .set(Structattr::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(Structattr::getUpdate_name, SecurityUtils.getCurrentNickName()) + .set(Structattr::getUpdate_time, DateUtil.now()) + .eq(Structattr::getStruct_code, taskObj.getPoint_code4())); + + rawAssistIStorService.taskFinish(taskObj); + + //反馈到MES系统 + if("自动".equals(taskObj.getCreate_mode())){ + JSONObject jsonObject=new JSONObject(); + jsonObject.put("status","200"); + jsonObject.put("message","成功"); + wmsToMesService.uploadMes(jsonObject); + } + } + } + + @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()) + ); + + + List ioStorInvDisList = ioStorInvDisMapper.selectList(new LambdaUpdateWrapper<>(IOStorInvDis.class) + .eq(IOStorInvDis::getTask_id, taskObj.getTask_id())); + + for(IOStorInvDis ioStorInvDis:ioStorInvDisList){ + //库存表解锁 lock_type inv_type inv_id inv_code + //解锁库位 + JSONObject finish_map = new JSONObject(); + finish_map.put("struct_code", ioStorInvDis.getStruct_code()); + finish_map.put("inv_type", null); + finish_map.put("inv_id", null); + finish_map.put("inv_code", null); + + //解绑库位 + iStructattrService.updateStatusByCode("2", finish_map); + + + //更新组盘表 status 20->10 + iMdPbGroupplateService.update(new LambdaUpdateWrapper<>(GroupPlate.class) + .set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("组盘")) + .eq(GroupPlate::getStoragevehicle_code,ioStorInvDis.getStoragevehicle_code())); + } + + //分配表清除任务 + 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); + + //反馈到MES系统 + if("自动".equals(taskObj.getCreate_mode())){ + JSONObject jsonObject=new JSONObject(); + jsonObject.put("status","400"); + jsonObject.put("message","任务被取消"); + wmsToMesService.uploadMes(jsonObject); + } + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/zw/InBillTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/zw/InBillTask.java index 048dfbf..77292b0 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/zw/InBillTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/zw/InBillTask.java @@ -85,6 +85,8 @@ public class InBillTask extends AbstractTask { task.setVehicle_code(json.getString("vehicle_code")); task.setVehicle_code2(json.getString("vehicle_code2")); task.setGroup_id(json.getString("group_id")); + task.setTask_group_id(json.getString("task_group_id")); + task.setTask_group_seq(json.getBigDecimal("task_group_seq")); task.setRequest_param(json.toString()); task.setPriority(json.getString("priority")); task.setCreate_id(SecurityUtils.getCurrentUserId()); diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/zw/SeparateMaterialTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/zw/SeparateMaterialTask.java new file mode 100644 index 0000000..89cc660 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/zw/SeparateMaterialTask.java @@ -0,0 +1,246 @@ +package org.nl.wms.sch_manage.service.util.tasks.zw; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +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.basedata_manage.service.IStructattrService; +import org.nl.wms.ext_manage.service.WmsToMesService; +import org.nl.wms.sch_manage.enums.TaskStatus; +import org.nl.wms.sch_manage.service.ISchBasePointService; +import org.nl.wms.sch_manage.service.ISchBaseTaskService; +import org.nl.wms.sch_manage.service.dao.SchBasePoint; +import org.nl.wms.sch_manage.service.dao.SchBaseTask; +import org.nl.wms.sch_manage.service.util.AbstractTask; +import org.nl.wms.sch_manage.service.util.AcsTaskDto; +import org.nl.wms.sch_manage.service.util.TaskType; +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.nl.wms.warehouse_manage.service.IMdPbGroupplateService; +import org.nl.wms.warehouse_manage.service.dao.GroupPlate; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +; + +/** + * @Author: zhengxuming + * @Description: 单独上料出库 + * @Date: 2025年7月30日17:55:11 + */ +@Component(value = "SeparateMaterial") +@TaskType("SeparateMaterial") +public class SeparateMaterialTask extends AbstractTask { + + /** + * 任务服务类 + */ + @Resource + private ISchBaseTaskService taskService; + + + @Resource + private IInBillService rawAssistIStorService; + + + @Resource + private IOStorInvDisMapper ioStorInvDisMapper; + + @Resource + private IMdPbGroupplateService iMdPbGroupplateService; + + @Resource + private ISchBasePointService pointService; + + @Resource + private WmsToMesService wmsToMesService; + + + /** + * 仓位服务 + */ + @Resource + private IStructattrService iStructattrService; + + + @Override + public String create(JSONObject json) { + SchBaseTask task = new SchBaseTask(); + task.setTask_id(IdUtil.getStringId()); + task.setTask_code(json.getString("task_code")); + task.setTask_status(TaskStatus.CREATE.getCode()); + task.setConfig_code(json.getString("task_type")); + task.setPoint_code1(json.getString("point_code1")); + task.setPoint_code2(json.getString("point_code2")); + task.setVehicle_code(json.getString("vehicle_code")); + task.setGroup_id(json.getString("group_id")); + task.setCreate_mode(json.getString("create_mode")); + task.setRequest_param(json.toString()); + task.setPriority("1"); + 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()); + acsTaskDto.setStart_device_code2(taskDao.getPoint_code3()); + acsTaskDto.setNext_device_code2(taskDao.getPoint_code4()); + 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 + public void forceFinish(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.finishTask(taskObj); + } + + @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); + } + + @Override + public void backMes(String task_code) { + + } + + + @Transactional(rollbackFor = Exception.class) + public void finishTask(SchBaseTask taskObj) { + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("已完成"); + taskService.updateById(taskObj); + + //更改点位的托盘信息,空托盘的点位 2为空托盘放置点位 + pointService.update(new LambdaUpdateWrapper() + .set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code()) + .set(SchBasePoint::getPoint_status, "2") + .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) + .set(SchBasePoint::getUpdate_time, DateUtil.now()) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2())); + + rawAssistIStorService.taskFinish(taskObj); + + //反馈到MES系统 + if("自动".equals(taskObj.getCreate_mode())){ + JSONObject jsonObject=new JSONObject(); + jsonObject.put("status","200"); + jsonObject.put("message","成功"); + wmsToMesService.uploadMes(jsonObject); + } + } + + @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()) + ); + + + List ioStorInvDisList = ioStorInvDisMapper.selectList(new LambdaUpdateWrapper<>(IOStorInvDis.class) + .eq(IOStorInvDis::getTask_id, taskObj.getTask_id())); + + for(IOStorInvDis ioStorInvDis:ioStorInvDisList){ + //库存表解锁 lock_type inv_type inv_id inv_code + //解锁库位 + JSONObject finish_map = new JSONObject(); + finish_map.put("struct_code", ioStorInvDis.getStruct_code()); + finish_map.put("inv_type", null); + finish_map.put("inv_id", null); + finish_map.put("inv_code", null); + + //解绑库位 + iStructattrService.updateStatusByCode("2", finish_map); + + + //更新组盘表 status 20->10 + iMdPbGroupplateService.update(new LambdaUpdateWrapper<>(GroupPlate.class) + .set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("组盘")) + .eq(GroupPlate::getStoragevehicle_code,ioStorInvDis.getStoragevehicle_code())); + } + + //分配表清除任务 + 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); + + //反馈到MES系统 + if("自动".equals(taskObj.getCreate_mode())){ + JSONObject jsonObject=new JSONObject(); + jsonObject.put("status","400"); + jsonObject.put("message","任务被取消"); + wmsToMesService.uploadMes(jsonObject); + } + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/system_manage/enums/SysParamConstant.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/system_manage/enums/SysParamConstant.java index f1987c6..7476008 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/system_manage/enums/SysParamConstant.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/system_manage/enums/SysParamConstant.java @@ -22,4 +22,9 @@ public class SysParamConstant { */ public final static String ERP_URL = "erp_url"; + /** + * MES系统IP + */ + public final static String MES_URL = "mes_url"; + } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/controller/OutBillController.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/controller/OutBillController.java index 0e7435c..9936377 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/controller/OutBillController.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/controller/OutBillController.java @@ -5,9 +5,16 @@ import lombok.extern.slf4j.Slf4j; import org.nl.common.base.TableDataInfo; import org.nl.common.domain.query.PageQuery; import org.nl.common.logging.annotation.Log; +import org.nl.wms.ext_manage.dto.mes.MesBackMaterialRequestDto; +import org.nl.wms.ext_manage.dto.mes.MesCallMaterialRequestDto; +import org.nl.wms.ext_manage.service.MesToWmsService; import org.nl.wms.warehouse_manage.inAndOut.service.IOutBillService; +import org.nl.wms.warehouse_manage.inAndOut.service.dto.MesManualBackMaterialRequestDto; +import org.nl.wms.warehouse_manage.inAndOut.service.dto.MesManualCallMaterialRequestDto; +import org.springframework.beans.BeanUtils; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -25,6 +32,9 @@ public class OutBillController { @Resource private IOutBillService iOutBillService; + @Resource + private MesToWmsService mesToWmsService; + @GetMapping @Log("查询出库单") public ResponseEntity query(@RequestParam Map whereJson, PageQuery page, String[] stor_id, String[] bill_status, String[] bill_type) { @@ -138,4 +148,25 @@ public class OutBillController { return new ResponseEntity<>(iOutBillService.getOutBillTask(whereJson), HttpStatus.OK); } + + + @PostMapping("/callMaterial") + @Log("人工叫料") + public ResponseEntity callMaterial(@RequestBody @Validated MesManualCallMaterialRequestDto manualDto) { + MesCallMaterialRequestDto dto = new MesCallMaterialRequestDto(); + BeanUtils.copyProperties(manualDto, dto); + dto.setIsManual(true); + return new ResponseEntity<>(mesToWmsService.callMaterial(dto), HttpStatus.OK); + } + + + @PostMapping("/backMaterial") + @Log("人工退料") + public ResponseEntity backMaterial(@RequestBody @Validated MesManualBackMaterialRequestDto manualDto) { + MesBackMaterialRequestDto dto = new MesBackMaterialRequestDto(); + BeanUtils.copyProperties(manualDto, dto); + dto.setIsManual(true); + return new ResponseEntity<>(mesToWmsService.backMaterial(dto), HttpStatus.OK); + } + } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/dto/MesManualBackMaterialRequestDto.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/dto/MesManualBackMaterialRequestDto.java new file mode 100644 index 0000000..9084011 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/dto/MesManualBackMaterialRequestDto.java @@ -0,0 +1,46 @@ +package org.nl.wms.warehouse_manage.inAndOut.service.dto; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class MesManualBackMaterialRequestDto { + @NotBlank(message = "设备号不可为空") + private String device_code; + + @NotBlank(message = "料桶号不可为空") + private String vehicle_code; + + + private String material_code; + + + private String pcsn; + + private String qty_unit_name; + + + private String qty; + + + private String supp_code; + + + private String supp_name; + + private String remark; + + @NotBlank(message = "任务号不可为空") + private String task_code; + + @NotBlank(message = "任务类型不可为空") + private String task_type; + + /** + * 是否是人工发起,如果是,则不需要反馈给MES + * + */ + private Boolean isManual; + +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/dto/MesManualCallMaterialRequestDto.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/dto/MesManualCallMaterialRequestDto.java new file mode 100644 index 0000000..f0957a5 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/dto/MesManualCallMaterialRequestDto.java @@ -0,0 +1,45 @@ +package org.nl.wms.warehouse_manage.inAndOut.service.dto; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class MesManualCallMaterialRequestDto { + @NotBlank(message = "设备号不可为空") + private String device_code; + + @NotBlank(message = "货位号不可为空") + private String struct_code; + + @NotBlank(message = "物料编码不可为空") + private String material_code; + + private String vehicle_code; + + private String storagevehicleext_id; + + private String pcsn; + + private String qty_unit_name; + + private String qty; + + private String remark; + + @NotBlank(message = "任务号不可为空") + private String task_code; + + @NotBlank(message = "任务类型不可为空") + private String task_type; + + private String supp_code; + + private String supp_name; + + /** + * 是否是人工发起,如果是,则不需要反馈给MES + * + */ + private Boolean isManual; +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java index 2c28b43..3727a73 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java @@ -779,6 +779,8 @@ public class InBillServiceImpl extends ServiceImpl i task.put("config_code", IOSConstant.IN_BILL_TASK); task.put("group_id", groupPlate.getGroup_id()); task.put("priority",whereJson.get("priority")); + task.put("task_group_seq",whereJson.get("task_group_seq")); + task.put("task_group_id",whereJson.get("task_group_id")); task.put("task_code", CodeUtil.getNewCode("TASK_CODE")); task.put("point_code1",ioStorInvDis.getStruct_code()); task.put("point_code2", whereJson.get("point_code2")); diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/OutBillServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/OutBillServiceImpl.java index 8c41756..5c58dad 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/OutBillServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/OutBillServiceImpl.java @@ -27,6 +27,7 @@ import org.nl.wms.basedata_manage.service.dto.MdPbStoragevehicleextDto; import org.nl.wms.basedata_manage.service.dto.StrategyStructMaterialVO; import org.nl.wms.basedata_manage.service.dto.StrategyStructParam; import org.nl.wms.basedata_manage.service.dto.StructattrChangeDto; +import org.nl.wms.sch_manage.enums.StatusEnum; import org.nl.wms.sch_manage.enums.TaskStatus; import org.nl.wms.sch_manage.service.ISchBasePointService; import org.nl.wms.sch_manage.service.ISchBaseTaskService; @@ -35,6 +36,8 @@ import org.nl.wms.sch_manage.service.dao.SchBaseTask; import org.nl.wms.sch_manage.service.dao.mapper.SchBasePointMapper; import org.nl.wms.sch_manage.service.util.tasks.StOutTask; import org.nl.wms.sch_manage.service.util.tasks.jb.JbUpAgvTask; +import org.nl.wms.sch_manage.service.util.tasks.zw.DownEmptyUpFullTask; +import org.nl.wms.sch_manage.service.util.tasks.zw.SeparateMaterialTask; import org.nl.wms.warehouse_manage.enums.IOSConstant; import org.nl.wms.warehouse_manage.enums.IOSEnum; import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService; @@ -102,6 +105,12 @@ public class OutBillServiceImpl extends ServiceImpl i @Autowired private JbUpAgvTask jbUpAgvTask; + @Autowired + private SeparateMaterialTask separateMaterialTask; + + @Autowired + private DownEmptyUpFullTask downEmptyUpFullTask; + @Override public IPage pageQuery(Map whereJson, PageQuery page, String[] stor_id, String[] bill_status, String[] bill_type) { @@ -990,6 +999,82 @@ public class OutBillServiceImpl extends ServiceImpl i outPoint.setIng_task_code(task_id); } pointService.updateBatchById(Arrays.asList(inPoint, outPoint)); + } else if (StatusEnum.IOBILL_TYPE_OUT.code("单独上料出库").equals(ioStorInv.getBill_type())) { + // 单独上料出库 + SchBasePoint rkPoint = pointService.getById(whereJson.getString("point_code2")); + if (ObjectUtil.isEmpty(rkPoint)) { + throw new BadRequestException("点位不存在"); + } + JSONObject task_form = new JSONObject(); + task_form.put("task_type", "SeparateMaterial"); + task_form.put("order_id", whereJson.getString("order_id")); + task_form.put("task_code", whereJson.getString("task_code")); + task_form.put("point_code1", ioStorInvDis.getStruct_code()); + task_form.put("point_code2", rkPoint.getPoint_code()); + task_form.put("vehicle_code", ioStorInvDis.getStoragevehicle_code()); + task_form.put("group_id", whereJson.getString("group_id")); + task_form.put("create_mode", whereJson.getString("create_mode")); + task_id = separateMaterialTask.create(task_form); + rkPoint.setIng_task_code(task_id); + rkPoint.setPoint_status("3"); + pointService.updateById(rkPoint); + } else if (StatusEnum.IOBILL_TYPE_OUT.code("下空桶上满料出库").equals(ioStorInv.getBill_type())) { + //需要建设2个任务,2个任务组成一个组,增加序号 + //第三个点位,获取载具号用 + String taskGroupId = IdUtil.getStringId(); + + SchBasePoint point2 = pointService.getById(whereJson.getString("point_code2")); + SchBasePoint point3 = pointService.getById(whereJson.getString("point_code3")); + SchBasePoint point4 = pointService.getById(whereJson.getString("point_code4")); + + if (ObjectUtil.isEmpty(point3)) { + throw new BadRequestException("点位不存在"); + } + JSONObject task_form = new JSONObject(); + task_form.put("task_type", "DownEmptyUpFullTask"); + task_form.put("order_id", whereJson.getString("order_id")); + task_form.put("task_code", whereJson.getString("task_code")); + task_form.put("point_code1", whereJson.getString("point_code1")); + task_form.put("point_code2", whereJson.getString("point_code2")); + task_form.put("point_code3", whereJson.getString("point_code3")); + task_form.put("point_code4", whereJson.getString("point_code4")); + task_form.put("vehicle_code", ioStorInvDis.getStoragevehicle_code()); + //查看第三个点位的托盘信息 + task_form.put("vehicle_code2",point3.getVehicle_code()); + task_form.put("group_id", whereJson.getString("group_id")); + task_form.put("task_group_id", taskGroupId); + task_form.put("task_group_seq", "1"); + task_form.put("create_mode", whereJson.getString("create_mode")); + task_id = downEmptyUpFullTask.create(task_form); + + JSONObject task_form2 = new JSONObject(); + task_form2.put("task_type", "DownEmptyUpFullTask"); + task_form2.put("order_id", whereJson.getString("order_id")); + task_form2.put("task_code", whereJson.getString("task_code")); + task_form2.put("point_code1", whereJson.getString("point_code2")); + task_form2.put("point_code2", whereJson.getString("point_code3")); + task_form2.put("point_code3", whereJson.getString("point_code4")); + task_form2.put("point_code4", whereJson.getString("point_code1")); + task_form.put("vehicle_code", ioStorInvDis.getStoragevehicle_code()); + task_form.put("vehicle_code2",point3.getVehicle_code()); + task_form2.put("group_id", whereJson.getString("group_id")); + task_form2.put("task_group_id", taskGroupId); + task_form2.put("task_group_seq", "2"); + task_form.put("create_mode", whereJson.getString("create_mode")); + downEmptyUpFullTask.create(task_form2); + + point2.setIng_task_code(task_id); + point2.setPoint_status("3"); + pointService.updateById(point2); + + point3.setIng_task_code(task_id); + point3.setPoint_status("1"); + pointService.updateById(point3); + + point4.setIng_task_code(task_id); + point4.setPoint_status("2"); + pointService.updateById(point4); + } else { //创建任务 JSONObject task_form = new JSONObject();