Commit fcccdc70 by kangxiaoshan

修复dmp 收入上传

parent 1b084492
...@@ -38,9 +38,9 @@ public class DmpIncomeController { ...@@ -38,9 +38,9 @@ public class DmpIncomeController {
} }
@PostMapping("/delete") @PostMapping("/delete")
public ResultModel deleteItem(Long id) { public ResultModel deleteItem(@RequestBody DmpIncome dmpIncome) {
//删除数据 //删除数据
return ResultModel.OK(dmpIncomeService.delete(id)); return ResultModel.OK(dmpIncomeService.delete(dmpIncome));
} }
......
...@@ -9,159 +9,169 @@ import java.util.Date; ...@@ -9,159 +9,169 @@ import java.util.Date;
@Entity @Entity
public class DmpIncome { public class DmpIncome {
private Long id;// ID private Long id;// ID
private String contractCode;//合同编号 private String contractCode;//合同编号
private String incomeMonth;//收入月份 private String incomeMonth;//收入月份
private String period;//结算周期 private String period;//结算周期
private String sysSettlement;//系统结算 private String sysSettlement;//系统结算
private String monthSettlement;//按月结算 private String monthSettlement;//按月结算
private String confirmSettlement;//确认结算 private String confirmSettlement;//确认结算
private String taxRate;//税率 private String taxRate;//税率
private Date createTime; private Date createTime;
private Date modifyTime; private Date modifyTime;
private String uploadUser; private String uploadUser;
private int index;
//contract_code, my_body_name, customer_body, customer_short, business_type, agreement_type
//contract_code, my_body_name, customer_body, customer_short, business_type, agreement_type
private String myBodyName,
customerBody, private String myBodyName,
customerShort, customerBody,
businessType, customerShort,
agreementType; businessType,
agreementType;
@Id
@GeneratedValue @Id
public Long getId() { @GeneratedValue
return id; public Long getId() {
} return id;
}
public void setId(Long id) {
this.id = id; public void setId(Long id) {
} this.id = id;
}
public String getContractCode() {
return contractCode; public String getContractCode() {
} return contractCode;
}
public void setContractCode(String contractCode) {
this.contractCode = contractCode; public void setContractCode(String contractCode) {
} this.contractCode = contractCode;
}
public String getIncomeMonth() {
return incomeMonth; public String getIncomeMonth() {
} return incomeMonth;
}
public void setIncomeMonth(String incomeMonth) {
this.incomeMonth = incomeMonth; public void setIncomeMonth(String incomeMonth) {
} this.incomeMonth = incomeMonth;
}
public String getPeriod() {
return period; public String getPeriod() {
} return period;
}
public void setPeriod(String period) {
this.period = period; public void setPeriod(String period) {
} this.period = period;
}
public String getSysSettlement() {
return sysSettlement; public String getSysSettlement() {
} return sysSettlement;
}
public void setSysSettlement(String sysSettlement) {
this.sysSettlement = sysSettlement; public void setSysSettlement(String sysSettlement) {
} this.sysSettlement = sysSettlement;
}
public String getMonthSettlement() {
return monthSettlement; public String getMonthSettlement() {
} return monthSettlement;
}
public void setMonthSettlement(String monthSettlement) {
this.monthSettlement = monthSettlement; public void setMonthSettlement(String monthSettlement) {
} this.monthSettlement = monthSettlement;
}
public String getConfirmSettlement() {
return confirmSettlement; public String getConfirmSettlement() {
} return confirmSettlement;
}
public void setConfirmSettlement(String confirmSettlement) {
this.confirmSettlement = confirmSettlement; public void setConfirmSettlement(String confirmSettlement) {
} this.confirmSettlement = confirmSettlement;
}
public String getTaxRate() {
return taxRate; public String getTaxRate() {
} return taxRate;
}
public void setTaxRate(String taxRate) {
this.taxRate = taxRate; public void setTaxRate(String taxRate) {
} this.taxRate = taxRate;
}
public Date getCreateTime() {
return createTime; public Date getCreateTime() {
} return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime; public void setCreateTime(Date createTime) {
} this.createTime = createTime;
}
public Date getModifyTime() {
return modifyTime; public Date getModifyTime() {
} return modifyTime;
}
public void setModifyTime(Date modifyTime) {
this.modifyTime = modifyTime; public void setModifyTime(Date modifyTime) {
} this.modifyTime = modifyTime;
}
public String getUploadUser() {
return uploadUser; public String getUploadUser() {
} return uploadUser;
}
public void setUploadUser(String uploadUser) {
this.uploadUser = uploadUser; public void setUploadUser(String uploadUser) {
} this.uploadUser = uploadUser;
}
@Transient
public String getMyBodyName() { @Transient
return myBodyName; public String getMyBodyName() {
} return myBodyName;
}
public void setMyBodyName(String myBodyName) {
this.myBodyName = myBodyName; public void setMyBodyName(String myBodyName) {
} this.myBodyName = myBodyName;
}
@Transient
public String getCustomerBody() { @Transient
return customerBody; public String getCustomerBody() {
} return customerBody;
}
public void setCustomerBody(String customerBody) {
this.customerBody = customerBody; public void setCustomerBody(String customerBody) {
} this.customerBody = customerBody;
}
@Transient
public String getCustomerShort() { @Transient
return customerShort; public String getCustomerShort() {
} return customerShort;
}
public void setCustomerShort(String customerShort) {
this.customerShort = customerShort; public void setCustomerShort(String customerShort) {
} this.customerShort = customerShort;
}
@Transient
public String getBusinessType() { @Transient
return businessType; public String getBusinessType() {
} return businessType;
}
public void setBusinessType(String businessType) {
this.businessType = businessType; public void setBusinessType(String businessType) {
} this.businessType = businessType;
}
@Transient
public String getAgreementType() { @Transient
return agreementType; public String getAgreementType() {
} return agreementType;
}
public void setAgreementType(String agreementType) {
this.agreementType = agreementType; public void setAgreementType(String agreementType) {
} this.agreementType = agreementType;
}
@Transient
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
} }
...@@ -16,4 +16,5 @@ public interface DmpIncomeRepository extends JpaRepository<DmpIncome, Long> { ...@@ -16,4 +16,5 @@ public interface DmpIncomeRepository extends JpaRepository<DmpIncome, Long> {
@Query(value = "select * from dmp_income where contract_code = ?1 and income_month =?2 limit 1 ", nativeQuery = true) @Query(value = "select * from dmp_income where contract_code = ?1 and income_month =?2 limit 1 ", nativeQuery = true)
DmpIncome findByCodeMonth(String contractCode, String incomeMonth); DmpIncome findByCodeMonth(String contractCode, String incomeMonth);
} }
...@@ -10,17 +10,17 @@ import java.util.List; ...@@ -10,17 +10,17 @@ import java.util.List;
public interface DmpIncomeService { public interface DmpIncomeService {
List<DmpIncome> listByCode(String contractCode); List<DmpIncome> listByCode(String contractCode);
List<DmpIncome> listByDs(String start, String end); List<DmpIncome> listByDs(String start, String end);
HSSFWorkbook exportIncomeList(String startDate, String endDate, String bodyCode, String serchName); HSSFWorkbook exportIncomeList(String startDate, String endDate, String bodyCode, String serchName);
DmpIncome update(DmpIncome dmpIncome); DmpIncome update(DmpIncome dmpIncome);
Long delete(Long id); Long delete(DmpIncome dmpIncome);
ResultModel uploadFile(MultipartFile file, String platform, User loginAccount); ResultModel uploadFile(MultipartFile file, String platform, User loginAccount);
ResultModel contractUploadFile(MultipartFile file, String platform, User loginAccount); ResultModel contractUploadFile(MultipartFile file, String platform, User loginAccount);
} }
...@@ -34,530 +34,545 @@ import java.util.stream.Stream; ...@@ -34,530 +34,545 @@ import java.util.stream.Stream;
@Service @Service
public class DmpIncomeServiceImpl implements DmpIncomeService { public class DmpIncomeServiceImpl implements DmpIncomeService {
Logger logger = LoggerFactory.getLogger(DmpIncomeServiceImpl.class); Logger logger = LoggerFactory.getLogger(DmpIncomeServiceImpl.class);
@Autowired @Autowired
DmpIncomeRepository dmpIncomeRepository; DmpIncomeRepository dmpIncomeRepository;
@Autowired @Autowired
ContractRepository contractRepository; ContractRepository contractRepository;
@Autowired @Autowired
TradeTypeRepsitory tradeTypeRepsitory; TradeTypeRepsitory tradeTypeRepsitory;
@Autowired @Autowired
SalesRepository salesRepository; SalesRepository salesRepository;
@Autowired @Autowired
PackageBaseRepository packageBaseRepository; PackageBaseRepository packageBaseRepository;
@Autowired @Autowired
BarrioCityRepository barrioCityRepository; BarrioCityRepository barrioCityRepository;
@Autowired @Autowired
ContractBodyRepository contractBodyRepository; ContractBodyRepository contractBodyRepository;
public static final Map<String, String> SHEET_NAMES = new HashMap(); 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> CONTRACT_TYPE_NAME = new HashMap();
private static final Map<String, String> BUSINESS_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(); private static final Map<String, String> SETAGREEMENT_TYPE_NAME = new HashMap();
static { static {
SHEET_NAMES.put("tkio", "TrackingIO"); SHEET_NAMES.put("tkio", "TrackingIO");
SHEET_NAMES.put("dmp", "DMP"); SHEET_NAMES.put("dmp", "DMP");
SHEET_NAMES.put("fake", "防作弊卫士"); SHEET_NAMES.put("fake", "防作弊卫士");
SHEET_NAMES.put("adi", "ADI"); SHEET_NAMES.put("adi", "ADI");
SHEET_NAMES.put("ads", "ADS"); SHEET_NAMES.put("ads", "ADS");
SHEET_NAMES.put("abtest", "ABTEST"); SHEET_NAMES.put("abtest", "ABTEST");
SHEET_NAMES.put("cas", "CAS"); SHEET_NAMES.put("cas", "CAS");
CONTRACT_TYPE_NAME.put("首次签约", "0"); CONTRACT_TYPE_NAME.put("首次签约", "0");
CONTRACT_TYPE_NAME.put("续约", "1"); CONTRACT_TYPE_NAME.put("续约", "1");
CONTRACT_TYPE_NAME.put("补充协议", "2"); CONTRACT_TYPE_NAME.put("补充协议", "2");
BUSINESS_TYPE_NAME.put("VIP", "1");//业务类型 1 VIP 2 共管 BUSINESS_TYPE_NAME.put("VIP", "1");//业务类型 1 VIP 2 共管
BUSINESS_TYPE_NAME.put("共管", "2"); BUSINESS_TYPE_NAME.put("共管", "2");
BUSINESS_TYPE_NAME.put("前置机", "3"); BUSINESS_TYPE_NAME.put("前置机", "3");
SETAGREEMENT_TYPE_NAME.put("普通协议", "1");//协议类型 1 普通协议 2 框架协议 SETAGREEMENT_TYPE_NAME.put("普通协议", "1");//协议类型 1 普通协议 2 框架协议
SETAGREEMENT_TYPE_NAME.put("框架协议", "2"); SETAGREEMENT_TYPE_NAME.put("框架协议", "2");
} }
@Override @Override
public List<DmpIncome> listByCode(String contractCode) { public List<DmpIncome> listByCode(String contractCode) {
List<DmpIncome> dmpIncomes = dmpIncomeRepository.findByContractCode(contractCode); List<DmpIncome> dmpIncomes = dmpIncomeRepository.findByContractCode(contractCode);
return dmpIncomes; return dmpIncomes;
} }
@Override @Override
public List<DmpIncome> listByDs(String start, String end) { public List<DmpIncome> listByDs(String start, String end) {
List<DmpIncome> dmpIncomes = dmpIncomeRepository.findByContractDs(start, end); List<DmpIncome> dmpIncomes = dmpIncomeRepository.findByContractDs(start, end);
if (dmpIncomes.isEmpty()) { if (dmpIncomes.isEmpty()) {
return dmpIncomes; return dmpIncomes;
} }
List<String> codes = dmpIncomes.stream().map(v -> v.getContractCode()).collect(Collectors.toList()); List<String> codes = dmpIncomes.stream().map(v -> v.getContractCode()).collect(Collectors.toList());
List<Object[]> contracts = contractRepository.findByDmpContractCode(codes); List<Object[]> contracts = contractRepository.findByDmpContractCode(codes);
Map<String, Object[]> names = contracts.stream().collect(Collectors.toMap(v -> v[0] + "", v -> v, (v1, v2) -> v1)); Map<String, Object[]> names = contracts.stream().collect(Collectors.toMap(v -> v[0] + "", v -> v, (v1, v2) -> v1));
Map<String, String> cBodyMap = contractBodyRepository.findAllDis() Map<String, String> cBodyMap = contractBodyRepository.findAllDis()
.stream().collect(Collectors.toMap(ContractBody::getCode, ContractBody::getName, (v1, v2) -> v1)); .stream().collect(Collectors.toMap(ContractBody::getCode, ContractBody::getName, (v1, v2) -> v1));
for (DmpIncome dmpIncome : dmpIncomes) { for (DmpIncome dmpIncome : dmpIncomes) {
Object[] nameItem = names.get(dmpIncome.getContractCode()); Object[] nameItem = names.get(dmpIncome.getContractCode());
//my_body_name, customer_body, customer_short, business_type, agreement_type //my_body_name, customer_body, customer_short, business_type, agreement_type
if (nameItem != null) { if (nameItem != null) {
dmpIncome.setMyBodyName(nameItem[2] + ""); dmpIncome.setMyBodyName(nameItem[2] + "");
dmpIncome.setCustomerBody(nameItem[3] + ""); dmpIncome.setCustomerBody(nameItem[3] + "");
dmpIncome.setCustomerShort(nameItem[4] + ""); dmpIncome.setCustomerShort(nameItem[4] + "");
dmpIncome.setBusinessType(nameItem[5] + ""); dmpIncome.setBusinessType(nameItem[5] + "");
dmpIncome.setAgreementType(nameItem[6] + ""); dmpIncome.setAgreementType(nameItem[6] + "");
if (StringUtils.isEmpty(dmpIncome.getMyBodyName()) || dmpIncome.getMyBodyName().equals("null")) { if (StringUtils.isEmpty(dmpIncome.getMyBodyName()) || dmpIncome.getMyBodyName().equals("null")) {
dmpIncome.setMyBodyName(cBodyMap.get(nameItem[1])); dmpIncome.setMyBodyName(cBodyMap.get(nameItem[1]));
} }
} }
} }
return dmpIncomes; return dmpIncomes;
} }
@Override @Override
public HSSFWorkbook exportIncomeList(String startDate, String endDate, String bodyCode, String serchName) { public HSSFWorkbook exportIncomeList(String startDate, String endDate, String bodyCode, String serchName) {
List<DmpIncome> dmpIncomes = this.listByDs(startDate, endDate); List<DmpIncome> dmpIncomes = this.listByDs(startDate, endDate);
dmpIncomes = dmpIncomes.stream() dmpIncomes = dmpIncomes.stream()
.filter(v -> StringUtils.isEmpty(bodyCode) || "all".equals(bodyCode) || bodyCode.equals(v.getMyBodyName())) .filter(v -> StringUtils.isEmpty(bodyCode) || "all".equals(bodyCode) || bodyCode.equals(v.getMyBodyName()))
.filter(v -> StringUtils.isEmpty(serchName) || (v.getContractCode().contains(serchName) || v.getCustomerBody().contains(serchName) || v.getMyBodyName().contains(serchName))) .filter(v -> StringUtils.isEmpty(serchName) || (v.getContractCode().contains(serchName) || v.getCustomerBody().contains(serchName) || v.getMyBodyName().contains(serchName)))
.collect(Collectors.toList()); .collect(Collectors.toList());
DecimalFormat df = new DecimalFormat("##,##0.00"); DecimalFormat df = new DecimalFormat("##,##0.00");
//创建工作薄对象 //创建工作薄对象
HSSFWorkbook workbook = new HSSFWorkbook();//这里也可以设置sheet的Name HSSFWorkbook workbook = new HSSFWorkbook();//这里也可以设置sheet的Name
//创建工作表对象 //创建工作表对象
HSSFSheet sheet = workbook.createSheet(); HSSFSheet sheet = workbook.createSheet();
//创建工作表的行 //创建工作表的行
HSSFRow row = sheet.createRow(0); HSSFRow row = sheet.createRow(0);
//表头 //表头
String[] title = "我方签约主体,收入月份,签约方,客户简称,合同编号,业务类型,结算周期,系统结算,按月结算,税率,确认收入".split(","); String[] title = "我方签约主体,收入月份,签约方,客户简称,合同编号,业务类型,结算周期,系统结算,按月结算,税率,确认收入".split(",");
for (int i = 0; i < title.length; i++) { for (int i = 0; i < title.length; i++) {
row.createCell(i).setCellValue(title[i]); row.createCell(i).setCellValue(title[i]);
} }
String[] bussinesName = new String[]{"", "VIP", "共管", "前置机"}; String[] bussinesName = new String[]{"", "VIP", "共管", "前置机"};
for (int j = 0; j < dmpIncomes.size(); j++) { for (int j = 0; j < dmpIncomes.size(); j++) {
HSSFRow rowBody = sheet.createRow(j + 1); HSSFRow rowBody = sheet.createRow(j + 1);
DmpIncome income = dmpIncomes.get(j); DmpIncome income = dmpIncomes.get(j);
String bussinesTypeName = income.getBusinessType() == null ? "" : bussinesName[Integer.parseInt(income.getBusinessType())]; String bussinesTypeName = income.getBusinessType() == null ? "" : bussinesName[Integer.parseInt(income.getBusinessType())];
String[] dataItem = new String[]{ String[] dataItem = new String[]{
income.getMyBodyName(), income.getIncomeMonth(), income.getCustomerBody(), income.getMyBodyName(), income.getIncomeMonth(), income.getCustomerBody(),
income.getCustomerShort(), income.getContractCode(), bussinesTypeName, income.getCustomerShort(), income.getContractCode(), bussinesTypeName,
income.getPeriod(), income.getSysSettlement(), income.getMonthSettlement(), income.getPeriod(), income.getSysSettlement(), income.getMonthSettlement(),
income.getTaxRate(), income.getConfirmSettlement() income.getTaxRate(), income.getConfirmSettlement()
}; };
for (int w = 0; w < dataItem.length; w++) { for (int w = 0; w < dataItem.length; w++) {
rowBody.createCell(w).setCellValue(dataItem[w]); rowBody.createCell(w).setCellValue(dataItem[w]);
} }
} }
return workbook; return workbook;
} }
@Override @Override
public DmpIncome update(DmpIncome dmpIncome) { public DmpIncome update(DmpIncome dmpIncome) {
if (dmpIncome.getId() == null) { if (dmpIncome.getId() == null) {
return null; return null;
} }
DmpIncome dbItem = dmpIncomeRepository.findOne(dmpIncome.getId()); DmpIncome dbItem = dmpIncomeRepository.findOne(dmpIncome.getId());
dbItem.setIncomeMonth(dmpIncome.getIncomeMonth()); dbItem.setIncomeMonth(dmpIncome.getIncomeMonth());
dbItem.setPeriod(dmpIncome.getPeriod()); dbItem.setPeriod(dmpIncome.getPeriod());
dbItem.setSysSettlement(dmpIncome.getSysSettlement()); dbItem.setSysSettlement(dmpIncome.getSysSettlement());
dbItem.setMonthSettlement(dmpIncome.getMonthSettlement()); dbItem.setMonthSettlement(dmpIncome.getMonthSettlement());
dbItem.setTaxRate(dmpIncome.getTaxRate()); dbItem.setTaxRate(dmpIncome.getTaxRate());
dbItem.setConfirmSettlement(dmpIncome.getConfirmSettlement()); dbItem.setConfirmSettlement(dmpIncome.getConfirmSettlement());
dmpIncomeRepository.save(dbItem); dmpIncomeRepository.save(dbItem);
return dbItem; return dbItem;
} }
@Override @Override
public Long delete(Long id) { public Long delete(DmpIncome dmpIncome) {
if (id == null) { if (dmpIncome.getId() == null) {
return null; return null;
} }
dmpIncomeRepository.delete(id); dmpIncomeRepository.delete(dmpIncome.getId());
return id; return dmpIncome.getId();
} }
@Override @Override
public ResultModel uploadFile(MultipartFile file, String platform, User loginAccount) { public ResultModel uploadFile(MultipartFile file, String platform, User loginAccount) {
Workbook workbook = getWorkbook(file); Workbook workbook = getWorkbook(file);
if (workbook == null) { if (workbook == null) {
return ResultModel.ERROR("获取上传文件错误"); return ResultModel.ERROR("获取上传文件错误");
} }
int rowNumber = checkSheetTitle(workbook, platform + "_income"); int rowNumber = checkSheetTitle(workbook, platform + "_income");
if (rowNumber == -1) { if (rowNumber == -1) {
return ResultModel.ERROR("模板表头错误"); return ResultModel.ERROR("模板表头错误");
} else if (rowNumber <= 1) { } else if (rowNumber <= 1) {
return ResultModel.ERROR("文件为空"); return ResultModel.ERROR("文件为空");
} }
Sheet sheet = workbook.getSheetAt(0); Sheet sheet = workbook.getSheetAt(0);
DecimalFormat df = new DecimalFormat("##,##0.00"); DecimalFormat df = new DecimalFormat("##,##0.00");
StringBuffer erroMessage = new StringBuffer(); StringBuffer erroMessage = new StringBuffer();
StopWatch stopWatch = new StopWatch(); StopWatch stopWatch = new StopWatch();
stopWatch.start(); stopWatch.start();
ExecutorService executorService = Executors.newFixedThreadPool(30); Map<String, String> incomeMap = new HashMap<>();
CompletableFuture[] futures = Stream.iterate(1, n -> n + 1).limit(rowNumber - 1).map(index -> List<DmpIncome> dmpIncomeList = Stream.iterate(1, n -> n + 1).limit(rowNumber - 1).map(index -> {
CompletableFuture.runAsync( DmpIncome income = saveDmpIncomeItem(sheet, index, loginAccount);
() -> { String key = income.getIncomeMonth() + income.getContractCode();
DmpIncome income = saveDmpIncomeItem(sheet, index, loginAccount); if (incomeMap.containsKey(key)) {
return null;
if (income != null) { }
if ("erro".equals(income.getIncomeMonth())) { incomeMap.put(key, "1");
erroMessage.append(index).append(" 行 收入月份错误").append(";\n"); return income;
} else { }).filter(in -> in != null).collect(Collectors.toList());
income.setConfirmSettlement(new BigDecimal(income.getConfirmSettlement()).setScale(2, BigDecimal.ROUND_HALF_UP).toString());
dmpIncomeRepository.save(income); if (dmpIncomeList.isEmpty()) {
} return ResultModel.OK();
} }
}, executorService) ExecutorService executorService = Executors.newFixedThreadPool(30);
.exceptionally((t) -> { final int[] indexLine = {0};
erroMessage.append(index).append(" 行 错误").append(t.getMessage()).append(";\n"); CompletableFuture[] futures = dmpIncomeList.stream().map(income ->
logger.error("the line " + index, t); CompletableFuture.runAsync(
return null; () -> {
})
).toArray(size -> new CompletableFuture[size]); DmpIncome one = dmpIncomeRepository.findByCodeMonth(income.getContractCode(), income.getIncomeMonth());
CompletableFuture.allOf(futures).join(); if (one != null) {
executorService.shutdownNow(); // 同一合同同一月份不重复保存
stopWatch.stop(); return;
logger.info("dmp income upload {} line data use all {}s ", rowNumber - 1, stopWatch.getTotalTimeSeconds()); }
if (erroMessage.length() > 0) { indexLine[0] = income.getIndex();
return ResultModel.ERROR(erroMessage.toString()); if ("erro".equals(income.getIncomeMonth())) {
} erroMessage.append(income.getIndex()).append(" 行 收入月份错误").append(";\n");
return ResultModel.OK(); } else {
} income.setConfirmSettlement(new BigDecimal(income.getConfirmSettlement()).setScale(2, BigDecimal.ROUND_HALF_UP).toString());
dmpIncomeRepository.save(income);
@Override }
public ResultModel contractUploadFile(MultipartFile file, String platform, User loginAccount) { }, executorService)
Workbook workbook = getWorkbook(file); .exceptionally((t) -> {
if (workbook == null) { erroMessage.append(indexLine[0]).append(" 行 错误").append(t.getMessage()).append(";\n");
return ResultModel.ERROR("获取上传文件错误"); logger.error("the line " + indexLine[0], t);
} return null;
Sheet sheet = workbook.getSheetAt(0); })
String sheetName = sheet.getSheetName(); ).toArray(size -> new CompletableFuture[size]);
if (!sheetName.equalsIgnoreCase(SHEET_NAMES.get(platform))) { CompletableFuture.allOf(futures).join();
return ResultModel.ERROR("请上传对应项目模板处理的数据"); executorService.shutdownNow();
} stopWatch.stop();
logger.info("dmp income upload {} line data use all {}s ", rowNumber - 1, stopWatch.getTotalTimeSeconds());
int rowNumber = checkSheetTitle(workbook, platform); if (erroMessage.length() > 0) {
if (rowNumber == -1) { return ResultModel.ERROR(erroMessage.toString());
return ResultModel.ERROR("模板表头错误"); }
} else if (rowNumber <= 1) { return ResultModel.OK();
return ResultModel.ERROR("文件为空"); }
}
@Override
List<Contract> allContracts = new ArrayList<>(); public ResultModel contractUploadFile(MultipartFile file, String platform, User loginAccount) {
Map<String, Long> tradTypeMap = tradeTypeRepsitory.findAll() Workbook workbook = getWorkbook(file);
.stream().collect(Collectors.toMap(TradeType::getName, TradeType::getId)); if (workbook == null) {
Map<String, Long> salseMap = salesRepository.findSaleByStatus(0) return ResultModel.ERROR("获取上传文件错误");
.stream().collect(Collectors.toMap(Sales::getName, Sales::getId)); }
Map<Long, String> barrioCityMap = barrioCityRepository.findAll() Sheet sheet = workbook.getSheetAt(0);
.stream().collect(Collectors.toMap(BarrioCity::getId, BarrioCity::getName)); String sheetName = sheet.getSheetName();
Map<String, String> cBodyMap = contractBodyRepository.findAllDis() if (!sheetName.equalsIgnoreCase(SHEET_NAMES.get(platform))) {
.stream().collect(Collectors.toMap(ContractBody::getName, ContractBody::getCode, (v1, v2) -> v1)); return ResultModel.ERROR("请上传对应项目模板处理的数据");
}
for (int i = 1; i < rowNumber; i++) { int rowNumber = checkSheetTitle(workbook, platform);
Row rowItem = sheet.getRow(i); if (rowNumber == -1) {
if (rowItem == null) { return ResultModel.ERROR("模板表头错误");
break; } else if (rowNumber <= 1) {
} return ResultModel.ERROR("文件为空");
Contract contract = new Contract(); }
contract.setPlatform(platform);
contract.setProduct(platform); List<Contract> allContracts = new ArrayList<>();
contract.setStatus("normal"); Map<String, Long> tradTypeMap = tradeTypeRepsitory.findAll()
contract.setType("main"); .stream().collect(Collectors.toMap(TradeType::getName, TradeType::getId));
contract.setCreateAccount(loginAccount.getId()); Map<String, Long> salseMap = salesRepository.findSaleByStatus(0)
contract.setCreateName(loginAccount.getName()); .stream().collect(Collectors.toMap(Sales::getName, Sales::getId));
Map<Long, String> barrioCityMap = barrioCityRepository.findAll()
contract.setDs(DateTime.now().toString("yyyy-MM-dd")); .stream().collect(Collectors.toMap(BarrioCity::getId, BarrioCity::getName));
Map<String, String> cBodyMap = contractBodyRepository.findAllDis()
String sysErro = null; .stream().collect(Collectors.toMap(ContractBody::getName, ContractBody::getCode, (v1, v2) -> v1));
try {
//填充数据
fillDataByRow(contract, rowItem); for (int i = 1; i < rowNumber; i++) {
} catch (Exception e) { Row rowItem = sheet.getRow(i);
logger.error("the line " + i, e); if (rowItem == null) {
sysErro = e.getMessage(); break;
} }
Contract contract = new Contract();
if (sysErro != null) { contract.setPlatform(platform);
return erroValueTip(i, sysErro); contract.setProduct(platform);
} contract.setStatus("normal");
contract.setType("main");
//校验数据有效性 contract.setCreateAccount(loginAccount.getId());
if ("erro".equals(contract.getStartDate()) || "erro".equals(contract.getEndDate())) { contract.setCreateName(loginAccount.getName());
return erroValueTip(i, "开始时间或结束时间");
} contract.setDs(DateTime.now().toString("yyyy-MM-dd"));
if (!tradTypeMap.containsKey(contract.getTradeName())) {
return erroValueTip(i, "行业分类"); String sysErro = null;
} else { try {
contract.setTradeType(Integer.parseInt(tradTypeMap.get(contract.getTradeName()) + "")); //填充数据
} fillDataByRow(contract, rowItem);
if (!cBodyMap.containsKey(contract.getMyBodyName())) { } catch (Exception e) {
return erroValueTip(i, "我方签约主体"); logger.error("the line " + i, e);
} else { sysErro = e.getMessage();
contract.setMyBodyCode(cBodyMap.get(contract.getMyBodyName())); }
}
if (sysErro != null) {
if (StringUtils.isEmpty(contract.getCustomerBody())) { return erroValueTip(i, sysErro);
return erroValueTip(i, "客户签约主体"); }
}
//校验数据有效性
if (!barrioCityMap.containsKey(contract.getBarrioId())) { if ("erro".equals(contract.getStartDate()) || "erro".equals(contract.getEndDate())) {
return erroValueTip(i, "行政区域"); return erroValueTip(i, "开始时间或结束时间");
} else { }
contract.setBarrioName(barrioCityMap.get(contract.getBarrioId())); if (!tradTypeMap.containsKey(contract.getTradeName())) {
} return erroValueTip(i, "行业分类");
} else {
if (!salseMap.containsKey(contract.getSaleName())) { contract.setTradeType(Integer.parseInt(tradTypeMap.get(contract.getTradeName()) + ""));
return erroValueTip(i, "签约销售"); }
} else { if (!cBodyMap.containsKey(contract.getMyBodyName())) {
contract.setSale(salseMap.get(contract.getSaleName())); return erroValueTip(i, "我方签约主体");
} } else {
contract.setMyBodyCode(cBodyMap.get(contract.getMyBodyName()));
}
if (StringUtils.isEmpty(contract.getCustomerBody())) {
return erroValueTip(i, "客户签约主体");
}
if (!barrioCityMap.containsKey(contract.getBarrioId())) {
return erroValueTip(i, "行政区域");
} else {
contract.setBarrioName(barrioCityMap.get(contract.getBarrioId()));
}
if (!salseMap.containsKey(contract.getSaleName())) {
return erroValueTip(i, "签约销售");
} else {
contract.setSale(salseMap.get(contract.getSaleName()));
}
/*if (StringUtils.isEmpty(contract.getEmail())) { /*if (StringUtils.isEmpty(contract.getEmail())) {
return erroValueTip(i, "客户主账号"); return erroValueTip(i, "客户主账号");
}*/ }*/
if (StringUtils.isEmpty(contract.getContractCode())) { if (StringUtils.isEmpty(contract.getContractCode())) {
return erroValueTip(i, "合同编号"); return erroValueTip(i, "合同编号");
} else { } else {
String[] codeArr = contract.getContractCode().split("-"); String[] codeArr = contract.getContractCode().split("-");
if (codeArr.length == 4) { if (codeArr.length == 4) {
contract.setCodeNum(Integer.parseInt(codeArr[3])); contract.setCodeNum(Integer.parseInt(codeArr[3]));
} }
} }
if (!CONTRACT_TYPE_NAME.containsKey(contract.getContractType()) && !"续签".equals(contract.getContractType())) { if (!CONTRACT_TYPE_NAME.containsKey(contract.getContractType()) && !"续签".equals(contract.getContractType())) {
return erroValueTip(i, "签约类型"); return erroValueTip(i, "签约类型");
} else { } else {
contract.setContractType(CONTRACT_TYPE_NAME.get(contract.getContractType())); contract.setContractType(CONTRACT_TYPE_NAME.get(contract.getContractType()));
if ("续签".equals(contract.getContractType())) { if ("续签".equals(contract.getContractType())) {
contract.setContractType("1"); contract.setContractType("1");
} }
} }
if (!BUSINESS_TYPE_NAME.containsKey(contract.getBusinessTypeName())) { if (!BUSINESS_TYPE_NAME.containsKey(contract.getBusinessTypeName())) {
return erroValueTip(i, "业务类型"); return erroValueTip(i, "业务类型");
} else { } else {
contract.setBusinessType(Integer.parseInt(BUSINESS_TYPE_NAME.get(contract.getBusinessTypeName()))); contract.setBusinessType(Integer.parseInt(BUSINESS_TYPE_NAME.get(contract.getBusinessTypeName())));
} }
if (!SETAGREEMENT_TYPE_NAME.containsKey(contract.getAgreementTypeName())) { if (!SETAGREEMENT_TYPE_NAME.containsKey(contract.getAgreementTypeName())) {
return erroValueTip(i, "协议类型"); return erroValueTip(i, "协议类型");
} else { } else {
contract.setAgreementType(Integer.parseInt(SETAGREEMENT_TYPE_NAME.get(contract.getAgreementTypeName()))); contract.setAgreementType(Integer.parseInt(SETAGREEMENT_TYPE_NAME.get(contract.getAgreementTypeName())));
} }
allContracts.add(contract); allContracts.add(contract);
} }
if (allContracts.isEmpty()) { if (allContracts.isEmpty()) {
return ResultModel.ERROR("上传内容为空"); return ResultModel.ERROR("上传内容为空");
} }
//allContracts.stream().map(v->v.getRelationCode()).collect(Collectors.toList()) //allContracts.stream().map(v->v.getRelationCode()).collect(Collectors.toList())
CompletableFuture.runAsync(() -> { CompletableFuture.runAsync(() -> {
StopWatch stopWatch = new StopWatch(); StopWatch stopWatch = new StopWatch();
stopWatch.start(); stopWatch.start();
ExecutorService executorService = Executors.newFixedThreadPool(35); ExecutorService executorService = Executors.newFixedThreadPool(35);
CompletableFuture[] futures = allContracts.stream() CompletableFuture[] futures = allContracts.stream()
.map(contract -> CompletableFuture.runAsync(() -> { .map(contract -> CompletableFuture.runAsync(() -> {
if (!StringUtils.isEmpty(contract.getRelationCode())) { if (!StringUtils.isEmpty(contract.getRelationCode())) {
List<Long> idList = contractRepository.findIdByCode(contract.getRelationCode()); List<Long> idList = contractRepository.findIdByCode(contract.getRelationCode());
if (!idList.isEmpty()) { if (!idList.isEmpty()) {
contract.setRelationContract(idList.get(0)); contract.setRelationContract(idList.get(0));
} else { } else {
contract.setRelationContract(-1L); contract.setRelationContract(-1L);
} }
} else { } else {
contract.setRelationContract(-1L); contract.setRelationContract(-1L);
} }
if (contract.getRelationContract() < 0) { if (contract.getRelationContract() < 0) {
contract.setRelationCode(null); contract.setRelationCode(null);
} }
//删除已经重复的记录 //删除已经重复的记录
contractRepository.deleteByCode(contract.getContractCode(), platform); contractRepository.deleteByCode(contract.getContractCode(), platform);
contract.setCreateTime(new Date()); contract.setCreateTime(new Date());
contractRepository.save(contract); contractRepository.save(contract);
}, executorService).exceptionally((t) -> null) }, executorService).exceptionally((t) -> null)
).toArray(size -> new CompletableFuture[size]); ).toArray(size -> new CompletableFuture[size]);
CompletableFuture.allOf(futures).join(); CompletableFuture.allOf(futures).join();
executorService.shutdownNow(); executorService.shutdownNow();
stopWatch.stop(); stopWatch.stop();
logger.info("{} contract upload {} line data use all {}s ", platform, allContracts.size(), stopWatch.getTotalTimeSeconds()); logger.info("{} contract upload {} line data use all {}s ", platform, allContracts.size(), stopWatch.getTotalTimeSeconds());
}); });
return ResultModel.OK(); return ResultModel.OK();
} }
private int checkSheetTitle(Workbook workbook, String platform) { private int checkSheetTitle(Workbook workbook, String platform) {
String sheetTitle = null; String sheetTitle = null;
String code = "\t"; String code = "\t";
if ("dmp".equals(platform)) { if ("dmp".equals(platform)) {
//dmp 合同 //dmp 合同
sheetTitle = "我方签约主体\t客户签约主体\t客户简称\t第三方签约主体\t行政区域\t隶属集团\t行业分类\t合同开始日期\t合同结束日期\t签约销售\t客户主账号\t合同编号\t签约类型\t业务类型\t协议类型\t合同金额\t关联合同编号"; sheetTitle = "我方签约主体\t客户签约主体\t客户简称\t第三方签约主体\t行政区域\t隶属集团\t行业分类\t合同开始日期\t合同结束日期\t签约销售\t客户主账号\t合同编号\t签约类型\t业务类型\t协议类型\t合同金额\t关联合同编号";
} else if ("dmp_income".equals(platform)) { } else if ("dmp_income".equals(platform)) {
//dmp 收入 //dmp 收入
sheetTitle = "合同编号\t收入月份\t结算周期\t系统结算\t按月结算\t税率\t确认收入"; sheetTitle = "合同编号\t收入月份\t结算周期\t系统结算\t按月结算\t税率\t确认收入";
} }
if (sheetTitle == null) { if (sheetTitle == null) {
return -1; return -1;
} }
Sheet sheet = workbook.getSheetAt(0); Sheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(0); Row row = sheet.getRow(0);
int sheLength = sheetTitle.split("\t").length; int sheLength = sheetTitle.split("\t").length;
StringBuffer titleUp = new StringBuffer(); StringBuffer titleUp = new StringBuffer();
for (int i = 0; i < sheLength; i++) { for (int i = 0; i < sheLength; i++) {
if (i > 0) titleUp.append(code); if (i > 0) titleUp.append(code);
titleUp.append(row.getCell(i)); titleUp.append(row.getCell(i));
} }
if (!titleUp.toString().equals(sheetTitle)) { if (!titleUp.toString().equals(sheetTitle)) {
return -1; return -1;
} }
//总行数 //总行数
sheLength = sheet.getLastRowNum() + 1; sheLength = sheet.getLastRowNum() + 1;
return sheLength; return sheLength;
} }
private Workbook getWorkbook(MultipartFile excelfile) { private Workbook getWorkbook(MultipartFile excelfile) {
InputStream stream = null; InputStream stream = null;
Workbook workbook = null; Workbook workbook = null;
try { try {
stream = excelfile.getInputStream(); stream = excelfile.getInputStream();
workbook = WorkbookFactory.create(stream); workbook = WorkbookFactory.create(stream);
} catch (Exception e) { } catch (Exception e) {
logger.error("", e); logger.error("", e);
} finally { } finally {
if (stream != null) { if (stream != null) {
try { try {
stream.close(); stream.close();
} catch (IOException e) { } catch (IOException e) {
logger.error("", e); logger.error("", e);
} }
} }
} }
return workbook; return workbook;
} }
private DmpIncome saveDmpIncomeItem(Sheet sheet, int index, User user) { private DmpIncome saveDmpIncomeItem(Sheet sheet, int index, User user) {
//logger.info(" line index {}", index); //logger.info(" line index {}", index);
Row rowItem = sheet.getRow(index); Row rowItem = sheet.getRow(index);
//合同编号 收入月份 结算周期 系统结算 按月结算 税率 确认收入 //合同编号 收入月份 结算周期 系统结算 按月结算 税率 确认收入
DmpIncome income = new DmpIncome(); DmpIncome income = new DmpIncome();
income.setContractCode(getCellStringValue(rowItem, 0)); income.setIndex(index);
income.setIncomeMonth(getCellDateValue(rowItem, 1, "yyyy-MM")); income.setContractCode(getCellStringValue(rowItem, 0));
income.setPeriod(getCellStringValue(rowItem, 2)); income.setIncomeMonth(getCellDateValue(rowItem, 1, "yyyy-MM"));
income.setSysSettlement(getCellStringValue(rowItem, 3)); income.setPeriod(getCellStringValue(rowItem, 2));
income.setMonthSettlement(getCellStringValue(rowItem, 4)); income.setSysSettlement(getCellStringValue(rowItem, 3));
income.setTaxRate(getCellStringValue(rowItem, 5)); income.setMonthSettlement(getCellStringValue(rowItem, 4));
income.setConfirmSettlement(getCellStringValue(rowItem, 6)); income.setTaxRate(getCellStringValue(rowItem, 5));
// 时间 上传人 income.setConfirmSettlement(getCellStringValue(rowItem, 6));
income.setCreateTime(new Date()); // 时间 上传人
income.setUploadUser(user.getName()); income.setCreateTime(new Date());
if (StringUtils.isEmpty(income.getContractCode())) { income.setUploadUser(user.getName());
return null; if (StringUtils.isEmpty(income.getContractCode())) {
} return null;
Double drate = StringUtils.isEmpty(income.getTaxRate()) ? 0 : Double.parseDouble(income.getTaxRate()); }
drate = new BigDecimal(drate * 100).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); Double drate = StringUtils.isEmpty(income.getTaxRate()) ? 0 : Double.parseDouble(income.getTaxRate());
income.setTaxRate(drate + "%"); drate = new BigDecimal(drate * 100).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
if (StringUtils.isEmpty(income.getSysSettlement())) { income.setTaxRate(drate + "%");
income.setSysSettlement("0"); if (StringUtils.isEmpty(income.getSysSettlement())) {
} income.setSysSettlement("0");
DmpIncome one = dmpIncomeRepository.findByCodeMonth(income.getContractCode(), income.getIncomeMonth()); }
if (one != null) {
// 同一合同同一月份不重复保存 return income;
return null;
} }
return income;
private String getCellDateValue(Row row, int index) {
} return getCellDateValue(row, index, null);
}
private String getCellDateValue(Row row, int index) {
return getCellDateValue(row, index, null); private String getCellDateValue(Row row, int index, String fm) {
} Cell cell = row.getCell(index);
if (cell == null) {
private String getCellDateValue(Row row, int index, String fm) { return "erro";
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) && !"yyyy\"年\"m\"月\";@".equals(dfmate)) {
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) && !"yyyy\"年\"m\"月\";@".equals(dfmate)) {
return "erro"; if (fm == null) {
} fm = "yyyy-MM-dd";
}
if (fm == null) {
fm = "yyyy-MM-dd"; if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {
} // 用于转化为日期格式
Date d = cell.getDateCellValue();
if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) { DateFormat formater = new SimpleDateFormat(fm);
// 用于转化为日期格式 return formater.format(d);
Date d = cell.getDateCellValue(); }
DateFormat formater = new SimpleDateFormat(fm); return cell.toString();
return formater.format(d); }
}
return cell.toString(); private String getCellStringValue(Row row, int index) {
} Cell cell = row.getCell(index);
return cell == null ? "" : cell.toString().trim();
private String getCellStringValue(Row row, int index) { }
Cell cell = row.getCell(index);
return cell == null ? "" : cell.toString().trim(); private String getCellStringValue(Row row, int index, String defaulValue) {
} Cell cell = row.getCell(index);
return cell == null ? defaulValue : cell.toString();
private String getCellStringValue(Row row, int index, String defaulValue) { }
Cell cell = row.getCell(index);
return cell == null ? defaulValue : cell.toString(); private void fillDataByRow(Contract contract, Row rowItem) {
} //我方签约主体 客户签约主体 客户简称
contract.setMyBodyName(getCellStringValue(rowItem, 0));
private void fillDataByRow(Contract contract, Row rowItem) { contract.setCustomerBody(getCellStringValue(rowItem, 1));
//我方签约主体 客户签约主体 客户简称 contract.setCustomerShort(getCellStringValue(rowItem, 2));
contract.setMyBodyName(getCellStringValue(rowItem, 0)); // 第三方签约主体 行政区域 隶属集团 行业分类
contract.setCustomerBody(getCellStringValue(rowItem, 1)); contract.setCustomerThird(getCellStringValue(rowItem, 3));
contract.setCustomerShort(getCellStringValue(rowItem, 2)); contract.setBarrioId(new BigDecimal(getCellStringValue(rowItem, 4, "0")).longValue());
// 第三方签约主体 行政区域 隶属集团 行业分类 contract.setBelongGroup(getCellStringValue(rowItem, 5));
contract.setCustomerThird(getCellStringValue(rowItem, 3)); contract.setTradeName(getCellStringValue(rowItem, 6));
contract.setBarrioId(new BigDecimal(getCellStringValue(rowItem, 4, "0")).longValue()); // 合同开始日期 合同结束日期 签约销售 客户主账号
contract.setBelongGroup(getCellStringValue(rowItem, 5)); contract.setStartDate(getCellDateValue(rowItem, 7));
contract.setTradeName(getCellStringValue(rowItem, 6)); contract.setEndDate(getCellDateValue(rowItem, 8));
// 合同开始日期 合同结束日期 签约销售 客户主账号 contract.setSaleName(getCellStringValue(rowItem, 9));
contract.setStartDate(getCellDateValue(rowItem, 7)); contract.setEmail(getCellStringValue(rowItem, 10));
contract.setEndDate(getCellDateValue(rowItem, 8)); // 合同编号 签约类型 业务类型 协议类型 合同金额 关联合同编号
contract.setSaleName(getCellStringValue(rowItem, 9)); contract.setContractCode(getCellStringValue(rowItem, 11));
contract.setEmail(getCellStringValue(rowItem, 10)); contract.setContractType(getCellStringValue(rowItem, 12));
// 合同编号 签约类型 业务类型 协议类型 合同金额 关联合同编号 contract.setBusinessTypeName(getCellStringValue(rowItem, 13));
contract.setContractCode(getCellStringValue(rowItem, 11)); contract.setAgreementTypeName(getCellStringValue(rowItem, 14));
contract.setContractType(getCellStringValue(rowItem, 12)); String money = getCellStringValue(rowItem, 15, "0");
contract.setBusinessTypeName(getCellStringValue(rowItem, 13)); if (money == null || StringUtils.isEmpty(money.trim())) {
contract.setAgreementTypeName(getCellStringValue(rowItem, 14)); money = "0";
String money = getCellStringValue(rowItem, 15, "0"); }
if (money == null || StringUtils.isEmpty(money.trim())) { contract.setMoney(Double.parseDouble(money));
money = "0"; contract.setRelationCode(getCellStringValue(rowItem, 16));
} }
contract.setMoney(Double.parseDouble(money));
contract.setRelationCode(getCellStringValue(rowItem, 16)); private ResultModel erroValueTip(int line, String title) {
} return ResultModel.ERROR("第" + line + "行,[" + title + "]错误");
}
private ResultModel erroValueTip(int line, String title) {
return ResultModel.ERROR("第" + line + "行,[" + title + "]错误");
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment