From e004148f19e6ac400e7cd0d4969e764a30099d26 Mon Sep 17 00:00:00 2001 From: zgw Date: Fri, 10 Jul 2026 16:07:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 6 +++ .../erp/ErpInStockinConfirmRequest.java | 5 +- .../domain/erp/ReceiveOutStockConfirm.java | 3 +- .../api/service/impl/ToErpServiceImpl.java | 9 ++-- .../api/service/impl/ToWmsServiceImpl.java | 29 +++++------ .../domain/ViewHandAllotStock.java | 15 ++++++ .../service/impl/OutStockoutServiceImpl.java | 5 +- .../com/ruoyi/pda/service/PdaServiceImp.java | 31 ++++++++++++ .../service/impl/TrayMsgServiceImpl.java | 49 ++++++++++++++++++- .../bas/cargoSpace/BasCargoSpaceMapper.xml | 4 +- .../mapper/out/ViewHandAllotStockMapper.xml | 9 +++- .../resources/mapper/pda/TrayMsgMapper.xml | 4 +- .../resources/mapper/stock/BasStockMapper.xml | 2 +- ruoyi-ui/src/api/out/outStockout.js | 9 ++++ ruoyi-ui/src/views/out/outStockoutManage.vue | 38 +++++++++++--- ruoyi-ui/src/views/pda/trayMsg/index.vue | 12 ++--- ruoyi-ui/src/views/stock/pointOut.vue | 1 + 17 files changed, 185 insertions(+), 46 deletions(-) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..bb75874 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "FT542-WMS", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/erp/ErpInStockinConfirmRequest.java b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/erp/ErpInStockinConfirmRequest.java index 59bb7da..dac7ebc 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/erp/ErpInStockinConfirmRequest.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/erp/ErpInStockinConfirmRequest.java @@ -3,9 +3,6 @@ package com.ruoyi.api.domain.erp; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; -import java.math.BigDecimal; -import java.util.List; - /** * ERP入库回传请求参数 */ @@ -40,7 +37,7 @@ public class ErpInStockinConfirmRequest { * 入库明细 */ @JsonProperty("KuinList") - private List kuinList; + private String kuinList; /** * 客户名称 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/erp/ReceiveOutStockConfirm.java b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/erp/ReceiveOutStockConfirm.java index 6e07306..f22c612 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/erp/ReceiveOutStockConfirm.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/erp/ReceiveOutStockConfirm.java @@ -7,7 +7,6 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.util.Date; -import java.util.List; @AllArgsConstructor @NoArgsConstructor @Data @@ -21,7 +20,7 @@ public class ReceiveOutStockConfirm { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date date5; - private List kuoutList; + private String kuoutList; @JsonProperty("!B__SysCusmf_0_62001_511_0") private String sysCusmfField511; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToErpServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToErpServiceImpl.java index 25803ce..e33802a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToErpServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToErpServiceImpl.java @@ -338,6 +338,7 @@ public class ToErpServiceImpl implements IToErpService { erpOutStock.setSpare4(Convert.toStr(row.get(27))); String stockOutId = basJobIdService.getJobId("CKD"); outStockout.setStockoutId(stockOutId); + outStockout.setClassNowId(erpOutStock.getStockoutId()); outStockout.setWarehouseId(Convert.toStr(row.get(2))); outStockout.setErpStockoutId(Convert.toStr(row.get(0))); outStockout.setStockoutGuid(stockOutId); @@ -754,7 +755,7 @@ public class ToErpServiceImpl implements IToErpService { newStockin.setProductDetails(Convert.toStr(row.get(15))); newStockin.setCustomerName(Convert.toStr(row.get(16))); newStockin.setWeighbillNo(Convert.toStr(row.get(17))); - newStockin.setVehicleNo(Convert.toStr(row.get(18))); + newStockin.setVehicleNo(Convert.toStr(row.get(1))); newStockin.setOrderSrc("ERP"); try { java.math.BigDecimal orderSum = new java.math.BigDecimal("0"); @@ -851,15 +852,15 @@ public class ToErpServiceImpl implements IToErpService { //回传ERP try { ErpInStockinConfirmRequest request = new ErpInStockinConfirmRequest(); - request.setOrd(inStockinN.getErpStockinId()); + request.setOrd(inStockinN.getVehicleNo()); request.setDate5(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); - request.setComplete1(1); + request.setComplete1(3); request.setIntro2(inStockinN.getRemark()); request.setCustomerName(inStockinN.getCustomerName()); request.setWeighbillNo(inStockinN.getWeighbillNo()); request.setVehicleNo(inStockinN.getVehicleNo()); List detailList = getErp(stockinDetailNs); - request.setKuinList(detailList); + request.setKuinList(JSONUtil.toJsonStr(detailList)); String json = objectMapper.writeValueAsString(request); if (!post(stockinConfirmUrl,json,"入库确认").getSuccess()) { throw new RuntimeException("回传ERP失败"); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToWmsServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToWmsServiceImpl.java index ecda3ad..cf75196 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToWmsServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToWmsServiceImpl.java @@ -309,18 +309,12 @@ public class ToWmsServiceImpl implements IToWmsService { // 先尝试传入的两层 plan.add(normalized.toArray(new Integer[0])); - // 再尝试中间层补位(如 1、3 -> 2) - Set assigned = new LinkedHashSet<>(normalized); - List middle = new ArrayList<>(); - int min = normalized.get(0); - int max = normalized.get(1); - for (int i = min + 1; i < max; i++) { - if (SUPPORTED_LAYERS.contains(i) && !assigned.contains(i)) { - middle.add(i); - } - } - if (!middle.isEmpty()) { - plan.add(middle.toArray(new Integer[0])); + // 再尝试未传入的剩余层(如 1、2 -> 3,2、3 -> 1,1、3 -> 2) + List remaining = SUPPORTED_LAYERS.stream() + .filter(layer -> !normalized.contains(layer)) + .collect(java.util.stream.Collectors.toList()); + if (!remaining.isEmpty()) { + plan.add(remaining.toArray(new Integer[0])); } return plan; } @@ -384,8 +378,15 @@ public class ToWmsServiceImpl implements IToWmsService { outJob.setExecutionPhase("2"); mydoJobService.updateMydoJob(outJob); BasCargoSpace basCargoSpace =basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(outJob.getCargoSpaceId()); - basCargoSpace.setStatus("1"); - basCargoSpaceService.updateBasCargoSpace(basCargoSpace); + if (basCargoSpace != null && outJob.getTrayCode().equals(basCargoSpace.getTrayCode())) { + basCargoSpace.setStatus("1"); + basCargoSpace.setTrayCode(null); + basCargoSpaceService.updateBasCargoSpace(basCargoSpace); + } else { + log.warn("出库完成不清空货位,货位已被其他托盘占用: taskNo={}, jobId={}, cargoSpaceId={}, outTray={}, currTray={}", + outJob.getTaskNo(), outJob.getJobId(), outJob.getCargoSpaceId(), outJob.getTrayCode(), + basCargoSpace == null ? null : basCargoSpace.getTrayCode()); + } break; default: diff --git a/ruoyi-admin/src/main/java/com/ruoyi/out/handAllotStock/domain/ViewHandAllotStock.java b/ruoyi-admin/src/main/java/com/ruoyi/out/handAllotStock/domain/ViewHandAllotStock.java index e21bbeb..bd4b0e9 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/out/handAllotStock/domain/ViewHandAllotStock.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/out/handAllotStock/domain/ViewHandAllotStock.java @@ -43,6 +43,10 @@ public class ViewHandAllotStock extends BaseEntity @Excel(name = "库存数量") private String quantity; + /** 最近入库时间 */ + @Excel(name = "最近入库时间") + private String inDate; + public void setOnlyIdentity(Long onlyIdentity) { this.onlyIdentity = onlyIdentity; @@ -113,6 +117,16 @@ public class ViewHandAllotStock extends BaseEntity return quantity; } + public void setInDate(String inDate) + { + this.inDate = inDate; + } + + public String getInDate() + { + return inDate; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) @@ -123,6 +137,7 @@ public class ViewHandAllotStock extends BaseEntity .append("productName", getProductName()) .append("groupCodingNo", getGroupCodingNo()) .append("quantity", getQuantity()) + .append("inDate", getInDate()) .toString(); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/out/outStockout/service/impl/OutStockoutServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/out/outStockout/service/impl/OutStockoutServiceImpl.java index 2395ed3..6740564 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/out/outStockout/service/impl/OutStockoutServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/out/outStockout/service/impl/OutStockoutServiceImpl.java @@ -2,6 +2,7 @@ package com.ruoyi.out.outStockout.service.impl; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import com.ruoyi.api.domain.erp.ReceiveOutStockConfirm; import com.ruoyi.api.service.IToWcsService; import com.ruoyi.api.service.impl.ToErpServiceImpl; @@ -160,7 +161,7 @@ public class OutStockoutServiceImpl implements IOutStockoutService ReceiveOutStockConfirm receiveOutStockConfirm = new ReceiveOutStockConfirm(); OutStockout outStockout = selectOutStockoutByStockoutGuid(stockoutId); List outStockoutDetails = outStockoutDetailService.selectOutStockoutDetailByStockoutGuid(stockoutId); - receiveOutStockConfirm.setOrd(Convert.toInt(outStockout.getErpStockoutId())); + receiveOutStockConfirm.setOrd(Convert.toInt(outStockout.getClassNowId())); receiveOutStockConfirm.setComplete1(3); receiveOutStockConfirm.setIntro2("出库确认完成,货物已全部发出"); receiveOutStockConfirm.setDate5(new Date()); @@ -172,7 +173,7 @@ public class OutStockoutServiceImpl implements IOutStockoutService kuout.setCk(Convert.toInt(outStockout.getWarehouseId())); kuouts.add(kuout); } - receiveOutStockConfirm.setKuoutList(kuouts); + receiveOutStockConfirm.setKuoutList(JSONUtil.toJsonStr(kuouts)); AjaxResult ajaxResult = toErpService.callErp(receiveOutStockConfirm); if (!ajaxResult.isSuccess()){ stringBuilder.append(",").append(stockoutId).append(ajaxResult.get("msg")); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/pda/service/PdaServiceImp.java b/ruoyi-admin/src/main/java/com/ruoyi/pda/service/PdaServiceImp.java index 017b042..2b2ca2a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/pda/service/PdaServiceImp.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/pda/service/PdaServiceImp.java @@ -4,6 +4,8 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.ruoyi.api.domain.RequestEnter; import com.ruoyi.api.service.IToWmsService; +import com.ruoyi.bas.cargoSpace.domain.BasCargoSpace; +import com.ruoyi.bas.cargoSpace.service.IBasCargoSpaceService; import com.ruoyi.bas.warehouse.domain.BasWarehouse; import com.ruoyi.bas.warehouse.mapper.BasWarehouseMapper; import com.ruoyi.check.commit.domain.CheckCommitRecord; @@ -57,6 +59,8 @@ public class PdaServiceImp implements PdaService { private BasWarehouseMapper basWarehouseMapper; @Autowired private BasStockMapper basStockMapper; + @Autowired + private IBasCargoSpaceService basCargoSpaceService; @Override @@ -111,17 +115,44 @@ public class PdaServiceImp implements PdaService { if(mydoJobDetails.isEmpty() ){ return AjaxResult.error("该物料没有出库作业,请检查"); } + List mydoJobs = mydoJobService.selectMydoJobList(mydoJobParam); + String cargoSpaceId = CollUtil.isEmpty(mydoJobs) ? null : mydoJobs.get(0).getCargoSpaceId(); HashMap map = new HashMap<>(); map.put("v_tray_code", trayCodeMakeSure.getTrayCode()); pdaMapper.outMakeSure(map); String result = map.get("v_result").toString(); if ("10".equals(result)) { + restoreCargoSpaceIfOccupied(trayCodeMakeSure.getTrayCode(), cargoSpaceId); return AjaxResult.success(); } else { return AjaxResult.error( map.get("v_resultmsg").toString()); } } + private void restoreCargoSpaceIfOccupied(String trayCode, String cargoSpaceId) { + if (StrUtil.isEmpty(cargoSpaceId)) { + return; + } + + BasStock stockQuery = new BasStock(); + stockQuery.setCargoSpaceId(cargoSpaceId); + List stockList = basStockMapper.selectBasStockList(stockQuery); + if (CollUtil.isEmpty(stockList)) { + return; + } + + BasStock stock = stockList.get(0); + BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(cargoSpaceId); + if (cargoSpace == null) { + return; + } + cargoSpace.setStatus("2"); + cargoSpace.setTrayCode(stock.getTrayCode()); + basCargoSpaceService.updateBasCargoSpace(cargoSpace); + log.warn("PDA出库确认后发现货位仍有库存,已恢复货位状态: outTray={}, cargoSpaceId={}, stockTray={}", + trayCode, cargoSpaceId, stock.getTrayCode()); + } + @Override //@Transactional(rollbackFor = Exception.class) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/pda/trayMsg/service/impl/TrayMsgServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/pda/trayMsg/service/impl/TrayMsgServiceImpl.java index 7af9c9e..f4ac6c7 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/pda/trayMsg/service/impl/TrayMsgServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/pda/trayMsg/service/impl/TrayMsgServiceImpl.java @@ -4,9 +4,13 @@ import com.ruoyi.common.annotation.DataScope; import com.ruoyi.pda.trayMsg.domain.TrayMsg; import com.ruoyi.pda.trayMsg.mapper.TrayMsgMapper; import com.ruoyi.pda.trayMsg.service.ITrayMsgService; +import com.ruoyi.system.domain.InStockinDetailN; +import com.ruoyi.system.service.IInStockinDetailNService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.List; /** @@ -21,6 +25,9 @@ public class TrayMsgServiceImpl implements ITrayMsgService @Autowired private TrayMsgMapper trayMsgMapper; + @Autowired + private IInStockinDetailNService stockinDetailNService; + /** * 查询trayMsg * @@ -76,9 +83,49 @@ public class TrayMsgServiceImpl implements ITrayMsgService * @return 结果 */ @Override + @Transactional(rollbackFor = Exception.class) public int deleteTrayMsgByIds(String[] ids) { - return trayMsgMapper.deleteTrayMsgByIds(ids); + for (String id : ids) + { + TrayMsg trayMsg = trayMsgMapper.selectTrayMsgById(id); + if (trayMsg == null || trayMsg.getStockinDetailId() == null) + { + throw new IllegalStateException("托盘记录不存在或入库子单编码为空,id=" + id); + } + + String stockInDetailId = trayMsg.getStockinDetailId(); + InStockinDetailN inStockinDetailN = stockinDetailNService.selectInStockinDetailNByStockinDetailId(stockInDetailId); + if (inStockinDetailN == null) + { + throw new IllegalStateException("未找到对应的入库子单,stockinDetailId=" + stockInDetailId); + } + + BigDecimal smNum = inStockinDetailN.getSmNum() == null ? BigDecimal.ZERO : inStockinDetailN.getSmNum(); + BigDecimal trayQuantity = toBigDecimal(trayMsg.getQuantity()); + inStockinDetailN.setSmNum(smNum.subtract(trayQuantity)); + int updateRows = stockinDetailNService.updateInStockinDetailN(inStockinDetailN); + if (updateRows <= 0) + { + throw new IllegalStateException("更新入库子单失败,stockinDetailId=" + stockInDetailId); + } + } + + int deleteRows = trayMsgMapper.deleteTrayMsgByIds(ids); + if (deleteRows != ids.length) + { + throw new IllegalStateException("删除托盘记录失败,期望删除 " + ids.length + " 条,实际删除 " + deleteRows + " 条"); + } + return deleteRows; + } + + private BigDecimal toBigDecimal(String value) + { + if (value == null || value.trim().isEmpty()) + { + return BigDecimal.ZERO; + } + return new BigDecimal(value.trim()); } /** diff --git a/ruoyi-admin/src/main/resources/mapper/bas/cargoSpace/BasCargoSpaceMapper.xml b/ruoyi-admin/src/main/resources/mapper/bas/cargoSpace/BasCargoSpaceMapper.xml index 5db968b..fe4e76e 100644 --- a/ruoyi-admin/src/main/resources/mapper/bas/cargoSpace/BasCargoSpaceMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/bas/cargoSpace/BasCargoSpaceMapper.xml @@ -279,7 +279,7 @@ SELECT TOP 1 group_coding_no FROM bas_cargo_space - WHERE group_coding_no BETWEEN '001' AND '045' + WHERE group_coding_no BETWEEN '001' AND '048' GROUP BY group_coding_no HAVING SUM(CASE WHEN status != '1' THEN 1 ELSE 0 END) = 0 AND SUM(CASE WHEN locked != 'N' THEN 1 ELSE 0 END) = 0 diff --git a/ruoyi-admin/src/main/resources/mapper/out/ViewHandAllotStockMapper.xml b/ruoyi-admin/src/main/resources/mapper/out/ViewHandAllotStockMapper.xml index d5d1ca7..ae6c0a8 100644 --- a/ruoyi-admin/src/main/resources/mapper/out/ViewHandAllotStockMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/out/ViewHandAllotStockMapper.xml @@ -12,10 +12,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + - select only_identity, the_column, the_floor, product_id, product_name, group_coding_no, quantity from view_hand_allot_stock + select only_identity, the_column, the_floor, product_id, product_name, group_coding_no, quantity, in_date from view_hand_allot_stock @@ -46,6 +48,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" product_name, group_coding_no, quantity, + in_date, #{onlyIdentity}, @@ -55,6 +58,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{productName}, #{groupCodingNo}, #{quantity}, + #{inDate}, @@ -67,6 +71,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" product_name = #{productName}, group_coding_no = #{groupCodingNo}, quantity = #{quantity}, + in_date = #{inDate}, where only_identity = #{onlyIdentity} @@ -81,4 +86,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{onlyIdentity} - \ No newline at end of file + diff --git a/ruoyi-admin/src/main/resources/mapper/pda/TrayMsgMapper.xml b/ruoyi-admin/src/main/resources/mapper/pda/TrayMsgMapper.xml index 255e32d..c1a506b 100644 --- a/ruoyi-admin/src/main/resources/mapper/pda/TrayMsgMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/pda/TrayMsgMapper.xml @@ -21,8 +21,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"