Browse Source

线上购买套餐&医生权限

hurixing 1 year ago
parent
commit
14cdb5d33a
22 changed files with 996 additions and 171 deletions
  1. 1 1
      hcp-app/src/main/java/com/yingyangfly/app/controller/LoginController.java
  2. 92 0
      hcp-core/src/main/java/com/yingyangfly/core/domain/WxApplicationBlank.java
  3. 18 2
      hcp-core/src/main/java/com/yingyangfly/core/dto/WxTencentDto.java
  4. 9 0
      hcp-core/src/main/java/com/yingyangfly/core/mapper/WxApplicationBlankMapper.java
  5. 13 0
      hcp-core/src/main/java/com/yingyangfly/core/recommend/RecommendFacade.java
  6. 8 0
      hcp-core/src/main/java/com/yingyangfly/core/service/PayService.java
  7. 27 0
      hcp-core/src/main/java/com/yingyangfly/core/service/WxApplicationBlankService.java
  8. 1 1
      hcp-core/src/main/java/com/yingyangfly/core/service/impl/AppUserHeadServiceImpl.java
  9. 184 76
      hcp-core/src/main/java/com/yingyangfly/core/service/impl/AppUserService.java
  10. 7 6
      hcp-core/src/main/java/com/yingyangfly/core/service/impl/GamePlayRecordServiceImpl.java
  11. 15 9
      hcp-core/src/main/java/com/yingyangfly/core/service/impl/GameUserServiceImpl.java
  12. 84 27
      hcp-core/src/main/java/com/yingyangfly/core/service/impl/PayServiceImpl.java
  13. 143 0
      hcp-core/src/main/java/com/yingyangfly/core/service/impl/WxApplicationBlankServiceImpl.java
  14. 211 22
      hcp-core/src/main/java/com/yingyangfly/core/util/WXPayUtil.java
  15. 1 1
      hcp-large-screen/src/main/java/com/yingyangfly/large/screen/controller/LoginController.java
  16. 1 1
      hcp-platform/src/main/java/com/yingyangfly/platform/controller/DoctorController.java
  17. 12 0
      hcp-platform/src/main/java/com/yingyangfly/platform/controller/PayOrderController.java
  18. 51 0
      hcp-platform/src/main/java/com/yingyangfly/platform/controller/WxApplicationBlankController.java
  19. 92 21
      hcp-platform/src/main/java/com/yingyangfly/platform/controller/WxTencentController.java
  20. 1 1
      hcp-platform/src/main/resources/application-dev.yml
  21. 3 3
      hcp-platform/src/main/resources/application-prod.yml
  22. 22 0
      hcp-platform/src/test/java/com/yingyangfly/core/recommend/RecommendFacadeTest.java

+ 1 - 1
hcp-app/src/main/java/com/yingyangfly/app/controller/LoginController.java

@@ -60,7 +60,7 @@ public class LoginController {
     @PostMapping("/getCheckCode")
     @TraceLog
     public ResultResponse getCheckCode(String mobile){
-        return appUserService.getCheckCode(mobile);
+        return appUserService.getCheckCode(mobile,"app");
     }
 
     @ApiOperation("手机短信换取重置密码")

+ 92 - 0
hcp-core/src/main/java/com/yingyangfly/core/domain/WxApplicationBlank.java

@@ -0,0 +1,92 @@
+package com.yingyangfly.core.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.yingyangfly.core.util.Sm4JacksonSerialize;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class WxApplicationBlank {
+
+    private Long id;
+
+    /**
+     * 联系手机号
+     */
+    @JsonSerialize(using = Sm4JacksonSerialize.class)
+    private String mobile;
+
+    /**
+     * 推荐医生
+     */
+    private Long doctorId;
+
+    /**
+     * 套餐id
+     */
+    private Long packageId;
+
+    /**
+     * 订单号
+     */
+    private String payOrderId;
+
+    /**
+     * 支付发送时间
+     */
+    private String sendPayTime;
+
+    /**
+     * 支付状态  0完成
+     */
+    private String payStatus;
+
+    /**
+     * 支付金额
+     */
+    private Long payMoney;
+
+    /**
+     * 支付人id
+     */
+    private String payer;
+
+    /**
+     * 外部订单号
+     */
+    private String transactionId;
+
+    /**
+     * 商品描述
+     */
+    private String description;
+
+    /**
+     * 押金
+     */
+    private Long equipmentPledge;
+
+    /**
+     * 订单支付时间
+     */
+    private String payTime;
+
+    private String state;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+    /**
+     * 医生所属机构
+     */
+    private String orgName;
+
+
+    @TableField(exist = false)
+    private java.lang.Integer page;
+    @TableField(exist = false)
+    private java.lang.Integer limit;
+}

+ 18 - 2
hcp-core/src/main/java/com/yingyangfly/core/dto/WxTencentDto.java

@@ -12,7 +12,7 @@ public class WxTencentDto {
     private String code;
 
     // 套餐id
-    private Long packageId;
+    private String packageId;
 
     // 姓名
     private String name;
@@ -71,9 +71,25 @@ public class WxTencentDto {
      */
     private String equipmentPledge;
 
+    /**
+     * 关联医生id
+     */
+    private String doctorId;
 
     /**
-     * 推荐医生
+     * 推荐医生名称
      */
     private String doctorName;
+
+
+    @Override
+    public String toString() {
+        return "WxTencentDto{" +
+                "state='" + state + '\'' +
+                ", code='" + code + '\'' +
+                ", packageId=" + packageId +
+                ", mobile='" + mobile + '\'' +
+                ", doctorId='" + doctorId + '\'' +
+                '}';
+    }
 }

+ 9 - 0
hcp-core/src/main/java/com/yingyangfly/core/mapper/WxApplicationBlankMapper.java

@@ -0,0 +1,9 @@
+package com.yingyangfly.core.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yingyangfly.core.domain.WxApplicationBlank;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface WxApplicationBlankMapper extends BaseMapper<WxApplicationBlank> {
+}

+ 13 - 0
hcp-core/src/main/java/com/yingyangfly/core/recommend/RecommendFacade.java

@@ -79,6 +79,9 @@ public class RecommendFacade {
     @Resource
     GameTaskDetailService gameTaskDetailService;
 
+    @Resource
+    private ReviewTaskService reviewTaskService;
+
     /**
      * 给用户推荐 畅游蓝豚和 首页推荐
      *
@@ -165,13 +168,23 @@ public class RecommendFacade {
             log.info("<<<<<<<<<<<<查询符合推荐理疗任务的用户数量为空>>>>>>>>>>>>>>>");
             return;
         }
+
         List<List<AppUser>> list = Lists.partition(appUserList, 1000);
         List<GameUser> allGameUsers = Lists.newArrayList();
         for (List<AppUser> appUsers : list) {
+            List<Long> userIds = appUsers.stream().map(AppUser::getId).collect(Collectors.toList());
+            List<ReviewTask> allReviewTasks = reviewTaskService.list(
+                    new LambdaQueryWrapper<ReviewTask>().in(ReviewTask::getUserId, userIds)
+            );
+            Map<Long, List<ReviewTask>> userTaskMap = allReviewTasks.stream()
+                    .collect(Collectors.groupingBy(ReviewTask::getUserId));
             executor.execute(() -> {
                 String thName = Thread.currentThread().getName();
                 log.info("形成gameUser Thread: {}", thName);
                 for (AppUser appUser : appUsers) {
+                    if (CollectionUtil.isEmpty(userTaskMap.get(appUser.getId()))) {
+                        continue;
+                    }
                     List<Game> games = recommendationA(appUser);
                     if (CollectionUtil.isEmpty(games)) {
                         continue;

+ 8 - 0
hcp-core/src/main/java/com/yingyangfly/core/service/PayService.java

@@ -34,6 +34,14 @@ public interface PayService {
      */
     Map<String, Object> wxCall(HttpServletRequest request, HttpServletResponse response);
 
+
+    /**
+     * 微信支付回调  线上申请
+     * @param request
+     * @return
+     */
+    Map<String, Object> onLineWxCall(HttpServletRequest request, HttpServletResponse response);
+
     /**
      * 支付宝支付回调
      * @param request

+ 27 - 0
hcp-core/src/main/java/com/yingyangfly/core/service/WxApplicationBlankService.java

@@ -0,0 +1,27 @@
+package com.yingyangfly.core.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yingyangfly.core.domain.WxApplicationBlank;
+import org.springframework.stereotype.Service;
+
+@Service
+public interface WxApplicationBlankService extends IService<WxApplicationBlank> {
+
+    /**
+     * 分页查询
+     * @param wxApplicationBlank
+     * @return
+     */
+    IPage<WxApplicationBlank> selectByPage(WxApplicationBlank wxApplicationBlank);
+
+    /**
+     * 支付回调 修改
+     * @param wxApplicationBlank
+     * @return
+     */
+    Integer payUpdateApplicationBlank(WxApplicationBlank wxApplicationBlank,String orderNumber);
+
+
+    void updatePayStatusFulfill(Long id);
+}

+ 1 - 1
hcp-core/src/main/java/com/yingyangfly/core/service/impl/AppUserHeadServiceImpl.java

@@ -40,7 +40,7 @@ public class AppUserHeadServiceImpl implements AppUserHeadService {
 
         QueryWrapper<AppUserHead> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("gender_type",genderType);
-        queryWrapper.eq("org_code",tokenUtil.getCurrentUser().getOrgCode());
+//        queryWrapper.eq("org_code",tokenUtil.getCurrentUser().getOrgCode());
         List<AppUserHead> appUserHeads = appUserHeadMapper.selectList(queryWrapper);
         if(CollectionUtil.isEmpty(appUserHeads)){
             return null;

+ 184 - 76
hcp-core/src/main/java/com/yingyangfly/core/service/impl/AppUserService.java

@@ -16,6 +16,7 @@ import com.google.common.collect.Lists;
 import com.yingyangfly.common.dto.ResultResponse;
 import com.yingyangfly.common.exception.ServiceException;
 import com.yingyangfly.common.utils.DateUtils;
+import com.yingyangfly.common.utils.ids.IdUtils;
 import com.yingyangfly.core.api.ImApi;
 import com.yingyangfly.core.domain.*;
 import com.yingyangfly.core.dto.*;
@@ -400,18 +401,9 @@ public class AppUserService extends ServiceImpl<AppUserMapper, AppUser> implemen
                 appUser.setDoctorName(sysUser.getUserName());
             }
         }
-
-        //将套餐信息置空
-//        appUser.setPadNo("");
-//        appUser.setPackageId(null);
-//        appUser.setPackageName("");
-//        appUser.setEquipmentPledge(null);
-//        appUser.setOrderStartTime("");
-//        appUser.setOrderEndTime("");
-
         if (appUser.getId() == null) {
             appUser.setStatus("0");
-            appUser.setTestFlag("1");
+            appUser.setTestFlag("0");
             appUser.setCreateTime(new Date());
             appUser.setUpdateTime(new Date());
             //新增用户脑力值是0分
@@ -422,6 +414,13 @@ public class AppUserService extends ServiceImpl<AppUserMapper, AppUser> implemen
             if (ObjectUtils.isNotNull(user)){
                 return ResultResponse.fail("手机号已经存在");
             }
+            if (ObjectUtils.isNull(appUser.getDoctorId())) {
+                appUser.setDoctorId(currentUser.getUserId());
+                appUser.setDoctorName(currentUser.getUsername());
+            }
+            SysUser sysUser = sysUserMapper.selectById(appUser.getDoctorId());
+            appUser.setOrgCode(sysUser.getOrgCode());
+            appUser.setOrgName(sysUser.getOrgName());
 
             String pwd = "Wllt"+ "+" + appUser.getIdCard().substring(14, 18);
             appUser.setPwd(bCryptPasswordEncoder.encode(pwd));
@@ -495,7 +494,7 @@ public class AppUserService extends ServiceImpl<AppUserMapper, AppUser> implemen
         Page<AppUser> rowPage = new Page(appUser.getPage(), appUser.getLimit());
         QueryWrapper<AppUser> queryWrapper = new QueryWrapper<>();
         queryWrapper.orderByDesc("create_time");
-        queryWrapper.eq("org_code", tokenUtil.getCurrentUser().getOrgCode());
+
         if(!StringUtils.isEmpty(appUser.getName())){
             queryWrapper.like("name", "%"+appUser.getName()+"%");
         }
@@ -505,6 +504,25 @@ public class AppUserService extends ServiceImpl<AppUserMapper, AppUser> implemen
         if(!StringUtils.isEmpty(appUser.getStatus())){
             queryWrapper.in("status",appUser.getStatus().split(","));
         }
+        queryWrapper.eq("org_code", tokenUtil.getCurrentUser().getOrgCode());
+        SysUser sysUser = sysUserMapper.selectById(tokenUtil.getCurrentUser().getUserId());
+        if ("doctor".equals(sysUser.getRoleCodes())){
+            if (sysUser.getTitle().equals("4")){
+                if (StringUtils.isNotBlank(sysUser.getDepartmentName())){
+                    LambdaQueryWrapper<SysUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+                    lambdaQueryWrapper.eq(SysUser::getDepartmentName,sysUser.getDepartmentName());
+                    List<SysUser> sysUsers = sysUserMapper.selectList(lambdaQueryWrapper);
+                    List<Long> ids = sysUsers.stream()
+                            .map(SysUser::getId)
+                            .filter(id -> id != null)  // 显式过滤 null(可选)
+                            .collect(Collectors.toList());
+                    queryWrapper.in("doctor_id",ids);
+                }
+            }else {
+                queryWrapper.eq("doctor_id",tokenUtil.getCurrentUser().getUserId());
+            }
+        }
+
         Page<AppUser> appUserPage = appUserMapper.selectPage(rowPage, queryWrapper);
         List<AppUser> records = appUserPage.getRecords();
         QueryWrapper<LearningPackage> queryPackageWrapper = new QueryWrapper<>();
@@ -700,7 +718,7 @@ public class AppUserService extends ServiceImpl<AppUserMapper, AppUser> implemen
         return ResultResponse.success(token);
     }
 
-    public ResultResponse getCheckCode(String mobile) {
+    public ResultResponse getCheckCode(String mobile,String appType) {
         String redisKey = "hcp:sms:mobile:" + mobile;
         String checkCodeRedis = redisClient.get(redisKey, "");
         if (!StringUtils.isEmpty(checkCodeRedis)) {
@@ -711,19 +729,28 @@ public class AppUserService extends ServiceImpl<AppUserMapper, AppUser> implemen
         if (appUser == null) {
             return ResultResponse.fail("患者不存在");
         }
-        if (ObjectUtils.isNull(appUser.getOrderEndTime())){
-            return ResultResponse.success(false);
-        }
-        if (LocalDate.parse(appUser.getOrderEndTime()).isBefore(LocalDate.now())){
-            return ResultResponse.success(false);
+        if ("app".equals(appType)){
+            if (ObjectUtils.isNull(appUser.getOrderEndTime())){
+                return ResultResponse.success(false);
+            }
+            if (LocalDate.parse(appUser.getOrderEndTime()).isBefore(LocalDate.now())){
+                return ResultResponse.success(false);
+            }
         }
         Random rand = new Random();
         int randomNumber = rand.nextInt(1000000);
-//        String random = String.format("%06d", randomNumber);
-        //6位随机数
-//        Boolean isSuccess = SmgUtil.sendCheckCode(mobile, MsgTemplateEnums.GET_CHECK_CODE.getTempalteCode(), random);
-        String random = "123456";
+        String random = "";
         Boolean isSuccess = true;
+        if (active.equals("dev")){
+            random = "123456";
+            isSuccess = true;
+        }else {
+            random = String.format("%06d", randomNumber);
+            //6位随机数
+            isSuccess = SmgUtil.sendCheckCode(mobile, MsgTemplateEnums.GET_CHECK_CODE.getTempalteCode(), random);
+        }
+
+
         if (isSuccess) {
             // 防机器
             redisClient.set("hcp:sms:mobile:"+mobile,random,120);
@@ -756,10 +783,16 @@ public class AppUserService extends ServiceImpl<AppUserMapper, AppUser> implemen
         }
         Random rand = new Random();
         int randomNumber = rand.nextInt(1000000);
-//        String random = String.format("%06d", randomNumber);
-//        Boolean isSuccess = SmgUtil.sendCheckCode(mobile, MsgTemplateEnums.CHANGE_PASSWORD_CODE.getTempalteCode(), random);
-        String random = "123456";
+        String random = "";
         Boolean isSuccess = true;
+        if (active.equals("dev")){
+            random = "123456";
+            isSuccess = true;
+        }else {
+            random = String.format("%06d", randomNumber);
+            //6位随机数
+            isSuccess = SmgUtil.sendCheckCode(mobile, MsgTemplateEnums.GET_CHECK_CODE.getTempalteCode(), random);
+        }
         if (isSuccess) {
             // 防机器
             redisClient.set("hcp:sms:changePass:mobile:"+mobile,random,120);
@@ -978,33 +1011,33 @@ public class AppUserService extends ServiceImpl<AppUserMapper, AppUser> implemen
         appUserPackageHisService.saveAppUserPackageHis(appUserPackageHis);
         appUser.setOrderEndTime(packageEndDate);
         appUser.setPackageRelationId(appUserPackageHis.getId());
-        if ("1".equals(appUser.getTestFlag())){
-            // 删除未完成的测评任务
-            log.info("<<<<<<<<<<<<删除未完成的测评任务用户信息:{}>>>>>>>>>>",JSON.toJSONString(appUser));
-            List<ReviewTask> reviewTaskList =  reviewTaskService.selectUnDoneReviewTaskByUserId(appUser.getId());
-            List<Long> ids = reviewTaskList.stream().map(e -> e.getId()).collect(Collectors.toList());
-            log.info("<<<<<<<<<<<<<删除未完成的测评任务ids:{}>>>>>>>>>>>>>",JSON.toJSONString(ids));
-            reviewTaskService.removeBatchByIds(ids);
-            ReviewTask reviewTask = new ReviewTask();
-            reviewTask.setUserId(appUser.getId());
-            reviewTask.setCreateBy(appUser.getCreateBy());
-            List<String> scaleNameList = new ArrayList<>();
-            scaleNameList.add("MMSE");
-            scaleNameList.add("MOCA");
-            reviewTask.setScaleNameList(scaleNameList);
-            //生成测评任务
-            reviewTaskService.saveReviewTask(reviewTask);
-            // 记录测评任务消息
-            log.info("<<<<<<<<<<<<<发送测评任务>>用户信息:{}>>>>>>>>>>>>",JSON.toJSONString(appUser));
-            msgWarnService.save(buildMsgWarn(appUser.getId(),"B","在线测评任务", "MOCA测评任务和MMSE测评任务已生成",appUser.getOrgCode(),appUser.getOrgName()));
-            log.info("<<<<<<<<<<<<续费IM>>用户信息:{}>>>>>>>>>>",JSON.toJSONString(appUser));
-            String msgDesn = String.format("尊敬的%s,您好,您购买的%s,已经生效,截止日期为%s",appUser.getName(),learningPackage.getPackageName(),appUser.getOrderEndTime());
-            msgWarnService.save(buildMsgWarn(appUser.getId(),"A","缴费通知",msgDesn,appUser.getOrgCode(),appUser.getOrgName()));
-        }else {
+//        if ("1".equals(appUser.getTestFlag())){
+//            // 删除未完成的测评任务
+//            log.info("<<<<<<<<<<<<删除未完成的测评任务用户信息:{}>>>>>>>>>>",JSON.toJSONString(appUser));
+//            List<ReviewTask> reviewTaskList =  reviewTaskService.selectUnDoneReviewTaskByUserId(appUser.getId());
+//            List<Long> ids = reviewTaskList.stream().map(e -> e.getId()).collect(Collectors.toList());
+//            log.info("<<<<<<<<<<<<<删除未完成的测评任务ids:{}>>>>>>>>>>>>>",JSON.toJSONString(ids));
+//            reviewTaskService.removeBatchByIds(ids);
+//            ReviewTask reviewTask = new ReviewTask();
+//            reviewTask.setUserId(appUser.getId());
+//            reviewTask.setCreateBy(appUser.getCreateBy());
+//            List<String> scaleNameList = new ArrayList<>();
+//            scaleNameList.add("MMSE");
+//            scaleNameList.add("MOCA");
+//            reviewTask.setScaleNameList(scaleNameList);
+//            //生成测评任务
+//            reviewTaskService.saveReviewTask(reviewTask);
+//            // 记录测评任务消息
+//            log.info("<<<<<<<<<<<<<发送测评任务>>用户信息:{}>>>>>>>>>>>>",JSON.toJSONString(appUser));
+//            msgWarnService.save(buildMsgWarn(appUser.getId(),"B","在线测评任务", "MOCA测评任务和MMSE测评任务已生成",appUser.getOrgCode(),appUser.getOrgName()));
+//            log.info("<<<<<<<<<<<<续费IM>>用户信息:{}>>>>>>>>>>",JSON.toJSONString(appUser));
+//            String msgDesn = String.format("尊敬的%s,您好,您购买的%s,已经生效,截止日期为%s",appUser.getName(),learningPackage.getPackageName(),appUser.getOrderEndTime());
+//            msgWarnService.save(buildMsgWarn(appUser.getId(),"A","缴费通知",msgDesn,appUser.getOrgCode(),appUser.getOrgName()));
+//        }else {
             log.info("<<<<<<<<<<<<<<im续费>>用户信息:{}>>>>>>>>>>>>>>>>>",JSON.toJSONString(appUser));
             String msgDesn = String.format("尊敬的%s,您好,您购买的%s,已经生效,截止日期为%s",appUser.getName(),learningPackage.getPackageName(),appUser.getOrderEndTime());
             msgWarnService.save(buildMsgWarn(appUser.getId(),"A","缴费通知",msgDesn,appUser.getOrgCode(),appUser.getOrgName()));
-        }
+//        }
         appUserMapper.updateById(appUser);
     }
 
@@ -1020,38 +1053,66 @@ public class AppUserService extends ServiceImpl<AppUserMapper, AppUser> implemen
             redisClient.del(String.format("%s%s", "token:app:", Sm4Util.decrypt(appUser.getMobile())));
         }
     }
+    @Value("${spring.profiles.active}")
+    private String active;
 
 
     @Transactional(rollbackFor = Exception.class)
     public WxPayJsApiPreVO wXTencentSave(WxTencentDto wxTencentDto) throws Exception {
-        // 第一步新增患者
-        AppUser appUser = EntityConverter.convertToTarget(wxTencentDto, AppUser.class);
-        if(StringUtils.isEmpty(appUser.getAvatar()) && !StringUtils.isEmpty(appUser.getGender())){
-            String avatar = appUserHeadService.randomGetOneHeadByGender2(appUser.getGender(),"system");
-            appUser.setAvatar(avatar);
+
+        AppUser user = selectByMobile(Sm4Util.encrypt(wxTencentDto.getMobile()), null);
+        if (active.equals("dev")){
+            wxTencentDto.setEquipmentPledge("1");
+        }else {
+            wxTencentDto.setEquipmentPledge("120000");
         }
-        appUser.setStatus("0");
-        appUser.setTestFlag("1");
-        appUser.setCreateTime(new Date());
-        appUser.setUpdateTime(new Date());
+        AppUser appUser = EntityConverter.convertToTarget(wxTencentDto, AppUser.class);
+        appUser.setPackageId(null);
+        if (ObjectUtils.isNull(user)){
+            // 第一步新增患者
+            if(StringUtils.isEmpty(appUser.getAvatar()) && !StringUtils.isEmpty(appUser.getGender())){
+                String avatar = appUserHeadService.randomGetOneHeadByGender2(appUser.getGender(),"system");
+                appUser.setAvatar(avatar);
+            }
+
+            if(wxTencentDto.getDoctorId()!=null){
+                SysUser sysUser = sysUserMapper.selectById(wxTencentDto.getDoctorId());
+                if(sysUser != null){
+                    appUser.setDoctorName(sysUser.getUserName());
+                    appUser.setDoctorId(sysUser.getId());
+                    appUser.setOrgCode(sysUser.getOrgCode());
+                    appUser.setOrgName(sysUser.getOrgName());
+                }
+            }else {
+                appUser.setOrgCode("onlineUser");
+                appUser.setOrgName("线上用户");
+            }
+            appUser.setStatus("0");
+            appUser.setTestFlag("0");
+            appUser.setCreateTime(new Date());
+            appUser.setUpdateTime(new Date());
+            appUser.setPatientSource("1");
+
+            String pwd = "Wllt"+ "+" + appUser.getIdCard().substring(14, 18);
+            appUser.setPwd(bCryptPasswordEncoder.encode(pwd));
+            //新增用户脑力值是0分
+            appUser.setMentalEnergy(0);
+            appUser.setCreateBy("微信公众号");
 
-        String pwd = "Wllt"+ "+" + appUser.getIdCard().substring(14, 18);
-        appUser.setPwd(bCryptPasswordEncoder.encode(pwd));
-        //新增用户脑力值是0分
-        appUser.setMentalEnergy(0);
-        appUser.setCreateBy("微信公众号");
-        appUser.setOrgCode("onlineUser");
-        appUser.setOrgName("线上用户");
-        appUser.setCreateTime(new Date());
-        appUserMapper.insert(appUser);
-        //首次登陆欢迎语
-        log.info("<<<<<<<<<<<<发送首次登陆欢迎语IM>>用户信息:{}>>>>>>>>>>",JSON.toJSONString(appUser));
-        String msgDesn = String.format("欢迎%s使用未来蓝豚康复平台!为您提供专业的认知康复支持和训练。帮助您提升认知能力,重建自信。小豚期待与您一同启程!",appUser.getName());
-        msgWarnService.save(buildMsgWarn(appUser.getId(),"B","欢迎加入未来蓝豚",msgDesn,appUser.getOrgCode(),appUser.getOrgName()));
-        // 游戏推荐
-        log.info("<<<<<<<<<<<<<<<<患者推送蓝豚和 首页 游戏>>>>>>>>>>>>>>>>");
-        recommendFacade.recommendGameUserJobByAppUser(appUser.getId());
 
+            appUser.setCreateTime(new Date());
+            appUserMapper.insert(appUser);
+            //首次登陆欢迎语
+            log.info("<<<<<<<<<<<<发送首次登陆欢迎语IM>>用户信息:{}>>>>>>>>>>",JSON.toJSONString(appUser));
+            String msgDesn = String.format("欢迎%s使用未来蓝豚康复平台!为您提供专业的认知康复支持和训练。帮助您提升认知能力,重建自信。小豚期待与您一同启程!",appUser.getName());
+            msgWarnService.save(buildMsgWarn(appUser.getId(),"B","欢迎加入未来蓝豚",msgDesn,appUser.getOrgCode(),appUser.getOrgName()));
+            // 游戏推荐
+            log.info("<<<<<<<<<<<<<<<<患者推送蓝豚和 首页 游戏>>>>>>>>>>>>>>>>");
+            recommendFacade.recommendGameUserJobByAppUser(appUser.getId());
+        }else {
+            appUser.setId(user.getId());
+            appUserMapper.updateById(appUser);
+        }
         LearningPackage learningPackage = learnPackageMapper.selectById(wxTencentDto.getPackageId());
 
         BigDecimal price = BigDecimal.valueOf(learningPackage.getPrice());
@@ -1063,10 +1124,10 @@ public class AppUserService extends ServiceImpl<AppUserMapper, AppUser> implemen
         payOrder.setDescription("您的训练套餐是:" + learningPackage.getPackageName() + ",总金额是:" + AmountUtils.F2Y4STR(Long.valueOf(totalAmount.toString())) + "元,其中押金:" + AmountUtils.F2Y4STR(Long.valueOf(wxTencentDto.getEquipmentPledge())) + "元");
         payOrder.setEquipmentPledge(wxTencentDto.getEquipmentPledge());
         payOrder.setOrderType("A,B");
-        payOrder.setOrgCode("onlineUser");
-        payOrder.setOrgName("线上用户");
+        payOrder.setOrgCode(appUser.getOrgCode());
+        payOrder.setOrgName(appUser.getOrgName());
         payOrder.setState(wxTencentDto.getState());
-        payOrder.setRelationId(wxTencentDto.getPackageId());
+        payOrder.setRelationId(Long.valueOf(wxTencentDto.getPackageId()));
         payOrder.setPadNo("00000001");
         payOrder.setPayMethod("1");
         payOrder.setPayMoney(Long.valueOf(totalAmount.toString()));
@@ -1076,4 +1137,51 @@ public class AppUserService extends ServiceImpl<AppUserMapper, AppUser> implemen
         payOrder.setCreateTime(new Date());
         return payService.createJSAPIOrder(payOrder,wxTencentDto.getCode());
     }
+
+
+    @Resource
+    private WxApplicationBlankService wxApplicationBlankService;
+
+    @Resource
+    private WXPayUtil wxPayUtil;
+
+
+    @Transactional(rollbackFor = Exception.class)
+    public WxPayJsApiPreVO wxSavePhone(WxTencentDto wxTencentDto) throws Exception {
+        if (active.equals("dev")){
+            wxTencentDto.setEquipmentPledge("1");
+        }else {
+            wxTencentDto.setEquipmentPledge("120000");
+        }
+        LearningPackage learningPackage = learnPackageMapper.selectById(Long.valueOf(wxTencentDto.getPackageId()));
+
+        BigDecimal price = BigDecimal.valueOf(learningPackage.getPrice());
+        BigDecimal pledge = new BigDecimal(wxTencentDto.getEquipmentPledge().trim());
+        BigDecimal totalAmount = price.add(pledge);
+
+        WxApplicationBlank wxApplicationBlank = new WxApplicationBlank();
+
+        wxApplicationBlank.setMobile(wxTencentDto.getMobile());
+        wxApplicationBlank.setDoctorId(Long.valueOf(wxTencentDto.getDoctorId()));
+        SysUser sysUser = sysUserMapper.selectById(wxApplicationBlank.getDoctorId());
+        wxApplicationBlank.setOrgName(sysUser.getOrgName());
+        wxApplicationBlank.setPackageId(Long.valueOf(wxTencentDto.getPackageId()));
+        // 商家系统生成订单号  唯一且不可重复,即使关闭订单后相同订单号也无法再次创建订单
+        String orderNo = "LT_" + IdUtils.getNextId();
+
+        wxApplicationBlank.setPayOrderId(orderNo);
+        wxApplicationBlank.setSendPayTime(DateUtils.getTime());
+        //支付状态1.支付中 2.支付成功 3.支付失败,4退款中,5已退款,6已关闭  0 完成
+        wxApplicationBlank.setPayStatus("1");
+        wxApplicationBlank.setPayMoney(Long.valueOf(totalAmount.toString()));
+        wxApplicationBlank.setDescription("您的训练套餐是:" + learningPackage.getPackageName() + ",总金额是:" + AmountUtils.F2Y4STR(Long.valueOf(totalAmount.toString())) + "元,其中押金:" + AmountUtils.F2Y4STR(Long.valueOf(wxTencentDto.getEquipmentPledge())) + "元");
+        wxApplicationBlank.setEquipmentPledge(Long.valueOf(wxTencentDto.getEquipmentPledge()));
+        wxApplicationBlank.setState(wxTencentDto.getState());
+        wxApplicationBlank.setCreateTime(new Date());
+        wxApplicationBlank.setUpdateTime(new Date());
+        wxApplicationBlankService.save(wxApplicationBlank);
+
+        String prepayId = wxPayUtil.onLineWXJSAPIPay(wxApplicationBlank, wxTencentDto.getCode());
+        return wxPayUtil.convertWxPayJsApiPreInfo(prepayId);
+    }
 }

+ 7 - 6
hcp-core/src/main/java/com/yingyangfly/core/service/impl/GamePlayRecordServiceImpl.java

@@ -128,16 +128,17 @@ public class GamePlayRecordServiceImpl implements GamePlayRecordService {
                 queryWrapper.eq("task_id", gameTask.getId());
                 GameTaskDetail gameTaskDetail = gameTaskDetailMapper.selectOne(queryWrapper);
                 gamePlayRecord.setGameRelevancyId(gameTaskDetail.getId());
-                if ("0".equals(gamePlayRecord.getIsPass())  ){
+                Integer playTime = gamePlayRecord.getDuration();
+                if (ObjectUtils.isNotNull(gameTaskDetail.getPlayTime())){
+                    playTime = playTime + gameTaskDetail.getPlayTime();
+                }
+                gameTaskDetail.setPlayTime(playTime);
+                if ("0".equals(gamePlayRecord.getIsPass())){
                     Integer currentLevel = gamePlayRecord.getGameLevel();
                     gameTaskDetail.setGameLevel(currentLevel + 1 > gameTaskDetail.getTotalNum().intValue() ? currentLevel : currentLevel + 1);
                     Integer gameScore = gamePlayRecord.getGameScore()+gameTaskDetail.getGameScore();
                     gameTaskDetail.setGameScore(gameScore);
-                    Integer playTime = gamePlayRecord.getDuration();
-                    if (ObjectUtils.isNotNull(gameTaskDetail.getPlayTime())){
-                        playTime = playTime + gameTaskDetail.getPlayTime();
-                    }
-                    gameTaskDetail.setPlayTime(playTime);
+
                     if (gameTaskDetail.getTotalNum().intValue() == currentLevel) {
                         gameTaskDetail.setStatus("0");
                         gameTaskDetail.setIsPass(gamePlayRecord.getIsPass());

+ 15 - 9
hcp-core/src/main/java/com/yingyangfly/core/service/impl/GameUserServiceImpl.java

@@ -18,6 +18,7 @@ import com.yingyangfly.core.dto.GameDto;
 import com.yingyangfly.core.mapper.*;
 import com.yingyangfly.core.security.util.TokenUtil;
 import com.yingyangfly.core.service.*;
+import io.swagger.models.auth.In;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -373,18 +374,23 @@ public class GameUserServiceImpl extends ServiceImpl<GameUserMapper, GameUser> i
                     }else {
                         // 不显示
                         List<Long> gameUserNones = collect.get("1");
-                        Collections.shuffle(gameUserNones);
-                        // 将不显示中的 4个放入 显示列表中
-                        gameUserIsShowList.addAll(gameUserNones.stream().limit(4).collect(Collectors.toList()));
 
+                        Integer nonesNum = 4;
+                        Collections.shuffle(gameUserNones);
                         if (gameUserNones.size()>=4) {
-                            Collections.shuffle(gameUserIsShows);
-                            // 将显示中 4个放入 不显示列表中
-                            gameUserNoneList.addAll(gameUserIsShows.stream().limit(4).collect(Collectors.toList()));
+                            // 将不显示中的 4个放入 显示列表中
+                            gameUserIsShowList.addAll(gameUserNones.stream().limit(4).collect(Collectors.toList()));
                         } else {
-                            Collections.shuffle(gameUserIsShows);
-                            // 将显示中 4个放入 不显示列表中
-                            gameUserNoneList.addAll(gameUserIsShows.stream().limit(gameUserNones.size()).collect(Collectors.toList()));
+                            nonesNum = gameUserNones.size();
+                            // 将不显示中的 gameUserNones.size()个放入 显示列表中
+                            gameUserIsShowList.addAll(gameUserNones.stream().limit(gameUserNones.size()).collect(Collectors.toList()));
+                        }
+
+                        Collections.shuffle(gameUserIsShows);
+                        Integer num = gameUserIsShows.size() + nonesNum - 8;
+                        if (num > 0) {
+                            // 将显示中game id 放入 不显示列表中
+                            gameUserNoneList.addAll(gameUserIsShows.stream().limit(num).collect(Collectors.toList()));
                         }
                     }
                 }

+ 84 - 27
hcp-core/src/main/java/com/yingyangfly/core/service/impl/PayServiceImpl.java

@@ -74,7 +74,7 @@ public class PayServiceImpl<createWXOrder> implements PayService {
     @Autowired
     private AppUserPackageHisService appUserPackageHisService;
     @Autowired
-    ReviewTaskService reviewTaskService ;
+    ReviewTaskService reviewTaskService;
     @Autowired
     RecommendFacade recommendFacade;
     @Autowired
@@ -82,6 +82,9 @@ public class PayServiceImpl<createWXOrder> implements PayService {
     @Autowired
     private CacheUserService cacheUserService;
 
+    @Resource
+    private WxApplicationBlankService wxApplicationBlankService;
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -641,7 +644,7 @@ public class PayServiceImpl<createWXOrder> implements PayService {
                 log.info("<<<<<<<<<<<记录租赁相关历史>>>>>>>>>>>>");
                 //做租赁相关的操作
                 // update by hpt on 20231102 只有押金才记录
-                if (!appUser.getOrgCode().equals("onlineUser")){
+                if (appUser.getPatientSource().equals("0")){
                     appUserService.doRentRecord(appUser);
                 }
             }
@@ -703,33 +706,33 @@ public class PayServiceImpl<createWXOrder> implements PayService {
         appUser.setOrderEndTime(packageEndDate);
         appUser.setPackageRelationId(appUserPackageHis.getId());
         appUser.setPackageId(payOrder.getRelationId());
-        if("1".equals(appUser.getTestFlag())){
-            //删除未完成的测评任务
-            log.info("<<<<<<<<<<<<删除未完成的测评任务用户信息:{}>>>>>>>>>>",JSON.toJSONString(appUser));
-            List<ReviewTask> reviewTaskList =  reviewTaskService.selectUnDoneReviewTaskByUserId(appUser.getId());
-            List<Long> ids = reviewTaskList.stream().map(e -> e.getId()).collect(Collectors.toList());
-            log.info("<<<<<<<<<<<<<删除未完成的测评任务ids:{}>>>>>>>>>>>>>",JSON.toJSONString(ids));
-            reviewTaskService.removeBatchByIds(ids);
-            ReviewTask reviewTask = new ReviewTask();
-            reviewTask.setUserId(payOrder.getUserId());
-            reviewTask.setCreateBy(appUser.getCreateBy());
-            List<String> scaleNameList = new ArrayList<>();
-            scaleNameList.add("MMSE");
-            scaleNameList.add("MOCA");
-            reviewTask.setScaleNameList(scaleNameList);
-            //生成测评任务
-            reviewTaskService.saveReviewTask(reviewTask);
-            //记录测评任务消息
-            log.info("<<<<<<<<<<<<发送测评任务IM>>用户信息:{}>>>>>>>>>>",JSON.toJSONString(appUser));
-            msgWarnService.save(buildMsgWarn(payOrder.getUserId(),"B","在线测评任务", "MOCA测评任务和MMSE测评任务已生成",payOrder.getOrgCode(),payOrder.getOrgName()));
-            log.info("<<<<<<<<<<<<续费IM>>用户信息:{}>>>>>>>>>>",JSON.toJSONString(appUser));
-            String msgDesn = String.format("尊敬的%s,您好,您购买的%s,已经生效,截止日期为%s",appUser.getName(),learningPackage.getPackageName(),appUser.getOrderEndTime());
-            msgWarnService.save(buildMsgWarn(payOrder.getUserId(),"A","缴费通知",msgDesn,payOrder.getOrgCode(),payOrder.getOrgName()));
-        }else{
+//        if("1".equals(appUser.getTestFlag())){
+//            //删除未完成的测评任务
+//            log.info("<<<<<<<<<<<<删除未完成的测评任务用户信息:{}>>>>>>>>>>",JSON.toJSONString(appUser));
+//            List<ReviewTask> reviewTaskList =  reviewTaskService.selectUnDoneReviewTaskByUserId(appUser.getId());
+//            List<Long> ids = reviewTaskList.stream().map(e -> e.getId()).collect(Collectors.toList());
+//            log.info("<<<<<<<<<<<<<删除未完成的测评任务ids:{}>>>>>>>>>>>>>",JSON.toJSONString(ids));
+//            reviewTaskService.removeBatchByIds(ids);
+//            ReviewTask reviewTask = new ReviewTask();
+//            reviewTask.setUserId(payOrder.getUserId());
+//            reviewTask.setCreateBy(appUser.getCreateBy());
+//            List<String> scaleNameList = new ArrayList<>();
+//            scaleNameList.add("MMSE");
+//            scaleNameList.add("MOCA");
+//            reviewTask.setScaleNameList(scaleNameList);
+//            //生成测评任务
+//            reviewTaskService.saveReviewTask(reviewTask);
+//            //记录测评任务消息
+//            log.info("<<<<<<<<<<<<发送测评任务IM>>用户信息:{}>>>>>>>>>>",JSON.toJSONString(appUser));
+//            msgWarnService.save(buildMsgWarn(payOrder.getUserId(),"B","在线测评任务", "MOCA测评任务和MMSE测评任务已生成",payOrder.getOrgCode(),payOrder.getOrgName()));
+//            log.info("<<<<<<<<<<<<续费IM>>用户信息:{}>>>>>>>>>>",JSON.toJSONString(appUser));
+//            String msgDesn = String.format("尊敬的%s,您好,您购买的%s,已经生效,截止日期为%s",appUser.getName(),learningPackage.getPackageName(),appUser.getOrderEndTime());
+//            msgWarnService.save(buildMsgWarn(payOrder.getUserId(),"A","缴费通知",msgDesn,payOrder.getOrgCode(),payOrder.getOrgName()));
+//        }else{
             log.info("<<<<<<<<<<<<续费IM>>用户信息:{}>>>>>>>>>>",JSON.toJSONString(appUser));
             String msgDesn = String.format("尊敬的%s,您好,您购买的%s,已经生效,截止日期为%s",appUser.getName(),learningPackage.getPackageName(),appUser.getOrderEndTime());
             msgWarnService.save(buildMsgWarn(payOrder.getUserId(),"A","缴费通知",msgDesn,payOrder.getOrgCode(),payOrder.getOrgName()));
-        }
+//        }
     }
 
 
@@ -922,8 +925,62 @@ public class PayServiceImpl<createWXOrder> implements PayService {
         return null;
     }
 
+    @Override
+    public Map<String, Object> onLineWxCall(HttpServletRequest request, HttpServletResponse response) {
+        log.info("处理微信支付回调通知");
+        //应答体
+        Map<String, Object> map = new HashMap<>();
+
+        JSONObject callback = null;
+        try {
+            callback = wxPayUtil.getCallback(request);
+            //商户平台订单号
+            String orderNumber = callback.getString("out_trade_no");
+            //微信支付交易号
+            String transactionId = callback.getString("transaction_id");
+            String tradeState = callback.getString("trade_state");
+            String payer = callback.getString("payer");
+            //接口调用的幂等性:无论接口被调用多少次,产生的结果是一致的
+            WxApplicationBlank wxApplicationBlank = new WxApplicationBlank();
+            LambdaQueryWrapper<WxApplicationBlank> lambdaQueryWrapper = new LambdaQueryWrapper();
+            lambdaQueryWrapper.eq(WxApplicationBlank::getPayOrderId,orderNumber);
+            String payStatus = wxApplicationBlankService.getOne(lambdaQueryWrapper).getPayStatus();
+            //该订单已经支付
+            if (payStatus.equals("2")) {
+                log.info("订单已被处理");
+                response.setStatus(200);
+                map.put("code", "SUCCESS");
+                map.put("message", "成功");
+                return map;
+            }
+            if (tradeState.equals("SUCCESS")) {
+                response.setStatus(200);
+                //根据订单号更新订单状态
+                wxApplicationBlank.setPayStatus("2");
+                wxApplicationBlank.setTransactionId(transactionId);
+                JSONObject jsonObject = JSONObject.parseObject(payer);
+                wxApplicationBlank.setPayer(jsonObject.getString("openid"));
+                wxApplicationBlank.setPayTime(DateUtils.getTime());
+                wxApplicationBlank.setUpdateTime(new Date());
+                wxApplicationBlankService.payUpdateApplicationBlank(wxApplicationBlank,orderNumber);
+
+                response.setStatus(200);
+                map.put("code", "SUCCESS");
+                map.put("message", "成功");
+                return map;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            response.setStatus(500);
+            map.put("code", "ERROR");
+            map.put("message", "失败");
+            return map;
+        }
+        return null;
+    }
+
 
-    private void    updateStatusByOrderNo(PayOrder payOrder,Boolean isRefund,Boolean isSub) {
+    private void updateStatusByOrderNo(PayOrder payOrder,Boolean isRefund,Boolean isSub) {
         log.info("<<<<<<<<<<<<更改订单状态payOrder:{}, isRefund:{},isSub:{}>>>>>>>>>>",JSON.toJSONString(payOrder),isRefund,isSub);
         QueryWrapper<PayOrder> queryWrapper = new QueryWrapper<>();
         if(isSub){

+ 143 - 0
hcp-core/src/main/java/com/yingyangfly/core/service/impl/WxApplicationBlankServiceImpl.java

@@ -0,0 +1,143 @@
+package com.yingyangfly.core.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yingyangfly.common.utils.ids.IdUtils;
+import com.yingyangfly.core.domain.AppUser;
+import com.yingyangfly.core.domain.PayOrder;
+import com.yingyangfly.core.domain.SysUser;
+import com.yingyangfly.core.domain.WxApplicationBlank;
+import com.yingyangfly.core.mapper.AppUserMapper;
+import com.yingyangfly.core.mapper.PayOrderMapper;
+import com.yingyangfly.core.mapper.WxApplicationBlankMapper;
+import com.yingyangfly.core.security.util.TokenUtil;
+import com.yingyangfly.core.service.WxApplicationBlankService;
+import com.yingyangfly.core.util.AmountUtils;
+import com.yingyangfly.core.util.Sm4Util;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Service
+public class WxApplicationBlankServiceImpl extends ServiceImpl<WxApplicationBlankMapper, WxApplicationBlank> implements WxApplicationBlankService {
+
+
+    @Resource
+    private AppUserMapper appUserMapper;
+
+    @Resource
+    private TokenUtil tokenUtil;
+
+    @Resource
+    private PayOrderMapper payOrderMapper;
+
+    @Resource
+    private SysUserService sysUserService;
+
+    @Override
+    public IPage<WxApplicationBlank> selectByPage(WxApplicationBlank wxApplicationBlank) {
+        LambdaQueryWrapper<WxApplicationBlank> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        if (StringUtils.isNotEmpty(wxApplicationBlank.getMobile())){
+            lambdaQueryWrapper.eq(WxApplicationBlank::getMobile,wxApplicationBlank.getMobile());
+        }
+        if (StringUtils.isNotEmpty(wxApplicationBlank.getPayStatus())){
+            lambdaQueryWrapper.eq(WxApplicationBlank::getPayStatus,wxApplicationBlank.getPayStatus());
+        }
+        lambdaQueryWrapper.orderByDesc(WxApplicationBlank::getPayTime);
+        Page<WxApplicationBlank> page = new Page<>(wxApplicationBlank.getPage(),wxApplicationBlank.getLimit());
+        Page<WxApplicationBlank> wxApplicationBlankPage = baseMapper.selectPage(page, lambdaQueryWrapper);
+        return wxApplicationBlankPage;
+    }
+
+    @Override
+    public Integer payUpdateApplicationBlank(WxApplicationBlank wxApplicationBlank,String orderNumber) {
+        LambdaQueryWrapper<WxApplicationBlank> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(WxApplicationBlank::getPayOrderId,orderNumber);
+        return baseMapper.update(wxApplicationBlank,lambdaQueryWrapper);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updatePayStatusFulfill(Long id) {
+        WxApplicationBlank wxApplicationBlank1 = baseMapper.selectById(id);
+        if (!wxApplicationBlank1.getPayStatus().equals("2")) {
+            throw new RuntimeException("患者未支付或申请单已完成");
+        }
+        LambdaQueryWrapper<AppUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(AppUser::getMobile,wxApplicationBlank1.getMobile());
+        AppUser appUser = appUserMapper.selectOne(lambdaQueryWrapper);
+        if (ObjectUtils.isEmpty(appUser)) {
+            throw new RuntimeException("请先新增患者信息");
+        }
+
+        // 修改申请单为完成
+        WxApplicationBlank wxApplicationBlank = new WxApplicationBlank();
+        wxApplicationBlank.setId(id);
+        wxApplicationBlank.setPayStatus("0");
+        baseMapper.updateById(wxApplicationBlank);
+
+        //  修改患者所属机构
+        SysUser sysUser = sysUserService.getById(wxApplicationBlank1.getDoctorId());  // 医生信息
+        AppUser UpdateAppUser = new AppUser();
+        UpdateAppUser.setOrgCode(sysUser.getOrgCode());
+        UpdateAppUser.setOrgName(sysUser.getOrgName());
+        UpdateAppUser.setDoctorId(wxApplicationBlank1.getDoctorId());
+        UpdateAppUser.setDoctorName(sysUser.getUserName());
+        appUserMapper.update(UpdateAppUser,lambdaQueryWrapper);
+
+        // 创建订单
+        PayOrder payOrderA = new PayOrder();
+        payOrderA.setUserId(appUser.getId());
+        payOrderA.setRelationId(wxApplicationBlank1.getPackageId());
+        payOrderA.setPayOrderId(wxApplicationBlank1.getPayOrderId());
+        payOrderA.setDescription(wxApplicationBlank1.getDescription());
+        payOrderA.setPayer(wxApplicationBlank1.getPayer());
+        long payMoney = wxApplicationBlank1.getPayMoney() - wxApplicationBlank1.getEquipmentPledge();
+        payOrderA.setPayMoney(payMoney);
+        payOrderA.setPayMethod("1");
+        payOrderA.setSendPayTime(wxApplicationBlank1.getSendPayTime());
+        payOrderA.setPayStatus(wxApplicationBlank1.getPayStatus());
+        payOrderA.setCreateTime(new Date());
+        payOrderA.setUpdateTime(new Date());
+        payOrderA.setCreateBy(tokenUtil.getCurrentUser().getName());
+        payOrderA.setUpdateBy(tokenUtil.getCurrentUser().getName());
+        payOrderA.setTransactionId(wxApplicationBlank1.getTransactionId());
+        payOrderA.setUserName(appUser.getName());
+        payOrderA.setOrderType("A");
+        payOrderA.setOrgCode(appUser.getOrgCode());
+        payOrderA.setOrgName(appUser.getOrgName());
+        payOrderA.setMobile(appUser.getMobile());
+        payOrderMapper.insert(payOrderA);
+
+        PayOrder payOrderB = new PayOrder();
+        payOrderB.setUserId(appUser.getId());
+        payOrderB.setRelationId(wxApplicationBlank1.getPackageId());
+        String orderNo = "LT_SUB_" + IdUtils.getNextId();
+        payOrderB.setPayOrderId(orderNo);
+        payOrderB.setDescription(wxApplicationBlank1.getDescription());
+        payOrderB.setPayer(wxApplicationBlank1.getPayer());
+        payOrderB.setPayMoney(wxApplicationBlank1.getEquipmentPledge());
+        payOrderB.setPayMethod("1");
+        payOrderB.setSendPayTime(wxApplicationBlank1.getSendPayTime());
+        payOrderB.setPayStatus(wxApplicationBlank1.getPayStatus());
+        payOrderB.setCreateTime(new Date());
+        payOrderB.setUpdateTime(new Date());
+        payOrderB.setCreateBy(tokenUtil.getCurrentUser().getName());
+        payOrderB.setUpdateBy(tokenUtil.getCurrentUser().getName());
+        payOrderB.setTransactionId(wxApplicationBlank1.getTransactionId());
+        payOrderB.setUserName(appUser.getName());
+        payOrderB.setOrderType("B");
+        payOrderB.setOrgCode(appUser.getOrgCode());
+        payOrderB.setOrgName(appUser.getOrgName());
+        payOrderB.setPId(payOrderA.getPayOrderId());
+        payOrderB.setMobile(appUser.getMobile());
+        payOrderMapper.insert(payOrderB);
+    }
+}

+ 211 - 22
hcp-core/src/main/java/com/yingyangfly/core/util/WXPayUtil.java

@@ -19,8 +19,10 @@ import com.yingyangfly.common.utils.ids.IdUtils;
 import com.yingyangfly.core.config.WechatConfig;
 import com.yingyangfly.core.domain.OrgMerchant;
 import com.yingyangfly.core.domain.PayOrder;
+import com.yingyangfly.core.domain.WxApplicationBlank;
 import com.yingyangfly.core.service.OrgMerchantService;
 import com.yingyangfly.core.vo.WxPayJsApiPreVO;
+import com.yingyangfly.redis.client.RedisClient;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -31,6 +33,7 @@ import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.util.EntityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -65,6 +68,10 @@ public class WXPayUtil {
     @Resource
     private WechatConfig wechatConfig;
 
+
+    @Resource
+    private RedisClient redisClient;
+
     /**
      * 获取微信回调结果
      *
@@ -294,7 +301,7 @@ public class WXPayUtil {
                 "\"out_trade_no\": \"" + payOrder.getPayOrderId() + "\"," +
                 "\"appid\": \"" + appId + "\"," +
                 "\"description\": \"" + payOrder.getDescription() + "\"," +
-                "\"attach\": \"" + "payOrder.getAttach()" + "\"," +
+                "\"attach\": \"" + payOrder.getAttach() + "\"," +
                 // --- JSAPI 新增参数 ---
                 "\"payer\": {" +
                 "\"openid\": \"" + getOpenId(Code) + "\"" +  // 必须传递用户的openid
@@ -339,6 +346,101 @@ public class WXPayUtil {
         }
     }
 
+
+
+    /**
+     * 微信JSAPI 下单接口   线上扫码
+     * @param wxApplicationBlank
+     * @param Code
+     * @return
+     * @throws Exception
+     */
+    public String onLineWXJSAPIPay(WxApplicationBlank wxApplicationBlank, String Code)throws Exception{
+        log.info("线上申请单信息:{}",wxApplicationBlank);
+        //根据orgCode获取商户信息
+        OrgMerchant orgMer = new OrgMerchant();
+        orgMer.setType("1");
+        orgMer.setOrgCode("system");
+        OrgMerchant orgMerchant = orgMerchantService.selectOne(orgMer);
+        String privateKey = orgMerchant.getPrivateKey().replace("-----BEGIN PRIVATE KEY-----", "")
+                .replace("-----END PRIVATE KEY-----", "")
+                .replaceAll("\\s+", "");
+        String appId= orgMerchant.getAppId();
+        String mchId = orgMerchant.getMchId();
+        String mchSerialNo= orgMerchant.getMchSerialNo();
+        String apiV3Key= orgMerchant.getApiKey();
+        String wxNotifyUrl= orgMerchant.getNotifyUrl();
+        String wxReturnNotifyUrl= orgMerchant.getReturnNotifyUrl();
+        String gateway= orgMerchant.getGateway();
+        // 修改1:接口地址改为JSAPI
+        HttpPost httpPost = new HttpPost(orgMerchant.getGateway() + "/v3/pay/transactions/jsapi");
+        // 下单接口金额单位为分
+        log.info("下单金额:{}",wxApplicationBlank.getPayMoney());
+        Long payMoney = wxApplicationBlank.getPayMoney();
+        log.info("下单金额:{}",payMoney);
+        //获取10分钟之后的时间,作为订单的结束时间
+        Calendar nowTime = Calendar.getInstance();
+        nowTime.add(Calendar.MINUTE, 10);
+        String format = DateUtil.format(nowTime.getTime(), "yyyy-MM-dd'T'HH:mm:ssXXX");
+
+        // 请求body参数
+        // 支付成功回调通知接口 notify_url,必须为https
+        // 修改2:请求body中增加 payer.openid 参数(JSAPI必传)
+        String reqdata = "{" +
+                "\"time_expire\": \"" + format + "\"," +
+                "\"amount\": {" +
+                "\"total\": " + payMoney + "," +
+                "\"currency\": \"CNY\"" +
+                "}," +
+                "\"mchid\": \"" + mchId + "\"," +
+                "\"out_trade_no\": \"" + wxApplicationBlank.getPayOrderId() + "\"," +
+                "\"appid\": \"" + appId + "\"," +
+                "\"description\": \"" + wxApplicationBlank.getDescription() + "\"," +
+                "\"attach\": \"" + "wxApplicationBlank.getAttach()" + "\"," +
+                // --- JSAPI 新增参数 ---
+                "\"payer\": {" +
+                "\"openid\": \"" + getOpenId(Code) + "\"" +  // 必须传递用户的openid
+                "}," +
+                // ---------------------
+                "\"notify_url\": \"" + wxNotifyUrl+"/onLine" + "/m" + mchId + "\"" +
+                "}";
+
+        StringEntity entity = new StringEntity(reqdata, "utf-8");
+        entity.setContentType("application/json");
+        httpPost.setEntity(entity);
+        httpPost.setHeader("Accept", "application/json");
+
+        // 加载商户私钥(privateKey:私钥字符串)
+        PrivateKey merchantPrivateKey = PemUtil
+                .loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));
+
+        // 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥)
+        AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
+                new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)), apiV3Key.getBytes("utf-8"));
+
+        // 初始化httpClient
+        httpClient = WechatPayHttpClientBuilder.create()
+                .withMerchant(mchId, mchSerialNo, merchantPrivateKey)
+                .withValidator(new WechatPay2Validator(verifier)).build();
+        //完成签名并执行请求
+        CloseableHttpResponse response = httpClient.execute(httpPost);
+        try {
+            int statusCode = response.getStatusLine().getStatusCode();
+            //处理成功
+            if (statusCode == 200) {
+                String prepayId = EntityUtils.toString(response.getEntity());
+                JSONObject jsonObject = JSON.parseObject(prepayId);
+                log.info("success,return body = " + EntityUtils.toString(response.getEntity()));
+                return jsonObject.getString("prepay_id");
+            } else {
+                log.info("微信支付JSAPI下单失败:statusCode{},响应体:{}", statusCode, EntityUtils.toString(response.getEntity()));
+                throw new IOException("换取微信二维码异常");
+            }
+        } finally {
+            response.close();
+        }
+    }
+
     /**
      * 微信JSAPI 获取调起支付参数
      * @param prepayId
@@ -357,33 +459,15 @@ public class WXPayUtil {
             throw new IllegalArgumentException("prepayId不能为空");
         }
 
-        // 2. 构建基础参数(时间戳、随机字符串、package)
+
         Long timestamp = System.currentTimeMillis(); // 秒级时间戳
         String nonceStr = UUID.randomUUID().toString().replace("-", "");     // 32位随机字符串
         String packageStr = "prepay_id=" + prepayId;                        // 固定格式
 
-        // 3. 构建签名参数列表(按字段名ASCII字典序排序)
-//        List<String> signParams = new ArrayList<>();
-//        signParams.add(appId);          // 公众号/小程序appId
-//        signParams.add(timeStamp);      // 时间戳
-//        signParams.add(nonceStr);       // 随机字符串
-//        signParams.add(packageStr);     // prepay_id=xxx
-
-        // 4. 生成签名
-//        String signMessage;
-//        String paySign;
-//        try {
-//            signMessage = WxPayJsApiSignUtil.buildSignMessage(signParams); // 拼接签名字符串
-//            paySign = WxPayJsApiSignUtil.signV3(signMessage.getBytes(StandardCharsets.UTF_8),privateKey); // SHA256-RSA签名
-//            log.debug("[微信JSAPI支付] 签名原始串: {}", signMessage);
-//        } catch (Exception e) {
-//            log.error("[微信JSAPI支付] 签名生成失败: {}", e.getMessage());
-//            throw new RuntimeException("支付签名生成失败", e);
-//        }
         String paySign = WxPayJsApiSignUtil.getSign(appId , timestamp, nonceStr, packageStr,privateKey);//签名
         log.info("paySignpaySignpaySign="+paySign);
 
-        // 5. 构造返回对象
+
         WxPayJsApiPreVO result = new WxPayJsApiPreVO();
         result.setWxAppId(appId);               // 公众号/小程序ID
         result.setWxTimeStamp(timestamp);       // 时间戳
@@ -392,7 +476,7 @@ public class WXPayUtil {
         result.setWxSignType("RSA");            // 签名类型(固定RSA)
         result.setWxPaySign(paySign);           // 签名
 
-        // 6. 日志记录结果
+        //  日志记录结果
         log.info("[微信JSAPI支付] 预支付参数构建完成: {}", JSONUtil.toJsonStr(result));
         return result;
     }
@@ -435,6 +519,111 @@ public class WXPayUtil {
         }
     }
 
+    /**
+     * 获取微信全局 AccessToken
+     * @return AccessToken 字符串
+     * @throws Exception 网络错误或微信接口异常
+     */
+    public String getAccessToken() throws Exception {
+        String accessToken = redisClient.get("wx:accessToken", null);
+        if (StringUtils.isNotEmpty(accessToken)){
+            return accessToken;
+        }
+        // 1. 构建请求 URL(严格参数顺序)
+        String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?"
+                + "grant_type=client_credential"
+                + "&appid=" + wechatConfig.getAppId()
+                + "&secret=" + wechatConfig.getAppSecret();
+
+        // 2. 发送 HTTP GET 请求
+        URL url = new URL(requestUrl);
+        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+        connection.setRequestMethod("GET");
+        int responseCode = connection.getResponseCode();
+
+        if (responseCode == HttpURLConnection.HTTP_OK) { // 请求成功
+            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+            StringBuilder response = new StringBuilder();
+            String line;
+            while ((line = in.readLine()) != null) {
+                response.append(line);
+            }
+            in.close();
+
+            // 3. 解析 JSON 响应
+            String jsonResponse = response.toString();
+            log.info("获取微信全局AccessToken"+jsonResponse);
+            JsonObject jsonObject = new Gson().fromJson(jsonResponse, JsonObject.class);
+
+            // 4. 校验微信返回的错误码
+            if (jsonObject.has("errcode")) {
+                throw new RuntimeException("微信接口错误: errcode=" + jsonObject.get("errcode")
+                        + ", errmsg=" + jsonObject.get("errmsg"));
+            }
+            String access_token = jsonObject.get("access_token").getAsString();
+            int expires_in = jsonObject.get("expires_in").getAsInt();
+            redisClient.set("wx:accessToken",access_token,expires_in-200);
+            // 5. 返回 AccessToken
+            return access_token;
+        } else {
+            throw new RuntimeException("HTTP GET 请求失败,状态码: " + responseCode);
+        }
+    }
+
+
+    /**
+     *
+     * @return
+     * @throws Exception
+     */
+    public String getJsapiTicket() throws Exception {
+        String ticketRedis = redisClient.get("wx:ticket", null);
+        if (StringUtils.isNotEmpty(ticketRedis)){
+            return ticketRedis;
+        }
+        String accessToken = getAccessToken();
+        // 1. 构建请求URL(严格参数顺序)
+        String requestUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?"
+                + "access_token=" + accessToken
+                + "&type=jsapi";
+
+        // 2. 发送HTTP GET请求
+        URL url = new URL(requestUrl);
+        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+        connection.setRequestMethod("GET");
+        int responseCode = connection.getResponseCode();
+
+        if (responseCode == HttpURLConnection.HTTP_OK) { // 请求成功
+            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+            StringBuilder response = new StringBuilder();
+            String line;
+            while ((line = in.readLine()) != null) {
+                response.append(line);
+            }
+            in.close();
+            log.info("获取微信JSAPI Ticket"+response.toString());
+            // 3. 解析微信响应
+            String jsonResponse = response.toString();
+            JsonObject jsonObject = new Gson().fromJson(jsonResponse, JsonObject.class);
+
+            // 4. 校验微信返回的错误码
+            if (jsonObject.has("errcode")) {
+                if (jsonObject.get("errcode").getAsInt() != 0){
+                    throw new RuntimeException("微信接口错误: errcode=" + jsonObject.get("errcode").getAsInt()
+                            + ", errmsg=" + jsonObject.get("errmsg").getAsString());
+                }
+            }
+
+            String ticket = jsonObject.get("ticket").getAsString();
+            int expiresIn = jsonObject.get("expires_in").getAsInt();
+            redisClient.set("wx:ticket",ticket,expiresIn-200);
+            return ticket;
+        } else {
+            throw new RuntimeException("HTTP GET请求失败,状态码: " + responseCode);
+        }
+    }
+
+
     @SneakyThrows
     public JSONObject queryOrder(PayOrder pay){
         OrgMerchant orgMerchant = orgMerchantService.getOrgMerchant(pay.getOrgCode(),"1");

+ 1 - 1
hcp-large-screen/src/main/java/com/yingyangfly/large/screen/controller/LoginController.java

@@ -48,7 +48,7 @@ public class LoginController {
     @PostMapping("/getCheckCode")
     @TraceLog
     public ResultResponse getCheckCode(String mobile){
-        return appUserService.getCheckCode(mobile);
+        return appUserService.getCheckCode(mobile,"large");
     }
 
     @ApiOperation("退出")

+ 1 - 1
hcp-platform/src/main/java/com/yingyangfly/platform/controller/DoctorController.java

@@ -87,7 +87,7 @@ public class DoctorController {
      * 强制重置密码
      */
     @Log(title = "强制重置密码")
-    @PreAuthorize("@SSPermissionChecker.hasPermission('violent_reset_pwd')")
+//    @PreAuthorize("@SSPermissionChecker.hasPermission('violent_reset_pwd')")
     @PostMapping("/violentResetPwd")
     @TraceLog
     public ResultResponse violentResetPwd(@RequestBody Map<String, String> params) {

+ 12 - 0
hcp-platform/src/main/java/com/yingyangfly/platform/controller/PayOrderController.java

@@ -128,6 +128,18 @@ public class PayOrderController {
         Map<String, Object> map =  payService.wxCall(request,response);
         return ResultResponse.success(map);
     }
+
+    /**
+     * 微信回调  线上微信申请
+     */
+    @PostMapping("/callback/wxCall/onLine/{m}")
+    @TraceLog
+    public ResultResponse onLineWxCall(HttpServletRequest request, HttpServletResponse response) {
+        Map<String, Object> map =  payService.onLineWxCall(request,response);
+        return ResultResponse.success(map);
+    }
+
+
     /**
      * 支付宝回调
      */

+ 51 - 0
hcp-platform/src/main/java/com/yingyangfly/platform/controller/WxApplicationBlankController.java

@@ -0,0 +1,51 @@
+package com.yingyangfly.platform.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yingyangfly.common.dto.ResultResponse;
+import com.yingyangfly.core.domain.WxApplicationBlank;
+import com.yingyangfly.core.service.WxApplicationBlankService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/wx/application/blank")
+public class WxApplicationBlankController {
+
+    @Resource
+    private WxApplicationBlankService wxApplicationBlankService;
+
+
+    /**
+     * 查询微信申请列表
+     */
+    @PreAuthorize("@SSPermissionChecker.hasPermission('application_blank')")
+    @PostMapping("/list")
+    public ResultResponse list(@RequestBody WxApplicationBlank wxApplicationBlank)
+    {
+        IPage<WxApplicationBlank> list = wxApplicationBlankService.selectByPage(wxApplicationBlank);
+        return ResultResponse.success(list);
+    }
+
+
+
+    /**
+     * 获取微信申请详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('wx:blank:query')")
+    @GetMapping(value = "/{id}")
+    public ResultResponse getInfo(@PathVariable("id") Long id)
+    {
+        return ResultResponse.success(wxApplicationBlankService.getById(id));
+    }
+
+
+    @GetMapping(value = "update/payStatusFulfill/{id}")
+    public ResultResponse updatePayStatusFulfill(@PathVariable("id") Long id)
+    {
+        wxApplicationBlankService.updatePayStatusFulfill(id);
+        return ResultResponse.success();
+    }
+}

+ 92 - 21
hcp-platform/src/main/java/com/yingyangfly/platform/controller/WxTencentController.java

@@ -1,26 +1,30 @@
 package com.yingyangfly.platform.controller;
 
-import com.alibaba.excel.util.StringUtils;
+
+import cn.hutool.json.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.yingyangfly.common.dto.ResultResponse;
 import com.yingyangfly.common.log.annotation.TraceLog;
 import com.yingyangfly.core.annotation.Log;
-import com.yingyangfly.core.config.WxJsConfig;
-import com.yingyangfly.core.domain.AppUser;
-import com.yingyangfly.core.domain.LearningPackage;
+import com.yingyangfly.core.config.WechatConfig;
 import com.yingyangfly.core.domain.PayOrder;
+import com.yingyangfly.core.domain.WxApplicationBlank;
 import com.yingyangfly.core.dto.WxTencentDto;
-import com.yingyangfly.core.mapper.LearningPackagMapper;
-import com.yingyangfly.core.mapper.PayOrderMapper;
 import com.yingyangfly.core.service.PayService;
+import com.yingyangfly.core.service.WxApplicationBlankService;
 import com.yingyangfly.core.service.impl.AppUserService;
-import com.yingyangfly.core.util.Sm4Util;
-import com.yingyangfly.redis.client.RedisClient;
+import com.yingyangfly.core.util.WXPayUtil;
+import lombok.Value;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
-
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.security.MessageDigest;
+import java.util.Formatter;
+import java.util.HashMap;
 import java.util.List;
+import java.util.UUID;
 
 @RestController
 @RequestMapping("wx/tencent")
@@ -31,6 +35,16 @@ public class WxTencentController {
 
     @Resource
     private PayService payService;
+
+    @Resource
+    private WXPayUtil wxPayUtil;
+
+    @Resource
+    private WechatConfig wechatConfig;
+
+    @Resource
+    private WxApplicationBlankService wxApplicationBlankService;
+
     /**
      * 微信公众号  患者支付新增
      * @return
@@ -43,20 +57,77 @@ public class WxTencentController {
         if (payOrders.size()>0){
             return ResultResponse.fail(201,"重复的微信支付调用");
         }
-        AppUser user = appUserService.selectByMobile(Sm4Util.encrypt(wxTencentDto.getMobile()), null);
-        if (ObjectUtils.isNotNull(user)){
-            return ResultResponse.fail(201,"手机号已经存在,请联系工作人员");
-        }
         return ResultResponse.success(appUserService.wXTencentSave(wxTencentDto));
     }
 
+    /**
+     * 微信支付  手机号
+     * @return
+     */
+    @Log(title = "线上申请")
+    @TraceLog
+    @PostMapping("save/phone")
+    public ResultResponse wxSavePhone(@RequestBody WxTencentDto wxTencentDto) throws Exception {
+        LambdaQueryWrapper<WxApplicationBlank> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(WxApplicationBlank::getState,wxTencentDto.getState());
+        WxApplicationBlank wxApplicationBlank = wxApplicationBlankService.getOne(lambdaQueryWrapper);
+        if (ObjectUtils.isNotNull(wxApplicationBlank)){
+            return ResultResponse.fail(201,"重复的微信支付调用");
+        }
+        return ResultResponse.success(appUserService.wxSavePhone(wxTencentDto));
+    }
+
+    @GetMapping("/config")
+    public ResultResponse getConfig(String url) {
+        try {
+            // 1. 生成签名参数
+            String nonceStr = UUID.randomUUID().toString().replace("-", "");
+            long timestamp = System.currentTimeMillis() / 1000;
+
+            // 2. 获取JSAPI Ticket
+            String jsapiTicket = wxPayUtil.getJsapiTicket();
+
+            // 3. 生成签名
+            String signature = generateSignature(jsapiTicket, nonceStr, timestamp, url);
+
+            return ResultResponse.success(new HashMap<String, String>() {{
+                put("appId", wechatConfig.getAppId());
+                put("timestamp", String.valueOf(timestamp));
+                put("nonceStr", nonceStr);
+                put("signature", signature);
+                put("jsApiList", "[\"getPhoneNumber\"]");
+            }});
+        } catch (Exception e) {
+            throw new RuntimeException("微信配置获取失败", e);
+        }
+    }
+
 
-//    @GetMapping("/config")
-//    public ResultResponse getConfig(@RequestParam String url) {
-//        if (StringUtils.isEmpty(url)) {
-//            return ResultResponse.fail("URL参数不能为空");
-//        }
-//        WxJsConfig config = weChatService.getJsConfig(url);
-//       return ResultResponse.success(config);
-//    }
+
+    private String generateSignature(String jsapiTicket, String nonceStr, long timestamp, String url) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("jsapi_ticket=").append(jsapiTicket)
+                .append("&noncestr=").append(nonceStr)
+                .append("&timestamp=").append(timestamp)
+                .append("&url=").append(url);
+
+        try {
+            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
+            crypt.reset();
+            crypt.update(sb.toString().getBytes("UTF-8"));
+            return byteToHex(crypt.digest());
+        } catch (Exception e) {
+            throw new RuntimeException("签名生成失败", e);
+        }
+    }
+
+    private String byteToHex(final byte[] hash) {
+        Formatter formatter = new Formatter();
+        for (byte b : hash) {
+            formatter.format("%02x", b);
+        }
+        String result = formatter.toString();
+        formatter.close();
+        return result;
+    }
 }

+ 1 - 1
hcp-platform/src/main/resources/application-dev.yml

@@ -120,7 +120,7 @@ security:
       - /pay/callback/**/m**
       - /system/dict/data/selectByDictType
       - /learn/package/tencent/learnPackage
-      - /wx/tencent/save
+      - /wx/tencent/**
 
 query-daily-trai: http://60.205.122.15/h5-training-daily/index.html
 

+ 3 - 3
hcp-platform/src/main/resources/application-prod.yml

@@ -73,8 +73,8 @@ oss:
   endpoint:  oss-cn-beijing.aliyuncs.com #填写自己oss endpoint
   outDomain: https://yaorongoss.yaorongmedical.com #填写自己oss 外网域名
 wx:
-  app-id: 填写自己微信支付key
-  app-secret: 填写自己微信支付密码
+  app-id: wxe6dbe98e8c6d1a4b
+  app-secret: 9012fccacb9a71d5d39ff2881b35388c
   pay-url-callback: http://自己微信支付回调:8601/pub/api/wx/pay/appointment/order/callback
   refund-url-callback: http://自己微信支付退款回调:8601/pub/api/wx/refund/appointment/order/callback
 live:
@@ -116,7 +116,7 @@ security:
       - /pay/callback/**/m**
       - /system/dict/data/selectByDictType
       - /learn/package/tencent/learnPackage
-      - /wx/tencent/save
+      - /wx/tencent/**
 
 query-daily-trai: https://yaorong.yaorongmedical.com/h5-training-daily/index.html
 

+ 22 - 0
hcp-platform/src/test/java/com/yingyangfly/core/recommend/RecommendFacadeTest.java

@@ -5,8 +5,10 @@ import com.yingyangfly.HcpPlatPlatformApplication;
 import com.yingyangfly.core.domain.AppUser;
 import com.yingyangfly.core.domain.Game;
 import com.yingyangfly.core.domain.GameUser;
+import com.yingyangfly.core.domain.ReviewTask;
 import com.yingyangfly.core.service.GameService;
 import com.yingyangfly.core.service.GameUserService;
+import com.yingyangfly.core.service.ReviewTaskService;
 import com.yingyangfly.core.service.impl.AppUserService;
 import com.yingyangfly.core.util.Sm4Util;
 import org.junit.jupiter.api.Test;
@@ -18,6 +20,7 @@ import org.springframework.test.context.junit4.SpringRunner;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * ${TODO}
@@ -105,4 +108,23 @@ class RecommendFacadeTest {
             appUserService.updateById(appUserUpdate);
         }
     }
+    @Autowired
+    ReviewTaskService reviewTaskService ;
+
+    @Test
+    void Test4() {
+        LambdaQueryWrapper<AppUser> appUserLambdaQueryWrapper = new LambdaQueryWrapper();
+        appUserLambdaQueryWrapper.eq(AppUser::getTestFlag,"1");
+        List<AppUser> list = appUserService.list(appUserLambdaQueryWrapper);
+        for (AppUser appUser : list) {
+            List<ReviewTask> reviewTaskList =  reviewTaskService.selectUnDoneReviewTaskByUserId(appUser.getId());
+            if (reviewTaskList.size()==0){
+                AppUser appUserUpdate = new AppUser();
+                appUserUpdate.setId(appUser.getId());
+                appUserUpdate.setTestFlag("0");
+                appUserService.updateById(appUserUpdate);
+            }
+        }
+
+    }
 }