From dcb0ef7ba043aa4598c17c9bb46f4aab09599c7c Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Mon, 1 Dec 2025 17:49:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=89=98=E7=9B=98=E5=8F=AB=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PdaProductionController.java | 50 ++++ .../service/PdaBuildParamService.java | 59 +++++ .../service/PdaPreTreatmentService.java | 4 + .../service/PdaProductionService.java | 26 ++ .../service/impl/DefaultPdaBuildParam.java | 168 +++++++++++++ .../impl/PdaPreTreatmentServiceImpl.java | 129 ++-------- .../impl/PdaProductionServiceImpl.java | 104 ++++++++ .../sch_manage/service/dao/SchBasePoint.java | 6 + .../service/util/tasks/CallMaterialTask.java | 224 ++++++++++++++++++ .../warehouse_management/enums/IOSEnum.java | 6 +- .../service/IMdPbGroupplateService.java | 4 + .../dao/mapper/MdPbGroupplateMapper.java | 4 + .../dao/mapper/MdPbGroupplateMapper.xml | 55 +++++ .../impl/MdPbGroupplateServiceImpl.java | 10 + .../src/views/wms/sch/point/index.vue | 70 ++++-- 15 files changed, 788 insertions(+), 131 deletions(-) create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/controller/PdaProductionController.java create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaBuildParamService.java create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaProductionService.java create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/DefaultPdaBuildParam.java create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaProductionServiceImpl.java create mode 100644 wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/CallMaterialTask.java 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 new file mode 100644 index 0000000..74acd44 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/controller/PdaProductionController.java @@ -0,0 +1,50 @@ +package org.nl.wms.pda.general_management.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.logging.annotation.Log; +import org.nl.wms.pda.general_management.service.PdaProductionService; +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: 2025/12/1 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/pdaProduction") +@Slf4j +public class PdaProductionController { + + @Resource + private PdaProductionService pdaProductionService; + + @PostMapping("/getStockGroupInfo") + @Log("托盘叫料-获取物料库存信息") + @SaIgnore + public ResponseEntity getStockGroupInfo(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaProductionService.getStockGroupInfo(whereJson), HttpStatus.OK); + } + @PostMapping("/confirmCallMaterial") + @Log("托盘叫料-确认叫料") + @SaIgnore + public ResponseEntity confirmCallMaterial(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaProductionService.confirmCallMaterial(whereJson), HttpStatus.OK); + } + @PostMapping("/getGroupInfo") + @Log("剩料回库-获取物料信息") + @SaIgnore + public ResponseEntity getGroupInfo(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaProductionService.getGroupInfo(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 new file mode 100644 index 0000000..3fae090 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaBuildParamService.java @@ -0,0 +1,59 @@ +package org.nl.wms.pda.general_management.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.basedata_manage.service.dao.Sectattr; +import org.nl.wms.sch_manage.service.dao.SchBasePoint; + +import java.util.Map; + +/** + * 默认实现参数构建方法 + * @Author: lyd + * @Date: 2025/12/1 + */ +public interface PdaBuildParamService { + /** + * 构建组盘参数 + * @param param + * @param startPoint + */ + void doGroupPallet(JSONObject param, SchBasePoint startPoint); + + /** + * 构建创建任务参数 + * @param startPoint + * @param invId + * @return + */ + Map buildTaskData(SchBasePoint startPoint, String invId); + + /** + * 构建分配获取参数 + * @param param + * @param sect + * @param invId + * @return + */ + Map buildDivStructData(JSONObject param, Sectattr sect, String invId); + + /** + * 构建创建入库单参数 + * @param param + * @param startPoint + * @param sect + * @return + */ + Map doBuildInvObj(JSONObject param, SchBasePoint startPoint, Sectattr sect); + + /** + * 构建出库单参数 + * @param param + * @param sectattr + * @return + */ + JSONObject doBuildOutInvObj(JSONObject param, Sectattr sectattr); + + JSONObject buildManuaOutDivData(JSONObject param, String invId); + + JSONObject buildOutAllSetData(SchBasePoint endPoint, String invId); +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaPreTreatmentService.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaPreTreatmentService.java index 30e31c5..f6c0896 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaPreTreatmentService.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaPreTreatmentService.java @@ -1,7 +1,11 @@ package org.nl.wms.pda.general_management.service; import com.alibaba.fastjson.JSONObject; +import org.nl.wms.basedata_manage.service.dao.Sectattr; import org.nl.wms.pda.util.PdaResponse; +import org.nl.wms.sch_manage.service.dao.SchBasePoint; + +import java.util.Map; /** * @Author: lyd 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 new file mode 100644 index 0000000..ac9a633 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/PdaProductionService.java @@ -0,0 +1,26 @@ +package org.nl.wms.pda.general_management.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.pda.util.PdaResponse; + +/** + * @Author: lyd + * @Date: 2025/12/1 + */ +public interface PdaProductionService { + /** + * 获取组盘信息 + * @param param + * @return + */ + PdaResponse getGroupInfo(JSONObject param); + + /** + * 获取库存信息 + * @param param + * @return + */ + PdaResponse getStockGroupInfo(JSONObject param); + + PdaResponse confirmCallMaterial(JSONObject param); +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/DefaultPdaBuildParam.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/DefaultPdaBuildParam.java new file mode 100644 index 0000000..648cf6b --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/DefaultPdaBuildParam.java @@ -0,0 +1,168 @@ +package org.nl.wms.pda.general_management.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; +import org.nl.wms.basedata_manage.service.dao.Sectattr; +import org.nl.wms.pda.general_management.service.PdaBuildParamService; +import org.nl.wms.pda.general_management.service.PdaCommonService; +import org.nl.wms.pda.general_management.service.dto.AssemblyPalletParam; +import org.nl.wms.sch_manage.service.dao.SchBasePoint; +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.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.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Author: lyd + * @Date: 2025/12/1 + */ +@Slf4j +@Service("defaultPdaBuildParam") +public class DefaultPdaBuildParam implements PdaBuildParamService { + + @Resource + private IOStorInvDisMapper ioStorInvDisMapper; + @Resource + private IOStorInvDtlMapper ioStorInvDtlMapper; + @Resource + private PdaCommonService pdaCommonService; + @Resource + private IMdPbGroupplateService groupplateService; + @Resource + private IRawAssistIStorService rawAssistIStorService; + @Override + public void doGroupPallet(JSONObject param, SchBasePoint startPoint) { + JSONArray rows = param.getJSONArray("rows"); + List bagCode = rows + .stream() + .map(HashMap.class::cast) + .map(p -> MapUtil.getStr(p, "bag_code")) + .collect(Collectors.toList()); + List list = groupplateService.list(new LambdaQueryWrapper() + .in(GroupPlate::getBag_code, bagCode) + .eq(GroupPlate::getStatus, "0")); + AssemblyPalletParam palletParam = new AssemblyPalletParam(); + palletParam.setVehicle_code(startPoint.getVehicle_code()); + palletParam.setGroup_plates(list); + pdaCommonService.confirmPalletAssembly(palletParam); + } + + @Override + public Map buildTaskData(SchBasePoint startPoint, String invId) { + Map jsonMst = new HashMap<>(); + jsonMst.put("point_code", startPoint.getPoint_code()); + // 组织明细数据 + List dtlDao = ioStorInvDtlMapper.selectList( + new QueryWrapper().lambda() + .eq(IOStorInvDtl::getIostorinv_id, invId) + ); + // 查找分配明细 + Map map = new HashMap<>(); + map.put("iostorinvdtl_id",dtlDao.get(0).getIostorinvdtl_id()); + List disDtl = rawAssistIStorService.getDisDtl(map); + // 类型转换 + ArrayList tableMater = new ArrayList<>(); + disDtl.forEach(item -> tableMater.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class))); + jsonMst.put("tableMater", tableMater); + return jsonMst; + } + + @Override + public Map buildDivStructData(JSONObject param, Sectattr sect, String invId) { + Map divObj = new HashMap<>(); + divObj.put("sect_id", sect.getSect_id()); + divObj.put("sect_code", param.getString("sect_code")); + divObj.put("sect_name", param.getString("sect_name")); + divObj.put("struct_id", param.getString("struct_id")); + divObj.put("struct_name", param.getString("struct_name")); + divObj.put("struct_code", param.getString("struct_code")); + divObj.put("checked", true); + List ioStorInvDis = ioStorInvDisMapper.selectList(new LambdaQueryWrapper() + .eq(IOStorInvDis::getIostorinv_id, invId)); + if (ioStorInvDis.size() == 0) { + throw new BadRequestException("分配明细不存在!"); + } + // 类型转换 + ArrayList tables = new ArrayList<>(); + ioStorInvDis.forEach(item -> tables.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class))); + divObj.put("tableMater", tables); + return divObj; + } + + @Override + public Map doBuildInvObj(JSONObject param, SchBasePoint startPoint, Sectattr sect) { + JSONArray rows = param.getJSONArray("rows"); + Map res = new HashMap<>(); + ArrayList tableData = new ArrayList<>(); + res.put("tableData", tableData); + res.put("stor_id", sect.getStor_id()); + res.put("bill_status", "10"); + res.put("detail_count", rows.size()); + res.put("bill_type", param.getString("bill_type")); + res.put("biz_date", DateUtil.format(new Date(), "yyyy-MM-dd")); + for (int i = 0; i < rows.size(); i++) { + HashMap table = new HashMap<>(); + JSONObject row = rows.getJSONObject(i); + table.put("group_id", row.getString("group_id")); + table.put("storagevehicle_code", startPoint.getVehicle_code()); + table.put("material_id", row.getString("material_id")); + table.put("pcsn", row.getString("pcsn")); + table.put("qty", row.getBigDecimal("qty")); + table.put("plan_qty", row.getBigDecimal("qty")); + table.put("qty_unit_id", row.getString("qty_unit_id")); + table.put("qty_unit_name", row.getString("qty_unit_name")); + table.put("status", "01"); + table.put("bag_no", row.getString("bag_no")); + table.put("material_code", row.getString("material_code")); + table.put("material_name", row.getString("material_name")); + table.put("material_spec", row.getString("material_spec")); + tableData.add(table); + } + return res; + } + + @Override + public JSONObject doBuildOutInvObj(JSONObject param, Sectattr sectattr) { + JSONObject insertInvObj = new JSONObject(); + JSONArray rows = param.getJSONArray("rows"); + insertInvObj.put("stor_id", sectattr.getStor_id()); + insertInvObj.put("bill_status", "10"); + insertInvObj.put("bill_type", param.getString("bill_type")); + insertInvObj.put("biz_date", DateUtil.format(new Date(), "yyyy-MM-dd")); + insertInvObj.put("tableData", rows); + return insertInvObj; + } + + @Override + public JSONObject buildManuaOutDivData(JSONObject param, String invId) { + JSONObject outDivObj = new JSONObject(); + JSONObject row = param.getJSONArray("rows").getJSONObject(0); + row.put("iostorinv_id", invId); + outDivObj.put("row", row); + outDivObj.put("rows", param.getJSONArray("rows")); + return outDivObj; + } + + @Override + public JSONObject buildOutAllSetData(SchBasePoint endPoint, String invId) { + JSONObject outDivObj = new JSONObject(); + outDivObj.put("iostorinv_id", invId); + outDivObj.put("point_code", endPoint.getPoint_code()); + return outDivObj; + } +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaPreTreatmentServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaPreTreatmentServiceImpl.java index 6856831..72f6e88 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaPreTreatmentServiceImpl.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaPreTreatmentServiceImpl.java @@ -1,42 +1,31 @@ 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.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.nl.common.exception.BadRequestException; import org.nl.wms.basedata_manage.service.ISectattrService; import org.nl.wms.basedata_manage.service.dao.Sectattr; -import org.nl.wms.pda.general_management.service.PdaCommonService; +import org.nl.wms.pda.general_management.service.PdaBuildParamService; import org.nl.wms.pda.general_management.service.PdaPreTreatmentService; -import org.nl.wms.pda.general_management.service.dto.AssemblyPalletParam; import org.nl.wms.pda.util.PdaResponse; 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.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.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.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.*; +import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; /** * @Author: lyd @@ -54,15 +43,11 @@ public class PdaPreTreatmentServiceImpl implements PdaPreTreatmentService { @Resource private ISectattrService sectattrService; @Resource - private IOStorInvDisMapper ioStorInvDisMapper; - @Resource - private IOStorInvDtlMapper ioStorInvDtlMapper; - @Resource private RedissonClient redissonClient; @Resource - private PdaCommonService pdaCommonService; - @Resource private ISchBaseTaskService taskService; + @Resource + private PdaBuildParamService defaultPdaBuildParam; @Override public PdaResponse getPalletAssembly(JSONObject param) { String search = param.getString("search"); @@ -96,9 +81,12 @@ public class PdaPreTreatmentServiceImpl implements PdaPreTreatmentService { if (ObjectUtil.isEmpty(startPoint.getVehicle_code())) { throw new BadRequestException("点位载具号为空!"); } - Sectattr sectattr = sectattrService.findByCode("WYL01", true); + if (ObjectUtil.isEmpty(startPoint.getIn_sect())) { + throw new BadRequestException("该点位未配置入库库区,请到点位管理配置!"); + } + Sectattr sectattr = sectattrService.findByCode(startPoint.getIn_sect(), true); if (ObjectUtil.isEmpty(sectattr)) { - throw new BadRequestException("库区【物料室原料区】不存在或者被禁用!"); + throw new BadRequestException("库区不存在或者被禁用!"); } // 判断任务是否创建 List tasks = taskService.getTaskByQuery(new LambdaQueryWrapper() @@ -107,16 +95,16 @@ public class PdaPreTreatmentServiceImpl implements PdaPreTreatmentService { throw new BadRequestException("该点位已创建过任务!"); } // 0 组盘 - doGroupPallat(param, startPoint); - + defaultPdaBuildParam.doGroupPallet(param, startPoint); + param.put("bill_type", IOSEnum.IN_BILL_TYPE.code("原辅料入库")); // 1 创建入库单、明细、分配明细 - Map invObj = doBuildInvObj(param, startPoint); + Map invObj = defaultPdaBuildParam.doBuildInvObj(param, startPoint, sectattr); String invId = rawAssistIStorService.insertDtl(invObj); - // 2 调用分配 (WYL01) - Map divObj = buildDivStructData(sectattr, invId); + // 2 调用分配 + Map divObj = defaultPdaBuildParam.buildDivStructData(param, sectattr, invId); rawAssistIStorService.divStruct(divObj); // 3 创建任务 - Map jsonMst = buildTaskData(startPoint, invId); + Map jsonMst = defaultPdaBuildParam.buildTaskData(startPoint, invId); rawAssistIStorService.divPoint(jsonMst); } else { throw new BadRequestException("速度太快啦,稍后再试..."); @@ -128,87 +116,4 @@ public class PdaPreTreatmentServiceImpl implements PdaPreTreatmentService { } return PdaResponse.requestOk(); } - - private void doGroupPallat(JSONObject param, SchBasePoint startPoint) { - JSONArray rows = param.getJSONArray("rows"); - List bagCode = rows - .stream() - .map(HashMap.class::cast) - .map(p -> MapUtil.getStr(p, "bag_code")) - .collect(Collectors.toList()); - List list = groupplateService.list(new LambdaQueryWrapper() - .in(GroupPlate::getBag_code, bagCode) - .eq(GroupPlate::getStatus, "0")); - AssemblyPalletParam palletParam = new AssemblyPalletParam(); - palletParam.setVehicle_code(startPoint.getVehicle_code()); - palletParam.setGroup_plates(list); - pdaCommonService.confirmPalletAssembly(palletParam); - } - - private Map buildTaskData(SchBasePoint startPoint, String invId) { - Map jsonMst = new HashMap<>(); - jsonMst.put("point_code", startPoint.getPoint_code()); - // 组织明细数据 - List dtlDao = ioStorInvDtlMapper.selectList( - new QueryWrapper().lambda() - .eq(IOStorInvDtl::getIostorinv_id, invId) - ); - // 查找分配明细 - Map map = new HashMap<>(); - map.put("iostorinvdtl_id",dtlDao.get(0).getIostorinvdtl_id()); - List disDtl = rawAssistIStorService.getDisDtl(map); - // 类型转换 - ArrayList tableMater = new ArrayList<>(); - disDtl.forEach(item -> tableMater.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class))); - jsonMst.put("tableMater", tableMater); - return jsonMst; - } - - private Map buildDivStructData(Sectattr sect, String invId) { - Map divObj = new HashMap<>(); - divObj.put("sect_id", sect.getSect_id()); - divObj.put("checked", true); - List ioStorInvDis = ioStorInvDisMapper.selectList(new LambdaQueryWrapper() - .eq(IOStorInvDis::getIostorinv_id, invId)); - if (ioStorInvDis.size() == 0) { - throw new BadRequestException("分配明细不存在!"); - } - // 类型转换 - ArrayList tables = new ArrayList<>(); - ioStorInvDis.forEach(item -> tables.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class))); - divObj.put("tableMater", tables); - return divObj; - } - - private Map doBuildInvObj(JSONObject param, SchBasePoint startPoint) { - JSONArray rows = param.getJSONArray("rows"); - Map res = new HashMap<>(); - ArrayList tableData = new ArrayList<>(); - res.put("tableData", tableData); - // 物料室仓库 - res.put("stor_id", "1582991156504039424"); - res.put("bill_status", "10"); - res.put("detail_count", rows.size()); - res.put("bill_type", "0001"); - res.put("biz_date", DateUtil.format(new Date(), "yyyy-MM-dd")); - for (int i = 0; i < rows.size(); i++) { - HashMap table = new HashMap<>(); - JSONObject row = rows.getJSONObject(i); - table.put("group_id", row.getString("group_id")); - table.put("storagevehicle_code", startPoint.getVehicle_code()); - table.put("material_id", row.getString("material_id")); - table.put("pcsn", row.getString("pcsn")); - table.put("qty", row.getBigDecimal("qty")); - table.put("plan_qty", row.getBigDecimal("qty")); - table.put("qty_unit_id", row.getString("qty_unit_id")); - table.put("qty_unit_name", row.getString("qty_unit_name")); - table.put("status", "01"); - table.put("bag_no", row.getString("bag_no")); - table.put("material_code", row.getString("material_code")); - table.put("material_name", row.getString("material_name")); - table.put("material_spec", row.getString("material_spec")); - tableData.add(table); - } - return res; - } } 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 new file mode 100644 index 0000000..517c154 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/general_management/service/impl/PdaProductionServiceImpl.java @@ -0,0 +1,104 @@ +package org.nl.wms.pda.general_management.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; +import org.nl.wms.basedata_manage.service.ISectattrService; +import org.nl.wms.basedata_manage.service.dao.Sectattr; +import org.nl.wms.pda.general_management.service.PdaBuildParamService; +import org.nl.wms.pda.general_management.service.PdaPreTreatmentService; +import org.nl.wms.pda.general_management.service.PdaProductionService; +import org.nl.wms.pda.util.PdaResponse; +import org.nl.wms.sch_manage.service.ISchBasePointService; +import org.nl.wms.sch_manage.service.dao.SchBasePoint; +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.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @Author: lyd + * @Date: 2025/12/1 + */ +@Slf4j +@Service +public class PdaProductionServiceImpl implements PdaProductionService { + @Resource + private IMdPbGroupplateService groupplateService; + @Resource + private ISchBasePointService pointService; + @Resource + private PdaPreTreatmentService pdaPreTreatmentService; + @Resource + private ISectattrService sectattrService; + @Resource + private IOutBillService outBillService; + @Resource + private PdaBuildParamService defaultPdaBuildParam; + @Override + public PdaResponse getGroupInfo(JSONObject param) { + // search; + String search = param.getString("search").trim(); + SchBasePoint pointObj = pointService.getByPointCode(search, false); + if (ObjectUtil.isNotEmpty(pointObj)) { + search = pointObj.getVehicle_code(); + } + if (ObjectUtil.isEmpty(search)) { + throw new BadRequestException("载具不存在!"); + } + List res = groupplateService.getPalletViewByVehicleCode(search); + 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("请选择库区!"); + } + List res = groupplateService.getStockGroupInfo(param); + return PdaResponse.requestParamOk(res); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public PdaResponse confirmCallMaterial(JSONObject param) { + // point_code, rows,sect_code + log.info("手持托盘叫料:{}", param); + if (ObjectUtil.isEmpty(param.get("point_code"))) { + throw new BadRequestException("请输入要料点!"); + } + if (ObjectUtil.isEmpty(param.get("rows"))) { + throw new BadRequestException("请选择呼叫的物料!"); + } + String pointCode = param.getString("point_code"); + SchBasePoint endPoint = pointService.getByPointCode(pointCode, true); + if (ObjectUtil.isEmpty(endPoint)) { + throw new BadRequestException("输入的点位不存在或者点位已被禁用, 请检查输入点位是否正确或是否被禁用!"); + } + String sectCode = param.getString("sect_code"); + if (ObjectUtil.isEmpty(sectCode)) { + throw new BadRequestException("请选择仓库!"); + } + Sectattr outStructAttr = sectattrService.findByCode(sectCode, true); + if (ObjectUtil.isEmpty(outStructAttr)) { + throw new BadRequestException("库区不存在或者被禁用!"); + } + // 1 创建出库单、明细、分配明细 + param.put("bill_type", IOSEnum.OUT_BILL_TYPE.code("原辅料出库")); + JSONObject invObj = defaultPdaBuildParam.doBuildOutInvObj(param, outStructAttr); + String invId = outBillService.insertDtl(invObj); + // 2 调用分配 + JSONObject divObj = defaultPdaBuildParam.buildManuaOutDivData(param, invId); + outBillService.manualDiv(divObj); + // 3 创建任务 + JSONObject jsonMst = defaultPdaBuildParam.buildOutAllSetData(endPoint, invId); + outBillService.allSetPoint(jsonMst); + return PdaResponse.requestOk("呼叫成功!"); + } +} diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/SchBasePoint.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/SchBasePoint.java index 97fdaf3..df81151 100644 --- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/SchBasePoint.java +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/dao/SchBasePoint.java @@ -125,6 +125,12 @@ public class SchBasePoint implements Serializable { private String ios_id; + // 出库库区 + private String out_sect; + + // 入库库区 + private String in_sect; + @TableField(exist = false) private List can_vehicle_types; diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/CallMaterialTask.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/CallMaterialTask.java new file mode 100644 index 0000000..e76c9b9 --- /dev/null +++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/CallMaterialTask.java @@ -0,0 +1,224 @@ +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.TaskType; +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.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +/** + * 叫料出库 + * @Author: lyd + * @Date: 2025/12/1 + */ +@Component(value = "CallMaterialTask") +@TaskType("CallMaterialTask") +public class CallMaterialTask extends AbstractTask { + @Resource + 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(HandOutTask.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) { + // 更新终点 + iSchBasePointService.update( + new UpdateWrapper().lambda() + .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2()) + .set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code()) + .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有箱有料")) + .set(SchBasePoint::getIng_task_code, taskObj.getTask_id()) + ); + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("已完成"); + taskService.updateById(taskObj); + outBillService.taskFinish(taskObj); + 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) { +// 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/warehouse_management/enums/IOSEnum.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSEnum.java index 61f4ee2..157a8ec 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 @@ -36,7 +36,8 @@ public enum IOSEnum { )), // 出库业务类型 - OUT_BILL_TYPE(MapOf.of("手工出库", "1009" + OUT_BILL_TYPE(MapOf.of("手工出库", "1009", + "原辅料出库", "1001" )), // 移库业务类型 @@ -51,7 +52,8 @@ public enum IOSEnum { )), // 出库任务配置类编码 - OUT_CONFIG_CODE(MapOf.of( "1009", "HandOutTask" + OUT_CONFIG_CODE(MapOf.of( "1009", "HandOutTask", + "1001", "CallMaterialTask" )), // 移库任务配置类编码 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 efae19a..ee4b937 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 @@ -96,4 +96,8 @@ public interface IMdPbGroupplateService extends IService { List getByBagNo(String bagNo, String status); List getPalletView(String search); + + List getPalletViewByVehicleCode(String search); + + List getStockGroupInfo(JSONObject param); } diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/MdPbGroupplateMapper.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/dao/mapper/MdPbGroupplateMapper.java index b4f017f..198b8d3 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 @@ -65,4 +65,8 @@ public interface MdPbGroupplateMapper extends BaseMapper { List pdaGetPointDtl(@Param("param") JSONObject whereJson); List getPalletView(String search); + + List getPalletViewByVehicleCode(String search); + + List getStockGroupInfo(JSONObject 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 28c49c9..e9acbc2 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 @@ -151,4 +151,59 @@ LEFT JOIN md_cs_supplierbase s ON s.supp_code = g.supp_code WHERE g.bag_code = #{search} AND g.`status` = '0' + + 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 fd450ad..0312dbb 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 @@ -193,4 +193,14 @@ public class MdPbGroupplateServiceImpl extends ServiceImpl getPalletView(String search) { return this.baseMapper.getPalletView(search); } + + @Override + public List getPalletViewByVehicleCode(String search) { + return this.baseMapper.getPalletViewByVehicleCode(search); + } + + @Override + public List getStockGroupInfo(JSONObject param) { + return this.baseMapper.getStockGroupInfo(param); + } } diff --git a/wms/nladmin-ui/src/views/wms/sch/point/index.vue b/wms/nladmin-ui/src/views/wms/sch/point/index.vue index 4631c40..ce9df5e 100644 --- a/wms/nladmin-ui/src/views/wms/sch/point/index.vue +++ b/wms/nladmin-ui/src/views/wms/sch/point/index.vue @@ -37,12 +37,12 @@ - + + + + + + + + + + + @@ -252,7 +278,7 @@ - + @@ -263,8 +289,8 @@ v-for="item in dict.vehicle_type" :key="item.value" :label="item.label" - :value="item.value"> - + :value="item.value" + /> @@ -276,12 +302,12 @@ v-for="item in dict.vehicle_type" :key="item.value" :label="item.label" - :value="item.value"> - + :value="item.value" + /> - + {{ item.label }} @@ -306,8 +332,8 @@ - - + + @@ -376,6 +402,7 @@ import udOperation from '@crud/UD.operation' import pagination from '@crud/Pagination' import ViewDialog from '@/views/wms/sch/point/ViewDialog' import PointDialog from '@/views/wms/sch/point/PointDialog' +import Sectattr from '@/views/wms/basedata/sectattr/sectattr' const defaultForm = { point_code: null, @@ -405,6 +432,8 @@ const defaultForm = { workshop_code: null, is_auto: 'true', remark: null, + in_sect: null, + out_sect: null, is_used: 'true', can_vehicle_types: null } @@ -458,13 +487,20 @@ export default { pointStatusList: [], pointStatusDialogList: [], pointTypesDialogList: [], - pointDialog: false + pointDialog: false, + sects: [] } }, created() { this.getRegionList() + this.getSects() }, methods: { + getSects() { + Sectattr.getOneSect({ 'stor_id': '' }).then(res => { + this.sects = res + }) + }, // 钩子:在获取表格数据之前执行,false 则代表不获取数据 [CRUD.HOOK.beforeRefresh]() { return true