From bbbc4f2753cb760e9a4e0c0bdec068412f5c0b71 Mon Sep 17 00:00:00 2001
From: xiezhijun <15270898033@163.com>
Date: Tue, 27 Apr 2021 19:48:22 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B6=88=E6=81=AF=E4=B8=AD?=
 =?UTF-8?q?=E5=BF=83=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../custom/SysWxUserLogController.java        |  12 +-
 .../custom/WechatAppletController.java        |  48 ++++-
 .../custom/domain/SysMessageNotice.java       |  54 ++++++
 .../domain/entityEnum/MessageNoticeEnum.java  |  75 ++++++++
 .../dto/response/MessageNoticeResponse.java   |  43 +++++
 .../custom/mapper/SysCustomerMapper.java      |   7 +
 .../custom/mapper/SysMessageNoticeMapper.java |  76 ++++++++
 .../custom/service/ISysCustomerService.java   |   7 +
 .../service/ISysMessageNoticeService.java     |  92 ++++++++++
 .../service/impl/SysCustomerServiceImpl.java  |   9 +
 .../impl/SysMessageNoticeServiceImpl.java     | 169 ++++++++++++++++++
 .../service/impl/SysWxUserLogServiceImpl.java |   3 +
 .../mapper/custom/SysCustomerMapper.xml       |   6 +
 .../mapper/custom/SysMessageNoticeMapper.xml  | 144 +++++++++++++++
 14 files changed, 742 insertions(+), 3 deletions(-)
 create mode 100644 stdiet-custom/src/main/java/com/stdiet/custom/domain/SysMessageNotice.java
 create mode 100644 stdiet-custom/src/main/java/com/stdiet/custom/domain/entityEnum/MessageNoticeEnum.java
 create mode 100644 stdiet-custom/src/main/java/com/stdiet/custom/dto/response/MessageNoticeResponse.java
 create mode 100644 stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysMessageNoticeMapper.java
 create mode 100644 stdiet-custom/src/main/java/com/stdiet/custom/service/ISysMessageNoticeService.java
 create mode 100644 stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysMessageNoticeServiceImpl.java
 create mode 100644 stdiet-custom/src/main/resources/mapper/custom/SysMessageNoticeMapper.xml

diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysWxUserLogController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysWxUserLogController.java
index 24de56979..9d8872060 100644
--- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysWxUserLogController.java
+++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysWxUserLogController.java
@@ -13,6 +13,7 @@ import com.stdiet.common.utils.poi.ExcelUtil;
 import com.stdiet.custom.domain.SysWxUserInfo;
 import com.stdiet.custom.domain.SysWxUserLog;
 import com.stdiet.custom.page.WxLogInfo;
+import com.stdiet.custom.service.ISysMessageNoticeService;
 import com.stdiet.custom.service.ISysOrderService;
 import com.stdiet.custom.service.ISysWxUserInfoService;
 import com.stdiet.custom.service.ISysWxUserLogService;
@@ -40,8 +41,12 @@ public class SysWxUserLogController extends BaseController {
     @Autowired
     private ISysWxUserInfoService sysWxUserInfoService;
 
+    @Autowired
     private ISysOrderService sysOrderService;
 
+    @Autowired
+    private ISysMessageNoticeService sysMessageNoticeService;
+
     /**
      * 查询微信用户记录列表
      */
@@ -211,6 +216,11 @@ public class SysWxUserLogController extends BaseController {
     @PreAuthorize("@ss.hasPermi('custom:wxUserLog:query')")
     @PostMapping("/commentPunchContent")
     public AjaxResult commentPunchContent(@RequestBody SysWxUserLog sysWxUserLog) {
-        return toAjax(sysWxUserLogService.updateSysWxUserLog(sysWxUserLog));
+        int row = sysWxUserLogService.updateSysWxUserLog(sysWxUserLog);
+        if(row > 0){
+            SysWxUserLog log = sysWxUserLogService.selectSysWxUserLogById(sysWxUserLog.getId()+"");
+            sysMessageNoticeService.sendPunchCommentMessage(log);
+        }
+        return toAjax(row);
     }
 }
\ No newline at end of file
diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/WechatAppletController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/WechatAppletController.java
index 5e63840b8..abcee28f7 100644
--- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/WechatAppletController.java
+++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/WechatAppletController.java
@@ -14,8 +14,10 @@ import com.stdiet.common.utils.oss.AliyunOSSUtils;
 import com.stdiet.common.utils.sign.AesUtils;
 import com.stdiet.custom.domain.*;
 import com.stdiet.custom.dto.response.CustomerCaseResponse;
+import com.stdiet.custom.dto.response.MessageNoticeResponse;
 import com.stdiet.custom.page.WxLogInfo;
 import com.stdiet.custom.service.*;
+import org.aspectj.weaver.loadtime.Aj;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -51,6 +53,12 @@ public class WechatAppletController extends BaseController {
     @Autowired
     private ISysAskNutritionQuestionService sysAskNutritionQuestionService;
 
+    @Autowired
+    private ISysMessageNoticeService sysMessageNoticeService;
+
+    @Autowired
+    private ISysCustomerService sysCustomerService;
+
     /**
      * 查询微信小程序中展示的客户案例
      */
@@ -89,7 +97,7 @@ public class WechatAppletController extends BaseController {
     }
 
     /**
-     * 同步客户信息,返回订单数量
+     * 同步客户信息
      * @param sysWxUserInfo
      * @return
      */
@@ -106,7 +114,17 @@ public class WechatAppletController extends BaseController {
         }else{
             sysWxUserInfoService.insertSysWxUserInfo(sysWxUserInfo);
         }
-        return AjaxResult.success();
+        Map<String,Object> result = new HashMap<>();
+        //根据手机号查询返回用户加密ID
+        SysCustomer customer = sysCustomerService.getCustomerByPhone(sysWxUserInfo.getPhone());
+        result.put("customerId", customer != null ? AesUtils.encrypt(customer.getId()+"", null) : null);
+        //查询未读消息数量
+        SysMessageNotice messageParam = new SysMessageNotice();
+        messageParam.setReadType(0);
+        messageParam.setMessageCustomer(customer != null ? customer.getId() : 0);
+        int unReadNoticeTotal = sysMessageNoticeService.getCustomerMessageCount(messageParam);
+        result.put("unReadNoticeTotal", unReadNoticeTotal);
+        return AjaxResult.success(result);
     }
 
     /**
@@ -309,4 +327,30 @@ public class WechatAppletController extends BaseController {
         }
         return toAjax(sysAskNutritionQuestionService.insertSysAskNutritionQuestion(sysAskNutritionQuestion));
     }
+
+    /**
+     * 获取用户通知消息
+     */
+    @GetMapping(value = "/getCustomerMessage")
+    public TableDataInfo getCustomerMessage(SysMessageNotice sysMessageNotice) {
+        startPage();
+        if(StringUtils.isNotEmpty(sysMessageNotice.getCustomerId())){
+            sysMessageNotice.setMessageCustomer(Long.parseLong(AesUtils.decrypt(sysMessageNotice.getCustomerId(), null)));
+        }else{
+            sysMessageNotice.setMessageCustomer(0L);
+        }
+        List<MessageNoticeResponse> list = sysMessageNoticeService.getCustomerMessage(sysMessageNotice);
+        return getDataTable(list);
+    }
+
+    /**
+     * 更新用户通知消息已读状态
+     */
+    @GetMapping(value = "/updateMessageReadStatus")
+    public AjaxResult updateMessageReadStatus(@RequestParam("id")Long id) {
+        SysMessageNotice sysMessageNotice = new SysMessageNotice();
+        sysMessageNotice.setReadType(1);
+        sysMessageNotice.setId(id);
+        return toAjax(sysMessageNoticeService.updateSysMessageNotice(sysMessageNotice));
+    }
 }
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysMessageNotice.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysMessageNotice.java
new file mode 100644
index 000000000..befb87e6a
--- /dev/null
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysMessageNotice.java
@@ -0,0 +1,54 @@
+package com.stdiet.custom.domain;
+
+import lombok.Data;
+import com.stdiet.common.annotation.Excel;
+import com.stdiet.common.core.domain.BaseEntity;
+
+/**
+ * 客户消息通知对象 sys_message_notice
+ *
+ * @author xzj
+ * @date 2021-04-26
+ */
+@Data
+public class SysMessageNotice extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private Long id;
+
+    /** 消息属性,0 公共消息 1 私有消息 */
+    @Excel(name = "消息属性,0 公共消息 1 私有消息")
+    private Integer messageProperty;
+
+    /** 消息对应客户ID (公共消息时该字段为0) */
+    @Excel(name = "消息对应客户ID (公共消息时该字段为0)")
+    private Long messageCustomer;
+
+    //用户加密ID,非持久化字段
+    private String customerId;
+
+    /** 消息类型 */
+    @Excel(name = "消息类型")
+    private Integer messageType;
+
+    /** 消息标题 */
+    @Excel(name = "消息标题")
+    private String messageTitle;
+
+    /** 消息内容 */
+    @Excel(name = "消息内容")
+    private String messageContent;
+
+    /** 是否已读 0未读 1已读 */
+    @Excel(name = "是否已读 0未读 1已读")
+    private Integer readType;
+
+    /** 当前消息对应关键参数,多个参数可保存json字符串 */
+    @Excel(name = "当前消息对应关键参数,多个参数可保存json字符串")
+    private String messageKey;
+
+    /** 删除标识 0未删除 1已删除 */
+    private Integer delFlag;
+}
\ No newline at end of file
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/entityEnum/MessageNoticeEnum.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/entityEnum/MessageNoticeEnum.java
new file mode 100644
index 000000000..8c51636f8
--- /dev/null
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/entityEnum/MessageNoticeEnum.java
@@ -0,0 +1,75 @@
+package com.stdiet.custom.domain.entityEnum;
+
+public enum MessageNoticeEnum{
+
+    systemMessage("系统通知", 0, 0, "系统通知"),
+    punchComment("打卡点评", 1, 1, "%s打卡点评"); //%s 为打卡时间
+
+
+    //消息名称
+    private String name;
+
+    //消息属性 0公共 1私有
+    private Integer property;
+
+    //消息类型
+    private Integer type;
+
+    //消息标题模板
+    private String titleTemplate;
+
+    MessageNoticeEnum(String name, Integer property, Integer type, String titleTemplate){
+        this.name = name;
+        this.property = property;
+        this.type = type;
+        this.titleTemplate = titleTemplate;
+    }
+
+    /**
+     * 根据type类型获取枚举对象
+     * @param type
+     * @return
+     */
+    public static MessageNoticeEnum getNoticeEnumByType(Integer type){
+        for (MessageNoticeEnum messageEnum : MessageNoticeEnum.values()) {
+            if(messageEnum.getType().intValue() == type.intValue()){
+                return messageEnum;
+            }
+        }
+        return systemMessage;
+    }
+
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getProperty() {
+        return property;
+    }
+
+    public void setProperty(Integer property) {
+        this.property = property;
+    }
+
+    public String getTitleTemplate() {
+        return titleTemplate;
+    }
+
+    public void setTitleTemplate(String titleTemplate) {
+        this.titleTemplate = titleTemplate;
+    }
+
+}
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/dto/response/MessageNoticeResponse.java b/stdiet-custom/src/main/java/com/stdiet/custom/dto/response/MessageNoticeResponse.java
new file mode 100644
index 000000000..6d4df2071
--- /dev/null
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/dto/response/MessageNoticeResponse.java
@@ -0,0 +1,43 @@
+package com.stdiet.custom.dto.response;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class MessageNoticeResponse implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    /** 消息属性,0 公共消息 1 私有消息 */
+    private Integer messageProperty;
+
+    /** 消息对应客户ID (公共消息时该字段为0) */
+    private Long messageCustomer;
+
+    /** 消息类型 */
+    private Integer messageType;
+
+    //消息类型名称
+    private String messageTypeName;
+
+    /** 消息标题 */
+    private String messageTitle;
+
+    /** 消息内容 */
+    private String messageContent;
+
+    /** 是否已读 0未读 1已读 */
+    private Integer readType;
+
+    /** 当前消息对应关键参数,多个参数可保存json字符串 */
+    private String messageKey;
+
+    /** 创建时间 **/
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    private Date createTime;
+}
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysCustomerMapper.java b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysCustomerMapper.java
index 388e7b86c..1d89f4d94 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysCustomerMapper.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysCustomerMapper.java
@@ -67,4 +67,11 @@ public interface SysCustomerMapper
      * @return 结果
      */
     SysCustomer getCustomerByPhone(@Param("phone")String phone);
+
+    /**
+     * 根据openid查询客户信息
+     * @param openid
+     * @return
+     */
+    SysCustomer getCustomerByOpenId(@Param("openid")String openid);
 }
\ No newline at end of file
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysMessageNoticeMapper.java b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysMessageNoticeMapper.java
new file mode 100644
index 000000000..7f69ad171
--- /dev/null
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysMessageNoticeMapper.java
@@ -0,0 +1,76 @@
+package com.stdiet.custom.mapper;
+
+import java.util.List;
+import com.stdiet.custom.domain.SysMessageNotice;
+import com.stdiet.custom.dto.response.MessageNoticeResponse;
+
+/**
+ * 客户消息通知Mapper接口
+ *
+ * @author xzj
+ * @date 2021-04-26
+ */
+public interface SysMessageNoticeMapper
+{
+    /**
+     * 查询客户消息通知
+     *
+     * @param id 客户消息通知ID
+     * @return 客户消息通知
+     */
+    public SysMessageNotice selectSysMessageNoticeById(Long id);
+
+    /**
+     * 查询客户消息通知列表
+     *
+     * @param sysMessageNotice 客户消息通知
+     * @return 客户消息通知集合
+     */
+    public List<SysMessageNotice> selectSysMessageNoticeList(SysMessageNotice sysMessageNotice);
+
+    /**
+     * 新增客户消息通知
+     *
+     * @param sysMessageNotice 客户消息通知
+     * @return 结果
+     */
+    public int insertSysMessageNotice(SysMessageNotice sysMessageNotice);
+
+    /**
+     * 修改客户消息通知
+     *
+     * @param sysMessageNotice 客户消息通知
+     * @return 结果
+     */
+    public int updateSysMessageNotice(SysMessageNotice sysMessageNotice);
+
+    /**
+     * 删除客户消息通知
+     *
+     * @param id 客户消息通知ID
+     * @return 结果
+     */
+    public int deleteSysMessageNoticeById(Long id);
+
+    /**
+     * 批量删除客户消息通知
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteSysMessageNoticeByIds(Long[] ids);
+
+    /**
+     * 根据客户ID查询客户信息(包含私有信息以及公共消息)
+     * @param sysMessageNotice
+     * @return
+     */
+    public List<MessageNoticeResponse> getCustomerMessage(SysMessageNotice sysMessageNotice);
+
+    /**
+     * 根据客户ID查询客户消息数量
+     * @param sysMessageNotice
+     * @return
+     */
+    public int getCustomerMessageCount(SysMessageNotice sysMessageNotice);
+}
\ No newline at end of file
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysCustomerService.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysCustomerService.java
index c88766acf..6a16b1990 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysCustomerService.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysCustomerService.java
@@ -81,4 +81,11 @@ public interface ISysCustomerService
 
     Map<String,Object> getPhysicalSignsByOutId(String id);
 
+    /**
+     * 根据openid查询客户信息
+     * @param openid
+     * @return
+     */
+    SysCustomer getCustomerByOpenId(String openid);
+
 }
\ No newline at end of file
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysMessageNoticeService.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysMessageNoticeService.java
new file mode 100644
index 000000000..7349e0ec6
--- /dev/null
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysMessageNoticeService.java
@@ -0,0 +1,92 @@
+package com.stdiet.custom.service;
+
+import java.util.List;
+import com.stdiet.custom.domain.SysMessageNotice;
+import com.stdiet.custom.domain.SysWxUserLog;
+import com.stdiet.custom.domain.entityEnum.MessageNoticeEnum;
+import com.stdiet.custom.dto.response.MessageNoticeResponse;
+
+/**
+ * 客户消息通知Service接口
+ *
+ * @author xzj
+ * @date 2021-04-26
+ */
+public interface ISysMessageNoticeService
+{
+    /**
+     * 查询客户消息通知
+     *
+     * @param id 客户消息通知ID
+     * @return 客户消息通知
+     */
+    public SysMessageNotice selectSysMessageNoticeById(Long id);
+
+    /**
+     * 查询客户消息通知列表
+     *
+     * @param sysMessageNotice 客户消息通知
+     * @return 客户消息通知集合
+     */
+    public List<SysMessageNotice> selectSysMessageNoticeList(SysMessageNotice sysMessageNotice);
+
+    /**
+     * 新增客户消息通知
+     *
+     * @param sysMessageNotice 客户消息通知
+     * @return 结果
+     */
+    public int insertSysMessageNotice(SysMessageNotice sysMessageNotice);
+
+    /**
+     * 修改客户消息通知
+     *
+     * @param sysMessageNotice 客户消息通知
+     * @return 结果
+     */
+    public int updateSysMessageNotice(SysMessageNotice sysMessageNotice);
+
+    /**
+     * 批量删除客户消息通知
+     *
+     * @param ids 需要删除的客户消息通知ID
+     * @return 结果
+     */
+    public int deleteSysMessageNoticeByIds(Long[] ids);
+
+    /**
+     * 删除客户消息通知信息
+     *
+     * @param id 客户消息通知ID
+     * @return 结果
+     */
+    public int deleteSysMessageNoticeById(Long id);
+
+    /**
+     * 根据客户ID查询客户信息(包含私有信息以及公共消息)
+     * @param sysMessageNotice
+     * @return
+     */
+    public List<MessageNoticeResponse> getCustomerMessage(SysMessageNotice sysMessageNotice);
+
+    /**
+     * 消息发送
+     * @param messageNoticeEnum
+     * @param sysMessageNotice
+     * @return
+     */
+    public int sendMessageNoticeToCustomer(MessageNoticeEnum messageNoticeEnum, SysMessageNotice sysMessageNotice);
+
+    /**
+     * 根据客户ID查询客户消息数量
+     * @param sysMessageNotice
+     * @return
+     */
+    public int getCustomerMessageCount(SysMessageNotice sysMessageNotice);
+
+    /**
+     * 发送打卡点评消息
+     * @param sysWxUserLog
+     */
+    public void sendPunchCommentMessage(SysWxUserLog sysWxUserLog);
+}
\ No newline at end of file
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCustomerServiceImpl.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCustomerServiceImpl.java
index d4e9a85e6..eb3851d4c 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCustomerServiceImpl.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCustomerServiceImpl.java
@@ -168,4 +168,13 @@ public class SysCustomerServiceImpl implements ISysCustomerService {
     public Map<String, Object> getPhysicalSignsByOutId(String id) {
         return null;
     }
+
+    /**
+     * 根据openid查询客户信息
+     * @param openid
+     * @return
+     */
+    public SysCustomer getCustomerByOpenId(String openid){
+        return sysCustomerMapper.getCustomerByOpenId(openid);
+    }
 }
\ No newline at end of file
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysMessageNoticeServiceImpl.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysMessageNoticeServiceImpl.java
new file mode 100644
index 000000000..a5110a50a
--- /dev/null
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysMessageNoticeServiceImpl.java
@@ -0,0 +1,169 @@
+package com.stdiet.custom.service.impl;
+
+import java.util.Date;
+import java.util.List;
+import com.stdiet.common.utils.DateUtils;
+import com.stdiet.common.utils.StringUtils;
+import com.stdiet.custom.domain.SysCustomer;
+import com.stdiet.custom.domain.SysWxUserLog;
+import com.stdiet.custom.domain.entityEnum.MessageNoticeEnum;
+import com.stdiet.custom.dto.response.MessageNoticeResponse;
+import com.stdiet.custom.service.ISysCustomerService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import com.stdiet.custom.mapper.SysMessageNoticeMapper;
+import com.stdiet.custom.domain.SysMessageNotice;
+import com.stdiet.custom.service.ISysMessageNoticeService;
+
+/**
+ * 客户消息通知Service业务层处理
+ *
+ * @author xzj
+ * @date 2021-04-26
+ */
+@Service
+public class SysMessageNoticeServiceImpl implements ISysMessageNoticeService
+{
+    @Autowired
+    private SysMessageNoticeMapper sysMessageNoticeMapper;
+
+    @Autowired
+    private ISysCustomerService sysCustomerService;
+
+    /**
+     * 查询客户消息通知
+     *
+     * @param id 客户消息通知ID
+     * @return 客户消息通知
+     */
+    @Override
+    public SysMessageNotice selectSysMessageNoticeById(Long id)
+    {
+        return sysMessageNoticeMapper.selectSysMessageNoticeById(id);
+    }
+
+    /**
+     * 查询客户消息通知列表
+     *
+     * @param sysMessageNotice 客户消息通知
+     * @return 客户消息通知
+     */
+    @Override
+    public List<SysMessageNotice> selectSysMessageNoticeList(SysMessageNotice sysMessageNotice)
+    {
+        return sysMessageNoticeMapper.selectSysMessageNoticeList(sysMessageNotice);
+    }
+
+    /**
+     * 新增客户消息通知
+     *
+     * @param sysMessageNotice 客户消息通知
+     * @return 结果
+     */
+    @Override
+    public int insertSysMessageNotice(SysMessageNotice sysMessageNotice)
+    {
+        sysMessageNotice.setCreateTime(DateUtils.getNowDate());
+        return sysMessageNoticeMapper.insertSysMessageNotice(sysMessageNotice);
+    }
+
+    /**
+     * 修改客户消息通知
+     *
+     * @param sysMessageNotice 客户消息通知
+     * @return 结果
+     */
+    @Override
+    public int updateSysMessageNotice(SysMessageNotice sysMessageNotice)
+    {
+        sysMessageNotice.setUpdateTime(DateUtils.getNowDate());
+        return sysMessageNoticeMapper.updateSysMessageNotice(sysMessageNotice);
+    }
+
+    /**
+     * 批量删除客户消息通知
+     *
+     * @param ids 需要删除的客户消息通知ID
+     * @return 结果
+     */
+    @Override
+    public int deleteSysMessageNoticeByIds(Long[] ids)
+    {
+        return sysMessageNoticeMapper.deleteSysMessageNoticeByIds(ids);
+    }
+
+    /**
+     * 删除客户消息通知信息
+     *
+     * @param id 客户消息通知ID
+     * @return 结果
+     */
+    @Override
+    public int deleteSysMessageNoticeById(Long id)
+    {
+        return sysMessageNoticeMapper.deleteSysMessageNoticeById(id);
+    }
+
+    /**
+     * 根据客户ID查询客户信息(包含私有信息以及公共消息)
+     * @param sysMessageNotice
+     * @return
+     */
+    @Override
+    public List<MessageNoticeResponse> getCustomerMessage(SysMessageNotice sysMessageNotice){
+        List<MessageNoticeResponse> responsesList = sysMessageNoticeMapper.getCustomerMessage(sysMessageNotice);
+        if(responsesList != null && responsesList.size() > 0){
+            for (MessageNoticeResponse messageNoticeResponse : responsesList) {
+                messageNoticeResponse.setMessageTypeName(MessageNoticeEnum.getNoticeEnumByType(messageNoticeResponse.getMessageType()).getName());
+            }
+        }
+        return responsesList;
+    }
+
+    /**
+     * 消息发送
+     * @param messageNoticeEnum
+     * @param sysMessageNotice
+     * @return
+     */
+    @Override
+    public int sendMessageNoticeToCustomer(MessageNoticeEnum messageNoticeEnum, SysMessageNotice sysMessageNotice){
+        sysMessageNotice.setMessageProperty(messageNoticeEnum.getProperty());
+        sysMessageNotice.setMessageType(messageNoticeEnum.getType());
+        return sysMessageNoticeMapper.insertSysMessageNotice(sysMessageNotice);
+    }
+
+    /**
+     * 根据客户ID查询客户消息数量
+     * @param sysMessageNotice
+     * @return
+     */
+    @Override
+    public int getCustomerMessageCount(SysMessageNotice sysMessageNotice){
+        return sysMessageNoticeMapper.getCustomerMessageCount(sysMessageNotice);
+    }
+
+    /**
+     * 发送打卡点评消息
+     * @param sysWxUserLog
+     */
+    @Override
+    @Async
+    public void sendPunchCommentMessage(SysWxUserLog sysWxUserLog){
+        if(sysWxUserLog == null || StringUtils.isEmpty(sysWxUserLog.getOpenid())){
+            return;
+        }
+        SysCustomer sysCustomer = sysCustomerService.getCustomerByOpenId(sysWxUserLog.getOpenid());
+        if(sysCustomer != null){
+            SysMessageNotice sysMessageNotice = new SysMessageNotice();
+            sysMessageNotice.setMessageProperty(1);
+            sysMessageNotice.setMessageType(MessageNoticeEnum.punchComment.getType());
+            sysMessageNotice.setReadType(0);
+            sysMessageNotice.setMessageCustomer(sysCustomer.getId());
+            sysMessageNotice.setMessageTitle(String.format(MessageNoticeEnum.punchComment.getTitleTemplate(), DateUtils.dateTime(sysWxUserLog.getLogTime())));
+            sysMessageNotice.setMessageContent(sysWxUserLog.getComment());
+            sendMessageNoticeToCustomer(MessageNoticeEnum.punchComment, sysMessageNotice);
+        }
+    }
+}
\ No newline at end of file
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysWxUserLogServiceImpl.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysWxUserLogServiceImpl.java
index 0d736d07a..dbe7129c7 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysWxUserLogServiceImpl.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysWxUserLogServiceImpl.java
@@ -8,8 +8,11 @@ import com.stdiet.common.utils.DateUtils;
 import com.stdiet.common.utils.file.FileUploadUtils;
 import com.stdiet.common.utils.file.MimeTypeUtils;
 import com.stdiet.common.utils.oss.AliyunOSSUtils;
+import com.stdiet.custom.domain.SysMessageNotice;
 import com.stdiet.custom.domain.SysWxUserInfo;
+import com.stdiet.custom.domain.entityEnum.MessageNoticeEnum;
 import com.stdiet.custom.page.WxLogInfo;
+import com.stdiet.custom.service.ISysMessageNoticeService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.stdiet.custom.mapper.SysWxUserLogMapper;
diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysCustomerMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysCustomerMapper.xml
index 1847b6535..086da23a6 100644
--- a/stdiet-custom/src/main/resources/mapper/custom/SysCustomerMapper.xml
+++ b/stdiet-custom/src/main/resources/mapper/custom/SysCustomerMapper.xml
@@ -156,6 +156,12 @@
         where phone = #{phone} and del_flag = 0
     </select>
 
+    <!-- 根据openId查询客户 -->
+    <select id="getCustomerByOpenId" parameterType="String" resultMap="SysCustomerResult">
+        select sc.id from sys_customer sc
+        left join sys_wx_user_info wu on wu.phone = sc.phone
+        where wu.openid = #{openid} and sc.del_flag = 0 order by sc.id desc limit 1
+    </select>
 
 
 </mapper>
\ No newline at end of file
diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysMessageNoticeMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysMessageNoticeMapper.xml
new file mode 100644
index 000000000..e7377f342
--- /dev/null
+++ b/stdiet-custom/src/main/resources/mapper/custom/SysMessageNoticeMapper.xml
@@ -0,0 +1,144 @@
+<?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.stdiet.custom.mapper.SysMessageNoticeMapper">
+
+    <resultMap type="SysMessageNotice" id="SysMessageNoticeResult">
+        <result property="id"    column="id"    />
+        <result property="messageProperty"    column="message_property"    />
+        <result property="messageCustomer"    column="message_customer"    />
+        <result property="messageType"    column="message_type"    />
+        <result property="messageTitle"    column="message_title"    />
+        <result property="messageContent"    column="message_content"    />
+        <result property="readType"    column="read_type"    />
+        <result property="messageKey"    column="message_key"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="delFlag"    column="del_flag"    />
+    </resultMap>
+
+    <resultMap type="com.stdiet.custom.dto.response.MessageNoticeResponse" id="SysMessageNoticeResponse">
+        <result property="id"    column="id"    />
+        <result property="messageProperty"    column="message_property"    />
+        <result property="messageCustomer"    column="message_customer"    />
+        <result property="messageType"    column="message_type"    />
+        <result property="messageTitle"    column="message_title"    />
+        <result property="messageContent"    column="message_content"    />
+        <result property="readType"    column="read_type"    />
+        <result property="messageKey"    column="message_key"    />
+        <result property="createTime"    column="create_time"    />
+    </resultMap>
+
+    <sql id="selectSysMessageNoticeVo">
+        id, message_property, message_customer, message_type, message_title, message_content, read_type, message_key, create_time, create_by, update_time, update_by, del_flag
+    </sql>
+
+    <select id="selectSysMessageNoticeList" parameterType="SysMessageNotice" resultMap="SysMessageNoticeResult">
+        select
+        <include refid="selectSysMessageNoticeVo"/>
+        from sys_message_notice
+        where del_flag = 0
+    </select>
+
+    <select id="selectSysMessageNoticeById" parameterType="Long" resultMap="SysMessageNoticeResult">
+        select
+        <include refid="selectSysMessageNoticeVo"/>
+        from sys_message_notice
+        where id = #{id} and del_flag = 0 order by id desc
+    </select>
+
+    <insert id="insertSysMessageNotice" parameterType="SysMessageNotice">
+        insert into sys_message_notice
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="messageProperty != null">message_property,</if>
+            <if test="messageCustomer != null">message_customer,</if>
+            <if test="messageType != null">message_type,</if>
+            <if test="messageTitle != null">message_title,</if>
+            <if test="messageContent != null">message_content,</if>
+            <if test="readType != null">read_type,</if>
+            <if test="messageKey != null">message_key,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="delFlag != null">del_flag,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="messageProperty != null">#{messageProperty},</if>
+            <if test="messageCustomer != null">#{messageCustomer},</if>
+            <if test="messageType != null">#{messageType},</if>
+            <if test="messageTitle != null">#{messageTitle},</if>
+            <if test="messageContent != null">#{messageContent},</if>
+            <if test="readType != null">#{readType},</if>
+            <if test="messageKey != null">#{messageKey},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+        </trim>
+    </insert>
+
+    <update id="updateSysMessageNotice" parameterType="SysMessageNotice">
+        update sys_message_notice
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="messageProperty != null">message_property = #{messageProperty},</if>
+            <if test="messageCustomer != null">message_customer = #{messageCustomer},</if>
+            <if test="messageType != null">message_type = #{messageType},</if>
+            <if test="messageTitle != null">message_title = #{messageTitle},</if>
+            <if test="messageContent != null">message_content = #{messageContent},</if>
+            <if test="readType != null">read_type = #{readType},</if>
+            <if test="messageKey != null">message_key = #{messageKey},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <update id="deleteSysMessageNoticeById" parameterType="Long">
+        update sys_message_notice set del_flag = 1 where id = #{id}
+    </update>
+
+    <update id="deleteSysMessageNoticeByIds" parameterType="String">
+        update sys_message_notice set del_flag = 1 where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+
+    <!-- 根据客户ID获取用户的消息 -->
+    <select id="getCustomerMessage" parameterType="SysMessageNotice" resultMap="SysMessageNoticeResponse">
+        select
+        smn.id, smn.message_property, smn.message_customer, smn.message_type, smn.message_title, smn.message_content, smn.read_type, smn.message_key, smn.create_time
+        from sys_message_notice smn
+        where smn.del_flag = 0  and (smn.message_property = 0 or smn.message_customer = #{messageCustomer})
+        <if test="readType != null">
+           and smn.read_type = #{readType}
+        </if>
+        <if test="messageType != null">
+            and smn.message_type = #{messageType}
+        </if>
+        order by smn.id desc
+    </select>
+
+    <!-- 根据客户ID获取用户的消息数量 -->
+    <select id="getCustomerMessageCount" parameterType="SysMessageNotice" resultType="int">
+        select count(smn.id)
+        from sys_message_notice smn
+        where smn.del_flag = 0  and (smn.message_property = 0 or smn.message_customer = #{messageCustomer})
+        <if test="readType != null">
+            and smn.read_type = #{readType}
+        </if>
+        <if test="messageType != null">
+            and smn.message_type = #{messageType}
+        </if>
+    </select>
+</mapper>
\ No newline at end of file