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,390 @@
package com.mhd.oms.application.service.outEntrustOrder;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.oms.constant.OutEntrustOrderConstant;
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 com.mhd.oms.domain.outEntrustOrder.service.OutEntrustOrderDomainService;
import com.mhd.system.api.SystemServiceFeign;
import com.mhd.system.api.WmsServiceFeign;
import com.mhd.system.api.domain.NoticeMaterialDetailDTO;
import com.mhd.system.api.domain.NoticeOrderDTO;
import com.mhd.system.api.domain.WarehouseFeignPO;
import com.mhd.system.api.model.LoginUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 出仓委托单ApplicationService
*
* @author rcx
* @date 2026-09-02
*/
@Service
@Slf4j
public class OutEntrustOrderApplicationService {
@Resource
private OutEntrustOrderDomainService outEntrustOrderDomainService;
@Resource
private SystemServiceFeign systemServiceFeign;
@Resource
private WmsServiceFeign wmsServiceFeign;
/**
* 分页查询出仓委托单列表(不做默认状态过滤,显示全部数据)
*/
public List<OutEntrustOrderPO> queryList(OutEntrustOrderDO outEntrustOrderDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null) {
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
if (topOrganizationId != null && topOrganizationId != 1) {
outEntrustOrderDO.setTopOrganizationId(topOrganizationId);
}
}
//结束时间只传年月日(解析为当天00:00:00),归一为当天最后一秒,保证查询包含结束日当天
if (outEntrustOrderDO.getEndCreateTime() != null) {
outEntrustOrderDO.setEndCreateTime(DateUtil.endOfDay(outEntrustOrderDO.getEndCreateTime()));
}
List<OutEntrustOrderPO> orderList = outEntrustOrderDomainService.queryList(outEntrustOrderDO);
fillInvoiceNo(orderList);
return orderList;
}
/**
* 列表回填发票号(明细发票号去重逗号拼接,供列表列展示)
*/
private void fillInvoiceNo(List<OutEntrustOrderPO> orderList) {
if (orderList == null || orderList.isEmpty()) {
return;
}
List<String> entrustNumbers = orderList.stream()
.map(OutEntrustOrderPO::getEntrustNumber).collect(Collectors.toList());
Map<String, String> invoiceNoMap = outEntrustOrderDomainService.getDetailByEntrustNumbers(entrustNumbers).stream()
.filter(detail -> detail.getInvoiceNo() != null && !detail.getInvoiceNo().trim().isEmpty())
.collect(Collectors.toMap(OutEntrustOrderDetailPO::getEntrustNumber, detail -> detail.getInvoiceNo().trim(),
(existing, replacement) -> existing.contains(replacement) ? existing
: existing + "," + replacement));
for (OutEntrustOrderPO order : orderList) {
order.setInvoiceNo(invoiceNoMap.get(order.getEntrustNumber()));
}
}
/**
* 新增出仓委托单(必填:客户、业务员、仓库、商品名称、申报数量)
*/
public Boolean insert(OutEntrustOrderDO outEntrustOrderDO) {
//必填项校验
validateRequired(outEntrustOrderDO);
//订单类型未维护时默认普通出库(落库即生效,列表可见)
setDefaultOrderType(outEntrustOrderDO);
//仓库信息回填(校验仓库存在)
setWarehouseInfo(outEntrustOrderDO);
//组织信息填充
setOrganizationInfo(outEntrustOrderDO);
//汇总申报总数量
outEntrustOrderDO.setDeclareTotalQuantity(sumDeclareQuantity(outEntrustOrderDO.getMaterialDetailList()));
return outEntrustOrderDomainService.insert(outEntrustOrderDO);
}
/**
* 修改出仓委托单(仅待审核/已驳回且未下发可修改;已驳回单编辑后状态重置为待审核)
*/
public Boolean update(OutEntrustOrderDO outEntrustOrderDO) {
//必填项校验
validateRequired(outEntrustOrderDO);
//状态类字段由审核/下发/完成入库接口推进,编辑不允许改动(置null后updateById跳过这些列,防前端误传/绕过审核改状态)
outEntrustOrderDO.setOrderStatus(null);
outEntrustOrderDO.setIssueStatus(null);
outEntrustOrderDO.setAuditRemark(null);
//订单类型未维护时默认普通出库(落库即生效,列表可见)
setDefaultOrderType(outEntrustOrderDO);
//仓库信息回填(校验仓库存在)
setWarehouseInfo(outEntrustOrderDO);
//明细全量替换时明细创建信息随主单更新人
if (outEntrustOrderDO.getCreateBy() == null) {
outEntrustOrderDO.setCreateBy(outEntrustOrderDO.getUpdateBy());
outEntrustOrderDO.setCreateByName(outEntrustOrderDO.getUpdateByName());
outEntrustOrderDO.setCreateTime(outEntrustOrderDO.getUpdateTime());
}
//汇总申报总数量
outEntrustOrderDO.setDeclareTotalQuantity(sumDeclareQuantity(outEntrustOrderDO.getMaterialDetailList()));
return outEntrustOrderDomainService.update(outEntrustOrderDO);
}
/**
* 订单类型未维护时默认普通出库(与下发兜底保持一致,保存即落库)
*/
private void setDefaultOrderType(OutEntrustOrderDO outEntrustOrderDO) {
if (outEntrustOrderDO.getOrderTypeCode() == null || outEntrustOrderDO.getOrderTypeCode().trim().isEmpty()) {
outEntrustOrderDO.setOrderTypeCode(OutEntrustOrderConstant.WMS_ORDER_TYPE_CODE);
outEntrustOrderDO.setOrderTypeName(OutEntrustOrderConstant.WMS_ORDER_TYPE_NAME);
}
}
/**
* 获取出仓委托单详情(含明细)
*/
public OutEntrustOrderPO getInfo(Long id) {
return outEntrustOrderDomainService.getInfo(id);
}
/**
* 批量删除出仓委托单(仅待审核/已驳回且未下发可删除)
*/
public Boolean delete(Long[] ids) {
if (ids == null || ids.length == 0) {
throw new ServiceException("传递的ID值缺失或为空");
}
return outEntrustOrderDomainService.delete(ids);
}
/**
* 批量审核:待审核/已驳回 → 已审核(2)或已驳回(3)
*
* @param dto.idList 委托单ID集合
* @param dto.orderStatus 审核结果:2-审核通过 3-驳回
* @param dto.auditRemark 审核备注(驳回原因,选填)
*/
public Boolean audit(OutEntrustOrderDO outEntrustOrderDO) {
List<Long> ids = outEntrustOrderDO.getIdList();
if (ids == null || ids.isEmpty()) {
throw new ServiceException("传递的ID值缺失或为空");
}
Integer targetStatus = outEntrustOrderDO.getOrderStatus();
if (!OutEntrustOrderConstant.ORDER_STATUS_AUDITED.equals(targetStatus)
&& !OutEntrustOrderConstant.ORDER_STATUS_REJECTED.equals(targetStatus)) {
throw new ServiceException("审核结果参数错误,只能为已审核或已驳回");
}
//只有待审核/已驳回的委托单才可以审核
List<OutEntrustOrderPO> orderList = outEntrustOrderDomainService.queryByIds(ids);
List<Long> unableAuditIds = orderList.stream()
.filter(order -> !OutEntrustOrderConstant.ORDER_STATUS_PENDING_AUDIT.equals(order.getOrderStatus())
&& !OutEntrustOrderConstant.ORDER_STATUS_REJECTED.equals(order.getOrderStatus()))
.map(OutEntrustOrderPO::getId).collect(Collectors.toList());
if (!unableAuditIds.isEmpty()) {
throw new ServiceException("选中数据中存在进行中/已审核/已入库的委托单,只有待审核或已驳回的委托单方可审核");
}
LoginUser loginUser = SecurityUtils.getLoginUser();
Long auditBy = loginUser == null ? null : loginUser.getUserid();
String auditByName = loginUser == null ? null : loginUser.getUsername();
return outEntrustOrderDomainService.audit(ids, targetStatus, auditBy, auditByName, outEntrustOrderDO.getAuditRemark());
}
/**
* 批量下发:已审核的委托单下发到WMS(生成出库通知单),下发后订单状态保持已审核,仅置下发状态为已下发
*/
@Transactional(rollbackFor = Exception.class)
public Boolean issueOrder(List<Long> ids) {
if (ids == null || ids.isEmpty()) {
throw new ServiceException("传递的ID值缺失或为空");
}
//只有已审核且未下发的委托单才可以下发
List<OutEntrustOrderPO> orderList = outEntrustOrderDomainService.queryByIds(ids);
for (OutEntrustOrderPO order : orderList) {
if (!OutEntrustOrderConstant.ORDER_STATUS_AUDITED.equals(order.getOrderStatus())) {
throw new ServiceException(String.format("委托单[%s]未审核,已审核的委托单方可下发", order.getEntrustNumber()));
}
if (!OutEntrustOrderConstant.ISSUE_STATUS_1.equals(order.getIssueStatus())) {
throw new ServiceException(String.format("委托单[%s]已下发,不允许重复下发", order.getEntrustNumber()));
}
}
LoginUser loginUser = SecurityUtils.getLoginUser();
Long issueBy = loginUser == null ? null : loginUser.getUserid();
String issueByName = loginUser == null ? null : loginUser.getUsername();
for (OutEntrustOrderPO order : orderList) {
//组装出库通知单
NoticeOrderDTO noticeOrderDTO = createNoticeOrderInfo(order);
//推送给WMS
AjaxResult ajaxResult = wmsServiceFeign.stockOutOrInInsert(noticeOrderDTO);
//WMS返回成功才允许置为已下发,避免下发失败被静默吞掉
if (ajaxResult == null || !"200".equals(String.valueOf(ajaxResult.get("code")))) {
String errorMsg = ajaxResult == null ? "WMS服务调用失败" : String.valueOf(ajaxResult.get("msg"));
log.error("出仓委托单[{}]下发WMS失败:{}", order.getEntrustNumber(), errorMsg);
throw new ServiceException(String.format("委托单[%s]下发WMS失败:%s", order.getEntrustNumber(), errorMsg));
}
log.info("出仓委托单[{}]下发WMS成功", order.getEntrustNumber());
}
return outEntrustOrderDomainService.issue(ids, issueBy, issueByName);
}
/**
* 批量完成:已审核(已下发) → 已入库(OMS人工推进,WMS出库完成后由人工确认)
*/
public Boolean finish(List<Long> ids) {
if (ids == null || ids.isEmpty()) {
throw new ServiceException("传递的ID值缺失或为空");
}
//只有已审核且已下发的委托单才可以置为已入库(兼容存量:旧版本曾自动置为进行中的也允许)
List<OutEntrustOrderPO> orderList = outEntrustOrderDomainService.queryByIds(ids);
List<Long> unableFinishIds = orderList.stream()
.filter(order -> !(OutEntrustOrderConstant.ORDER_STATUS_IN_PROGRESS.equals(order.getOrderStatus())
|| (OutEntrustOrderConstant.ORDER_STATUS_AUDITED.equals(order.getOrderStatus())
&& OutEntrustOrderConstant.ISSUE_STATUS_2.equals(order.getIssueStatus()))))
.map(OutEntrustOrderPO::getId).collect(Collectors.toList());
if (!unableFinishIds.isEmpty()) {
throw new ServiceException("选中数据中存在待审核/已驳回或未下发的委托单,只有已审核且已下发的委托单方可置为已入库");
}
LoginUser loginUser = SecurityUtils.getLoginUser();
Long updateBy = loginUser == null ? null : loginUser.getUserid();
String updateByName = loginUser == null ? null : loginUser.getUsername();
return outEntrustOrderDomainService.finish(ids, updateBy, updateByName);
}
/**
* 组装出库通知单信息(客户=货主)
*/
private NoticeOrderDTO createNoticeOrderInfo(OutEntrustOrderPO order) {
NoticeOrderDTO noticeOrderDTO = new NoticeOrderDTO();
noticeOrderDTO.setType(OutEntrustOrderConstant.NOTICE_TYPE_OUT);
//客户订单号记录委托单号,便于WMS侧追溯
noticeOrderDTO.setCustomerOrderNumber(order.getEntrustNumber());
noticeOrderDTO.setWarehouseId(order.getWarehouseId());
//出仓委托单的客户即WMS货主,货主为物料档案/库存作业的归属
noticeOrderDTO.setShipperId(order.getShipperId());
noticeOrderDTO.setShipperName(order.getShipperName());
noticeOrderDTO.setCustomerId(order.getShipperId());
noticeOrderDTO.setCustomerName(order.getShipperName());
//订单类型:未维护时默认普通出库(WMS侧按出库单据类型字典翻译)
noticeOrderDTO.setOrderTypeCode(order.getOrderTypeCode() == null
? OutEntrustOrderConstant.WMS_ORDER_TYPE_CODE : order.getOrderTypeCode());
noticeOrderDTO.setOrderTypeName(order.getOrderTypeName());
noticeOrderDTO.setExpectTime(order.getExpectTime() == null ? new Date() : order.getExpectTime());
noticeOrderDTO.setNullify(2);
//出库通知单仅有限几个业务字段:业务员及委托/报关关键信息拼入备注留存(超长截断)
noticeOrderDTO.setRemark(buildNoticeRemark(order));
//物料明细:申报数量作为通知单计划数量
List<OutEntrustOrderDetailPO> detailList = outEntrustOrderDomainService.getDetailByEntrustNumber(order.getEntrustNumber());
if (detailList == null || detailList.isEmpty()) {
throw new ServiceException(String.format("委托单[%s]缺少商品明细,无法下发", order.getEntrustNumber()));
}
List<NoticeMaterialDetailDTO> materialDetailList = new ArrayList<>();
for (OutEntrustOrderDetailPO detail : detailList) {
NoticeMaterialDetailDTO materialDetail = new NoticeMaterialDetailDTO();
materialDetail.setMaterialBaseInfoId(detail.getMaterialBaseInfoId());
materialDetail.setMaterialCode(detail.getMaterialCode());
//物料名称:档案名优先,无档案时用委托单品名
materialDetail.setMaterialName(detail.getMaterialName() != null && !detail.getMaterialName().trim().isEmpty()
? detail.getMaterialName() : detail.getCommodityName());
materialDetail.setBarCode(detail.getBarCode());
materialDetail.setQuantity(detail.getDeclareQuantity());
materialDetailList.add(materialDetail);
}
noticeOrderDTO.setMaterialDetailList(materialDetailList);
return noticeOrderDTO;
}
/**
* 出库通知单备注:拼入业务员及委托/报关关键信息(通知单无对应字段)
*/
private String buildNoticeRemark(OutEntrustOrderPO order) {
StringBuilder remark = new StringBuilder();
if (order.getRemark() != null && !order.getRemark().trim().isEmpty()) {
remark.append(order.getRemark().trim());
}
appendIfPresent(remark, "业务员", order.getSalesmanName());
appendIfPresent(remark, "委托编号", order.getEntrustNo());
appendIfPresent(remark, "柜号", order.getContainerNo());
appendIfPresent(remark, "承运商", order.getCarrierName() != null ? order.getCarrierName() : order.getCarrier());
appendIfPresent(remark, "To", order.getToReceiver());
appendIfPresent(remark, "联系人", order.getContactPerson());
appendIfPresent(remark, "电话", order.getTel());
appendIfPresent(remark, "申报地关区", order.getDeclareCustoms());
appendIfPresent(remark, "进出境关别", order.getEntryExitCustoms());
//备注列长度保护
return remark.length() > 480 ? remark.substring(0, 480) : remark.toString();
}
private void appendIfPresent(StringBuilder remark, String label, String value) {
if (value != null && !value.trim().isEmpty()) {
remark.append(remark.length() > 0 ? "" : "").append(label).append("").append(value.trim());
}
}
/**
* 必填项校验:客户、业务员、仓库、商品名称、申报数量,其余字段不强制
*/
private void validateRequired(OutEntrustOrderDO outEntrustOrderDO) {
if (outEntrustOrderDO.getShipperId() == null) {
throw new ServiceException("客户不能为空");
}
if (outEntrustOrderDO.getSalesmanId() == null || outEntrustOrderDO.getSalesmanId().trim().isEmpty()) {
throw new ServiceException("业务员不能为空");
}
if (outEntrustOrderDO.getWarehouseId() == null) {
throw new ServiceException("仓库不能为空");
}
if (outEntrustOrderDO.getMaterialDetailList() == null || outEntrustOrderDO.getMaterialDetailList().isEmpty()) {
throw new ServiceException("商品明细不能为空");
}
int index = 1;
for (OutEntrustOrderDetailDO detail : outEntrustOrderDO.getMaterialDetailList()) {
//商品名称:物料档案名/委托单品名至少其一
boolean nameBlank = (detail.getMaterialName() == null || detail.getMaterialName().trim().isEmpty())
&& (detail.getCommodityName() == null || detail.getCommodityName().trim().isEmpty());
if (nameBlank) {
throw new ServiceException(String.format("商品明细第%d行商品名称不能为空", index));
}
if (detail.getDeclareQuantity() == null || detail.getDeclareQuantity().compareTo(BigDecimal.ZERO) <= 0) {
throw new ServiceException(String.format("商品明细第%d行申报数量必须大于0", index));
}
index++;
}
}
/**
* 仓库信息校验并回填编码/名称
*/
private void setWarehouseInfo(OutEntrustOrderDO outEntrustOrderDO) {
AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(outEntrustOrderDO.getWarehouseId());
if (ajaxResult == null || !"200".equals(String.valueOf(ajaxResult.get("code")))) {
throw new ServiceException("获取仓库信息失败,请检查仓库是否有效");
}
WarehouseFeignPO warehouseFeignPO = JSONUtil.toBean(JSONUtil.toJsonStr(ajaxResult.get("data")), WarehouseFeignPO.class);
if (warehouseFeignPO == null || Objects.isNull(warehouseFeignPO.getWarehouseId())) {
throw new ServiceException("仓库不存在,请重新选择");
}
outEntrustOrderDO.setWarehouseCode(warehouseFeignPO.getWarehouseCode());
outEntrustOrderDO.setWarehouseName(warehouseFeignPO.getWarehouseName());
}
/**
* 组织信息填充
*/
private void setOrganizationInfo(OutEntrustOrderDO outEntrustOrderDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
outEntrustOrderDO.setOrganizationId(loginUser.getUserPo().getOrganizationId());
outEntrustOrderDO.setOrganizationName(loginUser.getUserPo().getOrganizationName());
outEntrustOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
}
}
/**
* 汇总明细申报数量
*/
private BigDecimal sumDeclareQuantity(List<OutEntrustOrderDetailDO> detailList) {
return detailList.stream()
.map(OutEntrustOrderDetailDO::getDeclareQuantity)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
}
@@ -0,0 +1,37 @@
package com.mhd.oms.constant;
/**
* 出仓委托单常量
*
* @author rcx
* @date 2026-09-02
*/
public interface OutEntrustOrderConstant {
/** 出仓委托单号前缀 */
String OUT_ENTRUST_NO_PREFIX = "CKWT";
/** 订单状态:1-待审核(新增默认值;已驳回单重新编辑后也回到此状态) */
Integer ORDER_STATUS_PENDING_AUDIT = 1;
/** 订单状态:2-已审核 */
Integer ORDER_STATUS_AUDITED = 2;
/** 订单状态:3-已驳回 */
Integer ORDER_STATUS_REJECTED = 3;
/** 订单状态:4-进行中(已下发WMS) */
Integer ORDER_STATUS_IN_PROGRESS = 4;
/** 订单状态:5-已入库 */
Integer ORDER_STATUS_STORED = 5;
/** 下发状态:1-未下发 */
Integer ISSUE_STATUS_1 = 1;
/** 下发状态:2-已下发 */
Integer ISSUE_STATUS_2 = 2;
/** 下发WMS出库通知单-订单类型编码 */
String WMS_ORDER_TYPE_CODE = "pu_tong_chu_ku";
/** 下发WMS出库通知单-订单类型名称 */
String WMS_ORDER_TYPE_NAME = "普通出库";
/** 出库通知单类型(NoticeOrderDTO.type1-入库通知单 2-出库通知单) */
Integer NOTICE_TYPE_OUT = 2;
}
@@ -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;
}
}
@@ -0,0 +1,84 @@
package com.mhd.oms.interfaces.assembler.outEntrustOrder;
import cn.hutool.core.util.ObjectUtil;
import com.mhd.common.core.exception.digitalLogisticsException.DigitalLogisticsException;
import com.mhd.common.core.exception.digitalLogisticsException.UserError;
import com.mhd.common.core.utils.IgnoreNullUtil;
import com.mhd.common.core.utils.bean.BeanUtils;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDO;
import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDetailDO;
import com.mhd.oms.interfaces.dto.outEntrustOrder.OutEntrustOrderDTO;
import com.mhd.oms.interfaces.dto.outEntrustOrder.OutEntrustOrderDetailDTO;
import com.mhd.system.api.model.LoginUser;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* 出仓委托单Assembler
*
* @author rcx
* @date 2026-09-02
*/
@Component
public class OutEntrustOrderAssembler {
/**
* 转换实体
*/
public OutEntrustOrderDO toDO(OutEntrustOrderDTO outEntrustOrderDTO) {
OutEntrustOrderDO outEntrustOrderDO = new OutEntrustOrderDO();
// 拷贝
BeanUtils.copyProperties(outEntrustOrderDTO, outEntrustOrderDO, IgnoreNullUtil.getNullPropertyNames(outEntrustOrderDTO));
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT);
}
String userName = loginUser.getUsername();
// 获取登录人id
Long userId = loginUser.getUserid();
if (outEntrustOrderDTO.getId() != null) {
if (userId != null) {
outEntrustOrderDO.setUpdateBy(userId);
} else {
outEntrustOrderDO.setUpdateBy(0L);
}
outEntrustOrderDO.setUpdateByName(userName);
outEntrustOrderDO.setUpdateTime(new Date());
} else {
if (userId != null) {
outEntrustOrderDO.setCreateBy(userId);
outEntrustOrderDO.setUpdateBy(userId);
} else {
outEntrustOrderDO.setCreateBy(0L);
outEntrustOrderDO.setUpdateBy(0L);
}
outEntrustOrderDO.setCreateByName(userName);
outEntrustOrderDO.setUpdateByName(userName);
outEntrustOrderDO.setCreateTime(new Date());
outEntrustOrderDO.setUpdateTime(new Date());
outEntrustOrderDO.setDelFlag(1);
}
// 明细转换
List<OutEntrustOrderDetailDTO> materialDetailList = outEntrustOrderDTO.getMaterialDetailList();
if (materialDetailList != null) {
outEntrustOrderDO.setMaterialDetailList(toDetailDOList(materialDetailList));
}
return outEntrustOrderDO;
}
/**
* 明细DTO转DO
*/
public List<OutEntrustOrderDetailDO> toDetailDOList(List<OutEntrustOrderDetailDTO> detailDTOList) {
return detailDTOList.stream().map(detailDTO -> {
OutEntrustOrderDetailDO detailDO = new OutEntrustOrderDetailDO();
BeanUtils.copyProperties(detailDTO, detailDO, IgnoreNullUtil.getNullPropertyNames(detailDTO));
return detailDO;
}).collect(Collectors.toList());
}
}
@@ -0,0 +1,198 @@
package com.mhd.oms.interfaces.dto.outEntrustOrder;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.mhd.common.core.web.domain.BaseVOEntity;
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;
import java.util.List;
/**
* 出仓委托单对象 oms_out_entrust_order
* 表单字段对齐WMS出库管理新增(报关/委托信息块)
*
* @author rcx
* @date 2026-09-02
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class OutEntrustOrderDTO 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(收货人)")
@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("下发状态:1-未下发 2-已下发")
private Integer issueStatus;
@ApiModelProperty("审核备注(驳回原因,审核时传)")
private String auditRemark;
@ApiModelProperty("申报总数量(服务端按明细汇总,无需传入)")
private BigDecimal declareTotalQuantity;
@ApiModelProperty("备注")
private String remark;
@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<OutEntrustOrderDetailDTO> materialDetailList;
}
@@ -0,0 +1,93 @@
package com.mhd.oms.interfaces.dto.outEntrustOrder;
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
public class OutEntrustOrderDetailDTO 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("商品名称(物料档案名,与commodityName至少其一)")
private String materialName;
@ApiModelProperty("商品条形码")
private String barCode;
@ApiModelProperty("商品名称(委托单品名,与materialName至少其一)")
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("申报数量(必填,大于0)")
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,111 @@
package com.mhd.oms.interfaces.facade.outEntrustOrder;
import com.mhd.common.core.web.controller.BaseController;
import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.core.web.page.TableDataInfo;
import com.mhd.oms.application.service.outEntrustOrder.OutEntrustOrderApplicationService;
import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderPO;
import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDO;
import com.mhd.oms.interfaces.assembler.outEntrustOrder.OutEntrustOrderAssembler;
import com.mhd.oms.interfaces.dto.outEntrustOrder.OutEntrustOrderDTO;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
/**
* 出仓委托单Api
*
* @author rcx
* @date 2026-09-02
*/
@Slf4j
@RestController
@RequestMapping("/outEntrustOrderApi")
public class OutEntrustOrderApi extends BaseController {
@Autowired
private OutEntrustOrderApplicationService outEntrustOrderApplicationService;
@Resource
private OutEntrustOrderAssembler outEntrustOrderAssembler;
/**
* 分页查询出仓委托单列表(显示全部数据,不做默认状态过滤)
*/
@ApiOperation("查询出仓委托单列表")
@GetMapping("/list")
public TableDataInfo list(OutEntrustOrderDTO outEntrustOrderDTO) {
//转换实体
OutEntrustOrderDO outEntrustOrderDO = outEntrustOrderAssembler.toDO(outEntrustOrderDTO);
startPage();
List<OutEntrustOrderPO> list = outEntrustOrderApplicationService.queryList(outEntrustOrderDO);
return getDataTable(list);
}
/**
* 新增/修改出仓委托单(必填:客户、业务员、仓库、商品名称、申报数量)
*/
@ApiOperation("编辑出仓委托单")
@PostMapping("/edit")
public AjaxResult edit(@RequestBody OutEntrustOrderDTO outEntrustOrderDTO) {
//转换实体
OutEntrustOrderDO outEntrustOrderDO = outEntrustOrderAssembler.toDO(outEntrustOrderDTO);
if (outEntrustOrderDTO.getId() != null) {
return toAjax(outEntrustOrderApplicationService.update(outEntrustOrderDO));
} else {
return toAjax(outEntrustOrderApplicationService.insert(outEntrustOrderDO));
}
}
/**
* 批量删除出仓委托单(仅待审核/已驳回且未下发)
*/
@ApiOperation("批量删除出仓委托单")
@DeleteMapping("/deleteByIds/{ids}")
public AjaxResult delete(@PathVariable Long[] ids) {
return toAjax(outEntrustOrderApplicationService.delete(ids));
}
/**
* 获取出仓委托单详情(含明细)
*/
@ApiOperation("获取出仓委托单")
@GetMapping(value = "/getInfo/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id) {
return AjaxResult.success(outEntrustOrderApplicationService.getInfo(id));
}
/**
* 批量审核:待审核/已驳回 → 已审核(通过)或已驳回
* 请求体:{"idList":[1,2],"orderStatus":3,"auditRemark":"备注"}orderStatus2-审核通过 3-驳回(auditRemark选填)
*/
@ApiOperation("审核出仓委托单")
@PostMapping("/audit")
public AjaxResult audit(@RequestBody OutEntrustOrderDTO outEntrustOrderDTO) {
return toAjax(outEntrustOrderApplicationService.audit(outEntrustOrderAssembler.toDO(outEntrustOrderDTO)));
}
/**
* 批量下发:已审核的委托单下发到WMS(生成出库通知单),下发后订单状态变为进行中
*/
@ApiOperation("下发出仓委托单")
@PostMapping("/issueOrder")
public AjaxResult issueOrder(@RequestBody HashMap<String,List<Long>> body) {
List<Long> ids = body.get("ids");
return toAjax(outEntrustOrderApplicationService.issueOrder(ids));
}
/**
* 批量完成:进行中 → 已入库(WMS出库完成后人工确认)
*/
@ApiOperation("委托单完成入库")
@PostMapping("/finish")
public AjaxResult finish(@RequestBody List<Long> ids) {
return toAjax(outEntrustOrderApplicationService.finish(ids));
}
}
@@ -0,0 +1,181 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mhd.oms.domain.outEntrustOrder.repository.mapper.OutEntrustOrderMapper">
<resultMap type="com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderPO" id="OutEntrustOrderResult">
<result property="id" column="id" />
<result property="createBy" column="create_by" />
<result property="createByName" column="create_by_name" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateByName" column="update_by_name" />
<result property="updateTime" column="update_time" />
<result property="delFlag" column="del_flag" />
<result property="entrustNumber" column="entrust_number" />
<result property="warehouseId" column="warehouse_id" />
<result property="warehouseCode" column="warehouse_code" />
<result property="warehouseName" column="warehouse_name" />
<result property="shipperId" column="shipper_id" />
<result property="shipperCode" column="shipper_code" />
<result property="shipperName" column="shipper_name" />
<result property="salesmanId" column="salesman_id" />
<result property="salesmanName" column="salesman_name" />
<result property="orderTypeCode" column="order_type_code" />
<result property="orderTypeName" column="order_type_name" />
<result property="settlementCurrency" column="settlement_currency" />
<result property="priorityLevelCode" column="priority_level_code" />
<result property="priorityLevelName" column="priority_level_name" />
<result property="directWarehouse" column="direct_warehouse" />
<result property="review" column="review" />
<result property="expectTime" column="expect_time" />
<result property="outboundDate" column="outbound_date" />
<result property="orderDate" column="order_date" />
<result property="completeTime" column="complete_time" />
<result property="toReceiver" column="to_receiver" />
<result property="contactPerson" column="contact_person" />
<result property="vehicleModelPlate" column="vehicle_model_plate" />
<result property="entrustNo" column="entrust_no" />
<result property="tel" column="tel" />
<result property="fax" column="fax" />
<result property="driverSign" column="driver_sign" />
<result property="carrier" column="carrier" />
<result property="carrierName" column="carrier_name" />
<result property="containerNo" column="container_no" />
<result property="containerNoName" column="container_no_name" />
<result property="transportModeCode" column="transport_mode_code" />
<result property="transportModeName" column="transport_mode_name" />
<result property="supervisionModeCode" column="supervision_mode_code" />
<result property="supervisionModeName" column="supervision_mode_name" />
<result property="declareCustoms" column="declare_customs" />
<result property="entryExitCustoms" column="entry_exit_customs" />
<result property="departureArrivalCountry" column="departure_arrival_country" />
<result property="customsInspectionFlag" column="customs_inspection_flag" />
<result property="needDeclareFlag" column="need_declare_flag" />
<result property="needTransportFlag" column="need_transport_flag" />
<result property="manufacturer" column="manufacturer" />
<result property="customsDeclarerInfo" column="customs_declarer_info" />
<result property="deliveryAddr" column="delivery_addr" />
<result property="annexUrl" column="annex_url" />
<result property="orderStatus" column="order_status" />
<result property="orderStatusStr" column="order_status_str" />
<result property="auditBy" column="audit_by" />
<result property="auditByName" column="audit_by_name" />
<result property="auditTime" column="audit_time" />
<result property="auditRemark" column="audit_remark" />
<result property="issueStatus" column="issue_status" />
<result property="issueStatusStr" column="issue_status_str" />
<result property="issueBy" column="issue_by" />
<result property="issueByName" column="issue_by_name" />
<result property="issueTime" column="issue_time" />
<result property="declareTotalQuantity" column="declare_total_quantity" />
<result property="remark" column="remark" />
<result property="organizationId" column="organization_id" />
<result property="organizationName" column="organization_name" />
<result property="topOrganizationId" column="top_organization_id" />
</resultMap>
<sql id="selectOutEntrustOrderPo">
select
a.id,a.create_by,a.create_by_name,a.create_time,a.update_by,a.update_by_name,a.update_time,a.del_flag,
a.entrust_number,a.warehouse_id,a.warehouse_code,a.warehouse_name,a.shipper_id,a.shipper_code,a.shipper_name,
a.salesman_id,a.salesman_name,a.order_type_code,a.order_type_name,a.settlement_currency,a.priority_level_code,a.priority_level_name,
a.direct_warehouse,a.review,a.expect_time,a.outbound_date,a.order_date,a.complete_time,
a.to_receiver,a.contact_person,a.vehicle_model_plate,a.entrust_no,a.tel,a.fax,a.driver_sign,
a.carrier,a.carrier_name,a.container_no,a.container_no_name,
a.transport_mode_code,a.transport_mode_name,a.supervision_mode_code,a.supervision_mode_name,
a.declare_customs,a.entry_exit_customs,a.departure_arrival_country,a.customs_inspection_flag,
a.need_declare_flag,a.need_transport_flag,a.manufacturer,a.customs_declarer_info,a.delivery_addr,a.annex_url,
a.order_status,a.audit_by,a.audit_by_name,a.audit_time,a.audit_remark,
a.issue_status,a.issue_by,a.issue_by_name,a.issue_time,a.declare_total_quantity,
a.remark,a.organization_id,a.organization_name,a.top_organization_id,
case a.order_status when 1 then '待审核' when 2 then '已审核' when 3 then '已驳回' when 4 then '进行中' when 5 then '已入库' else '未知状态' end order_status_str,
case a.issue_status when 1 then '未下发' when 2 then '已下发' else '未知状态' end issue_status_str
from
oms_out_entrust_order a
</sql>
<sql id="selectOutEntrustOrderPo1">
<where>
a.del_flag = 1
<if test="entrustNumber != null and entrustNumber != ''">
and a.entrust_number like concat('%', #{entrustNumber}, '%')
</if>
<if test="entrustNo != null and entrustNo != ''">
and a.entrust_no like concat('%', #{entrustNo}, '%')
</if>
<if test="warehouseId != null">
and a.warehouse_id = #{warehouseId}
</if>
<if test="warehouseName != null and warehouseName != ''">
and a.warehouse_name like concat('%', #{warehouseName}, '%')
</if>
<if test="shipperId != null">
and a.shipper_id = #{shipperId}
</if>
<if test="shipperName != null and shipperName != ''">
and a.shipper_name like concat('%', #{shipperName}, '%')
</if>
<if test="salesmanId != null and salesmanId != ''">
and a.salesman_id = #{salesmanId}
</if>
<if test="salesmanName != null and salesmanName != ''">
and a.salesman_name like concat('%', #{salesmanName}, '%')
</if>
<if test="containerNo != null and containerNo != ''">
and a.container_no like concat('%', #{containerNo}, '%')
</if>
<if test="orderStatus != null">
and a.order_status = #{orderStatus}
</if>
<if test="issueStatus != null">
and a.issue_status = #{issueStatus}
</if>
<if test="settlementCurrency != null and settlementCurrency != ''">
and a.settlement_currency = #{settlementCurrency}
</if>
<if test="invoiceNo != null and invoiceNo != ''">
and exists (
select 1 from oms_out_entrust_order_detail d
where d.entrust_number = a.entrust_number
and d.del_flag = 1
and d.invoice_no like concat('%', #{invoiceNo}, '%')
)
</if>
<if test="topOrganizationId != null">
and a.top_organization_id = #{topOrganizationId}
</if>
<if test="beginCreateTime != null">
and a.create_time &gt;= #{beginCreateTime}
</if>
<if test="endCreateTime != null">
and a.create_time &lt;= #{endCreateTime}
</if>
<if test="idList != null">
and a.id in
<foreach collection="idList" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</if>
</where>
order by a.create_time desc
</sql>
<select id="queryList" parameterType="com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDO" resultMap="OutEntrustOrderResult">
<include refid="selectOutEntrustOrderPo"/>
<include refid="selectOutEntrustOrderPo1"/>
</select>
<select id="getInfoByIds" resultMap="OutEntrustOrderResult">
<include refid="selectOutEntrustOrderPo"/>
<where>
a.del_flag = 1
and a.id in
<foreach collection="idList" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</where>
</select>
</mapper>
@@ -0,0 +1,230 @@
-- ----------------------------
-- 通宇「出仓委托单」OMS 建表脚本 —— 达梦(DM)数据库版(最终版,新库直接执行本脚本即可,无需任何增量)
-- 适用:mhd-oms-service 连接的达梦库(生产/测试按环境选择,在OMS服务连接的用户/模式下执行)
-- 含:明细单价UNIT_PRICE、结算币种、审核备注、订单状态(1-待审核 2-已审核 3-已驳回 4-进行中(预留) 5-已入库,默认1待审核)
-- @date 2026-09-03
-- ----------------------------
-- 主表:出仓委托单
CREATE TABLE OMS_OUT_ENTRUST_ORDER (
ID BIGINT IDENTITY(1,1) NOT NULL,
ENTRUST_NUMBER VARCHAR(50) DEFAULT NULL,
WAREHOUSE_ID BIGINT DEFAULT NULL,
WAREHOUSE_CODE VARCHAR(50) DEFAULT NULL,
WAREHOUSE_NAME VARCHAR(100) DEFAULT NULL,
SHIPPER_ID BIGINT DEFAULT NULL,
SHIPPER_CODE VARCHAR(50) DEFAULT NULL,
SHIPPER_NAME VARCHAR(100) DEFAULT NULL,
SALESMAN_ID VARCHAR(64) DEFAULT NULL,
SALESMAN_NAME VARCHAR(50) DEFAULT NULL,
ORDER_TYPE_CODE VARCHAR(50) DEFAULT NULL,
ORDER_TYPE_NAME VARCHAR(100) DEFAULT NULL,
SETTLEMENT_CURRENCY VARCHAR(50) DEFAULT NULL,
PRIORITY_LEVEL_CODE VARCHAR(50) DEFAULT NULL,
PRIORITY_LEVEL_NAME VARCHAR(50) DEFAULT NULL,
DIRECT_WAREHOUSE INT DEFAULT NULL,
REVIEW INT DEFAULT NULL,
EXPECT_TIME DATETIME DEFAULT NULL,
OUTBOUND_DATE DATETIME DEFAULT NULL,
ORDER_DATE DATETIME DEFAULT NULL,
COMPLETE_TIME DATETIME DEFAULT NULL,
TO_RECEIVER VARCHAR(200) DEFAULT NULL,
CONTACT_PERSON VARCHAR(100) DEFAULT NULL,
VEHICLE_MODEL_PLATE VARCHAR(100) DEFAULT NULL,
ENTRUST_NO VARCHAR(100) DEFAULT NULL,
TEL VARCHAR(50) DEFAULT NULL,
FAX VARCHAR(50) DEFAULT NULL,
DRIVER_SIGN VARCHAR(100) DEFAULT NULL,
CARRIER VARCHAR(100) DEFAULT NULL,
CARRIER_NAME VARCHAR(200) DEFAULT NULL,
CONTAINER_NO VARCHAR(100) DEFAULT NULL,
CONTAINER_NO_NAME VARCHAR(50) DEFAULT NULL,
TRANSPORT_MODE_CODE VARCHAR(50) DEFAULT NULL,
TRANSPORT_MODE_NAME VARCHAR(50) DEFAULT NULL,
SUPERVISION_MODE_CODE VARCHAR(50) DEFAULT NULL,
SUPERVISION_MODE_NAME VARCHAR(50) DEFAULT NULL,
DECLARE_CUSTOMS VARCHAR(100) DEFAULT NULL,
ENTRY_EXIT_CUSTOMS VARCHAR(100) DEFAULT NULL,
DEPARTURE_ARRIVAL_COUNTRY VARCHAR(100) DEFAULT NULL,
CUSTOMS_INSPECTION_FLAG VARCHAR(50) DEFAULT NULL,
NEED_DECLARE_FLAG VARCHAR(50) DEFAULT NULL,
NEED_TRANSPORT_FLAG VARCHAR(50) DEFAULT NULL,
MANUFACTURER VARCHAR(200) DEFAULT NULL,
CUSTOMS_DECLARER_INFO VARCHAR(200) DEFAULT NULL,
DELIVERY_ADDR VARCHAR(500) DEFAULT NULL,
ANNEX_URL VARCHAR(500) DEFAULT NULL,
ORDER_STATUS INT DEFAULT 1,
AUDIT_BY BIGINT DEFAULT NULL,
AUDIT_BY_NAME VARCHAR(50) DEFAULT NULL,
AUDIT_TIME DATETIME DEFAULT NULL,
AUDIT_REMARK VARCHAR(500) DEFAULT NULL,
ISSUE_STATUS INT DEFAULT 1,
ISSUE_BY BIGINT DEFAULT NULL,
ISSUE_BY_NAME VARCHAR(50) DEFAULT NULL,
ISSUE_TIME DATETIME DEFAULT NULL,
DECLARE_TOTAL_QUANTITY DECIMAL(24,6) DEFAULT 0,
REMARK VARCHAR(500) DEFAULT NULL,
ORGANIZATION_ID BIGINT DEFAULT NULL,
ORGANIZATION_NAME VARCHAR(100) DEFAULT NULL,
TOP_ORGANIZATION_ID BIGINT DEFAULT NULL,
CREATE_BY BIGINT DEFAULT NULL,
CREATE_BY_NAME VARCHAR(50) DEFAULT NULL,
CREATE_TIME DATETIME DEFAULT NULL,
UPDATE_BY BIGINT DEFAULT NULL,
UPDATE_BY_NAME VARCHAR(50) DEFAULT NULL,
UPDATE_TIME DATETIME DEFAULT NULL,
DEL_FLAG INT DEFAULT 1,
CONSTRAINT PK_OMS_OUT_ENTRUST_ORDER PRIMARY KEY (ID)
);
COMMENT ON TABLE OMS_OUT_ENTRUST_ORDER IS '出仓委托单主表';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ID IS '编号';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ENTRUST_NUMBER IS '委托单号';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.WAREHOUSE_ID IS '出库仓库ID(必填)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.WAREHOUSE_CODE IS '仓库编码';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.WAREHOUSE_NAME IS '仓库名称';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SHIPPER_ID IS '客户ID(货主,必填)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SHIPPER_CODE IS '客户编码';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SHIPPER_NAME IS '客户名称';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SALESMAN_ID IS '业务员ID(必填)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SALESMAN_NAME IS '业务员名称';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORDER_TYPE_CODE IS '订单类型编码(字典outDocumentType,为空时下发默认普通出库)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORDER_TYPE_NAME IS '订单类型名称';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SETTLEMENT_CURRENCY IS '结算币种';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.PRIORITY_LEVEL_CODE IS '优先级别编码';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.PRIORITY_LEVEL_NAME IS '优先级别名称';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DIRECT_WAREHOUSE IS '是否直接出库: 1-是 2-否';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.REVIEW IS '是否复核: 1-是 2-否';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.EXPECT_TIME IS '预计出货时间';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.OUTBOUND_DATE IS '出仓日期';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORDER_DATE IS 'orderDate';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.COMPLETE_TIME IS '完成时间';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.TO_RECEIVER IS 'To(收货人)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CONTACT_PERSON IS '联系人';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.VEHICLE_MODEL_PLATE IS '车型及车牌';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ENTRUST_NO IS '委托编号(客户委托单号)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.TEL IS 'Tel电话';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.FAX IS 'Fax传真';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DRIVER_SIGN IS '司机签名';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CARRIER IS '承运商编码';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CARRIER_NAME IS '承运商名称';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CONTAINER_NO IS '柜号';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CONTAINER_NO_NAME IS '';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.TRANSPORT_MODE_CODE IS '运输方式编码';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.TRANSPORT_MODE_NAME IS '运输方式名称';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SUPERVISION_MODE_CODE IS '监管方式编码';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SUPERVISION_MODE_NAME IS '监管方式名称';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DECLARE_CUSTOMS IS '申报地关区';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ENTRY_EXIT_CUSTOMS IS '进出境关别';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DEPARTURE_ARRIVAL_COUNTRY IS '起运/运抵国(地区)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CUSTOMS_INSPECTION_FLAG IS '海关是否查验货物';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.NEED_DECLARE_FLAG IS '是否需要报关(预留,页面隐藏)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.NEED_TRANSPORT_FLAG IS '是否需要运输(预留,页面隐藏)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.MANUFACTURER IS '生产商';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CUSTOMS_DECLARER_INFO IS '报关员姓名及联系方式';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DELIVERY_ADDR IS '送货地址';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ANNEX_URL IS '附件url';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORDER_STATUS IS '订单状态:1-待审核 2-已审核(含已下发) 3-已驳回 4-进行中(预留) 5-已入库';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.AUDIT_BY IS '审核人ID';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.AUDIT_BY_NAME IS '审核人姓名';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.AUDIT_TIME IS '审核时间';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.AUDIT_REMARK IS '审核备注(驳回原因)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ISSUE_STATUS IS '下发状态:1-未下发 2-已下发';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ISSUE_BY IS '下发人ID';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ISSUE_BY_NAME IS '下发人姓名';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ISSUE_TIME IS '下发时间';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DECLARE_TOTAL_QUANTITY IS '申报总数量(明细申报数量之和)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.REMARK IS '备注';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORGANIZATION_ID IS '组织ID';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORGANIZATION_NAME IS '组织名称';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.TOP_ORGANIZATION_ID IS '一级组织ID';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DEL_FLAG IS '删除标记:0-无状态,1-正常,2-已删除';
CREATE INDEX IDX_OOE_ENTRUST_NUMBER ON OMS_OUT_ENTRUST_ORDER (ENTRUST_NUMBER);
CREATE INDEX IDX_OOE_TOP_ORG ON OMS_OUT_ENTRUST_ORDER (TOP_ORGANIZATION_ID);
-- 明细表:出仓委托单明细
CREATE TABLE OMS_OUT_ENTRUST_ORDER_DETAIL (
ID BIGINT IDENTITY(1,1) NOT NULL,
ENTRUST_NUMBER VARCHAR(50) DEFAULT NULL,
MATERIAL_BASE_INFO_ID BIGINT DEFAULT NULL,
MATERIAL_CODE VARCHAR(100) DEFAULT NULL,
MATERIAL_NAME VARCHAR(200) DEFAULT NULL,
BAR_CODE VARCHAR(100) DEFAULT NULL,
COMMODITY_NAME VARCHAR(200) DEFAULT NULL,
COMMODITY_NO VARCHAR(100) DEFAULT NULL,
MATERIAL_NO VARCHAR(100) DEFAULT NULL,
SPECIFICATION_MODEL VARCHAR(200) DEFAULT NULL,
SKUCODE VARCHAR(100) DEFAULT NULL,
INVOICE_NO VARCHAR(200) DEFAULT NULL,
DECLARE_UNIT VARCHAR(50) DEFAULT NULL,
DECLARE_QUANTITY DECIMAL(24,6) DEFAULT NULL,
UNIT_PRICE DECIMAL(24,6) DEFAULT NULL,
UNIT VARCHAR(50) DEFAULT NULL,
LITER VARCHAR(50) DEFAULT NULL,
"SIZE" VARCHAR(100) DEFAULT NULL,
CASE_COUNT DECIMAL(24,6) DEFAULT NULL,
PIECE_COUNT DECIMAL(24,6) DEFAULT NULL,
OUTBOUND_QUANTITY DECIMAL(24,6) DEFAULT NULL,
TOTAL_NET_WEIGHT DECIMAL(24,6) DEFAULT NULL,
TOTAL_GROSS_WEIGHT DECIMAL(24,6) DEFAULT NULL,
TOTAL_VOLUME DECIMAL(24,6) DEFAULT NULL,
TOTAL_AREA DECIMAL(24,6) DEFAULT NULL,
TOTAL_AMOUNT DECIMAL(24,6) DEFAULT NULL,
CURRENCY VARCHAR(50) DEFAULT NULL,
BATCH_REF_NO VARCHAR(100) DEFAULT NULL,
SHEET_REF_NO VARCHAR(100) DEFAULT NULL,
COUNTRY_OF_ORIGIN VARCHAR(100) DEFAULT NULL,
BOX_PALLET_NO VARCHAR(100) DEFAULT NULL,
REMARK VARCHAR(500) DEFAULT NULL,
CREATE_BY BIGINT DEFAULT NULL,
CREATE_BY_NAME VARCHAR(50) DEFAULT NULL,
CREATE_TIME DATETIME DEFAULT NULL,
UPDATE_BY BIGINT DEFAULT NULL,
UPDATE_BY_NAME VARCHAR(50) DEFAULT NULL,
UPDATE_TIME DATETIME DEFAULT NULL,
DEL_FLAG INT DEFAULT 1,
CONSTRAINT PK_OMS_OUT_ENTRUST_ORDER_DETAIL PRIMARY KEY (ID)
);
COMMENT ON TABLE OMS_OUT_ENTRUST_ORDER_DETAIL IS '出仓委托单明细表';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.ID IS '编号';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.ENTRUST_NUMBER IS '委托单号(关联主表)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.MATERIAL_BASE_INFO_ID IS '物料基础信息ID';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.MATERIAL_CODE IS '商品编码';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.MATERIAL_NAME IS '商品名称(物料档案名,与COMMODITY_NAME至少其一)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.BAR_CODE IS '商品条形码';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.COMMODITY_NAME IS '商品名称(委托单品名,与MATERIAL_NAME至少其一)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.COMMODITY_NO IS '商品编号';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.MATERIAL_NO IS '料号';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.SPECIFICATION_MODEL IS '规格型号';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.SKUCODE IS 'SKU码';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.INVOICE_NO IS '发票号';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.DECLARE_UNIT IS '申报单位';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.DECLARE_QUANTITY IS '申报数量(必填,大于0)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.UNIT_PRICE IS '单价';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.UNIT IS '单位';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.LITER IS '';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL."SIZE" IS '尺寸';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.CASE_COUNT IS '箱数';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.PIECE_COUNT IS '件数';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.OUTBOUND_QUANTITY IS '出库数量';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.TOTAL_NET_WEIGHT IS '总净重(千克)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.TOTAL_GROSS_WEIGHT IS '总毛重(千克)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.TOTAL_VOLUME IS '总体积(立方米)';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.TOTAL_AREA IS '总面积';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.TOTAL_AMOUNT IS '总金额';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.CURRENCY IS '币制';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.BATCH_REF_NO IS '批次';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.SHEET_REF_NO IS '单据参考号';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.COUNTRY_OF_ORIGIN IS '原产国';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.BOX_PALLET_NO IS '箱/托盘号';
COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.DEL_FLAG IS '删除标记:0-无状态,1-正常,2-已删除';
CREATE INDEX IDX_OOED_ENTRUST_NUMBER ON OMS_OUT_ENTRUST_ORDER_DETAIL (ENTRUST_NUMBER);
-- ----------------------------
-- 回滚脚本
-- DROP TABLE OMS_OUT_ENTRUST_ORDER_DETAIL;
-- DROP TABLE OMS_OUT_ENTRUST_ORDER;
-- ----------------------------