From c2f4df04131fbfeee6b52d7708e837fcdc7b778a Mon Sep 17 00:00:00 2001
From: kangxiaoshan <kangxiaoshan@reyun.com>
Date: Wed, 21 Jul 2021 18:39:00 +0800
Subject: [PATCH] DMP 收入

---
 src/main/java/common/controller/DmpIncomeController.java    |   8 +++++---
 src/main/java/common/model/Contract.java                    |  20 ++++++++++++++++++++
 src/main/java/common/model/DmpIncome.java                   |   4 ++--
 src/main/java/common/service/DmpIncomeService.java          |   2 ++
 src/main/java/common/service/impl/ContractServiceImpl.java  |   9 +++++++++
 src/main/java/common/service/impl/DmpIncomeServiceImpl.java | 313 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------
 6 files changed, 308 insertions(+), 48 deletions(-)

diff --git a/src/main/java/common/controller/DmpIncomeController.java b/src/main/java/common/controller/DmpIncomeController.java
index f745bc1..bb755ef 100644
--- a/src/main/java/common/controller/DmpIncomeController.java
+++ b/src/main/java/common/controller/DmpIncomeController.java
@@ -44,11 +44,13 @@ public class DmpIncomeController {
     }
 
 
-    @PostMapping("/upload/{platform}")
-    public ResultModel uploadList(@RequestParam("file") MultipartFile file, @PathVariable String platform, @CurrentAccount User loginAccount) {
+    @PostMapping("/upload")
+    public ResultModel uploadList(@RequestParam("file") MultipartFile file, @CurrentAccount User loginAccount) {
         //上传收入数据
-        dmpIncomeService.uploadFile(file,platform,loginAccount);
+        dmpIncomeService.uploadFile(file, "dmp", loginAccount);
         return ResultModel.OK();
     }
 
+
+
 }
diff --git a/src/main/java/common/model/Contract.java b/src/main/java/common/model/Contract.java
index 3387b08..1731416 100644
--- a/src/main/java/common/model/Contract.java
+++ b/src/main/java/common/model/Contract.java
@@ -107,6 +107,8 @@ public class Contract {
 
     private int businessType; //业务类型 1 VIP 2 共管
     private int agreementType; //协议类型 1 普通协议 2 框架协议
+    private String businessTypeName; //业务类型 1 VIP 2 共管
+    private String agreementTypeName; //协议类型 1 普通协议 2 框架协议
 
     @Id
     @GeneratedValue
@@ -791,4 +793,22 @@ public class Contract {
     public void setAgreementType(int agreementType) {
         this.agreementType = agreementType;
     }
+
+    @Transient
+    public String getBusinessTypeName() {
+        return businessTypeName;
+    }
+
+    public void setBusinessTypeName(String businessTypeName) {
+        this.businessTypeName = businessTypeName;
+    }
+
+    @Transient
+    public String getAgreementTypeName() {
+        return agreementTypeName;
+    }
+
+    public void setAgreementTypeName(String agreementTypeName) {
+        this.agreementTypeName = agreementTypeName;
+    }
 }
diff --git a/src/main/java/common/model/DmpIncome.java b/src/main/java/common/model/DmpIncome.java
index a0b49f7..4478ded 100644
--- a/src/main/java/common/model/DmpIncome.java
+++ b/src/main/java/common/model/DmpIncome.java
@@ -9,8 +9,8 @@ import java.util.Date;
 @Entity
 public class DmpIncome {
 
-    private Long id;
-    private String contractCode;
+    private Long id;// ID
+    private String contractCode;//合同编号
     private String incomeMonth;//收入月份
     private String period;//结算周期
     private String sysSettlement;//系统结算
diff --git a/src/main/java/common/service/DmpIncomeService.java b/src/main/java/common/service/DmpIncomeService.java
index 76ab507..071dda2 100644
--- a/src/main/java/common/service/DmpIncomeService.java
+++ b/src/main/java/common/service/DmpIncomeService.java
@@ -21,4 +21,6 @@ public interface DmpIncomeService {
     Long delete(Long id);
 
     ResultModel uploadFile(MultipartFile file, String platform, User loginAccount);
+
+    ResultModel contractUploadFile(MultipartFile file, String platform, User loginAccount);
 }
diff --git a/src/main/java/common/service/impl/ContractServiceImpl.java b/src/main/java/common/service/impl/ContractServiceImpl.java
index 4876cf4..457317e 100644
--- a/src/main/java/common/service/impl/ContractServiceImpl.java
+++ b/src/main/java/common/service/impl/ContractServiceImpl.java
@@ -232,6 +232,9 @@ public class ContractServiceImpl implements ContractService {
     @Autowired
     private CalculationFlowRepository calculationFlowRepository;
 
+    @Autowired
+    private DmpIncomeService dmpIncomeService;
+
 
     @Override
     public Map<String, Object> checkAccount(String email, String platfrom) {
@@ -2487,6 +2490,12 @@ public class ContractServiceImpl implements ContractService {
 
     @Override
     public ResultModel uploadBatchInfo(MultipartFile file, String platform, User loginAccount) {
+
+        if ("dmp".equals(platform)) {
+            return dmpIncomeService.contractUploadFile(file, platform, loginAccount);
+        }
+
+
         InputStream stream = null;
         try {
             int row_length;
diff --git a/src/main/java/common/service/impl/DmpIncomeServiceImpl.java b/src/main/java/common/service/impl/DmpIncomeServiceImpl.java
index 26c85d7..4888f55 100644
--- a/src/main/java/common/service/impl/DmpIncomeServiceImpl.java
+++ b/src/main/java/common/service/impl/DmpIncomeServiceImpl.java
@@ -1,32 +1,30 @@
 package common.service.impl;
 
 
-import common.model.DmpIncome;
-import common.model.User;
-import common.repository.ContractRepository;
-import common.repository.DmpIncomeRepository;
+import common.model.*;
+import common.repository.*;
 import common.service.DmpIncomeService;
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.*;
+import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StopWatch;
 import org.springframework.util.StringUtils;
 import org.springframework.web.multipart.MultipartFile;
 import util.ResultModel;
 
-import javax.sql.DataSource;
 import java.io.IOException;
 import java.io.InputStream;
+import java.math.BigDecimal;
+import java.text.DateFormat;
 import java.text.DecimalFormat;
-import java.util.Date;
-import java.util.Map;
-import java.util.List;
+import java.text.SimpleDateFormat;
+import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -45,8 +43,43 @@ public class DmpIncomeServiceImpl implements DmpIncomeService {
     ContractRepository contractRepository;
 
     @Autowired
-    @Qualifier("dataSource")
-    DataSource dataSource;
+    TradeTypeRepsitory tradeTypeRepsitory;
+
+    @Autowired
+    SalesRepository salesRepository;
+
+    @Autowired
+    PackageBaseRepository packageBaseRepository;
+
+    @Autowired
+    BarrioCityRepository barrioCityRepository;
+
+    @Autowired
+    ContractBodyRepository contractBodyRepository;
+
+
+    public static final Map<String, String> SHEET_NAMES = new HashMap();
+    private static final Map<String, String> CONTRACT_TYPE_NAME = new HashMap();
+    private static final Map<String, String> BUSINESS_TYPE_NAME = new HashMap();
+    private static final Map<String, String> SETAGREEMENT_TYPE_NAME = new HashMap();
+
+
+    static {
+        SHEET_NAMES.put("tkio", "TrackingIO");
+        SHEET_NAMES.put("dmp", "DMP");
+        SHEET_NAMES.put("fake", "防作弊卫士");
+        SHEET_NAMES.put("adi", "ADI");
+        SHEET_NAMES.put("ads", "ADS");
+        SHEET_NAMES.put("abtest", "ABTEST");
+        SHEET_NAMES.put("cas", "CAS");
+        CONTRACT_TYPE_NAME.put("首次签约", "0");
+        CONTRACT_TYPE_NAME.put("续约", "1");
+        CONTRACT_TYPE_NAME.put("补充协议", "2");
+        BUSINESS_TYPE_NAME.put("VIP", "1");//业务类型 1 VIP 2 共管
+        BUSINESS_TYPE_NAME.put("共管", "2");
+        SETAGREEMENT_TYPE_NAME.put("普通协议", "1");//协议类型 1 普通协议 2 框架协议
+        SETAGREEMENT_TYPE_NAME.put("框架协议", "2");
+    }
 
 
     @Override
@@ -144,46 +177,19 @@ public class DmpIncomeServiceImpl implements DmpIncomeService {
 
     @Override
     public ResultModel uploadFile(MultipartFile file, String platform, User loginAccount) {
-        InputStream stream = null;
-        Workbook workbook = null;
-        try {
-            stream = file.getInputStream();
-            workbook = WorkbookFactory.create(stream);
-        } catch (Exception e) {
-            logger.error("", e);
-        } finally {
-            if (stream != null) {
-                try {
-                    stream.close();
-                } catch (IOException e) {
-                    logger.error("", e);
-                }
-            }
-        }
 
+        Workbook workbook = getWorkbook(file);
         if (workbook == null) {
             return ResultModel.ERROR("获取上传文件错误");
         }
-
-        Sheet sheet = workbook.getSheetAt(0);
-        Row row = sheet.getRow(0);
-
-        String sheetTitle = "合同编号\t收入月份\t结算周期\t系统结算\t按月结算\t税率\t确认收入";
-        int titleLength = sheetTitle.split("\t").length;
-        StringBuffer titleUp = new StringBuffer();
-        for (int i = 0; i < titleLength; i++) {
-            if (i > 0) titleUp.append("\t");
-            titleUp.append(row.getCell(i));
-        }
-        if (!titleUp.toString().equals(sheetTitle)) {
+        int rowNumber = checkSheetTitle(workbook, "合同编号\t收入月份\t结算周期\t系统结算\t按月结算\t税率\t确认收入", "\t");
+        if (rowNumber == -1) {
             return ResultModel.ERROR("模板表头错误");
-        }
-
-        int rowNumber = sheet.getLastRowNum();
-        if (rowNumber <= 1) {
+        } else if (rowNumber <= 1) {
             return ResultModel.ERROR("文件为空");
         }
 
+        Sheet sheet = workbook.getSheetAt(0);
         CompletableFuture.runAsync(() -> {
             StopWatch stopWatch = new StopWatch();
             stopWatch.start();
@@ -202,6 +208,42 @@ public class DmpIncomeServiceImpl implements DmpIncomeService {
         return ResultModel.OK();
     }
 
+    private int checkSheetTitle(Workbook workbook, String sheetTitle, String code) {
+        Sheet sheet = workbook.getSheetAt(0);
+        Row row = sheet.getRow(0);
+        int titleLength = sheetTitle.split("\t").length;
+        StringBuffer titleUp = new StringBuffer();
+        for (int i = 0; i < titleLength; i++) {
+            if (i > 0) titleUp.append(code);
+            titleUp.append(row.getCell(i));
+        }
+        if (!titleUp.toString().equals(sheetTitle)) {
+            return -1;
+        }
+        return titleLength;
+    }
+
+    private Workbook getWorkbook(MultipartFile excelfile) {
+        InputStream stream = null;
+        Workbook workbook = null;
+        try {
+            stream = excelfile.getInputStream();
+            workbook = WorkbookFactory.create(stream);
+        } catch (Exception e) {
+            logger.error("", e);
+        } finally {
+            if (stream != null) {
+                try {
+                    stream.close();
+                } catch (IOException e) {
+                    logger.error("", e);
+                }
+            }
+        }
+
+        return workbook;
+    }
+
     private DmpIncome saveDmpIncomeItem(Sheet sheet, int index, User user) {
         //logger.info(" line index {}", index);
         Row rowItem = sheet.getRow(index);
@@ -231,10 +273,195 @@ public class DmpIncomeServiceImpl implements DmpIncomeService {
 
     }
 
+    private String getCellDateValue(Row row, int index) {
+        Cell cell = row.getCell(index);
+
+        if (cell == null) {
+            return "erro";
+        }
+
+        String dfmate = cell.getCellStyle().getDataFormatString();
+
+        if (!"yyyy/mm;@".equals(dfmate) && !"m/d/yy".equals(dfmate) && !"yy/m/d".equals(dfmate) && !"mm/dd/yy".equals(dfmate) && !"dd-mmm-yy".equals(dfmate) && !"yyyy/m/d".equals(dfmate) && !"yyyy/m/d;@".equals(dfmate)) {
+            return "erro";
+        }
+
+        if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {
+            // 用于转化为日期格式
+            Date d = cell.getDateCellValue();
+            DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
+            return formater.format(d);
+        }
+        return cell.toString();
+    }
+
     private String getCellStringValue(Row row, int index) {
         Cell cell = row.getCell(index);
         return cell == null ? "" : cell.toString();
     }
 
+    private String getCellStringValue(Row row, int index, String defaulValue) {
+        Cell cell = row.getCell(index);
+        return cell == null ? defaulValue : cell.toString();
+    }
+
+    @Override
+    public ResultModel contractUploadFile(MultipartFile file, String platform, User loginAccount) {
+        Workbook workbook = getWorkbook(file);
+        if (workbook == null) {
+            return ResultModel.ERROR("获取上传文件错误");
+        }
+        Sheet sheet = workbook.getSheetAt(0);
+        String sheetName = sheet.getSheetName();
+        if (!sheetName.equalsIgnoreCase(SHEET_NAMES.get(platform))) {
+            return ResultModel.ERROR("请上传对应项目模板处理的数据");
+        }
+
+        int rowNumber = checkSheetTitle(workbook, "我方签约主体\t客户签约主体\t客户简称\t第三方签约主体\t行政区域\t隶属集团\t行业分类\t合同开始日期\t合同结束日期\t签约销售\t客户主账号\t合同编号\t签约类型\t业务类型\t协议类型\t合同金额\t关联合同编号", "\t");
+        if (rowNumber == -1) {
+            return ResultModel.ERROR("模板表头错误");
+        } else if (rowNumber <= 1) {
+            return ResultModel.ERROR("文件为空");
+        }
+
+        List<Contract> allContracts = new ArrayList<>();
+        Map<String, Long> tradTypeMap = tradeTypeRepsitory.findAll()
+                .stream().collect(Collectors.toMap(TradeType::getName, TradeType::getId));
+        Map<String, Long> salseMap = salesRepository.findSaleByStatus(0)
+                .stream().collect(Collectors.toMap(Sales::getName, Sales::getId));
+        Map<String, Long> barrioCityMap = barrioCityRepository.findAll()
+                .stream().collect(Collectors.toMap(BarrioCity::getName, BarrioCity::getId));
+        Map<String, String> cBodyMap = contractBodyRepository.findAllDis()
+                .stream().collect(Collectors.toMap(ContractBody::getName, ContractBody::getCode, (v1, v2) -> v1));
+
+
+        for (int i = 1; i < rowNumber; i++) {
+            Row rowItem = sheet.getRow(i);
+            if (rowItem == null) {
+                break;
+            }
+            Contract contract = new Contract();
+            contract.setPlatform(platform);
+            contract.setProduct(platform);
+            contract.setStatus("normal");
+            contract.setType("main");
+            contract.setCreateAccount(loginAccount.getId());
+            contract.setCreateName(loginAccount.getName());
+            contract.setCreateTime(new Date());
+            contract.setDs(DateTime.now().toString("yyyy-MM-dd"));
+
+            //填充数据
+            fillDataByRow(contract, rowItem);
+            //校验数据有效性
+            if ("erro".equals(contract.getStartDate()) || "erro".equals(contract.getEndDate())) {
+                return erroValueTip(i, "开始时间或结束时间");
+            }
+            if (!tradTypeMap.containsKey(contract.getTradeName())) {
+                return erroValueTip(i, "行业分类");
+            } else {
+                contract.setTradeType(Integer.parseInt(tradTypeMap.get(contract.getTradeName()) + ""));
+            }
+            if (!cBodyMap.containsKey(contract.getMyBodyName())) {
+                return erroValueTip(i, "我方签约主体");
+            } else {
+                contract.setMyBodyCode(cBodyMap.get(contract.getMyBodyName()));
+            }
+
+            if (StringUtils.isEmpty(contract.getCustomerBody())) {
+                return erroValueTip(i, "客户签约主体");
+            }
+
+            if (!barrioCityMap.containsKey(contract.getBarrioName())) {
+                return erroValueTip(i, "行政区域");
+            } else {
+                contract.setBarrioId(barrioCityMap.get(contract.getBarrioName()));
+            }
+
+            if (!salseMap.containsKey(contract.getSaleName())) {
+                return erroValueTip(i, "签约销售");
+            } else {
+                contract.setSale(salseMap.get(contract.getMyBodyName()));
+            }
+
+            if (StringUtils.isEmpty(contract.getEmail())) {
+                return erroValueTip(i, "客户主账号");
+            }
+            if (StringUtils.isEmpty(contract.getContractCode())) {
+                return erroValueTip(i, "合同编号");
+            } else {
+                contract.setCodeNum(Integer.parseInt(contract.getContractCode().split("-")[3]));
+            }
+            if (!CONTRACT_TYPE_NAME.containsKey(contract.getContractType())) {
+                return erroValueTip(i, "签约类型");
+            } else {
+                contract.setContractType(CONTRACT_TYPE_NAME.get(contract.getContractType()));
+            }
+
+
+            if (!BUSINESS_TYPE_NAME.containsKey(contract.getBusinessTypeName())) {
+                return erroValueTip(i, "业务类型");
+            } else {
+                contract.setBusinessType(Integer.parseInt(BUSINESS_TYPE_NAME.get(contract.getBusinessTypeName())));
+            }
+
+            if (!SETAGREEMENT_TYPE_NAME.containsKey(contract.getAgreementTypeName())) {
+                return erroValueTip(i, "业务类型");
+            } else {
+                contract.setAgreementType(Integer.parseInt(SETAGREEMENT_TYPE_NAME.get(contract.getAgreementTypeName())));
+            }
+
+            allContracts.add(contract);
+        }
+
+        if (allContracts.isEmpty()) {
+            return ResultModel.ERROR("上传内容为空");
+        }
+
+        CompletableFuture.runAsync(() -> {
+            StopWatch stopWatch = new StopWatch();
+            stopWatch.start();
+            ExecutorService executorService = Executors.newFixedThreadPool(35);
+            CompletableFuture[] futures = allContracts.stream()
+                    .map(contract -> CompletableFuture.runAsync(
+                            () -> contractRepository.save(contract), executorService)
+                            .exceptionally((t) -> null)
+                    ).toArray(size -> new CompletableFuture[size]);
+            CompletableFuture.allOf(futures).join();
+            executorService.shutdownNow();
+            stopWatch.stop();
+            logger.info("{} contract upload {} line data  use all {}s ", platform, allContracts.size(), stopWatch.getTotalTimeSeconds());
+        });
+        return ResultModel.OK();
+    }
+
+    private void fillDataByRow(Contract contract, Row rowItem) {
+        //我方签约主体   客户签约主体	客户简称
+        contract.setMyBodyName(getCellStringValue(rowItem, 0));
+        contract.setCustomerBody(getCellStringValue(rowItem, 1));
+        contract.setCustomerShort(getCellStringValue(rowItem, 2));
+        // 第三方签约主体	行政区域	隶属集团	行业分类
+        contract.setCustomerThird(getCellStringValue(rowItem, 3));
+        contract.setBarrioName(getCellStringValue(rowItem, 4));
+        contract.setBelongGroup(getCellStringValue(rowItem, 5));
+        contract.setTradeName(getCellStringValue(rowItem, 6));
+        // 合同开始日期 合同结束日期 签约销售	 客户主账号
+        contract.setStartDate(getCellDateValue(rowItem, 7));
+        contract.setEndDate(getCellDateValue(rowItem, 8));
+        contract.setSaleName(getCellStringValue(rowItem, 9));
+        contract.setEmail(getCellStringValue(rowItem, 10));
+        // 合同编号  签约类型	业务类型	协议类型	合同金额	关联合同编号
+        contract.setContractCode(getCellStringValue(rowItem, 11));
+        contract.setContractType(getCellStringValue(rowItem, 12));
+        contract.setBusinessTypeName(getCellStringValue(rowItem, 13));
+        contract.setAgreementTypeName(getCellStringValue(rowItem, 14));
+        contract.setMoney(Double.parseDouble(getCellStringValue(rowItem, 15, "0")));
+        contract.setRelationContract(new BigDecimal(getCellStringValue(rowItem, 16, "0")).longValue());
+
+    }
+
+    private ResultModel erroValueTip(int line, String title) {
+        return ResultModel.ERROR("第" + line + "行,[" + title + "]错误");
+    }
+
 
 }
--
libgit2 0.27.1