feat(oms): 新增出仓委托单,支持新增/编辑/审核/下发WMS/完成入库

- 订单状态五态:1待审核(新增默认,驳回单编辑后自动回此态) 2已审核(下发后保持,用下发状态区分) 3已驳回 4进行中(预留) 5已入库
- 下发走WMS出库通知单链路(stockOutOrInInsert),返回强校验防吞错;完成入库限已审核+已下发
- 订单类型未传默认普通出库;明细新增单价unitPrice;列表支持invoiceNo/settlementCurrency查询,时间参数只传年月日
- 必填:客户/业务员/仓库/商品名称/申报数量;编辑删除限待审核/已驳回且未下发
- 附达梦建表脚本oms_out_entrust_order(主表+明细表,最终版)
This commit is contained in:
rcx
2026-09-04 10:47:29 +08:00
parent 0eb47793a8
commit 7d3c229b9a
21 changed files with 2823 additions and 0 deletions
@@ -0,0 +1,204 @@
package com.mhd.oms.domain.outEntrustOrder.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.mhd.common.core.web.domain.BaseVOEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
/**
* 出仓委托单对象 oms_out_entrust_order
* 表单字段对齐WMS出库管理新增(报关/委托信息块)
*
* @author rcx
* @date 2026-09-02
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("oms_out_entrust_order")
public class OutEntrustOrder extends BaseVOEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty("编号")
@TableId(type = IdType.AUTO)
private Long id;
@ApiModelProperty("委托单号")
private String entrustNumber;
@ApiModelProperty("出库仓库ID")
private Long warehouseId;
@ApiModelProperty("仓库编码")
private String warehouseCode;
@ApiModelProperty("仓库名称")
private String warehouseName;
@ApiModelProperty("客户ID(货主)")
private Long shipperId;
@ApiModelProperty("客户编码")
private String shipperCode;
@ApiModelProperty("客户名称")
private String shipperName;
@ApiModelProperty("业务员ID")
private String salesmanId;
@ApiModelProperty("业务员名称")
private String salesmanName;
@ApiModelProperty("订单类型编码(字典outDocumentType)")
private String orderTypeCode;
@ApiModelProperty("订单类型名称")
private String orderTypeName;
@ApiModelProperty("结算币种")
private String settlementCurrency;
@ApiModelProperty("优先级别编码")
private String priorityLevelCode;
@ApiModelProperty("优先级别名称")
private String priorityLevelName;
@ApiModelProperty("是否直接出库: 1-是 2-否")
private Integer directWarehouse;
@ApiModelProperty("是否复核: 1-是 2-否")
private Integer review;
@ApiModelProperty("预计出货时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date expectTime;
@ApiModelProperty("出仓日期")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date outboundDate;
@ApiModelProperty("orderDate")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date orderDate;
@ApiModelProperty("完成时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date completeTime;
@ApiModelProperty("To(收货人)")
@TableField("to_receiver")
private String toReceiver;
@ApiModelProperty("联系人")
private String contactPerson;
@ApiModelProperty("车型及车牌")
private String vehicleModelPlate;
@ApiModelProperty("委托编号(客户委托单号)")
private String entrustNo;
@ApiModelProperty("Tel电话")
private String tel;
@ApiModelProperty("Fax传真")
private String fax;
@ApiModelProperty("司机签名")
private String driverSign;
@ApiModelProperty("承运商编码")
private String carrier;
@ApiModelProperty("承运商名称")
private String carrierName;
@ApiModelProperty("柜号")
private String containerNo;
@ApiModelProperty("")
private String containerNoName;
@ApiModelProperty("运输方式编码")
private String transportModeCode;
@ApiModelProperty("运输方式名称")
private String transportModeName;
@ApiModelProperty("监管方式编码")
private String supervisionModeCode;
@ApiModelProperty("监管方式名称")
private String supervisionModeName;
@ApiModelProperty("申报地关区")
private String declareCustoms;
@ApiModelProperty("进出境关别")
private String entryExitCustoms;
@ApiModelProperty("起运/运抵国(地区)")
private String departureArrivalCountry;
@ApiModelProperty("海关是否查验货物")
private String customsInspectionFlag;
@ApiModelProperty("是否需要报关(预留,页面隐藏)")
private String needDeclareFlag;
@ApiModelProperty("是否需要运输(预留,页面隐藏)")
private String needTransportFlag;
@ApiModelProperty("生产商")
private String manufacturer;
@ApiModelProperty("报关员姓名及联系方式")
private String customsDeclarerInfo;
@ApiModelProperty("送货地址")
private String deliveryAddr;
@ApiModelProperty("附件url")
private String annexUrl;
@ApiModelProperty("订单状态:1-待审核 2-已审核 3-已驳回 4-进行中 5-已入库")
private Integer orderStatus;
@ApiModelProperty("审核人ID")
private Long auditBy;
@ApiModelProperty("审核人姓名")
private String auditByName;
@ApiModelProperty("审核时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date auditTime;
@ApiModelProperty("审核备注(驳回原因)")
private String auditRemark;
@ApiModelProperty("下发状态:1-未下发 2-已下发")
private Integer issueStatus;
@ApiModelProperty("下发人ID")
private Long issueBy;
@ApiModelProperty("下发人姓名")
private String issueByName;
@ApiModelProperty("下发时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date issueTime;
@ApiModelProperty("申报总数量(明细申报数量之和)")
private BigDecimal declareTotalQuantity;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("组织ID")
private Long organizationId;
@ApiModelProperty("组织名称")
private String organizationName;
@ApiModelProperty("一级组织ID")
private Long topOrganizationId;
}
@@ -0,0 +1,98 @@
package com.mhd.oms.domain.outEntrustOrder.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
/**
* 出仓委托单明细对象 oms_out_entrust_order_detail
* 明细列对齐WMS出库管理新增(出仓委托单明细列)
*
* @author rcx
* @date 2026-09-02
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("oms_out_entrust_order_detail")
public class OutEntrustOrderDetail extends BaseVOEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty("编号")
@TableId(type = IdType.AUTO)
private Long id;
@ApiModelProperty("委托单号(关联主表)")
private String entrustNumber;
@ApiModelProperty("物料基础信息ID")
private Long materialBaseInfoId;
@ApiModelProperty("商品编码")
private String materialCode;
@ApiModelProperty("商品名称(物料档案名)")
private String materialName;
@ApiModelProperty("商品条形码")
private String barCode;
@ApiModelProperty("商品名称(委托单品名)")
private String commodityName;
@ApiModelProperty("商品编号")
private String commodityNo;
@ApiModelProperty("料号")
private String materialNo;
@ApiModelProperty("规格型号")
private String specificationModel;
@ApiModelProperty("SKU码")
private String skucode;
@ApiModelProperty("发票号")
private String invoiceNo;
@ApiModelProperty("申报单位")
private String declareUnit;
@ApiModelProperty("申报数量")
private BigDecimal declareQuantity;
@ApiModelProperty("单价")
private BigDecimal unitPrice;
@ApiModelProperty("单位")
private String unit;
@ApiModelProperty("")
private String liter;
@ApiModelProperty("尺寸")
private String size;
@ApiModelProperty("箱数")
private BigDecimal caseCount;
@ApiModelProperty("件数")
private BigDecimal pieceCount;
@ApiModelProperty("出库数量")
private BigDecimal outboundQuantity;
@ApiModelProperty("总净重(千克)")
private BigDecimal totalNetWeight;
@ApiModelProperty("总毛重(千克)")
private BigDecimal totalGrossWeight;
@ApiModelProperty("总体积(立方米)")
private BigDecimal totalVolume;
@ApiModelProperty("总面积")
private BigDecimal totalArea;
@ApiModelProperty("总金额")
private BigDecimal totalAmount;
@ApiModelProperty("币制")
private String currency;
@ApiModelProperty("批次")
private String batchRefNo;
@ApiModelProperty("单据参考号")
private String sheetRefNo;
@ApiModelProperty("原产国")
private String countryOfOrigin;
@ApiModelProperty("箱/托盘号")
private String boxPalletNo;
@ApiModelProperty("备注")
private String remark;
}
@@ -0,0 +1,42 @@
package com.mhd.oms.domain.outEntrustOrder.repository.facade;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mhd.oms.domain.outEntrustOrder.entity.OutEntrustOrderDetail;
import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderDetailPO;
import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDetailDO;
import java.util.List;
/**
* 出仓委托单明细Service接口
*
* @author rcx
* @date 2026-09-02
*/
public interface IOutEntrustOrderDetailService extends IService<OutEntrustOrderDetail> {
/**
* 根据委托单号查询有效明细
*/
List<OutEntrustOrderDetailPO> queryByEntrustNumber(String entrustNumber);
/**
* 根据委托单号集合查询有效明细
*/
List<OutEntrustOrderDetailPO> queryByEntrustNumbers(List<String> entrustNumbers);
/**
* 批量保存明细
*/
Boolean batchInsert(String entrustNumber, List<OutEntrustOrderDetailDO> detailDOList);
/**
* 根据委托单号逻辑删除明细
*/
Boolean deleteByEntrustNumber(String entrustNumber);
/**
* 根据委托单号集合逻辑删除明细
*/
Boolean deleteByEntrustNumbers(List<String> entrustNumbers);
}
@@ -0,0 +1,62 @@
package com.mhd.oms.domain.outEntrustOrder.repository.facade;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mhd.oms.domain.outEntrustOrder.entity.OutEntrustOrder;
import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderPO;
import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDO;
import java.util.List;
/**
* 出仓委托单Service接口
*
* @author rcx
* @date 2026-09-02
*/
public interface IOutEntrustOrderService extends IService<OutEntrustOrder> {
/**
* 分页查询出仓委托单列表
*/
List<OutEntrustOrderPO> queryList(OutEntrustOrderDO outEntrustOrderDO);
/**
* 新增出仓委托单
*/
Boolean insert(OutEntrustOrderDO outEntrustOrderDO);
/**
* 修改出仓委托单
*/
Boolean update(OutEntrustOrderDO outEntrustOrderDO);
/**
* 批量删除出仓委托单
*/
Boolean delete(Long[] ids);
/**
* 获取出仓委托单详情(含明细)
*/
OutEntrustOrderPO getInfo(Long id);
/**
* 根据编号集合查询出仓委托单列表
*/
List<OutEntrustOrderPO> getInfoByIds(List<Long> ids);
/**
* 审核:待审核/已驳回 → 已审核(2)或已驳回(3)
*/
Boolean audit(List<Long> ids, Integer targetStatus, Long auditBy, String auditByName, String auditRemark);
/**
* 下发:置为已下发,订单状态置为进行中
*/
Boolean issue(List<Long> ids, Long issueBy, String issueByName);
/**
* 完成:进行中 → 已入库
*/
Boolean finish(List<Long> ids, Long updateBy, String updateByName);
}
@@ -0,0 +1,14 @@
package com.mhd.oms.domain.outEntrustOrder.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mhd.oms.domain.outEntrustOrder.entity.OutEntrustOrderDetail;
/**
* 出仓委托单明细Mapper接口
*
* @author rcx
* @date 2026-09-02
*/
public interface OutEntrustOrderDetailMapper extends BaseMapper<OutEntrustOrderDetail> {
}
@@ -0,0 +1,28 @@
package com.mhd.oms.domain.outEntrustOrder.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mhd.oms.domain.outEntrustOrder.entity.OutEntrustOrder;
import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderPO;
import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 出仓委托单Mapper接口
*
* @author rcx
* @date 2026-09-02
*/
public interface OutEntrustOrderMapper extends BaseMapper<OutEntrustOrder> {
/**
* 查询出仓委托单列表
*/
List<OutEntrustOrderPO> queryList(OutEntrustOrderDO outEntrustOrderDO);
/**
* 根据编号集合查询出仓委托单列表
*/
List<OutEntrustOrderPO> getInfoByIds(@Param("idList") List<Long> idList);
}
@@ -0,0 +1,97 @@
package com.mhd.oms.domain.outEntrustOrder.repository.persistence;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mhd.oms.domain.outEntrustOrder.entity.OutEntrustOrderDetail;
import com.mhd.oms.domain.outEntrustOrder.repository.facade.IOutEntrustOrderDetailService;
import com.mhd.oms.domain.outEntrustOrder.repository.mapper.OutEntrustOrderDetailMapper;
import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderDetailPO;
import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDetailDO;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
/**
* 出仓委托单明细Service业务层处理
*
* @author rcx
* @date 2026-09-02
*/
@Service
public class OutEntrustOrderDetailImpl extends ServiceImpl<OutEntrustOrderDetailMapper, OutEntrustOrderDetail> implements IOutEntrustOrderDetailService {
/**
* 根据委托单号查询有效明细
*/
@Override
public List<OutEntrustOrderDetailPO> queryByEntrustNumber(String entrustNumber) {
List<OutEntrustOrderDetail> detailList = this.list(new LambdaQueryWrapper<OutEntrustOrderDetail>()
.eq(OutEntrustOrderDetail::getEntrustNumber, entrustNumber)
.eq(OutEntrustOrderDetail::getDelFlag, 1)
.orderByAsc(OutEntrustOrderDetail::getId));
return detailList.stream().map(detail -> {
OutEntrustOrderDetailPO detailPO = new OutEntrustOrderDetailPO();
BeanUtils.copyProperties(detail, detailPO);
return detailPO;
}).collect(Collectors.toList());
}
/**
* 根据委托单号集合查询有效明细
*/
@Override
public List<OutEntrustOrderDetailPO> queryByEntrustNumbers(List<String> entrustNumbers) {
if (entrustNumbers == null || entrustNumbers.isEmpty()) {
return new java.util.ArrayList<>();
}
List<OutEntrustOrderDetail> detailList = this.list(new LambdaQueryWrapper<OutEntrustOrderDetail>()
.in(OutEntrustOrderDetail::getEntrustNumber, entrustNumbers)
.eq(OutEntrustOrderDetail::getDelFlag, 1)
.orderByAsc(OutEntrustOrderDetail::getId));
return detailList.stream().map(detail -> {
OutEntrustOrderDetailPO detailPO = new OutEntrustOrderDetailPO();
BeanUtils.copyProperties(detail, detailPO);
return detailPO;
}).collect(Collectors.toList());
}
/**
* 批量保存明细
*/
@Override
public Boolean batchInsert(String entrustNumber, List<OutEntrustOrderDetailDO> detailDOList) {
List<OutEntrustOrderDetail> detailList = detailDOList.stream().map(detailDO -> {
OutEntrustOrderDetail detail = new OutEntrustOrderDetail();
BeanUtils.copyProperties(detailDO, detail);
detail.setEntrustNumber(entrustNumber);
detail.setDelFlag(1);
return detail;
}).collect(Collectors.toList());
return this.saveBatch(detailList);
}
/**
* 根据委托单号逻辑删除明细
*/
@Override
public Boolean deleteByEntrustNumber(String entrustNumber) {
return this.update(new LambdaUpdateWrapper<OutEntrustOrderDetail>()
.eq(OutEntrustOrderDetail::getEntrustNumber, entrustNumber)
.eq(OutEntrustOrderDetail::getDelFlag, 1)
.set(OutEntrustOrderDetail::getDelFlag, 2));
}
/**
* 根据委托单号集合逻辑删除明细
*/
@Override
public Boolean deleteByEntrustNumbers(List<String> entrustNumbers) {
return this.update(new LambdaUpdateWrapper<OutEntrustOrderDetail>()
.in(OutEntrustOrderDetail::getEntrustNumber, entrustNumbers)
.eq(OutEntrustOrderDetail::getDelFlag, 1)
.set(OutEntrustOrderDetail::getDelFlag, 2));
}
}
@@ -0,0 +1,159 @@
package com.mhd.oms.domain.outEntrustOrder.repository.persistence;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.oms.constant.OutEntrustOrderConstant;
import com.mhd.oms.domain.outEntrustOrder.entity.OutEntrustOrder;
import com.mhd.oms.domain.outEntrustOrder.repository.facade.IOutEntrustOrderService;
import com.mhd.oms.domain.outEntrustOrder.repository.mapper.OutEntrustOrderMapper;
import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderPO;
import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDO;
import com.mhd.system.api.model.LoginUser;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* 出仓委托单Service业务层处理
*
* @author rcx
* @date 2026-09-02
*/
@Service
public class OutEntrustOrderImpl extends ServiceImpl<OutEntrustOrderMapper, OutEntrustOrder> implements IOutEntrustOrderService {
/**
* 查询出仓委托单列表
*/
@Override
public List<OutEntrustOrderPO> queryList(OutEntrustOrderDO outEntrustOrderDO) {
return baseMapper.queryList(outEntrustOrderDO);
}
/**
* 新增出仓委托单
*/
@Override
public Boolean insert(OutEntrustOrderDO outEntrustOrderDO) {
OutEntrustOrder outEntrustOrder = new OutEntrustOrder();
BeanUtils.copyProperties(outEntrustOrderDO, outEntrustOrder);
return this.save(outEntrustOrder);
}
/**
* 修改出仓委托单
*/
@Override
public Boolean update(OutEntrustOrderDO outEntrustOrderDO) {
OutEntrustOrder outEntrustOrder = new OutEntrustOrder();
BeanUtils.copyProperties(outEntrustOrderDO, outEntrustOrder);
return this.updateById(outEntrustOrder);
}
/**
* 批量删除出仓委托单(仅待审核/已驳回且未下发可删除)
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean delete(Long[] ids) {
List<OutEntrustOrder> outEntrustOrders = this.listByIds(Arrays.asList(ids));
//只有待审核/已驳回且未下发的委托单才可以删除
List<OutEntrustOrder> unableDeleteList = outEntrustOrders.stream()
.filter(order -> !(OutEntrustOrderConstant.ORDER_STATUS_PENDING_AUDIT.equals(order.getOrderStatus())
|| OutEntrustOrderConstant.ORDER_STATUS_REJECTED.equals(order.getOrderStatus()))
|| !OutEntrustOrderConstant.ISSUE_STATUS_1.equals(order.getIssueStatus()))
.collect(Collectors.toList());
if (!unableDeleteList.isEmpty()) {
throw new ServiceException("已审核/进行中/已入库或已下发的委托单不允许删除");
}
LoginUser loginUser = SecurityUtils.getLoginUser();
Date now = new Date();
for (OutEntrustOrder outEntrustOrder : outEntrustOrders) {
outEntrustOrder.setDelFlag(2);
outEntrustOrder.setUpdateBy(loginUser == null ? null : loginUser.getUserid());
outEntrustOrder.setUpdateByName(loginUser == null ? null : loginUser.getUsername());
outEntrustOrder.setUpdateTime(now);
}
return this.updateBatchById(outEntrustOrders);
}
/**
* 获取出仓委托单详情
*/
@Override
public OutEntrustOrderPO getInfo(Long id) {
OutEntrustOrder outEntrustOrder = this.getOne(new LambdaQueryWrapper<OutEntrustOrder>()
.eq(OutEntrustOrder::getId, id).eq(OutEntrustOrder::getDelFlag, 1));
if (outEntrustOrder == null) {
throw new ServiceException("出仓委托单不存在");
}
OutEntrustOrderPO outEntrustOrderPO = new OutEntrustOrderPO();
BeanUtils.copyProperties(outEntrustOrder, outEntrustOrderPO);
return outEntrustOrderPO;
}
/**
* 根据编号集合查询出仓委托单列表
*/
@Override
public List<OutEntrustOrderPO> getInfoByIds(List<Long> ids) {
return baseMapper.getInfoByIds(ids);
}
/**
* 审核:待审核/已驳回 → 已审核(2)或已驳回(3)
*/
@Override
public Boolean audit(List<Long> ids, Integer targetStatus, Long auditBy, String auditByName, String auditRemark) {
return this.update(new LambdaUpdateWrapper<OutEntrustOrder>()
.in(OutEntrustOrder::getId, ids)
.eq(OutEntrustOrder::getDelFlag, 1)
.set(OutEntrustOrder::getOrderStatus, targetStatus)
.set(OutEntrustOrder::getAuditBy, auditBy)
.set(OutEntrustOrder::getAuditByName, auditByName)
.set(OutEntrustOrder::getAuditTime, new Date())
.set(OutEntrustOrder::getAuditRemark, auditRemark)
.set(OutEntrustOrder::getUpdateBy, auditBy)
.set(OutEntrustOrder::getUpdateByName, auditByName)
.set(OutEntrustOrder::getUpdateTime, new Date()));
}
/**
* 下发:下发状态置为已下发(订单状态保持已审核)
*/
@Override
public Boolean issue(List<Long> ids, Long issueBy, String issueByName) {
return this.update(new LambdaUpdateWrapper<OutEntrustOrder>()
.in(OutEntrustOrder::getId, ids)
.eq(OutEntrustOrder::getDelFlag, 1)
.set(OutEntrustOrder::getIssueStatus, OutEntrustOrderConstant.ISSUE_STATUS_2)
.set(OutEntrustOrder::getIssueBy, issueBy)
.set(OutEntrustOrder::getIssueByName, issueByName)
.set(OutEntrustOrder::getIssueTime, new Date())
.set(OutEntrustOrder::getUpdateBy, issueBy)
.set(OutEntrustOrder::getUpdateByName, issueByName)
.set(OutEntrustOrder::getUpdateTime, new Date()));
}
/**
* 完成:已审核(已下发)/进行中 → 已入库
*/
@Override
public Boolean finish(List<Long> ids, Long updateBy, String updateByName) {
return this.update(new LambdaUpdateWrapper<OutEntrustOrder>()
.in(OutEntrustOrder::getId, ids)
.eq(OutEntrustOrder::getDelFlag, 1)
.set(OutEntrustOrder::getOrderStatus, OutEntrustOrderConstant.ORDER_STATUS_STORED)
.set(OutEntrustOrder::getUpdateBy, updateBy)
.set(OutEntrustOrder::getUpdateByName, updateByName)
.set(OutEntrustOrder::getUpdateTime, new Date()));
}
}
@@ -0,0 +1,100 @@
package com.mhd.oms.domain.outEntrustOrder.repository.po;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
/**
* 出仓委托单明细对象 oms_out_entrust_order_detail
*
* @author rcx
* @date 2026-09-02
*/
@Data
@ApiModel(value = "出仓委托单明细对象", description = "出仓委托单明细响应对象")
public class OutEntrustOrderDetailPO extends BaseVOEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty("编号")
private Long id;
@ApiModelProperty("委托单号(关联主表)")
private String entrustNumber;
@ApiModelProperty("物料基础信息ID")
private Long materialBaseInfoId;
@ApiModelProperty("商品编码")
private String materialCode;
@ApiModelProperty("商品名称(物料档案名)")
private String materialName;
@ApiModelProperty("商品条形码")
private String barCode;
@ApiModelProperty("商品名称(委托单品名)")
private String commodityName;
@ApiModelProperty("商品编号")
private String commodityNo;
@ApiModelProperty("料号")
private String materialNo;
@ApiModelProperty("规格型号")
private String specificationModel;
@ApiModelProperty("SKU码")
private String skucode;
@ApiModelProperty("发票号")
private String invoiceNo;
@ApiModelProperty("申报单位")
private String declareUnit;
@ApiModelProperty("申报数量")
private BigDecimal declareQuantity;
@ApiModelProperty("单价")
private BigDecimal unitPrice;
@ApiModelProperty("单位")
private String unit;
@ApiModelProperty("")
private String liter;
@ApiModelProperty("尺寸")
private String size;
@ApiModelProperty("箱数")
private BigDecimal caseCount;
@ApiModelProperty("件数")
private BigDecimal pieceCount;
@ApiModelProperty("出库数量")
private BigDecimal outboundQuantity;
@ApiModelProperty("总净重(千克)")
private BigDecimal totalNetWeight;
@ApiModelProperty("总毛重(千克)")
private BigDecimal totalGrossWeight;
@ApiModelProperty("总体积(立方米)")
private BigDecimal totalVolume;
@ApiModelProperty("总面积")
private BigDecimal totalArea;
@ApiModelProperty("总金额")
private BigDecimal totalAmount;
@ApiModelProperty("币制")
private String currency;
@ApiModelProperty("批次")
private String batchRefNo;
@ApiModelProperty("单据参考号")
private String sheetRefNo;
@ApiModelProperty("原产国")
private String countryOfOrigin;
@ApiModelProperty("箱/托盘号")
private String boxPalletNo;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("创建时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
}
@@ -0,0 +1,212 @@
package com.mhd.oms.domain.outEntrustOrder.repository.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 出仓委托单对象 oms_out_entrust_order
*
* @author rcx
* @date 2026-09-02
*/
@Data
@ApiModel(value = "出仓委托单对象", description = "出仓委托单响应对象")
public class OutEntrustOrderPO extends BaseVOEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty("编号")
@TableId(type = IdType.AUTO)
private Long id;
@ApiModelProperty("委托单号")
private String entrustNumber;
@ApiModelProperty("出库仓库ID")
private Long warehouseId;
@ApiModelProperty("仓库编码")
private String warehouseCode;
@ApiModelProperty("仓库名称")
private String warehouseName;
@ApiModelProperty("客户ID(货主)")
private Long shipperId;
@ApiModelProperty("客户编码")
private String shipperCode;
@ApiModelProperty("客户名称")
private String shipperName;
@ApiModelProperty("业务员ID")
private String salesmanId;
@ApiModelProperty("业务员名称")
private String salesmanName;
@ApiModelProperty("订单类型编码(字典outDocumentType)")
private String orderTypeCode;
@ApiModelProperty("订单类型名称")
private String orderTypeName;
@ApiModelProperty("结算币种")
private String settlementCurrency;
@ApiModelProperty("优先级别编码")
private String priorityLevelCode;
@ApiModelProperty("优先级别名称")
private String priorityLevelName;
@ApiModelProperty("是否直接出库: 1-是 2-否")
private Integer directWarehouse;
@ApiModelProperty("是否复核: 1-是 2-否")
private Integer review;
@ApiModelProperty("预计出货时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date expectTime;
@ApiModelProperty("出仓日期")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date outboundDate;
@ApiModelProperty("orderDate")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date orderDate;
@ApiModelProperty("完成时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date completeTime;
@ApiModelProperty("To(收货人)")
@JsonProperty("to")
private String toReceiver;
@ApiModelProperty("联系人")
private String contactPerson;
@ApiModelProperty("车型及车牌")
private String vehicleModelPlate;
@ApiModelProperty("委托编号(客户委托单号)")
private String entrustNo;
@ApiModelProperty("Tel电话")
private String tel;
@ApiModelProperty("Fax传真")
private String fax;
@ApiModelProperty("司机签名")
private String driverSign;
@ApiModelProperty("承运商编码")
private String carrier;
@ApiModelProperty("承运商名称")
private String carrierName;
@ApiModelProperty("柜号")
private String containerNo;
@ApiModelProperty("")
private String containerNoName;
@ApiModelProperty("运输方式编码")
private String transportModeCode;
@ApiModelProperty("运输方式名称")
private String transportModeName;
@ApiModelProperty("监管方式编码")
private String supervisionModeCode;
@ApiModelProperty("监管方式名称")
private String supervisionModeName;
@ApiModelProperty("申报地关区")
private String declareCustoms;
@ApiModelProperty("进出境关别")
private String entryExitCustoms;
@ApiModelProperty("起运/运抵国(地区)")
private String departureArrivalCountry;
@ApiModelProperty("海关是否查验货物")
private String customsInspectionFlag;
@ApiModelProperty("是否需要报关(预留,页面隐藏)")
private String needDeclareFlag;
@ApiModelProperty("是否需要运输(预留,页面隐藏)")
private String needTransportFlag;
@ApiModelProperty("生产商")
private String manufacturer;
@ApiModelProperty("报关员姓名及联系方式")
private String customsDeclarerInfo;
@ApiModelProperty("送货地址")
private String deliveryAddr;
@ApiModelProperty("附件url")
private String annexUrl;
@ApiModelProperty("订单状态:1-待审核 2-已审核 3-已驳回 4-进行中 5-已入库")
private Integer orderStatus;
@ApiModelProperty("订单状态")
private String orderStatusStr;
@ApiModelProperty("审核人ID")
private Long auditBy;
@ApiModelProperty("审核人姓名")
private String auditByName;
@ApiModelProperty("审核时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date auditTime;
@ApiModelProperty("审核备注(驳回原因)")
private String auditRemark;
@ApiModelProperty("下发状态:1-未下发 2-已下发")
private Integer issueStatus;
@ApiModelProperty("下发状态")
private String issueStatusStr;
@ApiModelProperty("下发人ID")
private Long issueBy;
@ApiModelProperty("下发人姓名")
private String issueByName;
@ApiModelProperty("下发时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date issueTime;
@ApiModelProperty("申报总数量(明细申报数量之和)")
private BigDecimal declareTotalQuantity;
@ApiModelProperty("发票号(列表展示用,明细发票号逗号拼接;详情请看明细)")
private String invoiceNo;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("组织ID")
private Long organizationId;
@ApiModelProperty("组织名称")
private String organizationName;
@ApiModelProperty("一级组织ID")
private Long topOrganizationId;
@ApiModelProperty("商品明细")
private List<OutEntrustOrderDetailPO> materialDetailList;
}
@@ -0,0 +1,216 @@
package com.mhd.oms.domain.outEntrustOrder.repository.todo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 出仓委托单对象 oms_out_entrust_order
*
* @author rcx
* @date 2026-09-02
*/
@Data
public class OutEntrustOrderDO extends BaseVOEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty("编号")
private Long id;
@ApiModelProperty("编号集合")
private List<Long> idList;
@ApiModelProperty(name = "组织ID集合")
private List<Long> organizationIdList;
@ApiModelProperty(name = "权限菜单ID")
private Long permissionMenuId;
@ApiModelProperty("委托单号")
private String entrustNumber;
@ApiModelProperty("出库仓库ID")
private Long warehouseId;
@ApiModelProperty("仓库编码")
private String warehouseCode;
@ApiModelProperty("仓库名称")
private String warehouseName;
@ApiModelProperty("客户ID(货主)")
private Long shipperId;
@ApiModelProperty("客户编码")
private String shipperCode;
@ApiModelProperty("客户名称")
private String shipperName;
@ApiModelProperty("业务员ID")
private String salesmanId;
@ApiModelProperty("业务员名称")
private String salesmanName;
@ApiModelProperty("订单类型编码(字典outDocumentType)")
private String orderTypeCode;
@ApiModelProperty("订单类型名称")
private String orderTypeName;
@ApiModelProperty("结算币种")
private String settlementCurrency;
@ApiModelProperty("优先级别编码")
private String priorityLevelCode;
@ApiModelProperty("优先级别名称")
private String priorityLevelName;
@ApiModelProperty("是否直接出库: 1-是 2-否")
private Integer directWarehouse;
@ApiModelProperty("是否复核: 1-是 2-否")
private Integer review;
@ApiModelProperty("预计出货时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date expectTime;
@ApiModelProperty("出仓日期")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date outboundDate;
@ApiModelProperty("orderDate")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date orderDate;
@ApiModelProperty("完成时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date completeTime;
@ApiModelProperty("To(收货人)")
private String toReceiver;
@ApiModelProperty("联系人")
private String contactPerson;
@ApiModelProperty("车型及车牌")
private String vehicleModelPlate;
@ApiModelProperty("委托编号(客户委托单号)")
private String entrustNo;
@ApiModelProperty("Tel电话")
private String tel;
@ApiModelProperty("Fax传真")
private String fax;
@ApiModelProperty("司机签名")
private String driverSign;
@ApiModelProperty("承运商编码")
private String carrier;
@ApiModelProperty("承运商名称")
private String carrierName;
@ApiModelProperty("柜号")
private String containerNo;
@ApiModelProperty("")
private String containerNoName;
@ApiModelProperty("运输方式编码")
private String transportModeCode;
@ApiModelProperty("运输方式名称")
private String transportModeName;
@ApiModelProperty("监管方式编码")
private String supervisionModeCode;
@ApiModelProperty("监管方式名称")
private String supervisionModeName;
@ApiModelProperty("申报地关区")
private String declareCustoms;
@ApiModelProperty("进出境关别")
private String entryExitCustoms;
@ApiModelProperty("起运/运抵国(地区)")
private String departureArrivalCountry;
@ApiModelProperty("海关是否查验货物")
private String customsInspectionFlag;
@ApiModelProperty("是否需要报关(预留,页面隐藏)")
private String needDeclareFlag;
@ApiModelProperty("是否需要运输(预留,页面隐藏)")
private String needTransportFlag;
@ApiModelProperty("生产商")
private String manufacturer;
@ApiModelProperty("报关员姓名及联系方式")
private String customsDeclarerInfo;
@ApiModelProperty("送货地址")
private String deliveryAddr;
@ApiModelProperty("附件url")
private String annexUrl;
@ApiModelProperty("订单状态:1-待审核 2-已审核 3-已驳回 4-进行中 5-已入库")
private Integer orderStatus;
@ApiModelProperty("审核人ID")
private Long auditBy;
@ApiModelProperty("审核人姓名")
private String auditByName;
@ApiModelProperty("审核时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date auditTime;
@ApiModelProperty("审核备注(驳回原因)")
private String auditRemark;
@ApiModelProperty("下发状态:1-未下发 2-已下发")
private Integer issueStatus;
@ApiModelProperty("下发人ID")
private Long issueBy;
@ApiModelProperty("下发人姓名")
private String issueByName;
@ApiModelProperty("下发时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date issueTime;
@ApiModelProperty("申报总数量(明细申报数量之和)")
private BigDecimal declareTotalQuantity;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("组织ID")
private Long organizationId;
@ApiModelProperty("组织名称")
private String organizationName;
@ApiModelProperty("一级组织ID")
private Long topOrganizationId;
@ApiModelProperty("查询-创建开始时间(年月日yyyy-MM-dd)")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date beginCreateTime;
@ApiModelProperty("查询-创建结束时间(年月日yyyy-MM-dd,含当天)")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date endCreateTime;
@ApiModelProperty("查询-发票号(模糊匹配明细发票号)")
private String invoiceNo;
@ApiModelProperty("商品明细")
private List<OutEntrustOrderDetailDO> materialDetailList;
}
@@ -0,0 +1,90 @@
package com.mhd.oms.domain.outEntrustOrder.repository.todo;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* 出仓委托单明细对象 oms_out_entrust_order_detail
*
* @author rcx
* @date 2026-09-02
*/
@Data
public class OutEntrustOrderDetailDO extends BaseVOEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty("编号")
private Long id;
@ApiModelProperty("委托单号(关联主表)")
private String entrustNumber;
@ApiModelProperty("物料基础信息ID")
private Long materialBaseInfoId;
@ApiModelProperty("商品编码")
private String materialCode;
@ApiModelProperty("商品名称(物料档案名)")
private String materialName;
@ApiModelProperty("商品条形码")
private String barCode;
@ApiModelProperty("商品名称(委托单品名)")
private String commodityName;
@ApiModelProperty("商品编号")
private String commodityNo;
@ApiModelProperty("料号")
private String materialNo;
@ApiModelProperty("规格型号")
private String specificationModel;
@ApiModelProperty("SKU码")
private String skucode;
@ApiModelProperty("发票号")
private String invoiceNo;
@ApiModelProperty("申报单位")
private String declareUnit;
@ApiModelProperty("申报数量")
private BigDecimal declareQuantity;
@ApiModelProperty("单价")
private BigDecimal unitPrice;
@ApiModelProperty("单位")
private String unit;
@ApiModelProperty("")
private String liter;
@ApiModelProperty("尺寸")
private String size;
@ApiModelProperty("箱数")
private BigDecimal caseCount;
@ApiModelProperty("件数")
private BigDecimal pieceCount;
@ApiModelProperty("出库数量")
private BigDecimal outboundQuantity;
@ApiModelProperty("总净重(千克)")
private BigDecimal totalNetWeight;
@ApiModelProperty("总毛重(千克)")
private BigDecimal totalGrossWeight;
@ApiModelProperty("总体积(立方米)")
private BigDecimal totalVolume;
@ApiModelProperty("总面积")
private BigDecimal totalArea;
@ApiModelProperty("总金额")
private BigDecimal totalAmount;
@ApiModelProperty("币制")
private String currency;
@ApiModelProperty("批次")
private String batchRefNo;
@ApiModelProperty("单据参考号")
private String sheetRefNo;
@ApiModelProperty("原产国")
private String countryOfOrigin;
@ApiModelProperty("箱/托盘号")
private String boxPalletNo;
@ApiModelProperty("备注")
private String remark;
}
@@ -0,0 +1,177 @@
package com.mhd.oms.domain.outEntrustOrder.service;
import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.core.utils.OrderSequence;
import com.mhd.oms.constant.OutEntrustOrderConstant;
import com.mhd.oms.domain.outEntrustOrder.repository.facade.IOutEntrustOrderDetailService;
import com.mhd.oms.domain.outEntrustOrder.repository.facade.IOutEntrustOrderService;
import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderDetailPO;
import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderPO;
import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDO;
import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDetailDO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
/**
* 出仓委托单
*
* @author rcx
* @date 2026-09-02
*/
@Service
@Slf4j
public class OutEntrustOrderDomainService {
@Autowired
private IOutEntrustOrderService outEntrustOrderService;
@Autowired
private IOutEntrustOrderDetailService outEntrustOrderDetailService;
/**
* 分页查询出仓委托单列表
*/
public List<OutEntrustOrderPO> queryList(OutEntrustOrderDO outEntrustOrderDO) {
return outEntrustOrderService.queryList(outEntrustOrderDO);
}
/**
* 新增出仓委托单(主单+明细)
*/
@Transactional(rollbackFor = Exception.class)
public Boolean insert(OutEntrustOrderDO outEntrustOrderDO) {
//生成委托单号,初始状态:待审核、未下发;新单无审核信息
outEntrustOrderDO.setEntrustNumber(OrderSequence.getOrderCode(OutEntrustOrderConstant.OUT_ENTRUST_NO_PREFIX));
outEntrustOrderDO.setOrderStatus(OutEntrustOrderConstant.ORDER_STATUS_PENDING_AUDIT);
outEntrustOrderDO.setIssueStatus(OutEntrustOrderConstant.ISSUE_STATUS_1);
outEntrustOrderDO.setAuditRemark(null);
outEntrustOrderService.insert(outEntrustOrderDO);
outEntrustOrderDetailService.batchInsert(outEntrustOrderDO.getEntrustNumber(), buildDetailList(outEntrustOrderDO));
return true;
}
/**
* 修改出仓委托单(仅已创建且未下发可修改,明细全量替换)
*/
/**
* 修改出仓委托单(仅待审核/已驳回且未下发可修改,明细全量替换)
* 已驳回单重新编辑后状态重置为待审核,待重新审核
*/
@Transactional(rollbackFor = Exception.class)
public Boolean update(OutEntrustOrderDO outEntrustOrderDO) {
OutEntrustOrderPO orderPO = checkEditable(outEntrustOrderDO.getId());
//已驳回 → 编辑后回到待审核;待审核 → 保持不变(置null,updateById跳过该列)
outEntrustOrderDO.setOrderStatus(OutEntrustOrderConstant.ORDER_STATUS_REJECTED.equals(orderPO.getOrderStatus())
? OutEntrustOrderConstant.ORDER_STATUS_PENDING_AUDIT : null);
outEntrustOrderDO.setEntrustNumber(orderPO.getEntrustNumber());
outEntrustOrderService.update(outEntrustOrderDO);
//明细全量替换:逻辑删除旧明细后重新保存
outEntrustOrderDetailService.deleteByEntrustNumber(outEntrustOrderDO.getEntrustNumber());
outEntrustOrderDetailService.batchInsert(outEntrustOrderDO.getEntrustNumber(), buildDetailList(outEntrustOrderDO));
return true;
}
/**
* 批量删除出仓委托单(仅待审核/已驳回且未下发可删除)
*/
@Transactional(rollbackFor = Exception.class)
public Boolean delete(Long[] ids) {
List<OutEntrustOrderPO> orderList = outEntrustOrderService.getInfoByIds(java.util.Arrays.stream(ids).collect(Collectors.toList()));
List<String> entrustNumbers = orderList.stream().map(OutEntrustOrderPO::getEntrustNumber).collect(Collectors.toList());
outEntrustOrderService.delete(ids);
outEntrustOrderDetailService.deleteByEntrustNumbers(entrustNumbers);
return true;
}
/**
* 获取出仓委托单详情(含明细)
*/
public OutEntrustOrderPO getInfo(Long id) {
OutEntrustOrderPO outEntrustOrderPO = outEntrustOrderService.getInfo(id);
List<OutEntrustOrderDetailPO> detailList = outEntrustOrderDetailService.queryByEntrustNumber(outEntrustOrderPO.getEntrustNumber());
outEntrustOrderPO.setMaterialDetailList(detailList);
return outEntrustOrderPO;
}
/**
* 批量审核:待审核/已驳回 → 已审核(2)或已驳回(3)
*/
public Boolean audit(List<Long> ids, Integer targetStatus, Long auditBy, String auditByName, String auditRemark) {
return outEntrustOrderService.audit(ids, targetStatus, auditBy, auditByName, auditRemark);
}
/**
* 批量下发:订单状态保持已审核,下发状态置为已下发(WMS侧单据由ApplicationService推送)
*/
public Boolean issue(List<Long> ids, Long issueBy, String issueByName) {
return outEntrustOrderService.issue(ids, issueBy, issueByName);
}
/**
* 完成:已审核(已下发) → 已入库(OMS人工推进)
*/
public Boolean finish(List<Long> ids, Long updateBy, String updateByName) {
return outEntrustOrderService.finish(ids, updateBy, updateByName);
}
/**
* 根据委托单号查询明细
*/
public List<OutEntrustOrderDetailPO> getDetailByEntrustNumber(String entrustNumber) {
return outEntrustOrderDetailService.queryByEntrustNumber(entrustNumber);
}
/**
* 根据委托单号集合查询明细
*/
public List<OutEntrustOrderDetailPO> getDetailByEntrustNumbers(List<String> entrustNumbers) {
return outEntrustOrderDetailService.queryByEntrustNumbers(entrustNumbers);
}
/**
* 根据编号集合查询出仓委托单列表
*/
public List<OutEntrustOrderPO> queryByIds(List<Long> ids) {
return outEntrustOrderService.getInfoByIds(ids);
}
/**
* 明细补充审计信息(取主单的创建/更新人)
*/
private List<OutEntrustOrderDetailDO> buildDetailList(OutEntrustOrderDO outEntrustOrderDO) {
List<OutEntrustOrderDetailDO> detailDOList = outEntrustOrderDO.getMaterialDetailList();
for (OutEntrustOrderDetailDO detailDO : detailDOList) {
detailDO.setCreateBy(outEntrustOrderDO.getCreateBy());
detailDO.setCreateByName(outEntrustOrderDO.getCreateByName());
detailDO.setCreateTime(outEntrustOrderDO.getCreateTime());
detailDO.setUpdateBy(outEntrustOrderDO.getUpdateBy());
detailDO.setUpdateByName(outEntrustOrderDO.getUpdateByName());
detailDO.setUpdateTime(outEntrustOrderDO.getUpdateTime());
detailDO.setDelFlag(1);
}
return detailDOList;
}
/**
* 校验委托单是否可编辑/删除:仅待审核/已驳回 且未下发
*
* @return 委托单信息(供调用方复用当前状态/委托单号)
*/
private OutEntrustOrderPO checkEditable(Long id) {
OutEntrustOrderPO outEntrustOrderPO = outEntrustOrderService.getInfo(id);
boolean editableStatus = OutEntrustOrderConstant.ORDER_STATUS_PENDING_AUDIT.equals(outEntrustOrderPO.getOrderStatus())
|| OutEntrustOrderConstant.ORDER_STATUS_REJECTED.equals(outEntrustOrderPO.getOrderStatus());
if (!editableStatus) {
throw new ServiceException("已审核/进行中/已入库的委托单不允许修改");
}
if (!OutEntrustOrderConstant.ISSUE_STATUS_1.equals(outEntrustOrderPO.getIssueStatus())) {
throw new ServiceException("已下发的委托单不允许修改");
}
return outEntrustOrderPO;
}
}