Browse Source

扫码协议

guoshuai 2 weeks ago
parent
commit
52729a3606

+ 5 - 0
src/main/java/com/qmrb/system/common/constant/SecurityConstants.java

@@ -37,4 +37,9 @@ public interface SecurityConstants {
      * 黑名单Token缓存前缀
      */
     String BLACK_TOKEN_CACHE_PREFIX = "AUTH:BLACK_TOKEN:";
+    
+    /**
+     * 客商Token缓存前缀
+     */
+    String CONTRACT_TOKEN_CACHE_PREFIX = "AUTH:CONTRACT_TOKEN:";
 }

+ 94 - 0
src/main/java/com/qmrb/system/controller/CaSignController.java

@@ -10,13 +10,17 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.qmrb.system.adatper.CaSignAdatper;
 import com.qmrb.system.adatper.EmrAdatper;
 import com.qmrb.system.common.constant.DeptNameMapping;
+import com.qmrb.system.common.constant.SecurityConstants;
 import com.qmrb.system.common.constant.SystemConstants;
 import com.qmrb.system.common.proc.CommonJDBCTemplate;
 import com.qmrb.system.common.proc.CommonTemplate;
 import com.qmrb.system.common.result.Result;
 import com.qmrb.system.common.util.AesUtils;
 import com.qmrb.system.framework.security.CaConstants;
+import com.qmrb.system.framework.security.JwtTokenManager;
+import com.qmrb.system.framework.security.userdetails.SysUserDetails;
 import com.qmrb.system.framework.security.util.SecurityUtils;
+import com.qmrb.system.pojo.bo.UserAuthInfo;
 import com.qmrb.system.pojo.dto.CaSignFileDTO;
 import com.qmrb.system.pojo.dto.CallBackResponse;
 import com.qmrb.system.pojo.dto.SoapReturnDTO;
@@ -43,6 +47,7 @@ import okhttp3.Request;
 import org.apache.axis.client.Call;
 import org.apache.axis.client.Service;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.SystemUtils;
 import org.springdoc.core.annotations.ParameterObject;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -54,6 +59,9 @@ import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestBody;
 
@@ -116,6 +124,17 @@ public class CaSignController {
 
     @Autowired
     private  RedisTemplate redisTemplate;
+    
+    @Autowired
+    private  IContractService contractService;
+
+    @Autowired
+    private JwtTokenManager jwtTokenManager;
+    /**
+     * token有效期(单位:秒)
+     */
+    @Value("${auth.token.overDue}")
+    private Long overDue;
 
     @Autowired
     private  SysUserService userService;
@@ -2348,6 +2367,81 @@ public class CaSignController {
         }
         return null;
     }
+    
+    
+    /**
+     * 获取优惠券的二维码
+     * @return
+     */
+    @GetMapping("getCouponQrcode")
+    public Result<?> getCouponQrcode(){
+    // public ResponseEntity<byte []>  getCouponQrcode(){
+        if(SecurityUtils.getUserId() == null){
+            return null;
+        }
+        SysUser user = userService.getById(SecurityUtils.getUserId());
+        // 获取到协议的二维码登录地址
+        Contract contract = contractService.getById(user.getContractId());
+        if(contract == null){
+            return null;
+        }
+
+        Map<String,Object> map = new HashMap<>();
+//        String signUrl = "";
+        try {
+//            String token = OkHttpUtils.getTokenNew();
+//            signUrl = CaConstants.qrCodeDomain + "/goto.html?cardId=" + social_no + "&access_token=" + token;
+//            log.info(signUrl);
+//            String signUrl = (String)redisTemplate.opsForValue().get(deviceNo);
+
+            // 生成token
+            List<SimpleGrantedAuthority> roleList = userService.getUserAuthInfo(contract.getUsername()).getRoles()
+                    .stream().map(role -> new SimpleGrantedAuthority("ROLE_" + role)).toList();
+            UsernamePasswordAuthenticationToken authenticationToken =
+                    new UsernamePasswordAuthenticationToken(contract.getUsername(), contract.getPassword(),
+                            roleList);
+            UserAuthInfo userAuthInfo = userService.getUserAuthInfo(contract.getUsername());
+            SysUserDetails sysUserDetails = new SysUserDetails(userAuthInfo);
+            authenticationToken.setDetails(sysUserDetails);
+            SecurityContextHolder.getContext().setAuthentication(authenticationToken);
+            String accessToken = jwtTokenManager.createToken(authenticationToken);
+            // 保存token至redis中
+           String tokenId =  SecurityConstants.CONTRACT_TOKEN_CACHE_PREFIX + user.getId() + UUID.randomUUID();
+            redisTemplate.opsForValue().set(tokenId,accessToken,overDue,TimeUnit.SECONDS);
+            String url = contract.getQrcodeLoginUrl() + "?tokenId=" + tokenId;
+            // byte[] imageBytes = QRCodeUtil.createQrCodeToByte(url);
+            String base64 = QRCodeUtil.createCodeToOutputStream(url);
+            // HttpHeaders headers = new HttpHeaders();
+            // headers.setContentType(MediaType.IMAGE_JPEG);
+            // headers.setContentLength(imageBytes.length);
+            // map.put("data",imageBytes);
+            map.put("data",base64);
+            map.put("contractName",contract.getContractName());
+            
+            // return new ResponseEntity<>(imageBytes, headers, HttpStatus.OK);
+            return Result.success(map);
+        }catch (Exception e){
+            log.error(e.getMessage(),e);
+        }
+        return null;
+    }
+
+
+    /**
+     * 获取优惠券的二维码
+     * @return
+     */
+    @GetMapping("getTokenByTokenId")
+    public Result<?> getTokenByTokenId(@RequestParam String tokenId){
+        
+        // 保存token至redis中
+        Object token = redisTemplate.opsForValue().get(tokenId);
+        if(token == null){
+            return  Result.failed("已过期,请刷新后重新扫码。");
+        }
+
+        return  Result.success((String) token);
+    }
 
     /**
      * 影像检查报告查询-医联康护

+ 13 - 0
src/main/java/com/qmrb/system/controller/ContractController.java

@@ -4,6 +4,8 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import cn.hutool.crypto.SecureUtil;
+import com.qmrb.system.framework.security.util.SecurityUtils;
 import org.springdoc.core.annotations.ParameterObject;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
@@ -71,6 +73,17 @@ public class ContractController{
     	ContractForm formData = contractService.getFormData(id);
         return Result.success(formData);
     }
+    
+    
+    @Operation(summary = "客商协议表表单数据", security = {@SecurityRequirement(name = "Authorization")})
+    @GetMapping("/getformByUserId")
+    public Result<ContractForm> getformByUserId() {
+        if(SecurityUtils.getUserId() == null){
+            return Result.success();
+        }
+    	ContractForm formData = contractService.getformByUserId(SecurityUtils.getUserId());
+        return Result.success(formData);
+    }
 
     @Operation(summary = "修改客商协议表", security = {@SecurityRequirement(name = "Authorization")})
     @PutMapping(value = "/{id}")

+ 0 - 1
src/main/java/com/qmrb/system/controller/CouponController.java

@@ -63,7 +63,6 @@ public class CouponController{
     
     @Operation(summary = "新增优惠券表", security = {@SecurityRequirement(name = "Authorization")})
     @PostMapping
-    @PreAuthorize("@ss.hasPerm(':add')")
     @Resubmit
     public Result<CouponForm> saveForm(
             @RequestBody @Valid CouponForm form

+ 40 - 0
src/main/java/com/qmrb/system/framework/security/JwtTokenManager.java

@@ -51,6 +51,12 @@ public class JwtTokenManager {
     private Long tokenTtl;
 
     /**
+     * token有效期(单位:秒)
+     */
+    @Value("${auth.token.overDue}")
+    private Long overDue;
+
+    /**
      * secret key byte array.
      */
     private byte[] secretKeyBytes;
@@ -121,6 +127,40 @@ public class JwtTokenManager {
                 .setExpiration(expirationTime)
                 .signWith(Keys.hmacShaKeyFor(this.getSecretKeyBytes()), SignatureAlgorithm.HS256).compact();
     }
+    
+    /**
+     * Create token.
+     *
+     * @param authentication auth info
+     * @return token
+     */
+    @SuppressWarnings("unchecked")
+	public String createContactToken(Authentication authentication) {
+
+        Claims claims = Jwts.claims().setSubject(authentication.getName());
+        SysUserDetails userDetails = (SysUserDetails) authentication.getDetails();
+        claims.put("jti",IdUtil.fastSimpleUUID());
+        claims.put("userId", userDetails.getUserId());
+        claims.put("username", claims.getSubject());
+        claims.put("deptId", userDetails.getDeptId());
+        claims.put("dataScope", userDetails.getDataScope());
+
+        // 角色放入JWT的claims
+        Set<String> roles = authentication.getAuthorities().stream()
+                .map(GrantedAuthority::getAuthority).collect(Collectors.toSet());
+        claims.put("authorities", roles);
+        // 权限数据多放入Redis
+        Set<String> perms = userDetails.getPerms();
+        redisTemplate.opsForValue().set(SecurityConstants.USER_PERMS_CACHE_PREFIX + userDetails.getUserId(), perms);
+
+        // 过期时间
+        Date expirationTime = new Date(System.currentTimeMillis() + overDue * 1000L);
+        return Jwts.builder()
+                //.setId(IdUtil.fastSimpleUUID()) TODO 设置jti无效
+                .setClaims(claims)
+                .setExpiration(expirationTime)
+                .signWith(Keys.hmacShaKeyFor(this.getSecretKeyBytes()), SignatureAlgorithm.HS256).compact();
+    }
 
     /**
      * 获取认证信息

+ 1 - 0
src/main/java/com/qmrb/system/framework/security/config/SecurityConfig.java

@@ -99,6 +99,7 @@ public class SecurityConfig {
                         "/api/v1/patientSign/uploadJcReport",
                         "/api/v1/patientSign/getCaUnSignQrcode",
                         "/api/v1/patientSign/getFwzxScanQrcode",
+                        "/api/v1/patientSign/getTokenByTokenId",
                         "/api/ucenter/**",
                         "/api/v1/auth/loginByMerchants",
                         "/api/order/wechatPayCallback"

+ 2 - 1
src/main/java/com/qmrb/system/service/IContractService.java

@@ -36,5 +36,6 @@ public interface IContractService extends IService<Contract> {
 	/**获取表单数据
 	 * */
 	public ContractForm getFormData(Long id);
-	
+
+    ContractForm getformByUserId(Long userId);
 }

+ 20 - 1
src/main/java/com/qmrb/system/service/impl/ContractServiceImpl.java

@@ -157,5 +157,24 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
 		form.setUsedNum(count);
 		return form;
 	}
-	
+
+	/**
+	 * 根据userId获取到协议
+	 * @param userId
+	 * @return
+	 */
+	@Override
+	public ContractForm getformByUserId(Long userId) {
+		SysUser user = userService.getById(userId);
+		if(user == null){
+			return null;
+		}
+		Contract entity = this.getById(user.getContractId());
+		Assert.isTrue(entity != null, "客商协议表不存在");
+
+		// 实体转换
+		ContractForm form = converter.entity2Form(entity);
+		return form;
+	}
+
 }

+ 2 - 0
src/main/resources/application-dev.yml

@@ -66,6 +66,8 @@ auth:
     secret_key: SecretKey012345678901234567890123456789012345678901234567890123456789
     # token 有效期(单位:秒)
     ttl: 86400000
+    # 客商领券二维码有效期
+    overDue: 900
 
 # MinIO 分布式文件系统
 minio:

+ 2 - 0
src/main/resources/application-prod.yml

@@ -64,6 +64,8 @@ auth:
     secret_key: SecretKey012345678901234567890123456789012345678901234567890123456789
     # token 有效期(单位:秒)
     ttl: 86400000
+    # 客商领券二维码有效期
+    overDue: 900
 
 # MinIO 分布式文件系统
 minio:

+ 6 - 1
src/main/resources/mapper/ContractMapper.xml

@@ -3,6 +3,11 @@
 <mapper namespace="com.qmrb.system.mapper.ContractMapper">
 
     <select id="pageWithCoupon" resultType="com.qmrb.system.pojo.vo.ContractVO">
-        select ct.*,te.used_num from contract ct left join (select co.contract_id as contractId,count(co.contract_id) as used_num from coupon co GROUP BY co.contract_id) te on te.contractId = ct.id
+        select 
+            ct.*,te.used_num 
+        from contract ct 
+            left join 
+            (select co.contract_id as contractId,count(co.contract_id) as used_num from coupon co GROUP BY co.contract_id) te on te.contractId = ct.id 
+        where ct.contract_type = 2
     </select>
 </mapper>

+ 0 - 2
src/main/resources/mapper/SysUserMapper.xml

@@ -15,7 +15,6 @@
             u.avatar,
             u.STATUS,
             u.user_type,
-            u.coupon_mode,
             d.NAME AS dept_name,
             GROUP_CONCAT( r.NAME ) AS roleNames,
             u.create_time,
@@ -78,7 +77,6 @@
                email,
                STATUS,
                user_type,
-               coupon_mode,
                dept_id
         FROM sys_user
         WHERE id = #{userId}