From 5123f48f469dba99f6929a3f6abbe3690ce3e8c2 Mon Sep 17 00:00:00 2001
From: lin <sbla5888@163.com>
Date: Fri, 29 Mar 2024 17:37:13 +0800
Subject: [PATCH] 短信验证码+导出议事报名人员+居住证申请统计bug
---
src/main/java/org/springblade/common/utils/sms/StringUtils.java | 171 ++++
src/main/java/org/springblade/modules/discuss/mapper/UserTopicsMapper.xml | 102 ++
src/main/java/org/springblade/common/utils/sms/AlipaySignature.java | 607 ++++++++++++++++
src/main/java/org/springblade/modules/sms/vo/SmsTemplateVO.java | 5
pom.xml | 4
src/main/java/org/springblade/common/utils/HttpClientUtils.java | 27
src/main/java/org/springblade/common/utils/sms/PerfectSend.java | 91 ++
src/main/java/org/springblade/common/utils/sms/ReplyContent.java | 63 +
src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.java | 2
src/main/java/org/springblade/common/utils/sms/StatusReport.java | 91 ++
src/main/java/org/springblade/modules/discuss/vo/UserTopicsVO.java | 7
src/main/java/org/springblade/modules/sms/service/ISmsTemplateService.java | 9
src/main/java/org/springblade/modules/sms/service/impl/SmsSendServiceImpl.java | 166 ++++
src/main/java/org/springblade/modules/task/service/ITaskResidencePermitApplyService.java | 2
src/main/java/org/springblade/modules/task/service/impl/TaskResidencePermitApplyServiceImpl.java | 4
src/main/java/org/springblade/modules/discuss/service/impl/UserTopicsServiceImpl.java | 143 +++
src/main/java/org/springblade/modules/discuss/excel/topicsExcel.java | 54 +
src/main/java/org/springblade/modules/system/service/IMenuService.java | 2
src/main/java/org/springblade/modules/discuss/controller/TopicsController.java | 1
src/main/java/org/springblade/modules/sms/service/impl/SmsTemplateServiceImpl.java | 13
src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.xml | 1
src/main/java/org/springblade/modules/discuss/service/impl/PublicDiscussServiceImpl.java | 1
src/main/java/org/springblade/common/utils/sms/AlipayApiException.java | 49 +
src/main/java/org/springblade/common/utils/UtilRandom.java | 7
src/main/java/org/springblade/modules/sms/wrapper/SmsTemplateWrapper.java | 6
src/main/java/org/springblade/modules/sms/entity/SmsTemplateEntity.java | 8
src/main/java/org/springblade/modules/sms/mapper/SmsTemplateMapper.java | 8
src/main/java/org/springblade/modules/sms/dto/SmsTemplateDTO.java | 4
src/main/java/org/springblade/modules/discuss/mapper/UserTopicsMapper.java | 8
src/main/java/org/springblade/modules/sms/service/ISmsSendService.java | 27
src/main/java/org/springblade/modules/system/controller/MenuController.java | 9
src/main/java/org/springblade/modules/discuss/service/IUserTopicsService.java | 5
src/main/java/org/springblade/common/utils/sms/AlipayConstants.java | 97 ++
src/main/java/org/springblade/modules/property/mapper/PropertyCompanyDistrictMapper.xml | 2
src/main/java/org/springblade/modules/discuss/excel/householdExcel.java | 71 +
src/main/java/org/springblade/modules/discuss/excel/UserTopicsExcel.java | 9
src/main/java/org/springblade/modules/sms/mapper/SmsTemplateMapper.xml | 8
src/main/java/org/springblade/common/config/SmsConfig.java | 25
src/main/java/org/springblade/modules/system/service/impl/UserServiceImpl.java | 12
src/main/java/org/springblade/modules/system/service/impl/MenuServiceImpl.java | 11
src/main/java/org/springblade/modules/discuss/vo/TopicsVO.java | 2
src/main/java/org/springblade/modules/sms/controller/SmsTemplateController.java | 11
src/main/java/org/springblade/modules/discuss/controller/UserTopicsController.java | 22
src/main/java/org/springblade/common/utils/sms/StreamUtil.java | 135 +++
src/main/java/org/springblade/modules/sms/controller/SmsSendController.java | 65 +
45 files changed, 2,073 insertions(+), 94 deletions(-)
diff --git a/pom.xml b/pom.xml
index c81e921..8aae144 100644
--- a/pom.xml
+++ b/pom.xml
@@ -263,6 +263,10 @@
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </dependency>
</dependencies>
diff --git a/src/main/java/org/springblade/common/config/SmsConfig.java b/src/main/java/org/springblade/common/config/SmsConfig.java
new file mode 100644
index 0000000..a9135b4
--- /dev/null
+++ b/src/main/java/org/springblade/common/config/SmsConfig.java
@@ -0,0 +1,25 @@
+package org.springblade.common.config;
+
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+//@ConfigurationProperties(prefix = "sms") //读取sms节点
+@Data
+public class SmsConfig {
+ @Value("${sms.url}")
+ private String smsUrl;
+ // 平台提供的appId 仅供测试使用
+ @Value("${sms.appId}")
+ private String smsAppId;
+ // 平台提供的私钥 仅供测试使用
+ @Value("${sms.privateKey}")
+ private String smsPrivateKey;
+ @Value("${sms.sopCreateBy}")
+ private String sopCreateBy;
+
+
+}
diff --git a/src/main/java/org/springblade/common/utils/HttpClientUtils.java b/src/main/java/org/springblade/common/utils/HttpClientUtils.java
index e75f430..8e27f08 100644
--- a/src/main/java/org/springblade/common/utils/HttpClientUtils.java
+++ b/src/main/java/org/springblade/common/utils/HttpClientUtils.java
@@ -100,13 +100,13 @@
/**
* 执行有参GET请求,带请求头
*
- * @param url 请求url
- * @param params 参数
- * @param key 请求头Key
+ * @param url 请求url
+ * @param params 参数
+ * @param key 请求头Key
* @param secretKey 秘钥
* @return
*/
- public static String doGetHeader(String url, String key, String secretKey,Map<String, String> params) {
+ public static String doGetHeader(String url, String key, String secretKey, Map<String, String> params) {
//获取httpclient客户端
CloseableHttpClient httpclient = HttpClients.createDefault();
@@ -120,7 +120,7 @@
if (null != params) {
for (String keys : params.keySet()) {
- builder.addParameter(keys,params.get(keys));
+ builder.addParameter(keys, params.get(keys));
//builder.setParameter(keys, params.get(keys));
}
}
@@ -128,7 +128,7 @@
HttpGet httpGet = new HttpGet(builder.build());
//设置请求头
- httpGet.addHeader(key,secretKey);
+ httpGet.addHeader(key, secretKey);
// 传输的类型
httpGet.addHeader("Content-Type", "application/x-www-form-urlencoded");
//执行Http请求调用
@@ -164,13 +164,13 @@
/**
* 执行有参GET请求,带请求头,接收图片流
*
- * @param url 请求url
- * @param params 参数
- * @param key 请求头Key
+ * @param url 请求url
+ * @param params 参数
+ * @param key 请求头Key
* @param secretKey 秘钥
* @return
*/
- public static String doGetHeaderPictureBase64(String url, String key, String secretKey,Map<String, String> params) {
+ public static String doGetHeaderPictureBase64(String url, String key, String secretKey, Map<String, String> params) {
//获取httpclient客户端
CloseableHttpClient httpclient = HttpClients.createDefault();
@@ -180,12 +180,12 @@
URIBuilder builder = new URIBuilder(url);
if (null != params) {
for (String keys : params.keySet()) {
- builder.addParameter(keys,params.get(keys));
+ builder.addParameter(keys, params.get(keys));
}
}
HttpGet httpGet = new HttpGet(builder.build());
//设置请求头
- httpGet.addHeader(key,secretKey);
+ httpGet.addHeader(key, secretKey);
// 传输的类型
httpGet.addHeader("Content-Type", "application/x-www-form-urlencoded");
//执行Http请求调用
@@ -328,6 +328,7 @@
/**
* post 请求 header 带 秘钥
+ *
* @param url
* @param appKey
* @param appKeyValue
@@ -439,7 +440,6 @@
}
return "";
}
-
//适用于post请求并传送form-data数据(同样适用于post的Raw类型的application-json格式)
@@ -562,6 +562,7 @@
/**
* json body
+ *
* @param url
* @param json
* @return
diff --git a/src/main/java/org/springblade/common/utils/UtilRandom.java b/src/main/java/org/springblade/common/utils/UtilRandom.java
new file mode 100644
index 0000000..ced5efe
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/UtilRandom.java
@@ -0,0 +1,7 @@
+package org.springblade.common.utils;
+
+public class UtilRandom {
+ public static Integer randomCount(Integer start, Integer end) {
+ return (int) (Math.random() * (end - start + 1) + start);
+ }
+}
diff --git a/src/main/java/org/springblade/common/utils/sms/AlipayApiException.java b/src/main/java/org/springblade/common/utils/sms/AlipayApiException.java
new file mode 100644
index 0000000..646ce63
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/sms/AlipayApiException.java
@@ -0,0 +1,49 @@
+/**
+ * Alipay.com Inc.
+ * Copyright (c) 2004-2012 All Rights Reserved.
+ */
+package org.springblade.common.utils.sms;
+
+
+/**
+ *
+ * @author runzhi
+ */
+public class AlipayApiException extends Exception {
+
+ private static final long serialVersionUID = -238091758285157331L;
+
+ private String errCode;
+ private String errMsg;
+
+ public AlipayApiException() {
+ super();
+ }
+
+ public AlipayApiException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public AlipayApiException(String message) {
+ super(message);
+ }
+
+ public AlipayApiException(Throwable cause) {
+ super(cause);
+ }
+
+ public AlipayApiException(String errCode, String errMsg) {
+ super(errCode + ":" + errMsg);
+ this.errCode = errCode;
+ this.errMsg = errMsg;
+ }
+
+ public String getErrCode() {
+ return this.errCode;
+ }
+
+ public String getErrMsg() {
+ return this.errMsg;
+ }
+
+}
diff --git a/src/main/java/org/springblade/common/utils/sms/AlipayConstants.java b/src/main/java/org/springblade/common/utils/sms/AlipayConstants.java
new file mode 100644
index 0000000..1bfbde3
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/sms/AlipayConstants.java
@@ -0,0 +1,97 @@
+/**
+ * Alipay.com Inc.
+ * Copyright (c) 2004-2012 All Rights Reserved.
+ */
+package org.springblade.common.utils.sms;
+
+/**
+ *
+ * @author runzhi
+ */
+public class AlipayConstants {
+
+ public static final String SIGN_TYPE = "sign_type";
+
+ public static final String SIGN_TYPE_RSA = "RSA";
+
+ /**
+ * sha256WithRsa 算法请求类型
+ */
+ public static final String SIGN_TYPE_RSA2 = "RSA2";
+
+ public static final String SIGN_ALGORITHMS = "SHA1WithRSA";
+
+ public static final String SIGN_SHA256RSA_ALGORITHMS = "SHA256WithRSA";
+
+ public static final String ENCRYPT_TYPE_AES = "AES";
+
+ public static final String APP_ID = "app_id";
+
+ public static final String FORMAT = "format";
+
+ public static final String METHOD = "method";
+
+ public static final String TIMESTAMP = "timestamp";
+
+ public static final String VERSION = "version";
+
+ public static final String SIGN = "sign";
+
+ public static final String ALIPAY_SDK = "alipay_sdk";
+
+ public static final String ACCESS_TOKEN = "auth_token";
+
+ public static final String APP_AUTH_TOKEN = "app_auth_token";
+
+ public static final String TERMINAL_TYPE = "terminal_type";
+
+ public static final String TERMINAL_INFO = "terminal_info";
+
+ public static final String CHARSET = "charset";
+
+ public static final String NOTIFY_URL = "notify_url";
+
+ public static final String RETURN_URL = "return_url";
+
+ public static final String ENCRYPT_TYPE = "encrypt_type";
+
+ //-----===-------///
+
+ public static final String BIZ_CONTENT_KEY = "biz_content";
+
+ /** 默认时间格式 **/
+ public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
+
+ /** Date默认时区 **/
+ public static final String DATE_TIMEZONE = "GMT+8";
+
+ /** UTF-8字符集 **/
+ public static final String CHARSET_UTF8 = "UTF-8";
+
+ /** GBK字符集 **/
+ public static final String CHARSET_GBK = "GBK";
+
+ /** JSON 应格式 */
+ public static final String FORMAT_JSON = "json";
+
+ /** XML 应格式 */
+ public static final String FORMAT_XML = "xml";
+
+ /** SDK版本号 */
+ public static final String SDK_VERSION = "alipay-sdk-java-3.6.0.ALL";
+
+ public static final String PROD_CODE = "prod_code";
+
+ /** 老版本失败节点 */
+ public static final String ERROR_RESPONSE = "error_response";
+
+ /** 新版本节点后缀 */
+ public static final String RESPONSE_SUFFIX = "_response";
+
+ /** 加密后XML返回报文的节点名字 */
+ public static final String RESPONSE_XML_ENCRYPT_NODE_NAME = "response_encrypted";
+
+ /** 批量请求id **/
+ public static final String BATCH_REQUEST_ID = "batch_request_id";
+
+}
diff --git a/src/main/java/org/springblade/common/utils/sms/AlipaySignature.java b/src/main/java/org/springblade/common/utils/sms/AlipaySignature.java
new file mode 100644
index 0000000..d4f2de2
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/sms/AlipaySignature.java
@@ -0,0 +1,607 @@
+/**
+ * Alipay.com Inc.
+ * Copyright (c) 2004-2012 All Rights Reserved.
+ */
+package org.springblade.common.utils.sms;
+
+
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.Cipher;
+import java.io.*;
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * @author runzhi
+ */
+public class AlipaySignature {
+
+ /** RSA最大加密明文大小 */
+ private static final int MAX_ENCRYPT_BLOCK = 117;
+
+ /** RSA最大解密密文大小 */
+ private static final int MAX_DECRYPT_BLOCK = 128;
+
+
+
+ /**
+ *
+ * @param sortedParams
+ * @return
+ */
+ public static String getSignContent(Map<String, String> sortedParams) {
+ StringBuffer content = new StringBuffer();
+ List<String> keys = new ArrayList<String>(sortedParams.keySet());
+ Collections.sort(keys);
+ int index = 0;
+ for (int i = 0; i < keys.size(); i++) {
+ String key = keys.get(i);
+ String value = sortedParams.get(key);
+ if (StringUtils.areNotEmpty(key, value)) {
+ content.append((index == 0 ? "" : "&") + key + "=" + value);
+ index++;
+ }
+ }
+ return content.toString();
+ }
+
+ /**
+ * rsa内容签名
+ *
+ * @param content
+ * @param privateKey
+ * @param charset
+ * @return
+ * @throws AlipayApiException
+ */
+ public static String rsaSign(String content, String privateKey, String charset,
+ String signType) throws AlipayApiException {
+
+ if (AlipayConstants.SIGN_TYPE_RSA.equals(signType)) {
+
+ return rsaSign(content, privateKey, charset);
+ } else if (AlipayConstants.SIGN_TYPE_RSA2.equals(signType)) {
+
+ return rsa256Sign(content, privateKey, charset);
+ } else {
+
+ throw new AlipayApiException("Sign Type is Not Support : signType=" + signType);
+ }
+
+ }
+
+ /**
+ * sha256WithRsa 加签
+ *
+ * @param content
+ * @param privateKey
+ * @param charset
+ * @return
+ * @throws AlipayApiException
+ */
+ public static String rsa256Sign(String content, String privateKey,
+ String charset) throws AlipayApiException {
+
+ try {
+ PrivateKey priKey = getPrivateKeyFromPKCS8(AlipayConstants.SIGN_TYPE_RSA,
+ new ByteArrayInputStream(privateKey.getBytes()));
+
+ java.security.Signature signature = java.security.Signature
+ .getInstance(AlipayConstants.SIGN_SHA256RSA_ALGORITHMS);
+
+ signature.initSign(priKey);
+
+ if (StringUtils.isEmpty(charset)) {
+ signature.update(content.getBytes());
+ } else {
+ signature.update(content.getBytes(charset));
+ }
+
+ byte[] signed = signature.sign();
+
+ return new String(Base64.encodeBase64(signed));
+ } catch (Exception e) {
+ throw new AlipayApiException("RSAcontent = " + content + "; charset = " + charset, e);
+ }
+
+ }
+
+ /**
+ * sha1WithRsa 加签
+ *
+ * @param content
+ * @param privateKey
+ * @param charset
+ * @return
+ * @throws AlipayApiException
+ */
+ public static String rsaSign(String content, String privateKey,
+ String charset) throws AlipayApiException {
+ try {
+ PrivateKey priKey = getPrivateKeyFromPKCS8(AlipayConstants.SIGN_TYPE_RSA,
+ new ByteArrayInputStream(privateKey.getBytes()));
+
+ java.security.Signature signature = java.security.Signature
+ .getInstance(AlipayConstants.SIGN_ALGORITHMS);
+
+ signature.initSign(priKey);
+
+ if (StringUtils.isEmpty(charset)) {
+ signature.update(content.getBytes());
+ } else {
+ signature.update(content.getBytes(charset));
+ }
+
+ byte[] signed = signature.sign();
+
+ return new String(Base64.encodeBase64(signed));
+ } catch (InvalidKeySpecException ie) {
+ throw new AlipayApiException("RSA私钥格式不正确,请检查是否正确配置了PKCS8格式的私钥", ie);
+ } catch (Exception e) {
+ throw new AlipayApiException("RSAcontent = " + content + "; charset = " + charset, e);
+ }
+ }
+
+ public static String rsaSign(Map<String, String> params, String privateKey,
+ String charset) throws AlipayApiException {
+ String signContent = getSignContent(params);
+
+ return rsaSign(signContent, privateKey, charset);
+
+ }
+
+ public static PrivateKey getPrivateKeyFromPKCS8(String algorithm,
+ InputStream ins) throws Exception {
+ if (ins == null || StringUtils.isEmpty(algorithm)) {
+ return null;
+ }
+
+ KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
+
+ byte[] encodedKey = StreamUtil.readText(ins).getBytes();
+
+ encodedKey = Base64.decodeBase64(encodedKey);
+
+ return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(encodedKey));
+ }
+
+ public static String getSignCheckContentV1(Map<String, String> params) {
+ if (params == null) {
+ return null;
+ }
+
+ params.remove("sign");
+ params.remove("sign_type");
+
+ StringBuffer content = new StringBuffer();
+ List<String> keys = new ArrayList<String>(params.keySet());
+ Collections.sort(keys);
+
+ for (int i = 0; i < keys.size(); i++) {
+ String key = keys.get(i);
+ String value = params.get(key);
+ content.append((i == 0 ? "" : "&") + key + "=" + value);
+ }
+
+ return content.toString();
+ }
+
+ public static String getSignCheckContentV2(Map<String, String> params) {
+ if (params == null) {
+ return null;
+ }
+
+ params.remove("sign");
+
+ StringBuffer content = new StringBuffer();
+ List<String> keys = new ArrayList<String>(params.keySet());
+ Collections.sort(keys);
+
+ for (int i = 0; i < keys.size(); i++) {
+ String key = keys.get(i);
+ String value = params.get(key);
+ content.append((i == 0 ? "" : "&") + key + "=" + value);
+ }
+
+ return content.toString();
+ }
+
+ public static boolean rsaCheckV1(Map<String, String> params, String publicKey,
+ String charset) throws AlipayApiException {
+ String sign = params.get("sign");
+ String content = getSignCheckContentV1(params);
+
+ return rsaCheckContent(content, sign, publicKey, charset);
+ }
+
+ public static boolean rsaCheckV1(Map<String, String> params, String publicKey,
+ String charset,String signType) throws AlipayApiException {
+ String sign = params.get("sign");
+ String content = getSignCheckContentV1(params);
+
+ return rsaCheck(content, sign, publicKey, charset,signType);
+ }
+
+ public static boolean rsaCheckV2(Map<String, String> params, String publicKey,
+ String charset) throws AlipayApiException {
+ String sign = params.get("sign");
+ String content = getSignCheckContentV2(params);
+
+ return rsaCheckContent(content, sign, publicKey, charset);
+ }
+
+ public static boolean rsaCheckV2(Map<String, String> params, String publicKey,
+ String charset,String signType) throws AlipayApiException {
+ String sign = params.get("sign");
+ String content = getSignCheckContentV2(params);
+
+ return rsaCheck(content, sign, publicKey, charset,signType);
+ }
+
+ public static boolean rsaCheck(String content, String sign, String publicKey, String charset,
+ String signType) throws AlipayApiException {
+
+ if (AlipayConstants.SIGN_TYPE_RSA.equals(signType)) {
+
+ return rsaCheckContent(content, sign, publicKey, charset);
+
+ } else if (AlipayConstants.SIGN_TYPE_RSA2.equals(signType)) {
+
+ return rsa256CheckContent(content, sign, publicKey, charset);
+
+ } else {
+
+ throw new AlipayApiException("Sign Type is Not Support : signType=" + signType);
+ }
+
+ }
+
+ public static boolean rsa256CheckContent(String content, String sign, String publicKey,
+ String charset) throws AlipayApiException {
+ try {
+ PublicKey pubKey = getPublicKeyFromX509("RSA",
+ new ByteArrayInputStream(publicKey.getBytes()));
+
+ java.security.Signature signature = java.security.Signature
+ .getInstance(AlipayConstants.SIGN_SHA256RSA_ALGORITHMS);
+
+ signature.initVerify(pubKey);
+
+ if (StringUtils.isEmpty(charset)) {
+ signature.update(content.getBytes());
+ } else {
+ signature.update(content.getBytes(charset));
+ }
+
+ return signature.verify(Base64.decodeBase64(sign.getBytes()));
+ } catch (Exception e) {
+ throw new AlipayApiException(
+ "RSAcontent = " + content + ",sign=" + sign + ",charset = " + charset, e);
+ }
+ }
+
+ public static boolean rsaCheckContent(String content, String sign, String publicKey,
+ String charset) throws AlipayApiException {
+ try {
+ PublicKey pubKey = getPublicKeyFromX509("RSA",
+ new ByteArrayInputStream(publicKey.getBytes()));
+
+ java.security.Signature signature = java.security.Signature
+ .getInstance(AlipayConstants.SIGN_ALGORITHMS);
+
+ signature.initVerify(pubKey);
+
+ if (StringUtils.isEmpty(charset)) {
+ signature.update(content.getBytes());
+ } else {
+ signature.update(content.getBytes(charset));
+ }
+
+ return signature.verify(Base64.decodeBase64(sign.getBytes()));
+ } catch (Exception e) {
+ throw new AlipayApiException(
+ "RSAcontent = " + content + ",sign=" + sign + ",charset = " + charset, e);
+ }
+ }
+
+ public static PublicKey getPublicKeyFromX509(String algorithm,
+ InputStream ins) throws Exception {
+ KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
+
+ StringWriter writer = new StringWriter();
+ StreamUtil.io(new InputStreamReader(ins), writer);
+
+ byte[] encodedKey = writer.toString().getBytes();
+
+ encodedKey = Base64.decodeBase64(encodedKey);
+
+ return keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
+ }
+
+ /**
+ * 验签并解密
+ * <p>
+ * <b>目前适用于公众号</b><br>
+ * params参数示例:
+ * <br>{
+ * <br>biz_content=M0qGiGz+8kIpxe8aF4geWJdBn0aBTuJRQItLHo9R7o5JGhpic/MIUjvXo2BLB++BbkSq2OsJCEQFDZ0zK5AJYwvBgeRX30gvEj6eXqXRt16/IkB9HzAccEqKmRHrZJ7PjQWE0KfvDAHsJqFIeMvEYk1Zei2QkwSQPlso7K0oheo/iT+HYE8aTATnkqD/ByD9iNDtGg38pCa2xnnns63abKsKoV8h0DfHWgPH62urGY7Pye3r9FCOXA2Ykm8X4/Bl1bWFN/PFCEJHWe/HXj8KJKjWMO6ttsoV0xRGfeyUO8agu6t587Dl5ux5zD/s8Lbg5QXygaOwo3Fz1G8EqmGhi4+soEIQb8DBYanQOS3X+m46tVqBGMw8Oe+hsyIMpsjwF4HaPKMr37zpW3fe7xOMuimbZ0wq53YP/jhQv6XWodjT3mL0H5ACqcsSn727B5ztquzCPiwrqyjUHjJQQefFTzOse8snaWNQTUsQS7aLsHq0FveGpSBYORyA90qPdiTjXIkVP7mAiYiAIWW9pCEC7F3XtViKTZ8FRMM9ySicfuAlf3jtap6v2KPMtQv70X+hlmzO/IXB6W0Ep8DovkF5rB4r/BJYJLw/6AS0LZM9w5JfnAZhfGM2rKzpfNsgpOgEZS1WleG4I2hoQC0nxg9IcP0Hs+nWIPkEUcYNaiXqeBc=,
+ * <br>sign=rlqgA8O+RzHBVYLyHmrbODVSANWPXf3pSrr82OCO/bm3upZiXSYrX5fZr6UBmG6BZRAydEyTIguEW6VRuAKjnaO/sOiR9BsSrOdXbD5Rhos/Xt7/mGUWbTOt/F+3W0/XLuDNmuYg1yIC/6hzkg44kgtdSTsQbOC9gWM7ayB4J4c=,
+ * sign_type=RSA,
+ * <br>charset=UTF-8
+ * <br>}
+ * </p>
+ * @param params
+ * @param alipayPublicKey 支付宝公钥
+ * @param cusPrivateKey 商户私钥
+ * @param isCheckSign 是否验签
+ * @param isDecrypt 是否解密
+ * @return 解密后明文,验签失败则异常抛出
+ * @throws AlipayApiException
+ */
+ public static String checkSignAndDecrypt(Map<String, String> params, String alipayPublicKey,
+ String cusPrivateKey, boolean isCheckSign,
+ boolean isDecrypt) throws AlipayApiException {
+ String charset = params.get("charset");
+ String bizContent = params.get("biz_content");
+ if (isCheckSign) {
+ if (!rsaCheckV2(params, alipayPublicKey, charset)) {
+ throw new AlipayApiException("rsaCheck failure:rsaParams=" + params);
+ }
+ }
+
+ if (isDecrypt) {
+ return rsaDecrypt(bizContent, cusPrivateKey, charset);
+ }
+
+ return bizContent;
+ }
+
+ /**
+ * 验签并解密
+ * <p>
+ * <b>目前适用于公众号</b><br>
+ * params参数示例:
+ * <br>{
+ * <br>biz_content=M0qGiGz+8kIpxe8aF4geWJdBn0aBTuJRQItLHo9R7o5JGhpic/MIUjvXo2BLB++BbkSq2OsJCEQFDZ0zK5AJYwvBgeRX30gvEj6eXqXRt16/IkB9HzAccEqKmRHrZJ7PjQWE0KfvDAHsJqFIeMvEYk1Zei2QkwSQPlso7K0oheo/iT+HYE8aTATnkqD/ByD9iNDtGg38pCa2xnnns63abKsKoV8h0DfHWgPH62urGY7Pye3r9FCOXA2Ykm8X4/Bl1bWFN/PFCEJHWe/HXj8KJKjWMO6ttsoV0xRGfeyUO8agu6t587Dl5ux5zD/s8Lbg5QXygaOwo3Fz1G8EqmGhi4+soEIQb8DBYanQOS3X+m46tVqBGMw8Oe+hsyIMpsjwF4HaPKMr37zpW3fe7xOMuimbZ0wq53YP/jhQv6XWodjT3mL0H5ACqcsSn727B5ztquzCPiwrqyjUHjJQQefFTzOse8snaWNQTUsQS7aLsHq0FveGpSBYORyA90qPdiTjXIkVP7mAiYiAIWW9pCEC7F3XtViKTZ8FRMM9ySicfuAlf3jtap6v2KPMtQv70X+hlmzO/IXB6W0Ep8DovkF5rB4r/BJYJLw/6AS0LZM9w5JfnAZhfGM2rKzpfNsgpOgEZS1WleG4I2hoQC0nxg9IcP0Hs+nWIPkEUcYNaiXqeBc=,
+ * <br>sign=rlqgA8O+RzHBVYLyHmrbODVSANWPXf3pSrr82OCO/bm3upZiXSYrX5fZr6UBmG6BZRAydEyTIguEW6VRuAKjnaO/sOiR9BsSrOdXbD5Rhos/Xt7/mGUWbTOt/F+3W0/XLuDNmuYg1yIC/6hzkg44kgtdSTsQbOC9gWM7ayB4J4c=,
+ * sign_type=RSA,
+ * <br>charset=UTF-8
+ * <br>}
+ * </p>
+ * @param params
+ * @param alipayPublicKey 支付宝公钥
+ * @param cusPrivateKey 商户私钥
+ * @param isCheckSign 是否验签
+ * @param isDecrypt 是否解密
+ * @return 解密后明文,验签失败则异常抛出
+ * @throws AlipayApiException
+ */
+ public static String checkSignAndDecrypt(Map<String, String> params, String alipayPublicKey,
+ String cusPrivateKey, boolean isCheckSign,
+ boolean isDecrypt, String signType) throws AlipayApiException {
+ String charset = params.get("charset");
+ String bizContent = params.get("biz_content");
+ if (isCheckSign) {
+ if (!rsaCheckV2(params, alipayPublicKey, charset,signType)) {
+ throw new AlipayApiException("rsaCheck failure:rsaParams=" + params);
+ }
+ }
+
+ if (isDecrypt) {
+ return rsaDecrypt(bizContent, cusPrivateKey, charset);
+ }
+
+ return bizContent;
+ }
+
+ /**
+ * 加密并签名<br>
+ * <b>目前适用于公众号</b>
+ * @param bizContent 待加密、签名内容
+ * @param alipayPublicKey 支付宝公钥
+ * @param cusPrivateKey 商户私钥
+ * @param charset 字符集,如UTF-8, GBK, GB2312
+ * @param isEncrypt 是否加密,true-加密 false-不加密
+ * @param isSign 是否签名,true-签名 false-不签名
+ * @return 加密、签名后xml内容字符串
+ * <p>
+ * 返回示例:
+ * <alipay>
+ * <response>密文</response>
+ * <encryption_type>RSA</encryption_type>
+ * <sign>sign</sign>
+ * <sign_type>RSA</sign_type>
+ * </alipay>
+ * </p>
+ * @throws AlipayApiException
+ */
+ public static String encryptAndSign(String bizContent, String alipayPublicKey,
+ String cusPrivateKey, String charset, boolean isEncrypt,
+ boolean isSign) throws AlipayApiException {
+ StringBuilder sb = new StringBuilder();
+ if (StringUtils.isEmpty(charset)) {
+ charset = AlipayConstants.CHARSET_GBK;
+ }
+ sb.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>");
+ if (isEncrypt) {// 加密
+ sb.append("<alipay>");
+ String encrypted = rsaEncrypt(bizContent, alipayPublicKey, charset);
+ sb.append("<response>" + encrypted + "</response>");
+ sb.append("<encryption_type>RSA</encryption_type>");
+ if (isSign) {
+ String sign = rsaSign(encrypted, cusPrivateKey, charset);
+ sb.append("<sign>" + sign + "</sign>");
+ sb.append("<sign_type>RSA</sign_type>");
+ }
+ sb.append("</alipay>");
+ } else if (isSign) {// 不加密,但需要签名
+ sb.append("<alipay>");
+ sb.append("<response>" + bizContent + "</response>");
+ String sign = rsaSign(bizContent, cusPrivateKey, charset);
+ sb.append("<sign>" + sign + "</sign>");
+ sb.append("<sign_type>RSA</sign_type>");
+ sb.append("</alipay>");
+ } else {// 不加密,不加签
+ sb.append(bizContent);
+ }
+ return sb.toString();
+ }
+
+ /**
+ * 加密并签名<br>
+ * <b>目前适用于公众号</b>
+ * @param bizContent 待加密、签名内容
+ * @param alipayPublicKey 支付宝公钥
+ * @param cusPrivateKey 商户私钥
+ * @param charset 字符集,如UTF-8, GBK, GB2312
+ * @param isEncrypt 是否加密,true-加密 false-不加密
+ * @param isSign 是否签名,true-签名 false-不签名
+ * @return 加密、签名后xml内容字符串
+ * <p>
+ * 返回示例:
+ * <alipay>
+ * <response>密文</response>
+ * <encryption_type>RSA</encryption_type>
+ * <sign>sign</sign>
+ * <sign_type>RSA</sign_type>
+ * </alipay>
+ * </p>
+ * @throws AlipayApiException
+ */
+ public static String encryptAndSign(String bizContent, String alipayPublicKey,
+ String cusPrivateKey, String charset, boolean isEncrypt,
+ boolean isSign,String signType) throws AlipayApiException {
+ StringBuilder sb = new StringBuilder();
+ if (StringUtils.isEmpty(charset)) {
+ charset = AlipayConstants.CHARSET_GBK;
+ }
+ sb.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>");
+ if (isEncrypt) {// 加密
+ sb.append("<alipay>");
+ String encrypted = rsaEncrypt(bizContent, alipayPublicKey, charset);
+ sb.append("<response>" + encrypted + "</response>");
+ sb.append("<encryption_type>RSA</encryption_type>");
+ if (isSign) {
+ String sign = rsaSign(encrypted, cusPrivateKey, charset, signType);
+ sb.append("<sign>" + sign + "</sign>");
+ sb.append("<sign_type>");
+ sb.append(signType);
+ sb.append("</sign_type>");
+ }
+ sb.append("</alipay>");
+ } else if (isSign) {// 不加密,但需要签名
+ sb.append("<alipay>");
+ sb.append("<response>" + bizContent + "</response>");
+ String sign = rsaSign(bizContent, cusPrivateKey, charset, signType);
+ sb.append("<sign>" + sign + "</sign>");
+ sb.append("<sign_type>");
+ sb.append(signType);
+ sb.append("</sign_type>");
+ sb.append("</alipay>");
+ } else {// 不加密,不加签
+ sb.append(bizContent);
+ }
+ return sb.toString();
+ }
+
+ /**
+ * 公钥加密
+ *
+ * @param content 待加密内容
+ * @param publicKey 公钥
+ * @param charset 字符集,如UTF-8, GBK, GB2312
+ * @return 密文内容
+ * @throws AlipayApiException
+ */
+ public static String rsaEncrypt(String content, String publicKey,
+ String charset) throws AlipayApiException {
+ try {
+ PublicKey pubKey = getPublicKeyFromX509(AlipayConstants.SIGN_TYPE_RSA,
+ new ByteArrayInputStream(publicKey.getBytes()));
+ Cipher cipher = Cipher.getInstance(AlipayConstants.SIGN_TYPE_RSA);
+ cipher.init(Cipher.ENCRYPT_MODE, pubKey);
+ byte[] data = StringUtils.isEmpty(charset) ? content.getBytes()
+ : content.getBytes(charset);
+ int inputLen = data.length;
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ int offSet = 0;
+ byte[] cache;
+ int i = 0;
+ // 对数据分段加密
+ while (inputLen - offSet > 0) {
+ if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
+ cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
+ } else {
+ cache = cipher.doFinal(data, offSet, inputLen - offSet);
+ }
+ out.write(cache, 0, cache.length);
+ i++;
+ offSet = i * MAX_ENCRYPT_BLOCK;
+ }
+ byte[] encryptedData = Base64.encodeBase64(out.toByteArray());
+ out.close();
+
+ return StringUtils.isEmpty(charset) ? new String(encryptedData)
+ : new String(encryptedData, charset);
+ } catch (Exception e) {
+ throw new AlipayApiException("EncryptContent = " + content + ",charset = " + charset,
+ e);
+ }
+ }
+
+ /**
+ * 私钥解密
+ *
+ * @param content 待解密内容
+ * @param privateKey 私钥
+ * @param charset 字符集,如UTF-8, GBK, GB2312
+ * @return 明文内容
+ * @throws AlipayApiException
+ */
+ public static String rsaDecrypt(String content, String privateKey,
+ String charset) throws AlipayApiException {
+ try {
+ PrivateKey priKey = getPrivateKeyFromPKCS8(AlipayConstants.SIGN_TYPE_RSA,
+ new ByteArrayInputStream(privateKey.getBytes()));
+ Cipher cipher = Cipher.getInstance(AlipayConstants.SIGN_TYPE_RSA);
+ cipher.init(Cipher.DECRYPT_MODE, priKey);
+ byte[] encryptedData = StringUtils.isEmpty(charset)
+ ? Base64.decodeBase64(content.getBytes())
+ : Base64.decodeBase64(content.getBytes(charset));
+ int inputLen = encryptedData.length;
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ int offSet = 0;
+ byte[] cache;
+ int i = 0;
+ // 对数据分段解密
+ while (inputLen - offSet > 0) {
+ if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
+ cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
+ } else {
+ cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
+ }
+ out.write(cache, 0, cache.length);
+ i++;
+ offSet = i * MAX_DECRYPT_BLOCK;
+ }
+ byte[] decryptedData = out.toByteArray();
+ out.close();
+
+ return StringUtils.isEmpty(charset) ? new String(decryptedData)
+ : new String(decryptedData, charset);
+ } catch (Exception e) {
+ throw new AlipayApiException("EncodeContent = " + content + ",charset = " + charset, e);
+ }
+ }
+
+}
diff --git a/src/main/java/org/springblade/common/utils/sms/PerfectSend.java b/src/main/java/org/springblade/common/utils/sms/PerfectSend.java
new file mode 100644
index 0000000..fc975c6
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/sms/PerfectSend.java
@@ -0,0 +1,91 @@
+package org.springblade.common.utils.sms;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 完美发送任务对象 perfect_send
+ *
+ * @author chen
+ * @date 2021-06-23
+ */
+public class PerfectSend
+{
+ private static final long serialVersionUID = 1L;
+
+ /** 通知时间间隔 */
+ private String timeInterval;
+
+ /** 通知次数 */
+ private int sendNum;
+
+ /** 通知内容 */
+ private String sendContent;
+
+ /** 发送用户 */
+ private String phones;
+
+ /** 优先级 */
+ private Integer priority;
+
+ /** 创建者 */
+ private String createBy;
+
+ public String getTimeInterval() {
+ return timeInterval;
+ }
+
+ public void setTimeInterval(String timeInterval) {
+ this.timeInterval = timeInterval;
+ }
+
+ public int getSendNum() {
+ return sendNum;
+ }
+
+ public void setSendNum(int sendNum) {
+ this.sendNum = sendNum;
+ }
+
+ public String getSendContent() {
+ return sendContent;
+ }
+
+ public void setSendContent(String sendContent) {
+ this.sendContent = sendContent;
+ }
+
+ public String getPhones() {
+ return phones;
+ }
+
+ public void setPhones(String phones) {
+ this.phones = phones;
+ }
+
+ public Integer getPriority() {
+ return priority;
+ }
+
+ public void setPriority(Integer priority) {
+ this.priority = priority;
+ }
+
+ public String getCreateBy() {
+ return createBy;
+ }
+
+ public void setCreateBy(String createBy) {
+ this.createBy = createBy;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+ .append("timeInterval", getTimeInterval())
+ .append("sendNum", getSendNum())
+ .append("sendContent", getSendContent())
+ .append("createBy", getCreateBy())
+ .toString();
+ }
+}
diff --git a/src/main/java/org/springblade/common/utils/sms/ReplyContent.java b/src/main/java/org/springblade/common/utils/sms/ReplyContent.java
new file mode 100644
index 0000000..51a4ffd
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/sms/ReplyContent.java
@@ -0,0 +1,63 @@
+package org.springblade.common.utils.sms;
+
+import java.util.Date;
+
+/**
+ * 回复内容对象 reply_content
+ *
+ * @author chen
+ * @date 2021-06-24
+ */
+public class ReplyContent {
+ /**
+ * 发送号码
+ */
+ private String sendPhones;
+
+ /**
+ * 上行记录时间-起始
+ */
+ private String createTimeStart;
+
+ /**
+ * 上行记录时间-结束
+ */
+ private String createTimeEnd;
+
+ /**
+ * 创建者
+ */
+ private String sopCreateBy;
+
+ public String getSendPhones() {
+ return sendPhones;
+ }
+
+ public void setSendPhones(String sendPhones) {
+ this.sendPhones = sendPhones;
+ }
+
+ public String getCreateTimeStart() {
+ return createTimeStart;
+ }
+
+ public void setCreateTimeStart(String createTimeStart) {
+ this.createTimeStart = createTimeStart;
+ }
+
+ public String getCreateTimeEnd() {
+ return createTimeEnd;
+ }
+
+ public void setCreateTimeEnd(String createTimeEnd) {
+ this.createTimeEnd = createTimeEnd;
+ }
+
+ public String getSopCreateBy() {
+ return sopCreateBy;
+ }
+
+ public void setSopCreateBy(String sopCreateBy) {
+ this.sopCreateBy = sopCreateBy;
+ }
+}
diff --git a/src/main/java/org/springblade/common/utils/sms/StatusReport.java b/src/main/java/org/springblade/common/utils/sms/StatusReport.java
new file mode 100644
index 0000000..88890da
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/sms/StatusReport.java
@@ -0,0 +1,91 @@
+package org.springblade.common.utils.sms;
+
+import java.util.Date;
+
+/**
+ * 状态报告对象 status_report
+ *
+ * @author chen
+ * @date 2021-06-24
+ */
+public class StatusReport
+{
+
+ /**
+ * 接收号码
+ */
+ private String phones;
+
+ /**
+ * 发送类型(0相同内容,1不同内容,2完美发送)
+ */
+ private int type;
+
+ /**
+ * 发送时间-起始
+ */
+ private String sendTimeStart;
+
+ /**
+ * 发送时间-结束
+ */
+ private String sendTimeEnd;
+
+ /**
+ * 发送类型
+ */
+ private int parentType;
+
+ /**
+ * 创建者
+ */
+ private String sopCreateBy;
+
+ public String getPhones() {
+ return phones;
+ }
+
+ public void setPhones(String phones) {
+ this.phones = phones;
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public void setType(int type) {
+ this.type = type;
+ }
+
+ public String getSendTimeStart() {
+ return sendTimeStart;
+ }
+
+ public void setSendTimeStart(String sendTimeStart) {
+ this.sendTimeStart = sendTimeStart;
+ }
+
+ public String getSendTimeEnd() {
+ return sendTimeEnd;
+ }
+
+ public void setSendTimeEnd(String sendTimeEnd) {
+ this.sendTimeEnd = sendTimeEnd;
+ }
+
+ public int getParentType() {
+ return parentType;
+ }
+
+ public void setParentType(int parentType) {
+ this.parentType = parentType;
+ }
+
+ public String getSopCreateBy() {
+ return sopCreateBy;
+ }
+
+ public void setSopCreateBy(String sopCreateBy) {
+ this.sopCreateBy = sopCreateBy;
+ }
+}
diff --git a/src/main/java/org/springblade/common/utils/sms/StreamUtil.java b/src/main/java/org/springblade/common/utils/sms/StreamUtil.java
new file mode 100644
index 0000000..2ac0521
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/sms/StreamUtil.java
@@ -0,0 +1,135 @@
+/**
+ * Alipay.com Inc.
+ * Copyright (c) 2004-2012 All Rights Reserved.
+ */
+package org.springblade.common.utils.sms;
+
+import java.io.*;
+
+/**
+ *
+ * @author runzhi
+ */
+public class StreamUtil {
+ private StreamUtil(){}
+
+ private static final int DEFAULT_BUFFER_SIZE = 8192;
+
+ public static void io(InputStream in, OutputStream out) throws IOException {
+ io(in, out, -1);
+ }
+
+ public static void io(InputStream in, OutputStream out, int bufferSize) throws IOException {
+ if (bufferSize == -1) {
+ bufferSize = DEFAULT_BUFFER_SIZE;
+ }
+
+ byte[] buffer = new byte[bufferSize];
+ int amount;
+
+ while ((amount = in.read(buffer)) >= 0) {
+ out.write(buffer, 0, amount);
+ }
+ }
+
+ public static void io(Reader in, Writer out) throws IOException {
+ io(in, out, -1);
+ }
+
+ public static void io(Reader in, Writer out, int bufferSize) throws IOException {
+ if (bufferSize == -1) {
+ bufferSize = DEFAULT_BUFFER_SIZE >> 1;
+ }
+
+ char[] buffer = new char[bufferSize];
+ int amount;
+
+ while ((amount = in.read(buffer)) >= 0) {
+ out.write(buffer, 0, amount);
+ }
+ }
+
+ public static OutputStream synchronizedOutputStream(OutputStream out) {
+ return new SynchronizedOutputStream(out);
+ }
+
+ public static OutputStream synchronizedOutputStream(OutputStream out, Object lock) {
+ return new SynchronizedOutputStream(out, lock);
+ }
+
+ public static String readText(InputStream in) throws IOException {
+ return readText(in, null, -1);
+ }
+
+ public static String readText(InputStream in, String encoding) throws IOException {
+ return readText(in, encoding, -1);
+ }
+
+ public static String readText(InputStream in, String encoding, int bufferSize)
+ throws IOException {
+ Reader reader = (encoding == null) ? new InputStreamReader(in) : new InputStreamReader(in,
+ encoding);
+
+ return readText(reader, bufferSize);
+ }
+
+ public static String readText(Reader reader) throws IOException {
+ return readText(reader, -1);
+ }
+
+ public static String readText(Reader reader, int bufferSize) throws IOException {
+ StringWriter writer = new StringWriter();
+
+ io(reader, writer, bufferSize);
+ return writer.toString();
+ }
+
+ private static class SynchronizedOutputStream extends OutputStream {
+ private OutputStream out;
+ private Object lock;
+
+ SynchronizedOutputStream(OutputStream out) {
+ this(out, out);
+ }
+
+ SynchronizedOutputStream(OutputStream out, Object lock) {
+ this.out = out;
+ this.lock = lock;
+ }
+
+ @Override
+ public void write(int datum) throws IOException {
+ synchronized (lock) {
+ out.write(datum);
+ }
+ }
+
+ @Override
+ public void write(byte[] data) throws IOException {
+ synchronized (lock) {
+ out.write(data);
+ }
+ }
+
+ @Override
+ public void write(byte[] data, int offset, int length) throws IOException {
+ synchronized (lock) {
+ out.write(data, offset, length);
+ }
+ }
+
+ @Override
+ public void flush() throws IOException {
+ synchronized (lock) {
+ out.flush();
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ synchronized (lock) {
+ out.close();
+ }
+ }
+ }
+}
diff --git a/src/main/java/org/springblade/common/utils/sms/StringUtils.java b/src/main/java/org/springblade/common/utils/sms/StringUtils.java
new file mode 100644
index 0000000..b36ff9a
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/sms/StringUtils.java
@@ -0,0 +1,171 @@
+package org.springblade.common.utils.sms;
+
+/**
+ * 字符串工具类。
+ *
+ * @author carver.gu
+ * @since 1.0, Sep 12, 2009
+ */
+public abstract class StringUtils {
+
+ private StringUtils() {}
+
+ /**
+ * 检查指定的字符串是否为空。
+ * <ul>
+ * <li>SysUtils.isEmpty(null) = true</li>
+ * <li>SysUtils.isEmpty("") = true</li>
+ * <li>SysUtils.isEmpty(" ") = true</li>
+ * <li>SysUtils.isEmpty("abc") = false</li>
+ * </ul>
+ *
+ * @param value 待检查的字符串
+ * @return true/false
+ */
+ public static boolean isEmpty(String value) {
+ int strLen;
+ if (value == null || (strLen = value.length()) == 0) {
+ return true;
+ }
+ for (int i = 0; i < strLen; i++) {
+ if ((Character.isWhitespace(value.charAt(i)) == false)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * 检查对象是否为数字型字符串,包含负数开头的。
+ */
+ public static boolean isNumeric(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ char[] chars = obj.toString().toCharArray();
+ int length = chars.length;
+ if(length < 1) {
+ return false;
+ }
+
+ int i = 0;
+ if(length > 1 && chars[0] == '-') {
+ i = 1;
+ }
+
+ for (; i < length; i++) {
+ if (!Character.isDigit(chars[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * 检查指定的字符串列表是否不为空。
+ */
+ public static boolean areNotEmpty(String... values) {
+ boolean result = true;
+ if (values == null || values.length == 0) {
+ result = false;
+ } else {
+ for (String value : values) {
+ result &= !isEmpty(value);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * 把通用字符编码的字符串转化为汉字编码。
+ */
+ public static String unicodeToChinese(String unicode) {
+ StringBuilder out = new StringBuilder();
+ if (!isEmpty(unicode)) {
+ for (int i = 0; i < unicode.length(); i++) {
+ out.append(unicode.charAt(i));
+ }
+ }
+ return out.toString();
+ }
+
+ /**
+ * 过滤不可见字符
+ */
+ public static String stripNonValidXMLCharacters(String input) {
+ if (input == null || ("".equals(input))) {
+ return "";
+ }
+ StringBuilder out = new StringBuilder();
+ char current;
+ for (int i = 0; i < input.length(); i++) {
+ current = input.charAt(i);
+ if ((current == 0x9) || (current == 0xA) || (current == 0xD)
+ || ((current >= 0x20) && (current <= 0xD7FF))
+ || ((current >= 0xE000) && (current <= 0xFFFD))
+ || ((current >= 0x10000) && (current <= 0x10FFFF))) {
+ out.append(current);
+ }
+ }
+ return out.toString();
+ }
+
+ public static String leftPad(String str, int size, char padChar) {
+ if (str == null) {
+ return null;
+ } else {
+ int pads = size - str.length();
+ if (pads <= 0) {
+ return str;
+ } else {
+ return pads > 8192 ? leftPad(str, size, String.valueOf(padChar)) : padding(pads, padChar).concat(str);
+ }
+ }
+ }
+
+ public static String leftPad(String str, int size, String padStr) {
+ if (str == null) {
+ return null;
+ } else {
+ if (isEmpty(padStr)) {
+ padStr = " ";
+ }
+
+ int padLen = padStr.length();
+ int strLen = str.length();
+ int pads = size - strLen;
+ if (pads <= 0) {
+ return str;
+ } else if (padLen == 1 && pads <= 8192) {
+ return leftPad(str, size, padStr.charAt(0));
+ } else if (pads == padLen) {
+ return padStr.concat(str);
+ } else if (pads < padLen) {
+ return padStr.substring(0, pads).concat(str);
+ } else {
+ char[] padding = new char[pads];
+ char[] padChars = padStr.toCharArray();
+
+ for(int i = 0; i < pads; ++i) {
+ padding[i] = padChars[i % padLen];
+ }
+
+ return (new String(padding)).concat(str);
+ }
+ }
+ }
+
+ private static String padding(int repeat, char padChar) throws IndexOutOfBoundsException {
+ if (repeat < 0) {
+ throw new IndexOutOfBoundsException("Cannot pad a negative amount: " + repeat);
+ } else {
+ char[] buf = new char[repeat];
+
+ for(int i = 0; i < buf.length; ++i) {
+ buf[i] = padChar;
+ }
+
+ return new String(buf);
+ }
+ }
+}
diff --git a/src/main/java/org/springblade/modules/discuss/controller/TopicsController.java b/src/main/java/org/springblade/modules/discuss/controller/TopicsController.java
index aa48157..c84bf62 100644
--- a/src/main/java/org/springblade/modules/discuss/controller/TopicsController.java
+++ b/src/main/java/org/springblade/modules/discuss/controller/TopicsController.java
@@ -131,6 +131,7 @@
List<TopicsDTO> children = topics.getChildren();
for (TopicsDTO child : children) {
child.setParentId(topics.getId());
+ child.setDiscussContent(topics.getDiscussContent());
child.setLevel(2);
boolean b2 = topicsService.saveOrUpdate(child);
}
diff --git a/src/main/java/org/springblade/modules/discuss/controller/UserTopicsController.java b/src/main/java/org/springblade/modules/discuss/controller/UserTopicsController.java
index 5f806a0..09bae54 100644
--- a/src/main/java/org/springblade/modules/discuss/controller/UserTopicsController.java
+++ b/src/main/java/org/springblade/modules/discuss/controller/UserTopicsController.java
@@ -19,10 +19,13 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.xxl.job.core.biz.impl.ExecutorBizImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springblade.common.constant.CommonConstant;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.excel.util.ExcelUtil;
@@ -45,6 +48,8 @@
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
+import java.io.OutputStream;
+import java.net.URLEncoder;
import java.util.List;
/**
@@ -58,6 +63,8 @@
@RequestMapping("blade-userTopics/userTopics")
@Api(value = "用户议题报表", tags = "用户议题报表接口")
public class UserTopicsController extends BladeController {
+ private static Logger logger = LoggerFactory.getLogger(UserTopicsController.class);
+
private final IUserTopicsService userTopicsService;
@@ -143,7 +150,7 @@
@PostMapping("/updateBath")
@ApiOperationSupport(order = 5)
@ApiOperation(value = "批量更新", notes = "传入topics")
- public R updateBath(@Valid @RequestBody List<TopicsVO> topics) throws Exception {
+ public R updateBath(@Valid @RequestBody TopicsVO topics) throws Exception {
String result = userTopicsService.batchSave(topics);
if (result.equals("200")) {
return R.data("操作成功");
@@ -162,5 +169,18 @@
ExcelUtil.export(response, "投票人员" + DateUtil.time(), "投票人员数据表", list, UserTopicsExcel.class);
}
+ @GetMapping("/exportDataIndex")
+ public void exportExcel(HttpServletResponse response,UserTopicsVO userTopics) {
+ try (OutputStream out = response.getOutputStream()) {
+ response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+ response.setCharacterEncoding("utf-8");
+ String fileName = URLEncoder.encode("投票人员", "UTF-8").replaceAll("\\+", "%20");
+ response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
+ userTopicsService.handleExcel(out,userTopics);
+ out.flush();
+ } catch (Exception e) {
+ logger.error(e.getMessage(),e);
+ }}
+
}
diff --git a/src/main/java/org/springblade/modules/discuss/excel/UserTopicsExcel.java b/src/main/java/org/springblade/modules/discuss/excel/UserTopicsExcel.java
index 7084aca..36ffb07 100644
--- a/src/main/java/org/springblade/modules/discuss/excel/UserTopicsExcel.java
+++ b/src/main/java/org/springblade/modules/discuss/excel/UserTopicsExcel.java
@@ -40,9 +40,18 @@
@ExcelProperty( "小区")
private String aoiName;
+ @ExcelProperty( "面积")
+ private String area;
+
+ @ExcelProperty( "地块")
+ private String remark;
+
@ExcelProperty( "投票项")
private String optionContent;
+ @ExcelProperty( "houseCode")
+ private String houseCode;
+
@ExcelProperty(value = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
diff --git a/src/main/java/org/springblade/modules/discuss/excel/householdExcel.java b/src/main/java/org/springblade/modules/discuss/excel/householdExcel.java
new file mode 100644
index 0000000..827ae4c
--- /dev/null
+++ b/src/main/java/org/springblade/modules/discuss/excel/householdExcel.java
@@ -0,0 +1,71 @@
+package org.springblade.modules.discuss.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * HouseExcel
+ *
+ * @author Chill
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class householdExcel implements Serializable {
+
+ private static final long serialVersionUID = 2L;
+
+ @ExcelProperty( "业主姓名")
+ private String name;
+
+ @ExcelProperty( "业主电话")
+ private String phone;
+
+ @ExcelProperty( "地块")
+ private String remark;
+
+ @ExcelProperty( "栋号")
+ private String building;
+
+ @ExcelProperty( "房号")
+ private String room;
+
+
+ @ExcelProperty( "地址")
+ private String addressName;
+
+// @ExcelProperty( "小区")
+// private String aoiName;
+
+ @ExcelProperty( "面积")
+ private BigDecimal area;
+
+ @ExcelProperty( "是否投票")
+ private String voteFlag;
+
+ @ExcelProperty( "管理规约")
+ private String managementRegulations;
+
+ @ExcelProperty( "议事规则")
+ private String rulesOfProcedure;
+
+// @ExcelProperty( "投票项")
+// private String optionContent;
+
+
+// @ExcelProperty(value = "创建时间")
+// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+// private Date createTime;
+
+
+}
+
diff --git a/src/main/java/org/springblade/modules/discuss/excel/topicsExcel.java b/src/main/java/org/springblade/modules/discuss/excel/topicsExcel.java
new file mode 100644
index 0000000..c6ad98e
--- /dev/null
+++ b/src/main/java/org/springblade/modules/discuss/excel/topicsExcel.java
@@ -0,0 +1,54 @@
+package org.springblade.modules.discuss.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * HouseExcel
+ *
+ * @author Chill
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class topicsExcel implements Serializable {
+
+ private static final long serialVersionUID = 2L;
+
+ @ExcelProperty( "姓名")
+ private String name;
+
+ @ExcelProperty( "手机号")
+ private String phone;
+
+ @ExcelProperty( "地址")
+ private String addressName;
+
+ @ExcelProperty( "小区")
+ private String aoiName;
+
+ @ExcelProperty( "面积")
+ private String area;
+
+ @ExcelProperty( "地块")
+ private String remark;
+
+ @ExcelProperty( "投票项")
+ private String optionContent;
+
+
+ @ExcelProperty(value = "创建时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date createTime;
+
+
+}
+
diff --git a/src/main/java/org/springblade/modules/discuss/mapper/UserTopicsMapper.java b/src/main/java/org/springblade/modules/discuss/mapper/UserTopicsMapper.java
index a6f576f..28df0a6 100644
--- a/src/main/java/org/springblade/modules/discuss/mapper/UserTopicsMapper.java
+++ b/src/main/java/org/springblade/modules/discuss/mapper/UserTopicsMapper.java
@@ -20,9 +20,12 @@
import org.springblade.modules.discuss.dto.UserTopicsDTO;
import org.springblade.modules.discuss.entity.UserTopicsEntity;
import org.springblade.modules.discuss.excel.UserTopicsExcel;
+import org.springblade.modules.discuss.excel.householdExcel;
import org.springblade.modules.discuss.vo.UserTopicsVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.house.vo.HouseholdVO;
+
import java.util.List;
/**
@@ -52,4 +55,9 @@
public List<UserTopicsDTO> selectUserTopicsList(UserTopicsDTO userTopicsDTO);
List<UserTopicsExcel> exportUser( @Param("userTopics") UserTopicsVO userTopics);
+ List<UserTopicsExcel> getresultTwo( @Param("userTopics") UserTopicsVO userTopics);
+
+ UserTopicsVO getresult(UserTopicsVO userTopics);
+
+ List<householdExcel> getHouseholdList(UserTopicsVO userTopics);
}
diff --git a/src/main/java/org/springblade/modules/discuss/mapper/UserTopicsMapper.xml b/src/main/java/org/springblade/modules/discuss/mapper/UserTopicsMapper.xml
index a14cf9a..745cf47 100644
--- a/src/main/java/org/springblade/modules/discuss/mapper/UserTopicsMapper.xml
+++ b/src/main/java/org/springblade/modules/discuss/mapper/UserTopicsMapper.xml
@@ -109,6 +109,9 @@
jh.name,
jh.phone_number phone,
jda.address_name,
+ jhs.area,
+ jhs.remark,
+ jda.houseCode,
jda.aoi_name
<if test="articleId != null ">,
group_concat(jt.option_content) optionContent </if>
@@ -118,6 +121,7 @@
LEFT JOIN jczz_doorplate_address jda ON jda.address_code = jh.house_code
LEFT JOIN jczz_topics jt on jt.id = jut.topics_id
LEFT JOIN blade_user bu ON jh.associated_user_id = bu.id AND bu.is_deleted = 0
+ LEFT JOIN jczz_house jhs on jhs.house_code= jda.address_code
<where>
<if test="id != null ">and jut.id = #{id}</if>
<if test="name != null and name != ''">
@@ -147,6 +151,9 @@
jh.name,
jh.phone_number,
jda.address_name,
+ jhs.area,
+ jhs.remark,
+ jda.houseCode,
jda.aoi_name
</if>
</where>
@@ -154,4 +161,99 @@
</select>
+ <select id="getresult" resultMap="userTopicsResultMap">
+
+ SELECT
+ jts.option_content
+ FROM
+ jczz_user_topics jut
+ LEFT JOIN jczz_topics jts ON jts.id = jut.topics_id
+ WHERE
+ jut.article_id = #{articleId}
+ and jut.household_id=#{householdId}
+ and jts.discuss_content=#{discussContent}
+
+ </select>
+
+ <select id="getresultTwo" resultType="org.springblade.modules.discuss.excel.UserTopicsExcel">
+ SELECT
+ jut.article_id,
+ jut.delete_flag,
+ jut.signature_path,
+ jut.create_time,
+ jut.household_id,
+ bu.avatar,
+ jh.name,
+ jh.phone_number phone,
+ jda.address_name,
+ jhs.area,
+ jhs.remark,
+ jda.address_code houseCode,
+ jda.aoi_name,
+ jt.option_content
+ FROM
+ jczz_user_topics as jut
+ LEFT JOIN jczz_household jh ON jh.id = jut.household_id and jh.is_deleted = 0
+ LEFT JOIN jczz_doorplate_address jda ON jda.address_code = jh.house_code
+ LEFT JOIN jczz_topics jt on jt.id = jut.topics_id
+ LEFT JOIN blade_user bu ON jh.associated_user_id = bu.id AND bu.is_deleted = 0
+ LEFT JOIN jczz_house jhs on jhs.house_code= jda.address_code
+ <where>
+ <if test="id != null ">and jut.id = #{id}</if>
+ <if test="name != null and name != ''">
+ and bu.name like concat('%',#{name},'%')
+ </if>
+ <if test="phone != null and phone != ''">
+ and bu.phone like concat('%',#{phone},'%')
+ </if>
+
+ <if test="aoiCodeList != null and aoiCodeList.size() > 0">
+ and jda.aoi_code in
+ <foreach collection="aoiCodeList" item="code" open="(" close=")" separator=",">
+ #{code}
+ </foreach>
+ </if>
+
+ <if test="householdId != null ">and jut.household_id = #{householdId}</if>
+ <if test="topicsId != null ">and jut.topics_id = #{topicsId}</if>
+ <if test="createTime != null ">and jut.create_time = #{createTime}</if>
+ <if test="updateTime != null ">and jut.update_time = #{updateTime}</if>
+ <if test="deleteFlag != null ">and jut.delete_flag = #{deleteFlag}</if>
+ <if test="articleId != null ">
+ and jut.article_id = #{articleId}
+ and jut.delete_flag = 0
+ </if>
+ </where>
+
+ </select>
+ <select id="getHouseholdList" resultType="org.springblade.modules.discuss.excel.householdExcel">
+ SELECT
+ DISTINCT(jh.id),
+ jh.*,
+ (
+ SELECT
+ group_concat( jt.option_content ) AS optionContent
+ FROM
+ jczz_user_topics jut
+ LEFT JOIN jczz_topics jt ON jt.id = jut.topics_id
+ WHERE
+ jut.house_code = jh.house_code
+ AND jut.article_id = #{articleId}
+ ) selectd
+ FROM
+ jczz_house jh
+ LEFT JOIN jczz_household jhd ON jhd.house_code = jh.house_code
+ AND jh.is_deleted = 0
+ LEFT JOIN jczz_user_topics jut on jut.household_id = jhd.id
+ <where>
+ <if test="districtIdList != null and districtIdList.size() > 0">
+ and jh.district_code in
+ <foreach collection="districtIdList" item="code" open="(" close=")" separator=",">
+ #{code}
+ </foreach>
+ </if>
+ </where>
+ </select>
+
+
</mapper>
diff --git a/src/main/java/org/springblade/modules/discuss/service/IUserTopicsService.java b/src/main/java/org/springblade/modules/discuss/service/IUserTopicsService.java
index 0736c73..f34c44b 100644
--- a/src/main/java/org/springblade/modules/discuss/service/IUserTopicsService.java
+++ b/src/main/java/org/springblade/modules/discuss/service/IUserTopicsService.java
@@ -23,6 +23,7 @@
import org.springblade.modules.discuss.vo.TopicsVO;
import org.springblade.modules.discuss.vo.UserTopicsVO;
+import java.io.OutputStream;
import java.util.List;
/**
@@ -43,11 +44,13 @@
IPage<UserTopicsVO> selectUserTopicsPage(IPage<UserTopicsVO> page, UserTopicsVO userTopics);
- String batchSave(List<TopicsVO> topics) throws Exception;
+ String batchSave(TopicsVO topics) throws Exception;
Integer getCount(Integer id);
List<UserTopicsExcel> exportUser(UserTopicsVO userTopics);
Boolean saveUserTopicsEntity(UserTopicsEntity userTopics);
+
+ void handleExcel(OutputStream out,UserTopicsVO userTopics);
}
diff --git a/src/main/java/org/springblade/modules/discuss/service/impl/PublicDiscussServiceImpl.java b/src/main/java/org/springblade/modules/discuss/service/impl/PublicDiscussServiceImpl.java
index dc699bd..aa99403 100644
--- a/src/main/java/org/springblade/modules/discuss/service/impl/PublicDiscussServiceImpl.java
+++ b/src/main/java/org/springblade/modules/discuss/service/impl/PublicDiscussServiceImpl.java
@@ -109,6 +109,7 @@
publicDiscussVO.setDisabled(true);
}
}
+ // 判断是否业主,只有业主可以投票
}
return publicDiscussVO;
}
diff --git a/src/main/java/org/springblade/modules/discuss/service/impl/UserTopicsServiceImpl.java b/src/main/java/org/springblade/modules/discuss/service/impl/UserTopicsServiceImpl.java
index bd61884..a432098 100644
--- a/src/main/java/org/springblade/modules/discuss/service/impl/UserTopicsServiceImpl.java
+++ b/src/main/java/org/springblade/modules/discuss/service/impl/UserTopicsServiceImpl.java
@@ -16,23 +16,30 @@
*/
package org.springblade.modules.discuss.service.impl;
+import com.alibaba.excel.EasyExcelFactory;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.style.WriteCellStyle;
+import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import liquibase.pro.packaged.H;
import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.jetbrains.annotations.Nullable;
import org.springblade.common.constant.CommonConstant;
import org.springblade.common.utils.SpringUtils;
+import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.SpringUtil;
import org.springblade.modules.discuss.entity.PublicDiscussEntity;
import org.springblade.modules.discuss.entity.TopicsEntity;
import org.springblade.modules.discuss.entity.UserTopicsEntity;
import org.springblade.modules.discuss.excel.UserTopicsExcel;
+import org.springblade.modules.discuss.excel.householdExcel;
import org.springblade.modules.discuss.mapper.UserTopicsMapper;
import org.springblade.modules.discuss.service.IPublicDiscussService;
import org.springblade.modules.discuss.service.ITopicsService;
@@ -41,12 +48,18 @@
import org.springblade.modules.discuss.vo.UserTopicsVO;
import org.springblade.modules.district.entity.DistrictEntity;
import org.springblade.modules.district.service.IDistrictService;
+import org.springblade.modules.house.entity.HouseEntity;
import org.springblade.modules.house.entity.HouseholdEntity;
+import org.springblade.modules.house.excel.HouseHoldExcel;
+import org.springblade.modules.house.service.IHouseService;
import org.springblade.modules.house.service.IHouseholdService;
+import org.springblade.modules.house.vo.HouseholdVO;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
+import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@@ -61,6 +74,10 @@
public class UserTopicsServiceImpl extends ServiceImpl<UserTopicsMapper, UserTopicsEntity> implements IUserTopicsService {
@Resource
private ITopicsService topicsService;
+ public static final String SMS_VALIDATE_PHONE = "sms:validate:code:";
+
+ @Autowired
+ private BladeRedis redisTemplate;
@Override
public IPage<UserTopicsVO> selectUserTopicsPage(IPage<UserTopicsVO> page, UserTopicsVO userTopics) {
@@ -91,21 +108,33 @@
@Override
@Transactional(rollbackFor = Exception.class)
- public String batchSave(List<TopicsVO> topics) throws Exception {
+ public String batchSave(TopicsVO topics) throws Exception {
+ if (StringUtils.isNotBlank(topics.getPhone())) {
+ Object validateCode = redisTemplate.get(SMS_VALIDATE_PHONE + topics.getPhone());
+ if (validateCode == null) {
+ return "验证码已过期";
+ }
+ if (!validateCode.toString().equals(topics.getCode())) {
+ return "验证码错误";
+ }
+ //删除验证码
+ redisTemplate.del(SMS_VALIDATE_PHONE + topics.getPhone());
+ }
// 判断是否一户一票 还是一人一票
+ List<TopicsVO> topicsList = topics.getChildren();
IHouseholdService householdService = SpringUtils.getBean(IHouseholdService.class);
HouseholdEntity householdEntity = householdService.getOne(Wrappers.<HouseholdEntity>lambdaQuery()
- .eq(HouseholdEntity::getHouseCode, topics.get(0).getHouseCode())
+ .eq(HouseholdEntity::getHouseCode, topicsList.get(0).getHouseCode())
.eq(HouseholdEntity::getAssociatedUserId, AuthUtil.getUserId())
.eq(HouseholdEntity::getIsDeleted, 0)
.last("limit 1"));
IPublicDiscussService bean = SpringUtil.getBean(IPublicDiscussService.class);
- PublicDiscussEntity one = bean.getOne(Wrappers.<PublicDiscussEntity>lambdaQuery().eq(PublicDiscussEntity::getArticleId, topics.get(0).getArticleId()));
+ PublicDiscussEntity one = bean.getOne(Wrappers.<PublicDiscussEntity>lambdaQuery().eq(PublicDiscussEntity::getArticleId, topicsList.get(0).getArticleId()));
// 一户一票
if (one.getVoteRestrictions().equals(CommonConstant.NUMBER_ONE)) {
long count = count(Wrappers.<UserTopicsEntity>lambdaQuery()
- .eq(UserTopicsEntity::getHouseCode, topics.get(0).getHouseCode())
- .eq(UserTopicsEntity::getArticleId, topics.get(0).getArticleId()));
+ .eq(UserTopicsEntity::getHouseCode, topicsList.get(0).getHouseCode())
+ .eq(UserTopicsEntity::getArticleId, topicsList.get(0).getArticleId()));
if (count > 0) {
return "您的房屋已投票,不能重复投票!";
}
@@ -113,12 +142,12 @@
//
long count = count(Wrappers.<UserTopicsEntity>lambdaQuery()
.eq(UserTopicsEntity::getHouseholdId, householdEntity.getId())
- .eq(UserTopicsEntity::getArticleId, topics.get(0).getArticleId()));
+ .eq(UserTopicsEntity::getArticleId, topicsList.get(0).getArticleId()));
if (count > 0) {
return "您已投票,不能重复投票!";
}
}
- for (TopicsVO topic : topics) {
+ for (TopicsVO topic : topicsList) {
if (topic.getMandatoryFlag().equals(2)) {
if (topic.getOptionNumberMin() > 1) {
JSONArray objects1 = JSON.parseArray(topic.getSelected());
@@ -134,13 +163,13 @@
}
}
}
- Boolean userTopics = getaBoolean(topics,householdEntity);
+ Boolean userTopics = getaBoolean(topicsList, householdEntity);
if (userTopics) return "200";
return "操作失败!";
}
@Nullable
- private Boolean getaBoolean(List<TopicsVO> topics,HouseholdEntity householdEntity) {
+ private Boolean getaBoolean(List<TopicsVO> topics, HouseholdEntity householdEntity) {
List<UserTopicsEntity> objects = new ArrayList<>();
Boolean result = false;
for (TopicsVO topic : topics) {
@@ -235,4 +264,98 @@
}
return save(userTopics);
}
+
+ @Override
+ public void handleExcel(OutputStream out, UserTopicsVO userTopics) {
+ ExcelWriter excelWriter = EasyExcelFactory.write(out).build();
+ //设置内容样式
+ WriteCellStyle contentStyle = new WriteCellStyle();
+ contentStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);//居中
+ contentStyle.setWrapped(true);//自动换行
+ //设置头部样式
+ WriteCellStyle headerStyle = new WriteCellStyle();
+ headerStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
+ //设置策略
+ HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headerStyle, contentStyle);
+ WriteSheet proposalSheet = EasyExcelFactory.writerSheet(0, "委员提案").head(HouseHoldExcel.class).registerWriteHandler(horizontalCellStyleStrategy).build();
+ WriteSheet publicopinionSheet = EasyExcelFactory.writerSheet(1, "社情民意").head(HouseHoldExcel.class).registerWriteHandler(horizontalCellStyleStrategy).build();
+ excelWriter.write(getProposal(userTopics), proposalSheet);
+ excelWriter.write(getPublicopinion(userTopics), publicopinionSheet);
+
+
+ }
+
+ //首页-房屋记录
+ private List<householdExcel> getProposal(UserTopicsVO userTopics) {
+ List<householdExcel> list = new ArrayList<>();
+ JSONArray objects1 = JSON.parseArray(userTopics.getDistrictId());
+ List<String> collect1 = objects1.stream().map(item -> (String)item).collect(Collectors.toList());
+ IDistrictService bean3 = SpringUtils.getBean(IDistrictService.class);
+ List<DistrictEntity> list3 = bean3.list(Wrappers.<DistrictEntity>lambdaQuery().in(DistrictEntity::getId, collect1));
+ List<String> aoiCodeList = list3.stream().map(item -> item.getAoiCode() ).collect(Collectors.toList());
+ userTopics.setAoiCodeList(aoiCodeList);
+ List<householdExcel> householdList = baseMapper.getHouseholdList(userTopics);
+//
+// householdExcel vo = new householdExcel();
+// list.add(vo);
+// IHouseService bean = SpringUtils.getBean(IHouseService.class);
+// JSONArray objects = JSON.parseArray(userTopics.getDistrictId());
+//
+// List<HouseEntity> list1 = bean.list(Wrappers.<HouseEntity>lambdaQuery().in(HouseEntity::getDistrictCode, aoiCodeList));
+//
+// IHouseholdService bean1 = SpringUtils.getBean(IHouseholdService.class);
+//
+// IUserTopicsService bean2 = SpringUtils.getBean(IUserTopicsService.class);
+//
+// for (HouseEntity houseEntity : list1) {
+// householdExcel householdExcel = new householdExcel();
+// householdExcel.setArea(houseEntity.getArea());
+// householdExcel.setBuilding(houseEntity.getBuilding());
+// householdExcel.setRoom(houseEntity.getRoom());
+// householdExcel.setRemark(houseEntity.getRemark());
+// // 查询住户
+// List<HouseholdEntity> list2 = bean1.list(Wrappers.<HouseholdEntity>lambdaQuery()
+// .eq(HouseholdEntity::getHouseCode, houseEntity.getHouseCode())
+// .eq(HouseholdEntity::getIsDeleted, 0)
+// .ne(HouseholdEntity::getRelationship, 18));
+// // 判断住户是否有投票
+// for (HouseholdEntity householdEntity : list2) {
+// householdExcel.setName(householdEntity.getName());
+// householdExcel.setPhone(householdEntity.getPhoneNumber());
+// long count = bean2.count(Wrappers.<UserTopicsEntity>lambdaQuery()
+// .eq(UserTopicsEntity::getHouseholdId, householdEntity.getId()));
+// if (count > 0) {
+// // 查询选择的结果
+// userTopics.setDiscussContent("管理规约");
+// userTopics.setHouseholdId(householdEntity.getId());
+// UserTopicsVO getresult = baseMapper.getresult(userTopics);
+// if (getresult != null) {
+// householdExcel.setManagementRegulations(getresult.getOptionContent());
+// }
+// userTopics.setDiscussContent("议事规则");
+// UserTopicsVO getresult2 = baseMapper.getresult(userTopics);
+// if (getresult2 != null) {
+// householdExcel.setRulesOfProcedure(getresult2.getOptionContent());
+// }
+// householdExcel.setVoteFlag("是");
+// break;
+// } else {
+// householdExcel.setVoteFlag("否");
+// }
+// }
+ // 添加
+ list.addAll(householdList);
+// }
+ return list;
+ }
+
+ //首页-议事
+ private List<UserTopicsExcel> getPublicopinion(UserTopicsVO userTopics) {
+ List<UserTopicsExcel> list = new ArrayList<>();
+ List<UserTopicsExcel> userTopicsExcels = baseMapper.getresultTwo(userTopics);
+ UserTopicsExcel vo = new UserTopicsExcel();
+ list.add(vo);
+ list.addAll(userTopicsExcels);
+ return list;
+ }
}
diff --git a/src/main/java/org/springblade/modules/discuss/vo/TopicsVO.java b/src/main/java/org/springblade/modules/discuss/vo/TopicsVO.java
index c6d9ce3..bcf772b 100644
--- a/src/main/java/org/springblade/modules/discuss/vo/TopicsVO.java
+++ b/src/main/java/org/springblade/modules/discuss/vo/TopicsVO.java
@@ -39,5 +39,7 @@
private String houseCode;
private String signaturePath;
+ private String phone;
+ private String code;
}
diff --git a/src/main/java/org/springblade/modules/discuss/vo/UserTopicsVO.java b/src/main/java/org/springblade/modules/discuss/vo/UserTopicsVO.java
index 8cdc501..a8bdc14 100644
--- a/src/main/java/org/springblade/modules/discuss/vo/UserTopicsVO.java
+++ b/src/main/java/org/springblade/modules/discuss/vo/UserTopicsVO.java
@@ -17,6 +17,8 @@
package org.springblade.modules.discuss.vo;
import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
import org.springblade.modules.discuss.entity.UserTopicsEntity;
import org.springblade.core.tool.node.INode;
import lombok.Data;
@@ -49,5 +51,10 @@
private String districtId;
+
private String optionContent;
+
+ /** 议题内容 */
+ @ApiModelProperty(value = "议题内容", example = "")
+ private String discussContent;
}
diff --git a/src/main/java/org/springblade/modules/property/mapper/PropertyCompanyDistrictMapper.xml b/src/main/java/org/springblade/modules/property/mapper/PropertyCompanyDistrictMapper.xml
index 04d732d..0ee126f 100644
--- a/src/main/java/org/springblade/modules/property/mapper/PropertyCompanyDistrictMapper.xml
+++ b/src/main/java/org/springblade/modules/property/mapper/PropertyCompanyDistrictMapper.xml
@@ -90,7 +90,7 @@
SELECT bu.*,
jpc.name distictName
FROM blade_user bu
- LEFT JOIN jczz_property_district_user jpdu ON bu.id = jpdu.user_id
+ LEFT JOIN jczz_property_district_user jpdu ON bu.id = jpdu.user_id and bu.is_deleted = 0
LEFT JOIN jczz_property_company_district jpcd ON jpdu.property_company_district_id = jpcd.id
LEFT JOIN jczz_property_company jpc on jpc.id = jpcd.property_company_id
LEFT JOIN jczz_district jd ON jd.id = jpcd.district_id
diff --git a/src/main/java/org/springblade/modules/sms/controller/SmsSendController.java b/src/main/java/org/springblade/modules/sms/controller/SmsSendController.java
new file mode 100644
index 0000000..e4cdebb
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/controller/SmsSendController.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
+import org.springblade.modules.sms.service.ISmsSendService;
+import org.springblade.modules.sms.service.ISmsTemplateService;
+import org.springblade.modules.sms.vo.SmsTemplateVO;
+import org.springblade.modules.sms.wrapper.SmsTemplateWrapper;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * 短信模版表 控制器
+ *
+ * @author BladeX
+ * @since 2024-03-06
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-smsSend/smsSend")
+@Api(value = "发送短信验证码", tags = "发送短信验证码")
+public class SmsSendController extends BladeController {
+
+ private final ISmsSendService iSmsSendService;
+
+ /**
+ * 短信模版表 详情
+ */
+ @GetMapping("/send")
+ @ApiOperationSupport(order = 1)
+ @ApiOperation(value = "发送短信验证码")
+ public R<SmsTemplateVO> detail(@RequestParam String phone) {
+ Boolean aBoolean = iSmsSendService.smsSend(phone);
+ return R.status(aBoolean);
+ }
+
+
+}
diff --git a/src/main/java/org/springblade/modules/smsTemplate/controller/SmsTemplateController.java b/src/main/java/org/springblade/modules/sms/controller/SmsTemplateController.java
similarity index 91%
rename from src/main/java/org/springblade/modules/smsTemplate/controller/SmsTemplateController.java
rename to src/main/java/org/springblade/modules/sms/controller/SmsTemplateController.java
index 52e7006..c1a31bf 100644
--- a/src/main/java/org/springblade/modules/smsTemplate/controller/SmsTemplateController.java
+++ b/src/main/java/org/springblade/modules/sms/controller/SmsTemplateController.java
@@ -14,7 +14,7 @@
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
-package org.springblade.modules.smsTemplate.controller;
+package org.springblade.modules.sms.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -23,17 +23,16 @@
import lombok.AllArgsConstructor;
import javax.validation.Valid;
-import org.springblade.core.secure.BladeUser;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springblade.modules.smsTemplate.entity.SmsTemplateEntity;
-import org.springblade.modules.smsTemplate.vo.SmsTemplateVO;
-import org.springblade.modules.smsTemplate.wrapper.SmsTemplateWrapper;
-import org.springblade.modules.smsTemplate.service.ISmsTemplateService;
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
+import org.springblade.modules.sms.vo.SmsTemplateVO;
+import org.springblade.modules.sms.wrapper.SmsTemplateWrapper;
+import org.springblade.modules.sms.service.ISmsTemplateService;
import org.springblade.core.boot.ctrl.BladeController;
/**
diff --git a/src/main/java/org/springblade/modules/smsTemplate/dto/SmsTemplateDTO.java b/src/main/java/org/springblade/modules/sms/dto/SmsTemplateDTO.java
similarity index 90%
rename from src/main/java/org/springblade/modules/smsTemplate/dto/SmsTemplateDTO.java
rename to src/main/java/org/springblade/modules/sms/dto/SmsTemplateDTO.java
index c038971..9be2b2d 100644
--- a/src/main/java/org/springblade/modules/smsTemplate/dto/SmsTemplateDTO.java
+++ b/src/main/java/org/springblade/modules/sms/dto/SmsTemplateDTO.java
@@ -14,9 +14,9 @@
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
-package org.springblade.modules.smsTemplate.dto;
+package org.springblade.modules.sms.dto;
-import org.springblade.modules.smsTemplate.entity.SmsTemplateEntity;
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
diff --git a/src/main/java/org/springblade/modules/smsTemplate/entity/SmsTemplateEntity.java b/src/main/java/org/springblade/modules/sms/entity/SmsTemplateEntity.java
similarity index 90%
rename from src/main/java/org/springblade/modules/smsTemplate/entity/SmsTemplateEntity.java
rename to src/main/java/org/springblade/modules/sms/entity/SmsTemplateEntity.java
index e5192a2..c6cc5ab 100644
--- a/src/main/java/org/springblade/modules/smsTemplate/entity/SmsTemplateEntity.java
+++ b/src/main/java/org/springblade/modules/sms/entity/SmsTemplateEntity.java
@@ -14,24 +14,18 @@
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
-package org.springblade.modules.smsTemplate.entity;
+package org.springblade.modules.sms.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
-import lombok.EqualsAndHashCode;
-import org.springblade.core.tenant.mp.TenantEntity;
-import lombok.Data;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serializable;
import java.util.Date;
-import java.math.BigDecimal;
/**
* 短信模版表对象 blade_sms_template
diff --git a/src/main/java/org/springblade/modules/smsTemplate/mapper/SmsTemplateMapper.java b/src/main/java/org/springblade/modules/sms/mapper/SmsTemplateMapper.java
similarity index 87%
rename from src/main/java/org/springblade/modules/smsTemplate/mapper/SmsTemplateMapper.java
rename to src/main/java/org/springblade/modules/sms/mapper/SmsTemplateMapper.java
index 72ca218..43b910b 100644
--- a/src/main/java/org/springblade/modules/smsTemplate/mapper/SmsTemplateMapper.java
+++ b/src/main/java/org/springblade/modules/sms/mapper/SmsTemplateMapper.java
@@ -14,11 +14,11 @@
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
-package org.springblade.modules.smsTemplate.mapper;
+package org.springblade.modules.sms.mapper;
-import org.springblade.modules.smsTemplate.dto.SmsTemplateDTO;
-import org.springblade.modules.smsTemplate.entity.SmsTemplateEntity;
-import org.springblade.modules.smsTemplate.vo.SmsTemplateVO;
+import org.springblade.modules.sms.dto.SmsTemplateDTO;
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
+import org.springblade.modules.sms.vo.SmsTemplateVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.List;
diff --git a/src/main/java/org/springblade/modules/smsTemplate/mapper/SmsTemplateMapper.xml b/src/main/java/org/springblade/modules/sms/mapper/SmsTemplateMapper.xml
similarity index 86%
rename from src/main/java/org/springblade/modules/smsTemplate/mapper/SmsTemplateMapper.xml
rename to src/main/java/org/springblade/modules/sms/mapper/SmsTemplateMapper.xml
index 3159064..b8a0949 100644
--- a/src/main/java/org/springblade/modules/smsTemplate/mapper/SmsTemplateMapper.xml
+++ b/src/main/java/org/springblade/modules/sms/mapper/SmsTemplateMapper.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="org.springblade.modules.smsTemplate.mapper.SmsTemplateMapper">
+<mapper namespace="org.springblade.modules.sms.mapper.SmsTemplateMapper">
<!-- 通用查询映射结果 -->
- <resultMap id="smsTemplateResultMap" type="org.springblade.modules.smsTemplate.entity.SmsTemplateEntity">
+ <resultMap id="smsTemplateResultMap" type="org.springblade.modules.sms.entity.SmsTemplateEntity">
</resultMap>
@@ -13,7 +13,7 @@
- <resultMap type="org.springblade.modules.smsTemplate.dto.SmsTemplateDTO" id="BladeSmsTemplateDTOResult">
+ <resultMap type="org.springblade.modules.sms.dto.SmsTemplateDTO" id="BladeSmsTemplateDTOResult">
<result property="id" column="id" />
<result property="deptId" column="dept_id" />
<result property="content" column="content" />
@@ -42,7 +42,7 @@
id = #{id}
</select>
- <select id="selectBladeSmsTemplateList" parameterType="org.springblade.modules.smsTemplate.dto.SmsTemplateDTO" resultMap="BladeSmsTemplateDTOResult">
+ <select id="selectBladeSmsTemplateList" parameterType="org.springblade.modules.sms.dto.SmsTemplateDTO" resultMap="BladeSmsTemplateDTOResult">
<include refid="selectBladeSmsTemplate"/>
<where>
<if test="id != null "> and id = #{id}</if>
diff --git a/src/main/java/org/springblade/modules/smsTemplate/dto/SmsTemplateDTO.java b/src/main/java/org/springblade/modules/sms/service/ISmsSendService.java
similarity index 62%
copy from src/main/java/org/springblade/modules/smsTemplate/dto/SmsTemplateDTO.java
copy to src/main/java/org/springblade/modules/sms/service/ISmsSendService.java
index c038971..54947ea 100644
--- a/src/main/java/org/springblade/modules/smsTemplate/dto/SmsTemplateDTO.java
+++ b/src/main/java/org/springblade/modules/sms/service/ISmsSendService.java
@@ -14,21 +14,30 @@
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
-package org.springblade.modules.smsTemplate.dto;
+package org.springblade.modules.sms.service;
-import org.springblade.modules.smsTemplate.entity.SmsTemplateEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.sms.dto.SmsTemplateDTO;
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
+import org.springblade.modules.sms.vo.SmsTemplateVO;
+
+import java.util.List;
/**
- * 短信模版表 数据传输对象实体类
+ * 短信模版表 服务类
*
* @author BladeX
* @since 2024-03-06
*/
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class SmsTemplateDTO extends SmsTemplateEntity {
- private static final long serialVersionUID = 1L;
+public interface ISmsSendService extends IService<SmsTemplateEntity> {
+
+ /**
+ *
+ *
+ * @return
+ */
+ Boolean smsSend(String phone);
+
}
diff --git a/src/main/java/org/springblade/modules/smsTemplate/service/ISmsTemplateService.java b/src/main/java/org/springblade/modules/sms/service/ISmsTemplateService.java
similarity index 84%
rename from src/main/java/org/springblade/modules/smsTemplate/service/ISmsTemplateService.java
rename to src/main/java/org/springblade/modules/sms/service/ISmsTemplateService.java
index 1522d5f..26a692f 100644
--- a/src/main/java/org/springblade/modules/smsTemplate/service/ISmsTemplateService.java
+++ b/src/main/java/org/springblade/modules/sms/service/ISmsTemplateService.java
@@ -14,13 +14,12 @@
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
-package org.springblade.modules.smsTemplate.service;
+package org.springblade.modules.sms.service;
import com.baomidou.mybatisplus.extension.service.IService;
-import org.springblade.modules.smsTemplate.dto.SmsTemplateDTO;
-import org.springblade.modules.smsTemplate.entity.SmsTemplateEntity;
-import org.springblade.modules.smsTemplate.vo.SmsTemplateVO;
-import org.springblade.core.mp.base.BaseService;
+import org.springblade.modules.sms.dto.SmsTemplateDTO;
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
+import org.springblade.modules.sms.vo.SmsTemplateVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.List;
diff --git a/src/main/java/org/springblade/modules/sms/service/impl/SmsSendServiceImpl.java b/src/main/java/org/springblade/modules/sms/service/impl/SmsSendServiceImpl.java
new file mode 100644
index 0000000..56a834f
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/service/impl/SmsSendServiceImpl.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springblade.common.config.SmsConfig;
+import org.springblade.common.utils.HttpClientUtils;
+import org.springblade.common.utils.UtilRandom;
+import org.springblade.common.utils.sms.AlipaySignature;
+import org.springblade.core.redis.cache.BladeRedis;
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
+import org.springblade.modules.sms.mapper.SmsTemplateMapper;
+import org.springblade.modules.sms.service.ISmsSendService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 短信模版表 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-03-06
+ */
+@Service
+public class SmsSendServiceImpl extends ServiceImpl<SmsTemplateMapper, SmsTemplateEntity> implements ISmsSendService {
+ @Autowired
+ private BladeRedis redisTemplate;
+ private static Logger logger = LoggerFactory.getLogger(SmsSendServiceImpl.class);
+
+ public static final String SMS_VALIDATE_PHONE = "sms:validate:code:";
+ public static final String SMS_VALIDATE_PHONE_NUM = "sms:validate:phone:";
+
+ @Autowired
+ private SmsConfig smsConfig;
+
+ @Override
+ public Boolean smsSend(String phone) {
+ //发送的手机号
+ List<Map> phonesList = new ArrayList<>();
+
+ Map phoneMap = new HashMap();
+ phoneMap.put("phone", phone);
+
+ List<String> varList = new ArrayList<>();
+ Integer code = UtilRandom.randomCount(111111, 999999);
+
+ varList.add(code.toString());
+ phoneMap.put("varList", varList);
+
+ phonesList.add(phoneMap);
+ //短信主题
+ String subject = "对外接口不同内容发送-动态模板";
+ //短信内容
+ String content = "您正在验证投票操作,验证码:#P_1#。如非本人操作,则密码可能已泄露,建议立即修改密码或联系客服。";
+// String content = "尊敬的#P_1#,你得工资#P_2#,测试#P_3#";
+ //短信模板
+ String template_id = null;
+ //发送时间
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ String send_time = df.format(new Date());
+ //优先级,高级=5,中级=3,低级=1
+ String priority = "1";
+ //不同内容发送类型,1=动态模板发送,2=文件内容发送
+ String type = "1";
+ Map params = new HashMap();
+ params.put("phones", phonesList);
+ params.put("subject", subject);
+ params.put("content", content);
+ params.put("template_id", template_id);
+ params.put("send_time", send_time);
+ params.put("priority", priority);
+ params.put("type", type);
+ //创建人主键
+ params.put("sop_create_by", smsConfig.getSopCreateBy());
+ String s = null;
+ try {
+ s = testGet(params, "message.sop.differentMes");
+ JSONObject jsonObject = JSON.parseObject(s);
+ JSONObject messageSopEqualsMesResponse = (JSONObject) jsonObject.get("message_sop_equalsMes_response");
+ if (messageSopEqualsMesResponse.get("code").equals(200)) {
+ // 将验证码存入redis
+ redisTemplate.setEx(SMS_VALIDATE_PHONE + phone, code, 300L);
+ redisTemplate.setEx(SMS_VALIDATE_PHONE_NUM + phone, 1, 60L);
+ return true;
+ }
+ } catch (Exception e) {
+ logger.error("短信发送失败!", e);
+ throw new RuntimeException(e);
+ }
+ return false;
+ }
+
+ public String testGet(Object bizContent, String method) throws Exception {
+
+ // 公共请求参数
+ Map<String, String> params = new HashMap<String, String>();
+ params.put("app_id", smsConfig.getSmsAppId());
+ params.put("method", method);
+ params.put("format", "json");
+ params.put("charset", "utf-8");
+ params.put("sign_type", "RSA2");
+ params.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+ params.put("version", "1.0");
+
+ // 业务参数
+ params.put("biz_content", JSON.toJSONString(bizContent));
+ String content = AlipaySignature.getSignContent(params);
+ String sign = AlipaySignature.rsa256Sign(content, smsConfig.getSmsPrivateKey(), "utf-8");
+ params.put("sign", sign);
+
+ System.out.println("----------- 请求信息 -----------");
+ System.out.println("请求参数:" + buildParamQuery(params));
+ System.out.println("商户秘钥:" + smsConfig.getSmsPrivateKey());
+ System.out.println("待签名内容:" + content);
+ System.out.println("签名(sign):" + sign);
+ System.out.println("URL参数:" + buildUrlQuery(params));
+
+ System.out.println("----------- 返回结果 -----------");
+ String responseData = HttpClientUtils.doGet(smsConfig.getSmsUrl(), params);// 发送请求
+ System.out.println("返回数据" + responseData);
+ return responseData;
+ }
+
+ protected static String buildParamQuery(Map<String, String> params) {
+ StringBuilder sb = new StringBuilder();
+ for (Map.Entry<String, String> entry : params.entrySet()) {
+ sb.append("&").append(entry.getKey()).append("=").append(entry.getValue());
+ }
+ return sb.toString().substring(1);
+ }
+
+ protected static String buildUrlQuery(Map<String, String> params) {
+ StringBuilder sb = new StringBuilder();
+ for (Map.Entry<String, String> entry : params.entrySet()) {
+ try {
+ sb.append("&").append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "UTF-8"));
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ }
+ return sb.toString().substring(1);
+ }
+}
diff --git a/src/main/java/org/springblade/modules/smsTemplate/service/impl/SmsTemplateServiceImpl.java b/src/main/java/org/springblade/modules/sms/service/impl/SmsTemplateServiceImpl.java
similarity index 81%
rename from src/main/java/org/springblade/modules/smsTemplate/service/impl/SmsTemplateServiceImpl.java
rename to src/main/java/org/springblade/modules/sms/service/impl/SmsTemplateServiceImpl.java
index 72f38fc..f86d03b 100644
--- a/src/main/java/org/springblade/modules/smsTemplate/service/impl/SmsTemplateServiceImpl.java
+++ b/src/main/java/org/springblade/modules/sms/service/impl/SmsTemplateServiceImpl.java
@@ -14,15 +14,14 @@
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
-package org.springblade.modules.smsTemplate.service.impl;
+package org.springblade.modules.sms.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springblade.modules.smsTemplate.dto.SmsTemplateDTO;
-import org.springblade.modules.smsTemplate.entity.SmsTemplateEntity;
-import org.springblade.modules.smsTemplate.vo.SmsTemplateVO;
-import org.springblade.modules.smsTemplate.mapper.SmsTemplateMapper;
-import org.springblade.modules.smsTemplate.service.ISmsTemplateService;
-import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.modules.sms.dto.SmsTemplateDTO;
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
+import org.springblade.modules.sms.vo.SmsTemplateVO;
+import org.springblade.modules.sms.mapper.SmsTemplateMapper;
+import org.springblade.modules.sms.service.ISmsTemplateService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
diff --git a/src/main/java/org/springblade/modules/smsTemplate/vo/SmsTemplateVO.java b/src/main/java/org/springblade/modules/sms/vo/SmsTemplateVO.java
similarity index 87%
rename from src/main/java/org/springblade/modules/smsTemplate/vo/SmsTemplateVO.java
rename to src/main/java/org/springblade/modules/sms/vo/SmsTemplateVO.java
index 08afa1f..d6851dd 100644
--- a/src/main/java/org/springblade/modules/smsTemplate/vo/SmsTemplateVO.java
+++ b/src/main/java/org/springblade/modules/sms/vo/SmsTemplateVO.java
@@ -14,10 +14,9 @@
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
-package org.springblade.modules.smsTemplate.vo;
+package org.springblade.modules.sms.vo;
-import org.springblade.modules.smsTemplate.entity.SmsTemplateEntity;
-import org.springblade.core.tool.node.INode;
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
diff --git a/src/main/java/org/springblade/modules/smsTemplate/wrapper/SmsTemplateWrapper.java b/src/main/java/org/springblade/modules/sms/wrapper/SmsTemplateWrapper.java
similarity index 90%
rename from src/main/java/org/springblade/modules/smsTemplate/wrapper/SmsTemplateWrapper.java
rename to src/main/java/org/springblade/modules/sms/wrapper/SmsTemplateWrapper.java
index 2ed77fc..512e0aa 100644
--- a/src/main/java/org/springblade/modules/smsTemplate/wrapper/SmsTemplateWrapper.java
+++ b/src/main/java/org/springblade/modules/sms/wrapper/SmsTemplateWrapper.java
@@ -14,12 +14,12 @@
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
-package org.springblade.modules.smsTemplate.wrapper;
+package org.springblade.modules.sms.wrapper;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
-import org.springblade.modules.smsTemplate.entity.SmsTemplateEntity;
-import org.springblade.modules.smsTemplate.vo.SmsTemplateVO;
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
+import org.springblade.modules.sms.vo.SmsTemplateVO;
import java.util.Objects;
/**
diff --git a/src/main/java/org/springblade/modules/system/controller/MenuController.java b/src/main/java/org/springblade/modules/system/controller/MenuController.java
index e9c9217..45b18b4 100644
--- a/src/main/java/org/springblade/modules/system/controller/MenuController.java
+++ b/src/main/java/org/springblade/modules/system/controller/MenuController.java
@@ -138,8 +138,11 @@
*/
@GetMapping("/dynamicMenu")
@ApiOperation(value = "菜单列表", notes = "传入menu")
- public R<List<MenuVO>> dynamicMenu(String roleId, Long topMenuId, @RequestParam(value = "labelType", required = false,defaultValue = "0") Integer labelType, @RequestParam(value = "roleName",required = false) String roleName) {
- List<MenuVO> list = menuService.routes(roleId, topMenuId,labelType,1,roleName);
+ public R<List<MenuVO>> dynamicMenu(String roleId, Long topMenuId,
+ @RequestParam(value = "labelType", required = false,defaultValue = "0") Integer labelType,
+ @RequestParam(value = "roleName",required = false) String roleName,
+ @RequestParam(value = "houseCode",required = false) String houseCode) {
+ List<MenuVO> list = menuService.routes(roleId, topMenuId,labelType,1,roleName,houseCode);
return R.data(list);
}
@@ -200,7 +203,7 @@
@ApiOperationSupport(order = 8)
@ApiOperation(value = "前端菜单数据", notes = "前端菜单数据")
public R<List<MenuVO>> routes(BladeUser user, Long topMenuId) {
- List<MenuVO> list = menuService.routes((user == null) ? null : user.getRoleId(), topMenuId,null,0,"");
+ List<MenuVO> list = menuService.routes((user == null) ? null : user.getRoleId(), topMenuId,null,0,"","");
return R.data(list);
}
diff --git a/src/main/java/org/springblade/modules/system/service/IMenuService.java b/src/main/java/org/springblade/modules/system/service/IMenuService.java
index a97bcdc..5cd4d76 100644
--- a/src/main/java/org/springblade/modules/system/service/IMenuService.java
+++ b/src/main/java/org/springblade/modules/system/service/IMenuService.java
@@ -59,7 +59,7 @@
* @param topMenuId
* @return
*/
- List<MenuVO> routes(String roleId, Long topMenuId,Integer labelType,Integer menuType,String roleName);
+ List<MenuVO> routes(String roleId, Long topMenuId,Integer labelType,Integer menuType,String roleName,String houseCode);
/**
* 菜单树形结构
diff --git a/src/main/java/org/springblade/modules/system/service/impl/MenuServiceImpl.java b/src/main/java/org/springblade/modules/system/service/impl/MenuServiceImpl.java
index 222acc5..0d3c539 100644
--- a/src/main/java/org/springblade/modules/system/service/impl/MenuServiceImpl.java
+++ b/src/main/java/org/springblade/modules/system/service/impl/MenuServiceImpl.java
@@ -111,7 +111,7 @@
@Override
- public List<MenuVO> routes(String roleId, Long topMenuId, Integer labelType, Integer menuType, String roleName) {
+ public List<MenuVO> routes(String roleId, Long topMenuId, Integer labelType, Integer menuType, String roleName,String houseCode) {
if (StringUtil.isBlank(roleId)) {
return null;
}
@@ -126,7 +126,7 @@
roleMenus = tenantPackageMenu(baseMapper.roleMenuByRoleId(Func.toLongList(roleId), menuType));
// 1:居民,居民需要通过人的标签来显示取保候审
if (CommonConstant.RESIDENT.equals(roleName)) {
- extracted(labelType, roleMenus);
+ extracted(labelType, roleMenus,houseCode);
}
}
// 顶部菜单请求返回对应角色权限菜单
@@ -153,10 +153,11 @@
* @param roleMenus
* @param labelType
*/
- private void extracted(Integer labelType, List<Menu> roleMenus) {
+ private void extracted(Integer labelType, List<Menu> roleMenus,String houseCode) {
UserHouseLabelDTO userHouseLabelDTO = new UserHouseLabelDTO();
userHouseLabelDTO.setUserId(AuthUtil.getUserId());
userHouseLabelDTO.setLableType(labelType);
+ userHouseLabelDTO.setHouseCode(houseCode);
List<Integer> integers = iUserHouseLabelService.selectUserLabelList(userHouseLabelDTO);
Iterator<Menu> iterator = roleMenus.iterator();
while (iterator.hasNext()) {
@@ -171,12 +172,12 @@
// 场所的时候,删除取保候审
} else if (CommonConstant.NUMBER_TWO.equals(labelType)) {
- if (next.getName().trim().equals("取保候审")) {
+ if (next.getName().trim().equals("取保监居")) {
iterator.remove();
}
}
} else {
- if (next.getName().trim().equals("取保候审")) {
+ if (next.getName().trim().equals("取保监居")) {
iterator.remove();
}
}
diff --git a/src/main/java/org/springblade/modules/system/service/impl/UserServiceImpl.java b/src/main/java/org/springblade/modules/system/service/impl/UserServiceImpl.java
index 1625b1a..80adbba 100644
--- a/src/main/java/org/springblade/modules/system/service/impl/UserServiceImpl.java
+++ b/src/main/java/org/springblade/modules/system/service/impl/UserServiceImpl.java
@@ -54,6 +54,7 @@
import org.springblade.modules.police.entity.PoliceAffairsGridEntity;
import org.springblade.modules.police.service.IPoliceAffairsGridService;
import org.springblade.modules.property.entity.PropertyCompanyEntity;
+import org.springblade.modules.property.service.IPropertyCompanyDistrictService;
import org.springblade.modules.property.service.IPropertyCompanyService;
import org.springblade.modules.system.entity.*;
import org.springblade.modules.system.excel.PoliceUserExcel;
@@ -603,11 +604,12 @@
IGridmanService bean = SpringUtil.getBean(IGridmanService.class);
return bean.getGridManByCode(houseCode);
} else {
-// IPropertyCompanyDistrictService bean1 = SpringUtil.getBean(IPropertyCompanyDistrictService.class);
-// return bean1.getDistictUserByCode(houseCode);
- String deptId = AuthUtil.getDeptId();
- List<Long> deptIdList = SysCache.getDeptChildIds(deptId);
- return baseMapper.selectUserByDept(deptIdList);
+ IPropertyCompanyDistrictService bean1 = SpringUtil.getBean(IPropertyCompanyDistrictService.class);
+ return bean1.getDistictUserByCode(houseCode);
+ // 通过huosecode 查询物业工作人员
+// String deptId = AuthUtil.getDeptId();
+// List<Long> deptIdList = SysCache.getDeptChildIds(deptId);
+// return baseMapper.selectUserByDept(deptIdList);
}
}
diff --git a/src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.java b/src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.java
index bc0dabc..2aa5df0 100644
--- a/src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.java
+++ b/src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.java
@@ -47,7 +47,7 @@
@Param("gridCodeList") List<String> gridCodeList);
- Integer getCount(String neiCode, int i, Long userId,@Param("regionChildCodesList") List<String> regionChildCodesList,
+ Integer getCount(String neiCode, int status, Long userId,@Param("regionChildCodesList") List<String> regionChildCodesList,
@Param("isAdministrator") Integer isAdministrator,
@Param("gridCodeList") List<String> gridCodeList);
}
diff --git a/src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.xml b/src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.xml
index 80abd5e..6ba79fd 100644
--- a/src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.xml
+++ b/src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.xml
@@ -107,6 +107,7 @@
<where>
and jtrpa.is_deleted = 0
<if test="neiCode != null and neiCode != ''"> and jg.community_code = #{neiCode}</if>
+ <if test="status != null and status != ''"> and jtrpa.confirm_flag = #{status}</if>
<if test="isAdministrator==2">
<!-- <if test="residen.roleType ==null ">-->
diff --git a/src/main/java/org/springblade/modules/task/service/ITaskResidencePermitApplyService.java b/src/main/java/org/springblade/modules/task/service/ITaskResidencePermitApplyService.java
index a153e7e..0b95548 100644
--- a/src/main/java/org/springblade/modules/task/service/ITaskResidencePermitApplyService.java
+++ b/src/main/java/org/springblade/modules/task/service/ITaskResidencePermitApplyService.java
@@ -54,7 +54,7 @@
* @param i
* @return
*/
- Integer getCount(String neiCode, int i);
+ Integer getCount(String neiCode, int status);
/**
* 审核
diff --git a/src/main/java/org/springblade/modules/task/service/impl/TaskResidencePermitApplyServiceImpl.java b/src/main/java/org/springblade/modules/task/service/impl/TaskResidencePermitApplyServiceImpl.java
index 96b5b52..d69d29a 100644
--- a/src/main/java/org/springblade/modules/task/service/impl/TaskResidencePermitApplyServiceImpl.java
+++ b/src/main/java/org/springblade/modules/task/service/impl/TaskResidencePermitApplyServiceImpl.java
@@ -98,7 +98,7 @@
}
@Override
- public Integer getCount(String neiCode, int i) {
+ public Integer getCount(String neiCode, int status) {
TaskResidencePermitApplyVO taskResidencePermitApply = new TaskResidencePermitApplyVO();
taskResidencePermitApply.setCommunityCode(neiCode);
// 获取请求头中的角色别名
@@ -106,7 +106,7 @@
if (AuthUtils.isMj(roleName)) {
// todo 需要改造
CommonParamSet commonParamSet = new CommonParamSet().invoke(TaskResidencePermitApplyVO.class, taskResidencePermitApply);
- return baseMapper.getCount(neiCode, i, AuthUtil.getUserId(),commonParamSet.getRegionChildCodesList(), commonParamSet.getIsAdministrator(), commonParamSet.getGridCodeList());
+ return baseMapper.getCount(neiCode, status, AuthUtil.getUserId(),commonParamSet.getRegionChildCodesList(), commonParamSet.getIsAdministrator(), commonParamSet.getGridCodeList());
}
return 0;
}
--
Gitblit v1.9.3