diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/config/BusinessUtils.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/config/BusinessUtils.java new file mode 100644 index 0000000..295cde0 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/config/BusinessUtils.java @@ -0,0 +1,10 @@ +package org.nl.config; + +/** + * + * @author: lyd + * @date: 2026/1/12 + */ +public class BusinessUtils { + +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IMdMeMaterialbaseService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IMdMeMaterialbaseService.java index 00bd787..e30262f 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IMdMeMaterialbaseService.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IMdMeMaterialbaseService.java @@ -1,5 +1,6 @@ package org.nl.wms.basedata_manage.service; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IMdPdGroupbucketService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IMdPdGroupbucketService.java index a629c2b..15c9fa7 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IMdPdGroupbucketService.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IMdPdGroupbucketService.java @@ -59,4 +59,10 @@ public interface IMdPdGroupbucketService extends IService { * @param ids 标识集合 */ void delete(Set ids); + /** + * 获取料桶信息 + * @param param:material_id, pcsn + * @return JSONObject + */ + List getBucketGroupInfo(JSONObject param); } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPdGroupbucketMapper.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPdGroupbucketMapper.java index 920a085..45aafc9 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPdGroupbucketMapper.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPdGroupbucketMapper.java @@ -32,4 +32,6 @@ public interface MdPdGroupbucketMapper extends BaseMapper { * @return IPage */ IPage queryAllByPage(Page page, @Param("param") Map whereJson); + + List getBucketGroupInfo(JSONObject param); } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPdGroupbucketMapper.xml b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPdGroupbucketMapper.xml index d7bfb52..9c99670 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPdGroupbucketMapper.xml +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPdGroupbucketMapper.xml @@ -33,7 +33,7 @@ FROM md_pd_groupbucket late INNER JOIN md_me_materialbase mater ON mater.material_id = late.material_id - + where 1 = 1 AND @@ -50,7 +50,35 @@ AND late.bucket_code LIKE #{param.bucket_code} - - ORDER BY late.create_time Desc + ORDER BY late.create_time Desc + + + + diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/MdPdGroupbucketServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/MdPdGroupbucketServiceImpl.java index 70528cc..e3a4473 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/MdPdGroupbucketServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/MdPdGroupbucketServiceImpl.java @@ -18,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; @@ -80,4 +81,10 @@ public class MdPdGroupbucketServiceImpl extends ServiceImpl ids) { this.baseMapper.deleteBatchIds(ids); } + + @Override + @Transactional + public List getBucketGroupInfo(JSONObject param) { + return this.baseMapper.getBucketGroupInfo(param); + } } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/controller/PdaProductionController.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/controller/PdaProductionController.java index 8741376..e88d32b 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/controller/PdaProductionController.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/controller/PdaProductionController.java @@ -111,4 +111,35 @@ public class PdaProductionController { public ResponseEntity getVehicleInfo(@RequestBody JSONObject whereJson) { return new ResponseEntity<>(pdaProductionService.getVehicleInfo(whereJson), HttpStatus.OK); } + @PostMapping("/getBucketGroupInfo") + @Log("料桶叫料-获取物料库存信息") + @SaIgnore + public ResponseEntity getBucketGroupInfo(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaProductionService.getBucketGroupInfo(whereJson), HttpStatus.OK); + } + @PostMapping("/confirmCallBucketMaterial") + @Log("料桶叫料-确认叫料") + @SaIgnore + public ResponseEntity confirmCallBucketMaterial(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaProductionService.confirmCallBucketMaterial(whereJson), HttpStatus.OK); + } + + @PostMapping("/getTaskBucketGroupInfo") + @Log("料桶称重-获取物料库存信息") + @SaIgnore + public ResponseEntity getTaskBucketGroupInfo(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaProductionService.getTaskBucketGroupInfo(whereJson), HttpStatus.OK); + } + @PostMapping("/manualInbound") + @Log("料桶称重-入站") + @SaIgnore + public ResponseEntity manualInbound(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaProductionService.manualInbound(whereJson), HttpStatus.OK); + } + @PostMapping("/manualOutbound") + @Log("料桶称重-出站") + @SaIgnore + public ResponseEntity manualOutbound(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaProductionService.manualOutbound(whereJson), HttpStatus.OK); + } } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaBuildParamService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaBuildParamService.java index a75c3c7..5b54b79 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaBuildParamService.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaBuildParamService.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import org.nl.wms.basedata_manage.service.dao.Sectattr; import org.nl.wms.basedata_manage.service.dao.Structattr; import org.nl.wms.sch_manage.service.dao.SchBasePoint; +import org.nl.wms.warehouse_management.service.dto.IOStorInvDtlDto; import java.util.Map; @@ -48,13 +49,14 @@ public interface PdaBuildParamService { /** * 构建出库单参数 - * @param param - * @param sectattr + * @param param 参数 + * @param storId 仓库id + * @param flag 是否过滤物料 * @return */ - JSONObject doBuildOutInvObj(JSONObject param, Sectattr sectattr); + JSONObject doBuildOutInvObj(JSONObject param, String storId, Boolean flag); - JSONObject buildManuaOutDivData(JSONObject param, Sectattr outStructAttr, String invId); + JSONObject buildManuaOutDivData(JSONObject param, IOStorInvDtlDto ioStorInvDtlDto); JSONObject buildOutAllSetData(SchBasePoint endPoint, String invId); @@ -78,4 +80,6 @@ public interface PdaBuildParamService { * @param bill_type 单据类型 */ void createMove(JSONObject param, String bill_type); + + JSONObject buildManuaOutBuckDivData(JSONObject param, IOStorInvDtlDto ioStorInvDtlDto); } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaProductionService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaProductionService.java index 4891cf5..fe4ed6e 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaProductionService.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaProductionService.java @@ -78,4 +78,34 @@ public interface PdaProductionService { PdaResponse receivedIn(JSONObject param); PdaResponse getVehicleInfo(JSONObject param); + + /** + * 获取料桶的数据 + * @param param + * @return + */ + PdaResponse getBucketGroupInfo(JSONObject param); + + /** + * 料桶-确认叫料 + * @param param + * @return + */ + PdaResponse confirmCallBucketMaterial(JSONObject param); + + PdaResponse getTaskBucketGroupInfo(JSONObject param); + + /** + * 手动入站 + * @param param + * @return + */ + PdaResponse manualInbound(JSONObject param); + + /** + * 手动出战 + * @param param + * @return + */ + PdaResponse manualOutbound(JSONObject param); } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/DefaultPdaBuildParamService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/DefaultPdaBuildParamService.java index 4bccdad..c4ca1fc 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/DefaultPdaBuildParamService.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/DefaultPdaBuildParamService.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; @@ -31,6 +32,7 @@ import org.nl.wms.warehouse_management.service.dao.*; import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvDisMapper; import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvDtlMapper; import org.nl.wms.warehouse_management.service.dto.IOStorInvDisDto; +import org.nl.wms.warehouse_management.service.dto.IOStorInvDtlDto; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -180,26 +182,25 @@ public class DefaultPdaBuildParamService implements PdaBuildParamService { } @Override - public JSONObject doBuildOutInvObj(JSONObject param, Sectattr sectattr) { + public JSONObject doBuildOutInvObj(JSONObject param, String storId, Boolean flag) { JSONObject insertInvObj = new JSONObject(); JSONArray rows = param.getJSONArray("rows"); - JSONObject row = rows.getJSONObject(0); - List result = filterAndSumByMaterialIdAndPcsn(rows); + List result = flag ? filterAndSumByMaterialIdAndPcsn(rows) : rows.toJavaObject(new TypeReference>() {}); List rowList = new ArrayList<>(); for (JSONObject rowObj : result) { - List temps = outBillService.getCanuseSpecifiedIvt(MapOf.of("stor_id", row.getString("stor_id") - , "sect_id", row.getString("sect_id") - , "struct_code", row.getString("struct_code") - , "material_code", row.getString("material_code") + List temps = outBillService.getCanuseSpecifiedIvt(MapOf.of("stor_id", rowObj.getString("stor_id") + , "sect_id", rowObj.getString("sect_id") + , "struct_code", rowObj.getString("struct_code") + , "material_code", rowObj.getString("material_code") , "pcsn", rowObj.getString("pcsn") - , "vehicle_code", row.getString("vehicle_code"))); + , "vehicle_code", rowObj.getString("vehicle_code"))); if (temps.size() > 0) { JSONObject temp = temps.get(0); temp.put("plan_qty", rowObj.getString("qty")); rowList.add(temp); } } - insertInvObj.put("stor_id", sectattr.getStor_id()); + insertInvObj.put("stor_id", storId); insertInvObj.put("bill_status", "10"); insertInvObj.put("bill_type", param.getString("bill_type")); insertInvObj.put("biz_date", DateUtil.format(new Date(), "yyyy-MM-dd")); @@ -224,10 +225,10 @@ public class DefaultPdaBuildParamService implements PdaBuildParamService { // 取第一个对象作为基础(保留除了qty外的其他信息) JSONObject baseObj = new JSONObject(group.get(0)); - // 计算该分组中所有对象的qty总和 - int totalQty = group.stream() - .mapToInt(obj -> obj.getInteger("qty")) - .sum(); + // 计算该分组中所有对象的qty总和(使用BigDecimal) + BigDecimal totalQty = group.stream() + .map(obj -> obj.getBigDecimal("qty")) + .reduce(BigDecimal.ZERO, BigDecimal::add); // 更新qty为总和 baseObj.put("qty", totalQty); @@ -241,27 +242,28 @@ public class DefaultPdaBuildParamService implements PdaBuildParamService { } @Override - public JSONObject buildManuaOutDivData(JSONObject param, Sectattr outStructAttr, String invId) { + public JSONObject buildManuaOutDivData(JSONObject param, IOStorInvDtlDto ioStorInvDtlDto) { JSONObject outDivObj = new JSONObject(); - JSONObject row = param.getJSONArray("rows").getJSONObject(0); - List dtoList = outBillService.queryAvailableSpecifiedInv(MapOf.of("stor_id", outStructAttr.getStor_id() - , "material_code", row.getString("material_code") - , "sect_id", outStructAttr.getSect_id() - , "struct_code", row.getString("struct_code") - , "pcsn", row.getString("pcsn") - , "vehicle_code", row.getString("vehicle_code"))); - if (dtoList.size() == 0) { - throw new BadRequestException("未找到库存信息!"); + // 对应的明细id和主表id + JSONObject row = new JSONObject(); + outDivObj.put("row", row); + row.put("iostorinv_id", ioStorInvDtlDto.getIostorinv_id()); + row.put("iostorinvdtl_id", ioStorInvDtlDto.getIostorinvdtl_id()); + // 托盘中的某个明细 + JSONObject pRow = param.getJSONObject("row"); + String vehicleCode = pRow.getString("vehicle_code"); + JSONArray dtLMaterialInfo = groupplateService.getDtLMaterialInfo(vehicleCode, ioStorInvDtlDto.getMaterial_id(), ioStorInvDtlDto.getPcsn()); + outDivObj.put("rows", dtLMaterialInfo); + for (int i = 0; i < dtLMaterialInfo.size(); i++) { + JSONObject rowsJSONObject = dtLMaterialInfo.getJSONObject(i); + rowsJSONObject.put("sect_id", pRow.getString("sect_id")); + rowsJSONObject.put("sect_name", pRow.getString("sect_name")); + rowsJSONObject.put("sect_code", pRow.getString("sect_code")); + rowsJSONObject.put("struct_id", pRow.getString("struct_id")); + rowsJSONObject.put("struct_code", pRow.getString("struct_code")); + rowsJSONObject.put("struct_name", pRow.getString("struct_name")); } - JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(dtoList.get(0))); - List> invDtls = ioStorInvDtlMapper.selectMaps(new LambdaQueryWrapper() - .eq(IOStorInvDtl::getIostorinv_id, invId)); - for (Map invDtl : invDtls) { - invDtl.put("storagevehicle_code", row.getString("vehicle_code")); - } - jsonObject.put("iostorinv_id", invId); - outDivObj.put("row", jsonObject); - outDivObj.put("rows", invDtls); + return outDivObj; } @@ -402,4 +404,28 @@ public class DefaultPdaBuildParamService implements PdaBuildParamService { } iStIvtMoveinvdtlService.saveBatch(moveDtlList); } + + @Override + public JSONObject buildManuaOutBuckDivData(JSONObject param, IOStorInvDtlDto ioStorInvDtlDto) { + JSONObject outDivObj = new JSONObject(); + // 对应的明细id和主表id + JSONObject row = new JSONObject(); + outDivObj.put("row", row); + row.put("iostorinv_id", ioStorInvDtlDto.getIostorinv_id()); + row.put("iostorinvdtl_id", ioStorInvDtlDto.getIostorinvdtl_id()); + // 每个料桶可能是物料批次一样,但是托盘不一样 + JSONArray pRows = param.getJSONArray("rows"); + List dtLMaterialInfo = pRows.stream() + .map(obj -> (JSONObject) obj) + .filter(obj -> ioStorInvDtlDto.getMaterial_id().equals(obj.getString("material_id")) + && ioStorInvDtlDto.getPcsn().equals(obj.getString("pcsn"))) + .collect(Collectors.toList()); + outDivObj.put("rows", dtLMaterialInfo); + for (int i = 0; i < dtLMaterialInfo.size(); i++) { + JSONObject rowsJSONObject = dtLMaterialInfo.get(i); + rowsJSONObject.put("canuse_qty", rowsJSONObject.getString("qty")); + rowsJSONObject.put("storagevehicle_code", rowsJSONObject.getString("bucket_code")); + } + return outDivObj; + } } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaCommonServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaCommonServiceImpl.java index 74b87d1..e2bd31f 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaCommonServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaCommonServiceImpl.java @@ -203,6 +203,10 @@ public class PdaCommonServiceImpl implements PdaCommonService { @Override public PdaResponse confirmBucketAssembly(AssemblyBucketParam param) { + List infoByBucket = groupbucketService.getBucketInfoByBucket(param.getBucket_code()); + if (infoByBucket.size() > 0) { + throw new BadRequestException("该桶已绑定过!"); + } MdPdGroupbucket groupbucket = new MdPdGroupbucket(); BeanUtil.copyProperties(param, groupbucket); diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaProductionServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaProductionServiceImpl.java index e6a3ecc..9b4396a 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaProductionServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaProductionServiceImpl.java @@ -1,10 +1,12 @@ package org.nl.wms.pda.general_management.service.impl; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -13,6 +15,8 @@ import org.nl.common.utils.CodeUtil; import org.nl.common.utils.IdUtil; import org.nl.common.utils.MapOf; import org.nl.common.utils.SecurityUtils; +import org.nl.system.service.param.ISysParamService; +import org.nl.system.service.param.dao.Param; import org.nl.wms.basedata_manage.enums.BaseDataEnum; import org.nl.wms.basedata_manage.service.*; import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleext; @@ -22,6 +26,8 @@ import org.nl.wms.pda.general_management.service.PdaBuildParamService; import org.nl.wms.pda.general_management.service.PdaWarehouseService; import org.nl.wms.pda.general_management.service.PdaProductionService; import org.nl.wms.pda.util.PdaResponse; +import org.nl.wms.pda.util.ThresholdChecker; +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; @@ -41,6 +47,7 @@ import org.nl.wms.warehouse_management.service.dao.IOStorInvDis; import org.nl.wms.warehouse_management.service.dao.IOStorInvDtl; import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvDisMapper; import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvDtlMapper; +import org.nl.wms.warehouse_management.service.dto.IOStorInvDtlDto; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.stereotype.Service; @@ -100,6 +107,8 @@ public class PdaProductionServiceImpl implements PdaProductionService { private IOStorInvDisMapper ioStorInvDisMapper; @Resource private IOStorInvDtlMapper ioStorInvDtlMapper; + @Resource + private ISysParamService paramService; @Override public PdaResponse getGroupInfo(JSONObject param) { // search; @@ -111,23 +120,28 @@ public class PdaProductionServiceImpl implements PdaProductionService { if (ObjectUtil.isEmpty(search)) { throw new BadRequestException("载具不存在!"); } - List res = groupplateService.getPalletViewByVehicleCode(search, Arrays.asList("1")); + List res = groupplateService.getPalletViewByVehicleCode(search, Arrays.asList("1", "2")); return PdaResponse.requestParamOk(res); } @Override public PdaResponse getStockGroupInfo(JSONObject param) { - // sect_code, material_id, pcsn - if (ObjectUtil.isEmpty(param.get("sect_code"))) { - throw new BadRequestException("请选择库区!"); - } + // material_id, pcsn List res = groupplateService.getStockGroupInfo(param); return PdaResponse.requestParamOk(res); } + /** + * 称量、粉碎、制粒、配液、缠膜叫料: + * 选择物料、输入批号,选择库区,查询物料库存,选择一个托盘物料,扫/选点位,点确认,进行叫料; + * @param param + * @return + */ @Override + @Transactional(rollbackFor = Exception.class) public PdaResponse confirmCallMaterial(JSONObject param) { - // point_code, row,sect_code + // hint: 没有创建出库单 + // point_code, row log.info("手持托盘叫料:{}", param); if (ObjectUtil.isEmpty(param.get("point_code"))) { throw new BadRequestException("请输入要料点!"); @@ -140,12 +154,46 @@ public class PdaProductionServiceImpl implements PdaProductionService { if (ObjectUtil.isEmpty(endPoint)) { throw new BadRequestException("输入的点位不存在或者点位已被禁用, 请检查输入点位是否正确或是否被禁用!"); } + if (!"1".equals(endPoint.getPoint_status())) { + throw new BadRequestException("该点位不是空位,请检查后呼叫!"); + } + // 判断任务是否创建 + List tasks = taskService.getTaskByQuery(new LambdaQueryWrapper() + .eq(SchBaseTask::getPoint_code2, pointCode)); + if (tasks.size() > 0) { + throw new BadRequestException("该点位已创建过任务!"); + } + JSONObject row = param.getJSONObject("row"); + // 如果是制粒,需要走正规出入库流程 + if ("ZLQ".equals(endPoint.getRegion_code())) { + Structattr structattr = structattrService.getByCode(row.getString("struct_code")); + param.put("bill_type", IOSEnum.OUT_BILL_TYPE.code("批料出库")); + // 1 创建出库单、明细、分配明细 + List res = groupplateService.getPalletViewByVehicleCode(row.getString("vehicle_code"), Arrays.asList("1", "2")); + param.put("rows", res); + JSONObject invObj = defaultPdaBuildParam.doBuildOutInvObj(param, structattr.getStor_id(), true); + String invId = outBillService.insertDtl(invObj); + // 2 循环,根据插入的dtl 去寻找袋的组盘信息调用手动分配 + List billDtl = outBillService.getOutBillDtl(MapUtil.of("iostorinv_id", invId)); + for (IOStorInvDtlDto ioStorInvDtlDto : billDtl) { + JSONObject divObj = defaultPdaBuildParam.buildManuaOutDivData(param, ioStorInvDtlDto); + outBillService.manualDiv(divObj); + } + // 3 创建任务 + JSONObject jsonMst = defaultPdaBuildParam.buildOutAllSetData(endPoint, invId); + outBillService.allSetPoint(jsonMst); + + return PdaResponse.requestOk("呼叫成功!"); + } + // 创建任务 JSONObject taskParam = new JSONObject(); taskParam.put("point_code1", row.getString("struct_code")); taskParam.put("point_code2", param.getString("point_code")); taskParam.put("vehicle_code", row.getString("vehicle_code")); + // 代表任务完成的时候不需要调用库存完成 + taskParam.put("flag", "1"); palletOutTask.create(taskParam); return PdaResponse.requestOk("呼叫成功!"); } @@ -405,7 +453,15 @@ public class PdaProductionServiceImpl implements PdaProductionService { if (res.size() == 0) { throw new BadRequestException("当前托盘号不存在物料信息,请检查!"); } - preProcessingInTask.create(param); + // 如果是仓位就需要走原辅料入库 + Sectattr sectCode = sectattrService.findByCode(param.getString("sect_code"), false); + if (ObjectUtil.isNotEmpty(sectCode)) { + // 辅料入库 + param.put("rows", res); + receivedIn(param); + } else { + preProcessingInTask.create(param); + } return PdaResponse.requestOk(); } @@ -424,6 +480,16 @@ public class PdaProductionServiceImpl implements PdaProductionService { param.getString("vehicle_code"))); } + /** + * 各工序作业完成,组盘后下料入库或缓存: + * 1、称量、粉碎下料组盘后,扫点位/载具点确认,系统分配物料存放室或批料室空货位入库; + * 2、压片下料组盘后,扫点位、载具点确认,系统分配中间站空货位入库; + * 3、包衣下料组盘后,扫点位点呼叫AGV,系统呼叫AGV来取货;扫点位、载具点确认,系统分配中间站空货位入库; + * 4、× 码垛完成后,扫点位、载具点确认,系统分配缓存点位搬运暂存; + * 5、缠膜完成后,扫点位、载具点确认,系统分配缓存点位搬运暂存; + * @param param + * @return + */ @Override public PdaResponse productionLine(JSONObject param) { // point_code, vehicle_code @@ -435,11 +501,55 @@ public class PdaProductionServiceImpl implements PdaProductionService { if (ObjectUtil.isEmpty(point)) { throw new BadRequestException("点位[" + pointCode +"]不存在!"); } + if (point.getRegion_code().startsWith("FSSQ") || point.getRegion_code().startsWith("CLS")) { + // 粉碎室/称量室入库逻辑 + productionInStorage(param, point); + return PdaResponse.requestOk(); + } + // 压片/包衣下料 AbstractTask task = taskFactory.getTask(IOSEnum.DOWN_CONFIG_CODE.code(point.getRegion_code())); task.create(param); return PdaResponse.requestOk(); } + /** + * 入库 + * @param param + */ + @Transactional(rollbackFor = Exception.class) + public void productionInStorage(JSONObject param, SchBasePoint point) { + // 入库库区 + String inSect = point.getIn_sect(); + if (ObjectUtil.isEmpty(inSect)) { + throw new BadRequestException("点位【" + point.getPoint_code() + "】未配置入库库区!"); + } + Sectattr sectattr = sectattrService.findByCode(inSect, false); + if (ObjectUtil.isEmpty(sectattr)) { + throw new BadRequestException("库区不存在,请确保库区存在!"); + } + + // 入库三件套 + param.put("bill_type", IOSEnum.IN_BILL_TYPE.code("粉碎入库")); + // 设置rows(需要根据物料和批次区分) + List res = groupplateService.getPalletViewByVehicleCode(param.getString("vehicle_code") + , Arrays.asList("1")); + // 需要过滤出物料id+批次并汇总qty + JSONArray jsonArray = new JSONArray(); + jsonArray.addAll(res); + List jsonObjects = DefaultPdaBuildParamService.filterAndSumByMaterialIdAndPcsn(jsonArray); + param.put("rows", jsonObjects); + // 1 创建入库单、明细、分配明细 + Map invObj = defaultPdaBuildParam.doBuildInvObj(param, point, sectattr); + String invId = rawAssistIStorService.insertDtl(invObj); + // 2 调用分配 + Map divObj = defaultPdaBuildParam.buildDivStructData(param, sectattr, invId, true); + rawAssistIStorService.divStruct(divObj); + // 3 创建任务 + Map jsonMst = defaultPdaBuildParam.buildTaskData(point, invId); + rawAssistIStorService.divPoint(jsonMst); + + } + @SneakyThrows @Override public PdaResponse receivedIn(JSONObject param) { @@ -459,6 +569,9 @@ public class PdaProductionServiceImpl implements PdaProductionService { if (ObjectUtil.isEmpty(startPoint.getVehicle_code())) { throw new BadRequestException("点位载具号为空!"); } + if (!ObjectUtil.equals(startPoint.getVehicle_code(), param.getString("vehicle_code"))) { + throw new BadRequestException("点位载具号不一致!!!"); + } Sectattr sectattr = sectattrService.findByCode(sect_code, true); if (ObjectUtil.isEmpty(sectattr)) { throw new BadRequestException("库区不存在或者被禁用!"); @@ -469,6 +582,7 @@ public class PdaProductionServiceImpl implements PdaProductionService { if (tasks.size() > 0) { throw new BadRequestException("该点位已创建过任务!"); } + storagevehicleinfoService.getByCode(param.getString("vehicle_code")); param.put("bill_type", IOSEnum.IN_BILL_TYPE.code("原辅料入库")); // 1 创建入库单、明细、分配明细 Map invObj = defaultPdaBuildParam.doBuildInvObj(param, startPoint, sectattr); @@ -500,4 +614,187 @@ public class PdaProductionServiceImpl implements PdaProductionService { List res = groupplateService.getPalletViewByVehicleCode(search, Arrays.asList("1")); return PdaResponse.requestParamOk(res); } + + @Override + public PdaResponse getBucketGroupInfo(JSONObject param) { + // material_id, pcsn + List res = groupbucketService.getBucketGroupInfo(param); + return PdaResponse.requestParamOk(res); + } + + @SneakyThrows + @Override + @Transactional(rollbackFor = Exception.class) + public PdaResponse confirmCallBucketMaterial(JSONObject param) { + // param: point_code, rows + log.info("料桶叫料:{}", param); + assertNotBlankJson(param, "参数不能为空!", "point_code", "rows"); + RLock lock = redissonClient.getLock("lock:confirmCallBucketMaterial"); + boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); + try { + if (tryLock) { + // param:point_code(点位),rows + String point_code = param.getString("point_code"); + SchBasePoint endPoint = pointService.getByPointCode(point_code, true); + if (ObjectUtil.isEmpty(endPoint)) { + throw new BadRequestException("输入的点位不存在或者点位已被禁用, 请检查输入点位是否正确或是否被禁用!"); + } + // 判断任务是否创建 + List tasks = taskService.getTaskByQuery(new LambdaQueryWrapper() + .eq(SchBaseTask::getPoint_code2, point_code)); + if (tasks.size() > 0) { + throw new BadRequestException("该点位已创建过任务!"); + } + List rows = param.getJSONArray("rows").toJavaObject(new TypeReference>() {});; + param.put("bill_type", IOSEnum.OUT_BILL_TYPE.code("料桶出库")); + param.put("rows", rows); + // 1 创建出库单、明细、分配明细 + // todo: 认为明细都是一个库区的(不同库区需要不同出库单?) + Structattr structattr = structattrService.getByCode(rows.get(0).getString("struct_code")); + JSONObject invObj = defaultPdaBuildParam.doBuildOutInvObj(param, structattr.getStor_id(), true); + String invId = outBillService.insertDtl(invObj); + // 2 根据插入的dtl 去寻找袋的组盘信息调用手动分配 + List billDtl = outBillService.getOutBillDtl(MapUtil.of("iostorinv_id", invId)); + for (IOStorInvDtlDto ioStorInvDtlDto : billDtl) { + JSONObject divObj = defaultPdaBuildParam.buildManuaOutBuckDivData(param, ioStorInvDtlDto); + outBillService.manualDiv(divObj); + } + // 找一个没任务的称重位 + List czws = pointService.getCanUsePointByRegion("ZJZ01"); + if (czws.isEmpty()) { + throw new BadRequestException("找不到中间站的称重位!"); + } + // 3 创建任务 + JSONObject jsonMst = defaultPdaBuildParam.buildOutAllSetData(czws.get(0), invId); + jsonMst.put("target", endPoint.getPoint_code()); + outBillService.allSetPoint(jsonMst); + } else { + throw new BadRequestException("速度太快啦,稍后再试..."); + } + } finally { + if (tryLock) { + lock.unlock(); + } + } + return PdaResponse.requestOk(); + } + + @Override + public PdaResponse getTaskBucketGroupInfo(JSONObject param) { + JSONObject res = new JSONObject(); + // vehicle_code + List infoByBucket = groupbucketService.getBucketInfoByBucket(param.getString("vehicle_code")); + if (infoByBucket.size() == 0) { + throw new BadRequestException("料桶信息不存在!"); + } + JSONObject bucketInfo = infoByBucket.get(0); + // 判断是否存在任务 + SchBaseTask task = taskService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTask::getVehicle_code, param.getString("vehicle_code")) + .eq(SchBaseTask::getTask_status, TaskStatus.EXECUTING.getCode()) + .eq(SchBaseTask::getIs_delete, false)); + if (ObjectUtil.isNotEmpty(task)) { + res.put("current_point", task.getPoint_code2()); + // ext 有出站站点 + bucketInfo.put("task_id", task.getTask_id()); + JSONObject parseObject = JSONObject.parseObject(task.getRequest_param()); + if (ObjectUtil.isNotEmpty(parseObject.get("ext"))) { + JSONObject ext = parseObject.getJSONObject("ext"); + bucketInfo.put("station", ext.getString("target")); + } + } + // todo:获取ACS的重量! + res.put("total", bucketInfo.getBigDecimal("qty")); + res.put("row", bucketInfo); + return PdaResponse.requestParamOk(res); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public PdaResponse manualInbound(JSONObject param) { + assertNotBlankJson(param, "当前点位不能为空!", "row", "current_point", "vehicle_code"); + JSONObject row = param.getJSONObject("row"); + String currentPoint = param.getString("current_point"); + String vehicleCode = param.getString("vehicle_code"); + // ACS 获取的重量 + String total = param.getString("total"); + String taskId = row.getString("task_id"); + if (ObjectUtil.isNotEmpty(taskId)) { + // 有任务直接任务完成 + SchBaseTask baseTask = taskService.getById(taskId); + AbstractTask task = taskFactory.getTask(baseTask.getConfig_code()); + task.updateTaskStatus(baseTask.getTask_code(), TaskStatus.FINISHED); + return PdaResponse.requestOk(); + } + SchBasePoint startPoint = pointService.getById(currentPoint); + // 没任务,证明是人工放上去录进去的 + groupbucketService.upDateWeight(total, vehicleCode); + JSONObject param2 = new JSONObject(); + // 创建入库任务 + List infos = groupbucketService.getBucketInfoByBucket(vehicleCode); + Sectattr sectattr = sectattrService.findByCode(startPoint.getIn_sect(), false); + param2.put("bill_type", IOSEnum.IN_BILL_TYPE.code("中间站入库")); + param2.put("rows", infos); + // 1 创建入库单、明细、分配明细 + Map invObj = defaultPdaBuildParam.doBuildInvObj(param2, startPoint, sectattr); + String invId = rawAssistIStorService.insertDtl(invObj); + // 2 调用分配 + Map divObj = defaultPdaBuildParam.buildDivStructData(param2, sectattr, invId, true); + rawAssistIStorService.divStruct(divObj); + // 3 创建任务 + Map jsonMst = defaultPdaBuildParam.buildTaskData(startPoint, invId); + rawAssistIStorService.divPoint(jsonMst); + return PdaResponse.requestOk(); + } + + @Override + public PdaResponse manualOutbound(JSONObject param) { + assertNotBlankJson(param, "当前点位不能为空!", "row", "current_point", "vehicle_code"); + JSONObject row = param.getJSONObject("row"); + String currentPoint = param.getString("current_point"); + String vehicleCode = param.getString("vehicle_code"); + // ACS 获取的重量 + BigDecimal currentTotal = param.getBigDecimal("total"); + BigDecimal originalQty = row.getBigDecimal("qty"); + Param threshold = paramService.findByCode("weighing_threshold"); + // 对比与组盘的重量是否大于阈值 + ThresholdChecker.ThresholdCheckResult result = ThresholdChecker.checkThresholdWithDetails( + currentTotal, + originalQty, + threshold.getValue() + ); + if (result.isExceeded()) { + throw new BadRequestException(result.toString()); + } + // 判断是否有任务 + String taskId = row.getString("task_id"); + if (ObjectUtil.isNotEmpty(taskId)) { + // 有任务直接任务完成 + SchBaseTask baseTask = taskService.getById(taskId); + AbstractTask task = taskFactory.getTask(baseTask.getConfig_code()); + task.updateTaskStatus(baseTask.getTask_code(), TaskStatus.FINISHED); + return PdaResponse.requestOk(); + } + if (ObjectUtil.isEmpty(row.getString("station"))) { + throw new BadRequestException("产线目标站为空"); + } + List infoByBucket = groupbucketService.getBucketInfoByBucket(vehicleCode); + if (infoByBucket.size() == 0) { + throw new BadRequestException("桶物料信息不存在!请检查组桶!"); + } + JSONObject bucket = infoByBucket.get(0); + JSONObject ext = new JSONObject(); + // todo: 先固定包衣,后续改 + ext.put("config_code", "CoatingUpTask"); + ext.put("vehicle_code", vehicleCode); + ext.put("material_qty", currentTotal); + ext.put("material_name", bucket.getString("material_name")); + ext.put("material_id", bucket.getString("material_id")); + ext.put("group_id", bucket.getString("group_id")); + ext.put("point_code", currentPoint); + ext.put("target", row.getString("station")); + AbstractTask coatingUpTask = taskFactory.getTask("CoatingUpTask"); + coatingUpTask.create(ext); + return PdaResponse.requestOk(); + } } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/util/ThresholdChecker.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/util/ThresholdChecker.java new file mode 100644 index 0000000..3ad35cc --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/util/ThresholdChecker.java @@ -0,0 +1,165 @@ +package org.nl.wms.pda.util; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * + * @author: lyd + * @date: 2026/1/12 + */ +public class ThresholdChecker { + + /** + * 判断当前值相比原始值是否超过设置阈值的±大小 + * @param currentTotal 当前重量/值 + * @param originalQty 原始重量/值 + * @param threshold 阈值,支持百分比(如"10%")或绝对值(如"10") + * @return true-超过阈值范围,false-在阈值范围内 + */ + public static boolean isExceedThreshold(BigDecimal currentTotal, + BigDecimal originalQty, + String threshold) { + if (currentTotal == null || originalQty == null || threshold == null) { + throw new IllegalArgumentException("参数不能为空"); + } + + // 计算实际偏差(绝对值) + BigDecimal deviation = currentTotal.subtract(originalQty).abs(); + + // 解析阈值 + BigDecimal thresholdValue = parseThreshold(threshold, originalQty); + + // 判断是否超过阈值 + return deviation.compareTo(thresholdValue) > 0; + } + + /** + * 解析阈值字符串 + * @param threshold 阈值字符串,支持百分比或绝对值 + * @param baseValue 用于计算百分比的基础值 + * @return 解析后的阈值数值 + */ + private static BigDecimal parseThreshold(String threshold, BigDecimal baseValue) { + if (threshold == null || threshold.trim().isEmpty()) { + throw new IllegalArgumentException("阈值不能为空"); + } + + String trimmedThreshold = threshold.trim(); + + // 判断是否为百分比形式 + if (trimmedThreshold.endsWith("%")) { + try { + // 去掉百分号,转换为小数 + String percentStr = trimmedThreshold.substring(0, trimmedThreshold.length() - 1); + BigDecimal percent = new BigDecimal(percentStr); + + // 计算百分比对应的实际值 + return baseValue.multiply(percent) + .divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_UP); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("无效的百分比阈值格式: " + threshold, e); + } + } else { + try { + // 直接解析为绝对值 + return new BigDecimal(trimmedThreshold); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("无效的阈值格式: " + threshold, e); + } + } + } + + /** + * 获取当前值相对于原始值的偏差比例(带正负号) + * @param currentTotal 当前值 + * @param originalQty 原始值 + * @return 偏差比例(百分比,正数表示增加,负数表示减少) + */ + public static BigDecimal getDeviationPercentage(BigDecimal currentTotal, + BigDecimal originalQty) { + if (currentTotal == null || originalQty == null) { + throw new IllegalArgumentException("参数不能为空"); + } + + if (originalQty.compareTo(BigDecimal.ZERO) == 0) { + throw new ArithmeticException("原始值不能为0"); + } + + // 计算偏差比例:(当前值 - 原始值) / 原始值 * 100% + return currentTotal.subtract(originalQty) + .multiply(BigDecimal.valueOf(100)) + .divide(originalQty, 2, RoundingMode.HALF_UP); + } + + /** + * 判断当前值是否超过阈值,并返回详细信息 + * @param currentTotal 当前值 + * @param originalQty 原始值 + * @param threshold 阈值 + * @return 检查结果对象 + */ + public static ThresholdCheckResult checkThresholdWithDetails(BigDecimal currentTotal, + BigDecimal originalQty, + String threshold) { + boolean exceeded = isExceedThreshold(currentTotal, originalQty, threshold); + BigDecimal deviation = currentTotal.subtract(originalQty); + BigDecimal deviationPercentage = getDeviationPercentage(currentTotal, originalQty); + BigDecimal thresholdValue = parseThreshold(threshold, originalQty); + + return new ThresholdCheckResult( + exceeded, + currentTotal, + originalQty, + deviation, + deviationPercentage, + threshold, + thresholdValue + ); + } + + /** + * 阈值检查结果类 + */ + public static class ThresholdCheckResult { + private final boolean exceeded; + private final BigDecimal currentValue; + private final BigDecimal originalValue; + private final BigDecimal deviation; + private final BigDecimal deviationPercentage; + private final String thresholdExpression; + private final BigDecimal thresholdValue; + + public ThresholdCheckResult(boolean exceeded, + BigDecimal currentValue, + BigDecimal originalValue, + BigDecimal deviation, + BigDecimal deviationPercentage, + String thresholdExpression, + BigDecimal thresholdValue) { + this.exceeded = exceeded; + this.currentValue = currentValue; + this.originalValue = originalValue; + this.deviation = deviation; + this.deviationPercentage = deviationPercentage; + this.thresholdExpression = thresholdExpression; + this.thresholdValue = thresholdValue; + } + + // Getter方法 + public boolean isExceeded() { return exceeded; } + public BigDecimal getCurrentValue() { return currentValue; } + public BigDecimal getOriginalValue() { return originalValue; } + public BigDecimal getDeviation() { return deviation; } + public BigDecimal getDeviationPercentage() { return deviationPercentage; } + public String getThresholdExpression() { return thresholdExpression; } + public BigDecimal getThresholdValue() { return thresholdValue; } + + @Override + public String toString() { + return String.format("阈值检查结果: %s (当前值: %s, 原始值: %s, 偏差: %s [%s%%, 阈值: %s])", + exceeded ? "超过阈值" : "未超过阈值", + currentValue, originalValue, deviation, deviationPercentage, thresholdExpression); + } + } +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/controller/TestApiController.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/controller/TestApiController.java new file mode 100644 index 0000000..b73041d --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/controller/TestApiController.java @@ -0,0 +1,54 @@ +package org.nl.wms.sch_manage.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.nl.wms.sch_manage.service.SecondaryPackagingService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * + * @author: lyd + * @date: 2026/1/10 + */ +@Slf4j +@RestController +@RequestMapping("/api/test") +public class TestApiController { + @Resource + private SecondaryPackagingService secondaryPackagingService; + + @PostMapping("/down") + @SaIgnore + public ResponseEntity query(@RequestBody JSONObject whereJson) { + secondaryPackagingService.palletizingDown(whereJson); + return new ResponseEntity<>(HttpStatus.CREATED); + } + @PostMapping("/call") + @SaIgnore + public ResponseEntity query2(@RequestBody JSONObject whereJson) { + secondaryPackagingService.wrappingCall(whereJson); + return new ResponseEntity<>(HttpStatus.CREATED); + } + @PostMapping("/down2") + @SaIgnore + public ResponseEntity query3(@RequestBody JSONObject whereJson) { + secondaryPackagingService.wrappingDown(whereJson); + return new ResponseEntity<>(HttpStatus.CREATED); + } + @PostMapping("/call2") + @SaIgnore + public ResponseEntity query4(@RequestBody JSONObject whereJson) { + secondaryPackagingService.palletizingCallEmpty(whereJson); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java index fa67040..0ea6fc0 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBasePointService.java @@ -141,4 +141,19 @@ public interface ISchBasePointService extends IService { List getCanUsePointByRegion(String regionCode); List getByVehicleCode(String search); + + /** + * 获取可用点位 + * @param region + * @param type + * @return + */ + List getNoTaskPointByRegionAndType(String region, String type, String pointStatus); + + /** + * 获取可以直接上料的缠绕机 + * @return + */ + List getCRUsedDevice(); + } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBaseTaskService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBaseTaskService.java index dd0f5f6..4ffc5b6 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBaseTaskService.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/ISchBaseTaskService.java @@ -79,4 +79,6 @@ public interface ISchBaseTaskService extends IService { List getTaskConfigList(String config_code); List getTaskByQuery(LambdaQueryWrapper lam); + + Integer haveTaskAll(String deviceCode); } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/SecondaryPackagingService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/SecondaryPackagingService.java new file mode 100644 index 0000000..4e23688 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/SecondaryPackagingService.java @@ -0,0 +1,35 @@ +package org.nl.wms.sch_manage.service; + +import com.alibaba.fastjson.JSONObject; + +/** + * 外包间服务类 + * @author: lyd + * @date: 2026/1/9 + */ +public interface SecondaryPackagingService { + + /** + * 外包间码垛下料 + * @param param + */ + void palletizingDown(JSONObject param); + + /** + * 缠绕机叫料 + * @param param + */ + void wrappingCall(JSONObject param); + + /** + * 缠绕下料 + * @param param + */ + void wrappingDown(JSONObject param); + + /** + * 码垛缺空 + * @param param + */ + void palletizingCallEmpty(JSONObject param); +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.java index b3b411e..0257ca2 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.java @@ -78,4 +78,8 @@ public interface SchBasePointMapper extends BaseMapper { * @return PdaResponse */ List pdaQueryPointDtl(@Param("param") JSONObject whereJson); + + List getNoTaskPointByRegionAndType(String region, String type, String pointStatus); + + List getCRUsedDevice(); } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.xml b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.xml index c30b864..7e9b819 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.xml +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/mapper/SchBasePointMapper.xml @@ -171,4 +171,42 @@ + + diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java index b4a7417..9b94572 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBasePointServiceImpl.java @@ -37,6 +37,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -329,4 +330,14 @@ public class SchBasePointServiceImpl extends ServiceImpl getNoTaskPointByRegionAndType(String region, String type, String pointStatus) { + return this.baseMapper.getNoTaskPointByRegionAndType(region, type, pointStatus); + } + + @Override + public List getCRUsedDevice() { + return this.baseMapper.getCRUsedDevice(); + } } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBaseTaskServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBaseTaskServiceImpl.java index 5edbaf4..edbcc2b 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBaseTaskServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SchBaseTaskServiceImpl.java @@ -31,6 +31,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Consumer; import java.util.stream.Collectors; /** @@ -177,4 +178,16 @@ public class SchBaseTaskServiceImpl extends ServiceImpl lam = new LambdaQueryWrapper<>(); + lam.eq(SchBaseTask::getIs_delete, false) + .and(ll -> ll.eq(SchBaseTask::getPoint_code1, deviceCode).or() + .eq(SchBaseTask::getPoint_code2, deviceCode).or() + .eq(SchBaseTask::getPoint_code3, deviceCode).or() + .eq(SchBaseTask::getPoint_code4, deviceCode)) + .lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode()); + return this.count(lam); + } + } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SecondaryPackagingServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SecondaryPackagingServiceImpl.java new file mode 100644 index 0000000..0fd7b10 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SecondaryPackagingServiceImpl.java @@ -0,0 +1,130 @@ +package org.nl.wms.sch_manage.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.SecurityUtils; +import org.nl.config.IdUtil; +import org.nl.wms.basedata_manage.service.IMdMeMaterialbaseService; +import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase; +import org.nl.wms.sch_manage.service.ISchBasePointService; +import org.nl.wms.sch_manage.service.ISchBaseTaskService; +import org.nl.wms.sch_manage.service.SecondaryPackagingService; +import org.nl.wms.sch_manage.service.dao.SchBasePoint; +import org.nl.wms.sch_manage.service.util.AbstractTask; +import org.nl.wms.sch_manage.service.util.TaskFactory; +import org.nl.wms.sch_manage.service.util.tasks.EmptyDiskConveyTask; +import org.nl.wms.sch_manage.service.util.tasks.EmptyDiskEnterTask; +import org.nl.wms.sch_manage.service.util.tasks.WrappingDownTask; +import org.nl.wms.sch_manage.service.util.tasks.WrappingUpTask; +import org.nl.wms.warehouse_management.service.IMdPbGroupplateService; +import org.nl.wms.warehouse_management.service.dao.GroupPlate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +/** + * + * @author: lyd + * @date: 2026/1/9 + */ +@Service +public class SecondaryPackagingServiceImpl implements SecondaryPackagingService { + @Resource + private IMdPbGroupplateService groupplateService; + @Resource + private IMdMeMaterialbaseService materialbaseService; + @Resource + private TaskFactory taskFactory; + @Resource + private ISchBasePointService pointService; + @Resource + private ISchBaseTaskService taskService; + @Resource(name = "WrappingUpTask") + private WrappingUpTask wrappingUpTask; + @Resource(name = "WrappingDownTask") + private WrappingDownTask wrappingDownTask; + @Resource(name = "EmptyDiskConveyTask") + private EmptyDiskConveyTask emptyDiskConveyTask; + @Resource(name = "EmptyDiskEnterTask") + private EmptyDiskEnterTask emptyDiskEnterTask; + + @Override + @Transactional(rollbackFor = Exception.class) + public void palletizingDown(JSONObject param) { + // device_code、material_code、qty、vehicle_seq、pcsn、cases + MdMeMaterialbase materialCode = materialbaseService.getByCode(param.getString("material_code")); + // 组盘 + GroupPlate groupPlate = new GroupPlate(); + groupPlate.setGroup_id(IdUtil.getStringId()); + groupPlate.setVehicle_code( DateUtil.format(new Date(), "yyyyMMddss") + "-" + param.getString("vehicle_seq")); + groupPlate.setRemark(param.toJSONString()); + groupPlate.setStatus("1"); + groupPlate.setQty(param.getBigDecimal("qty")); + groupPlate.setPcsn(param.getString("pcsn")); + groupPlate.setMaterial_id(materialCode.getMaterial_id()); + groupPlate.setCreate_id(SecurityUtils.getCurrentUserId()); + groupPlate.setCreate_name(SecurityUtils.getCurrentNickName()); + groupPlate.setCreate_time(DateUtil.now()); + // ....待定 + groupplateService.save(groupPlate); + + // todo: 校验任务 + param.put("config_code", "PalletizingDownTask"); + param.put("group_id", groupPlate.getGroup_id()); + param.put("material_id", materialCode.getMaterial_id()); + param.put("material_qty", groupPlate.getQty()); + param.put("vehicle_code", groupPlate.getVehicle_code()); + AbstractTask palletizingDownTask = taskFactory.getTask("PalletizingDownTask"); + palletizingDownTask.create(param); + } + + @Override + public void wrappingCall(JSONObject param) { + // 校验任务 + Integer num = taskService.haveTaskAll(param.getString("device_code")); + if (num > 0) { + throw new BadRequestException("该点位已存在任务!"); + } + param.put("config_code", "WrappingUpTask"); + wrappingUpTask.create(param); + } + + @Override + public void wrappingDown(JSONObject param) { + // 校验任务 + Integer num = taskService.haveTaskAll(param.getString("device_code")); + if (num > 0) { + throw new BadRequestException("该点位已存在任务!"); + } + param.put("config_code", "WrappingDownTask"); + wrappingDownTask.create(param); + } + + @Override + public void palletizingCallEmpty(JSONObject param) { + // 空盘进入任务、空盘运输任务、 + // 校验任务 + Integer num = taskService.haveTaskAll(param.getString("device_code")); + if (num > 0) { + throw new BadRequestException("该点位已存在任务!"); + } + // 获取缓存点有空托盘的位置 + List palletPoints = pointService.getNoTaskPointByRegionAndType("WBZQ", "2", "3"); + if (palletPoints.size() == 0) { + // 创建空盘进入任务 + param.put("config_code", "EmptyDiskEnterTask"); + emptyDiskEnterTask.create(param); + return; + } + SchBasePoint point = palletPoints.get(0); + // 创建运输任务 + param.put("point_code1", point.getPoint_code()); + param.put("point_code2", param.getString("device_code")); + param.put("config_code", "EmptyDiskEnterTask"); + emptyDiskConveyTask.create(param); + } +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/CoatingUpTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/CoatingUpTask.java new file mode 100644 index 0000000..74cc238 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/CoatingUpTask.java @@ -0,0 +1,158 @@ +package org.nl.wms.sch_manage.service.util.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.QueryWrapper; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.CodeUtil; +import org.nl.common.utils.SecurityUtils; +import org.nl.config.IdUtil; +import org.nl.wms.basedata_manage.service.IMdPdGroupbucketService; +import org.nl.wms.basedata_manage.service.dao.MdPdGroupbucket; +import org.nl.wms.sch_manage.enums.TaskEnum; +import org.nl.wms.sch_manage.enums.TaskStatus; +import org.nl.wms.sch_manage.service.ISchBaseTaskService; +import org.nl.wms.sch_manage.service.dao.SchBaseTask; +import org.nl.wms.sch_manage.service.util.ACSTaskTypeEnum; +import org.nl.wms.sch_manage.service.util.AbstractTask; +import org.nl.wms.sch_manage.service.util.AcsTaskDto; +import org.nl.wms.warehouse_management.enums.IOSConstant; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +/** + * 包衣/内包装上料任务 + * @author: lyd + * @date: 2026/1/9 + */ +@Component("CoatingUpTask") +public class CoatingUpTask extends AbstractTask { + + @Resource + private ISchBaseTaskService taskService; + + @Resource + private IMdPdGroupbucketService groupbucketService; + + @Override + public String create(JSONObject json) { + SchBaseTask task = new SchBaseTask(); + task.setTask_id(IdUtil.getStringId()); + task.setTask_code(CodeUtil.getNewCode("TASK_CODE")); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setConfig_code(CoatingUpTask.class.getSimpleName()); + task.setPoint_code1(json.getString("point_code")); + task.setPoint_code2(json.getString("target")); + task.setVehicle_code(json.getString("vehicle_code")); + task.setMaterial_id(json.getString("material_id")); + task.setMaterial_qty(json.getBigDecimal("material_qty")); + task.setGroup_id(json.getString("group_id")); + task.setRequest_param(json.toString()); + task.setTask_type(TaskEnum.TASK_TYPE.code("料箱")); + task.setPriority("1"); + task.setIs_wait("0"); + task.setCreate_id(SecurityUtils.getCurrentUserId()); + task.setCreate_name(SecurityUtils.getCurrentNickName()); + task.setCreate_time(DateUtil.now()); + taskService.save(task); + + // 下发任务 +// this.sendTaskOne(task.getTask_id()); + return task.getTask_id(); + } + + public AcsTaskDto sendAcsParam(String taskId) { + SchBaseTask taskDao = taskService.getById(taskId); + + // 组织下发给acs的数据 + AcsTaskDto acsTaskDto = new AcsTaskDto(); + acsTaskDto.setExt_task_id(taskDao.getTask_id()); + acsTaskDto.setTask_code(taskDao.getTask_code()); + acsTaskDto.setStart_device_code(taskDao.getPoint_code1()); + acsTaskDto.setNext_device_code(taskDao.getPoint_code2()); + acsTaskDto.setVehicle_code(taskDao.getVehicle_code()); + + acsTaskDto.setVehicle_type(IOSConstant.ONE); + acsTaskDto.setIs_wait(IOSConstant.ZERO); + acsTaskDto.setTask_type(ACSTaskTypeEnum.AGV_TASK.getCode()); + + acsTaskDto.setPriority(IOSConstant.ONE); + acsTaskDto.setAgv_system_type(IOSConstant.THREE); + acsTaskDto.setIs_get_pause(IOSConstant.ZERO); + acsTaskDto.setIs_put_pause(IOSConstant.ZERO); + + 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); + } + } + + public void cancelTask(SchBaseTask taskObj) { + + // 更新任务状态 + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setRemark("已取消"); + taskService.updateById(taskObj); + } + + @Transactional(rollbackFor = Exception.class) + public void finishTask(SchBaseTask taskObj) { + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("已完成"); + taskService.updateById(taskObj); + + // 删除组盘信息 + groupbucketService.remove( + new QueryWrapper().lambda() + .eq(MdPdGroupbucket::getBucket_code, taskObj.getVehicle_code()) + ); + } + + @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("该任务不存在"); + } + this.cancelTask(taskObj); + } + + @Override + public void taskConfirm(String task_code) { + + } +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/EmptyDiskConveyTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/EmptyDiskConveyTask.java new file mode 100644 index 0000000..f800e0b --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/EmptyDiskConveyTask.java @@ -0,0 +1,188 @@ +package org.nl.wms.sch_manage.service.util.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.CodeUtil; +import org.nl.common.utils.SecurityUtils; +import org.nl.config.IdUtil; +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.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.ACSTaskTypeEnum; +import org.nl.wms.sch_manage.service.util.AbstractTask; +import org.nl.wms.sch_manage.service.util.AcsTaskDto; +import org.nl.wms.warehouse_management.enums.IOSConstant; +import org.nl.wms.warehouse_management.enums.IOSEnum; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 空盘运输任务 + * @author: lyd + * @date: 2026/1/12 + */ +@Slf4j +@Component("EmptyDiskConveyTask") +public class EmptyDiskConveyTask extends AbstractTask { + @Resource + private ISchBaseTaskService taskService; + @Resource + private ISchBasePointService pointService; + @Resource(name = "EmptyDiskEnterTask") + private EmptyDiskEnterTask emptyDiskEnterTask; + @Override + public String create(JSONObject json) { + SchBaseTask task = new SchBaseTask(); + task.setTask_id(IdUtil.getStringId()); + task.setTask_code(CodeUtil.getNewCode("TASK_CODE")); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setConfig_code(EmptyDiskConveyTask.class.getSimpleName()); + task.setPoint_code1(json.getString("point_code1")); + task.setPoint_code2(json.getString("point_code2")); + task.setVehicle_code(json.getString("vehicle_code")); + task.setMaterial_id(json.getString("material_id")); + task.setMaterial_qty(json.getBigDecimal("material_qty")); + task.setGroup_id(json.getString("group_id")); + task.setRequest_param(json.toString()); + task.setPriority(json.getString("Priority")); + task.setTask_type(TaskEnum.TASK_TYPE.code("料箱")); + task.setIs_wait(json.getString("is_wait")); + task.setCreate_id(SecurityUtils.getCurrentUserId()); + task.setCreate_name(SecurityUtils.getCurrentNickName()); + task.setCreate_time(DateUtil.now()); + taskService.save(task); + // 下发任务 +// this.sendTaskOne(task.getTask_id()); + return task.getTask_id(); + } + + @Override + public AcsTaskDto sendAcsParam(String taskId) { + SchBaseTask taskDao = taskService.getById(taskId); + + // 组织下发给acs的数据 + AcsTaskDto acsTaskDto = new AcsTaskDto(); + acsTaskDto.setExt_task_id(taskDao.getTask_id()); + acsTaskDto.setTask_code(taskDao.getTask_code()); + acsTaskDto.setStart_device_code(taskDao.getPoint_code1()); + acsTaskDto.setNext_device_code(taskDao.getPoint_code2()); + acsTaskDto.setVehicle_code(taskDao.getVehicle_code()); + + acsTaskDto.setVehicle_type(IOSConstant.ONE); + acsTaskDto.setIs_wait(IOSConstant.ZERO); + acsTaskDto.setTask_type(ACSTaskTypeEnum.AGV_TASK.getCode()); + + acsTaskDto.setPriority(IOSConstant.ONE); + acsTaskDto.setAgv_system_type(IOSConstant.THREE); + acsTaskDto.setIs_get_pause(IOSConstant.ZERO); + acsTaskDto.setIs_put_pause(IOSConstant.ZERO); + + 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); + } + } + + public void cancelTask(SchBaseTask taskObj) { + + // 更新任务状态 + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setRemark("已取消"); + taskService.updateById(taskObj); + } + + @Transactional(rollbackFor = Exception.class) + public void finishTask(SchBaseTask taskObj) { + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("已完成"); + taskService.updateById(taskObj); + + // 更新 + pointService.update( + new UpdateWrapper().lambda() + .set(SchBasePoint::getVehicle_code, "") + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空位")) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) + .set(SchBasePoint::getIng_task_code, "") + ); + pointService.update( + new UpdateWrapper().lambda() + .set(SchBasePoint::getVehicle_code, "") + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空载具")) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2()) + .set(SchBasePoint::getIng_task_code, "") + ); + + // 判断是否需要呼叫空盘 + List palletPoints = pointService.getNoTaskPointByRegionAndType("WBZQ", "2", "1"); + for (SchBasePoint palletPoint : palletPoints) { + // 创建进入任务。 + try { + JSONObject param = new JSONObject(); + param.put("device_code", palletPoint.getPoint_code()); + param.put("config_code", "EmptyDiskEnterTask"); + emptyDiskEnterTask.create(param); + } catch (Exception e) { + log.warn(e.getMessage()); + } + } + } + + @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 taskConfirm(String task_code) { + + } +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/EmptyDiskEnterTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/EmptyDiskEnterTask.java new file mode 100644 index 0000000..cb6f986 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/EmptyDiskEnterTask.java @@ -0,0 +1,189 @@ +package org.nl.wms.sch_manage.service.util.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.CodeUtil; +import org.nl.common.utils.SecurityUtils; +import org.nl.config.IdUtil; +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.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.ACSTaskTypeEnum; +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.TaskFactory; +import org.nl.wms.warehouse_management.enums.IOSConstant; +import org.nl.wms.warehouse_management.enums.IOSEnum; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 空盘进入任务 + * @author: lyd + * @date: 2026/1/12 + */ +@Component("EmptyDiskEnterTask") +public class EmptyDiskEnterTask extends AbstractTask { + @Resource + private ISchBaseTaskService taskService; + @Resource + private ISchBasePointService pointService; + @Resource + private TaskFactory taskFactory; + @Override + public String create(JSONObject json) { + // 获取中转位 + List transferStation = pointService.getNoTaskPointByRegionAndType("AGVZJZ01", "1", "1"); + if (transferStation.size() == 0) { + throw new BadRequestException("找不到可用的中转位!"); + } + SchBasePoint point = transferStation.get(0); + SchBaseTask task = new SchBaseTask(); + task.setTask_id(IdUtil.getStringId()); + task.setTask_code(CodeUtil.getNewCode("TASK_CODE")); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setConfig_code(EmptyDiskEnterTask.class.getSimpleName()); + task.setPoint_code1("ZBJ01"); + task.setPoint_code2(point.getPoint_code()); + task.setPoint_code3(json.getString("device_code")); + task.setVehicle_code(json.getString("vehicle_code")); + task.setMaterial_id(json.getString("material_id")); + task.setMaterial_qty(json.getBigDecimal("material_qty")); + task.setGroup_id(json.getString("group_id")); + task.setRequest_param(json.toString()); + task.setPriority(json.getString("Priority")); + task.setTask_type(TaskEnum.TASK_TYPE.code("料箱")); + task.setIs_wait(json.getString("is_wait")); + task.setCreate_id(SecurityUtils.getCurrentUserId()); + task.setCreate_name(SecurityUtils.getCurrentNickName()); + task.setCreate_time(DateUtil.now()); + taskService.save(task); + // 下发任务 +// this.sendTaskOne(task.getTask_id()); + return task.getTask_id(); + } + + @Override + public AcsTaskDto sendAcsParam(String taskId) { + SchBaseTask taskDao = taskService.getById(taskId); + + // 组织下发给acs的数据 + AcsTaskDto acsTaskDto = new AcsTaskDto(); + acsTaskDto.setExt_task_id(taskDao.getTask_id()); + acsTaskDto.setTask_code(taskDao.getTask_code()); + acsTaskDto.setStart_device_code(taskDao.getPoint_code1()); + acsTaskDto.setNext_device_code(taskDao.getPoint_code2()); + acsTaskDto.setVehicle_code(taskDao.getVehicle_code()); + + acsTaskDto.setVehicle_type(IOSConstant.ONE); + acsTaskDto.setIs_wait(IOSConstant.ZERO); + acsTaskDto.setTask_type(ACSTaskTypeEnum.AGV_TASK.getCode()); + + acsTaskDto.setPriority(IOSConstant.ONE); + acsTaskDto.setAgv_system_type(IOSConstant.THREE); + acsTaskDto.setIs_get_pause(IOSConstant.ZERO); + acsTaskDto.setIs_put_pause(IOSConstant.ZERO); + + 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); + } + } + + public void cancelTask(SchBaseTask taskObj) { + + // 更新任务状态 + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setRemark("已取消"); + taskService.updateById(taskObj); + } + + @Transactional(rollbackFor = Exception.class) + public void finishTask(SchBaseTask taskObj) { + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("已完成"); + taskService.updateById(taskObj); + + // 更新 + pointService.update( + new UpdateWrapper().lambda() + .set(SchBasePoint::getVehicle_code, "") + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空位")) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) + .set(SchBasePoint::getIng_task_code, "") + ); + + // 更新 + pointService.update( + new UpdateWrapper().lambda() + .set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code()) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空载具")) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2()) + .set(SchBasePoint::getIng_task_code, "") + ); + // 创建输送任务 + AbstractTask task = taskFactory.getTask("EmptyDiskConveyTask"); + JSONObject parm = new JSONObject(); + parm.put("config_code", "EmptyDiskConveyTask"); + parm.put("point_code1", taskObj.getPoint_code2()); + parm.put("point_code2", taskObj.getPoint_code3()); + task.create(parm); + } + + @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 taskConfirm(String task_code) { + + } +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/IntermediateOutTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/IntermediateOutTask.java new file mode 100644 index 0000000..6e3d1a6 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/IntermediateOutTask.java @@ -0,0 +1,239 @@ +package org.nl.wms.sch_manage.service.util.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.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.SecurityUtils; +import org.nl.config.IdUtil; +import org.nl.wms.basedata_manage.enums.BaseDataEnum; +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.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.ACSTaskTypeEnum; +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.TaskFactory; +import org.nl.wms.warehouse_management.enums.IOSConstant; +import org.nl.wms.warehouse_management.enums.IOSEnum; +import org.nl.wms.warehouse_management.service.IOutBillService; +import org.nl.wms.warehouse_management.service.dao.GroupPlate; +import org.nl.wms.warehouse_management.service.dao.IOStorInvDis; +import org.nl.wms.warehouse_management.service.dao.mapper.GroupPlateMapper; +import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvDisMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +/** + * 中间出库 + * @author: lyd + * @date: 2026/1/9 + */ +@Component("IntermediateOutTask") +public class IntermediateOutTask extends AbstractTask { + @Resource + private TaskFactory taskFactory; + /** + * 任务服务 + */ + @Autowired + private ISchBaseTaskService taskService; + + /** + * 出库服务 + */ + @Resource + private IOutBillService outBillService; + + /** + * 分配明细mapper + */ + @Resource + private IOStorInvDisMapper ioStorInvDisMapper; + + /** + * 点位服务 + */ + @Resource + private ISchBasePointService iSchBasePointService; + + /* + * 组盘记录服务 + */ + @Resource + private GroupPlateMapper groupPlateMapper; + + @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(IntermediateOutTask.class.getSimpleName()); + task.setPoint_code1(json.getString("point_code1")); + task.setPoint_code2(json.getString("point_code2")); + task.setVehicle_code(json.getString("vehicle_code")); + task.setMaterial_id(json.getString("material_id")); + task.setMaterial_qty(json.getBigDecimal("material_qty")); + task.setGroup_id(json.getString("group_id")); + task.setRequest_param(json.toString()); + task.setPriority(json.getString("Priority")); + task.setTask_type(TaskEnum.TASK_TYPE.code("料箱")); + task.setIs_wait(json.getString("is_wait")); + task.setCreate_id(SecurityUtils.getCurrentUserId()); + task.setCreate_name(SecurityUtils.getCurrentNickName()); + task.setCreate_time(DateUtil.now()); + taskService.save(task); + + // 下发任务 + this.sendTaskOne(task.getTask_id()); + return task.getTask_id(); + } + + @Override + public AcsTaskDto sendAcsParam(String taskId) { + SchBaseTask taskDao = taskService.getById(taskId); + + // 组织下发给acs的数据 + AcsTaskDto acsTaskDto = new AcsTaskDto(); + acsTaskDto.setExt_task_id(taskDao.getTask_id()); + acsTaskDto.setTask_code(taskDao.getTask_code()); + acsTaskDto.setStart_device_code(taskDao.getPoint_code1()); + acsTaskDto.setNext_device_code(taskDao.getPoint_code2()); + acsTaskDto.setPriority(taskDao.getPriority()); + acsTaskDto.setVehicle_code(taskDao.getVehicle_code()); + + acsTaskDto.setVehicle_type(IOSConstant.ONE); + acsTaskDto.setIs_wait(taskDao.getIs_wait()); + acsTaskDto.setTask_type(ACSTaskTypeEnum.CTU_TASK.getCode()); + + acsTaskDto.setPriority(IOSConstant.ONE); + acsTaskDto.setAgv_system_type(IOSConstant.THREE); + acsTaskDto.setIs_get_pause(IOSConstant.ZERO); + acsTaskDto.setIs_put_pause(IOSConstant.ZERO); + + return acsTaskDto; + } + + @Override + @Transactional + 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)) { + this.executingTask(taskObj); + 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 task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.finishTask(taskObj); + } + + @Override + @Transactional + 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 taskObj) { + // todo: 获取重量判断与记录的重量是否一样(判断上下幅度阈值,超过则不继续) + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("已完成"); + taskService.updateById(taskObj); + outBillService.taskFinish(taskObj); + // 创建上料任务 + JSONObject request = JSONObject.parseObject(taskObj.getRequest_param()); + // "ext":{"iostorinv_id":"2009532623130595328","point_code":"ZJZCZ01","target":"YPDJW01"} + JSONObject ext = request.getJSONObject("ext"); + // todo: 先固定包衣,后续改 + ext.put("config_code", "CoatingUpTask"); + ext.put("vehicle_code", taskObj.getVehicle_code()); + ext.put("material_qty", taskObj.getMaterial_qty()); + ext.put("material_name", taskObj.getMaterial_name()); + ext.put("material_id", taskObj.getMaterial_id()); + ext.put("pre_task_id", taskObj.getTask_id()); + ext.put("group_id", taskObj.getGroup_id()); + AbstractTask coatingUpTask = taskFactory.getTask("CoatingUpTask"); + coatingUpTask.create(ext); + this.taskConfirm(taskObj.getTask_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); + } + + @Override + public void taskConfirm(String task_code) { + // AGV任务做完才能删除 +// SchBaseTask taskObj = taskService.getByCode(task_code); +// +// // 删除组盘信息 +// groupPlateMapper.delete( +// new QueryWrapper().lambda() +// .eq(GroupPlate::getVehicle_code, taskObj.getVehicle_code()) +// .eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库")) +// ); + } +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PalletOutTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PalletOutTask.java index dc3443c..e3883dd 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PalletOutTask.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PalletOutTask.java @@ -100,7 +100,9 @@ public class PalletOutTask extends AbstractTask { // 点位上锁 structattrService.update(new LambdaUpdateWrapper() - .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("其他锁")) + .set(Structattr::getLock_type, ObjectUtil.isNotEmpty(json.get("flag")) + ? IOSEnum.LOCK_TYPE.code("其他锁") + : IOSEnum.LOCK_TYPE.code("出库锁")) .eq(Structattr::getStruct_code, task.getPoint_code1())); // 下发任务 @@ -123,7 +125,7 @@ public class PalletOutTask extends AbstractTask { acsTaskDto.setVehicle_type(IOSConstant.ONE); acsTaskDto.setIs_wait(taskDao.getIs_wait()); - acsTaskDto.setTask_type(ACSTaskTypeEnum.CTU_TASK.getCode()); + acsTaskDto.setTask_type(ACSTaskTypeEnum.AGV_TASK.getCode()); acsTaskDto.setPriority(IOSConstant.ONE); acsTaskDto.setAgv_system_type(IOSConstant.THREE); @@ -192,11 +194,16 @@ public class PalletOutTask extends AbstractTask { .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有箱有料")) .set(SchBasePoint::getIng_task_code, taskObj.getTask_id()) ); + JSONObject jsonObject = JSONObject.parseObject(taskObj.getRequest_param()); + if (ObjectUtil.isEmpty(jsonObject.get("flag"))) { + // 解锁、库存清空 + outBillService.taskFinish(taskObj); + this.taskConfirm(taskObj.getTask_code()); + } // 任务完成 taskObj.setTask_status(TaskStatus.FINISHED.getCode()); taskObj.setRemark("已完成"); taskService.updateById(taskObj); - this.taskConfirm(taskObj.getTask_code()); } @Transactional(rollbackFor = Exception.class) @@ -229,7 +236,6 @@ public class PalletOutTask extends AbstractTask { groupPlateMapper.delete( new QueryWrapper().lambda() .eq(GroupPlate::getVehicle_code, taskObj.getVehicle_code()) - .eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库")) ); } } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PalletizingAddTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PalletizingAddTask.java new file mode 100644 index 0000000..50f47b3 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PalletizingAddTask.java @@ -0,0 +1,175 @@ +package org.nl.wms.sch_manage.service.util.tasks; + +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 com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.CodeUtil; +import org.nl.common.utils.SecurityUtils; +import org.nl.config.IdUtil; +import org.nl.wms.basedata_manage.service.dao.Structattr; +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.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.ACSTaskTypeEnum; +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.PointUtils; +import org.nl.wms.warehouse_management.enums.IOSConstant; +import org.nl.wms.warehouse_management.enums.IOSEnum; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 码垛追加任务 + * @author: lyd + * @date: 2026/1/12 + */ +@Component("PalletizingAddTask") +public class PalletizingAddTask extends AbstractTask { + @Resource + private ISchBaseTaskService taskService; + @Resource + private ISchBasePointService pointService; + @Override + public String create(JSONObject json) { + SchBaseTask task = new SchBaseTask(); + task.setTask_id(IdUtil.getStringId()); + task.setTask_code(CodeUtil.getNewCode("TASK_CODE")); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setConfig_code(PalletizingAddTask.class.getSimpleName()); + task.setPoint_code1(json.getString("point_code1")); + task.setPoint_code2(json.getString("point_code2")); + task.setVehicle_code(json.getString("vehicle_code")); + task.setMaterial_id(json.getString("material_id")); + task.setMaterial_qty(json.getBigDecimal("material_qty")); + task.setGroup_id(json.getString("group_id")); + task.setRequest_param(json.toString()); + task.setPriority(json.getString("Priority")); + task.setTask_type(TaskEnum.TASK_TYPE.code("料箱")); + task.setIs_wait(json.getString("is_wait")); + task.setCreate_id(SecurityUtils.getCurrentUserId()); + task.setCreate_name(SecurityUtils.getCurrentNickName()); + task.setCreate_time(DateUtil.now()); + taskService.save(task); + // 下发任务 +// this.sendTaskOne(task.getTask_id()); + return task.getTask_id(); + } + + @Override + public AcsTaskDto sendAcsParam(String taskId) { + SchBaseTask taskDao = taskService.getById(taskId); + + // 组织下发给acs的数据 + AcsTaskDto acsTaskDto = new AcsTaskDto(); + acsTaskDto.setExt_task_id(taskDao.getTask_id()); + acsTaskDto.setTask_code(taskDao.getTask_code()); + acsTaskDto.setStart_device_code(taskDao.getPoint_code1()); + acsTaskDto.setNext_device_code(taskDao.getPoint_code2()); + acsTaskDto.setVehicle_code(taskDao.getVehicle_code()); + + acsTaskDto.setVehicle_type(IOSConstant.ONE); + acsTaskDto.setIs_wait(IOSConstant.ZERO); + acsTaskDto.setTask_type(ACSTaskTypeEnum.AGV_TASK.getCode()); + + acsTaskDto.setPriority(IOSConstant.ONE); + acsTaskDto.setAgv_system_type(IOSConstant.THREE); + acsTaskDto.setIs_get_pause(IOSConstant.ZERO); + acsTaskDto.setIs_put_pause(IOSConstant.ZERO); + + 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); + } + } + + public void cancelTask(SchBaseTask taskObj) { + + // 更新任务状态 + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setRemark("已取消"); + taskService.updateById(taskObj); + } + + @Transactional(rollbackFor = Exception.class) + public void finishTask(SchBaseTask taskObj) { + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("已完成"); + taskService.updateById(taskObj); + + // 更新 + pointService.update( + new UpdateWrapper().lambda() + .set(SchBasePoint::getVehicle_code, "") + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空位")) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) + .set(SchBasePoint::getIng_task_code, "") + ); + + // 更新 + pointService.update( + new UpdateWrapper().lambda() + .set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code()) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有箱有料")) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2()) + .set(SchBasePoint::getIng_task_code, "") + ); + } + + @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 taskConfirm(String task_code) { + + } +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PalletizingDownTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PalletizingDownTask.java new file mode 100644 index 0000000..ca38cea --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PalletizingDownTask.java @@ -0,0 +1,190 @@ +package org.nl.wms.sch_manage.service.util.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.CodeUtil; +import org.nl.common.utils.SecurityUtils; +import org.nl.config.IdUtil; +import org.nl.wms.basedata_manage.service.dao.Sectattr; +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.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.ACSTaskTypeEnum; +import org.nl.wms.sch_manage.service.util.AbstractTask; +import org.nl.wms.sch_manage.service.util.AcsTaskDto; +import org.nl.wms.warehouse_management.enums.IOSConstant; +import org.nl.wms.warehouse_management.enums.IOSEnum; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +/** + * 码垛下料 + * @author: lyd + * @date: 2026/1/9 + */ +@Component("PalletizingDownTask") +public class PalletizingDownTask extends AbstractTask { + @Resource + private ISchBasePointService pointService; + @Resource + private ISchBaseTaskService taskService; + @Resource(name = "PalletizingAddTask") + private PalletizingAddTask palletizingAddTask; + @Override + public String create(JSONObject json) { + // 查找空闲的内外中转点 + List list = pointService.getNoTaskPointByRegionAndType("AGVZJZ01", "1", "1"); + if (list.size() == 0) { + throw new BadRequestException("没有可用的内外中转点!"); + } + SchBasePoint point = list.get(0); + SchBaseTask task = new SchBaseTask(); + task.setTask_id(IdUtil.getStringId()); + task.setTask_code(CodeUtil.getNewCode("TASK_CODE")); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setConfig_code(PalletizingDownTask.class.getSimpleName()); + task.setPoint_code1(json.getString("device_code")); + task.setPoint_code2(point.getPoint_code()); + task.setVehicle_code(json.getString("vehicle_code")); + task.setMaterial_id(json.getString("material_id")); + task.setMaterial_qty(json.getBigDecimal("material_qty")); + task.setGroup_id(json.getString("group_id")); + task.setRequest_param(json.toString()); + task.setPriority(json.getString("Priority")); + task.setTask_type(TaskEnum.TASK_TYPE.code("料箱")); + task.setIs_wait(json.getString("is_wait")); + task.setCreate_id(SecurityUtils.getCurrentUserId()); + task.setCreate_name(SecurityUtils.getCurrentNickName()); + task.setCreate_time(DateUtil.now()); + taskService.save(task); + // 下发任务 +// this.sendTaskOne(task.getTask_id()); + return task.getTask_id(); + } + + @Override + public AcsTaskDto sendAcsParam(String taskId) { + SchBaseTask taskDao = taskService.getById(taskId); + + // 组织下发给acs的数据 + AcsTaskDto acsTaskDto = new AcsTaskDto(); + acsTaskDto.setExt_task_id(taskDao.getTask_id()); + acsTaskDto.setTask_code(taskDao.getTask_code()); + acsTaskDto.setStart_device_code(taskDao.getPoint_code1()); + acsTaskDto.setNext_device_code(taskDao.getPoint_code2()); + acsTaskDto.setVehicle_code(taskDao.getVehicle_code()); + + acsTaskDto.setVehicle_type(IOSConstant.ONE); + acsTaskDto.setIs_wait(IOSConstant.ZERO); + acsTaskDto.setTask_type(ACSTaskTypeEnum.AGV_TASK.getCode()); + + acsTaskDto.setPriority(IOSConstant.ONE); + acsTaskDto.setAgv_system_type(IOSConstant.THREE); + acsTaskDto.setIs_get_pause(IOSConstant.ZERO); + acsTaskDto.setIs_put_pause(IOSConstant.ZERO); + + 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); + } + } + + public void cancelTask(SchBaseTask taskObj) { + + // 更新任务状态 + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setRemark("已取消"); + taskService.updateById(taskObj); + } + + @Transactional(rollbackFor = Exception.class) + public void finishTask(SchBaseTask taskObj) { + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("已完成"); + taskService.updateById(taskObj); + // 更新 + pointService.update( + new UpdateWrapper().lambda() + .set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code()) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有箱有料")) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2()) + .set(SchBasePoint::getIng_task_code, "") + ); + // 创建出去缠绕机或者空点位 + List pointList = pointService.getCRUsedDevice(); + if (pointList.size() == 0) { + // 查找空位置, todo: 先不考虑二次分配 + pointList = pointService.getNoTaskPointByRegionAndType("CRHCQ", "1", "1"); + } + if (pointList.size() == 0) { + throw new BadRequestException("找不到可存放的空位!"); + } + SchBasePoint point = pointList.get(0); + JSONObject taskParam = new JSONObject(); + taskParam.put("point_code1", taskObj.getPoint_code2()); + taskParam.put("point_code2", point.getPoint_code()); + taskParam.put("vehicle_code", taskObj.getVehicle_code()); + taskParam.put("material_id", taskObj.getMaterial_id()); + taskParam.put("material_qty", taskObj.getMaterial_qty()); + taskParam.put("group_id", taskObj.getGroup_id()); + palletizingAddTask.create(taskParam); + } + + @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 taskConfirm(String task_code) { + + } +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PreProcessingInTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PreProcessingInTask.java index cdb57fe..4c41146 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PreProcessingInTask.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PreProcessingInTask.java @@ -46,6 +46,7 @@ public class PreProcessingInTask extends AbstractTask { @Override public String create(JSONObject json) { // 获取终点 + // 考虑提供的室区域还是库区 List points = pointService.getCanUsePointByRegion(json.getString("sect_code")); if (ObjectUtil.isEmpty(points)) { throw new BadRequestException("暂无可用点位!"); @@ -88,7 +89,7 @@ public class PreProcessingInTask extends AbstractTask { acsTaskDto.setVehicle_type(IOSConstant.ONE); acsTaskDto.setIs_wait(IOSConstant.ZERO); - acsTaskDto.setTask_type(ACSTaskTypeEnum.CTU_TASK.getCode()); + acsTaskDto.setTask_type(ACSTaskTypeEnum.AGV_TASK.getCode()); acsTaskDto.setPriority(IOSConstant.ONE); acsTaskDto.setAgv_system_type(IOSConstant.THREE); diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/ProduceInTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/ProduceInTask.java new file mode 100644 index 0000000..c8d9651 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/ProduceInTask.java @@ -0,0 +1,189 @@ +package org.nl.wms.sch_manage.service.util.tasks; + +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 com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.CodeUtil; +import org.nl.common.utils.SecurityUtils; +import org.nl.config.IdUtil; +import org.nl.wms.basedata_manage.enums.BaseDataEnum; +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.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.ACSTaskTypeEnum; +import org.nl.wms.sch_manage.service.util.AbstractTask; +import org.nl.wms.sch_manage.service.util.AcsTaskDto; +import org.nl.wms.warehouse_management.enums.IOSConstant; +import org.nl.wms.warehouse_management.enums.IOSEnum; +import org.nl.wms.warehouse_management.service.IRawAssistIStorService; +import org.nl.wms.warehouse_management.service.dao.IOStorInvDis; +import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvDisMapper; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +/** + * 生产入库:粉碎入库 + * @author: lyd + * @date: 2026/1/8 + */ +@Component("ProduceInTask") +public class ProduceInTask extends AbstractTask { + @Resource + private ISchBaseTaskService taskService; + @Resource + private IRawAssistIStorService rawAssistIStorService; + + @Resource + private IOStorInvDisMapper ioStorInvDisMapper; + @Resource + private ISchBasePointService pointService; + @Override + public String create(JSONObject json) { + SchBaseTask task = new SchBaseTask(); + task.setTask_id(IdUtil.getStringId()); + task.setTask_code(CodeUtil.getNewCode("TASK_CODE")); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setConfig_code(ProduceInTask.class.getSimpleName()); + task.setPoint_code1(json.getString("point_code1")); + task.setPoint_code2(json.getString("point_code2")); + task.setVehicle_code(json.getString("vehicle_code")); + task.setMaterial_id(json.getString("material_id")); + task.setMaterial_qty(json.getBigDecimal("material_qty")); + task.setGroup_id(json.getString("group_id")); + task.setRequest_param(json.toString()); + task.setTask_type(TaskEnum.TASK_TYPE.code("料箱")); + task.setPriority(json.getString("Priority")); + task.setIs_wait(json.getString("is_wait")); + task.setCreate_id(SecurityUtils.getCurrentUserId()); + task.setCreate_name(SecurityUtils.getCurrentNickName()); + task.setCreate_time(DateUtil.now()); + taskService.save(task); + + // 下发任务 +// this.sendTaskOne(task.getTask_id()); + return task.getTask_id(); + } + + @Override + public AcsTaskDto sendAcsParam(String taskId) { + SchBaseTask taskDao = taskService.getById(taskId); + + // 组织下发给acs的数据 + AcsTaskDto acsTaskDto = new AcsTaskDto(); + acsTaskDto.setExt_task_id(taskDao.getTask_id()); + acsTaskDto.setTask_code(taskDao.getTask_code()); + acsTaskDto.setStart_device_code(taskDao.getPoint_code1()); + acsTaskDto.setNext_device_code(taskDao.getPoint_code2()); + acsTaskDto.setVehicle_code(taskDao.getVehicle_code()); + + acsTaskDto.setVehicle_type(IOSConstant.ONE); + acsTaskDto.setIs_wait(IOSConstant.ZERO); + acsTaskDto.setTask_type(ACSTaskTypeEnum.AGV_TASK.getCode()); + + acsTaskDto.setPriority(IOSConstant.ONE); + acsTaskDto.setAgv_system_type(IOSConstant.THREE); + acsTaskDto.setIs_get_pause(IOSConstant.ZERO); + acsTaskDto.setIs_put_pause(IOSConstant.ZERO); + + 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); + } + } + + @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); + } + + @Transactional(rollbackFor = Exception.class) + public void finishTask(SchBaseTask taskObj) { + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("已完成"); + taskService.updateById(taskObj); + rawAssistIStorService.taskFinish(taskObj); + // 更新起点 + pointService.update( + new UpdateWrapper().lambda() + .set(SchBasePoint::getVehicle_code, "") + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空位")) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) + .set(SchBasePoint::getIng_task_code, "") + ); + } + + @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 taskConfirm(String task_code) { + + } +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/RawInTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/RawInTask.java index d0b9bc4..7140dc0 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/RawInTask.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/RawInTask.java @@ -26,6 +26,7 @@ import org.nl.wms.warehouse_management.service.IRawAssistIStorService; import org.nl.wms.warehouse_management.service.dao.IOStorInvDis; import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvDisMapper; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; @@ -87,7 +88,7 @@ public class RawInTask extends AbstractTask { acsTaskDto.setVehicle_type(IOSConstant.ONE); acsTaskDto.setIs_wait(IOSConstant.ZERO); - acsTaskDto.setTask_type(ACSTaskTypeEnum.CTU_TASK.getCode()); + acsTaskDto.setTask_type(ACSTaskTypeEnum.AGV_TASK.getCode()); acsTaskDto.setPriority(IOSConstant.ONE); acsTaskDto.setAgv_system_type(IOSConstant.THREE); @@ -121,6 +122,7 @@ public class RawInTask extends AbstractTask { } } + @Transactional(rollbackFor = Exception.class) public void cancelTask(SchBaseTask taskObj) { // 取消任务 taskService.update(new LambdaUpdateWrapper() @@ -144,6 +146,7 @@ public class RawInTask extends AbstractTask { taskService.updateById(taskObj); } + @Transactional(rollbackFor = Exception.class) public void finishTask(SchBaseTask taskObj) { // 任务完成 taskObj.setTask_status(TaskStatus.FINISHED.getCode()); diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/TabletingInTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/TabletingInTask.java index f1bbfc4..9d1f86a 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/TabletingInTask.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/TabletingInTask.java @@ -29,13 +29,14 @@ import org.nl.wms.warehouse_management.enums.IOSEnum; import org.nl.wms.warehouse_management.service.IRawAssistIStorService; import org.nl.wms.warehouse_management.service.dao.IOStorInvDis; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; import java.util.Map; /** - * 压片入库 + * 压片/包衣入库 * @Author: lyd * @Date: 2025/12/4 */ @@ -66,9 +67,9 @@ public class TabletingInTask extends AbstractTask { throw new BadRequestException("该载具未存在组桶信息,请先组桶!"); } // 找一个没任务的称重位 - List czws = pointService.getCanUsePointByRegion("ZZC01"); + List czws = pointService.getCanUsePointByRegion("ZJZ01"); if (czws.size() == 0) { - throw new BadRequestException("找不到中转区的称重位!"); + throw new BadRequestException("找不到中间站的称重位!"); } JSONObject jsonObject = bucket.get(0); SchBasePoint point = czws.get(0); @@ -110,7 +111,7 @@ public class TabletingInTask extends AbstractTask { acsTaskDto.setVehicle_type(IOSConstant.ONE); acsTaskDto.setIs_wait(IOSConstant.ZERO); - acsTaskDto.setTask_type(ACSTaskTypeEnum.CTU_TASK.getCode()); + acsTaskDto.setTask_type(ACSTaskTypeEnum.AGV_TASK.getCode()); acsTaskDto.setPriority(IOSConstant.ONE); acsTaskDto.setAgv_system_type(IOSConstant.THREE); @@ -144,14 +145,7 @@ public class TabletingInTask extends AbstractTask { } } - private 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()) - ); + public void cancelTask(SchBaseTask taskObj) { // 更新任务状态 taskObj.setTask_status(TaskStatus.CANCELED.getCode()); @@ -159,7 +153,8 @@ public class TabletingInTask extends AbstractTask { taskService.updateById(taskObj); } - private void finishTask(SchBaseTask taskObj) { + @Transactional(rollbackFor = Exception.class) + public void finishTask(SchBaseTask taskObj) { // 任务完成 taskObj.setTask_status(TaskStatus.FINISHED.getCode()); taskObj.setRemark("已完成"); @@ -169,10 +164,16 @@ public class TabletingInTask extends AbstractTask { new UpdateWrapper().lambda() .set(SchBasePoint::getVehicle_code, "") .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空位")) - .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) + .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(SchBasePoint::getUpdate_time, DateUtil.now()) + .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) .set(SchBasePoint::getIng_task_code, "") + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) ); SchBasePoint startPoint = pointService.getByPointCode(taskObj.getPoint_code2(), false); + if (ObjectUtil.isEmpty(startPoint.getIn_sect())) { + throw new BadRequestException("入库库区设置不能为空!"); + } // todo: 获取重量 groupbucketService.upDateWeight("26.8", taskObj.getVehicle_code()); JSONObject param = new JSONObject(); diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/WrappingDownTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/WrappingDownTask.java new file mode 100644 index 0000000..a1867f0 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/WrappingDownTask.java @@ -0,0 +1,193 @@ +package org.nl.wms.sch_manage.service.util.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.CodeUtil; +import org.nl.common.utils.SecurityUtils; +import org.nl.config.IdUtil; +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.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.ACSTaskTypeEnum; +import org.nl.wms.sch_manage.service.util.AbstractTask; +import org.nl.wms.sch_manage.service.util.AcsTaskDto; +import org.nl.wms.warehouse_management.enums.IOSConstant; +import org.nl.wms.warehouse_management.enums.IOSEnum; +import org.nl.wms.warehouse_management.service.IMdPbGroupplateService; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.List; + +/** + * + * @author: lyd + * @date: 2026/1/12 + */ +@Component("WrappingDownTask") +public class WrappingDownTask extends AbstractTask { + @Resource + private ISchBasePointService pointService; + @Resource + private ISchBaseTaskService taskService; + @Resource + private IMdPbGroupplateService groupplateService; + @Override + public String create(JSONObject json) { + // 查找空闲的需要缠绕的点 + List list = pointService.getNoTaskPointByRegionAndType("CRHCQ", "4", "1"); + if (list.size() == 0) { + throw new BadRequestException("没有需要缠绕的点!"); + } + SchBasePoint basePoint = list.get(0); + SchBasePoint parentPoint = pointService.getById(json.getString("device_code")); + SchBasePoint point = pointService.getById(parentPoint.getParent_point_code()); + List palletViewByVehicleCode = groupplateService.getPalletViewByVehicleCode(point.getVehicle_code(), Collections.singletonList("1")); + if (palletViewByVehicleCode.size() == 0) { + throw new BadRequestException("托盘信息不存在!"); + } + JSONObject jsonObject = palletViewByVehicleCode.get(0); + SchBaseTask task = new SchBaseTask(); + task.setTask_id(IdUtil.getStringId()); + task.setTask_code(CodeUtil.getNewCode("TASK_CODE")); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setConfig_code(WrappingDownTask.class.getSimpleName()); + task.setPoint_code1(json.getString("device_code")); + task.setPoint_code2(basePoint.getPoint_code()); + task.setPoint_code3(parentPoint.getPoint_code()); + task.setVehicle_code(point.getVehicle_code()); + task.setMaterial_id(jsonObject.getString("material_id")); + task.setMaterial_qty(jsonObject.getBigDecimal("qty")); + task.setGroup_id(jsonObject.getString("group_id")); + task.setRequest_param(json.toString()); + task.setPriority(json.getString("Priority")); + task.setTask_type(TaskEnum.TASK_TYPE.code("料箱")); + task.setIs_wait(json.getString("is_wait")); + task.setCreate_id(SecurityUtils.getCurrentUserId()); + task.setCreate_name(SecurityUtils.getCurrentNickName()); + task.setCreate_time(DateUtil.now()); + taskService.save(task); + // 下发任务 +// this.sendTaskOne(task.getTask_id()); + return task.getTask_id(); + } + + @Override + public AcsTaskDto sendAcsParam(String taskId) { + SchBaseTask taskDao = taskService.getById(taskId); + + // 组织下发给acs的数据 + AcsTaskDto acsTaskDto = new AcsTaskDto(); + acsTaskDto.setExt_task_id(taskDao.getTask_id()); + acsTaskDto.setTask_code(taskDao.getTask_code()); + acsTaskDto.setStart_device_code(taskDao.getPoint_code1()); + acsTaskDto.setNext_device_code(taskDao.getPoint_code2()); + acsTaskDto.setVehicle_code(taskDao.getVehicle_code()); + + acsTaskDto.setVehicle_type(IOSConstant.ONE); + acsTaskDto.setIs_wait(IOSConstant.ZERO); + acsTaskDto.setTask_type(ACSTaskTypeEnum.AGV_TASK.getCode()); + + acsTaskDto.setPriority(IOSConstant.ONE); + acsTaskDto.setAgv_system_type(IOSConstant.THREE); + acsTaskDto.setIs_get_pause(IOSConstant.ZERO); + acsTaskDto.setIs_put_pause(IOSConstant.ZERO); + + 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); + } + } + + public void cancelTask(SchBaseTask taskObj) { + + // 更新任务状态 + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setRemark("已取消"); + taskService.updateById(taskObj); + } + + @Transactional(rollbackFor = Exception.class) + public void finishTask(SchBaseTask taskObj) { + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("已完成"); + taskService.updateById(taskObj); + // 更新 + pointService.update( + new UpdateWrapper().lambda() + .set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code()) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有箱有料")) + .set(SchBasePoint::getUpdate_time, DateUtil.now()) + .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) + .set(SchBasePoint::getIng_task_code, "") + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2()) + ); + pointService.update( + new UpdateWrapper().lambda() + .set(SchBasePoint::getVehicle_code, "") + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空位")) + .set(SchBasePoint::getUpdate_time, DateUtil.now()) + .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) + .set(SchBasePoint::getIng_task_code, "") + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code3()) + ); + } + + @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 taskConfirm(String task_code) { + + } +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/WrappingUpTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/WrappingUpTask.java new file mode 100644 index 0000000..4659d77 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/WrappingUpTask.java @@ -0,0 +1,191 @@ +package org.nl.wms.sch_manage.service.util.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.CodeUtil; +import org.nl.common.utils.SecurityUtils; +import org.nl.config.IdUtil; +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.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.ACSTaskTypeEnum; +import org.nl.wms.sch_manage.service.util.AbstractTask; +import org.nl.wms.sch_manage.service.util.AcsTaskDto; +import org.nl.wms.warehouse_management.enums.IOSConstant; +import org.nl.wms.warehouse_management.enums.IOSEnum; +import org.nl.wms.warehouse_management.service.IMdPbGroupplateService; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * + * @author: lyd + * @date: 2026/1/12 + */ +@Component("WrappingUpTask") +public class WrappingUpTask extends AbstractTask { + @Resource + private ISchBasePointService pointService; + @Resource + private ISchBaseTaskService taskService; + @Resource + private IMdPbGroupplateService groupplateService; + + @Override + public String create(JSONObject json) { + // 查找空闲的需要缠绕的点 + List list = pointService.getNoTaskPointByRegionAndType("CRHCQ", "1", "2"); + if (list.size() == 0) { + throw new BadRequestException("没有需要缠绕的点!"); + } + SchBasePoint basePoint = list.get(0); + List palletViewByVehicleCode = groupplateService.getPalletViewByVehicleCode(basePoint.getVehicle_code(), Collections.singletonList("1")); + if (palletViewByVehicleCode.size() == 0) { + throw new BadRequestException("托盘信息不存在!"); + } + JSONObject jsonObject = palletViewByVehicleCode.get(0); + SchBaseTask task = new SchBaseTask(); + task.setTask_id(IdUtil.getStringId()); + task.setTask_code(CodeUtil.getNewCode("TASK_CODE")); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setConfig_code(WrappingUpTask.class.getSimpleName()); + task.setPoint_code1(basePoint.getPoint_code()); + task.setPoint_code2(json.getString("device_code")); + task.setVehicle_code(basePoint.getVehicle_code()); + task.setMaterial_id(jsonObject.getString("material_id")); + task.setMaterial_qty(jsonObject.getBigDecimal("qty")); + task.setGroup_id(jsonObject.getString("group_id")); + task.setRequest_param(json.toString()); + task.setPriority(json.getString("Priority")); + task.setTask_type(TaskEnum.TASK_TYPE.code("料箱")); + task.setIs_wait(json.getString("is_wait")); + task.setCreate_id(SecurityUtils.getCurrentUserId()); + task.setCreate_name(SecurityUtils.getCurrentNickName()); + task.setCreate_time(DateUtil.now()); + taskService.save(task); + // 下发任务 +// this.sendTaskOne(task.getTask_id()); + return task.getTask_id(); + } + + @Override + public AcsTaskDto sendAcsParam(String taskId) { + SchBaseTask taskDao = taskService.getById(taskId); + + // 组织下发给acs的数据 + AcsTaskDto acsTaskDto = new AcsTaskDto(); + acsTaskDto.setExt_task_id(taskDao.getTask_id()); + acsTaskDto.setTask_code(taskDao.getTask_code()); + acsTaskDto.setStart_device_code(taskDao.getPoint_code1()); + acsTaskDto.setNext_device_code(taskDao.getPoint_code2()); + acsTaskDto.setVehicle_code(taskDao.getVehicle_code()); + + acsTaskDto.setVehicle_type(IOSConstant.ONE); + acsTaskDto.setIs_wait(IOSConstant.ZERO); + acsTaskDto.setTask_type(ACSTaskTypeEnum.AGV_TASK.getCode()); + + acsTaskDto.setPriority(IOSConstant.ONE); + acsTaskDto.setAgv_system_type(IOSConstant.THREE); + acsTaskDto.setIs_get_pause(IOSConstant.ZERO); + acsTaskDto.setIs_put_pause(IOSConstant.ZERO); + + 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); + } + } + + public void cancelTask(SchBaseTask taskObj) { + + // 更新任务状态 + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setRemark("已取消"); + taskService.updateById(taskObj); + } + + @Transactional(rollbackFor = Exception.class) + public void finishTask(SchBaseTask taskObj) { + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("已完成"); + taskService.updateById(taskObj); + // 更新 + pointService.update( + new UpdateWrapper().lambda() + .set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code()) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有箱有料")) + .set(SchBasePoint::getIng_task_code, "") + .set(SchBasePoint::getUpdate_time, DateUtil.now()) + .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2()) + );pointService.update( + new UpdateWrapper().lambda() + .set(SchBasePoint::getVehicle_code, "") + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空位")) + .set(SchBasePoint::getIng_task_code, "") + .set(SchBasePoint::getUpdate_time, DateUtil.now()) + .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) + .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) + ); + } + + @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 taskConfirm(String task_code) { + + } +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java index a1606ff..3f9e765 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java @@ -35,12 +35,15 @@ public enum IOSEnum { "原辅料入库", "0001", "剩料回库", "0002", "中间站入库", "0003", - "直接入库", "0004" + "直接入库", "0004", + "粉碎入库", "0005" )), // 出库业务类型 OUT_BILL_TYPE(MapOf.of("手工出库", "1009", "原辅料出库", "1001", + "批料出库", "1002", + "料桶出库", "1003", "直接出库", "1099" )), @@ -52,15 +55,21 @@ public enum IOSEnum { // 入库任务配置类编码 IN_CONFIG_CODE(MapOf.of("0009", "HandInTask", - "0001", "RawInTask", "0002", "RawInTask", "0003", "CenterInTask" + "0001", "RawInTask", + "0002", "RawInTask", + "0003", "CenterInTask", + "0005", "ProduceInTask" )), // 出库任务配置类编码 OUT_CONFIG_CODE(MapOf.of( "1009", "HandOutTask", - "1001", "CallMaterialTask" + "1001", "CallMaterialTask", + "1002", "PalletOutTask", + "1003", "IntermediateOutTask" )), // 下料任务配置编码 - DOWN_CONFIG_CODE(MapOf.of("YPQ", "TabletingInTask" + DOWN_CONFIG_CODE(MapOf.of("YPQ", "TabletingInTask", + "BYQ", "TabletingInTask" )), // 移库任务配置类编码 MOVE_CONFIG_CODE(MapOf.of("2001","InsideMoveTask", "2004", "CheckMoveTask" diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/IMdPbGroupplateService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/IMdPbGroupplateService.java index e81d9a0..2e82798 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/IMdPbGroupplateService.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/IMdPbGroupplateService.java @@ -1,5 +1,6 @@ package org.nl.wms.warehouse_management.service; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; @@ -129,4 +130,5 @@ public interface IMdPbGroupplateService extends IService { * @return String 袋码 */ String createBagCode(String material_id); + JSONArray getDtLMaterialInfo(String vehicleCode, String materialId, String pcsn); } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/IOutBillService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/IOutBillService.java index fcac11a..3649d41 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/IOutBillService.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/IOutBillService.java @@ -180,7 +180,7 @@ public interface IOutBillService extends IService { * @param point_code 出库点位 * @param ioStorInv 主表实体类 */ - void createTask(IOStorInvDis ioStorInvDis, String point_code, IOStorInv ioStorInv); + void createTask(IOStorInvDis ioStorInvDis, String point_code, IOStorInv ioStorInv, JSONObject ext); List getCanuseSpecifiedIvt(Map param); diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/MdPbGroupplateMapper.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/MdPbGroupplateMapper.java index 6e630e7..348eeab 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/MdPbGroupplateMapper.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/MdPbGroupplateMapper.java @@ -1,5 +1,6 @@ package org.nl.wms.warehouse_management.service.dao.mapper; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -70,6 +71,8 @@ public interface MdPbGroupplateMapper extends BaseMapper { List getStockGroupInfo(JSONObject param); + JSONArray getDtLMaterialInfo(String vehicleCode, String materialId, String pcsn); + /** * 手持 * 组盘 - 获取袋信息 diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/MdPbGroupplateMapper.xml b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/MdPbGroupplateMapper.xml index bd28955..5220a66 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/MdPbGroupplateMapper.xml +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/MdPbGroupplateMapper.xml @@ -199,7 +199,8 @@ LEFT JOIN md_pb_storagevehicleext e ON ss.storagevehicle_code = e.storagevehicle_code WHERE IFNULL(ss.storagevehicle_code,'') ]]> '' - + AND IFNULL( mg.group_id, '' ) ]]> '' + AND mg.material_id = #{material_id} @@ -207,10 +208,16 @@ AND mg.pcsn = #{pcsn} - - AND - ss.sect_code = #{sect_code} - + +