DeviceSimServiceImpl.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. package com.xy.service;
  2. import com.alibaba.excel.EasyExcel;
  3. import com.alibaba.excel.annotation.ExcelProperty;
  4. import com.alibaba.excel.annotation.write.style.ColumnWidth;
  5. import com.alibaba.excel.context.AnalysisContext;
  6. import com.alibaba.excel.read.listener.ReadListener;
  7. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  8. import com.baomidou.mybatisplus.core.metadata.IPage;
  9. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  10. import com.github.yitter.idgen.YitIdHelper;
  11. import com.xy.collections.list.JArrayList;
  12. import com.xy.collections.list.JList;
  13. import com.xy.collections.map.JMap;
  14. import com.xy.config.DeviceThreadPoolConfig;
  15. import com.xy.config.FileConfig;
  16. import com.xy.device.EnumSimConfig;
  17. import com.xy.dto.DeviceSimDto;
  18. import com.xy.entity.DeviceSim;
  19. import com.xy.entity.DeviceSimCharge;
  20. import com.xy.entity.SysDictRedis;
  21. import com.xy.mapper.DeviceSimMapper;
  22. import com.xy.sys.EnumMercCostMsgConfig;
  23. import com.xy.util.ExcelUtils;
  24. import com.xy.utils.*;
  25. import io.swagger.annotations.Api;
  26. import io.swagger.annotations.ApiOperation;
  27. import lombok.AllArgsConstructor;
  28. import lombok.Data;
  29. import lombok.RequiredArgsConstructor;
  30. import lombok.SneakyThrows;
  31. import lombok.extern.slf4j.Slf4j;
  32. import org.springframework.stereotype.Service;
  33. import org.springframework.validation.annotation.Validated;
  34. import org.springframework.web.bind.annotation.PostMapping;
  35. import org.springframework.web.bind.annotation.RequestBody;
  36. import org.springframework.web.bind.annotation.RequestParam;
  37. import org.springframework.web.multipart.MultipartFile;
  38. import javax.servlet.http.HttpServletResponse;
  39. import java.io.File;
  40. import java.io.IOException;
  41. import java.io.InputStream;
  42. import java.io.OutputStream;
  43. import java.time.LocalDate;
  44. import java.time.LocalDateTime;
  45. import java.time.format.DateTimeFormatter;
  46. import java.util.ArrayList;
  47. import java.util.List;
  48. import java.util.Map;
  49. import static com.xy.utils.PlusBeans.toIPage;
  50. import static com.xy.utils.PlusBeans.toPageBean;
  51. /**
  52. * <p>
  53. * 设备流量卡 服务实现类
  54. * </p>
  55. *
  56. * @author lijin
  57. * @since 2023-10-16
  58. */
  59. @Service
  60. @AllArgsConstructor
  61. @Api(tags = "设备流量卡")
  62. public class DeviceSimServiceImpl extends ServiceImpl<DeviceSimMapper, DeviceSim> implements DeviceSimService {
  63. private DeviceSimChargeServiceImpl deviceSimChargeService;
  64. private HttpServletResponse response;
  65. private FileConfig fileConfig;
  66. @Override
  67. @ApiOperation("购买")
  68. public R pay(DeviceSimDto.Pay pay) {
  69. LocalDateTime now = LocalDateTime.now();
  70. List<DeviceSimDto.Pay.DeviceSimCharge> deviceSimCharges = pay.getDeviceSimCharges();
  71. List<DeviceSimCharge> deviceSimChargess = new ArrayList<>(deviceSimCharges.size());
  72. deviceSimCharges.forEach(deviceSimCharge -> {
  73. DeviceSimCharge deviceSimChargeInfo = new DeviceSimCharge()
  74. .setId(YitIdHelper.nextId())
  75. .setOrderId(pay.getOrderId())
  76. .setSimId(deviceSimCharge.getSimId())
  77. .setMercId(pay.getMercId())
  78. .setMoney(deviceSimCharge.getMoney())
  79. .setSize(deviceSimCharge.getSize())
  80. .setPayType(pay.getPayType())
  81. .setNote(pay.getNote())
  82. .setCreateTime(now)
  83. .setUpdateTime(now);
  84. deviceSimChargess.add(deviceSimChargeInfo);
  85. });
  86. deviceSimChargeService.saveBatch(deviceSimChargess);
  87. return R.ok();
  88. }
  89. @Override
  90. @ApiOperation("购买回调")
  91. public R payNotice(DeviceSimDto.PayNotice payNotice) {
  92. //查询设备流量卡充值表
  93. List<DeviceSimCharge> list = deviceSimChargeService.list(new LambdaQueryWrapper<DeviceSimCharge>().eq(DeviceSimCharge::getOrderId, payNotice.getOrderId()));
  94. if (!Emptys.check(list)) {
  95. return R.ok();
  96. }
  97. //查询设备流量卡
  98. JList<DeviceSimCharge> deviceSimCharges = new JArrayList<>(list);
  99. JMap<String, DeviceSimCharge> deviceSimChargesJMaps = deviceSimCharges.toMap(DeviceSimCharge::getSimId).cover();
  100. List<DeviceSim> deviceSims = listByIds(deviceSimCharges.getProperty(DeviceSimCharge::getSimId));
  101. //循环处理
  102. LocalDateTime now = LocalDateTime.now();
  103. deviceSims.forEach(deviceSim -> {
  104. DeviceSimCharge deviceSimCharge = deviceSimChargesJMaps.get(deviceSim.getId());
  105. String newTimeout = deviceSimCharge.getPayType() == 100 ? DataTime.getStringAround(0, 0, deviceSimCharge.getSize(), 0, 0, 0)
  106. : DataTime.getStringAround(deviceSimCharge.getSize(), 0, 0, 0, 0, 0);
  107. long d = DataTime.diff(now, deviceSim.getTimeout(), "d");
  108. if (d > 0) {
  109. newTimeout = DataTime.getStringAround(0, 0, (int) d, 0, 0, 0, newTimeout);
  110. }
  111. deviceSim.setTimeout(DataTime.toLocal(newTimeout))
  112. .setWaitHandle(true)
  113. .setLastRenewalTime(now)
  114. .setUpdateTime(now);
  115. });
  116. updateBatchById(deviceSims);
  117. return R.ok();
  118. }
  119. @Override
  120. @ApiOperation("查询过期条数")
  121. public R<DeviceSimDto.DeviceSimTimeoutCountVo> deviceSimTimeoutCount(DeviceSimDto.DeviceSimTimeoutCount deviceSimTimeoutCount) {
  122. Map<String, SysDictRedis> stringSysDictRedisMap = SysDictUtils.get(EnumMercCostMsgConfig.Code.CODE.getCode());
  123. String now = DataTime.getSring();
  124. int day = Integer.valueOf(stringSysDictRedisMap.get(EnumMercCostMsgConfig.DEVICE_SIM_COST_DAY.getCode()).getValue());
  125. String end1 = DataTime.getStringAround(0, 0, day, 0, 0, 0, now);
  126. deviceSimTimeoutCount.setBegin1(now)
  127. .setEnd1(end1)
  128. .setEnd2(now);
  129. DeviceSimDto.DeviceSimTimeoutCountVo deviceSimTimeoutCountVo = baseMapper.deviceSimTimeoutCount(deviceSimTimeoutCount);
  130. return R.ok(deviceSimTimeoutCountVo);
  131. }
  132. @PostMapping("page")
  133. @ApiOperation("分页查询")
  134. public R<PageBean<DeviceSimDto.PageVo>> page(@RequestBody @Validated DeviceSimDto.Page page) {
  135. Map<String, SysDictRedis> simConfig = SysDictUtils.get(EnumSimConfig.Code.CODE.getCode());
  136. Integer value = Integer.valueOf(simConfig.get(EnumSimConfig.N_200.getCode()).getValue());
  137. String theTime = DataTime.getStringAround(0, 0, value, 0, 0, 0);
  138. page.setThisTime(LocalDateTime.now()).setTheTime(DataTime.toLocal(theTime));
  139. IPage<DeviceSimDto.PageVo> iPage = baseMapper.page(toIPage(page.getPage()), page);
  140. List<DeviceSimDto.PageVo> records = iPage.getRecords();
  141. if (Emptys.check(records)) {
  142. String name = simConfig.get(EnumSimConfig.name.getCode()).getValue();
  143. Integer money = Integer.valueOf(simConfig.get(EnumSimConfig.money.getCode()).getValue());
  144. records.forEach(record -> {
  145. //封装过期状态说明
  146. DeviceSimDto.Vo sim = record.getSim();
  147. if (Emptys.check(sim)) {
  148. String timeoutStatus;
  149. LocalDateTime timeout = sim.getTimeout();
  150. long s = DataTime.diff(page.getThisTime(), timeout, "s");
  151. if (s <= 0) {
  152. timeoutStatus = "欠费(" + (~(s / 86400 - 1)) + "天)";
  153. } else {
  154. timeoutStatus = s <= value * 86400 ? "即将到期(" + s / 86400 + "天)" : "正常(" + s / 86400 + "天)";
  155. }
  156. record.getSim().setTimeoutStatus(timeoutStatus);
  157. }
  158. //封装计费标准
  159. record.setChargingName(name).setChargingMoney(money);
  160. });
  161. }
  162. return R.ok(toPageBean(iPage));
  163. }
  164. @PostMapping("pageCount")
  165. @ApiOperation("分页数量查询")
  166. public R<DeviceSimDto.PageCountVo> pageCount(@RequestBody @Validated DeviceSimDto.PageCount pageCount) {
  167. Map<String, SysDictRedis> simConfig = SysDictUtils.get(EnumSimConfig.Code.CODE.getCode());
  168. Integer value = Integer.valueOf(simConfig.get(EnumSimConfig.N_200.getCode()).getValue());
  169. String theTime = DataTime.getStringAround(0, 0, value, 0, 0, 0);
  170. //并行数据
  171. DeviceSimDto.PageCountVo pageCountVo = new DeviceSimDto.PageCountVo();
  172. ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.DEVICE_COMMON_POLL, 4)
  173. .execute(() -> {
  174. //即将过期
  175. DeviceSimDto.PageCount paramsObj = Beans.copy(DeviceSimDto.PageCount.class, pageCount)
  176. .setChargingStatus(1)
  177. .setThisTime(LocalDateTime.now())
  178. .setTheTime(DataTime.toLocal(theTime));
  179. int count = baseMapper.pageCount(paramsObj);
  180. pageCountVo.setBeTimeoutCount(count);
  181. })
  182. .execute(() -> {
  183. //已过期
  184. DeviceSimDto.PageCount paramsObj = Beans.copy(DeviceSimDto.PageCount.class, pageCount)
  185. .setChargingStatus(2)
  186. .setThisTime(LocalDateTime.now())
  187. .setTheTime(DataTime.toLocal(theTime));
  188. int count = baseMapper.pageCount(paramsObj);
  189. pageCountVo.setTimeoutCount(count);
  190. })
  191. .execute(() -> {
  192. //已激活
  193. DeviceSimDto.PageCount paramsObj = Beans.copy(DeviceSimDto.PageCount.class, pageCount)
  194. .setIsActivate(true);
  195. int count = baseMapper.pageCount(paramsObj);
  196. pageCountVo.setIsActivate(count);
  197. })
  198. .execute(() -> {
  199. //未激活
  200. DeviceSimDto.PageCount paramsObj = Beans.copy(DeviceSimDto.PageCount.class, pageCount)
  201. .setIsActivate(false);
  202. int count = baseMapper.pageCount(paramsObj);
  203. pageCountVo.setIsNotActivate(count);
  204. })
  205. .end();
  206. return R.ok(pageCountVo);
  207. }
  208. @SneakyThrows
  209. @ApiOperation("导出流量卡数据")
  210. @PostMapping("download")
  211. public void download(@RequestBody DeviceSimDto.Download download) {
  212. //生成excel
  213. String name = YitIdHelper.nextId() + ".xlsx";
  214. String path = fileConfig.getPath() + File.separator + name;
  215. ExcelUtils.SheetAndData<UploadSim> sheetAndData = ExcelUtils.create(path, UploadSim.class);
  216. sheetAndData.sheet("流量卡数据", () -> {
  217. //生成导出数据
  218. Map<String, SysDictRedis> simConfig = SysDictUtils.get(EnumSimConfig.Code.CODE.getCode());
  219. Integer value = Integer.valueOf(simConfig.get(EnumSimConfig.N_200.getCode()).getValue());
  220. String theTime = DataTime.getStringAround(0, 0, value, 0, 0, 0);
  221. download.setThisTime(LocalDateTime.now()).setTheTime(DataTime.toLocal(theTime));
  222. List<DeviceSimDto.PageVo> pageVos = baseMapper.page(download);
  223. List<UploadSim> uploadSims = new ArrayList<>();
  224. pageVos.forEach(pageVo -> {
  225. UploadSim uploadSim = new UploadSim();
  226. uploadSim.setSimId(pageVo.getSimIccid());
  227. DeviceSimDto.Vo sim = pageVo.getSim();
  228. if (sim != null) {
  229. uploadSim.setType(sim.getType());
  230. uploadSim.setActivateTime(Emptys.check(sim.getActivateTime()) ? DataTime.toString(sim.getActivateTime(), "yyyy-MM-dd") : null);
  231. uploadSim.setTimeout(Emptys.check(sim.getTimeout()) ? DataTime.toString(sim.getTimeout(), "yyyy-MM-dd") : null);
  232. uploadSim.setLastRenewalTime(Emptys.check(sim.getLastRenewalTime()) ? DataTime.toString(sim.getLastRenewalTime(), "yyyy-MM-dd") : null);
  233. uploadSim.setBatchNo(sim.getBatchNo());
  234. }
  235. uploadSims.add(uploadSim);
  236. });
  237. //修改批次号
  238. if (Emptys.check(download.getBatchNo()) && Emptys.check(download.getIsUpdateBatchNo()) && download.getIsUpdateBatchNo()) {
  239. LocalDateTime now = LocalDateTime.now();
  240. List<DeviceSim> deviceSims = new ArrayList<>(uploadSims.size());
  241. uploadSims.forEach(uploadSim -> {
  242. DeviceSim deviceSim = new DeviceSim()
  243. .setId(uploadSim.getSimId())
  244. .setBatchNo(download.getBatchNo())
  245. .setWaitHandle(false)
  246. .setUpdateTime(now);
  247. deviceSims.add(deviceSim);
  248. });
  249. updateBatchById(deviceSims);
  250. }
  251. return uploadSims;
  252. }).builder();
  253. //下载文件
  254. InputStream inputStream = IoUtils.inputStream(path).get();
  255. response.setHeader("Content-Disposition", "attachment; filename=" + "sim_data.xlsx");
  256. response.setContentType("application/xlsx");
  257. byte[] buffer = new byte[1024];
  258. int bytesRead;
  259. OutputStream outputStream = response.getOutputStream();
  260. while ((bytesRead = inputStream.read(buffer)) != -1) {
  261. outputStream.write(buffer, 0, bytesRead);
  262. }
  263. inputStream.close();
  264. outputStream.close();
  265. //删除文件
  266. new File(path).delete();
  267. }
  268. @ApiOperation("导入流量卡号数据")
  269. @PostMapping("uploadSim")
  270. public R uploadSim(@RequestParam("file") MultipartFile file) {
  271. ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.DEVICE_COMMON_POLL, 1)
  272. .execute(() -> {
  273. try {
  274. EasyExcel.read(file.getInputStream(), UploadSim.class, new UploadSimListener(this)).sheet().doRead();
  275. } catch (IOException e) {
  276. log.error("", e);
  277. }
  278. });
  279. return R.ok();
  280. }
  281. @PostMapping("update")
  282. @ApiOperation("修改流量卡信息")
  283. public void update(@RequestBody @Validated DeviceSimDto.Update update) {
  284. List<String> ids = update.getId();
  285. LocalDateTime now = LocalDateTime.now();
  286. List<DeviceSim> deviceSims = new ArrayList<>(ids.size());
  287. ids.forEach(id -> {
  288. DeviceSim deviceSim = new DeviceSim()
  289. .setId(id)
  290. .setType(update.getType())
  291. .setActivateTime(update.getActivateTime())
  292. .setTimeout(update.getTimeout())
  293. .setLastRenewalTime(update.getLastRenewalTime())
  294. .setBatchNo(update.getBatchNo())
  295. .setUpdateTime(now);
  296. deviceSims.add(deviceSim);
  297. });
  298. updateBatchById(deviceSims);
  299. }
  300. @Slf4j
  301. @RequiredArgsConstructor
  302. public static class UploadSimListener implements ReadListener<UploadSim> {
  303. private final DeviceSimServiceImpl deviceSimService;
  304. private JList<UploadSim> sims = new JArrayList<>();
  305. /**
  306. * 这个每一条数据解析都会来调用
  307. *
  308. * @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()}
  309. * @param context
  310. */
  311. @Override
  312. public void invoke(UploadSim data, AnalysisContext context) {
  313. sims.add(data);
  314. }
  315. /**
  316. * 所有数据解析完成了 都会来调用
  317. *
  318. * @param context
  319. */
  320. @Override
  321. public void doAfterAllAnalysed(AnalysisContext context) {
  322. LocalDateTime now = LocalDateTime.now();
  323. JList<DeviceSim> saveDeviceSims = new JArrayList<>();
  324. DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  325. sims.forEach(uploadSim -> {
  326. DeviceSim deviceSim = new DeviceSim()
  327. .setId(uploadSim.getSimId().trim().replace("\"", "").replace("'", ""))
  328. .setType(uploadSim.getType())
  329. .setActivateTime(Emptys.check(uploadSim.getActivateTime()) ? LocalDate.parse(uploadSim.getActivateTime(), df).atTime(0, 0, 0) : null)
  330. .setTimeout(Emptys.check(uploadSim.getTimeout()) ? LocalDate.parse(uploadSim.getTimeout(), df).atTime(0, 0, 0) : null)
  331. .setLastRenewalTime(Emptys.check(uploadSim.getLastRenewalTime()) ? LocalDate.parse(uploadSim.getLastRenewalTime(), df).atTime(0, 0, 0) : null)
  332. .setCreateTime(now)
  333. .setUpdateTime(now);
  334. saveDeviceSims.add(deviceSim);
  335. });
  336. deviceSimService.saveOrUpdateBatch(saveDeviceSims);
  337. }
  338. }
  339. @Data
  340. public static class UploadSim {
  341. @ColumnWidth(25)
  342. @ExcelProperty(value = "流量卡号")
  343. private String simId;
  344. @ColumnWidth(25)
  345. @ExcelProperty(value = "类型")
  346. private String type;
  347. @ColumnWidth(25)
  348. @ExcelProperty(value = "批次号")
  349. private String batchNo;
  350. @ColumnWidth(50)
  351. @ExcelProperty(value = "激活时间")
  352. private String activateTime;
  353. @ColumnWidth(50)
  354. @ExcelProperty(value = "过期时间")
  355. private String timeout;
  356. @ColumnWidth(50)
  357. @ExcelProperty(value = "最后续费时间")
  358. private String lastRenewalTime;
  359. }
  360. }