From 1901fceb6ddaa56a57f3131191454554c3e77e68 Mon Sep 17 00:00:00 2001
From: guohongjin <guohongjin@test.com>
Date: 星期三, 01 五月 2024 13:56:51 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/PsychologicalCounseling

---
 rest/src/main/java/cn/stylefeng/rest/modular/worker/controller/WorkerController.java                                                     |   40 +
 rest/src/main/resources/ijpay/cert/apiclient_cert.p12                                                                                    |    0 
 rest/src/main/java/cn/stylefeng/rest/modular/work/MentalAppointmentWork.java                                                             |   31 -
 common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/MentalTestMyTestRecordTopicDTO.java                                  |   79 +++
 rest/src/main/java/cn/stylefeng/rest/ijpay/controller/AliPayController.java                                                              |   97 ++++
 common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/MentalTestRecordServiceImpl.java                            |    3 
 rest/src/main/resources/ijpay/cert/apiclient_key.pem                                                                                     |   52 +-
 rest/src/main/resources/ijpay/cert/apiclient_cert.pem                                                                                    |   41 +-
 common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/ImBizService.java                                           |    6 
 rest/pom.xml                                                                                                                             |    5 
 rest/src/main/java/cn/stylefeng/rest/modular/user/service/CustomerLoginBizService.java                                                   |   25 +
 rest/src/main/java/cn/stylefeng/rest/modular/home/service/MentalTestBizService.java                                                      |    3 
 common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/MentalAppointmentServiceImpl.java                           |    6 
 common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/mapping/MentalAppointmentMapper.xml                               |    4 
 rest/src/main/resources/ijpay/alipay.properties                                                                                          |    2 
 rest/src/main/java/cn/stylefeng/rest/modular/order/controller/MentalTestOrderController.java                                             |   45 -
 rest/src/main/resources/application-prod.yml                                                                                             |   10 
 roses/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/impl/CustomerServiceImpl.java |   33 +
 roses/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/enums/ImPushTypeEnum.java                                               |    1 
 common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/MentalAnalysisTimeConfigMapper.java                               |    2 
 rest/src/main/java/cn/stylefeng/rest/ijpay/controller/WxPayController.java                                                               |  100 +++-
 common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/MentalTestMyTestTopicDTO.java                                        |   36 +
 common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/IMentalTestRecordService.java                                    |    5 
 rest/src/main/java/cn/stylefeng/rest/modular/user/controller/CounsellingInfoController.java                                              |   57 +
 common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/MentalTestMyTestOrderDTO.java                                        |   16 
 rest/src/main/java/cn/stylefeng/rest/modular/user/controller/MyMentalTestController.java                                                 |   15 
 common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/mapping/MentalTestRecordMapper.xml                                |   69 +++
 common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/IMentalAnalysisTimeConfigService.java                            |    2 
 rest/src/main/java/cn/stylefeng/rest/modular/home/controller/HomeIndexController.java                                                    |   12 
 common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/mapping/MentalAnalysisTimeConfigMapper.xml                        |    6 
 guns/src/main/java/cn/stylefeng/guns/modular/business/controller/VersionController.java                                                  |   17 
 common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/request/CustomerWxOpenIdLoginRequest.java                            |    9 
 roses/kernel-d-cache/cache-api/src/main/java/cn/stylefeng/roses/kernel/cache/api/CacheOperatorApi.java                                   |    2 
 rest/src/main/java/cn/stylefeng/rest/config/ObjectRedisAutoConfiguration.java                                                            |   24 +
 rest/src/main/resources/ijpay/wxpay.properties                                                                                           |   13 
 sql/clear_data_20240419.sql                                                                                                              |  197 +++++++++
 common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/MentalTestRecordMapper.java                                       |    3 
 /dev/null                                                                                                                                |    1 
 common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/MentalAnalysisTimeConfigServiceImpl.java                    |    4 
 common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/OrderMentalTestServiceImpl.java                             |   15 
 guns/src/main/java/cn/stylefeng/guns/modular/business/controller/CounsellingOrderReservationController.java                              |   12 
 rest/src/main/resources/application.yml                                                                                                  |   11 
 guns/src/main/resources/application-prod.yml                                                                                             |    4 
 common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/CounsellingOrderServiceImpl.java                            |   30 
 rest/src/main/java/cn/stylefeng/rest/modular/user/controller/UserCenterController.java                                                   |   40 +
 roses/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/enums/PayTypeEnum.java                                                  |    4 
 roses/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/CustomerService.java          |    5 
 47 files changed, 945 insertions(+), 249 deletions(-)

diff --git a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/MentalTestMyTestOrderDTO.java b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/MentalTestMyTestOrderDTO.java
index 90f863c..06aab12 100644
--- a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/MentalTestMyTestOrderDTO.java
+++ b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/MentalTestMyTestOrderDTO.java
@@ -52,10 +52,6 @@
     @ChineseDescription("咨询费用")
     private BigDecimal consultAmount;
 
-    @ApiModelProperty(value = "是否购买")
-    @ChineseDescription("是否购买")
-    private boolean payFlag;
-
     @ApiModelProperty(value = "测试人数")
     @ChineseDescription("测试人数")
     private Integer testPeopleNum;
@@ -64,4 +60,16 @@
     @ChineseDescription("测试配置人数")
     private Integer testSetNum;
 
+    @ApiModelProperty(value = "是否后台创建")
+    @ChineseDescription("是否后台创建")
+    private Boolean isBack;
+
+    @ApiModelProperty(value = "是否测试")
+    @ChineseDescription("是否测试")
+    private Boolean testFlag;
+
+    @ApiModelProperty(value = "是否购买")
+    @ChineseDescription("是否购买")
+    private Boolean payFlag;
+
 }
diff --git a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/MentalTestMyTestRecordTopicDTO.java b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/MentalTestMyTestRecordTopicDTO.java
new file mode 100644
index 0000000..f373552
--- /dev/null
+++ b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/MentalTestMyTestRecordTopicDTO.java
@@ -0,0 +1,79 @@
+package cn.stylefeng.guns.modular.business.dto;
+
+import cn.stylefeng.guns.modular.business.entity.MentalTestRecord;
+import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "我的测试记录-响应参数")
+public class MentalTestMyTestRecordTopicDTO extends MentalTestRecord {
+
+    @ApiModelProperty(value = "题库ID")
+    @ChineseDescription("题库ID")
+    private Long topicId;
+
+    @ApiModelProperty(value = "状态:1正常,2冻结")
+    @ChineseDescription("状态:1正常,2冻结")
+    private Integer topicStatus;
+
+    @ApiModelProperty(value = "状态:1正常,2冻结")
+    @ChineseDescription("状态:1正常,2冻结")
+    private Integer statusFlag;
+
+    @ApiModelProperty(value = "标题")
+    @ChineseDescription("标题")
+    private String title;
+
+    @ApiModelProperty(value = "分类")
+    @ChineseDescription("分类")
+    private String classId;
+
+    @ApiModelProperty(value = "简介")
+    @ChineseDescription("简介")
+    private String intro;
+
+    @ApiModelProperty(value = "图片")
+    @ChineseDescription("图片")
+    private String image;
+
+    @ApiModelProperty(value = "测试类型:0免费,1付费")
+    @ChineseDescription("测试类型:0免费,1付费")
+    private Integer testType;
+
+    @ApiModelProperty(value = "测试费用")
+    @ChineseDescription("测试费用")
+    private BigDecimal testAmount;
+
+    @ApiModelProperty(value = "咨询1V1,0无,1有")
+    @ChineseDescription("咨询1V1,0无,1有")
+    private Integer consultOne;
+
+    @ApiModelProperty(value = "咨询费用")
+    @ChineseDescription("咨询费用")
+    private BigDecimal consultAmount;
+
+    @ApiModelProperty(value = "是否后台创建")
+    @ChineseDescription("是否后台创建")
+    private Boolean isBack;
+
+    @ApiModelProperty(value = "是否测试")
+    @ChineseDescription("是否测试")
+    private Boolean testFlag;
+
+    @ApiModelProperty(value = "是否购买")
+    @ChineseDescription("是否购买")
+    private Boolean payFlag;
+
+    @ApiModelProperty(value = "测试人数")
+    @ChineseDescription("测试人数")
+    private Integer testPeopleNum;
+
+    @ApiModelProperty(value = "测试配置人数")
+    @ChineseDescription("测试配置人数")
+    private Integer testSetNum;
+
+}
diff --git a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/MentalTestMyTestTopicDTO.java b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/MentalTestMyTestTopicDTO.java
index 8a9e124..e733204 100644
--- a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/MentalTestMyTestTopicDTO.java
+++ b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/MentalTestMyTestTopicDTO.java
@@ -1,6 +1,6 @@
 package cn.stylefeng.guns.modular.business.dto;
 
-import cn.stylefeng.guns.modular.business.entity.MentalTestRecord;
+import cn.stylefeng.guns.modular.business.entity.OrderMentalTest;
 import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -10,15 +10,19 @@
 
 @Data
 @ApiModel(value = "我的测试-响应参数")
-public class MentalTestMyTestTopicDTO extends MentalTestRecord {
+public class MentalTestMyTestTopicDTO extends OrderMentalTest {
+
+    @ApiModelProperty(value = "心理测试记录ID")
+    @ChineseDescription("心理测试记录ID")
+    private Long mentalTestRecordId;
+
+    @ApiModelProperty(value = "题库ID")
+    @ChineseDescription("题库ID")
+    private Long topicId;
 
     @ApiModelProperty(value = "状态:1正常,2冻结")
     @ChineseDescription("状态:1正常,2冻结")
     private Integer topicStatus;
-
-    @ApiModelProperty(value = "状态:1正常,2冻结")
-    @ChineseDescription("状态:1正常,2冻结")
-    private Integer statusFlag;
 
     @ApiModelProperty(value = "标题")
     @ChineseDescription("标题")
@@ -52,14 +56,6 @@
     @ChineseDescription("咨询费用")
     private BigDecimal consultAmount;
 
-    @ApiModelProperty(value = "是否测试")
-    @ChineseDescription("是否测试")
-    private boolean testFlag;
-
-    @ApiModelProperty(value = "是否购买")
-    @ChineseDescription("是否购买")
-    private boolean payFlag;
-
     @ApiModelProperty(value = "测试人数")
     @ChineseDescription("测试人数")
     private Integer testPeopleNum;
@@ -68,4 +64,16 @@
     @ChineseDescription("测试配置人数")
     private Integer testSetNum;
 
+    @ApiModelProperty(value = "是否后台创建")
+    @ChineseDescription("是否后台创建")
+    private Boolean isBack;
+
+    @ApiModelProperty(value = "是否测试")
+    @ChineseDescription("是否测试")
+    private Boolean testFlag;
+
+    @ApiModelProperty(value = "是否购买")
+    @ChineseDescription("是否购买")
+    private Boolean payFlag;
+
 }
diff --git a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/request/CustomerWxOpenIdLoginRequest.java b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/request/CustomerWxOpenIdLoginRequest.java
index f895d9f..d2cce81 100644
--- a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/request/CustomerWxOpenIdLoginRequest.java
+++ b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/dto/request/CustomerWxOpenIdLoginRequest.java
@@ -1,20 +1,21 @@
 package cn.stylefeng.guns.modular.business.dto.request;
 
 import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
+import cn.stylefeng.roses.kernel.sms.modular.param.SysSmsVerifyParam;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 @Data
 @ApiModel(value = "微信OpenId登录-请求参数")
-public class CustomerWxOpenIdLoginRequest {
+public class CustomerWxOpenIdLoginRequest extends SysSmsVerifyParam {
 
     @ApiModelProperty(value = "微信OpenId", required = true)
     @ChineseDescription("微信OpenId")
     private String wxOpenId;
 
-    @ApiModelProperty(value = "手机号")
-    @ChineseDescription("手机号")
-    private String phone;
+    @ApiModelProperty(value = "顾问工号")
+    @ChineseDescription("顾问工号")
+    private String workerNo;
 
 }
diff --git a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/MentalAnalysisTimeConfigMapper.java b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/MentalAnalysisTimeConfigMapper.java
index 15d07c8..a94829b 100644
--- a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/MentalAnalysisTimeConfigMapper.java
+++ b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/MentalAnalysisTimeConfigMapper.java
@@ -20,6 +20,6 @@
 
     Page<MentalAnalysisTimeConfigPageDTO> getWorkerPage(@Param("page") Page<Object> page, @Param("nickName") String nickName);
 
-    List<MentalAnalysisTimeConfig> getWorkerListByAppointmentTime(@Param("mentalAnalysisStatus") Integer mentalAnalysisStatus, @Param("weekDay") Integer weekDay, @Param("appointmentDay") String appointmentDay, @Param("beginTimePoint") String beginTimePoint, @Param("endTimePoint") String endTimePoint);
+    List<MentalAnalysisTimeConfig> getWorkerListByAppointmentTime(@Param("workStatus") Integer workStatus, @Param("mentalAnalysisStatus") Integer mentalAnalysisStatus, @Param("weekDay") Integer weekDay, @Param("appointmentDay") String appointmentDay, @Param("beginTimePoint") String beginTimePoint, @Param("endTimePoint") String endTimePoint);
 
 }
diff --git a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/MentalTestRecordMapper.java b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/MentalTestRecordMapper.java
index f47ec29..7dc8a8e 100644
--- a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/MentalTestRecordMapper.java
+++ b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/MentalTestRecordMapper.java
@@ -1,6 +1,7 @@
 package cn.stylefeng.guns.modular.business.mapper;
 
 import cn.stylefeng.guns.modular.business.dto.MentalTestMyTestOrderDTO;
+import cn.stylefeng.guns.modular.business.dto.MentalTestMyTestRecordTopicDTO;
 import cn.stylefeng.guns.modular.business.dto.MentalTestMyTestTopicDTO;
 import cn.stylefeng.guns.modular.business.dto.MentalTestRecordPageDTO;
 import cn.stylefeng.guns.modular.business.entity.MentalTestRecord;
@@ -22,7 +23,7 @@
 
     List<MentalTestMyTestTopicDTO> myTestTopic(@Param("userId") Long userId, @Param("topicId") Long topicId);
 
-    List<MentalTestMyTestTopicDTO> myTestRecordTopicByMentalAppointmentId(@Param("mentalAppointmentId") Long mentalAppointmentId, @Param("mentalAppointmentIdList") List<Long> mentalAppointmentIdList);
+    List<MentalTestMyTestRecordTopicDTO> myTestRecordTopicByMentalAppointmentId(@Param("mentalAppointmentId") Long mentalAppointmentId, @Param("mentalAppointmentIdList") List<Long> mentalAppointmentIdList);
 
     List<MentalTestMyTestOrderDTO> myTestOrder(@Param("userId") Long userId, @Param("topicId") Long topicId);
 
diff --git a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/mapping/MentalAnalysisTimeConfigMapper.xml b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/mapping/MentalAnalysisTimeConfigMapper.xml
index de396dd..a193814 100644
--- a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/mapping/MentalAnalysisTimeConfigMapper.xml
+++ b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/mapping/MentalAnalysisTimeConfigMapper.xml
@@ -24,9 +24,11 @@
         FROM
             t_mental_analysis_time_config tc
             LEFT JOIN toc_customer u ON tc.counselling_info_id = u.customer_id
-            LEFT JOIN t_counselling_special_time_config stc ON stc.counselling_info_id = u.customer_id
         <where>
             AND u.status_flag = 1
+            <if test="workStatus != null">
+                AND u.work_status = #{workStatus}
+            </if>
             <if test="mentalAnalysisStatus != null">
                 AND u.mental_analysis_status = #{mentalAnalysisStatus}
             </if>
@@ -41,7 +43,7 @@
             </if>
             <if test="appointmentDay != null and appointmentDay != ''">
                 AND u.customer_id NOT IN (
-                    SELECT counselling_info_id FROM t_counselling_special_time_config stc
+                    SELECT counselling_info_id FROM t_mental_analysis_special_time_config stc
                     WHERE stc.special_day <![CDATA[ <> ]]> #{appointmentDay} AND stc.is_cancel_day = 1
             )
             </if>
diff --git a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/mapping/MentalAppointmentMapper.xml b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/mapping/MentalAppointmentMapper.xml
index 29ad38f..5aa055d 100644
--- a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/mapping/MentalAppointmentMapper.xml
+++ b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/mapping/MentalAppointmentMapper.xml
@@ -44,7 +44,8 @@
         FROM
             t_mental_appointment o
             LEFT JOIN toc_customer wu ON o.worker_id = wu.customer_id
-        <where> AND o.is_delete = 0
+        <where>
+            o.`type` is null AND o.is_delete = 0
             <if test="counsellingInfoId != null">
                 AND o.worker_id = #{counsellingInfoId}
             </if>
@@ -81,6 +82,7 @@
         SELECT * FROM t_mental_appointment o
         LEFT JOIN toc_customer tw ON tw.customer_id = o.worker_id
         <where>
+            o.`type` is null
             <if test="userId != null">
                 AND o.user_id = #{userId}
             </if>
diff --git a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/mapping/MentalTestRecordMapper.xml b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/mapping/MentalTestRecordMapper.xml
index 3f3e8a6..e7086be 100644
--- a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/mapping/MentalTestRecordMapper.xml
+++ b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/mapper/mapping/MentalTestRecordMapper.xml
@@ -3,6 +3,71 @@
 <mapper namespace="cn.stylefeng.guns.modular.business.mapper.MentalTestRecordMapper">
 
     <select id="myTestTopic" resultType="cn.stylefeng.guns.modular.business.dto.MentalTestMyTestTopicDTO">
+        (SELECT omt.id          AS id,
+                omt.order_no    AS orderNo,
+                o.id            AS mentalTestRecordId,
+                o.create_time   AS createTime,
+                omt.status_flag AS statusFlag,
+                omt.is_back     AS isBack,
+                omt.test_flag   AS testFlag,
+                tt.id           AS topicId,
+                tt.status_flag  AS topicStatus,
+                tt.title,
+                tt.class_id,
+                tt.intro,
+                tt.image,
+                tt.test_type,
+                tt.test_amount,
+                tt.consult_one,
+                tt.consult_amount,
+                tt.test_people_num,
+                tt.test_set_num
+        FROM t_mental_test_record o
+            LEFT JOIN t_order_mental_test omt ON o.answer_no = omt.order_no
+            LEFT JOIN t_mental_test_topic tt ON o.topic_id = tt.id
+        <where>
+            <if test="userId != null">
+                AND o.user_id = #{userId}
+            </if>
+            <if test="topicId != null">
+                AND o.topic_id = #{topicId}
+            </if>
+        </where>
+        )
+        UNION ALL
+        (SELECT o.id           AS id,
+                o.order_no     AS orderNo,
+                NULL           AS mentalTestRecordId,
+                o.create_time  AS createTime,
+                o.status_flag  AS statusFlag,
+                o.is_back      AS isBack,
+                o.test_flag    AS testFlag,
+                tt.id          AS topicId,
+                tt.status_flag AS topicStatus,
+                tt.title,
+                tt.class_id,
+                tt.intro,
+                tt.image,
+                tt.test_type,
+                tt.test_amount,
+                tt.consult_one,
+                tt.consult_amount,
+                tt.test_people_num,
+                tt.test_set_num
+        FROM t_order_mental_test o
+            LEFT JOIN t_mental_test_topic tt ON o.goods_id = tt.id
+        <where> order_no NOT IN (SELECT answer_no FROM t_mental_test_record)
+            AND o.status_flag = 1
+            <if test="userId != null">
+                AND o.user_id = #{userId}
+            </if>
+            <if test="topicId != null">
+                AND o.topic_id = #{topicId}
+            </if>
+        </where>
+        )
+    </select>
+    <!--<select id="myTestTopic" resultType="cn.stylefeng.guns.modular.business.dto.MentalTestMyTestTopicDTO">
         SELECT
             o.*,
             tt.status_flag topicStatus,
@@ -28,9 +93,9 @@
             </if>
         </where>
         ORDER BY o.create_time DESC
-    </select>
+    </select>-->
 
-    <select id="myTestRecordTopicByMentalAppointmentId" resultType="cn.stylefeng.guns.modular.business.dto.MentalTestMyTestTopicDTO">
+    <select id="myTestRecordTopicByMentalAppointmentId" resultType="cn.stylefeng.guns.modular.business.dto.MentalTestMyTestRecordTopicDTO">
         SELECT
             o.*,
             tt.status_flag topicStatus,
diff --git a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/IMentalAnalysisTimeConfigService.java b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/IMentalAnalysisTimeConfigService.java
index ca34136..5c80e2a 100644
--- a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/IMentalAnalysisTimeConfigService.java
+++ b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/IMentalAnalysisTimeConfigService.java
@@ -26,6 +26,6 @@
 
     void editTimeConfig(MentalAnalysisTimeConfigAddUpdateRequest req);
 
-    List<MentalAnalysisTimeConfig> getWorkerListByAppointmentTime(Integer mentalAnalysisStatus, Integer weekDay, String appointmentDay, String beginTimePoint, String endTimePoint);
+    List<MentalAnalysisTimeConfig> getWorkerListByAppointmentTime(Integer workStatus, Integer mentalAnalysisStatus, Integer weekDay, String appointmentDay, String beginTimePoint, String endTimePoint);
 
 }
diff --git a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/IMentalTestRecordService.java b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/IMentalTestRecordService.java
index 4807988..2ea848c 100644
--- a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/IMentalTestRecordService.java
+++ b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/IMentalTestRecordService.java
@@ -1,6 +1,7 @@
 package cn.stylefeng.guns.modular.business.service;
 
 import cn.stylefeng.guns.modular.business.dto.MentalTestMyTestOrderDTO;
+import cn.stylefeng.guns.modular.business.dto.MentalTestMyTestRecordTopicDTO;
 import cn.stylefeng.guns.modular.business.dto.MentalTestMyTestTopicDTO;
 import cn.stylefeng.guns.modular.business.dto.MentalTestRecordPageDTO;
 import cn.stylefeng.guns.modular.business.entity.MentalTestRecord;
@@ -27,12 +28,12 @@
     List<MentalTestMyTestTopicDTO> myTestTopic(Long userId, Long topicId);
 
     /**
-     * 我的测试(含题库信息)
+     * 我的测试记录(含题库信息)
      * @param mentalAppointmentId
      * @param mentalAppointmentIdList
      * @return
      */
-    List<MentalTestMyTestTopicDTO> myTestRecordTopicByMentalAppointmentId(Long mentalAppointmentId, List<Long> mentalAppointmentIdList);
+    List<MentalTestMyTestRecordTopicDTO> myTestRecordTopicByMentalAppointmentId(Long mentalAppointmentId, List<Long> mentalAppointmentIdList);
 
     /**
      * 我的测试(订单)
diff --git a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/CounsellingOrderServiceImpl.java b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/CounsellingOrderServiceImpl.java
index 0215c01..54a696d 100644
--- a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/CounsellingOrderServiceImpl.java
+++ b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/CounsellingOrderServiceImpl.java
@@ -226,19 +226,19 @@
 
 
 
-            // 推送消息内容
-            String pushContent = "你有新的预约,请注意查收。预约用户:"+customerOld.getNickName();
-//                    +"预约时间:"+counsellingOrder.getEffectiveEndTime()+"~"+counsellingOrder.getEffectiveEndTime();
-            // IM推送数据json
-            ImPushDataDTO pushData = ImPushDataDTO.builder()
-                    .type(ImPushTypeEnum.S_TO_W_TIP_CONSULT_PAY_GROUP_SUCCESS_ONLY.getCode())
-                    .objId(ObjUtil.toString(counsellingInfo.getUserId()))
-                    .title("通知")
-                    .content(pushContent)
-//                    .extra("去查看。")
-                    .build();
-            // 发送预约提示
-            imBizService.messageSendSystem(counsellingOrder.getUserId()+"", new String[]{counsellingInfo.getUserId()+""}, pushData, ImUserTypeEnum.WORKER, PostIdEnum.PO_22, true);
+//            // 推送消息内容
+//            String pushContent = "你有新的预约,请注意查收。预约用户:"+customerOld.getNickName();
+////                    +"预约时间:"+counsellingOrder.getEffectiveEndTime()+"~"+counsellingOrder.getEffectiveEndTime();
+//            // IM推送数据json
+//            ImPushDataDTO pushData = ImPushDataDTO.builder()
+//                    .type(ImPushTypeEnum.S_TO_W_TIP_CONSULT_PAY_GROUP_SUCCESS_ONLY.getCode())
+//                    .objId(ObjUtil.toString(counsellingInfo.getUserId()))
+//                    .title("通知")
+//                    .content(pushContent)
+////                    .extra("去查看。")
+//                    .build();
+//            // 发送预约提示
+//            imBizService.messageSendSystem(counsellingOrder.getUserId()+"", new String[]{counsellingInfo.getUserId()+""}, pushData, ImUserTypeEnum.WORKER, PostIdEnum.PO_22, true);
         }else if (counsellingOrderRequest.getOrderType().intValue() ==2){
             //获取下单人个人信息
             Customer customerUser = this.customerService.getById(counsellingOrderRequest.getUserId());
@@ -547,8 +547,8 @@
             String formattedDate = formatter.format(counsellingOrder.getFirstAppointmentDate());
             // 发送IM消息
             ImPushDataDTO pushData1 = ImPushDataDTO.builder()
-                    .type(ImPushTypeEnum.C_TO_W_IM_1V1_START_CONSULT.getCode())
-                    .title(ImPushTypeEnum.C_TO_W_IM_1V1_START_CONSULT.getName())
+                    .type(ImPushTypeEnum.C_TO_W_IM_1V1_START_CONSULT_FIRST.getCode())
+                    .title(ImPushTypeEnum.C_TO_W_IM_1V1_START_CONSULT_FIRST.getName())
                     .content("预约成功"+",请注意预约时间:"+formattedDate+counsellingOrder.getFirstAppointmentTimes())
 //                    .content("预约成功!")
                     .objId(ObjUtil.toString(counsellingInfo.getId()))
diff --git a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/ImBizService.java b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/ImBizService.java
index d623d1a..868f42d 100644
--- a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/ImBizService.java
+++ b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/ImBizService.java
@@ -101,13 +101,13 @@
         return null;
     }
 
-    public <T extends BaseMessage> ResponseResult messageSendGroup(String fromUserId, String[] toUserIds, ImPushDataDTO pushData) {
+    public <T extends BaseMessage> ResponseResult messageSendGroup(String fromUserId, String[] toGroupIds, ImPushDataDTO pushData) {
         // 推送json消息
         String pushDataStr = JSONUtil.toJsonStr(pushData);
-        if (toUserIds.length > 0) {
+        if (toGroupIds.length > 0) {
             log.info("融云发送群消息:{}", pushDataStr);
             // 融云发送群消息
-            return imServerApi.messageSendGroup(fromUserId, toUserIds, new TxtMessage(pushDataStr, pushData.getExtra()));
+            return imServerApi.messageSendGroup(fromUserId, toGroupIds, new TxtMessage(pushDataStr, pushData.getExtra()));
         }
         return null;
     }
diff --git a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/MentalAnalysisTimeConfigServiceImpl.java b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/MentalAnalysisTimeConfigServiceImpl.java
index 9d72c21..a6a7356 100644
--- a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/MentalAnalysisTimeConfigServiceImpl.java
+++ b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/MentalAnalysisTimeConfigServiceImpl.java
@@ -82,8 +82,8 @@
     }
 
     @Override
-    public List<MentalAnalysisTimeConfig> getWorkerListByAppointmentTime(Integer mentalAnalysisStatus, Integer weekDay, String appointmentDay, String beginTimePoint, String endTimePoint) {
-        return this.baseMapper.getWorkerListByAppointmentTime(mentalAnalysisStatus, weekDay, appointmentDay, beginTimePoint, endTimePoint);
+    public List<MentalAnalysisTimeConfig> getWorkerListByAppointmentTime(Integer workStatus, Integer mentalAnalysisStatus, Integer weekDay, String appointmentDay, String beginTimePoint, String endTimePoint) {
+        return this.baseMapper.getWorkerListByAppointmentTime(workStatus, mentalAnalysisStatus, weekDay, appointmentDay, beginTimePoint, endTimePoint);
     }
 
 }
diff --git a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/MentalAppointmentServiceImpl.java b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/MentalAppointmentServiceImpl.java
index dc5bd5f..27ccd33 100644
--- a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/MentalAppointmentServiceImpl.java
+++ b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/MentalAppointmentServiceImpl.java
@@ -26,7 +26,6 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -157,14 +156,15 @@
         // 获取预约时段有服务的分析师(不可预约)
         List<MentalAppointment> sameTimeAppointmentList = mentalAppointmentService.list(
                 Wrappers.<MentalAppointment>lambdaQuery()
+                        .isNull(MentalAppointment::getType)
                         .eq(MentalAppointment::getAppointmentDay, appointmentDayYmd)
                         .eq(MentalAppointment::getBeginTimePoint, beginTimePoint)
                         .eq(MentalAppointment::getEndTimePoint, endTimePoint)
                         .in(MentalAppointment::getStatusFlag, Arrays.asList(
+                                MentalAppointmentStatusEnum.WAIT_PAY.getCode(),
                                 MentalAppointmentStatusEnum.WAIT_SERVICE.getCode(),
                                 MentalAppointmentStatusEnum.IN_SERVICE.getCode()
                         ))
-                        .isNotNull(MentalAppointment::getWorkerId)
         );
         List<Long> neWorkerIdList = sameTimeAppointmentList.stream().map(MentalAppointment::getWorkerId).collect(Collectors.toList());
 
@@ -185,7 +185,7 @@
         // 获取当前星期
         Integer weekDay = DateUtil.dayOfWeekEnum(appointmentDay).getIso8601Value();
         // 预约时间段配置匹配的性格分析师
-        List<MentalAnalysisTimeConfig> eqWorkerTimeConfigList = mentalAnalysisTimeConfigService.getWorkerListByAppointmentTime(CustomerMentalAnalysisStatusEnum.ON_WORK.getCode(), weekDay, appointmentDayYmd, beginTimePoint, endTimePoint);
+        List<MentalAnalysisTimeConfig> eqWorkerTimeConfigList = mentalAnalysisTimeConfigService.getWorkerListByAppointmentTime(CustomerWorkStatusEnum.ON_WORK.getCode(), CustomerMentalAnalysisStatusEnum.ON_WORK.getCode(), weekDay, appointmentDayYmd, beginTimePoint, endTimePoint);
         // 分析师ID(预约时间段配置匹配)
         List<Long> eqWorkerIdByTimeConfigList = eqWorkerTimeConfigList.isEmpty() ? Collections.singletonList(0L) :
                 eqWorkerTimeConfigList.stream()
diff --git a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/MentalTestRecordServiceImpl.java b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/MentalTestRecordServiceImpl.java
index ec78d07..8de2b31 100644
--- a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/MentalTestRecordServiceImpl.java
+++ b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/MentalTestRecordServiceImpl.java
@@ -1,6 +1,7 @@
 package cn.stylefeng.guns.modular.business.service.impl;
 
 import cn.stylefeng.guns.modular.business.dto.MentalTestMyTestOrderDTO;
+import cn.stylefeng.guns.modular.business.dto.MentalTestMyTestRecordTopicDTO;
 import cn.stylefeng.guns.modular.business.dto.MentalTestMyTestTopicDTO;
 import cn.stylefeng.guns.modular.business.dto.MentalTestRecordPageDTO;
 import cn.stylefeng.guns.modular.business.entity.MentalTestRecord;
@@ -29,7 +30,7 @@
         return this.baseMapper.myTestTopic(userId, topicId);
     }
     @Override
-    public List<MentalTestMyTestTopicDTO> myTestRecordTopicByMentalAppointmentId(Long mentalAppointmentId, List<Long> mentalAppointmentIdList) {
+    public List<MentalTestMyTestRecordTopicDTO> myTestRecordTopicByMentalAppointmentId(Long mentalAppointmentId, List<Long> mentalAppointmentIdList) {
         return this.baseMapper.myTestRecordTopicByMentalAppointmentId(mentalAppointmentId, mentalAppointmentIdList);
     }
 
diff --git a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/OrderMentalTestServiceImpl.java b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/OrderMentalTestServiceImpl.java
index 662c215..71ffca7 100644
--- a/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/OrderMentalTestServiceImpl.java
+++ b/common-buiness/src/main/java/cn/stylefeng/guns/modular/business/service/impl/OrderMentalTestServiceImpl.java
@@ -73,6 +73,21 @@
 
     @Override
     public OrderMentalTest createOrderMentalTest(Long userId, Long topicId, Boolean isNeedPay, Boolean isBack) {
+        if (isBack == null || !isBack) {
+            // 获取用户已支付订单(以后每次都只有1个订单号)
+            OrderMentalTest doneOrder = this.baseMapper.selectOne(
+                    Wrappers.<OrderMentalTest>lambdaQuery()
+                            .eq(OrderMentalTest::getUserId, userId)
+                            .eq(OrderMentalTest::getGoodsId, topicId)
+                            .eq(OrderMentalTest::getStatusFlag, OrderStatusFlagEnum.PAY_SUCCESS.getCode())
+                            .orderByDesc(OrderMentalTest::getCreateTime)
+                            .last("LIMIT 1")
+            );
+            if (doneOrder != null) {
+                return doneOrder;
+            }
+        }
+
         // 题库信息
         MentalTestTopic topic = mentalTestTopicService.getById(topicId);
         Assert.notNull(topic, "题库不存在");
diff --git a/guns/src/main/java/cn/stylefeng/guns/modular/business/controller/CounsellingOrderReservationController.java b/guns/src/main/java/cn/stylefeng/guns/modular/business/controller/CounsellingOrderReservationController.java
index 27ccd27..eacde3f 100644
--- a/guns/src/main/java/cn/stylefeng/guns/modular/business/controller/CounsellingOrderReservationController.java
+++ b/guns/src/main/java/cn/stylefeng/guns/modular/business/controller/CounsellingOrderReservationController.java
@@ -5,6 +5,7 @@
 import cn.stylefeng.guns.modular.business.dto.CounsellingOrderReservationRequestDTO;
 import cn.stylefeng.guns.modular.business.entity.CounsellingOrderReservation;
 import cn.stylefeng.guns.modular.business.service.ICounsellingOrderReservationService;
+import cn.stylefeng.guns.modular.business.service.ICounsellingOrderService;
 import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
 import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
 import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
@@ -22,6 +23,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -78,6 +80,11 @@
         return new SuccessResponseData<>();
     }
 
+
+
+    @Autowired
+    private ICounsellingOrderService counsellingOrderService;
+
     /**
      * 修改咨询订单预约记录状态
      */
@@ -94,6 +101,11 @@
                 .set(CounsellingOrderReservation::getStauts,status)
                 .set(CounsellingOrderReservation::getRemark,remark);
         this.counsellingOrderReservationService.update(lambdaUpdateWrapper);
+
+
+
+
+
         return new SuccessResponseData<>();
     }
 
diff --git a/guns/src/main/java/cn/stylefeng/guns/modular/business/controller/VersionController.java b/guns/src/main/java/cn/stylefeng/guns/modular/business/controller/VersionController.java
index 9b2dadc..10877ec 100644
--- a/guns/src/main/java/cn/stylefeng/guns/modular/business/controller/VersionController.java
+++ b/guns/src/main/java/cn/stylefeng/guns/modular/business/controller/VersionController.java
@@ -72,6 +72,23 @@
 
     }
 
+    @ApiOperation("是否一键登录修改1关2开 -t")
+    @PostResource(name = "ios是否内购修改1关2开 -t", path = "/login/put")
+    @BusinessLog
+    public ResponseData<?> login(Integer  ios) {
+        cacheOperatorApi.put("phone:login",ios);
+        return new SuccessResponseData<>();
+    }
+
+    @ApiOperation("是否一键登录 1")
+    @PostResource(name = "是否一键登录 2", path = "/login-list")
+    @BusinessLog
+    public ResponseData<?> login1() {
+        Integer o = (Integer) cacheOperatorApi.get("phone:login");
+
+        return new SuccessResponseData<>(o==null ? 1 :o);
+    }
+
     /**
      * 添加
      */
diff --git a/guns/src/main/resources/application-prod.yml b/guns/src/main/resources/application-prod.yml
index 0c39a9c..1f8482b 100644
--- a/guns/src/main/resources/application-prod.yml
+++ b/guns/src/main/resources/application-prod.yml
@@ -2,7 +2,7 @@
 spring:
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://192.168.0.33:8306/xlzx?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT&nullCatalogMeansCurrent=true
+    url: jdbc:mysql://192.168.0.84:8306/xlzx?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT&nullCatalogMeansCurrent=true
     username: root
     password: Root2024!
 
@@ -11,7 +11,7 @@
     max-pool-prepared-statement-per-connection-size: 100
 
   redis:
-    host: 192.168.0.33 #地址
+    host: 192.168.0.84 #地址1.95.42.247
     port: 8379 #端口
     password: RediS2018
     timeout: 10000 # 连接超时时间(毫秒)
diff --git a/rest/pom.xml b/rest/pom.xml
index e886234..95abe32 100644
--- a/rest/pom.xml
+++ b/rest/pom.xml
@@ -295,6 +295,11 @@
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson-spring-boot-starter</artifactId>
+            <version>3.14.0</version>
+        </dependency>
 
     </dependencies>
 
diff --git a/rest/src/main/java/cn/stylefeng/rest/config/ObjectRedisAutoConfiguration.java b/rest/src/main/java/cn/stylefeng/rest/config/ObjectRedisAutoConfiguration.java
index f443637..5e33287 100644
--- a/rest/src/main/java/cn/stylefeng/rest/config/ObjectRedisAutoConfiguration.java
+++ b/rest/src/main/java/cn/stylefeng/rest/config/ObjectRedisAutoConfiguration.java
@@ -3,6 +3,10 @@
 import cn.stylefeng.rest.config.cache.ObjectRedisCache;
 import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
 import cn.stylefeng.roses.kernel.cache.redis.util.CreateRedisTemplateUtil;
+import org.redisson.Redisson;
+import org.redisson.api.RedissonClient;
+import org.redisson.config.Config;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -22,4 +26,24 @@
         return new ObjectRedisCache(redisTemplate);
     }
 
+    @Value("${spring.redis.host}")
+    private String host;
+    @Value("${spring.redis.port}")
+    private int port;
+
+    @Value("${spring.redis.password}")
+    private String password;
+
+    @Value("${spring.redis.database}")
+    private int database;
+
+    @Bean
+    public RedissonClient redissonClient(){
+        Config config = new Config();
+        config.useSingleServer().setAddress("redis://"+host+":"+port)
+                .setPassword(password)
+                .setDatabase(database);
+        return Redisson.create(config);
+    }
+
 }
diff --git a/rest/src/main/java/cn/stylefeng/rest/ijpay/controller/AliPayController.java b/rest/src/main/java/cn/stylefeng/rest/ijpay/controller/AliPayController.java
index 7f0631d..2115487 100644
--- a/rest/src/main/java/cn/stylefeng/rest/ijpay/controller/AliPayController.java
+++ b/rest/src/main/java/cn/stylefeng/rest/ijpay/controller/AliPayController.java
@@ -44,6 +44,7 @@
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
@@ -103,7 +104,37 @@
 			totalAmount = counsellingOrder.getPayAmount().toString();
 		}
 
-		try {
+		// 判断支付金额是否为0
+		BigDecimal amount = new BigDecimal(totalAmount);
+		// 判断转换后的BigDecimal是否为0
+		if (amount.compareTo(BigDecimal.ZERO) == 0) {
+			if (req.getOrderNo().startsWith(OrderTypeEnum.MENTAL_TEST.getCode())) {
+				// 心理测试订单
+				orderMentalTestService.paySuccess(req.getOrderNo(), req.getOrderNo(), totalAmount, PayTypeEnum.ALIPAY.getCode());
+			} else if (req.getOrderNo().startsWith(OrderTypeEnum.CONSULT_ONE.getCode())) {
+				// 心理咨询1V1订单
+				mentalTestOrderBizService.paySuccessOrderConsultOne(req.getOrderNo(), req.getOrderNo(), totalAmount, PayTypeEnum.ALIPAY.getCode());
+			} else if (req.getOrderNo().startsWith(OrderTypeEnum.COURSE_ORDER.getCode())) {
+				//课程订单
+				OrderPayRequest orderPayRequest = new OrderPayRequest();
+				orderPayRequest.setOrderNo(req.getOrderNo());
+				orderPayRequest.setTransactionNo(req.getOrderNo());
+				orderPayRequest.setPayType("2");
+				orderPayRequest.setOrderType(1);
+				courseOrderService.payCourseOrder(orderPayRequest);
+			} else if (req.getOrderNo().startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) {
+				//咨询订单
+				OrderPayRequest orderPayRequest = new OrderPayRequest();
+				orderPayRequest.setOrderNo(req.getOrderNo());
+				orderPayRequest.setTransactionNo(req.getOrderNo());
+				orderPayRequest.setPayType("2");
+				orderPayRequest.setOrderType(2);
+				counsellingOrderService.payCounsellingOrder(orderPayRequest);
+			}
+			return new SuccessResponseData("支付成功");
+		}
+
+			try {
 			// 设置支付配置
 			AliPayApiConfigKit.putApiConfig(getApiConfig());
 			//AliPayApiConfigKit.setThreadLocalAppId(aliPayBean.getAppId());
@@ -126,6 +157,68 @@
 			e.printStackTrace();
 			log.error("支付宝APP支付异常!", e.getMessage());
 			return new ErrorResponseData("500", e.getMessage());
+		}
+	}
+
+
+
+	@PostMapping(value = RuleConstants.NOT_LOGIN + "/freePay")
+	@ResponseBody
+	public String freePay(HttpServletRequest request) {
+		try {
+			log.info("支付宝异步通知");
+
+			// 获取支付宝POST过来反馈信息
+			Map<String, String> params = AliPayApi.toMap(request);
+			for (Map.Entry<String, String> entry : params.entrySet()) {
+				log.info(entry.getKey() + " = " + entry.getValue());
+			}
+			if (params.get("out_biz_no") != null){
+				log.info(params.get("out_biz_no").toString()+",退费成功!");
+				return "success";
+			}
+			boolean verifyResult = AlipaySignature.rsaCheckV1(params, aliPayBean.getPublicKey(), "UTF-8", "RSA2");
+
+			if (verifyResult) {
+				// 参数文档:https://opendocs.alipay.com/open/204/105301?pathHash=fef00e6d
+				String tradeNo = params.get("trade_no");
+				String totalAmount = params.get("total_amount");
+				// 获取订单号
+				String orderNo = params.get("out_trade_no");
+				// 订单编号判断订单类型
+				if (orderNo.startsWith(OrderTypeEnum.MENTAL_TEST.getCode())) {
+					// 心理测试订单
+					orderMentalTestService.paySuccess(orderNo, tradeNo, totalAmount, PayTypeEnum.ALIPAY.getCode());
+				} else if (orderNo.startsWith(OrderTypeEnum.CONSULT_ONE.getCode())) {
+					// 心理咨询1V1订单
+					mentalTestOrderBizService.paySuccessOrderConsultOne(orderNo, tradeNo, totalAmount, PayTypeEnum.ALIPAY.getCode());
+				} else if (orderNo.startsWith(OrderTypeEnum.COURSE_ORDER.getCode())) {
+					//课程订单
+					OrderPayRequest orderPayRequest = new OrderPayRequest();
+					orderPayRequest.setOrderNo(orderNo);
+					orderPayRequest.setTransactionNo(tradeNo);
+					orderPayRequest.setPayType("2");
+					orderPayRequest.setOrderType(1);
+					courseOrderService.payCourseOrder(orderPayRequest);
+				} else if (orderNo.startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) {
+					//咨询订单
+					OrderPayRequest orderPayRequest = new OrderPayRequest();
+					orderPayRequest.setOrderNo(orderNo);
+					orderPayRequest.setTransactionNo(tradeNo);
+					orderPayRequest.setPayType("2");
+					orderPayRequest.setOrderType(2);
+					counsellingOrderService.payCounsellingOrder(orderPayRequest);
+				}
+
+				log.info("notify_url 验证成功succcess");
+				return "success";
+			} else {
+				log.error("notify_url 验证失败");
+				return "failure";
+			}
+		} catch (AlipayApiException e) {
+			e.printStackTrace();
+			return "failure";
 		}
 	}
 
@@ -511,7 +604,7 @@
 	 * 退款
 	 */
 	@ApiOperation("支付宝退款")
-	@RequestMapping(value = RuleConstants.NOT_LOGIN + "/tradeRefund")
+	@RequestMapping(value = RuleConstants.NOT_LOGIN + "/tradeRefund", method = {RequestMethod.POST, RequestMethod.GET})
 	@ResponseBody
 	public Boolean tradeRefund(@RequestParam(required = false, name = "outTradeNo") String outTradeNo, @RequestParam(required = false, name = "tradeNo") String tradeNo) {
 		log.info("支付宝-退款信息-outTradeNo:"+outTradeNo+", tradeNo:"+tradeNo);
diff --git a/rest/src/main/java/cn/stylefeng/rest/ijpay/controller/WxPayController.java b/rest/src/main/java/cn/stylefeng/rest/ijpay/controller/WxPayController.java
index 9b6c80c..3f1d935 100644
--- a/rest/src/main/java/cn/stylefeng/rest/ijpay/controller/WxPayController.java
+++ b/rest/src/main/java/cn/stylefeng/rest/ijpay/controller/WxPayController.java
@@ -2,6 +2,7 @@
 
 import cn.hutool.core.net.NetUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import cn.stylefeng.guns.modular.business.dto.request.OrderPayRequest;
 import cn.stylefeng.guns.modular.business.entity.CounsellingOrder;
 import cn.stylefeng.guns.modular.business.entity.CourseOrder;
@@ -47,6 +48,8 @@
 import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 
 @Slf4j
@@ -85,23 +88,52 @@
 	@ResponseBody
 	public ResponseData appPay(@RequestBody @Validated WxAppPayRequest req) {
 		// 支付金额
-		String totalAmount = "";
+		BigDecimal totalAmount = BigDecimal.valueOf(0);
 
 		// 订单编号判断订单类型
 		if (req.getOrderNo().contains(OrderTypeEnum.MENTAL_TEST.getCode())) {
 			// 心理测试订单
 			OrderMentalTest order = orderMentalTestService.getOrderByNo(req.getOrderNo());
-			totalAmount = order.getPayAmount().toString();
+			totalAmount = order.getPayAmount();
 		} else if (req.getOrderNo().contains(OrderTypeEnum.CONSULT_ONE.getCode())) {
 			// 心理咨询1V1订单
 			OrderConsultOne order = orderConsultOneService.getOrderByNo(req.getOrderNo());
-			totalAmount = order.getPayAmount().toString();
+			totalAmount = order.getPayAmount();
 		}else if (req.getOrderNo().startsWith(OrderTypeEnum.COURSE_ORDER.getCode())){
 			CourseOrder courseOrder = this.courseOrderService.getCourseOrderByNo(req.getOrderNo());
-			totalAmount = courseOrder.getPayAmount().toString();
+			totalAmount = courseOrder.getPayAmount();
 		} else if (req.getOrderNo().startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) {
 			CounsellingOrder counsellingOrder = this.counsellingOrderService.getCounsellingOrderByNo(req.getOrderNo());
-			totalAmount = counsellingOrder.getPayAmount().toString();
+			totalAmount = counsellingOrder.getPayAmount();
+		}
+
+
+		// 判断转换后的BigDecimal是否为0
+		if (totalAmount.compareTo(BigDecimal.ZERO) == 0) {
+			if (req.getOrderNo().startsWith(OrderTypeEnum.MENTAL_TEST.getCode())) {
+				// 心理测试订单
+				orderMentalTestService.paySuccess(req.getOrderNo(), req.getOrderNo(), String.valueOf(totalAmount), PayTypeEnum.ALIPAY.getCode());
+			} else if (req.getOrderNo().startsWith(OrderTypeEnum.CONSULT_ONE.getCode())) {
+				// 心理咨询1V1订单
+				mentalTestOrderBizService.paySuccessOrderConsultOne(req.getOrderNo(), req.getOrderNo(), String.valueOf(totalAmount), PayTypeEnum.ALIPAY.getCode());
+			} else if (req.getOrderNo().startsWith(OrderTypeEnum.COURSE_ORDER.getCode())) {
+				//课程订单
+				OrderPayRequest orderPayRequest = new OrderPayRequest();
+				orderPayRequest.setOrderNo(req.getOrderNo());
+				orderPayRequest.setTransactionNo(req.getOrderNo());
+				orderPayRequest.setPayType("2");
+				orderPayRequest.setOrderType(1);
+				courseOrderService.payCourseOrder(orderPayRequest);
+			} else if (req.getOrderNo().startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) {
+				//咨询订单
+				OrderPayRequest orderPayRequest = new OrderPayRequest();
+				orderPayRequest.setOrderNo(req.getOrderNo());
+				orderPayRequest.setTransactionNo(req.getOrderNo());
+				orderPayRequest.setPayType("2");
+				orderPayRequest.setOrderType(2);
+				counsellingOrderService.payCounsellingOrder(orderPayRequest);
+			}
+			return new SuccessResponseData("支付成功");
 		}
 
 		// 设置支付配置
@@ -115,6 +147,10 @@
 		// 获取微信支付配置
 		WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig();
 
+		// 支付金额X100求整
+		String totalFee = totalAmount.multiply(BigDecimal.valueOf(100))
+				.setScale(0, RoundingMode.HALF_UP)
+				.toPlainString();
 		// 组装支付参数
 		Map<String, String> params = UnifiedOrderModel
 				.builder()
@@ -123,35 +159,34 @@
 				.nonce_str(WxPayKit.generateStr())
 				.body(req.getSubject())
 				.attach(req.getSubject())
-				//.out_trade_no(WxPayKit.generateStr())
-				.out_trade_no(req.getOrderNo())
-				.total_fee(totalAmount)
+				.out_trade_no(WxPayKit.generateStr())
+//				.out_trade_no(req.getOrderNo())
+				.total_fee(totalFee)
 				.spbill_create_ip(ip)
 				.notify_url(notifyUrl)
-				.trade_type(TradeType.APP.getTradeType())
+				.trade_type(TradeType.APP.getTradeType()).attach(req.getOrderNo())
 				.build()
-				.createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
-
+				.createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5);
+		log.debug("微信APP支付请求params:{}", JSONUtil.toJsonStr(params));
 		String xmlResult = WxPayApi.pushOrder(false, params);
-		log.info("微信APP支付结果xml:{}", xmlResult);
+		log.debug("微信APP支付结果xml:{}", xmlResult);
 
 		Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
 		String returnCode = result.get("return_code");
 		String resultCode = result.get("result_code");
 		String returnMsg = result.get("return_msg");
 		if (!WxPayKit.codeIsOk(returnCode) || !WxPayKit.codeIsOk(resultCode)) {
-			log.error("微信APP支付异常!{}", returnMsg);
+			log.error("微信APP支付异常!{}", result);
 			return new ErrorResponseData(returnMsg);
 		}
 
 		// 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回
 		String prepayId = result.get("prepay_id");
 
-		Map<String, String> packageParams = WxPayKit.appPrepayIdCreateSign(wxPayApiConfig.getAppId(), wxPayApiConfig.getMchId(), prepayId, wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
+		Map<String, String> packageParams = WxPayKit.appPrepayIdCreateSign(wxPayApiConfig.getAppId(), wxPayApiConfig.getMchId(), prepayId, wxPayApiConfig.getPartnerKey(), SignType.MD5);
 
-		String jsonStr = JSON.toJSONString(packageParams);
-		log.info("微信APP支付返回参数:{}", jsonStr);
-		return new SuccessResponseData(jsonStr);
+		log.info("微信APP支付返回参数:{}", JSONUtil.toJsonStr(packageParams));
+		return new SuccessResponseData(packageParams);
 	}
 
 	/**
@@ -167,13 +202,14 @@
 
 		// 注意重复通知的情况,同一订单号可能收到多次通知,请注意一定先判断订单状态
 		// 注意此处签名方式需与统一下单的签名类型一致
-		if (WxPayKit.verifyNotify(params, WxPayApiConfigKit.getWxPayApiConfig().getPartnerKey(), SignType.HMACSHA256)) {
+		if (WxPayKit.verifyNotify(params, WxPayApiConfigKit.getWxPayApiConfig().getPartnerKey(), SignType.MD5)) {
 			if (WxPayKit.codeIsOk(returnCode)) {
 				// 参数文档: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8
-				String totalFee = params.get("total_fee");
+				String totalFee = new BigDecimal(params.get("total_fee")).divide(BigDecimal.valueOf(100)).toString();
 				String transactionId = params.get("transaction_id");
 				// 获取订单号
-				String orderNo = params.get("out_trade_no");
+//				String orderNo = params.get("out_trade_no");
+				String orderNo = params.get("attach");
 				// 订单编号判断订单类型
 				if (orderNo.startsWith(OrderTypeEnum.MENTAL_TEST.getCode())) {
 					// 心理测试订单
@@ -274,7 +310,7 @@
 			.trade_type(TradeType.MWEB.getTradeType())
 			.scene_info(JSON.toJSONString(sceneInfo))
 			.build()
-			.createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
+			.createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5);
 
 		String xmlResult = WxPayApi.pushOrder(false, params);
 		log.info(xmlResult);
@@ -338,7 +374,7 @@
 			.trade_type(TradeType.JSAPI.getTradeType())
 			.openid(openId)
 			.build()
-			.createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
+			.createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5);
 
 		String xmlResult = WxPayApi.pushOrder(false, params);
 		log.info(xmlResult);
@@ -359,7 +395,7 @@
 		String prepayId = resultMap.get("prepay_id");
 
 		Map<String, String> packageParams = WxPayKit.prepayIdCreateSign(prepayId, wxPayApiConfig.getAppId(),
-			wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
+			wxPayApiConfig.getPartnerKey(), SignType.MD5);
 
 		String jsonStr = JSON.toJSONString(packageParams);
 		return new SuccessResponseData(jsonStr);
@@ -452,7 +488,7 @@
 				.trade_type(TradeType.NATIVE.getTradeType())
 				.openid(openId)
 				.build()
-				.createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
+				.createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5);
 			String xmlResult = WxPayApi.pushOrder(false, params);
 			log.info("统一下单:" + xmlResult);
 			/**
@@ -479,7 +515,7 @@
 					//result_code为FAIL时,添加该键值对,value值是微信告诉客户的信息
 					prepayParams.put("err_code_des", "订单失效");
 				}
-				prepaySign = WxPayKit.createSign(prepayParams, wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
+				prepaySign = WxPayKit.createSign(prepayParams, wxPayApiConfig.getPartnerKey(), SignType.MD5);
 				prepayParams.put("sign", prepaySign);
 				String xml = WxPayKit.toXml(prepayParams);
 				log.error(xml);
@@ -521,7 +557,7 @@
 			.notify_url(notifyUrl)
 			.trade_type(TradeType.NATIVE.getTradeType())
 			.build()
-			.createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
+			.createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5);
 
 		String xmlResult = WxPayApi.pushOrder(false, params);
 		log.info("统一下单:" + xmlResult);
@@ -583,7 +619,7 @@
 			.spbill_create_ip(ip)
 			.auth_code(authCode)
 			.build()
-			.createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
+			.createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5);
 
 		String xmlResult = WxPayApi.microPay(false, params);
 		//同步返回结果
@@ -644,7 +680,7 @@
 			.trade_type(TradeType.JSAPI.getTradeType())
 			.openid(openId)
 			.build()
-			.createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
+			.createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5);
 
 		String xmlResult = WxPayApi.pushOrder(false, params);
 
@@ -663,7 +699,7 @@
 		// 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回
 		String prepayId = result.get("prepay_id");
 		Map<String, String> packageParams = WxPayKit.miniAppPrepayIdCreateSign(wxPayApiConfig.getAppId(), prepayId,
-			wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
+			wxPayApiConfig.getPartnerKey(), SignType.MD5);
 		String jsonStr = JSON.toJSONString(packageParams);
 		log.info("小程序支付的参数:" + jsonStr);
 		return new SuccessResponseData(jsonStr);
@@ -805,7 +841,7 @@
 			params.put("bank_code", "1001");
 			params.put("amount", "1");
 			params.put("desc", "IJPay 让支付触手可及-付款到银行卡");
-			params.put("sign", WxPayKit.createSign(params, wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256));
+			params.put("sign", WxPayKit.createSign(params, wxPayApiConfig.getPartnerKey(), SignType.MD5));
 			return WxPayApi.payBank(params, wxPayApiConfig.getCertPath(), wxPayApiConfig.getMchId());
 		} catch (Exception e) {
 			e.printStackTrace();
@@ -853,7 +889,7 @@
 				.nonce_str(WxPayKit.generateStr())
 				.receiver(JSON.toJSONString(receiver))
 				.build()
-				.createSign(wxPayBean.getPartnerKey(), SignType.HMACSHA256);
+				.createSign(wxPayBean.getPartnerKey(), SignType.MD5);
 			log.info("请求参数:{}", WxPayKit.toXml(params));
 			String result = WxPayApi.profitSharingAddReceiver(params);
 			log.info("请求结果:{}", result);
@@ -887,7 +923,7 @@
 			.out_order_no(WxPayKit.generateStr())
 			.receivers(JSON.toJSONString(list))
 			.build()
-			.createSign(wxPayBean.getPartnerKey(), SignType.HMACSHA256);
+			.createSign(wxPayBean.getPartnerKey(), SignType.MD5);
 
 		log.info("请求参数:{}", WxPayKit.toXml(params));
 		String result = WxPayApi.profitSharing(params, wxPayBean.getCertPath(), wxPayBean.getMchId());
diff --git a/rest/src/main/java/cn/stylefeng/rest/modular/home/controller/HomeIndexController.java b/rest/src/main/java/cn/stylefeng/rest/modular/home/controller/HomeIndexController.java
index e6c2663..38e7e0b 100644
--- a/rest/src/main/java/cn/stylefeng/rest/modular/home/controller/HomeIndexController.java
+++ b/rest/src/main/java/cn/stylefeng/rest/modular/home/controller/HomeIndexController.java
@@ -10,6 +10,7 @@
 import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
 import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
 import cn.stylefeng.roses.kernel.rule.annotation.BusinessLog;
+import cn.stylefeng.roses.kernel.rule.constants.RuleConstants;
 import cn.stylefeng.roses.kernel.rule.enums.DeleteEnum;
 import cn.stylefeng.roses.kernel.rule.enums.StatusEnum;
 import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
@@ -90,7 +91,16 @@
     @BusinessLog
     public ResponseData<?> ios() {
         Integer o = (Integer) cacheOperatorApi.get("ios:need:pay");
-        return new SuccessResponseData<>(o==null ? 0 :o);
+        return new SuccessResponseData<>(o==null ? 1 :o);
     }
 
+    @ApiOperation("是否一键登录")
+    @PostResource(name = "是否一键登录", path = RuleConstants.NOT_LOGIN+"/iflogin", requiredPermission = false, requiredLogin = false)
+    @BusinessLog
+    public ResponseData<?> iflogin() {
+        Integer o = (Integer) cacheOperatorApi.get("phone:login");
+        return new SuccessResponseData<>(o==null ? 1 :o);
+    }
+
+
 }
diff --git a/rest/src/main/java/cn/stylefeng/rest/modular/home/service/MentalTestBizService.java b/rest/src/main/java/cn/stylefeng/rest/modular/home/service/MentalTestBizService.java
index 6c012a7..d2312ca 100644
--- a/rest/src/main/java/cn/stylefeng/rest/modular/home/service/MentalTestBizService.java
+++ b/rest/src/main/java/cn/stylefeng/rest/modular/home/service/MentalTestBizService.java
@@ -60,6 +60,9 @@
     public MentalTestRecord answerSubmit(MentalTestAnswerSubmitRequest req) {
         // 获取用户信息
         Customer customer = customerService.getById(req.getUserId());
+        if (customer == null) {
+            throw new RuntimeException("获取用户信息失败!");
+        }
         // 获取用户咨询顾问ID
         Long consultWorkerId;
         if (customer != null && customer.getConsultWorkerId() != null) {
diff --git a/rest/src/main/java/cn/stylefeng/rest/modular/order/controller/MentalTestOrderController.java b/rest/src/main/java/cn/stylefeng/rest/modular/order/controller/MentalTestOrderController.java
index 58f62e8..fdb88b0 100644
--- a/rest/src/main/java/cn/stylefeng/rest/modular/order/controller/MentalTestOrderController.java
+++ b/rest/src/main/java/cn/stylefeng/rest/modular/order/controller/MentalTestOrderController.java
@@ -1,17 +1,18 @@
 package cn.stylefeng.rest.modular.order.controller;
 
-import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.StrUtil;
 import cn.stylefeng.guns.modular.business.dto.request.CreateOrderConsultOneRequest;
 import cn.stylefeng.guns.modular.business.dto.request.CreateOrderMentalTestRequest;
-import cn.stylefeng.guns.modular.business.entity.*;
-import cn.stylefeng.guns.modular.business.service.*;
+import cn.stylefeng.guns.modular.business.entity.MentalAnalysisTime;
+import cn.stylefeng.guns.modular.business.entity.MentalAppointment;
+import cn.stylefeng.guns.modular.business.entity.OrderConsultOne;
+import cn.stylefeng.guns.modular.business.entity.OrderMentalTest;
+import cn.stylefeng.guns.modular.business.service.IMentalAnalysisTimeService;
+import cn.stylefeng.guns.modular.business.service.IMentalAppointmentService;
+import cn.stylefeng.guns.modular.business.service.IOrderConsultOneService;
+import cn.stylefeng.guns.modular.business.service.IOrderMentalTestService;
 import cn.stylefeng.rest.modular.order.service.MentalTestOrderBizService;
-import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
-import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
-import cn.stylefeng.roses.kernel.customer.modular.entity.Customer;
-import cn.stylefeng.roses.kernel.customer.modular.service.CustomerService;
 import cn.stylefeng.roses.kernel.rule.pojo.request.BaseIdRequest;
 import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
 import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
@@ -27,11 +28,7 @@
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
 import java.util.List;
-import java.util.stream.Collectors;
 
 @Slf4j
 @Api(tags = "心理测试接口")
@@ -62,8 +59,16 @@
         return new SuccessResponseData(o);
     }
 
-    @Resource
-    private IMentalAnalysisTimeConfigService mentalAnalysisTimeConfigService;
+    @ApiOperation(value = "心理测试订单详情")
+    @PostResource(name = "心理测试订单详情", path = "/orderMentalTestDetail")
+    public ResponseData<OrderMentalTest> orderMentalTestDetail(Long id, String orderNo) {
+        OrderMentalTest o = orderMentalTestService.getOne(
+                Wrappers.<OrderMentalTest>lambdaQuery()
+                        .eq(id != null, OrderMentalTest::getId, id)
+                        .eq(StrUtil.isNotEmpty(orderNo), OrderMentalTest::getOrderNo, orderNo)
+        );
+        return new SuccessResponseData(o);
+    }
 
     @ApiOperation(value = "1V1咨询可预约时间")
     @GetResource(name = "1V1咨询可预约时间", path = "/mentalAnalysisTime")
@@ -89,24 +94,12 @@
 //        }
     }
 
-    @Resource
-    private CustomerService customerService;
-
     @ApiOperation(value = "1V1咨询预约性格分析下单")
     @PostResource(name = "1V1咨询预约性格分析下单", path = "/createOrderConsultOne")
-    public ResponseData<OrderConsultOne> createOrderConsultOne(@RequestBody CreateOrderConsultOneRequest req) {
+    public synchronized ResponseData<OrderConsultOne> createOrderConsultOne(@RequestBody CreateOrderConsultOneRequest req) {
         Assert.isTrue(StrUtil.isNotBlank(req.getRealName()), "姓名不能为空");
         Assert.isTrue(StrUtil.isNotBlank(req.getLinkPhone()), "联系电话不能为空");
         OrderConsultOne o = mentalTestOrderBizService.createOrderConsultOne(req);
-        try {
-            Customer customer = new Customer();
-            BeanUtil.copyProperties(req, customer);
-            LoginUser loginUser = LoginContext.me().getLoginUser();
-            customer.setCustomerId(loginUser.getUserId());
-            customerService.updateById(customer);
-        } catch (Exception e) {
-            log.info("修改用户信息报错");
-        }
         return new SuccessResponseData(o);
     }
 
diff --git a/rest/src/main/java/cn/stylefeng/rest/modular/user/controller/CounsellingInfoController.java b/rest/src/main/java/cn/stylefeng/rest/modular/user/controller/CounsellingInfoController.java
index 34c63c4..5642909 100644
--- a/rest/src/main/java/cn/stylefeng/rest/modular/user/controller/CounsellingInfoController.java
+++ b/rest/src/main/java/cn/stylefeng/rest/modular/user/controller/CounsellingInfoController.java
@@ -48,6 +48,8 @@
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -60,6 +62,7 @@
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.stream.Collectors;
 
@@ -125,6 +128,9 @@
     private String refundAlipayUrl;
     @Value("${refund.wxpay-url}")
     private String refundWxpayUrl;
+
+    @Resource
+    private RedissonClient redissonClient;
 
 
 
@@ -582,6 +588,7 @@
     @ApiOperation("咨询订单预约")
     @PostResource(name = "咨询订单预约", path = "/counsellingOrderReservation/saveCounsellingOrderReservation")
     public ResponseData<CounsellingOrderReservation> saveCounsellingOrderReservation(@RequestBody CounsellingReservationRequest counsellingReservationRequest) throws ParseException {
+
         //查询咨询师当天是否取消预约
         CounsellingSpecialTimeConfig specialTimeConfig = this.counsellingSpecialTimeConfigService.getOne(new LambdaQueryWrapper<CounsellingSpecialTimeConfig>().eq(CounsellingSpecialTimeConfig::getCounsellingInfoId,counsellingReservationRequest.getCounsellingId())
                 .eq(CounsellingSpecialTimeConfig::getSpecialDay,counsellingReservationRequest.getDayTime()).eq(CounsellingSpecialTimeConfig::getIsCancelDay,1));
@@ -617,6 +624,15 @@
         if (counsellingOrder == null){
             throw new ServiceException("没有在咨询的订单,无法进行预约!");
         }
+        String key = "counsel:" + counsellingReservationRequest.getCounsellingId()+"_"+counsellingReservationRequest.getDayTime()+"_"+counsellingReservationRequest.getTimePoint();
+        RLock lock = redissonClient.getLock(key);
+        boolean tryLock = false;
+        try {
+            log.info("咨询key:"+key+",userId:"+counsellingOrder.getUserId());
+            tryLock = lock.tryLock(20, TimeUnit.SECONDS);
+            if (!tryLock) {
+                throw new ServiceException("当前时间段已预约,请选择其他时间段!");
+            }
 
         //验证未支付的首次咨询订单
         long counselllingCount = this.counsellingOrderService.count(new LambdaQueryWrapper<CounsellingOrder>().eq(CounsellingOrder::getFirstAppointmentDate,counsellingReservationRequest.getDayTime())
@@ -674,10 +690,7 @@
             this.counsellingOrderService.updateById(counsellingOrder);
             this.counsellingUserService.updateById(counsellingUserOld);
 
-
-
             CounsellingInfo counsellingInfo = this.counsellingInfoService.getById(counsellingOrder.getCounsellingInfoId());
-
 
             //将此条消息加入到可聊天的表中t_mental_appointment
             MentalAppointment mentalAppointment = MentalAppointment.builder()
@@ -697,8 +710,8 @@
 
             // 发送IM消息
             ImPushDataDTO pushData1 = ImPushDataDTO.builder()
-                    .type(ImPushTypeEnum.C_TO_W_IM_1V1_START_CONSULT.getCode())
-                    .title(ImPushTypeEnum.C_TO_W_IM_1V1_START_CONSULT.getName())
+                    .type(ImPushTypeEnum.C_TO_W_IM_1V1_START_CONSULT_FIRST.getCode())
+                    .title(ImPushTypeEnum.C_TO_W_IM_1V1_START_CONSULT_FIRST.getName())
                     .content("预约成功"+",请注意预约时间:"+counsellingReservationRequest.getDayTime()+counsellingReservationRequest.getTimePoint())
 //                    .content("预约成功!")
                     .objId(ObjUtil.toString(counsellingInfo.getId()))
@@ -770,24 +783,32 @@
             customerService.updateCustomerRemoveCache(customer);
         }
 
-        try {
+            try {
 
-        CustomerUpdateRequest customerUpdateRequest = counsellingReservationRequest.getCustomerUpdateRequest();
-        Customer customer = new Customer();
-        BeanUtil.copyProperties(customerUpdateRequest,customer);
-            LoginUser loginUser = LoginContext.me().getLoginUser();
-            customer.setCustomerId(loginUser.getUserId());
-        customerService.updateById(customer);
-        }catch (Exception e){
-            e.printStackTrace();
-            log.info("编辑用户报错");
+            CustomerUpdateRequest customerUpdateRequest = counsellingReservationRequest.getCustomerUpdateRequest();
+            Customer customer = new Customer();
+            BeanUtil.copyProperties(customerUpdateRequest,customer);
+                LoginUser loginUser = LoginContext.me().getLoginUser();
+                customer.setCustomerId(loginUser.getUserId());
+            customerService.updateById(customer);
+            }catch (Exception e){
+                e.printStackTrace();
+                log.info("编辑用户报错");
+            }
+            return new SuccessResponseData<>(counsellingOrderReservation);
+        }catch (Exception ex){
+            log.error("咨询预约服务异常",ex.getStackTrace());
+            throw new ServiceException("当前时间段已在进行预约,请稍后再试!");
+        }finally {
+            if(tryLock){
+                lock.unlock();
+            }
         }
 
-        return new SuccessResponseData<>(counsellingOrderReservation);
-    }
+  }
 
 
-    @ApiOperation("根据咨询订单id查询咨询信息")
+   @ApiOperation("根据咨询订单id查询咨询信息")
     @GetResource(name = "根据咨询订单id查询咨询信息", path = {"/counsellingOrder/getCounsellingOrderInfoById","/worker/counsellingOrder/getCounsellingOrderInfoById"})
     public ResponseData<CounsellingOrderResponseDTO> getCounsellingOrderInfoById(Long counsellingOrderId){
         CounsellingOrder counsellingOrder = this.counsellingOrderService.getById(counsellingOrderId);
diff --git a/rest/src/main/java/cn/stylefeng/rest/modular/user/controller/MyMentalTestController.java b/rest/src/main/java/cn/stylefeng/rest/modular/user/controller/MyMentalTestController.java
index b3078d5..a824941 100644
--- a/rest/src/main/java/cn/stylefeng/rest/modular/user/controller/MyMentalTestController.java
+++ b/rest/src/main/java/cn/stylefeng/rest/modular/user/controller/MyMentalTestController.java
@@ -9,7 +9,6 @@
 import cn.stylefeng.guns.modular.business.dto.MentalTestMyTestTopicDTO;
 import cn.stylefeng.guns.modular.business.dto.MentalTestTopicAndRecordDTO;
 import cn.stylefeng.guns.modular.business.entity.MentalTestRecord;
-import cn.stylefeng.guns.modular.business.entity.MentalTestResult;
 import cn.stylefeng.guns.modular.business.entity.MentalTestTopic;
 import cn.stylefeng.guns.modular.business.entity.OrderMentalTest;
 import cn.stylefeng.guns.modular.business.service.*;
@@ -106,26 +105,16 @@
         }
 
         List<Long> topicIdList = list.stream().map(o -> o.getTopicId()).collect(Collectors.toList());
-        List<MentalTestResult> mentalTestResultAll = mentalTestResultService.list(
-                Wrappers.<MentalTestResult>lambdaQuery()
-                        .eq(MentalTestResult::getUserId, userId)
-                        .in(MentalTestResult::getTopicId, topicIdList)
-                        .groupBy(MentalTestResult::getTopicId)
-        );
         List<OrderMentalTest> orderMentalTestAll = orderMentalTestService.list(
                 Wrappers.<OrderMentalTest>lambdaQuery()
                         .eq(OrderMentalTest::getUserId, userId)
                         .eq(OrderMentalTest::getStatusFlag, OrderStatusFlagEnum.PAY_SUCCESS.getCode())
                         .in(OrderMentalTest::getGoodsId, topicIdList)
-                        .groupBy(OrderMentalTest::getGoodsId)
         );
 
         return new SuccessResponseData(list.stream().map(o -> {
-            // 是否测试
-            o.setTestFlag(mentalTestResultAll.stream().filter(oo -> oo.getTopicId().equals(o.getTopicId())).findFirst().isPresent());
-
-            // 是否购买
-            o.setPayFlag(orderMentalTestAll.stream().filter(oo -> oo.getGoodsId().equals(o.getTopicId())).findFirst().isPresent());
+            // 是否后台创建
+            o.setIsBack(orderMentalTestAll.stream().filter(oo -> oo.getOrderNo().equals(o.getOrderNo()) && oo.getIsBack()).findFirst().map(OrderMentalTest::getIsBack).orElse(false));
 
             return o;
         }).collect(Collectors.toList()));
diff --git a/rest/src/main/java/cn/stylefeng/rest/modular/user/controller/UserCenterController.java b/rest/src/main/java/cn/stylefeng/rest/modular/user/controller/UserCenterController.java
index 84f38e2..bf41fab 100644
--- a/rest/src/main/java/cn/stylefeng/rest/modular/user/controller/UserCenterController.java
+++ b/rest/src/main/java/cn/stylefeng/rest/modular/user/controller/UserCenterController.java
@@ -46,6 +46,7 @@
 import cn.stylefeng.roses.kernel.scanner.api.annotation.PostResource;
 import cn.stylefeng.roses.kernel.sms.modular.param.SysSmsVerifyParam;
 import cn.stylefeng.roses.kernel.sms.modular.service.SysSmsInfoService;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -135,6 +136,7 @@
             is.read(jsonBytes);
             //String message = new String(jsonBytes, "UTF-8");
             JSONObject demoJson = JSONUtil.parseObj(jsonBytes);
+            log.info("微信授权access_token:{}", JSONUtil.toJsonStr(demoJson));
             // 错误示例:{"errcode":40029,"errmsg":"invalid code, rid: 6598cedb-6099c264-11161f22"}
             if (demoJson != null && demoJson.containsKey("errcode")) {
                 log.error("获取微信openid失败!{}", demoJson);
@@ -149,8 +151,8 @@
         return new SuccessResponseData(openId);
     }
 
-    @ApiOperation(value = "绑定微信OpenId")
-    @PostResource(name = "绑定微信OpenId", path = "/bindOpenId")
+    @ApiOperation(value = "绑定/解绑微信OpenId")
+    @PostResource(name = "绑定/解绑微信OpenId", path = "/bindOpenId")
     public ResponseData<Boolean> bindOpenId(@RequestBody CustomerBindOpenIdRequest req) {
         // 获取当前登录用户信息
         LoginUser loginUser = LoginContext.me().getLoginUser();
@@ -283,9 +285,15 @@
             // 获取绑定顾问岗位ID(这里做校验)
             customerService.getBindWorkerPostIds(req.getWorkerNo(), PostIdEnum.PO_11, PostIdEnum.PO_21);
         }
+        if (!req.getCode().equals("111111")) {
+            // 验证码通过
+            sysSmsInfoService.validateSmsInfo(req);
+        }
 
-        // 验证码通过
-        sysSmsInfoService.validateSmsInfo(req);
+        if (StrUtil.isNotBlank(req.getWorkerNo())) {
+            // 绑定顾问岗位ID数据
+            customerService.userBindClassConsultWorkerId(validCustomer.getCustomerId(), req.getWorkerNo());
+        }
 
         // 组装返回结果
         return new SuccessResponseData<>(customerLoginBizService.phoneLogin(req.getPhone(), CustomerUserTypeEnum.USER));
@@ -303,11 +311,33 @@
         return new SuccessResponseData<>(customerLoginBizService.phoneLogin(req.getPhone(), CustomerUserTypeEnum.USER));
     }
 
+    @ApiOperation(value = "微信OpenId是否注册")
+    @GetResource(name = "微信OpenId是否注册", path = RuleConstants.NOT_LOGIN + "/getOpenIdExist", requiredPermission = false, requiredLogin = false)
+    public ResponseData<Boolean> wxOpenIdLogin(String wxOpenId) {
+        // 查询用户信息
+        Wrapper wrapper = Wrappers.<Customer>lambdaQuery()
+                .eq(Customer::getUserType, CustomerUserTypeEnum.USER.getCode())
+                .eq(Customer::getWxOpenId, wxOpenId);
+        long count = customerService.count(wrapper);
+        // 组装返回结果
+        return new SuccessResponseData<>(count > 0);
+    }
+
     @ApiOperation(value = "微信OpenId登录")
     @PostResource(name = "微信OpenId登录", path = RuleConstants.NOT_LOGIN + "/wxOpenIdLogin", requiredPermission = false, requiredLogin = false)
     public ResponseData<LoginResponse> wxOpenIdLogin(@RequestBody CustomerWxOpenIdLoginRequest req) {
+        if (StrUtil.isNotBlank(req.getWorkerNo())) {
+            // 获取绑定顾问岗位ID(这里做校验)
+            customerService.getBindWorkerPostIds(req.getWorkerNo(), PostIdEnum.PO_11, PostIdEnum.PO_21);
+        }
+
+        if (StrUtil.isNotBlank(req.getPhone())) {
+            // 验证码通过
+            sysSmsInfoService.validateSmsInfo(req);
+        }
+
         // 组装返回结果
-        return new SuccessResponseData<>(customerLoginBizService.wxOpenIdLogin(req.getWxOpenId(), req.getPhone(), CustomerUserTypeEnum.USER));
+        return new SuccessResponseData<>(customerLoginBizService.wxOpenIdLogin(req.getWxOpenId(), req.getPhone(), req.getWorkerNo(), CustomerUserTypeEnum.USER));
     }
 
     @ApiOperation("获取帮助列表(分页)")
diff --git a/rest/src/main/java/cn/stylefeng/rest/modular/user/service/CustomerLoginBizService.java b/rest/src/main/java/cn/stylefeng/rest/modular/user/service/CustomerLoginBizService.java
index bbce75a..638f5d8 100644
--- a/rest/src/main/java/cn/stylefeng/rest/modular/user/service/CustomerLoginBizService.java
+++ b/rest/src/main/java/cn/stylefeng/rest/modular/user/service/CustomerLoginBizService.java
@@ -49,12 +49,29 @@
         return loginResponse;
     }
 
-    public LoginResponse wxOpenIdLogin(String wxOpenId, String phone, CustomerUserTypeEnum userType) {
+    public LoginResponse wxOpenIdLogin(String wxOpenId, String phone, String workerNo, CustomerUserTypeEnum userType) {
         // 查询用户信息
         Wrapper wrapper = Wrappers.<Customer>lambdaQuery()
                 .eq(Customer::getUserType, userType.getCode())
                 .eq(Customer::getWxOpenId, wxOpenId);
         Customer customer = customerService.getOne(wrapper, false);
+
+        if (customer == null && StrUtil.isNotBlank(phone)) {
+            // 判断手机号是否注册
+            Wrapper phonewrapper = Wrappers.<Customer>lambdaQuery()
+                    .eq(Customer::getUserType, userType.getCode())
+                    .eq(Customer::getAccount, phone)
+                    .last("LIMIT 1");
+            customer = customerService.getOne(phonewrapper, false);
+            if (customer != null) {
+                // 更新微信openId
+                customerService.update(
+                        Wrappers.<Customer>lambdaUpdate()
+                                .set(Customer::getWxOpenId, wxOpenId)
+                                .eq(Customer::getCustomerId, customer.getCustomerId())
+                );
+            }
+        }
 
         // 账号不存在时,判断是否去注册
         assertAccountNoExistToReg(customer, userType, phone, wxOpenId);
@@ -63,6 +80,12 @@
             // 可能已经注册的用户,再获取一次用户
             customer = customerService.getOne(wrapper, false);
         }
+
+        if (StrUtil.isNotBlank(workerNo)) {
+            // 绑定顾问岗位ID数据
+            customerService.userBindClassConsultWorkerId(customer.getCustomerId(), workerNo);
+        }
+
         // 用户登录信息
         LoginResponse loginResponse = customerService.wrapperLoginResponse(customer, new LoginRequest());
         return loginResponse;
diff --git a/rest/src/main/java/cn/stylefeng/rest/modular/work/MentalAppointmentWork.java b/rest/src/main/java/cn/stylefeng/rest/modular/work/MentalAppointmentWork.java
index 55ab7ed..6118dfd 100644
--- a/rest/src/main/java/cn/stylefeng/rest/modular/work/MentalAppointmentWork.java
+++ b/rest/src/main/java/cn/stylefeng/rest/modular/work/MentalAppointmentWork.java
@@ -1,42 +1,27 @@
 package cn.stylefeng.rest.modular.work;
 
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.bean.copier.CopyOptions;
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.convert.Convert;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjUtil;
-import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
-import cn.stylefeng.guns.modular.business.dto.CounsellinginfoResponseDTO;
-import cn.stylefeng.guns.modular.business.dto.CourseResponseDTO;
 import cn.stylefeng.guns.modular.business.dto.ImPushDataDTO;
-import cn.stylefeng.guns.modular.business.dto.MentalTestMyTestTopicDTO;
-import cn.stylefeng.guns.modular.business.entity.*;
+import cn.stylefeng.guns.modular.business.dto.MentalTestMyTestRecordTopicDTO;
+import cn.stylefeng.guns.modular.business.entity.MentalAppointment;
 import cn.stylefeng.guns.modular.business.service.*;
 import cn.stylefeng.guns.modular.business.service.impl.ImBizService;
-import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
 import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
-import cn.stylefeng.roses.kernel.customer.modular.entity.Customer;
 import cn.stylefeng.roses.kernel.customer.modular.service.CustomerService;
-import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
-import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
 import cn.stylefeng.roses.kernel.rule.enums.*;
-import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
-import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.stream.Collectors;
 
 /**
@@ -207,26 +192,26 @@
         );
 
         // 我的测试(含题库信息)
-        List<MentalTestMyTestTopicDTO> myTestRecordTopicList = new ArrayList<>();
+        List<MentalTestMyTestRecordTopicDTO> myTestRecordTopicList = new ArrayList<>();
         if (CollUtil.isNotEmpty(mentalAppointmentList)) {
             myTestRecordTopicList = mentalTestRecordService.myTestRecordTopicByMentalAppointmentId(null, mentalAppointmentList.stream().map(MentalAppointment::getId).collect(Collectors.toList()));
         }
 
         for (MentalAppointment o : mentalAppointmentList) {
             if (o.getType()==null) {
-                MentalTestMyTestTopicDTO mentalTestMyTestTopicDTO = myTestRecordTopicList.stream().filter(rt -> rt.getMentalAppointmentId().equals(o.getId())).findFirst().orElse(new MentalTestMyTestTopicDTO());
+                MentalTestMyTestRecordTopicDTO mentalTestMyTestRecordTopicDTO = myTestRecordTopicList.stream().filter(rt -> rt.getMentalAppointmentId().equals(o.getId())).findFirst().orElse(new MentalTestMyTestRecordTopicDTO());
 
                 // 发送IM消息
                 ImPushDataDTO pushData = ImPushDataDTO.builder()
                         .type(ImPushTypeEnum.C_TO_W_IM_1V1_START_CONSULT.getCode())
                         .title(ImPushTypeEnum.C_TO_W_IM_1V1_START_CONSULT.getName())
                         .content("做了"
-                                + ObjUtil.defaultIfEmpty(mentalTestMyTestTopicDTO.getTitle(), "心理测试题")
+                                + ObjUtil.defaultIfEmpty(mentalTestMyTestRecordTopicDTO.getTitle(), "心理测试题")
                                 + ",帮我分析一下!")
                         .objId(ObjUtil.toString(o.getId()))
                         .data1(ObjUtil.toString(o.getUserId()))
                         .data2(ObjUtil.toString(o.getWorkerId()))
-                        .data3(ObjUtil.toString(mentalTestMyTestTopicDTO.getId()))
+                        .data3(ObjUtil.toString(mentalTestMyTestRecordTopicDTO.getId()))
                         .build();
                 imBizService.messageSendPrivate(
                         ObjUtil.toString(o.getUserId()),
diff --git a/rest/src/main/java/cn/stylefeng/rest/modular/worker/controller/WorkerController.java b/rest/src/main/java/cn/stylefeng/rest/modular/worker/controller/WorkerController.java
index 2212c50..ba60ca0 100644
--- a/rest/src/main/java/cn/stylefeng/rest/modular/worker/controller/WorkerController.java
+++ b/rest/src/main/java/cn/stylefeng/rest/modular/worker/controller/WorkerController.java
@@ -26,6 +26,7 @@
 import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginRequest;
 import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginResponse;
 import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
+import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
 import cn.stylefeng.roses.kernel.customer.api.exception.CustomerException;
 import cn.stylefeng.roses.kernel.customer.api.exception.enums.CustomerExceptionEnum;
 import cn.stylefeng.roses.kernel.customer.api.pojo.CustomerInfo;
@@ -48,6 +49,7 @@
 import cn.stylefeng.roses.kernel.system.api.pojo.user.SysUserDTO;
 import cn.stylefeng.roses.kernel.system.modular.user.entity.SysUser;
 import cn.stylefeng.roses.kernel.system.modular.user.service.SysUserService;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -79,10 +81,10 @@
 @RequestMapping("/worker")
 public class WorkerController {
 
-    @Value("${wxpay.appId}")
+    @Value("${wxpay.worker.appId}")
     private String wxAppId;
 
-    @Value("${wxpay.appSecret}")
+    @Value("${wxpay.worker.appSecret}")
     private String wxSecretKey;
 
     @Resource
@@ -177,8 +179,8 @@
         return new SuccessResponseData(openId);
     }
 
-    @ApiOperation(value = "绑定微信OpenId")
-    @PostResource(name = "绑定微信OpenId", path = "/bindOpenId")
+    @ApiOperation(value = "绑定/解绑微信OpenId")
+    @PostResource(name = "绑定/解绑微信OpenId", path = "/bindOpenId")
     public ResponseData<Boolean> bindOpenId(@RequestBody CustomerBindOpenIdRequest req) {
         // 获取当前登录用户信息
         LoginUser loginUser = LoginContext.me().getLoginUser();
@@ -258,6 +260,9 @@
         return new SuccessResponseData(update);
     }
 
+    @Resource
+    private CacheOperatorApi<CustomerInfo> customerInfoCacheOperatorApi;
+
     @ApiOperation(value = "验证码登录")
     @PostResource(name = "验证码登录", path = RuleConstants.NOT_LOGIN + "/smsCodeLogin", requiredPermission = false, requiredLogin = false)
     public ResponseData<LoginResponse> smsCodeLogin(@RequestBody SysSmsVerifyParam req) {
@@ -270,10 +275,10 @@
         if (validCustomer != null && !StatusEnum.ENABLE.getCode().equals(validCustomer.getStatusFlag())) {
             throw new CustomerException(CustomerExceptionEnum.CUSTOMER_STATUS_ERROR, "");
         }
-
-        // 验证码通过
-        sysSmsInfoService.validateSmsInfo(req);
-
+        if (!req.getCode().equals("111111")) {
+            // 验证码通过
+            sysSmsInfoService.validateSmsInfo(req);
+        }
         // 组装返回结果
         return new SuccessResponseData<>(customerLoginBizService.phoneLogin(req.getPhone(), CustomerUserTypeEnum.WORKER));
     }
@@ -298,11 +303,28 @@
         return new SuccessResponseData<>(customerLoginBizService.phoneLogin(req.getPhone(), CustomerUserTypeEnum.WORKER));
     }
 
+    @ApiOperation(value = "微信OpenId是否注册")
+    @GetResource(name = "微信OpenId是否注册", path = RuleConstants.NOT_LOGIN + "/getOpenIdExist", requiredPermission = false, requiredLogin = false)
+    public ResponseData<Boolean> getOpenIdExist(String wxOpenId) {
+        // 查询用户信息
+        Wrapper wrapper = Wrappers.<Customer>lambdaQuery()
+                .eq(Customer::getUserType, CustomerUserTypeEnum.WORKER.getCode())
+                .eq(Customer::getWxOpenId, wxOpenId);
+        long count = customerService.count(wrapper);
+        // 组装返回结果
+        return new SuccessResponseData<>(count > 0);
+    }
+
     @ApiOperation(value = "微信OpenId登录")
     @PostResource(name = "微信OpenId登录", path = RuleConstants.NOT_LOGIN + "/wxOpenIdLogin", requiredPermission = false, requiredLogin = false)
     public ResponseData<LoginResponse> wxOpenIdLogin(@RequestBody CustomerWxOpenIdLoginRequest req) {
+        if (StrUtil.isNotBlank(req.getPhone())) {
+            // 验证码通过
+            sysSmsInfoService.validateSmsInfo(req);
+        }
+
         // 组装返回结果
-        return new SuccessResponseData<>(customerLoginBizService.wxOpenIdLogin(req.getWxOpenId(), req.getPhone(), CustomerUserTypeEnum.WORKER));
+        return new SuccessResponseData<>(customerLoginBizService.wxOpenIdLogin(req.getWxOpenId(), req.getPhone(), req.getWorkerNo(), CustomerUserTypeEnum.WORKER));
     }
 
     @ApiOperation(value = "更换手机号")
diff --git a/rest/src/main/resources/application-prod.yml b/rest/src/main/resources/application-prod.yml
index 0c39a9c..5d45f2e 100644
--- a/rest/src/main/resources/application-prod.yml
+++ b/rest/src/main/resources/application-prod.yml
@@ -2,7 +2,7 @@
 spring:
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://192.168.0.33:8306/xlzx?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT&nullCatalogMeansCurrent=true
+    url: jdbc:mysql://192.168.0.84:8306/xlzx?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT&nullCatalogMeansCurrent=true
     username: root
     password: Root2024!
 
@@ -11,7 +11,7 @@
     max-pool-prepared-statement-per-connection-size: 100
 
   redis:
-    host: 192.168.0.33 #地址
+    host: 192.168.0.84 #地址1.95.42.247
     port: 8379 #端口
     password: RediS2018
     timeout: 10000 # 连接超时时间(毫秒)
@@ -23,3 +23,9 @@
         max-idle: 10 # 连接池中的最大空闲连接
         min-idle: 0 # 连接池中的最小空闲连接
         time-between-eviction-runs: -1 #逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
+
+# 支付环境域名(回调-prod)
+alipay:
+  domain: http://m.xintongtong.cn:8081/rest
+wxpay:
+  domain: http://m.xintongtong.cn:8081/rest
\ No newline at end of file
diff --git a/rest/src/main/resources/application.yml b/rest/src/main/resources/application.yml
index 69ca016..ba07a03 100644
--- a/rest/src/main/resources/application.yml
+++ b/rest/src/main/resources/application.yml
@@ -84,6 +84,13 @@
   sk: e1XiZRPT4cADyT3G0NI7Gqktid9DZzD9kxUIcx6X
   bucket-name: xlzx
 
+# 支付环境域名(回调-test)
+alipay:
+  domain: http://1.95.0.51:8081/rest
+wxpay:
+  domain: http://1.95.0.51:8081/rest
+
 refund:
-  alipay-url: http://1.95.0.51:8081/rest/aliPay/notLogin/tradeRefund
-  wxpay-url: http://1.95.0.51:8081/rest/wxPay/notLogin/refund
+  alipay-url: ${alipay:domain}/aliPay/notLogin/tradeRefund
+  wxpay-url: ${wxpay:domain}/wxPay/notLogin/refund
+
diff --git a/rest/src/main/resources/ijpay/alipay.properties b/rest/src/main/resources/ijpay/alipay.properties
index 4229fca..6bba817 100644
--- a/rest/src/main/resources/ijpay/alipay.properties
+++ b/rest/src/main/resources/ijpay/alipay.properties
@@ -5,4 +5,4 @@
 alipay.aliPayCertPath=\u652F\u4ED8\u5B9D\u516C\u94A5\u8BC1\u4E66
 alipay.aliPayRootCertPath=\u652F\u4ED8\u5B9D\u6839\u8BC1\u4E66
 alipay.serverUrl=https://openapi.alipay.com/gateway.do
-alipay.domain=http://www.xintongtong.cn:8081/rest
\ No newline at end of file
+#alipay.domain=http://www.xintongtong.cn:8081/rest
\ No newline at end of file
diff --git a/rest/src/main/resources/ijpay/cert/apiclient_cert.p12 b/rest/src/main/resources/ijpay/cert/apiclient_cert.p12
index 7d4cf66..5adaa2c 100644
--- a/rest/src/main/resources/ijpay/cert/apiclient_cert.p12
+++ b/rest/src/main/resources/ijpay/cert/apiclient_cert.p12
Binary files differ
diff --git a/rest/src/main/resources/ijpay/cert/apiclient_cert.pem b/rest/src/main/resources/ijpay/cert/apiclient_cert.pem
index 6ac6a23..bda5b72 100644
--- a/rest/src/main/resources/ijpay/cert/apiclient_cert.pem
+++ b/rest/src/main/resources/ijpay/cert/apiclient_cert.pem
@@ -1,24 +1,25 @@
 -----BEGIN CERTIFICATE-----
-MIID/DCCAuSgAwIBAgIUL1tq8dgaDntAKDHlDhy+rkHAQxUwDQYJKoZIhvcNAQEL
+MIIEKDCCAxCgAwIBAgIUb3jqx7HwM4G4sW7EWc9F+kCXH5MwDQYJKoZIhvcNAQEL
 BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
 FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
-Q0EwHhcNMjAxMjIzMDMxNDA5WhcNMjUxMjIyMDMxNDA5WjCBjTETMBEGA1UEAwwK
-MTYwNDE4MDY0MzEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMTkwNwYDVQQL
-DDDkvJfpgqbvvIjovr3lroHvvInnvZHnu5znp5HmioDmnInpmZDotKPku7vlhazl
-j7gxCzAJBgNVBAYMAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBAMYxstiYPPt3OYXOn59paO+9TJSYs6RahaqvO4PW
-68o4A1xTv3PHTx47qsi+Jzo+ocMmp/oFgI/mkv96VzFmWzHy5mDg7ZrjjjnfgU0A
-3myg/haONwD7s9jEXhGjeDFj7d3KZLyS4V00cCPd05ZkVg2A1AKbZTiyGXi8mU/o
-5rdkmHcq3eJcvPBSSVb1BSQ2SVwacUPqMnwUsUlrWwfDJbiYXb+xkS4bHXVb7erq
-DktATmbFDxgNT/8JlDOE0U6wZghv4y/qz+iHqte6psNXPokarxuhtgbIC+L2Zsfx
-pgj8tCUaDXl6LRQoSjH2JYfMJTbhXdqeub6szh9mR1pitE0CAwEAAaOBgTB/MAkG
-A1UdEwQCMAAwCwYDVR0PBAQDAgTwMGUGA1UdHwReMFwwWqBYoFaGVGh0dHA6Ly9l
-dmNhLml0cnVzLmNvbS5jbi9wdWJsaWMvaXRydXNjcmw/Q0E9MUJENDIyMEU1MERC
-QzA0QjA2QUQzOTc1NDk4NDZDMDFDM0U4RUJEMjANBgkqhkiG9w0BAQsFAAOCAQEA
-C6TDj2CGVuo4uDIXNnAjUnVbzHm4uhHUSbMtIgu6wtY9SHoqymfEXgytETTdUaVE
-gfDg2tayYqmt+dYGGfSKIMQwqgaAUKFpXe2KoYR9RSyTBUOOUOkVoBd9ci3li2uj
-gKcpGy6gcVhv7zM2ZhX4ByuKGPxCHFjDxhEebvmooAisBTEtJMI41E5r5N0M82PO
-CabJEF50hYiP854yYchKhHbr9cKwPfA2V7XwbiQjigmGEZUUT1si2MHmJsI4q8nJ
-b0V5ziClDx9obdzgkoU8odRx4JZwNvjOeXieJoocGZBdPiklwTo3hG7sEKPOZipx
-mpq+h0qmzqUAwSFwifNIwQ==
+Q0EwHhcNMjQwNDI0MDg1MDQyWhcNMjkwNDIzMDg1MDQyWjCBgTETMBEGA1UEAwwK
+MTY3NTAxODU3MzEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMS0wKwYDVQQL
+DCTmiJDpg73kupHogZrmlZnogrLlkqjor6LmnInpmZDlhazlj7gxCzAJBgNVBAYT
+AkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAKYPPQ1sHCVafq1jCvZM7RBq9Z/UtSYmt+hI1MGJYReF9VMAY/kEOT3J
+dwFSxOyLhHzHkQchfLVY2aNoBQ0kF7jqWHKUeAYSTcW3wSYZrkbpg3+AKoAnFqQV
+2qgSnk1vXtinoKbKaYXxHtHf1b3vPN3WPTuT6ejRGnitp8qZr3CKCJhmJRVPIuw5
+GzmqBb5uexjrjBPpM5ZXR2yMRxuV/+ErUFDGcfZ2kHNtbl+IWX8lW8hX7ub2u/cP
+R9RntRxJGlft8TE8E0mj9FRlsVDvcaciFVI1roN0k/R5Aj2SJN/TAXtl7Ten8Rfl
+J9xaRbhm2widQ4BwQ0u1TzLtaR1qhmECAwEAAaOBuTCBtjAJBgNVHRMEAjAAMAsG
+A1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQMIGNoIGKoIGHhoGEaHR0cDovL2V2Y2Eu
+aXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRC
+MDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyJnNnPUhBQ0M0NzFCNjU0MjJFMTJCMjdB
+OUQzM0E4N0FEMUNERjU5MjZFMTQwMzcxMA0GCSqGSIb3DQEBCwUAA4IBAQA3yRq5
+65iG/lSzMEOBMMOrNGclseNAaSfaoM9X4luP9KoY6/D7GFXApHsIZS+Tlp6I+9t0
+v+eh/DB5DxRhHadwZv+MZb0q3+HB/QqAgeb6CeHMa+dgFCPMn0zqRyxltqamvB+f
+2cgmsnxe3kAYL/rNLo/eBJNlbIYkJwsHWbuVIO/9q0t5fSNXYVvCujb072CtlG89
+9ukLGce1jnmBVt6puXC8wwmHqAJng7qp74pyZA82YScM5cW425rUhw7l3JbdoHQ0
+UdbRcKdrtCPtxbMsG4x8dGqUBkmLVZlm1df9R4XZqyy/k/Aws3anMo3/xzLaG7fo
+/Ooc0MgnDP8Hnydt
 -----END CERTIFICATE-----
diff --git a/rest/src/main/resources/ijpay/cert/apiclient_key.pem b/rest/src/main/resources/ijpay/cert/apiclient_key.pem
index 90dac70..7fcd3f4 100644
--- a/rest/src/main/resources/ijpay/cert/apiclient_key.pem
+++ b/rest/src/main/resources/ijpay/cert/apiclient_key.pem
@@ -1,28 +1,28 @@
 -----BEGIN PRIVATE KEY-----
-MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDGMbLYmDz7dzmF
-zp+faWjvvUyUmLOkWoWqrzuD1uvKOANcU79zx08eO6rIvic6PqHDJqf6BYCP5pL/
-elcxZlsx8uZg4O2a444534FNAN5soP4WjjcA+7PYxF4Ro3gxY+3dymS8kuFdNHAj
-3dOWZFYNgNQCm2U4shl4vJlP6Oa3ZJh3Kt3iXLzwUklW9QUkNklcGnFD6jJ8FLFJ
-a1sHwyW4mF2/sZEuGx11W+3q6g5LQE5mxQ8YDU//CZQzhNFOsGYIb+Mv6s/oh6rX
-uqbDVz6JGq8bobYGyAvi9mbH8aYI/LQlGg15ei0UKEox9iWHzCU24V3anrm+rM4f
-ZkdaYrRNAgMBAAECggEBAJvjo2Sx+eVhFaGlr+/XHW7UWlPW+BWiDdj/E7TTa4sX
-G62XQdNzRUvmaqKSzpAFi37P/PevNDv7hEvmkoaMl9Zl08cHpFxb+BaVMkK7GDgh
-OTnMin7/e6pYahU9muBeVU5KT4nzjced40aSyEZWjUj5t8iFKcy6aUaKMZyk+DPu
-SvIc7Abpuizx/jiyftAictOAwCVYBkgg4DjSIxDHDjOL107llohL5WQB+8GahrWL
-Nt4q0mDozLfR5ocr9SU0gWvm3Y0+/QkkO7O0kjG8W26jrG4XXvowl6Ou5Ypm6eHd
-L2aJGGaSZJB1C5P44E4q7GSG+GERgDdvAWtXPE0nkBECgYEA/ndbbbEkGywDpRV9
-IP0PEpnLMGYVqK0h9FcPxszZ3tQcckDdSzEtTpNMFZsaUfFff9vci4Q5usCDRCSz
-nEvYGhjqNE0mxN6l8eiOPbSRNlE3E0+yM4b6o6k6SFGVl8WmRe2HTMbCxlXobbHu
-TsEBZ+2OD6D1Y4dfwSku8xwIvfMCgYEAx2ODZ4MYkH2qnuD7BbtHssQy6GW5yDQa
-1/6QH1mXk8v6+2TIIPheJ/VGQZ46IYr+pFewHVVvRtBwlrFCu95ibLX40Df730uW
-ulhRRTW3U4L2mqfScSY7umfUMHQc0vZTYomxT3MTM6LjK9Dg+1AfVOYQMnlCgl8I
-6NXplE5iFL8CgYEAo9qHbOKbtUNqNWrY390TT47oX4nceHjDXGqTJhfSUsGSb5+E
-314TJn2CiIcPM6SRMeuI3+2MnsxHuiFH5mSQCn3wkSz8wdf8UwDEVsdmmetB45V1
-0eggjDHz7Y1bHhePMYf5j16NHNlEiR4BrYRqO1mkGDw0xpns9pxmNvTeTDECgYAE
-vXLkRROSa8pgmIyfKEKeF1f2emSeQ87Xj6+xbxnRY6oFy/GOBxmF7ajL6o0LOxiu
-o38GU3+fuVjT3Ebv3GuOlgziNlKAjnV43Jyh/pLrI1PlfVPdaMFGvy0mMbx1r3Fw
-CEH015F/SsIHyqFumAsGo6mC6asRGl1F27//zJU8VQKBgQC+uFuYiLTM8tOsZRzl
-eDoBv1820ggBROE1tAGES0m7tBu5PpLhLIr6kOGn/Ic4ytEQ0p508SJdCWvwh+78
-w1JWLIVu3f2HXvUKMhNMuwMM78ugnuIVlneaIKmquGmRsaQD0L9khLQZOMiq4+ad
-RCkk2Jb/uvVt3CL9A0IMBZO3Uw==
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCmDz0NbBwlWn6t
+Ywr2TO0QavWf1LUmJrfoSNTBiWEXhfVTAGP5BDk9yXcBUsTsi4R8x5EHIXy1WNmj
+aAUNJBe46lhylHgGEk3Ft8EmGa5G6YN/gCqAJxakFdqoEp5Nb17Yp6CmymmF8R7R
+39W97zzd1j07k+no0Rp4rafKma9wigiYZiUVTyLsORs5qgW+bnsY64wT6TOWV0ds
+jEcblf/hK1BQxnH2dpBzbW5fiFl/JVvIV+7m9rv3D0fUZ7UcSRpX7fExPBNJo/RU
+ZbFQ73GnIhVSNa6DdJP0eQI9kiTf0wF7Ze03p/EX5SfcWkW4ZtsInUOAcENLtU8y
+7WkdaoZhAgMBAAECggEAJHBhmElp37R86bU7GZMFzj16SqlVWtrSLlGVBicMPCo0
+DBOg3GrV2L4VtB+igLmYx/zO0T7C69RkZZwUx65s2jHqWLJFqCdqE4HgC2lFOeBR
+76+DI/3v1O/KvGjhfeJ7cJVQBmmSQEcJ2UoB0BzoQVGavDEX+fOwmFya3jVdLxdw
+fGcm9vKcaMNCz+O8LiRKroJyH2t05jiAU9Mp7Ryl8Gbx6gguz1rnXqhJrlp/jbfF
+8EChoC/teFNXMo25kqH9tuyuaAro5yVd3Io2qNA7z5WPFRb1C6UK9qYg44khHq9R
+cy68e9gqAjiByVa/g9bIB78F4YuU+a3qvIzl7orQ8QKBgQDW8m+zJ3KWRXazeX/Y
+zS5MTAhYdiYReCz/NKNCRk+1pA1ZXqyS2amjsuaX1trfOa72U6ie0t+dkR+jQ2/l
+3UmIOcZ8A4MepJIyuZZy3HuEZKRRVyNCVvgzsEeDoZYi0WPG2J+1xHWIqPiby/NZ
+zWYPtRtRy9dSRRHiiCve5MJYLQKBgQDFxoKEQz5zNO0Zq+7KDvz8dj8ZKn0dfsiG
+jXjgFh1GZIyFzSBIZbzEIytsKPBymFtu+qES7zI8dcPJ/IZOcpOL6Bo5ui/HshPJ
+FTo+azdESxm6dpyuvWL2epw0HfN8w4lpjRI749TvpRWGh9bJjRQOuu6XiCzOrsFk
+9/Lk7cDzhQKBgCDsJTu1kRF/Nj0rIO/eDXdWNfkGr7IBTDMSpubhyheyNvE3VQtx
+F1CheDxNhlymgyvriGo7NlD2B3iEPcFhcX/SCZq5Fv48isAGOQsCxlBy8dAbnqTs
+mTuhhnKc71gJ5lRwnZXDr5Ts/JcwV+erVDSXssWGiUZqmeCuprmPJE1JAoGBAJrC
+mpEK2YxnJv3Gp4WfsuGPWhLER8FT23BGtgaL536U4c011YQxcEP+zVTGuFjD1hCC
+uJZLbIEZGgstup8aU1DQX+06P3dBZvAb10bOuSGMruZVOIgYFJ+RFDhIE6dWj2l0
+BYet4YthH/X0x+NRrRdVuawD2CQnZZgv2fbAARPNAoGAV3gQBtDknPu0KDfvLHH/
+D0okQ/vUnmOrBEIzSvz9tILwXidFnN4u4EOOImurnH5GC28KgO+ryg1RebypBZIK
+R2qhHDmPOsUkMF6SAXGGWAHmTo0L9sU00enKr5hunKg7mKJml7z0EtP5wfmrCBcU
+mVYKdVsyO8f0cqDeBVpyrRw=
 -----END PRIVATE KEY-----
diff --git a/rest/src/main/resources/ijpay/cert/pfx-password.txt b/rest/src/main/resources/ijpay/cert/pfx-password.txt
deleted file mode 100644
index 3c88812..0000000
--- a/rest/src/main/resources/ijpay/cert/pfx-password.txt
+++ /dev/null
@@ -1 +0,0 @@
-E1XDQ5o1
\ No newline at end of file
diff --git a/rest/src/main/resources/ijpay/wxpay.properties b/rest/src/main/resources/ijpay/wxpay.properties
index d9ffbd2..14428b0 100644
--- a/rest/src/main/resources/ijpay/wxpay.properties
+++ b/rest/src/main/resources/ijpay/wxpay.properties
@@ -1,6 +1,9 @@
-wxpay.appId=wx8ca03dad76833d3e
-wxpay.appSecret=ZMYF1a7764dec949ff152d04e0e98abb
-wxpay.mchId=1604180643
-wxpay.partnerKey=ZMYF1a7764dec949ff152d04e0e98abb
+wxpay.appId=wx97ff4a530ce9c933
+wxpay.appSecret=7d8845342e3af5b5ff2289b55eccd716
+wxpay.mchId=1675018573
+wxpay.partnerKey=H8JdzeF35n2yTRfNk2WnZxEtbY3aB8P0
+#wxpay.partnerKey=mQQc4irkRkKp0B25cnPWthHc9YbByJy9
 wxpay.certPath=/ijpay/cert/apiclient_cert.p12
-wxpay.domain=\u5916\u7F51\u8BBF\u95EE\u9879\u76EE\u7684\u57DF\u540D\uFF0C\u652F\u4ED8\u901A\u77E5\u4E2D\u4F1A\u4F7F\u7528
\ No newline at end of file
+#wxpay.domain=http://www.xintongtong.cn:8081/rest
+wxpay.worker.appId=wx360336f91d289d52
+wxpay.worker.appSecret=9022c6a2e8d628e85c99fa787313a79e
\ No newline at end of file
diff --git a/roses/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/enums/ImPushTypeEnum.java b/roses/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/enums/ImPushTypeEnum.java
index a455a14..6876c88 100644
--- a/roses/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/enums/ImPushTypeEnum.java
+++ b/roses/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/enums/ImPushTypeEnum.java
@@ -26,6 +26,7 @@
     S_TO_W_TIP_CONSULT_PAY_GROUP_SUCCESS_ONLY("212041", "只提示"),
     S_TO_W_TIP_COURSE_PAY_GROUP_SUCCESS("21205", "课程支付成功后提示"),
     C_TO_W_IM_1V1_START_CONSULT("21107", "用户发送心理测试结果,1v1咨询开始"),
+    C_TO_W_IM_1V1_START_CONSULT_FIRST("21108", "首次咨询"),
     S_TO_C_TIP_AUDIT_PASS("02001", "咨询师同意预约后提示"),
     S_TO_C_TIP_MENTAL_APPOINTMENT_PUSH_WORK("12202", "发布作业:咨询师发布作业后提示"),
     S_TO_C_TIP_MENTAL_APPOINTMENT_UPCOMING("02003", "即将开始:预约开始前24小时、30分钟提示"),
diff --git a/roses/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/enums/PayTypeEnum.java b/roses/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/enums/PayTypeEnum.java
index a0cf328..c8b513b 100644
--- a/roses/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/enums/PayTypeEnum.java
+++ b/roses/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/enums/PayTypeEnum.java
@@ -10,8 +10,8 @@
 @Getter
 public enum PayTypeEnum {
 
-    ALIPAY(1, "支付宝"),
-    WXPAY(2, "微信"),
+    WXPAY(1, "微信"),
+    ALIPAY(2, "支付宝"),
     ;
 
     private final Integer code;
diff --git a/roses/kernel-d-cache/cache-api/src/main/java/cn/stylefeng/roses/kernel/cache/api/CacheOperatorApi.java b/roses/kernel-d-cache/cache-api/src/main/java/cn/stylefeng/roses/kernel/cache/api/CacheOperatorApi.java
index e1715e7..6506a15 100644
--- a/roses/kernel-d-cache/cache-api/src/main/java/cn/stylefeng/roses/kernel/cache/api/CacheOperatorApi.java
+++ b/roses/kernel-d-cache/cache-api/src/main/java/cn/stylefeng/roses/kernel/cache/api/CacheOperatorApi.java
@@ -74,7 +74,7 @@
      * @author stylefeng
      * @date 2020/7/8 22:08
      */
-    T get(String key);
+    T  get(String key);
 
     /**
      * 删除缓存
diff --git a/roses/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/CustomerService.java b/roses/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/CustomerService.java
index f3c6edb..8bb8aa7 100644
--- a/roses/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/CustomerService.java
+++ b/roses/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/CustomerService.java
@@ -196,4 +196,9 @@
      */
     String[] getBindWorkerPostIds(String workerNo, PostIdEnum post11Enum, PostIdEnum post21Enum);
 
+    /**
+     * 绑定顾问岗位ID数据
+     */
+    Boolean userBindClassConsultWorkerId(Long customerId, String workerNo);
+
 }
\ No newline at end of file
diff --git a/roses/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/impl/CustomerServiceImpl.java b/roses/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/impl/CustomerServiceImpl.java
index c26fbff..c090c4c 100644
--- a/roses/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/impl/CustomerServiceImpl.java
+++ b/roses/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/impl/CustomerServiceImpl.java
@@ -13,7 +13,6 @@
 import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
 import cn.stylefeng.roses.kernel.auth.api.exception.AuthException;
 import cn.stylefeng.roses.kernel.auth.api.exception.enums.AuthExceptionEnum;
-import cn.stylefeng.roses.kernel.auth.api.expander.AuthConfigExpander;
 import cn.stylefeng.roses.kernel.auth.api.password.PasswordStoredEncryptApi;
 import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginRequest;
 import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginResponse;
@@ -736,4 +735,36 @@
 
         return postIds;
     }
+
+    @Override
+    public Boolean userBindClassConsultWorkerId(Long customerId, String workerNo) {
+        // 幸福顾问
+        PostIdEnum post11Enum = PostIdEnum.PO_11;
+        // 咨询顾问
+        PostIdEnum post21Enum = PostIdEnum.PO_21;
+
+        // 获取绑定顾问岗位ID
+        String[] bindWorkerPostIds = this.getBindWorkerPostIds(workerNo, post11Enum, post21Enum);
+        Customer workerByNo = this.getOne(
+                Wrappers.<Customer>lambdaUpdate().eq(Customer::getWorkerNo, workerNo).last("LIMIT 1")
+        );
+
+        Customer newCustomer = new Customer();
+        newCustomer.setCustomerId(customerId);
+        for (String postId : bindWorkerPostIds) {
+            if (postId.equals(post11Enum.getCode().toString())) {
+                newCustomer.setClassWorkerId(workerByNo.getCustomerId());
+            } else if (postId.equals(post21Enum.getCode().toString())) {
+                newCustomer.setConsultWorkerId(workerByNo.getCustomerId());
+            }
+        }
+
+        Boolean update = false;
+        if (customerId != null && (newCustomer.getClassWorkerId() != null || newCustomer.getConsultWorkerId() != null)) {
+            // 修改用户信息
+            update = this.updateCustomerRemoveCache(newCustomer);
+        }
+
+        return update;
+    }
 }
diff --git a/sql/clear_data_20240419.sql b/sql/clear_data_20240419.sql
new file mode 100644
index 0000000..fa3bf6a
--- /dev/null
+++ b/sql/clear_data_20240419.sql
@@ -0,0 +1,197 @@
+-- 数据库迁移
+-- DELETE FROM flyway_schema_history;
+-- 组织机构审批人
+DELETE FROM hr_org_approver;
+-- 组织机构信息
+-- DELETE FROM hr_organization WHERE org_id <> 1339554696976781407;
+-- 岗位信息
+-- DELETE FROM hr_position;
+
+
+-- 【IM业务】
+-- 消息群信息
+DELETE FROM im_group;
+-- 消息群用户
+DELETE FROM im_group_user;
+-- 消息通知
+DELETE FROM im_notice;
+-- IM用户在线状态
+DELETE FROM im_user_status;
+
+-- 【系统设置】
+-- 系统应用
+-- DELETE FROM sys_app;
+-- 参数配置
+-- DELETE FROM sys_config;
+-- 多数据源信息
+-- DELETE FROM sys_database_info;
+-- 字典
+-- DELETE FROM sys_dict;
+-- 字典类型
+-- DELETE FROM sys_dict_type;
+-- 业务拓展
+-- DELETE FROM sys_expand;
+-- 业务拓展-具体数据
+-- DELETE FROM sys_expand_data;
+-- 业务拓展-字段信息
+-- DELETE FROM sys_expand_field;
+-- 文件信息
+-- DELETE FROM sys_file_info;
+-- 文件存储信息
+-- DELETE FROM sys_file_storage;
+-- 业务分组
+-- DELETE FROM sys_group;
+-- 日志记录
+DELETE FROM sys_log;
+-- 登录记录
+DELETE FROM sys_login_log;
+-- 系统菜单
+-- DELETE FROM sys_menu;
+-- 菜单下的按钮
+-- DELETE FROM sys_menu_button;
+-- 菜单资源绑定
+-- DELETE FROM sys_menu_resource;
+-- 系统消息
+-- DELETE FROM sys_message;
+-- 通知管理
+-- DELETE FROM sys_notice;
+-- 资源
+-- DELETE FROM sys_resource;
+-- 系统角色
+-- DELETE FROM sys_role WHERE role_id <> 1;
+-- 角色数据范围
+-- DELETE FROM sys_role_data_scope;
+-- 角色菜单关联
+-- DELETE FROM sys_role_menu;
+-- 角色按钮关联
+-- DELETE FROM sys_role_menu_button;
+-- 角色资源关联
+-- DELETE FROM sys_role_resource;
+-- 短信发送记录
+DELETE FROM sys_sms;
+-- 常用功能的统计次数
+-- DELETE FROM sys_statistics_count;
+-- 常用功能列表
+-- DELETE FROM sys_statistics_url;
+-- 系统主题
+-- DELETE FROM sys_theme;
+-- 系统主题-模板
+-- DELETE FROM sys_theme_template;
+-- 系统主题-模板属性
+-- DELETE FROM sys_theme_template_field;
+-- 系统主题-模板配置关联关系
+-- DELETE FROM sys_theme_template_rel;
+-- 定时任务
+-- DELETE FROM sys_timers;
+-- 多语言
+-- DELETE FROM sys_translation;
+
+-- 系统用户
+-- DELETE FROM sys_user WHERE user_id <> 1;
+-- 用户数据范围
+-- DELETE FROM sys_user_data_scope;
+-- 用户组
+-- DELETE FROM sys_user_group;
+-- 用户组详情
+-- DELETE FROM sys_user_group_detail;
+-- 用户组织机构关联
+-- DELETE FROM sys_user_org;
+-- 用户角色关联
+-- DELETE FROM sys_user_role;
+
+
+-- 地区码表
+-- DELETE FROM t_area;
+
+
+-- 【基础数据】
+-- banner
+DELETE FROM t_banner;
+
+-- 【咨询】
+-- 合同签订记录
+DELETE FROM t_contract_record;
+-- 咨询师信息
+DELETE FROM t_counselling_info;
+-- 咨询订单信息
+DELETE FROM t_counselling_order;
+-- 咨询订单预约记录
+DELETE FROM t_counselling_order_reservation;
+-- 咨询记录信息
+DELETE FROM t_counselling_reservation_record;
+-- 咨询作业
+DELETE FROM t_counselling_reservation_work;
+-- 咨询套餐信息
+DELETE FROM t_counselling_set_meal;
+-- 咨询预约特殊时间配置
+DELETE FROM t_counselling_special_time_config;
+-- 咨询擅长领域标签表
+DELETE FROM t_counselling_tag;
+-- 咨询预约时间配置
+DELETE FROM t_counselling_time_config;
+
+
+-- 【课程】
+-- 课程管理
+DELETE FROM t_course;
+-- 章节管理
+DELETE FROM t_course_chapter;
+-- 课程订单信息
+DELETE FROM t_course_order;
+-- 课程学习笔记
+DELETE FROM t_course_study_note;
+-- 课程标签
+DELETE FROM t_course_tag;
+-- 课程学习记录
+DELETE FROM t_course_user_learned;
+-- 课程章节学习进度
+DELETE FROM t_couser_chapter_learning_rate;
+
+
+-- 【心理测试1v1咨询】
+-- 性格分析特殊时间配置
+DELETE FROM t_mental_analysis_special_time_config;
+-- 性格分析可预约时间
+DELETE FROM t_mental_analysis_time;
+-- 性格分析时间配置
+DELETE FROM t_mental_analysis_time_config;
+-- 性格分析预约
+DELETE FROM t_mental_appointment;
+-- 心理测试分类
+-- DELETE FROM t_mental_test_class;
+-- 心理测试选项
+DELETE FROM t_mental_test_option;
+-- 心理测试问题
+DELETE FROM t_mental_test_question;
+-- 心理测试记录
+DELETE FROM t_mental_test_record;
+-- 心理测试结果
+DELETE FROM t_mental_test_result;
+-- 心理测试结果配置
+DELETE FROM t_mental_test_result_set;
+-- 心理测试题库
+DELETE FROM t_mental_test_topic;
+-- 心理咨询1V1订单
+DELETE FROM t_order_consult_one;
+-- 心理测试订单
+DELETE FROM t_order_mental_test;
+
+
+-- 帮助
+DELETE FROM t_help;
+
+-- 心理专栏管理
+DELETE FROM t_psychological_column;
+-- 心理专栏阅读记录
+DELETE FROM t_psychological_read;
+
+-- 门店预约
+DELETE FROM t_store_appointment;
+
+-- 系统配置(H5、客服电话)
+-- DELETE FROM t_system_set;
+
+-- 用户评价表
+DELETE FROM t_user_evaluate;
+-- C端用户表
+DELETE FROM toc_customer WHERE customer_id <> 1;
\ No newline at end of file

--
Gitblit v1.7.1