# DbSendNotifyServiceImpl.java

    package cloud.wconnect.workperformance.service.database.impl;

    import cloud.wconnect.commonlib.component.BeanMapper;
    import cloud.wconnect.commonlib.cons.FunctionCons;
    import cloud.wconnect.commonlib.pojo.dto.NotifyDTO;
    import cloud.wconnect.commonlib.pojo.dto.NotifyIdentityDTO;
    import cloud.wconnect.commonlib.pojo.dto.PropertyDTO;
    import cloud.wconnect.commonlib.pojo.dto.line.ReportMissedMsgParm;
    import cloud.wconnect.commonlib.redis.PropertyBusinessDateRedisService;
    import cloud.wconnect.commonlib.util.EmailUtil;
    import cloud.wconnect.commonlib.util.I18nMessageUtils;
    import cloud.wconnect.commonlib.util.InternationalizationUtils;
    import cloud.wconnect.commonlib.util.LineMessageUtil;
    import cloud.wconnect.workperformance.cons.FunctionPointEnum;
    import cloud.wconnect.workperformance.cons.database.DbNotifyTypeEnum;
    import cloud.wconnect.workperformance.entity.database.DbEmailConfig;
    import cloud.wconnect.workperformance.service.database.IDbEmailConfigService;
    import cloud.wconnect.workperformance.service.database.IDbEmailTargetService;
    import cloud.wconnect.workperformance.service.database.IDbReportService;
    import cloud.wconnect.workperformance.service.database.IDbSendNotifyService;
    import com.alibaba.fastjson.JSONObject;
    import com.baomidou.dynamic.datasource.annotation.DS;
    import com.google.common.collect.Lists;
    import jakarta.annotation.Resource;
    import org.apache.commons.collections.CollectionUtils;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Service;
    import org.thymeleaf.TemplateEngine;
    import org.thymeleaf.context.Context;

    import java.util.List;
    import java.util.Objects;

    /**
     * <p>
     * Database 服务实现类
     * </p>
     *
     * @author zc
     * @since 2025-12-03
     */
    @Service
    @DS("database")
    public class DbSendNotifyServiceImpl implements IDbSendNotifyService {

        @Resource
        private PropertyBusinessDateRedisService propertyBusinessDateRedisService;
        @Resource
        private IDbReportService reportService;
        @Resource
        private IDbEmailConfigService emailConfigService;
        @Resource
        private IDbEmailTargetService emailTargetService;
        @Resource
        private LineMessageUtil lineMessageUtil;
        @Resource
        private I18nMessageUtils i18nMessageUtils;
        @Resource
        private TemplateEngine templateEngine;
        @Resource
        private BeanMapper beanMapper;

        @Value("${here.link.database}")
        private String link;

        /**
         * 获取通知配置DTO
         *
         * @param propertyDTO 资产
         * @param reportName  报告名称
         * @param notifyType  通知类型
         * @return NotifyDTO
         * @author zc
         * @date 2025/12/03
         */
        @Override
        public NotifyDTO getNotifyDTO(PropertyDTO propertyDTO, String reportName, int notifyType) {
            // 获取邮件配置
            DbEmailConfig emailConfig = emailConfigService.getEmailConfig(propertyDTO.getId(), notifyType);
            if (Objects.isNull(emailConfig)) {
                return null;
            }
            if (!emailConfig.getStatus()) {
                return null;
            }
            List<NotifyIdentityDTO> identityDTOList = emailTargetService.listByConfigId(emailConfig.getId()).stream()
                    .map(item -> beanMapper.map(item, NotifyIdentityDTO.class)).toList();
            if (CollectionUtils.isEmpty(identityDTOList)) {
                return null;
            }

            String hereLink = link + "?tenant=" + propertyDTO.getTenantSymbol() + "&property=" + propertyDTO.getAbbr();
            String functionName = i18nMessageUtils.message(FunctionCons.DATABASE, propertyDTO.getLanguage());
            String defaultSubject = i18nMessageUtils.message(DbNotifyTypeEnum.getDefaultSubjectI18nCode(notifyType),
                    propertyDTO.getLanguage(), functionName, propertyDTO.getName());
            String subject = StringUtils.isNotBlank(emailConfig.getSubject()) ? emailConfig.getSubject() : defaultSubject;
            String missDateStr = getMissDate(propertyDTO, notifyType);

            // 邮件通知内容
            Context context = new Context();
            context.setVariable("propertyName", propertyDTO.getName());
            context.setVariable("functionName", functionName);
            context.setVariable("reportName", reportName);
            context.setVariable("reportDate", missDateStr);
            context.setVariable("hereLink", hereLink);
            String processContent = templateEngine.process(EmailUtil.getMissReportTemplateName(propertyDTO.getLanguage()), context);
            String emailContent = EmailUtil.getFullEmailContent(defaultSubject, processContent, propertyDTO.getLanguage());

            // LINE 通知内容
            JSONObject lineMsg = lineMessageUtil.generateReportMissedMsg(ReportMissedMsgParm.builder()
                    .propertyId(propertyDTO.getId())
                    .propertyName(propertyDTO.getName())
                    .functionName(functionName)
                    .reportName(reportName)
                    .missDate(missDateStr)
                    .build());

            return NotifyDTO.builder()
                    .propertyId(propertyDTO.getId())
                    .subject(subject)
                    .emailContent(emailContent)
                    .lineContent(Lists.newArrayList(lineMsg))
                    .identityList(identityDTOList)
                    .functionPoint(FunctionPointEnum.PMS_DATABASE_REPORT_MISSED.getFunctionPoint())
                    .build();
        }

        /**
         * 获取缺失日期区间字符串
         *
         * @param propertyDTO 资产
         * @param category    分类
         * @return java.lang.String
         * @author zc
         * @date 2025/12/05
         */
        private String getMissDate(PropertyDTO propertyDTO, int category) {
            String language = propertyDTO.getLanguage();
            String pattern = propertyDTO.getInternationalization().getDateTime().getLongDate();
            long businessDate = propertyBusinessDateRedisService.getEffectiveBusinessDateOrDefault(propertyDTO.getId(), propertyDTO.getTimezone());
            List<Long> dateRange = reportService.getDateRange(businessDate, category);

            String startDateStr = InternationalizationUtils.formatYearMonthDate(dateRange.get(0), pattern, language);
            String endDateStr = InternationalizationUtils.formatYearMonthDate(dateRange.get(1), pattern, language);
            return startDateStr + " ~ " + endDateStr;
        }
    }