浏览代码

销售合同

24282 2 年之前
父节点
当前提交
f88fb50473

+ 4 - 3
hx-mail/src/main/java/com/fjhx/mail/listener/LoginEventListeners.java

@@ -7,20 +7,21 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.event.EventListener;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Component;
 
+import java.util.concurrent.ThreadPoolExecutor;
+
 @Slf4j
 @Component
 public class LoginEventListeners {
 
     @Autowired
     @Qualifier(ThreadPoolConfig.threadPoolTaskExecutor)
-    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    private ThreadPoolExecutor threadPoolExecutor;
 
     @EventListener
     public void loginEvent(LoginEvent loginEvent) {
-        threadPoolTaskExecutor.execute(() -> {
+        threadPoolExecutor.execute(() -> {
             Long userId = (Long) loginEvent.getSource();
 
             int num = 0;

+ 15 - 6
hx-sale/src/main/java/com/fjhx/sale/controller/contract/ContractController.java

@@ -1,14 +1,15 @@
 package com.fjhx.sale.controller.contract;
 
-import com.fjhx.sale.entity.contract.po.Contract;
-import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.sale.entity.contract.vo.ContractVo;
-import com.fjhx.sale.entity.contract.dto.ContractSelectDto;
 import com.fjhx.sale.entity.contract.dto.ContractDto;
-import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.fjhx.sale.entity.contract.dto.ContractSelectDto;
+import com.fjhx.sale.entity.contract.po.Contract;
+import com.fjhx.sale.entity.contract.vo.ContractPdfInfoVo;
+import com.fjhx.sale.entity.contract.vo.ContractVo;
 import com.fjhx.sale.service.contract.ContractService;
+import com.ruoyi.common.core.domain.BaseSelectDto;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -81,7 +82,7 @@ public class ContractController {
      */
     @GetMapping("/getNoPackContractProductById")
     public List<ContractVo> getNoPackContractProductById(@RequestParam("customerId")String customerId,@RequestParam("contractId")String contractId) {
-        return contractService.getNoPackContractProductById(customerId,contractId);
+        return contractService.getNoPackContractProductById(customerId, contractId);
     }
 
     /**
@@ -92,5 +93,13 @@ public class ContractController {
         return contractService.getByIds(ids);
     }
 
+    /**
+     * 销售合同pdf
+     */
+    @PostMapping("/getContractPdfInfo")
+    public ContractPdfInfoVo getContractPdfInfo(@RequestBody BaseSelectDto dto) {
+        return contractService.getContractPdfInfo(dto.getId());
+    }
+
 
 }

+ 13 - 5
hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/Contract.java

@@ -5,13 +5,13 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.Version;
 import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
-import lombok.Getter;
-import lombok.Setter;
-
 /**
  * <p>
  * 外销合同表
@@ -25,9 +25,8 @@ import lombok.Setter;
 @TableName("contract")
 public class Contract extends BasePo {
 
-
     /**
-     * 合同类型
+     * 合同类型(1外销 2内销)
      */
     private Integer contractType;
 
@@ -43,6 +42,9 @@ public class Contract extends BasePo {
 
     /**
      * 卖方公司ID
+     *
+     * <p>
+     * {@link com.fjhx.common.entity.contract.po.ContractTemplate}
      */
     private Long sellCorporationId;
 
@@ -93,6 +95,9 @@ public class Contract extends BasePo {
 
     /**
      * 买方公司ID
+     *
+     * <p>
+     * {@link com.fjhx.customer.entity.customer.po.Customer}
      */
     private Long buyCorporationId;
 
@@ -168,6 +173,9 @@ public class Contract extends BasePo {
 
     /**
      * 收款账号ID
+     *
+     * <p>
+     * {@link com.fjhx.account.entity.account.po.AccountManagement}
      */
     private Long shroffAccountId;
 

+ 160 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/vo/ContractPdfInfoVo.java

@@ -0,0 +1,160 @@
+package com.fjhx.sale.entity.contract.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Getter
+@Setter
+public class ContractPdfInfoVo {
+
+    /**
+     * 合同编号
+     */
+    private String contractCode;
+
+    /**
+     * 创建时间英文
+     */
+    private String createTimeEn;
+
+    /**
+     * 运输说明
+     */
+    private String transportRemark;
+
+    /**
+     * 付款条件
+     */
+    private String remark;
+
+    /**
+     * 贸易方式(字典trade_methods)
+     */
+    private String tradeMethods;
+
+    /**
+     * 币种(字典account_currency)
+     */
+    private String currency;
+
+    /**
+     * 卖方公司英文名称
+     */
+    private String sellCorporationNameEn;
+
+    /**
+     * 卖方联系人名称
+     */
+    private String sellContactName;
+
+    /**
+     * 卖方联系人电话
+     */
+    private String sellContactNumber;
+
+    /**
+     * 卖方公司国家
+     */
+    private String sellCountryName;
+
+    /**
+     * 卖方公司省
+     */
+    private String sellProvinceName;
+
+    /**
+     * 卖方公司市
+     */
+    private String sellCityName;
+
+    /**
+     * 卖方公司详细地址
+     */
+    private String sellDetailedAddress;
+
+
+    /**
+     * 买方公司名称
+     */
+    private String buyCorporationName;
+
+    /**
+     * 买方联系人名称
+     */
+    private String buyContactName;
+
+    /**
+     * 买方联系人电话
+     */
+    private String buyContactNumber;
+
+    /**
+     * 买方公司国家
+     */
+    private String buyCountryName;
+
+    /**
+     * 买方公司省
+     */
+    private String buyProvinceName;
+
+    /**
+     * 买方公司市
+     */
+    private String buyCityName;
+
+    /**
+     * 卖方公司详细地址
+     */
+    private String buyDetailedAddress;
+
+    /**
+     * 产品信息
+     */
+    private List<ProductInfo> productInfoList;
+
+    /**
+     * 总金额
+     */
+    private BigDecimal totalAmount;
+
+    @Getter
+    @Setter
+    public static class ProductInfo {
+
+        /**
+         * 产品id
+         */
+        private Long productId;
+
+        /**
+         * 产品名称
+         */
+        private String productName;
+
+        /**
+         * 产品单位
+         */
+        private String productUnit;
+
+        /**
+         * 产品数量
+         */
+        private BigDecimal productQuantity;
+
+        /**
+         * 产品单价
+         */
+        private BigDecimal productPrice;
+
+        /**
+         * 金额
+         */
+        private BigDecimal amount;
+
+    }
+
+}

+ 12 - 5
hx-sale/src/main/java/com/fjhx/sale/service/contract/ContractService.java

@@ -1,11 +1,12 @@
 package com.fjhx.sale.service.contract;
 
-import com.fjhx.sale.entity.contract.po.Contract;
-import com.ruoyi.common.core.service.BaseService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.sale.entity.contract.vo.ContractVo;
-import com.fjhx.sale.entity.contract.dto.ContractSelectDto;
 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.vo.ContractPdfInfoVo;
+import com.fjhx.sale.entity.contract.vo.ContractVo;
+import com.ruoyi.common.core.service.BaseService;
 
 import java.util.List;
 
@@ -57,11 +58,17 @@ public interface ContractService extends BaseService<Contract> {
      * @param customerId
      * @return
      */
-    List<ContractVo> getNoPackContractProductById(String customerId,String contractId);
+    List<ContractVo> getNoPackContractProductById(String customerId, String contractId);
 
 
     /**
      * 根据合同ID集合查询合同
      */
     List<Contract> getByIds(List<Long> ids);
+
+    /**
+     * 获取合同明细
+     */
+    ContractPdfInfoVo getContractPdfInfo(Long id);
+
 }

+ 231 - 0
hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractServiceImpl.java

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