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}
+