diff --git a/src/main/java/common/controller/DmpIncomeController.java b/src/main/java/common/controller/DmpIncomeController.java
index 9110ea7..1fc192d 100644
--- a/src/main/java/common/controller/DmpIncomeController.java
+++ b/src/main/java/common/controller/DmpIncomeController.java
@@ -38,9 +38,9 @@ public class DmpIncomeController {
     }
 
     @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));
     }
 
 
diff --git a/src/main/java/common/model/DmpIncome.java b/src/main/java/common/model/DmpIncome.java
index 4478ded..e64547d 100644
--- a/src/main/java/common/model/DmpIncome.java
+++ b/src/main/java/common/model/DmpIncome.java
@@ -9,159 +9,169 @@ import java.util.Date;
 @Entity
 public class DmpIncome {
 
-    private Long id;// ID
-    private String contractCode;//合同编号
-    private String incomeMonth;//收入月份
-    private String period;//结算周期
-    private String sysSettlement;//系统结算
-    private String monthSettlement;//按月结算
-    private String confirmSettlement;//确认结算
-    private String taxRate;//税率
-    private Date createTime;
-    private Date modifyTime;
-    private String uploadUser;
-
-    //contract_code, my_body_name, customer_body, customer_short, business_type, agreement_type
-
-    private String myBodyName,
-            customerBody,
-            customerShort,
-            businessType,
-            agreementType;
-
-
-    @Id
-    @GeneratedValue
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public String getContractCode() {
-        return contractCode;
-    }
-
-    public void setContractCode(String contractCode) {
-        this.contractCode = contractCode;
-    }
-
-    public String getIncomeMonth() {
-        return incomeMonth;
-    }
-
-    public void setIncomeMonth(String incomeMonth) {
-        this.incomeMonth = incomeMonth;
-    }
-
-    public String getPeriod() {
-        return period;
-    }
-
-    public void setPeriod(String period) {
-        this.period = period;
-    }
-
-    public String getSysSettlement() {
-        return sysSettlement;
-    }
-
-    public void setSysSettlement(String sysSettlement) {
-        this.sysSettlement = sysSettlement;
-    }
-
-    public String getMonthSettlement() {
-        return monthSettlement;
-    }
-
-    public void setMonthSettlement(String monthSettlement) {
-        this.monthSettlement = monthSettlement;
-    }
-
-    public String getConfirmSettlement() {
-        return confirmSettlement;
-    }
-
-    public void setConfirmSettlement(String confirmSettlement) {
-        this.confirmSettlement = confirmSettlement;
-    }
-
-    public String getTaxRate() {
-        return taxRate;
-    }
-
-    public void setTaxRate(String taxRate) {
-        this.taxRate = taxRate;
-    }
-
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-
-    public Date getModifyTime() {
-        return modifyTime;
-    }
-
-    public void setModifyTime(Date modifyTime) {
-        this.modifyTime = modifyTime;
-    }
-
-    public String getUploadUser() {
-        return uploadUser;
-    }
-
-    public void setUploadUser(String uploadUser) {
-        this.uploadUser = uploadUser;
-    }
-
-    @Transient
-    public String getMyBodyName() {
-        return myBodyName;
-    }
-
-    public void setMyBodyName(String myBodyName) {
-        this.myBodyName = myBodyName;
-    }
-
-    @Transient
-    public String getCustomerBody() {
-        return customerBody;
-    }
-
-    public void setCustomerBody(String customerBody) {
-        this.customerBody = customerBody;
-    }
-
-    @Transient
-    public String getCustomerShort() {
-        return customerShort;
-    }
-
-    public void setCustomerShort(String customerShort) {
-        this.customerShort = customerShort;
-    }
-
-    @Transient
-    public String getBusinessType() {
-        return businessType;
-    }
-
-    public void setBusinessType(String businessType) {
-        this.businessType = businessType;
-    }
-
-    @Transient
-    public String getAgreementType() {
-        return agreementType;
-    }
-
-    public void setAgreementType(String agreementType) {
-        this.agreementType = agreementType;
-    }
+	private Long id;// ID
+	private String contractCode;//合同编号
+	private String incomeMonth;//收入月份
+	private String period;//结算周期
+	private String sysSettlement;//系统结算
+	private String monthSettlement;//按月结算
+	private String confirmSettlement;//确认结算
+	private String taxRate;//税率
+	private Date createTime;
+	private Date modifyTime;
+	private String uploadUser;
+	private int index;
+
+	//contract_code, my_body_name, customer_body, customer_short, business_type, agreement_type
+
+	private String myBodyName,
+			customerBody,
+			customerShort,
+			businessType,
+			agreementType;
+
+
+	@Id
+	@GeneratedValue
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getContractCode() {
+		return contractCode;
+	}
+
+	public void setContractCode(String contractCode) {
+		this.contractCode = contractCode;
+	}
+
+	public String getIncomeMonth() {
+		return incomeMonth;
+	}
+
+	public void setIncomeMonth(String incomeMonth) {
+		this.incomeMonth = incomeMonth;
+	}
+
+	public String getPeriod() {
+		return period;
+	}
+
+	public void setPeriod(String period) {
+		this.period = period;
+	}
+
+	public String getSysSettlement() {
+		return sysSettlement;
+	}
+
+	public void setSysSettlement(String sysSettlement) {
+		this.sysSettlement = sysSettlement;
+	}
+
+	public String getMonthSettlement() {
+		return monthSettlement;
+	}
+
+	public void setMonthSettlement(String monthSettlement) {
+		this.monthSettlement = monthSettlement;
+	}
+
+	public String getConfirmSettlement() {
+		return confirmSettlement;
+	}
+
+	public void setConfirmSettlement(String confirmSettlement) {
+		this.confirmSettlement = confirmSettlement;
+	}
+
+	public String getTaxRate() {
+		return taxRate;
+	}
+
+	public void setTaxRate(String taxRate) {
+		this.taxRate = taxRate;
+	}
+
+	public Date getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public Date getModifyTime() {
+		return modifyTime;
+	}
+
+	public void setModifyTime(Date modifyTime) {
+		this.modifyTime = modifyTime;
+	}
+
+	public String getUploadUser() {
+		return uploadUser;
+	}
+
+	public void setUploadUser(String uploadUser) {
+		this.uploadUser = uploadUser;
+	}
+
+	@Transient
+	public String getMyBodyName() {
+		return myBodyName;
+	}
+
+	public void setMyBodyName(String myBodyName) {
+		this.myBodyName = myBodyName;
+	}
+
+	@Transient
+	public String getCustomerBody() {
+		return customerBody;
+	}
+
+	public void setCustomerBody(String customerBody) {
+		this.customerBody = customerBody;
+	}
+
+	@Transient
+	public String getCustomerShort() {
+		return customerShort;
+	}
+
+	public void setCustomerShort(String customerShort) {
+		this.customerShort = customerShort;
+	}
+
+	@Transient
+	public String getBusinessType() {
+		return businessType;
+	}
+
+	public void setBusinessType(String businessType) {
+		this.businessType = businessType;
+	}
+
+	@Transient
+	public String getAgreementType() {
+		return agreementType;
+	}
+
+	public void setAgreementType(String agreementType) {
+		this.agreementType = agreementType;
+	}
+
+	@Transient
+	public int getIndex() {
+		return index;
+	}
+
+	public void setIndex(int index) {
+		this.index = index;
+	}
 }
diff --git a/src/main/java/common/repository/DmpIncomeRepository.java b/src/main/java/common/repository/DmpIncomeRepository.java
index e055471..245a856 100644
--- a/src/main/java/common/repository/DmpIncomeRepository.java
+++ b/src/main/java/common/repository/DmpIncomeRepository.java
@@ -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)
     DmpIncome findByCodeMonth(String contractCode, String incomeMonth);
+
 }
diff --git a/src/main/java/common/service/DmpIncomeService.java b/src/main/java/common/service/DmpIncomeService.java
index 071dda2..85ceca2 100644
--- a/src/main/java/common/service/DmpIncomeService.java
+++ b/src/main/java/common/service/DmpIncomeService.java
@@ -10,17 +10,17 @@ import java.util.List;
 
 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);
 }
diff --git a/src/main/java/common/service/impl/DmpIncomeServiceImpl.java b/src/main/java/common/service/impl/DmpIncomeServiceImpl.java
index 5139938..04aaab1 100644
--- a/src/main/java/common/service/impl/DmpIncomeServiceImpl.java
+++ b/src/main/java/common/service/impl/DmpIncomeServiceImpl.java
@@ -34,530 +34,545 @@ import java.util.stream.Stream;
 @Service
 public class DmpIncomeServiceImpl implements DmpIncomeService {
 
-    Logger logger = LoggerFactory.getLogger(DmpIncomeServiceImpl.class);
-
-    @Autowired
-    DmpIncomeRepository dmpIncomeRepository;
-
-    @Autowired
-    ContractRepository contractRepository;
-
-    @Autowired
-    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");
-        BUSINESS_TYPE_NAME.put("前置机", "3");
-        SETAGREEMENT_TYPE_NAME.put("普通协议", "1");//协议类型 1 普通协议 2 框架协议
-        SETAGREEMENT_TYPE_NAME.put("框架协议", "2");
-    }
-
-
-    @Override
-    public List<DmpIncome> listByCode(String contractCode) {
-        List<DmpIncome> dmpIncomes = dmpIncomeRepository.findByContractCode(contractCode);
-        return dmpIncomes;
-    }
-
-    @Override
-    public List<DmpIncome> listByDs(String start, String end) {
-        List<DmpIncome> dmpIncomes = dmpIncomeRepository.findByContractDs(start, end);
-        if (dmpIncomes.isEmpty()) {
-            return dmpIncomes;
-        }
-        List<String> codes = dmpIncomes.stream().map(v -> v.getContractCode()).collect(Collectors.toList());
-        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, String> cBodyMap = contractBodyRepository.findAllDis()
-                .stream().collect(Collectors.toMap(ContractBody::getCode, ContractBody::getName, (v1, v2) -> v1));
-        for (DmpIncome dmpIncome : dmpIncomes) {
-            Object[] nameItem = names.get(dmpIncome.getContractCode());
-            //my_body_name, customer_body, customer_short, business_type, agreement_type
-            if (nameItem != null) {
-                dmpIncome.setMyBodyName(nameItem[2] + "");
-                dmpIncome.setCustomerBody(nameItem[3] + "");
-                dmpIncome.setCustomerShort(nameItem[4] + "");
-                dmpIncome.setBusinessType(nameItem[5] + "");
-                dmpIncome.setAgreementType(nameItem[6] + "");
-                if (StringUtils.isEmpty(dmpIncome.getMyBodyName()) || dmpIncome.getMyBodyName().equals("null")) {
-                    dmpIncome.setMyBodyName(cBodyMap.get(nameItem[1]));
-                }
-            }
-        }
-        return dmpIncomes;
-    }
-
-    @Override
-    public HSSFWorkbook exportIncomeList(String startDate, String endDate, String bodyCode, String serchName) {
-        List<DmpIncome> dmpIncomes = this.listByDs(startDate, endDate);
-        dmpIncomes = dmpIncomes.stream()
-                .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)))
-                .collect(Collectors.toList());
-
-        DecimalFormat df = new DecimalFormat("##,##0.00");
-        //创建工作薄对象
-        HSSFWorkbook workbook = new HSSFWorkbook();//这里也可以设置sheet的Name
-        //创建工作表对象
-        HSSFSheet sheet = workbook.createSheet();
-        //创建工作表的行
-        HSSFRow row = sheet.createRow(0);
-
-        //表头
-        String[] title = "我方签约主体,收入月份,签约方,客户简称,合同编号,业务类型,结算周期,系统结算,按月结算,税率,确认收入".split(",");
-        for (int i = 0; i < title.length; i++) {
-            row.createCell(i).setCellValue(title[i]);
-        }
-
-        String[] bussinesName = new String[]{"", "VIP", "共管", "前置机"};
-        for (int j = 0; j < dmpIncomes.size(); j++) {
-            HSSFRow rowBody = sheet.createRow(j + 1);
-            DmpIncome income = dmpIncomes.get(j);
-            String bussinesTypeName = income.getBusinessType() == null ? "" : bussinesName[Integer.parseInt(income.getBusinessType())];
-            String[] dataItem = new String[]{
-                    income.getMyBodyName(), income.getIncomeMonth(), income.getCustomerBody(),
-                    income.getCustomerShort(), income.getContractCode(), bussinesTypeName,
-                    income.getPeriod(), income.getSysSettlement(), income.getMonthSettlement(),
-                    income.getTaxRate(), income.getConfirmSettlement()
-            };
-
-            for (int w = 0; w < dataItem.length; w++) {
-                rowBody.createCell(w).setCellValue(dataItem[w]);
-            }
-        }
-        return workbook;
-    }
-
-    @Override
-    public DmpIncome update(DmpIncome dmpIncome) {
-
-        if (dmpIncome.getId() == null) {
-            return null;
-        }
-
-        DmpIncome dbItem = dmpIncomeRepository.findOne(dmpIncome.getId());
-        dbItem.setIncomeMonth(dmpIncome.getIncomeMonth());
-        dbItem.setPeriod(dmpIncome.getPeriod());
-        dbItem.setSysSettlement(dmpIncome.getSysSettlement());
-        dbItem.setMonthSettlement(dmpIncome.getMonthSettlement());
-        dbItem.setTaxRate(dmpIncome.getTaxRate());
-        dbItem.setConfirmSettlement(dmpIncome.getConfirmSettlement());
-        dmpIncomeRepository.save(dbItem);
-        return dbItem;
-    }
-
-    @Override
-    public Long delete(Long id) {
-        if (id == null) {
-            return null;
-        }
-        dmpIncomeRepository.delete(id);
-        return id;
-    }
-
-    @Override
-    public ResultModel uploadFile(MultipartFile file, String platform, User loginAccount) {
-
-        Workbook workbook = getWorkbook(file);
-        if (workbook == null) {
-            return ResultModel.ERROR("获取上传文件错误");
-        }
-        int rowNumber = checkSheetTitle(workbook, platform + "_income");
-        if (rowNumber == -1) {
-            return ResultModel.ERROR("模板表头错误");
-        } else if (rowNumber <= 1) {
-            return ResultModel.ERROR("文件为空");
-        }
-
-        Sheet sheet = workbook.getSheetAt(0);
-        DecimalFormat df = new DecimalFormat("##,##0.00");
-        StringBuffer erroMessage = new StringBuffer();
-        StopWatch stopWatch = new StopWatch();
-        stopWatch.start();
-        ExecutorService executorService = Executors.newFixedThreadPool(30);
-        CompletableFuture[] futures = Stream.iterate(1, n -> n + 1).limit(rowNumber - 1).map(index ->
-                CompletableFuture.runAsync(
-                        () -> {
-                            DmpIncome income = saveDmpIncomeItem(sheet, index, loginAccount);
-
-                            if (income != null) {
-                                if ("erro".equals(income.getIncomeMonth())) {
-                                    erroMessage.append(index).append(" 行 收入月份错误").append(";\n");
-                                } else {
-                                    income.setConfirmSettlement(new BigDecimal(income.getConfirmSettlement()).setScale(2, BigDecimal.ROUND_HALF_UP).toString());
-                                    dmpIncomeRepository.save(income);
-                                }
-                            }
-                        }, executorService)
-                        .exceptionally((t) -> {
-                            erroMessage.append(index).append(" 行 错误").append(t.getMessage()).append(";\n");
-                            logger.error("the line " + index, t);
-                            return null;
-                        })
-        ).toArray(size -> new CompletableFuture[size]);
-        CompletableFuture.allOf(futures).join();
-        executorService.shutdownNow();
-        stopWatch.stop();
-        logger.info("dmp income upload {} line data  use all {}s ", rowNumber - 1, stopWatch.getTotalTimeSeconds());
-        if (erroMessage.length() > 0) {
-            return ResultModel.ERROR(erroMessage.toString());
-        }
-        return ResultModel.OK();
-    }
-
-    @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, platform);
-        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<Long, String> barrioCityMap = barrioCityRepository.findAll()
-                .stream().collect(Collectors.toMap(BarrioCity::getId, BarrioCity::getName));
-        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.setDs(DateTime.now().toString("yyyy-MM-dd"));
-
-            String sysErro = null;
-            try {
-                //填充数据
-                fillDataByRow(contract, rowItem);
-            } catch (Exception e) {
-                logger.error("the line " + i, e);
-                sysErro = e.getMessage();
-            }
-
-            if (sysErro != null) {
-                return erroValueTip(i, sysErro);
-            }
-
-            //校验数据有效性
-            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.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()));
-            }
+	Logger logger = LoggerFactory.getLogger(DmpIncomeServiceImpl.class);
+
+	@Autowired
+	DmpIncomeRepository dmpIncomeRepository;
+
+	@Autowired
+	ContractRepository contractRepository;
+
+	@Autowired
+	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");
+		BUSINESS_TYPE_NAME.put("前置机", "3");
+		SETAGREEMENT_TYPE_NAME.put("普通协议", "1");//协议类型 1 普通协议 2 框架协议
+		SETAGREEMENT_TYPE_NAME.put("框架协议", "2");
+	}
+
+
+	@Override
+	public List<DmpIncome> listByCode(String contractCode) {
+		List<DmpIncome> dmpIncomes = dmpIncomeRepository.findByContractCode(contractCode);
+		return dmpIncomes;
+	}
+
+	@Override
+	public List<DmpIncome> listByDs(String start, String end) {
+		List<DmpIncome> dmpIncomes = dmpIncomeRepository.findByContractDs(start, end);
+		if (dmpIncomes.isEmpty()) {
+			return dmpIncomes;
+		}
+		List<String> codes = dmpIncomes.stream().map(v -> v.getContractCode()).collect(Collectors.toList());
+		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, String> cBodyMap = contractBodyRepository.findAllDis()
+				.stream().collect(Collectors.toMap(ContractBody::getCode, ContractBody::getName, (v1, v2) -> v1));
+		for (DmpIncome dmpIncome : dmpIncomes) {
+			Object[] nameItem = names.get(dmpIncome.getContractCode());
+			//my_body_name, customer_body, customer_short, business_type, agreement_type
+			if (nameItem != null) {
+				dmpIncome.setMyBodyName(nameItem[2] + "");
+				dmpIncome.setCustomerBody(nameItem[3] + "");
+				dmpIncome.setCustomerShort(nameItem[4] + "");
+				dmpIncome.setBusinessType(nameItem[5] + "");
+				dmpIncome.setAgreementType(nameItem[6] + "");
+				if (StringUtils.isEmpty(dmpIncome.getMyBodyName()) || dmpIncome.getMyBodyName().equals("null")) {
+					dmpIncome.setMyBodyName(cBodyMap.get(nameItem[1]));
+				}
+			}
+		}
+		return dmpIncomes;
+	}
+
+	@Override
+	public HSSFWorkbook exportIncomeList(String startDate, String endDate, String bodyCode, String serchName) {
+		List<DmpIncome> dmpIncomes = this.listByDs(startDate, endDate);
+		dmpIncomes = dmpIncomes.stream()
+				.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)))
+				.collect(Collectors.toList());
+
+		DecimalFormat df = new DecimalFormat("##,##0.00");
+		//创建工作薄对象
+		HSSFWorkbook workbook = new HSSFWorkbook();//这里也可以设置sheet的Name
+		//创建工作表对象
+		HSSFSheet sheet = workbook.createSheet();
+		//创建工作表的行
+		HSSFRow row = sheet.createRow(0);
+
+		//表头
+		String[] title = "我方签约主体,收入月份,签约方,客户简称,合同编号,业务类型,结算周期,系统结算,按月结算,税率,确认收入".split(",");
+		for (int i = 0; i < title.length; i++) {
+			row.createCell(i).setCellValue(title[i]);
+		}
+
+		String[] bussinesName = new String[]{"", "VIP", "共管", "前置机"};
+		for (int j = 0; j < dmpIncomes.size(); j++) {
+			HSSFRow rowBody = sheet.createRow(j + 1);
+			DmpIncome income = dmpIncomes.get(j);
+			String bussinesTypeName = income.getBusinessType() == null ? "" : bussinesName[Integer.parseInt(income.getBusinessType())];
+			String[] dataItem = new String[]{
+					income.getMyBodyName(), income.getIncomeMonth(), income.getCustomerBody(),
+					income.getCustomerShort(), income.getContractCode(), bussinesTypeName,
+					income.getPeriod(), income.getSysSettlement(), income.getMonthSettlement(),
+					income.getTaxRate(), income.getConfirmSettlement()
+			};
+
+			for (int w = 0; w < dataItem.length; w++) {
+				rowBody.createCell(w).setCellValue(dataItem[w]);
+			}
+		}
+		return workbook;
+	}
+
+	@Override
+	public DmpIncome update(DmpIncome dmpIncome) {
+
+		if (dmpIncome.getId() == null) {
+			return null;
+		}
+
+		DmpIncome dbItem = dmpIncomeRepository.findOne(dmpIncome.getId());
+		dbItem.setIncomeMonth(dmpIncome.getIncomeMonth());
+		dbItem.setPeriod(dmpIncome.getPeriod());
+		dbItem.setSysSettlement(dmpIncome.getSysSettlement());
+		dbItem.setMonthSettlement(dmpIncome.getMonthSettlement());
+		dbItem.setTaxRate(dmpIncome.getTaxRate());
+		dbItem.setConfirmSettlement(dmpIncome.getConfirmSettlement());
+		dmpIncomeRepository.save(dbItem);
+		return dbItem;
+	}
+
+	@Override
+	public Long delete(DmpIncome dmpIncome) {
+		if (dmpIncome.getId() == null) {
+			return null;
+		}
+		dmpIncomeRepository.delete(dmpIncome.getId());
+		return dmpIncome.getId();
+	}
+
+	@Override
+	public ResultModel uploadFile(MultipartFile file, String platform, User loginAccount) {
+
+		Workbook workbook = getWorkbook(file);
+		if (workbook == null) {
+			return ResultModel.ERROR("获取上传文件错误");
+		}
+		int rowNumber = checkSheetTitle(workbook, platform + "_income");
+		if (rowNumber == -1) {
+			return ResultModel.ERROR("模板表头错误");
+		} else if (rowNumber <= 1) {
+			return ResultModel.ERROR("文件为空");
+		}
+
+		Sheet sheet = workbook.getSheetAt(0);
+		DecimalFormat df = new DecimalFormat("##,##0.00");
+		StringBuffer erroMessage = new StringBuffer();
+		StopWatch stopWatch = new StopWatch();
+		stopWatch.start();
+		Map<String, String> incomeMap = new HashMap<>();
+		List<DmpIncome> dmpIncomeList = Stream.iterate(1, n -> n + 1).limit(rowNumber - 1).map(index -> {
+			DmpIncome income = saveDmpIncomeItem(sheet, index, loginAccount);
+			String key = income.getIncomeMonth() + income.getContractCode();
+			if (incomeMap.containsKey(key)) {
+				return null;
+			}
+			incomeMap.put(key, "1");
+			return income;
+		}).filter(in -> in != null).collect(Collectors.toList());
+
+		if (dmpIncomeList.isEmpty()) {
+			return ResultModel.OK();
+		}
+		ExecutorService executorService = Executors.newFixedThreadPool(30);
+		final int[] indexLine = {0};
+		CompletableFuture[] futures = dmpIncomeList.stream().map(income ->
+				CompletableFuture.runAsync(
+						() -> {
+
+							DmpIncome one = dmpIncomeRepository.findByCodeMonth(income.getContractCode(), income.getIncomeMonth());
+							if (one != null) {
+								// 同一合同同一月份不重复保存
+								return;
+							}
+							indexLine[0] = income.getIndex();
+							if ("erro".equals(income.getIncomeMonth())) {
+								erroMessage.append(income.getIndex()).append(" 行 收入月份错误").append(";\n");
+							} else {
+								income.setConfirmSettlement(new BigDecimal(income.getConfirmSettlement()).setScale(2, BigDecimal.ROUND_HALF_UP).toString());
+								dmpIncomeRepository.save(income);
+							}
+						}, executorService)
+						.exceptionally((t) -> {
+							erroMessage.append(indexLine[0]).append(" 行 错误").append(t.getMessage()).append(";\n");
+							logger.error("the line " + indexLine[0], t);
+							return null;
+						})
+		).toArray(size -> new CompletableFuture[size]);
+		CompletableFuture.allOf(futures).join();
+		executorService.shutdownNow();
+		stopWatch.stop();
+		logger.info("dmp income upload {} line data  use all {}s ", rowNumber - 1, stopWatch.getTotalTimeSeconds());
+		if (erroMessage.length() > 0) {
+			return ResultModel.ERROR(erroMessage.toString());
+		}
+		return ResultModel.OK();
+	}
+
+	@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, platform);
+		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<Long, String> barrioCityMap = barrioCityRepository.findAll()
+				.stream().collect(Collectors.toMap(BarrioCity::getId, BarrioCity::getName));
+		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.setDs(DateTime.now().toString("yyyy-MM-dd"));
+
+			String sysErro = null;
+			try {
+				//填充数据
+				fillDataByRow(contract, rowItem);
+			} catch (Exception e) {
+				logger.error("the line " + i, e);
+				sysErro = e.getMessage();
+			}
+
+			if (sysErro != null) {
+				return erroValueTip(i, sysErro);
+			}
+
+			//校验数据有效性
+			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.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())) {
                 return erroValueTip(i, "客户主账号");
             }*/
 
-            if (StringUtils.isEmpty(contract.getContractCode())) {
-                return erroValueTip(i, "合同编号");
-            } else {
-                String[] codeArr = contract.getContractCode().split("-");
-                if (codeArr.length == 4) {
-                    contract.setCodeNum(Integer.parseInt(codeArr[3]));
-                }
-            }
-
-            if (!CONTRACT_TYPE_NAME.containsKey(contract.getContractType()) && !"续签".equals(contract.getContractType())) {
-                return erroValueTip(i, "签约类型");
-            } else {
-                contract.setContractType(CONTRACT_TYPE_NAME.get(contract.getContractType()));
-                if ("续签".equals(contract.getContractType())) {
-                    contract.setContractType("1");
-                }
-            }
-
-            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("上传内容为空");
-        }
-
-        //allContracts.stream().map(v->v.getRelationCode()).collect(Collectors.toList())
-
-        CompletableFuture.runAsync(() -> {
-            StopWatch stopWatch = new StopWatch();
-            stopWatch.start();
-            ExecutorService executorService = Executors.newFixedThreadPool(35);
-            CompletableFuture[] futures = allContracts.stream()
-                    .map(contract -> CompletableFuture.runAsync(() -> {
-                                if (!StringUtils.isEmpty(contract.getRelationCode())) {
-                                    List<Long> idList = contractRepository.findIdByCode(contract.getRelationCode());
-                                    if (!idList.isEmpty()) {
-                                        contract.setRelationContract(idList.get(0));
-                                    } else {
-                                        contract.setRelationContract(-1L);
-                                    }
-                                } else {
-                                    contract.setRelationContract(-1L);
-                                }
-                                if (contract.getRelationContract() < 0) {
-                                    contract.setRelationCode(null);
-                                }
-
-                                //删除已经重复的记录
-                                contractRepository.deleteByCode(contract.getContractCode(), platform);
-                                contract.setCreateTime(new Date());
-                                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 int checkSheetTitle(Workbook workbook, String platform) {
-        String sheetTitle = null;
-        String code = "\t";
-        if ("dmp".equals(platform)) {
-            //dmp 合同
-            sheetTitle = "我方签约主体\t客户签约主体\t客户简称\t第三方签约主体\t行政区域\t隶属集团\t行业分类\t合同开始日期\t合同结束日期\t签约销售\t客户主账号\t合同编号\t签约类型\t业务类型\t协议类型\t合同金额\t关联合同编号";
-        } else if ("dmp_income".equals(platform)) {
-            //dmp 收入
-            sheetTitle = "合同编号\t收入月份\t结算周期\t系统结算\t按月结算\t税率\t确认收入";
-        }
-        if (sheetTitle == null) {
-            return -1;
-        }
-
-        Sheet sheet = workbook.getSheetAt(0);
-        Row row = sheet.getRow(0);
-        int sheLength = sheetTitle.split("\t").length;
-        StringBuffer titleUp = new StringBuffer();
-        for (int i = 0; i < sheLength; i++) {
-            if (i > 0) titleUp.append(code);
-            titleUp.append(row.getCell(i));
-        }
-        if (!titleUp.toString().equals(sheetTitle)) {
-            return -1;
-        }
-
-        //总行数
-        sheLength = sheet.getLastRowNum() + 1;
-        return sheLength;
-    }
-
-    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);
-        //合同编号	收入月份	结算周期	系统结算	按月结算	税率	确认收入
-        DmpIncome income = new DmpIncome();
-        income.setContractCode(getCellStringValue(rowItem, 0));
-        income.setIncomeMonth(getCellDateValue(rowItem, 1, "yyyy-MM"));
-        income.setPeriod(getCellStringValue(rowItem, 2));
-        income.setSysSettlement(getCellStringValue(rowItem, 3));
-        income.setMonthSettlement(getCellStringValue(rowItem, 4));
-        income.setTaxRate(getCellStringValue(rowItem, 5));
-        income.setConfirmSettlement(getCellStringValue(rowItem, 6));
-        // 时间 上传人
-        income.setCreateTime(new Date());
-        income.setUploadUser(user.getName());
-        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();
-        income.setTaxRate(drate + "%");
-        if (StringUtils.isEmpty(income.getSysSettlement())) {
-            income.setSysSettlement("0");
-        }
-        DmpIncome one = dmpIncomeRepository.findByCodeMonth(income.getContractCode(), income.getIncomeMonth());
-        if (one != null) {
-            // 同一合同同一月份不重复保存
-            return null;
-        }
-        return income;
-
-    }
-
-    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) {
-            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 (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {
-            // 用于转化为日期格式
-            Date d = cell.getDateCellValue();
-            DateFormat formater = new SimpleDateFormat(fm);
-            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, 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));
-        contract.setCustomerBody(getCellStringValue(rowItem, 1));
-        contract.setCustomerShort(getCellStringValue(rowItem, 2));
-        // 第三方签约主体	行政区域	隶属集团	行业分类
-        contract.setCustomerThird(getCellStringValue(rowItem, 3));
-        contract.setBarrioId(new BigDecimal(getCellStringValue(rowItem, 4, "0")).longValue());
-        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));
-        String money = getCellStringValue(rowItem, 15, "0");
-        if (money == null || StringUtils.isEmpty(money.trim())) {
-            money = "0";
-        }
-        contract.setMoney(Double.parseDouble(money));
-        contract.setRelationCode(getCellStringValue(rowItem, 16));
-    }
-
-    private ResultModel erroValueTip(int line, String title) {
-        return ResultModel.ERROR("第" + line + "行,[" + title + "]错误");
-    }
+			if (StringUtils.isEmpty(contract.getContractCode())) {
+				return erroValueTip(i, "合同编号");
+			} else {
+				String[] codeArr = contract.getContractCode().split("-");
+				if (codeArr.length == 4) {
+					contract.setCodeNum(Integer.parseInt(codeArr[3]));
+				}
+			}
+
+			if (!CONTRACT_TYPE_NAME.containsKey(contract.getContractType()) && !"续签".equals(contract.getContractType())) {
+				return erroValueTip(i, "签约类型");
+			} else {
+				contract.setContractType(CONTRACT_TYPE_NAME.get(contract.getContractType()));
+				if ("续签".equals(contract.getContractType())) {
+					contract.setContractType("1");
+				}
+			}
+
+			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("上传内容为空");
+		}
+
+		//allContracts.stream().map(v->v.getRelationCode()).collect(Collectors.toList())
+
+		CompletableFuture.runAsync(() -> {
+			StopWatch stopWatch = new StopWatch();
+			stopWatch.start();
+			ExecutorService executorService = Executors.newFixedThreadPool(35);
+			CompletableFuture[] futures = allContracts.stream()
+					.map(contract -> CompletableFuture.runAsync(() -> {
+								if (!StringUtils.isEmpty(contract.getRelationCode())) {
+									List<Long> idList = contractRepository.findIdByCode(contract.getRelationCode());
+									if (!idList.isEmpty()) {
+										contract.setRelationContract(idList.get(0));
+									} else {
+										contract.setRelationContract(-1L);
+									}
+								} else {
+									contract.setRelationContract(-1L);
+								}
+								if (contract.getRelationContract() < 0) {
+									contract.setRelationCode(null);
+								}
+
+								//删除已经重复的记录
+								contractRepository.deleteByCode(contract.getContractCode(), platform);
+								contract.setCreateTime(new Date());
+								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 int checkSheetTitle(Workbook workbook, String platform) {
+		String sheetTitle = null;
+		String code = "\t";
+		if ("dmp".equals(platform)) {
+			//dmp 合同
+			sheetTitle = "我方签约主体\t客户签约主体\t客户简称\t第三方签约主体\t行政区域\t隶属集团\t行业分类\t合同开始日期\t合同结束日期\t签约销售\t客户主账号\t合同编号\t签约类型\t业务类型\t协议类型\t合同金额\t关联合同编号";
+		} else if ("dmp_income".equals(platform)) {
+			//dmp 收入
+			sheetTitle = "合同编号\t收入月份\t结算周期\t系统结算\t按月结算\t税率\t确认收入";
+		}
+		if (sheetTitle == null) {
+			return -1;
+		}
+
+		Sheet sheet = workbook.getSheetAt(0);
+		Row row = sheet.getRow(0);
+		int sheLength = sheetTitle.split("\t").length;
+		StringBuffer titleUp = new StringBuffer();
+		for (int i = 0; i < sheLength; i++) {
+			if (i > 0) titleUp.append(code);
+			titleUp.append(row.getCell(i));
+		}
+		if (!titleUp.toString().equals(sheetTitle)) {
+			return -1;
+		}
+
+		//总行数
+		sheLength = sheet.getLastRowNum() + 1;
+		return sheLength;
+	}
+
+	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);
+		//合同编号	收入月份	结算周期	系统结算	按月结算	税率	确认收入
+		DmpIncome income = new DmpIncome();
+		income.setIndex(index);
+		income.setContractCode(getCellStringValue(rowItem, 0));
+		income.setIncomeMonth(getCellDateValue(rowItem, 1, "yyyy-MM"));
+		income.setPeriod(getCellStringValue(rowItem, 2));
+		income.setSysSettlement(getCellStringValue(rowItem, 3));
+		income.setMonthSettlement(getCellStringValue(rowItem, 4));
+		income.setTaxRate(getCellStringValue(rowItem, 5));
+		income.setConfirmSettlement(getCellStringValue(rowItem, 6));
+		// 时间 上传人
+		income.setCreateTime(new Date());
+		income.setUploadUser(user.getName());
+		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();
+		income.setTaxRate(drate + "%");
+		if (StringUtils.isEmpty(income.getSysSettlement())) {
+			income.setSysSettlement("0");
+		}
+
+		return income;
+
+	}
+
+	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) {
+			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 (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {
+			// 用于转化为日期格式
+			Date d = cell.getDateCellValue();
+			DateFormat formater = new SimpleDateFormat(fm);
+			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, 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));
+		contract.setCustomerBody(getCellStringValue(rowItem, 1));
+		contract.setCustomerShort(getCellStringValue(rowItem, 2));
+		// 第三方签约主体	行政区域	隶属集团	行业分类
+		contract.setCustomerThird(getCellStringValue(rowItem, 3));
+		contract.setBarrioId(new BigDecimal(getCellStringValue(rowItem, 4, "0")).longValue());
+		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));
+		String money = getCellStringValue(rowItem, 15, "0");
+		if (money == null || StringUtils.isEmpty(money.trim())) {
+			money = "0";
+		}
+		contract.setMoney(Double.parseDouble(money));
+		contract.setRelationCode(getCellStringValue(rowItem, 16));
+	}
+
+	private ResultModel erroValueTip(int line, String title) {
+		return ResultModel.ERROR("第" + line + "行,[" + title + "]错误");
+	}
 
 
 }