feat: 实现出库单带明细创建 Service(含 CodeGen 单据号生成)
- IostorInvService 接口新增 createIostorInvWithDetails 方法 - IostorInvServiceImpl 实现:单据号生成、主表+明细事务写入 - ErrorCodeConstants 新增 IOSTOR_INV_BILL_CODE_GENERATE_FAIL
This commit is contained in:
@@ -25,4 +25,7 @@ public interface ErrorCodeConstants {
|
|||||||
|
|
||||||
// ================ 组盘记录相关错误码 =================
|
// ================ 组盘记录相关错误码 =================
|
||||||
ErrorCode GROUP_PLATE_NOT_EXISTS = new ErrorCode(9, "组盘记录不存在");
|
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, "单据号生成失败,请稍后重试");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import java.util.*;
|
|||||||
import jakarta.validation.*;
|
import jakarta.validation.*;
|
||||||
import cn.code.nl.module.wms.controller.admin.iostorinv.vo.*;
|
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.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.PageResult;
|
||||||
import cn.code.nl.framework.common.pojo.PageParam;
|
import cn.code.nl.framework.common.pojo.PageParam;
|
||||||
|
|
||||||
@@ -59,4 +60,12 @@ public interface IostorInvService {
|
|||||||
*/
|
*/
|
||||||
PageResult<IostorInvDO> getIostorInvPage(IostorInvPageReqVO pageReqVO);
|
PageResult<IostorInvDO> getIostorInvPage(IostorInvPageReqVO pageReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建出库单(含明细)
|
||||||
|
*
|
||||||
|
* @param reqVO 创建请求(含明细列表)
|
||||||
|
* @return 出入单标识
|
||||||
|
*/
|
||||||
|
String createIostorInvWithDetails(@Valid IostorInvWithDetailsSaveReqVO reqVO);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.framework.common.util.object.BeanUtils;
|
||||||
|
|
||||||
import cn.code.nl.module.wms.dal.mysql.iostorinv.IostorInvMapper;
|
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.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.code.nl.framework.common.util.collection.CollectionUtils.convertList;
|
import static cn.code.nl.framework.common.util.collection.CollectionUtils.convertList;
|
||||||
@@ -32,6 +39,12 @@ public class IostorInvServiceImpl implements IostorInvService {
|
|||||||
@Resource
|
@Resource
|
||||||
private IostorInvMapper iostorInvMapper;
|
private IostorInvMapper iostorInvMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CodeGenApi codeGenApi;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IostorinvDtlMapper iostorinvDtlMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String createIostorInv(IostorInvSaveReqVO createReqVO) {
|
public String createIostorInv(IostorInvSaveReqVO createReqVO) {
|
||||||
// 插入
|
// 插入
|
||||||
@@ -82,4 +95,63 @@ public class IostorInvServiceImpl implements IostorInvService {
|
|||||||
return iostorInvMapper.selectPage(pageReqVO);
|
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<String> 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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user