njs 1 year ago
parent
commit
249ae18a25

+ 13 - 0
suishenbang-quartz/src/main/java/com/dgtly/quartz/task/RyTask.java

@@ -171,4 +171,17 @@ public class RyTask
     public void  salesOrderBaseByCreditStatus(){
         HanaSalesOrderService.updateSalesOrderBaseNoCrditStatus();
     }
+
+    /**
+     * @description: 业绩进度指标预警邮件/企微消息通知
+     * @param:
+     * @return:
+     * @author: njs
+     * @date: 2024/2/4 9:21
+     */
+    public void sendMailAndWxEarlyTucMessage(){
+        wxSendMessageService.sendMailAndWxEarlyTucMessage();
+    }
+
+
 }

+ 128 - 0
suishenbang-system/src/main/java/com/dgtly/system/domain/OrderTucEarlyWarning.java

@@ -0,0 +1,128 @@
+package com.dgtly.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dgtly.common.annotation.Excel;
+import com.dgtly.common.core.domain.BaseEntity;
+
+/**
+ * 预警业绩进度指标对象 order_tuc_early_warning
+ * 
+ * @author njs
+ * @date 2024-02-04
+ */
+public class OrderTucEarlyWarning extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private Long earlyId;
+
+    /** 是否删除 */
+    @Excel(name = "是否删除")
+    private Long isDelete;
+
+    /** 组织级别 */
+    @Excel(name = "组织级别")
+    private String salesLevel;
+
+    /** 组织机构 */
+    @Excel(name = "组织机构")
+    private String orgCode;
+
+    /** 组织名称 */
+    @Excel(name = "组织名称")
+    private String orgName;
+
+    /** 已复核 */
+    @Excel(name = "已复核")
+    private String orgNetValue;
+
+    /** 预算 */
+    @Excel(name = "预算")
+    private String orgTarget;
+
+
+
+    public void setEarlyId(Long earlyId) 
+    {
+        this.earlyId = earlyId;
+    }
+
+    public Long getEarlyId() 
+    {
+        return earlyId;
+    }
+    public void setIsDelete(Long isDelete) 
+    {
+        this.isDelete = isDelete;
+    }
+
+    public Long getIsDelete() 
+    {
+        return isDelete;
+    }
+    public void setSalesLevel(String salesLevel) 
+    {
+        this.salesLevel = salesLevel;
+    }
+
+    public String getSalesLevel() 
+    {
+        return salesLevel;
+    }
+    public void setOrgCode(String orgCode) 
+    {
+        this.orgCode = orgCode;
+    }
+
+    public String getOrgCode() 
+    {
+        return orgCode;
+    }
+    public void setOrgName(String orgName) 
+    {
+        this.orgName = orgName;
+    }
+
+    public String getOrgName() 
+    {
+        return orgName;
+    }
+    public void setOrgNetValue(String orgNetValue) 
+    {
+        this.orgNetValue = orgNetValue;
+    }
+
+    public String getOrgNetValue() 
+    {
+        return orgNetValue;
+    }
+    public void setOrgTarget(String orgTarget) 
+    {
+        this.orgTarget = orgTarget;
+    }
+
+    public String getOrgTarget() 
+    {
+        return orgTarget;
+    }
+
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("earlyId", getEarlyId())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("isDelete", getIsDelete())
+            .append("salesLevel", getSalesLevel())
+            .append("orgCode", getOrgCode())
+            .append("orgName", getOrgName())
+            .append("orgNetValue", getOrgNetValue())
+            .append("orgTarget", getOrgTarget())
+            .toString();
+    }
+}

+ 83 - 0
suishenbang-system/src/main/java/com/dgtly/system/mapper/OrderTucEarlyWarningMapper.java

@@ -0,0 +1,83 @@
+package com.dgtly.system.mapper;
+
+import com.dgtly.system.domain.OrderTucEarlyWarning;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 预警业绩进度指标Mapper接口
+ * 
+ * @author njs
+ * @date 2024-02-04
+ */
+public interface OrderTucEarlyWarningMapper 
+{
+    /**
+     * 查询预警业绩进度指标
+     * 
+     * @param earlyId 预警业绩进度指标ID
+     * @return 预警业绩进度指标
+     */
+    public OrderTucEarlyWarning selectOrderTucEarlyWarningById(Long earlyId);
+
+    /**
+     * 查询预警业绩进度指标列表
+     * 
+     * @param orderTucEarlyWarning 预警业绩进度指标
+     * @return 预警业绩进度指标集合
+     */
+    public List<OrderTucEarlyWarning> selectOrderTucEarlyWarningList(OrderTucEarlyWarning orderTucEarlyWarning);
+
+    /**
+     * 新增预警业绩进度指标
+     * 
+     * @param orderTucEarlyWarning 预警业绩进度指标
+     * @return 结果
+     */
+    public int insertOrderTucEarlyWarning(OrderTucEarlyWarning orderTucEarlyWarning);
+
+    public int batchInsert(@Param("list") List<OrderTucEarlyWarning> list);
+
+    /**
+     * 修改预警业绩进度指标
+     * 
+     * @param orderTucEarlyWarning 预警业绩进度指标
+     * @return 结果
+     */
+    public int updateOrderTucEarlyWarning(OrderTucEarlyWarning orderTucEarlyWarning);
+
+    /**
+     * 删除预警业绩进度指标
+     * 
+     * @param earlyId 预警业绩进度指标ID
+     * @return 结果
+     */
+    public int deleteOrderTucEarlyWarningById(Long earlyId);
+
+    /**
+     * 批量删除预警业绩进度指标
+     * 
+     * @param earlyIds 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteOrderTucEarlyWarningByIds(String[] earlyIds);
+
+    /**
+     * @description:
+     * @param:
+     * @return:
+     * @author: njs
+     * @date: 2024/2/4 9:48
+     */
+    public OrderTucEarlyWarning selectOrderTucEarlyWarning(@Param("orgCode") String orgCode);
+
+    /**
+     * @description: TUC业绩指标
+     * @param: [startTime, endTime]
+     * @return: java.util.List<com.dgtly.system.domain.OrderTucEarlyWarning>
+     * @author: njs     
+     * @date: 2024/2/4 14:57
+     */
+    public List<OrderTucEarlyWarning> selectTucGroupSales(@Param("startTime") String startTime,@Param("endTime") String endTime);
+}

+ 72 - 0
suishenbang-system/src/main/java/com/dgtly/system/service/IOrderTucEarlyWarningService.java

@@ -0,0 +1,72 @@
+package com.dgtly.system.service;
+
+import com.dgtly.system.domain.OrderTucEarlyWarning;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 预警业绩进度指标Service接口
+ * 
+ * @author njs
+ * @date 2024-02-04
+ */
+public interface IOrderTucEarlyWarningService 
+{
+    /**
+     * 查询预警业绩进度指标
+     * 
+     * @param earlyId 预警业绩进度指标ID
+     * @return 预警业绩进度指标
+     */
+    public OrderTucEarlyWarning selectOrderTucEarlyWarningById(Long earlyId);
+
+    /**
+     * 查询预警业绩进度指标列表
+     * 
+     * @param orderTucEarlyWarning 预警业绩进度指标
+     * @return 预警业绩进度指标集合
+     */
+    public List<OrderTucEarlyWarning> selectOrderTucEarlyWarningList(OrderTucEarlyWarning orderTucEarlyWarning);
+
+    /**
+     * 新增预警业绩进度指标
+     * 
+     * @param orderTucEarlyWarning 预警业绩进度指标
+     * @return 结果
+     */
+    public int insertOrderTucEarlyWarning(OrderTucEarlyWarning orderTucEarlyWarning);
+
+    /**
+     * 修改预警业绩进度指标
+     * 
+     * @param orderTucEarlyWarning 预警业绩进度指标
+     * @return 结果
+     */
+    public int updateOrderTucEarlyWarning(OrderTucEarlyWarning orderTucEarlyWarning);
+
+    /**
+     * 批量删除预警业绩进度指标
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteOrderTucEarlyWarningByIds(String ids);
+
+    /**
+     * 删除预警业绩进度指标信息
+     * 
+     * @param earlyId 预警业绩进度指标ID
+     * @return 结果
+     */
+    public int deleteOrderTucEarlyWarningById(Long earlyId);
+    
+    /**
+     * @description: 根据组织编码查业绩指标
+     * @param: [orgCode]
+     * @return: com.dgtly.system.domain.OrderTucEarlyWarning
+     * @author: njs     
+     * @date: 2024/2/4 9:53
+     */
+    public OrderTucEarlyWarning selectOrderTucEarlyWarning(@Param("orgCode") String orgCode);
+}

+ 110 - 0
suishenbang-system/src/main/java/com/dgtly/system/service/impl/OrderTucEarlyWarningServiceImpl.java

@@ -0,0 +1,110 @@
+package com.dgtly.system.service.impl;
+
+import java.util.List;
+import com.dgtly.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dgtly.system.mapper.OrderTucEarlyWarningMapper;
+import com.dgtly.system.domain.OrderTucEarlyWarning;
+import com.dgtly.system.service.IOrderTucEarlyWarningService;
+import com.dgtly.common.core.text.Convert;
+
+/**
+ * 预警业绩进度指标Service业务层处理
+ * 
+ * @author njs
+ * @date 2024-02-04
+ */
+@Service
+public class OrderTucEarlyWarningServiceImpl implements IOrderTucEarlyWarningService 
+{
+    @Autowired
+    private OrderTucEarlyWarningMapper orderTucEarlyWarningMapper;
+
+    /**
+     * 查询预警业绩进度指标
+     * 
+     * @param earlyId 预警业绩进度指标ID
+     * @return 预警业绩进度指标
+     */
+    @Override
+    public OrderTucEarlyWarning selectOrderTucEarlyWarningById(Long earlyId)
+    {
+        return orderTucEarlyWarningMapper.selectOrderTucEarlyWarningById(earlyId);
+    }
+
+    /**
+     * 查询预警业绩进度指标列表
+     * 
+     * @param orderTucEarlyWarning 预警业绩进度指标
+     * @return 预警业绩进度指标
+     */
+    @Override
+    public List<OrderTucEarlyWarning> selectOrderTucEarlyWarningList(OrderTucEarlyWarning orderTucEarlyWarning)
+    {
+        return orderTucEarlyWarningMapper.selectOrderTucEarlyWarningList(orderTucEarlyWarning);
+    }
+
+    /**
+     * 新增预警业绩进度指标
+     * 
+     * @param orderTucEarlyWarning 预警业绩进度指标
+     * @return 结果
+     */
+    @Override
+    public int insertOrderTucEarlyWarning(OrderTucEarlyWarning orderTucEarlyWarning)
+    {
+        orderTucEarlyWarning.setCreateTime(DateUtils.getNowDate());
+        return orderTucEarlyWarningMapper.insertOrderTucEarlyWarning(orderTucEarlyWarning);
+    }
+
+    /**
+     * 修改预警业绩进度指标
+     * 
+     * @param orderTucEarlyWarning 预警业绩进度指标
+     * @return 结果
+     */
+    @Override
+    public int updateOrderTucEarlyWarning(OrderTucEarlyWarning orderTucEarlyWarning)
+    {
+        orderTucEarlyWarning.setUpdateTime(DateUtils.getNowDate());
+        return orderTucEarlyWarningMapper.updateOrderTucEarlyWarning(orderTucEarlyWarning);
+    }
+
+    /**
+     * 删除预警业绩进度指标对象
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    @Override
+    public int deleteOrderTucEarlyWarningByIds(String ids)
+    {
+        return orderTucEarlyWarningMapper.deleteOrderTucEarlyWarningByIds(Convert.toStrArray(ids));
+    }
+
+    /**
+     * 删除预警业绩进度指标信息
+     * 
+     * @param earlyId 预警业绩进度指标ID
+     * @return 结果
+     */
+    @Override
+    public int deleteOrderTucEarlyWarningById(Long earlyId)
+    {
+        return orderTucEarlyWarningMapper.deleteOrderTucEarlyWarningById(earlyId);
+    }
+
+    /**
+     * @param orgCode
+     * @description: 根据组织编码查业绩指标
+     * @param: [orgCode]
+     * @return: com.dgtly.system.domain.OrderTucEarlyWarning
+     * @author: njs
+     * @date: 2024/2/4 9:50
+     */
+    @Override
+    public OrderTucEarlyWarning selectOrderTucEarlyWarning(String orgCode) {
+        return orderTucEarlyWarningMapper.selectOrderTucEarlyWarning(orgCode);
+    }
+}

+ 179 - 0
suishenbang-system/src/main/resources/mapper/system/OrderTucEarlyWarningMapper.xml

@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dgtly.system.mapper.OrderTucEarlyWarningMapper">
+    
+    <resultMap type="com.dgtly.system.domain.OrderTucEarlyWarning" id="OrderTucEarlyWarningResult">
+        <result property="earlyId"    column="early_id"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="isDelete"    column="is_delete"    />
+        <result property="salesLevel"    column="sales_level"    />
+        <result property="orgCode"    column="org_code"    />
+        <result property="orgName"    column="org_name"    />
+        <result property="orgNetValue"    column="org_net_value"    />
+        <result property="orgTarget"    column="org_target"    />
+    </resultMap>
+
+    <sql id="selectOrderTucEarlyWarningVo">
+        select early_id, create_by, create_time, update_by, update_time, is_delete, sales_level, org_code, org_name, org_net_value, org_target from order_tuc_early_warning
+    </sql>
+
+    <select id="selectOrderTucEarlyWarningList" parameterType="OrderTucEarlyWarning" resultMap="OrderTucEarlyWarningResult">
+        <include refid="selectOrderTucEarlyWarningVo"/>
+        <where>  
+            <if test="isDelete != null "> and is_delete = #{isDelete}</if>
+            <if test="salesLevel != null  and salesLevel != ''"> and sales_level = #{salesLevel}</if>
+            <if test="orgCode != null  and orgCode != ''"> and org_code = #{orgCode}</if>
+            <if test="orgName != null  and orgName != ''"> and org_name like concat('%', #{orgName}, '%')</if>
+            <if test="orgNetValue != null  and orgNetValue != ''"> and org_net_value = #{orgNetValue}</if>
+            <if test="orgTarget != null  and orgTarget != ''"> and org_target = #{orgTarget}</if>
+        </where>
+    </select>
+    
+    <select id="selectOrderTucEarlyWarningById" parameterType="Long" resultMap="OrderTucEarlyWarningResult">
+        <include refid="selectOrderTucEarlyWarningVo"/>
+        where early_id = #{earlyId}
+    </select>
+        
+    <insert id="insertOrderTucEarlyWarning" parameterType="OrderTucEarlyWarning" useGeneratedKeys="true" keyProperty="earlyId">
+        insert into order_tuc_early_warning
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="updateBy != null  and updateBy != ''">update_by,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="isDelete != null ">is_delete,</if>
+            <if test="salesLevel != null  and salesLevel != ''">sales_level,</if>
+            <if test="orgCode != null  and orgCode != ''">org_code,</if>
+            <if test="orgName != null  and orgName != ''">org_name,</if>
+            <if test="orgNetValue != null  and orgNetValue != ''">org_net_value,</if>
+            <if test="orgTarget != null  and orgTarget != ''">org_target,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="isDelete != null ">#{isDelete},</if>
+            <if test="salesLevel != null  and salesLevel != ''">#{salesLevel},</if>
+            <if test="orgCode != null  and orgCode != ''">#{orgCode},</if>
+            <if test="orgName != null  and orgName != ''">#{orgName},</if>
+            <if test="orgNetValue != null  and orgNetValue != ''">#{orgNetValue},</if>
+            <if test="orgTarget != null  and orgTarget != ''">#{orgTarget},</if>
+         </trim>
+    </insert>
+
+    <insert id="batchInsert" parameterType="java.util.List">
+        insert into order_tuc_early_warning (create_time, update_time,sales_level,org_code,org_name,org_net_value,org_target) values
+        <foreach collection="list" item="model" index="index" separator=",">
+            (#{model.createTime}, #{model.updateTime},#{model.salesLevel},#{model.orgCode},#{model.orgName},#{model.orgNetValue},#{model.orgTarget})
+        </foreach>
+    </insert>
+
+
+
+    <update id="updateOrderTucEarlyWarning" parameterType="OrderTucEarlyWarning">
+        update order_tuc_early_warning
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="isDelete != null ">is_delete = #{isDelete},</if>
+            <if test="salesLevel != null  and salesLevel != ''">sales_level = #{salesLevel},</if>
+            <if test="orgCode != null  and orgCode != ''">org_code = #{orgCode},</if>
+            <if test="orgName != null  and orgName != ''">org_name = #{orgName},</if>
+            <if test="orgNetValue != null  and orgNetValue != ''">org_net_value = #{orgNetValue},</if>
+            <if test="orgTarget != null  and orgTarget != ''">org_target = #{orgTarget},</if>
+
+        </trim>
+        where org_code = #{orgCode}
+    </update>
+
+    <delete id="deleteOrderTucEarlyWarningById" parameterType="Long">
+        delete from order_tuc_early_warning where early_id = #{earlyId}
+    </delete>
+
+    <delete id="deleteOrderTucEarlyWarningByIds" parameterType="String">
+        delete from order_tuc_early_warning where early_id in 
+        <foreach item="earlyId" collection="array" open="(" separator="," close=")">
+            #{earlyId}
+        </foreach>
+    </delete>
+
+    <select id="selectOrderTucEarlyWarning"  resultMap="OrderTucEarlyWarningResult">
+        <include refid="selectOrderTucEarlyWarningVo"/>
+        <where>
+            <if test="orgCode != null  and orgCode != ''"> and org_code = #{orgCode}</if>
+        </where>
+        limit 1
+    </select>
+
+    <select id="selectTucGroupSales" resultType="com.dgtly.system.domain.OrderTucEarlyWarning">
+        SELECT
+            'TUC' AS org_code,
+            'TUC' AS org_name,
+            'TUC' AS sales_level,
+            sum(
+                    CONVERT (
+                                now_year_act / 1000,
+                                DECIMAL ( 18, 3 ))) AS orgNetValue,
+            sum(
+                    CONVERT (
+                                NONTAX_DISCOUNT_TARGET / 1000,
+                                DECIMAL ( 18, 3 ))) AS orgTarget
+
+        FROM
+            `order_sales_sum_tuc_group`
+        WHERE
+            cal_month BETWEEN #{startTime}
+                AND  #{endTime}
+          AND BUSINESS_UNIT NOT IN ( '其中-公装事业部', '其中-家装事业部' ) UNION ALL
+        SELECT
+            BUSINESS_UNIT AS org_code,
+            BUSINESS_UNIT AS org_name,
+            BUSINESS_UNIT AS sales_level,
+            sum(
+                    CONVERT (
+                                now_year_act / 1000,
+                                DECIMAL ( 18, 3 ))) AS orgNetValue,
+            sum(
+                    CONVERT (
+                                NONTAX_DISCOUNT_TARGET / 1000,
+                                DECIMAL ( 18, 3 ))) AS orgTarget
+
+        FROM
+            `order_sales_sum_tuc_group`
+        WHERE
+            cal_month BETWEEN #{startTime}
+                AND  #{endTime}
+        GROUP BY
+            BUSINESS_UNIT UNION ALL
+        SELECT
+            company_code AS org_code,
+            company_name AS org_name,
+            'company_level' AS sales_level,
+            sum(
+                    CONVERT (
+                                now_year_act / 1000,
+                                DECIMAL ( 18, 3 ))) AS orgNetValue,
+            sum(
+                    CONVERT (
+                                NONTAX_DISCOUNT_TARGET / 1000,
+                                DECIMAL ( 18, 3 ))) AS orgTarget
+
+        FROM
+            `order_sales_sum_tuc_group`
+        WHERE
+            cal_month BETWEEN #{startTime}
+                AND  #{endTime}
+          AND BUSINESS_UNIT = '零售'
+        GROUP BY
+            company_code
+    </select>
+    
+</mapper>

+ 9 - 0
suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/service/IWxSendMessageService.java

@@ -67,4 +67,13 @@ public interface IWxSendMessageService
      * @date: 2023/5/15 11:27
      */
      void sendWxTmsMessage();
+
+     /**
+      * @description: 业绩进度指标预警邮件/企微消息通知
+      * @param:
+      * @return:
+      * @author: njs
+      * @date: 2024/2/4 9:21
+      */
+     void sendMailAndWxEarlyTucMessage();
 }

+ 133 - 0
suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/service/impl/WxSendMessageServiceImpl.java

@@ -5,17 +5,32 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import com.dgtly.common.utils.DateUtils;
+import com.dgtly.system.domain.Mail;
+import com.dgtly.system.domain.OrderTucEarlyWarning;
+import com.dgtly.system.domain.SysDictData;
+import com.dgtly.system.domain.UserVO;
+import com.dgtly.system.mapper.OrderTucEarlyWarningMapper;
 import com.dgtly.system.mapper.SysBatchSignForMapper;
 import com.dgtly.system.mapper.SysUserMapper;
+import com.dgtly.system.service.IOrderTucEarlyWarningService;
 import com.dgtly.system.service.ISysConfigService;
+import com.dgtly.system.service.ISysDictDataService;
+import com.dgtly.system.util.MailUtils;
 import com.dgtly.wxportal.utils.qywxutils.QyWxSendMessageUtil;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import com.dgtly.wxportal.mapper.WxSendMessageMapper;
 import com.dgtly.wxportal.domain.WxSendMessage;
 import com.dgtly.wxportal.service.IWxSendMessageService;
 import com.dgtly.common.core.text.Convert;
 
+import javax.mail.MessagingException;
+import javax.mail.NoSuchProviderException;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.internet.MimeMessage;
+
 /**
  * 企业微信发送消息历史记录Service业务层处理
  * 
@@ -35,6 +50,18 @@ public class WxSendMessageServiceImpl implements IWxSendMessageService
     private ISysConfigService configService;
     @Autowired
     private SysBatchSignForMapper batchSignForMapper;
+    @Autowired
+    private ISysDictDataService sysDictDataService;
+    @Autowired
+    private OrderTucEarlyWarningMapper tucEarlyWarningMapper;
+    @Autowired
+    private MailUtils mailUtils;
+    @Value(value = "${spring.mail.username}")
+    private String myEmailAccount;
+    @Value(value = "${spring.mail.password}")
+    public  String myEmailPassword;
+    @Value(value = "${spring.mail.host}")
+    public  String myEmailSMTPHost;
     /**
      * 查询企业微信发送消息历史记录
      * 
@@ -161,4 +188,110 @@ public class WxSendMessageServiceImpl implements IWxSendMessageService
         }
 
     }
+
+    /**
+     * @description: 业绩进度指标预警邮件/企微消息通知
+     * @param:
+     * @return:
+     * @author: njs
+     * @date: 2024/2/4 9:21
+     */
+    @Override
+    public void sendMailAndWxEarlyTucMessage() {
+        int year = Calendar.getInstance().get(Calendar.YEAR);
+        int month = Calendar.getInstance().get(Calendar.MONTH) + 1;
+        String MonthStr = "";
+        if(month < 10){
+            MonthStr = "0"+month;
+        } else {
+            MonthStr = String.valueOf(month);
+        }
+        String startTime = String.valueOf(year)+"01";
+        String endTime =  String.valueOf(year)+ MonthStr;
+        List<OrderTucEarlyWarning> tucSales = tucEarlyWarningMapper.selectTucGroupSales(startTime,endTime);
+        if(tucSales !=null && tucSales.size()>0){
+            OrderTucEarlyWarning warning = new OrderTucEarlyWarning();
+            List<OrderTucEarlyWarning> earlyWarnings = tucEarlyWarningMapper.selectOrderTucEarlyWarningList(warning);
+            if(earlyWarnings !=null && earlyWarnings.size()>0){
+                //比较指标是否有误
+
+            // 1. 创建参数配置, 用于连接邮件服务器的参数配置
+            Properties props = new Properties();                    // 参数配置
+            props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议(JavaMail规范要求)
+            props.setProperty("mail.smtp.host", myEmailSMTPHost);   // 发件人的邮箱的 SMTP 服务器地址
+            props.setProperty("mail.smtp.port", "25");
+            props.setProperty("mail.smtp.auth", "true");            // 需要请求认证
+            props.setProperty("mail.smtp.starttls.enable", "false");            // 需要请求认证
+            props.setProperty("mail.smtp.ssl.enable", "false");            // 需要请求认证
+            Set<String> sendEmailUser = getConfigValueSet("sendmailUnionUser");
+            Session session = Session.getDefaultInstance(props);
+            session.setDebug(true);
+
+            for (String email : sendEmailUser
+            ) {
+                Mail mail = new Mail();
+                try {
+                    mail.setFrom(myEmailAccount);
+                    mail.setTo(email);
+                    mail.setSubject("立邦随身邦业绩进度数据源预警");
+                    mail.setContent(getHtmlUserContextList(userList));
+                    //mailUtils.sendMailHtml(mailFromUsername, email, "用户账号重复通知", "您好,重复用户信息如下<br>" + userList);
+                    MimeMessage message = mailUtils.createMimeMessage(session, myEmailAccount, email, mail);
+
+                    // 4. 根据 Session 获取邮件传输对象
+                    Transport transport = session.getTransport();
+
+                    transport.connect(myEmailAccount, myEmailPassword);
+
+                    // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
+                    transport.sendMessage(message, message.getAllRecipients());
+
+                    // 7. 关闭连接
+                    transport.close();
+                } catch (NoSuchProviderException e) {
+                    e.printStackTrace();
+                } catch (MessagingException e) {
+                    e.printStackTrace();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }else{
+                tucEarlyWarningMapper.batchInsert(tucSales);
+            }
+        }
+    }
+
+    public Set<String> getConfigValueSet(String dictType){
+        Set<String> res = new HashSet<>();
+        List<SysDictData> dictDatas = sysDictDataService.selectSimpleDictDataByType(dictType);
+        for(SysDictData d: dictDatas){
+            res.add(d.getDictValue());
+        }
+        return res;
+    }
+
+    public String getHtmlUserContextList(List<UserVO> userList) {
+
+        String str = "";
+        for (UserVO u : userList) {
+            str += "<tr>" +
+                    "   <td>" + u.getUserName()
+                    + "   </td><td>" + u.getLoginName()
+                    + "   </td><td>" + u.getPhonenumber()
+                    + "   </td>" +
+                    "</tr>";
+        }
+
+        String html = "<table border='1'  Cellspacing='0'>" +
+                "    <tr>" +
+                "        <th>用户昵称</th>" +
+                "        <th>用户登录名</th>" +
+                "        <th>用户手机号</th>" +
+                "    </tr>" +
+                str +
+                "</table>";
+
+        return html;
+    }
 }