MercFeeCountDayJob.java 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636
  1. package com.xy.job;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.date.DatePattern;
  4. import cn.hutool.core.date.DateTime;
  5. import cn.hutool.core.date.DateUtil;
  6. import cn.hutool.core.date.LocalDateTimeUtil;
  7. import cn.hutool.core.util.StrUtil;
  8. import com.xxl.job.core.biz.model.ReturnT;
  9. import com.xxl.job.core.handler.annotation.XxlJob;
  10. import com.xy.annotate.RestMappingController;
  11. import com.xy.device.EnumDeviceActiveStatus;
  12. import com.xy.dto.*;
  13. import com.xy.dto.be.MercDto;
  14. import com.xy.entity.MercFeeCountDay;
  15. import com.xy.enums.MercStatus;
  16. import com.xy.error.CommRuntimeException;
  17. import com.xy.merc.EnumMercDeviceAlgorithmChargingPayType;
  18. import com.xy.service.*;
  19. import com.xy.service.be.MercFeignService;
  20. import com.xy.service.be.MercService;
  21. import com.xy.sys.EnumMercFeeType;
  22. import com.xy.utils.LambdaUtils;
  23. import com.xy.utils.PageBean;
  24. import com.xy.utils.R;
  25. import io.swagger.annotations.Api;
  26. import io.swagger.annotations.ApiOperation;
  27. import lombok.RequiredArgsConstructor;
  28. import lombok.extern.slf4j.Slf4j;
  29. import org.springframework.stereotype.Component;
  30. import org.springframework.validation.annotation.Validated;
  31. import org.springframework.web.bind.annotation.PostMapping;
  32. import org.springframework.web.bind.annotation.RequestBody;
  33. import java.time.LocalDate;
  34. import java.time.LocalDateTime;
  35. import java.time.format.DateTimeFormatter;
  36. import java.util.*;
  37. import java.util.stream.Collectors;
  38. /**
  39. * 商户佣金费用收益每日统计任务(不含今天) 每日凌晨1点执行
  40. */
  41. @Slf4j
  42. @Component
  43. @RequiredArgsConstructor
  44. @Api(tags = "商户佣金费用收益每日统计任务")
  45. @RestMappingController("job/feeCountDay")
  46. public class MercFeeCountDayJob {
  47. private final DeviceInfoService deviceInfoService;
  48. private final MercFeignService mercFeignService;
  49. private final DeviceChargingHistoryServiceImpl deviceChargingHistoryService;
  50. private final MercFeeCountDayServiceImpl mercFeeCountDayService;
  51. private final DeviceAlgorithmChargingHistoryServiceImpl deviceAlgorithmChargingHistoryService;
  52. private final MercDeviceAlgorithmChargingService mercDeviceAlgorithmChargingService;
  53. private final DeviceSimChargeServiceImpl deviceSimChargeService;
  54. private final MercService mercService;
  55. @PostMapping("queryByDay")
  56. @ApiOperation("指定日期查询")
  57. public R queryByDay(@RequestBody @Validated MercFeeCountDayDto.ExcuteDayDTO dto) {
  58. Integer type = dto.getType();
  59. String date = dto.getDate();
  60. DateTime yesterday = DateUtil.yesterday();
  61. String queryDay = DateUtil.format(yesterday, DatePattern.PURE_DATE_PATTERN);
  62. if (StrUtil.isNotEmpty(date)) {
  63. queryDay = date;
  64. }
  65. String monthValue = StrUtil.sub(queryDay, 0, 6);
  66. Integer dateValue = Integer.valueOf(queryDay);
  67. LocalDate dayDate = LocalDate.parse(queryDay, DateTimeFormatter.BASIC_ISO_DATE);
  68. LocalDateTime dayTime = dayDate.atStartOfDay();
  69. LocalDateTime beginTime = LocalDateTimeUtil.beginOfDay(dayTime);
  70. LocalDateTime endTime = LocalDateTimeUtil.endOfDay(dayTime);
  71. List<String> columnsMerc = Arrays.asList(LambdaUtils.getUnderlineCaseName(MercDto.Vo::getId));
  72. List<MercDto.Vo> approvedMercList = getApprovedMercList(columnsMerc);
  73. if (CollUtil.isEmpty(approvedMercList)) {
  74. return R.ok();
  75. }
  76. List<MercFeeCountDay> saveMercFeeCountList = new ArrayList<>();
  77. for (MercDto.Vo merc : approvedMercList) {
  78. Long parentMercId = merc.getId();
  79. List<Long> mercIds = R.feignCheckData(mercService.getChildMercIds(new MercDto.QuerySubDTO().setParentMercID(parentMercId)));
  80. if (CollUtil.isEmpty(mercIds)) {
  81. // 子商户都没有,就不用查分佣收益了
  82. continue;
  83. }
  84. //~~~~~~~~~~~~~1设备管理费
  85. if (type == 1) {
  86. PageBean<DeviceChargingHistoryDto.PageVo> pageVoPageBean = getDeviceManagerFeeMerc(parentMercId, beginTime, endTime);
  87. List<DeviceChargingHistoryDto.PageVo> records = pageVoPageBean == null ? null : pageVoPageBean.getRecords();
  88. if (CollUtil.isNotEmpty(records)) {
  89. // 根据设备分组获取,每台设备缴费金额
  90. Map<Long, Integer> devicePayMoneyMap = records.stream()
  91. .collect(Collectors.groupingBy(DeviceChargingHistoryDto.PageVo::getMercId,
  92. Collectors.summingInt(DeviceChargingHistoryDto.PageVo::getChargingMoney)));
  93. // 根据设备分组获取,每台设备佣金金额
  94. Map<Long, Integer> deviceAgentMoneyMap = records.stream()
  95. .collect(Collectors.groupingBy(DeviceChargingHistoryDto.PageVo::getMercId,
  96. Collectors.summingInt(DeviceChargingHistoryDto.PageVo::getAgentMoney)));
  97. Set<Long> subMercIdSet = devicePayMoneyMap.keySet();
  98. for (Long mercId : subMercIdSet) {
  99. Integer payMoney = devicePayMoneyMap.get(mercId);
  100. Integer brokerage = deviceAgentMoneyMap.get(mercId);
  101. MercFeeCountDay deviceDayFee = new MercFeeCountDay();
  102. deviceDayFee.setFeeType(EnumMercFeeType.T1.getIntCode());
  103. deviceDayFee.setParentMercId(parentMercId);
  104. deviceDayFee.setDateValue(dateValue);
  105. deviceDayFee.setPayMoney(payMoney);
  106. deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
  107. deviceDayFee.setBrokerage(brokerage);
  108. deviceDayFee.setMercId(mercId);
  109. deviceDayFee.setParentMercId(parentMercId);
  110. saveMercFeeCountList.add(deviceDayFee);
  111. }
  112. } else {
  113. // 没有费用的也要记录,为了前端收益概览的展示
  114. for (Long mercId : mercIds) {
  115. MercFeeCountDay deviceDayFee = new MercFeeCountDay();
  116. deviceDayFee.setFeeType(EnumMercFeeType.T1.getIntCode());
  117. deviceDayFee.setParentMercId(parentMercId);
  118. deviceDayFee.setDateValue(dateValue);
  119. deviceDayFee.setPayMoney(0);
  120. deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
  121. deviceDayFee.setBrokerage(0);
  122. deviceDayFee.setMercId(mercId);
  123. deviceDayFee.setParentMercId(parentMercId);
  124. saveMercFeeCountList.add(deviceDayFee);
  125. }
  126. }
  127. } else if (type == 2) {
  128. //~~~~~~~~~~~~~2设备激活费
  129. PageBean<DeviceAlgorithmChargingHistoryDto.PageByTopMercVO> deviceActiveFeeByMerc = getDeviceActiveFeeByMerc(parentMercId, beginTime, endTime);
  130. List<DeviceAlgorithmChargingHistoryDto.PageByTopMercVO> deviceActiveFeeList = deviceActiveFeeByMerc == null ? null : deviceActiveFeeByMerc.getRecords();
  131. if (CollUtil.isNotEmpty(deviceActiveFeeList)) {
  132. // 根据设备分组获取,每台设备缴费金额
  133. Map<Long, Integer> devicePayMoneyMap = deviceActiveFeeList.stream()
  134. .collect(Collectors.groupingBy(DeviceAlgorithmChargingHistoryDto.PageByTopMercVO::getMercId,
  135. Collectors.summingInt(DeviceAlgorithmChargingHistoryDto.PageByTopMercVO::getChargingMoney)));
  136. // 根据设备分组获取,每台设备佣金金额
  137. Map<Long, Integer> deviceAgentMoneyMap = deviceActiveFeeList.stream()
  138. .collect(Collectors.groupingBy(DeviceAlgorithmChargingHistoryDto.PageByTopMercVO::getMercId,
  139. Collectors.summingInt(DeviceAlgorithmChargingHistoryDto.PageByTopMercVO::getAgentMoney)));
  140. Set<Long> subMercIdSet = devicePayMoneyMap.keySet();
  141. for (Long mercId : subMercIdSet) {
  142. Integer payMoney = devicePayMoneyMap.get(mercId);
  143. Integer brokerage = deviceAgentMoneyMap.get(mercId);
  144. MercFeeCountDay deviceDayFee = new MercFeeCountDay();
  145. deviceDayFee.setFeeType(EnumMercFeeType.T2.getIntCode());
  146. deviceDayFee.setParentMercId(parentMercId);
  147. deviceDayFee.setDateValue(dateValue);
  148. deviceDayFee.setPayMoney(payMoney);
  149. deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
  150. deviceDayFee.setBrokerage(brokerage);
  151. deviceDayFee.setMercId(mercId);
  152. deviceDayFee.setParentMercId(parentMercId);
  153. saveMercFeeCountList.add(deviceDayFee);
  154. }
  155. } else {
  156. // 没有费用的也要记录,为了前端收益概览的展示
  157. for (Long mercId : mercIds) {
  158. MercFeeCountDay deviceDayFee = new MercFeeCountDay();
  159. deviceDayFee.setFeeType(EnumMercFeeType.T2.getIntCode());
  160. deviceDayFee.setParentMercId(parentMercId);
  161. deviceDayFee.setDateValue(dateValue);
  162. deviceDayFee.setPayMoney(0);
  163. deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
  164. deviceDayFee.setBrokerage(0);
  165. deviceDayFee.setMercId(mercId);
  166. deviceDayFee.setParentMercId(parentMercId);
  167. saveMercFeeCountList.add(deviceDayFee);
  168. }
  169. }
  170. } else if (type == 3) {
  171. //~~~~~~~~~~~~~3算法服务费
  172. PageBean<MercDeviceAlgorithmChargingDto.PageByTopMercVO> deviceAgFeeByMerc = getDeviceAgFeeByMerc(parentMercId, beginTime, endTime);
  173. List<MercDeviceAlgorithmChargingDto.PageByTopMercVO> deviceAgFeeList = deviceAgFeeByMerc == null ? null : deviceAgFeeByMerc.getRecords();
  174. if (CollUtil.isNotEmpty(deviceAgFeeList)) {
  175. // 根据设备分组获取,每台设备缴费金额
  176. Map<Long, Integer> devicePayMoneyMap = deviceAgFeeList.stream()
  177. .collect(Collectors.groupingBy(MercDeviceAlgorithmChargingDto.PageByTopMercVO::getMercId,
  178. Collectors.summingInt(MercDeviceAlgorithmChargingDto.PageByTopMercVO::getFeeBalance)));
  179. // 根据设备分组获取,每台设备佣金金额
  180. Map<Long, Integer> deviceAgentMoneyMap = deviceAgFeeList.stream()
  181. .collect(Collectors.groupingBy(MercDeviceAlgorithmChargingDto.PageByTopMercVO::getMercId,
  182. Collectors.summingInt(MercDeviceAlgorithmChargingDto.PageByTopMercVO::getFee)));
  183. Set<Long> subMercIdSet = devicePayMoneyMap.keySet();
  184. for (Long mercId : subMercIdSet) {
  185. Integer payMoney = devicePayMoneyMap.get(mercId);
  186. Integer brokerage = deviceAgentMoneyMap.get(mercId);
  187. MercFeeCountDay deviceDayFee = new MercFeeCountDay();
  188. deviceDayFee.setFeeType(EnumMercFeeType.T3.getIntCode());
  189. deviceDayFee.setParentMercId(parentMercId);
  190. deviceDayFee.setDateValue(dateValue);
  191. deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
  192. deviceDayFee.setPayMoney(payMoney);
  193. deviceDayFee.setBrokerage(brokerage);
  194. deviceDayFee.setMercId(mercId);
  195. deviceDayFee.setParentMercId(parentMercId);
  196. saveMercFeeCountList.add(deviceDayFee);
  197. }
  198. } else {
  199. // 没有费用的也要记录,为了前端收益概览的展示
  200. for (Long mercId : mercIds) {
  201. MercFeeCountDay deviceDayFee = new MercFeeCountDay();
  202. deviceDayFee.setFeeType(EnumMercFeeType.T3.getIntCode());
  203. deviceDayFee.setParentMercId(parentMercId);
  204. deviceDayFee.setDateValue(dateValue);
  205. deviceDayFee.setPayMoney(0);
  206. deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
  207. deviceDayFee.setBrokerage(0);
  208. deviceDayFee.setMercId(mercId);
  209. deviceDayFee.setParentMercId(parentMercId);
  210. saveMercFeeCountList.add(deviceDayFee);
  211. }
  212. }
  213. } else if (type == 4) {
  214. //~~~~~~~~~~~~~4流量卡费
  215. PageBean<DeviceSimChargeDto.PageByTopMercVO> simFeeByMerc = getSimFeeByMerc(parentMercId, beginTime, endTime);
  216. List<DeviceSimChargeDto.PageByTopMercVO> simFeeList = simFeeByMerc == null ? null : simFeeByMerc.getRecords();
  217. if (CollUtil.isNotEmpty(simFeeList)) {
  218. // 根据设备分组获取,每台设备缴费金额
  219. Map<Long, Integer> devicePayMoneyMap = simFeeList.stream()
  220. .collect(Collectors.groupingBy(DeviceSimChargeDto.PageByTopMercVO::getMercId,
  221. Collectors.summingInt(DeviceSimChargeDto.PageByTopMercVO::getMoney)));
  222. // 根据设备分组获取,每台设备佣金金额
  223. Map<Long, Integer> deviceAgentMoneyMap = simFeeList.stream()
  224. .collect(Collectors.groupingBy(DeviceSimChargeDto.PageByTopMercVO::getMercId,
  225. Collectors.summingInt(DeviceSimChargeDto.PageByTopMercVO::getAgentMoney)));
  226. Set<Long> subMercIdSet = devicePayMoneyMap.keySet();
  227. for (Long mercId : subMercIdSet) {
  228. Integer payMoney = devicePayMoneyMap.get(mercId);
  229. Integer brokerage = deviceAgentMoneyMap.get(mercId);
  230. MercFeeCountDay deviceDayFee = new MercFeeCountDay();
  231. deviceDayFee.setFeeType(EnumMercFeeType.T4.getIntCode());
  232. deviceDayFee.setParentMercId(parentMercId);
  233. deviceDayFee.setDateValue(dateValue);
  234. deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
  235. deviceDayFee.setPayMoney(payMoney);
  236. deviceDayFee.setBrokerage(brokerage);
  237. deviceDayFee.setMercId(mercId);
  238. deviceDayFee.setParentMercId(parentMercId);
  239. saveMercFeeCountList.add(deviceDayFee);
  240. }
  241. } else {
  242. // 没有费用的也要记录,为了前端收益概览的展示
  243. for (Long mercId : mercIds) {
  244. MercFeeCountDay deviceDayFee = new MercFeeCountDay();
  245. deviceDayFee.setFeeType(EnumMercFeeType.T4.getIntCode());
  246. deviceDayFee.setParentMercId(parentMercId);
  247. deviceDayFee.setDateValue(dateValue);
  248. deviceDayFee.setPayMoney(0);
  249. deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
  250. deviceDayFee.setBrokerage(0);
  251. deviceDayFee.setMercId(mercId);
  252. deviceDayFee.setParentMercId(parentMercId);
  253. saveMercFeeCountList.add(deviceDayFee);
  254. }
  255. }
  256. }
  257. }
  258. return R.ok(saveMercFeeCountList);
  259. }
  260. @PostMapping("excuteJob")
  261. @ApiOperation("指定日期执行")
  262. public R excuteJob(@RequestBody @Validated MercFeeCountDayDto.ExcuteDayDTO dto) {
  263. return R.ok(dayJob(dto.getDate()));
  264. }
  265. /**
  266. * 商户佣金费用收益每日统计(不含今天)
  267. * 类型 1设备管理费。2设备激活费。3算法扣费标准。4流量卡费
  268. *
  269. * @param date yyyyMMdd
  270. * @return
  271. */
  272. @XxlJob("mercFeeCountDayJob")
  273. public ReturnT<String> dayJob(String date) {
  274. log.info("-----------商户佣金费用收益每日统计 开始-----------");
  275. // long startTime = System.currentTimeMillis();
  276. DateTime yesterday = DateUtil.yesterday();
  277. String queryDay = DateUtil.format(yesterday, DatePattern.PURE_DATE_PATTERN);
  278. if (StrUtil.isNotEmpty(date)) {
  279. queryDay = date;
  280. // 指定日期需要判断是否重复执行
  281. MercFeeCountDayDto.SelectList selectList = new MercFeeCountDayDto.SelectList();
  282. selectList.setDateValue(Integer.valueOf(queryDay));
  283. List<MercFeeCountDayDto.Vo> vos = R.feignCheckData(mercFeeCountDayService.list(selectList));
  284. if (CollUtil.isNotEmpty(vos)) {
  285. throw new CommRuntimeException("已存在日期【" + date + "】的数据,请勿重复执行!");
  286. }
  287. }
  288. String monthValue = StrUtil.sub(queryDay, 0, 6);
  289. Integer dateValue = Integer.valueOf(queryDay);
  290. LocalDate dayDate = LocalDate.parse(queryDay, DateTimeFormatter.BASIC_ISO_DATE);
  291. LocalDateTime dayTime = dayDate.atStartOfDay();
  292. LocalDateTime beginTime = LocalDateTimeUtil.beginOfDay(dayTime);
  293. LocalDateTime endTime = LocalDateTimeUtil.endOfDay(dayTime);
  294. List<String> columnsMerc = Arrays.asList(LambdaUtils.getUnderlineCaseName(MercDto.Vo::getId));
  295. List<MercDto.Vo> approvedMercList = getApprovedMercList(columnsMerc);
  296. if (CollUtil.isEmpty(approvedMercList)) {
  297. return ReturnT.SUCCESS;
  298. }
  299. for (MercDto.Vo merc : approvedMercList) {
  300. Long parentMercId = merc.getId();
  301. List<Long> mercIds = R.feignCheckData(mercService.getChildMercIds(new MercDto.QuerySubDTO().setParentMercID(parentMercId)));
  302. if (CollUtil.isEmpty(mercIds)) {
  303. // 子商户都没有,就不用查分佣收益了
  304. continue;
  305. }
  306. //~~~~~~~~~~~~~1设备管理费
  307. PageBean<DeviceChargingHistoryDto.PageVo> pageVoPageBean = getDeviceManagerFeeMerc(parentMercId, beginTime, endTime);
  308. List<DeviceChargingHistoryDto.PageVo> records = pageVoPageBean == null ? null : pageVoPageBean.getRecords();
  309. if (CollUtil.isNotEmpty(records)) {
  310. // 根据设备分组获取,每台设备缴费金额
  311. Map<Long, Integer> devicePayMoneyMap = records.stream()
  312. .collect(Collectors.groupingBy(DeviceChargingHistoryDto.PageVo::getMercId,
  313. Collectors.summingInt(DeviceChargingHistoryDto.PageVo::getChargingMoney)));
  314. // 根据设备分组获取,每台设备佣金金额
  315. Map<Long, Integer> deviceAgentMoneyMap = records.stream()
  316. .collect(Collectors.groupingBy(DeviceChargingHistoryDto.PageVo::getMercId,
  317. Collectors.summingInt(DeviceChargingHistoryDto.PageVo::getAgentMoney)));
  318. Set<Long> subMercIdSet = devicePayMoneyMap.keySet();
  319. List<MercFeeCountDay> saveMercFeeCountList = new ArrayList<>();
  320. for (Long mercId : subMercIdSet) {
  321. Integer payMoney = devicePayMoneyMap.get(mercId);
  322. Integer brokerage = deviceAgentMoneyMap.get(mercId);
  323. MercFeeCountDay deviceDayFee = new MercFeeCountDay();
  324. deviceDayFee.setFeeType(EnumMercFeeType.T1.getIntCode());
  325. deviceDayFee.setParentMercId(parentMercId);
  326. deviceDayFee.setDateValue(dateValue);
  327. deviceDayFee.setPayMoney(payMoney);
  328. deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
  329. deviceDayFee.setBrokerage(brokerage);
  330. deviceDayFee.setMercId(mercId);
  331. deviceDayFee.setParentMercId(parentMercId);
  332. saveMercFeeCountList.add(deviceDayFee);
  333. }
  334. mercFeeCountDayService.saveBatch(saveMercFeeCountList);
  335. } else {
  336. // 没有费用的也要记录,为了前端收益概览的展示
  337. List<MercFeeCountDay> saveMercFeeCountList = new ArrayList<>();
  338. for (Long mercId : mercIds) {
  339. MercFeeCountDay deviceDayFee = new MercFeeCountDay();
  340. deviceDayFee.setFeeType(EnumMercFeeType.T1.getIntCode());
  341. deviceDayFee.setParentMercId(parentMercId);
  342. deviceDayFee.setDateValue(dateValue);
  343. deviceDayFee.setPayMoney(0);
  344. deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
  345. deviceDayFee.setBrokerage(0);
  346. deviceDayFee.setMercId(mercId);
  347. deviceDayFee.setParentMercId(parentMercId);
  348. saveMercFeeCountList.add(deviceDayFee);
  349. }
  350. mercFeeCountDayService.saveBatch(saveMercFeeCountList);
  351. }
  352. //~~~~~~~~~~~~~1设备管理费
  353. //~~~~~~~~~~~~~2设备激活费
  354. PageBean<DeviceAlgorithmChargingHistoryDto.PageByTopMercVO> deviceActiveFeeByMerc = getDeviceActiveFeeByMerc(parentMercId, beginTime, endTime);
  355. List<DeviceAlgorithmChargingHistoryDto.PageByTopMercVO> deviceActiveFeeList = deviceActiveFeeByMerc == null ? null : deviceActiveFeeByMerc.getRecords();
  356. if (CollUtil.isNotEmpty(deviceActiveFeeList)) {
  357. // 根据设备分组获取,每台设备缴费金额
  358. Map<Long, Integer> devicePayMoneyMap = deviceActiveFeeList.stream()
  359. .collect(Collectors.groupingBy(DeviceAlgorithmChargingHistoryDto.PageByTopMercVO::getMercId,
  360. Collectors.summingInt(DeviceAlgorithmChargingHistoryDto.PageByTopMercVO::getChargingMoney)));
  361. // 根据设备分组获取,每台设备佣金金额
  362. Map<Long, Integer> deviceAgentMoneyMap = deviceActiveFeeList.stream()
  363. .collect(Collectors.groupingBy(DeviceAlgorithmChargingHistoryDto.PageByTopMercVO::getMercId,
  364. Collectors.summingInt(DeviceAlgorithmChargingHistoryDto.PageByTopMercVO::getAgentMoney)));
  365. Set<Long> subMercIdSet = devicePayMoneyMap.keySet();
  366. List<MercFeeCountDay> saveMercFeeCountList = new ArrayList<>();
  367. for (Long mercId : subMercIdSet) {
  368. Integer payMoney = devicePayMoneyMap.get(mercId);
  369. Integer brokerage = deviceAgentMoneyMap.get(mercId);
  370. MercFeeCountDay deviceDayFee = new MercFeeCountDay();
  371. deviceDayFee.setFeeType(EnumMercFeeType.T2.getIntCode());
  372. deviceDayFee.setParentMercId(parentMercId);
  373. deviceDayFee.setDateValue(dateValue);
  374. deviceDayFee.setPayMoney(payMoney);
  375. deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
  376. deviceDayFee.setBrokerage(brokerage);
  377. deviceDayFee.setMercId(mercId);
  378. deviceDayFee.setParentMercId(parentMercId);
  379. saveMercFeeCountList.add(deviceDayFee);
  380. }
  381. mercFeeCountDayService.saveBatch(saveMercFeeCountList);
  382. } else {
  383. // 没有费用的也要记录,为了前端收益概览的展示
  384. List<MercFeeCountDay> saveMercFeeCountList = new ArrayList<>();
  385. for (Long mercId : mercIds) {
  386. MercFeeCountDay deviceDayFee = new MercFeeCountDay();
  387. deviceDayFee.setFeeType(EnumMercFeeType.T2.getIntCode());
  388. deviceDayFee.setParentMercId(parentMercId);
  389. deviceDayFee.setDateValue(dateValue);
  390. deviceDayFee.setPayMoney(0);
  391. deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
  392. deviceDayFee.setBrokerage(0);
  393. deviceDayFee.setMercId(mercId);
  394. deviceDayFee.setParentMercId(parentMercId);
  395. saveMercFeeCountList.add(deviceDayFee);
  396. }
  397. mercFeeCountDayService.saveBatch(saveMercFeeCountList);
  398. }
  399. //~~~~~~~~~~~~~2设备激活费
  400. //~~~~~~~~~~~~~3算法服务费
  401. PageBean<MercDeviceAlgorithmChargingDto.PageByTopMercVO> deviceAgFeeByMerc = getDeviceAgFeeByMerc(parentMercId, beginTime, endTime);
  402. List<MercDeviceAlgorithmChargingDto.PageByTopMercVO> deviceAgFeeList = deviceAgFeeByMerc == null ? null : deviceAgFeeByMerc.getRecords();
  403. if (CollUtil.isNotEmpty(deviceAgFeeList)) {
  404. // 根据设备分组获取,每台设备缴费金额
  405. Map<Long, Integer> devicePayMoneyMap = deviceAgFeeList.stream()
  406. .collect(Collectors.groupingBy(MercDeviceAlgorithmChargingDto.PageByTopMercVO::getMercId,
  407. Collectors.summingInt(MercDeviceAlgorithmChargingDto.PageByTopMercVO::getFeeBalance)));
  408. // 根据设备分组获取,每台设备佣金金额
  409. Map<Long, Integer> deviceAgentMoneyMap = deviceAgFeeList.stream()
  410. .collect(Collectors.groupingBy(MercDeviceAlgorithmChargingDto.PageByTopMercVO::getMercId,
  411. Collectors.summingInt(MercDeviceAlgorithmChargingDto.PageByTopMercVO::getFee)));
  412. Set<Long> subMercIdSet = devicePayMoneyMap.keySet();
  413. List<MercFeeCountDay> saveMercFeeCountList = new ArrayList<>();
  414. for (Long mercId : subMercIdSet) {
  415. Integer payMoney = devicePayMoneyMap.get(mercId);
  416. Integer brokerage = deviceAgentMoneyMap.get(mercId);
  417. MercFeeCountDay deviceDayFee = new MercFeeCountDay();
  418. deviceDayFee.setFeeType(EnumMercFeeType.T3.getIntCode());
  419. deviceDayFee.setParentMercId(parentMercId);
  420. deviceDayFee.setDateValue(dateValue);
  421. deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
  422. deviceDayFee.setPayMoney(payMoney);
  423. deviceDayFee.setBrokerage(brokerage);
  424. deviceDayFee.setMercId(mercId);
  425. deviceDayFee.setParentMercId(parentMercId);
  426. saveMercFeeCountList.add(deviceDayFee);
  427. }
  428. mercFeeCountDayService.saveBatch(saveMercFeeCountList);
  429. } else {
  430. // 没有费用的也要记录,为了前端收益概览的展示
  431. List<MercFeeCountDay> saveMercFeeCountList = new ArrayList<>();
  432. for (Long mercId : mercIds) {
  433. MercFeeCountDay deviceDayFee = new MercFeeCountDay();
  434. deviceDayFee.setFeeType(EnumMercFeeType.T3.getIntCode());
  435. deviceDayFee.setParentMercId(parentMercId);
  436. deviceDayFee.setDateValue(dateValue);
  437. deviceDayFee.setPayMoney(0);
  438. deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
  439. deviceDayFee.setBrokerage(0);
  440. deviceDayFee.setMercId(mercId);
  441. deviceDayFee.setParentMercId(parentMercId);
  442. saveMercFeeCountList.add(deviceDayFee);
  443. }
  444. mercFeeCountDayService.saveBatch(saveMercFeeCountList);
  445. }
  446. //~~~~~~~~~~~~~3算法服务费
  447. //~~~~~~~~~~~~~4流量卡费
  448. PageBean<DeviceSimChargeDto.PageByTopMercVO> simFeeByMerc = getSimFeeByMerc(parentMercId, beginTime, endTime);
  449. List<DeviceSimChargeDto.PageByTopMercVO> simFeeList = simFeeByMerc == null ? null : simFeeByMerc.getRecords();
  450. if (CollUtil.isNotEmpty(simFeeList)) {
  451. // 根据设备分组获取,每台设备缴费金额
  452. Map<Long, Integer> devicePayMoneyMap = simFeeList.stream()
  453. .collect(Collectors.groupingBy(DeviceSimChargeDto.PageByTopMercVO::getMercId,
  454. Collectors.summingInt(DeviceSimChargeDto.PageByTopMercVO::getMoney)));
  455. // 根据设备分组获取,每台设备佣金金额
  456. Map<Long, Integer> deviceAgentMoneyMap = simFeeList.stream()
  457. .collect(Collectors.groupingBy(DeviceSimChargeDto.PageByTopMercVO::getMercId,
  458. Collectors.summingInt(DeviceSimChargeDto.PageByTopMercVO::getAgentMoney)));
  459. Set<Long> subMercIdSet = devicePayMoneyMap.keySet();
  460. List<MercFeeCountDay> saveMercFeeCountList = new ArrayList<>();
  461. for (Long mercId : subMercIdSet) {
  462. Integer payMoney = devicePayMoneyMap.get(mercId);
  463. Integer brokerage = deviceAgentMoneyMap.get(mercId);
  464. MercFeeCountDay deviceDayFee = new MercFeeCountDay();
  465. deviceDayFee.setFeeType(EnumMercFeeType.T4.getIntCode());
  466. deviceDayFee.setParentMercId(parentMercId);
  467. deviceDayFee.setDateValue(dateValue);
  468. deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
  469. deviceDayFee.setPayMoney(payMoney);
  470. deviceDayFee.setBrokerage(brokerage);
  471. deviceDayFee.setMercId(mercId);
  472. deviceDayFee.setParentMercId(parentMercId);
  473. saveMercFeeCountList.add(deviceDayFee);
  474. }
  475. mercFeeCountDayService.saveBatch(saveMercFeeCountList);
  476. } else {
  477. // 没有费用的也要记录,为了前端收益概览的展示
  478. List<MercFeeCountDay> saveMercFeeCountList = new ArrayList<>();
  479. for (Long mercId : mercIds) {
  480. MercFeeCountDay deviceDayFee = new MercFeeCountDay();
  481. deviceDayFee.setFeeType(EnumMercFeeType.T4.getIntCode());
  482. deviceDayFee.setParentMercId(parentMercId);
  483. deviceDayFee.setDateValue(dateValue);
  484. deviceDayFee.setPayMoney(0);
  485. deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
  486. deviceDayFee.setBrokerage(0);
  487. deviceDayFee.setMercId(mercId);
  488. deviceDayFee.setParentMercId(parentMercId);
  489. saveMercFeeCountList.add(deviceDayFee);
  490. }
  491. mercFeeCountDayService.saveBatch(saveMercFeeCountList);
  492. }
  493. //~~~~~~~~~~~~~4流量卡费
  494. }
  495. return ReturnT.SUCCESS;
  496. }
  497. private List<MercDto.Vo> getApprovedMercList(List<String> columnsMerc) {
  498. return R.feignCheckData(mercFeignService.listMerc(new MercDto.ListDTO().setStatus(String.valueOf(MercStatus.APPROVED.getCode())).setColumnList(columnsMerc)));
  499. }
  500. /**
  501. * 指定商户已激活设备
  502. *
  503. * @param mercId
  504. * @return
  505. */
  506. private List<DeviceInfoDto.Vo> getActiveDevicesByMercId(Long mercId) {
  507. DeviceInfoDto.ListCommon listCommon = new DeviceInfoDto.ListCommon().setVo(new DeviceInfoDto.Vo().setActiveState(EnumDeviceActiveStatus.N_1.getIntCode()).setMercId(mercId));
  508. return R.feignCheckData(deviceInfoService.listCommon(listCommon));
  509. }
  510. /**
  511. * 获取指定商户的子商户设备管理费缴纳记录
  512. *
  513. * @param mercId
  514. * @param beginCreateTime 开始时间
  515. * @param endCreateTime 结束时间
  516. * @return
  517. */
  518. private PageBean<DeviceChargingHistoryDto.PageVo> getDeviceManagerFeeMerc(Long mercId, LocalDateTime beginCreateTime, LocalDateTime endCreateTime) {
  519. DeviceChargingHistoryDto.PageByTopMerc pageByTopMerc = new DeviceChargingHistoryDto.PageByTopMerc();
  520. PageBean page = new PageBean();
  521. page.setSize(-1);
  522. pageByTopMerc.setCurMercId(mercId);
  523. pageByTopMerc.setBeginCreateTime(beginCreateTime);
  524. pageByTopMerc.setEndCreateTime(endCreateTime);
  525. pageByTopMerc.setPage(page);
  526. return R.feignCheckData(deviceChargingHistoryService.pageByTopMerc(pageByTopMerc));
  527. }
  528. /**
  529. * 获取指定商户的子商户设备激活费缴纳记录
  530. *
  531. * @param mercId
  532. * @param beginCreateTime
  533. * @param endCreateTime
  534. * @return
  535. */
  536. private PageBean<DeviceAlgorithmChargingHistoryDto.PageByTopMercVO> getDeviceActiveFeeByMerc(Long mercId, LocalDateTime beginCreateTime, LocalDateTime endCreateTime) {
  537. DeviceAlgorithmChargingHistoryDto.PageByTopMerc pageByTopMerc = new DeviceAlgorithmChargingHistoryDto.PageByTopMerc();
  538. PageBean page = new PageBean();
  539. page.setSize(-1);
  540. pageByTopMerc.setCurMercId(mercId);
  541. pageByTopMerc.setBeginCreateTime(beginCreateTime);
  542. pageByTopMerc.setEndCreateTime(endCreateTime);
  543. pageByTopMerc.setPage(page);
  544. return R.feignCheckData(deviceAlgorithmChargingHistoryService.pageByTopMerc(pageByTopMerc));
  545. }
  546. /**
  547. * 获取指定商户的子商户设备算法服务费缴纳记录
  548. *
  549. * @param mercId
  550. * @param beginCreateTime
  551. * @param endCreateTime
  552. * @return
  553. */
  554. private PageBean<MercDeviceAlgorithmChargingDto.PageByTopMercVO> getDeviceAgFeeByMerc(Long mercId, LocalDateTime beginCreateTime, LocalDateTime endCreateTime) {
  555. MercDeviceAlgorithmChargingDto.PageByTopMerc pageByTopMerc = new MercDeviceAlgorithmChargingDto.PageByTopMerc();
  556. PageBean page = new PageBean();
  557. page.setSize(-1);
  558. String payType = EnumMercDeviceAlgorithmChargingPayType.N_2.getCode();
  559. pageByTopMerc.setPayType(Integer.valueOf(payType));
  560. pageByTopMerc.setCurMercId(mercId);
  561. pageByTopMerc.setBeginCreateTime(beginCreateTime);
  562. pageByTopMerc.setEndCreateTime(endCreateTime);
  563. pageByTopMerc.setPage(page);
  564. return R.feignCheckData(mercDeviceAlgorithmChargingService.pageByMerc(pageByTopMerc));
  565. }
  566. /**
  567. * 获取指定商户的子商户流量卡缴纳记录
  568. *
  569. * @param mercId
  570. * @param beginCreateTime
  571. * @param endCreateTime
  572. * @return
  573. */
  574. private PageBean<DeviceSimChargeDto.PageByTopMercVO> getSimFeeByMerc(Long mercId, LocalDateTime beginCreateTime, LocalDateTime endCreateTime) {
  575. DeviceSimChargeDto.PageByTopMerc pageByTopMerc = new DeviceSimChargeDto.PageByTopMerc();
  576. PageBean page = new PageBean();
  577. page.setSize(-1);
  578. pageByTopMerc.setStatus(2);
  579. pageByTopMerc.setCurMercId(mercId);
  580. pageByTopMerc.setBeginCreateTime(beginCreateTime);
  581. pageByTopMerc.setEndCreateTime(endCreateTime);
  582. pageByTopMerc.setPage(page);
  583. return R.feignCheckData(deviceSimChargeService.pageByTopMerc(pageByTopMerc));
  584. }
  585. }