From 77f169e1776e16290f1840dae65b4ae5bc4c06ac Mon Sep 17 00:00:00 2001 From: sunjianxi <839419401@qq.com> Date: Thu, 23 May 2024 16:19:07 +0800 Subject: [PATCH] =?UTF-8?q?sm2=E5=8A=A0=E5=AF=86=E8=A7=A3=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 + .../java/org/springblade/Application.java | 5 + .../common/config/SecretCommon.java | 105 +++++++++++++ .../config/Sm2PrivatekeyProperties.java | 115 ++++++++++++++ .../common/config/Sm2PublickeyProperties.java | 115 ++++++++++++++ .../common/constant/KeyConstant.java | 11 ++ .../common/constant/ModeTypeConstant.java | 19 +++ .../common/enums/ModeTypeEnum.java | 25 +++ .../springblade/common/utils/Sm2Utils.java | 57 +++++++ .../controller/ApmConfigController.java | 31 +++- .../controller/ApmRecordController.java | 148 +++++++++++++++++- .../controller/BlacklistController.java | 32 ++++ .../controller/CommonApiController.java | 53 ++++++- src/main/resources/application.yml | 28 ++++ 14 files changed, 746 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/springblade/common/config/SecretCommon.java create mode 100644 src/main/java/org/springblade/common/config/Sm2PrivatekeyProperties.java create mode 100644 src/main/java/org/springblade/common/config/Sm2PublickeyProperties.java create mode 100644 src/main/java/org/springblade/common/constant/KeyConstant.java create mode 100644 src/main/java/org/springblade/common/constant/ModeTypeConstant.java create mode 100644 src/main/java/org/springblade/common/enums/ModeTypeEnum.java create mode 100644 src/main/java/org/springblade/common/utils/Sm2Utils.java diff --git a/pom.xml b/pom.xml index a764332..aa02efe 100644 --- a/pom.xml +++ b/pom.xml @@ -190,6 +190,12 @@ quartz 2.3.2 + + + org.bouncycastle + bcprov-jdk15to18 + 1.66 + diff --git a/src/main/java/org/springblade/Application.java b/src/main/java/org/springblade/Application.java index 8feed05..4f52903 100644 --- a/src/main/java/org/springblade/Application.java +++ b/src/main/java/org/springblade/Application.java @@ -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("======================"); } } diff --git a/src/main/java/org/springblade/common/config/SecretCommon.java b/src/main/java/org/springblade/common/config/SecretCommon.java new file mode 100644 index 0000000..3a8d705 --- /dev/null +++ b/src/main/java/org/springblade/common/config/SecretCommon.java @@ -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 createKeyPair() throws NoSuchAlgorithmException { + ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator(); + keyPairGenerator.init(new ECKeyGenerationParameters(getECDomainParameters(), SecureRandom.getInstance(KeyConstant.ALGORITHM))); + AsymmetricCipherKeyPair asymmetricCipherKeyPair = keyPairGenerator.generateKeyPair(); + Map 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:标准;bc:BC模式 + */ + 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:标准;bc:BC模式 + */ + 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"); + } + +} diff --git a/src/main/java/org/springblade/common/config/Sm2PrivatekeyProperties.java b/src/main/java/org/springblade/common/config/Sm2PrivatekeyProperties.java new file mode 100644 index 0000000..f0efb67 --- /dev/null +++ b/src/main/java/org/springblade/common/config/Sm2PrivatekeyProperties.java @@ -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; + } +} diff --git a/src/main/java/org/springblade/common/config/Sm2PublickeyProperties.java b/src/main/java/org/springblade/common/config/Sm2PublickeyProperties.java new file mode 100644 index 0000000..d5c381f --- /dev/null +++ b/src/main/java/org/springblade/common/config/Sm2PublickeyProperties.java @@ -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; + } +} diff --git a/src/main/java/org/springblade/common/constant/KeyConstant.java b/src/main/java/org/springblade/common/constant/KeyConstant.java new file mode 100644 index 0000000..1c9da27 --- /dev/null +++ b/src/main/java/org/springblade/common/constant/KeyConstant.java @@ -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"; + +} diff --git a/src/main/java/org/springblade/common/constant/ModeTypeConstant.java b/src/main/java/org/springblade/common/constant/ModeTypeConstant.java new file mode 100644 index 0000000..60610e7 --- /dev/null +++ b/src/main/java/org/springblade/common/constant/ModeTypeConstant.java @@ -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; + } +} diff --git a/src/main/java/org/springblade/common/enums/ModeTypeEnum.java b/src/main/java/org/springblade/common/enums/ModeTypeEnum.java new file mode 100644 index 0000000..d695798 --- /dev/null +++ b/src/main/java/org/springblade/common/enums/ModeTypeEnum.java @@ -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; + } +} diff --git a/src/main/java/org/springblade/common/utils/Sm2Utils.java b/src/main/java/org/springblade/common/utils/Sm2Utils.java new file mode 100644 index 0000000..67e5141 --- /dev/null +++ b/src/main/java/org/springblade/common/utils/Sm2Utils.java @@ -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 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:标准;bc:BC模式 + */ + 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:标准;bc:BC模式 + */ + public static String decrypt(String cipherText, String privateKey, String modeType) throws InvalidCipherTextException, UnsupportedEncodingException { + return SecretCommon.decrypt(cipherText, privateKey, ModeTypeConstant.getMode(modeType)); + } +} diff --git a/src/main/java/org/springblade/modules/business/controller/ApmConfigController.java b/src/main/java/org/springblade/modules/business/controller/ApmConfigController.java index 897cffb..211ff48 100644 --- a/src/main/java/org/springblade/modules/business/controller/ApmConfigController.java +++ b/src/main/java/org/springblade/modules/business/controller/ApmConfigController.java @@ -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> 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 diff --git a/src/main/java/org/springblade/modules/business/controller/ApmRecordController.java b/src/main/java/org/springblade/modules/business/controller/ApmRecordController.java index bd69be9..90b7c26 100644 --- a/src/main/java/org/springblade/modules/business/controller/ApmRecordController.java +++ b/src/main/java/org/springblade/modules/business/controller/ApmRecordController.java @@ -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> 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 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> selectPage(Query query, Long createDept, String startTime, String endTime, String cupCardNo, String project, String apmStatus) { + public R> 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 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 apmRecordListStr) throws InvalidCipherTextException, UnsupportedEncodingException { + /*List> apmRecordMapList = (List>) apmRecordListStr.get("data"); + + List apmRecordList = new ArrayList<>(); + Date apmDay = null; + String cardNo = null; + for (Map 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 result = new HashMap<>(); + result.put("blacklistOutDate", blacklistOutdate); + result.put("timesToBlacklist", timesToBlacklist); + return R.data(result); + } + } + return R.fail(checkMsg);*/ + List> apmRecordMapList = (List>) apmRecordListStr.get("data"); + + List apmRecordList = new ArrayList<>(); + Date apmDay = null; + String cardNo = null; + for (Map 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 result = new HashMap<>(); + result.put("blacklistOutDate", blacklistOutdate); + result.put("timesToBlacklist", timesToBlacklist); + return R.data(result); + } + return R.fail(checkMsg); + } + @GetMapping("/export-page") public R> exportPage(Query query, Long createDept, String startTime, String endTime, String cupCardNo, String project, String apmStatus) { diff --git a/src/main/java/org/springblade/modules/business/controller/BlacklistController.java b/src/main/java/org/springblade/modules/business/controller/BlacklistController.java index 66e947c..b863b07 100644 --- a/src/main/java/org/springblade/modules/business/controller/BlacklistController.java +++ b/src/main/java/org/springblade/modules/business/controller/BlacklistController.java @@ -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(""); + } } diff --git a/src/main/java/org/springblade/modules/business/controller/CommonApiController.java b/src/main/java/org/springblade/modules/business/controller/CommonApiController.java index f45055f..85b2771 100644 --- a/src/main/java/org/springblade/modules/business/controller/CommonApiController.java +++ b/src/main/java/org/springblade/modules/business/controller/CommonApiController.java @@ -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); + } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index dc1294c..1784daa 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -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 \ No newline at end of file