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