Browse Source

完成企业微信无感登录、完成消息推送功能

lwx_dev
erdanergou 3 years ago
parent
commit
357db56f99
  1. 4
      .idea/encodings.xml
  2. 27
      pom.xml
  3. 78
      src/main/java/com/dreamchaser/depository_manage/config/JM_3DES.java
  4. 47
      src/main/java/com/dreamchaser/depository_manage/config/PortConfig.java
  5. 77
      src/main/java/com/dreamchaser/depository_manage/config/QyWxConfig.java
  6. 61
      src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/AesException.java
  7. 26
      src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/ByteGroup.java
  8. 67
      src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/PKCS7Encoder.java
  9. 61
      src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/SHA1.java
  10. 289
      src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/WXBizMsgCrypt.java
  11. 104
      src/main/java/com/dreamchaser/depository_manage/config/QyWxJMJM/com/qq/weixin/mp/aes/XMLParse.java
  12. 27
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/BaseMessage.java
  13. 15
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/ButtonInteraction.java
  14. 8
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/MessageByMarkDown.java
  15. 18
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_action.java
  16. 25
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_action_menu.java
  17. 33
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_button.java
  18. 74
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_button_interaction.java
  19. 28
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_button_selection.java
  20. 18
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_button_selection_option.java
  21. 33
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_card_action.java
  22. 18
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_emphasis_content.java
  23. 46
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_horizontal_content.java
  24. 30
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_jump.java
  25. 24
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_main_title.java
  26. 28
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_source.java
  27. 74
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TemplateCard_text_notice.java
  28. 37
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/Template_quote_area.java
  29. 16
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/TextNotice.java
  30. 7
      src/main/java/com/dreamchaser/depository_manage/config/WebMvcConfig.java
  31. 28
      src/main/java/com/dreamchaser/depository_manage/controller/CompanyController.java
  32. 141
      src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java
  33. 160
      src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java
  34. 20
      src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java
  35. 349
      src/main/java/com/dreamchaser/depository_manage/controller/PageController.java
  36. 276
      src/main/java/com/dreamchaser/depository_manage/controller/QyWxOperationController.java
  37. 56
      src/main/java/com/dreamchaser/depository_manage/controller/UserController.java
  38. 2
      src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecord.java
  39. 17
      src/main/java/com/dreamchaser/depository_manage/entity/CallBackLog.java
  40. 18
      src/main/java/com/dreamchaser/depository_manage/entity/UserByPort.java
  41. 53
      src/main/java/com/dreamchaser/depository_manage/intercepter/UserInterceptor.java
  42. 28
      src/main/java/com/dreamchaser/depository_manage/mapper/CallBackLogMapper.java
  43. 35
      src/main/java/com/dreamchaser/depository_manage/mapper/CallBackLogMapper.xml
  44. 10
      src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.xml
  45. 102
      src/main/java/com/dreamchaser/depository_manage/pojo/ApplicationOutRecordMinP.java
  46. 2
      src/main/java/com/dreamchaser/depository_manage/pojo/ApplicationOutRecordP.java
  47. 6
      src/main/java/com/dreamchaser/depository_manage/pojo/UserByPortP.java
  48. 29
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/CallBackBaseXml.java
  49. 22
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/CallBackXMl_DLWZ.java
  50. 15
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/CallBackXml_button.java
  51. 16
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/ButtonInteraction.java
  52. 73
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard.java
  53. 16
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_SelectedItems.java
  54. 18
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_action.java
  55. 27
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_action_menu.java
  56. 34
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_button.java
  57. 40
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_button_selection.java
  58. 23
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_button_selection_option.java
  59. 34
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_card_action.java
  60. 47
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_horizontal_content.java
  61. 27
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_main_title.java
  62. 31
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_source.java
  63. 38
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/Template_quote_area.java
  64. 2
      src/main/java/com/dreamchaser/depository_manage/security/pool/AuthenticationTokenPool.java
  65. 33
      src/main/java/com/dreamchaser/depository_manage/security/pool/UserKeyAndTokenPool.java
  66. 21
      src/main/java/com/dreamchaser/depository_manage/service/CallBackLogService.java
  67. 23
      src/main/java/com/dreamchaser/depository_manage/service/DepositoryRecordService.java
  68. 11
      src/main/java/com/dreamchaser/depository_manage/service/DepositoryService.java
  69. 35
      src/main/java/com/dreamchaser/depository_manage/service/impl/CallBackLogServiceImpl.java
  70. 342
      src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java
  71. 48
      src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryServiceImpl.java
  72. 31
      src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java
  73. 497
      src/main/java/com/dreamchaser/depository_manage/service/impl/QyWxOperationService.java
  74. 30
      src/main/java/com/dreamchaser/depository_manage/utils/HttpUtils.java
  75. 117
      src/main/java/com/dreamchaser/depository_manage/utils/QyWxXMLUtils.java
  76. 7
      src/main/resources/application-test.yml
  77. 1
      src/main/resources/static/api/init.json
  78. 1
      src/main/resources/static/api/init_checker.json
  79. 1
      src/main/resources/static/api/init_reviewer.json
  80. 1
      src/main/resources/static/api/init_user.json
  81. 18
      src/main/resources/static/api/table-in.json
  82. 18
      src/main/resources/static/api/table-out.json
  83. 96
      src/main/resources/static/api/tableSelect.json
  84. 1
      src/main/resources/static/api/test.json
  85. 9
      src/main/resources/static/css/layuimini.css
  86. 8
      src/main/resources/static/css/public.css
  87. BIN
      src/main/resources/static/images/logo_back.ico
  88. 10027
      src/main/resources/static/js/ZXing.js
  89. 401
      src/main/resources/static/js/jsQR.js
  90. 3
      src/main/resources/static/js/lay-module/cardTable/cardTable.css
  91. 14
      src/main/resources/static/js/lay-module/cardTable/cardTable.js
  92. 15834
      src/main/resources/static/js/lay-module/echarts/echarts.js
  93. 3
      src/main/resources/static/js/lay-module/layarea/layarea.js
  94. 14
      src/main/resources/static/js/lay-module/layuimini/miniMenu.js
  95. 6
      src/main/resources/static/js/lay-module/layuimini/miniTab.js
  96. 4
      src/main/resources/static/js/lay-module/tableSelect/tableSelect.js
  97. 81
      src/main/resources/static/js/lay-module/wangEditor/wangEditor.css
  98. 74
      src/main/resources/static/js/lay-module/wangEditor/wangEditor.js
  99. 609
      src/main/resources/static/js/lay-module/wangEditor/wangEditor.min.js.map
  100. 89
      src/main/resources/static/js/scan/webqr.js

4
.idea/encodings.xml

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<component name="Encoding" native2AsciiForPropertiesFiles="true" defaultCharsetForPropertiesFiles="UTF-8">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources/templates/pages/scanQrCode/scanQrCode2.html" charset="UTF-8" />
<file url="PROJECT" charset="UTF-8" />
</component>
</project>

27
pom.xml

@ -195,9 +195,36 @@
<version>3.4.0</version>
</dependency>
<!-- 用于检测访问设备类型-->
<dependency>
<groupId>org.springframework.mobile</groupId>
<artifactId>spring-mobile-starter</artifactId>
<version>2.0.0.M2</version>
</dependency>
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.8.8</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<dependencyManagement>
<dependencies>
<dependency>

78
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;
}
}

47
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<UserByPort> findDepartmentHeadByUser(Administration administration){
public static List<UserByPort> findDepartmentHeadByUser(Administration administration, UserByPort userToken){
String url = PortConfig.external_url + "/org/positionlist";
Integer maindeparment = administration.getId();
Map<String,Object> 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<String,Object> param = new HashMap<>();
Post userPost = userPostList.get(i);
param.put("position",userPost.getId());
List<UserByPort> userByPorts = PageController.FindUserByMap(param);
List<UserByPort> userByPorts = PageController.FindUserByMap(param,userToken);
userByPortList.addAll(userByPorts);
}
return userByPortList;
}
// 通过获取的企业微信UserId获取数据库中的用户以及对应key与token
public static Map<String,Object> findUserByQyWxUserId(String userId){
String url = external_url +"/staff/wechat_give_uscont";
Map<String,Object> result = new HashMap<>();
Map<String,Object> 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<String,String> 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();
}
}
}

77
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;
}
}

61
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;
}
}

26
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<Byte> byteContainer = new ArrayList<Byte>();
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();
}
}

67
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;
}
}

61
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);
}
}
}

289
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编码的字符串).
* <ol>
* <li>第三方回复加密消息给企业微信</li>
* <li>第三方收到企业微信发送的消息验证消息的安全性并对消息进行解密</li>
* </ol>
* 说明异常java.security.InvalidKeyException:illegal Key Size的解决方案
* <ol>
* <li>在官方网站下载JCE无限制权限策略文件JDK7的下载地址
* http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html</li>
* <li>下载后解压可以看到local_policy.jar和US_export_policy.jar以及readme.txt</li>
* <li>如果安装了JRE将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件</li>
* <li>如果安装了JDK将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件</li>
* </ol>
*/
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;
}
/**
* 将企业微信回复用户的消息加密打包.
* <ol>
* <li>对要发送的消息进行AES-CBC加密</li>
* <li>生成安全签名</li>
* <li>将消息密文和安全签名打包成xml格式</li>
* </ol>
*
* @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;
}
/**
* 检验消息的真实性并且获取解密后的明文.
* <ol>
* <li>利用收到的密文生成安全签名进行签名验证</li>
* <li>若验证通过则提取xml中的加密消息</li>
* <li>对消息进行解密</li>
* </ol>
*
* @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;
}
}

104
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 = "<xml>\n" + "<Encrypt><![CDATA[%1$s]]></Encrypt>\n"
+ "<MsgSignature><![CDATA[%2$s]]></MsgSignature>\n"
+ "<TimeStamp>%3$s</TimeStamp>\n" + "<Nonce><![CDATA[%4$s]]></Nonce>\n" + "</xml>";
return String.format(format, encrypt, signature, timestamp, nonce);
}
}

27
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;
}

15
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;
}

8
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;
}

18
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;
}

25
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<TemplateCard_action> action_list;
}

33
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;
/**
* 跳转事件的urlbutton_list.type是1时必填
*/
private String url;
}

74
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<TemplateCard_horizontal_content> 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<TemplateCard_button> button_list;
}

28
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<TemplateCard_button_selection_option> option_list;
}

18
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;
}

33
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 代表跳转url2 代表打开小程序
*/
private Integer type;
/**
* 跳转事件的urlcard_action.type是1时必填
*/
private String url;
/**
* 跳转事件的小程序的appid必须是与当前应用关联的小程序card_action.type是2时必填
*/
private Integer appid;
/**
* 跳转事件的小程序的pagepathcard_action.type是2时选填
*/
private String pagepath;
}

18
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;
}

46
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 代表跳转url2 代表下载附件3 代表点击跳转成员详情
*/
private Integer type;
/**
* 二级标题建议不超过5个字
*/
private String keyname;
/**
* 二级文本如果horizontal_content_list.type是2该字段代表文件名称要包含文件类型建议不超过30个字支持id转译
*/
private String value;
/**
* 链接跳转的urlhorizontal_content_list.type是1时必填
*/
private String url;
/**
* 附件的media_idhorizontal_content_list.type是2时必填
*/
private Integer media_id;
/**
* 成员详情的useridhorizontal_content_list.type是3时必填
*/
private String userid;
}

30
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 代表跳转url2 代表跳转小程序
*/
private String type;
/**
* 跳转链接的urljump_list.type是1时必填
*/
private String url;
/**
* 跳转链接的小程序的appid必须是与当前应用关联的小程序jump_list.type是2时必填
*/
private String appid;
/**
* 跳转链接的小程序的pagepathjump_list.type是2时选填
*/
private String pagepath;
}

24
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;
}

28
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;
}

74
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<TemplateCard_horizontal_content> horizontal_content_list;
/**
* 跳转指引样式的列表该字段可为空数组但有数据的话需确认对应字段是否必填列表长度不超过3
*/
private List<TemplateCard_jump> jump_list;
/**
* 整体卡片的点击跳转事件
*/
private TemplateCard_card_action card_action;
/**
* 任务id同一个应用任务id不能重复只能由数字字母和_-@组成最长128字节
*/
private String task_id;
}

37
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 代表跳转url2 代表跳转小程序
*/
private Integer type;
/**
* 点击跳转的urlquote_area.type是1时必填
*/
private String url;
/**
* 点击跳转的小程序的appid必须是与当前应用关联的小程序quote_area.type是2时必填
*/
private Integer appid;
/**
* 点击跳转的小程序的pagepathquote_area.type是2时选填
*/
private String pagepath;
/**
* 引用文献样式的标题
*/
private String title;
/**
* 引用文献样式的引用文案
*/
private String quote_text;
}

16
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;
}

7
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/**");
}
}

28
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 Map<String,Object>map){
public RestResponse findCompanyByNoParent(@RequestParam Map<String,Object>map, 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<String,Object> map){
public RestResponse findcompanyByCondition(@RequestParam Map<String,Object> 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<String,Object> map) {
public RestResponse allPostByParent(@RequestParam Map<String,Object> 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<String, Object> map) {
public RestResponse addUser(@RequestBody Map<String, Object> map,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
Map<String,Object> userParam = new HashMap<>();
userParam.put("position",ObjectFormatUtil.toInteger(map.get("userid")));
List<UserByPort> userByPortList = PageController.FindUserByMap(userParam);
List<UserByPort> 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<String,Object> userParam = new HashMap<>();
userParam.put("position",postId);
List<UserByPort> userByPortList = PageController.FindUserByMap(userParam);
Post postById = PageController.findPostById(postId);
List<UserByPort> userByPortList = PageController.FindUserByMap(userParam,userToken);
Post postById = PageController.findPostById(postId,userToken);
List<RoleAndDepository> roleAndDepositoryByCondition = new ArrayList<>();
if(userByPortList.size() != 0){
Map<String,Object> param = new HashMap<>();

141
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<Double>) result).clone());
result.clear();
@ -245,8 +230,12 @@ public class DepositoryController {
* @param depositoryRecordService
* @return
*/
public static List<Object> getBeforeInventoryByMonth(DepositoryService depositoryService, DepositoryRecordService depositoryRecordService) {
List<Depository> depositoryAll = depositoryService.findDepositoryAll();
public static List<Object> getBeforeInventoryByMonth(DepositoryService depositoryService, DepositoryRecordService depositoryRecordService,UserByPort userByPort) {
// List<Depository> depositoryAll = depositoryService.findDepositoryAll();
List<Depository> depositoryAll = depositoryService.findDepositoryByAdminorgAndUser(userByPort);
// List<Depository> depositoryAll = depositoryService.findDepositoryByAdminorg(userByPort.getMaindeparment().toString());
// 获取该用户管理的仓库
Map<String, Object> previousMonth = getPreviousMonth();
List<Object> months = (List<Object>) previousMonth.get("months");
List<Object> sourceList = (List<Object>) previousMonth.get("sourceList");
@ -315,7 +304,7 @@ public class DepositoryController {
* @param depositoryRecordService
* @return
*/
public static Map<String, Object> getBeforeInventoryOnMap(DepositoryService depositoryService, DepositoryRecordService depositoryRecordService) {
public static Map<String, Object> getBeforeInventoryOnMap(DepositoryService depositoryService, DepositoryRecordService depositoryRecordService,UserByPort userByPort) {
// 中国地图数据
// ['product', '3月', '4月', '5月', '6月', '7月', '8月'],
// ['电子产品类', 41.1, 30.4, 65.1, 53.3, 83.8, 98.7],
@ -325,7 +314,7 @@ public class DepositoryController {
List<Object> months = (List<Object>) previousMonth.get("months");
List<Object> sourceList = (List<Object>) previousMonth.get("sourceList");
ArrayList<Object> title = new ArrayList<>();
List<Depository> depositoryAll = depositoryService.findDepositoryAll();
List<Depository> depositoryAll = depositoryService.findDepositoryByAdminorgAndUser(userByPort);
title.add("depository");
for (int i = sourceList.size() - 1; i >= 0; i--) {
title.add(((Map<String, Object>) sourceList.get(i)).get("month"));
@ -385,11 +374,12 @@ public class DepositoryController {
* @return
*/
@GetMapping("/warehouseRecord")
public RestResponse findDepositoryRecordByCondition(@RequestParam Map<String, Object> map) {
List<Depository> list = depositoryService.findDepositoryRecordPByCondition(map);
public RestResponse findDepositoryRecordByCondition(@RequestParam Map<String, Object> map,HttpServletRequest request) {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
List<Depository> list = depositoryService.findDepositoryRecordPByCondition(map,userByPort);
for (int i = 0; i < list.size(); i++) {
Depository depository = list.get(i);
Administration company = PageController.getCompany(depository.getCid());
Administration company = PageController.getCompany(depository.getCid(),userByPort);
list.get(i).setCname(company.getName());
}
return new RestResponse(list, depositoryService.findCountByCondition(map), 200);
@ -402,13 +392,14 @@ public class DepositoryController {
* @return
*/
@GetMapping("/allWarehouseByParent")
public RestResponse findDepositoryByNoParent(@RequestParam Map<String, Object> map) {
public RestResponse findDepositoryByNoParent(@RequestParam Map<String, Object> map,HttpServletRequest request) {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
if ("".equals(map.get("parentId")) || map.get("parentId") == null) {
map.put("parentId", 0);
}
List<Depository> list = depositoryService.findDepositoryRecordPByCondition(map);
List<Depository> list = depositoryService.findDepositoryRecordPByCondition(map,userByPort);
// 获取所有行政单位
Map<String, Object> administration = findAdministration();
Map<String, Object> administration = findAdministration(userByPort);
List<AdministrationP> administrationPList = (List<AdministrationP>) administration.get("administrationPList");
Integer total = (Integer) administration.get("total");
for (int i = 0; i < list.size(); i++) {
@ -428,7 +419,7 @@ public class DepositoryController {
*
* @return
*/
public static Map<String, Object> findAdministration() {
public static Map<String, Object> findAdministration(UserByPort userByPort) {
Map<String, Object> map = new HashMap<>();
String url = PortConfig.external_url + "/org/govlist";
String superior = "313";
@ -438,7 +429,7 @@ public class DepositoryController {
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();
}
@ -468,13 +459,14 @@ public class DepositoryController {
* @return
*/
@PostMapping("/realDeleteDepository")
public RestResponse realDeleteDepository(@RequestBody Map<String, Object> map) {
public RestResponse realDeleteDepository(@RequestBody Map<String, Object> map,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
if (map.containsKey("id")) {
Integer id = ObjectFormatUtil.toInteger(map.get("id"));
new Thread(new Runnable() {
@Override
public void run() {
RealDeleteSonDepository(id.toString());
RealDeleteSonDepository(id.toString(),userToken);
}
}).start();
return CrudUtil.deleteHandle(depositoryService.deleteDepositoryRecordById(id), 1);
@ -485,7 +477,7 @@ public class DepositoryController {
new Thread(new Runnable() {
@Override
public void run() {
RealDeleteSonDepository(id);
RealDeleteSonDepository(id,userToken);
}
}).start();
}
@ -500,14 +492,14 @@ public class DepositoryController {
*
* @param parentId
*/
public void RealDeleteSonDepository(String parentId) {
public void RealDeleteSonDepository(String parentId,UserByPort userByPort) {
Map<String, Object> param = new HashMap<>();
param.put("parentId", parentId);
// 获取当前仓库所有子仓库
List<Depository> depositoryRecordPByCondition = depositoryService.findDepositoryRecordPByCondition(param);
List<Depository> depositoryRecordPByCondition = depositoryService.findDepositoryRecordPByCondition(param,userByPort);
for (int i = 0; i < depositoryRecordPByCondition.size(); i++) {
Integer id = depositoryRecordPByCondition.get(i).getId(); // 获取当前仓库id
RealDeleteSonDepository(id.toString()); // 递归查询仓库
RealDeleteSonDepository(id.toString(),userByPort); // 递归查询仓库
depositoryService.deleteDepositoryRecordById(id); // 删除仓库
}
}
@ -519,8 +511,9 @@ public class DepositoryController {
* @return
*/
@PostMapping("/depository")
public RestResponse insertDepository(@RequestBody Map<String, Object> map) {
return CrudUtil.postHandle(depositoryService.insertDepository(map), 1);
public RestResponse insertDepository(@RequestBody Map<String, Object> map,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
return CrudUtil.postHandle(depositoryService.insertDepository(map,userToken), 1);
}
/**
@ -530,14 +523,15 @@ public class DepositoryController {
* @return
*/
@PostMapping("/depository_del")
public RestResponse deleteDepository(@RequestBody Map<String, Object> map) {
public RestResponse deleteDepository(@RequestBody Map<String, Object> map,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
if (map.containsKey("id")) {
Integer id = ObjectFormatUtil.toInteger(map.get("id"));
// UpdateSonState(id.toString(),3,true); 修改为删除状态
new Thread(new Runnable() {
@Override
public void run() {
UpdateSonState(id.toString(), 3, true);
UpdateSonState(id.toString(), 3, true,userToken);
}
}).start();
return CrudUtil.deleteHandle(depositoryService.changeStateToDeletedById(id), 1);
@ -549,7 +543,7 @@ public class DepositoryController {
new Thread(new Runnable() {
@Override
public void run() {
UpdateSonState(id, 3, true);
UpdateSonState(id, 3, true,userToken);
}
}).start();
}
@ -582,7 +576,8 @@ public class DepositoryController {
* @return
*/
@PostMapping("/EditDepositoryState")
public RestResponse EditDepositoryState(@RequestBody Map<String, Object> map) {
public RestResponse EditDepositoryState(@RequestBody Map<String, Object> map,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
if (map.containsKey("state")) {
map.put("state", 1);
} else {
@ -596,7 +591,7 @@ public class DepositoryController {
new Thread(new Runnable() {
@Override
public void run() {
UpdateSonState(id, state, true);
UpdateSonState(id, state, true,userToken);
}
}).start();
} else {
@ -604,7 +599,7 @@ public class DepositoryController {
new Thread(new Runnable() {
@Override
public void run() {
UpdateSonState(id, state, false);
UpdateSonState(id, state, false,userToken);
}
}).start();
}
@ -624,11 +619,11 @@ public class DepositoryController {
*
* @param parentId
*/
public void UpdateSonState(String parentId, Integer state, boolean envelop) {
public void UpdateSonState(String parentId, Integer state, boolean envelop,UserByPort userToken) {
Map<String, Object> param = new HashMap<>();
param.put("parentId", parentId);
// 获取当前仓库所有子仓库
List<Depository> depositoryRecordPByCondition = depositoryService.findDepositoryRecordPByCondition(param);
List<Depository> depositoryRecordPByCondition = depositoryService.findDepositoryRecordPByCondition(param,userToken);
if (envelop) {
// 将当前仓库下的产品状态改为禁用
UpdateSonMaterialState(parentId, state);
@ -638,7 +633,7 @@ public class DepositoryController {
int depositoryId = depository.getId();
Map<String, Object> newMap = new HashMap<>();
newMap.put("parentId", depositoryId);
UpdateSonState(String.valueOf(depositoryId), state, envelop);
UpdateSonState(String.valueOf(depositoryId), state, envelop,userToken);
Map<String, Object> map = new HashMap<>();
map.put("id", depositoryId);
map.put("state", state);
@ -1083,10 +1078,10 @@ public class DepositoryController {
depository_data.put("todayInventory", todayInventory);
depository_data.put("sourceList", sourceList);
depository_data.put("mapData", mapData);
depository_data.put("sourceListByMonth", getBeforeInventoryByMonth(depositoryService, depositoryRecordService));
depository_data.put("sourceListByMonth", getBeforeInventoryByMonth(depositoryService, depositoryRecordService,userByPort));
depository_data.put("BeforeInventory", getBeforeInventoryByDName(depositoryService, depositoryRecordService, userByPort));
depository_data.put("ThisWeekInventory", getThisWeekInventoryByDName(depositoryService, depositoryRecordService, userByPort));
depository_data.put("MapInventory", getBeforeInventoryOnMap(depositoryService, depositoryRecordService));
depository_data.put("MapInventory", getBeforeInventoryOnMap(depositoryService, depositoryRecordService,userByPort));
// 封装 最终数据
Map<String, Object> data = new LinkedHashMap<String, Object>();
data.put("depository_data", depository_data);
@ -1107,11 +1102,12 @@ public class DepositoryController {
* @return
*/
@GetMapping("/find_depository")
public RestResponse FindDepositoryByMid(@RequestParam("mid") String mid) {
public RestResponse FindDepositoryByMid(@RequestParam("mid") String mid,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
Material materialById = materialService.findMaterialById(Integer.parseInt(mid));
Map<String, Object> param = new HashMap<>();
param.put("depositoryId", materialById.getDepositoryId());
List<Depository> depositoryId = depositoryService.findDepositoryRecordPByCondition(param);
List<Depository> depositoryId = depositoryService.findDepositoryRecordPByCondition(param,userToken);
return new RestResponse(depositoryId.get(0), 1, 200);
}
@ -1134,8 +1130,9 @@ public class DepositoryController {
* @return
*/
@GetMapping("/findMaterialByDepository")
public RestResponse FindMaterialByDepository(@RequestParam("depositoryId") String depositoryId) {
Boolean allSonDepository = findAllSonDepository(depositoryId);
public RestResponse FindMaterialByDepository(@RequestParam("depositoryId") String depositoryId,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
Boolean allSonDepository = findAllSonDepository(depositoryId,userToken);
return new RestResponse(allSonDepository);
}
@ -1146,15 +1143,15 @@ public class DepositoryController {
* @return
*/
@PostMapping("/findRelevancyByDepository")
public RestResponse FindRelevancyByDepository(@RequestBody Map<String, Object> map) {
public RestResponse FindRelevancyByDepository(@RequestBody Map<String, Object> map,HttpServletRequest request) {
Boolean allSonDepositoryOfRelevancy = false;
if (map.containsKey("id")) {
Integer depositoryId = (Integer) map.get("id");
allSonDepositoryOfRelevancy = findAllSonDepositoryOfRelevancy(depositoryId.toString());
allSonDepositoryOfRelevancy = findAllSonDepositoryOfRelevancy(depositoryId.toString(),request);
} else if (map.containsKey("ids")) {
List<Integer> ids = (List<Integer>) map.get("ids");
for (int i = 0; i < ids.size(); i++) {
allSonDepositoryOfRelevancy |= findAllSonDepositoryOfRelevancy(ids.get(i).toString());
allSonDepositoryOfRelevancy |= findAllSonDepositoryOfRelevancy(ids.get(i).toString(),request);
if (allSonDepositoryOfRelevancy) {
break;
}
@ -1171,7 +1168,7 @@ public class DepositoryController {
* @param parentid
* @return
*/
public Boolean findAllSonDepository(String parentid) {
public Boolean findAllSonDepository(String parentid,UserByPort userToken) {
Map<String, Object> param = new HashMap<>();
param.put("parentId", parentid);
param.put("state", 1);
@ -1179,10 +1176,10 @@ public class DepositoryController {
if (materialByDepository) {
return true;
}
List<Depository> depositoryRecordPByCondition = depositoryService.findDepositoryRecordPByCondition(param);
List<Depository> depositoryRecordPByCondition = depositoryService.findDepositoryRecordPByCondition(param,userToken);
for (int i = 0; i < depositoryRecordPByCondition.size(); i++) {
if (!findMaterialByDepository(depositoryRecordPByCondition.get(i).getId().toString())) {
findAllSonDepository(depositoryRecordPByCondition.get(i).getId().toString());
findAllSonDepository(depositoryRecordPByCondition.get(i).getId().toString(),userToken);
} else {
return true;
}
@ -1196,20 +1193,21 @@ public class DepositoryController {
* @param parentid
* @return
*/
public Boolean findAllSonDepositoryOfRelevancy(String parentid) {
public Boolean findAllSonDepositoryOfRelevancy(String parentid,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
Map<String, Object> param = new HashMap<>();
param.put("parentId", parentid);
param.put("state", 1);
boolean materialByDepository = findMaterialByDepository(parentid);
Boolean depositoryRecord = findDepositoryRecord(parentid);
Boolean depositoryRecord = findDepositoryRecord(parentid,request);
if (materialByDepository || depositoryRecord) {
return true;
}
List<Depository> depositoryRecordPByCondition = depositoryService.findDepositoryRecordPByCondition(param);
List<Depository> depositoryRecordPByCondition = depositoryService.findDepositoryRecordPByCondition(param,userToken);
for (int i = 0; i < depositoryRecordPByCondition.size(); i++) {
String depositoryId = depositoryRecordPByCondition.get(i).getId().toString();
if (!findMaterialByDepository(depositoryId) && !findDepositoryRecord(depositoryId)) {
findAllSonDepositoryOfRelevancy(depositoryRecordPByCondition.get(i).getId().toString());
if (!findMaterialByDepository(depositoryId) && !findDepositoryRecord(depositoryId,request)) {
findAllSonDepositoryOfRelevancy(depositoryRecordPByCondition.get(i).getId().toString(),request);
} else {
return true;
}
@ -1240,10 +1238,10 @@ public class DepositoryController {
* @param depositoryId
* @return
*/
public Boolean findDepositoryRecord(String depositoryId) {
public Boolean findDepositoryRecord(String depositoryId,HttpServletRequest request) {
Map<String, Object> param = new HashMap<>();
param.put("depositoryId", depositoryId);
List<DepositoryRecordP> recordPByCondition = depositoryRecordService.findDepositoryRecordPByCondition(param);
List<DepositoryRecordP> recordPByCondition = depositoryRecordService.findDepositoryRecordPByCondition(param,request);
if (recordPByCondition.size() > 0) {
return true;
}
@ -1257,19 +1255,21 @@ public class DepositoryController {
* @return
*/
@GetMapping("/findDepositoryByParent")
public RestResponse FindDepositoryByParentId(@RequestParam("parentId") String parentId) {
public RestResponse FindDepositoryByParentId(@RequestParam("parentId") String parentId,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
Map<String, Object> param = new HashMap<>();
param.put("parentId", parentId);
List<Depository> depositoryRecordPByCondition = depositoryService.findDepositoryRecordPByCondition(param);
List<Depository> depositoryRecordPByCondition = depositoryService.findDepositoryRecordPByCondition(param,userToken);
return new RestResponse(depositoryRecordPByCondition, depositoryService.findCountByCondition(param), 200);
}
@GetMapping("/findManagerByDid")
public RestResponse FindManagerByDid(@RequestParam("did") Integer did) {
public RestResponse FindManagerByDid(@RequestParam("did") Integer did,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
List<Integer> userIdByDid = roleService.findUserIdByDid(did);
List<UserByPort> userByPortList = new ArrayList<>();
for (int i = 0; i < userIdByDid.size(); i++) {
UserByPort userByPort = PageController.FindUserById(userIdByDid.get(i));
UserByPort userByPort = PageController.FindUserById(userIdByDid.get(i),userToken);
userByPortList.add(userByPort);
}
return new RestResponse(userByPortList, userByPortList.size(), 200);
@ -1277,8 +1277,9 @@ public class DepositoryController {
@GetMapping("/findPostByCompany")
public RestResponse findPostByCompany(@RequestParam("company") String company) {
List<AdministrationP> administrationPList = PageController.findCompanyBySuperior(company);
public RestResponse findPostByCompany(@RequestParam("company") String company,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
List<AdministrationP> administrationPList = PageController.findCompanyBySuperior(company,userToken);
int size = administrationPList.size();
return new RestResponse(administrationPList, size, 200);
}

160
src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java

@ -8,6 +8,7 @@ import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.pojo.*;
import com.dreamchaser.depository_manage.security.bean.UserToken;
import com.dreamchaser.depository_manage.service.*;
import com.dreamchaser.depository_manage.service.impl.QyWxOperationService;
import com.dreamchaser.depository_manage.utils.CrudUtil;
import com.dreamchaser.depository_manage.utils.DateUtil;
import com.dreamchaser.depository_manage.utils.HttpUtils;
@ -48,12 +49,15 @@ public class DepositoryRecordController {
@Autowired
private PlaceService placeService;
@Autowired
private QyWxOperationService qyWxOperationService;
@GetMapping("/depositoryRecord")
public RestResponse findDepositoryRecordByCondition(@RequestParam Map<String,Object> map){
List<DepositoryRecordP> list=depositoryRecordService.findDepositoryRecordPByCondition(map);
public RestResponse findDepositoryRecordByCondition(@RequestParam Map<String,Object> map,HttpServletRequest request){
List<DepositoryRecordP> list=depositoryRecordService.findDepositoryRecordPByCondition(map,request);
for (int i = 0; i < list.size(); i++) {
list.get(i).setPrice(list.get(i).getPrice() / 100);
}
@ -64,14 +68,14 @@ public class DepositoryRecordController {
public RestResponse findDepositoryInAndOutRecordPByCondition(@RequestParam Map<String,Object> map,HttpServletRequest request){
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
map.put("applicantId",userToken.getId());
List<ApplicationInRecordP> applicationInRecordPlist = depositoryRecordService.findApplicationInRecordPByCondition(map);
List<ApplicationInRecordP> applicationInRecordPlist = depositoryRecordService.findApplicationInRecordPByCondition(map,request);
Integer InCount = depositoryRecordService.findApplicationInRecordPCountByCondition(map);
for (int i = 0; i < applicationInRecordPlist.size(); i++) {
if(applicationInRecordPlist.get(i).getPrice() != null) {
applicationInRecordPlist.get(i).setPrice(applicationInRecordPlist.get(i).getPrice() / 100);
}
}
List<ApplicationOutRecordP> applicationOutRecordPlist = depositoryRecordService.findApplicationOutRecordPByCondition(map);
List<ApplicationOutRecordP> applicationOutRecordPlist = depositoryRecordService.findApplicationOutRecordPByCondition(map,request);
Integer OutCount = depositoryRecordService.findApplicationOutRecordPCountByCondition(map);
for (int i = 0; i < applicationOutRecordPlist.size(); i++) {
if(applicationOutRecordPlist.get(i).getPrice() != null) {
@ -90,7 +94,7 @@ public class DepositoryRecordController {
public RestResponse myTask(@RequestParam Map<String,Object> map,HttpServletRequest request){
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
map.put("userId",userToken.getId());
List<SimpleApplicationOutRecordP> myTask = depositoryRecordService.findMyTask(map);
List<SimpleApplicationOutRecordP> myTask = depositoryRecordService.findMyTask(map,request);
return new RestResponse(myTask
,depositoryRecordService.findMyTaskOutCount(map),200);
}
@ -285,26 +289,47 @@ public class DepositoryRecordController {
public RestResponse insertApplicationOutRecord(@RequestBody Map<String,Object> map, HttpServletRequest request){
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
map.put("applicantId",userToken.getId());
// UserByPort departmentHeadByUser = findDepartmentHeadByUser(userToken);
// map.put("departmenthead",departmentHeadByUser.getId());
// 获取当前部门负责人
List<UserByPort> departmentHeadByUsers = findDepartmentHeadByUser(userToken);
StringBuilder departmentHeadId = new StringBuilder();
StringBuilder departMentHeadQyWxName = new StringBuilder();
/* for (int i = 0; i < departmentHeadByUsers.size(); i++) {
departmentHeadId.append(departmentHeadByUsers.get(i).getId()).append(",");
departMentHeadQyWxName.append(departmentHeadByUsers.get(i).getWorkwechat()+",");
}*/
departmentHeadId.append("78").append(",");
departMentHeadQyWxName.append("PangFuZhen").append(",");
map.put("departmenthead",departmentHeadId.toString());
List<Integer> params = (List<Integer>) map.get("params");
Integer integer = 0;
if(params.size() < 1 && map.size() > 3){
Integer res = depositoryRecordService.insertApplicationOutRecord(map,userToken); // 插入主订单
if(res == 1){ // 如果插入成功
Object id = map.get("id"); // 获取主订单编号
if(res == 1){ // 如果插入成功
if(id != null){
map.remove("id");
map.put("parentId",id);
}
integer += depositoryRecordService.insertApplicationOutMin(map);
}
// 向企业微信中对应用户发送消息
JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
QyWxMessageMap.put("responseCode",jsonObject.getString("response_code"));
// key user:300450:QyWxOut:1
// 申请人number
redisTemplateForHash.opsForHash().putAll("user:"+userToken.getNumber()+":QyWxOutId:"+id,QyWxMessageMap);
// 设置过期时间为三天
redisTemplateForHash.expire("user:"+userToken.getNumber()+":QyWxOutId:"+id,72,TimeUnit.HOURS);
}else{
// 插入主订单
// map.put("departmenthead",departmentHeadByUser.getId());
map.put("departmenthead",departmentHeadId.toString());
Integer res = depositoryRecordService.insertApplicationOutRecord(map,userToken);
if(res == 1) {
// 获取主订单编号
Object id = map.get("id");
for (int i = 0; i < params.size(); i++) {
Integer temp = params.get(i);
Map<String, Object> insert = new HashMap<>();
@ -315,15 +340,25 @@ public class DepositoryRecordController {
insert.put("code", map.get("code"));
insert.put("placeId", map.get("placeId"));
// 获取主订单编号
insert.put("parentId", map.get("id"));
insert.put("parentId",id);
// 插入子订单
integer += depositoryRecordService.insertApplicationOutMin(insert);
}
// 插入子订单
map.put("parentId", map.get("id"));
map.put("parentId", id);
map.remove("id");
// 插入子订单
integer += depositoryRecordService.insertApplicationOutMin(map);
JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
QyWxMessageMap.put("responseCode",jsonObject.getString("response_code"));
// key user:300450:QyWxOut:1
redisTemplateForHash.opsForHash().putAll("user:"+userToken.getNumber()+":QyWxOutId:"+id,QyWxMessageMap);
// 设置过期时间为三天
// 申请人number
redisTemplateForHash.expire("user:"+userToken.getNumber()+":QyWxOutId:"+id,72,TimeUnit.HOURS);
}
}
if(integer != 0 && params.size() < 1){
@ -338,8 +373,8 @@ public class DepositoryRecordController {
// 查看入库申请
@GetMapping("/applicationInView")
public RestResponse findApplicationInRecordByCondition(@RequestParam Map<String,Object> map){
List<ApplicationInRecordP> list = depositoryRecordService.findApplicationInRecordPByCondition(map);
public RestResponse findApplicationInRecordByCondition(@RequestParam Map<String,Object> map,HttpServletRequest request){
List<ApplicationInRecordP> list = depositoryRecordService.findApplicationInRecordPByCondition(map,request);
for (int i = 0; i < list.size(); i++) {
list.get(i).setPrice(list.get(i).getPrice() / 100);
}
@ -400,7 +435,7 @@ public class DepositoryRecordController {
ApplicationOutRecordP applicationOutRecordPById = depositoryRecordService.findApplicationOutRecordPById(applicationOutMinById.getParentId());
// 获取申请人
UserByPort userByPort = PageController.FindUserById(applicationOutRecordPById.getApplicantId());
UserByPort userByPort = PageController.FindUserById(applicationOutRecordPById.getApplicantId(),userToken);
// 创建展示对象
SimpleApplicationOutMinRecordP simpleApplicationOutMinRecordP = new SimpleApplicationOutMinRecordP(applicationOutMinById);
// 获取申请的物料信息
@ -412,7 +447,7 @@ public class DepositoryRecordController {
if(checkId != null){
// 如果该订单已经处理
// 获取处理人
UserByPort checker = PageController.FindUserById(checkId);
UserByPort checker = PageController.FindUserById(checkId,userToken);
simpleApplicationOutMinRecordP.setCheckerName(checker.getName());
}
@ -437,9 +472,9 @@ public class DepositoryRecordController {
// 查看出库申请
@GetMapping("/applicationOutView")
public RestResponse findApplicationOutRecordByCondition(@RequestParam Map<String,Object> map){
public RestResponse findApplicationOutRecordByCondition(@RequestParam Map<String,Object> map,HttpServletRequest request){
// 获取对应主订单
List<ApplicationOutRecordP> list = depositoryRecordService.findApplicationOutRecordPByCondition(map);
List<ApplicationOutRecordP> list = depositoryRecordService.findApplicationOutRecordPByCondition(map,request);
for (int i = 0; i < list.size(); i++) {
ApplicationOutRecordP outRecordP = list.get(i);
// 根据主订单获取所有子订单
@ -460,7 +495,7 @@ public class DepositoryRecordController {
mcode.append(materialById.getCode()).append(",");
depositoryName.append(depository.getDname()).append(",");
sumQuantity += applicationOutRecordMin.getQuantity();
sumPrice += (materialById.getPrice() / 100);
sumPrice += (materialById.getPrice());
}
list.get(i).setMcode(mcode.toString());
list.get(i).setMname(mname.toString());
@ -525,12 +560,16 @@ public class DepositoryRecordController {
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
List<Integer> mids = (List<Integer>) map.get("mids");
List<Integer> depositoryIds = (List<Integer>) map.get("depositoryIds");
List<String> placeCodes = (List<String>) map.get("placeCodes");
for (int i = 0; i < mids.size(); i++) {
redisTemplate.opsForList().remove("mids"+userToken.getId(),1,mids.get(i));
}
for (int i = 0; i < depositoryIds.size(); i++) {
redisTemplate.opsForList().remove("depositoryIds"+userToken.getId(),1,depositoryIds.get(i));
}
for (int i = 0; i < placeCodes.size(); i++) {
redisTemplate.opsForList().remove("placeCodes"+userToken.getId(),1,placeCodes.get(i));
}
return CrudUtil.postHandle(1,1);
}
@ -538,7 +577,7 @@ public class DepositoryRecordController {
@PutMapping("/review")
public RestResponse review(@RequestBody Map<String,Object> map, HttpServletRequest request){
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
Integer review = depositoryRecordService.review(map, userToken.getId());
Integer review = depositoryRecordService.review(map, userToken.getId(),userToken);
if(review != -1) {
return CrudUtil.postHandle(review, 1);
}else{
@ -550,9 +589,18 @@ public class DepositoryRecordController {
@PutMapping("/transfer")
public RestResponse transfer(@RequestBody Map<String,Object> map, HttpServletRequest request){
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
// UserByPort departmentHeadByUser = findDepartmentHeadByUser(userToken);
List<UserByPort> departmentHeadByUsers = findDepartmentHeadByUser(userToken);
StringBuilder departmentHeadId = new StringBuilder();
StringBuilder departMentHeadQyWxName = new StringBuilder();
/* for (int i = 0; i < departmentHeadByUsers.size(); i++) {
departmentHeadId.append(departmentHeadByUsers.get(i).getId()).append(",");
departMentHeadQyWxName.append(departmentHeadByUsers.get(i).getWorkwechat()+",");
}*/
departmentHeadId.append("78").append(",");
departMentHeadQyWxName.append("PangFuZhen").append(",");
map.put("departmenthead",departmentHeadId.toString());
map.put("departMentHeadQyWxName",departMentHeadQyWxName.toString());
List<Integer> params = (List<Integer>) map.get("params");
// map.put("departmenthead",departmentHeadByUser.getId());
map.put("applicantId",userToken.getId());
map.put("toId",map.get("depositoryId"));
map.remove("depositoryId");
@ -563,7 +611,7 @@ public class DepositoryRecordController {
for (int i = 0; i < params.size(); i++) {
Integer temp = params.get(i);
Map<String,Object> insert = new HashMap<>();
// insert.put("departmenthead",departmentHeadByUser.getId());
insert.put("departmenthead",departmentHeadId.toString());
insert.put("applicantId",userToken.getId());
insert.put("toId",map.get("depositoryId"+temp));
insert.put("mid",map.get("mid"+temp));
@ -676,8 +724,16 @@ public class DepositoryRecordController {
success += depositoryRecordService.applicationInPlace(map);
}else if("out".equals(type)){
// 获取部门负责人
// UserByPort departmentHeadByUser = findDepartmentHeadByUser(userToken);
// map.put("departmenthead",departmentHeadByUser.getId());
List<UserByPort> departmentHeadByUsers = findDepartmentHeadByUser(userToken);
StringBuilder departmentHeadId = new StringBuilder();
StringBuilder departMentHeadQyWxName = new StringBuilder();
/* for (int i = 0; i < departmentHeadByUsers.size(); i++) {
departmentHeadId.append(departmentHeadByUsers.get(i).getId()).append(",");
departMentHeadQyWxName.append(departmentHeadByUsers.get(i).getWorkwechat()+",");
}*/
departmentHeadId.append("78").append(",");
departMentHeadQyWxName.append("PangFuZhen").append(",");
map.put("departmenthead",departmentHeadId.toString());
Integer res = depositoryRecordService.insertApplicationOutRecord(map,userToken); // 插入主订单
if(res == 1){ // 如果插入成功
Object id = map.get("id"); // 获取主订单编号
@ -686,6 +742,16 @@ public class DepositoryRecordController {
map.put("parentId",id);
}
success += depositoryRecordService.insertApplicationOutMin(map);
// 向企业微信中对应用户发送消息
JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
QyWxMessageMap.put("responseCode",jsonObject.getString("response_code"));
// key user:300450:QyWxOut:1
redisTemplateForHash.opsForHash().putAll("user:"+userToken.getNumber()+":QyWxOutId:"+id,QyWxMessageMap);
// 设置过期时间为三天
redisTemplateForHash.expire("user:"+userToken.getNumber()+":QyWxOutId:"+id,72,TimeUnit.HOURS);
}
}
@ -765,11 +831,19 @@ public class DepositoryRecordController {
sumQuantity += integer;
}
// 获取部门负责人
// UserByPort departmentHeadByUser = findDepartmentHeadByUser(userToken);
List<UserByPort> departmentHeadByUsers = findDepartmentHeadByUser(userToken);
StringBuilder departmentHeadId = new StringBuilder();
StringBuilder departMentHeadQyWxName = new StringBuilder();
/* for (int i = 0; i < departmentHeadByUsers.size(); i++) {
departmentHeadId.append(departmentHeadByUsers.get(i).getId()).append(",");
departMentHeadQyWxName.append(departmentHeadByUsers.get(i).getWorkwechat()+",");
}*/
departmentHeadId.append("78").append(",");
departMentHeadQyWxName.append("PangFuZhen").append(",");
mainRecord.put("applicantId",userToken.getId());
mainRecord.put("applyRemark","");
mainRecord.put("quantity",sumQuantity.toString());
// mainRecord.put("departmenthead",departmentHeadByUser.getId());
mainRecord.put("departmenthead",departmentHeadId.toString());
// 插入主表
depositoryRecordService.insertApplicationOutRecord(mainRecord,userToken);
id = ObjectFormatUtil.toInteger(mainRecord.get("id"));
@ -834,6 +908,16 @@ public class DepositoryRecordController {
errMsg += materialById.getMname() + "在"+depositoryRecordById.getDname()+"出库数量为"+quantity +"失败,数量不足;";
}
}
// 向企业微信中对应用户发送消息
JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
QyWxMessageMap.put("responseCode",jsonObject.getString("response_code"));
// key user:300450:QyWxOut:1
redisTemplateForHash.opsForHash().putAll("user:"+userToken.getNumber()+":QyWxOutId:"+id,QyWxMessageMap);
// 设置过期时间为三天
redisTemplateForHash.expire("user:"+userToken.getNumber()+":QyWxOutId:"+id,72,TimeUnit.HOURS);
}
if(success == 0){
depositoryRecordService.deleteApplicationOutRecordById(1);
@ -866,17 +950,16 @@ public class DepositoryRecordController {
* @param user
* @return
*/
public static UserByPort findDepartmentHeadByUser(UserByPort user){
String url = PortConfig.external_url + "/org/positionlist";
public static List<UserByPort> findDepartmentHeadByUser(UserByPort user){
String url = PortConfig.external_url + "/staff/archiveslist";
Integer maindeparment = user.getMaindeparment();
Map<String,Object> map = new HashMap<>();
map.put("organization",maindeparment.toString());
map.put("incharge",1);
map.put("adminorg",maindeparment);
String jsonString = JSONObject.toJSONString(map);
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,user);
} catch (IOException e) {
e.printStackTrace();
}
@ -886,11 +969,14 @@ public class DepositoryRecordController {
if(list == null){
list = new JSONArray();
}
Post userPost = JSONObject.toJavaObject((JSONObject) list.get(0), Post.class);
Map<String,Object> param = new HashMap<>();
param.put("position",userPost.getId());
UserByPort userByPort = PageController.FindUserByMap(param).get(0);
return userByPort;
List<UserByPort> DepartmentHeads = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
UserByPort userByPort = JSONObject.toJavaObject((JSONObject) list.get(i), UserByPort.class);
if(userByPort.getPersonincharge() == 1){
DepartmentHeads.add(userByPort);
}
}
return DepartmentHeads;
}

20
src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java

@ -2,6 +2,7 @@ package com.dreamchaser.depository_manage.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.config.JM_3DES;
import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.pojo.*;
@ -271,6 +272,12 @@ public class MaterialController {
return new RestResponse(materialPByCondition, materialService.findCountByCondition(map), 200);
}
@PostMapping("/findInventoryByCondition")
public RestResponse findInventoryByCondition(@RequestBody Map<String, Object> map) {
List<MaterialP> materialPByCondition = materialService.findInventory(map);
return new RestResponse(materialPByCondition, materialService.findInventoryCount(map), 200);
}
// 构造物料二维码
@GetMapping("/createQrCode")
@ -388,4 +395,17 @@ public class MaterialController {
return new RestResponse(flag);
}
/**
* 用于将扫描的结果进行解密操作
* @param map
* @return
*/
@PostMapping("/decode3Des")
public RestResponse decode3Des(@RequestBody Map<String, Object> map){
String result = (String) map.get("result");
String s = JM_3DES.decode3Des(JM_3DES.JM_Key, result);
return new RestResponse(s);
}
}

349
src/main/java/com/dreamchaser/depository_manage/controller/PageController.java

@ -3,28 +3,37 @@ package com.dreamchaser.depository_manage.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.config.JM_3DES;
import com.dreamchaser.depository_manage.config.PortConfig;
import com.dreamchaser.depository_manage.config.QyWxConfig;
import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.pojo.*;
import com.dreamchaser.depository_manage.security.bean.UserToken;
import com.dreamchaser.depository_manage.security.pool.AuthenticationTokenPool;
import com.dreamchaser.depository_manage.security.pool.UserKeyAndTokenPool;
import com.dreamchaser.depository_manage.service.*;
import com.dreamchaser.depository_manage.utils.*;
import com.sun.org.apache.xpath.internal.operations.Mod;
import javafx.geometry.Pos;
import org.apache.http.protocol.HTTP;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.mobile.device.Device;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.*;
import java.util.concurrent.TimeUnit;
@ -72,12 +81,13 @@ public class PageController {
public static JSONObject Captcha(){
public static JSONObject Captcha(HttpServletRequest request){
UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
String url = PortConfig.external_url_6666 + "/base/captcha";
JSONObject param = new JSONObject();
String post = null;
try {
post = HttpUtils.send(url, param, HTTP.UTF_8);
post = HttpUtils.send(url, param, HTTP.UTF_8,userByPort);
} catch (IOException e) {
e.printStackTrace();
}
@ -97,14 +107,22 @@ public class PageController {
}
/**
* 用于正常登录
* @param request
* @return
*/
@GetMapping("/login")
public ModelAndView login() {
public ModelAndView login(HttpServletRequest request) {
ModelAndView mv = new ModelAndView();
JSONObject captcha = Captcha();
QyWxConfig.token = QyWxConfig.GetQYWXToken();
JSONObject captcha = Captcha(request);
String picPath = (String) captcha.get("picPath");
String captchaid = (String) captcha.get("captchaid");
mv.addObject("picPath", picPath);
mv.addObject("captchaid", captchaid);
mv.addObject("userWxId","");
mv.setViewName("pages/user/login");
return mv;
}
@ -112,6 +130,11 @@ public class PageController {
@GetMapping("/index")
public ModelAndView index(HttpServletRequest request) {
ModelAndView mv = new ModelAndView();
@ -129,7 +152,10 @@ public class PageController {
*/
@RequestMapping(value = "/index/menus", method = RequestMethod.GET)
@ResponseBody
public Map<String, Object> index_menus(@RequestParam("uid") String uid) {
public Map<String, Object> index_menus(@RequestParam("uid") String uid,
HttpServletRequest request,
HttpServletResponse response) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
//定义链接地址
String url = PortConfig.external_url_6666 + "/system_authorizing/obtain_authorization";
Map<String, Object> param = new HashMap<>();
@ -138,7 +164,7 @@ public class PageController {
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();
}
@ -168,7 +194,7 @@ public class PageController {
Map<String, Object> logo = new HashMap<>();
Map<String, Object> logoInfo = new HashMap<>();
logoInfo.put("title", "");
logoInfo.put("image", "static/images/logo_back.png");
logoInfo.put("image", "/static/images/logo_back.ico");
logoInfo.put("href", "");
logo.put("logoInfo", logoInfo);
//定义菜单
@ -284,31 +310,29 @@ public class PageController {
}
@GetMapping("/depository_add")
public ModelAndView depository_add() {
public ModelAndView depository_add(HttpServletRequest request) {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/warehouse/depository_add");
List<Depository> depositoryAll = depositoryService.findDepositoryAll();
Map<String, Object> administration = DepositoryController.findAdministration();
Map<String, Object> administration = DepositoryController.findAdministration(userByPort);
List<AdministrationP> administrationPList = (List<AdministrationP>) administration.get("administrationPList");
mv.addObject("depositories", depositoryAll);
mv.addObject("administrationPList", administrationPList);
return mv;
}
@GetMapping("depository-out")
public ModelAndView depository_out(HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/warehouse/depository-out");
Map<String, Object> map = new HashMap<>();
map.put("parentId", 0);
List<Depository> depositoryAll = depositoryService.findDepositoryRecordPByCondition(map);
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
// Integer role = roleService.findRoleByUid(userToken.getId().toString());
Integer role = userToken.getRole();
List<Depository> depositoryAll = depositoryService.findDepositoryRecordPByCondition(map,userToken);
Integer role = userToken.getIsadmin();
if(role == null){
role = 0;
role = 1;
}
if (role == 1) {
if (role == 4) {
mv.addObject("display", "inline-block");
} else {
mv.addObject("display", "none");
@ -322,19 +346,16 @@ public class PageController {
public ModelAndView material_out(HttpServletRequest request) {
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/material/material-out");
List<Material> materialAll = materialService.findMaterialAll();
List<Depository> depositoryAll = depositoryService.findDepositoryAll();
List<MaterialType> materialTypeAll = materialTypeService.findMaterialTypeAll();
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
Integer role = 1;
if (role == 1) {
Integer isadmin = userToken.getIsadmin();
if(isadmin == null){
isadmin = 1;
}
if (isadmin == 4) {
mv.addObject("display", "inline-block");
} else {
mv.addObject("display", "none");
}
mv.addObject("materialTypes", materialTypeAll);
mv.addObject("depositories", depositoryAll);
mv.addObject("materials", materialAll);
return mv;
}
@ -342,10 +363,6 @@ public class PageController {
public ModelAndView material_add() {
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/material/material-add");
List<Depository> depositoryAll = depositoryService.findDepositoryAll();
List<MaterialType> materialTypeAll = materialTypeService.findMaterialTypeAll();
mv.addObject("materialTypes", materialTypeAll);
mv.addObject("depositories", depositoryAll);
return mv;
}
@ -420,6 +437,8 @@ public class PageController {
params.put("code",material.getCode());
params.put("version",material.getVersion());
String context = JSONObject.toJSONString(params);
// 将待展示数据进行加密操作
context = JM_3DES.encode3Des(JM_3DES.JM_Key,context);
String qrCode = "";
try {
qrCode = CreateQrCodeUtil.createQrCode(context, 200, 200);
@ -451,14 +470,13 @@ public class PageController {
Map<String, Object> map = new HashMap<>();
map.put("parentId", 0);
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
// Integer role = roleService.findRoleByUid(userToken.getId().toString());
Integer role = userToken.getRole();
Integer role = userToken.getIsadmin();
if(role == null){
role = 0;
role = 1;
}
List<MaterialType> materialTypeAll = materialTypeService.findMaterialTypeByCondition(map);
mv.addObject("materialTypes", materialTypeAll);
if (role == 1) {
if (role == 4) {
mv.addObject("display", "inline-block");
} else {
mv.addObject("display", "none");
@ -513,13 +531,13 @@ public class PageController {
}
@GetMapping("/application_out_back")
public ModelAndView application_out_back(Integer code,String depositoryCode) {
public ModelAndView application_out_back(Integer code,String depositoryId) {
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/application/application-out_back");
MaterialP materialById = new MaterialP();
if(code != null) {
Map<String,Object> map = new HashMap<>();
Depository depositoryByCode = depositoryService.findDepositoryByCode(depositoryCode);
Depository depositoryByCode = depositoryService.findDepositoryRecordById(ObjectFormatUtil.toInteger(depositoryId));
map.put("depositoryId",depositoryByCode.getId());
map.put("code",code);
List<MaterialP> inventory = materialService.findInventory(map);
@ -555,10 +573,11 @@ public class PageController {
}
@GetMapping("/table_user")
public ModelAndView table_user() {
public ModelAndView table_user(HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/user/table-user");
List<AdministrationP> administrationPList = findAllCompany();
List<AdministrationP> administrationPList = findAllCompany(userToken);
mv.addObject("administrationPList", administrationPList);
mv.addObject("users", userService.findUserPsByCondition(new HashMap<>()));
return mv;
@ -568,7 +587,6 @@ public class PageController {
public ModelAndView table_stock() {
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/depository/table-stock");
mv.addObject("depositories", depositoryService.findDepositoryAll());
return mv;
}
@ -630,9 +648,6 @@ public class PageController {
public ModelAndView chart_out_back() {
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/chart/chart-out_back");
mv.addObject("depositories", depositoryService.findDepositoryAll());
mv.addObject("reviewers", userService.findReviewers());
mv.addObject("materials", materialService.findMaterialAll());
// 转出物料数量
mv.addObject("InCount", depositoryRecordService.CalculateAllApplicationOutCount("已出库"));
// 转出物料金额
@ -663,13 +678,13 @@ public class PageController {
* @param map
* @return
*/
public static List<UserByPort> FindUserByMap(Map<String,Object> map) {
public static List<UserByPort> FindUserByMap(Map<String,Object> map,UserByPort userToken) {
String url = PortConfig.external_url + "/staff/archiveslist";
String jsonString = JSONObject.toJSONString(map);
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();
}
@ -687,7 +702,7 @@ public class PageController {
return result;
}
public static UserByPort FindUserById(Integer id) {
public static UserByPort FindUserById(Integer id,UserByPort userToken) {
String url = PortConfig.external_url + "/staff/archivescont";
Map<String, Object> map = new HashMap<>();
map.put("id", id);
@ -695,7 +710,8 @@ public class PageController {
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();
}
@ -707,10 +723,11 @@ public class PageController {
@GetMapping("/user_add")
public ModelAndView user_add(Integer userId) {
public ModelAndView user_add(Integer userId,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/user/user-add");
UserByPort userByPort = FindUserById(userId);
UserByPort userByPort = FindUserById(userId,userToken);
UserByPortP userByPortP = new UserByPortP(userByPort);
mv.addObject("userByPort", userByPortP);
mv.addObject("roles", roleService.findAllRole());
@ -719,13 +736,14 @@ public class PageController {
}
@GetMapping("/user_role_edit")
public ModelAndView user_role_edit(Integer id) {
public ModelAndView user_role_edit(Integer id,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/user/user-role-edit");
RoleAndDepository roleAndDepositoryById = roleService.findRoleAndDepositoryById(id);
UserByPortP userByPortP = null;
if (roleAndDepositoryById != null) {
UserByPort userByPort = FindUserById(roleAndDepositoryById.getUserId());
UserByPort userByPort = FindUserById(roleAndDepositoryById.getUserId(),userToken);
userByPortP = new UserByPortP(userByPort);
userByPortP.setRolename(roleAndDepositoryById.getRoleName());
userByPortP.setDepositoryName(roleAndDepositoryById.getDepositoryName());
@ -739,13 +757,14 @@ public class PageController {
}
@GetMapping("/post_role_edit")
public ModelAndView post_role_edit(Integer id,Integer depositoryId) {
public ModelAndView post_role_edit(Integer id,Integer depositoryId,HttpServletRequest request) {
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/post/postRole_edit");
Map<String,Object> userParam = new HashMap<>();
userParam.put("position",id);
List<UserByPort> userByPortList = PageController.FindUserByMap(userParam);
Post postById = findPostById(id);
List<UserByPort> userByPortList = PageController.FindUserByMap(userParam,userToken);
Post postById = findPostById(id,userToken);
PostP pp = new PostP(postById);
Map<String,Object> param = new HashMap<>();
param.put("depositoryId",depositoryId);
@ -761,20 +780,22 @@ public class PageController {
}
@GetMapping("/user_detail")
public ModelAndView user_edit(Integer id) {
public ModelAndView user_edit(Integer id,HttpServletRequest request) {
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/user/user-edit");
mv.addObject("depositories", depositoryService.findDepositoryAll());
Map<String,Object> map = new HashMap<>();
map.put("number",id.toString());
UserByPort userByPort = FindUserByMap(map).get(0);
UserByPort userByPort = FindUserByMap(map,userToken).get(0);
mv.addObject("user", userByPort);
return mv;
}
@GetMapping("/warehouse_view")
public ModelAndView warehouse_view(Integer id) {
public ModelAndView warehouse_view(Integer id,HttpServletRequest request) {
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/warehouse/warehouse_view");
if (id != null) {
@ -786,6 +807,8 @@ public class PageController {
param.put("dname",depositoryRecordById.getDname());
param.put("introduce",depositoryRecordById.getIntroduce());
String context = JSONObject.toJSONString(param);
// 将待展示数据进行加密操作
context = JM_3DES.encode3Des(JM_3DES.JM_Key,context);
String qrCode = "";
try {
qrCode = CreateQrCodeUtil.createQrCode(context,200,200);
@ -795,8 +818,8 @@ public class PageController {
mv.addObject("qrCode",qrCode);
mv.addObject("record", depositoryRecordById);
Integer cid = depositoryRecordById.getCid();
List<AdministrationP> postList = findCompanyBySuperior(cid.toString());
List<AdministrationP> administrationPList = findAllCompany();
List<AdministrationP> postList = findCompanyBySuperior(cid.toString(),userToken);
List<AdministrationP> administrationPList = findAllCompany(userToken);
// 部门列表
mv.addObject("postList", postList);
// 公司列表
@ -809,14 +832,15 @@ public class PageController {
}
@GetMapping("/warehouseByParentId")
public ModelAndView warehouseByParentId(Integer parentId) {
public ModelAndView warehouseByParentId(Integer parentId,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/warehouse/warehouseByParentId");
if (parentId != null) {
Map<String, Object> param = new HashMap<>();
param.put("parentId", parentId);
mv.addObject("parentId", parentId);
mv.addObject("depositories", depositoryService.findDepositoryRecordPByCondition(param));
mv.addObject("depositories", depositoryService.findDepositoryRecordPByCondition(param,userToken));
} else {
throw new MyException("缺少必要参数!");
}
@ -851,6 +875,8 @@ public class PageController {
param.put("midList",midList.toString());
param.put("mcodeList",mcodeList.toString());
String context = JSONObject.toJSONString(param);
// 将待展示数据进行加密操作
context = JM_3DES.encode3Des(JM_3DES.JM_Key,context);
String qrCode = "";
try {
qrCode = CreateQrCodeUtil.createQrCode(context,200,200);
@ -890,13 +916,23 @@ public class PageController {
}
@GetMapping("findWareHouseByParentId")
public ModelAndView findWareHouseByParentId(Integer parentId) {
public ModelAndView findWareHouseByParentId(Integer parentId,HttpServletRequest request) {
UserByPort userByPort = (UserByPort)request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
if (parentId != null) {
Map<String, Object> param = new HashMap<>();
param.put("parentId", parentId);
mv.addObject("parentId", parentId);
List<Depository> depositoryRecordPByCondition = depositoryService.findDepositoryRecordPByCondition(param);
List<Depository> depositoryRecordPByCondition = depositoryService.findDepositoryRecordPByCondition(param,userByPort);
Integer role = userByPort.getIsadmin();
if(role == null){
role = 1;
}
if (role == 4) {
mv.addObject("display", "inline-block");
} else {
mv.addObject("display", "none");
}
if (depositoryRecordPByCondition.size() > 0) {
mv.addObject("depositories", depositoryRecordPByCondition);
mv.setViewName("pages/warehouse/depository-out");
@ -905,6 +941,7 @@ public class PageController {
mv.addObject("placeList",placeByDid);
mv.setViewName("pages/warehouse/warehouseByParentId");
}
} else {
throw new MyException("缺少必要参数!");
}
@ -944,13 +981,23 @@ public class PageController {
}
@GetMapping("findMaterialTypeByParentId")
public ModelAndView findMaterialTypeByParentId(Integer parentId) {
public ModelAndView findMaterialTypeByParentId(Integer parentId,HttpServletRequest request) {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
if (parentId != null) {
Map<String, Object> param = new HashMap<>();
param.put("parentId", parentId);
mv.addObject("parentId", parentId);
List<MaterialType> materialTypeByCondition = materialTypeService.findMaterialTypeByCondition(param);
Integer role = userByPort.getIsadmin();
if(role == null){
role = 1;
}
if (role == 4) {
mv.addObject("display", "inline-block");
} else {
mv.addObject("display", "none");
}
if (materialTypeByCondition.size() > 0) {
mv.addObject("materialTypes", materialTypeByCondition);
mv.setViewName("pages/materialtype/materialType_view");
@ -978,7 +1025,8 @@ public class PageController {
}
@GetMapping("/application_review")
public ModelAndView application_review(Integer id) {
public ModelAndView application_review(Integer id,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/application/application-review");
// 获取主订单信息
@ -1015,12 +1063,19 @@ public class PageController {
mcode.append(materialById.getCode()).append(",");
depositoryName.append(depository.getDname()).append(",");
sumQuantity += applicationOutRecordMin.getQuantity();
sumPrice += (materialById.getPrice() / 100);
sumPrice += (materialById.getPrice());
}
// 申请人
UserByPort userByPort = FindUserById(recordP.getApplicantId());
UserByPort userByPort = FindUserById(recordP.getApplicantId(),userToken);
// 部门负责人
UserByPort departmenthead = FindUserById(recordP.getDepartmenthead());
String departmentheads = recordP.getDepartmenthead();
String[] split = departmentheads.split(",");
StringBuilder departmentHeadName = new StringBuilder();
for (int i = 0; i < split.length; i++) {
UserByPort departmenthead = FindUserById(ObjectFormatUtil.toInteger(split[i]),userToken);
departmentHeadName.append(departmenthead.getName()).append(",");
}
// 仓储中心负责人
String manager = recordP.getDepositoryManager();
String[] depositoryManagerId = new String[0];
@ -1031,7 +1086,7 @@ public class PageController {
String depositoryManagerNames = "";
for (int i = 0; i < depositoryManagerId.length; i++) {
Integer managerid = ObjectFormatUtil.toInteger(depositoryManagerId[i]);
UserByPort user = FindUserById(managerid);
UserByPort user = FindUserById(managerid,userToken);
depositoryManager.add(user);
depositoryManagerNames += user.getName() +",";
}
@ -1043,26 +1098,24 @@ public class PageController {
recordP.setDepartmentheadTime(DateUtil.TimeStampToDateTime(Long.valueOf(recordP.getDepartmentheadTime())));
recordP.setDepositoryManagerName(depositoryManagerNames);
recordP.setApplicantName(userByPort.getName());
recordP.setDepartmentheadName(departmenthead.getName());
recordP.setDepartmentheadName(departmentHeadName.toString());
recordP.setMcode(mcode.toString());
recordP.setMname(mname.toString());
recordP.setDepositoryName(depositoryName.toString());
recordP.setQuantity(sumQuantity);
recordP.setPrice(sumPrice);
if(recordP.getPrice()!=null) {
recordP.setPrice(recordP.getPrice() / 100);
}
mv.addObject("record", recordP);
return mv;
}
@GetMapping("/form_step_look")
public ModelAndView form_step_look(Integer id) {
public ModelAndView form_step_look(Integer id,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/application/form-step-look");
if (id != null) {
ApplicationInRecordP applicationInRecordPById = depositoryRecordService.findApplicationInRecordPById(id);
UserByPort userByPort = FindUserById(applicationInRecordPById.getApplicantId());
UserByPort userByPort = FindUserById(applicationInRecordPById.getApplicantId(),userToken);
applicationInRecordPById.setApplicantName(userByPort.getName());
applicationInRecordPById.setApplicantTime(DateUtil.TimeStampToDateTime(Long.valueOf(applicationInRecordPById.getApplicantTime())));
applicationInRecordPById.setPrice(applicationInRecordPById.getPrice() / 100);
@ -1074,10 +1127,45 @@ public class PageController {
return mv;
}
@GetMapping("/form_step_lookByminRecordOut")
public ModelAndView form_step_lookByminRecordOut(Integer id,HttpServletRequest request){
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/application/form-step-look_minRecordOut");
if(id != null){
// 获取当前子订单
ApplicationOutRecordMin recordMin = depositoryRecordService.findApplicationOutMinById(id);
ApplicationOutRecordMinP recordMinP = new ApplicationOutRecordMinP(recordMin);
// 获取出库物料信息
Material materialById = materialService.findMaterialById(recordMin.getMid());
// 获取出库物料仓库信息
Depository depository = depositoryService.findDepositoryRecordById(recordMin.getDepositoryId());
// 获取出库库位
Place placeById = placeService.findPlaceById(recordMin.getPlaceId());
// 获取处理人
UserByPort userByPort = FindUserById(recordMin.getCheckId(), userToken);
// 设置处理人姓名
recordMinP.setCheckerName(userByPort.getName());
recordMinP.setDepositoryName(depository.getDname());
recordMinP.setMname(materialById.getMname());
recordMinP.setMcode(materialById.getCode());
recordMinP.setPlaceCode(placeById.getCode());
Double price = (materialById.getPrice() / 100) * recordMinP.getQuantity();
BigDecimal bg = new BigDecimal(price);
price = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
recordMinP.setPrice(price);
mv.addObject("recordMinP",recordMinP);
} else {
throw new MyException("缺少必要参数!");
}
return mv;
}
// 跳转到出库详情
@GetMapping("/ApplicationOutView")
public ModelAndView ApplicationOutView(Integer id) {
public ModelAndView ApplicationOutView(Integer id,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/application/form-step-look_back");
if (id != null) {
@ -1093,14 +1181,22 @@ public class PageController {
StringBuilder depositoryName = new StringBuilder();
// 展示出库的库位编码
StringBuilder placeCode = new StringBuilder();
// 展示当前子订单的处理人
StringBuilder outDisposer = new StringBuilder();
// 当前订单总数
Integer sumQuantity = 0;
// 每个物料数量
StringBuilder quantityByMaterial = new StringBuilder();
List<ApplicationOutRecordMinP> recordMinPList = new ArrayList<>();
// 当前总额
Double sumPrice = 0.0;
for (int i = 0; i < applicationOutRecordMinByParent.size(); i++) {
// 获取子订单信息
ApplicationOutRecordMin applicationOutRecordMin = applicationOutRecordMinByParent.get(i);
// 获取输出子订单信息
ApplicationOutRecordMinP recordMinP = new ApplicationOutRecordMinP(applicationOutRecordMin);
// 获取出库物料信息
Material materialById = materialService.findMaterialById(applicationOutRecordMin.getMid());
// 获取出库物料仓库信息
@ -1110,16 +1206,42 @@ public class PageController {
if(placeById != null) {
placeCode.append(placeById.getCode()).append(",");
}
recordMinP.setMname(materialById.getMname());
recordMinP.setDepositoryName(depository.getDname());
recordMinP.setPlaceCode(placeById.getCode());
Integer checkId = applicationOutRecordMin.getCheckId();
if(checkId != null){
// 如果当前子订单已经处理
// 获取当前处理人
UserByPort disposer = FindUserById(checkId, userToken);
outDisposer.append(disposer.getName()+",");
recordMinP.setCheckerName(disposer.getName());
}else{
outDisposer.append("暂未处理,");
recordMinP.setCheckerName("暂未处理");
}
mname.append(materialById.getMname()).append(",");
mcode.append(materialById.getCode()).append(",");
depositoryName.append(depository.getDname()).append(",");
quantityByMaterial.append(applicationOutRecordMin.getQuantity()+",");
sumQuantity += applicationOutRecordMin.getQuantity();
sumPrice += (materialById.getPrice() / 100);
sumPrice += (materialById.getPrice());
recordMinPList.add(recordMinP);
}
// 申请人
UserByPort userByPort = FindUserById(applicationOutRecordPById.getApplicantId());
UserByPort userByPort = FindUserById(applicationOutRecordPById.getApplicantId(),userToken);
// 部门负责人
UserByPort departmenthead = FindUserById(applicationOutRecordPById.getDepartmenthead());
String departmentHead = applicationOutRecordPById.getDepartmenthead();
String[] split = departmentHead.split(",");
if("".equals(departmentHead)||departmentHead.isEmpty()){
// 如果当前没有部门负责人
split = new String[0];
}
StringBuilder departmentHeadName = new StringBuilder();
for (int i = 0; i < split.length; i++) {
UserByPort departmenthead = FindUserById(ObjectFormatUtil.toInteger(split[i]),userToken);
departmentHeadName.append(departmenthead.getName()).append(",");
}
// 仓储中心负责人
String manager = applicationOutRecordPById.getDepositoryManager();
String[] depositoryManagerId = new String[0];
@ -1130,12 +1252,12 @@ public class PageController {
String depositoryManagerNames = "";
for (int i = 0; i < depositoryManagerId.length; i++) {
Integer managerid = ObjectFormatUtil.toInteger(depositoryManagerId[i]);
UserByPort user = FindUserById(managerid);
UserByPort user = FindUserById(managerid,userToken);
depositoryManager.add(user);
depositoryManagerNames += user.getName();
}
applicationOutRecordPById.setApplicantName(userByPort.getName());
applicationOutRecordPById.setDepartmentheadName(departmenthead.getName());
applicationOutRecordPById.setDepartmentheadName(departmentHeadName.toString());
applicationOutRecordPById.setDepositoryManagerName(depositoryManagerNames);
applicationOutRecordPById.setApplicantTime(DateUtil.TimeStampToDateTime(Long.valueOf(applicationOutRecordPById.getApplicantTime())));
applicationOutRecordPById.setDepartmentheadTime(DateUtil.TimeStampToDateTime(Long.valueOf(applicationOutRecordPById.getDepartmentheadTime())));
@ -1147,6 +1269,8 @@ public class PageController {
applicationOutRecordPById.setDepositoryName(depositoryName.toString());
applicationOutRecordPById.setPCode(placeCode.toString());
mv.addObject("record", applicationOutRecordPById);
mv.addObject("outDisposer",outDisposer.toString());
mv.addObject("recordMinList",recordMinPList);
} else {
throw new MyException("缺少必要参数!");
}
@ -1191,7 +1315,7 @@ public class PageController {
}
public List<AdministrationP> findAllCompany() {
public List<AdministrationP> findAllCompany(UserByPort userByPort) {
String url = PortConfig.external_url + "/org/govlist";
Map<String, Object> map = new HashMap<>();
map.put("superior", "313");
@ -1199,7 +1323,7 @@ public class PageController {
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();
}
@ -1221,9 +1345,10 @@ public class PageController {
@GetMapping("/company_out")
public ModelAndView Company_Out(HttpServletRequest request) {
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/company/company-out");
List<AdministrationP> administrationPList = findAllCompany();
List<AdministrationP> administrationPList = findAllCompany(userToken);
mv.addObject("administrationPList", administrationPList);
mv.addObject("parentId", "313");
return mv;
@ -1240,7 +1365,7 @@ public class PageController {
@GetMapping("/company_detail")
public ModelAndView company_detail(Integer id) {
public ModelAndView company_detail(Integer id,UserByPort userByPort) {
String url = PortConfig.external_url + "/org/getgovcont";
Map<String, Object> map = new HashMap<>();
ModelAndView mv = new ModelAndView();
@ -1252,14 +1377,14 @@ public class PageController {
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();
}
JSONObject jsonObject = JSONObject.parseObject(post);
JSONObject data = (JSONObject) jsonObject.get("data");
Administration administration = JSONObject.toJavaObject(data, Administration.class);
String SuperiorName = getCompany(administration.getSuperior()).getName();
String SuperiorName = getCompany(administration.getSuperior(),userByPort).getName();
mv.addObject("record", administration);
mv.addObject("SuperiorName", SuperiorName);
} else {
@ -1268,7 +1393,7 @@ public class PageController {
return mv;
}
public static Administration getCompany(Integer id) {
public static Administration getCompany(Integer id,UserByPort userByPort) {
String url = PortConfig.external_url + "/org/getgovcont";
Map<String, Object> map = new HashMap<>();
map.put("id", id);
@ -1277,7 +1402,7 @@ public class PageController {
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();
}
@ -1289,7 +1414,7 @@ public class PageController {
public static List<AdministrationP> findCompanyBySuperior(String superior) {
public static List<AdministrationP> findCompanyBySuperior(String superior,UserByPort userByPort) {
String url = PortConfig.external_url + "/org/govlist";
Map<String, Object> map = new HashMap<>();
map.put("superior", superior);
@ -1297,7 +1422,7 @@ public class PageController {
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();
}
@ -1318,11 +1443,12 @@ public class PageController {
}
@GetMapping("/findCompanyByParentId")
public ModelAndView findCompanyByParentId(Integer parentId) {
public ModelAndView findCompanyByParentId(Integer parentId,HttpServletRequest request) {
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
if (parentId != null) {
mv.addObject("parentId", parentId);
List<AdministrationP> administrationPList = findCompanyBySuperior(parentId.toString());
List<AdministrationP> administrationPList = findCompanyBySuperior(parentId.toString(),userToken);
if (administrationPList.size() > 0) {
mv.addObject("administrationPList", administrationPList);
mv.setViewName("pages/company/company-out");
@ -1336,7 +1462,8 @@ public class PageController {
}
@GetMapping("/findPostByOrganization")
public ModelAndView findPostByOrganization(Integer organization) {
public ModelAndView findPostByOrganization(Integer organization,HttpServletRequest request) {
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
String url = PortConfig.external_url + "/org/positionlist";
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/post/post-out");
@ -1348,7 +1475,7 @@ public class PageController {
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();
}
@ -1373,11 +1500,12 @@ public class PageController {
}
@GetMapping("/post_detail")
public ModelAndView post_detail(Integer id) {
public ModelAndView post_detail(Integer id,HttpServletRequest request) {
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/post/post-view");
if (id != null) {
Post object = findPostById(id);
Post object = findPostById(id,userToken);
mv.addObject("record", object);
} else {
throw new MyException("缺少必要参数!");
@ -1385,7 +1513,7 @@ public class PageController {
return mv;
}
public static Post findPostById(Integer id) {
public static Post findPostById(Integer id,UserByPort userByPort) {
String url = PortConfig.external_url + "/org/getpositioncont";
Map<String, Object> map = new HashMap<>();
map.put("id", id);
@ -1394,7 +1522,7 @@ public class PageController {
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();
}
@ -1406,7 +1534,8 @@ public class PageController {
@GetMapping("/findPostByParentId")
public ModelAndView findPostByParentId(Integer parentId) {
public ModelAndView findPostByParentId(Integer parentId,HttpServletRequest request) {
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
String url = PortConfig.external_url + "/org/positionlist";
ModelAndView mv = new ModelAndView();
if (parentId != null) {
@ -1417,7 +1546,7 @@ public class PageController {
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();
}
@ -1448,10 +1577,11 @@ public class PageController {
// 跳转到添加权限界面
@GetMapping("/postRoleAdd")
public ModelAndView PostRoleAdd(Integer id) {
public ModelAndView PostRoleAdd(Integer id,HttpServletRequest request) {
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/post/postRole_add");
Post postById = findPostById(id);
Post postById = findPostById(id,userToken);
mv.addObject("post", postById);
mv.addObject("roles", roleService.findAllRole());
mv.addObject("depositories", depositoryService.findDepositoryAll());
@ -1552,7 +1682,7 @@ public class PageController {
return mv;
}
// 当前仓库中该用户的子订单详情
// 当前仓库中该用户的子订单详情,用于pc端
@GetMapping("/ApplicationOutMinByDid")
public ModelAndView ApplicationOutMinByDid(Integer depositoryId,Integer state,HttpServletRequest request){
ModelAndView mv = new ModelAndView();
@ -1561,4 +1691,17 @@ public class PageController {
mv.setViewName("pages/application/application-out_min");
return mv;
}
// 当前仓库中该用户的子订单详情,用于移动端
@GetMapping("/ApplicationOutMinByDidForMobile")
public ModelAndView ApplicationOutMinByDidForMobile(Integer depositoryId,Integer state,HttpServletRequest request){
ModelAndView mv = new ModelAndView();
Depository depository = depositoryService.findDepositoryRecordById(depositoryId);
mv.addObject("depositoryId",depositoryId);
mv.addObject("state",state);
mv.addObject("depository",depository);
mv.setViewName("pages/application/application-out_min-mobile");
return mv;
}
}

276
src/main/java/com/dreamchaser/depository_manage/controller/QyWxOperationController.java

@ -0,0 +1,276 @@
package com.dreamchaser.depository_manage.controller;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.config.PortConfig;
import com.dreamchaser.depository_manage.config.QyWxConfig;
import com.dreamchaser.depository_manage.config.QyWxJMJM.com.qq.weixin.mp.aes.AesException;
import com.dreamchaser.depository_manage.config.QyWxJMJM.com.qq.weixin.mp.aes.WXBizMsgCrypt;
import com.dreamchaser.depository_manage.entity.CallBackLog;
import com.dreamchaser.depository_manage.entity.UserByPort;
import com.dreamchaser.depository_manage.pojo.callBackXml.CallBackBaseXml;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
import com.dreamchaser.depository_manage.security.pool.AuthenticationTokenPool;
import com.dreamchaser.depository_manage.security.pool.UserKeyAndTokenPool;
import com.dreamchaser.depository_manage.service.CallBackLogService;
import com.dreamchaser.depository_manage.service.DepositoryRecordService;
import com.dreamchaser.depository_manage.service.DepositoryService;
import com.dreamchaser.depository_manage.service.impl.QyWxOperationService;
import com.dreamchaser.depository_manage.utils.ObjectFormatUtil;
import com.dreamchaser.depository_manage.utils.QyWxXMLUtils;
import io.micrometer.core.instrument.util.IOUtils;
import org.joda.time.format.FormatUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.time.Instant;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
/**
* 用于企业微信相关操作的控制器
*/
@Controller
public class QyWxOperationController {
@Autowired
CallBackLogService callBackLogService;
@Autowired
QyWxOperationService qyWxOperationService;
@Autowired
DepositoryRecordService depositoryRecordService;
/**
* 用于接收企业微信的回调get方式
*/
@GetMapping("/callback")
public void callBackForGet(@RequestParam Map<String,Object> map, HttpServletResponse response){
try {
// 构造解密对象
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(QyWxConfig.sToken,QyWxConfig.sEncodingAESKey,QyWxConfig.corpid);
// 企业微信加密签名
String sVerifyMsgSig = (String) map.get("msg_signature");
// 时间戳
Integer sVerifyTimeStamp = ObjectFormatUtil.toInteger(map.get("timestamp"));
// 随机数
String sVerifyNonce = (String) map.get("nonce");
// 加密的字符串
String sVerifyEchoStr = (String) map.get("echostr");
String sEchoStr; //需要返回的明文
sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp.toString(),
sVerifyNonce, sVerifyEchoStr);
// 添加日志
CallBackLog callBackLog = new CallBackLog();
callBackLog.setTimestamp(sVerifyTimeStamp);
callBackLog.setNonce(sVerifyNonce);
callBackLog.setEchostr(sVerifyEchoStr);
callBackLogService.addCallBackLog(callBackLog);
//返回明文
PrintWriter writer = response.getWriter();
writer.println(sEchoStr);
System.out.println(sEchoStr);
} catch (AesException | IOException e) {
e.printStackTrace();
}
}
/**
* 用于接收企业微信的回调post方式
*/
@PostMapping("/callback")
public void callBackForPost(@RequestParam Map<String,Object> param,
@RequestBody(required = false) Map<String,Object> map,
HttpServletRequest request,HttpServletResponse response){
try {
// 构造解密对象
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(QyWxConfig.sToken,QyWxConfig.sEncodingAESKey,QyWxConfig.corpid);
// 企业微信加密签名
String sVerifyMsgSig = (String) param.get("msg_signature");
// 时间戳
Integer sVerifyTimeStamp = ObjectFormatUtil.toInteger(param.get("timestamp"));
// 随机数
String sVerifyNonce = (String) param.get("nonce");
// 加密的字符串
String sVerifyEchoStr = (String) param.get("echostr");
if(sVerifyEchoStr != null) {
// 如果是验证url
String sEchoStr; //需要返回的明文
sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp.toString(),
sVerifyNonce, sVerifyEchoStr);
// 添加日志
CallBackLog callBackLog = new CallBackLog();
callBackLog.setTimestamp(sVerifyTimeStamp);
callBackLog.setNonce(sVerifyNonce);
callBackLog.setEchostr(sVerifyEchoStr);
callBackLogService.addCallBackLog(callBackLog);
//返回明文
PrintWriter writer = response.getWriter();
writer.println(sEchoStr);
writer.close();
}else{
// 如果是响应事件
String ToUserName = (String) map.get("ToUserName");
String Encrypt = (String) map.get("Encrypt");
String AgentID = (String) map.get("AgentID");
// 需要解密的xml
String sReqData = String.format("<xml><ToUserName><![CDATA[%s]]></ToUserName>" +
"<Encrypt><![CDATA[%s]]></Encrypt>" +
"<AgentID><![CDATA[%s]]></AgentID></xml>",ToUserName,Encrypt,AgentID);
// 解析后的数据
String sMsg = wxcpt.DecryptMsg(sVerifyMsgSig, sVerifyTimeStamp.toString(), sVerifyNonce, sReqData);
// 将数据转为java对象
TemplateCard templateCard = (TemplateCard) QyWxXMLUtils.convertXmlStrToObject(TemplateCard.class, sMsg);
// 点击用户
String fromUserName = templateCard.getFromUserName();
// 根据userId获取处理人
Map<String, Object> portInfo = PortConfig.findUserByQyWxUserId(fromUserName);
UserByPort userByPort = (UserByPort) portInfo.get("user");
// 获取点击的按钮
String clickKey = templateCard.getEventKey().split("_")[1];
String result = "";
if("pass".equals(clickKey)){
result = "通过";
}else{
result = "驳回";
}
// 开启线程处理审批
new Thread(new Runnable() {
@Override
public void run() {
depositoryRecordService.reviewByQyWx(templateCard);
}
}).start();
// 开启线程更改其他用户卡片模板样式
String finalResult = result;
new Thread(new Runnable() {
@Override
public void run() {
qyWxOperationService.updateTemplateCard(templateCard.getResponseCode(),userByPort.getName(), finalResult);
}
}).start();
// 待加密模板
String sRespData = String.format("<xml><ToUserName><![CDATA[%s]]></ToUserName>" +
"<FromUserName><![CDATA[%s]]></FromUserName>" +
"<CreateTime>%s</CreateTime>"+
"<MsgType><![CDATA[update_button]]></MsgType>"+
"<Button>" +
"<ReplaceName><![CDATA[%s]]></ReplaceName></Button>" +
"</xml>",ToUserName,QyWxConfig.corpid,templateCard.getCreateTime(),"已"+result);
// 加密
String sEncryptMsg = wxcpt.EncryptMsg(sRespData, sVerifyTimeStamp.toString(), sVerifyNonce);
//3.响应消息
PrintWriter out = response.getWriter();
out.print(sEncryptMsg);
out.close();
}
} catch (AesException | IOException e) {
e.printStackTrace();
}
}
/**
* 用于企业微信登录
* @param code
* @param action
* @param state
* @param request
* @return
*/
@GetMapping("/QyWxLogin")
public ModelAndView QyWxLogin(@RequestParam(required = false)String code,
@RequestParam(required = false)String action,
@RequestParam(required = false)String state,
HttpServletRequest request)
{
ModelAndView mv = new ModelAndView();
mv.addObject("userWxId","");
mv.setViewName("pages/user/login");
if(code != null) {
QyWxConfig.code = code;
JSONObject jsonObject = QyWxConfig.GetQYWXUserId();
Integer errCode = jsonObject.getInteger("errcode");
String userId = jsonObject.getString("userid");
if (errCode == 0) {
// 如果成功获取userid
Map<String, Object> portInfo = PortConfig.findUserByQyWxUserId(userId);
UserByPort userByPort =(UserByPort) portInfo.get("user");
String key = (String) portInfo.get("key");
String token = (String) portInfo.get("token");
if (userByPort != null) {
// 如果数据库中存在该用户
String keyAndToken = key + "&" +token;
// 将key与token暂存至池中保存
UserKeyAndTokenPool.addKeyAndToken(userByPort.getNumber(),keyAndToken);
// 设置放入时间
userByPort.setInstant(Instant.now());
AuthenticationTokenPool.addToken(token, userByPort);
HttpSession session = request.getSession();
session.setAttribute("token"+userByPort.getId(), token);
session.setAttribute("userToken",userByPort);
session.setMaxInactiveInterval(1800);
mv.addObject("user",userByPort);
mv.setViewName("index");
}else{
JSONObject captcha = PageController.Captcha(request);
String picPath = (String) captcha.get("picPath");
String captchaid = (String) captcha.get("captchaid");
mv.addObject("picPath", picPath);
mv.addObject("captchaid", captchaid);
mv.addObject("userWxId",userId);
}
}else{
JSONObject captcha = PageController.Captcha(request);
String picPath = (String) captcha.get("picPath");
String captchaid = (String) captcha.get("captchaid");
mv.addObject("picPath", picPath);
mv.addObject("captchaid", captchaid);
}
}else{
JSONObject captcha = PageController.Captcha(request);
String picPath = (String) captcha.get("picPath");
String captchaid = (String) captcha.get("captchaid");
mv.addObject("picPath", picPath);
mv.addObject("captchaid", captchaid);
}
return mv;
}
}

56
src/main/java/com/dreamchaser/depository_manage/controller/UserController.java

@ -17,6 +17,7 @@ import com.dreamchaser.depository_manage.security.bean.LoginType;
import com.dreamchaser.depository_manage.security.bean.UserToken;
import com.dreamchaser.depository_manage.security.bean.VerificationCode;
import com.dreamchaser.depository_manage.security.pool.AuthenticationTokenPool;
import com.dreamchaser.depository_manage.security.pool.UserKeyAndTokenPool;
import com.dreamchaser.depository_manage.security.pool.VerificationCodePool;
import com.dreamchaser.depository_manage.service.DepositoryService;
import com.dreamchaser.depository_manage.service.RoleService;
@ -33,6 +34,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.repository.query.ReactiveQueryByExampleExecutor;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mobile.device.Device;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
@ -145,12 +147,19 @@ public class UserController {
*/
@PostMapping("/login")
public RestResponse login(@RequestBody Map<String, String> map, HttpServletRequest request) {
String userWxId = map.get("userWxId");
// 用于标识当前登录是否为企业微信跳转登录
boolean flag = true;
if(!"".equals(userWxId)){
// 如果是企业微信跳转
flag = false;
}
String url = PortConfig.external_url_6666 +"/base/login";
String jsonString = JSONObject.toJSONString(map);
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,null);
} catch (IOException e) {
e.printStackTrace();
}
@ -159,15 +168,28 @@ public class UserController {
String userkey = (String) data.get("key");
if(userkey != null) {
String usertoken = (String) data.get("token");
HttpUtils.setUserKey(userkey);
HttpUtils.setUserToken(usertoken);
String keyAndToken = userkey + "&" +usertoken;
UserByPort userinfo = JSONObject.toJavaObject((JSONObject) data.get("userinfo"), UserByPort.class);
// 将key与token暂存至池中保存
UserKeyAndTokenPool.addKeyAndToken(userinfo.getNumber(),keyAndToken);
AuthenticationTokenPool.addToken(usertoken,userinfo);
HttpSession session = request.getSession();
session.setAttribute("token",usertoken);
session.setAttribute("token"+userinfo.getId(),usertoken);
session.setAttribute("userToken",userinfo);
session.setMaxInactiveInterval(1800);
if(!flag){
// 如果是企业微信跳转
Map<String,String> param = new HashMap<>();
param.put("id",userinfo.getId().toString());
param.put("workwechatid",userWxId);
// 将openid写回
PortConfig.editUserWechatOpenid(map,userinfo);
}
// 设置放入时间
// userinfo.setInstant(Instant.now());
userinfo.setInstant(Instant.now());
return new RestResponse(usertoken);
}else{
return CrudUtil.NOT_EXIST_USER_OR_ERROR_PWD_RESPONSE;
@ -193,10 +215,10 @@ public class UserController {
@GetMapping("/loginOut")
public RestResponse loginOut(HttpServletRequest request){
HttpSession session = request.getSession();
String token = (String) session.getAttribute("token");
session.invalidate();
request.removeAttribute("userToken");
AuthenticationTokenPool.removeToken(token);
// session.removeAttribute("token");
// AuthenticationTokenPool.removeToken(token);
return new RestResponse("",200,new StatusInfo("退出成功","退出成功"));
}
@ -206,10 +228,10 @@ public class UserController {
*
* @return RESPONSE200
*/
@GetMapping("/logout")
/* @GetMapping("/loginOut")
public RestResponse logout() {
return CrudUtil.RESPONSE200;
}
return new RestResponse("",200,new StatusInfo("退出成功","退出成功"));
}*/
@GetMapping("/sys/users")
public RestResponse findUsers(@RequestParam Map<String, Object> map) {
@ -222,7 +244,8 @@ public class UserController {
* @return
*/
@PostMapping("/sys/findUsers")
public RestResponse findUsersByPort(@RequestParam Map<String, Object> map) {
public RestResponse findUsersByPort(@RequestParam Map<String, Object> map,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
String url = PortConfig.external_url + "/staff/archiveslist";
if(map.containsKey("company")){
map.put("company",ObjectFormatUtil.toInteger(map.get("company")));
@ -238,7 +261,7 @@ public class UserController {
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();
}
@ -464,20 +487,21 @@ public class UserController {
* @return
*/
@GetMapping("/getCaptchaid")
public JSONObject getCaptchaid(){
JSONObject captcha = PageController.Captcha();
public JSONObject getCaptchaid(HttpServletRequest httpServletRequest){
JSONObject captcha = PageController.Captcha(httpServletRequest);
return captcha;
}
@GetMapping("/findUserRole")
public RestResponse findUserRole(@RequestParam("userId") Integer userId){
public RestResponse findUserRole(@RequestParam("userId") Integer userId,HttpServletRequest request){
Map<String,Object> param = new HashMap<>();
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
param.put("classes",1);
param.put("userId",userId);
List<UserByPortP> userByPortPList = new ArrayList<>();
List<RoleAndDepository> roleAndDepositoryByCondition = roleService.findRoleAndDepositoryByCondition(param);
for (int i = 0; i < roleAndDepositoryByCondition.size(); i++) {
UserByPort userByPort = PageController.FindUserById(roleAndDepositoryByCondition.get(i).getUserId());
UserByPort userByPort = PageController.FindUserById(roleAndDepositoryByCondition.get(i).getUserId(),userToken);
UserByPortP up = new UserByPortP(userByPort);
up.setId(roleAndDepositoryByCondition.get(i).getId());
up.setDepositoryName(roleAndDepositoryByCondition.get(i).getDepositoryName());

2
src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecord.java

@ -53,7 +53,7 @@ public class ApplicationOutRecord {
/**
* 部门负责人
*/
private Integer departmenthead;
private String departmenthead;
/**
* 部门负责人意见1通过2退回

17
src/main/java/com/dreamchaser/depository_manage/entity/CallBackLog.java

@ -0,0 +1,17 @@
package com.dreamchaser.depository_manage.entity;
import lombok.Data;
@Data
public class CallBackLog {
public Integer id;
public String msg_signature;
public Integer timestamp;
public String nonce;
public String echostr;
public String xmlstr;
public String jsonstr;
public String reqdata;
public Integer addtime;
}

18
src/main/java/com/dreamchaser/depository_manage/entity/UserByPort.java

@ -6,8 +6,8 @@ import java.time.Instant;
@Data
public class UserByPort {
private static Integer term = 1800; // 登录有效时间
// 登录令牌,默认有效期为两小时
final long DEFAULT_TERM=60*60*3;
/**
@ -282,6 +282,11 @@ public class UserByPort {
*/
private String positionname;
/**
* 是否为本部门负责人12
*/
private Integer personincharge;
/**
* 身份认证
*/
@ -292,13 +297,18 @@ public class UserByPort {
*/
private Instant instant;
/**
* 有效期(单位)
*/
private long term = DEFAULT_TERM;
/**
* 根据时间判断是否有效
* @return 有效则返回true否则返回false
*/
/* public boolean isValid(){
public boolean isValid(){
return Instant.now().getEpochSecond()-instant.getEpochSecond()<=term;
}*/
}

53
src/main/java/com/dreamchaser/depository_manage/intercepter/UserInterceptor.java

@ -1,8 +1,12 @@
package com.dreamchaser.depository_manage.intercepter;
import com.dreamchaser.depository_manage.config.QyWxConfig;
import com.dreamchaser.depository_manage.entity.UserByPort;
import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.security.pool.AuthenticationTokenPool;
import com.dreamchaser.depository_manage.utils.HttpUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.mobile.device.Device;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
@ -11,6 +15,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Enumeration;
/**
* 认证拦截器如果请求头中有相应凭证则放行否则拦截返回认证失效错误
@ -23,13 +28,15 @@ public class UserInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws MyException {
//拿到requset中的head
String header = request.getHeader("user-agent");
String token =null;
HttpSession session = request.getSession();
token = (String) session.getAttribute("token");
UserByPort userByPort = (UserByPort) session.getAttribute("userToken");
if(userByPort!=null){
token = (String) session.getAttribute("token"+userByPort.getId());
}
//如果是访问logout则删除对应的令牌
if ("/logout".equals(request.getServletPath())){
if ("/loginOut".equals(request.getServletPath())){
AuthenticationTokenPool.removeToken(token);
session.invalidate();
return true;
@ -37,16 +44,52 @@ public class UserInterceptor extends HandlerInterceptorAdapter {
if("/getCaptchaid".equals(request.getServletPath())){
return true;
}
if (token!=null&&AuthenticationTokenPool.getToken(token)!=null){
if("/QyWxLogin".equals(request.getServletPath())){
return true;
}
if (!"".equals(token) &&token!=null&&AuthenticationTokenPool.getToken(token)!=null){
request.setAttribute("userToken",AuthenticationTokenPool.getToken(token));
return true;
}else {
try {
if(isMobileDevice(request)){
if(header.contains("wxwork")) {
// 如果是企业微信跳转
QyWxConfig.token = QyWxConfig.GetQYWXToken();
response.sendRedirect(QyWxConfig.getQYWXCodeUrl());
}else{
response.sendRedirect("/login");
}
}else {
response.sendRedirect("/login");
}
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
}
public boolean isMobileDevice(HttpServletRequest request) {
String requestHeader = request.getHeader("user-agent").toLowerCase();
String[] deviceArray = new String[]{"android", "iphone", "ios", "windows phone"};
if (requestHeader == null) {
return false;
}
requestHeader = requestHeader.toLowerCase();
for (int i = 0; i < deviceArray.length; i++) {
if (requestHeader.indexOf(deviceArray[i]) > 0) {
return true;
}
}
return false;
}
}

28
src/main/java/com/dreamchaser/depository_manage/mapper/CallBackLogMapper.java

@ -0,0 +1,28 @@
package com.dreamchaser.depository_manage.mapper;
import com.dreamchaser.depository_manage.entity.CallBackLog;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.Map;
@Mapper
@Repository
public interface CallBackLogMapper {
/**
* 添加回调日志
* @param map
* @return
*/
Integer addCallBackLog(Map<String,Object> map);
/**
* 添加回调日志
* @param callBackLog
* @return
*/
Integer addCallBackLog(CallBackLog callBackLog);
}

35
src/main/java/com/dreamchaser/depository_manage/mapper/CallBackLogMapper.xml

@ -0,0 +1,35 @@
<?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">
<!-- depository -->
<mapper namespace="com.dreamchaser.depository_manage.mapper.CallBackLogMapper">
<resultMap id="callBackMap" type="com.dreamchaser.depository_manage.entity.CallBackLog">
<id column="id" property="id" jdbcType="INTEGER" />
<result column="msg_signature" property="msg_signature" jdbcType="VARCHAR" />
<result column="timestamp" property="timestamp" jdbcType="INTEGER" />
<result column="nonce" property="nonce" jdbcType="VARCHAR" />
<result column="echostr" property="echostr" jdbcType="VARCHAR" />
<result column="xmlstr" property="xmlstr" jdbcType="VARCHAR" />
<result column="jsonstr" property="jsonstr" jdbcType="VARCHAR" />
<result column="reqdata" property="reqdata" jdbcType="VARCHAR"/>
<result column="addtime" property="addtime" jdbcType="INTEGER"/>
</resultMap>
<insert id="addCallBackLog">
INSERT INTO callback_log (
id, msg_signature, timestamp,nonce,echostr,xmlstr,jsonstr,reqdata,addtime
) VALUES (
#{id},
#{msg_signature},
#{timestamp},
#{nonce},
#{echostr},
#{xmlstr},
#{jsonstr},
#{reqdata},
#{addtime}
)
</insert>
</mapper>

10
src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.xml

@ -77,7 +77,7 @@
<result column="aorcode" property="code" jdbcType="VARCHAR" />
<result column="aorpirce" property="price" jdbcType="INTEGER" />
<result column="aorquantity" property="quantity" jdbcType="INTEGER" />
<result column="departmenthead" property="departmenthead" jdbcType="INTEGER" />
<result column="departmenthead" property="departmenthead" jdbcType="VARCHAR" />
<result column="departmentheadPass" property="departmentheadPass" jdbcType="INTEGER" />
<result column="departmentHeadTime" property="departmentheadTime" jdbcType="INTEGER" />
<result column="departmentheadMessage" property="departmentheadMessage" jdbcType="VARCHAR" />
@ -170,11 +170,11 @@
count(*)
FROM applicationOutRecordInfo WHERE 1=1
<if test='isDone == "0"'>
and (departmentHeadTime = 0 and departmenthead=#{userId} and DepartmentheadPass != 2)
and (departmentHeadTime = 0 and FIND_IN_SET(#{userId},departmenthead) != 0 and DepartmentheadPass != 2)
or (depositoryManagerTime = 0 and FIND_IN_SET(#{userId},depositoryManager) != 0 and DepartmentheadPass != 2)
</if>
<if test='isDone == "1"'>
and (departmentHeadTime != 0 and departmenthead=#{userId})
and (departmentHeadTime != 0 and FIND_IN_SET(#{userId},departmenthead) != 0)
or (depositoryManagerTime != 0 and FIND_IN_SET(#{userId},depositoryManager) != 0)
</if>
</select>
@ -276,11 +276,11 @@
<include refid="simpleApplicationOut" />
FROM applicationOutRecordInfo WHERE 1=1
<if test='isDone == "0"'>
and (departmentHeadTime = 0 and departmenthead=#{userId} and DepartmentheadPass = 3)
and (departmentHeadTime = 0 and FIND_IN_SET(#{userId},departmenthead) != 0 and DepartmentheadPass = 3)
or (depositoryManagerTime = 0 and FIND_IN_SET(#{userId},depositoryManager) != 0 and depositoryManagerPass = 3)
</if>
<if test='isDone == "1"'>
and (departmentHeadTime != 0 and departmenthead=#{userId} and DepartmentheadPass != 3)
and (departmentHeadTime != 0 and FIND_IN_SET(#{userId},departmenthead) != 0 and DepartmentheadPass != 3)
or (depositoryManagerTime != 0 and FIND_IN_SET(#{userId},depositoryManager) != 0 and depositoryManagerPass != 3)
</if>
group by aorid

102
src/main/java/com/dreamchaser/depository_manage/pojo/ApplicationOutRecordMinP.java

@ -0,0 +1,102 @@
package com.dreamchaser.depository_manage.pojo;
import com.dreamchaser.depository_manage.entity.ApplicationOutRecordMin;
import lombok.Data;
import java.math.BigInteger;
@Data
public class ApplicationOutRecordMinP {
/**
* id
*/
private Integer id;
/**
* 物料id
*/
private Integer mid;
/**
* 物料名称
*/
private String mname;
/**
* 物料编码
*/
private BigInteger mcode;
/**
* 仓库id
*/
private Integer depositoryId;
/**
* 仓库名称
*/
private String depositoryName;
/**
* 对应库位id
*/
private Integer placeId;
/**
* 库位编码
*/
private String placeCode;
/**
* 数量
*/
private Integer quantity;
/**
* 出库单号
*/
private String code;
/**
* 审核人编号
*/
private Integer checkId;
/**
* 审核人姓名
*/
private String checkerName;
/**
* 申请人姓名
*/
private String applicantName;
/**
* 主订单编号
*/
private Integer parentId;
/**
* 当前申请金额
*/
private Double price;
/**
* 子订单状态1未完成2完成
*/
private Integer state;
public ApplicationOutRecordMinP(ApplicationOutRecordMin recordMin) {
this.id = recordMin.getId();
this.mid = recordMin.getMid();
this.depositoryId = recordMin.getDepositoryId();
this.checkId = recordMin.getCheckId();
this.code = recordMin.getCode();
this.quantity = recordMin.getQuantity();
this.state = recordMin.getState();
this.parentId = recordMin.getParentId();
this.placeId = recordMin.getPlaceId();
}
}

2
src/main/java/com/dreamchaser/depository_manage/pojo/ApplicationOutRecordP.java

@ -68,7 +68,7 @@ public class ApplicationOutRecordP {
/**
* 部门负责人编号
*/
private Integer departmenthead;
private String departmenthead;
/**
* 部门负责人姓名

6
src/main/java/com/dreamchaser/depository_manage/pojo/UserByPortP.java

@ -74,7 +74,10 @@ public class UserByPortP {
*/
private String depositoryName;
/**
* 是否为本部门负责人12
*/
private Integer personincharge;
public UserByPortP(UserByPort userByPort) {
@ -90,6 +93,7 @@ public class UserByPortP {
this.sunmaindeparmentname = userByPort.getSunmaindeparmentname();
this.workpostname = userByPort.getWorkpostname();
this.positionname = userByPort.getPositionname();
this.personincharge = userByPort.getPersonincharge();
}
public UserByPortP(String number, String name, Integer state, Integer gender, Integer health, String mobilephone, String companyname, String maindeparmentname, String sunmaindeparmentname, String workpostname, String positionname) {

29
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/CallBackBaseXml.java

@ -0,0 +1,29 @@
package com.dreamchaser.depository_manage.pojo.callBackXml;
import lombok.Data;
import org.apache.commons.math3.util.Precision;
import javax.xml.bind.annotation.*;
/**
* 基础xml
*/
@Data
//@XmlRootElement(name = "xml")
@XmlAccessorType(XmlAccessType.FIELD)
public class CallBackBaseXml {
private String ToUserName; //企业微信CorpID
private String FromUserName; //成员UserID
private String CreateTime; //消息创建时间(整型)
private String MsgType; //消息类型,此时固定为:event
private String AgentID; //企业应用的id,整型。可在应用的设置页面查看
}

22
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/CallBackXMl_DLWZ.java

@ -0,0 +1,22 @@
package com.dreamchaser.depository_manage.pojo.callBackXml;
import lombok.Data;
import javax.xml.bind.annotation.XmlRootElement;
@Data
@XmlRootElement(name = "xml")
public class CallBackXMl_DLWZ extends CallBackBaseXml {
/**
* 用于上报地理位置时的回调xml
*/
private String Event; // 事件类型,subscribe(关注)、unsubscribe(取消关注)
private String EventKey; // 事件KEY值,此事件该值为空
private String Latitude; //地理位置纬度
private String Longitude; //地理位置经度
private String Precision; // 地理位置精度
private String AppType; // app类型,在企业微信固定返回wxwork,在微信不返回该字段
}

15
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/CallBackXml_button.java

@ -0,0 +1,15 @@
package com.dreamchaser.depository_manage.pojo.callBackXml;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class CallBackXml_button extends CallBackBaseXml {
private TemplateCard TemplateCard;
}

16
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/ButtonInteraction.java

@ -0,0 +1,16 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard;
import com.dreamchaser.depository_manage.config.QyWx_template_card.BaseMessage;
import lombok.Data;
/**
* 文本消息
*
*/
@Data
public class ButtonInteraction extends BaseMessage {
// 模板卡片
private TemplateCard template_card;
// 否 表示是否是保密消息,0表示否,1表示是,默认0
private int safe;
}

73
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard.java

@ -0,0 +1,73 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard;
import com.dreamchaser.depository_manage.pojo.callBackXml.CallBackBaseXml;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
/**
* 卡片模板
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@Data
@XmlRootElement(name="xml")//根节点
public class TemplateCard {
private String ToUserName; //企业微信CorpID
private String FromUserName; //成员UserID
private String CreateTime; //消息创建时间(整型)
private String MsgType; //消息类型,此时固定为:event
private String AgentID; //企业应用的id,整型。可在应用的设置页面查看
/**
* 模板卡片类型投票选择型卡片填写"vote_interaction"
*/
private String CardType;
/**
* 二级普通文本建议不超过160个字支持id转译
*/
private String SubTitleText;
/**
* 响应事件key
*/
private String EventKey;
/**
* 任务id同一个应用任务id不能重复只能由数字字母和_-@组成最长128字节
*/
private String TaskId;
/**
* 响应的事件类型
*/
private String Event;
/**
* 下拉式的选择器
*/
private TemplateCard_SelectedItems SelectedItems;
/**
* 按钮替换文案填写本字段后会展现灰色不可点击按钮
*/
private String ReplaceText;
/**
* ResponseCode
*/
private String ResponseCode;
}

16
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_SelectedItems.java

@ -0,0 +1,16 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlAccessorType(XmlAccessType.FIELD)
@Data
//@XmlRootElement(name="SelectedItems")//根节点
public class TemplateCard_SelectedItems {
TemplateCard_button_selection SelectedItem;
}

18
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_action.java

@ -0,0 +1,18 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard;
import lombok.Data;
/**
* 操作
*/
@Data
public class TemplateCard_action {
/**
* 操作的描述文案
*/
private String Text;
/**
* 操作key值用户点击后会产生回调事件将本参数作为EventKey返回回调事件会带上该key值最长支持1024字节不可重复
*/
private String Key;
}

27
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_action_menu.java

@ -0,0 +1,27 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
/**
* 卡片右上角更多操作按钮
*/
@XmlAccessorType(XmlAccessType.FIELD)
@Data
@XmlRootElement(name = "ActionMenu")
public class TemplateCard_action_menu {
/**
* 更多操作界面的描述
*/
private String Desc;
/**
* 操作列表列表长度取值范围为 [1, 3]
*/
private List<TemplateCard_action> ActionList;
}

34
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_button.java

@ -0,0 +1,34 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
/**
* 按钮
*/
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class TemplateCard_button {
/**
* 按钮点击事件类型0 或不填代表回调点击事件1 代表跳转url
*/
private Integer Yype;
/**
* 按钮文案建议不超过10个字
*/
private String Text;
/**
* 按钮样式目前可填1~4不填或错填默认1
*/
private Integer Style;
/**
* 按钮key值用户点击后会产生回调事件将本参数作为EventKey返回回调事件会带上该key值最长支持1024字节不可重复button_list.type是0时必填
*/
private String Key;
/**
* 跳转事件的urlbutton_list.type是1时必填
*/
private String Url;
}

40
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_button_selection.java

@ -0,0 +1,40 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
/**
* 下拉式的选择器
*/
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class TemplateCard_button_selection {
/**
* 下拉式的选择器的key用户提交选项后会产生回调事件回调事件会带上该key值表示该题最长支持1024字节
*/
private String QuestionKey;
/**
* 下拉式的选择器左边的标题
*/
private String Title;
/**
* 选项列表下拉选项不超过 10 最少1个
*/
private TemplateCard_button_selection_option OptionIds;
/**
* 下拉式的选择器默认选定的选项
*/
private String SelectedId;
/**
* 是否可以选择状态
*/
private Boolean Disable;
}

23
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_button_selection_option.java

@ -0,0 +1,23 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
/**
* 下拉选项
*/
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class TemplateCard_button_selection_option {
/**
* 下拉式的选择器选项的id用户提交后会产生回调事件回调事件会带上该id值表示该选项最长支持128字节不可重复
*/
private String OptionId;
/**
* 下拉式的选择器选项的文案建议不超过16个字
*/
private String Text;
}

34
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_card_action.java

@ -0,0 +1,34 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
/**
* 整体卡片的点击跳转事件
*/
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class TemplateCard_card_action {
/**
* 跳转事件类型0或不填代表不是链接1 代表跳转url2 代表打开小程序
*/
private Integer Type;
/**
* 跳转事件的urlcard_action.type是1时必填
*/
private String Url;
/**
* 跳转事件的小程序的appid必须是与当前应用关联的小程序card_action.type是2时必填
*/
private Integer AppId;
/**
* 跳转事件的小程序的pagepathcard_action.type是2时选填
*/
private String PagePath;
}

47
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_horizontal_content.java

@ -0,0 +1,47 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
/**
* 二级标题+文本列表
*/
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class TemplateCard_horizontal_content {
/**
* 链接类型0或不填代表不是链接1 代表跳转url2 代表下载附件3 代表点击跳转成员详情
*/
private Integer Type;
/**
* 二级标题建议不超过5个字
*/
private String KeyName;
/**
* 二级文本如果horizontal_content_list.type是2该字段代表文件名称要包含文件类型建议不超过30个字支持id转译
*/
private String Value;
/**
* 链接跳转的urlhorizontal_content_list.type是1时必填
*/
private String Url;
/**
* 附件的media_idhorizontal_content_list.type是2时必填
*/
private Integer MediaId;
/**
* 成员详情的useridhorizontal_content_list.type是3时必填
*/
private String UserId;
}

27
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_main_title.java

@ -0,0 +1,27 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
/**
* 一级标题
*/
@XmlAccessorType(XmlAccessType.FIELD)
@Data
@XmlRootElement(name = "MainTitle")
public class TemplateCard_main_title {
/**
* 一级标题建议不超过36个字支持id转译
*/
private String Title;
/**
* 标题辅助信息建议不超过44个字支持id转译
*/
private String Desc;
}

31
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/TemplateCard_source.java

@ -0,0 +1,31 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
/*
卡片来源样式信息
*/
@XmlAccessorType(XmlAccessType.FIELD)
@Data
@XmlRootElement(name = "Source")
public class TemplateCard_source {
/**
* 来源图片的url来源图片的尺寸建议为72*72
*/
private String IconUrl;
/**
* 来源图片的描述建议不超过20个字支持id转译
*/
private String Desc;
/**
* 来源文字的颜色目前支持0(默认) 灰色1 黑色2 红色3 绿色
*/
private Integer DescColor;
}

38
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/callBackXml_button_templatecard/Template_quote_area.java

@ -0,0 +1,38 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
/**
* 引用文献样式
*/
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class Template_quote_area {
/**
* 引用文献样式区域点击事件0或不填代表没有点击事件1 代表跳转url2 代表跳转小程序
*/
private Integer Type;
/**
* 点击跳转的urlquote_area.type是1时必填
*/
private String Url;
/**
* 点击跳转的小程序的appid必须是与当前应用关联的小程序quote_area.type是2时必填
*/
private Integer Appid;
/**
* 点击跳转的小程序的pagepathquote_area.type是2时选填
*/
private String PagePath;
/**
* 引用文献样式的标题
*/
private String Title;
/**
* 引用文献样式的引用文案
*/
private String QuoteText;
}

2
src/main/java/com/dreamchaser/depository_manage/security/pool/AuthenticationTokenPool.java

@ -38,7 +38,7 @@ public class AuthenticationTokenPool {
}
//判断令牌是否过期
if (userToken != null){
if (userToken.isValid()){
return userToken;
}else{
//清除过期令牌

33
src/main/java/com/dreamchaser/depository_manage/security/pool/UserKeyAndTokenPool.java

@ -0,0 +1,33 @@
package com.dreamchaser.depository_manage.security.pool;
import com.dreamchaser.depository_manage.entity.UserByPort;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 用户登录后的key与token池
*/
public class UserKeyAndTokenPool {
private static Map<String, String> pool = new ConcurrentHashMap<>(200);
/**
* 用于暂存当前用户的key和token
* @param key 用户工号
* @param keyAndToken key+token => key & token
*/
public static void addKeyAndToken(String key, String keyAndToken){
pool.put(key, keyAndToken);
}
public static String getKeyAndToken(String key){
String keyAndToken = pool.get(key);
return keyAndToken;
}
public static void removeKeyAndToken(String key){
pool.remove(key);
}
}

21
src/main/java/com/dreamchaser/depository_manage/service/CallBackLogService.java

@ -0,0 +1,21 @@
package com.dreamchaser.depository_manage.service;
import com.dreamchaser.depository_manage.entity.CallBackLog;
import java.util.Map;
public interface CallBackLogService {
/**
* 添加回调日志
* @param map
* @return
*/
Integer addCallBackLog(Map<String,Object> map);
/**
* 添加回调日志
* @param callBackLog
* @return
*/
Integer addCallBackLog(CallBackLog callBackLog);
}

23
src/main/java/com/dreamchaser/depository_manage/service/DepositoryRecordService.java

@ -2,7 +2,9 @@ package com.dreamchaser.depository_manage.service;
import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.pojo.*;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
@ -38,7 +40,16 @@ public interface DepositoryRecordService {
* @param map 仓库调度信息
* @return 受影响的行数
*/
Integer review(Map<String,Object> map,Integer userId);
Integer review(Map<String,Object> map,Integer userId,UserByPort userToken);
/**
* 用于企业微信的审核申请处理
* @param templateCard
* @return
*/
Integer reviewByQyWx(TemplateCard templateCard);
/**
* 根据id修改仓库调度记录
@ -52,7 +63,7 @@ public interface DepositoryRecordService {
* @param id id
* @return 该id的数据记录
*/
DepositoryRecordP findDepositoryRecordById(Integer id);
DepositoryRecordP findDepositoryRecordById(Integer id, HttpServletRequest request);
/**
* 查找所有仓库调度记录
@ -65,7 +76,7 @@ public interface DepositoryRecordService {
* @param map 查询参数
* @return 符合条件的仓库调度记录集合
*/
List<DepositoryRecordP> findDepositoryRecordPByCondition(Map<String,Object> map);
List<DepositoryRecordP> findDepositoryRecordPByCondition(Map<String,Object> map,HttpServletRequest request);
/**
@ -73,14 +84,14 @@ public interface DepositoryRecordService {
* @param map
* @return
*/
List<ApplicationInRecordP> findApplicationInRecordPByCondition(Map<String,Object> map);
List<ApplicationInRecordP> findApplicationInRecordPByCondition(Map<String,Object> map,HttpServletRequest request);
/**
* 根据条件查询出库记录同时支持分页查询
* @param map
* @return
*/
List<ApplicationOutRecordP> findApplicationOutRecordPByCondition(Map<String,Object> map);
List<ApplicationOutRecordP> findApplicationOutRecordPByCondition(Map<String,Object> map,HttpServletRequest request);
/**
@ -108,7 +119,7 @@ public interface DepositoryRecordService {
* @param map 查询参数
* @return 我的任务
*/
List<SimpleApplicationOutRecordP> findMyTask(Map<String, Object> map);
List<SimpleApplicationOutRecordP> findMyTask(Map<String, Object> map,HttpServletRequest request);
/**
* 根据id删除仓库记录

11
src/main/java/com/dreamchaser/depository_manage/service/DepositoryService.java

@ -17,13 +17,13 @@ public interface DepositoryService {
* @param map 参数map
* @return 受影响的行数
*/
Integer insertDepository(Map<String,Object> map);
Integer insertDepository(Map<String,Object> map,UserByPort userByPort);
/**
* 查询所有仓库
* @return 仓库集合
*/
List<Depository> findDepositoryRecordPByCondition(Map<String,Object> map);
List<Depository> findDepositoryRecordPByCondition(Map<String,Object> map,UserByPort userByPort);
/**
* 根据条件查询对应的总条数
@ -154,4 +154,11 @@ public interface DepositoryService {
*/
Depository findDepositoryByCode(String code);
/**
* 获取当前用户与其部门所管理的仓库
* @param userByPort
* @return
*/
List<Depository> findDepositoryByAdminorgAndUser(UserByPort userByPort);
}

35
src/main/java/com/dreamchaser/depository_manage/service/impl/CallBackLogServiceImpl.java

@ -0,0 +1,35 @@
package com.dreamchaser.depository_manage.service.impl;
import com.dreamchaser.depository_manage.entity.CallBackLog;
import com.dreamchaser.depository_manage.mapper.CallBackLogMapper;
import com.dreamchaser.depository_manage.service.CallBackLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class CallBackLogServiceImpl implements CallBackLogService {
/**
* 添加回调日志
* @param map
* @return
*/
@Autowired
CallBackLogMapper callBackLogMapper;
@Override
public Integer addCallBackLog(Map<String, Object> map) {
return callBackLogMapper.addCallBackLog(map);
}
/**
* 添加回调日志
* @param callBackLog
* @return
*/
public Integer addCallBackLog(CallBackLog callBackLog){
return callBackLogMapper.addCallBackLog(callBackLog);
}
}

342
src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java

@ -1,6 +1,7 @@
package com.dreamchaser.depository_manage.service.impl;
import cn.hutool.core.util.IdUtil;
import cn.hutool.db.Page;
import cn.hutool.log.Log;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@ -11,10 +12,13 @@ import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.mapper.*;
import com.dreamchaser.depository_manage.pojo.*;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
import com.dreamchaser.depository_manage.security.bean.UserToken;
import com.dreamchaser.depository_manage.service.DepositoryRecordService;
import com.dreamchaser.depository_manage.service.RoleService;
import com.dreamchaser.depository_manage.utils.*;
import org.apache.http.protocol.HTTP;
import org.apache.poi.ss.formula.functions.T;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.Mergeable;
@ -27,6 +31,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.hutool.core.lang.Snowflake;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
@ -60,6 +65,9 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
@Autowired
private RedissonClient redissonClient;
@Autowired
private QyWxOperationService qyWxOperationService;
/**
* 提交申请插入一条仓库调度记录
@ -185,7 +193,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
dname = depositoryRecordById.getDname();
}
Administration company = PageController.getCompany(userToken.getMaindeparment());
Administration company = PageController.getCompany(userToken.getMaindeparment(), userToken);
String code = createCode(dname, "outOrderNumber", "out", company.getName());
map.put("code", code);
map.put("pass", 3);
@ -409,6 +417,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
/**
* 根据主订单获取子订单
*
* @param parentId
* @return
*/
@ -479,20 +488,20 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
// 当前出库金额
Double sum = material.getPrice() * record.getQuantity();
material.setAmounts(material.getAmounts() - sum);
material.setQuantity(material.getQuantity() - record.getQuantity());
material.setNumberOfTemporary(material.getNumberOfTemporary() - record.getQuantity());
material.setQuantity(material.getQuantity() - applicationOutMinById.getQuantity());
material.setNumberOfTemporary(material.getNumberOfTemporary() - applicationOutMinById.getQuantity());
// 修改物料信息
materialMapper.updateMaterial(material);
if (placeAndMaterialByMidAndPid != null) { //如果库位不为空
// 修改当前库位存放物料的数量
placeAndMaterialByMidAndPid.setQuantity(placeAndMaterialByMidAndPid.getQuantity() - record.getQuantity());
placeAndMaterialByMidAndPid.setQuantity(placeAndMaterialByMidAndPid.getQuantity() - applicationOutMinById.getQuantity());
placeMapper.updateMaterialAndPlace(placeAndMaterialByMidAndPid);
}
// 修改库位数量
Place placeById = placeMapper.findPlaceById(placeId);
placeById.setQuantity(placeById.getQuantity() - record.getQuantity());
placeById.setQuantity(placeById.getQuantity() - applicationOutMinById.getQuantity());
placeMapper.UpdatePlace(placeById);
@ -502,6 +511,30 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
// 修改redis中本子订单完成人
// redisTemplate.opsForHash().put(redisMinRecordKey,"manager",userByPort.getId().toString());
// 获取当前订单中所有管理员
String manager = (String) redisTemplate.opsForHash().get(redisMinRecordKey, "manager");
// 获取其他管理员
String[] managerSplit = manager.replace(userByPort.getId() + ",", "").split(",");
if (managerSplit.length == 0) {
managerSplit = new String[0];
}
for (int i = 0; i < managerSplit.length; i++) {
// 删除其他管理员的订单记录
String otherManager = "user:" + managerSplit[i];
String minRecord = (String) redisTemplate.opsForHash().get(otherManager, "minRecord");
// 删除其他管理员中当前已完成的订单
if (minRecord == null) {
continue;
}
minRecord = minRecord.replace(redisMinRecordKey + ",", "");
if (minRecord.length() == 2) {
// []
// 如果当前用户已经没有剩余订单,则删除
redisTemplate.delete(otherManager);
} else {
redisTemplate.opsForHash().put(otherManager, "minRecord", minRecord);
}
}
// 删除已完成的订单
redisTemplate.delete(redisMinRecordKey);
// 获取该用户在redis中的订单记录
@ -510,11 +543,12 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
String minRecord = (String) redisTemplate.opsForHash().get(key, "minRecord");
// 删除用户中当前已完成的订单
minRecord = minRecord.replace(redisMinRecordKey + ",", "");
redisTemplate.opsForHash().put(key,"minRecord",minRecord);
if (minRecord.length() == 2) {
// []
// 如果当前用户已经没有剩余订单,则删除
redisTemplate.delete("user:" + userByPort.getId());
} else {
redisTemplate.opsForHash().put(key, "minRecord", minRecord);
}
// 获取出库仓库信息
@ -523,9 +557,9 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
// 获取主订单单号
StringBuilder code = new StringBuilder(record.getCode());
// 获取申请用户信息
UserByPort applicantUser = PageController.FindUserById(record.getApplicantId());
UserByPort applicantUser = PageController.FindUserById(record.getApplicantId(), userByPort);
// 获取申请用户行政组织
Administration company = PageController.getCompany(applicantUser.getMaindeparment());
Administration company = PageController.getCompany(applicantUser.getMaindeparment(), userByPort);
// 获取部门名称简写
String conpanyName = WordUtil.getPinYinHeadChar(company.getName());
// 获取仓库名称简写
@ -565,6 +599,19 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
map.put("id", record.getId());
// 修改状态为完成
depositoryRecordMapper.updateApplicationOutRecord(map);
// 将最终完成的订单抄送给仓储负责人
String depositoryManagerIds = record.getDepositoryManager();
String[] depositoryManagers = depositoryManagerIds.split(",");
StringBuilder depositoryManagerByQyWx = new StringBuilder();
// for (int i = 0; i < depositoryManagers.length; i++) {
// Integer uid = ObjectFormatUtil.toInteger(depositoryManagers[i]);
// UserByPort depositoryManager = PageController.FindUserById(uid, userByPort);
// depositoryManagerByQyWx.append(depositoryManager.getWorkwechat()+",");
// }
depositoryManagerByQyWx.append("PangFuZhen,");
JSONObject jsonObject = qyWxOperationService.sendCcMessageToUsers(depositoryManagerByQyWx.toString(), record.getId());
// 删除redis中本订单
redisTemplate.delete("record:" + record.getId());
}
@ -581,8 +628,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
restResponse.setStatus(200);
restResponse.setData("");
restResponse.setStatusInfo(new StatusInfo("出库成功", "出库成功"));
}
else{
} else {
restResponse.setStatus(508);
restResponse.setData("");
restResponse.setStatusInfo(new StatusInfo("出库失败", "出库失败,库存不足"));
@ -628,7 +674,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
map.put("transferId", transferId);
// 获取当前转移物料仓库
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(material.getDepositoryId());
Administration company = PageController.getCompany(userByPort.getMaindeparment());
Administration company = PageController.getCompany(userByPort.getMaindeparment(), userByPort);
// 生成出库订单
map.put("code", createCode(depositoryRecordById.getDname(), "outOrderNumber", "out", company.getName()));
String placeId = map.get("fromPlaceId").toString();
@ -641,6 +687,17 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
// 清除主键
map.remove("id");
map.put("parentId", id);
String departMentHeadQyWxName = (String) map.get("departMentHeadQyWxName");
JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName, ObjectFormatUtil.toInteger(id), true);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
QyWxMessageMap.put("responseCode",jsonObject.getString("response_code"));
// key user:300450:QyWxOut:1
redisTemplate.opsForHash().putAll("user:"+userByPort.getNumber()+":QyWxOutId:"+id,QyWxMessageMap);
// 设置过期时间为三天
redisTemplate.expire("user:"+userByPort.getNumber()+":QyWxOutId:"+id,72,TimeUnit.HOURS);
return depositoryRecordMapper.insertApplicationOutRecordMin(map);
}
@ -652,30 +709,68 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
*/
@Override
@Transactional
public Integer review(Map<String, Object> map, Integer userid) {
public Integer review(Map<String, Object> map, Integer userid, UserByPort userToken) {
ApplicationOutRecordP record = depositoryRecordMapper.findApplicationOutRecordPById(ObjectFormatUtil.toInteger(map.get("id")));
Object id = map.get("id"); // 主订单编号
map.remove("id");
if (map.containsKey("departmentheadPass")) {
String result = "";
String simpleTime = DateUtil.getSimpleTime(new Date());
map.put("departmentheadTime", DateUtil.DateTimeToTimeStamp(simpleTime));
map.put("departmenthead", userid);
Integer departmentheadPass = (Integer) map.get("departmentheadPass");
if (departmentheadPass == 1) {
result = "通过";
map.put("state", "待仓储中心负责人审核");
// 获取仓储中心详情
Administration company = PageController.getCompany(361);
Administration company = PageController.getCompany(361, userToken);
// 获取仓储中心负责人
List<UserByPort> departmentHeadByUser = PortConfig.findDepartmentHeadByUser(company);
List<UserByPort> departmentHeadByUser = PortConfig.findDepartmentHeadByUser(company, userToken);
StringBuilder depositoryManager = new StringBuilder();
StringBuilder QyWxUid = new StringBuilder();
for (int i = 0; i < departmentHeadByUser.size(); i++) {
depositoryManager.append(departmentHeadByUser.get(i).getId() + ",");
// QyWxUid.append(departmentHeadByUser.get(i).getWorkwechat() + ",");
}
QyWxUid.append("PangFuZhen,");
map.put("depositoryManager", depositoryManager.toString());
// 向仓储中心负责人发送新的消息
new Thread(new Runnable() {
@Override
public void run() {
JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(id), false);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
QyWxMessageMap.put("responseCode",jsonObject.getString("response_code"));
// key user:300450:QyWxOut:1
// 部门负责人number
redisTemplate.opsForHash().putAll("user:"+userToken.getNumber()+":QyWxOutId:"+id,QyWxMessageMap);
// 设置过期时间为三天
redisTemplate.expire("user:"+userToken.getNumber()+":QyWxOutId:"+id,72,TimeUnit.HOURS);
}
}).start();
} else {
result = "驳回";
map.put("state", "部门负责人审核未通过");
}
// 开启线程更改其他用户卡片模板样式
String finalResult = result;
new Thread(new Runnable() {
@Override
public void run() {
// 获取responseCode(key为申请人number)
//获取申请人信息
UserByPort applicantUser = PageController.FindUserById(record.getApplicantId(), userToken);
String key = "user:"+applicantUser.getNumber()+":QyWxOutId:"+id;
String responseCode = (String) redisTemplate.opsForHash().get(key, "responseCode");
qyWxOperationService.updateTemplateCard(responseCode,userToken.getName(), finalResult);
}
}).start();
} else {
String result = "";
// 开启线程更改其他用户卡片模板样式
String simpleTime = DateUtil.getSimpleTime(new Date());
map.put("depositoryManagerTime", DateUtil.DateTimeToTimeStamp(simpleTime));
map.put("depositoryManager", userid);
@ -685,7 +780,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
Integer depositoryManagerPass = (Integer) map.get("depositoryManagerPass");
if (depositoryManagerPass == 1) {
// 如果审核通过
result = "通过";
// 获取主单下的所有子单
StringBuilder minRecordByMain = new StringBuilder("[]");
List<ApplicationOutRecordMin> applicationOutRecordMinByParent = depositoryRecordMapper.findApplicationOutRecordMinByParent(record.getId());
@ -708,7 +803,12 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
// 获取该物料所处仓库的仓库管理员
List<Integer> userIdByDid = new ArrayList<>();
userIdByDid = roleService.findUserIdByDid(materialById.getDepositoryId());
// 用于保存仓库管理员的企业微信openid
StringBuilder QyWxUid = new StringBuilder();
for (int j = 0; j < userIdByDid.size(); j++) {
// 获取当前用户信息
UserByPort userByPort = PageController.FindUserById(userIdByDid.get(j), userToken);
// 仓库管理员订单信息
Map<String, Object> userRecord = new HashMap<>();
// 用户当前子订单
@ -723,24 +823,195 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
// 更新redis中用户记录
redisTemplate.opsForHash().putAll("user:" + userIdByDid.get(j), userRecord);
minRecordManage.append(userIdByDid.get(j)).append(",");
// QyWxUid.append(userByPort.getWorkwechat() + ",");
}
QyWxUid.append("PangFuZhen,");
minRecord.put("manager", minRecordManage.toString());
// 添加子订单到redis中
redisTemplate.opsForHash().putAll(minRecordKey, minRecord);
// 开启线程向仓库管理员发送消息
new Thread(new Runnable() {
@Override
public void run() {
JSONObject jsonObject = qyWxOperationService.sendNotificationToDepositoryManager(QyWxUid.toString(), applicationOutRecordMin.getId());
}
}).start();
}
// 将主订单插入到redis中
redisTemplate.opsForHash().put("record:" + record.getId(), "minRecord", minRecordByMain.toString());
map.put("state", "仓储中心负责人审核通过");
} else {
result = "驳回";
map.put("pass", 2);
map.put("state", "仓储中心负责人审核未通过");
}
// 开启线程更改其他用户卡片模板样式
String finalResult = result;
new Thread(new Runnable() {
@Override
public void run() {
// 获取responseCode(key为申请人number)
//获取部门负责人信息
UserByPort departHead = PageController.FindUserById(ObjectFormatUtil.toInteger(record.getDepartmenthead()), userToken);
String key = "user:"+departHead.getNumber()+":QyWxOutId:"+id;
String responseCode = (String) redisTemplate.opsForHash().get(key, "responseCode");
qyWxOperationService.updateTemplateCard(responseCode,userToken.getName(), finalResult);
}
}).start();
}
map.put("id", id);
return depositoryRecordMapper.updateApplicationOutRecord(map);
}
/**
* 用于企业微信的审核申请处理
*
* @param templateCard
* @return
*/
@Override
public Integer reviewByQyWx(TemplateCard templateCard ) {
// 用于更新订单
Map<String, Object> map = new HashMap<>();
// 点击用户
String fromUserName = templateCard.getFromUserName();
// 根据userId获取处理人
Map<String, Object> portInfo = PortConfig.findUserByQyWxUserId(fromUserName);
UserByPort userByPort = (UserByPort) portInfo.get("user");
// 获取点击的按钮
String eventKey = templateCard.getEventKey();
// 将其进行分割
String[] clickKeys = eventKey.split("_");
// 获取审核订单
Integer outId = ObjectFormatUtil.toInteger(clickKeys[2].split("outId")[1]);
// 获取对应的出库订单
ApplicationOutRecordP recordP = depositoryRecordMapper.findApplicationOutRecordPById(outId);
// 获取当前用户的身份
String optionId = templateCard.getSelectedItems().getSelectedItem().getOptionIds().getOptionId();
String[] optionsKey = optionId.split("_");
// 当前用户身份
String status = optionsKey[2];
if ("departManagerHead".equals(status)) {
// 如果是部门负责人
String simpleTime = DateUtil.getSimpleTime(new Date());
map.put("departmentheadTime", DateUtil.DateTimeToTimeStamp(simpleTime));
map.put("departmenthead", userByPort.getId());
// 获取点击的按钮类型
String clickKey = templateCard.getEventKey().split("_")[1];
if ("pass".equals(clickKey)) {
// 如果点击的是通过
map.put("departmentheadPass", 1);
map.put("state", "待仓储中心负责人审核");
// 获取仓储中心详情
Administration company = PageController.getCompany(361, null);
// 获取仓储中心负责人
List<UserByPort> departmentHeadByUser = PortConfig.findDepartmentHeadByUser(company, null);
StringBuilder depositoryManager = new StringBuilder();
StringBuilder QyWxUid = new StringBuilder();
// for (int i = 0; i < departmentHeadByUser.size(); i++) {
// depositoryManager.append(departmentHeadByUser.get(i).getId() + ",");
// QyWxUid.append(departmentHeadByUser.get(i).getWorkwechat()+",");
// }
QyWxUid.append("PangFuZhen"+",");
map.put("depositoryManager", depositoryManager.toString());
// 向仓储中心负责人发送新的消息
JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(outId), false);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
QyWxMessageMap.put("responseCode",jsonObject.getString("response_code"));
// key user:300450:QyWxOut:1
redisTemplate.opsForHash().putAll("user:"+userByPort.getNumber()+":QyWxOutId:"+outId,QyWxMessageMap);
// 设置过期时间为三天
redisTemplate.expire("user:"+userByPort.getNumber()+":QyWxOutId:"+outId,72,TimeUnit.HOURS);
} else {
// 如果点击的是驳回
map.put("departmentheadPass", 2);
map.put("state", "部门负责人审核未通过");
}
}
else{
// 如果是仓储中心负责人
// 获取点击的按钮类型
String clickKey = templateCard.getEventKey().split("_")[1];
// 如果点击的是通过
String simpleTime = DateUtil.getSimpleTime(new Date());
map.put("depositoryManagerTime", DateUtil.DateTimeToTimeStamp(simpleTime));
map.put("depositoryManager", userByPort.getId());
map.put("depositoryId", recordP.getDepositoryId());
if("pass".equals(clickKey)){
// 如果点击的是通过
map.put("depositoryManagerPass",1);
StringBuilder minRecordByMain = new StringBuilder("[]");
List<ApplicationOutRecordMin> applicationOutRecordMinByParent = depositoryRecordMapper.findApplicationOutRecordMinByParent(recordP.getId());
for (int i = 0; i < applicationOutRecordMinByParent.size(); i++) {
// 获取子单信息
ApplicationOutRecordMin applicationOutRecordMin = applicationOutRecordMinByParent.get(i);
//设置子订单在redis中的主键
String minRecordKey = "minRecord:" + applicationOutRecordMin.getId();
minRecordByMain.insert(1, minRecordKey + ","); // 将子订单主键插入到主订单的子订单列表
// 设置当前子订单对应仓库管理员记录
StringBuilder minRecordManage = new StringBuilder();
// 将要存储到redis中的子订单信息
Map<String, Object> minRecord = new HashMap<>();
minRecord.put("parentId", recordP.getId().toString()); // 当前子订单主订单
minRecord.put("state", "1"); // 当前子订单状态 1待处理2处理
// 获取对应的物料编号
Integer mid = applicationOutRecordMin.getMid();
// 获取物料信息
Material materialById = materialMapper.findMaterialById(mid);
// 获取该物料所处仓库的仓库管理员
List<Integer> userIdByDid = new ArrayList<>();
userIdByDid = roleService.findUserIdByDid(materialById.getDepositoryId());
StringBuilder QyWxUid = new StringBuilder();
for (int j = 0; j < userIdByDid.size(); j++) {
// 获取仓库管理员信息
UserByPort manager = PageController.FindUserById(userIdByDid.get(j), userByPort);
// 仓库管理员订单信息
Map<String, Object> userRecord = new HashMap<>();
// 用户当前子订单
String userMinRecord = (String) redisTemplate.opsForHash().get("user:" + userIdByDid.get(j), "minRecord");
if (userMinRecord == null) { // 如果当前用户没有子订单
userRecord.put("minRecord", "[" + minRecordKey + "," + "]"); // 插入一条子订单
} else { // 如果当前用户已经有子订单
StringBuilder minRecordList = new StringBuilder(userMinRecord); // 转为stringbuilder类型
minRecordList.insert(1, minRecordKey + ",");// 将当前子订单插入头部
userRecord.put("minRecord", minRecordList.toString());
}
// 更新redis中用户记录
redisTemplate.opsForHash().putAll("user:" + userIdByDid.get(j), userRecord);
minRecordManage.append(userIdByDid.get(j)).append(",");
// QyWxUid.append(manager.getWorkwechat()+",");
}
QyWxUid.append("PangFuZhen,");
minRecord.put("manager", minRecordManage.toString());
// 添加子订单到redis中
redisTemplate.opsForHash().putAll(minRecordKey, minRecord);
// 开启线程向仓库管理员发送消息
new Thread(new Runnable() {
@Override
public void run() {
JSONObject jsonObject = qyWxOperationService.sendNotificationToDepositoryManager(QyWxUid.toString(), applicationOutRecordMin.getId());
}
}).start();
}
// 将主订单插入到redis中
redisTemplate.opsForHash().put("record:" + recordP.getId(), "minRecord", minRecordByMain.toString());
map.put("state", "仓储中心负责人审核通过");
}else{
// 如果是不通过
map.put("depositoryManagerPass",2);
map.put("pass", 2);
map.put("state", "仓储中心负责人审核未通过");
}
}
map.put("id", outId);
return depositoryRecordMapper.updateApplicationOutRecord(map);
}
/**
* 转移物品
*
@ -835,9 +1106,9 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
* @return 该id的数据记录
*/
@Override
public DepositoryRecordP findDepositoryRecordById(Integer id) {
public DepositoryRecordP findDepositoryRecordById(Integer id, HttpServletRequest request) {
DepositoryRecord depositoryRecordById = depositoryRecordMapper.findDepositoryRecordById(id);
return singlePack(depositoryRecordById);
return singlePack(depositoryRecordById, request);
}
public Integer checkPass() {
@ -861,7 +1132,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
* @return 符合条件的仓库调度记录集合
*/
@Override
public List<DepositoryRecordP> findDepositoryRecordPByCondition(Map<String, Object> map) {
public List<DepositoryRecordP> findDepositoryRecordPByCondition(Map<String, Object> map, HttpServletRequest request) {
Integer size = 8, page = 1;
if (map.containsKey("size")) {
size = ObjectFormatUtil.toInteger(map.get("size"));
@ -872,7 +1143,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
map.put("begin", (page - 1) * size);
}
List<DepositoryRecord> depositoryRecordByCondition = depositoryRecordMapper.findDepositoryRecordByCondition(map);
return pack(depositoryRecordByCondition);
return pack(depositoryRecordByCondition, request);
}
/**
@ -882,7 +1153,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
* @return
*/
@Override
public List<ApplicationInRecordP> findApplicationInRecordPByCondition(Map<String, Object> map) {
public List<ApplicationInRecordP> findApplicationInRecordPByCondition(Map<String, Object> map, HttpServletRequest request) {
Integer size = 10, page = 1;
if (map.containsKey("size")) {
size = ObjectFormatUtil.toInteger(map.get("size"));
@ -898,7 +1169,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
}
List<ApplicationInRecordP> list = depositoryRecordMapper.findApplicationInRecordPByCondition(map);
for (int i = 0; i < list.size(); i++) {
UserByPort userByPortById = findUserByPortById(list.get(i).getApplicantId());
UserByPort userByPortById = findUserByPortById(list.get(i).getApplicantId(), request);
String time = DateUtil.TimeStampToDateTime(Long.valueOf(list.get(i).getApplicantTime()));
list.get(i).setApplicantName(userByPortById.getName());
list.get(i).setApplicantTime(time);
@ -914,7 +1185,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
* @return
*/
@Override
public List<ApplicationOutRecordP> findApplicationOutRecordPByCondition(Map<String, Object> map) {
public List<ApplicationOutRecordP> findApplicationOutRecordPByCondition(Map<String, Object> map, HttpServletRequest request) {
Integer size = 10, page = 1;
if (map.containsKey("size")) {
size = ObjectFormatUtil.toInteger(map.get("size"));
@ -930,7 +1201,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
}
List<ApplicationOutRecordP> list = depositoryRecordMapper.findApplicationOutRecordPByCondition(map);
for (int i = 0; i < list.size(); i++) {
UserByPort userByPortById = findUserByPortById(list.get(i).getApplicantId());
UserByPort userByPortById = findUserByPortById(list.get(i).getApplicantId(), request);
String time = DateUtil.TimeStampToDateTime(Long.valueOf(list.get(i).getApplicantTime()));
list.get(i).setApplicantName(userByPortById.getName());
list.get(i).setApplicantTime(time);
@ -979,7 +1250,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
* @return 我的任务
*/
@Override
public List<SimpleApplicationOutRecordP> findMyTask(Map<String, Object> map) {
public List<SimpleApplicationOutRecordP> findMyTask(Map<String, Object> map, HttpServletRequest request) {
Integer size = 10, page = 1;
if (map.containsKey("size")) {
size = ObjectFormatUtil.toInteger(map.get("size"));
@ -990,7 +1261,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
map.put("begin", (page - 1) * size);
}
// return simplePack(depositoryRecordMapper.findMyTask(map));
return simplePackOut(depositoryRecordMapper.findMyTaskOut(map));
return simplePackOut(depositoryRecordMapper.findMyTaskOut(map), request);
}
/**
@ -1356,11 +1627,11 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
* @param list SimpleDepositoryRecord集合
* @return 包装好的集合
*/
private List<SimpleApplicationOutRecordP> simplePackOut(List<SimpleApplicationOutRecord> list) {
private List<SimpleApplicationOutRecordP> simplePackOut(List<SimpleApplicationOutRecord> list, HttpServletRequest request) {
List<SimpleApplicationOutRecordP> result = new ArrayList<>(list.size());
for (SimpleApplicationOutRecord record : list) {
SimpleApplicationOutRecordP d = new SimpleApplicationOutRecordP(record);
UserByPort userByPort = findUserByPortById(record.getApplicantId());
UserByPort userByPort = findUserByPortById(record.getApplicantId(), request);
d.setApplyRemark(d.getApplyRemark() == null ? "" : d.getApplyRemark());
d.setApplicantName(userByPort.getName());
result.add(d);
@ -1374,25 +1645,25 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
* @param list DepositoryRecord集合
* @return 包装好的集合
*/
private List<DepositoryRecordP> pack(List<DepositoryRecord> list) {
private List<DepositoryRecordP> pack(List<DepositoryRecord> list, HttpServletRequest request) {
List<DepositoryRecordP> result = new ArrayList<>(list.size());
for (DepositoryRecord record : list) {
result.add(singlePack(record));
result.add(singlePack(record, request));
}
return result;
}
private DepositoryRecordP singlePack(DepositoryRecord record) {
private DepositoryRecordP singlePack(DepositoryRecord record, HttpServletRequest request) {
DepositoryRecordP d = new DepositoryRecordP(record);
UserByPort getApplicantUser = findUserByPortById(record.getApplicantId());
UserByPort getApplicantUser = findUserByPortById(record.getApplicantId(), request);
d.setApplicantName(getApplicantUser.getName());
d.setDepositoryName(depositoryMapper.findDepositoryNameById(record.getDepositoryId()));
if (record.getReviewerId() != null) {
UserByPort reviewerUser = findUserByPortById(record.getReviewerId());
UserByPort reviewerUser = findUserByPortById(record.getReviewerId(), request);
d.setReviewerName(reviewerUser.getName());
}
if (record.getCheckerId() != null) {
UserByPort checkerUser = findUserByPortById(record.getCheckerId());
UserByPort checkerUser = findUserByPortById(record.getCheckerId(), request);
d.setCheckerName(checkerUser.getName());
}
return d;
@ -1404,7 +1675,8 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
* @param id
* @return
*/
private UserByPort findUserByPortById(Integer id) {
private UserByPort findUserByPortById(Integer id, HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
String url = PortConfig.external_url + "/staff/archivescont";
Map<String, Object> map = new HashMap<>();
map.put("id", id);
@ -1412,7 +1684,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
JSONObject paramObject = JSONObject.parseObject(jsonString);
String post = null;
try {
post = HttpUtils.send(url, paramObject, StandardCharsets.UTF_8.toString());
post = HttpUtils.send(url, paramObject, StandardCharsets.UTF_8.toString(), userToken);
} catch (IOException e) {
e.printStackTrace();
}

48
src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryServiceImpl.java

@ -35,7 +35,7 @@ public class DepositoryServiceImpl implements DepositoryService {
* @return 影响条数
*/
@Override
public Integer insertDepository(Map<String, Object> map) {
public Integer insertDepository(Map<String, Object> map,UserByPort userByPort) {
// 获取当前仓库拼音首字母
String dname = (String) map.get("dname");
String dnamePinYin = WordUtil.getPinYinHeadChar(dname);
@ -49,12 +49,12 @@ public class DepositoryServiceImpl implements DepositoryService {
List<Depository> condition = depositoryMapper.findDepositoryRecordPByCondition(temp);
// 公司编号
Integer cid = ObjectFormatUtil.toInteger(map.get("cid"));
String companyName = PageController.getCompany(cid).getName();
String companyName = PageController.getCompany(cid,userByPort).getName();
String adminorgName = "";
// 部门编号
if(!"".equals(map.get("adminorg"))){
Integer adminorg = ObjectFormatUtil.toInteger(map.get("adminorg"));
adminorgName = PageController.getCompany(adminorg).getName();
adminorgName = PageController.getCompany(adminorg,userByPort).getName();
}
// 公司简称
companyName = WordUtil.getPinYinHeadChar(companyName);
@ -86,7 +86,7 @@ public class DepositoryServiceImpl implements DepositoryService {
// 部门编号
if(!"".equals(map.get("adminorg"))){
Integer adminorg = ObjectFormatUtil.toInteger(map.get("adminorg"));
adminorgName = PageController.getCompany(adminorg).getName();
adminorgName = PageController.getCompany(adminorg,userByPort).getName();
adminorgName = WordUtil.getPinYinHeadChar(adminorgName).substring(0,2);
}
// 获取父仓库编码
@ -113,7 +113,7 @@ public class DepositoryServiceImpl implements DepositoryService {
* @return 影响条数
*/
@Override
public List<Depository> findDepositoryRecordPByCondition(Map<String,Object> map) {
public List<Depository> findDepositoryRecordPByCondition(Map<String,Object> map,UserByPort userByPort) {
Integer size = 10, page = 1;
if (map.containsKey("size")) {
size = ObjectFormatUtil.toInteger(map.get("size"));
@ -127,7 +127,7 @@ public class DepositoryServiceImpl implements DepositoryService {
for (int i = 0; i < list.size(); i++) {
Depository depository = list.get(i);
if(!depository.getAdminorg().isEmpty()){
Administration company = PageController.getCompany(ObjectFormatUtil.toInteger(depository.getAdminorg()));
Administration company = PageController.getCompany(ObjectFormatUtil.toInteger(depository.getAdminorg()),userByPort);
depository.setAdminorgName(company.getName());
}
}
@ -246,7 +246,7 @@ public class DepositoryServiceImpl implements DepositoryService {
@Override
public Map<String, Integer> findDepositoryAllNameAndId(UserByPort user) {
// 获取当前用户所在部门管理的仓库
List<Depository> depositoryByAdminorg = depositoryMapper.findDepositoryByAdminorg(user.getMaindeparmentname());
List<Depository> depositoryByAdminorg = depositoryMapper.findDepositoryByAdminorg(user.getMaindeparment().toString());
// 仓库id列表
List<Integer> depositoryListId = new ArrayList<>();
@ -276,6 +276,8 @@ public class DepositoryServiceImpl implements DepositoryService {
return map;
}
/**
* 根据仓库名称获取当前仓库库存容量
* @param dname
@ -380,6 +382,38 @@ public class DepositoryServiceImpl implements DepositoryService {
return depositoryMapper.findDepositoryByCode(code);
}
/**
* 获取当前用户与其部门所管理的仓库
* @param userByPort
* @return
*/
@Override
public List<Depository> findDepositoryByAdminorgAndUser(UserByPort userByPort) {
// 获取当前用户所在部门管理的仓库
List<Depository> depositoryByAdminorg = depositoryMapper.findDepositoryByAdminorg(userByPort.getMaindeparment().toString());
// 仓库id列表
List<Depository> depositoryList = new ArrayList<>();
// 添加到id列表
for (Depository depository : depositoryByAdminorg) {
depositoryList.add(depository);
}
// 获取当前用户管理的仓库
List<RoleAndDepository> depositoryAndRole = roleMapper.findDepositoryAndRole(userByPort.getId());
for (int i = 0; i < depositoryAndRole.size(); i++) {
RoleAndDepository roleAndDepository = depositoryAndRole.get(i);
// 如果重复则跳过
if(depositoryList.get(i).getId().compareTo(roleAndDepository.getDepositoryId()) == 0){
continue;
}
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(roleAndDepository.getDepositoryId());
depositoryList.add(depositoryRecordById);
}
return depositoryList;
}
//判断是否有子类
public boolean isChildForDepository(Integer parentId){
boolean flag = false;

31
src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java

@ -347,23 +347,6 @@ public class MaterialServiceImpl implements MaterialService {
return result;
}
private UserByPort findUserByPortById(Integer id) {
String url = PortConfig.external_url + "/staff/archivescont";
Map<String, Object> map = new HashMap<>();
map.put("id", id);
String jsonString = JSONObject.toJSONString(map);
JSONObject paramObject = JSONObject.parseObject(jsonString);
String post = null;
try {
post = HttpUtils.send(url, paramObject, HTTP.UTF_8);
} catch (IOException e) {
e.printStackTrace();
}
JSONObject jsonObject = JSONObject.parseObject(post);
JSONObject data = (JSONObject) jsonObject.get("data");
UserByPort userByPort = JSONObject.toJavaObject( data, UserByPort.class);
return userByPort;
}
/**
@ -383,7 +366,21 @@ public class MaterialServiceImpl implements MaterialService {
size= ObjectFormatUtil.toInteger(map.get("size"));
map.put("size", size);
}
Integer depositoryId = ObjectFormatUtil.toInteger(map.get("depositoryId"));
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(depositoryId);
List<Material> materialByDepository = materialMapper.findMaterialByDepository(map);
for (int i = 0; i < materialByDepository.size(); i++) {
materialByDepository.get(i).setDepositoryCode(depositoryRecordById.getCode());
// 获取当前物料所处库位
Integer mid = materialByDepository.get(i).getId();
List<PlaceP> placeByMidAndDid = placeService.findPlaceByMidAndDid(mid, depositoryId);
StringBuilder placeCode = new StringBuilder();
for (int j = 0; j < placeByMidAndDid.size(); j++) {
placeCode.append(placeByMidAndDid.get(j).getCode()).append(" ");
}
materialByDepository.get(i).setPlaceCode(placeCode.toString());
}
return pack(materialByDepository);
}

497
src/main/java/com/dreamchaser/depository_manage/service/impl/QyWxOperationService.java

@ -0,0 +1,497 @@
package com.dreamchaser.depository_manage.service.impl;
import cn.hutool.core.lang.Snowflake;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.config.QyWxConfig;
import com.dreamchaser.depository_manage.config.QyWx_template_card.*;
import com.dreamchaser.depository_manage.controller.PageController;
import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.mapper.DepositoryMapper;
import com.dreamchaser.depository_manage.mapper.DepositoryRecordMapper;
import com.dreamchaser.depository_manage.mapper.MaterialMapper;
import com.dreamchaser.depository_manage.pojo.ApplicationOutRecordP;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
import com.dreamchaser.depository_manage.utils.DateUtil;
import com.dreamchaser.depository_manage.utils.HttpUtils;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class QyWxOperationService {
@Autowired
DepositoryRecordMapper depositoryRecordMapper;
@Autowired
MaterialMapper materialMapper;
@Autowired
DepositoryMapper depositoryMapper;
@Autowired
RedisTemplate<String,String> redisTemplate;
/**
* 用于向企业微信发送消息
* @param uid 接收人
* @param outId 申请出库编号
* @param flag 用于判断发送类型是部门负责人还是仓储负责人(true为部门false为仓储)
* @return
*/
public JSONObject sendQyWxMessage(String uid, Integer outId, Boolean flag) {
// 获取将要发送申请的订单记录
ApplicationOutRecordP applicationOutRecordPById = depositoryRecordMapper.findApplicationOutRecordPById(outId);
// 申请人id
Integer applicantId = applicationOutRecordPById.getApplicantId();
// 申请人
UserByPort applicant = PageController.FindUserById(applicantId, null);
// 获取所有子订单
List<ApplicationOutRecordMin> applicationOutRecordMinByParent = depositoryRecordMapper.findApplicationOutRecordMinByParent(outId);
StringBuilder mname = new StringBuilder();
StringBuilder depositoryName = new StringBuilder();
StringBuilder sumQuantity = new StringBuilder();
for (int i = 0; i < applicationOutRecordMinByParent.size(); i++) {
// 获取子订单信息
ApplicationOutRecordMin applicationOutRecordMin = applicationOutRecordMinByParent.get(i);
// 获取当前申请物料
Material materialById = materialMapper.findMaterialById(applicationOutRecordMin.getMid());
// 获取当前物料所在仓库
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(materialById.getDepositoryId());
sumQuantity.append(applicationOutRecordMin.getQuantity()).append(",");
mname.append(materialById.getMname()).append(",");
depositoryName.append(depositoryRecordById.getDname()).append(",");
}
// 1.获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url
String accessToken = "".equals(QyWxConfig.token)?QyWxConfig.GetQYWXToken():QyWxConfig.token;
// 2.获取发送对象,并转成json
ButtonInteraction buttonInteraction = new ButtonInteraction();
// 1.1非必需
//设置消息接收者
String[] split = uid.split(",");
StringBuilder toUserName = new StringBuilder();
for (int i = 0; i < split.length - 1; i++) {
toUserName.append(split[i]).append("|");
}
toUserName.append(split[split.length - 1]);
buttonInteraction.setTouser(toUserName.toString()); // 不区分大小写
// 1.2必需
// 消息类型
buttonInteraction.setMsgtype("template_card");
// 企业应用的id,整型
buttonInteraction.setAgentid(QyWxConfig.AgentId);
// 卡片模板
TemplateCard_button_interaction templateCard_button_interaction = new TemplateCard_button_interaction();
// 模板卡片类型,按钮交互型卡片填写"button_interaction"
templateCard_button_interaction.setCard_type("button_interaction");
// 卡片右上角更多操作按钮
TemplateCard_action_menu action_menu = new TemplateCard_action_menu();
action_menu.setDesc("卡片副交互辅助文本说明");
// 卡片右上角操作按钮
TemplateCard_action action1 = new TemplateCard_action();
action1.setKey("AcceptThePush");
action1.setText("接受推送");
TemplateCard_action action2 = new TemplateCard_action();
action2.setKey("NoPush");
action2.setText("不再推送");
List<TemplateCard_action> actionList = new ArrayList<>();
actionList.add(action1);
actionList.add(action2);
action_menu.setAction_list(actionList);
// 设置操作按钮
templateCard_button_interaction.setAction_menu(action_menu);
// 一级标题
TemplateCard_main_title main_title = new TemplateCard_main_title();
// main_title.setTitle(applicant+"的出库申请");
main_title.setTitle(applicant.getName()+"的出库申请");
main_title.setDesc("申请时间:"+ DateUtil.TimeStampToDateTime(Long.valueOf(applicationOutRecordPById.getApplicantTime())));
// 设置一级标题
templateCard_button_interaction.setMain_title(main_title);
// 二级标题+文本列表,用于设置物料名称
TemplateCard_horizontal_content horizontal_content_mname = new TemplateCard_horizontal_content();
// 链接类型 0代表不是链接
horizontal_content_mname.setType(0);
// 二级标题
horizontal_content_mname.setKeyname("申请物料:");
horizontal_content_mname.setValue(mname.toString());
// 二级标题+文本列表,用于设置物料数量
TemplateCard_horizontal_content horizontal_content_quantity = new TemplateCard_horizontal_content();
// 链接类型 0代表不是链接
horizontal_content_quantity.setType(0);
// 二级标题
horizontal_content_quantity.setKeyname("数量");
horizontal_content_quantity.setValue(sumQuantity.toString());
// 二级标题+文本列表,用于设置物料对应仓库
TemplateCard_horizontal_content horizontal_content_depositoryName = new TemplateCard_horizontal_content();
// 链接类型 0代表不是链接
horizontal_content_depositoryName.setType(0);
// 二级标题
horizontal_content_depositoryName.setKeyname("仓库名称");
horizontal_content_depositoryName.setValue(depositoryName.toString());
// 二级标题+文本列表,用于设置申请查看明细
TemplateCard_horizontal_content horizontal_content_detail = new TemplateCard_horizontal_content();
// 链接类型 0代表不是链接
horizontal_content_detail.setType(1);
// 二级标题
horizontal_content_detail.setKeyname("申请明细");
horizontal_content_detail.setValue("查看明细");
horizontal_content_detail.setUrl("https://jy.hxgk.group/ApplicationOutView?id="+outId);
List<TemplateCard_horizontal_content> horizontal_contentList = new ArrayList<>();
horizontal_contentList.add(horizontal_content_mname);
horizontal_contentList.add(horizontal_content_quantity);
horizontal_contentList.add(horizontal_content_depositoryName);
horizontal_contentList.add(horizontal_content_detail);
// 设置二级标题
templateCard_button_interaction.setHorizontal_content_list(horizontal_contentList);
// 任务id,同一个应用任务id不能重复,只能由数字、字母和“_-@”组成,最长128字节
// 通过雪花算法获取taskId
Snowflake snowflake = new Snowflake(10,10,true);
templateCard_button_interaction.setTask_id(snowflake.nextIdStr());
// 下拉式的选择器
TemplateCard_button_selection button_selection = new TemplateCard_button_selection();
// 下拉式的选择器的key
button_selection.setQuestion_key("btn_status");
button_selection.setTitle("您的身份");
List<TemplateCard_button_selection_option> optionList = new ArrayList<>();
// 选项
TemplateCard_button_selection_option button_selection_option = new TemplateCard_button_selection_option();
button_selection_option.setText("部门负责人");
if(flag) {
// 如果是发送给部门负责人
button_selection_option.setId("btn_status_departManagerHead");
}else{
// 如果是发送给仓储负责人
button_selection_option.setId("btn_status_depositoryManager");
}
optionList.add(button_selection_option);
button_selection.setOption_list(optionList);
templateCard_button_interaction.setButton_selection(button_selection);
// 按钮列表,列表长度不超过6
List<TemplateCard_button> buttonList = new ArrayList<>();
TemplateCard_button button1 = new TemplateCard_button();
button1.setKey("wms_pass_outId"+outId);
button1.setStyle(1);
button1.setText("通过");
TemplateCard_button button2 = new TemplateCard_button();
button2.setKey("wms_reject_outId"+outId);
button2.setStyle(2);
button2.setText("驳回");
buttonList.add(button1);
buttonList.add(button2);
templateCard_button_interaction.setButton_list(buttonList);
buttonInteraction.setTemplate_card(templateCard_button_interaction);
String s = JSONObject.toJSONString(buttonInteraction);
// 3.获取请求的url
String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken);
// 4.调用接口,发送消息
String s1 = HttpUtils.doPost(url, s);
// 将返回结果转为json对象
JSONObject jsonObject = JSON.parseObject(s1);
// 返回
return jsonObject;
}
/**
* 将最终完成的订单抄送给仓储负责人
* @param uid 仓储负责人编号
* @param outId 订单编号
* @return
*/
public JSONObject sendCcMessageToUsers(String uid,Integer outId){
// 获取已经完成的订单
ApplicationOutRecordP recordP = depositoryRecordMapper.findApplicationOutRecordPById(outId);
// 申请人id
Integer applicantId = recordP.getApplicantId();
// 申请人
UserByPort applicant = PageController.FindUserById(applicantId, null);
// 获取所有子订单
List<ApplicationOutRecordMin> applicationOutRecordMinByParent = depositoryRecordMapper.findApplicationOutRecordMinByParent(outId);
MessageByMarkDown markDown = new MessageByMarkDown();
//设置消息接收者
String[] split = uid.split(",");
StringBuilder toUserName = new StringBuilder();
for (int i = 0; i < split.length - 1; i++) {
toUserName.append(split[i]).append("|");
}
toUserName.append(split[split.length - 1]);
markDown.setTouser(toUserName.toString()); // 不区分大小写
// 设置agentId
markDown.setAgentid(QyWxConfig.AgentId);
markDown.setMsgtype("markdown");
// 设置content
Map<String,String> markdown = new HashMap<>();
StringBuilder content = new StringBuilder("## `抄送信息:`%n");
content.append(">### **"+applicant.getName()+"的出库申请** %n<font color='warning'>申请时间:2022-10-23 14:30:18</font> %n");
content.append("%n---%n");
for (ApplicationOutRecordMin recordMin : applicationOutRecordMinByParent) {
// 获取子订单信息
// 获取申请物料信息
Material materialById = materialMapper.findMaterialById(recordMin.getMid());
// 获取仓库信息
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(recordMin.getDepositoryId());
// 获取处理人信息
UserByPort userByPort = PageController.FindUserById(recordMin.getCheckId(), null);
content.append(">- 物料名称:").append(materialById.getMname()).append("%n");
content.append(">- 申请数量:").append(recordMin.getQuantity()).append("%n");
content.append(">- 所处仓库:").append(depositoryRecordById.getDname()).append("%n");
content.append(">- 出库人员:").append(userByPort.getName()).append("%n");
content.append("%n---%n");
}
content.append(">## '''%n" +
">如需要查看详细信息,请点击:[查看信息](https://jy.hxgk.group/ApplicationOutView?id="+recordP.getId()+")");
markdown.put("content",content.toString());
markDown.setMarkdown(markdown);
String jsonString = JSONObject.toJSONString(markDown);
jsonString = String.format(jsonString);
System.out.println(jsonString);
// 3.获取请求的url
// 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url
String accessToken = "".equals(QyWxConfig.token)?QyWxConfig.GetQYWXToken():QyWxConfig.token;
String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken);
// 4.调用接口,发送消息
String s1 = HttpUtils.doPost(url, jsonString);
// 将返回结果转为json对象
JSONObject jsonObject = JSON.parseObject(s1);
// 返回
return jsonObject;
}
/**
* 给仓库管理员发送出库通知
* @param uid
* @param outMinId
* @return
*/
public JSONObject sendNotificationToDepositoryManager(String uid,Integer outMinId){
// 需要出库的子订单
ApplicationOutRecordMin recordMin = depositoryRecordMapper.findApplicationOutMinById(outMinId);
// 获取其主订单
ApplicationOutRecordP outRecordP = depositoryRecordMapper.findApplicationOutRecordPById(recordMin.getParentId());
// 申请人id
Integer applicantId = outRecordP.getApplicantId();
// 申请人
UserByPort applicant = PageController.FindUserById(applicantId, null);
// 定义文本通知型卡片
TextNotice textNotice = new TextNotice();
//设置消息接收者
String[] split = uid.split(",");
StringBuilder toUserName = new StringBuilder();
for (int i = 0; i < split.length - 1; i++) {
toUserName.append(split[i]).append("|");
}
toUserName.append(split[split.length - 1]);
textNotice.setTouser(toUserName.toString()); // 不区分大小写
// 设置agentId
textNotice.setAgentid(QyWxConfig.AgentId);
// 定义卡片模板
TemplateCard_text_notice text_notice = new TemplateCard_text_notice();
text_notice.setCard_type("text_notice");
// 任务id,同一个应用任务id不能重复,只能由数字、字母和“_-@”组成,最长128字节
// 通过雪花算法获取taskId
Snowflake snowflake = new Snowflake(10,10,true);
text_notice.setTask_id(snowflake.nextIdStr());
textNotice.setMsgtype("template_card");
// 设置主标题
TemplateCard_main_title main_title = new TemplateCard_main_title();
main_title.setTitle(applicant.getName()+"的出库请求");
main_title.setDesc("申请时间:"+ DateUtil.TimeStampToDateTime(Long.valueOf(outRecordP.getApplicantTime())));
text_notice.setMain_title(main_title);
// 卡片右上角更多操作按钮
TemplateCard_action_menu action_menu = new TemplateCard_action_menu();
action_menu.setDesc("卡片副交互辅助文本说明");
// 卡片右上角操作按钮
TemplateCard_action action1 = new TemplateCard_action();
action1.setKey("AcceptThePush");
action1.setText("接受推送");
TemplateCard_action action2 = new TemplateCard_action();
action2.setKey("NoPush");
action2.setText("不再推送");
List<TemplateCard_action> actionList = new ArrayList<>();
actionList.add(action1);
actionList.add(action2);
action_menu.setAction_list(actionList);
text_notice.setAction_menu(action_menu);
List<TemplateCard_horizontal_content> horizontalContentList = new ArrayList<>();
// 获取申请物料信息
Material materialById = materialMapper.findMaterialById(recordMin.getMid());
// 获取仓库信息
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(recordMin.getDepositoryId());
// 设至二级标题
// 物料名称
TemplateCard_horizontal_content horizontal_content_mname = new TemplateCard_horizontal_content();
horizontal_content_mname.setType(0);
horizontal_content_mname.setKeyname("物料名称:");
horizontal_content_mname.setValue(materialById.getMname());
// 物料编码
TemplateCard_horizontal_content horizontal_content_mcode = new TemplateCard_horizontal_content();
horizontal_content_mcode.setType(0);
horizontal_content_mcode.setKeyname("物料编码:");
horizontal_content_mcode.setValue(materialById.getCode().toString());
// 申请数量
TemplateCard_horizontal_content horizontal_content_quantity = new TemplateCard_horizontal_content();
horizontal_content_quantity.setType(0);
horizontal_content_quantity.setKeyname("申请数量:");
horizontal_content_quantity.setValue(recordMin.getQuantity().toString());
// 所在仓库
TemplateCard_horizontal_content horizontal_content_depository = new TemplateCard_horizontal_content();
horizontal_content_depository.setType(0);
horizontal_content_depository.setKeyname("所在仓库:");
horizontal_content_depository.setValue(depositoryRecordById.getDname());
// 申请备注
TemplateCard_horizontal_content horizontal_content_applyRemark = new TemplateCard_horizontal_content();
horizontal_content_applyRemark.setType(0);
horizontal_content_applyRemark.setKeyname("申请备注:");
horizontal_content_applyRemark.setValue(outRecordP.getApplyRemark());
horizontalContentList.add(horizontal_content_mname);
horizontalContentList.add(horizontal_content_mcode);
horizontalContentList.add(horizontal_content_quantity);
horizontalContentList.add(horizontal_content_depository);
horizontalContentList.add(horizontal_content_applyRemark);
text_notice.setHorizontal_content_list(horizontalContentList);
// 卡片整体点击事件
TemplateCard_card_action card_action = new TemplateCard_card_action();
card_action.setType(1);
card_action.setUrl("https://jy.hxgk.group/ApplicationOutMinByDidForMobile?depositoryId="+depositoryRecordById.getId()+"&state=0");
text_notice.setCard_action(card_action);
//跳转指引样式的列表
List<TemplateCard_jump> jumpList = new ArrayList<>();
TemplateCard_jump jump = new TemplateCard_jump();
jump.setType("1");
jump.setUrl("https://jy.hxgk.group");
jump.setTitle("进入系统");
jumpList.add(jump);
text_notice.setJump_list(jumpList);
textNotice.setTemplate_card(text_notice);
String s = JSONObject.toJSONString(textNotice);
// 3.获取请求的url
// 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url
String accessToken = "".equals(QyWxConfig.token)?QyWxConfig.GetQYWXToken():QyWxConfig.token;
String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken);
// 4.调用接口,发送消息
String s1 = HttpUtils.doPost(url, s);
// 将返回结果转为json对象
JSONObject jsonObject = JSON.parseObject(s1);
// 返回
return jsonObject;
}
/**
* 用于撤回发送给企业微信的消息
* @param msgid 待撤回消息的id
* @return
*/
public String withdrawQyWxMessage(String msgid){
String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/message/recall?access_token=%s", QyWxConfig.token);
Map<String,Object> param = new HashMap<>();
param.put("msgid",msgid);
String jsonString = JSONObject.toJSONString(param);
String post = HttpUtils.doPost(url, jsonString);
JSONObject jsonObject = JSON.parseObject(post);
String errmsg = jsonObject.getString("errmsg");
Integer errcode = jsonObject.getInteger("errcode");
if(errcode == 0){
// 如果撤回成功
return errmsg;
}else{
return errmsg;
}
}
/**
* 用于更新卡片中的按钮为不可点击状态
* @param response_code
* @return
*/
public JSONObject updateTemplateCard(String response_code,String userName,String state){
String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/message/update_template_card?access_token="+QyWxConfig.token+"&debug=1");
Map<String,Object> map = new HashMap<>();
map.put("atall",1);
map.put("agentid",QyWxConfig.AgentId);
map.put("response_code",response_code);
Map<String,Object> button = new HashMap<>();
button.put("replace_name",userName+"已"+state);
map.put("button",button);
String jsonString = JSONObject.toJSONString(map);
String s1 = HttpUtils.doPost(url, jsonString);
JSONObject jsonObject = JSON.parseObject(s1);
return jsonObject;
}
}

30
src/main/java/com/dreamchaser/depository_manage/utils/HttpUtils.java

@ -1,6 +1,8 @@
package com.dreamchaser.depository_manage.utils;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.entity.UserByPort;
import com.dreamchaser.depository_manage.security.pool.UserKeyAndTokenPool;
import lombok.Data;
import lombok.extern.log4j.Log4j2;
import org.apache.http.HttpResponse;
@ -33,16 +35,6 @@ import java.net.URL;
@Log4j2
public class HttpUtils {
public static String userKey = "";
public static String userToken = "";
public static void setUserKey(String userKey) {
HttpUtils.userKey = userKey;
}
public static void setUserToken(String userToken) {
HttpUtils.userToken = userToken;
}
public static String doGet(String httpurl) {
HttpURLConnection connection = null;
@ -224,7 +216,7 @@ public class HttpUtils {
* @throws ParseException
* @throws IOException
*/
public static String send(String url, JSONObject jsonObject,String encoding) throws ParseException, IOException{
public static String send(String url, JSONObject jsonObject, String encoding, UserByPort userByPort) throws ParseException, IOException{
String body = "";
//创建httpclient对象
CloseableHttpClient client = HttpClients.createDefault();
@ -236,15 +228,25 @@ public class HttpUtils {
"application/json"));
//设置参数到请求对象中
httpPost.setEntity(s);
System.out.println("请求地址:"+url);
// System.out.println("请求参数:"+nvps.toString());
//设置header信息
//指定报文头【Content-type】、【User-Agent】
httpPost.setHeader("Content-type", "application/json");
httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
httpPost.setHeader("user-token",userToken);
httpPost.setHeader("user-key",userKey);
String keyAndToken = " & ";
if(userByPort!=null)
{
keyAndToken = UserKeyAndTokenPool.getKeyAndToken(userByPort.getNumber());
}
String[] split = keyAndToken.split("&");
httpPost.setHeader("user-token",split[1]);
httpPost.setHeader("user-key",split[0]);
System.out.println("请求地址:"+url);
System.out.println("请求Key:"+split[0]);
System.out.println("请求token:"+split[1]);
//执行请求操作,并拿到结果(同步阻塞)
CloseableHttpResponse response = client.execute(httpPost);
//获取结果实体

117
src/main/java/com/dreamchaser/depository_manage/utils/QyWxXMLUtils.java

@ -1,4 +1,121 @@
package com.dreamchaser.depository_manage.utils;
import com.dreamchaser.depository_manage.config.QyWxConfig;
import org.apache.commons.lang.StringEscapeUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.FileOutputStream;
import java.io.StringReader;
import java.io.StringWriter;
/**
* 用于企业微信xml的工具类
*/
public class QyWxXMLUtils {
/**
* 用于拼接回调post请求时的xml
* @param Encrypt
* @return
*/
public static String formatDataToXml(String Encrypt){
// 创建document对象
Document document = DocumentHelper.createDocument();
// 创建根节点xml
Element root = document.addElement("xml");
// 4、生成子节点及子节点内容
Element ToUserName = root.addElement("ToUserName");
ToUserName.setText("<![CDATA["+QyWxConfig.corpid+"]]>");
Element agentID = root.addElement("AgentID");
agentID.setText("<![CDATA["+QyWxConfig.AgentId+"]]>");
Element encrypt = root.addElement("Encrypt");
encrypt.setText("<![CDATA["+Encrypt+"]]>");
// 5、设置生成xml的格式
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置编码格式
format.setEncoding("UTF-8");
String xml = document.asXML();
xml = QyWxXMLUtils.dealxmlHeader(xml);
xml = StringEscapeUtils.unescapeXml(xml);
return xml;
}
/**
* 用于删除企业微信中的头标识
* @param xmlText
* @return
*/
public static String dealxmlHeader(String xmlText)
{
StringBuilder sb=new StringBuilder(xmlText);
StringBuilder newsb=new StringBuilder("");
String startstring=sb.substring(0,xmlText.indexOf("<?xml"));
String endstring=sb.substring(xmlText.indexOf("?>") + 2,xmlText.length());
newsb.append(startstring+endstring);
xmlText=new String(newsb.toString());
return xmlText;
}
/**
* 将String类型的xml转换成对象
* @param clazz
* @param xmlStr
* @return
*/
public static Object convertXmlStrToObject(Class clazz, String xmlStr) {
Object xmlObject = null;
try {
JAXBContext context = JAXBContext.newInstance(clazz);
// 进行将Xml转成对象的核心接口
Unmarshaller unmarshaller = context.createUnmarshaller();
StringReader sr = new StringReader(xmlStr);
xmlObject = unmarshaller.unmarshal(sr);
} catch (JAXBException e) {
e.printStackTrace();
}
return xmlObject;
}
/**
* 将对象直接转换成String类型的 XML输出
*
* @param obj
* @return
*/
public static String convertToXml(Object obj) {
// 创建输出流
StringWriter sw = new StringWriter();
try {
// 利用jdk中自带的转换类实现
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
// 格式化xml输出的格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.TRUE);
// 将对象转换成输出流形式的xml
marshaller.marshal(obj, sw);
} catch (JAXBException e) {
e.printStackTrace();
}
return sw.toString();
}
}

7
src/main/resources/application-test.yml

@ -5,6 +5,10 @@ management:
exposure:
include: beans,health
spring:
mobile:
sitepreference:
enabled:true
servlet:
multipart:
enabled: true
@ -68,9 +72,6 @@ spring:
# resources:
# static-locations: classpath:/static/
server:
mybatis:
type-aliases-package: com.dreamchaser.depository_manage.entity

1
src/main/resources/static/api/init.json

@ -180,7 +180,6 @@
"target": "_self",
"href": "/my_task"
},
{
"title": "我的申请",
"href": "/my_apply",

1
src/main/resources/static/api/init_checker.json

@ -180,7 +180,6 @@
"target": "_self",
"href": "/my_task"
},
{
"title": "我的申请",
"href": "/my_apply",

1
src/main/resources/static/api/init_reviewer.json

@ -180,7 +180,6 @@
"target": "_self",
"href": "/my_task"
},
{
"title": "我的申请",
"href": "/my_apply",

1
src/main/resources/static/api/init_user.json

@ -60,7 +60,6 @@
"target": "_self",
"href": "/my_task"
},
{
"title": "我的申请",
"href": "/my_apply",

18
src/main/resources/static/api/table-in.json

@ -38,7 +38,8 @@
"checkerName": "李四",
"checkRemarks": "验收无误,入库!",
"checkTime": "2021-10-8 15:23"
},{
},
{
"id": 10002,
"applicationId": 409,
"materialName": "骁龙888芯片",
@ -53,7 +54,8 @@
"reviewTime": "2020-10-07 11:12",
"depositoryId": 57,
"applyRemarks": "老板要求今天这批货得进库,请尽快批准"
},{
},
{
"id": 10000,
"applicationId": 123,
"materialName": "骁龙888芯片",
@ -68,7 +70,8 @@
"reviewTime": "2020-10-07 11:12",
"depositoryId": 57,
"applyRemarks": "老板要求今天这批货得进库,请尽快批准"
},{
},
{
"id": 10000,
"applicationId": 321,
"materialName": "骁龙888芯片",
@ -83,7 +86,8 @@
"reviewTime": "2020-10-07 11:12",
"depositoryId": 57,
"applyRemarks": "老板要求今天这批货得进库,请尽快批准"
},{
},
{
"id": 10000,
"applicationId": 456,
"materialName": "骁龙888芯片",
@ -98,7 +102,8 @@
"reviewTime": "2020-10-07 11:12",
"depositoryId": 57,
"applyRemarks": "老板要求今天这批货得进库,请尽快批准"
},{
},
{
"id": 10000,
"applicationId": 456,
"materialName": "骁龙888芯片",
@ -113,7 +118,8 @@
"reviewTime": "2020-10-07 11:12",
"depositoryId": 57,
"applyRemarks": "老板要求今天这批货得进库,请尽快批准"
},{
},
{
"id": 10000,
"applicationId": 123,
"materialName": "骁龙888芯片",

18
src/main/resources/static/api/table-out.json

@ -35,7 +35,8 @@
"reviewTime": "2021-10-07 11:12",
"depositoryId": 57,
"applyRemarks": "老板要求今天这批货得进库,请尽快批准"
},{
},
{
"id": 10002,
"applicationId": 409,
"materialName": "骁龙888芯片",
@ -50,7 +51,8 @@
"reviewTime": "2020-10-07 11:12",
"depositoryId": 57,
"applyRemarks": "老板要求今天这批货得进库,请尽快批准"
},{
},
{
"id": 10000,
"applicationId": 123,
"materialName": "骁龙888芯片",
@ -65,7 +67,8 @@
"reviewTime": "2020-10-07 11:12",
"depositoryId": 57,
"applyRemarks": "老板要求今天这批货得进库,请尽快批准"
},{
},
{
"id": 10000,
"applicationId": 321,
"materialName": "骁龙888芯片",
@ -80,7 +83,8 @@
"reviewTime": "2020-10-07 11:12",
"depositoryId": 57,
"applyRemarks": "老板要求今天这批货得进库,请尽快批准"
},{
},
{
"id": 10000,
"applicationId": 456,
"materialName": "骁龙888芯片",
@ -95,7 +99,8 @@
"reviewTime": "2020-10-07 11:12",
"depositoryId": 57,
"applyRemarks": "老板要求今天这批货得进库,请尽快批准"
},{
},
{
"id": 10000,
"applicationId": 456,
"materialName": "骁龙888芯片",
@ -110,7 +115,8 @@
"reviewTime": "2020-10-07 11:12",
"depositoryId": 57,
"applyRemarks": "老板要求今天这批货得进库,请尽快批准"
},{
},
{
"id": 10000,
"applicationId": 123,
"materialName": "骁龙888芯片",

96
src/main/resources/static/api/tableSelect.json

@ -3,21 +3,85 @@
"msg": "",
"count": 16,
"data": [
{ "id":"001", "username":"张玉林", "sex":"女" },
{ "id":"002", "username":"刘晓军", "sex":"男" },
{ "id":"003", "username":"张恒", "sex":"男" },
{ "id":"004", "username":"朱一", "sex":"男" },
{ "id":"005", "username":"刘佳能", "sex":"女" },
{ "id":"006", "username":"晓梅", "sex":"女" },
{ "id":"007", "username":"马冬梅", "sex":"女" },
{ "id":"008", "username":"刘晓庆", "sex":"女" },
{ "id":"009", "username":"刘晓庆", "sex":"女" },
{ "id":"010", "username":"刘晓庆", "sex":"女" },
{ "id":"011", "username":"刘晓庆", "sex":"女" },
{ "id":"012", "username":"刘晓庆", "sex":"女" },
{ "id":"013", "username":"刘晓庆", "sex":"女" },
{ "id":"014", "username":"刘晓庆", "sex":"女" },
{ "id":"015", "username":"刘晓庆", "sex":"女" },
{ "id":"016", "username":"刘晓庆", "sex":"女" }
{
"id": "001",
"username": "张玉林",
"sex": "女"
},
{
"id": "002",
"username": "刘晓军",
"sex": "男"
},
{
"id": "003",
"username": "张恒",
"sex": "男"
},
{
"id": "004",
"username": "朱一",
"sex": "男"
},
{
"id": "005",
"username": "刘佳能",
"sex": "女"
},
{
"id": "006",
"username": "晓梅",
"sex": "女"
},
{
"id": "007",
"username": "马冬梅",
"sex": "女"
},
{
"id": "008",
"username": "刘晓庆",
"sex": "女"
},
{
"id": "009",
"username": "刘晓庆",
"sex": "女"
},
{
"id": "010",
"username": "刘晓庆",
"sex": "女"
},
{
"id": "011",
"username": "刘晓庆",
"sex": "女"
},
{
"id": "012",
"username": "刘晓庆",
"sex": "女"
},
{
"id": "013",
"username": "刘晓庆",
"sex": "女"
},
{
"id": "014",
"username": "刘晓庆",
"sex": "女"
},
{
"id": "015",
"username": "刘晓庆",
"sex": "女"
},
{
"id": "016",
"username": "刘晓庆",
"sex": "女"
}
]
}

1
src/main/resources/static/api/test.json

@ -1,4 +1,3 @@
{
"homeInfo": {
"title": "首页",

9
src/main/resources/static/css/layuimini.css

@ -661,9 +661,11 @@
.popup-tips .layui-layer-TipsG {
display: none;
}
.popup-tips.layui-layer-tips .layui-layer-content {
padding: 0;
}
.popup-tips .layui-nav-tree {
width: 150px;
border-radius: 10px;
@ -711,6 +713,7 @@
.layuimini-menu-left .layui-nav-more:before, .layuimini-menu-left-zoom .layui-nav-more:before {
content: "\e61a";
}
.layuimini-menu-left .layui-nav-itemed > a > .layui-nav-more, .layuimini-menu-left-zoom .layui-nav-itemed > a > .layui-nav-more {
transform: rotate(180deg);
-ms-transform: rotate(180deg);
@ -789,13 +792,15 @@
.layuimini-pc-show {
display: block;
}
.layuimini-mobile-show {
display: none;
}
/**菜单缩放*/
.layuimini-mini .layuimini-menu-left .layui-nav-more, .layuimini-mini .layuimini-menu-left .layui-nav-child {
display: none;!important;
display: none;
!important;
}
}
@ -822,9 +827,11 @@
.layuimini-pc-show {
display: none;
}
.layuimini-mobile-show {
display: block;
}
.layuimini-header-content {
left: 0;
}

8
src/main/resources/static/css/public.css

@ -81,10 +81,18 @@ body {
border-top-right-radius: 4px;
}
.my-card-context{
margin-left: 15px;
font-size: 18px;
margin-top: 5px;
font-weight:normal;
}
.my-time {
margin-top: 40px;
margin-bottom: 20px;
}
body {
font-family: 华文楷体;
font-weight: bold;

BIN
src/main/resources/static/images/logo_back.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

10027
src/main/resources/static/js/ZXing.js

File diff suppressed because one or more lines are too long

401
src/main/resources/static/js/jsQR.js

@ -10,68 +10,103 @@
})(typeof self !== 'undefined' ? self : this, function () {
return /******/ (function (modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/
if (installedModules[moduleId]) {
/******/
return installedModules[moduleId].exports;
/******/
}
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/
var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
};
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
return module.exports;
/******/
}
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
__webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
__webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/
__webpack_require__.d = function (exports, name, getter) {
/******/
if (!__webpack_require__.o(exports, name)) {
/******/
Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
});
/******/
}
/******/
};
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
__webpack_require__.n = function (module) {
/******/
var getter = module && module.__esModule ?
/******/ function getDefault() {
return module['default'];
} :
/******/ function getModuleExports() {
return module;
};
/******/
__webpack_require__.d(getter, 'a', getter);
/******/
return getter;
/******/
};
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
__webpack_require__.o = function (object, property) {
return Object.prototype.hasOwnProperty.call(object, property);
};
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
__webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 3);
/******/ })
/******/
return __webpack_require__(__webpack_require__.s = 3);
/******/
})
/************************************************************************/
/******/ ([
/* 0 */
@ -86,6 +121,7 @@
this.height = data.length / width;
this.data = data;
}
BitMatrix.createEmpty = function (width, height) {
return new BitMatrix(new Uint8ClampedArray(width * height), width);
};
@ -110,7 +146,8 @@
exports.BitMatrix = BitMatrix;
/***/ }),
/***/
}),
/* 1 */
/***/ (function (module, exports, __webpack_require__) {
@ -118,9 +155,11 @@
Object.defineProperty(exports, "__esModule", {value: true});
var GenericGFPoly_1 = __webpack_require__(2);
function addOrSubtractGF(a, b) {
return a ^ b; // tslint:disable-line:no-bitwise
}
exports.addOrSubtractGF = addOrSubtractGF;
var GenericGF = /** @class */ (function () {
function GenericGF(primitive, size, genBase) {
@ -143,6 +182,7 @@
this.zero = new GenericGFPoly_1.default(this, Uint8ClampedArray.from([0]));
this.one = new GenericGFPoly_1.default(this, Uint8ClampedArray.from([1]));
}
GenericGF.prototype.multiply = function (a, b) {
if (a === 0 || b === 0) {
return 0;
@ -180,7 +220,8 @@
exports.default = GenericGF;
/***/ }),
/***/
}),
/* 2 */
/***/ (function (module, exports, __webpack_require__) {
@ -203,18 +244,17 @@
}
if (firstNonZero === coefficientsLength) {
this.coefficients = field.zero.coefficients;
}
else {
} else {
this.coefficients = new Uint8ClampedArray(coefficientsLength - firstNonZero);
for (var i = 0; i < this.coefficients.length; i++) {
this.coefficients[i] = coefficients[firstNonZero + i];
}
}
}
else {
} else {
this.coefficients = coefficients;
}
}
GenericGFPoly.prototype.degree = function () {
return this.coefficients.length - 1;
};
@ -317,7 +357,8 @@
exports.default = GenericGFPoly;
/***/ }),
/***/
}),
/* 3 */
/***/ (function (module, exports, __webpack_require__) {
@ -328,6 +369,7 @@
var decoder_1 = __webpack_require__(5);
var extractor_1 = __webpack_require__(11);
var locator_1 = __webpack_require__(12);
function scan(matrix) {
var locations = locator_1.locate(matrix);
if (!locations) {
@ -358,29 +400,36 @@
}
return null;
}
var defaultOptions = {
inversionAttempts: "attemptBoth",
};
function jsQR(data, width, height, providedOptions) {
if (providedOptions === void 0) { providedOptions = {}; }
if (providedOptions === void 0) {
providedOptions = {};
}
var options = defaultOptions;
Object.keys(options || {}).forEach(function (opt) {
options[opt] = providedOptions[opt] || options[opt];
});
var shouldInvert = options.inversionAttempts === "attemptBoth" || options.inversionAttempts === "invertFirst";
var tryInvertedFirst = options.inversionAttempts === "onlyInvert" || options.inversionAttempts === "invertFirst";
var _a = binarizer_1.binarize(data, width, height, shouldInvert), binarized = _a.binarized, inverted = _a.inverted;
var _a = binarizer_1.binarize(data, width, height, shouldInvert), binarized = _a.binarized,
inverted = _a.inverted;
var result = scan(tryInvertedFirst ? inverted : binarized);
if (!result && (options.inversionAttempts === "attemptBoth" || options.inversionAttempts === "invertFirst")) {
result = scan(tryInvertedFirst ? binarized : inverted);
}
return result;
}
jsQR.default = jsQR;
exports.default = jsQR;
/***/ }),
/***/
}),
/* 4 */
/***/ (function (module, exports, __webpack_require__) {
@ -390,15 +439,18 @@
var BitMatrix_1 = __webpack_require__(0);
var REGION_SIZE = 8;
var MIN_DYNAMIC_RANGE = 24;
function numBetween(value, min, max) {
return value < min ? min : value > max ? max : value;
}
// Like BitMatrix but accepts arbitry Uint8 values
var Matrix = /** @class */ (function () {
function Matrix(width, height) {
this.width = width;
this.data = new Uint8ClampedArray(width * height);
}
Matrix.prototype.get = function (x, y) {
return this.data[y * this.width + x];
};
@ -407,6 +459,7 @@
};
return Matrix;
}());
function binarize(data, width, height, returnInverted) {
if (data.length !== width * height * 4) {
throw new Error("Malformed data passed to binarizer.");
@ -497,10 +550,12 @@
}
return {binarized: binarized};
}
exports.binarize = binarize;
/***/ }),
/***/
}),
/* 5 */
/***/ (function (module, exports, __webpack_require__) {
@ -511,6 +566,7 @@
var decodeData_1 = __webpack_require__(6);
var reedsolomon_1 = __webpack_require__(9);
var version_1 = __webpack_require__(10);
// tslint:disable:no-bitwise
function numBitsDiffering(x, y) {
var z = x ^ y;
@ -521,9 +577,11 @@
}
return bitCount;
}
function pushBit(bit, byte) {
return (byte << 1) | bit;
}
// tslint:enable:no-bitwise
var FORMAT_INFO_TABLE = [
{bits: 0x5412, formatInfo: {errorCorrectionLevel: 1, dataMask: 0}},
@ -560,15 +618,32 @@
{bits: 0x2BED, formatInfo: {errorCorrectionLevel: 2, dataMask: 7}},
];
var DATA_MASKS = [
function (p) { return ((p.y + p.x) % 2) === 0; },
function (p) { return (p.y % 2) === 0; },
function (p) { return p.x % 3 === 0; },
function (p) { return (p.y + p.x) % 3 === 0; },
function (p) { return (Math.floor(p.y / 2) + Math.floor(p.x / 3)) % 2 === 0; },
function (p) { return ((p.x * p.y) % 2) + ((p.x * p.y) % 3) === 0; },
function (p) { return ((((p.y * p.x) % 2) + (p.y * p.x) % 3) % 2) === 0; },
function (p) { return ((((p.y + p.x) % 2) + (p.y * p.x) % 3) % 2) === 0; },
function (p) {
return ((p.y + p.x) % 2) === 0;
},
function (p) {
return (p.y % 2) === 0;
},
function (p) {
return p.x % 3 === 0;
},
function (p) {
return (p.y + p.x) % 3 === 0;
},
function (p) {
return (Math.floor(p.y / 2) + Math.floor(p.x / 3)) % 2 === 0;
},
function (p) {
return ((p.x * p.y) % 2) + ((p.x * p.y) % 3) === 0;
},
function (p) {
return ((((p.y * p.x) % 2) + (p.y * p.x) % 3) % 2) === 0;
},
function (p) {
return ((((p.y + p.x) % 2) + (p.y * p.x) % 3) % 2) === 0;
},
];
function buildFunctionPatternMask(version) {
var dimension = 17 + 4 * version.versionNumber;
var matrix = BitMatrix_1.BitMatrix.createEmpty(dimension, dimension);
@ -593,6 +668,7 @@
}
return matrix;
}
function readCodewords(matrix, version, formatInfo) {
var dataMask = DATA_MASKS[formatInfo.dataMask];
var dimension = matrix.height;
@ -629,6 +705,7 @@
}
return codewords;
}
function readVersion(matrix) {
var dimension = matrix.height;
var provisionalVersion = Math.floor((dimension - 17) / 4);
@ -671,6 +748,7 @@
return bestVersion;
}
}
function readFormatInformation(matrix) {
var topLeftFormatInfoBits = 0;
for (var x = 0; x <= 8; x++) {
@ -717,6 +795,7 @@
}
return null;
}
function getDataBlocks(codewords, version, ecLevel) {
var ecInfo = version.errorCorrectionLevels[ecLevel];
var dataBlocks = [];
@ -759,6 +838,7 @@
}
return dataBlocks;
}
function decodeMatrix(matrix) {
var version = readVersion(matrix);
if (!version) {
@ -774,7 +854,9 @@
return null;
}
// Count total number of data bytes
var totalBytes = dataBlocks.reduce(function (a, b) { return a + b.numDataCodewords; }, 0);
var totalBytes = dataBlocks.reduce(function (a, b) {
return a + b.numDataCodewords;
}, 0);
var resultBytes = new Uint8ClampedArray(totalBytes);
var resultIndex = 0;
for (var _i = 0, dataBlocks_3 = dataBlocks; _i < dataBlocks_3.length; _i++) {
@ -789,11 +871,11 @@
}
try {
return decodeData_1.decode(resultBytes, version.versionNumber);
}
catch (_a) {
} catch (_a) {
return null;
}
}
function decode(matrix) {
if (matrix == null) {
return null;
@ -813,10 +895,12 @@
}
return decodeMatrix(matrix);
}
exports.decode = decode;
/***/ }),
/***/
}),
/* 6 */
/***/ (function (module, exports, __webpack_require__) {
@ -846,6 +930,7 @@
// FNC1FirstPosition = 0x5,
// FNC1SecondPosition = 0x9,
})(ModeByte || (ModeByte = {}));
function decodeNumeric(stream, size) {
var bytes = [];
var text = "";
@ -874,8 +959,7 @@
var b = num % 10;
bytes.push(48 + a, 48 + b);
text += a.toString() + b.toString();
}
else if (length === 1) {
} else if (length === 1) {
var num = stream.readBits(4);
if (num >= 10) {
throw new Error("Invalid numeric value above 9");
@ -885,6 +969,7 @@
}
return {bytes: bytes, text: text};
}
var AlphanumericCharacterCodes = [
"0", "1", "2", "3", "4", "5", "6", "7", "8",
"9", "A", "B", "C", "D", "E", "F", "G", "H",
@ -892,6 +977,7 @@
"R", "S", "T", "U", "V", "W", "X", "Y", "Z",
" ", "$", "%", "*", "+", "-", ".", "/", ":",
];
function decodeAlphanumeric(stream, size) {
var bytes = [];
var text = "";
@ -912,6 +998,7 @@
}
return {bytes: bytes, text: text};
}
function decodeByte(stream, size) {
var bytes = [];
var text = "";
@ -922,13 +1009,15 @@
bytes.push(b);
}
try {
text += decodeURIComponent(bytes.map(function (b) { return "%" + ("0" + b.toString(16)).substr(-2); }).join(""));
}
catch (_a) {
text += decodeURIComponent(bytes.map(function (b) {
return "%" + ("0" + b.toString(16)).substr(-2);
}).join(""));
} catch (_a) {
// failed to decode
}
return {bytes: bytes, text: text};
}
function decodeKanji(stream, size) {
var bytes = [];
var text = "";
@ -939,8 +1028,7 @@
var c = (Math.floor(k / 0xC0) << 8) | (k % 0xC0);
if (c < 0x1F00) {
c += 0x8140;
}
else {
} else {
c += 0xC140;
}
bytes.push(c >> 8, c & 0xFF);
@ -948,6 +1036,7 @@
}
return {bytes: bytes, text: text};
}
function decode(data, version) {
var _a, _b, _c, _d;
var stream = new BitStream_1.BitStream(data);
@ -963,35 +1052,30 @@
var mode = stream.readBits(4);
if (mode === ModeByte.Terminator) {
return result;
}
else if (mode === ModeByte.ECI) {
} else if (mode === ModeByte.ECI) {
if (stream.readBits(1) === 0) {
result.chunks.push({
type: Mode.ECI,
assignmentNumber: stream.readBits(7),
});
}
else if (stream.readBits(1) === 0) {
} else if (stream.readBits(1) === 0) {
result.chunks.push({
type: Mode.ECI,
assignmentNumber: stream.readBits(14),
});
}
else if (stream.readBits(1) === 0) {
} else if (stream.readBits(1) === 0) {
result.chunks.push({
type: Mode.ECI,
assignmentNumber: stream.readBits(21),
});
}
else {
} else {
// ECI data seems corrupted
result.chunks.push({
type: Mode.ECI,
assignmentNumber: -1,
});
}
}
else if (mode === ModeByte.Numeric) {
} else if (mode === ModeByte.Numeric) {
var numericResult = decodeNumeric(stream, size);
result.text += numericResult.text;
(_a = result.bytes).push.apply(_a, numericResult.bytes);
@ -999,8 +1083,7 @@
type: Mode.Numeric,
text: numericResult.text,
});
}
else if (mode === ModeByte.Alphanumeric) {
} else if (mode === ModeByte.Alphanumeric) {
var alphanumericResult = decodeAlphanumeric(stream, size);
result.text += alphanumericResult.text;
(_b = result.bytes).push.apply(_b, alphanumericResult.bytes);
@ -1008,8 +1091,7 @@
type: Mode.Alphanumeric,
text: alphanumericResult.text,
});
}
else if (mode === ModeByte.Byte) {
} else if (mode === ModeByte.Byte) {
var byteResult = decodeByte(stream, size);
result.text += byteResult.text;
(_c = result.bytes).push.apply(_c, byteResult.bytes);
@ -1018,8 +1100,7 @@
bytes: byteResult.bytes,
text: byteResult.text,
});
}
else if (mode === ModeByte.Kanji) {
} else if (mode === ModeByte.Kanji) {
var kanjiResult = decodeKanji(stream, size);
result.text += kanjiResult.text;
(_d = result.bytes).push.apply(_d, kanjiResult.bytes);
@ -1035,10 +1116,12 @@
return result;
}
}
exports.decode = decode;
/***/ }),
/***/
}),
/* 7 */
/***/ (function (module, exports, __webpack_require__) {
@ -1052,6 +1135,7 @@
this.bitOffset = 0;
this.bytes = bytes;
}
BitStream.prototype.readBits = function (numBits) {
if (numBits < 1 || numBits > 32 || numBits > this.available()) {
throw new Error("Cannot read " + numBits.toString() + " bits");
@ -1096,7 +1180,8 @@
exports.BitStream = BitStream;
/***/ }),
/***/
}),
/* 8 */
/***/ (function (module, exports, __webpack_require__) {
@ -8144,7 +8229,8 @@
};
/***/ }),
/***/
}),
/* 9 */
/***/ (function (module, exports, __webpack_require__) {
@ -8153,6 +8239,7 @@
Object.defineProperty(exports, "__esModule", {value: true});
var GenericGF_1 = __webpack_require__(1);
var GenericGFPoly_1 = __webpack_require__(2);
function runEuclideanAlgorithm(field, a, b, R) {
var _a;
// Assume a's degree is >= b's
@ -8196,6 +8283,7 @@
var inverse = field.inverse(sigmaTildeAtZero);
return [t.multiply(inverse), r.multiply(inverse)];
}
function findErrorLocations(field, errorLocator) {
// This is a direct application of Chien's search
var numErrors = errorLocator.degree();
@ -8215,6 +8303,7 @@
}
return result;
}
function findErrorMagnitudes(field, errorEvaluator, errorLocations) {
// This is directly applying Forney's Formula
var s = errorLocations.length;
@ -8234,6 +8323,7 @@
}
return result;
}
function decode(bytes, twoS) {
var outputBytes = new Uint8ClampedArray(bytes.length);
outputBytes.set(bytes);
@ -8270,10 +8360,12 @@
}
return outputBytes;
}
exports.decode = decode;
/***/ }),
/***/
}),
/* 10 */
/***/ (function (module, exports, __webpack_require__) {
@ -9588,7 +9680,8 @@
];
/***/ }),
/***/
}),
/* 11 */
/***/ (function (module, exports, __webpack_require__) {
@ -9596,6 +9689,7 @@
Object.defineProperty(exports, "__esModule", {value: true});
var BitMatrix_1 = __webpack_require__(0);
function squareToQuadrilateral(p1, p2, p3, p4) {
var dx3 = p1.x - p2.x + p3.x - p4.x;
var dy3 = p1.y - p2.y + p3.y - p4.y;
@ -9611,8 +9705,7 @@
a32: p1.y,
a33: 1,
};
}
else {
} else {
var dx1 = p2.x - p3.x;
var dx2 = p4.x - p3.x;
var dy1 = p2.y - p3.y;
@ -9633,6 +9726,7 @@
};
}
}
function quadrilateralToSquare(p1, p2, p3, p4) {
// Here, the adjoint serves as the inverse:
var sToQ = squareToQuadrilateral(p1, p2, p3, p4);
@ -9648,6 +9742,7 @@
a33: sToQ.a11 * sToQ.a22 - sToQ.a12 * sToQ.a21,
};
}
function times(a, b) {
return {
a11: a.a11 * b.a11 + a.a21 * b.a12 + a.a31 * b.a13,
@ -9661,8 +9756,15 @@
a33: a.a13 * b.a31 + a.a23 * b.a32 + a.a33 * b.a33,
};
}
function extract(image, location) {
var qToS = quadrilateralToSquare({ x: 3.5, y: 3.5 }, { x: location.dimension - 3.5, y: 3.5 }, { x: location.dimension - 6.5, y: location.dimension - 6.5 }, { x: 3.5, y: location.dimension - 3.5 });
var qToS = quadrilateralToSquare({x: 3.5, y: 3.5}, {
x: location.dimension - 3.5,
y: 3.5
}, {x: location.dimension - 6.5, y: location.dimension - 6.5}, {
x: 3.5,
y: location.dimension - 3.5
});
var sToQ = squareToQuadrilateral(location.topLeft, location.topRight, location.alignmentPattern, location.bottomLeft);
var transform = times(sToQ, qToS);
var matrix = BitMatrix_1.BitMatrix.createEmpty(location.dimension, location.dimension);
@ -9686,10 +9788,12 @@
mappingFunction: mappingFunction,
};
}
exports.extract = extract;
/***/ }),
/***/
}),
/* 12 */
/***/ (function (module, exports, __webpack_require__) {
@ -9699,10 +9803,16 @@
var MAX_FINDERPATTERNS_TO_SEARCH = 4;
var MIN_QUAD_RATIO = 0.5;
var MAX_QUAD_RATIO = 1.5;
var distance = function (a, b) { return Math.sqrt(Math.pow((b.x - a.x), 2) + Math.pow((b.y - a.y), 2)); };
var distance = function (a, b) {
return Math.sqrt(Math.pow((b.x - a.x), 2) + Math.pow((b.y - a.y), 2));
};
function sum(values) {
return values.reduce(function (a, b) { return a + b; });
return values.reduce(function (a, b) {
return a + b;
});
}
// Takes three finder patterns and organizes them into topLeft, topRight, etc
function reorderFinderPatterns(pattern1, pattern2, pattern3) {
var _a, _b, _c, _d;
@ -9716,11 +9826,9 @@
// Assume one closest to other two is B; A and C will just be guesses at first
if (twoThreeDistance >= oneTwoDistance && twoThreeDistance >= oneThreeDistance) {
_a = [pattern2, pattern1, pattern3], bottomLeft = _a[0], topLeft = _a[1], topRight = _a[2];
}
else if (oneThreeDistance >= twoThreeDistance && oneThreeDistance >= oneTwoDistance) {
} else if (oneThreeDistance >= twoThreeDistance && oneThreeDistance >= oneTwoDistance) {
_b = [pattern1, pattern2, pattern3], bottomLeft = _b[0], topLeft = _b[1], topRight = _b[2];
}
else {
} else {
_c = [pattern1, pattern3, pattern2], bottomLeft = _c[0], topLeft = _c[1], topRight = _c[2];
}
// Use cross product to figure out whether bottomLeft (A) and topRight (C) are correct or flipped in relation to topLeft (B)
@ -9731,6 +9839,7 @@
}
return {bottomLeft: bottomLeft, topLeft: topLeft, topRight: topRight};
}
// Computes the dimension (number of modules on a side) of the QR Code based on the position of the finder patterns
function computeDimension(topLeft, topRight, bottomLeft, matrix) {
var moduleSize = (sum(countBlackWhiteRun(topLeft, bottomLeft, matrix, 5)) / 7 + // Divide by 7 since the ratio is 1:1:3:1:1
@ -9753,6 +9862,7 @@
}
return {dimension: dimension, moduleSize: moduleSize};
}
// Takes an origin point and an end point and counts the sizes of the black white run from the origin towards the end point.
// Returns an array of elements, representing the pixel size of the black white run.
// Uses a variant of http://en.wikipedia.org/wiki/Bresenham's_line_algorithm
@ -9768,8 +9878,7 @@
fromY = Math.floor(origin.x);
toX = Math.floor(end.y);
toY = Math.floor(end.x);
}
else {
} else {
fromX = Math.floor(origin.x);
fromY = Math.floor(origin.y);
toX = Math.floor(end.x);
@ -9808,13 +9917,13 @@
for (var i = 0; i < length; i++) {
if (switchPoints[i] && switchPoints[i + 1]) {
distances.push(distance(switchPoints[i], switchPoints[i + 1]));
}
else {
} else {
distances.push(0);
}
}
return distances;
}
// Takes an origin point and an end point and counts the sizes of the black white run in the origin point
// along the line that intersects with the end point. Returns an array of elements, representing the pixel sizes
// of the black white run. Takes a length which represents the number of switches from black to white to look for.
@ -9823,10 +9932,14 @@
var rise = end.y - origin.y;
var run = end.x - origin.x;
var towardsEnd = countBlackWhiteRunTowardsPoint(origin, end, matrix, Math.ceil(length / 2));
var awayFromEnd = countBlackWhiteRunTowardsPoint(origin, { x: origin.x - run, y: origin.y - rise }, matrix, Math.ceil(length / 2));
var awayFromEnd = countBlackWhiteRunTowardsPoint(origin, {
x: origin.x - run,
y: origin.y - rise
}, matrix, Math.ceil(length / 2));
var middleValue = towardsEnd.shift() + awayFromEnd.shift() - 1; // Substract one so we don't double count a pixel
return (_a = awayFromEnd.concat(middleValue)).concat.apply(_a, towardsEnd);
}
// Takes in a black white run and an array of expected ratios. Returns the average size of the run as well as the "error" -
// that is the amount the run diverges from the expected ratio
function scoreBlackWhiteRun(sequence, ratios) {
@ -9837,6 +9950,7 @@
});
return {averageSize: averageSize, error: error};
}
// Takes an X,Y point and an array of sizes and scores the point against those ratios.
// For example for a finder pattern takes the ratio list of 1:1:3:1:1 and checks horizontal, vertical and diagonal ratios
// against that.
@ -9868,11 +9982,11 @@
Math.pow((diagDownError.averageSize - avgSize), 2) +
Math.pow((diagUpError.averageSize - avgSize), 2)) / avgSize;
return ratioError + sizeError;
}
catch (_a) {
} catch (_a) {
return Infinity;
}
}
function recenterLocation(matrix, p) {
var leftX = Math.round(p.x);
while (matrix.get(leftX, Math.round(p.y))) {
@ -9894,6 +10008,7 @@
var y = (topY + bottomY) / 2;
return {x: x, y: y};
}
function locate(matrix) {
var finderPatternQuads = [];
var activeFinderPatternQuads = [];
@ -9907,8 +10022,7 @@
var v = matrix.get(x, y);
if (v === lastBit) {
length_1++;
}
else {
} else {
scans = [scans[1], scans[2], scans[3], scans[4], length_1];
length_1 = 1;
lastBit = v;
@ -9941,8 +10055,7 @@
});
if (matchingQuads.length > 0) {
matchingQuads[0].bottom = line;
}
else {
} else {
activeFinderPatternQuads.push({top: line, bottom: line});
}
}
@ -9961,8 +10074,7 @@
});
if (matchingQuads.length > 0) {
matchingQuads[0].bottom = line;
}
else {
} else {
activeAlignmentPatternQuads.push({top: line, bottom: line});
}
}
@ -9971,18 +10083,30 @@
for (var x = -1; x <= matrix.width; x++) {
_loop_2(x);
}
finderPatternQuads.push.apply(finderPatternQuads, activeFinderPatternQuads.filter(function (q) { return q.bottom.y !== y && q.bottom.y - q.top.y >= 2; }));
activeFinderPatternQuads = activeFinderPatternQuads.filter(function (q) { return q.bottom.y === y; });
alignmentPatternQuads.push.apply(alignmentPatternQuads, activeAlignmentPatternQuads.filter(function (q) { return q.bottom.y !== y; }));
activeAlignmentPatternQuads = activeAlignmentPatternQuads.filter(function (q) { return q.bottom.y === y; });
finderPatternQuads.push.apply(finderPatternQuads, activeFinderPatternQuads.filter(function (q) {
return q.bottom.y !== y && q.bottom.y - q.top.y >= 2;
}));
activeFinderPatternQuads = activeFinderPatternQuads.filter(function (q) {
return q.bottom.y === y;
});
alignmentPatternQuads.push.apply(alignmentPatternQuads, activeAlignmentPatternQuads.filter(function (q) {
return q.bottom.y !== y;
}));
activeAlignmentPatternQuads = activeAlignmentPatternQuads.filter(function (q) {
return q.bottom.y === y;
});
};
for (var y = 0; y <= matrix.height; y++) {
_loop_1(y);
}
finderPatternQuads.push.apply(finderPatternQuads, activeFinderPatternQuads.filter(function (q) { return q.bottom.y - q.top.y >= 2; }));
finderPatternQuads.push.apply(finderPatternQuads, activeFinderPatternQuads.filter(function (q) {
return q.bottom.y - q.top.y >= 2;
}));
alignmentPatternQuads.push.apply(alignmentPatternQuads, activeAlignmentPatternQuads);
var finderPatternGroups = finderPatternQuads
.filter(function (q) { return q.bottom.y - q.top.y >= 2; }) // All quads must be at least 2px tall since the center square is larger than a block
.filter(function (q) {
return q.bottom.y - q.top.y >= 2;
}) // All quads must be at least 2px tall since the center square is larger than a block
.map(function (q) {
var x = (q.top.startX + q.top.endX + q.bottom.startX + q.bottom.endX) / 4;
var y = (q.top.y + q.bottom.y + 1) / 2;
@ -9994,29 +10118,49 @@
var score = scorePattern({x: Math.round(x), y: Math.round(y)}, [1, 1, 3, 1, 1], matrix);
return {score: score, x: x, y: y, size: size};
})
.filter(function (q) { return !!q; }) // Filter out any rejected quads from above
.sort(function (a, b) { return a.score - b.score; })
.filter(function (q) {
return !!q;
}) // Filter out any rejected quads from above
.sort(function (a, b) {
return a.score - b.score;
})
// Now take the top finder pattern options and try to find 2 other options with a similar size.
.map(function (point, i, finderPatterns) {
if (i > MAX_FINDERPATTERNS_TO_SEARCH) {
return null;
}
var otherPoints = finderPatterns
.filter(function (p, ii) { return i !== ii; })
.map(function (p) { return ({ x: p.x, y: p.y, score: p.score + (Math.pow((p.size - point.size), 2)) / point.size, size: p.size }); })
.sort(function (a, b) { return a.score - b.score; });
.filter(function (p, ii) {
return i !== ii;
})
.map(function (p) {
return ({
x: p.x,
y: p.y,
score: p.score + (Math.pow((p.size - point.size), 2)) / point.size,
size: p.size
});
})
.sort(function (a, b) {
return a.score - b.score;
});
if (otherPoints.length < 2) {
return null;
}
var score = point.score + otherPoints[0].score + otherPoints[1].score;
return {points: [point].concat(otherPoints.slice(0, 2)), score: score};
})
.filter(function (q) { return !!q; }) // Filter out any rejected finder patterns from above
.sort(function (a, b) { return a.score - b.score; });
.filter(function (q) {
return !!q;
}) // Filter out any rejected finder patterns from above
.sort(function (a, b) {
return a.score - b.score;
});
if (finderPatternGroups.length === 0) {
return null;
}
var _a = reorderFinderPatterns(finderPatternGroups[0].points[0], finderPatternGroups[0].points[1], finderPatternGroups[0].points[2]), topRight = _a.topRight, topLeft = _a.topLeft, bottomLeft = _a.bottomLeft;
var _a = reorderFinderPatterns(finderPatternGroups[0].points[0], finderPatternGroups[0].points[1], finderPatternGroups[0].points[2]),
topRight = _a.topRight, topLeft = _a.topLeft, bottomLeft = _a.bottomLeft;
var alignment = findAlignmentPattern(matrix, alignmentPatternQuads, topRight, topLeft, bottomLeft);
var result = [];
if (alignment) {
@ -10039,7 +10183,10 @@
var centeredAlignment = findAlignmentPattern(matrix, alignmentPatternQuads, midTopRight, midTopLeft, midBottomLeft);
if (centeredAlignment) {
result.push({
alignmentPattern: { x: centeredAlignment.alignmentPattern.x, y: centeredAlignment.alignmentPattern.y },
alignmentPattern: {
x: centeredAlignment.alignmentPattern.x,
y: centeredAlignment.alignmentPattern.y
},
bottomLeft: {x: midBottomLeft.x, y: midBottomLeft.y},
topLeft: {x: midTopLeft.x, y: midTopLeft.y},
topRight: {x: midTopRight.x, y: midTopRight.y},
@ -10051,7 +10198,9 @@
}
return result;
}
exports.locate = locate;
function findAlignmentPattern(matrix, alignmentPatternQuads, topRight, topLeft, bottomLeft) {
var _a;
// Now that we've found the three finder patterns we can determine the blockSize and the size of the QR code.
@ -10060,8 +10209,7 @@
var moduleSize;
try {
(_a = computeDimension(topLeft, topRight, bottomLeft, matrix), dimension = _a.dimension, moduleSize = _a.moduleSize);
}
catch (e) {
} catch (e) {
return null;
}
// Now find the alignment pattern
@ -10086,8 +10234,12 @@
var score = sizeScore + distance({x: x, y: y}, expectedAlignmentPattern);
return {x: x, y: y, score: score};
})
.filter(function (v) { return !!v; })
.sort(function (a, b) { return a.score - b.score; });
.filter(function (v) {
return !!v;
})
.sort(function (a, b) {
return a.score - b.score;
});
// If there are less than 15 modules between finder patterns it's a version 1 QR code and as such has no alignmemnt pattern
// so we can only use our best guess.
var alignmentPattern = modulesBetweenFinderPatterns >= 15 && alignmentPatterns.length ? alignmentPatterns[0] : expectedAlignmentPattern;
@ -10095,6 +10247,7 @@
}
/***/ })
/***/
})
/******/])["default"];
});

3
src/main/resources/static/js/lay-module/cardTable/cardTable.css

@ -76,14 +76,17 @@
.cloud-card-component .layui-laypage .layui-laypage-curr .layui-laypage-em {
border-radius: 0px !important;
}
.ew-table-loading {
padding: 10px 0;
text-align: center;
}
.ew-table-loading > i {
color: #999;
font-size: 30px;
}
.ew-table-loading.ew-loading-float {
position: absolute;
top: 0;

14
src/main/resources/static/js/lay-module/cardTable/cardTable.js

@ -69,8 +69,7 @@ layui.define(['table', 'laypage','jquery', 'element'], function(exports) {
if (!!url) {
if (url.indexOf("?") >= 0) {
url = url + '&v=1.0.0';
}
else {
} else {
url = url + '?v=1.0.0';
}
if (!!option.page) {
@ -92,8 +91,7 @@ layui.define(['table', 'laypage','jquery', 'element'], function(exports) {
option.count = option.data.length;
}
}
else {
} else {
if (!option.alldata) {
option.alldata = option.data;
}
@ -110,8 +108,7 @@ layui.define(['table', 'laypage','jquery', 'element'], function(exports) {
if (!!option.data && option.data.length > 0) {
html = createComponent(option.elem.substring(1), option.linenum, option.data);
html += "<div id='cardpage'></div>";
}
else {
} else {
html = "<p>没有数据</p>";
}
$(option.elem).html(html);
@ -144,6 +141,7 @@ layui.define(['table', 'laypage','jquery', 'element'], function(exports) {
html += content + "</div>"
return html;
}
/** 创建指定数量的卡片 */
function createCards(elem, linenum, data) {
var content = "<div class='layui-row layui-col-space30'>";
@ -153,6 +151,7 @@ layui.define(['table', 'laypage','jquery', 'element'], function(exports) {
content += "</div>";
return content;
}
/** 创建一个卡片 */
function createCard(elem, linenum, item, no) {
var line = 12 / linenum;
@ -160,6 +159,7 @@ layui.define(['table', 'laypage','jquery', 'element'], function(exports) {
'<div id=' + item.id + ' onclick="cardTableCheckedCard(' + elem + ',this)" class="layui-col-md' + line + ' ew-datagrid-item" data-index="' + no + '" data-number="1"> <div class="project-list-item"> <img class="project-list-item-cover" src="' + item.image + '"> <div class="project-list-item-body"> <h2>' + item.title + '</h2> <div class="project-list-item-text layui-text">' + item.remark + '</div> <div class="project-list-item-desc"> <span class="time">' + item.time + '</span> <div class="ew-head-list"></div> </div> </div > </div > </div > '
return card;
}
/** 格式化返回参数 */
function initData(tempData, option) {
var data = {};
@ -179,6 +179,7 @@ layui.define(['table', 'laypage','jquery', 'element'], function(exports) {
}
return data;
}
/** 同 步 请 求 获 取 数 据 */
function getData(url) {
$.ajaxSettings.async = false;
@ -190,6 +191,7 @@ layui.define(['table', 'laypage','jquery', 'element'], function(exports) {
});
return redata;
}
//卡片点击事件
window.cardTableCheckedCard = function (elem, obj) {
$(obj).addClass('layui-table-click').siblings().removeClass('layui-table-click');

15834
src/main/resources/static/js/lay-module/echarts/echarts.js

File diff suppressed because one or more lines are too long

3
src/main/resources/static/js/lay-module/layarea/layarea.js

@ -3826,7 +3826,8 @@ layui.define(['layer', 'form', 'laytpl'], function (exports) {
cityCode: 0,
countyCode: 0,
},
change: function(result){}
change: function (result) {
}
};
Class.prototype.index = 0;

14
src/main/resources/static/js/lay-module/layuimini/miniMenu.js

@ -108,7 +108,11 @@ layui.define(["element","laytpl" ,"jquery"], function (exports) {
return leftMenuHtml;
}).join("");
leftMenusHtml = me.compileMenuContainer({ id:options.parentMenuId,className:options.leftMenuCheckDefault,children:leftMenusHtml }) ;
leftMenusHtml = me.compileMenuContainer({
id: options.parentMenuId,
className: options.leftMenuCheckDefault,
children: leftMenusHtml
});
return leftMenusHtml;
},
/**
@ -145,7 +149,13 @@ layui.define(["element","laytpl" ,"jquery"], function (exports) {
childOpenClass: childOpenClass,
leftMenuCheckDefault: leftMenuCheckDefault
});
headerMobileMenuHtml +=me.compileMenu({ id:id,menu:menu,id:id,icon:val.icon, title:val.title, },true);
headerMobileMenuHtml += me.compileMenu({
id: id,
menu: menu,
id: id,
icon: val.icon,
title: val.title,
}, true);
headerMenuCheckDefault = "";
leftMenuCheckDefault = "layui-hide";
return topMenuItemHtml;

6
src/main/resources/static/js/lay-module/layuimini/miniTab.js

@ -53,8 +53,10 @@ layui.define(["element", "layer", "jquery"], function (exports) {
if (options.isIframe) ele = parent.layui.element;
ele.tabAdd('layuiminiTab', {
title: '<span class="layuimini-tab-active"></span><span>' + options.title + '</span><i class="layui-icon layui-unselect layui-tab-close">ဆ</i>' //用于演示
, content: '<iframe width="100%" height="100%" frameborder="no" border="0" marginwidth="0" marginheight="0" src="' + options.href + '"></iframe>'
, id: options.tabId
,
content: '<iframe width="100%" height="100%" frameborder="no" border="0" marginwidth="0" marginheight="0" src="' + options.href + '"></iframe>'
,
id: options.tabId
});
$('.layuimini-menu-left').attr('layuimini-tab-tag', 'add');
sessionStorage.setItem('layuiminimenu_' + options.tabId, options.title);

4
src/main/resources/static/js/lay-module/tableSelect/tableSelect.js

@ -14,7 +14,8 @@ layui.define(['table', 'jquery', 'form'], function (exports) {
*/
tableSelect.prototype.render = function (opt) {
var elem = $(opt.elem);
var tableDone = opt.table.done || function(){};
var tableDone = opt.table.done || function () {
};
//默认设置
opt.searchKey = opt.searchKey || 'keyword';
@ -108,6 +109,7 @@ layui.define(['table', 'jquery', 'form'], function (exports) {
}
return noCheckedKey
}
var noCheckedKey = obj.data[opt.checkedKey] || nu();
for (var i = 0; i < checkedData.length; i++) {
if (checkedData[i][opt.checkedKey] == noCheckedKey) {

81
src/main/resources/static/js/lay-module/wangEditor/wangEditor.css

@ -5,6 +5,7 @@
margin: 0;
box-sizing: border-box;
}
.w-e-toolbar *,
.w-e-text-container *,
.w-e-menu-panel * {
@ -12,6 +13,7 @@
margin: 0;
box-sizing: border-box;
}
.w-e-clear-fix:after {
content: "";
display: table;
@ -27,6 +29,7 @@
border-right-color: #ccc;
border-bottom-color: #ccc;
}
.w-e-toolbar .w-e-droplist .w-e-dp-title {
text-align: center;
color: #999;
@ -34,28 +37,34 @@
border-bottom: 1px solid #f1f1f1;
font-size: 13px;
}
.w-e-toolbar .w-e-droplist ul.w-e-list {
list-style: none;
line-height: 1;
}
.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item {
color: #333;
padding: 5px 0;
}
.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item:hover {
background-color: #f1f1f1;
}
.w-e-toolbar .w-e-droplist ul.w-e-block {
list-style: none;
text-align: left;
padding: 5px;
}
.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item {
display: inline-block;
*display: inline;
*zoom: 1;
padding: 3px 5px;
}
.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item:hover {
background-color: #f1f1f1;
}
@ -66,6 +75,7 @@
font-weight: normal;
font-style: normal;
}
[class^="w-e-icon-"],
[class*=" w-e-icon-"] {
/* use !important to prevent issues with browser extensions that change fonts */
@ -80,90 +90,119 @@
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.w-e-icon-close:before {
content: "\f00d";
}
.w-e-icon-upload2:before {
content: "\e9c6";
}
.w-e-icon-trash-o:before {
content: "\f014";
}
.w-e-icon-header:before {
content: "\f1dc";
}
.w-e-icon-pencil2:before {
content: "\e906";
}
.w-e-icon-paint-brush:before {
content: "\f1fc";
}
.w-e-icon-image:before {
content: "\e90d";
}
.w-e-icon-play:before {
content: "\e912";
}
.w-e-icon-location:before {
content: "\e947";
}
.w-e-icon-undo:before {
content: "\e965";
}
.w-e-icon-redo:before {
content: "\e966";
}
.w-e-icon-quotes-left:before {
content: "\e977";
}
.w-e-icon-list-numbered:before {
content: "\e9b9";
}
.w-e-icon-list2:before {
content: "\e9bb";
}
.w-e-icon-link:before {
content: "\e9cb";
}
.w-e-icon-happy:before {
content: "\e9df";
}
.w-e-icon-bold:before {
content: "\ea62";
}
.w-e-icon-underline:before {
content: "\ea63";
}
.w-e-icon-italic:before {
content: "\ea64";
}
.w-e-icon-strikethrough:before {
content: "\ea65";
}
.w-e-icon-table2:before {
content: "\ea71";
}
.w-e-icon-paragraph-left:before {
content: "\ea77";
}
.w-e-icon-paragraph-center:before {
content: "\ea78";
}
.w-e-icon-paragraph-right:before {
content: "\ea79";
}
.w-e-icon-terminal:before {
content: "\f120";
}
.w-e-icon-page-break:before {
content: "\ea68";
}
.w-e-icon-cancel-circle:before {
content: "\ea0d";
}
.w-e-icon-font:before {
content: "\ea5c";
}
.w-e-icon-text-heigh:before {
content: "\ea5f";
}
@ -176,21 +215,26 @@
/* flex-wrap: wrap; */
/* 单个菜单 */
}
.w-e-toolbar .w-e-menu {
position: relative;
text-align: center;
padding: 5px 10px;
cursor: pointer;
}
.w-e-toolbar .w-e-menu i {
color: #999;
}
.w-e-toolbar .w-e-menu:hover i {
color: #333;
}
.w-e-toolbar .w-e-active i {
color: #1e88e5;
}
.w-e-toolbar .w-e-active:hover i {
color: #1e88e5;
}
@ -207,6 +251,7 @@
/* 为 emotion panel 定制的样式 */
/* 上传图片的 panel 定制样式 */
}
.w-e-text-container .w-e-panel-container .w-e-panel-close {
position: absolute;
right: 0;
@ -216,9 +261,11 @@
cursor: pointer;
color: #999;
}
.w-e-text-container .w-e-panel-container .w-e-panel-close:hover {
color: #333;
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-title {
list-style: none;
display: -webkit-box;
@ -228,6 +275,7 @@
margin: 2px 10px 0 10px;
border-bottom: 1px solid #f1f1f1;
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-item {
padding: 3px 5px;
color: #999;
@ -236,31 +284,37 @@
position: relative;
top: 1px;
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-active {
color: #333;
border-bottom: 1px solid #333;
cursor: default;
font-weight: 700;
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-content {
padding: 10px 15px 10px 15px;
font-size: 16px;
/* 输入框的样式 */
/* 按钮的样式 */
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input:focus,
.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus,
.w-e-text-container .w-e-panel-container .w-e-panel-tab-content button:focus {
outline: none;
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea {
width: 100%;
border: 1px solid #ccc;
padding: 5px;
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus {
border-color: #1e88e5;
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text] {
border: none;
border-bottom: 1px solid #ccc;
@ -269,18 +323,22 @@
color: #333;
text-align: left;
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].small {
width: 30px;
text-align: center;
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].block {
display: block;
width: 100%;
margin: 10px 0;
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text]:focus {
border-bottom: 2px solid #1e88e5;
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button {
font-size: 14px;
color: #1e88e5;
@ -290,28 +348,35 @@
cursor: pointer;
border-radius: 3px;
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.left {
float: left;
margin-right: 10px;
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.right {
float: right;
margin-left: 10px;
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.gray {
color: #999;
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.red {
color: #c24f4a;
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button:hover {
background-color: #f1f1f1;
}
.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container:after {
content: "";
display: table;
clear: both;
}
.w-e-text-container .w-e-panel-container .w-e-emoticon-container .w-e-item {
cursor: pointer;
font-size: 18px;
@ -320,9 +385,11 @@
*display: inline;
*zoom: 1;
}
.w-e-text-container .w-e-panel-container .w-e-up-img-container {
text-align: center;
}
.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn {
display: inline-block;
*display: inline;
@ -332,6 +399,7 @@
font-size: 60px;
line-height: 1;
}
.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn:hover {
color: #333;
}
@ -339,6 +407,7 @@
.w-e-text-container {
position: relative;
}
.w-e-text-container .w-e-progress {
position: absolute;
background-color: #1e88e5;
@ -346,10 +415,12 @@
left: 0;
height: 1px;
}
.w-e-text {
padding: 0 10px;
overflow-y: scroll;
}
.w-e-text p,
.w-e-text h1,
.w-e-text h2,
@ -361,10 +432,12 @@
margin: 10px 0;
line-height: 1.5;
}
.w-e-text ul,
.w-e-text ol {
margin: 10px 0 10px 20px;
}
.w-e-text blockquote {
display: block;
border-left: 8px solid #d0e5f2;
@ -374,6 +447,7 @@
font-size: 100%;
background-color: #f1f1f1;
}
.w-e-text code {
display: inline-block;
*display: inline;
@ -383,29 +457,36 @@
padding: 3px 5px;
margin: 0 3px;
}
.w-e-text pre code {
display: block;
}
.w-e-text table {
border-top: 1px solid #ccc;
border-left: 1px solid #ccc;
}
.w-e-text table td,
.w-e-text table th {
border-bottom: 1px solid #ccc;
border-right: 1px solid #ccc;
padding: 3px 5px;
}
.w-e-text table th {
border-bottom: 2px solid #ccc;
text-align: center;
}
.w-e-text:focus {
outline: none;
}
.w-e-text img {
cursor: pointer;
}
.w-e-text img:hover {
box-shadow: 0 0 5px #333;
}

74
src/main/resources/static/js/lay-module/wangEditor/wangEditor.js

@ -2,7 +2,8 @@
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global.wangEditor = factory());
}(this, (function () { 'use strict';
}(this, (function () {
'use strict';
/*
poly-fill
@ -43,7 +44,8 @@ var polyfill = function () {
Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) {
var matches = (this.document || this.ownerDocument).querySelectorAll(s),
i = matches.length;
while (--i >= 0 && matches.item(i) !== this) {}
while (--i >= 0 && matches.item(i) !== this) {
}
return i > -1;
};
}
@ -794,6 +796,7 @@ function isFunction(fn) {
/*
bold-menu
*/
// 构造函数
function Bold(editor) {
this.editor = editor;
@ -869,7 +872,8 @@ var replaceLang = function (editor, str) {
/*
droplist
*/
var _emptyFn = function _emptyFn() {};
var _emptyFn = function _emptyFn() {
};
// 构造函数
function DropList(menu, opt) {
@ -996,6 +1000,7 @@ DropList.prototype = {
/*
menu - header
*/
// 构造函数
function Head(editor) {
var _this = this;
@ -1012,7 +1017,13 @@ function Head(editor) {
width: 100,
$title: $('<p>设置标题</p>'),
type: 'list', // droplist 以列表形式展示
list: [{ $elem: $('<h1>H1</h1>'), value: '<h1>' }, { $elem: $('<h2>H2</h2>'), value: '<h2>' }, { $elem: $('<h3>H3</h3>'), value: '<h3>' }, { $elem: $('<h4>H4</h4>'), value: '<h4>' }, { $elem: $('<h5>H5</h5>'), value: '<h5>' }, { $elem: $('<p>正文</p>'), value: '<p>' }],
list: [{$elem: $('<h1>H1</h1>'), value: '<h1>'}, {
$elem: $('<h2>H2</h2>'),
value: '<h2>'
}, {$elem: $('<h3>H3</h3>'), value: '<h3>'}, {
$elem: $('<h4>H4</h4>'),
value: '<h4>'
}, {$elem: $('<h5>H5</h5>'), value: '<h5>'}, {$elem: $('<p>正文</p>'), value: '<p>'}],
onClick: function onClick(value) {
// 注意 this 是指向当前的 Head 对象
_this._command(value);
@ -1074,7 +1085,19 @@ function FontSize(editor) {
width: 160,
$title: $('<p>字号</p>'),
type: 'list', // droplist 以列表形式展示
list: [{ $elem: $('<span style="font-size: x-small;">x-small</span>'), value: '1' }, { $elem: $('<span style="font-size: small;">small</span>'), value: '2' }, { $elem: $('<span>normal</span>'), value: '3' }, { $elem: $('<span style="font-size: large;">large</span>'), value: '4' }, { $elem: $('<span style="font-size: x-large;">x-large</span>'), value: '5' }, { $elem: $('<span style="font-size: xx-large;">xx-large</span>'), value: '6' }],
list: [{
$elem: $('<span style="font-size: x-small;">x-small</span>'),
value: '1'
}, {$elem: $('<span style="font-size: small;">small</span>'), value: '2'}, {
$elem: $('<span>normal</span>'),
value: '3'
}, {
$elem: $('<span style="font-size: large;">large</span>'),
value: '4'
}, {
$elem: $('<span style="font-size: x-large;">x-large</span>'),
value: '5'
}, {$elem: $('<span style="font-size: xx-large;">xx-large</span>'), value: '6'}],
onClick: function onClick(value) {
// 注意 this 是指向当前的 FontSize 对象
_this._command(value);
@ -1118,7 +1141,10 @@ function FontName(editor) {
$title: $('<p>字体</p>'),
type: 'list', // droplist 以列表形式展示
list: fontNames.map(function (fontName) {
return { $elem: $('<span style="font-family: ' + fontName + ';">' + fontName + '</span>'), value: fontName };
return {
$elem: $('<span style="font-family: ' + fontName + ';">' + fontName + '</span>'),
value: fontName
};
}),
onClick: function onClick(value) {
// 注意 this 是指向当前的 FontName 对象
@ -1141,7 +1167,8 @@ FontName.prototype = {
panel
*/
var emptyFn = function emptyFn() {};
var emptyFn = function emptyFn() {
};
// 记录已经显示 panel 的菜单
var _isCreatedPanelMenus = [];
@ -1333,6 +1360,7 @@ Panel.prototype = {
/*
menu - link
*/
// 构造函数
function Link(editor) {
this.editor = editor;
@ -1489,6 +1517,7 @@ Link.prototype = {
/*
italic-menu
*/
// 构造函数
function Italic(editor) {
this.editor = editor;
@ -1542,6 +1571,7 @@ Italic.prototype = {
/*
redo-menu
*/
// 构造函数
function Redo(editor) {
this.editor = editor;
@ -1570,6 +1600,7 @@ Redo.prototype = {
/*
strikeThrough-menu
*/
// 构造函数
function StrikeThrough(editor) {
this.editor = editor;
@ -1623,6 +1654,7 @@ StrikeThrough.prototype = {
/*
underline-menu
*/
// 构造函数
function Underline(editor) {
this.editor = editor;
@ -1676,6 +1708,7 @@ Underline.prototype = {
/*
undo-menu
*/
// 构造函数
function Undo(editor) {
this.editor = editor;
@ -1704,6 +1737,7 @@ Undo.prototype = {
/*
menu - list
*/
// 构造函数
function List(editor) {
var _this = this;
@ -1720,7 +1754,10 @@ function List(editor) {
width: 120,
$title: $('<p>设置列表</p>'),
type: 'list', // droplist 以列表形式展示
list: [{ $elem: $('<span><i class="w-e-icon-list-numbered"></i> 有序列表</span>'), value: 'insertOrderedList' }, { $elem: $('<span><i class="w-e-icon-list2"></i> 无序列表</span>'), value: 'insertUnorderedList' }],
list: [{
$elem: $('<span><i class="w-e-icon-list-numbered"></i> 有序列表</span>'),
value: 'insertOrderedList'
}, {$elem: $('<span><i class="w-e-icon-list2"></i> 无序列表</span>'), value: 'insertUnorderedList'}],
onClick: function onClick(value) {
// 注意 this 是指向当前的 List 对象
_this._command(value);
@ -1781,6 +1818,7 @@ List.prototype = {
/*
menu - justify
*/
// 构造函数
function Justify(editor) {
var _this = this;
@ -1797,7 +1835,13 @@ function Justify(editor) {
width: 100,
$title: $('<p>对齐方式</p>'),
type: 'list', // droplist 以列表形式展示
list: [{ $elem: $('<span><i class="w-e-icon-paragraph-left"></i> 靠左</span>'), value: 'justifyLeft' }, { $elem: $('<span><i class="w-e-icon-paragraph-center"></i> 居中</span>'), value: 'justifyCenter' }, { $elem: $('<span><i class="w-e-icon-paragraph-right"></i> 靠右</span>'), value: 'justifyRight' }],
list: [{
$elem: $('<span><i class="w-e-icon-paragraph-left"></i> 靠左</span>'),
value: 'justifyLeft'
}, {
$elem: $('<span><i class="w-e-icon-paragraph-center"></i> 居中</span>'),
value: 'justifyCenter'
}, {$elem: $('<span><i class="w-e-icon-paragraph-right"></i> 靠右</span>'), value: 'justifyRight'}],
onClick: function onClick(value) {
// 注意 this 是指向当前的 List 对象
_this._command(value);
@ -1819,6 +1863,7 @@ Justify.prototype = {
/*
menu - Forecolor
*/
// 构造函数
function ForeColor(editor) {
var _this = this;
@ -1863,6 +1908,7 @@ ForeColor.prototype = {
/*
menu - BackColor
*/
// 构造函数
function BackColor(editor) {
var _this = this;
@ -1907,6 +1953,7 @@ BackColor.prototype = {
/*
menu - quote
*/
// 构造函数
function Quote(editor) {
this.editor = editor;
@ -1975,6 +2022,7 @@ Quote.prototype = {
/*
menu - code
*/
// 构造函数
function Code(editor) {
this.editor = editor;
@ -2110,6 +2158,7 @@ Code.prototype = {
/*
menu - emoticon
*/
// 构造函数
function Emoticon(editor) {
this.editor = editor;
@ -2217,6 +2266,7 @@ Emoticon.prototype = {
/*
menu - table
*/
// 构造函数
function Table(editor) {
this.editor = editor;
@ -2562,6 +2612,7 @@ Table.prototype = {
/*
menu - video
*/
// 构造函数
function Video(editor) {
this.editor = editor;
@ -2637,6 +2688,7 @@ Video.prototype = {
/*
menu - img
*/
// 构造函数
function Image(editor) {
this.editor = editor;
@ -2896,6 +2948,7 @@ MenuConstructors.image = Image;
/*
菜单集合
*/
// 构造函数
function Menus(editor) {
this.editor = editor;
@ -3259,6 +3312,7 @@ Text.prototype = {
// 更新按钮 ative 状态
editor.menus.changeActive();
}
// 按键后保存
$textElem.on('keyup', saveRange);
$textElem.on('mousedown', function (e) {
@ -3443,6 +3497,7 @@ Text.prototype = {
// 粘贴图片、文本的事件,每次只能执行一个
// 判断该次粘贴事件是否可以执行
var pasteTime = 0;
function canDo() {
var now = Date.now();
var flag = false;
@ -3453,6 +3508,7 @@ Text.prototype = {
pasteTime = now;
return flag;
}
function resetTime() {
pasteTime = 0;
}

609
src/main/resources/static/js/lay-module/wangEditor/wangEditor.min.js.map

File diff suppressed because one or more lines are too long

89
src/main/resources/static/js/scan/webqr.js

@ -28,29 +28,24 @@ function dragover(e) {
e.stopPropagation();
e.preventDefault();
}
function drop(e) {
e.stopPropagation();
e.preventDefault();
var dt = e.dataTransfer;
var files = dt.files;
if(files.length>0)
{
if (files.length > 0) {
handleFiles(files);
}
else
if(dt.getData('URL'))
{
} else if (dt.getData('URL')) {
qrcode.decode(dt.getData('URL'));
}
}
function handleFiles(f)
{
function handleFiles(f) {
var o = [];
for(var i =0;i<f.length;i++)
{
for (var i = 0; i < f.length; i++) {
var reader = new FileReader();
reader.onload = (function (theFile) {
return function (e) {
@ -63,8 +58,7 @@ function handleFiles(f)
}
}
function initCanvas(w,h)
{
function initCanvas(w, h) {
gCanvas = document.getElementById("qr-canvas");
gCanvas.style.width = w + "px";
gCanvas.style.height = h + "px";
@ -78,22 +72,21 @@ function initCanvas(w,h)
function captureToCanvas() {
if (stype != 1)
return;
if(gUM)
{
if (gUM) {
try {
gCtx.drawImage(v, 0, 0);
try {
qrcode.decode();
}
catch(e){
} catch (e) {
console.log(e);
setTimeout(captureToCanvas, 500);
};
}
catch(e){
;
} catch (e) {
console.log(e);
setTimeout(captureToCanvas, 500);
};
}
;
}
}
@ -101,8 +94,7 @@ function htmlEntities(str) {
return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
}
function read(a)
{
function read(a) {
var html = "<br>";
if (a.indexOf("http://") === 0 || a.indexOf("https://") === 0)
html += "<a target='_blank' href='" + a + "'>" + a + "</a><br>";
@ -114,8 +106,8 @@ function isCanvasSupported(){
var elem = document.createElement('canvas');
return !!(elem.getContext && elem.getContext('2d'));
}
function success(stream)
{
function success(stream) {
v.srcObject = stream;
v.play();
@ -124,23 +116,18 @@ function success(stream)
setTimeout(captureToCanvas, 500);
}
function error(error)
{
function error(error) {
gUM = false;
return;
}
function load()
{
if(isCanvasSupported() && window.File && window.FileReader)
{
function load() {
if (isCanvasSupported() && window.File && window.FileReader) {
initCanvas(800, 600);
qrcode.callback = read;
document.getElementById("mainbody").style.display = "inline";
setwebcam();
}
else
{
} else {
document.getElementById("mainbody").style.display = "inline";
document.getElementById("mainbody").innerHTML = '<p id="mp1">QR code scanner for HTML5 capable browsers</p><br>' +
'<br><p id="mp2">sorry your browser is not supported</p><br><br>' +
@ -148,12 +135,10 @@ function load()
}
}
function setwebcam()
{
function setwebcam() {
var options = true;
if(navigator.mediaDevices && navigator.mediaDevices.enumerateDevices)
{
if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
try {
navigator.mediaDevices.enumerateDevices()
.then(function (devices) {
@ -166,25 +151,20 @@ function setwebcam()
});
setwebcam2(options);
});
}
catch(e)
{
} catch (e) {
console.log(e);
}
}
else{
} else {
console.log("no navigator.mediaDevices.enumerateDevices");
setwebcam2(options);
}
}
function setwebcam2(options)
{
function setwebcam2(options) {
console.log(options);
document.getElementById("result").innerHTML = "- scanning -";
if(stype==1)
{
if (stype == 1) {
setTimeout(captureToCanvas, 500);
return;
}
@ -193,24 +173,16 @@ function setwebcam2(options)
v = document.getElementById("v");
if(n.mediaDevices.getUserMedia)
{
n.mediaDevices.getUserMedia({video: options, audio: false}).
then(function(stream){
if (n.mediaDevices.getUserMedia) {
n.mediaDevices.getUserMedia({video: options, audio: false}).then(function (stream) {
success(stream);
}).catch(function (error) {
error(error)
});
}
else
if(n.getUserMedia)
{
} else if (n.getUserMedia) {
webkit = true;
n.getUserMedia({video: options, audio: false}, success, error);
}
else
if(n.webkitGetUserMedia)
{
} else if (n.webkitGetUserMedia) {
webkit = true;
n.webkitGetUserMedia({video: options, audio: false}, success, error);
}
@ -222,8 +194,7 @@ function setwebcam2(options)
setTimeout(captureToCanvas, 500);
}
function setimg()
{
function setimg() {
document.getElementById("result").innerHTML = "";
if (stype == 2)
return;

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save