DeviceSimServiceImpl.java 22 KB

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