diff --git a/ruoyi-api/pom.xml b/ruoyi-api/pom.xml
index eef7cf34..e0e99eba 100644
--- a/ruoyi-api/pom.xml
+++ b/ruoyi-api/pom.xml
@@ -13,6 +13,7 @@
ruoyi-api-system
ruoyi-api-resource
ruoyi-api-workflow
+ ruoyi-api-wms
ruoyi-api
diff --git a/ruoyi-api/ruoyi-api-bom/pom.xml b/ruoyi-api/ruoyi-api-bom/pom.xml
index 96177272..a3283eb5 100644
--- a/ruoyi-api/ruoyi-api-bom/pom.xml
+++ b/ruoyi-api/ruoyi-api-bom/pom.xml
@@ -41,6 +41,13 @@
${revision}
+
+
+ org.dromara
+ ruoyi-api-wms
+ ${revision}
+
+
diff --git a/ruoyi-api/ruoyi-api-wms/pom.xml b/ruoyi-api/ruoyi-api-wms/pom.xml
new file mode 100644
index 00000000..46ad8183
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-wms/pom.xml
@@ -0,0 +1,31 @@
+
+
+
+ org.dromara
+ ruoyi-api
+ ${revision}
+
+ 4.0.0
+
+ ruoyi-api-wms
+
+
+ ruoyi-api-wms WMS接口模块
+
+
+
+
+
+ org.dromara
+ ruoyi-common-core
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+
+
+
+
+
diff --git a/ruoyi-api/ruoyi-api-wms/src/main/java/org/dromara/wms/api/RemoteWmsShippingBillService.java b/ruoyi-api/ruoyi-api-wms/src/main/java/org/dromara/wms/api/RemoteWmsShippingBillService.java
new file mode 100644
index 00000000..1c495e89
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-wms/src/main/java/org/dromara/wms/api/RemoteWmsShippingBillService.java
@@ -0,0 +1,20 @@
+package org.dromara.wms.api;
+
+import org.dromara.wms.api.domain.RemoteWmsShippingDraft;
+
+/**
+ * 发货单远程服务
+ *
+ * @author Codex
+ */
+public interface RemoteWmsShippingBillService {
+
+ /**
+ * 根据项目快照创建发货草稿
+ *
+ * @param draft 发货草稿快照
+ * @return 发货单ID
+ */
+ Long createDraftByProject(RemoteWmsShippingDraft draft);
+
+}
diff --git a/ruoyi-api/ruoyi-api-wms/src/main/java/org/dromara/wms/api/domain/RemoteWmsShippingDraft.java b/ruoyi-api/ruoyi-api-wms/src/main/java/org/dromara/wms/api/domain/RemoteWmsShippingDraft.java
new file mode 100644
index 00000000..387ea778
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-wms/src/main/java/org/dromara/wms/api/domain/RemoteWmsShippingDraft.java
@@ -0,0 +1,170 @@
+package org.dromara.wms.api.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 发货草稿快照
+ *
+ * @author Codex
+ */
+@Data
+public class RemoteWmsShippingDraft implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 项目ID
+ */
+ private Long projectId;
+
+ /**
+ * 项目编号
+ */
+ private String projectCode;
+
+ /**
+ * 项目名称
+ */
+ private String projectName;
+
+ /**
+ * 绑定类型
+ */
+ private String bindType;
+
+ /**
+ * 发货方式
+ */
+ private String shippingMode;
+
+ /**
+ * 发货类型
+ */
+ private String shippingType;
+
+ /**
+ * 合同ID
+ */
+ private Long contractId;
+
+ /**
+ * 合同编号
+ */
+ private String contractCode;
+
+ /**
+ * 合同名称
+ */
+ private String contractName;
+
+ /**
+ * SAP订单号
+ */
+ private String orderContractCode;
+
+ /**
+ * 客户ID
+ */
+ private Long customerId;
+
+ /**
+ * 客户名称
+ */
+ private String customerName;
+
+ /**
+ * 收货地址
+ */
+ private String shippingAddress;
+
+ /**
+ * 收货联系人
+ */
+ private String receiverName;
+
+ /**
+ * 收货电话
+ */
+ private String receiverPhone;
+
+ /**
+ * 发货说明
+ */
+ private String directions;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 合同跟进人
+ */
+ private Long contractUserId;
+
+ /**
+ * 项目经理
+ */
+ private Long managerId;
+
+ /**
+ * 草稿物料快照
+ */
+ private List details;
+
+
+
+
+ /**
+ * 租户编号
+ */
+ private String tenantId;
+
+ /**
+ * 搜索值
+ */
+ @JsonIgnore
+ private String searchValue;
+
+ /**
+ * 创建部门
+ */
+ private Long createDept;
+
+ /**
+ * 创建者
+ */
+ private Long createBy;
+
+ /**
+ * 创建时间
+ */
+ private Date createTime;
+
+ /**
+ * 更新者
+ */
+ private Long updateBy;
+
+ /**
+ * 更新时间
+ */
+ private Date updateTime;
+
+ /**
+ * 请求参数
+ */
+ @JsonInclude(JsonInclude.Include.NON_EMPTY)
+ private Map params = new HashMap<>();
+
+}
diff --git a/ruoyi-api/ruoyi-api-wms/src/main/java/org/dromara/wms/api/domain/RemoteWmsShippingDraftItem.java b/ruoyi-api/ruoyi-api-wms/src/main/java/org/dromara/wms/api/domain/RemoteWmsShippingDraftItem.java
new file mode 100644
index 00000000..01fbd7fa
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-wms/src/main/java/org/dromara/wms/api/domain/RemoteWmsShippingDraftItem.java
@@ -0,0 +1,80 @@
+package org.dromara.wms.api.domain;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 发货草稿物料快照
+ *
+ * @author Codex
+ */
+@Data
+public class RemoteWmsShippingDraftItem implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 来源明细ID
+ */
+ private Long sourceDetailId;
+
+ /**
+ * ERP物料ID
+ */
+ private Long erpMaterialId;
+
+ /**
+ * 物料ID
+ */
+ private Long materielId;
+
+ /**
+ * 物料编码
+ */
+ private String materialCode;
+
+ /**
+ * 物料名称
+ */
+ private String materialName;
+
+ /**
+ * 规格型号
+ */
+ private String materielSpecification;
+
+ /**
+ * 数量
+ */
+ private BigDecimal shippingStockAmount;
+
+ /**
+ * 单位ID
+ */
+ private Long unitId;
+
+ /**
+ * 单位名称
+ */
+ private String unitName;
+
+ /**
+ * 单价
+ */
+ private BigDecimal unitPrice;
+
+ /**
+ * 总价
+ */
+ private BigDecimal totalPrice;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/ruoyi-modules/ruoyi-oa/pom.xml b/ruoyi-modules/ruoyi-oa/pom.xml
index 22566120..33e7e93b 100644
--- a/ruoyi-modules/ruoyi-oa/pom.xml
+++ b/ruoyi-modules/ruoyi-oa/pom.xml
@@ -105,6 +105,11 @@
ruoyi-api-workflow
+
+ org.dromara
+ ruoyi-api-wms
+
+
org.dromara
ruoyi-common-bus
diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractInfoServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractInfoServiceImpl.java
index 41e7ba96..eacbc7ea 100644
--- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractInfoServiceImpl.java
+++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractInfoServiceImpl.java
@@ -446,7 +446,7 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService {
data.put("外部合同号", strVal(contractInfo.getExternalContractCode()));
data.put("订单号", strVal(contractInfo.getOrderContractCode()));
data.put("项目号", strVal(contractInfo.getProjectContractCode()));
- // Why:当前业务已明确“交付启动期限”与“交货期”同义,双键同时输出可兼容不同模板占位符命名
+ // 当前业务已明确“交付启动期限”与“交货期”同义,双键同时输出可兼容不同模板占位符命名
String deliveryPeriod = strVal(contractInfo.getDeliveryStart());
data.put("交货期", deliveryPeriod);
data.put("交付启动期限", deliveryPeriod);
@@ -464,7 +464,7 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService {
// 审批单只展示“已办节点”,避免把待办节点(无审批时间/意见)混入导出文档
Map flowData = remoteWorkflowService.flowHisTaskList(String.valueOf(contractId));
List
+
+
+ org.dromara
+ ruoyi-api-wms
+
org.dromara
ruoyi-common-bus
diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/dubbo/RemoteWmsShippingBillServiceImpl.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/dubbo/RemoteWmsShippingBillServiceImpl.java
new file mode 100644
index 00000000..0696b6c1
--- /dev/null
+++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/dubbo/RemoteWmsShippingBillServiceImpl.java
@@ -0,0 +1,27 @@
+package org.dromara.wms.dubbo;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.wms.api.RemoteWmsShippingBillService;
+import org.dromara.wms.api.domain.RemoteWmsShippingDraft;
+import org.dromara.wms.service.IWmsShippingBillService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 发货单远程服务实现
+ *
+ * @author Codex
+ */
+@RequiredArgsConstructor
+@Service
+@DubboService
+public class RemoteWmsShippingBillServiceImpl implements RemoteWmsShippingBillService {
+
+ private final IWmsShippingBillService wmsShippingBillService;
+
+ @Override
+ public Long createDraftByProject(RemoteWmsShippingDraft draft) {
+ return wmsShippingBillService.createDraftByProject(draft);
+ }
+
+}
diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingBillService.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingBillService.java
index cbc07585..0209a153 100644
--- a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingBillService.java
+++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/IWmsShippingBillService.java
@@ -2,11 +2,13 @@ package org.dromara.wms.service;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.wms.api.domain.RemoteWmsShippingDraft;
import org.dromara.wms.domain.bo.WmsShippingBillBo;
import org.dromara.wms.domain.vo.WmsShippingBillVo;
import java.util.Collection;
import java.util.List;
+import java.util.Map;
/**
* 发货单Service接口
@@ -80,6 +82,14 @@ public interface IWmsShippingBillService {
* @param shippingBillId 发货单ID
* @return Word模板数据Map
*/
- java.util.Map buildWordExportData(Long shippingBillId);
+ Map buildWordExportData(Long shippingBillId);
+
+ /**
+ * 根据项目快照创建发货草稿
+ *
+ * @param draft 发货草稿快照
+ * @return 发货单ID
+ */
+ Long createDraftByProject(RemoteWmsShippingDraft draft);
}
diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingBillServiceImpl.java b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingBillServiceImpl.java
index d35d4406..14455960 100644
--- a/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingBillServiceImpl.java
+++ b/ruoyi-modules/ruoyi-wms/src/main/java/org/dromara/wms/service/impl/WmsShippingBillServiceImpl.java
@@ -23,6 +23,8 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.api.RemoteCodeRuleService;
+import org.dromara.wms.api.domain.RemoteWmsShippingDraft;
+import org.dromara.wms.api.domain.RemoteWmsShippingDraftItem;
import org.dromara.wms.domain.WmsShippingBill;
import org.dromara.wms.domain.WmsShippingDetails;
import org.dromara.wms.domain.bo.WmsShippingBillBo;
@@ -243,6 +245,58 @@ public class WmsShippingBillServiceImpl implements IWmsShippingBillService {
return flag;
}
+ /**
+ * 根据项目快照创建发货草稿
+ *
+ * @param draft 发货草稿快照
+ * @return 发货单ID
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Long createDraftByProject(RemoteWmsShippingDraft draft) {
+ if (draft == null || draft.getProjectId() == null) {
+ throw new ServiceException("项目发货草稿参数不完整");
+ }
+ WmsShippingBill existing = baseMapper.selectOne(Wrappers.lambdaQuery()
+ .select(WmsShippingBill::getShippingBillId)
+ .eq(WmsShippingBill::getProjectId, draft.getProjectId())
+ .eq(WmsShippingBill::getOutStockBillStatus, OAStatusEnum.DRAFT.getStatus())
+ .eq(WmsShippingBill::getFlowStatus, BusinessStatusEnum.DRAFT.getStatus())
+ .eq(WmsShippingBill::getDelFlag, "0")
+ .last("limit 1"), false);
+ if (existing != null) {
+ return existing.getShippingBillId();
+ }
+
+ WmsShippingBillBo bo = new WmsShippingBillBo();
+ bo.setBindType(StringUtils.defaultIfBlank(draft.getBindType(), "1"));
+ bo.setShippingMode(StringUtils.defaultIfBlank(draft.getShippingMode(), "1"));
+ bo.setShippingType(draft.getShippingType());
+ bo.setProjectId(draft.getProjectId());
+ bo.setProjectCode(draft.getProjectCode());
+ bo.setProjectName(draft.getProjectName());
+ bo.setSourceBillType("PROJECT");
+ bo.setSourceBillId(draft.getProjectId());
+ bo.setSourceBillCode(draft.getProjectCode());
+ bo.setContractId(draft.getContractId());
+ bo.setContractCode(draft.getContractCode());
+ bo.setContractName(draft.getContractName());
+ bo.setCustomerId(draft.getCustomerId());
+ bo.setCustomerName(draft.getCustomerName());
+ bo.setShippingAddress(draft.getShippingAddress());
+ bo.setReceiverName(draft.getReceiverName());
+ bo.setReceiverPhone(draft.getReceiverPhone());
+ bo.setDirections(draft.getDirections());
+ bo.setRemark(StringUtils.defaultIfBlank(draft.getRemark(), "系统根据项目自动生成发货草稿"));
+ // 发货代办页面就是“草稿提醒页”,这里显式落草稿状态,后续只允许用户在编辑页补全后再手工发起流程
+ bo.setOutStockBillStatus(OAStatusEnum.DRAFT.getStatus());
+ bo.setFlowStatus(BusinessStatusEnum.DRAFT.getStatus());
+ bo.setShippingStatus(OAStatusEnum.DRAFT.getStatus());
+ bo.setDetailsList(buildDraftDetails(draft.getDetails()));
+ this.insertByBo(bo);
+ return bo.getShippingBillId();
+ }
+
/**
* 保存前的数据校验
*/
@@ -262,6 +316,37 @@ public class WmsShippingBillServiceImpl implements IWmsShippingBillService {
}
}
+ /**
+ * 合同物料快照转发货明细
+ *
+ * @param details 草稿快照
+ * @return 发货明细
+ */
+ private List buildDraftDetails(List details) {
+ if (CollUtil.isEmpty(details)) {
+ return Collections.emptyList();
+ }
+ return details.stream().map(item -> {
+ WmsShippingDetails detail = new WmsShippingDetails();
+ // 草稿创建时直接落快照,避免后续合同物料被修改后影响已生成的发货代办内容
+ detail.setMaterialSourceType("1");
+ detail.setSourceDetailType("CONTRACT_DETAIL");
+ detail.setSourceDetailId(item.getSourceDetailId());
+ detail.setErpMaterialId(item.getErpMaterialId());
+ detail.setMaterielId(item.getMaterielId());
+ detail.setMaterialCode(item.getMaterialCode());
+ detail.setMaterialName(item.getMaterialName());
+ detail.setMaterielSpecification(item.getMaterielSpecification());
+ detail.setShippingStockAmount(item.getShippingStockAmount());
+ detail.setUnitId(item.getUnitId());
+ detail.setUnitName(item.getUnitName());
+ detail.setUnitPrice(item.getUnitPrice());
+ detail.setTotalPrice(item.getTotalPrice());
+ detail.setRemark(item.getRemark());
+ return detail;
+ }).collect(Collectors.toList());
+ }
+
/**
* 校验并批量删除发货单信息(同时删除明细)
*