FundNavAssetServiceImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. package com.simuwang.manage.service.impl;
  2. import com.alibaba.excel.EasyExcel;
  3. import com.alibaba.excel.read.listener.PageReadListener;
  4. import com.alibaba.excel.support.ExcelTypeEnum;
  5. import com.simuwang.base.common.conts.ExcelConst;
  6. import com.simuwang.base.common.enums.DistributeType;
  7. import com.simuwang.base.common.support.MybatisPage;
  8. import com.simuwang.base.common.util.DateUtils;
  9. import com.simuwang.base.common.util.StringUtil;
  10. import com.simuwang.base.mapper.AssetMapper;
  11. import com.simuwang.base.mapper.FundInfoMapper;
  12. import com.simuwang.base.mapper.FundNavAssetMapper;
  13. import com.simuwang.base.mapper.NavMapper;
  14. import com.simuwang.base.pojo.dos.AssetDO;
  15. import com.simuwang.base.pojo.dos.FundNavAssetDO;
  16. import com.simuwang.base.pojo.dos.NavDO;
  17. import com.simuwang.base.pojo.dto.DistributionExcelData;
  18. import com.simuwang.base.pojo.dto.NavAssetExcelData;
  19. import com.simuwang.base.pojo.dto.query.FundNavAssetPageQuery;
  20. import com.simuwang.base.pojo.vo.*;
  21. import com.simuwang.manage.service.FundNavAssetService;
  22. import com.smppw.common.pojo.ResultVo;
  23. import com.smppw.common.pojo.enums.status.ResultCode;
  24. import org.apache.commons.io.FileUtils;
  25. import org.slf4j.Logger;
  26. import org.slf4j.LoggerFactory;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.beans.factory.annotation.Value;
  29. import org.springframework.stereotype.Service;
  30. import org.springframework.web.multipart.MultipartFile;
  31. import java.io.File;
  32. import java.io.InputStream;
  33. import java.math.BigDecimal;
  34. import java.util.ArrayList;
  35. import java.util.HashMap;
  36. import java.util.List;
  37. import java.util.Map;
  38. import java.util.stream.Collectors;
  39. /**
  40. * FileName: FundNavAssetServiceImpl
  41. * Author: chenjianhua
  42. * Date: 2024/9/15 16:58
  43. * Description: ${DESCRIPTION}
  44. */
  45. @Service
  46. public class FundNavAssetServiceImpl implements FundNavAssetService {
  47. @Autowired
  48. private FundNavAssetMapper fundNavAssetMapper;
  49. @Autowired
  50. private AssetMapper assetMapper;
  51. @Autowired
  52. private NavMapper navMapper;
  53. @Autowired
  54. private FundInfoMapper fundInfoMapper;
  55. @Value("${email.file.path}")
  56. private String path;
  57. private static final Logger logger = LoggerFactory.getLogger(FundNavAssetServiceImpl.class);
  58. @Override
  59. public MybatisPage<FundNavAssetVO> searchNavAssetList(FundNavAssetPageQuery fundNavAssetPageQuery) {
  60. List<FundNavAssetDO> fundNavAssetDOList = fundNavAssetMapper.searchNavAssetList(fundNavAssetPageQuery);
  61. List<FundNavAssetVO> fundNavAssetVOList = fundNavAssetDOList.stream().map(FundNavAssetDO::toVo).collect(Collectors.toList());
  62. long total = fundNavAssetMapper.countNavAssetList(fundNavAssetPageQuery);
  63. return MybatisPage.of(total,fundNavAssetVOList);
  64. }
  65. @Override
  66. public void saveFundAsset(FundAssetVO fundAssetVO) {
  67. List<AssetDO> assetDOList = new ArrayList<>();
  68. AssetDO assetDO = new AssetDO();
  69. assetDO.setAssetNet(fundAssetVO.getAssetNet());
  70. assetDO.setAssetShare(fundAssetVO.getAssetShare());
  71. assetDO.setPriceDate(DateUtils.parse(fundAssetVO.getPriceDate(),DateUtils.YYYY_MM_DD));
  72. assetDO.setFundId(fundAssetVO.getFundId());
  73. assetDO.setUpdateTime(DateUtils.getNowDate());
  74. assetDO.setIsvalid(1);
  75. AssetDO oldAssetDO = assetMapper.queryFundAsset(assetDO);
  76. if(StringUtil.isNull(oldAssetDO)){
  77. assetDO.setCreateTime(DateUtils.getNowDate());
  78. assetDOList.add(assetDO);
  79. assetMapper.batchInsert(assetDOList);
  80. }else{
  81. oldAssetDO.setAssetShare(assetDO.getAssetShare());
  82. oldAssetDO.setAssetNet(assetDO.getAssetNet());
  83. assetDOList.add(oldAssetDO);
  84. assetMapper.batchUpdate(assetDOList);
  85. }
  86. }
  87. @Override
  88. public void saveFundNav(FundNavVO fundNavVO) {
  89. List<NavDO> navDOList = new ArrayList<>();
  90. NavDO navDO = new NavDO();
  91. navDO.setCumulativeNavWithdrawal(fundNavVO.getCumulativeNavWithdrawal());
  92. navDO.setNav(fundNavVO.getNav());
  93. navDO.setFundId(fundNavVO.getFundId());
  94. navDO.setNav(fundNavVO.getNav());
  95. navDO.setPriceDate(DateUtils.parse(fundNavVO.getPriceDate(),DateUtils.YYYY_MM_DD));
  96. navDO.setIsvalid(1);
  97. navDO.setUpdateTime(DateUtils.getNowDate());
  98. NavDO oldNav = navMapper.queryFundNav(navDO);
  99. if(StringUtil.isNull(oldNav)){
  100. navDO.setCreateTime(DateUtils.getNowDate());
  101. navDOList.add(navDO);
  102. navMapper.batchInsert(navDOList);
  103. }else{
  104. oldNav.setUpdateTime(DateUtils.getNowDate());
  105. oldNav.setCumulativeNav(navDO.getCumulativeNav());
  106. oldNav.setCumulativeNavWithdrawal(navDO.getCumulativeNavWithdrawal());
  107. oldNav.setNav(navDO.getNav());
  108. navDOList.add(oldNav);
  109. navMapper.batchUpdate(navDOList);
  110. }
  111. }
  112. @Override
  113. public void deleteFundNavAsset(FundNavAssetDelListVO fundNavAssetDelListVO) {
  114. List<FundNavAssetDelVO> delVOList = fundNavAssetDelListVO.getFundNavAssetDelVOList();
  115. for(FundNavAssetDelVO delVO : delVOList){
  116. navMapper.deleteNav(delVO.getFundId(),delVO.getPriceDate());
  117. assetMapper.deleteAsset(delVO.getFundId(),delVO.getPriceDate());
  118. }
  119. }
  120. @Override
  121. public ResultVo uploadNavAsset(MultipartFile excelFile) {
  122. ResultVo vo = new ResultVo(ResultCode.SUCCESS);
  123. File file = null;
  124. try{
  125. InputStream inputStream = excelFile.getInputStream();
  126. file = new File(path+"/upload/"+ System.currentTimeMillis()+"/"+excelFile.getOriginalFilename());
  127. FileUtils.copyInputStreamToFile(inputStream,file);
  128. List<NavAssetExcelData> list = parseDistributionFile(file);
  129. vo.setData(parseResult(list));
  130. }catch (Exception e){
  131. logger.error(e.getMessage(),e);
  132. vo.setMsg("文件解析异常");
  133. vo.setData(false);
  134. return vo;
  135. }
  136. return vo;
  137. }
  138. private Map<String,Object> parseResult(List<NavAssetExcelData> list) {
  139. Map<String,Object> result = new HashMap<>();
  140. int startRow = 3;
  141. List<ExcelNavAssetSuccessDataVO> successDataVOList = new ArrayList<>();
  142. List<ExcelNavAssetFailDataVO> excelFailDataVOList = new ArrayList<>();
  143. for(int dataIdx=1;dataIdx<list.size(); dataIdx++){
  144. NavAssetExcelData excelData = list.get(dataIdx);
  145. try{
  146. if((StringUtil.isEmpty(excelData.getFundName()) && StringUtil.isEmpty(excelData.getFundId()))
  147. || StringUtil.isEmpty(excelData.getPriceDate())){
  148. ExcelNavAssetFailDataVO failDataVO = toExcelFailDataVO(excelData,ExcelConst.REQUIRE_FIELD,dataIdx+startRow);
  149. excelFailDataVOList.add(failDataVO);
  150. continue;
  151. }
  152. if(StringUtil.isNotEmpty(excelData.getFundId())){
  153. String fundName = fundInfoMapper.getFundNameByFundId(excelData.getFundId());
  154. if(StringUtil.isEmpty(fundName)){
  155. ExcelNavAssetFailDataVO failDataVO = toExcelFailDataVO(excelData,ExcelConst.NOT_MAPPING_FUND,dataIdx+startRow);
  156. excelFailDataVOList.add(failDataVO);
  157. continue;
  158. }
  159. }else{
  160. String fundId = fundInfoMapper.queryFundIdByName(excelData.getFundName());
  161. if(StringUtil.isEmpty(fundId)){
  162. ExcelNavAssetFailDataVO failDataVO = toExcelFailDataVO(excelData,ExcelConst.NOT_MAPPING_FUND,dataIdx+startRow);
  163. excelFailDataVOList.add(failDataVO);
  164. continue;
  165. }else{
  166. excelData.setFundId(fundId);
  167. }
  168. }
  169. if(StringUtil.isEmpty(excelData.getNav()) || Double.valueOf(excelData.getNav()) < 0){
  170. ExcelNavAssetFailDataVO failDataVO = toExcelFailDataVO(excelData,ExcelConst.ERROR_NAV,dataIdx+startRow);
  171. excelFailDataVOList.add(failDataVO);
  172. continue;
  173. }
  174. if(StringUtil.isEmpty(excelData.getCumulativeNavWithdrawal()) || Double.valueOf(excelData.getCumulativeNavWithdrawal()) < 0){
  175. ExcelNavAssetFailDataVO failDataVO = toExcelFailDataVO(excelData,ExcelConst.ERROR_NAV_WITHDRAWAL,dataIdx+startRow);
  176. excelFailDataVOList.add(failDataVO);
  177. continue;
  178. }
  179. //开始处理成功数据
  180. FundNavVO fundNavVO = new FundNavVO();
  181. fundNavVO.setFundId(excelData.getFundId());
  182. fundNavVO.setPriceDate(excelData.getPriceDate());
  183. fundNavVO.setNav(BigDecimal.valueOf(Double.valueOf(excelData.getNav())));
  184. fundNavVO.setCumulativeNavWithdrawal(BigDecimal.valueOf(Double.valueOf(excelData.getCumulativeNavWithdrawal())));
  185. saveFundNav(fundNavVO);
  186. if(StringUtil.isEmpty(excelData.getAssetNet()) && StringUtil.isEmpty(excelData.getAssetShare())){
  187. continue;
  188. }
  189. FundAssetVO fundAssetVO = new FundAssetVO();
  190. fundAssetVO.setFundId(excelData.getFundId());
  191. fundAssetVO.setPriceDate(excelData.getPriceDate());
  192. fundAssetVO.setAssetNet(StringUtil.isEmpty(excelData.getAssetNet())?null:BigDecimal.valueOf(Double.valueOf(excelData.getAssetNet())));
  193. fundAssetVO.setAssetShare(StringUtil.isEmpty(excelData.getAssetShare())?null:BigDecimal.valueOf(Double.valueOf(excelData.getAssetShare())));
  194. saveFundAsset(fundAssetVO);
  195. //处理成功结果
  196. ExcelNavAssetSuccessDataVO excelNavAssetSuccessDataVO = new ExcelNavAssetSuccessDataVO();
  197. excelNavAssetSuccessDataVO.setFundName(excelData.getFundName());
  198. excelNavAssetSuccessDataVO.setPriceDate(excelData.getPriceDate());
  199. excelNavAssetSuccessDataVO.setNav(excelData.getNav());
  200. excelNavAssetSuccessDataVO.setCumulativeNavWithdrawal(excelData.getCumulativeNavWithdrawal());
  201. excelNavAssetSuccessDataVO.setAssetNet(excelData.getAssetNet());
  202. excelNavAssetSuccessDataVO.setAssetShare(excelData.getAssetShare());
  203. successDataVOList.add(excelNavAssetSuccessDataVO);
  204. }catch (Exception e){
  205. logger.error(e.getMessage(),e);
  206. ExcelNavAssetFailDataVO failDataVO = toExcelFailDataVO(excelData,e.getMessage(),dataIdx+startRow);
  207. excelFailDataVOList.add(failDataVO);
  208. }
  209. }
  210. result.put("success",successDataVOList);
  211. result.put("fail",excelFailDataVOList);
  212. return result;
  213. }
  214. private ExcelNavAssetFailDataVO toExcelFailDataVO(NavAssetExcelData excelData, String msg, int runNum) {
  215. ExcelNavAssetFailDataVO failDataVO = new ExcelNavAssetFailDataVO();
  216. failDataVO.setFailReason(msg);
  217. failDataVO.setRowNum(runNum);
  218. failDataVO.setFundName(excelData.getFundName());
  219. failDataVO.setPriceDate(excelData.getPriceDate());
  220. failDataVO.setNav(excelData.getNav());
  221. failDataVO.setCumulativeNavWithdrawal(excelData.getCumulativeNavWithdrawal());
  222. return failDataVO;
  223. }
  224. private List<NavAssetExcelData> parseDistributionFile(File file) {
  225. // 创建一个 list 存储每行的数据,即 ExcelData 对象
  226. List<NavAssetExcelData> list = new ArrayList<>();
  227. // 直接使用 EasyExcel 的 read 方法,同时定义表头的类型,以便将列中数据映射为 ExcelData 对象
  228. EasyExcel.read(file, NavAssetExcelData.class, new PageReadListener<NavAssetExcelData>(dataList -> {
  229. // 并且每行数据,并将其 add 至 list 中
  230. for (NavAssetExcelData excelData : dataList) {
  231. if (excelData != null) {
  232. list.add(excelData);
  233. }
  234. }
  235. })).excelType(ExcelTypeEnum.XLSX).sheet().doRead();
  236. return list;
  237. }
  238. }