|
@@ -1,34 +1,55 @@
|
|
|
package com.fjhx.sale.service.contract.impl;
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
import com.alibaba.fastjson2.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.fjhx.area.utils.AreaUtil;
|
|
|
+import com.fjhx.common.entity.corporation.po.Corporation;
|
|
|
import com.fjhx.common.entity.documentary.bo.DocumentaryData;
|
|
|
+import com.fjhx.common.service.contract.ContractTemplateService;
|
|
|
+import com.fjhx.common.service.corporation.CorporationService;
|
|
|
import com.fjhx.common.service.documentary.GetDocumentaryBusinessTemplate;
|
|
|
import com.fjhx.customer.entity.customer.po.Customer;
|
|
|
import com.fjhx.customer.service.customer.CustomerService;
|
|
|
+import com.fjhx.item.service.product.ProductInfoService;
|
|
|
import com.fjhx.sale.entity.contract.bo.ContractDocumentaryBo;
|
|
|
import com.fjhx.sale.entity.contract.dto.ContractDto;
|
|
|
import com.fjhx.sale.entity.contract.dto.ContractSelectDto;
|
|
|
import com.fjhx.sale.entity.contract.po.Contract;
|
|
|
+import com.fjhx.sale.entity.contract.po.ContractProduct;
|
|
|
import com.fjhx.sale.entity.contract.vo.ContractDocumentaryVo;
|
|
|
+import com.fjhx.sale.entity.contract.vo.ContractPdfInfoVo;
|
|
|
import com.fjhx.sale.entity.contract.vo.ContractVo;
|
|
|
import com.fjhx.sale.mapper.contract.ContractMapper;
|
|
|
+import com.fjhx.sale.service.contract.ContractProductService;
|
|
|
import com.fjhx.sale.service.contract.ContractService;
|
|
|
import com.ruoyi.common.core.domain.BaseSelectDto;
|
|
|
+import com.ruoyi.common.exception.ServiceException;
|
|
|
import com.ruoyi.common.utils.PageUtils;
|
|
|
import com.ruoyi.common.utils.StringUtils;
|
|
|
import com.ruoyi.common.utils.wrapper.IWrapper;
|
|
|
import com.ruoyi.common.utils.wrapper.SqlField;
|
|
|
+import com.ruoyi.framework.config.ThreadPoolConfig;
|
|
|
import org.apache.commons.collections4.MapUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
+import org.springframework.security.core.context.SecurityContext;
|
|
|
+import org.springframework.security.core.context.SecurityContextHolder;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.Arrays;
|
|
|
import java.util.List;
|
|
|
+import java.util.Locale;
|
|
|
import java.util.Map;
|
|
|
+import java.util.concurrent.CompletableFuture;
|
|
|
+import java.util.concurrent.ThreadPoolExecutor;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
@@ -44,9 +65,27 @@ import java.util.stream.Collectors;
|
|
|
public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
|
|
|
implements ContractService, GetDocumentaryBusinessTemplate {
|
|
|
|
|
|
+ private static final SimpleDateFormat sdf = new SimpleDateFormat("dd/MMM/yyyy", Locale.ENGLISH);
|
|
|
+
|
|
|
+ @Qualifier(ThreadPoolConfig.threadPoolTaskExecutor)
|
|
|
+ @Autowired
|
|
|
+ private ThreadPoolExecutor threadPoolExecutor;
|
|
|
+
|
|
|
@Autowired
|
|
|
private CustomerService customerService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private ContractTemplateService contractTemplateService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CorporationService corporationService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ContractProductService contractProductService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ProductInfoService productInfoService;
|
|
|
+
|
|
|
/**
|
|
|
* 分页
|
|
|
*
|
|
@@ -135,6 +174,91 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
+ public ContractPdfInfoVo getContractPdfInfo(Long id) {
|
|
|
+
|
|
|
+ if (ObjectUtil.isEmpty(id)) {
|
|
|
+ throw new ServiceException("销售合同id不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ Contract contract = getById(id);
|
|
|
+ if (ObjectUtil.isEmpty(contract)) {
|
|
|
+ throw new ServiceException("没有找到销售合同");
|
|
|
+ }
|
|
|
+
|
|
|
+ ContractPdfInfoVo contractPdfInfoVo = new ContractPdfInfoVo();
|
|
|
+
|
|
|
+ Integer contractType = contract.getContractType();
|
|
|
+ if (contractType == null) {
|
|
|
+ throw new ServiceException("销售合同类型为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (contractType) {
|
|
|
+ // 外销合同
|
|
|
+ case 1:
|
|
|
+ setExportContractInfo(contractPdfInfoVo, contract);
|
|
|
+ break;
|
|
|
+ // 内销合同
|
|
|
+ case 2:
|
|
|
+ // todo 内销合同实现逻辑
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new ServiceException("未知销售合同类型");
|
|
|
+ }
|
|
|
+
|
|
|
+ return contractPdfInfoVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 赋值外销合同信息
|
|
|
+ *
|
|
|
+ * @param contractPdfInfoVo param
|
|
|
+ * @param contract 合同信息
|
|
|
+ */
|
|
|
+ private void setExportContractInfo(ContractPdfInfoVo contractPdfInfoVo, Contract contract) {
|
|
|
+
|
|
|
+ SecurityContext context = SecurityContextHolder.getContext();
|
|
|
+
|
|
|
+ // 赋值卖方公司基本信息
|
|
|
+ CompletableFuture<Void> setSellCorporationInfoFuture = CompletableFuture.runAsync(
|
|
|
+ () -> {
|
|
|
+ SecurityContextHolder.setContext(context);
|
|
|
+ setSellCorporationInfo(contractPdfInfoVo, contract);
|
|
|
+ }, threadPoolExecutor);
|
|
|
+
|
|
|
+ // 赋值买方公司基本信息
|
|
|
+ CompletableFuture<Void> setBuyCorporationFuture = CompletableFuture.runAsync(
|
|
|
+ () -> {
|
|
|
+ SecurityContextHolder.setContext(context);
|
|
|
+ setBuyCorporation(contractPdfInfoVo, contract);
|
|
|
+ }, threadPoolExecutor);
|
|
|
+
|
|
|
+ // 赋值买卖方公司地址
|
|
|
+ CompletableFuture<Void> setAreaFuture = CompletableFuture.runAsync(
|
|
|
+ () -> {
|
|
|
+ SecurityContextHolder.setContext(context);
|
|
|
+ setArea(contractPdfInfoVo, contract);
|
|
|
+ }, threadPoolExecutor);
|
|
|
+
|
|
|
+ // 赋值商品列表信息
|
|
|
+ CompletableFuture<Void> setProductListFuture = CompletableFuture.runAsync(
|
|
|
+ () -> {
|
|
|
+ SecurityContextHolder.setContext(context);
|
|
|
+ setProductList(contractPdfInfoVo, contract);
|
|
|
+ }, threadPoolExecutor);
|
|
|
+
|
|
|
+ // 赋值合同基本信息
|
|
|
+ setInfo(contractPdfInfoVo, contract);
|
|
|
+
|
|
|
+ CompletableFuture.allOf(
|
|
|
+ setSellCorporationInfoFuture,
|
|
|
+ setBuyCorporationFuture,
|
|
|
+ setAreaFuture,
|
|
|
+ setProductListFuture
|
|
|
+ ).join();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
public Page<? extends DocumentaryData> getDocumentaryPage(JSONObject selectData, BaseSelectDto dto, List<Long> excludeBusinessId) {
|
|
|
|
|
|
ContractDocumentaryBo bo = selectData.toJavaObject(ContractDocumentaryBo.class);
|
|
@@ -161,4 +285,111 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
|
|
|
|
|
|
return page;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 赋值卖方公司基本信息
|
|
|
+ */
|
|
|
+ private void setSellCorporationInfo(ContractPdfInfoVo contractPdfInfoVo, Contract contract) {
|
|
|
+ // 卖方公司信息
|
|
|
+ Corporation corporation = corporationService.getById(contract.getSellCorporationId());
|
|
|
+ if (corporation == null) {
|
|
|
+ throw new ServiceException("卖方公司信息为空");
|
|
|
+ }
|
|
|
+ contractPdfInfoVo.setSellCorporationNameEn(corporation.getNameEn());
|
|
|
+ contractPdfInfoVo.setSellContactName(contract.getSellContactName());
|
|
|
+ contractPdfInfoVo.setSellContactNumber(contract.getSellContactNumber());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 赋值买方公司基本信息
|
|
|
+ */
|
|
|
+ private void setBuyCorporation(ContractPdfInfoVo contractPdfInfoVo, Contract contract) {
|
|
|
+ Customer customer = customerService.getById(contract.getBuyCorporationId());
|
|
|
+ if (customer == null) {
|
|
|
+ throw new ServiceException("买方公司信息为空");
|
|
|
+ }
|
|
|
+ contractPdfInfoVo.setBuyCorporationName(customer.getName());
|
|
|
+ contractPdfInfoVo.setBuyContactName(contract.getBuyContactName());
|
|
|
+ contractPdfInfoVo.setBuyContactNumber(contract.getBuyContactNumber());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 赋值买卖公司地址
|
|
|
+ */
|
|
|
+ private void setArea(ContractPdfInfoVo contractPdfInfoVo, Contract contract) {
|
|
|
+
|
|
|
+ List<String> areaIdList = Arrays.asList(
|
|
|
+ contract.getSellCountryId(),
|
|
|
+ contract.getSellProvinceId(),
|
|
|
+ contract.getSellCityId(),
|
|
|
+ contract.getBuyCountryId(),
|
|
|
+ contract.getBuyProvinceId(),
|
|
|
+ contract.getBuyCityId()
|
|
|
+ );
|
|
|
+
|
|
|
+ Map<String, String> areaMap = AreaUtil.getAreaMapByIds(areaIdList);
|
|
|
+ contractPdfInfoVo.setSellCountryName(areaMap.get(contract.getSellCountryId()));
|
|
|
+ contractPdfInfoVo.setSellProvinceName(areaMap.get(contract.getSellProvinceId()));
|
|
|
+ contractPdfInfoVo.setSellCityName(areaMap.get(contract.getSellCityId()));
|
|
|
+ contractPdfInfoVo.setSellDetailedAddress(contract.getSellAddress());
|
|
|
+ contractPdfInfoVo.setBuyCountryName(areaMap.get(contract.getBuyCountryId()));
|
|
|
+ contractPdfInfoVo.setBuyProvinceName(areaMap.get(contract.getBuyProvinceId()));
|
|
|
+ contractPdfInfoVo.setBuyCityName(areaMap.get(contract.getBuyCityId()));
|
|
|
+ contractPdfInfoVo.setBuyDetailedAddress(contract.getBuyAddress());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 赋值合同基本信息
|
|
|
+ */
|
|
|
+ private void setInfo(ContractPdfInfoVo contractPdfInfoVo, Contract contract) {
|
|
|
+ contractPdfInfoVo.setContractCode(contract.getCode());
|
|
|
+ contractPdfInfoVo.setCreateTimeEn(sdf.format(contract.getCreateTime()));
|
|
|
+ contractPdfInfoVo.setTransportRemark(contract.getTransportRemark());
|
|
|
+ contractPdfInfoVo.setTradeMethods(contract.getTradeMethods());
|
|
|
+ contractPdfInfoVo.setRemark(contract.getRemark());
|
|
|
+ contractPdfInfoVo.setCurrency(contract.getCurrency());
|
|
|
+
|
|
|
+ // todo 收款账号详情
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 赋值商品列表信息
|
|
|
+ */
|
|
|
+ private void setProductList(ContractPdfInfoVo contractPdfInfoVo, Contract contract) {
|
|
|
+
|
|
|
+ contractPdfInfoVo.setTotalAmount(BigDecimal.ZERO);
|
|
|
+
|
|
|
+ List<ContractProduct> list = contractProductService.list(q -> q.eq(ContractProduct::getContractId, contract.getId()));
|
|
|
+
|
|
|
+ if (list.size() == 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<ContractPdfInfoVo.ProductInfo> productInfoList = list.stream().map(item -> {
|
|
|
+ contractPdfInfoVo.setTotalAmount(contractPdfInfoVo.getTotalAmount().add(item.getAmount()));
|
|
|
+
|
|
|
+ ContractPdfInfoVo.ProductInfo productIndo = new ContractPdfInfoVo.ProductInfo();
|
|
|
+ productIndo.setProductId(item.getProductId());
|
|
|
+ productIndo.setProductQuantity(item.getQuantity());
|
|
|
+ productIndo.setProductPrice(item.getPrice());
|
|
|
+ productIndo.setAmount(item.getAmount());
|
|
|
+ return productIndo;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+
|
|
|
+ contractPdfInfoVo.setProductInfoList(productInfoList);
|
|
|
+
|
|
|
+ // 产品属性
|
|
|
+ productInfoService.attributeAssign(productInfoList, ContractPdfInfoVo.ProductInfo::getProductId, (item, product) -> {
|
|
|
+ String standardJson = product.getStandardJson();
|
|
|
+ if (StrUtil.isBlank(standardJson)) {
|
|
|
+ throw new ServiceException("标准产品库信息为空");
|
|
|
+ }
|
|
|
+ JSONObject standard = JSONObject.parseObject(standardJson);
|
|
|
+
|
|
|
+ item.setProductName(standard.getString("englishName"));
|
|
|
+ item.setProductUnit(product.getUnit());
|
|
|
+ });
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|