Browse Source

Merge branch 'feat-230222-sms'

shc 2 years ago
parent
commit
a4b2634bf3

+ 37 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java

@@ -17,6 +17,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.zxing.WriterException;
@@ -106,6 +107,7 @@ import com.qunzhixinxi.hnqz.admin.util.Html2ImageByJsWrapper;
 import com.qunzhixinxi.hnqz.admin.util.QRCodeGenerator;
 import com.qunzhixinxi.hnqz.admin.view.user.UserUpdateInput;
 import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
+import com.qunzhixinxi.hnqz.common.core.constant.enums.LoginTypeEnum;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.log.annotation.SysLog;
 import com.qunzhixinxi.hnqz.common.security.annotation.Inner;
@@ -4263,5 +4265,40 @@ public class ApiController {
 
 	}
 
+	/**
+	 * 校验是财务验证码是否存在
+	 *
+	 * @return 校验结果
+	 */
+	@GetMapping(value = "/check-code/for-fina")
+	public R<?> checkFinaCode(@RequestParam(value = "code") String code) {
+
+
+		Integer userId = SecurityUtils.getUser().getId();
+
+		// 获取用户信息判断,是否需要发送验证码
+		SysUser sysUser = sysUserService.getById(userId);
+
+		if (Objects.isNull(sysUser)){
+			log.error("用户不存在");
+			return R.failed("用户不存在");
+		}
+
+		log.info("是否需要发送验证码temp3:{}", sysUser.getTemp3());
+		String username = Objects.isNull(sysUser.getTemp3())  ? sysUser.getUsername() : sysUser.getTemp3();
+
+		final String key = com.qunzhixinxi.hnqz.common.core.constant.CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + username + "@fina";
+
+
+		Boolean res = redisTemplate.hasKey(key) ? code.equals(redisTemplate.opsForValue().get(key)) : Boolean.FALSE;
+
+		if (res){
+			redisTemplate.delete(key);
+		}
+
+		return R.ok(res);
+
+	}
+
 
 }

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

@@ -17,29 +17,48 @@
 
 package com.qunzhixinxi.hnqz.admin.controller;
 
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysUserRole;
 import com.qunzhixinxi.hnqz.admin.service.MobileService;
+import com.qunzhixinxi.hnqz.admin.service.SysUserRoleService;
+import com.qunzhixinxi.hnqz.admin.service.SysUserService;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.security.annotation.Inner;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
 import io.swagger.annotations.Api;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 /**
  * @author hnqz
  * @date 2018/11/14
  * <p>
  * 手机验证码
  */
+@Slf4j
 @RestController
 @AllArgsConstructor
 @RequestMapping("/mobile")
 @Api(value = "mobile", tags = "手机管理模块")
 public class MobileController {
 
+	private static final Integer FINA_ROLE_CODE = 7;
+
 	private final MobileService mobileService;
+	private final SysUserService userService;
+	private final SysUserRoleService userRoleService;
 
 	@Inner(value = false)
 	@GetMapping("/{mobile}")
@@ -54,4 +73,31 @@ public class MobileController {
 		return mobileService.sendSmsCodePc(mobile);
 	}
 
+	/**
+	 * 财务管理员发送验证码
+	 *
+	 * @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));
+
+		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());
+		String username = need ? sysUser.getUsername() : sysUser.getTemp3();
+		Boolean smsSucc = mobileService.sendSmsCodeForFina(username, need);
+		return R.ok(smsSucc, smsSucc ? "成功" : "失败");
+
+	}
+
 }

+ 10 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/MobileService.java

@@ -27,6 +27,7 @@ public interface MobileService {
 
 	/**
 	 * 发送手机验证码
+	 *
 	 * @param mobile mobile
 	 * @return code
 	 */
@@ -35,9 +36,18 @@ public interface MobileService {
 
 	/**
 	 * 发送手机验证码
+	 *
 	 * @param mobile mobile
 	 * @return code
 	 */
 	R<Boolean> sendSmsCodePc(String mobile);
 
+	/**
+	 * 发送短信验证码给财务管理员
+	 *
+	 * @param mobile 手机号
+	 * @param need   是否需要发送
+	 * @return 发送结果
+	 */
+	Boolean sendSmsCodeForFina(String mobile, Boolean need);
 }

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

@@ -29,6 +29,7 @@ import com.qunzhixinxi.hnqz.admin.mapper.SysUserMapper;
 import com.qunzhixinxi.hnqz.admin.service.MobileService;
 import com.qunzhixinxi.hnqz.admin.util.SendSms;
 import com.qunzhixinxi.hnqz.common.core.constant.CacheConstants;
+import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
 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;
@@ -40,6 +41,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -239,4 +241,41 @@ public class MobileServiceImpl implements MobileService {
 				SecurityConstants.CODE_TIME, TimeUnit.SECONDS);
 		return R.ok(Boolean.TRUE, "验证码发送成功");
 	}
+
+	/**
+	 * 发送短信验证码给财务管理员
+	 *
+	 * @param mobile 手机号
+	 * @param need   是否需要发送
+	 * @return 发送结果
+	 */
+	@Override
+	public Boolean sendSmsCodeForFina(String mobile, Boolean need) {
+
+		return this.sendSms(mobile, need);
+	}
+
+
+	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;
+	}
 }

+ 68 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/SendSms.java

@@ -286,7 +286,75 @@ public class SendSms {
 		} else {
 			return false;
 		}
+	}
+
+	public static boolean sendSmsCode1(String phoneNumber, String code) throws ClientException, InterruptedException {
+
+		//发短信
+		SendSmsResponse response = sendSms(code, phoneNumber, "要易云", "SMS_271535930");
+		System.out.println("短信接口返回的数据----------------");
+		System.out.println("Code=" + response.getCode());
+		System.out.println("Message=" + response.getMessage());
+		System.out.println("RequestId=" + response.getRequestId());
+		System.out.println("BizId=" + response.getBizId());
+
+		Thread.sleep(3000L);
+
+		//查明细
+		if (response.getCode() != null && response.getCode().equals("OK")) {
+			QuerySendDetailsResponse querySendDetailsResponse = querySendDetails(response.getBizId());
+			System.out.println("短信明细查询接口返回数据----------------");
+			System.out.println("Code=" + querySendDetailsResponse.getCode());
+			System.out.println("Message=" + querySendDetailsResponse.getMessage());
+			int i = 0;
+			for (QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs()) {
+				System.out.println("SmsSendDetailDTO[" + i + "]:");
+				System.out.println("Content=" + smsSendDetailDTO.getContent());
+				System.out.println("ErrCode=" + smsSendDetailDTO.getErrCode());
+				System.out.println("OutId=" + smsSendDetailDTO.getOutId());
+				System.out.println("PhoneNum=" + smsSendDetailDTO.getPhoneNum());
+				System.out.println("ReceiveDate=" + smsSendDetailDTO.getReceiveDate());
+				System.out.println("SendDate=" + smsSendDetailDTO.getSendDate());
+				System.out.println("SendStatus=" + smsSendDetailDTO.getSendStatus());
+				System.out.println("Template=" + smsSendDetailDTO.getTemplateCode());
+			}
+			System.out.println("TotalCount=" + querySendDetailsResponse.getTotalCount());
+			System.out.println("RequestId=" + querySendDetailsResponse.getRequestId());
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	private static SendSmsResponse sendSms(String code, String moblie, String signName, String templateCode) throws ClientException {
+		//可自助调整超时时间
+		System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
+		System.setProperty("sun.net.client.defaultReadTimeout", "10000");
+
+		//初始化acsClient,暂不支持region化
+		IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
+		DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
+		IAcsClient acsClient = new DefaultAcsClient(profile);
+
+		//组装请求对象-具体描述见控制台-文档部分内容
+		SendSmsRequest request = new SendSmsRequest();
+		//必填:待发送手机号
+		request.setPhoneNumbers(moblie);
+		//必填:短信签名-可在短信控制台中找到
+		request.setSignName(signName);
+		//必填:短信模板-可在短信控制台中找到
+		request.setTemplateCode(templateCode);
+		//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
+		request.setTemplateParam("{\"code\":\"" + code + "\"}");
 
+		//选填-上行短信扩展码(无特殊需求用户请忽略此字段)
+		//request.setSmsUpExtendCode("90997");
+
+		//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
+		//request.setOutId("yourOutId");
+
+		//hint 此处可能会抛出异常,注意catch
 
+		return acsClient.getAcsResponse(request);
 	}
 }