diff --git a/nl-module-wms/nl-module-wms-api/src/main/java/cn/code/nl/module/wms/enums/ErrorCodeConstants.java b/nl-module-wms/nl-module-wms-api/src/main/java/cn/code/nl/module/wms/enums/ErrorCodeConstants.java index 6205362e..ede70320 100644 --- a/nl-module-wms/nl-module-wms-api/src/main/java/cn/code/nl/module/wms/enums/ErrorCodeConstants.java +++ b/nl-module-wms/nl-module-wms-api/src/main/java/cn/code/nl/module/wms/enums/ErrorCodeConstants.java @@ -25,4 +25,7 @@ public interface ErrorCodeConstants { // ================ 组盘记录相关错误码 ================= ErrorCode GROUP_PLATE_NOT_EXISTS = new ErrorCode(9, "组盘记录不存在"); + + // ========== 出入库单 1-030-001-000 ========== + ErrorCode IOSTOR_INV_BILL_CODE_GENERATE_FAIL = new ErrorCode(1_030_001_000, "单据号生成失败,请稍后重试"); } diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/iostorinv/IostorInvService.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/iostorinv/IostorInvService.java index 42203b6d..4835cf75 100644 --- a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/iostorinv/IostorInvService.java +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/iostorinv/IostorInvService.java @@ -4,6 +4,7 @@ import java.util.*; import jakarta.validation.*; import cn.code.nl.module.wms.controller.admin.iostorinv.vo.*; import cn.code.nl.module.wms.dal.dataobject.iostorinv.IostorInvDO; +import cn.code.nl.module.wms.controller.admin.iostorinv.vo.IostorInvWithDetailsSaveReqVO; import cn.code.nl.framework.common.pojo.PageResult; import cn.code.nl.framework.common.pojo.PageParam; @@ -59,4 +60,12 @@ public interface IostorInvService { */ PageResult getIostorInvPage(IostorInvPageReqVO pageReqVO); + /** + * 创建出库单(含明细) + * + * @param reqVO 创建请求(含明细列表) + * @return 出入单标识 + */ + String createIostorInvWithDetails(@Valid IostorInvWithDetailsSaveReqVO reqVO); + } diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/iostorinv/IostorInvServiceImpl.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/iostorinv/IostorInvServiceImpl.java index f6d75cb2..33165cd1 100644 --- a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/iostorinv/IostorInvServiceImpl.java +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/iostorinv/IostorInvServiceImpl.java @@ -14,6 +14,13 @@ import cn.code.nl.framework.common.pojo.PageParam; import cn.code.nl.framework.common.util.object.BeanUtils; import cn.code.nl.module.wms.dal.mysql.iostorinv.IostorInvMapper; +import cn.code.nl.module.base.api.codegen.CodeGenApi; +import cn.code.nl.module.base.api.codegen.dto.CodeGenerateReqDTO; +import cn.code.nl.module.wms.dal.mysql.iostorinvdtl.IostorinvDtlMapper; +import cn.code.nl.module.wms.dal.dataobject.iostorinvdtl.IostorinvDtlDO; +import cn.code.nl.framework.common.pojo.CommonResult; +import cn.code.nl.module.wms.controller.admin.iostorinv.vo.IostorInvWithDetailsSaveReqVO; +import java.math.BigDecimal; import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.code.nl.framework.common.util.collection.CollectionUtils.convertList; @@ -32,6 +39,12 @@ public class IostorInvServiceImpl implements IostorInvService { @Resource private IostorInvMapper iostorInvMapper; + @Resource + private CodeGenApi codeGenApi; + + @Resource + private IostorinvDtlMapper iostorinvDtlMapper; + @Override public String createIostorInv(IostorInvSaveReqVO createReqVO) { // 插入 @@ -82,4 +95,63 @@ public class IostorInvServiceImpl implements IostorInvService { return iostorInvMapper.selectPage(pageReqVO); } + @Override + @Transactional(rollbackFor = Exception.class) + public String createIostorInvWithDetails(IostorInvWithDetailsSaveReqVO reqVO) { + // 1. 调用 base 模块生成单据号 + CodeGenerateReqDTO codeReq = new CodeGenerateReqDTO(); + codeReq.setRuleCode("IO_CODE"); + CommonResult codeResult = codeGenApi.generate(codeReq); + if (codeResult == null || codeResult.getData() == null) { + throw exception(IOSTOR_INV_BILL_CODE_GENERATE_FAIL); + } + String billCode = codeResult.getData(); + + // 2. 构建主表数据 + IostorInvDO master = new IostorInvDO(); + master.setBillCode(billCode); + master.setIoType("OUT"); + master.setBillType(reqVO.getBillType()); + master.setBizDate(reqVO.getBizDate()); + master.setStorId(reqVO.getStorId()); + master.setStorCode(reqVO.getStorCode()); + master.setStorName(reqVO.getStorName()); + master.setBillStatus("生成"); + master.setRemark(reqVO.getRemark()); + master.setDetailCount(reqVO.getDetails().size()); + + // 3. 计算总重量 + BigDecimal totalWeight = reqVO.getDetails().stream() + .map(IostorInvWithDetailsSaveReqVO.DetailVO::getPlanQty) + .reduce(BigDecimal.ZERO, BigDecimal::add); + master.setTotalWeight(totalWeight); + + // 4. 插入主表 + iostorInvMapper.insert(master); + + // 5. 批量插入明细 + String iostorinvId = master.getIostorinvId(); + int seqNo = 1; + for (IostorInvWithDetailsSaveReqVO.DetailVO detail : reqVO.getDetails()) { + IostorinvDtlDO dtl = new IostorinvDtlDO(); + dtl.setIostorinvId(iostorinvId); + dtl.setSeqNo(seqNo++); + dtl.setMaterialCode(detail.getMaterialCode()); + dtl.setMaterialId(detail.getMaterialId()); + dtl.setPcsn(detail.getPcsn()); + dtl.setPlanQty(detail.getPlanQty()); + dtl.setUnassignQty(detail.getPlanQty()); // 初始未分配 = 计划数量 + dtl.setAssignQty(BigDecimal.ZERO); + dtl.setQtyUnitId(detail.getQtyUnitId()); + dtl.setQtyUnitName(detail.getQtyUnitName()); + dtl.setRemark(detail.getRemark()); + dtl.setSourceBillCode(detail.getSourceBillCode()); + dtl.setSourceBillType(detail.getSourceBillType()); + dtl.setSourceBilldtlId(detail.getSourceBilldtlId()); + iostorinvDtlMapper.insert(dtl); + } + + return iostorinvId; + } + }