Browse Source

fix:登出接口

zzf 1 year ago
parent
commit
77e65d28f3

+ 284 - 69
src/main/java/com/rf/psychological/user/rest/SystemController.java

@@ -4,16 +4,23 @@ import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.rf.psychological.base.rest.BaseController;
+import com.rf.psychological.dao.model.AnswerEntity;
+import com.rf.psychological.dao.model.DimensionEntity;
 import com.rf.psychological.enums.UserRole;
+import com.rf.psychological.enums.UserStatus;
 import com.rf.psychological.group.dao.model.GroupEntity;
 import com.rf.psychological.group.service.GroupInfoService;
-import com.rf.psychological.user.dao.model.UserEntity;
-import com.rf.psychological.enums.UserStatus;
 import com.rf.psychological.institution.model.InstitutionEntity;
 import com.rf.psychological.institution.service.InstitutionService;
-import com.rf.psychological.opLog.annotation.OperationLogAnnotation;
+import com.rf.psychological.module.index.service.IndexService;
+import com.rf.psychological.scale.dao.model.ScaleEntity;
+import com.rf.psychological.scale.dao.model.ScaleMarksEntity;
+import com.rf.psychological.scale.dao.model.SubjectEntity;
+import com.rf.psychological.scale.service.*;
 import com.rf.psychological.security.AesEncryptUtils;
+import com.rf.psychological.security.DESede;
 import com.rf.psychological.security.SafetyProcess;
+import com.rf.psychological.user.dao.model.UserEntity;
 import com.rf.psychological.user.service.SystemService;
 import com.rf.psychological.user.service.UserService;
 import com.rf.psychological.utils.Constant;
@@ -21,16 +28,19 @@ import com.rf.psychological.utils.JWTUtil;
 import com.rf.psychological.utils.Result;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.context.event.SpringApplicationEvent;
 import org.springframework.core.env.Environment;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.util.DigestUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 
+import java.util.concurrent.TimeUnit;
+
 import static cn.hutool.core.date.DatePattern.PURE_DATETIME_PATTERN;
 
 /**
@@ -38,6 +48,7 @@ import static cn.hutool.core.date.DatePattern.PURE_DATETIME_PATTERN;
  * @Author: zsf
  * @Date: 2022/7/4
  */
+@Slf4j
 @RestController
 @RequestMapping("/system")
 @Api(tags = "后台首页、登录、版本等接口")
@@ -63,7 +74,8 @@ public class SystemController extends BaseController {
     @Autowired
     private Environment env;
 
-
+    @Autowired
+    private StringRedisTemplate redisTemplate;
     @GetMapping("/getVersion")
     @SafetyProcess
     public Result getSystemVersion(){
@@ -78,8 +90,7 @@ public class SystemController extends BaseController {
      * @return
      */
     @PostMapping("/registerUser")
-    @ApiOperation(value = "用户注册",notes = "json字符串形式传参(加密),data参数包括:data:注册用户基本信息《birthday:生日,gender:性别,password:密码,roleType:角色,institutionNo:机构编号,phone:账号或电话》,authCode:验证码(公网版必填)," +
-            "verification:验证信息《beginTime:时间,authCode:验证码,phone:电话》")
+    @ApiOperation(value = "用户注册",notes = "json字符串形式传参(加密),data参数包括:data:注册用户基本信息《birthday:生日,gender:性别,password:密码,roleType:角色,institutionNo:机构编号,phone:账号或电话》,authCode:验证码(公网版必填)")
     @SafetyProcess
     public Result registerUser(@RequestBody String jsonParam){
         try {
@@ -87,7 +98,6 @@ public class SystemController extends BaseController {
             JSONObject jsonData = JSONObject.parseObject(data);
             JSONObject jsonUserEntity =jsonData.getJSONObject("data");
             UserEntity userEntity = jsonUserEntity.toJavaObject(UserEntity.class);
-            userEntity.setModel(Constant.DEFAULT_VALUE_ZERO);
             String institutionNo = userEntity.getInstitutionNo();
             if (StringUtils.isEmpty(institutionNo)){
                 return fail("","机构编号不能为空");
@@ -108,26 +118,37 @@ public class SystemController extends BaseController {
             //区分是否需要验证码
             if (Constant.WEB_INSTITUTION_CODE.equals(userEntity.getInstitutionNo())){
                 String authCode = jsonData.getString("authCode");
-                JSONObject jsonVerification = jsonData.getJSONObject("verification");
-                String jsonPhone = jsonVerification.getString("phone");
-                String jsonAuthCode = jsonVerification.getString("authCode");
-                String jsonBeginTime = jsonVerification.getString("beginTime");
-                if (StringUtils.isEmpty(jsonBeginTime)  || StringUtils.isEmpty(jsonAuthCode) ) {
-                    return fail("", "请重新获取验证码");
+                if (StringUtils.isEmpty(authCode)){
+                    return fail("","验证码不能为空");
                 }
+                String phone = userEntity.getPhone();
+//                JSONObject jsonVerification = jsonData.getJSONObject("verification");
+//                String jsonPhone = jsonVerification.getString("phone");
+//                String jsonAuthCode = jsonVerification.getString("authCode");
+//                String jsonBeginTime = jsonVerification.getString("beginTime");
+//                if (StringUtils.isEmpty(jsonBeginTime)  || StringUtils.isEmpty(jsonAuthCode) ) {
+//                    return fail("", "请重新获取验证码");
+//                }
                 //计算时间差---分钟
                 //int diff = DateUtil.getDistanceByUnit(DateUtil.parseDate(jsonBeginTime,DateUtil.ACCURACY_PATTERN_MINUTE), DateUtil.getCurrentDate(), 2);
-                long diff = DateUtil.between(DateUtil.date(), DateUtil.parse(jsonBeginTime,PURE_DATETIME_PATTERN), DateUnit.MINUTE);
-                if (diff < 0 || diff > 5) {
-                    return fail("", "验证码已失效");
+//                long diff = DateUtil.between(DateUtil.date(), DateUtil.parse(jsonBeginTime,PURE_DATETIME_PATTERN), DateUnit.MINUTE);
+//                if (diff < 0 || diff > 5) {
+//                    return fail("", "验证码已失效");
+//                }
+                String temp = redisTemplate.opsForValue().get("AUTH_CODE_"+phone);
+                if(StringUtils.isBlank(temp)){
+                    return fail("请重新获取验证码");
                 }
-                if (!jsonAuthCode.equals(authCode) || !jsonPhone.equals(userEntity.getPhone()) ) {
+                if (!temp.equals(authCode)) {
                     return fail("", "验证码错误");
                 }
                 userEntity.setUserStatus(UserStatus.PASS.getType());
             }
             UserEntity userInfo = this.userService.findPhoneAndInstitutionNoAndRoleType(userEntity.getPhone(), userEntity.getInstitutionNo(),userEntity.getRoleType());
             if (userInfo == null) {
+                if (Constant.LAN_INSTITUTION_CODE.equals(userEntity.getInstitutionNo())){
+                    userEntity.setUserStatus(Constant.USER_STATUS_NORMAL);
+                }
                 userEntity.setPassword(DigestUtils.md5DigestAsHex(userEntity.getPassword().getBytes()));
                 this.userService.save(userEntity);
                 return success();
@@ -140,80 +161,213 @@ public class SystemController extends BaseController {
         }
     }
     @SafetyProcess
-    @ApiOperation(value = "系统登录接口",notes = "data参数包括:phone:账号, password:密码,institutionNo:机构编号,roleType:用户角色")
+    @ApiOperation(value = "系统登录接口",notes = "data参数包括:phone:账号, password:密码,institutionNo:机构编号,roleType:用户角色,authCode:密码,verification:验证信息《beginTime:时间,authCode:验证码,phone:电话》")
     @PostMapping("/login")
     public Result login(HttpServletRequest request, @RequestBody String jsonParams){
         try {
             JSONObject jsonObject =JSONObject.parseObject( AesEncryptUtils.decrypt(JSONObject.parseObject(jsonParams).getString("data")));
-            if (!jsonObject.containsKey("phone") || !jsonObject.containsKey("password") || !jsonObject.containsKey("institutionNo")|| !jsonObject.containsKey("roleType")) {
-                return fail("", "账号或密码或所属机构不能为空");
+            log.info("jsonObject: " + jsonObject.toString());
+            if (!jsonObject.containsKey("institutionNo") || !jsonObject.containsKey("roleType") ||  StringUtils.isEmpty(jsonObject.getString("institutionNo")) || StringUtils.isEmpty( jsonObject.getString("roleType") )) {
+                return fail("", "机构编号和用户角色不能为空");
             }
-            String password = jsonObject.getString("password");
-            String phone = jsonObject.getString("phone");
             String institutionNo = jsonObject.getString("institutionNo");
             String roleType = jsonObject.getString("roleType");
-            if (StringUtils.isEmpty(password) || StringUtils.isEmpty( phone )) {
-                return fail("", "账号或密码不能为空");
+
+
+            if (!jsonObject.containsKey("phone") || StringUtils.isEmpty(jsonObject.getString("phone")) ) {
+                return fail("", "账号不能为空");
             }
-            UserEntity userEntity = this.userService.findPhoneAndInstitutionNoAndRoleType(phone, institutionNo,roleType);
-            if (userEntity == null) {
-                return fail(null, "机构编号或账号错误");
+            String phone = jsonObject.getString("phone");
+            log.info("phone: " + phone);
+            //判断机构编号是否存在
+            InstitutionEntity institutionEntity = this.institutionService.findByInstitutionNo(institutionNo);
+            log.info("institutionEntity: " + institutionEntity);
+            if (institutionEntity == null) {
+                return fail("", "机构编号不存在!");
             }
-            String userStatus = userEntity.getUserStatus();
+            UserEntity userEntity = this.userService.findPhoneAndInstitutionNoAndRoleType(phone, institutionNo,roleType);
 
-            if (UserStatus.AUDIT.getType().equals(userStatus)||UserStatus.UPDATE.getType().equals(userStatus)){
-                return fail(null, "用户未审核,请联系管理员");
-            }
-            if (userEntity.getPassword().equals(password)) {
+            log.info("userEntity: " + userEntity);
+            //如果是公网版并且验证码登录
+            if (Constant.WEB_INSTITUTION_CODE.equals(institutionNo) && jsonObject.containsKey("authCode")){
+                if (userEntity == null) {
+                    return fail(null, "用户不存在");
+                }
+                String authCode = jsonObject.getString("authCode");
+                if (StringUtils.isEmpty(authCode)){
+                    return fail("","验证码不能为空");
+                }
+                String temp = redisTemplate.opsForValue().get("AUTH_CODE_" + phone);
+                if(StringUtils.isBlank(temp)){
+                    return fail("", "验证码已失效");
+                }
+                if (temp.equals(authCode)) {
+                    //生成token
+                    userEntity.setPassword(null);
+                    String token = JWTUtil.getTokenByUserInfo(userEntity);
+                    // 创建返回的json对象
+                    JSONObject resultJson = new JSONObject();
+                    resultJson.put("user", userEntity);
+                    resultJson.put("type", userEntity.getRoleType());
+                    resultJson.put("token", token);
+                    request.getSession().setAttribute("user", userEntity);
+                    return success(resultJson);
+                } else {
+                    return fail("", "验证码错误");
+                }
+            }else if ("lan".equals(profileValue)){
+                if (!jsonObject.containsKey("password") || StringUtils.isEmpty(  jsonObject.getString("password") )) {
+                    return fail("", "密码不能为空");
+                }
+                String password = jsonObject.getString("password");
+                if (userEntity == null) {
+                    if (Constant.LAN_INSTITUTION_CODE.equals(institutionNo)){
+                        return fail(null, "账号或密码错误");
+                    }
+                    return fail(null, "账号错误");
+                }
+                String userStatus = userEntity.getUserStatus();
+                if (UserStatus.AUDIT.getType().equals(userStatus)||UserStatus.UPDATE.getType().equals(userStatus)){
+                    return fail(null, "用户未审核,请联系管理员");
+                }
+                if (userEntity.getPassword().equals(password)) {
+                    //生成token
+                    userEntity.setPassword(null);
+                    String token = JWTUtil.getTokenByUserInfo(userEntity);
+                    // 创建返回的json对象
+                    JSONObject resultJson = new JSONObject();
+                    resultJson.put("user", userEntity);
+                    resultJson.put("type", userEntity.getRoleType());
+                    resultJson.put("token", token);
+                    request.getSession().setAttribute("user", userEntity);
+                    return success(resultJson);
+                } else {
+                    return fail(null, "账号或密码错误");
+                }
+            }else {
+                if (!jsonObject.containsKey("password") || StringUtils.isEmpty(  jsonObject.getString("password") )) {
+                    return fail("", "密码不能为空");
+                }
+                String password = jsonObject.getString("password");
+                if (userEntity == null) {
+                    if (Constant.LAN_INSTITUTION_CODE.equals(institutionNo)){
+                        return fail(null, "账号或密码错误");
+                    }
+                    return fail(null, "机构编号或账号错误");
+                }
+                String userStatus = userEntity.getUserStatus();
+                if (UserStatus.AUDIT.getType().equals(userStatus)||UserStatus.UPDATE.getType().equals(userStatus)){
+                    return fail(null, "用户未审核,请联系管理员");
+                }
+                if (userEntity.getPassword().equals(password)) {
+                    //生成token
+                    userEntity.setPassword(null);
+                    String redisToken = redisTemplate.opsForValue().get("session:"+userEntity.getInstitutionNo()+":"+userEntity.getPhone()+":"+userEntity.getRoleType());
+                    String token = redisToken;
 
-                //生成token
-                userEntity.setPassword(null);
-                String token = JWTUtil.getTokenByUserInfo(userEntity);
-                // 创建返回的json对象
-                JSONObject resultJson = new JSONObject();
-                resultJson.put("user", userEntity);
-                resultJson.put("type", userEntity.getRoleType());
-                resultJson.put("token", token);
-                request.getSession().setAttribute("user", userEntity);
-                return success(resultJson);
-            } else {
-                return fail(null, "账号或密码错误");
+                    //验证token是否有效
+                    try {
+                        JWTUtil.verify(token);
+                    }catch (Exception e){
+                        e.printStackTrace();
+                        token = JWTUtil.getTokenByUserInfo(userEntity);
+                        redisTemplate.opsForValue().set("session:"+userEntity.getInstitutionNo()+":"+userEntity.getPhone()+":"+userEntity.getRoleType(),token,5, TimeUnit.DAYS);
+                    }
+
+                    // 创建返回的json对象
+                    JSONObject resultJson = new JSONObject();
+                    resultJson.put("user", userEntity);
+                    resultJson.put("type", userEntity.getRoleType());
+                    resultJson.put("token", token);
+                    request.getSession().setAttribute("user", userEntity);
+                    return success(resultJson);
+                } else {
+                    return fail(null, "账号或密码错误");
+                }
             }
+
         }catch (Exception e){
             e.printStackTrace();
             return fail();
         }
     }
 
+
     @SafetyProcess
-    @ApiOperation(value = "管理员登录接口",notes = "data参数包括:phone:账号, password:密码")
-    @PostMapping("/adminLogin")
-    public Result adminLogin(HttpServletRequest request,@RequestBody String jsonParams){
+    @ApiOperation(value = "系统登录接口",notes = "data参数包括:phone:账号,institutionNo:机构编号,roleType:用户角色,authCode:密码,verification:验证信息《beginTime:时间,authCode:验证码,phone:电话》")
+    @PostMapping("/loginH5")
+    public Result loginH5(HttpServletRequest request, @RequestBody String jsonParams){
         try {
             JSONObject jsonObject =JSONObject.parseObject( AesEncryptUtils.decrypt(JSONObject.parseObject(jsonParams).getString("data")));
-            if (!jsonObject.containsKey("phone") || !jsonObject.containsKey("password") ) {
-                return fail("", "账号或密码不能为空");
+            log.info("jsonObject: " + jsonObject.toString());
+            if (!jsonObject.containsKey("institutionNo") || !jsonObject.containsKey("roleType") ||  StringUtils.isEmpty(jsonObject.getString("institutionNo")) || StringUtils.isEmpty( jsonObject.getString("roleType") )) {
+                return fail("", "机构编号和用户角色不能为空");
             }
-            String password = jsonObject.getString("password");
-            String phone = jsonObject.getString("phone");
+            String institutionNo = jsonObject.getString("institutionNo");
             String roleType = jsonObject.getString("roleType");
-            if (StringUtils.isEmpty(password) || StringUtils.isEmpty( phone )) {
-                return fail("", "账号或密码不能为空");
+            if (!jsonObject.containsKey("phone") || StringUtils.isEmpty(jsonObject.getString("phone")) ) {
+                return fail("", "账号不能为空");
             }
-            UserEntity userEntity = this.userService.findByPhoneAndPassword(phone, password,roleType);
+            String phone = jsonObject.getString("phone");
+            log.info("phone: " + phone);
+            //判断机构编号是否存在
+            InstitutionEntity institutionEntity = this.institutionService.findByInstitutionNo(institutionNo);
+            log.info("institutionEntity: " + institutionEntity);
+            if (institutionEntity == null) {
+                return fail("", "机构编号不存在!");
+            }
+            UserEntity userEntity = this.userService.findPhoneAndInstitutionNoAndRoleType(phone, institutionNo,roleType);
+            log.info("userEntity: " + userEntity);
+            //如果是公网版并且验证码登录
             if (userEntity == null) {
-                return fail(null, "账号或密码错误");
+                userEntity = new UserEntity();
+                userEntity.setPassword(DigestUtils.md5DigestAsHex(Constant.DEFAULT_PASSWORD.getBytes()));
+                userEntity.setGId(this.groupInfoService.findGroupByInstitutionNoAndName(Constant.WEB_INSTITUTION_CODE,Constant.DEFAULT_GROUP_NAME).getId());
+                userEntity.setInstitutionName(Constant.WEB_INSTITUTION_NAME);
+                userEntity.setInstitutionNo(Constant.WEB_INSTITUTION_CODE);
+                userEntity.setUserStatus(Constant.USER_STATUS_NORMAL);
+                userEntity.setBirthday("-");
+                userEntity.setGender("-");
+                userEntity.setPetName(phone);
+                userEntity.setProfession("-");
+                userEntity.setPhone(phone);
+                userEntity.setRoleType(UserRole.COMMON.getType());
+                userEntity = this.userService.save(userEntity);
+            }
+            String authCode = jsonObject.getString("authCode");
+            if (StringUtils.isEmpty(authCode)){
+                return fail("","验证码不能为空");
+            }
+
+            String temp = redisTemplate.opsForValue().get("AUTH_CODE_" + phone);
+            if(StringUtils.isBlank(temp)){
+                return fail("", "验证码已失效");
+            }
+            if (temp.equals(authCode)) {
+                //生成token
+               // userEntity.setPassword(null);
+               // String token = JWTUtil.getTokenByUserInfo(userEntity);
+                //生成token
+                userEntity.setPassword(null);
+                String redisToken = redisTemplate.opsForValue().get("session:"+userEntity.getInstitutionNo()+":"+userEntity.getPhone()+":"+userEntity.getRoleType());
+                String token = redisToken;
+                try {
+                    JWTUtil.verify(token);
+                }catch (Exception e){
+                    e.printStackTrace();
+                    token = JWTUtil.getTokenByUserInfo(userEntity);
+                    redisTemplate.opsForValue().set("session:"+userEntity.getInstitutionNo()+":"+userEntity.getPhone()+":"+userEntity.getRoleType(),token,5, TimeUnit.DAYS);
+                }
+                // 创建返回的json对象
+                JSONObject resultJson = new JSONObject();
+                resultJson.put("user", userEntity);
+                resultJson.put("type", userEntity.getRoleType());
+                resultJson.put("token", token);
+                request.getSession().setAttribute("user", userEntity);
+                return success(resultJson);
+            } else {
+                return fail("", "验证码错误");
             }
-            //生成token
-            userEntity.setPassword(null);
-            String token = JWTUtil.getTokenByUserInfo(userEntity);
-            // 创建返回的json对象
-            JSONObject resultJson = new JSONObject();
-            resultJson.put("user", userEntity);
-            resultJson.put("type", userEntity.getRoleType());
-            resultJson.put("token", token);
-            request.getSession().setAttribute("user", userEntity);
-            return success(resultJson);
         }catch (Exception e){
             e.printStackTrace();
             return fail();
@@ -246,7 +400,32 @@ public class SystemController extends BaseController {
                 return fail("", "请先注册");
             }
             userEntity.setPassword(password);
-            this.userService.save(userEntity);
+            //区分公网版和非公网版
+            if (Constant.WEB_INSTITUTION_CODE.equals(institutionNo)){
+                String authCode = dataParam.getString("authCode");
+                JSONObject jsonVerification = dataParam.getJSONObject("verification");
+                String jsonPhone = jsonVerification.getString("phone");
+                String jsonAuthCode = jsonVerification.getString("authCode");
+                String jsonBeginTime = jsonVerification.getString("beginTime");
+                if (StringUtils.isEmpty(jsonBeginTime ) || StringUtils.isEmpty(jsonAuthCode) ) {
+                    return fail("", "请重新获取验证码");
+                }
+                //计算时间差---分钟
+                //int diff = DateUtil.getDistanceByUnit(DateUtil.parseDate(jsonBeginTime), DateUtil.getCurrentDate(), 2);
+                long diff = DateUtil.between(DateUtil.date(), DateUtil.parse(jsonBeginTime,PURE_DATETIME_PATTERN), DateUnit.MINUTE);
+                if (diff < 0 || diff > 5) {
+                    return fail("", "验证码已失效");
+                }
+                if (jsonAuthCode.equals(authCode) && jsonPhone.equals(phone)) {
+                   // this.userService.updatePassword(phone, password, institutionNo,roleType);
+                    this.userService.save(userEntity);
+                } else {
+                    return fail("", "验证码错误");
+                }
+            }else {
+                this.userService.save(userEntity);
+               // this.userService.updatePassword(phone, password, institutionNo,roleType);
+            }
             return success();
         }catch (Exception e){
             e.printStackTrace();
@@ -254,6 +433,40 @@ public class SystemController extends BaseController {
         }
     }
 
+    /**
+     * 登出
+     * @param jsonParam 参数
+     * @desc
+     * @return
+     */
+    @SafetyProcess
+    @ApiOperation(value = "登出",notes = "json字符串形式传参(加密),data参数包括:institutionNo:机构编号,phone:账号或电话,roleType:用户角色" )
+    @PostMapping("/logout")
+    public Result logout(@RequestBody String jsonParam){
+        try {
+            JSONObject dataParam = JSONObject.parseObject(AesEncryptUtils.decrypt(JSONObject.parseObject(jsonParam).getString("data")));
+            String phone = dataParam.getString("phone");
+            String institutionNo = dataParam.getString("institutionNo");
+            String roleType = dataParam.getString("roleType");
+            if ( StringUtils.isEmpty( phone)   || StringUtils.isEmpty( institutionNo ) ) {
+                return fail("", "请按要求填写所需信息");
+            }
+            //首先校验用户是否存在
+            UserEntity userEntity = userService.findPhoneAndInstitutionNoAndRoleType(phone,institutionNo,roleType);
+            if (userEntity == null){
+                return fail(null,"用户不存在");
+            }
+            if ("lan".equals(profileValue)){
+                return success();
+            }
+            boolean result = redisTemplate.delete("session:"+institutionNo+":"+phone+":"+roleType);
+            return success(result);
+        }catch (Exception e){
+            e.printStackTrace();
+            return fail();
+        }
+    }
+
     /**
      * 修改密码
      * @param jsonParam 待修改用户密码参数
@@ -265,10 +478,12 @@ public class SystemController extends BaseController {
     public Result updatePassword(@RequestBody String jsonParam){
         try {
             JSONObject jsonObject = JSONObject.parseObject(AesEncryptUtils.decrypt(JSONObject.parseObject(jsonParam).getString("data")));
-            if(!jsonObject.containsKey("id")|| StringUtils.isEmpty(jsonObject.getString("id")))
+            if(!jsonObject.containsKey("id")|| StringUtils.isEmpty(jsonObject.getString("id"))) {
                 return failBadRequest(null,"用户id不能为空!");
-            if(!jsonObject.containsKey("password")|| StringUtils.isEmpty(jsonObject.getString("password")))
+            }
+            if(!jsonObject.containsKey("password")|| StringUtils.isEmpty(jsonObject.getString("password"))) {
                 return failBadRequest(null,"登录密码不能为空!");
+            }
             String password =  jsonObject.getString("password");
             String oldPassword = jsonObject.getString("oldPassword");
             String id = jsonObject.getString("id");

+ 311 - 31
src/main/java/com/rf/psychological/utils/Constant.java

@@ -10,6 +10,16 @@ import java.util.List;
 public class Constant {
 
 
+    /**
+     * 机构起始编号
+     */
+    public static final int START_NUMBER=11000;
+
+    /**
+     * 系统决明
+     */
+    public static final String SYSTEM_INSTITUTION_ON="10006";
+
     /**
      *系统版本
      */
@@ -18,20 +28,47 @@ public class Constant {
     /**
      * 认知任务返回版本报告
      */
-    public static final String COGNITION_RESULT_VERSION ="2.0.1";
+    public static final String COGNITION_RESULT_VERSION ="2.0";
 
     /**
      * 公网版机构编号
      */
     public static final String WEB_INSTITUTION_CODE ="PUB001";
 
+    /**
+     * 公网版机构名称
+     */
+    public static final String WEB_INSTITUTION_NAME ="公网版机构";
+
+    /**
+     * 局域网版机构编号
+     */
+    public static final String LAN_INSTITUTION_CODE ="LAN001";
 
+    /**
+     * 局域网版机构名称
+     */
+    public static final String LAN_INSTITUTION_NAME ="局域网版机构";
 
     /**
      * 部分字段默认值
      */
     public static final String DEFAULT_VALUE_ZERO ="0";
 
+    /**
+     * 部分字段默认值
+     */
+    public static final String DEFAULT_VALUE_ONE ="1";
+
+    /**
+     * 问题类型 2 填空
+     */
+    public static final String QUESTION_TYPE_TWO ="2";
+
+    /**
+     * 公网版配置文件名称
+     */
+    public static final String PROFILE_PUBLIC = "public";
 
 
     /**
@@ -53,6 +90,13 @@ public class Constant {
     public static final int TEST_PLAN_STATUS_UNSTART = 2;
     public static final int TEST_PLAN_STATUS_RUNNING = 3;
 
+    /**fifteen
+     * 测试计划状态  测试状态:0--已关闭,1---手动关闭,2----未开始,3---进行中
+     */
+    public static final int NUMBER_FIVE = 5;
+
+    public static final int NUMBER_FIFTEEN = 15;
+
     /**
      * 生理信号内容
      * 类型:1为脉搏;2为心电;3为脑电
@@ -70,35 +114,59 @@ public class Constant {
     /**
      * 用户状态 1-待审核 2-审核通过 3--密码被重置需要重新登录
      */
+    public static final String USER_STATUS_UNAUDITED = "1";
     public static final String USER_STATUS_NORMAL = "2";
 
-
-    public static final String DEFAULT_VALUE_ONE = "1";
-
     /**
      * 短信相关
      */
-    public static int appId = 1400555402;
-    public static String appKey = "197596018c4565ad023c2b145f4069a1";
-    public static String smsSign = "北京决明科技";
+    /**
+     *JM
+     */
+    /*public static int appId = 1400555402;   //短信应用SDK AppID 1400开头
+    public static String appKey = "197596018c4565ad023c2b145f4069a1";   //短信应用SDK AppKey
+    public static String smsSign = "北京决明科技";    //签名 NOTE: 这里的签名"腾讯云"只是一个示例,真实的签名需要在短信控制台中申请,另外签名参数使用的是`签名内容`,而不是`签名ID`
+    public static int templateId = 1064633; //短信模板ID,需要在短信应用中申请 NOTE: 这里的模板ID`7839`只是一个示例,真实的模板ID需要在短信控制台中申请*/
+    /**
+     *HD
+     */
+    public static int appId = 1400863104;
+    public static String appKey = "ff6f89586c9d9adb0fc201536bfe3de9";
+    public static String smsSign = "河南红朵科技";
+    public static int templateId = 1966205;
+
     /** 默认分组的名称  **/
     public static final String DEFAULT_GROUP_NAME = "默认分组";
+    /** 朴拙设备唯一标识  **/
+    //public static final String DEFAULT_PZ_UUID = "1cccbc5d7ec1496693ee0d00550033a2211f579fe3c6bf5db2213b813dad31b3";
+    public static final String DEFAULT_PZ_UUID = "a50cc73bb252958435bd5a7645eecfec";
+    public static final String DEFAULT_REGISTRY_PATH = "SOFTWARE\\Microsoft\\Cryptography";
+    public static final String DEFAULT_REGISTRY_KEY = "MachineGuid";
 
     /**
      * 默认密码
      */
     public static final String DEFAULT_PASSWORD = "123456";
-
+/**测试类型 匹茨堡睡眠质量指数**/
+//public static final String QUEST_TYPE_PSQI="PSQI";
+/**测试类型 心境状态量表POMS**/
+//public static final String QUEST_TYPE_POMS = "POMS";
     /**
      * 测试类型症状自评量表(SCL-90)
      **/
     public static final String QUEST_TYPE_SCL = "SCL";
-
+    /**
+     * 艾森克人格量表
+     **/
+    public static final String QUEST_TYPE_ASK = "ASK";
     /**
      * 汉化版美国航空航天局任务负荷指数量表
      **/
     public static final String QUEST_TYPE_AVAI = "AVIA";
-
+    /**
+     * 社会支持评定量表
+     **/
+    public static final String QUEST_TYPE_SUPP = "SUPP";
     /**
      * 抑郁焦虑压力量表
      **/
@@ -107,16 +175,26 @@ public class Constant {
      * 正性负性情绪量表
      **/
     public static final String QUEST_TYPE_MOOD = "MOOD";
-
-
+    /**
+     * 状态-特质焦虑量表
+     **/
+    public static final String QUEST_TYPE_STATUS = "STATUS";
+    /**
+     * 生活事件量表
+     **/
+    public static final String QUEST_TYPE_LIFE = "LIFE";
     /**
      * 瑞文智力测试
      **/
     public static final String QUEST_TYPE_RIVEN = "RIVEN";
     /**
-     * GO-NO-GO反应抑制测试
+     * Go/No-go冲动抑制测试
      **/
     public static final String QUEST_TYPE_GO_NO_GO = "GO_NO-GO";
+    /**
+     * Go/No-go冲动抑制测试(成瘾版)
+     **/
+    public static final String QUEST_TYPE_GO_NO_GO_ADDICTION = "GO_NO-GO_ADDICTION";
     /**
      * 工作记忆能力测试(字母记忆)
      **/
@@ -129,6 +207,14 @@ public class Constant {
      * 精神运动警觉度测试
      **/
     public static final String QUEST_TYPE_ALERTNESS = "ALERTNESS";
+    /**
+     * 精神运动警觉度测试(儿童版)
+     **/
+    public static final String QUEST_TYPE_ALERTNESS_CHILD = "ALERTNESS_CHILD";
+    /**
+     * 精神运动警觉度测试(成瘾版)
+     **/
+    public static final String QUEST_TYPE_ALERTNESS_ADDICTION = "ALERTNESS_ADDICTION";
     /**
      * 游戏4
      **/
@@ -138,14 +224,22 @@ public class Constant {
      **/
     public static final String QUEST_TYPE_ADDITION = "ADDITION";
     /**
-     * 节奏诊断
+     * 靶向神经振荡评估与训练
      **/
     public static final String QUEST_TYPE_RHYTHM = "RHYTHM";
     /**
      * 形状知觉测试(自上而下)
      **/
     public static final String QUEST_TYPE_SHAPE = "SHAPE";
+    /**
+     * 形状知觉测试(随机)
+     **/
+    public static final String QUEST_TYPE_SHAPE_RANDOM = "SHAPE_RANDOM";
 
+    /**
+     * 形状知觉测试儿童版
+     */
+    public static final String QUEST_TYPE_SHAPE_CHILD = "SHAPE_CHILD";
     /**
      * 游戏2
      **/
@@ -162,6 +256,10 @@ public class Constant {
      * 运动知觉测试
      **/
     public static final String QUEST_TYPE_MOVEMENT = "MOVEMENT";
+    /**
+     * 运动知觉测试儿童版
+     **/
+    public static final String QUEST_TYPE_MOVEMENT_CHILD = "MOVEMENT_CHILD";
     /**
      * 注意力网络测试
      **/
@@ -178,38 +276,89 @@ public class Constant {
      * 注意力网络测试(儿童版)
      **/
     public static final String QUEST_TYPE_ANT_FISH = "ANTFISH";
+    /**
+     * 注意力网络测试(儿童版)V2
+     **/
+    public static final String QUEST_TYPE_ANT_FISH_V2 = "ANTFISH_V2";
     /**
      * 画钟测试
      **/
     public static final String QUEST_TYPE_CDT = "CDT";
     /**
-     * 蒙特利尔认知测试
+     * 蒙特利尔认知评估量表(MoCA)
      **/
     public static final String QUEST_TYPE_MOCA = "MOCA";
+    /**
+     * 蒙特利尔认知评估量表-(定制版)
+     **/
+    public static final String QUEST_TYPE_MOCAV3 = "MOCAV3";
+    /**
+     * 蒙特利尔认知评估量表V4
+     **/
+    public static final String QUEST_TYPE_MOCAV4 = "MOCAV4";
+    /**
+     * 蒙特利尔认知评估量表V2
+     **/
+    public static final String QUEST_TYPE_MOCA_v2 = "MOCA_v2";
     /**
      * 简易精神状态测试
      **/
     public static final String QUEST_TYPE_MMSE = "MMSE";
+    /**
+     * 简易精神状态测试-(定制版)
+     **/
+    public static final String QUEST_TYPE_MMSEV3 = "MMSEV3";
+    /**
+     * 简易精神状态测试V2
+     **/
+    public static final String QUEST_TYPE_MMSE_V2 = "MMSE_V2";
     /**
      * 听觉测试
      **/
     public static final String QUEST_TYPE_BIC = "BIC";
     /**
-     * 综合记忆能力测试
+     * 听觉测试(开发版)
+     **/
+    public static final String QUEST_TYPE_BIC_V2 = "BIC_V2";
+    /**
+     * 综合记忆能力测试(旧版)
      **/
     public static final String QUEST_TYPE_RTC = "RTC";
+    /**
+     * 综合记忆能力测试
+     **/
+    public static final String QUEST_TYPE_RTC_CHILD = "RTC_CHILD";
     /**
      * 工作记忆能力测试(空间记忆)
      **/
     public static final String QUEST_TYPE_MEMORYT = "MemoryTest";
+    /**
+     * 工作记忆能力测试(空间记忆)2
+     **/
+    public static final String QUEST_TYPE_MEMORYT2 = "MemoryTestChildren";
+    /**
+     * 工作记忆能力测试(空间记忆)3
+     **/
+    public static final String QUEST_TYPE_MEMORYTV3 = "MemoryTestV3";
     /**
      * 目标追踪测试
      **/
     public static final String QUEST_TYPE_GTCT = "GTCT";
-
+    /**
+     * 目标追踪测试
+     */
+    public static final String QUEST_TYPE_GTCT_CHILD = "CHILD";
+    /**
+     * 多目标追踪(儿童版)
+     */
+    public static final String QUEST_TYPE_MTT_CHILD = "MTT_CHILD";
+    /**
+     * 多目标追踪(训练版)
+     */
+    public static final String QUEST_TYPE_MTT = "MTT";
 
     /**
-     * Go-No-go冲动抑制测试(高级版)
+     * Go/No-go冲动抑制测试(高级版)
      **/
     public static final String QUEST_TYPE_GO_NO_GO2 = "GO_NO-GO2";
     /**
@@ -277,6 +426,15 @@ public class Constant {
      * etb1:面部表情识别任务
      **/
     public static final String QUEST_TYPE_ETB01 = "ETB01";
+
+    /**
+     * 情绪测试1:人脸表情识别V2
+     **/
+    public static final String QUEST_TYPE_ETB01_V2 = "ETB01_V2";
+    /**
+     * ETB抑郁筛查(成瘾版)
+     **/
+    public static final String QUEST_TYPE_ETB_ADDICTION = "ETB_ADDICTION";
     /**
      * ECAT::情绪分类任务
      **/
@@ -296,6 +454,18 @@ public class Constant {
      * 三个总和
      **/
     public static final String QUEST_TYPE_EALL = "EALL";
+    /**
+     * 情绪测试3:点探测(成瘾版)
+     **/
+    public static final String QUEST_TYPE_FACEDOT_ADDICTION = "FACEDOT_ADDICTION";
+    /**
+     * 情绪测试3:点探测(儿童版)
+     **/
+    public static final String QUEST_TYPE_FDOT_CHILD = "FDOT_CHILD";
+    /**
+     * 情绪测试2:词汇测试(成瘾版)
+     **/
+    public static final String QUEST_TYPE_ECAT_ADDICTION = "ECAT_ADDICTION";
     /**
      * Faces Dot Probe Task (FDOT)
      **/
@@ -315,11 +485,40 @@ public class Constant {
      **/
     public static final String QUEST_TYPE_STROOP= "STROOP";
 
+    /**
+     * Stroop任务
+     **/
+    public static final String QUEST_TYPE_STROOP_TASK= "STROOP_TASK";
+
     /**
      * 数字符号转换测验
      **/
     public static final String QUEST_TYPE_DSST= "DSST";
 
+    /**
+     * 心理资本
+     **/
+    public static final String QUEST_TYPE_PSY_CAPITAL= "PSY_CAPITAL";
+
+    /**
+     * 数字广度测验(语音版)
+     **/
+    public static final String QUEST_TYPE_DST_VOICE = "DST_VOICE";
+
+    /**
+     * 面孔情绪评价任务
+     **/
+    public static final String QUEST_TYPE_EAT= "EAT";
+
+    /**
+     * 情绪图片评定任务
+     **/
+    public static final String QUEST_TYPE_EPRT= "EPRT";
+
+    /**
+     * 神分裂症语义距离度量
+     **/
+    public static final String QUEST_TYPE_STFS= "STFS";
 
     /**
      * 量表类型
@@ -338,41 +537,64 @@ public class Constant {
     /**
      * 量表测试文件SHEET名
      **/
-
+    public static final String SHEET_NAME_ASK = "艾森克人格量表";
+    //public static final String SHEET_NAME_PSQI = "匹兹堡睡眠质量指数";
+//public static final String SHEET_NAME_POMS = "心境状态量表";
     public static final String SHEET_NAME_SCL = "症状自评量表(SCL-90)";
     public static final String SHEET_NAME_AVAI = "汉化版美国航空航天局任务负荷指数量表";
     public static final String SHEET_NAME_SUPP = "社会支持评定量表";
     public static final String SHEET_NAME_DEPR = "抑郁焦虑压力表";
-
+    public static final String SHEET_NAME_MOOD = "正性负性情绪量表";
+    public static final String SHEET_NAME_STATUS = "状态-特质焦虑量表";
     /**
      * 认知任务测试
      **/
     public static final String SHEET_NAME_RIVEN = "瑞文智力测试";
-    public static final String SHEET_NAME_GO_NO_GO = "GO-NO-GO反应抑制测试";
+    public static final String SHEET_NAME_GO_NO_GO = "Go_No-go冲动抑制测试";//不要修改名称,特殊字符/会在生成文件时报错
+    public static final String SHEET_NAME_GO_NO_GO_ADDICTION = "Go_No-go冲动抑制测试(成瘾版)";
+    public static final String SHEET_NAME_GO_NO_GO2 = "Go_No-go冲动抑制测试(高级版)";
     public static final String SHEET_NAME_ALERTNESS = "精神运动警觉度测试";
+    public static final String SHEET_NAME_ALERTNESS_CHILD = "精神运动警觉度测试(儿童版)";
+    public static final String SHEET_NAME_ALERTNESS_ADDICTION = "精神运动警觉度测试(成瘾版)";
     public static final String SHEET_NAME_ALERTNESS_YATAI = "游戏4";
     public static final String SHEET_NAME_ADDITION = "连续加法测试";
     public static final String SHEET_NAME_CATTELL = "卡氏十六种人格因素量表";
     public static final String SHEET_NAME_MEMORY = "工作记忆能力测试(字母记忆)";
     public static final String SHEET_NAME_MEMORY_YATAI = "游戏3";
-    public static final String SHEET_NAME_RHYTHM = "节奏诊断";
+    public static final String SHEET_NAME_RHYTHM = "靶向神经振荡评估与训练";
     public static final String SHEET_NAME_SHAPE = "形状知觉测试(自上而下)";
+    public static final String SHEET_NAME_SHAPE_RANDOM = "形状知觉测试(随机)";
+    public static final String SHEET_NAME_SHAPE_CHILD = "形状知觉测试儿童版";
     public static final String SHEET_NAME_SHAPE_YATAI = "游戏2";
     public static final String SHEET_NAME_SHAPE2 = "形状知觉测试(自下而上)";
     public static final String SHEET_NAME_UNCERTAIN = "不确定信息决策";
     public static final String SHEET_NAME_MOVEMENT = "运动知觉测试";
+    public static final String SHEET_NAME_MOVEMENT_CHILD = "运动知觉测试儿童版";
     public static final String SHEET_NAME_ANT = "注意力网络测试";
     public static final String SHEET_NAME_ANT_YATAI = "游戏1";
     public static final String SHEET_NAME_ANT_FISH_YATAI = "游戏5";
     public static final String SHEET_NAME_ANT_FISH = "注意力网络测试(儿童版)";
+    public static final String SHEET_NAME_ANT_FISH_V2 = "注意力网络测试(儿童版)V2";
     public static final String SHEET_NAME_CDT = "画钟测试";
-    public static final String SHEET_NAME_MOCA = "蒙特利尔认知测试";
+    public static final String SHEET_NAME_MOCA = "蒙特利尔认知评估量表(MoCA)";
+    public static final String SHEET_NAME_MOCAV3 = "蒙特利尔认知评估量表-(定制版)";
+
+    public static final String SHEET_NAME_MOCAV4 = "蒙特利尔认知评估量表V4";
+    public static final String SHEET_NAME_MOCA_v2 = "蒙特利尔认知评估量表V2";
     public static final String SHEET_NAME_MMSE = "简易精神状态测试";
+    public static final String SHEET_NAME_MMSEV3 = "简易精神状态测试-(定制版)";
+    public static final String SHEET_NAME_MMSE_V2 = "简易精神状态测试V2";
     public static final String SHEET_NAME_BIC = "听觉测试";
-    public static final String SHEET_NAME_RTC = "综合记忆能力测试";
+    public static final String SHEET_NAME_BIC_V2 = "听觉测试(开发版)";
+    public static final String SHEET_NAME_RTC = "综合记忆能力测试(旧版)";
+    public static final String SHEET_NAME_RTC_CHILD = "综合记忆能力测试";
     public static final String SHEET_NAME_MEMORYT = "工作记忆能力测试(空间记忆)";
-    public static final String SHEET_NAME_GTCT = "目标追踪测试";
-    public static final String SHEET_NAME_GO_NO_GO2 = "Go-No-go冲动抑制测试(高级版)";
+    public static final String SHEET_NAME_MEMORYT2 = "工作记忆能力测试(空间记忆)2";
+    public static final String SHEET_NAME_MEMORYTV3 = "工作记忆能力测试(空间记忆)3";
+    //public static final String SHEET_NAME_GTCT = "目标追踪测试";
+    public static final String SHEET_NAME_GTCT = "视觉追踪能力测试";
+    public static final String SHEET_NAME_MTT_CHILD = "多目标追踪(儿童版)";
+    public static final String SHEET_NAME_MTT = "多目标追踪(训练版)";
     public static final String SHEET_NAME_RDT = "风险决策能力测试";
     public static final String SHEET_NAME_SC = "时间知觉能力测试";
     public static final String SHEET_NAME_GBE = "枪林弹雨";
@@ -388,15 +610,26 @@ public class Constant {
     public static final String SHEET_NAME_BSNTask = "Boston命名测验";
     public static final String SHEET_NAME_AMWSTask = "动物词语流畅性测试";
     public static final String SHEET_NAME_ETB01 = "人脸表情识别任务";
+    public static final String SHEET_NAME_ETB01_V2 = "情绪测试1:人脸表情识别V2";
+    public static final String SHEET_NAME_ETB_ADDICTION = "ETB抑郁筛查(成瘾版)";
     public static final String SHEET_NAME_ECAT = "情绪分类任务";
-    public static final String SHEET_NAME_EREC = "EREC";
+    public static final String SHEET_NAME_EREC = "词汇回忆";
     public static final String SHEET_NAME_EMEM = "情绪识别记忆任务";
-    public static final String SHEET_NAME_EALL = "情绪测试3-词汇测试";
-    public static final String SHEET_NAME_FDOT = "FDOT";
+    public static final String SHEET_NAME_EALL = "情绪测试2-词汇测试";
+    public static final String SHEET_NAME_FACEDOT_ADDICTION = "情绪测试3:点探测(成瘾版)";
+    public static final String SHEET_NAME_FDOT_CHILD = "情绪测试3:点探测(儿童版)";
+    public static final String SHEET_NAME_ECAT_ADDICTION = "情绪测试2:词汇测试(成瘾版)";
+    public static final String SHEET_NAME_FDOT = "情绪测试3:点探测";
     public static final String SHEET_NAME_ZBMHA = "征冰心理健康测评";
     public static final String SHEET_NAME_VAS= "视觉模拟渴求";
     public static final String SHEET_NAME_STROOP= "Stroop试验";
+    public static final String SHEET_NAME_STROOP_TASK= "Stroop任务";
     public static final String SHEET_NAME_DSST= "数字符号转换测验";
+    public static final String SHEET_NAME_PSY_CAPITAL= "心理资本";
+    public static final String SHEET_NAME_DST_VOICE= "数字广度测验(语音版)";
+    public static final String SHEET_NAME_EAT= "面孔情绪评价任务";
+    public static final String SHEET_NAME_EPRT= "情绪图片评定任务";
+    public static final String SHEET_NAME_STFS= "神分裂症语义距离度量";
 
 
 /** 基础常量 工作记忆能力测试 **/
@@ -410,7 +643,14 @@ public class Constant {
     public static int CHAR_COUNT = 18;
 
 
+    /**
+     * 魔法数
+     **/
 
+    /*public static String MAGIC_NUM_0 = "0";
+    public static String MAGIC_NUM_1 = "1";
+    public static String MAGIC_NUM_2 = "2";
+    public static String MAGIC_NUM_MINUS_1 = "-1";*/
     /**
      * 题目类型:单选题
      */
@@ -421,9 +661,45 @@ public class Constant {
      */
     public static final String MAGIC_NUM_1 = "1";
     /**
-     * 题目类型:填空题
+     * 题目类型:文本
      */
     public static final String MAGIC_NUM_2 = "2";
+    /**
+     * 题目类型:数字
+     */
+    public static final String MAGIC_NUM_3 = "3";
+    /**
+     * 题目类型:日期
+     */
+    public static final String MAGIC_NUM_4 = "4";
+    /**
+     * 题目类型:下拉选
+     */
+    public static final String MAGIC_NUM_5 = "5";
+    /**
+     * 题目类型:跳转单选(如果填过后边题目直接结束提交,跳转题号为最后一题+1)
+     */
+    public static final String MAGIC_NUM_6 = "6";
+    /**
+     * 题目类型:说明单选
+     */
+    public static final String MAGIC_NUM_7 = "7";
+    /**
+     * 题目类型:附图单选
+     */
+    public static final String MAGIC_NUM_8 = "8";
+    /**
+     * 题目类型:附图多选
+     */
+    public static final String MAGIC_NUM_9 = "9";
+    /**
+     * 题目类型:附说明单选
+     */
+    public static final String MAGIC_NUM_10 = "10";
+    /**
+     * 题目类型:附说明多选
+     */
+    public static final String MAGIC_NUM_11 = "11";
     /**
      * 题目类型:复杂类型  单选,填空
      */
@@ -462,7 +738,10 @@ public class Constant {
      * 焦虑自评量表
      **/
     public static final String QUEST_FLAG_SAS = "20210617000853";
-
+    /**
+     * 密歇根酒精依赖调查表
+     **/
+    public static final String QUEST_FLAG_MAST = "20210628131017";
     /**
      * Beck自杀意念量表
      **/
@@ -1455,4 +1734,5 @@ public class Constant {
     public static final String USER_PLAN_STATUS_UNCOMPLETED = "0";
     public static final String USER_PLAN_STATUS_COMPLETED = "9";
 
+    public static final String EXCLUDE_PACKAGE_NAME = "wxpay";
 }