feat(wms): 新增发货草稿功能支持项目自动创建

- 新增 ruoyi-api-wms 模块及 RemoteWmsShippingBillService 远程服务接口
- 实现 createDraftByProject 方法根据项目快照自动创建发货草稿
- 添加 RemoteWmsShippingDraft 和 RemoteWmsShippingDraftItem 数据传输对象
- 在项目完成后自动预生成发货草稿,用户只需补充业务细节无需手工新建
- 集成合同物料信息到发货草稿明细,支持合同物料快照转换
- 优化注释文案,统一使用中文注释格式
- 修复 WMS 模块依赖配置,确保 API 模块正确引用
dev
zangch@mesnac.com 6 days ago
parent e1451f8ba1
commit 11b89ab75d

@ -13,6 +13,7 @@
<module>ruoyi-api-system</module>
<module>ruoyi-api-resource</module>
<module>ruoyi-api-workflow</module>
<module>ruoyi-api-wms</module>
</modules>
<artifactId>ruoyi-api</artifactId>

@ -41,6 +41,13 @@
<version>${revision}</version>
</dependency>
<!-- wms接口 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-api-wms</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-api</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-api-wms</artifactId>
<description>
ruoyi-api-wms WMS接口模块
</description>
<dependencies>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
</dependencies>
</project>

@ -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);
}

@ -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<RemoteWmsShippingDraftItem> 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<String, Object> params = new HashMap<>();
}

@ -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;
/**
* ERPID
*/
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;
}

@ -105,6 +105,11 @@
<artifactId>ruoyi-api-workflow</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-api-wms</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-bus</artifactId>

@ -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<String, Object> flowData = remoteWorkflowService.flowHisTaskList(String.valueOf(contractId));
List<Map<String, Object>> handledTasks = extractHandledTasks(flowData == null ? null : flowData.get("list"));
// Why固定审批区块要按流程节点名精确落位,避免后续流程扩展后把别的节点意见写错位置
// 固定审批区块要按流程节点名精确落位,避免后续流程扩展后把别的节点意见写错位置
fillApprovalNodeData(data, handledTasks, BUSINESS_DIRECTION_LEADER_NODE_NAME, "业务方向负责人");
fillApprovalNodeData(data, handledTasks, FINANCE_MANAGER_NODE_NAME, "财务经理");
List<RowRenderData> approvalRows = new ArrayList<>();
@ -536,7 +536,7 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService {
}
for (int i = handledTasks.size() - 1; i >= 0; i--) {
Map<String, Object> task = handledTasks.get(i);
// Why不同工作流版本可能返回 nodeName / targetNodeName双字段兼容可以减少后续接口改动带来的模板失效
// 不同工作流版本可能返回 nodeName / targetNodeName双字段兼容可以减少后续接口改动带来的模板失效
String taskNodeName = strVal(task.get("nodeName"));
String targetNodeName = strVal(task.get("targetNodeName"));
if (nodeName.equals(taskNodeName) || nodeName.equals(targetNodeName)) {
@ -559,7 +559,7 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService {
return "";
}
try {
// WhyDubbo 导出链路返回的是纯 Map 后,工作流里的 @Translation 不再生效,这里补一层用户昵称查询保证导出给业务人员的是可读姓名
// Dubbo 导出链路返回的是纯 Map 后,工作流里的 @Translation 不再生效,这里补一层用户昵称查询保证导出给业务人员的是可读姓名
String nickname = remoteUserService.selectNicknameByIds(approver);
return StringUtils.isNotBlank(nickname) ? nickname : approver;
} catch (Exception e) {

@ -1,47 +1,51 @@
package org.dromara.oa.erp.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.map.MapUtil;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.enums.OAStatusEnum;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.seata.spring.annotation.GlobalTransactional;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.enums.OAStatusEnum;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
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.oa.erp.constant.ProjectCategoryConstant;
import org.dromara.oa.erp.domain.ErpProjectContracts;
import org.dromara.oa.erp.domain.ErpProjectInfo;
import org.dromara.oa.erp.domain.bo.ErpProjectContractsBo;
import org.dromara.oa.erp.domain.bo.ErpProjectInfoBo;
import org.dromara.oa.erp.domain.vo.ErpContractInfoVo;
import org.dromara.oa.erp.domain.vo.ErpContractMaterialVo;
import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo;
import org.dromara.oa.erp.enums.ProjectCategoryEnum;
import org.dromara.oa.erp.mapper.ErpProjectContractsMapper;
import org.dromara.oa.erp.mapper.ErpProjectInfoMapper;
import org.dromara.oa.erp.service.IErpContractInfoService;
import org.dromara.oa.erp.service.IErpProjectInfoService;
import org.dromara.wms.api.RemoteWmsShippingBillService;
import org.dromara.wms.api.domain.RemoteWmsShippingDraft;
import org.dromara.wms.api.domain.RemoteWmsShippingDraftItem;
import org.dromara.workflow.api.RemoteWorkflowService;
import org.dromara.workflow.api.domain.RemoteStartProcess;
import org.dromara.workflow.api.event.ProcessEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
import org.dromara.oa.erp.domain.bo.ErpProjectInfoBo;
import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo;
import org.dromara.oa.erp.domain.ErpProjectInfo;
import org.dromara.oa.erp.mapper.ErpProjectInfoMapper;
import org.dromara.oa.erp.service.IErpProjectInfoService;
import org.dromara.oa.erp.domain.bo.ErpProjectContractsBo;
import org.dromara.oa.erp.domain.ErpProjectContracts;
import org.dromara.oa.erp.mapper.ErpProjectContractsMapper;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.seata.spring.annotation.GlobalTransactional;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.workflow.api.RemoteWorkflowService;
import org.dromara.workflow.api.domain.RemoteStartProcess;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
/**
* Service
*
@ -57,9 +61,14 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService {
private final ErpProjectContractsMapper projectContractsMapper;
private final IErpContractInfoService erpContractInfoService;
@DubboReference(timeout = 30000)
private RemoteWorkflowService remoteWorkflowService;
@DubboReference(timeout = 30000)
private RemoteWmsShippingBillService remoteWmsShippingBillService;
/**
*
*
@ -292,6 +301,8 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService {
projectInfo.setProjectStatus(OAStatusEnum.APPROVING.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) {
projectInfo.setProjectStatus(OAStatusEnum.COMPLETED.getStatus());
// 项目一旦转“可用”就预生成发货草稿,用户后续只补业务细节,不需要再手工新建整单
remoteWmsShippingBillService.createDraftByProject(buildShippingDraft(projectInfo));
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) {
projectInfo.setProjectStatus(OAStatusEnum.INVALID.getStatus());
@ -355,4 +366,131 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService {
}
/**
* 稿
*
* @param projectInfo
* @return 稿
*/
private RemoteWmsShippingDraft buildShippingDraft(ErpProjectInfo projectInfo) {
RemoteWmsShippingDraft draft = new RemoteWmsShippingDraft();
draft.setProjectId(projectInfo.getProjectId());
draft.setProjectCode(projectInfo.getProjectCode());
draft.setProjectName(projectInfo.getProjectName());
draft.setBindType("1");
draft.setShippingMode("1");
draft.setShippingType(resolveShippingType(projectInfo));
draft.setManagerId(projectInfo.getManagerId());
draft.setContractUserId(projectInfo.getContractUserId());
draft.setRemark("系统根据项目完成自动创建,请补充后发起审批");
Long contractId = resolveShippingContractId(projectInfo);
if (contractId == null) {
return draft;
}
ErpContractInfoVo contractInfo = erpContractInfoService.queryById(contractId);
if (contractInfo == null) {
return draft;
}
draft.setContractId(contractInfo.getContractId());
draft.setContractCode(contractInfo.getContractCode());
draft.setContractName(contractInfo.getContractName());
draft.setOrderContractCode(contractInfo.getOrderContractCode());
draft.setCustomerId(contractInfo.getOneCustomerId());
draft.setCustomerName(contractInfo.getOneCustomerName());
draft.setShippingAddress(contractInfo.getDetailedAddress());
// 自动草稿只做“带得出来就先带”,联系人优先取商务联系人,没有时再退化到技术联系人,避免无意义空白单
draft.setReceiverName(firstNonBlank(contractInfo.getOneBusinessContact(), contractInfo.getOneTechnicalContact(), contractInfo.getOneRepresent()));
draft.setReceiverPhone(firstNonBlank(contractInfo.getOneBusinessContactPhone(), contractInfo.getOneTechnicalContactPhone()));
draft.setDirections(StringUtils.defaultIfBlank(contractInfo.getMaterialRemark(), contractInfo.getRemark()));
draft.setDetails(buildShippingDraftDetails(contractInfo.getContractMaterialList()));
//显示填充租户、创建人、创建时间
draft.setTenantId(TenantHelper.getTenantId());
draft.setCreateBy(LoginHelper.getUserId());
draft.setCreateTime(new Date());
return draft;
}
/**
*
*
* @param projectInfo
* @return
*/
private String resolveShippingType(ErpProjectInfo projectInfo) {
if ("1".equals(projectInfo.getSpareFlag())) {
return "2";
}
return null;
}
/**
*
*
* @param projectInfo
* @return ID
*/
private Long resolveShippingContractId(ErpProjectInfo projectInfo) {
if (projectInfo.getContractId() != null) {
return projectInfo.getContractId();
}
List<ErpProjectContracts> projectContracts = projectContractsMapper.selectList(Wrappers.<ErpProjectContracts>lambdaQuery()
.eq(ErpProjectContracts::getProjectId, projectInfo.getProjectId())
.eq(ErpProjectContracts::getDelFlag, "0")
.orderByAsc(ErpProjectContracts::getSortOrder)
.orderByAsc(ErpProjectContracts::getProjectContractsId));
if (CollUtil.isEmpty(projectContracts)) {
return null;
}
return projectContracts.get(0).getContractId();
}
/**
*
*
* @param materials
* @return
*/
private List<RemoteWmsShippingDraftItem> buildShippingDraftDetails(List<ErpContractMaterialVo> materials) {
if (CollUtil.isEmpty(materials)) {
return new ArrayList<>();
}
List<RemoteWmsShippingDraftItem> details = new ArrayList<>(materials.size());
for (ErpContractMaterialVo material : materials) {
RemoteWmsShippingDraftItem item = new RemoteWmsShippingDraftItem();
// 这里复制的是“合同当前版本”的展示快照,发货草稿生成后即与合同解耦,后续合同调整不回写历史草稿
item.setSourceDetailId(material.getContractMaterialId());
item.setErpMaterialId(material.getMaterialId());
item.setMaterielId(material.getMaterialId());
item.setMaterialCode(material.getMaterialCode());
item.setMaterialName(firstNonBlank(material.getSaleMaterialName(), material.getMaterialName(), material.getProductName()));
item.setMaterielSpecification(material.getSpecificationDescription());
item.setShippingStockAmount(material.getAmount());
item.setUnitId(material.getUnitId());
item.setUnitName(material.getUnitName());
item.setUnitPrice(material.getIncludingPrice());
item.setTotalPrice(material.getSubtotal());
item.setRemark(material.getRemark());
details.add(item);
}
return details;
}
private String firstNonBlank(String... values) {
if (values == null) {
return null;
}
for (String value : values) {
if (StringUtils.isNotBlank(value)) {
return value;
}
}
return null;
}
}

@ -104,6 +104,11 @@
<groupId>org.dromara</groupId>
<artifactId>ruoyi-api-workflow</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-api-wms</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-bus</artifactId>

@ -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);
}
}

@ -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 WordMap
*/
java.util.Map<String, Object> buildWordExportData(Long shippingBillId);
Map<String, Object> buildWordExportData(Long shippingBillId);
/**
* 稿
*
* @param draft 稿
* @return ID
*/
Long createDraftByProject(RemoteWmsShippingDraft draft);
}

@ -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.<WmsShippingBill>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<WmsShippingDetails> buildDraftDetails(List<RemoteWmsShippingDraftItem> 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());
}
/**
*
*

Loading…
Cancel
Save