DistributionServiceImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. package com.simuwang.manage.service.impl;
  2. import cn.hutool.core.date.DateUtil;
  3. import com.alibaba.excel.EasyExcel;
  4. import com.alibaba.excel.read.listener.PageReadListener;
  5. import com.alibaba.excel.support.ExcelTypeEnum;
  6. import com.simuwang.base.common.conts.DateConst;
  7. import com.simuwang.base.common.conts.ExcelConst;
  8. import com.simuwang.base.common.enums.DistributeType;
  9. import com.simuwang.base.common.support.MybatisPage;
  10. import com.simuwang.base.common.util.DateUtils;
  11. import com.simuwang.base.common.util.ExcelUtil;
  12. import com.simuwang.base.common.util.FileUtil;
  13. import com.simuwang.base.common.util.StringUtil;
  14. import com.simuwang.base.mapper.DistributionMapper;
  15. import com.simuwang.base.mapper.FundInfoMapper;
  16. import com.simuwang.base.mapper.NavMapper;
  17. import com.simuwang.base.pojo.dos.DistributionDO;
  18. import com.simuwang.base.pojo.dos.DistributionTablePageDO;
  19. import com.simuwang.base.pojo.dos.FundInfoDO;
  20. import com.simuwang.base.pojo.dos.NavDO;
  21. import com.simuwang.base.pojo.dto.DistributionExcelData;
  22. import com.simuwang.base.pojo.dto.query.DistributionPageQuery;
  23. import com.simuwang.base.pojo.vo.*;
  24. import com.simuwang.manage.service.DistributionService;
  25. import com.smppw.common.pojo.ResultVo;
  26. import com.smppw.common.pojo.enums.status.ResultCode;
  27. import com.smppw.common.pojo.enums.status.StatusCode;
  28. import org.apache.commons.io.FileUtils;
  29. import org.apache.poi.ss.formula.functions.Na;
  30. import org.slf4j.Logger;
  31. import org.slf4j.LoggerFactory;
  32. import org.springframework.beans.factory.annotation.Autowired;
  33. import org.springframework.beans.factory.annotation.Value;
  34. import org.springframework.stereotype.Service;
  35. import org.springframework.web.multipart.MultipartFile;
  36. import java.io.File;
  37. import java.io.InputStream;
  38. import java.math.BigDecimal;
  39. import java.util.*;
  40. import java.util.stream.Collectors;
  41. /**
  42. * FileName: DistributionServiceImpl
  43. * Author: chenjianhua
  44. * Date: 2024/9/15 14:07
  45. * Description: ${DESCRIPTION}
  46. */
  47. @Service
  48. public class DistributionServiceImpl implements DistributionService {
  49. private static final Logger logger = LoggerFactory.getLogger(DistributionServiceImpl.class);
  50. @Autowired
  51. private DistributionMapper distributionMapper;
  52. @Autowired
  53. private NavMapper navMapper;
  54. @Autowired
  55. private FundInfoMapper fundInfoMapper;
  56. @Value("${email.file.path}")
  57. private String path;
  58. @Override
  59. public MybatisPage<DistributionTablePageVO> searchDistributionList(DistributionPageQuery distributionPageQuery) {
  60. List<DistributionTablePageDO> distributionTablePageDOList = distributionMapper.searchDistributionList(distributionPageQuery);
  61. List<DistributionTablePageVO> distributionTablePageVOList = distributionTablePageDOList.stream().map(DistributionTablePageDO::toVo).collect(Collectors.toList());
  62. long total = distributionMapper.countDistributionList(distributionPageQuery);
  63. return MybatisPage.of(total,distributionTablePageVOList);
  64. }
  65. @Override
  66. public ResultVo saveDistribution(DistributionVO distributionVO) {
  67. ResultVo vo = new ResultVo(true);
  68. DistributionDO distributionDO = new DistributionDO();
  69. distributionDO.setFundId(distributionVO.getFundId());
  70. distributionDO.setDistribution(distributionVO.getDistribution());
  71. distributionDO.setDistributeDate(DateUtils.parse(distributionVO.getDistributeDate(),DateUtils.YYYY_MM_DD));
  72. distributionDO.setDistributeType(distributionVO.getDistributeType());
  73. distributionDO.setIsvalid(1);
  74. distributionDO.setUpdateTime(DateUtils.getNowDate());
  75. DistributionDO oldDistributionDO = distributionMapper.selectDistributionByDate(distributionVO.getFundId(),DateUtils.parse(distributionVO.getDistributeDate(),DateUtils.YYYY_MM_DD));
  76. if(!StringUtil.isNull(oldDistributionDO)){
  77. if(distributionVO.getId() != null && !oldDistributionDO.getId().equals(distributionVO.getId())){
  78. vo.setData(false);
  79. vo.setMsg("同一基金在同一天不能已存在分红数据");
  80. return vo;
  81. }
  82. distributionDO.setId(oldDistributionDO.getId());
  83. distributionMapper.updateDistributionById(distributionDO);
  84. }else{
  85. distributionDO.setCreateTime(DateUtils.getNowDate());
  86. distributionMapper.saveDistribution(distributionDO);
  87. }
  88. if(distributionVO.getNav() == null){
  89. return vo;
  90. }
  91. //保存净值
  92. NavDO navDO = new NavDO();
  93. navDO.setFundId(distributionVO.getFundId());
  94. navDO.setNav(distributionVO.getNav());
  95. navDO.setCumulativeNavWithdrawal(distributionVO.getCumulativeNavWithdrawal());
  96. navDO.setPriceDate(DateUtils.parse(distributionVO.getDistributeDate(),DateUtils.YYYY_MM_DD));
  97. NavDO oldNav = navMapper.queryFundNav(navDO);
  98. if(StringUtil.isNull(oldNav)){
  99. navDO.setUpdateTime(DateUtils.getNowDate());
  100. navDO.setCreateTime(DateUtils.getNowDate());
  101. navDO.setIsvalid(1);
  102. navMapper.saveNav(navDO);
  103. }else{
  104. navDO.setId(oldNav.getId());
  105. navDO.setUpdateTime(DateUtils.getNowDate());
  106. navMapper.updateNav(navDO);
  107. }
  108. return vo;
  109. }
  110. @Override
  111. public void deleteDistribution(IdListVO idListVO) {
  112. distributionMapper.deleteDistribution(idListVO.getIdList());
  113. }
  114. @Override
  115. public ResultVo uploadDistribution(MultipartFile excelFile) {
  116. ResultVo vo = new ResultVo(ResultCode.SUCCESS);
  117. File file = null;
  118. try{
  119. InputStream inputStream = excelFile.getInputStream();
  120. file = new File(path+"/upload/"+ System.currentTimeMillis()+"/"+excelFile.getOriginalFilename());
  121. FileUtils.copyInputStreamToFile(inputStream,file);
  122. List<DistributionExcelData> list = parseDistributionFile(file);
  123. vo.setData(parseResult(list));
  124. }catch (Exception e){
  125. logger.error(e.getMessage(),e);
  126. vo.setMsg("文件解析异常");
  127. vo.setData(false);
  128. return vo;
  129. }
  130. return vo;
  131. }
  132. private Map<String,Object> parseResult(List<DistributionExcelData> list) {
  133. Map<String,Object> result = new HashMap<>();
  134. int startRow = 3;
  135. List<ExcelSuccessDataVO> successDataVOList = new ArrayList<>();
  136. List<ExcelFailDataVO> excelFailDataVOList = new ArrayList<>();
  137. for(int dataIdx=1;dataIdx<list.size(); dataIdx++){
  138. DistributionExcelData excelData = list.get(dataIdx);
  139. try{
  140. if((StringUtil.isEmpty(excelData.getFundName()) && StringUtil.isEmpty(excelData.getFundId()))
  141. || StringUtil.isEmpty(excelData.getPriceDate()) || StringUtil.isEmpty(excelData.getNav())
  142. || StringUtil.isEmpty(excelData.getDistributeType()) || StringUtil.isEmpty(excelData.getDistribution())
  143. || StringUtil.isEmpty(excelData.getCumulativeNavWithdrawal())){
  144. ExcelFailDataVO failDataVO = toExcelFailDataVO(excelData,ExcelConst.REQUIRE_FIELD,dataIdx+startRow);
  145. excelFailDataVOList.add(failDataVO);
  146. continue;
  147. }
  148. if(excelData.getDistributeType().trim().equals(ExcelConst.CASH_DIVIDENDS)){
  149. if(Double.valueOf(excelData.getDistribution()) < 0f){
  150. ExcelFailDataVO failDataVO = toExcelFailDataVO(excelData,ExcelConst.CASH_DIVIDENDS_FAIL,dataIdx+startRow);
  151. excelFailDataVOList.add(failDataVO);
  152. continue;
  153. }
  154. }else{
  155. if(Double.valueOf(excelData.getDistribution()) == 0f){
  156. ExcelFailDataVO failDataVO = toExcelFailDataVO(excelData,ExcelConst.DIVIDENDS_SPLIT_FAIL,dataIdx+startRow);
  157. excelFailDataVOList.add(failDataVO);
  158. continue;
  159. }
  160. }
  161. if(StringUtil.isNotEmpty(excelData.getFundId())){
  162. String fundName = fundInfoMapper.getFundNameByFundId(excelData.getFundId());
  163. if(StringUtil.isEmpty(fundName)){
  164. ExcelFailDataVO failDataVO = toExcelFailDataVO(excelData,ExcelConst.NOT_MAPPING_FUND,dataIdx+startRow);
  165. excelFailDataVOList.add(failDataVO);
  166. continue;
  167. }
  168. }else{
  169. String fundId = fundInfoMapper.queryFundIdByName(excelData.getFundName());
  170. if(StringUtil.isEmpty(fundId)){
  171. ExcelFailDataVO failDataVO = toExcelFailDataVO(excelData,ExcelConst.NOT_MAPPING_FUND,dataIdx+startRow);
  172. excelFailDataVOList.add(failDataVO);
  173. continue;
  174. }else{
  175. excelData.setFundId(fundId);
  176. }
  177. }
  178. //开始处理成功数据
  179. DistributionVO distributionVO = new DistributionVO();
  180. distributionVO.setFundId(excelData.getFundId());
  181. distributionVO.setDistributeDate(excelData.getPriceDate());
  182. distributionVO.setDistributeType(DistributeType.getDistributeTypeByInfo(excelData.getDistributeType()).getCode());
  183. distributionVO.setDistribution(BigDecimal.valueOf(Double.valueOf(excelData.getDistribution())));
  184. distributionVO.setNav(BigDecimal.valueOf(Double.valueOf(excelData.getNav())));
  185. distributionVO.setCumulativeNavWithdrawal(BigDecimal.valueOf(Double.valueOf(excelData.getCumulativeNavWithdrawal())));
  186. ResultVo vo = saveDistribution(distributionVO);
  187. if((boolean)vo.getData() == true){
  188. ExcelSuccessDataVO successDataVO = new ExcelSuccessDataVO();
  189. successDataVO.setDistribution(excelData.getDistribution());
  190. successDataVO.setFundName(excelData.getFundName());
  191. successDataVO.setPriceDate(excelData.getPriceDate());
  192. successDataVO.setDistributeType(excelData.getDistributeType());
  193. successDataVOList.add(successDataVO);
  194. }else{
  195. ExcelFailDataVO failDataVO = toExcelFailDataVO(excelData,vo.getMsg(),dataIdx+startRow);
  196. excelFailDataVOList.add(failDataVO);
  197. }
  198. }catch (Exception e){
  199. logger.error(e.getMessage(),e);
  200. ExcelFailDataVO failDataVO = toExcelFailDataVO(excelData,e.getMessage(),dataIdx+startRow);
  201. excelFailDataVOList.add(failDataVO);
  202. }
  203. }
  204. result.put("success",successDataVOList);
  205. result.put("fail",excelFailDataVOList);
  206. return result;
  207. }
  208. private ExcelFailDataVO toExcelFailDataVO(DistributionExcelData excelData, String msg,Integer rowNum) {
  209. ExcelFailDataVO failDataVO = new ExcelFailDataVO();
  210. failDataVO.setFailReason(msg);
  211. failDataVO.setRowNum(rowNum);
  212. failDataVO.setDistribution(excelData.getDistribution());
  213. failDataVO.setFundName(excelData.getFundName());
  214. failDataVO.setPriceDate(excelData.getPriceDate());
  215. failDataVO.setDistributeType(excelData.getDistributeType());
  216. return failDataVO;
  217. }
  218. private List<DistributionExcelData> parseDistributionFile(File file) {
  219. // 创建一个 list 存储每行的数据,即 ExcelData 对象
  220. List<DistributionExcelData> list = new ArrayList<>();
  221. // 直接使用 EasyExcel 的 read 方法,同时定义表头的类型,以便将列中数据映射为 ExcelData 对象
  222. EasyExcel.read(file, DistributionExcelData.class, new PageReadListener<DistributionExcelData>(dataList -> {
  223. // 并且每行数据,并将其 add 至 list 中
  224. for (DistributionExcelData excelData : dataList) {
  225. if (excelData != null) {
  226. list.add(excelData);
  227. }
  228. }
  229. })).excelType(ExcelTypeEnum.XLSX).sheet().doRead();
  230. return list;
  231. }
  232. }