Browse Source

导入数据

rainwer 7 months ago
parent
commit
e1a0edb143

+ 11 - 4
src/main/java/cn/ezhizao/project/business/collection/controller/BizCollectionController.java

@@ -13,10 +13,7 @@ import cn.ezhizao.framework.web.domain.BaseEntity;
 import cn.ezhizao.framework.web.page.TableDataInfo;
 import cn.ezhizao.project.business.account.domain.BizAccount;
 import cn.ezhizao.project.business.account.service.IBizAccountService;
-import cn.ezhizao.project.business.collection.domain.BizCollection;
-import cn.ezhizao.project.business.collection.domain.BizCollectionDetail;
-import cn.ezhizao.project.business.collection.domain.CollectionExcelLoopModel;
-import cn.ezhizao.project.business.collection.domain.CollectionExcelOnceModel;
+import cn.ezhizao.project.business.collection.domain.*;
 import cn.ezhizao.project.business.collection.domain.vo.ReqStatisticsVo;
 import cn.ezhizao.project.business.collection.domain.vo.ResStatisticsVo;
 import cn.ezhizao.project.business.collection.service.IBizCollectionDetailService;
@@ -412,6 +409,16 @@ public class BizCollectionController extends BaseController {
         return success(message);
     }
 
+    @Log(title = "收款导入", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('business:collection:import')")
+    @PostMapping("/importLoopNew")
+    public AjaxResult importLoopNew(MultipartFile file) throws Exception {
+        ExcelUtil<CollectionExcelLoopNewModel> util = new ExcelUtil<>(CollectionExcelLoopNewModel.class);
+        List<CollectionExcelLoopNewModel> orderList = util.importExcel(file.getInputStream());
+        String message = collectionService.importLoopNew(orderList, SecurityUtils.getUserId(), getTenantId() == null ? 0 : getTenantId());
+        return success(message);
+    }
+
     @Log(title = "收款导入", businessType = BusinessType.IMPORT)
     @PreAuthorize("@ss.hasPermi('business:collection:import')")
     @PostMapping("/importOnce")

+ 65 - 0
src/main/java/cn/ezhizao/project/business/collection/domain/CollectionExcelLoopNewModel.java

@@ -0,0 +1,65 @@
+package cn.ezhizao.project.business.collection.domain;
+
+import cn.ezhizao.framework.aspectj.lang.annotation.Excel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class CollectionExcelLoopNewModel {
+    @Excel(name = "收款单号")
+    private String collectionFormNo;
+    @Excel(name = "合同编号")
+    private String contractNo;
+    @Excel(name = "收款人")
+    private String signerName;
+    //    客户名称
+    @Excel(name = "公司名称")
+    private String companyName;
+    //    收款日期
+    @Excel(name = "收款日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date formDate;
+    //    收款账户名
+    @Excel(name = "收款账户名")
+    private String subsidiaryName;
+    //    收款账户开户行
+    @Excel(name = "收款账户开户行")
+    private String subsidiaryBankName;
+    //    收款账户账号
+    @Excel(name = "收款账户账号")
+    private String subsidiaryBankAccount;
+    //    付款名称
+    @Excel(name = "付款名称")
+    private String paymentName;
+    //    服务金额
+    @Excel(name = "付款账户")
+    private String paymentAccount;
+    //    优惠金额
+    @Excel(name = "到账日期")
+    private Date arriveDate;
+    //    实收金额
+    @Excel(name = "到账时间")
+    private Date arriveTime;
+
+    // 代理记账
+    @Excel(name = "收款金额")
+    private BigDecimal amount;
+    // 代理记账单价
+    @Excel(name = "合同总额")
+    private BigDecimal contractAmount;
+    // 记账服务月数
+    @Excel(name = "代理记账金额")
+    private BigDecimal keepAccountAmount;
+    // 记账赠送月数
+    @Excel(name = "社保缴纳金额")
+    private BigDecimal securityAmount;
+    @Excel(name = "公积金缴纳金额")
+    private BigDecimal housingFundAmount;
+    @Excel(name ="返税申报金额")
+    private BigDecimal returnTaxAmount;
+    // 记账总金额
+    @Excel(name = "备注")
+    private String remark;
+
+}

+ 3 - 0
src/main/java/cn/ezhizao/project/business/collection/service/IBizCollectionService.java

@@ -2,6 +2,7 @@ package cn.ezhizao.project.business.collection.service;
 
 import cn.ezhizao.project.business.collection.domain.BizCollection;
 import cn.ezhizao.project.business.collection.domain.CollectionExcelLoopModel;
+import cn.ezhizao.project.business.collection.domain.CollectionExcelLoopNewModel;
 import cn.ezhizao.project.business.collection.domain.CollectionExcelOnceModel;
 import cn.ezhizao.project.business.collection.domain.vo.ReqStatisticsVo;
 import cn.ezhizao.project.business.collection.domain.vo.ResStatisticsVo;
@@ -44,6 +45,8 @@ public interface IBizCollectionService extends IService<BizCollection> {
 
     String importLoop(List<CollectionExcelLoopModel> orderList, Long userId, long l);
 
+    String importLoopNew(List<CollectionExcelLoopNewModel> orderList, Long userId, long l);
+
     String importOnce(List<CollectionExcelOnceModel> orderList, Long userId, long l);
 
     boolean removeCollectionBatchByIds(List<Long> ids);

+ 128 - 4
src/main/java/cn/ezhizao/project/business/collection/service/impl/BizCollectionServiceImpl.java

@@ -3,10 +3,7 @@ package cn.ezhizao.project.business.collection.service.impl;
 import cn.ezhizao.common.exception.ServiceException;
 import cn.ezhizao.common.utils.StringUtils;
 import cn.ezhizao.common.utils.uuid.SnowflakeIdWorker;
-import cn.ezhizao.project.business.collection.domain.BizCollection;
-import cn.ezhizao.project.business.collection.domain.BizCollectionDetail;
-import cn.ezhizao.project.business.collection.domain.CollectionExcelLoopModel;
-import cn.ezhizao.project.business.collection.domain.CollectionExcelOnceModel;
+import cn.ezhizao.project.business.collection.domain.*;
 import cn.ezhizao.project.business.collection.domain.vo.ReqStatisticsVo;
 import cn.ezhizao.project.business.collection.domain.vo.ResStatisticsVo;
 import cn.ezhizao.project.business.collection.mapper.BizCollectionDetailMapper;
@@ -245,6 +242,133 @@ public class BizCollectionServiceImpl extends ServiceImpl<BizCollectionMapper, B
         return successMsg.toString();
     }
 
+    @Override
+    public String importLoopNew(List<CollectionExcelLoopNewModel> collects, Long userId, long tenantId) {
+        if (StringUtils.isNull(collects) || collects.size() == 0) {
+            throw new ServiceException("导入数据不能为空!");
+        }
+        List<BizCompany> companies = companyService.query().eq("tenant_id", tenantId).list();
+        List<BizCollection> collections = new ArrayList<>();
+        List<BizCollectionDetail> details = new ArrayList<>();
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        for (CollectionExcelLoopNewModel item: collects) {
+            // 获取合同信息
+            BizArchiveInput archiveInput = archiveInputService.query().eq("contract_no", item.getContractNo()).eq("service_type",1).eq("tenant_id", tenantId).list().stream().findFirst().orElse(null);
+            if (archiveInput == null) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、合同 ").append(item.getContractNo()).append(" 不存在或不是循环合同");
+                continue;
+            }
+            if(archiveInput.getTrueAmount().subtract(item.getContractAmount()).compareTo(BigDecimal.ZERO) != 0){
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、合同 ").append(item.getContractNo()).append("合同总金额不一致");
+                continue;
+            }
+            BizCompany company = companies.stream().filter(v -> v.getName().equals(item.getCompanyName())).findFirst().orElse(null);
+            if (company == null) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、客户 ").append(item.getCompanyName()).append(" 不存在");
+                continue;
+            }
+            if (!archiveInput.getCompanyId().equals(company.getId())) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、订单 ").append(item.getContractNo()).append("的客户不是").append(item.getCompanyName());
+                continue;
+            }
+            List<BizArchiveInputDetail> contractDetails = archiveInputDetailService.query().eq("contract_id", archiveInput.getId()).list();
+            // 判断明细信息是否和导入信息相符
+            // 不相符添加 failureNum 并转到下一条。
+            if (item.getKeepAccountAmount() != null && item.getKeepAccountAmount().compareTo(BigDecimal.ZERO) > 0 && contractDetails.stream().noneMatch(v -> v.getTaskTypeId().equals(1L))) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、订单 ").append(item.getContractNo()).append("的没有记账报税任务");
+                continue;
+            }
+            if (item.getSecurityAmount() != null && item.getSecurityAmount().compareTo(BigDecimal.ZERO) > 0 && contractDetails.stream().noneMatch(v -> v.getTaskTypeId().equals(2L))) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、订单 ").append(item.getContractNo()).append("的没有社保代缴任务");
+                continue;
+            }
+            if (item.getHousingFundAmount() != null && item.getHousingFundAmount().compareTo(BigDecimal.ZERO) > 0 && contractDetails.stream().noneMatch(v -> v.getTaskTypeId().equals(3L))) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、订单 ").append(item.getContractNo()).append("的没有公积金代缴任务");
+                continue;
+            }
+            if (item.getReturnTaxAmount() != null && item.getReturnTaxAmount().compareTo(BigDecimal.ZERO) > 0 && contractDetails.stream().noneMatch(v -> v.getTaskTypeId().equals(4L))) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、订单 ").append(item.getContractNo()).append("的没有返税申报任务");
+                continue;
+            }
+            //查询收款记录
+            List<BizCollection> collected = this.query().eq("contract_id", archiveInput.getId()).eq("status", 1).list();
+            BigDecimal collectedAmount = BigDecimal.valueOf(collected.stream().mapToDouble(v -> v.getArriveAmount().doubleValue()).sum());
+
+            if(item.getAmount().subtract(archiveInput.getTrueAmount().subtract(collectedAmount)).compareTo(BigDecimal.ZERO) >0){
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、订单 ").append(item.getContractNo()).append("收款金额不能大于未收款金额");
+                continue;
+            }
+
+            BizCollection bizCollection = new BizCollection();
+            bizCollection.setId(snowflakeIdWorker.nextId());
+            bizCollection.setContractId(archiveInput.getId());
+            bizCollection.setFlowNo(String.valueOf(snowflakeIdWorker.nextId()));
+            bizCollection.setApplierId(getUserId());
+            //实际付款时间默认未当前时间
+            bizCollection.setActuallyDate(DateTime.now().toTimestamp());
+            bizCollection.setContractNo(archiveInput.getContractNo());
+            bizCollection.setCompanyId(archiveInput.getCompanyId());
+
+            bizCollection.setAmount(item.getContractAmount());
+            bizCollection.setArriveAmount(item.getAmount());
+
+            bizCollection.setVerifyStatus(1);
+            bizCollection.setStatus((byte)1);
+            bizCollection.setArriveStatus((byte)1);
+            bizCollection.setVerifyDate(DateTime.now().toTimestamp());
+
+            bizCollection.setTenantId(tenantId);
+
+            BigDecimal detailSum = BigDecimal.valueOf(contractDetails.stream().mapToDouble(v -> v.getAmount().doubleValue()).sum()).setScale(2, RoundingMode.HALF_UP);
+            BigDecimal remain = BigDecimal.ZERO;
+            for(int i = 0; i < contractDetails.size() ; i++) {
+                BizArchiveInputDetail l = contractDetails.get(i);
+                BizCollectionDetail detail = new BizCollectionDetail();
+                detail.setCollectionId(bizCollection.getId());
+                detail.setAmount(l.getAmount());
+                detail.setTaskTypeId(l.getTaskTypeId());
+                detail.setContractDetailId(l.getId());
+                detail.setContractId(l.getContractId());
+                detail.setTenantId(tenantId);
+                detail.setCompanyId(company.getId());
+                detail.setTaskTypeId(l.getTaskTypeId());
+                if (i == contractDetails.size() - 1) {
+                    detail.setArriveAmount(item.getAmount().subtract(remain));
+                } else {
+                    detail.setArriveAmount(item.getAmount().divide(detailSum, 4, RoundingMode.HALF_UP).multiply(l.getAmount()).setScale(2, RoundingMode.HALF_UP));
+                    remain = remain.add(detail.getArriveAmount());
+                }
+                details.add(detail);
+            }
+
+            collections.add(bizCollection);
+            successNum++;
+            successMsg.append("<br/>").append(successNum).append("、收款 ").append(item.getContractNo()).append(" 导入成功");
+        }
+        super.saveBatch(collections);
+        details.forEach(collectionDetailMapper::insert);
+
+        if (failureNum > 0) {
+            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+            throw new ServiceException(failureMsg.toString());
+        } else {
+            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+        }
+        return successMsg.toString();
+    }
+
     @Override
     public String importOnce(List<CollectionExcelOnceModel> collects, Long userId, long tenantId) {
         if (StringUtils.isNull(collects) || collects.size() == 0) {