|
@@ -1,26 +1,43 @@
|
|
package com.simuwang.manage.service.impl;
|
|
package com.simuwang.manage.service.impl;
|
|
|
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
|
+import com.alibaba.excel.EasyExcel;
|
|
|
|
+import com.alibaba.excel.read.listener.PageReadListener;
|
|
|
|
+import com.alibaba.excel.support.ExcelTypeEnum;
|
|
import com.simuwang.base.common.conts.DateConst;
|
|
import com.simuwang.base.common.conts.DateConst;
|
|
|
|
+import com.simuwang.base.common.conts.ExcelConst;
|
|
|
|
+import com.simuwang.base.common.enums.DistributeType;
|
|
import com.simuwang.base.common.support.MybatisPage;
|
|
import com.simuwang.base.common.support.MybatisPage;
|
|
import com.simuwang.base.common.util.DateUtils;
|
|
import com.simuwang.base.common.util.DateUtils;
|
|
|
|
+import com.simuwang.base.common.util.ExcelUtil;
|
|
import com.simuwang.base.common.util.StringUtil;
|
|
import com.simuwang.base.common.util.StringUtil;
|
|
import com.simuwang.base.mapper.DistributionMapper;
|
|
import com.simuwang.base.mapper.DistributionMapper;
|
|
|
|
+import com.simuwang.base.mapper.FundInfoMapper;
|
|
import com.simuwang.base.mapper.NavMapper;
|
|
import com.simuwang.base.mapper.NavMapper;
|
|
import com.simuwang.base.pojo.dos.DistributionDO;
|
|
import com.simuwang.base.pojo.dos.DistributionDO;
|
|
import com.simuwang.base.pojo.dos.DistributionTablePageDO;
|
|
import com.simuwang.base.pojo.dos.DistributionTablePageDO;
|
|
|
|
+import com.simuwang.base.pojo.dos.FundInfoDO;
|
|
import com.simuwang.base.pojo.dos.NavDO;
|
|
import com.simuwang.base.pojo.dos.NavDO;
|
|
|
|
+import com.simuwang.base.pojo.dto.DistributionExcelData;
|
|
import com.simuwang.base.pojo.dto.query.DistributionPageQuery;
|
|
import com.simuwang.base.pojo.dto.query.DistributionPageQuery;
|
|
-import com.simuwang.base.pojo.vo.DistributionTablePageVO;
|
|
|
|
-import com.simuwang.base.pojo.vo.DistributionVO;
|
|
|
|
-import com.simuwang.base.pojo.vo.IdListVO;
|
|
|
|
|
|
+import com.simuwang.base.pojo.vo.*;
|
|
import com.simuwang.manage.service.DistributionService;
|
|
import com.simuwang.manage.service.DistributionService;
|
|
import com.smppw.common.pojo.ResultVo;
|
|
import com.smppw.common.pojo.ResultVo;
|
|
|
|
+import com.smppw.common.pojo.enums.status.ResultCode;
|
|
|
|
+import com.smppw.common.pojo.enums.status.StatusCode;
|
|
import org.apache.poi.ss.formula.functions.Na;
|
|
import org.apache.poi.ss.formula.functions.Na;
|
|
|
|
+import org.slf4j.Logger;
|
|
|
|
+import org.slf4j.LoggerFactory;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
|
|
+import java.io.File;
|
|
|
|
+import java.math.BigDecimal;
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
+import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -32,11 +49,17 @@ import java.util.stream.Collectors;
|
|
@Service
|
|
@Service
|
|
public class DistributionServiceImpl implements DistributionService {
|
|
public class DistributionServiceImpl implements DistributionService {
|
|
|
|
|
|
|
|
+ private static final Logger logger = LoggerFactory.getLogger(DistributionServiceImpl.class);
|
|
|
|
+
|
|
|
|
+
|
|
@Autowired
|
|
@Autowired
|
|
private DistributionMapper distributionMapper;
|
|
private DistributionMapper distributionMapper;
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
private NavMapper navMapper;
|
|
private NavMapper navMapper;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private FundInfoMapper fundInfoMapper;
|
|
@Override
|
|
@Override
|
|
public MybatisPage<DistributionTablePageVO> searchDistributionList(DistributionPageQuery distributionPageQuery) {
|
|
public MybatisPage<DistributionTablePageVO> searchDistributionList(DistributionPageQuery distributionPageQuery) {
|
|
List<DistributionTablePageDO> distributionTablePageDOList = distributionMapper.searchDistributionList(distributionPageQuery);
|
|
List<DistributionTablePageDO> distributionTablePageDOList = distributionMapper.searchDistributionList(distributionPageQuery);
|
|
@@ -57,7 +80,7 @@ public class DistributionServiceImpl implements DistributionService {
|
|
distributionDO.setUpdateTime(DateUtils.getNowDate());
|
|
distributionDO.setUpdateTime(DateUtils.getNowDate());
|
|
DistributionDO oldDistributionDO = distributionMapper.selectDistributionByDate(distributionVO.getFundId(),DateUtils.parse(distributionVO.getDistributeDate(),DateUtils.YYYY_MM_DD));
|
|
DistributionDO oldDistributionDO = distributionMapper.selectDistributionByDate(distributionVO.getFundId(),DateUtils.parse(distributionVO.getDistributeDate(),DateUtils.YYYY_MM_DD));
|
|
if(!StringUtil.isNull(oldDistributionDO)){
|
|
if(!StringUtil.isNull(oldDistributionDO)){
|
|
- if(!oldDistributionDO.getId().equals(distributionVO.getId())){
|
|
|
|
|
|
+ if(distributionVO.getId() != null && !oldDistributionDO.getId().equals(distributionVO.getId())){
|
|
vo.setData(false);
|
|
vo.setData(false);
|
|
vo.setMsg("同一基金在同一天不能已存在分红数据");
|
|
vo.setMsg("同一基金在同一天不能已存在分红数据");
|
|
return vo;
|
|
return vo;
|
|
@@ -92,4 +115,125 @@ public class DistributionServiceImpl implements DistributionService {
|
|
public void deleteDistribution(IdListVO idListVO) {
|
|
public void deleteDistribution(IdListVO idListVO) {
|
|
distributionMapper.deleteDistribution(idListVO.getIdList());
|
|
distributionMapper.deleteDistribution(idListVO.getIdList());
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ResultVo uploadDistribution(MultipartFile excelFile) {
|
|
|
|
+ ResultVo vo = new ResultVo(ResultCode.SUCCESS);
|
|
|
|
+ File file = null;
|
|
|
|
+ try{
|
|
|
|
+ file = excelFile.getResource().getFile();
|
|
|
|
+ List<DistributionExcelData> list = parseDistributionFile(file);
|
|
|
|
+ vo.setData(parseResult(list));
|
|
|
|
+ }catch (Exception e){
|
|
|
|
+ logger.error(e.getMessage(),e);
|
|
|
|
+ vo.setMsg("文件解析异常");
|
|
|
|
+ vo.setData(false);
|
|
|
|
+ return vo;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return vo;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private Map<String,Object> parseResult(List<DistributionExcelData> list) {
|
|
|
|
+ Map<String,Object> result = new HashMap<>();
|
|
|
|
+ int startRow = 3;
|
|
|
|
+ List<ExcelSuccessDataVO> successDataVOList = new ArrayList<>();
|
|
|
|
+ List<ExcelFailDataVO> excelFailDataVOList = new ArrayList<>();
|
|
|
|
+ for(int dataIdx=1;dataIdx<list.size(); dataIdx++){
|
|
|
|
+ DistributionExcelData excelData = list.get(dataIdx);
|
|
|
|
+ if((StringUtil.isEmpty(excelData.getFundName()) && StringUtil.isEmpty(excelData.getFundId()))
|
|
|
|
+ || StringUtil.isEmpty(excelData.getPriceDate()) || StringUtil.isEmpty(excelData.getNav())
|
|
|
|
+ || StringUtil.isEmpty(excelData.getDistributeType()) || StringUtil.isEmpty(excelData.getDistribution())
|
|
|
|
+ || StringUtil.isEmpty(excelData.getCumulativeNavWithdrawal())){
|
|
|
|
+ ExcelFailDataVO failDataVO = new ExcelFailDataVO();
|
|
|
|
+ failDataVO.setFailReason(ExcelConst.REQUIRE_FIELD);
|
|
|
|
+ failDataVO.setRowNum(dataIdx+startRow);
|
|
|
|
+ failDataVO.setDistribution(excelData.getDistribution());
|
|
|
|
+ failDataVO.setFundName(excelData.getFundName());
|
|
|
|
+ failDataVO.setPriceDate(excelData.getPriceDate());
|
|
|
|
+ failDataVO.setDistributeType(excelData.getDistributeType());
|
|
|
|
+ excelFailDataVOList.add(failDataVO);
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ if(excelData.getDistributeType().trim().equals(ExcelConst.CASH_DIVIDENDS)){
|
|
|
|
+ if(Double.valueOf(excelData.getDistribution()) < 0f){
|
|
|
|
+ ExcelFailDataVO failDataVO = toExcelFailDataVO(excelData,ExcelConst.CASH_DIVIDENDS_FAIL,dataIdx+startRow);
|
|
|
|
+ excelFailDataVOList.add(failDataVO);
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ }else{
|
|
|
|
+ if(Double.valueOf(excelData.getDistribution()) == 0f){
|
|
|
|
+ ExcelFailDataVO failDataVO = toExcelFailDataVO(excelData,ExcelConst.DIVIDENDS_SPLIT_FAIL,dataIdx+startRow);
|
|
|
|
+ excelFailDataVOList.add(failDataVO);
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if(StringUtil.isNotEmpty(excelData.getFundId())){
|
|
|
|
+ String fundName = fundInfoMapper.getFundNameByFundId(excelData.getFundId());
|
|
|
|
+ if(StringUtil.isEmpty(fundName)){
|
|
|
|
+ ExcelFailDataVO failDataVO = toExcelFailDataVO(excelData,ExcelConst.NOT_MAPPING_FUND,dataIdx+startRow);
|
|
|
|
+ excelFailDataVOList.add(failDataVO);
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ }else{
|
|
|
|
+ String fundId = fundInfoMapper.queryFundIdByName(excelData.getFundName());
|
|
|
|
+ if(StringUtil.isEmpty(fundId)){
|
|
|
|
+ ExcelFailDataVO failDataVO = toExcelFailDataVO(excelData,ExcelConst.NOT_MAPPING_FUND,dataIdx+startRow);
|
|
|
|
+ excelFailDataVOList.add(failDataVO);
|
|
|
|
+ continue;
|
|
|
|
+ }else{
|
|
|
|
+ excelData.setFundId(fundId);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //开始处理成功数据
|
|
|
|
+ DistributionVO distributionVO = new DistributionVO();
|
|
|
|
+ distributionVO.setFundId(excelData.getFundId());
|
|
|
|
+ distributionVO.setDistributeDate(excelData.getPriceDate());
|
|
|
|
+ distributionVO.setDistributeType(DistributeType.getDistributeTypeByInfo(excelData.getDistributeType()).getCode());
|
|
|
|
+ distributionVO.setDistribution(BigDecimal.valueOf(Double.valueOf(excelData.getDistribution())));
|
|
|
|
+ distributionVO.setNav(BigDecimal.valueOf(Double.valueOf(excelData.getNav())));
|
|
|
|
+ distributionVO.setCumulativeNavWithdrawal(BigDecimal.valueOf(Double.valueOf(excelData.getCumulativeNavWithdrawal())));
|
|
|
|
+ ResultVo vo = saveDistribution(distributionVO);
|
|
|
|
+ if((boolean)vo.getData() == true){
|
|
|
|
+ ExcelSuccessDataVO successDataVO = new ExcelSuccessDataVO();
|
|
|
|
+ successDataVO.setDistribution(excelData.getDistribution());
|
|
|
|
+ successDataVO.setFundName(excelData.getFundName());
|
|
|
|
+ successDataVO.setPriceDate(excelData.getPriceDate());
|
|
|
|
+ successDataVO.setDistributeType(excelData.getDistributeType());
|
|
|
|
+ successDataVOList.add(successDataVO);
|
|
|
|
+ }else{
|
|
|
|
+ ExcelFailDataVO failDataVO = toExcelFailDataVO(excelData,vo.getMsg(),dataIdx+startRow);
|
|
|
|
+ excelFailDataVOList.add(failDataVO);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ result.put("success",successDataVOList);
|
|
|
|
+ result.put("fail",excelFailDataVOList);
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private ExcelFailDataVO toExcelFailDataVO(DistributionExcelData excelData, String msg,Integer rowNum) {
|
|
|
|
+ ExcelFailDataVO failDataVO = new ExcelFailDataVO();
|
|
|
|
+ failDataVO.setFailReason(msg);
|
|
|
|
+ failDataVO.setRowNum(rowNum);
|
|
|
|
+ failDataVO.setDistribution(excelData.getDistribution());
|
|
|
|
+ failDataVO.setFundName(excelData.getFundName());
|
|
|
|
+ failDataVO.setPriceDate(excelData.getPriceDate());
|
|
|
|
+ failDataVO.setDistributeType(excelData.getDistributeType());
|
|
|
|
+ return failDataVO;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private List<DistributionExcelData> parseDistributionFile(File file) {
|
|
|
|
+ // 创建一个 list 存储每行的数据,即 ExcelData 对象
|
|
|
|
+ List<DistributionExcelData> list = new ArrayList<>();
|
|
|
|
+ // 直接使用 EasyExcel 的 read 方法,同时定义表头的类型,以便将列中数据映射为 ExcelData 对象
|
|
|
|
+ EasyExcel.read(file, DistributionExcelData.class, new PageReadListener<DistributionExcelData>(dataList -> {
|
|
|
|
+ // 并且每行数据,并将其 add 至 list 中
|
|
|
|
+ for (DistributionExcelData excelData : dataList) {
|
|
|
|
+ if (excelData != null) {
|
|
|
|
+ list.add(excelData);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ })).excelType(ExcelTypeEnum.XLSX).sheet().doRead();
|
|
|
|
+ return list;
|
|
|
|
+ }
|
|
}
|
|
}
|