| | |
| | | */ |
| | | private static final int DEFAULT_REMIND_DAYS = 30; |
| | | /** |
| | | * 到期提醒站内信模板编号 |
| | | * 即将到期提醒站内信模板编号 |
| | | */ |
| | | private static final String REMIND_TEMPLATE_CODE = "mes_metering_expire_remind"; |
| | | /** |
| | | * 已过期提醒站内信模板编号 |
| | | */ |
| | | private static final String OVERDUE_TEMPLATE_CODE = "mes_metering_expire_overdue"; |
| | | |
| | | @Resource |
| | | private MesDvMeteringMapper meteringMapper; |
| | |
| | | } |
| | | // 2. 读取提醒天数(默认 30) |
| | | int remindDays = getRemindDays(); |
| | | // 3. 查询 [today, today + remindDays] 到期的器具 |
| | | List<MesDvMeteringDO> list = meteringMapper.selectListByNextCheckDateBetween( |
| | | // 3. 查询已过期(到期日 < 今天)与即将到期(到期日在 [today, today + remindDays])的器具 |
| | | List<MesDvMeteringDO> overdueList = meteringMapper.selectListByNextCheckDateBefore(today); |
| | | List<MesDvMeteringDO> dueList = meteringMapper.selectListByNextCheckDateBetween( |
| | | today, today.plusDays(remindDays)); |
| | | // 4. 逐台发送站内信(按器具 + 到期日去重) |
| | | for (MesDvMeteringDO metering : list) { |
| | | // 4. 逐台发送站内信(按器具 + 到期日去重,两类相互独立) |
| | | for (MesDvMeteringDO metering : overdueList) { |
| | | if (metering.getChargeUserId() == null || metering.getNextCheckDate() == null) { |
| | | continue; |
| | | } |
| | | if (!meteringRemindRedisDAO.tryMarkOverdueReminded(metering.getId(), metering.getNextCheckDate())) { |
| | | continue; |
| | | } |
| | | sendRemindMessage(metering, OVERDUE_TEMPLATE_CODE); |
| | | } |
| | | for (MesDvMeteringDO metering : dueList) { |
| | | if (metering.getChargeUserId() == null || metering.getNextCheckDate() == null) { |
| | | continue; |
| | | } |
| | | if (!meteringRemindRedisDAO.tryMarkReminded(metering.getId(), metering.getNextCheckDate())) { |
| | | continue; |
| | | } |
| | | sendRemindMessage(metering); |
| | | sendRemindMessage(metering, REMIND_TEMPLATE_CODE); |
| | | } |
| | | } catch (Exception ex) { |
| | | // best-effort:提醒失败不影响列表查询 |
| | |
| | | } |
| | | } |
| | | |
| | | private void sendRemindMessage(MesDvMeteringDO metering) { |
| | | private void sendRemindMessage(MesDvMeteringDO metering, String templateCode) { |
| | | Map<String, Object> params = new HashMap<>(); |
| | | params.put("meteringCode", metering.getCode()); |
| | | params.put("meteringName", metering.getName()); |
| | | params.put("nextCheckDate", metering.getNextCheckDate().toString()); |
| | | NotifySendSingleToUserReqDTO reqDTO = new NotifySendSingleToUserReqDTO() |
| | | .setUserId(metering.getChargeUserId()) |
| | | .setTemplateCode(REMIND_TEMPLATE_CODE) |
| | | .setTemplateCode(templateCode) |
| | | .setTemplateParams(params); |
| | | notifyMessageSendApi.sendSingleMessageToAdmin(reqDTO); |
| | | } |