Bladeren bron

样品单打印

yzc 1 jaar geleden
bovenliggende
commit
b0886220a1

+ 14 - 0
hx-sale/src/main/java/com/fjhx/sale/controller/sample/SampleController.java

@@ -1,7 +1,14 @@
 package com.fjhx.sale.controller.sample;
 
 import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.sale.entity.contract.dto.ContractDto;
+import com.fjhx.sale.entity.contract.po.Contract;
+import com.fjhx.sale.entity.contract.vo.ContractPdfInfoVo;
+import com.fjhx.sale.entity.sample.vo.SamplePdfInfoVo;
+import com.ruoyi.common.utils.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.sale.entity.sample.vo.SampleVo;
@@ -78,5 +85,12 @@ public class SampleController {
     }
 
 
+    /**
+     * 样品单pdf
+     */
+    @PostMapping("/getSamplePdfInfo")
+    public SamplePdfInfoVo getSamplePdfInfo(@RequestBody ContractDto dto) {
+        return sampleService.getSamplePdfInfo(dto.getId());
+    }
 
 }

+ 252 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/sample/vo/SamplePdfInfoVo.java

@@ -0,0 +1,252 @@
+package com.fjhx.sale.entity.sample.vo;
+
+import com.fjhx.sale.entity.contract.po.ContractProject;
+import com.fjhx.sale.entity.sample.po.SampleProject;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Getter
+@Setter
+public class SamplePdfInfoVo {
+
+    /**
+     * 合同编号
+     */
+    private String contractCode;
+
+    /**
+     * 创建时间英文
+     */
+    private String createTimeEn;
+
+    /**
+     * 运输说明
+     */
+    private String transportRemark;
+
+    /**
+     * 付款条件
+     */
+    private String remark;
+
+    /**
+     * 贸易方式(字典trade_methods)
+     */
+    private String tradeMethods;
+
+    /**
+     * 币种(字典account_currency)
+     */
+    private String currency;
+
+    /**
+     * 卖方公司Id
+     */
+    private Long sellCorporationId;
+
+    /**
+     * 卖方公司英文名称
+     */
+    private String sellCorporationNameEn;
+
+    /**
+     * 卖方公司名称
+     */
+    private String sellCorporationName;
+
+    /**
+     * 卖方联系人名称
+     */
+    private String sellContactName;
+
+    /**
+     * 卖方联系人电话
+     */
+    private String sellContactNumber;
+
+    /**
+     * 卖方公司国家
+     */
+    private String sellCountryName;
+
+    /**
+     * 卖方公司省
+     */
+    private String sellProvinceName;
+
+    /**
+     * 卖方公司市
+     */
+    private String sellCityName;
+
+    /**
+     * 卖方公司详细地址
+     */
+    private String sellDetailedAddress;
+
+
+    /**
+     * 买方公司ID
+     */
+    private Long buyCorporationId;
+    /**
+     * 买方公司名称
+     */
+    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 List<SampleProject> sampleProjectList;
+
+    /**
+     * 总金额
+     */
+    private BigDecimal totalAmount;
+
+    /**
+     * 交期
+     */
+    private String deliveryTime;
+
+    /**
+     * 运输方式(字典  shipping_method)
+     */
+    private String transportMethod;
+
+    /**
+     * 收款账号ID
+     *
+     * <p>
+     * {@link com.fjhx.account.entity.account.po.AccountManagement}
+     */
+    private Long shroffAccountId;
+
+    /**
+     * 账户名称(外汇信息)
+     */
+    private String beneficiaryName;
+
+    /**
+     * 开户银行(外汇信息)
+     */
+    private String beneficiaryBank;
+
+    /**
+     * 开户银行地址(外汇信息)
+     */
+    private String beneficiaryBankAddress;
+
+    /**
+     * 账号(外汇信息)
+     */
+    private String beneficiaryAccountNumber;
+
+    /**
+     * 银行代码(外汇信息)
+     */
+    private String swiftCode;
+
+    /**
+     * 收款人地址(外汇信息)
+     */
+    private String beneficiaryAddress;
+
+    /**
+     * 预付比例
+     */
+    private String advanceRatio;
+
+    @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;
+
+
+        /**
+         * 产品备注
+         */
+        private String productRemark;
+
+        /**
+         * 产品规格
+         */
+        private String productSpec;
+
+        /**
+         * 装箱方式
+         */
+        private String packMethod;
+
+
+
+    }
+
+}

+ 3 - 2
hx-sale/src/main/java/com/fjhx/sale/service/sample/SampleService.java

@@ -2,14 +2,13 @@ package com.fjhx.sale.service.sample;
 
 import com.fjhx.sale.entity.contract.vo.ContractProductVo;
 import com.fjhx.sale.entity.sample.po.Sample;
+import com.fjhx.sale.entity.sample.vo.SamplePdfInfoVo;
 import com.ruoyi.common.core.service.BaseService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.sale.entity.sample.vo.SampleVo;
 import com.fjhx.sale.entity.sample.dto.SampleSelectDto;
 import com.fjhx.sale.entity.sample.dto.SampleDto;
 
-import java.util.List;
-
 
 /**
  * <p>
@@ -55,4 +54,6 @@ public interface SampleService extends BaseService<Sample> {
      * 样品交接单列表
      */
     Page<ContractProductVo> sampleHandoverList(SampleSelectDto dto);
+
+    SamplePdfInfoVo getSamplePdfInfo(Long id);
 }

+ 241 - 0
hx-sale/src/main/java/com/fjhx/sale/service/sample/impl/SampleServiceImpl.java

@@ -1,36 +1,62 @@
 package com.fjhx.sale.service.sample.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 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.account.entity.account.po.AccountManagement;
+import com.fjhx.account.service.account.AccountManagementService;
+import com.fjhx.area.utils.CustomizeAreaUtil;
 import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.common.entity.corporation.po.Corporation;
 import com.fjhx.common.enums.FlowStatusEnum;
+import com.fjhx.common.service.corporation.CorporationService;
+import com.fjhx.common.utils.Assert;
 import com.fjhx.customer.entity.customer.po.Customer;
 import com.fjhx.customer.service.customer.CustomerService;
 import com.fjhx.file.entity.FileInfoVo;
 import com.fjhx.file.utils.ObsFileUtil;
+import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.sale.entity.contract.po.Contract;
+import com.fjhx.sale.entity.contract.vo.ContractPdfInfoVo;
 import com.fjhx.sale.entity.contract.vo.ContractProductVo;
 import com.fjhx.sale.entity.sample.dto.SampleDto;
 import com.fjhx.sale.entity.sample.dto.SampleSelectDto;
 import com.fjhx.sale.entity.sample.po.Sample;
+import com.fjhx.sale.entity.sample.po.SampleProduct;
+import com.fjhx.sale.entity.sample.po.SampleProject;
+import com.fjhx.sale.entity.sample.vo.SamplePdfInfoVo;
 import com.fjhx.sale.entity.sample.vo.SampleVo;
 import com.fjhx.sale.mapper.sample.SampleMapper;
+import com.fjhx.sale.service.sample.SampleProductService;
+import com.fjhx.sale.service.sample.SampleProjectService;
 import com.fjhx.sale.service.sample.SampleService;
 import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.ruoyi.framework.config.ThreadPoolConfig;
 import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.utils.UserUtil;
 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.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;
 
 
@@ -45,6 +71,10 @@ import java.util.stream.Collectors;
 @Service
 public class SampleServiceImpl extends ServiceImpl<SampleMapper, Sample> implements SampleService {
 
+    @Qualifier(ThreadPoolConfig.threadPoolTaskExecutor)
+    @Autowired
+    private ThreadPoolExecutor threadPoolExecutor;
+
 
     @Autowired
     private CustomerService customerService;
@@ -54,6 +84,15 @@ public class SampleServiceImpl extends ServiceImpl<SampleMapper, Sample> impleme
     @Autowired
     private ISysUserService userService;
 
+    @Autowired
+    private CorporationService corporationService;
+    @Autowired
+    private SampleProductService sampleProductService;
+    @Autowired
+    private SampleProjectService sampleProjectService;
+    @Autowired
+    private AccountManagementService accountManagementService;
+
 
     /**
      * 分页
@@ -194,4 +233,206 @@ public class SampleServiceImpl extends ServiceImpl<SampleMapper, Sample> impleme
         return page;
     }
 
+    @Override
+    public SamplePdfInfoVo getSamplePdfInfo(Long id) {
+        Assert.notEmpty(id,"样品单id不能为空");
+        Sample sample = getById(id);
+        Assert.notEmpty(sample,"查询不到样品单信息");
+
+        SamplePdfInfoVo contractPdfInfoVo = new SamplePdfInfoVo();
+        setExportSampleInfo(contractPdfInfoVo, sample);
+        return contractPdfInfoVo;
+    }
+
+    /**
+     * 赋值样品单信息
+     */
+    private void setExportSampleInfo(SamplePdfInfoVo contractPdfInfoVo, Sample sample) {
+
+        SecurityContext context = SecurityContextHolder.getContext();
+
+        // 赋值卖方公司基本信息
+        CompletableFuture<Void> setSellCorporationInfoFuture = CompletableFuture.runAsync(
+                () -> {
+                    SecurityContextHolder.setContext(context);
+                    setSellCorporationInfo(contractPdfInfoVo, sample);
+                }, threadPoolExecutor);
+
+        // 赋值买方公司基本信息
+        CompletableFuture<Void> setBuyCorporationFuture = CompletableFuture.runAsync(
+                () -> {
+                    SecurityContextHolder.setContext(context);
+                    setBuyCorporation(contractPdfInfoVo, sample);
+                }, threadPoolExecutor);
+
+        // 赋值买卖方公司地址
+        CompletableFuture<Void> setAreaFuture = CompletableFuture.runAsync(
+                () -> {
+                    SecurityContextHolder.setContext(context);
+                    setArea(contractPdfInfoVo, sample);
+                }, threadPoolExecutor);
+
+        // 赋值商品列表信息
+        CompletableFuture<Void> setProductListFuture = CompletableFuture.runAsync(
+                () -> {
+                    SecurityContextHolder.setContext(context);
+                    setProductList(contractPdfInfoVo, sample);
+                }, threadPoolExecutor);
+
+        // 设置收款账号
+        CompletableFuture<Void> setAccountManagementFuture = CompletableFuture.runAsync(
+                () -> {
+                    SecurityContextHolder.setContext(context);
+                    setAccountManagement(contractPdfInfoVo, sample);
+                }, threadPoolExecutor);
+
+        // 赋值合同基本信息
+        setInfo(contractPdfInfoVo, sample);
+
+        CompletableFuture.allOf(
+                setSellCorporationInfoFuture,
+                setBuyCorporationFuture,
+                setAreaFuture,
+                setProductListFuture,
+                setAccountManagementFuture
+        ).join();
+
+    }
+
+
+    /**
+     * 赋值卖方公司基本信息
+     */
+    private void setSellCorporationInfo(SamplePdfInfoVo contractPdfInfoVo, Sample sample) {
+        // 卖方公司信息
+        Corporation corporation = corporationService.getById(sample.getSellCorporationId());
+        if (corporation == null) {
+            throw new ServiceException("卖方公司信息为空");
+        }
+        contractPdfInfoVo.setSellCorporationId(sample.getSellCorporationId());
+        contractPdfInfoVo.setSellCorporationNameEn(corporation.getNameEn());
+        contractPdfInfoVo.setSellCorporationName(corporation.getName());
+        contractPdfInfoVo.setSellContactName(sample.getSellContactName());
+        contractPdfInfoVo.setSellContactNumber(sample.getSellContactNumber());
+    }
+
+    /**
+     * 赋值买方公司基本信息
+     */
+    private void setBuyCorporation(SamplePdfInfoVo contractPdfInfoVo, Sample sample) {
+        Customer customer = customerService.getById(sample.getBuyCorporationId());
+        if (customer == null) {
+            throw new ServiceException("买方公司信息为空");
+        }
+        contractPdfInfoVo.setBuyCorporationId(sample.getBuyCorporationId());
+        contractPdfInfoVo.setBuyCorporationName(customer.getName());
+        contractPdfInfoVo.setBuyContactName(sample.getBuyContactName());
+        contractPdfInfoVo.setBuyContactNumber(sample.getBuyContactNumber());
+    }
+
+    /**
+     * 赋值买卖公司地址
+     */
+    private void setArea(SamplePdfInfoVo contractPdfInfoVo, Sample sample) {
+
+        List<Long> areaIdList = Arrays.asList(
+                sample.getBuyCountryId(),
+                sample.getBuyProvinceId(),
+                sample.getBuyCityId()
+        );
+
+        Map<Long, String> areaMap = CustomizeAreaUtil.getAreaMapByIds(areaIdList);
+
+        contractPdfInfoVo.setSellCountryName(sample.getSellCountryName());
+        contractPdfInfoVo.setSellProvinceName(sample.getSellProvinceName());
+        contractPdfInfoVo.setSellCityName(sample.getSellCityName());
+        contractPdfInfoVo.setSellDetailedAddress(sample.getSellAddress());
+
+        contractPdfInfoVo.setBuyCountryName(areaMap.get(sample.getBuyCountryId()));
+        contractPdfInfoVo.setBuyProvinceName(areaMap.get(sample.getBuyProvinceId()));
+        contractPdfInfoVo.setBuyCityName(areaMap.get(sample.getBuyCityId()));
+        contractPdfInfoVo.setBuyDetailedAddress(sample.getBuyAddress());
+    }
+
+    /**
+     * 赋值合同基本信息
+     */
+    private static final SimpleDateFormat sdf = new SimpleDateFormat("dd/MMM/yyyy", Locale.ENGLISH);
+    private void setInfo(SamplePdfInfoVo contractPdfInfoVo, Sample sample) {
+        contractPdfInfoVo.setContractCode(sample.getCode());
+        contractPdfInfoVo.setCreateTimeEn(sdf.format(sample.getCreateTime()));
+        contractPdfInfoVo.setTransportRemark(sample.getTransportRemark());
+//        contractPdfInfoVo.setTradeMethods(sample.getTradeMethods());
+        contractPdfInfoVo.setRemark(sample.getRemark());
+        contractPdfInfoVo.setCurrency(sample.getCurrency());
+        contractPdfInfoVo.setDeliveryTime(sample.getDeliveryTime());
+        contractPdfInfoVo.setTransportMethod(sample.getTransportMethod());
+        contractPdfInfoVo.setShroffAccountId(sample.getShroffAccountId());
+        contractPdfInfoVo.setAdvanceRatio(sample.getAdvanceRatio());
+    }
+
+    /**
+     * 赋值商品列表信息
+     */
+    private void setProductList(SamplePdfInfoVo contractPdfInfoVo, Sample sample) {
+
+        contractPdfInfoVo.setTotalAmount(sample.getAmount());
+
+        List<SampleProject> sampleProjectList = sampleProjectService.list(q -> q.eq(SampleProject::getSampleId, sample.getId()));
+        contractPdfInfoVo.setSampleProjectList(sampleProjectList);
+
+        List<SampleProduct> contractProductList = sampleProductService.list(q -> q.eq(SampleProduct::getSampleId, sample.getId()));
+        if (contractProductList.size() == 0) {
+            return;
+        }
+
+        List<Long> pids = contractProductList.stream().map(SampleProduct::getProductId).collect(Collectors.toList());
+        Map<Long, ProductInfo> productInfoMap = productInfoService.mapKEntity(ProductInfo::getId, q -> q.in(ProductInfo::getId, pids));
+
+        List<SamplePdfInfoVo.ProductInfo> productInfoList = contractProductList.stream().map(item -> {
+            ProductInfo productInfo = productInfoMap.get(item.getProductId());
+
+            SamplePdfInfoVo.ProductInfo productIndo = new SamplePdfInfoVo.ProductInfo();
+            productIndo.setProductId(item.getProductId());
+            productIndo.setProductQuantity(item.getQuantity());
+            productIndo.setProductPrice(item.getPrice());
+            productIndo.setAmount(item.getAmount());
+            productIndo.setProductName(item.getProductName());
+
+            if(ObjectUtil.isNotEmpty(productInfo)) {
+                productIndo.setProductRemark(productInfo.getRemark());
+                productIndo.setProductSpec(productInfo.getSpec());
+                JSONObject ehsdJson = JSONObject.parseObject(productInfo.getEhsdJson());
+                if (ObjectUtil.isNotEmpty(ehsdJson)) {
+                    productIndo.setPackMethod(ehsdJson.getString("packMethod"));
+                }
+            }
+
+            return productIndo;
+        }).collect(Collectors.toList());
+
+        contractPdfInfoVo.setProductInfoList(productInfoList);
+
+        // 产品属性
+        productInfoService.attributeAssign(productInfoList, SamplePdfInfoVo.ProductInfo::getProductId, (item, product) -> {
+            item.setProductUnit(product.getUnit());
+        });
+
+    }
+
+    private void setAccountManagement(SamplePdfInfoVo contractPdfInfoVo, Sample sample) {
+        Long shroffAccountId = sample.getShroffAccountId();
+        AccountManagement accountManagement = accountManagementService.getById(shroffAccountId);
+        if (accountManagement == null) {
+            return;
+        }
+
+        contractPdfInfoVo.setBeneficiaryName(accountManagement.getBeneficiaryName());
+        contractPdfInfoVo.setBeneficiaryBank(accountManagement.getBeneficiaryBank());
+        contractPdfInfoVo.setBeneficiaryBankAddress(accountManagement.getBeneficiaryBankAddress());
+        contractPdfInfoVo.setBeneficiaryAccountNumber(accountManagement.getBeneficiaryAccountNumber());
+        contractPdfInfoVo.setSwiftCode(accountManagement.getSwiftCode());
+        contractPdfInfoVo.setBeneficiaryAddress(accountManagement.getBeneficiaryAddress());
+    }
+
 }