DeviceSimChargeServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package com.xy.service;
  2. import com.alibaba.excel.annotation.ExcelProperty;
  3. import com.alibaba.excel.annotation.write.style.ColumnWidth;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.baomidou.mybatisplus.core.metadata.IPage;
  7. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8. import com.github.yitter.idgen.YitIdHelper;
  9. import com.xy.collections.list.JArrayList;
  10. import com.xy.collections.list.JList;
  11. import com.xy.config.DeviceThreadPoolConfig;
  12. import com.xy.config.FileConfig;
  13. import com.xy.dto.DeviceSimChargeDto;
  14. import com.xy.dto.OrderMercManageDto;
  15. import com.xy.dto.be.MercDto;
  16. import com.xy.entity.DeviceSimCharge;
  17. import com.xy.mapper.DeviceSimChargeMapper;
  18. import com.xy.service.be.MercService;
  19. import com.xy.util.ExcelUtils;
  20. import com.xy.utils.*;
  21. import io.swagger.annotations.Api;
  22. import io.swagger.annotations.ApiOperation;
  23. import lombok.AllArgsConstructor;
  24. import lombok.Data;
  25. import lombok.SneakyThrows;
  26. import lombok.experimental.Accessors;
  27. import org.springframework.stereotype.Service;
  28. import org.springframework.web.bind.annotation.PostMapping;
  29. import org.springframework.web.bind.annotation.RequestBody;
  30. import javax.servlet.http.HttpServletResponse;
  31. import java.io.File;
  32. import java.io.InputStream;
  33. import java.io.OutputStream;
  34. import java.util.Arrays;
  35. import java.util.List;
  36. import static com.xy.utils.Beans.copy;
  37. import static com.xy.utils.PlusBeans.toIPage;
  38. import static com.xy.utils.PlusBeans.toPageBean;
  39. /**
  40. * <p>
  41. * 设备流量卡充值表 服务实现类
  42. * </p>
  43. *
  44. * @author lijin
  45. * @since 2023-10-16
  46. */
  47. @Service
  48. @AllArgsConstructor
  49. @Api(tags = "设备流量卡充值表")
  50. public class DeviceSimChargeServiceImpl extends ServiceImpl<DeviceSimChargeMapper, DeviceSimCharge> implements DeviceSimChargeService {
  51. private OrderMercManageService orderMercManageService;
  52. private MercService mercService;
  53. private DeviceChargingHistoryServiceImpl deviceChargingHistoryService;
  54. private HttpServletResponse response;
  55. private FileConfig fileConfig;
  56. @PostMapping("page")
  57. @ApiOperation("分页查询")
  58. public R<PageBean<DeviceSimChargeDto.Vo>> page(@RequestBody DeviceSimChargeDto.Page page) {
  59. PageBean pageBean = page.getPage();
  60. LambdaQueryWrapper<DeviceSimCharge> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, DeviceSimCharge.class)
  61. .ge(DeviceSimCharge::getCreateTime, page.getBeginCreateTime())
  62. .le(DeviceSimCharge::getCreateTime, page.getEndCreateTime())
  63. .build()
  64. .orderByDesc(!Emptys.check(pageBean.getOrders()), DeviceSimCharge::getCreateTime);
  65. IPage<DeviceSimCharge> iPage = page(toIPage(pageBean), lambdaQueryWrapper);
  66. PageBean<DeviceSimChargeDto.Vo> voPageBean = toPageBean(DeviceSimChargeDto.Vo.class, iPage);
  67. List<DeviceSimChargeDto.Vo> records = voPageBean.getRecords();
  68. if (Emptys.check(records)) {
  69. copy(records)
  70. .target(() -> orderMercManageService.list(new OrderMercManageDto.SelectList().setId(new JArrayList<>(records).getProperty(DeviceSimChargeDto.Vo::getOrderId))).getData()
  71. , DeviceSimChargeDto.Vo::getOrderId, DeviceSimChargeDto.Vo::getFiles, OrderMercManageDto.Vo::getId, OrderMercManageDto.Vo::getFiles
  72. ).target(() -> mercService.list(new MercDto.SelectList().setMercIds(new JArrayList<>(records).getProperty(DeviceSimChargeDto.Vo::getMercId).comparing())).getData()
  73. , DeviceSimChargeDto.Vo::getMercId, DeviceSimChargeDto.Vo::getMercName, MercDto.Vo::getId, MercDto.Vo::getName)
  74. .builder();
  75. }
  76. return R.ok(voPageBean);
  77. }
  78. @ApiOperation("月统计分页")
  79. @PostMapping("moonCountPage")
  80. public R<PageBean<DeviceSimChargeDto.MoonCountVo>> moonCountPage(@RequestBody DeviceSimChargeDto.MoonCountPage moonCountPage) {
  81. JList<DeviceSimChargeDto.MoonCountVo> moonCountVos = new JArrayList<>();
  82. //查询数据
  83. List<String> attrNames = Arrays.asList(
  84. LambdaUtils.getUnderlineCaseName(DeviceSimCharge::getMercId)
  85. );
  86. List<String> selectNames = Arrays.asList(
  87. attrNames.get(0),
  88. String.format("count(*) %s", LambdaUtils.getProperty(DeviceSimCharge::getSize)),
  89. String.format("sum(%s) %s", LambdaUtils.getUnderlineCaseName(DeviceSimCharge::getMoney), LambdaUtils.getProperty(DeviceSimCharge::getMoney))
  90. );
  91. QueryWrapper<DeviceSimCharge> queryWrapper = new QueryWrapper<DeviceSimCharge>()
  92. .select(selectNames.toArray(new String[selectNames.size()]))
  93. .in(Emptys.check(moonCountPage.getMercIds()), attrNames.get(0), moonCountPage.getMercIds())
  94. .between("DATE_FORMAT(" + LambdaUtils.getUnderlineCaseName(DeviceSimCharge::getCreateTime) + ", '%Y-%m-%d')", moonCountPage.getBeginDate(), moonCountPage.getEndDate())
  95. .groupBy(attrNames);
  96. IPage<DeviceSimCharge> iPage = page(toIPage(moonCountPage.getPage()), queryWrapper);
  97. List<DeviceSimCharge> records = iPage.getRecords();
  98. if (!Emptys.check(records)) {
  99. return R.ok(new PageBean<>());
  100. }
  101. String date = String.format("%s~%s", moonCountPage.getBeginDate(), moonCountPage.getEndDate());
  102. records.forEach(deviceSimCharge -> {
  103. DeviceSimChargeDto.MoonCountVo moonCountVo = new DeviceSimChargeDto.MoonCountVo()
  104. .setDate(date)
  105. .setMercId(deviceSimCharge.getMercId())
  106. .setSimSize(deviceSimCharge.getSize())
  107. .setMoney(deviceSimCharge.getMoney());
  108. moonCountVos.add(moonCountVo);
  109. });
  110. //翻译商户名称
  111. Beans.copy(moonCountVos).target(() -> mercService.list(new MercDto.SelectList().setMercIds(moonCountVos.getProperty(DeviceSimChargeDto.MoonCountVo::getMercId).comparing())).getData(),
  112. DeviceSimChargeDto.MoonCountVo::getMercId, DeviceSimChargeDto.MoonCountVo::getMercName, MercDto.Vo::getId, MercDto.Vo::getName)
  113. .builder();
  114. PageBean<DeviceSimChargeDto.MoonCountVo> pageBean = new PageBean<DeviceSimChargeDto.MoonCountVo>()
  115. .setCurrent(iPage.getCurrent())
  116. .setSize(iPage.getSize())
  117. .setTotal(iPage.getTotal())
  118. .setRecords(moonCountVos);
  119. return R.ok(pageBean);
  120. }
  121. @ApiOperation("月统计")
  122. @PostMapping("moonCount")
  123. public R<List<DeviceSimChargeDto.MoonCountVo>> moonCount(@RequestBody DeviceSimChargeDto.MoonCount moonCount) {
  124. JList<DeviceSimChargeDto.MoonCountVo> moonCountVos = new JArrayList<>();
  125. //查询数据
  126. List<String> attrNames = Arrays.asList(
  127. LambdaUtils.getUnderlineCaseName(DeviceSimCharge::getMercId),
  128. "DATE_FORMAT(" + LambdaUtils.getUnderlineCaseName(DeviceSimCharge::getCreateTime) + ", '%Y-%m')"
  129. );
  130. List<String> selectNames = Arrays.asList(
  131. attrNames.get(0),
  132. attrNames.get(1) + " " + LambdaUtils.getProperty(DeviceSimCharge::getNote),
  133. String.format("count(*) %s", LambdaUtils.getProperty(DeviceSimCharge::getSize)),
  134. String.format("sum(%s) %s", LambdaUtils.getUnderlineCaseName(DeviceSimCharge::getMoney), LambdaUtils.getProperty(DeviceSimCharge::getMoney))
  135. );
  136. List<String> dateDifference = deviceChargingHistoryService.getDateDifference(moonCount.getBeginDate(), moonCount.getEndDate());
  137. ThreadPoolUtils.Execute execute = ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.DEVICE_COMMON_POLL, dateDifference.size());
  138. dateDifference.forEach(date -> execute.execute(() -> {
  139. QueryWrapper<DeviceSimCharge> queryWrapper = new QueryWrapper<DeviceSimCharge>()
  140. .select(selectNames.get(0), selectNames.get(1), selectNames.get(2), selectNames.get(3))
  141. .in(Emptys.check(moonCount.getMercIds()), attrNames.get(0), moonCount.getMercIds())
  142. .eq(attrNames.get(1), date)
  143. .groupBy(attrNames.get(0), attrNames.get(1));
  144. List<DeviceSimCharge> deviceSimCharges = list(queryWrapper);
  145. deviceSimCharges.forEach(deviceSimCharge -> {
  146. DeviceSimChargeDto.MoonCountVo moonCountVo = new DeviceSimChargeDto.MoonCountVo()
  147. .setDate(deviceSimCharge.getNote())
  148. .setMercId(deviceSimCharge.getMercId())
  149. .setSimSize(deviceSimCharge.getSize())
  150. .setMoney(deviceSimCharge.getMoney());
  151. moonCountVos.add(moonCountVo);
  152. });
  153. }));
  154. execute.end();
  155. //翻译商户名称
  156. Beans.copy(moonCountVos).target(() -> mercService.list(new MercDto.SelectList().setMercIds(moonCountVos.getProperty(DeviceSimChargeDto.MoonCountVo::getMercId).comparing())).getData(),
  157. DeviceSimChargeDto.MoonCountVo::getMercId, DeviceSimChargeDto.MoonCountVo::getMercName, MercDto.Vo::getId, MercDto.Vo::getName)
  158. .builder();
  159. return R.ok(moonCountVos.desc(DeviceSimChargeDto.MoonCountVo::getDate));
  160. }
  161. @SneakyThrows
  162. @ApiOperation("月统计导出")
  163. @PostMapping("moonCountDownload")
  164. public void moonCountDownload(@RequestBody DeviceSimChargeDto.MoonCount moonCount) {
  165. //生成excel
  166. String name = YitIdHelper.nextId() + ".xlsx";
  167. String path = fileConfig.getPath() + File.separator + name;
  168. ExcelUtils.SheetAndData<MoonCountData> sheetAndData = ExcelUtils.create(path, MoonCountData.class);
  169. sheetAndData.sheet("设备流量卡月统计数据", () -> {
  170. List<DeviceSimChargeDto.MoonCountVo> data = moonCount(moonCount).getData();
  171. if (!Emptys.check(data)) {
  172. return null;
  173. }
  174. return Beans.copy(MoonCountData.class, data);
  175. }).builder();
  176. //下载文件
  177. InputStream inputStream = IoUtils.inputStream(path).get();
  178. response.setHeader("Content-Disposition", "attachment; filename=" + "设备管理费月统计数据.xlsx");
  179. response.setContentType("application/xlsx");
  180. byte[] buffer = new byte[1024];
  181. int bytesRead;
  182. OutputStream outputStream = response.getOutputStream();
  183. while ((bytesRead = inputStream.read(buffer)) != -1) {
  184. outputStream.write(buffer, 0, bytesRead);
  185. }
  186. inputStream.close();
  187. outputStream.close();
  188. //删除文件
  189. new File(path).delete();
  190. }
  191. @Data
  192. @Accessors(chain = true)
  193. public static class MoonCountData {
  194. @ColumnWidth(25)
  195. @ExcelProperty(value = "统计时间 yyyy-MM")
  196. private String date;
  197. @ColumnWidth(25)
  198. @ExcelProperty(value = "商户id")
  199. private Long mercId;
  200. @ColumnWidth(25)
  201. @ExcelProperty(value = "商户名称")
  202. private String mercName;
  203. @ColumnWidth(25)
  204. @ExcelProperty(value = "卡数")
  205. private Integer simSize;
  206. @ColumnWidth(25)
  207. @ExcelProperty(value = "续费金额")
  208. private Integer money;
  209. }
  210. }