sm2加密解密

master
sunjianxi 2 years ago
parent a3d3e24330
commit 77f169e177
  1. 6
      pom.xml
  2. 5
      src/main/java/org/springblade/Application.java
  3. 105
      src/main/java/org/springblade/common/config/SecretCommon.java
  4. 115
      src/main/java/org/springblade/common/config/Sm2PrivatekeyProperties.java
  5. 115
      src/main/java/org/springblade/common/config/Sm2PublickeyProperties.java
  6. 11
      src/main/java/org/springblade/common/constant/KeyConstant.java
  7. 19
      src/main/java/org/springblade/common/constant/ModeTypeConstant.java
  8. 25
      src/main/java/org/springblade/common/enums/ModeTypeEnum.java
  9. 57
      src/main/java/org/springblade/common/utils/Sm2Utils.java
  10. 31
      src/main/java/org/springblade/modules/business/controller/ApmConfigController.java
  11. 148
      src/main/java/org/springblade/modules/business/controller/ApmRecordController.java
  12. 32
      src/main/java/org/springblade/modules/business/controller/BlacklistController.java
  13. 53
      src/main/java/org/springblade/modules/business/controller/CommonApiController.java
  14. 28
      src/main/resources/application.yml

@ -190,6 +190,12 @@
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
<!-- 国密 -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
<version>1.66</version>
</dependency>
</dependencies>
<build>

@ -32,6 +32,11 @@ public class Application {
public static void main(String[] args) {
BladeApplication.run(CommonConstant.APPLICATION_NAME, Application.class, args);
System.out.println("======================");
System.out.println("======================");
System.out.println("========启动成功=======");
System.out.println("======================");
System.out.println("======================");
}
}

@ -0,0 +1,105 @@
package org.springblade.common.config;
import org.bouncycastle.asn1.gm.GMNamedCurves;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
import org.bouncycastle.crypto.params.*;
import org.bouncycastle.math.ec.ECPoint;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.bouncycastle.util.encoders.Hex;
import org.springblade.common.constant.KeyConstant;
import org.springblade.common.enums.ModeTypeEnum;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.HashMap;
import java.util.Map;
/**
* SM2公钥密码算法非对称算法
* SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法
* 包括SM2-1椭圆曲线数字签名算法SM2-2椭圆曲线密钥交换协议SM2-3椭圆曲线公钥加密算法分别用于实现数字签名密钥协商和数据加密等功能
* SM2算法与RSA算法不同的是SM2算法是基于椭圆曲线上点群离散对数难题相对于RSA算法256位的SM2密码强度已经比2048位的RSA密码强度要高
*/
public class SecretCommon {
//获取椭圆曲线
public static synchronized ECDomainParameters getECDomainParameters() {
X9ECParameters sm2ECParameters = GMNamedCurves.getByName(KeyConstant.GM_NAME_CURVE);
return new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());
}
/**
* get key pair
*/
public static Map<String, String> createKeyPair() throws NoSuchAlgorithmException {
ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();
keyPairGenerator.init(new ECKeyGenerationParameters(getECDomainParameters(), SecureRandom.getInstance(KeyConstant.ALGORITHM)));
AsymmetricCipherKeyPair asymmetricCipherKeyPair = keyPairGenerator.generateKeyPair();
Map<String, String> map = new HashMap<>();
BigInteger bigInteger = ((ECPrivateKeyParameters) asymmetricCipherKeyPair.getPrivate()).getD();
map.put(KeyConstant.PRIVATE_KEY, ByteUtils.toHexString(bigInteger.toByteArray()));
// 把公钥放入map中,默认压缩公钥
// 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥,04的时候,可以去掉前面的04
ECPoint ecPoint = ((ECPublicKeyParameters) asymmetricCipherKeyPair.getPublic()).getQ();
map.put(KeyConstant.PUBLIC_KEY, ByteUtils.toHexString(ecPoint.getEncoded(false)));
return map;
}
/**
* 加密
* @param plainText 需加密的明文字符串
* @param publicKey 公钥
* @param modeType base:标准bcBC模式
*/
public static String encrypt(String plainText, String publicKey, ModeTypeEnum modeType) throws IOException, InvalidCipherTextException {
return encrypt(plainText.getBytes(), publicKey, modeType.getMode());
}
/**
* 加密
* @param plainByte 需加密的明文字节数组
* @param publicKey 公钥
* @param mode 加密模式 ModeTypeEnum
*/
public static String encrypt(byte[] plainByte, String publicKey, SM2Engine.Mode mode) throws IOException, InvalidCipherTextException {
ECDomainParameters domainParameters = getECDomainParameters();
//提取公钥点
ECPoint ecPoint = domainParameters.getCurve().decodePoint(ByteUtils.fromHexString(publicKey));
// 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥, 04的时候,可以去掉前面的04
ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(ecPoint, domainParameters);
SM2Engine sm2Engine = new SM2Engine(mode);
sm2Engine.init(true, new ParametersWithRandom(publicKeyParameters, new SecureRandom()));
return ByteUtils.toHexString(sm2Engine.processBlock(plainByte, 0, plainByte.length));
}
/**
* 解密
* @param cipherText 需加密的字符串
* @param privateKey 私钥
* @param modeType base:标准bcBC模式
*/
public static String decrypt(String cipherText, String privateKey, ModeTypeEnum modeType) throws InvalidCipherTextException, UnsupportedEncodingException {
return decrypt(Hex.decode(cipherText), privateKey, modeType.getMode());
}
/**
* 解密
* @param cipherDataByte 密文字节数组
* @param privateKeyHex 私钥
* @param mode 解密模式 ModeTypeEnum
*/
public static String decrypt(byte[] cipherDataByte, String privateKeyHex, SM2Engine.Mode mode) throws InvalidCipherTextException, UnsupportedEncodingException {
BigInteger bigInteger = new BigInteger(privateKeyHex, 16);
ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(bigInteger, getECDomainParameters());
SM2Engine sm2Engine = new SM2Engine(mode);
sm2Engine.init(false, privateKeyParameters);
return new String(sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length), "utf-8");
}
}

@ -0,0 +1,115 @@
package org.springblade.common.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(
prefix = "sm2.privatekey"
)
@Component
public class Sm2PrivatekeyProperties {
private String listHospital;
private String detailPublish;
private String userBlacklist;
private String alreadyConfigDay;
private String detailForApm;
private String save;
private String page;
private String cancel;
private String getSystemDatetime;
private String saveCupImg;
public Sm2PrivatekeyProperties() {
this.listHospital = "";
this.detailPublish = "";
this.userBlacklist = "";
this.alreadyConfigDay = "";
this.detailForApm = "";
this.save = "";
this.page = "";
this.cancel = "";
this.getSystemDatetime = "";
this.saveCupImg = "";
}
public String getListHospital() {
return listHospital;
}
public void setListHospital(String listHospital) {
this.listHospital = listHospital;
}
public String getDetailPublish() {
return detailPublish;
}
public void setDetailPublish(String detailPublish) {
this.detailPublish = detailPublish;
}
public String getUserBlacklist() {
return userBlacklist;
}
public void setUserBlacklist(String userBlacklist) {
this.userBlacklist = userBlacklist;
}
public String getAlreadyConfigDay() {
return alreadyConfigDay;
}
public void setAlreadyConfigDay(String alreadyConfigDay) {
this.alreadyConfigDay = alreadyConfigDay;
}
public String getDetailForApm() {
return detailForApm;
}
public void setDetailForApm(String detailForApm) {
this.detailForApm = detailForApm;
}
public String getSave() {
return save;
}
public void setSave(String save) {
this.save = save;
}
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
public String getCancel() {
return cancel;
}
public void setCancel(String cancel) {
this.cancel = cancel;
}
public String getGetSystemDatetime() {
return getSystemDatetime;
}
public void setGetSystemDatetime(String getSystemDatetime) {
this.getSystemDatetime = getSystemDatetime;
}
public String getSaveCupImg() {
return saveCupImg;
}
public void setSaveCupImg(String saveCupImg) {
this.saveCupImg = saveCupImg;
}
}

@ -0,0 +1,115 @@
package org.springblade.common.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(
prefix = "sm2.publickey"
)
@Component
public class Sm2PublickeyProperties {
private String listHospital;
private String detailPublish;
private String userBlacklist;
private String alreadyConfigDay;
private String detailForApm;
private String save;
private String page;
private String cancel;
private String getSystemDatetime;
private String saveCupImg;
public Sm2PublickeyProperties() {
this.listHospital = "";
this.detailPublish = "";
this.userBlacklist = "";
this.alreadyConfigDay = "";
this.detailForApm = "";
this.save = "";
this.page = "";
this.cancel = "";
this.getSystemDatetime = "";
this.saveCupImg = "";
}
public String getListHospital() {
return listHospital;
}
public void setListHospital(String listHospital) {
this.listHospital = listHospital;
}
public String getDetailPublish() {
return detailPublish;
}
public void setDetailPublish(String detailPublish) {
this.detailPublish = detailPublish;
}
public String getUserBlacklist() {
return userBlacklist;
}
public void setUserBlacklist(String userBlacklist) {
this.userBlacklist = userBlacklist;
}
public String getAlreadyConfigDay() {
return alreadyConfigDay;
}
public void setAlreadyConfigDay(String alreadyConfigDay) {
this.alreadyConfigDay = alreadyConfigDay;
}
public String getDetailForApm() {
return detailForApm;
}
public void setDetailForApm(String detailForApm) {
this.detailForApm = detailForApm;
}
public String getSave() {
return save;
}
public void setSave(String save) {
this.save = save;
}
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
public String getCancel() {
return cancel;
}
public void setCancel(String cancel) {
this.cancel = cancel;
}
public String getGetSystemDatetime() {
return getSystemDatetime;
}
public void setGetSystemDatetime(String getSystemDatetime) {
this.getSystemDatetime = getSystemDatetime;
}
public String getSaveCupImg() {
return saveCupImg;
}
public void setSaveCupImg(String saveCupImg) {
this.saveCupImg = saveCupImg;
}
}

@ -0,0 +1,11 @@
package org.springblade.common.constant;
public class KeyConstant {
public static final String PRIVATE_KEY = "pveky"; // 私钥
public static final String PUBLIC_KEY = "pbcky"; // 公钥
public static final String GM_NAME_CURVE = "sm2p256v1";
public static final String ALGORITHM = "SHA1PRNG";
}

@ -0,0 +1,19 @@
package org.springblade.common.constant;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.springblade.common.enums.ModeTypeEnum;
public class ModeTypeConstant {
public static final String BASE = "base";
public static final String BC = "bc";
@Deprecated
public static final SM2Engine.Mode BASE_MODE = SM2Engine.Mode.C1C3C2;
@Deprecated
public static final SM2Engine.Mode BC_MODE = SM2Engine.Mode.C1C2C3;
public static ModeTypeEnum getMode(String modeType){
if (ModeTypeEnum.BASE_MODE.getType().equals(modeType)) return ModeTypeEnum.BASE_MODE;
return ModeTypeEnum.BC_MODE;
}
}

@ -0,0 +1,25 @@
package org.springblade.common.enums;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.springblade.common.constant.ModeTypeConstant;
public enum ModeTypeEnum {
BASE_MODE(ModeTypeConstant.BASE, SM2Engine.Mode.C1C3C2),
BC_MODE(ModeTypeConstant.BC, SM2Engine.Mode.C1C2C3);
private String type;
private SM2Engine.Mode mode;
ModeTypeEnum(String type, SM2Engine.Mode mode) {
this.type = type;
this.mode = mode;
}
public String getType(){
return type;
}
public SM2Engine.Mode getMode(){
return mode;
}
}

@ -0,0 +1,57 @@
package org.springblade.common.utils;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.springblade.common.config.SecretCommon;
import org.springblade.common.constant.ModeTypeConstant;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
public class Sm2Utils {
/**
* get key pair
*/
public static Map<String, String> createKeyPair() throws NoSuchAlgorithmException {
return SecretCommon.createKeyPair();
}
/**
* encrypt
* @param plainText 需加密的明文字符串
* @param publicKey 公钥
*/
public static String encrypt(String plainText, String publicKey) throws IOException, InvalidCipherTextException {
return encrypt(plainText, publicKey, ModeTypeConstant.BASE);
}
/**
* encrypt
* @param plainText 需加密的明文字符串
* @param publicKey 公钥
* @param modeType base:标准bcBC模式
*/
public static String encrypt(String plainText, String publicKey, String modeType) throws IOException, InvalidCipherTextException {
return SecretCommon.encrypt(plainText, publicKey, ModeTypeConstant.getMode(modeType));
}
/**
* decrypt
* @param cipherText 需加密的字符串
* @param privateKey 私钥
*/
public static String decrypt(String cipherText, String privateKey) throws InvalidCipherTextException, UnsupportedEncodingException {
return decrypt(cipherText, privateKey, ModeTypeConstant.BASE);
}
/**
* decrypt
* @param cipherText 需加密的字符串
* @param privateKey 私钥
* @param modeType base:标准bcBC模式
*/
public static String decrypt(String cipherText, String privateKey, String modeType) throws InvalidCipherTextException, UnsupportedEncodingException {
return SecretCommon.decrypt(cipherText, privateKey, ModeTypeConstant.getMode(modeType));
}
}

@ -5,10 +5,13 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.*;
import lombok.AllArgsConstructor;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.springblade.common.config.Sm2PrivatekeyProperties;
import org.springblade.common.constant.BusinessConstant;
import org.springblade.common.constant.CommonConstant;
import org.springblade.common.enums.ErrorMsgEnum;
import org.springblade.common.utils.CommonDateUtil;
import org.springblade.common.utils.Sm2Utils;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
@ -24,6 +27,7 @@ import org.springblade.modules.business.vo.ApmConfigVO;
import org.springblade.modules.business.wrapper.ApmConfigWrapper;
import org.springframework.web.bind.annotation.*;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -41,6 +45,7 @@ import java.util.Map;
public class ApmConfigController extends BladeController {
private final IApmConfigService apmConfigService;
private final Sm2PrivatekeyProperties sm2PrivatekeyProperties;
/**
* 获取已放号天
@ -96,7 +101,6 @@ public class ApmConfigController extends BladeController {
return R.data(ApmConfigWrapper.build().listVO(list));
}
/**
* 获取放号详细, 用户用户预约
*
@ -120,6 +124,31 @@ public class ApmConfigController extends BladeController {
return R.data(apmConfigService.detailForApm(createDept, apmDay, cupCardNo));
}
/**
* 获取放号详细, 用户用户预约
*
* @param createDept
* @param apmDay
* @param cupCardNo
* @return
*/
@GetMapping("/detail-for-apm2")
public R<List<ApmConfigListVO>> detailForApm2(Long createDept, String apmDay, String cupCardNo) throws InvalidCipherTextException, UnsupportedEncodingException {
if (Func.isEmpty(createDept)) {
return R.fail(ErrorMsgEnum.PARAMS_NULL_CREATE_DEPT.getValue());
}
if (Func.isEmpty(apmDay)) {
return R.fail(ErrorMsgEnum.APMRECORD_SAVE_DATE_IS_NULL.getValue());
}
if (Func.isEmpty(cupCardNo)) {
return R.fail(ErrorMsgEnum.PARAMS_NULL_CUP_CARD_NO.getValue());
}
//cupCardNo = Sm2Utils.decrypt(cupCardNo,sm2PrivatekeyProperties.getDetailForApm());
System.out.println("获取放号详细获取到的身份证号是:" + cupCardNo);
return R.data(apmConfigService.detailForApm(createDept, apmDay, cupCardNo));
}
/**
* @param query 分页参数
* @param createDept 医院ID

@ -6,8 +6,11 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.*;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.springblade.common.cache.DeptCache;
import org.springblade.common.cache.DictBizCache;
import org.springblade.common.config.Sm2PrivatekeyProperties;
import org.springblade.common.config.Sm2PublickeyProperties;
import org.springblade.common.constant.BusinessConstant;
import org.springblade.common.constant.CommonConstant;
import org.springblade.common.enums.ApmRecordStatusEnum;
@ -35,8 +38,9 @@ import org.springblade.modules.system.entity.Dept;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.*;
import java.util.logging.Logger;
/**
* 控制器
@ -52,6 +56,8 @@ import java.util.logging.Logger;
public class ApmRecordController extends BladeController {
private final IApmRecordService recordService;
private final Sm2PublickeyProperties sm2PublickeyProperties;
private final Sm2PrivatekeyProperties sm2PrivatekeyProperties;
/**
* 详情
@ -150,6 +156,29 @@ public class ApmRecordController extends BladeController {
* 分页
*/
@GetMapping("/page")
@ApiImplicitParams({
@ApiImplicitParam(name = "createDept", value = "医院ID", paramType = "query", dataType = "integer"),
@ApiImplicitParam(name = "startTime", value = "查询开始时间", paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "endTime", value = "查询结束时间", paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "cupCardNo", value = "体检人证件号", paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "project", value = "项目名称", paramType = "query", dataType = "String")
})
@ApiOperationSupport(order = 4)
@ApiOperation(value = "分页", notes = "分页")
public R<IPage<ApmRecordListVO>> selectPage(Query query, Long createDept, String startTime, String endTime, String cupCardNo, String project, String apmStatus) {
BladeUser user = AuthUtil.getUser();
if (Func.isNotEmpty(user) && !BusinessConstant.ROLE_NAME_HOSPITAL.equals(user.getRoleName())) {
createDept = null;
}
IPage<ApmRecordListVO> page = recordService.selectDistinctRecordPage(Condition.getPage(query), createDept, startTime, endTime, cupCardNo, project, apmStatus);
return R.data(page);
}
/**
* 分页
*/
@GetMapping("/page2")
@ApiImplicitParams({
@ApiImplicitParam(name = "createDept", value = "医院ID", paramType = "query", dataType = "integer"),
@ApiImplicitParam(name = "startTime", value = "查询开始时间", paramType = "query", dataType = "String"),
@ -159,7 +188,21 @@ public class ApmRecordController extends BladeController {
})
@ApiOperationSupport(order = 4)
@ApiOperation(value = "分页", notes = "分页")
public R<IPage<ApmRecordListVO>> selectPage(Query query, Long createDept, String startTime, String endTime, String cupCardNo, String project, String apmStatus) {
public R<IPage<ApmRecordListVO>> selectPage2(Query query, Long createDept, String startTime, String endTime, String cupCardNo, String project, String apmStatus) throws InvalidCipherTextException, IOException {
/*BladeUser user = AuthUtil.getUser();
if (Func.isNotEmpty(user) && !BusinessConstant.ROLE_NAME_HOSPITAL.equals(user.getRoleName())) {
createDept = null;
}
cupCardNo = Sm2Utils.decrypt(cupCardNo,sm2PrivatekeyProperties.getPage());
IPage<ApmRecordListVO> page = recordService.selectDistinctRecordPage(Condition.getPage(query), createDept, startTime, endTime, cupCardNo, project, apmStatus);
if(page != null){
for(ApmRecordListVO apmRecordListVO : page.getRecords()){
apmRecordListVO.setCupName(Sm2Utils.encrypt(apmRecordListVO.getCupName(),sm2PublickeyProperties.getPage()));
apmRecordListVO.setCupCardNo(Sm2Utils.encrypt(apmRecordListVO.getCupCardNo(),sm2PublickeyProperties.getPage()));
apmRecordListVO.setCupPhone(Sm2Utils.encrypt(apmRecordListVO.getCupPhone(),sm2PublickeyProperties.getPage()));
}
}
return R.data(page);*/
BladeUser user = AuthUtil.getUser();
if (Func.isNotEmpty(user) && !BusinessConstant.ROLE_NAME_HOSPITAL.equals(user.getRoleName())) {
createDept = null;
@ -218,6 +261,107 @@ public class ApmRecordController extends BladeController {
return R.fail(checkMsg);
}
/**
* 新增
*/
@PostMapping("/save2")
@ApiOperationSupport(order = 5)
@ApiOperation(value = "新增", notes = "传入apmConfig")
public R save2(@RequestBody Map<String, Object> apmRecordListStr) throws InvalidCipherTextException, UnsupportedEncodingException {
/*List<Map<String, Object>> apmRecordMapList = (List<Map<String, Object>>) apmRecordListStr.get("data");
List<ApmRecord> apmRecordList = new ArrayList<>();
Date apmDay = null;
String cardNo = null;
for (Map<String, Object> item : apmRecordMapList) {
ApmRecord record = BeanUtil.copy(item, ApmRecord.class);
record.setApmDay(DateUtil.parse(item.get("apmDay").toString(), DateUtil.PATTERN_DATE));
record.setCreateDept(Long.parseLong(item.get("createDept").toString()));
if(item.get("cupName") != null){
record.setCupName(Sm2Utils.decrypt(item.get("cupName").toString(),sm2PrivatekeyProperties.getSave()));
}
if(item.get("cupCardNo") != null){
record.setCupCardNo(Sm2Utils.decrypt(item.get("cupCardNo").toString(),sm2PrivatekeyProperties.getSave()));
}
if(item.get("cupPhone") != null){
record.setCupPhone(Sm2Utils.decrypt(item.get("cupPhone").toString(),sm2PrivatekeyProperties.getSave()));
}
if (apmDay == null) {
apmDay = record.getApmDay();
}
if (cardNo == null) {
cardNo = record.getCupCardNo();
}
if (!DateUtil.format(apmDay, DateUtil.PATTERN_DATE).equals(DateUtil.format(record.getApmDay(), DateUtil.PATTERN_DATE))) {
return R.fail("预约失败, 一次只能预约同一天的体检项目");
}
if (!cardNo.equals(record.getCupCardNo())) {
return R.fail("预约失败, 一次只能预约同一个人");
}
record.setApmTime(DateUtil.now());
record.setApmStatus(BusinessConstant.RECORD_STATUS_UNREGISTER);
apmRecordList.add(record);
}
String checkMsg = "";
synchronized(this){
checkMsg = recordService.checkApmRecordSave(apmRecordList);
if (Func.isBlank(checkMsg)) {
recordService.saveBatch(apmRecordList);
int blacklistOutdate = DictBizCache.getDictValueWithOffset(BusinessConstant.DICT_KEY_BLACKLIST_OUTDATE);
int timesToBlacklist = DictBizCache.getDictValueWithOffset(BusinessConstant.DICT_KEY_RENEGED_TIMES_TO_BLACKLIST);
Map<String, Object> result = new HashMap<>();
result.put("blacklistOutDate", blacklistOutdate);
result.put("timesToBlacklist", timesToBlacklist);
return R.data(result);
}
}
return R.fail(checkMsg);*/
List<Map<String, Object>> apmRecordMapList = (List<Map<String, Object>>) apmRecordListStr.get("data");
List<ApmRecord> apmRecordList = new ArrayList<>();
Date apmDay = null;
String cardNo = null;
for (Map<String, Object> item : apmRecordMapList) {
ApmRecord record = BeanUtil.copy(item, ApmRecord.class);
record.setApmDay(DateUtil.parse(item.get("apmDay").toString(), DateUtil.PATTERN_DATE));
record.setCreateDept(Long.parseLong(item.get("createDept").toString()));
if (apmDay == null) {
apmDay = record.getApmDay();
}
if (cardNo == null) {
cardNo = record.getCupCardNo();
}
if (!DateUtil.format(apmDay, DateUtil.PATTERN_DATE).equals(DateUtil.format(record.getApmDay(), DateUtil.PATTERN_DATE))) {
return R.fail("预约失败, 一次只能预约同一天的体检项目");
}
if (!cardNo.equals(record.getCupCardNo())) {
return R.fail("预约失败, 一次只能预约同一个人");
}
record.setApmTime(DateUtil.now());
record.setApmStatus(BusinessConstant.RECORD_STATUS_UNREGISTER);
apmRecordList.add(record);
}
String checkMsg = recordService.checkApmRecordSave(apmRecordList);
if (Func.isBlank(checkMsg)) {
recordService.saveBatch(apmRecordList);
int blacklistOutdate = DictBizCache.getDictValueWithOffset(BusinessConstant.DICT_KEY_BLACKLIST_OUTDATE);
int timesToBlacklist = DictBizCache.getDictValueWithOffset(BusinessConstant.DICT_KEY_RENEGED_TIMES_TO_BLACKLIST);
Map<String, Object> result = new HashMap<>();
result.put("blacklistOutDate", blacklistOutdate);
result.put("timesToBlacklist", timesToBlacklist);
return R.data(result);
}
return R.fail(checkMsg);
}
@GetMapping("/export-page")
public R<IPage<ApmRecordExcelVO>> exportPage(Query query, Long createDept, String startTime, String endTime, String cupCardNo, String project, String apmStatus) {

@ -5,11 +5,14 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.*;
import lombok.AllArgsConstructor;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.springblade.common.cache.DictBizCache;
import org.springblade.common.config.Sm2PrivatekeyProperties;
import org.springblade.common.constant.BusinessConstant;
import org.springblade.common.constant.CommonConstant;
import org.springblade.common.enums.ErrorMsgEnum;
import org.springblade.common.utils.CommonDateUtil;
import org.springblade.common.utils.Sm2Utils;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
@ -23,6 +26,7 @@ import org.springblade.modules.business.vo.BlacklistVO;
import org.springblade.modules.business.wrapper.BlacklistWrapper;
import org.springframework.web.bind.annotation.*;
import java.io.UnsupportedEncodingException;
import java.util.Date;
/**
@ -38,6 +42,7 @@ import java.util.Date;
public class BlacklistController extends BladeController {
private final IBlacklistService blacklistService;
private final Sm2PrivatekeyProperties sm2PrivatekeyProperties;
/**
* 详情 - 根据用户证件号获取
@ -103,4 +108,31 @@ public class BlacklistController extends BladeController {
return R.data("");
}
/**
* 根据用户证件号获取正在生效的黑名单
*/
@GetMapping("/user-blacklist2")
@ApiOperationSupport(order = 4)
@ApiOperation(value = "获取正在生效的黑名单", notes = "传入用户证件号")
public R userBlacklist2(String cupCardNo) throws InvalidCipherTextException, UnsupportedEncodingException {
if (Func.isEmpty(cupCardNo)) {
return R.fail(ErrorMsgEnum.PARAMS_NULL_CUP_CARD_NO.getValue());
}
System.out.println("黑名单获取到的身份证号是:"+cupCardNo);
//cupCardNo = Sm2Utils.decrypt(cupCardNo,sm2PrivatekeyProperties.getUserBlacklist());
Blacklist blacklist = blacklistService.getLatelyRecord(cupCardNo);
int blacklistOutdate = DictBizCache.getDictValueWithOffset(BusinessConstant.DICT_KEY_BLACKLIST_OUTDATE);
if (Func.isNotEmpty(blacklist) && CommonDateUtil.daysBetweenWithoutStartDay(blacklist.getCreateTime(), DateUtil.now()) < blacklistOutdate) {
// 更新提示信息为
// int days = CommonDateUtil.daysBetweenWithoutStartDay(blacklist.getCreateTime(), DateUtil.now());
// return R.data("由于您未及时进行报到,已被拉黑请于" + (blacklistOutdate - days) + "日后再次进行预约");
Date date1 = DateUtil.plusDays(blacklist.getCreateTime(), blacklistOutdate + 1);
return R.data("由于您未及时进行报到,已被拉黑请于" + DateUtil.format(date1, DateUtil.PATTERN_DATE) + "日后再次进行预约");
}
return R.data("");
}
}

@ -2,9 +2,12 @@ package org.springblade.modules.business.controller;
import com.alibaba.fastjson.JSONObject;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.springblade.common.cache.business.CupImgCache;
import org.springblade.common.config.Sm2PrivatekeyProperties;
import org.springblade.common.constant.CommonConstant;
import org.springblade.common.utils.CommonDateUtil;
import org.springblade.core.boot.ctrl.BladeController;
@ -16,6 +19,8 @@ import org.springblade.modules.business.entity.CupImg;
import org.springblade.modules.business.service.ICupImgService;
import org.springframework.web.bind.annotation.*;
import java.io.UnsupportedEncodingException;
/**
* 控制器
*
@ -28,6 +33,7 @@ import org.springframework.web.bind.annotation.*;
@Api(value = "公共接口", tags = "公共接口")
public class CommonApiController extends BladeController {
private final ICupImgService cupImgService;
private final Sm2PrivatekeyProperties sm2PrivatekeyProperties;
/**
* 获取系统时间
@ -76,4 +82,49 @@ public class CommonApiController extends BladeController {
CupImgCache.clearCupImgCache(cupImg.getCupCardNo());
return R.status(true);
}
/**
* 保存用户头像
*/
@PostMapping("/save-cup-img2")
@ApiOperationSupport(order = 3)
@ApiOperation(value = "保存用户头像", notes = "保存用户头像")
public R saveCupImg2(@RequestParam String data) throws InvalidCipherTextException, UnsupportedEncodingException {
/*if (Func.isBlank(data)) {
return R.fail("请求数据为空");
}
JSONObject json = JSONObject.parseObject(data);
CupImg cupImg = BeanUtil.copy(json, CupImg.class);
cupImg.setCupCardNo(Sm2Utils.decrypt(cupImg.getCupCardNo(),sm2PrivatekeyProperties.getSaveCupImg()));
CupImg cupImgCheck = cupImgService.getByCardNo(cupImg.getCupCardNo());
if (Func.isEmpty(cupImgCheck)) {
cupImgService.save(cupImg);
} else {
cupImgCheck.setCupImg(cupImg.getCupImg());
cupImgService.saveOrUpdate(cupImgCheck);
}
CupImgCache.clearCupImgCache(cupImg.getCupCardNo());
return R.status(true);*/
if (Func.isBlank(data)) {
return R.fail("请求数据为空");
}
JSONObject json = JSONObject.parseObject(data);
CupImg cupImg = BeanUtil.copy(json, CupImg.class);
CupImg cupImgCheck = cupImgService.getByCardNo(cupImg.getCupCardNo());
if (Func.isEmpty(cupImgCheck)) {
cupImgService.save(cupImg);
} else {
cupImgCheck.setCupImg(cupImg.getCupImg());
cupImgService.saveOrUpdate(cupImgCheck);
}
CupImgCache.clearCupImgCache(cupImg.getCupCardNo());
return R.status(true);
}
}

@ -70,6 +70,7 @@ mybatis-plus:
map-underscore-to-camel-case: true
cache-enabled: false
jdbc-type-for-null: 'null'
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#knife4j配置
knife4j:
@ -156,6 +157,10 @@ blade:
- /blade-business/apm-record/page
- /blade-business/apm-record/cancel
- /blade-business/common-api/*
- /blade-business/blacklist/user-blacklist2
- /blade-business/apm-config/detail-for-apm2
- /blade-business/apm-record/save2
- /blade-business/apm-record/page2
#多租户配置
tenant:
#多租户增强
@ -171,3 +176,26 @@ blade:
#排除多租户逻辑
exclude-tables:
- blade_user
sm2:
publickey:
list-hospital: 044cf30ffeba743f9e66aa1035115414e13dff701be93d6a57c0aa8e6ea48e1799dbe509ec252d4f8dea66a78b9513630bf31cd82bfc05636f3e824bb024680626
detail-publish: 0449eab752b761532a74609a37bf743efc41c2772c842ba0be1424d50b29ade9416c816d6a99d753fee952521bf92467f16ad1896fce1a5ae58cf2cf13c88c45c3
user-blacklist: 041268f32bdcb362cfc8e00249debf326c127e56be7bd8ec1ee04771697caab77b5bae7f147e410abff5b43852185afb92e756bc72543eeadefc31be03a361b4b3
already-config-day: 0401fe45b4ba4904ce86b366feb6c62b6a1d7d4f83837deb39198fd5ffbb10c0d86ef883a0c79d4d546ce80c5ace6c8ebffba8c90fbece7ccad1666b4ef0ffa22c
detail-for-apm: 04c38b4f3043c81fe7f13f64863bad3f3b136d0f821a3d9f26aa963b1ea03e21e7b1e4fd2ef7a91bf39bfa49afd94f5d72582b8ffd87bd1f8725ac2928895c6347
save: 04eff6c44172d61eaaf21b3ff38c9912a016ce9b0d974fbe62f6c56fa66579b0a6c5514a6fe639d0889f160209990d8532fbb0359f9f57beb3b6765c9fd62aa898
page: 04fdaa01435913600162dea9c1892986c2b6bf28ba4110d9892b8e5184750819d8aea3fd7c70aca79a53a6b65200d681c812f61887c176a1cbda00313a76b6322f
cancel: 04a99f6a9ff11eb2cac2a4999d5a7fc2002dae6543e327d6a0ffcf001792cb6a89b48e6f87ca7d6826e469600f66c7c9beac911f5375b29fa725e58ae1d0cd848b
get-system-datetime: 04fa4a906f872f77cb2e9120f6f8e1f2c0e4b3ca8b5d367e21f02922132cdd868acca77403c650a6717af3538b27a5ab9493d5a101d9e42ca40d6aaa6a2ee3815a
save-cup-img: 04b05fe654923f9cd8b6c4980c8929b6c048428ce3a4e4c916cf316f46ea7ce0bb59b781347fe69c48c0b43111bfcbd99fd3346d3a0f3f5a99ff6993aa72710907
privatekey:
list-hospital: 00f25ebb5cb3183528b75cf25e69cac7092552fb17b4c6d746d9f70ebfbfe6d496
detail-publish: 00f043afa8fff8e0072dba30977b3c4f0111b98c14962af24f0708a7166af351e3
user-blacklist: 7c6a0aec3fc01d5e8e2cd623045ee3794767440d75480875ed828ce42fbab245
already-config-day: 11593e6de22fac1eb456b34bcb36dfd799c6b9211beb373ce71019fdcd5ac0a4
detail-for-apm: 099d89f22019b2d1b91b76d556b37e9520fa96f8114851c9a4854848f0b639d4
save: 00dd4999834a486a7e899c9ca99b6eb4d3e049ffd3480e1c4e0923beda0c1eb10e
page: 0084028214ba9561a8e0ebcebe8680820e1639f745ee184f959baad8c7a77f4dd4
cancel: 66b284eeb814354cb6bc2933a94a7ffa75945ba650c25ff0b59353fc00df71cb
get-system-datetime: 5721b6a3000e381f7b9b9ce1b96069469fb653f9c5b9e6874714999863eb8a9c
save-cup-img: 00e6382c568e319b106c6e572065eb69e8b930e82a1f85e9f9d277dbd7467a8297
Loading…
Cancel
Save