From 72ad55b1c9bc0d066d87b4eb39f02d204c68ffce Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Thu, 8 Jan 2026 20:00:35 +0800 Subject: [PATCH 1/3] =?UTF-8?q?opt:=20=E5=8E=8B=E7=89=87=E5=89=8D=E6=AE=B5?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/IMdMeMaterialbaseService.java | 1 + .../service/PdaBuildParamService.java | 7 +- .../impl/DefaultPdaBuildParamService.java | 55 ++--- .../impl/PdaProductionServiceImpl.java | 114 ++++++++++- .../service/util/tasks/PalletOutTask.java | 11 +- .../util/tasks/PreProcessingInTask.java | 3 +- .../service/util/tasks/ProduceInTask.java | 189 ++++++++++++++++++ .../service/util/tasks/RawInTask.java | 5 +- .../warehouse_management/enums/IOSEnum.java | 11 +- .../service/IMdPbGroupplateService.java | 3 + .../dao/mapper/MdPbGroupplateMapper.java | 3 + .../dao/mapper/MdPbGroupplateMapper.xml | 14 +- .../impl/MdPbGroupplateServiceImpl.java | 6 + 13 files changed, 375 insertions(+), 47 deletions(-) create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/ProduceInTask.java 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/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 4ccca18..96810f9 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; @@ -49,12 +50,12 @@ public interface PdaBuildParamService { /** * 构建出库单参数 * @param param - * @param sectattr + * @param storId * @return */ - JSONObject doBuildOutInvObj(JSONObject param, Sectattr sectattr); + JSONObject doBuildOutInvObj(JSONObject param, String storId); - JSONObject buildManuaOutDivData(JSONObject param, Sectattr outStructAttr, String invId); + JSONObject buildManuaOutDivData(JSONObject param, Sectattr outStructAttr, IOStorInvDtlDto ioStorInvDtlDto); JSONObject buildOutAllSetData(SchBasePoint endPoint, String invId); 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 f5b367e..2d26f4e 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 @@ -33,6 +33,7 @@ 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.IOStorInvDisDto; +import org.nl.wms.warehouse_management.service.dto.IOStorInvDtlDto; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -163,26 +164,25 @@ public class DefaultPdaBuildParamService implements PdaBuildParamService { } @Override - public JSONObject doBuildOutInvObj(JSONObject param, Sectattr sectattr) { + public JSONObject doBuildOutInvObj(JSONObject param, String storId) { JSONObject insertInvObj = new JSONObject(); JSONArray rows = param.getJSONArray("rows"); - JSONObject row = rows.getJSONObject(0); List result = filterAndSumByMaterialIdAndPcsn(rows); 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,27 +224,28 @@ public class DefaultPdaBuildParamService implements PdaBuildParamService { } @Override - public JSONObject buildManuaOutDivData(JSONObject param, Sectattr outStructAttr, String invId) { + public JSONObject buildManuaOutDivData(JSONObject param, Sectattr outStructAttr, 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; } 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..27f2927 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,6 +1,7 @@ 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; @@ -41,6 +42,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; @@ -111,22 +113,21 @@ 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); } @Override + @Transactional(rollbackFor = Exception.class) public PdaResponse confirmCallMaterial(JSONObject param) { + // hint: 没有创建出库单 // point_code, row,sect_code log.info("手持托盘叫料:{}", param); if (ObjectUtil.isEmpty(param.get("point_code"))) { @@ -140,12 +141,47 @@ 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_code1, 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()); + String invId = outBillService.insertDtl(invObj); + Sectattr sectattr = sectattrService.findByCode(structattr.getSect_code(), false); + // 2 循环,根据插入的dtl 去寻找袋的组盘信息调用手动分配 + List billDtl = outBillService.getOutBillDtl(MapUtil.of("iostorinv_id", invId)); + for (IOStorInvDtlDto ioStorInvDtlDto : billDtl) { + JSONObject divObj = defaultPdaBuildParam.buildManuaOutDivData(param, sectattr, 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 +441,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 +468,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 +489,55 @@ public class PdaProductionServiceImpl implements PdaProductionService { if (ObjectUtil.isEmpty(point)) { throw new BadRequestException("点位[" + pointCode +"]不存在!"); } + if (point.getRegion_code().startsWith("FSSQ")) { + // 粉碎室入库逻辑 + 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 +557,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 +570,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); 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..fb326f5 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,6 +194,11 @@ 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); + } // 任务完成 taskObj.setTask_status(TaskStatus.FINISHED.getCode()); taskObj.setRemark("已完成"); 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/warehouse_management/enums/IOSEnum.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java index 02b76b2..7142cca 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,14 @@ public enum IOSEnum { "原辅料入库", "0001", "剩料回库", "0002", "中间站入库", "0003", - "直接入库", "0004" + "直接入库", "0004", + "粉碎入库", "0005" )), // 出库业务类型 OUT_BILL_TYPE(MapOf.of("手工出库", "1009", "原辅料出库", "1001", + "批料出库", "1002", "直接出库", "1099" )), @@ -52,12 +54,15 @@ 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" )), // 下料任务配置编码 DOWN_CONFIG_CODE(MapOf.of("YPQ", "TabletingInTask" 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 70e0165..9c543c4 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; @@ -113,4 +114,6 @@ public interface IMdPbGroupplateService extends IService { * @return List */ List queryMaterList(); + + 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.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/MdPbGroupplateMapper.java index 790da2e..8202ca7 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; @@ -69,4 +70,6 @@ public interface MdPbGroupplateMapper extends BaseMapper { List getPalletViewByVehicleCode(String search, List status); 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 ee0df56..b100b52 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 @@ -207,9 +207,15 @@ AND mg.pcsn = #{pcsn} - - AND - ss.sect_code = #{sect_code} - + + diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/MdPbGroupplateServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/MdPbGroupplateServiceImpl.java index c6b248c..d7ec860 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/MdPbGroupplateServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/MdPbGroupplateServiceImpl.java @@ -2,6 +2,7 @@ package org.nl.wms.warehouse_management.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -212,4 +213,9 @@ public class MdPbGroupplateServiceImpl extends ServiceImpl Date: Fri, 9 Jan 2026 16:42:16 +0800 Subject: [PATCH 2/3] =?UTF-8?q?opt:=20=E5=8C=85=E8=A1=A3=E5=89=8D=E6=AE=B5?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/IMdPdGroupbucketService.java | 7 + .../dao/mapper/MdPdGroupbucketMapper.java | 2 + .../dao/mapper/MdPdGroupbucketMapper.xml | 27 ++ .../impl/MdPdGroupbucketServiceImpl.java | 6 + .../controller/PdaProductionController.java | 12 + .../service/PdaBuildParamService.java | 11 +- .../service/PdaProductionService.java | 14 + .../impl/DefaultPdaBuildParamService.java | 39 ++- .../service/impl/PdaCommonServiceImpl.java | 4 + .../impl/PdaProductionServiceImpl.java | 80 +++++- .../service/util/tasks/CoatingUpTask.java | 83 ++++++ .../util/tasks/IntermediateOutTask.java | 239 ++++++++++++++++++ .../service/util/tasks/PalletOutTask.java | 3 +- .../service/util/tasks/TabletingInTask.java | 15 +- .../warehouse_management/enums/IOSEnum.java | 5 +- .../service/IOutBillService.java | 2 +- .../dao/mapper/MdPbGroupplateMapper.xml | 3 +- .../service/impl/OutBillServiceImpl.java | 5 +- 18 files changed, 526 insertions(+), 31 deletions(-) create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/CoatingUpTask.java create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/IntermediateOutTask.java 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 8c7e9de..7056480 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 @@ -24,4 +24,11 @@ public interface IMdPdGroupbucketService extends IService { List getBucketInfoByBucket(String vehicleCode); void upDateWeight(String weight, String vehicleCode); + + /** + * 获取料桶信息 + * @param param:material_id, pcsn + * @return + */ + 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 70d0fa1..cabc4f6 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 @@ -19,4 +19,6 @@ public interface MdPdGroupbucketMapper extends BaseMapper { List getBucketInfoByBucket(String vehicleCode); void upDateWeight(String weight, String vehicleCode); + + 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 3ba1d9e..4f3b8ef 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 @@ -22,4 +22,31 @@ WHERE g.bucket_code = #{vehicleCode} + 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 621292f..87b474c 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 @@ -7,6 +7,7 @@ import org.nl.wms.basedata_manage.service.dao.MdPdGroupbucket; import org.nl.wms.basedata_manage.service.dao.mapper.MdPdGroupbucketMapper; import org.springframework.stereotype.Service; +import java.util.Collections; import java.util.List; /** @@ -29,4 +30,9 @@ public class MdPdGroupbucketServiceImpl extends ServiceImpl 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..657d38d 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,16 @@ 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); + } } 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 6597520..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 @@ -49,13 +49,14 @@ public interface PdaBuildParamService { /** * 构建出库单参数 - * @param param - * @param storId + * @param param 参数 + * @param storId 仓库id + * @param flag 是否过滤物料 * @return */ - JSONObject doBuildOutInvObj(JSONObject param, String storId); + JSONObject doBuildOutInvObj(JSONObject param, String storId, Boolean flag); - JSONObject buildManuaOutDivData(JSONObject param, Sectattr outStructAttr, IOStorInvDtlDto ioStorInvDtlDto); + JSONObject buildManuaOutDivData(JSONObject param, IOStorInvDtlDto ioStorInvDtlDto); JSONObject buildOutAllSetData(SchBasePoint endPoint, String invId); @@ -79,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..923f5d7 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,18 @@ 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); } 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 a8d39ef..5b2065f 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; @@ -181,10 +182,10 @@ public class DefaultPdaBuildParamService implements PdaBuildParamService { } @Override - public JSONObject doBuildOutInvObj(JSONObject param, String storId) { + public JSONObject doBuildOutInvObj(JSONObject param, String storId, Boolean flag) { JSONObject insertInvObj = new JSONObject(); JSONArray rows = param.getJSONArray("rows"); - 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", rowObj.getString("stor_id") @@ -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,7 +242,7 @@ public class DefaultPdaBuildParamService implements PdaBuildParamService { } @Override - public JSONObject buildManuaOutDivData(JSONObject param, Sectattr outStructAttr, IOStorInvDtlDto ioStorInvDtlDto) { + public JSONObject buildManuaOutDivData(JSONObject param, IOStorInvDtlDto ioStorInvDtlDto) { JSONObject outDivObj = new JSONObject(); // 对应的明细id和主表id JSONObject row = new JSONObject(); @@ -399,4 +400,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 88fe14b..eeb9114 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 @@ -210,6 +210,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); groupbucket.setId(IdUtil.getStringId()); 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 27f2927..5e28b0f 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 @@ -6,6 +6,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 lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -128,7 +129,7 @@ public class PdaProductionServiceImpl implements PdaProductionService { @Transactional(rollbackFor = Exception.class) public PdaResponse confirmCallMaterial(JSONObject param) { // hint: 没有创建出库单 - // point_code, row,sect_code + // point_code, row log.info("手持托盘叫料:{}", param); if (ObjectUtil.isEmpty(param.get("point_code"))) { throw new BadRequestException("请输入要料点!"); @@ -146,7 +147,7 @@ public class PdaProductionServiceImpl implements PdaProductionService { } // 判断任务是否创建 List tasks = taskService.getTaskByQuery(new LambdaQueryWrapper() - .eq(SchBaseTask::getPoint_code1, pointCode)); + .eq(SchBaseTask::getPoint_code2, pointCode)); if (tasks.size() > 0) { throw new BadRequestException("该点位已创建过任务!"); } @@ -159,13 +160,12 @@ public class PdaProductionServiceImpl implements PdaProductionService { // 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()); + JSONObject invObj = defaultPdaBuildParam.doBuildOutInvObj(param, structattr.getStor_id(), true); String invId = outBillService.insertDtl(invObj); - Sectattr sectattr = sectattrService.findByCode(structattr.getSect_code(), false); // 2 循环,根据插入的dtl 去寻找袋的组盘信息调用手动分配 List billDtl = outBillService.getOutBillDtl(MapUtil.of("iostorinv_id", invId)); for (IOStorInvDtlDto ioStorInvDtlDto : billDtl) { - JSONObject divObj = defaultPdaBuildParam.buildManuaOutDivData(param, sectattr, ioStorInvDtlDto); + JSONObject divObj = defaultPdaBuildParam.buildManuaOutDivData(param, ioStorInvDtlDto); outBillService.manualDiv(divObj); } // 3 创建任务 @@ -489,12 +489,12 @@ public class PdaProductionServiceImpl implements PdaProductionService { if (ObjectUtil.isEmpty(point)) { throw new BadRequestException("点位[" + pointCode +"]不存在!"); } - if (point.getRegion_code().startsWith("FSSQ")) { - // 粉碎室入库逻辑 + 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(); @@ -602,4 +602,68 @@ 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 null; + } } 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..112b716 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/CoatingUpTask.java @@ -0,0 +1,83 @@ +package org.nl.wms.sch_manage.service.util.tasks; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; +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.ISchBaseTaskService; +import org.nl.wms.sch_manage.service.dao.SchBasePoint; +import org.nl.wms.sch_manage.service.dao.SchBaseTask; +import org.nl.wms.sch_manage.service.util.AbstractTask; +import org.nl.wms.sch_manage.service.util.AcsTaskDto; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 包衣上料任务 + * @author: lyd + * @date: 2026/1/9 + */ +@Component("CoatingUpTask") +public class CoatingUpTask extends AbstractTask { + + @Resource + private ISchBaseTaskService taskService; + + @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(); + } + + @Override + public AcsTaskDto sendAcsParam(String taskId) { + return null; + } + + @Override + protected void updateStatus(String task_code, TaskStatus status) { + + } + + @Override + public void forceFinish(String task_code) { + + } + + @Override + public void cancel(String task_code) { + + } + + @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 fb326f5..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 @@ -198,12 +198,12 @@ public class PalletOutTask extends AbstractTask { 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) @@ -236,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/TabletingInTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/TabletingInTask.java index f1bbfc4..c863c85 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,6 +29,7 @@ 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; @@ -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,7 +145,7 @@ public class TabletingInTask extends AbstractTask { } } - private void cancelTask(SchBaseTask taskObj) { + public void cancelTask(SchBaseTask taskObj) { // 取消任务 taskService.update(new LambdaUpdateWrapper() .set(SchBaseTask::getIs_delete, BaseDataEnum.IS_YES_NOT.code("是")) @@ -159,7 +160,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("已完成"); @@ -173,6 +175,9 @@ public class TabletingInTask extends AbstractTask { .set(SchBasePoint::getIng_task_code, "") ); 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/warehouse_management/enums/IOSEnum.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java index 42d0560..93c5eb9 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 @@ -43,6 +43,7 @@ public enum IOSEnum { OUT_BILL_TYPE(MapOf.of("手工出库", "1009", "原辅料出库", "1001", "批料出库", "1002", + "料桶出库", "1003", "直接出库", "1099" )), @@ -62,7 +63,9 @@ public enum IOSEnum { // 出库任务配置类编码 OUT_CONFIG_CODE(MapOf.of( "1009", "HandOutTask", - "1001", "CallMaterialTask", "1002", "PalletOutTask" + "1001", "CallMaterialTask", + "1002", "PalletOutTask", + "1003", "IntermediateOutTask" )), // 下料任务配置编码 DOWN_CONFIG_CODE(MapOf.of("YPQ", "TabletingInTask" 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.xml b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/MdPbGroupplateMapper.xml index 10c2936..bfef775 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} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java index 89967e3..a0c338b 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/OutBillServiceImpl.java @@ -1088,13 +1088,13 @@ public class OutBillServiceImpl extends ServiceImpl for (IOStorInvDis ioStorInvDis : ioStorInvDisList) { // 创建任务 - iOutBillService.createTask(ioStorInvDis, point_code, ioStorInv); + iOutBillService.createTask(ioStorInvDis, point_code, ioStorInv, whereJson); } } @Override @Transactional - public void createTask(IOStorInvDis ioStorInvDis, String point_code, IOStorInv ioStorInv) { + public void createTask(IOStorInvDis ioStorInvDis, String point_code, IOStorInv ioStorInv, JSONObject ext) { IOStorInvDis newDis = ioStorInvDisMapper.selectById(ioStorInvDis.getIostorinvdis_id()); if (newDis.getWork_status().equals(IOSEnum.INBILL_DIS_STATUS.code("生成"))) { return; @@ -1107,6 +1107,7 @@ public class OutBillServiceImpl extends ServiceImpl task_form.put("vehicle_code", ioStorInvDis.getStoragevehicle_code()); task_form.put("material_id", ioStorInvDis.getMaterial_id()); task_form.put("material_qty", ioStorInvDis.getPlan_qty()); + task_form.put("ext", ext); if (ioStorInvDis.getIs_check().equals(IOSConstant.ONE)) { task_form.put("is_wait", IOSConstant.ONE); } else { From 999d4bebeadfc6f4882979e8d7ac2406dda6b9fb Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Mon, 12 Jan 2026 19:46:34 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E5=A4=96=E5=8C=85=E9=97=B4?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/nl/config/BusinessUtils.java | 10 + .../controller/PdaProductionController.java | 19 ++ .../service/PdaProductionService.java | 16 ++ .../impl/PdaProductionServiceImpl.java | 137 ++++++++++++- .../org/nl/wms/pda/util/ThresholdChecker.java | 165 +++++++++++++++ .../controller/TestApiController.java | 54 +++++ .../service/ISchBasePointService.java | 15 ++ .../service/ISchBaseTaskService.java | 2 + .../service/SecondaryPackagingService.java | 35 ++++ .../dao/mapper/SchBasePointMapper.java | 4 + .../service/dao/mapper/SchBasePointMapper.xml | 38 ++++ .../service/impl/SchBasePointServiceImpl.java | 11 + .../service/impl/SchBaseTaskServiceImpl.java | 13 ++ .../impl/SecondaryPackagingServiceImpl.java | 130 ++++++++++++ .../service/util/tasks/CoatingUpTask.java | 89 +++++++- .../util/tasks/EmptyDiskConveyTask.java | 188 +++++++++++++++++ .../util/tasks/EmptyDiskEnterTask.java | 189 +++++++++++++++++ .../util/tasks/PalletizingAddTask.java | 175 ++++++++++++++++ .../util/tasks/PalletizingDownTask.java | 190 +++++++++++++++++ .../service/util/tasks/TabletingInTask.java | 14 +- .../service/util/tasks/WrappingDownTask.java | 193 ++++++++++++++++++ .../service/util/tasks/WrappingUpTask.java | 191 +++++++++++++++++ .../warehouse_management/enums/IOSEnum.java | 3 +- 23 files changed, 1861 insertions(+), 20 deletions(-) create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/config/BusinessUtils.java create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/util/ThresholdChecker.java create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/controller/TestApiController.java create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/SecondaryPackagingService.java create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/impl/SecondaryPackagingServiceImpl.java create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/EmptyDiskConveyTask.java create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/EmptyDiskEnterTask.java create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PalletizingAddTask.java create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/PalletizingDownTask.java create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/WrappingDownTask.java create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/WrappingUpTask.java 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/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 657d38d..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 @@ -123,4 +123,23 @@ public class PdaProductionController { 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/PdaProductionService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaProductionService.java index 923f5d7..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 @@ -92,4 +92,20 @@ public interface PdaProductionService { * @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/PdaProductionServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaProductionServiceImpl.java index 5e28b0f..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 @@ -15,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; @@ -24,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; @@ -103,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; @@ -125,6 +131,12 @@ public class PdaProductionServiceImpl implements PdaProductionService { return PdaResponse.requestParamOk(res); } + /** + * 称量、粉碎、制粒、配液、缠膜叫料: + * 选择物料、输入批号,选择库区,查询物料库存,选择一个托盘物料,扫/选点位,点确认,进行叫料; + * @param param + * @return + */ @Override @Transactional(rollbackFor = Exception.class) public PdaResponse confirmCallMaterial(JSONObject param) { @@ -473,7 +485,7 @@ public class PdaProductionServiceImpl implements PdaProductionService { * 1、称量、粉碎下料组盘后,扫点位/载具点确认,系统分配物料存放室或批料室空货位入库; * 2、压片下料组盘后,扫点位、载具点确认,系统分配中间站空货位入库; * 3、包衣下料组盘后,扫点位点呼叫AGV,系统呼叫AGV来取货;扫点位、载具点确认,系统分配中间站空货位入库; - * 4、码垛完成后,扫点位、载具点确认,系统分配缓存点位搬运暂存; + * 4、× 码垛完成后,扫点位、载具点确认,系统分配缓存点位搬运暂存; * 5、缠膜完成后,扫点位、载具点确认,系统分配缓存点位搬运暂存; * @param param * @return @@ -494,7 +506,7 @@ public class PdaProductionServiceImpl implements PdaProductionService { productionInStorage(param, point); return PdaResponse.requestOk(); } - // 压片下料 + // 压片/包衣下料 AbstractTask task = taskFactory.getTask(IOSEnum.DOWN_CONFIG_CODE.code(point.getRegion_code())); task.create(param); return PdaResponse.requestOk(); @@ -664,6 +676,125 @@ public class PdaProductionServiceImpl implements PdaProductionService { lock.unlock(); } } - return null; + 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 index 112b716..74cc238 100644 --- 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 @@ -1,25 +1,30 @@ 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.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.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.List; /** - * 包衣上料任务 + * 包衣/内包装上料任务 * @author: lyd * @date: 2026/1/9 */ @@ -29,6 +34,9 @@ public class CoatingUpTask extends AbstractTask { @Resource private ISchBaseTaskService taskService; + @Resource + private IMdPdGroupbucketService groupbucketService; + @Override public String create(JSONObject json) { SchBaseTask task = new SchBaseTask(); @@ -56,24 +64,91 @@ public class CoatingUpTask extends AbstractTask { return task.getTask_id(); } - @Override public AcsTaskDto sendAcsParam(String taskId) { - return null; + 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 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/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/TabletingInTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/TabletingInTask.java index c863c85..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 @@ -36,7 +36,7 @@ import java.util.List; import java.util.Map; /** - * 压片入库 + * 压片/包衣入库 * @Author: lyd * @Date: 2025/12/4 */ @@ -146,13 +146,6 @@ public class TabletingInTask extends AbstractTask { } 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()) - ); // 更新任务状态 taskObj.setTask_status(TaskStatus.CANCELED.getCode()); @@ -171,8 +164,11 @@ 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())) { 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 283644e..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 @@ -68,7 +68,8 @@ public enum IOSEnum { "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"