From 44786bb6bc2b7d0e21b931b5c7201c20ead7a5d0 Mon Sep 17 00:00:00 2001
From: huangdeliang <huangdeliang@skieer.com>
Date: Sat, 22 May 2021 10:10:04 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8E=A8=E9=80=81?=
 =?UTF-8?q?=E5=A4=87=E6=B3=A8=E9=BB=98=E8=AE=A4=E5=80=BC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/stdiet/custom/service/impl/WeChartAppletServiceImp.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/WeChartAppletServiceImp.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/WeChartAppletServiceImp.java
index ff6d2c647..9cf84060a 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/WeChartAppletServiceImp.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/WeChartAppletServiceImp.java
@@ -97,7 +97,7 @@ public class WeChartAppletServiceImp implements IWechatAppletService {
         dataParam.put("thing1", JSONObject.parse("{\"value\":\"" + name + "\"}"));
         dataParam.put("time2", JSONObject.parse("{\"value\":\"" + startDate + "\"}"));
         dataParam.put("time3", JSONObject.parse("{\"value\":\"" + endDate + "\"}"));
-        String mRemark = StringUtils.isNull(remark) ? "" : remark;
+        String mRemark = StringUtils.isNull(remark) ? " " : remark;
         dataParam.put("thing4", JSONObject.parse("{\"value\":\"" + mRemark + "\"}"));
 
         param.put("data", dataParam);

From 416189781f25558f1e16ec85836231c631be9038 Mon Sep 17 00:00:00 2001
From: huangdeliang <huangdeliang@skieer.com>
Date: Mon, 24 May 2021 11:18:19 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8E=A8=E9=80=81?=
 =?UTF-8?q?=E6=A8=A1=E6=9D=BF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../web/controller/MyApplicationRunner.java   |  52 +--
 .../custom/SysCustomerHealthyController.java  |   2 +-
 .../SysNutritionQuestionController.java       |   2 +-
 ...erNutritionistReplaceRecordController.java |   2 +-
 .../custom/SysServiceQuestionController.java  |  26 ++
 .../custom/WechatAppletController.java        |  24 +-
 .../custom/domain/SysServicesQuestion.java    |  75 +++++
 .../mapper/SysServicesQuestionMapper.java     |  15 +
 .../service/ISysServicesQuestionService.java  |  14 +
 .../impl/SysServicesQuestionServiceImp.java   |  66 ++++
 .../service/impl/WeChartAppletServiceImp.java |   2 +-
 .../custom/SysServicesQuestionMapper.xml      |  83 +++++
 .../resources/mapper/system/SysUserMapper.xml | 311 +++++++++---------
 13 files changed, 479 insertions(+), 195 deletions(-)
 create mode 100644 stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysServiceQuestionController.java
 create mode 100644 stdiet-custom/src/main/java/com/stdiet/custom/domain/SysServicesQuestion.java
 create mode 100644 stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysServicesQuestionMapper.java
 create mode 100644 stdiet-custom/src/main/java/com/stdiet/custom/service/ISysServicesQuestionService.java
 create mode 100644 stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysServicesQuestionServiceImp.java
 create mode 100644 stdiet-custom/src/main/resources/mapper/custom/SysServicesQuestionMapper.xml

diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/MyApplicationRunner.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/MyApplicationRunner.java
index e82f72c5a..c1fa43118 100644
--- a/stdiet-admin/src/main/java/com/stdiet/web/controller/MyApplicationRunner.java
+++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/MyApplicationRunner.java
@@ -1,27 +1,13 @@
 package com.stdiet.web.controller;
 
-import com.stdiet.common.config.AliyunOSSConfig;
-import com.stdiet.common.core.domain.AjaxResult;
-import com.stdiet.common.core.domain.entity.SysUser;
 import com.stdiet.common.utils.StringUtils;
-import com.stdiet.common.utils.oss.AliyunOSSUtils;
 import com.stdiet.common.utils.poi.ExcelUtil;
 import com.stdiet.custom.domain.SysNutritionQuestion;
 import com.stdiet.custom.domain.SysNutritionalVideo;
-import com.stdiet.custom.domain.SysWxUserInfo;
-import com.stdiet.custom.domain.SysWxUserLog;
-import com.stdiet.custom.mapper.SysCustomerPhysicalSignsMapper;
-import com.stdiet.custom.mapper.SysNutritionQuestionMapper;
 import com.stdiet.custom.mapper.SysWxUserInfoMapper;
 import com.stdiet.custom.mapper.SysWxUserLogMapper;
 import com.stdiet.custom.service.ISysNutritionQuestionService;
 import com.stdiet.custom.service.ISysNutritionalVideoService;
-import com.stdiet.custom.service.ISysWxUserLogService;
-import com.stdiet.custom.utils.LuceneIndexUtils;
-import com.stdiet.framework.web.domain.server.Sys;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
-import org.apache.lucene.document.TextField;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.ApplicationArguments;
 import org.springframework.boot.ApplicationRunner;
@@ -37,11 +23,11 @@ import java.util.Map;
 @Order(value = 1)
 public class MyApplicationRunner implements ApplicationRunner {
 
-    @Autowired
-    private SysWxUserLogMapper sysWxUserLogMapper;
+//    @Autowired
+//    private SysWxUserLogMapper sysWxUserLogMapper;
 
-    @Autowired
-    private SysWxUserInfoMapper sysWxUserInfoMapper;
+//    @Autowired
+//    private SysWxUserInfoMapper sysWxUserInfoMapper;
 
     @Autowired
     private ISysNutritionQuestionService sysNutritionQuestionService;
@@ -50,7 +36,6 @@ public class MyApplicationRunner implements ApplicationRunner {
     private ISysNutritionalVideoService sysNutritionalVideoService;
 
 
-
     @Override
     public void run(ApplicationArguments args) throws Exception {
         System.out.println("--------------项目启动调用方法开始----------");
@@ -59,11 +44,10 @@ public class MyApplicationRunner implements ApplicationRunner {
     }
 
 
-
     /**
      * 从微信用户表中查询openid更新到用户打卡日志表中
      */
-    public void dealWxUserLog(){
+    public void dealWxUserLog() {
         /*List<String> phoneList = sysWxUserLogMapper.getAllSysWxUserLogPhone();
         SysWxUserLog sysWxUserLog = new SysWxUserLog();
         if(phoneList.size() > 0){
@@ -83,10 +67,11 @@ public class MyApplicationRunner implements ApplicationRunner {
 
     /**
      * 导入营养小知识方法
+     *
      * @param path
      */
-    public void importNutritionQuestion(String path){
-        try{
+    public void importNutritionQuestion(String path) {
+        try {
             int count = 0;
             ExcelUtil<SysNutritionQuestion> util = new ExcelUtil<SysNutritionQuestion>(SysNutritionQuestion.class);
             File file = new File(path);
@@ -94,11 +79,11 @@ public class MyApplicationRunner implements ApplicationRunner {
             System.out.println(questionList.size());
             for (SysNutritionQuestion sysNutritionQuestion : questionList) {
                 //System.out.println(sysNutritionQuestion);
-                if(StringUtils.isNotEmpty(sysNutritionQuestion.getTitle())
-                    && StringUtils.isNotEmpty(sysNutritionQuestion.getContent())){
+                if (StringUtils.isNotEmpty(sysNutritionQuestion.getTitle())
+                        && StringUtils.isNotEmpty(sysNutritionQuestion.getContent())) {
                     //System.out.println(sysNutritionQuestion.getTitle() + "\n");
                     sysNutritionQuestion.setShowFlag(1);
-                    if(sysNutritionQuestionService.insertSysNutritionQuestion(sysNutritionQuestion) > 0){
+                    if (sysNutritionQuestionService.insertSysNutritionQuestion(sysNutritionQuestion) > 0) {
                         count++;
                         Thread.sleep(100);
                         System.out.println(count);
@@ -106,18 +91,18 @@ public class MyApplicationRunner implements ApplicationRunner {
 
                 }
             }
-            System.out.println("结束:"+count);
-        }catch (Exception e){
+            System.out.println("结束:" + count);
+        } catch (Exception e) {
             e.printStackTrace();
         }
 
     }
 
-    public void updateVideo(){
-        Map<String, Object> map = sysNutritionalVideoService.searchVideo(null, null, 1,100, null);
-        if(map != null){
-            List<SysNutritionalVideo> list = (List<SysNutritionalVideo>)map.get("nutritionalVideoList");
-            if(list != null && list.size() > 0){
+    public void updateVideo() {
+        Map<String, Object> map = sysNutritionalVideoService.searchVideo(null, null, 1, 100, null);
+        if (map != null) {
+            List<SysNutritionalVideo> list = (List<SysNutritionalVideo>) map.get("nutritionalVideoList");
+            if (list != null && list.size() > 0) {
                 for (SysNutritionalVideo video : list) {
                     sysNutritionalVideoService.insertSysNutritionalVideo(video);
                 }
@@ -126,5 +111,4 @@ public class MyApplicationRunner implements ApplicationRunner {
     }
 
 
-
 }
diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerHealthyController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerHealthyController.java
index 404dc8c54..ef71c7968 100644
--- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerHealthyController.java
+++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerHealthyController.java
@@ -1,4 +1,4 @@
-package com.stdiet.custom.controller;
+package com.stdiet.web.controller.custom;
 
 import java.util.List;
 
diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysNutritionQuestionController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysNutritionQuestionController.java
index b34f3fbc9..69f1d1538 100644
--- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysNutritionQuestionController.java
+++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysNutritionQuestionController.java
@@ -1,4 +1,4 @@
-package com.stdiet.custom.controller;
+package com.stdiet.web.controller.custom;
 
 import java.util.List;
 
diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysOrderNutritionistReplaceRecordController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysOrderNutritionistReplaceRecordController.java
index c552d29e2..51855fe2a 100644
--- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysOrderNutritionistReplaceRecordController.java
+++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysOrderNutritionistReplaceRecordController.java
@@ -1,4 +1,4 @@
-package com.stdiet.custom.controller;
+package com.stdiet.web.controller.custom;
 
 import java.time.temporal.ChronoUnit;
 import java.util.List;
diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysServiceQuestionController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysServiceQuestionController.java
new file mode 100644
index 000000000..17dec89bf
--- /dev/null
+++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysServiceQuestionController.java
@@ -0,0 +1,26 @@
+package com.stdiet.web.controller.custom;
+
+import com.stdiet.common.core.controller.BaseController;
+import com.stdiet.common.core.domain.AjaxResult;
+import com.stdiet.custom.domain.SysServicesQuestion;
+import com.stdiet.custom.service.ISysServicesQuestionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/services/question")
+public class SysServiceQuestionController extends BaseController {
+
+    @Autowired
+    private ISysServicesQuestionService sysServicesQuestionService;
+
+    @PostMapping(value = "/list")
+    public AjaxResult list(@RequestBody SysServicesQuestion sysServicesQuestion) {
+        return AjaxResult.success(sysServicesQuestionService.selectSysServicesQuestionByUserIdAndRole(sysServicesQuestion));
+    }
+
+    @PutMapping(value = "/updateStatus")
+    public AjaxResult reply(@RequestBody SysServicesQuestion sysServicesQuestion) {
+        return toAjax(sysServicesQuestionService.updateSysServicesQuestionStatus(sysServicesQuestion));
+    }
+}
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 d30ca7002..690faedbc 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
@@ -68,6 +68,8 @@ public class WechatAppletController extends BaseController {
     private ISysDictTypeService iSysDictTypeService;
     @Autowired
     private IWechatAppletService iWechatAppletService;
+    @Autowired
+    private ISysServicesQuestionService iSysServicesQuestionService;
 
     /**
      * 查询微信小程序中展示的客户案例
@@ -571,9 +573,12 @@ public class WechatAppletController extends BaseController {
 //    }
 
     @GetMapping("/trans")
-    public AjaxResult transId(@RequestParam String customerId) {
-        Long cusId = StringUtils.isNotEmpty(customerId) ? Long.parseLong(AesUtils.decrypt(customerId)) : 0L;
-        return AjaxResult.success(String.valueOf(cusId));
+    public AjaxResult transId(@RequestParam String customerId, @RequestParam Long cusId) {
+        if (StringUtils.isNotEmpty(customerId)) {
+            return AjaxResult.success(AesUtils.decrypt(customerId));
+        }
+
+        return AjaxResult.success(AesUtils.encrypt(String.valueOf(cusId)));
     }
 
     @GetMapping("/subscribe")
@@ -587,6 +592,19 @@ public class WechatAppletController extends BaseController {
         return AjaxResult.success(sysRecipesPlanService.updateSysRecipesPlan(info));
     }
 
+    @GetMapping("/fetchServiceQuestion")
+    public AjaxResult fetchServiceQuestion(@RequestParam String customerId, @RequestParam Integer pageNum, @RequestParam Integer pageSize) {
+        startPage();
+
+        Long cusId = StringUtils.isNotEmpty(customerId) ? Long.parseLong(AesUtils.decrypt(customerId)) : 0L;
+
+        SysServicesQuestion servicesQuestion = new SysServicesQuestion();
+        servicesQuestion.setRole("customer");
+        servicesQuestion.setUserId(cusId);
+
+        return AjaxResult.success(iSysServicesQuestionService.selectSysServicesQuestionByUserIdAndRole(servicesQuestion));
+    }
+
 
 }
 
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysServicesQuestion.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysServicesQuestion.java
new file mode 100644
index 000000000..0c711d4bc
--- /dev/null
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysServicesQuestion.java
@@ -0,0 +1,75 @@
+package com.stdiet.custom.domain;
+
+import com.alibaba.fastjson.JSONArray;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class SysServicesQuestion {
+    /**
+     * 问题状态id
+     */
+    String id;
+
+    /**
+     * 问题id(搜索用)
+     */
+    String queId;
+
+    /**
+     * 客户id
+     */
+    Long cusId;
+
+    /**
+     * 问题内容
+     */
+    String content;
+
+
+    /**
+     * 图片地址
+     */
+    JSONArray img;
+
+    /**
+     * 问题类型
+     */
+    Integer type;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    Date createTime;
+
+    /**
+     * 0-未读 1-已读
+     */
+    Integer read;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    Date updateTime;
+
+    /**
+     * 角色
+     */
+    String role;
+
+    // 非持久化字段
+    /**
+     * 角色名字
+     */
+    String name;
+
+    /**
+     * 角色id
+     */
+    Long userId;
+
+}
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysServicesQuestionMapper.java b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysServicesQuestionMapper.java
new file mode 100644
index 000000000..c68c4b63c
--- /dev/null
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysServicesQuestionMapper.java
@@ -0,0 +1,15 @@
+package com.stdiet.custom.mapper;
+
+import com.stdiet.custom.domain.SysServicesQuestion;
+
+import java.util.List;
+
+public interface SysServicesQuestionMapper {
+    List<SysServicesQuestion> selectSysServicesQuestionByUserIdAndRole(SysServicesQuestion servicesQuestion);
+
+    int insertSysServicesQuestion(SysServicesQuestion servicesQuestion);
+
+    int insertSysServicesQuestionStatus(List<SysServicesQuestion> sysServicesQuestion);
+
+    int updateSysServicesQuestionStatus(SysServicesQuestion sysServicesQuestion);
+}
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysServicesQuestionService.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysServicesQuestionService.java
new file mode 100644
index 000000000..344de4c0b
--- /dev/null
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysServicesQuestionService.java
@@ -0,0 +1,14 @@
+package com.stdiet.custom.service;
+
+import com.stdiet.custom.domain.SysServicesQuestion;
+
+import java.util.List;
+
+public interface ISysServicesQuestionService {
+
+    List<SysServicesQuestion> selectSysServicesQuestionByUserIdAndRole(SysServicesQuestion servicesQuestion);
+
+    int insertSysServicesQuestion(SysServicesQuestion servicesQuestion);
+
+    int updateSysServicesQuestionStatus(SysServicesQuestion sysServicesQuestion);
+}
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysServicesQuestionServiceImp.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysServicesQuestionServiceImp.java
new file mode 100644
index 000000000..07b61add0
--- /dev/null
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysServicesQuestionServiceImp.java
@@ -0,0 +1,66 @@
+package com.stdiet.custom.service.impl;
+
+import com.stdiet.custom.domain.SysCustomer;
+import com.stdiet.custom.domain.SysServicesQuestion;
+import com.stdiet.custom.mapper.SysCustomerMapper;
+import com.stdiet.custom.mapper.SysServicesQuestionMapper;
+import com.stdiet.custom.service.ISysServicesQuestionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class SysServicesQuestionServiceImp implements ISysServicesQuestionService {
+    @Autowired
+    SysServicesQuestionMapper servicesQuestionMapper;
+
+    @Autowired
+    SysCustomerMapper sysCustomerMapper;
+
+    @Override
+    public List<SysServicesQuestion> selectSysServicesQuestionByUserIdAndRole(SysServicesQuestion servicesQuestion) {
+        return servicesQuestionMapper.selectSysServicesQuestionByUserIdAndRole(servicesQuestion);
+    }
+
+    @Override
+    public int insertSysServicesQuestion(SysServicesQuestion servicesQuestion) {
+        servicesQuestionMapper.insertSysServicesQuestion(servicesQuestion);
+
+        SysCustomer customer = sysCustomerMapper.selectSysCustomerById(servicesQuestion.getCusId());
+
+        List<SysServicesQuestion> statusList = new ArrayList<>();
+        SysServicesQuestion customerStatus = new SysServicesQuestion();
+        customerStatus.setUserId(customer.getId());
+        customerStatus.setRole("customer");
+        customerStatus.setQueId(servicesQuestion.getId());
+        statusList.add(customerStatus);
+
+        SysServicesQuestion dieticianStatus = new SysServicesQuestion();
+        dieticianStatus.setUserId(customer.getMainDietitian());
+        dieticianStatus.setRole("dietician");
+        dieticianStatus.setQueId(servicesQuestion.getId());
+        statusList.add(dieticianStatus);
+
+        SysServicesQuestion afterSaleStatus = new SysServicesQuestion();
+        afterSaleStatus.setUserId(customer.getAfterDietitian());
+        afterSaleStatus.setRole("after_sale");
+        afterSaleStatus.setQueId(servicesQuestion.getId());
+        statusList.add(afterSaleStatus);
+
+        SysServicesQuestion dieticianAssistantStatus = new SysServicesQuestion();
+        dieticianAssistantStatus.setUserId(customer.getAssistantDietitian());
+        dieticianAssistantStatus.setRole("dietician_assistant");
+        dieticianAssistantStatus.setQueId(servicesQuestion.getId());
+        statusList.add(dieticianAssistantStatus);
+
+        return servicesQuestionMapper.insertSysServicesQuestionStatus(statusList);
+    }
+
+
+    @Override
+    public int updateSysServicesQuestionStatus(SysServicesQuestion sysServicesQuestion) {
+        return servicesQuestionMapper.updateSysServicesQuestionStatus(sysServicesQuestion);
+    }
+}
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/WeChartAppletServiceImp.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/WeChartAppletServiceImp.java
index 9cf84060a..73a40ee88 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/WeChartAppletServiceImp.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/WeChartAppletServiceImp.java
@@ -97,7 +97,7 @@ public class WeChartAppletServiceImp implements IWechatAppletService {
         dataParam.put("thing1", JSONObject.parse("{\"value\":\"" + name + "\"}"));
         dataParam.put("time2", JSONObject.parse("{\"value\":\"" + startDate + "\"}"));
         dataParam.put("time3", JSONObject.parse("{\"value\":\"" + endDate + "\"}"));
-        String mRemark = StringUtils.isNull(remark) ? " " : remark;
+        String mRemark = StringUtils.isNull(remark) ? "无" : remark;
         dataParam.put("thing4", JSONObject.parse("{\"value\":\"" + mRemark + "\"}"));
 
         param.put("data", dataParam);
diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysServicesQuestionMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysServicesQuestionMapper.xml
new file mode 100644
index 000000000..dea35d763
--- /dev/null
+++ b/stdiet-custom/src/main/resources/mapper/custom/SysServicesQuestionMapper.xml
@@ -0,0 +1,83 @@
+<?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.SysServicesQuestionMapper">
+
+    <resultMap type="SysServicesQuestion" id="SysServicesQuestionResult">
+        <result column="id" property="id"/>
+        <result column="que_id" property="queId"/>
+        <result column="content" property="content"/>
+        <result column="role" property="role"/>
+        <result column="name" property="name"/>
+        <result column="type" property="type"/>
+        <result column="read" property="read"/>
+        <result column="img" property="img" typeHandler="com.stdiet.custom.typehandler.ArrayJsonHandler"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <!--    根据userId和角色查询问题列表-->
+    <select id="selectSysServicesQuestionByUserIdAndRole" parameterType="SysServicesQuestion"
+            resultMap="SysServicesQuestionResult">
+        SELECT * FROM (
+        SELECT * FROM sys_services_question_status WHERE role = #{role} AND user_id = #{userId}
+        ) AS status
+        LEFT JOIN sys_services_question USING(que_id)
+        <choose>
+            <when test="role == 'customer'">
+                LEFT JOIN (
+                SELECT name, id AS user_id FROM sys_customer WHERE id = #{userId}
+                ) AS customer USING(user_id)
+            </when>
+            <otherwise>
+                LEFT JOIN (
+                SELECT role_key, sys_role.role_id, sys_user_role.user_id, sys_user.nick_name AS name FROM sys_role
+                INNER JOIN sys_user_role USING(role_id)
+                INNER JOIN sys_user USING(user_id)
+                WHERE role_key = #{role} AND user_id = #{userId}
+                ) AS user USING(user_id)
+            </otherwise>
+        </choose>
+        ORDER BY type ASC, update_time DESC
+    </select>
+
+    <!--    插入问题-->
+    <insert id="insertSysServicesQuestion" parameterType="SysServicesQuestion" useGeneratedKeys="true" keyProperty="id">
+        insert into sys_services_question
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            id,
+            <if test="cusId != null">cus_id,</if>
+            <if test="content != null">content,</if>
+            <if test="type != null">type,</if>
+            <if test="cusId != null">create_time,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            replace(uuid(), '-', ''),
+            <if test="cusId != null">#{cusId},</if>
+            <if test="content != null">#{content},</if>
+            <if test="type != null">#{type},</if>
+            <if test="cusId != null">now(),</if>
+        </trim>
+    </insert>
+
+    <!--    插入问题的四个角色:1,用户; 2,营养师; 3,售后; 4,助理-->
+    <insert id="insertSysServicesQuestionStatus" parameterType="java.util.List">
+        insert into sys_services_question (que_id, user_id, role, create_time, update_time) values
+        <foreach collection="list" item="status" index="index" separator=",">
+            (#{status.queId}, #{status.userId}, #{status.role}, now(), now())
+        </foreach>
+    </insert>
+
+    <!--    根据状态id更新-->
+    <update id="updateSysServicesQuestionStatus" parameterType="SysServicesQuestion">
+        update sys_services_question_status
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="read !== null">read = #{read}</if>
+            <if test="read !== null">update_time = now()</if>
+        </trim>
+        where id = ${id}
+    </update>
+
+
+</mapper>
\ No newline at end of file
diff --git a/stdiet-system/src/main/resources/mapper/system/SysUserMapper.xml b/stdiet-system/src/main/resources/mapper/system/SysUserMapper.xml
index 27d26aa21..ce1f92365 100644
--- a/stdiet-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/stdiet-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -1,58 +1,58 @@
 <?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">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.stdiet.system.mapper.SysUserMapper">
 
-	<resultMap id="CusSalesmanResult" type="CusSalesman" >
-		<id	    property="userId"       column="user_id"/>
-		<result property="userName"     column="nick_name"/>
-	</resultMap>
+    <resultMap id="CusSalesmanResult" type="CusSalesman">
+        <id property="userId" column="user_id"/>
+        <result property="userName" column="nick_name"/>
+    </resultMap>
 
-	<resultMap type="SysUser" id="SysUserResult">
-		<id     property="userId"       column="user_id"      />
-		<result property="deptId"       column="dept_id"      />
-		<result property="userName"     column="user_name"    />
-		<result property="nickName"     column="nick_name"    />
-		<result property="email"        column="email"        />
-		<result property="phonenumber"  column="phonenumber"  />
-		<result property="sex"          column="sex"          />
-		<result property="avatar"       column="avatar"       />
-		<result property="password"     column="password"     />
-		<result property="status"       column="status"       />
-		<result property="delFlag"      column="del_flag"     />
-		<result property="loginIp"      column="login_ip"     />
-		<result property="loginDate"    column="login_date"   />
-		<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="remark"       column="remark"       />
-		<!--		<result property="postId"		column="post_id"	  />-->
-		<result property="postName"		column="post_name"	  />
-		<association property="dept"    column="dept_id" javaType="SysDept" resultMap="deptResult" />
-		<collection  property="roles"   javaType="java.util.List"        resultMap="RoleResult" />
-	</resultMap>
+    <resultMap type="SysUser" id="SysUserResult">
+        <id property="userId" column="user_id"/>
+        <result property="deptId" column="dept_id"/>
+        <result property="userName" column="user_name"/>
+        <result property="nickName" column="nick_name"/>
+        <result property="email" column="email"/>
+        <result property="phonenumber" column="phonenumber"/>
+        <result property="sex" column="sex"/>
+        <result property="avatar" column="avatar"/>
+        <result property="password" column="password"/>
+        <result property="status" column="status"/>
+        <result property="delFlag" column="del_flag"/>
+        <result property="loginIp" column="login_ip"/>
+        <result property="loginDate" column="login_date"/>
+        <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="remark" column="remark"/>
+        <!--		<result property="postId"		column="post_id"	  />-->
+        <result property="postName" column="post_name"/>
+        <association property="dept" column="dept_id" javaType="SysDept" resultMap="deptResult"/>
+        <collection property="roles" javaType="java.util.List" resultMap="RoleResult"/>
+    </resultMap>
 
-	<resultMap id="deptResult" type="SysDept">
-		<id     property="deptId"   column="dept_id"     />
-		<result property="parentId" column="parent_id"   />
-		<result property="deptName" column="dept_name"   />
-		<result property="orderNum" column="order_num"   />
-		<result property="leader"   column="leader"      />
-		<result property="status"   column="dept_status" />
-	</resultMap>
+    <resultMap id="deptResult" type="SysDept">
+        <id property="deptId" column="dept_id"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="deptName" column="dept_name"/>
+        <result property="orderNum" column="order_num"/>
+        <result property="leader" column="leader"/>
+        <result property="status" column="dept_status"/>
+    </resultMap>
 
-	<resultMap id="RoleResult" type="SysRole">
-		<id     property="roleId"       column="role_id"        />
-		<result property="roleName"     column="role_name"      />
-		<result property="roleKey"      column="role_key"       />
-		<result property="roleSort"     column="role_sort"      />
-		<result property="dataScope"     column="data_scope"    />
-		<result property="status"       column="role_status"    />
-	</resultMap>
+    <resultMap id="RoleResult" type="SysRole">
+        <id property="roleId" column="role_id"/>
+        <result property="roleName" column="role_name"/>
+        <result property="roleKey" column="role_key"/>
+        <result property="roleSort" column="role_sort"/>
+        <result property="dataScope" column="data_scope"/>
+        <result property="status" column="role_status"/>
+    </resultMap>
 
-	<select id="selectAllUser" parameterType="SysUser" resultMap="SysUserResult">
+    <select id="selectAllUser" parameterType="SysUser" resultMap="SysUserResult">
 -- 		select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user u
 -- 		left join sys_dept d on u.dept_id = d.dept_id
 -- 		where u.del_flag = '0'
@@ -61,11 +61,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		WHERE del_flag = '0'
 	</select>
 
-	<select id="selectSalesman" parameterType="CusSalesman" resultMap="CusSalesmanResult">
+    <select id="selectSalesman" parameterType="CusSalesman" resultMap="CusSalesmanResult">
         select user_id, nick_name from sys_user where dept_id='103'
     </select>
 
-	<sql id="selectUserVo">
+    <sql id="selectUserVo">
 --         select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
 --         d.dept_id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status,
 --         r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status, p.post_id, p.post_name
@@ -89,138 +89,141 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </sql>
 
     <select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
--- 		select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader, p.post_id, p.post_name from sys_user u
--- 		left join sys_dept d on u.dept_id = d.dept_id
--- 		left join sys_user_post up on up.user_id = u.user_id
--- 		left join sys_post p on p.post_id = up.post_id
--- 		where u.del_flag = '0'
-		SELECT * FROM sys_user
-		JOIN (SELECT dept_id, dept_name FROM sys_dept) AS d USING(dept_id)
-		JOIN (
-		SELECT user_id, GROUP_CONCAT(post_name SEPARATOR ',') AS post_name, GROUP_CONCAT(post_id SEPARATOR ',') AS post_id
-		FROM (
-			SELECT * FROM sys_user_post
-			JOIN (SELECT post_id, post_name FROM sys_post) AS p USING(post_id)
+        -- select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.password, u.sex,
+--         u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader,
+--         p.post_id, p.post_name from sys_user u
+        -- left join sys_dept d on u.dept_id = d.dept_id
+        -- left join sys_user_post up on up.user_id = u.user_id
+        -- left join sys_post p on p.post_id = up.post_id
+        -- where u.del_flag = '0'
+        SELECT * FROM sys_user
+        JOIN (SELECT dept_id, dept_name FROM sys_dept) AS d USING(dept_id)
+        JOIN (
+        	SELECT user_id, GROUP_CONCAT(post_name SEPARATOR ',') AS post_name, GROUP_CONCAT(post_id SEPARATOR ',') AS post_id
+        	FROM (
+				SELECT * FROM sys_user_post
+				JOIN (SELECT post_id, post_name FROM sys_post) AS p USING(post_id)
 			) AS up GROUP BY user_id ) AS ups USING(user_id)
-		WHERE del_flag = '0'
-		<if test="userName != null and userName != ''">
-			AND (user_name like concat('%', #{userName}, '%') OR nick_name like concat('%', #{userName}, '%'))
-		</if>
-		<if test="status != null and status != ''">
-			AND status = #{status}
-		</if>
-		<if test="phonenumber != null and phonenumber != ''">
-			AND phonenumber like concat('%', #{phonenumber}, '%')
-		</if>
-		<if test="beginTime != null and beginTime != ''"><!-- 开始时间检索 -->
-			AND date_format(create_time,'%y%m%d') &gt;= date_format(#{beginTime},'%y%m%d')
-		</if>
-		<if test="endTime != null and endTime != ''"><!-- 结束时间检索 -->
-			AND date_format(create_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')
-		</if>
-		<if test="deptId != null and deptId != 0">
-			AND (dept_id = #{deptId} OR dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) ))
-		</if>
-		<!-- 数据范围过滤 -->
-		${params.dataScope}
-	</select>
+        WHERE del_flag = '0'
+        <if test="userName != null and userName != ''">
+            AND (user_name like concat('%', #{userName}, '%') OR nick_name like concat('%', #{userName}, '%'))
+        </if>
+        <if test="status != null and status != ''">
+            AND status = #{status}
+        </if>
+        <if test="phonenumber != null and phonenumber != ''">
+            AND phonenumber like concat('%', #{phonenumber}, '%')
+        </if>
+        <if test="beginTime != null and beginTime != ''"><!-- 开始时间检索 -->
+            AND date_format(create_time,'%y%m%d') &gt;= date_format(#{beginTime},'%y%m%d')
+        </if>
+        <if test="endTime != null and endTime != ''"><!-- 结束时间检索 -->
+            AND date_format(create_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')
+        </if>
+        <if test="deptId != null and deptId != 0">
+            AND (dept_id = #{deptId} OR dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId},
+            ancestors) ))
+        </if>
+        <!-- 数据范围过滤 -->
+        ${params.dataScope}
+    </select>
 
-	<select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult">
-	    <include refid="selectUserVo"/>
-		where user_name = #{userName}
-	</select>
+    <select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult">
+        <include refid="selectUserVo"/>
+        where user_name = #{userName}
+    </select>
 
-	<select id="selectUserById" parameterType="Long" resultMap="SysUserResult">
-		<include refid="selectUserVo"/>
-		where user_id = #{userId}
-	</select>
+    <select id="selectUserById" parameterType="Long" resultMap="SysUserResult">
+        <include refid="selectUserVo"/>
+        where user_id = #{userId}
+    </select>
 
-	<select id="checkUserNameUnique" parameterType="String" resultType="int">
+    <select id="checkUserNameUnique" parameterType="String" resultType="int">
 		select count(1) from sys_user where user_name = #{userName} limit 1
 	</select>
 
-	<select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
+    <select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
 		select user_id, phonenumber from sys_user where phonenumber = #{phonenumber} limit 1
 	</select>
 
-	<select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
+    <select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
 		select user_id, email from sys_user where email = #{email} limit 1
 	</select>
 
-	<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
- 		insert into sys_user(
- 			<if test="userId != null and userId != 0">user_id,</if>
- 			<if test="deptId != null and deptId != 0">dept_id,</if>
- 			<if test="userName != null and userName != ''">user_name,</if>
- 			<if test="nickName != null and nickName != ''">nick_name,</if>
- 			<if test="email != null and email != ''">email,</if>
- 			<if test="avatar != null and avatar != ''">avatar,</if>
- 			<if test="phonenumber != null and phonenumber != ''">phonenumber,</if>
- 			<if test="sex != null and sex != ''">sex,</if>
- 			<if test="password != null and password != ''">password,</if>
- 			<if test="status != null and status != ''">status,</if>
- 			<if test="createBy != null and createBy != ''">create_by,</if>
- 			<if test="remark != null and remark != ''">remark,</if>
- 			create_time
- 		)values(
- 			<if test="userId != null and userId != ''">#{userId},</if>
- 			<if test="deptId != null and deptId != ''">#{deptId},</if>
- 			<if test="userName != null and userName != ''">#{userName},</if>
- 			<if test="nickName != null and nickName != ''">#{nickName},</if>
- 			<if test="email != null and email != ''">#{email},</if>
- 			<if test="avatar != null and avatar != ''">#{avatar},</if>
- 			<if test="phonenumber != null and phonenumber != ''">#{phonenumber},</if>
- 			<if test="sex != null and sex != ''">#{sex},</if>
- 			<if test="password != null and password != ''">#{password},</if>
- 			<if test="status != null and status != ''">#{status},</if>
- 			<if test="createBy != null and createBy != ''">#{createBy},</if>
- 			<if test="remark != null and remark != ''">#{remark},</if>
- 			sysdate()
- 		)
-	</insert>
+    <insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
+        insert into sys_user(
+        <if test="userId != null and userId != 0">user_id,</if>
+        <if test="deptId != null and deptId != 0">dept_id,</if>
+        <if test="userName != null and userName != ''">user_name,</if>
+        <if test="nickName != null and nickName != ''">nick_name,</if>
+        <if test="email != null and email != ''">email,</if>
+        <if test="avatar != null and avatar != ''">avatar,</if>
+        <if test="phonenumber != null and phonenumber != ''">phonenumber,</if>
+        <if test="sex != null and sex != ''">sex,</if>
+        <if test="password != null and password != ''">password,</if>
+        <if test="status != null and status != ''">status,</if>
+        <if test="createBy != null and createBy != ''">create_by,</if>
+        <if test="remark != null and remark != ''">remark,</if>
+        create_time
+        )values(
+        <if test="userId != null and userId != ''">#{userId},</if>
+        <if test="deptId != null and deptId != ''">#{deptId},</if>
+        <if test="userName != null and userName != ''">#{userName},</if>
+        <if test="nickName != null and nickName != ''">#{nickName},</if>
+        <if test="email != null and email != ''">#{email},</if>
+        <if test="avatar != null and avatar != ''">#{avatar},</if>
+        <if test="phonenumber != null and phonenumber != ''">#{phonenumber},</if>
+        <if test="sex != null and sex != ''">#{sex},</if>
+        <if test="password != null and password != ''">#{password},</if>
+        <if test="status != null and status != ''">#{status},</if>
+        <if test="createBy != null and createBy != ''">#{createBy},</if>
+        <if test="remark != null and remark != ''">#{remark},</if>
+        sysdate()
+        )
+    </insert>
 
-	<update id="updateUser" parameterType="SysUser">
- 		update sys_user
- 		<set>
- 			<if test="deptId != null and deptId != 0">dept_id = #{deptId},</if>
- 			<if test="userName != null and userName != ''">user_name = #{userName},</if>
- 			<if test="nickName != null and nickName != ''">nick_name = #{nickName},</if>
- 			<if test="email != null and email != ''">email = #{email},</if>
- 			<if test="phonenumber != null and phonenumber != ''">phonenumber = #{phonenumber},</if>
- 			<if test="sex != null and sex != ''">sex = #{sex},</if>
- 			<if test="avatar != null and avatar != ''">avatar = #{avatar},</if>
- 			<if test="password != null and password != ''">password = #{password},</if>
- 			<if test="status != null and status != ''">status = #{status},</if>
- 			<if test="loginIp != null and loginIp != ''">login_ip = #{loginIp},</if>
- 			<if test="loginDate != null">login_date = #{loginDate},</if>
- 			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
- 			<if test="remark != null">remark = #{remark},</if>
- 			update_time = sysdate()
- 		</set>
- 		where user_id = #{userId}
-	</update>
+    <update id="updateUser" parameterType="SysUser">
+        update sys_user
+        <set>
+            <if test="deptId != null and deptId != 0">dept_id = #{deptId},</if>
+            <if test="userName != null and userName != ''">user_name = #{userName},</if>
+            <if test="nickName != null and nickName != ''">nick_name = #{nickName},</if>
+            <if test="email != null and email != ''">email = #{email},</if>
+            <if test="phonenumber != null and phonenumber != ''">phonenumber = #{phonenumber},</if>
+            <if test="sex != null and sex != ''">sex = #{sex},</if>
+            <if test="avatar != null and avatar != ''">avatar = #{avatar},</if>
+            <if test="password != null and password != ''">password = #{password},</if>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="loginIp != null and loginIp != ''">login_ip = #{loginIp},</if>
+            <if test="loginDate != null">login_date = #{loginDate},</if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            update_time = sysdate()
+        </set>
+        where user_id = #{userId}
+    </update>
 
-	<update id="updateUserStatus" parameterType="SysUser">
+    <update id="updateUserStatus" parameterType="SysUser">
  		update sys_user set status = #{status} where user_id = #{userId}
 	</update>
 
-	<update id="updateUserAvatar" parameterType="SysUser">
+    <update id="updateUserAvatar" parameterType="SysUser">
  		update sys_user set avatar = #{avatar} where user_name = #{userName}
 	</update>
 
-	<update id="resetUserPwd" parameterType="SysUser">
+    <update id="resetUserPwd" parameterType="SysUser">
  		update sys_user set password = #{password} where user_name = #{userName}
 	</update>
 
-	<delete id="deleteUserById" parameterType="Long">
+    <delete id="deleteUserById" parameterType="Long">
  		delete from sys_user where user_id = #{userId}
  	</delete>
 
- 	<delete id="deleteUserByIds" parameterType="Long">
- 		update sys_user set del_flag = '2' where user_id in
- 		<foreach collection="array" item="userId" open="(" separator="," close=")">
- 			#{userId}
+    <delete id="deleteUserByIds" parameterType="Long">
+        update sys_user set del_flag = '2' where user_id in
+        <foreach collection="array" item="userId" open="(" separator="," close=")">
+            #{userId}
         </foreach>
- 	</delete>
+    </delete>
 
 </mapper> 
\ No newline at end of file