diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index e2d09724..65ac0a69 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -1,8 +1,8 @@
-
+
-
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index bf866382..3647c99c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -195,9 +195,36 @@
3.4.0
+
+
+ org.springframework.mobile
+ spring-mobile-starter
+ 2.0.0.M2
+
+
+
+ org.dom4j
+ dom4j
+ 2.0.0
+
+
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-xml
+ 2.8.8
+
+
+
+ spring-milestones
+ Spring Milestones
+ https://repo.spring.io/milestone
+
+
+
+
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/JM_3DES.java b/src/main/java/com/dreamchaser/depository_manage/config/JM_3DES.java
new file mode 100644
index 00000000..ba2734fb
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/JM_3DES.java
@@ -0,0 +1,78 @@
+package com.dreamchaser.depository_manage.config;
+
+import org.apache.commons.codec.digest.DigestUtils;
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+
+import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+
+
+/**
+ * 用于3DES加密解密
+ */
+public class JM_3DES {
+
+ public static String JM_Key = "scanQrCode";
+ /**
+ * 获取key
+ * @param key
+ * @return
+ */
+ public static byte[] hex(String key){
+ String f = DigestUtils.md5Hex(key);
+ byte[] bkeys = new String(f).getBytes();
+ byte[] enk = new byte[24];
+ for (int i=0;i<24;i++){
+ enk[i] = bkeys[i];
+ }
+ return enk;
+ }
+
+ /**
+ * 3DES加密
+ * @param key 密钥
+ * @param srcStr 需要加密的字符串
+ * @return
+ */
+ public static String encode3Des(String key, String srcStr){
+ byte[] keybyte = hex(key);
+ byte[] src = srcStr.getBytes();
+ try {
+ //生成密钥
+ SecretKey deskey = new SecretKeySpec(keybyte, "DESede");
+ //加密
+ Cipher c1 = Cipher.getInstance("DESede");
+ c1.init(Cipher.ENCRYPT_MODE, deskey);
+ String pwd = (new BASE64Encoder()).encodeBuffer(c1.doFinal(src));
+ return pwd;
+ }catch(Exception e){
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * 3DES解密
+ * @param key 加密密钥
+ * @param desStr 需要解密的字符串
+ * @return
+ */
+ public static String decode3Des(String key, String desStr){
+ byte[] keybyte = hex(key);
+ try {
+ byte[] src = (new BASE64Decoder()).decodeBuffer(desStr);
+ //生成密钥
+ SecretKey deskey = new SecretKeySpec(keybyte, "DESede");
+ //解密
+ Cipher c1 = Cipher.getInstance("DESede");
+ c1.init(Cipher.DECRYPT_MODE, deskey);
+ String pwd = new String(c1.doFinal(src));
+ return pwd;
+ }catch(Exception e){
+ e.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/PortConfig.java b/src/main/java/com/dreamchaser/depository_manage/config/PortConfig.java
index 0381259e..25c93712 100644
--- a/src/main/java/com/dreamchaser/depository_manage/config/PortConfig.java
+++ b/src/main/java/com/dreamchaser/depository_manage/config/PortConfig.java
@@ -1,5 +1,6 @@
package com.dreamchaser.depository_manage.config;
+import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.controller.PageController;
@@ -10,6 +11,7 @@ import com.dreamchaser.depository_manage.utils.HttpUtils;
import lombok.Data;
import org.apache.http.protocol.HTTP;
+import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
@@ -27,12 +29,13 @@ public class PortConfig {
public static String external_url_6666 = "http://172.20.2.87:6666";
// public static String external_url_6666 = "http://127.0.0.1:6666";
+
/**
* 获取相应部门的部门负责人
* @param administration
* @return
*/
- public static List findDepartmentHeadByUser(Administration administration){
+ public static List findDepartmentHeadByUser(Administration administration, UserByPort userToken){
String url = PortConfig.external_url + "/org/positionlist";
Integer maindeparment = administration.getId();
Map map = new HashMap<>();
@@ -42,7 +45,7 @@ public class PortConfig {
JSONObject paramObject = JSONObject.parseObject(jsonString);
String post = null;
try {
- post = HttpUtils.send(url, paramObject, HTTP.UTF_8);
+ post = HttpUtils.send(url, paramObject, HTTP.UTF_8,userToken);
} catch (IOException e) {
e.printStackTrace();
}
@@ -62,10 +65,48 @@ public class PortConfig {
Map param = new HashMap<>();
Post userPost = userPostList.get(i);
param.put("position",userPost.getId());
- List userByPorts = PageController.FindUserByMap(param);
+ List userByPorts = PageController.FindUserByMap(param,userToken);
userByPortList.addAll(userByPorts);
}
return userByPortList;
}
+ // 通过获取的企业微信UserId获取数据库中的用户以及对应key与token
+ public static Map findUserByQyWxUserId(String userId){
+ String url = external_url +"/staff/wechat_give_uscont";
+ Map result = new HashMap<>();
+ Map map = new HashMap<>();
+ map.put("openid",userId);
+ String jsonString = JSONObject.toJSONString(map);
+ JSONObject paramObject = JSONObject.parseObject(jsonString);
+ String post = null;
+ try {
+ post = HttpUtils.send(url,paramObject, HTTP.UTF_8,null);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ JSONObject jsonObject = JSONObject.parseObject(post);
+ JSONObject data = (JSONObject) jsonObject.get("data");
+ UserByPort userByPort = JSONObject.toJavaObject((JSONObject) data.get("userinfo"), UserByPort.class);
+ String userKey = data.getString("key");
+ String userToken = data.getString("token");
+ result.put("key",userKey);
+ result.put("token",userToken);
+ result.put("user",userByPort);
+ return result;
+ }
+
+
+ // 修改员工微信或企业微信UserId
+ public static void editUserWechatOpenid(Map map,UserByPort userByPort){
+ String url = external_url+"/staff/edit_us_wechat_openid";
+ String jsonString = JSONObject.toJSONString(map);
+ JSONObject paramObject = JSONObject.parseObject(jsonString);
+ String post = null;
+ try {
+ post = HttpUtils.send(url, paramObject, HTTP.UTF_8,userByPort);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWxConfig.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWxConfig.java
new file mode 100644
index 00000000..53c9c266
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWxConfig.java
@@ -0,0 +1,77 @@
+package com.dreamchaser.depository_manage.config;
+
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.dreamchaser.depository_manage.config.QyWx_template_card.*;
+import com.dreamchaser.depository_manage.utils.HttpUtils;
+import com.dreamchaser.depository_manage.utils.ObjectFormatUtil;
+import lombok.Data;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+// 用于实现企业微信相关功能
+
+@Data
+public class QyWxConfig {
+ public static String corpid = "ww02f310301953277a"; // 企业的CorpID
+ public static String secret = "GYwyoAGwMwumAVFrFn-RZIc2q11P3pm8NWY9pWDjLqw"; // 应用的凭证密钥
+ public static int AgentId = 1000037; //应用agentid
+ public static String callBackUrl = "https://jy.hxgk.group/QyWxLogin";
+ public static String token = ""; //access_token
+ public static String code = ""; //userCode
+ public static String sendMessage_url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN";
+
+ // 用于回调配置的token
+ public static String sToken = "sM4MFE44fAKdtqvq81HYygqmrdUn";
+ // 用于回调配置的EncodingAESKey
+ public static String sEncodingAESKey = "10cruMoq3ixrQQngJcMN6CzOYrHWmHMpxp2Xn5iYrsk";
+
+ // 用于获取企业微信对应token
+ public static String GetQYWXToken(){
+ String url = String.format(" https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s",QyWxConfig.corpid,QyWxConfig.secret);
+ String get = HttpUtils.doGet(url);
+ JSONObject jsonObject = JSONObject.parseObject(get);
+ Integer errcord = ObjectFormatUtil.toInteger(jsonObject.get("errcode"));
+ String accessToken = (String) jsonObject.get("access_token");
+ String errmsg = (String) jsonObject.get("errmsg");
+ if(errcord == 0){
+ // 如果成功获取access_token
+ return accessToken;
+ }else{
+ // 否则返回空值
+ return "visitToFail:"+errmsg;
+ }
+ }
+
+
+ // 根据获取到的用户code以及token获取用户id
+ public static JSONObject GetQYWXUserId(){
+ String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=%s&code=%s",QyWxConfig.token,QyWxConfig.code);
+ String get = HttpUtils.doGet(url);
+ JSONObject jsonObject = JSONObject.parseObject(get);
+ return jsonObject;
+
+ }
+
+ // 用于拼接发送链接
+ public static String getQYWXCodeUrl(){
+ String encode = null;
+ try {
+ encode = URLEncoder.encode(QyWxConfig.callBackUrl, "utf-8");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ String url = String.format("https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&agentid=%s#wechat_redirect",QyWxConfig.corpid,encode,QyWxConfig.secret);
+ return url;
+ }
+
+
+
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/AesException.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/AesException.java
new file mode 100644
index 00000000..007bcfd3
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/AesException.java
@@ -0,0 +1,61 @@
+package com.dreamchaser.depository_manage.config.QyWxJMJM.com.qq.weixin.mp.aes;
+
+
+
+@SuppressWarnings("serial")
+public class AesException extends Exception {
+
+ public final static int OK = 0;
+ public final static int ValidateSignatureError = -40001;
+ public final static int ParseXmlError = -40002;
+ public final static int ComputeSignatureError = -40003;
+ public final static int IllegalAesKey = -40004;
+ public final static int ValidateCorpidError = -40005;
+ public final static int EncryptAESError = -40006;
+ public final static int DecryptAESError = -40007;
+ public final static int IllegalBuffer = -40008;
+ //public final static int EncodeBase64Error = -40009;
+ //public final static int DecodeBase64Error = -40010;
+ //public final static int GenReturnXmlError = -40011;
+
+ private int code;
+
+ private static String getMessage(int code) {
+ switch (code) {
+ case ValidateSignatureError:
+ return "签名验证错误";
+ case ParseXmlError:
+ return "xml解析失败";
+ case ComputeSignatureError:
+ return "sha加密生成签名失败";
+ case IllegalAesKey:
+ return "SymmetricKey非法";
+ case ValidateCorpidError:
+ return "corpid校验失败";
+ case EncryptAESError:
+ return "aes加密失败";
+ case DecryptAESError:
+ return "aes解密失败";
+ case IllegalBuffer:
+ return "解密后得到的buffer非法";
+// case EncodeBase64Error:
+// return "base64加密错误";
+// case DecodeBase64Error:
+// return "base64解密错误";
+// case GenReturnXmlError:
+// return "xml生成失败";
+ default:
+ return null; // cannot be
+ }
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ AesException(int code) {
+ super(getMessage(code));
+ this.code = code;
+ }
+
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/ByteGroup.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/ByteGroup.java
new file mode 100644
index 00000000..e4d806ad
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/ByteGroup.java
@@ -0,0 +1,26 @@
+package com.dreamchaser.depository_manage.config.QyWxJMJM.com.qq.weixin.mp.aes;
+
+import java.util.ArrayList;
+
+class ByteGroup {
+ ArrayList byteContainer = new ArrayList();
+
+ public byte[] toBytes() {
+ byte[] bytes = new byte[byteContainer.size()];
+ for (int i = 0; i < byteContainer.size(); i++) {
+ bytes[i] = byteContainer.get(i);
+ }
+ return bytes;
+ }
+
+ public ByteGroup addBytes(byte[] bytes) {
+ for (byte b : bytes) {
+ byteContainer.add(b);
+ }
+ return this;
+ }
+
+ public int size() {
+ return byteContainer.size();
+ }
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/PKCS7Encoder.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/PKCS7Encoder.java
new file mode 100644
index 00000000..a41facf4
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/PKCS7Encoder.java
@@ -0,0 +1,67 @@
+/**
+ * 对企业微信发送给企业后台的消息加解密示例代码.
+ *
+ * @copyright Copyright (c) 1998-2014 Tencent Inc.
+ */
+
+// ------------------------------------------------------------------------
+
+package com.dreamchaser.depository_manage.config.QyWxJMJM.com.qq.weixin.mp.aes;
+
+import java.nio.charset.Charset;
+import java.util.Arrays;
+
+/**
+ * 提供基于PKCS7算法的加解密接口.
+ */
+class PKCS7Encoder {
+ static Charset CHARSET = Charset.forName("utf-8");
+ static int BLOCK_SIZE = 32;
+
+ /**
+ * 获得对明文进行补位填充的字节.
+ *
+ * @param count 需要进行填充补位操作的明文字节个数
+ * @return 补齐用的字节数组
+ */
+ static byte[] encode(int count) {
+ // 计算需要填充的位数
+ int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);
+ if (amountToPad == 0) {
+ amountToPad = BLOCK_SIZE;
+ }
+ // 获得补位所用的字符
+ char padChr = chr(amountToPad);
+ String tmp = new String();
+ for (int index = 0; index < amountToPad; index++) {
+ tmp += padChr;
+ }
+ return tmp.getBytes(CHARSET);
+ }
+
+ /**
+ * 删除解密后明文的补位字符
+ *
+ * @param decrypted 解密后的明文
+ * @return 删除补位字符后的明文
+ */
+ static byte[] decode(byte[] decrypted) {
+ int pad = (int) decrypted[decrypted.length - 1];
+ if (pad < 1 || pad > 32) {
+ pad = 0;
+ }
+ return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
+ }
+
+ /**
+ * 将数字转化成ASCII码对应的字符,用于对明文进行补码
+ *
+ * @param a 需要转化的数字
+ * @return 转化得到的字符
+ */
+ static char chr(int a) {
+ byte target = (byte) (a & 0xFF);
+ return (char) target;
+ }
+
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/SHA1.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/SHA1.java
new file mode 100644
index 00000000..1750bd17
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/SHA1.java
@@ -0,0 +1,61 @@
+/**
+ * 对企业微信发送给企业后台的消息加解密示例代码.
+ *
+ * @copyright Copyright (c) 1998-2014 Tencent Inc.
+ */
+
+// ------------------------------------------------------------------------
+
+package com.dreamchaser.depository_manage.config.QyWxJMJM.com.qq.weixin.mp.aes;
+
+import java.security.MessageDigest;
+import java.util.Arrays;
+
+/**
+ * SHA1 class
+ *
+ * 计算消息签名接口.
+ */
+class SHA1 {
+
+ /**
+ * 用SHA1算法生成安全签名
+ * @param token 票据
+ * @param timestamp 时间戳
+ * @param nonce 随机字符串
+ * @param encrypt 密文
+ * @return 安全签名
+ * @throws AesException
+ */
+ public static String getSHA1(String token, String timestamp, String nonce, String encrypt) throws AesException
+ {
+ try {
+ String[] array = new String[] { token, timestamp, nonce, encrypt };
+ StringBuffer sb = new StringBuffer();
+ // 字符串排序
+ Arrays.sort(array);
+ for (int i = 0; i < 4; i++) {
+ sb.append(array[i]);
+ }
+ String str = sb.toString();
+ // SHA1签名生成
+ MessageDigest md = MessageDigest.getInstance("SHA-1");
+ md.update(str.getBytes());
+ byte[] digest = md.digest();
+
+ StringBuffer hexstr = new StringBuffer();
+ String shaHex = "";
+ for (int i = 0; i < digest.length; i++) {
+ shaHex = Integer.toHexString(digest[i] & 0xFF);
+ if (shaHex.length() < 2) {
+ hexstr.append(0);
+ }
+ hexstr.append(shaHex);
+ }
+ return hexstr.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new AesException(AesException.ComputeSignatureError);
+ }
+ }
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/WXBizMsgCrypt.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/WXBizMsgCrypt.java
new file mode 100644
index 00000000..d65a9997
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/WXBizMsgCrypt.java
@@ -0,0 +1,289 @@
+/**
+ * 对企业微信发送给企业后台的消息加解密示例代码.
+ *
+ * @copyright Copyright (c) 1998-2014 Tencent Inc.
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * 针对org.apache.commons.codec.binary.Base64,
+ * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本)
+ * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi
+ */
+package com.dreamchaser.depository_manage.config.QyWxJMJM.com.qq.weixin.mp.aes;
+
+import java.nio.charset.Charset;
+import java.util.Arrays;
+import java.util.Random;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.commons.codec.binary.Base64;
+
+/**
+ * 提供接收和推送给企业微信消息的加解密接口(UTF8编码的字符串).
+ *
+ * - 第三方回复加密消息给企业微信
+ * - 第三方收到企业微信发送的消息,验证消息的安全性,并对消息进行解密。
+ *
+ * 说明:异常java.security.InvalidKeyException:illegal Key Size的解决方案
+ *
+ * - 在官方网站下载JCE无限制权限策略文件(JDK7的下载地址:
+ * http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
+ * - 下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt
+ * - 如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件
+ * - 如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件
+ *
+ */
+public class WXBizMsgCrypt {
+ static Charset CHARSET = Charset.forName("utf-8");
+ Base64 base64 = new Base64();
+ byte[] aesKey;
+ String token;
+ String receiveid;
+
+ /**
+ * 构造函数
+ * @param token 企业微信后台,开发者设置的token
+ * @param encodingAesKey 企业微信后台,开发者设置的EncodingAESKey
+ * @param receiveid, 不同场景含义不同,详见文档
+ *
+ * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
+ */
+ public WXBizMsgCrypt(String token, String encodingAesKey, String receiveid) throws AesException {
+ if (encodingAesKey.length() != 43) {
+ throw new AesException(AesException.IllegalAesKey);
+ }
+
+ this.token = token;
+ this.receiveid = receiveid;
+ aesKey = Base64.decodeBase64(encodingAesKey + "=");
+ }
+
+ // 生成4个字节的网络字节序
+ byte[] getNetworkBytesOrder(int sourceNumber) {
+ byte[] orderBytes = new byte[4];
+ orderBytes[3] = (byte) (sourceNumber & 0xFF);
+ orderBytes[2] = (byte) (sourceNumber >> 8 & 0xFF);
+ orderBytes[1] = (byte) (sourceNumber >> 16 & 0xFF);
+ orderBytes[0] = (byte) (sourceNumber >> 24 & 0xFF);
+ return orderBytes;
+ }
+
+ // 还原4个字节的网络字节序
+ int recoverNetworkBytesOrder(byte[] orderBytes) {
+ int sourceNumber = 0;
+ for (int i = 0; i < 4; i++) {
+ sourceNumber <<= 8;
+ sourceNumber |= orderBytes[i] & 0xff;
+ }
+ return sourceNumber;
+ }
+
+ // 随机生成16位字符串
+ String getRandomStr() {
+ String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+ Random random = new Random();
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < 16; i++) {
+ int number = random.nextInt(base.length());
+ sb.append(base.charAt(number));
+ }
+ return sb.toString();
+ }
+
+ /**
+ * 对明文进行加密.
+ *
+ * @param text 需要加密的明文
+ * @return 加密后base64编码的字符串
+ * @throws AesException aes加密失败
+ */
+ String encrypt(String randomStr, String text) throws AesException {
+ ByteGroup byteCollector = new ByteGroup();
+ byte[] randomStrBytes = randomStr.getBytes(CHARSET);
+ byte[] textBytes = text.getBytes(CHARSET);
+ byte[] networkBytesOrder = getNetworkBytesOrder(textBytes.length);
+ byte[] receiveidBytes = receiveid.getBytes(CHARSET);
+
+ // randomStr + networkBytesOrder + text + receiveid
+ byteCollector.addBytes(randomStrBytes);
+ byteCollector.addBytes(networkBytesOrder);
+ byteCollector.addBytes(textBytes);
+ byteCollector.addBytes(receiveidBytes);
+
+ // ... + pad: 使用自定义的填充方式对明文进行补位填充
+ byte[] padBytes = PKCS7Encoder.encode(byteCollector.size());
+ byteCollector.addBytes(padBytes);
+
+ // 获得最终的字节流, 未加密
+ byte[] unencrypted = byteCollector.toBytes();
+
+ try {
+ // 设置加密模式为AES的CBC模式
+ Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
+ SecretKeySpec keySpec = new SecretKeySpec(aesKey, "AES");
+ IvParameterSpec iv = new IvParameterSpec(aesKey, 0, 16);
+ cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
+
+ // 加密
+ byte[] encrypted = cipher.doFinal(unencrypted);
+
+ // 使用BASE64对加密后的字符串进行编码
+ String base64Encrypted = base64.encodeToString(encrypted);
+
+ return base64Encrypted;
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new AesException(AesException.EncryptAESError);
+ }
+ }
+
+ /**
+ * 对密文进行解密.
+ *
+ * @param text 需要解密的密文
+ * @return 解密得到的明文
+ * @throws AesException aes解密失败
+ */
+ String decrypt(String text) throws AesException {
+ byte[] original;
+ try {
+ // 设置解密模式为AES的CBC模式
+ Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
+ SecretKeySpec key_spec = new SecretKeySpec(aesKey, "AES");
+ IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16));
+ cipher.init(Cipher.DECRYPT_MODE, key_spec, iv);
+
+ // 使用BASE64对密文进行解码
+ byte[] encrypted = Base64.decodeBase64(text);
+
+ // 解密
+ original = cipher.doFinal(encrypted);
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new AesException(AesException.DecryptAESError);
+ }
+
+ String xmlContent, from_receiveid;
+ try {
+ // 去除补位字符
+ byte[] bytes = PKCS7Encoder.decode(original);
+
+ // 分离16位随机字符串,网络字节序和receiveid
+ byte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20);
+
+ int xmlLength = recoverNetworkBytesOrder(networkOrder);
+
+ xmlContent = new String(Arrays.copyOfRange(bytes, 20, 20 + xmlLength), CHARSET);
+ from_receiveid = new String(Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length),
+ CHARSET);
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new AesException(AesException.IllegalBuffer);
+ }
+
+ // receiveid不相同的情况
+ if (!from_receiveid.equals(receiveid)) {
+ throw new AesException(AesException.ValidateCorpidError);
+ }
+ return xmlContent;
+
+ }
+
+ /**
+ * 将企业微信回复用户的消息加密打包.
+ *
+ * - 对要发送的消息进行AES-CBC加密
+ * - 生成安全签名
+ * - 将消息密文和安全签名打包成xml格式
+ *
+ *
+ * @param replyMsg 企业微信待回复用户的消息,xml格式的字符串
+ * @param timeStamp 时间戳,可以自己生成,也可以用URL参数的timestamp
+ * @param nonce 随机串,可以自己生成,也可以用URL参数的nonce
+ *
+ * @return 加密后的可以直接回复用户的密文,包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串
+ * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
+ */
+ public String EncryptMsg(String replyMsg, String timeStamp, String nonce) throws AesException {
+ // 加密
+ String encrypt = encrypt(getRandomStr(), replyMsg);
+
+ // 生成安全签名
+ if (timeStamp == "") {
+ timeStamp = Long.toString(System.currentTimeMillis());
+ }
+
+ String signature = SHA1.getSHA1(token, timeStamp, nonce, encrypt);
+
+ // System.out.println("发送给平台的签名是: " + signature[1].toString());
+ // 生成发送的xml
+ String result = XMLParse.generate(encrypt, signature, timeStamp, nonce);
+ return result;
+ }
+
+ /**
+ * 检验消息的真实性,并且获取解密后的明文.
+ *
+ * - 利用收到的密文生成安全签名,进行签名验证
+ * - 若验证通过,则提取xml中的加密消息
+ * - 对消息进行解密
+ *
+ *
+ * @param msgSignature 签名串,对应URL参数的msg_signature
+ * @param timeStamp 时间戳,对应URL参数的timestamp
+ * @param nonce 随机串,对应URL参数的nonce
+ * @param postData 密文,对应POST请求的数据
+ *
+ * @return 解密后的原文
+ * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
+ */
+ public String DecryptMsg(String msgSignature, String timeStamp, String nonce, String postData)
+ throws AesException {
+
+ // 密钥,公众账号的app secret
+ // 提取密文
+ Object[] encrypt = XMLParse.extract(postData);
+
+ // 验证安全签名
+ String signature = SHA1.getSHA1(token, timeStamp, nonce, encrypt[1].toString());
+
+ // 和URL中的签名比较是否相等
+ // System.out.println("第三方收到URL中的签名:" + msg_sign);
+ // System.out.println("第三方校验签名:" + signature);
+ if (!signature.equals(msgSignature)) {
+ throw new AesException(AesException.ValidateSignatureError);
+ }
+
+ // 解密
+ String result = decrypt(encrypt[1].toString());
+ return result;
+ }
+
+ /**
+ * 验证URL
+ * @param msgSignature 签名串,对应URL参数的msg_signature
+ * @param timeStamp 时间戳,对应URL参数的timestamp
+ * @param nonce 随机串,对应URL参数的nonce
+ * @param echoStr 随机串,对应URL参数的echostr
+ *
+ * @return 解密之后的echostr
+ * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
+ */
+ public String VerifyURL(String msgSignature, String timeStamp, String nonce, String echoStr)
+ throws AesException {
+ String signature = SHA1.getSHA1(token, timeStamp, nonce, echoStr);
+
+ if (!signature.equals(msgSignature)) {
+ throw new AesException(AesException.ValidateSignatureError);
+ }
+
+ String result = decrypt(echoStr);
+ return result;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/XMLParse.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/XMLParse.java
new file mode 100644
index 00000000..895915bf
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/XMLParse.java
@@ -0,0 +1,104 @@
+/**
+ * 对企业微信发送给企业后台的消息加解密示例代码.
+ *
+ * @copyright Copyright (c) 1998-2014 Tencent Inc.
+ */
+
+// ------------------------------------------------------------------------
+
+package com.dreamchaser.depository_manage.config.QyWxJMJM.com.qq.weixin.mp.aes;
+
+import java.io.StringReader;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+
+/**
+ * XMLParse class
+ *
+ * 提供提取消息格式中的密文及生成回复消息格式的接口.
+ */
+class XMLParse {
+
+ /**
+ * 提取出xml数据包中的加密消息
+ * @param xmltext 待提取的xml字符串
+ * @return 提取出的加密消息字符串
+ * @throws AesException
+ */
+ public static Object[] extract(String xmltext) throws AesException {
+ Object[] result = new Object[3];
+ try {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+
+ String FEATURE = null;
+ // This is the PRIMARY defense. If DTDs (doctypes) are disallowed, almost all XML entity attacks are prevented
+ // Xerces 2 only - http://xerces.apache.org/xerces2-j/features.html#disallow-doctype-decl
+ FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";
+ dbf.setFeature(FEATURE, true);
+
+ // If you can't completely disable DTDs, then at least do the following:
+ // Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-general-entities
+ // Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-general-entities
+ // JDK7+ - http://xml.org/sax/features/external-general-entities
+ FEATURE = "http://xml.org/sax/features/external-general-entities";
+ dbf.setFeature(FEATURE, false);
+
+ // Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-parameter-entities
+ // Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-parameter-entities
+ // JDK7+ - http://xml.org/sax/features/external-parameter-entities
+ FEATURE = "http://xml.org/sax/features/external-parameter-entities";
+ dbf.setFeature(FEATURE, false);
+
+ // Disable external DTDs as well
+ FEATURE = "http://apache.org/xml/features/nonvalidating/load-external-dtd";
+ dbf.setFeature(FEATURE, false);
+
+ // and these as well, per Timothy Morgan's 2014 paper: "XML Schema, DTD, and Entity Attacks"
+ dbf.setXIncludeAware(false);
+ dbf.setExpandEntityReferences(false);
+
+ // And, per Timothy Morgan: "If for some reason support for inline DOCTYPEs are a requirement, then
+ // ensure the entity settings are disabled (as shown above) and beware that SSRF attacks
+ // (http://cwe.mitre.org/data/definitions/918.html) and denial
+ // of service attacks (such as billion laughs or decompression bombs via "jar:") are a risk."
+
+ // remaining parser logic
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ StringReader sr = new StringReader(xmltext);
+ InputSource is = new InputSource(sr);
+ Document document = db.parse(is);
+
+ Element root = document.getDocumentElement();
+ NodeList nodelist1 = root.getElementsByTagName("Encrypt");
+ result[0] = 0;
+ result[1] = nodelist1.item(0).getTextContent();
+ return result;
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new AesException(AesException.ParseXmlError);
+ }
+ }
+
+ /**
+ * 生成xml消息
+ * @param encrypt 加密后的消息密文
+ * @param signature 安全签名
+ * @param timestamp 时间戳
+ * @param nonce 随机字符串
+ * @return 生成的xml字符串
+ */
+ public static String generate(String encrypt, String signature, String timestamp, String nonce) {
+
+ String format = "\n" + "\n"
+ + "\n"
+ + "%3$s\n" + "\n" + "";
+ return String.format(format, encrypt, signature, timestamp, nonce);
+
+ }
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/BaseMessage.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/BaseMessage.java
new file mode 100644
index 00000000..5c07906e
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/BaseMessage.java
@@ -0,0 +1,27 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+import lombok.Data;
+
+/**
+ * 消息基类(企业号 -> 普通用户)
+ *
+ */
+@Data
+public class BaseMessage {
+ // 否 成员ID列表(消息接收者,多个接收者用'|'分隔,最多支持1000个)。特殊情况:指定为@all,则向该企业应用的全部成员发送
+ private String touser;
+ // 否 部门ID列表,多个接收者用'|'分隔,最多支持100个。当touser为@all时忽略本参数
+ private String toparty;
+ // 否 标签ID列表,多个接收者用'|'分隔,最多支持100个。当touser为@all时忽略本参数
+ private String totag;
+ // 是 消息类型
+ private String msgtype;
+ // 是 企业应用的id,整型。可在应用的设置页面查看
+ private int agentid;
+ // 否 表示是否开启id转译,0表示否,1表示是,默认0
+ private int enable_id_trans;
+ // 否 表示是否开启重复消息检查,0表示否,1表示是,默认0
+ private int enable_duplicate_check;
+ // 否 表示是否重复消息检查的时间间隔,默认1800s,最大不超过4小时
+ private int duplicate_check_interval;
+}
\ No newline at end of file
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/ButtonInteraction.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/ButtonInteraction.java
new file mode 100644
index 00000000..2103dc52
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/ButtonInteraction.java
@@ -0,0 +1,15 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+import lombok.Data;
+
+/**
+ * 按钮交互性
+ *
+ */
+@Data
+public class ButtonInteraction extends BaseMessage {
+ // 模板卡片
+ private TemplateCard_button_interaction template_card;
+ // 否 表示是否是保密消息,0表示否,1表示是,默认0
+ private int safe;
+}
\ No newline at end of file
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/MessageByMarkDown.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/MessageByMarkDown.java
new file mode 100644
index 00000000..d7327538
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/MessageByMarkDown.java
@@ -0,0 +1,8 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+import lombok.Data;
+
+@Data
+public class MessageByMarkDown extends BaseMessage {
+ private Object markdown;
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_action.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_action.java
new file mode 100644
index 00000000..a065a793
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_action.java
@@ -0,0 +1,18 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+import lombok.Data;
+
+/**
+ * 操作
+ */
+@Data
+public class TemplateCard_action {
+ /**
+ * 操作的描述文案
+ */
+ private String text;
+ /**
+ * 操作key值,用户点击后,会产生回调事件将本参数作为EventKey返回,回调事件会带上该key值,最长支持1024字节,不可重复
+ */
+ private String key;
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_action_menu.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_action_menu.java
new file mode 100644
index 00000000..6bac8c58
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_action_menu.java
@@ -0,0 +1,25 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+import lombok.Data;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 卡片右上角更多操作按钮
+ */
+@XmlRootElement
+@Data
+public class TemplateCard_action_menu {
+ /**
+ * 更多操作界面的描述
+ */
+ private String desc;
+
+ /**
+ * 操作列表,列表长度取值范围为 [1, 3]
+ */
+ private List action_list;
+
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_button.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_button.java
new file mode 100644
index 00000000..4328c2ec
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_button.java
@@ -0,0 +1,33 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+import lombok.Data;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * 按钮
+ */
+@XmlRootElement
+@Data
+public class TemplateCard_button {
+ /**
+ * 按钮点击事件类型,0 或不填代表回调点击事件,1 代表跳转url
+ */
+ private Integer type;
+ /**
+ * 按钮文案,建议不超过10个字
+ */
+ private String text;
+ /**
+ * 按钮样式,目前可填1~4,不填或错填默认1
+ */
+ private Integer style;
+ /**
+ * 按钮key值,用户点击后,会产生回调事件将本参数作为EventKey返回,回调事件会带上该key值,最长支持1024字节,不可重复,button_list.type是0时必填
+ */
+ private String key;
+ /**
+ * 跳转事件的url,button_list.type是1时必填
+ */
+ private String url;
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_button_interaction.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_button_interaction.java
new file mode 100644
index 00000000..d183f3d2
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_button_interaction.java
@@ -0,0 +1,74 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+import lombok.Data;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import java.util.List;
+
+/**
+ * 卡片模板--按钮交互型
+ *
+ */
+@XmlRootElement
+@Data
+public class TemplateCard_button_interaction {
+ /**
+ * 模板卡片类型,投票选择型卡片填写"vote_interaction"
+ */
+
+ private String card_type;
+ /**
+ * 卡片来源样式信息,不需要来源样式可不填写
+ */
+ private TemplateCard_source source;
+
+ /**
+ * 卡片右上角更多操作按钮
+ */
+ private TemplateCard_action_menu action_menu;
+
+ /**
+ * 一级标题
+ */
+ private TemplateCard_main_title main_title;
+
+ /**
+ * 引用文献样式
+ */
+ private Template_quote_area quote_area;
+
+ /**
+ * 二级普通文本,建议不超过160个字,(支持id转译)
+ */
+ private String sub_title_text;
+
+
+ /**
+ * 二级标题+文本列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过6
+ */
+ private List horizontal_content_list;
+
+
+ /**
+ * 整体卡片的点击跳转事件
+ */
+ private TemplateCard_card_action card_action;
+
+ /**
+ * 任务id,同一个应用任务id不能重复,只能由数字、字母和“_-@”组成,最长128字节
+ */
+ private String task_id;
+
+
+ /**
+ * 下拉式的选择器
+ */
+ private TemplateCard_button_selection button_selection;
+
+ /**
+ * 按钮列表,列表长度不超过6
+ */
+ private List button_list;
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_button_selection.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_button_selection.java
new file mode 100644
index 00000000..9ca0f2dc
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_button_selection.java
@@ -0,0 +1,28 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+import lombok.Data;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import java.util.List;
+
+/**
+ * 下拉式的选择器
+ */
+@XmlRootElement
+@Data
+public class TemplateCard_button_selection {
+ /**
+ * 下拉式的选择器的key,用户提交选项后,会产生回调事件,回调事件会带上该key值表示该题,最长支持1024字节
+ */
+ private String question_key;
+
+ /**
+ * 下拉式的选择器左边的标题
+ */
+ private String title;
+
+ /**
+ * 选项列表,下拉选项不超过 10 个,最少1个
+ */
+ private List option_list;
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_button_selection_option.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_button_selection_option.java
new file mode 100644
index 00000000..f70f1303
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_button_selection_option.java
@@ -0,0 +1,18 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+import lombok.Data;
+
+/**
+ * 下拉选项
+ */
+@Data
+public class TemplateCard_button_selection_option {
+ /**
+ * 下拉式的选择器选项的id,用户提交后,会产生回调事件,回调事件会带上该id值表示该选项,最长支持128字节,不可重复
+ */
+ private String id;
+ /**
+ * 下拉式的选择器选项的文案,建议不超过16个字
+ */
+ private String text;
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_card_action.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_card_action.java
new file mode 100644
index 00000000..df105c1b
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_card_action.java
@@ -0,0 +1,33 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+import lombok.Data;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+
+/**
+ * 整体卡片的点击跳转事件
+ */
+@XmlRootElement
+@Data
+public class TemplateCard_card_action {
+ /**
+ * 跳转事件类型,0或不填代表不是链接,1 代表跳转url,2 代表打开小程序
+ */
+ private Integer type;
+
+ /**
+ * 跳转事件的url,card_action.type是1时必填
+ */
+ private String url;
+
+ /**
+ * 跳转事件的小程序的appid,必须是与当前应用关联的小程序,card_action.type是2时必填
+ */
+ private Integer appid;
+
+ /**
+ * 跳转事件的小程序的pagepath,card_action.type是2时选填
+ */
+ private String pagepath;
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_emphasis_content.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_emphasis_content.java
new file mode 100644
index 00000000..519287f3
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_emphasis_content.java
@@ -0,0 +1,18 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+import lombok.Data;
+
+/**
+ * 关键数据样式
+ */
+@Data
+public class TemplateCard_emphasis_content {
+ /**
+ * 关键数据样式的数据内容,建议不超过14个字
+ */
+ private String title;
+ /**
+ * 关键数据样式的数据描述内容,建议不超过22个字
+ */
+ private String desc;
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_horizontal_content.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_horizontal_content.java
new file mode 100644
index 00000000..bd2593fb
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_horizontal_content.java
@@ -0,0 +1,46 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+import lombok.Data;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * 二级标题+文本列表
+ */
+@XmlRootElement
+@Data
+public class TemplateCard_horizontal_content {
+ /**
+ * 链接类型,0或不填代表不是链接,1 代表跳转url,2 代表下载附件,3 代表点击跳转成员详情
+ */
+ private Integer type;
+
+ /**
+ * 二级标题,建议不超过5个字
+ */
+ private String keyname;
+
+ /**
+ * 二级文本,如果horizontal_content_list.type是2,该字段代表文件名称(要包含文件类型),建议不超过30个字,(支持id转译)
+ */
+ private String value;
+
+ /**
+ * 链接跳转的url,horizontal_content_list.type是1时必填
+ */
+ private String url;
+
+ /**
+ * 附件的media_id,horizontal_content_list.type是2时必填
+ */
+ private Integer media_id;
+
+
+ /**
+ * 成员详情的userid,horizontal_content_list.type是3时必填
+ */
+ private String userid;
+
+
+
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_jump.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_jump.java
new file mode 100644
index 00000000..5f580d91
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_jump.java
@@ -0,0 +1,30 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+import lombok.Data;
+
+/**
+ * 跳转指引样式
+ */
+@Data
+public class TemplateCard_jump {
+ /**
+ * 跳转链接样式的文案内容,建议不超过18个字
+ */
+ private String title;
+ /**
+ * 跳转链接类型,0或不填代表不是链接,1 代表跳转url,2 代表跳转小程序
+ */
+ private String type;
+ /**
+ * 跳转链接的url,jump_list.type是1时必填
+ */
+ private String url;
+ /**
+ * 跳转链接的小程序的appid,必须是与当前应用关联的小程序,jump_list.type是2时必填
+ */
+ private String appid;
+ /**
+ * 跳转链接的小程序的pagepath,jump_list.type是2时选填
+ */
+ private String pagepath;
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_main_title.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_main_title.java
new file mode 100644
index 00000000..19ec6848
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_main_title.java
@@ -0,0 +1,24 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+import lombok.Data;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+
+/**
+ * 一级标题
+ */
+@XmlRootElement
+@Data
+public class TemplateCard_main_title {
+ /**
+ * 一级标题,建议不超过36个字,(支持id转译)
+ */
+ private String title;
+ /**
+ * 标题辅助信息,建议不超过44个字,(支持id转译)
+ */
+ private String desc;
+
+
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_source.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_source.java
new file mode 100644
index 00000000..f40e7fda
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_source.java
@@ -0,0 +1,28 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+import lombok.Data;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+/*
+卡片来源样式信息
+ */
+@XmlRootElement
+@Data
+public class TemplateCard_source {
+ /**
+ * 来源图片的url,来源图片的尺寸建议为72*72
+ */
+ private String icon_url;
+
+ /**
+ * 来源图片的描述,建议不超过20个字,(支持id转译)
+ */
+ private String desc;
+
+ /**
+ * 来源文字的颜色,目前支持:0(默认) 灰色,1 黑色,2 红色,3 绿色
+ */
+ private Integer desc_color;
+
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_text_notice.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_text_notice.java
new file mode 100644
index 00000000..0bcc5ae8
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_text_notice.java
@@ -0,0 +1,74 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+
+import lombok.Data;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import java.util.List;
+
+/**
+ * 卡片模板--文本通知型
+ */
+@XmlRootElement
+@Data
+public class TemplateCard_text_notice {
+ /**
+ * 模板卡片类型,投票选择型卡片填写"vote_interaction"
+ */
+
+ private String card_type;
+ /**
+ * 卡片来源样式信息,不需要来源样式可不填写
+ */
+ private TemplateCard_source source;
+
+ /**
+ * 卡片右上角更多操作按钮
+ */
+ private TemplateCard_action_menu action_menu;
+
+ /**
+ * 一级标题
+ */
+ private TemplateCard_main_title main_title;
+
+ /**
+ * 引用文献样式
+ */
+ private Template_quote_area quote_area;
+
+ /**
+ * 关键数据样式
+ */
+ private TemplateCard_emphasis_content emphasis_content;
+
+ /**
+ * 二级普通文本,建议不超过160个字,(支持id转译)
+ */
+ private String sub_title_text;
+
+
+ /**
+ * 二级标题+文本列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过6
+ */
+ private List horizontal_content_list;
+
+ /**
+ * 跳转指引样式的列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过3
+ */
+ private List jump_list;
+
+
+ /**
+ * 整体卡片的点击跳转事件
+ */
+ private TemplateCard_card_action card_action;
+
+ /**
+ * 任务id,同一个应用任务id不能重复,只能由数字、字母和“_-@”组成,最长128字节
+ */
+ private String task_id;
+
+
+
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/Template_quote_area.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/Template_quote_area.java
new file mode 100644
index 00000000..b5824abb
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/Template_quote_area.java
@@ -0,0 +1,37 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+import lombok.Data;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * 引用文献样式
+ */
+@XmlRootElement
+@Data
+public class Template_quote_area {
+ /**
+ * 引用文献样式区域点击事件,0或不填代表没有点击事件,1 代表跳转url,2 代表跳转小程序
+ */
+ private Integer type;
+ /**
+ * 点击跳转的url,quote_area.type是1时必填
+ */
+ private String url;
+ /**
+ * 点击跳转的小程序的appid,必须是与当前应用关联的小程序,quote_area.type是2时必填
+ */
+ private Integer appid;
+ /**
+ * 点击跳转的小程序的pagepath,quote_area.type是2时选填
+ */
+ private String pagepath;
+ /**
+ * 引用文献样式的标题
+ */
+ private String title;
+ /**
+ * 引用文献样式的引用文案
+ */
+ private String quote_text;
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TextNotice.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TextNotice.java
new file mode 100644
index 00000000..b0cdbac7
--- /dev/null
+++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TextNotice.java
@@ -0,0 +1,16 @@
+package com.dreamchaser.depository_manage.config.QyWx_template_card;
+
+
+import lombok.Data;
+
+/**
+ * 文本通知型
+ */
+
+@Data
+public class TextNotice extends BaseMessage{
+ // 模板卡片
+ private TemplateCard_text_notice template_card;
+ // 否 表示是否是保密消息,0表示否,1表示是,默认0
+ private int safe;
+}
diff --git a/src/main/java/com/dreamchaser/depository_manage/config/WebMvcConfig.java b/src/main/java/com/dreamchaser/depository_manage/config/WebMvcConfig.java
index a1f59091..e5b754e4 100644
--- a/src/main/java/com/dreamchaser/depository_manage/config/WebMvcConfig.java
+++ b/src/main/java/com/dreamchaser/depository_manage/config/WebMvcConfig.java
@@ -5,6 +5,9 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import java.util.Arrays;
+import java.util.List;
+
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@@ -12,11 +15,13 @@ public class WebMvcConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new UserInterceptor())
.addPathPatterns("/**")
- .excludePathPatterns("/login", "/register", "/sendCode", "/error")
+ .excludePathPatterns("/login", "/register", "/sendCode", "/error","/QyWxLogin","/callback")
.excludePathPatterns("/static/**");
}
+
+
}
diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/CompanyController.java b/src/main/java/com/dreamchaser/depository_manage/controller/CompanyController.java
index 5efbcb3b..46dd18e4 100644
--- a/src/main/java/com/dreamchaser/depository_manage/controller/CompanyController.java
+++ b/src/main/java/com/dreamchaser/depository_manage/controller/CompanyController.java
@@ -18,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
+import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
@@ -43,7 +44,8 @@ public class CompanyController {
* @return
*/
@PostMapping("/allCompanyByParent")
- public RestResponse findCompanyByNoParent(@RequestParam Mapmap){
+ public RestResponse findCompanyByNoParent(@RequestParam Mapmap, HttpServletRequest request){
+ UserByPort userToken = (UserByPort) request.getAttribute("userToken");
String url = PortConfig.external_url +"/org/govlist";
Object page = map.get("page");
Object pagesize = map.get("pagesize");
@@ -59,7 +61,7 @@ public class CompanyController {
JSONObject paramObject = JSONObject.parseObject(jsonString);
String post = null;
try {
- post = HttpUtils.send(url,paramObject, HTTP.UTF_8);
+ post = HttpUtils.send(url,paramObject, HTTP.UTF_8,userToken);
} catch (IOException e) {
e.printStackTrace();
}
@@ -85,7 +87,8 @@ public class CompanyController {
* @return
*/
@PostMapping("/companyByCondition")
- public RestResponse findcompanyByCondition(@RequestParam Map map){
+ public RestResponse findcompanyByCondition(@RequestParam Map map,HttpServletRequest request){
+ UserByPort userByPort = (UserByPort)request.getAttribute("userToken");
String url = PortConfig.external_url + "/org/govlist";
if(map.containsKey("state")){
Object state = map.get("state");
@@ -99,7 +102,7 @@ public class CompanyController {
JSONObject paramObject = JSONObject.parseObject(jsonString);
String post = null;
try {
- post = HttpUtils.send(url,paramObject, HTTP.UTF_8);
+ post = HttpUtils.send(url,paramObject, HTTP.UTF_8,userByPort);
} catch (IOException e) {
e.printStackTrace();
}
@@ -125,7 +128,8 @@ public class CompanyController {
* @return
*/
@PostMapping("/allPostByOrganization")
- public RestResponse allPostByParent(@RequestParam Map map) {
+ public RestResponse allPostByParent(@RequestParam Map map,HttpServletRequest request) {
+ UserByPort userByPort = (UserByPort)request.getAttribute("userToken");
String url = PortConfig.external_url + "/org/positionlist";
Object page = map.get("page");
Object pagesize = map.get("pagesize");
@@ -135,7 +139,7 @@ public class CompanyController {
JSONObject paramObject = JSONObject.parseObject(jsonString);
String post = null;
try {
- post = HttpUtils.send(url,paramObject, HTTP.UTF_8);
+ post = HttpUtils.send(url,paramObject, HTTP.UTF_8,userByPort);
} catch (IOException e) {
e.printStackTrace();
}
@@ -178,10 +182,11 @@ public class CompanyController {
}
@PostMapping("/post_role")
- public RestResponse addUser(@RequestBody Map map) {
+ public RestResponse addUser(@RequestBody Map map,HttpServletRequest request) {
+ UserByPort userToken = (UserByPort) request.getAttribute("userToken");
Map userParam = new HashMap<>();
userParam.put("position",ObjectFormatUtil.toInteger(map.get("userid")));
- List userByPortList = PageController.FindUserByMap(userParam);
+ List userByPortList = PageController.FindUserByMap(userParam,userToken);
Integer success = 0;
if(map.containsKey("depositoryId")) {
for (int i = 0; i < userByPortList.size(); i++) {
@@ -289,11 +294,12 @@ public class CompanyController {
}
@GetMapping("/findPostRole")
- public RestResponse findPostRole(@RequestParam("postId") Integer postId){
+ public RestResponse findPostRole(@RequestParam("postId") Integer postId,HttpServletRequest request){
+ UserByPort userToken = (UserByPort) request.getAttribute("userToken");
Map userParam = new HashMap<>();
userParam.put("position",postId);
- List userByPortList = PageController.FindUserByMap(userParam);
- Post postById = PageController.findPostById(postId);
+ List userByPortList = PageController.FindUserByMap(userParam,userToken);
+ Post postById = PageController.findPostById(postId,userToken);
List roleAndDepositoryByCondition = new ArrayList<>();
if(userByPortList.size() != 0){
Map param = new HashMap<>();
diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java b/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java
index 57f37ecc..e3fcbac7 100644
--- a/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java
+++ b/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java
@@ -73,6 +73,7 @@ public class DepositoryController {
return map;
}
+
/**
* 获取上周一到本周一的日期
*
@@ -214,22 +215,6 @@ public class DepositoryController {
Double warehouserCount1 = aDouble - depositoryRecordByDateByIn1 + depositoryRecordByDateByOut1;
result.add(warehouserCount1);
}
- /* for (i = days.size() - 1; i > 0; i--) {
- Calendar calendar = Calendar.getInstance();
- calendar.add(Calendar.DATE,1);
- String format = formatter.format(calendar.getTime()) + " 00:00:00";
- if(Long.compare(days.get(i - 1),DateUtil.DateTimeToTimeStamp(format)) == 0){
- continue;
- }
- Integer val = (Integer) depositoryAllNameAndId.get(key);
- // 获取一段时间内的入库额度
- //测试
- Double depositoryRecordByDateByIn1 = depositoryRecordService.findApplicationInRecordByDate(days.get(i - 1), days.get(i), val);
- // 获取一段时间内的入库额度
- Double depositoryRecordByDateByOut1 = depositoryRecordService.findApplicationOutRecordByDate(days.get(i - 1), days.get(i), val);
- Double warehouserCount1 = result.get(j++) - depositoryRecordByDateByIn1 + depositoryRecordByDateByOut1;
- result.add(warehouserCount1);
- }*/
Collections.reverse(result);
map.put(key.toString(), ((ArrayList) result).clone());
result.clear();
@@ -245,8 +230,12 @@ public class DepositoryController {
* @param depositoryRecordService
* @return
*/
- public static List