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 9c99670..ce3b049 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 @@ -15,10 +15,14 @@ m.material_name, m.material_spec, m.material_model, - m.material_type_id + m.material_type_id, + g.bucket_code AS vehicle_code, + class.class_name FROM `md_pd_groupbucket` g LEFT JOIN md_me_materialbase m ON m.material_id = g.material_id + LEFT JOIN md_pb_classstandard class ON class.class_id = m.material_type_id + WHERE g.bucket_code = #{vehicleCode} @@ -68,11 +72,13 @@ m.material_name, m.material_spec, m.material_model, - m.material_type_id + m.material_type_id, + class.class_name FROM `md_pd_groupbucket` mg LEFT JOIN st_ivt_structattr ss ON mg.bucket_code = ss.storagevehicle_code LEFT JOIN md_me_materialbase m ON m.material_id = mg.material_id + LEFT JOIN md_pb_classstandard class ON class.class_id = m.material_type_id WHERE IFNULL( ss.storagevehicle_code, '' ) ]]> '' AND mg.material_id = #{material_id} 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 a3b2eeb..fbfa3d4 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 @@ -174,6 +174,7 @@ public class PdaCommonServiceImpl implements PdaCommonService { if (ObjectUtil.isEmpty(bagNo)) { throw new BadRequestException("袋号不能为空!"); } + param.put("bag_code", bagNo); List bagAssembly = mdPbGroupplateMapper.getBagAssembly(param); if (bagAssembly.size() != 1) { throw new BadRequestException(bagAssembly.size() == 0 ? "组袋记录不存在,请先组袋!" : "组袋记录信息有误,请查询并清理后重试!"); @@ -197,10 +198,23 @@ public class PdaCommonServiceImpl implements PdaCommonService { return PdaResponse.requestOk("组盘成功!"); } + @SneakyThrows @Override public PdaResponse inEmptyVehicle(JSONObject param) { log.info("手持请求空托盘入库:{}", param); - vehicleInService.create(param); + RLock lock = redissonClient.getLock("lock:inEmptyVehicle"); + boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); + try { + if (tryLock) { + vehicleInService.create(param); + } else { + throw new BadRequestException("速度太快啦,稍后再试..."); + } + } finally { + if (tryLock) { + lock.unlock(); + } + } return PdaResponse.requestOk(); } 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 9b4396a..761d4aa 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 @@ -30,6 +30,7 @@ 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.SecondaryPackagingService; 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; @@ -109,6 +110,8 @@ public class PdaProductionServiceImpl implements PdaProductionService { private IOStorInvDtlMapper ioStorInvDtlMapper; @Resource private ISysParamService paramService; + @Resource + private SecondaryPackagingService secondaryPackagingService; @Override public PdaResponse getGroupInfo(JSONObject param) { // search; @@ -120,7 +123,7 @@ public class PdaProductionServiceImpl implements PdaProductionService { if (ObjectUtil.isEmpty(search)) { throw new BadRequestException("载具不存在!"); } - List res = groupplateService.getPalletViewByVehicleCode(search, Arrays.asList("1", "2")); + List res = groupplateService.getPalletViewByVehicleCode(search, Arrays.asList("1", "2", "4")); return PdaResponse.requestParamOk(res); } @@ -137,74 +140,83 @@ public class PdaProductionServiceImpl implements PdaProductionService { * @param param * @return */ + @SneakyThrows @Override @Transactional(rollbackFor = Exception.class) public PdaResponse confirmCallMaterial(JSONObject param) { // hint: 没有创建出库单 // point_code, row log.info("手持托盘叫料:{}", param); - if (ObjectUtil.isEmpty(param.get("point_code"))) { - throw new BadRequestException("请输入要料点!"); - } - if (ObjectUtil.isEmpty(param.get("row"))) { - throw new BadRequestException("请选择呼叫的物料!"); - } - String pointCode = param.getString("point_code"); - SchBasePoint endPoint = pointService.getByPointCode(pointCode, true); - if (ObjectUtil.isEmpty(endPoint)) { - throw new BadRequestException("输入的点位不存在或者点位已被禁用, 请检查输入点位是否正确或是否被禁用!"); - } - if (!"1".equals(endPoint.getPoint_status())) { - throw new BadRequestException("该点位不是空位,请检查后呼叫!"); - } - // 判断任务是否创建 - List tasks = taskService.getTaskByQuery(new LambdaQueryWrapper() - .eq(SchBaseTask::getPoint_code2, pointCode)); - if (tasks.size() > 0) { - throw new BadRequestException("该点位已创建过任务!"); - } - - JSONObject row = param.getJSONObject("row"); - // 如果是制粒,需要走正规出入库流程 - if ("ZLQ".equals(endPoint.getRegion_code())) { - Structattr structattr = structattrService.getByCode(row.getString("struct_code")); - param.put("bill_type", IOSEnum.OUT_BILL_TYPE.code("批料出库")); - // 1 创建出库单、明细、分配明细 - List res = groupplateService.getPalletViewByVehicleCode(row.getString("vehicle_code"), Arrays.asList("1", "2")); - param.put("rows", res); - JSONObject invObj = defaultPdaBuildParam.doBuildOutInvObj(param, structattr.getStor_id(), true); - String invId = outBillService.insertDtl(invObj); - // 2 循环,根据插入的dtl 去寻找袋的组盘信息调用手动分配 - List billDtl = outBillService.getOutBillDtl(MapUtil.of("iostorinv_id", invId)); - for (IOStorInvDtlDto ioStorInvDtlDto : billDtl) { - JSONObject divObj = defaultPdaBuildParam.buildManuaOutDivData(param, ioStorInvDtlDto); - outBillService.manualDiv(divObj); + RLock lock = redissonClient.getLock("lock:confirmCallMaterial"); + boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); + try { + if (tryLock) { + if (ObjectUtil.isEmpty(param.get("point_code"))) { + throw new BadRequestException("请输入要料点!"); + } + if (ObjectUtil.isEmpty(param.get("row"))) { + throw new BadRequestException("请选择呼叫的物料!"); + } + String pointCode = param.getString("point_code"); + SchBasePoint endPoint = pointService.getByPointCode(pointCode, true); + if (ObjectUtil.isEmpty(endPoint)) { + throw new BadRequestException("输入的点位不存在或者点位已被禁用, 请检查输入点位是否正确或是否被禁用!"); + } + if (!"1".equals(endPoint.getPoint_status())) { + throw new BadRequestException("该点位不是空位,请检查后呼叫!"); + } + // 判断任务是否创建 + List tasks = taskService.getTaskByQuery(new LambdaQueryWrapper() + .eq(SchBaseTask::getPoint_code2, pointCode)); + if (tasks.size() > 0) { + throw new BadRequestException("该点位已创建过任务!"); + } + // 如果是缠绕,调用ACS请求的方法创建任务 + if ("CRHCQ".equals(endPoint.getRegion_code())) { + JSONObject crParam = new JSONObject(); + crParam.put("device_code", param.get("point_code")); + secondaryPackagingService.wrappingCall(crParam); + return PdaResponse.requestOk(); + } + JSONObject row = param.getJSONObject("row"); + Structattr structattr = structattrService.getByCode(row.getString("struct_code")); + param.put("bill_type", IOSEnum.OUT_BILL_TYPE.code("批料出库")); + // 1 创建出库单、明细、分配明细 + List res = groupplateService.getPalletViewByVehicleCode(row.getString("vehicle_code"), Arrays.asList("1", "2")); + param.put("rows", res); + JSONObject invObj = defaultPdaBuildParam.doBuildOutInvObj(param, structattr.getStor_id(), true); + String invId = outBillService.insertDtl(invObj); + // 2 循环,根据插入的dtl 去寻找袋的组盘信息调用手动分配 + List billDtl = outBillService.getOutBillDtl(MapUtil.of("iostorinv_id", invId)); + for (IOStorInvDtlDto ioStorInvDtlDto : billDtl) { + JSONObject divObj = defaultPdaBuildParam.buildManuaOutDivData(param, ioStorInvDtlDto); + outBillService.manualDiv(divObj); + } + // 3 创建任务 + JSONObject jsonMst = defaultPdaBuildParam.buildOutAllSetData(endPoint, invId); + // 如果是制粒/配液,需要走正规出入库流程 + if ("ZLQ".equals(endPoint.getRegion_code()) || "PYQ".equals(endPoint.getRegion_code())) { + jsonMst.put("flag", "1"); + } + outBillService.allSetPoint(jsonMst); + } else { + throw new BadRequestException("速度太快啦,稍后再试..."); + } + } finally { + if (tryLock) { + lock.unlock(); } - // 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("呼叫成功!"); } @Override public PdaResponse getPalletAssemblyOK(JSONObject param) { - String search = param.getString("search"); + String search = param.getString("bag_code"); if (ObjectUtil.isEmpty(search)) { throw new BadRequestException("请输入袋号编码!"); } - List groups = groupplateService.getPalletView(search, Arrays.asList("1", "2")); + List groups = groupplateService.getPalletView(search, Arrays.asList("1", "2", "4")); if (groups.size() != 1) { throw new BadRequestException(groups.size() == 0 ? "组袋记录不存在,请先组袋!" : "组袋记录信息有误,请查询并清理后重试!"); } @@ -219,65 +231,26 @@ public class PdaProductionServiceImpl implements PdaProductionService { @Transactional(rollbackFor = Exception.class) public PdaResponse takePalletMaterial(JSONObject param) { log.info("手持取物料: {}", param); - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); // search、rows、total_qty String search = param.getString("search"); -// SchBasePoint point = pointService.getByPointCode(search, false); -// if (ObjectUtil.isNotEmpty(point)) { -// search = point.getVehicle_code(); -// } + SchBasePoint point = pointService.getByPointCode(search, false); + if (ObjectUtil.isNotEmpty(point)) { + search = point.getVehicle_code(); + } if (ObjectUtil.isEmpty(search)) { throw new BadRequestException("载具号不能为空!"); } storagevehicleinfoService.getByCode(search); JSONArray rows = param.getJSONArray("rows"); - // 找到托盘的仓位 - List startPoints = structattrService - .getByVehicleCode(rows.getJSONObject(0).getString("vehicle_code") - , IOSEnum.LOCK_TYPE.code("其他锁"), false); - if (startPoints.size() == 0) { - throw new BadRequestException("未找到当前托盘的原始库位信息!"); - } - Structattr structattr = startPoints.get(0); - // 手动更新库存信息 - // 1、创建出库单、明细、分配明细 - // 1.1 单据表 - String invId = IdUtil.getStringId(); - IOStorInv ioStorInv = new IOStorInv(); - ioStorInv.setIostorinv_id(invId); - ioStorInv.setBill_code(CodeUtil.getNewCode("OUT_STORE_CODE")); - ioStorInv.setBiz_date(DateUtil.format(new Date(), "yyyy-MM-dd")); - ioStorInv.setIo_type(IOSEnum.IO_TYPE.code("出库")); - ioStorInv.setDetail_count(1); - ioStorInv.setCreate_mode(IOSEnum.CREATE_MODE.code("终端产生")); - ioStorInv.setStor_id(structattr.getStor_id()); - ioStorInv.setStor_code(structattr.getStor_code()); - ioStorInv.setStor_name(structattr.getStor_name()); - ioStorInv.setBill_status(IOSEnum.BILL_STATUS.code("完成")); - ioStorInv.setBill_type(IOSEnum.OUT_BILL_TYPE.code("原辅料出库")); - ioStorInv.setBuss_type(IOSEnum.OUT_BILL_TYPE.code("原辅料出库").substring(0, 4)); - ioStorInv.setIs_delete(BaseDataEnum.IS_YES_NOT.code("否")); - ioStorInv.setIs_upload(BaseDataEnum.IS_YES_NOT.code("否")); - ioStorInv.setInput_optid(currentUserId); - ioStorInv.setInput_optname(nickName); - ioStorInv.setInput_time(now); - ioStorInv.setUpdate_optid(currentUserId); - ioStorInv.setUpdate_optname(nickName); - ioStorInv.setUpdate_time(now); - ioStorInv.setTotal_qty(param.getBigDecimal("total_qty")); - ioStorInv.setDetail_count(rows.size()); - outBillService.save(ioStorInv); // 扣除组盘数据 List needAddOrUpdGroups = new ArrayList<>(); List needDelGroups = new ArrayList<>(); - List vehicleObjs = storagevehicleextService.list(new LambdaQueryWrapper() - .eq(MdPbStoragevehicleext::getStoragevehicle_code, rows.getJSONObject(0).getString("vehicle_code"))); - BigDecimal whileSub = new BigDecimal("0"); for (int i = 0; i < rows.size(); i++) { JSONObject row = rows.getJSONObject(i); GroupPlate delGroup = groupplateService.getById(row.getString("group_id")); + if (ObjectUtil.isEmpty(delGroup)) { + continue; + } GroupPlate groupPlate = JSON.parseObject(row.toJSONString(), GroupPlate.class); // 其他需要删除 delGroup.setQty(delGroup.getQty().subtract(groupPlate.getQty())); @@ -286,77 +259,9 @@ public class PdaProductionServiceImpl implements PdaProductionService { } else { needAddOrUpdGroups.add(delGroup); } - whileSub.add(groupPlate.getQty()); - // 1.2 单据明细 - IOStorInvDtl dtl = new IOStorInvDtl(); - dtl.setIostorinvdtl_id(IdUtil.getStringId()); - dtl.setIostorinv_id(invId); - dtl.setSeq_no("1"); - dtl.setMaterial_id(row.getString("material_id")); - dtl.setPcsn(groupPlate.getPcsn()); - dtl.setBill_status(IOSEnum.BILL_STATUS.code("完成")); - dtl.setQty_unit_id(groupPlate.getQty_unit_id()); - dtl.setQty_unit_name(groupPlate.getQty_unit_name()); - dtl.setPlan_qty(groupPlate.getQty()); - dtl.setAssign_qty(groupPlate.getQty()); - dtl.setUnassign_qty(BigDecimal.ZERO); - ioStorInvDtlMapper.insert(dtl); - // 1.3 分配明细 - IOStorInvDis ioStorInvDis = new IOStorInvDis(); - ioStorInvDis.setIostorinvdis_id(IdUtil.getStringId()); - ioStorInvDis.setIostorinv_id(dtl.getIostorinv_id()); - ioStorInvDis.setIostorinvdtl_id(dtl.getIostorinvdtl_id()); - ioStorInvDis.setSeq_no("1"); - ioStorInvDis.setSect_id(structattr.getSect_id()); - ioStorInvDis.setPcsn(groupPlate.getPcsn()); - ioStorInvDis.setMaterial_id(row.getString("material_id")); - ioStorInvDis.setSect_name(structattr.getSect_name()); - ioStorInvDis.setSect_code(structattr.getSect_code()); - ioStorInvDis.setStruct_id(structattr.getStruct_id()); - ioStorInvDis.setStruct_name(structattr.getStruct_name()); - ioStorInvDis.setStruct_code(structattr.getStruct_code()); - ioStorInvDis.setStoragevehicle_code(row.getString("vehicle_code")); - ioStorInvDis.setIs_issued(BaseDataEnum.IS_YES_NOT.code("否")); - ioStorInvDis.setQty_unit_id(groupPlate.getQty_unit_id()); - ioStorInvDis.setQty_unit_name(groupPlate.getQty_unit_name()); - ioStorInvDis.setWork_status(IOSEnum.INBILL_DIS_STATUS.code("完成")); - ioStorInvDis.setPlan_qty(groupPlate.getQty()); - ioStorInvDisMapper.insert(ioStorInvDis); - vehicleObjs.stream() - .filter(vehicle -> - vehicle.getStoragevehicle_code().equals(row.getString("vehicle_code")) && - vehicle.getMaterial_id().equals(row.getString("material_id")) && - vehicle.getPcsn().equals(row.getString("pcsn"))) - .findFirst() - .ifPresent(vehicle -> { - BigDecimal newQty = vehicle.getCanuse_qty().subtract(row.getBigDecimal("qty")); - vehicle.setCanuse_qty(newQty.max(BigDecimal.ZERO)); - }); } - List zeroQtyVehicles = vehicleObjs.stream() - .filter(vehicle -> vehicle.getCanuse_qty().compareTo(BigDecimal.ZERO) == 0) - .collect(Collectors.toList()); - - List nonZeroQtyVehicles = vehicleObjs.stream() - .filter(vehicle -> vehicle.getCanuse_qty().compareTo(BigDecimal.ZERO) != 0) - .collect(Collectors.toList()); - groupplateService.saveOrUpdateBatch(needAddOrUpdGroups); groupplateService.removeByIds(needDelGroups); - // 托盘数量修改 - if (nonZeroQtyVehicles.size() > 0) { - storagevehicleextService.updateBatchById(nonZeroQtyVehicles); - } - if (zeroQtyVehicles.size() > 0) { - storagevehicleextService.removeByIds(zeroQtyVehicles.stream().map(MdPbStoragevehicleext::getStoragevehicleext_id).collect(Collectors.toList())); - } - if (nonZeroQtyVehicles.size() == 0) { - // 说明托盘没东西了,点位释放 - structattr.setLock_type(IOSEnum.LOCK_TYPE.code("未锁定")); - structattr.setStoragevehicle_code(null); - structattr.setIs_emptyvehicle("0"); - structattrService.updateById(structattr); - } return PdaResponse.requestOk("取料成功!"); } @@ -369,6 +274,10 @@ public class PdaProductionServiceImpl implements PdaProductionService { throw new BadRequestException("请扫点位!"); } point.setVehicle_code(""); + point.setMaterial_code(""); + point.setMaterial_name(""); + point.setMaterial_qty(""); + point.setIng_task_code(""); point.setPoint_status(IOSEnum.POINT_STATUS.code("空位")); point.setUpdate_id(SecurityUtils.getCurrentUserId()); point.setUpdate_name(SecurityUtils.getCurrentNickName()); @@ -377,57 +286,72 @@ public class PdaProductionServiceImpl implements PdaProductionService { return PdaResponse.requestOk("取载具成功!"); } + @SneakyThrows @Override @Transactional(rollbackFor = Exception.class) public PdaResponse leftoverMaterialBack(JSONObject param) { // search, rows 按照托盘号原来的库区回去 - String search = param.getString("search"); - SchBasePoint startPoint = pointService.getByPointCode(search, false); - if (ObjectUtil.isEmpty(startPoint)) { - throw new BadRequestException("请扫点位!"); - } - if (ObjectUtil.isEmpty(startPoint.getVehicle_code())) { - throw new BadRequestException("该点位没有载具信息!"); - } - List points = structattrService.getByVehicleCode(startPoint.getVehicle_code() - , IOSEnum.LOCK_TYPE.code("其他锁"), false); - if (points.size() != 1) { - throw new BadRequestException(points.size() > 1 - ? "该托盘号绑定在多个点位" + points.stream().map(Structattr::getStruct_code).collect(Collectors.toList()) + ",请检查!" - : "该托盘号未绑定到点位或者点位被禁用或者点位以上锁,请检查!"); - } - List res = groupplateService.getPalletViewByVehicleCode(startPoint.getVehicle_code() - , Arrays.asList("2")); - if (res.size() > 0) { - log.info("剩料回库"); - // 剩料回库 - param.put("rows", res); - Structattr structattr = points.get(0); - Sectattr sectattr = sectattrService.findByCode(structattr.getSect_code(), false); - param.put("bill_type", IOSEnum.IN_BILL_TYPE.code("剩料回库")); - // 1 创建入库单、明细、分配明细 - Map invObj = defaultPdaBuildParam.doBuildInvObj(param, startPoint, sectattr); - invObj.put("nonChecked", "1"); - String invId = rawAssistIStorService.insertDtl(invObj); - // 2 调用手动分配 - param.put("sect_code", structattr.getSect_code()); - param.put("sect_name", structattr.getSect_name()); - param.put("struct_id", structattr.getStruct_id()); - param.put("struct_name", structattr.getStruct_name()); - param.put("struct_code", structattr.getStruct_code()); - Map divObj = defaultPdaBuildParam.buildDivStructData(param, sectattr, invId, false); - rawAssistIStorService.divStruct(divObj); - // 3 创建任务 - Map jsonMst = defaultPdaBuildParam.buildTaskData(startPoint, invId); - rawAssistIStorService.divPoint(jsonMst); - } else { - log.info("空载具回库"); - // 空载具回库 - JSONObject vin = new JSONObject(); - vin.put("storagevehicle_code", startPoint.getVehicle_code()); - vin.put("sect_code", startPoint.getOut_sect()); - vin.put("point_code", startPoint.getPoint_code()); - vehicleInService.create(vin); + RLock lock = redissonClient.getLock("lock:leftoverMaterialBack"); + boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); + try { + if (tryLock) { + String search = param.getString("search"); + SchBasePoint startPoint = pointService.getByPointCode(search, false); + if (ObjectUtil.isEmpty(startPoint)) { + startPoint = pointService.getByVehicleCodeOne(search, true); + } + if (ObjectUtil.isEmpty(startPoint)) { + throw new BadRequestException("请扫点位!"); + } + if (ObjectUtil.isEmpty(startPoint.getVehicle_code())) { + throw new BadRequestException("该点位没有载具信息!"); + } + // 查找之前的任务 + List list = taskService.list(new LambdaQueryWrapper() + .eq(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode()) + .eq(SchBaseTask::getVehicle_code, startPoint.getVehicle_code()) + .in(SchBaseTask::getConfig_code, "PalletOutTask") + .orderByDesc(SchBaseTask::getTask_id)); + if (list.size() == 0) { + throw new BadRequestException("找不到托盘原来的位置!"); + } + SchBaseTask task = list.get(0); + Structattr structattr = structattrService.getByCode(task.getPoint_code1()); + List res = groupplateService.getPalletViewByVehicleCode(startPoint.getVehicle_code() + , Arrays.asList("2", "4")); + if (res.size() > 0) { + log.info("剩料回库"); + // 剩料回库 + param.put("rows", res); + Sectattr sectattr = sectattrService.findByCode(structattr.getSect_code(), false); + param.put("bill_type", IOSEnum.IN_BILL_TYPE.code("剩料回库")); + // 1 创建入库单、明细、分配明细 + Map invObj = defaultPdaBuildParam.doBuildInvObj(param, startPoint, sectattr); + String invId = rawAssistIStorService.insertDtl(invObj); + // 2 调用手动分配 + param.put("sect_code", structattr.getSect_code()); + param.put("sect_name", structattr.getSect_name()); + Map divObj = defaultPdaBuildParam.buildDivStructData(param, sectattr, invId, true); + rawAssistIStorService.divStruct(divObj); + // 3 创建任务 + Map jsonMst = defaultPdaBuildParam.buildTaskData(startPoint, invId); + rawAssistIStorService.divPoint(jsonMst); + } else { + log.info("空载具回库"); + // 空载具回库 + JSONObject vin = new JSONObject(); + vin.put("storagevehicle_code", task.getVehicle_code()); + vin.put("sect_code", structattr.getSect_code()); + vin.put("point_code", startPoint.getPoint_code()); + vehicleInService.create(vin); + } + } else { + throw new BadRequestException("速度太快啦,稍后再试..."); + } + } finally { + if (tryLock) { + lock.unlock(); + } } return PdaResponse.requestOk(); } @@ -451,7 +375,7 @@ public class PdaProductionServiceImpl implements PdaProductionService { String vehicleCode = param.getString("vehicle_code"); List res = groupplateService.getPalletViewByVehicleCode(vehicleCode, Arrays.asList("1")); if (res.size() == 0) { - throw new BadRequestException("当前托盘号不存在物料信息,请检查!"); + throw new BadRequestException("当前托盘号【" + vehicleCode + "】不存在物料信息,请检查!"); } // 如果是仓位就需要走原辅料入库 Sectattr sectCode = sectattrService.findByCode(param.getString("sect_code"), false); @@ -468,7 +392,7 @@ public class PdaProductionServiceImpl implements PdaProductionService { @Override public PdaResponse takeFinish(JSONObject param) { // todo: 下发允许AGV通过 - return null; + return PdaResponse.requestOk(); } @Override @@ -486,29 +410,42 @@ public class PdaProductionServiceImpl implements PdaProductionService { * 2、压片下料组盘后,扫点位、载具点确认,系统分配中间站空货位入库; * 3、包衣下料组盘后,扫点位点呼叫AGV,系统呼叫AGV来取货;扫点位、载具点确认,系统分配中间站空货位入库; * 4、× 码垛完成后,扫点位、载具点确认,系统分配缓存点位搬运暂存; - * 5、缠膜完成后,扫点位、载具点确认,系统分配缓存点位搬运暂存; + * 5、× 缠膜完成后,扫点位、载具点确认,系统分配缓存点位搬运暂存; * @param param * @return */ + @SneakyThrows @Override public PdaResponse productionLine(JSONObject param) { - // point_code, vehicle_code + // point_code, vehicle_code, is_wait log.info("手持下料:{}", param); - assertNotBlankJson(param, "载具号不能为空!", "vehicle_code"); - assertNotBlankJson(param, "点位不能为空!", "point_code"); - String pointCode = param.getString("point_code"); - SchBasePoint point = pointService.getByPointCode(pointCode, false); - if (ObjectUtil.isEmpty(point)) { - throw new BadRequestException("点位[" + pointCode +"]不存在!"); + RLock lock = redissonClient.getLock("lock:inEmptyVehicle"); + boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); + try { + if (tryLock) { + assertNotBlankJson(param, "载具号不能为空!", "vehicle_code"); + assertNotBlankJson(param, "点位不能为空!", "point_code"); + String pointCode = param.getString("point_code"); + SchBasePoint point = pointService.getByPointCode(pointCode, false); + if (ObjectUtil.isEmpty(point)) { + throw new BadRequestException("点位[" + pointCode +"]不存在!"); + } + if (point.getRegion_code().startsWith("FSSQ") || point.getRegion_code().startsWith("CLS")) { + // 粉碎室/称量室入库逻辑 + productionInStorage(param, point); + return PdaResponse.requestOk(); + } + // 压片/包衣下料 + AbstractTask task = taskFactory.getTask(IOSEnum.DOWN_CONFIG_CODE.code(point.getRegion_code())); + task.create(param); + } else { + throw new BadRequestException("速度太快啦,稍后再试..."); + } + } finally { + if (tryLock) { + lock.unlock(); + } } - 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(); } @@ -622,6 +559,11 @@ public class PdaProductionServiceImpl implements PdaProductionService { return PdaResponse.requestParamOk(res); } + /** + * 包衣、内包装叫料 + * @param param + * @return + */ @SneakyThrows @Override @Transactional(rollbackFor = Exception.class) diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaWarehouseServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaWarehouseServiceImpl.java index 5f25a64..ccfd5e1 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaWarehouseServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaWarehouseServiceImpl.java @@ -131,7 +131,7 @@ public class PdaWarehouseServiceImpl implements PdaWarehouseService { if (points.size() != 1) { throw new BadRequestException(points.size() > 1 ? "该托盘号绑定在多个点位" + points.stream().map(Structattr::getStruct_code).collect(Collectors.toList()) + ",请检查!" - : "该托盘号未绑定到点位或者点位被禁用或者点位以上锁,请检查!"); + : "该托盘号未绑定到点位或者点位被禁用或者点位已上锁,请检查!"); } startStruct = points.get(0); pointCode = startStruct.getStruct_code(); 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 0ea6fc0..90220ec 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 @@ -156,4 +156,5 @@ public interface ISchBasePointService extends IService { */ List getCRUsedDevice(); + SchBasePoint getByVehicleCodeOne(String search, boolean flag); } 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 9b94572..7a0a3e8 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 @@ -151,6 +151,9 @@ public class SchBasePointServiceImpl extends ServiceImpl getCRUsedDevice() { return this.baseMapper.getCRUsedDevice(); } + + @Override + public SchBasePoint getByVehicleCodeOne(String search, boolean flag) { + if (ObjectUtil.isEmpty(search)) { + throw new BadRequestException("想要通过托盘号查找点位,托盘号不能为空!"); + } + List vehicleCode = getByVehicleCode(search); + if (flag) { + if (vehicleCode.size() == 0) { + throw new BadRequestException("托盘号【" + search + "】没有绑定到点位上,请检查!"); + } + if (vehicleCode.size() > 1) { + throw new BadRequestException("托盘号【" + search + "】绑定到多个点位上,请检查!"); + } + } + return vehicleCode.get(0); + } } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/EmpVehicleInTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/EmpVehicleInTask.java index b3a927b..87dac6f 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/EmpVehicleInTask.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/EmpVehicleInTask.java @@ -160,7 +160,7 @@ public class EmpVehicleInTask extends AbstractTask { if (ObjectUtil.isEmpty(taskObj)) { throw new BadRequestException("该任务不存在"); } - if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) { + if (Integer.parseInt(taskObj.getTask_status()) >= Integer.parseInt(TaskStatus.FINISHED.getCode())) { throw new BadRequestException("只能取消生成中的任务!"); } this.cancelTask(taskObj); 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 e3883dd..aca0199 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 @@ -25,6 +25,7 @@ import org.nl.wms.sch_manage.service.util.AcsTaskDto; import org.nl.wms.sch_manage.service.util.TaskType; 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.nl.wms.warehouse_management.service.IOutBillService; import org.nl.wms.warehouse_management.service.dao.GroupPlate; import org.nl.wms.warehouse_management.service.dao.IOStorInvDis; @@ -72,7 +73,7 @@ public class PalletOutTask extends AbstractTask { * 组盘记录服务 */ @Resource - private GroupPlateMapper groupPlateMapper; + private IMdPbGroupplateService pbGroupplateService; @Resource private IStructattrService structattrService; @@ -100,9 +101,7 @@ public class PalletOutTask extends AbstractTask { // 点位上锁 structattrService.update(new LambdaUpdateWrapper() - .set(Structattr::getLock_type, ObjectUtil.isNotEmpty(json.get("flag")) - ? IOSEnum.LOCK_TYPE.code("其他锁") - : IOSEnum.LOCK_TYPE.code("出库锁")) + .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("出库锁")) .eq(Structattr::getStruct_code, task.getPoint_code1())); // 下发任务 @@ -195,10 +194,17 @@ public class PalletOutTask extends AbstractTask { .set(SchBasePoint::getIng_task_code, taskObj.getTask_id()) ); JSONObject jsonObject = JSONObject.parseObject(taskObj.getRequest_param()); - if (ObjectUtil.isEmpty(jsonObject.get("flag"))) { - // 解锁、库存清空 - outBillService.taskFinish(taskObj); + // 解锁、库存清空 + outBillService.taskFinish(taskObj); + JSONObject ext = jsonObject.getJSONObject("ext"); + if (ObjectUtil.isNotEmpty(ext.get("flag"))) { this.taskConfirm(taskObj.getTask_code()); + } else { + // 修改组盘信息 + pbGroupplateService.update(new LambdaUpdateWrapper() + .set(GroupPlate::getRemark, taskObj.getPoint_code1()) + .set(GroupPlate::getStatus, "4") + .eq(GroupPlate::getVehicle_code, taskObj.getVehicle_code())); } // 任务完成 taskObj.setTask_status(TaskStatus.FINISHED.getCode()); @@ -233,7 +239,7 @@ public class PalletOutTask extends AbstractTask { SchBaseTask taskObj = taskService.getByCode(task_code); // 删除组盘信息 - groupPlateMapper.delete( + pbGroupplateService.remove( new QueryWrapper().lambda() .eq(GroupPlate::getVehicle_code, taskObj.getVehicle_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 7140dc0..8c83f50 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 @@ -3,6 +3,7 @@ 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; @@ -22,7 +23,9 @@ import org.nl.wms.sch_manage.service.util.AcsTaskDto; import org.nl.wms.sch_manage.service.util.TaskType; 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.nl.wms.warehouse_management.service.IRawAssistIStorService; +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.IOStorInvDisMapper; import org.springframework.stereotype.Component; @@ -42,7 +45,8 @@ public class RawInTask extends AbstractTask { private ISchBaseTaskService taskService; @Resource private IRawAssistIStorService rawAssistIStorService; - + @Resource + private IMdPbGroupplateService groupplateService; @Resource private IOStorInvDisMapper ioStorInvDisMapper; @Resource @@ -161,6 +165,7 @@ public class RawInTask extends AbstractTask { .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) .set(SchBasePoint::getIng_task_code, "") ); + taskConfirm(taskObj.getTask_code()); } @Override @@ -186,6 +191,12 @@ public class RawInTask extends AbstractTask { @Override public void taskConfirm(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + groupplateService.update( + new LambdaUpdateWrapper() + .eq(GroupPlate::getVehicle_code, taskObj.getVehicle_code()) + .set(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/WrappingDownTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/WrappingDownTask.java index a1867f0..42050f6 100644 --- 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 @@ -28,7 +28,7 @@ import java.util.Collections; import java.util.List; /** - * + * 缠绕机下料 * @author: lyd * @date: 2026/1/12 */ @@ -45,7 +45,7 @@ public class WrappingDownTask extends AbstractTask { // 查找空闲的需要缠绕的点 List list = pointService.getNoTaskPointByRegionAndType("CRHCQ", "4", "1"); if (list.size() == 0) { - throw new BadRequestException("没有需要缠绕的点!"); + throw new BadRequestException("没有空闲的已缠绕点!"); } SchBasePoint basePoint = list.get(0); SchBasePoint parentPoint = pointService.getById(json.getString("device_code")); 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 d0f5a0f..6d9b3a9 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 @@ -165,11 +165,14 @@ m.material_spec, m.material_model, m.material_type_id, + c.class_code, + c.class_name, s.supp_name FROM `md_pb_groupplate` g LEFT JOIN md_me_materialbase m ON m.material_id = g.material_id LEFT JOIN md_cs_supplierbase s ON s.supp_code = g.supp_code + LEFT JOIN md_pb_classstandard c ON c.class_id = m.material_type_id WHERE g.vehicle_code = #{search} AND g.`status` IN #{code} @@ -190,27 +193,26 @@ m.material_model, m.material_type_id, s.supp_name, + class.class_name, mg.vehicle_code AS storagevehicle_code, - e.canuse_qty, - e.frozen_qty, mg.qty AS plan_qty FROM `st_ivt_structattr` ss - LEFT JOIN md_pb_groupplate mg ON mg.vehicle_code = ss.storagevehicle_code + LEFT JOIN md_pb_groupplate mg ON mg.vehicle_code = ss.storagevehicle_code AND mg.`status` = '2' LEFT JOIN md_me_materialbase m ON m.material_id = mg.material_id - LEFT JOIN md_cs_supplierbase s ON s.supp_code = mg.supp_code AND mg.`status` = '2' - LEFT JOIN md_pb_storagevehicleext e ON ss.storagevehicle_code = e.storagevehicle_code + LEFT JOIN md_cs_supplierbase s ON s.supp_code = mg.supp_code + LEFT JOIN md_pb_classstandard class ON class.class_id = m.material_type_id WHERE IFNULL(ss.storagevehicle_code,'') ]]> '' AND IFNULL( mg.group_id, '' ) ]]> '' - AND - mg.material_id = #{material_id} - - - AND - mg.pcsn = #{pcsn} - + AND + mg.material_id = #{material_id} + + + AND + mg.pcsn = #{pcsn} +