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