|
@@ -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) {
|