Forráskód Böngészése

init: init project step4: biz code support

shc 1 éve
szülő
commit
13d9774a36

BIN
doc/API/梦网平台 API V5.7.2 接口说明(标准平台).doc


+ 35 - 35
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/MobileController.java

@@ -33,49 +33,49 @@ import java.util.stream.Collectors;
 @RequestMapping("/mobile")
 public class MobileController {
 
-	private static final Integer FINA_ROLE_CODE = 7;
+    private static final Integer FINA_ROLE_CODE = 7;
 
-	private final MobileService mobileService;
-	private final SysUserService userService;
-	private final SysUserRoleService userRoleService;
+    private final MobileService cnbgMobileService;
+    private final SysUserService userService;
+    private final SysUserRoleService userRoleService;
 
-	@Inner(value = false)
-	@GetMapping("/{mobile}")
-	public R sendSmsCode(@PathVariable String mobile) {
-		return mobileService.sendSmsCode(mobile);
-	}
+    @Inner(value = false)
+    @GetMapping("/{mobile}")
+    public R<Boolean> sendSmsCode(@PathVariable String mobile) {
+        return cnbgMobileService.sendSmsCode(mobile);
+    }
 
 
-	@Inner(value = false)
-	@GetMapping("/pc/{mobile}")
-	public R sendSmsCodePc(@PathVariable String mobile) {
-		return mobileService.sendSmsCodePc(mobile);
-	}
+    @Inner(value = false)
+    @GetMapping("/pc/{mobile}")
+    public R<Boolean> sendSmsCodePc(@PathVariable String mobile) {
+        return cnbgMobileService.sendSmsCodePc(mobile);
+    }
 
-	/**
-	 * 财务管理员发送验证码
-	 *
-	 * @return 发送结果
-	 */
-	@Inner(value = false)
-	@GetMapping("/for-fina")
-	public R<?> sendSmsCodeForFina(@RequestParam(value = "userId") Integer userId) {
+    /**
+     * 财务管理员发送验证码
+     *
+     * @return 发送结果
+     */
+    @Inner(value = false)
+    @GetMapping("/for-fina")
+    public R<?> sendSmsCodeForFina(@RequestParam(value = "userId") Integer userId) {
 
-		List<SysUserRole> userRoles = userRoleService.list(Wrappers.<SysUserRole>lambdaQuery().eq(SysUserRole::getUserId, userId));
+        List<SysUserRole> userRoles = userRoleService.list(Wrappers.<SysUserRole>lambdaQuery().eq(SysUserRole::getUserId, userId));
 
-		Set<Integer> roles = userRoles.stream().mapToInt(SysUserRole::getRoleId).boxed().collect(Collectors.toSet());
-		log.info("roles:{}", roles);
-		if (!roles.contains(FINA_ROLE_CODE)) {
-			return R.failed("请联系管理员开通财务管理员权限");
-		}
+        Set<Integer> roles = userRoles.stream().mapToInt(SysUserRole::getRoleId).boxed().collect(Collectors.toSet());
+        log.info("roles:{}", roles);
+        if (!roles.contains(FINA_ROLE_CODE)) {
+            return R.failed("请联系管理员开通财务管理员权限");
+        }
 
-		// 获取用户信息判断,是否需要发送验证码
-		SysUser sysUser = userService.getById(userId);
-		log.info("是否需要发送验证码temp3:{}", sysUser.getTemp3());
-		boolean need = StrUtil.isBlank(sysUser.getTemp3());
-		Boolean smsSucc = mobileService.sendSmsCodeForFina(sysUser.getUsername(), need);
-		return R.ok(smsSucc, smsSucc ? "成功" : "失败");
+        // 获取用户信息判断,是否需要发送验证码
+        SysUser sysUser = userService.getById(userId);
+        log.info("是否需要发送验证码temp3:{}", sysUser.getTemp3());
+        boolean need = StrUtil.isBlank(sysUser.getTemp3());
+        Boolean smsSucc = cnbgMobileService.sendSmsCodeForFina(sysUser.getUsername(), need);
+        return R.ok(smsSucc, smsSucc ? "成功" : "失败");
 
-	}
+    }
 
 }

+ 14 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserController.java

@@ -278,7 +278,7 @@ public class SysUserController {
     }
 
     /**
-     * 添加用户
+     * 更新密码
      *
      * @param userPwd 用户信息
      * @return success/false
@@ -292,6 +292,19 @@ public class SysUserController {
         return userService.updatePwd(userPwd);
     }
 
+    /**
+     * 暂不修改密码
+     *
+     * @return success/false
+     */
+    @SysLog("暂不修改密码")
+    @PostMapping("/pwd/exceeding")
+    public R<?> exceedingPwdChangeTime() {
+
+        return R.ok(userService.exceedingPwdChangeTime(SecurityUtils.getUser()));
+    }
+
+
     /**
      * 添加用户
      *

+ 4 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/MobileService.java

@@ -1,5 +1,6 @@
 package com.qunzhixinxi.hnqz.admin.service;
 
+import com.qunzhixinxi.hnqz.common.core.exception.BizException;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 
 /**
@@ -34,5 +35,7 @@ public interface MobileService {
      * @param need   是否需要发送
      * @return 发送结果
      */
-    Boolean sendSmsCodeForFina(String mobile, Boolean need);
+    default Boolean sendSmsCodeForFina(String mobile, Boolean need) {
+        throw new BizException("不支持财务管理员发送验证码");
+    }
 }

+ 7 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserService.java

@@ -138,6 +138,11 @@ public interface SysUserService extends IService<SysUser> {
      */
     List<Tree<Long>> getUserAreaTree(Long id);
 
-
-
+    /**
+     * 密码延期
+     *
+     * @param user 操作人
+     * @return 延期结果
+     */
+    Boolean exceedingPwdChangeTime(HnqzUser user);
 }

+ 204 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/CnbgMobileServiceImpl.java

@@ -0,0 +1,204 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
+import com.aliyuncs.exceptions.ClientException;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.qunzhixinxi.hnqz.admin.api.dto.UserDTO;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysRole;
+import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
+import com.qunzhixinxi.hnqz.admin.mapper.SysUserMapper;
+import com.qunzhixinxi.hnqz.admin.service.MobileService;
+import com.qunzhixinxi.hnqz.admin.util.CnbgSendSmsUtils;
+import com.qunzhixinxi.hnqz.admin.util.SendSms;
+import com.qunzhixinxi.hnqz.common.core.constant.CacheConstants;
+import com.qunzhixinxi.hnqz.common.core.constant.SecurityConstants;
+import com.qunzhixinxi.hnqz.common.core.constant.enums.LoginTypeEnum;
+import com.qunzhixinxi.hnqz.common.core.util.R;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * 中生短信服务
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2024/05/24 12:02
+ */
+@Slf4j
+@Service("cnbgMobileService")
+@AllArgsConstructor
+public class CnbgMobileServiceImpl implements MobileService {
+
+    private final RedisTemplate<String, String> redisTemplate;
+
+    private final SysUserMapper userMapper;
+
+    /**
+     * 发送手机验证码
+     *
+     * @param mobile mobile
+     * @return code
+     */
+    @Override
+    public R<Boolean> sendSmsCode(String mobile) {
+        UserDTO userDTO = new UserDTO();
+        userDTO.setPlatId(mobile);
+        List<UserVO> userListNew = userMapper.getUserVoByPlatId(userDTO);
+        boolean sendFlag = false;
+        String tempCode = null;
+        List<UserVO> userList = new ArrayList<>();
+        if (CollUtil.isNotEmpty(userListNew)) {
+            for (UserVO userVO : userListNew) {
+                Set<Integer> collect = userVO.getRoleList().stream().map(SysRole::getRoleId).collect(Collectors.toSet());
+                if (CollUtil.isNotEmpty(userVO.getRoleList())) {
+                    boolean isLevel2 = false;
+                    boolean isLevel3 = false;
+                    boolean isLevel4 = false;
+                    boolean isLevel5 = false;
+                    boolean isLevel6 = false;
+                    boolean isLevel10 = false;
+                    boolean isLevel13 = false;
+                    boolean isLevel31 = false;
+
+                    for (SysRole sysRole : userVO.getRoleList()) {
+                        if (sysRole.getRoleId() == 2) {
+                            isLevel2 = true;
+                        } else if (sysRole.getRoleId() == 3) {
+                            isLevel3 = true;
+                        } else if (sysRole.getRoleId() == 4) {
+                            isLevel4 = true;
+                        } else if (sysRole.getRoleId() == 5) {
+                            isLevel5 = true;
+                        } else if (sysRole.getRoleId() == 6) {
+                            isLevel6 = true;
+                        } else if (sysRole.getRoleId() == 10) {
+                            isLevel10 = true;
+                        } else if (sysRole.getRoleId() == 13) {
+                            // 患者教育-HCP角色
+                            isLevel13 = true;
+                        } else if (sysRole.getRoleId() == 31) {
+                            // 招商经理角色
+                            isLevel31 = true;
+                        }
+
+                        if (isLevel5 || isLevel6 || isLevel10 || isLevel13 || isLevel31) {
+                            userList.add(userVO);
+                        }
+                    }
+                }
+                if (!sendFlag && StringUtils.isNotEmpty(userVO.getTemp4())) {
+                    if (StrUtil.isNotBlank(userVO.getTemp4())) {
+                        sendFlag = true;
+                        tempCode = userVO.getTemp4();
+                    }
+                }
+            }
+
+        } else {
+            log.info("请联系管理员为您开通账号:{}", mobile);
+            return R.ok(Boolean.FALSE, "请联系管理员为您开通账号");
+        }
+
+        if (CollUtil.isNotEmpty(userList)) {
+            log.info("请联系管理员为您开通账号:{}", mobile);
+            return R.ok(Boolean.FALSE, "请联系管理员为您开通账号");
+        }
+
+        Object codeObj = redisTemplate.opsForValue().get(CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + mobile);
+
+        if (codeObj != null) {
+            log.info("手机号验证码未过期:{},{}", mobile, codeObj);
+            return R.ok(Boolean.FALSE, "验证码发送过频繁");
+        }
+
+        String code = RandomUtil.randomNumbers(Integer.parseInt(SecurityConstants.CODE_SIZE));
+
+        if (sendFlag) {
+            code = "1".equals(tempCode) ? "5657" : tempCode;
+        }
+
+        if (!sendFlag) {
+            CnbgSendSmsUtils.sendSms(userListNew.get(0).getRealname(), mobile, code, "5");
+        }
+        log.debug("手机号生成验证码成功:{},{}", mobile, code);
+        redisTemplate.opsForValue().set(CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + mobile, code, SecurityConstants.CODE_TIME, TimeUnit.SECONDS);
+        return R.ok(Boolean.TRUE, "验证码发送成功");
+    }
+
+
+    /**
+     * 发送手机验证码 TODO: 调用短信网关发送验证码,测试返回前端
+     *
+     * @param mobile mobile
+     * @return code
+     */
+    @Override
+    public R<Boolean> sendSmsCodePc(String mobile) {
+        UserDTO userDTO = new UserDTO();
+        userDTO.setPlatId(mobile);
+        List<UserVO> userListNew = userMapper.getUserVoByPlatId(userDTO);
+
+        if (CollUtil.isNotEmpty(userListNew)) {
+            for (UserVO userVO : userListNew) {
+                Set<Integer> roleList = userVO.getRoleList().stream().map(SysRole::getRoleId).collect(Collectors.toSet());
+                if (roleList.contains(5) || roleList.contains(6)) {
+                    log.info("服务商业务员不能登录管理端:{}", mobile);
+                    return R.ok(Boolean.FALSE, "服务商业务员不能登录管理端");
+                }
+            }
+        } else {
+            log.info("请联系管理员为您开通账号:{}", mobile);
+            return R.ok(Boolean.FALSE, "请联系管理员为您开通账号");
+        }
+
+        Object codeObj = redisTemplate.opsForValue().get(CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + mobile);
+
+        if (codeObj != null) {
+            log.info("手机号验证码未过期:{},{}", mobile, codeObj);
+            return R.ok(Boolean.FALSE, "验证码发送过频繁");
+        }
+
+        String code = RandomUtil.randomNumbers(Integer.parseInt(SecurityConstants.CODE_SIZE));
+        CnbgSendSmsUtils.sendSms(userListNew.get(0).getRealname(), mobile, code, "5");
+        log.debug("手机号生成验证码成功:{},{}", mobile, code);
+        redisTemplate.opsForValue().set(CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + mobile, code, SecurityConstants.CODE_TIME, TimeUnit.SECONDS);
+        return R.ok(Boolean.TRUE, "验证码发送成功");
+    }
+
+
+    private Boolean sendSms(String mobile, Boolean need) {
+
+
+        final String key = CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + mobile + "@fina";
+        Object code = redisTemplate.opsForValue().get(key);
+
+        final String codeStr = Objects.isNull(code) ? (need ? RandomUtil.randomNumbers(Integer.parseInt(SecurityConstants.CODE_SIZE)) : "5657") : code.toString();
+
+        boolean res = false;
+        try {
+            if (need) {
+                res = SendSms.sendSmsCode1(mobile, codeStr);
+            }
+            log.debug("手机号生成验证码成功:{},{}", mobile, codeStr);
+
+            redisTemplate.opsForValue().set(key, codeStr, SecurityConstants.CODE_TIME, TimeUnit.SECONDS);
+        } catch (ClientException | InterruptedException e) {
+            log.error("手机号生成验证码失败", e);
+        }
+
+        return res;
+    }
+}

+ 13 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserServiceImpl.java

@@ -216,6 +216,19 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return areaEntityService.selectTree(areas);
     }
 
+    /**
+     * 密码延期
+     *
+     * @param user 操作人
+     * @return 延期结果
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean exceedingPwdChangeTime(HnqzUser user) {
+
+        return this.update(Wrappers.<SysUser>lambdaUpdate().eq(SysUser::getUserId, user.getId()).set(SysUser::getLatestChangePwdTime, LocalDateTime.now()));
+    }
+
     /**
      * 封装错误信息
      *

+ 99 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/CnbgSendSmsUtils.java

@@ -0,0 +1,99 @@
+package com.qunzhixinxi.hnqz.admin.util;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.core.util.URLUtil;
+import cn.hutool.crypto.digest.DigestUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONUtil;
+import lombok.experimental.UtilityClass;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 中生短信工具类
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2024/05/24 12:06
+ */
+@UtilityClass
+public class CnbgSendSmsUtils {
+
+    // 用户账号:长度最大6个字符,统一大写
+    private static final String USER_ID = "JA1105";
+    // 用户密码:定长小写32位字符
+    private static final String PWD = "123963";
+    // 发送地址
+    private static final String URL = "http://211.100.34.185:8016/sms/v2/std/send_single";
+    private static final String CONTENT_TYPE = "application/json;charset=UTF-8";
+    private static final String TIMESTAMP_PATTERN = "MMddHHmmss";
+    private static final String CONTENT_PATTERN = "您好,%s,本次登录验证码为:%s,有效期%s分钟";
+
+    /**
+     * 发送短信验证码
+     *
+     * @param realName   真实名称
+     * @param mobile     手机号
+     * @param randomCode 随机码
+     * @param expires    过期时间(分钟)
+     * @return 发送结果
+     */
+    public static String sendSms(String realName, String mobile, String randomCode, String expires) {
+
+        String timestamp = getTimestamp();
+
+        Map<String, String> bodyMap = new HashMap<>();
+        bodyMap.put("userid", USER_ID);
+        bodyMap.put("pwd", encodePwd(timestamp));
+        bodyMap.put("mobile", mobile.trim());
+
+        String plainContent = String.format(CONTENT_PATTERN, realName, randomCode, expires);
+        bodyMap.put("content", encodeContent(plainContent));
+        bodyMap.put("timestamp", timestamp);
+
+        return HttpUtil.createPost(URL).contentType(CONTENT_TYPE).body(JSONUtil.toJsonStr(bodyMap)).execute().body();
+
+    }
+
+
+    private static String getTimestamp() {
+        return DateTimeFormatter.ofPattern(TIMESTAMP_PATTERN).format(LocalDateTime.now());
+    }
+
+    /**
+     * pwd的密码加密方式如下:将userid值大写、固定字符串00000000、明文pwd、timestamp依次拼接成字符串后,再进行MD5加密
+     *
+     * @param timestamp 时间戳
+     * @return 加密密码
+     */
+    private static String encodePwd(String timestamp) {
+        String plainText = String.format("%s%s%s%s", USER_ID, "00000000", PWD, timestamp);
+
+        return DigestUtil.md5Hex(plainText);
+    }
+
+    /**
+     * 短信内容:最大支持1000个字(含签名),发送时请预留至少10个字的签名长度,一个字母或一个汉字都视为一个字。本字段支持加密传输,若不使用加密功能编码方式:
+     * UrlEncode("验证码:6666,打死都不要告诉别人哦!","UTF-8")
+     *
+     * @param content 内容明文
+     * @return 加密后的内容
+     */
+    private static String encodeContent(String content) {
+        return URLUtil.encode(content, CharsetUtil.CHARSET_UTF_8);
+    }
+
+    public static void main(String[] args) {
+        String body = sendSms("张三", "13371xxxxx9", "1234", "1");
+
+        System.out.println(body);
+    }
+
+
+}