# HotelKpiSendNotifyServiceImpl.java

    package cloud.wconnect.workperformance.service.hotelkpi.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.util.EmailUtil;
    import cloud.wconnect.commonlib.util.I18nMessageUtils;
    import cloud.wconnect.commonlib.util.LineMessageUtil;
    import cloud.wconnect.workperformance.cons.FunctionPointEnum;
    import cloud.wconnect.workperformance.cons.hotelkpi.HotelKpiNotifyTypeEnum;
    import cloud.wconnect.workperformance.entity.hotelkpi.HotelKpiEmailConfig;
    import cloud.wconnect.workperformance.service.hotelkpi.IHotelKpiEmailConfigService;
    import cloud.wconnect.workperformance.service.hotelkpi.IHotelKpiEmailTargetService;
    import cloud.wconnect.workperformance.service.hotelkpi.IHotelKpiSendNotifyService;
    import com.alibaba.fastjson.JSONObject;
    import com.baomidou.dynamic.datasource.annotation.DS;
    import com.google.common.collect.Lists;
    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 jakarta.annotation.Resource;
    import java.util.List;
    import java.util.Objects;

    /**
     * <p>
     * Hotel KPI Report 服务实现类
     * </p>
     *
     * @author zc
     * @since 2024-07-01
     */
    @Service
    @DS("work_performance")
    public class HotelKpiSendNotifyServiceImpl implements IHotelKpiSendNotifyService {

        @Resource
        private IHotelKpiEmailConfigService emailConfigService;
        @Resource
        private IHotelKpiEmailTargetService emailTargetService;
        @Resource
        private LineMessageUtil lineMessageUtil;
        @Resource
        private I18nMessageUtils i18nMessageUtils;
        @Resource
        private TemplateEngine templateEngine;
        @Resource
        private BeanMapper beanMapper;

        @Value("${here.link.hotel-kpi}")
        private String link;

        /**
         * 获取通知配置DTO
         *
         * @param propertyDTO 资产
         * @param reportName  报告名称
         * @param missDateStr 缺失日期
         * @param notifyType  通知类型
         * @return NotifyDTO
         * @author zc
         * @date 2024/7/1
         */
        @Override
        public NotifyDTO getNotifyDTO(PropertyDTO propertyDTO, String reportName, String missDateStr, int notifyType) {
            // 获取邮件配置
            HotelKpiEmailConfig 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.HOTEL_KPI, propertyDTO.getLanguage());
            String defaultSubject = i18nMessageUtils.message(HotelKpiNotifyTypeEnum.getDefaultSubjectI18nCode(notifyType),
                    propertyDTO.getLanguage(), functionName, propertyDTO.getName());
            String subject = StringUtils.isNotBlank(emailConfig.getSubject()) ? emailConfig.getSubject() : defaultSubject;

            // 邮件通知内容
            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.HOTEL_KPI_MISSING_REPORT.getFunctionPoint())
                    .build();
        }
    }