From 94f2774e8bb317d93a48b2651592414f43e802a6 Mon Sep 17 00:00:00 2001 From: erdanergou Date: Tue, 15 Nov 2022 09:16:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=BA=93=E5=AD=98=E7=9B=98?= =?UTF-8?q?=E7=82=B9=E5=AE=A1=E6=89=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../depository_manage/config/QyWxConfig.java | 16 +- .../ApprovalTemplate.java | 5 +- .../config/WebMvcConfig.java | 2 +- .../DepositoryRecordController.java | 236 +++- .../controller/MaterialController.java | 19 +- .../controller/PageController.java | 9 +- .../controller/PlaceController.java | 14 - .../controller/QyWxOperationController.java | 370 ++++-- .../controller/StockTakingController.java | 89 +- .../entity/ApplicationOutRecord.java | 2 +- .../entity/ApplicationOutRecordMin.java | 5 + .../mapper/DepositoryRecordMapper.java | 6 + .../mapper/DepositoryRecordMapper.xml | 34 +- .../mapper/MaterialMapper.java | 2 + .../mapper/MaterialMapper.xml | 15 +- .../pojo/ApplicationOutRecordP.java | 4 - .../ApprovalCallBackInfo.java | 21 + .../approvalCallBackXml/ApprovalInfo.java | 24 + .../ApprovalInfo_Applyer.java | 13 + .../ApprovalInfo_Comment_CommentUserInfo.java | 12 + .../ApprovalInfo_Comments.java | 16 + .../ApprovalInfo_Details.java | 16 + .../ApprovalInfo_Details_Approver.java | 13 + .../ApprovalInfo_Notifyer.java | 12 + .../ApprovalInfo_SpRecord.java | 16 + .../service/DepositoryRecordService.java | 10 + .../service/MaterialService.java | 9 + .../service/StockTakingService.java | 14 + .../impl/DepositoryRecordServiceImpl.java | 552 +++++++-- .../service/impl/MaterialServiceImpl.java | 98 +- .../service/impl/PlaceServiceImpl.java | 2 + .../service/impl/QyWxOperationService.java | 1039 ++++++++++++++++- .../service/impl/StockTakingServiceImpl.java | 558 ++++++--- .../pages/application/application-in.html | 5 + .../application-in_scanQrCode.html | 6 + .../pages/application/application-out.html | 9 +- .../application/application-transfer.html | 7 +- .../pages/application/application_multi.html | 2 +- .../templates/pages/depository/table-in.html | 2 +- .../templates/pages/depository/table-out.html | 2 +- .../pages/material/selectMaterial.html | 5 +- .../material/selectMaterialByApproval.html | 74 ++ .../pages/scanQrCode/ScanBarCodeByNew.html | 88 +- .../pages/scanQrCode/ScanBarOrQrCodeOut.html | 21 +- .../dreamchaser/depository_manage/Test.java | 18 +- 45 files changed, 2980 insertions(+), 512 deletions(-) create mode 100644 src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalCallBackInfo.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Applyer.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Comment_CommentUserInfo.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Comments.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Details.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Details_Approver.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Notifyer.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_SpRecord.java create mode 100644 src/main/resources/templates/pages/material/selectMaterialByApproval.html diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWxConfig.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWxConfig.java index 93ef7496..b38b1f7e 100644 --- a/src/main/java/com/dreamchaser/depository_manage/config/QyWxConfig.java +++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWxConfig.java @@ -41,8 +41,20 @@ public class QyWxConfig { public static String sEncodingAESKey = "10cruMoq3ixrQQngJcMN6CzOYrHWmHMpxp2Xn5iYrsk"; - //企业微信出库审批模板ID - public static String out_template_id = "3WKiKVCzyLv3Y1LaHZxp4DimQEpCdvYP52HsAUtF"; + // 用于企业微信审批回调配置的token + public static String approvalToken = "yCJaB1t"; + // 用于企业微信审批回调配置的EncodingAESKey + public static String approvalEncodingAESKey = "3PEEjYq9sLOm3jdR8huSPRnXOQ8YW7pDnp2Xn5iYrsk"; + + + //企业微信物料出库审批模板ID + public static String out_approval_template_id = "3WKiKVCzyLv3Y1LaHZxp4DimQEpCdvYP52HsAUtF"; + + // 企业微信库存盘点审批模板Id + public static String stockTaking_approval_template_id = "C4RbNbd7KYKHGXimVTc5rkNdVWT92JURzoU4KTgbw"; + + // 企业微信出库审批模板Id + public static String isTrue_out_approval_template_id = "3WKiKVEcnH2dsARvP18hwkApF1Ku5dbNd7txbZCS"; // 用于jsapi的url diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_approval_template/ApprovalTemplate.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_approval_template/ApprovalTemplate.java index 4a0e157e..49ea91b9 100644 --- a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_approval_template/ApprovalTemplate.java +++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_approval_template/ApprovalTemplate.java @@ -50,7 +50,10 @@ public class ApprovalTemplate { /** * 摘要信息,用于显示在审批通知卡片、审批列表的摘要信息,最多3行 */ - private List summary_list; + private List summary_list; + + + private List approver; } diff --git a/src/main/java/com/dreamchaser/depository_manage/config/WebMvcConfig.java b/src/main/java/com/dreamchaser/depository_manage/config/WebMvcConfig.java index 6f04e575..6111a1a9 100644 --- a/src/main/java/com/dreamchaser/depository_manage/config/WebMvcConfig.java +++ b/src/main/java/com/dreamchaser/depository_manage/config/WebMvcConfig.java @@ -15,7 +15,7 @@ public class WebMvcConfig implements WebMvcConfigurer { public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new UserInterceptor()) .addPathPatterns("/**") - .excludePathPatterns("/login", "/register", "/sendCode", "/error","/QyWxLogin","/callback","/getMaterialAll") + .excludePathPatterns("/login", "/register", "/sendCode", "/error","/QyWxLogin","/callback","/getMaterialAll","/approvalcallback") .excludePathPatterns("classpath:/static/**") .excludePathPatterns("/static/**"); } diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java b/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java index 0e021238..ce858881 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java @@ -311,7 +311,7 @@ public class DepositoryRecordController { integer += depositoryRecordService.insertApplicationOutMin(map); // 开启一个线程执行发送信息操作 - new Thread(new Runnable() { + /*new Thread(new Runnable() { @Override public void run() { // 向企业微信中对应用户发送消息 @@ -326,13 +326,20 @@ public class DepositoryRecordController { // 设置过期时间为三天 redisTemplateForHash.expire("user:"+userToken.getNumber()+":QyWxOutId:"+id,72,TimeUnit.HOURS); } - }).start(); + }).start();*/ // 开启一个线程开启审批 new Thread(new Runnable() { @Override public void run() { - + JSONObject jsonObject = qyWxOperationService.sendOutApprovalTemplate(crypt, userToken, ObjectFormatUtil.toInteger(id)); + String sp_no = jsonObject.getString("sp_no"); + Map QyWxApprovalMap = new HashMap<>(); + QyWxApprovalMap.put("sp_no",sp_no); + QyWxApprovalMap.put("mainId",id.toString()); + redisTemplateForHash.opsForHash().putAll(sp_no,QyWxApprovalMap); + // 设置过期为7天 + redisTemplateForHash.expire(sp_no,7,TimeUnit.DAYS); } }).start(); @@ -376,16 +383,40 @@ public class DepositoryRecordController { map.remove("id"); // 插入子订单 integer += depositoryRecordService.insertApplicationOutMin(map); - JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt); - // 将当前返回结果保存到redis中 - Map 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); + + /*// 开启一个线程用于发送消息 + new Thread(new Runnable() { + @Override + public void run() { + JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt); + // 将当前返回结果保存到redis中 + Map 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); + } + }).start();*/ + + // 开启一个线程开启审批 + new Thread(new Runnable() { + @Override + public void run() { + JSONObject jsonObject = qyWxOperationService.sendOutApprovalTemplate(crypt, userToken, ObjectFormatUtil.toInteger(id)); + String sp_no = jsonObject.getString("sp_no"); + Map QyWxApprovalMap = new HashMap<>(); + QyWxApprovalMap.put("sp_no",sp_no); + QyWxApprovalMap.put("mainId",id.toString()); + redisTemplateForHash.opsForHash().putAll(sp_no,QyWxApprovalMap); + // 设置过期为7天 + redisTemplateForHash.expire(sp_no,7,TimeUnit.DAYS); + } + }).start(); + + } } if(integer != 0 && params.size() < 1){ @@ -639,15 +670,37 @@ public class DepositoryRecordController { if(params.size() < 1 && map.size() > 4){ integer += depositoryRecordService.transferApply(map,userToken); Object id = map.get("parentId"); - JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt); - // 将当前返回结果保存到redis中 - Map 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:"+userToken.getNumber()+":QyWxOutId:"+id,QyWxMessageMap); - // 设置过期时间为三天 - redisTemplate.expire("user:"+userToken.getNumber()+":QyWxOutId:"+id,72,TimeUnit.HOURS); + + /*new Thread(new Runnable() { + @Override + public void run() { + JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt); + // 将当前返回结果保存到redis中 + Map 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:"+userToken.getNumber()+":QyWxOutId:"+id,QyWxMessageMap); + // 设置过期时间为三天 + redisTemplate.expire("user:"+userToken.getNumber()+":QyWxOutId:"+id,72,TimeUnit.HOURS); + } + }).start();*/ + + // 开启一个线程开启审批 + new Thread(new Runnable() { + @Override + public void run() { + JSONObject jsonObject = qyWxOperationService.sendOutApprovalTemplate(crypt, userToken, ObjectFormatUtil.toInteger(id)); + String sp_no = jsonObject.getString("sp_no"); + Map QyWxApprovalMap = new HashMap<>(); + QyWxApprovalMap.put("sp_no",sp_no); + QyWxApprovalMap.put("mainId",id.toString()); + redisTemplateForHash.opsForHash().putAll(sp_no,QyWxApprovalMap); + // 设置过期为7天 + redisTemplateForHash.expire(sp_no,7,TimeUnit.DAYS); + } + }).start(); + }else if(params.size() > 0){ for (int i = 0; i < params.size(); i++) { Integer temp = params.get(i); @@ -659,29 +712,47 @@ public class DepositoryRecordController { insert.put("quantity",map.get("quantity"+temp)); insert.put("applyRemark",map.get("applyRemark"+temp)); insert.put("code",map.get("code"+temp)); + insert.put("placeId",map.get("placeId"+temp)); + insert.put("fromPlaceId",map.get("fromPlaceId"+temp)); + Object parentId = map.get("parentId"); + if(parentId!= null){ + insert.put("parentId",parentId); + } integer += depositoryRecordService.transferApply(insert,userToken); - Object id = insert.get("parentId"); - JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt); - // 将当前返回结果保存到redis中 - Map 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:"+userToken.getNumber()+":QyWxOutId:"+id,QyWxMessageMap); - // 设置过期时间为三天 - redisTemplate.expire("user:"+userToken.getNumber()+":QyWxOutId:"+id,72,TimeUnit.HOURS); + map.put("parentId",insert.get("parentId")); + } integer += depositoryRecordService.transferApply(map,userToken); Object id = map.get("parentId"); - JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt); - // 将当前返回结果保存到redis中 - Map 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:"+userToken.getNumber()+":QyWxOutId:"+id,QyWxMessageMap); - // 设置过期时间为三天 - redisTemplate.expire("user:"+userToken.getNumber()+":QyWxOutId:"+id,72,TimeUnit.HOURS); + /* new Thread(new Runnable() { + @Override + public void run() { + JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt); + // 将当前返回结果保存到redis中 + Map 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:"+userToken.getNumber()+":QyWxOutId:"+id,QyWxMessageMap); + // 设置过期时间为三天 + redisTemplate.expire("user:"+userToken.getNumber()+":QyWxOutId:"+id,72,TimeUnit.HOURS); + } + }).start();*/ + // 开启一个线程开启审批 + new Thread(new Runnable() { + @Override + public void run() { + JSONObject jsonObject = qyWxOperationService.sendOutApprovalTemplate(crypt, userToken, ObjectFormatUtil.toInteger(id)); + String sp_no = jsonObject.getString("sp_no"); + Map QyWxApprovalMap = new HashMap<>(); + QyWxApprovalMap.put("sp_no",sp_no); + QyWxApprovalMap.put("mainId",id.toString()); + redisTemplateForHash.opsForHash().putAll(sp_no,QyWxApprovalMap); + // 设置过期为7天 + redisTemplateForHash.expire(sp_no,7,TimeUnit.DAYS); + } + }).start(); + } if(params.size() < 1) { return CrudUtil.postHandle(integer, 1); @@ -819,15 +890,37 @@ public class DepositoryRecordController { } success += depositoryRecordService.insertApplicationOutMin(map); // 向企业微信中对应用户发送消息 - JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt); - // 将当前返回结果保存到redis中 - Map 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); + + /*new Thread(new Runnable() { + @Override + public void run() { + JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt); + // 将当前返回结果保存到redis中 + Map 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); + } + }).start();*/ + + + // 开启一个线程开启审批 + new Thread(new Runnable() { + @Override + public void run() { + JSONObject jsonObject = qyWxOperationService.sendOutApprovalTemplate(crypt, userToken, ObjectFormatUtil.toInteger(id)); + String sp_no = jsonObject.getString("sp_no"); + Map QyWxApprovalMap = new HashMap<>(); + QyWxApprovalMap.put("sp_no",sp_no); + QyWxApprovalMap.put("mainId",id.toString()); + redisTemplateForHash.opsForHash().putAll(sp_no,QyWxApprovalMap); + // 设置过期为7天 + redisTemplateForHash.expire(sp_no,7,TimeUnit.DAYS); + } + }).start(); } } @@ -986,16 +1079,39 @@ public class DepositoryRecordController { errMsg += materialById.getMname() + "在"+depositoryRecordById.getDname()+"出库数量为"+quantity +"失败,数量不足;"; } } - // 向企业微信中对应用户发送消息 - JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt); - // 将当前返回结果保存到redis中 - Map 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); + Integer finalId = id; + /*new Thread(new Runnable() { + @Override + public void run() { + // 向企业微信中对应用户发送消息 + JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(finalId), true,crypt); + // 将当前返回结果保存到redis中 + Map 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:"+ finalId,QyWxMessageMap); + // 设置过期时间为三天 + redisTemplateForHash.expire("user:"+userToken.getNumber()+":QyWxOutId:"+ finalId,72,TimeUnit.HOURS); + } + }).start();*/ + + + // 开启一个线程开启审批 + new Thread(new Runnable() { + @Override + public void run() { + JSONObject jsonObject = qyWxOperationService.sendOutApprovalTemplate(crypt, userToken, ObjectFormatUtil.toInteger(finalId)); + String sp_no = jsonObject.getString("sp_no"); + Map QyWxApprovalMap = new HashMap<>(); + QyWxApprovalMap.put("sp_no",sp_no); + QyWxApprovalMap.put("mainId",finalId.toString()); + redisTemplateForHash.opsForHash().putAll(sp_no,QyWxApprovalMap); + // 设置过期为7天 + redisTemplateForHash.expire(sp_no,7,TimeUnit.DAYS); + } + }).start(); + } if(success == 0){ depositoryRecordService.deleteApplicationOutRecordById(1); diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java b/src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java index e1b555e5..e5ccf596 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java @@ -200,9 +200,9 @@ public class MaterialController { String depositoryId = (String) map.get("depositoryId"); String placeId = (String) map.get("placeId"); list = materialService.InitTreeMenus(mname, depositoryId, placeId); + }else if("4".equals(type)){ + list = materialService.InitTreeMenus_Test(mname); } - - return new RestResponse(list); } @@ -682,7 +682,12 @@ public class MaterialController { public RestResponse qywxStockTakingScanQrCode(@RequestBody Map map, HttpServletRequest request) { // 获取扫描的物料 Map param = new HashMap<>(); - String placeId = (String) map.get("placeId"); + Object pid = map.get("placeId"); + String placeId = "0"; + if(pid != null) + { + placeId = pid.toString(); + } // 获取当前扫描的二维码 String qrCode = (String) map.get("qrCode"); @@ -1058,7 +1063,11 @@ public class MaterialController { String barCode = (String) map.get("qrCode"); Map result = new HashMap<>(); MaterialP material = null; - String placeId = (String) map.get("placeId"); + Object pid = map.get("placeId"); + String placeId = "0"; + if(pid != null){ + placeId = pid.toString(); + } // 用于存储没有对应关系的条形码 List barCodeListByNoMaterial = new ArrayList<>(); @@ -1218,7 +1227,7 @@ public class MaterialController { // 获取当前部门仓库 Map param = new HashMap<>(); String code = map.get("code").toString(); - String depositoryId = (String) map.get("depositoryId"); + String depositoryId = map.get("depositoryId").toString(); String placeId = map.get("placeId").toString(); if ("".equals(code)) { return new RestResponse(null, 1, 200); diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java b/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java index a52e921a..43f8d2d2 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java @@ -135,8 +135,13 @@ public class PageController { @GetMapping("/getMaterialAll") - public String getMaterialAll(){ - return "pages/material/selectMaterial"; + public ModelAndView getMaterialAll(String mname,String type,String clickObj){ + ModelAndView mv = new ModelAndView(); + mv.addObject("mname",mname); + mv.addObject("type",type); + mv.addObject("clickObj",clickObj); + mv.setViewName("pages/material/selectMaterialByApproval"); + return mv; } diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/PlaceController.java b/src/main/java/com/dreamchaser/depository_manage/controller/PlaceController.java index 30b10e54..cecd7942 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/PlaceController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/PlaceController.java @@ -143,20 +143,6 @@ public class PlaceController { throw new MyException("所需请求参数缺失!"); } - Place placeById = placeService.findPlaceById(0); - if(placeById == null){ - Map defaultPlace = new HashMap<>(); - defaultPlace.put("id",0); - defaultPlace.put("x",0); - defaultPlace.put("z",0); - defaultPlace.put("code","0000"); - defaultPlace.put("min",0); - defaultPlace.put("max",999999999); - defaultPlace.put("state",1); - defaultPlace.put("did",0); - defaultPlace.put("quantity",0); - placeService.InsertPlace(defaultPlace); - } if ("one".equals(type)) { return CrudUtil.postHandle(success, 1); } else if("list".equals(type)){ diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/QyWxOperationController.java b/src/main/java/com/dreamchaser/depository_manage/controller/QyWxOperationController.java index e57384e7..7250c0be 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/QyWxOperationController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/QyWxOperationController.java @@ -1,34 +1,30 @@ 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.StockTaking; import com.dreamchaser.depository_manage.entity.UserByPort; import com.dreamchaser.depository_manage.pojo.RestResponse; -import com.dreamchaser.depository_manage.pojo.callBackXml.CallBackBaseXml; +import com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml.ApprovalCallBackInfo; +import com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml.ApprovalInfo; +import com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml.ApprovalInfo_Details; +import com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml.ApprovalInfo_SpRecord; 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.StockTakingService; import com.dreamchaser.depository_manage.service.impl.QyWxOperationService; import com.dreamchaser.depository_manage.utils.Md5; import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; import com.dreamchaser.depository_manage.utils.QyWxXMLUtils; -import io.micrometer.core.instrument.util.IOUtils; import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.lang.RandomStringUtils; -import org.joda.time.format.FormatUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; @@ -37,11 +33,10 @@ 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.List; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -71,16 +66,16 @@ public class QyWxOperationController { @Autowired - RedisTemplate redisTemplate; + RedisTemplate redisTemplate; /** * 用于接收企业微信的回调,get方式 */ @GetMapping("/callback") - public void callBackForGet(@RequestParam Map map, HttpServletResponse response){ + public void callBackForGet(@RequestParam Map map, HttpServletResponse response) { try { // 构造解密对象 - WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(QyWxConfig.sToken,QyWxConfig.sEncodingAESKey,QyWxConfig.corpid); + WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(QyWxConfig.sToken, QyWxConfig.sEncodingAESKey, QyWxConfig.corpid); // 企业微信加密签名 String sVerifyMsgSig = (String) map.get("msg_signature"); // 时间戳 @@ -114,16 +109,16 @@ public class QyWxOperationController { * 用于接收企业微信的回调,post方式 */ @PostMapping("/callback") - public void callBackForPost(@RequestParam Map param, - @RequestBody(required = false) Map map, - HttpServletRequest request,HttpServletResponse response){ + public void callBackForPost(@RequestParam Map param, + @RequestBody(required = false) Map map, + HttpServletRequest request, HttpServletResponse response) { try { String header = request.getHeader("user-agent"); String crypt = Md5.crypt(header); // 构造解密对象 - WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(QyWxConfig.sToken,QyWxConfig.sEncodingAESKey,QyWxConfig.corpid); + WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(QyWxConfig.sToken, QyWxConfig.sEncodingAESKey, QyWxConfig.corpid); // 企业微信加密签名 String sVerifyMsgSig = (String) param.get("msg_signature"); // 时间戳 @@ -134,7 +129,7 @@ public class QyWxOperationController { String sVerifyEchoStr = (String) param.get("echostr"); - if(sVerifyEchoStr != null) { + if (sVerifyEchoStr != null) { // 如果是验证url String sEchoStr; //需要返回的明文 @@ -152,23 +147,26 @@ public class QyWxOperationController { PrintWriter writer = response.getWriter(); writer.println(sEchoStr); writer.close(); - }else{ + } else { // 如果是响应事件 - String ToUserName = (String) map.get("ToUserName"); - String Encrypt = (String) map.get("Encrypt"); - String AgentID = (String) map.get("AgentID"); + String ToUserName = (String) map.get("ToUserName"); + String Encrypt = (String) map.get("Encrypt"); + String AgentID = (String) map.get("AgentID"); - // 需要解密的xml + // 需要解密的xml String sReqData = String.format("" + "" + - "",ToUserName,Encrypt,AgentID); + "", 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(); + if ("sys_approval_change".equals(templateCard.getEvent())) { + return; + } // 根据userId获取处理人 Map portInfo = PortConfig.findUserByQyWxUserId(fromUserName); UserByPort userByPort = (UserByPort) portInfo.get("user"); @@ -180,48 +178,46 @@ public class QyWxOperationController { String templateCardType = templateCard.getEventKey().split("_")[2]; - String result = ""; - if(clickKey.contains("pass")){ + if (clickKey.contains("pass")) { result = "通过"; - }else{ + } else { result = "驳回"; } - if(templateCardType.contains("StockTaking")){ + if (templateCardType.contains("StockTaking")) { // 如果点击的是库存盘点有关的卡片 - String stockTakingType =templateCard.getEventKey().split("_")[1]; + String stockTakingType = templateCard.getEventKey().split("_")[1]; - if(stockTakingType.contains("review")) { + if (stockTakingType.contains("review")) { // 开启线程处理审批 new Thread(new Runnable() { @Override public void run() { - Map reviewByQyWx = stockTakingService.reviewByQyWx(templateCard,crypt); - if(reviewByQyWx.containsKey("errMsg")){ + Map reviewByQyWx = stockTakingService.reviewByQyWx(templateCard, crypt); + if (reviewByQyWx.containsKey("errMsg")) { } } }).start(); - }else if(stockTakingType.contains("complete")){ + } else if (stockTakingType.contains("complete")) { // 开启线程 new Thread(new Runnable() { @Override public void run() { - stockTakingService.completeStockTakingByQyWx(templateCard,crypt); + stockTakingService.completeStockTakingByQyWx(templateCard, crypt); } }).start(); } - } - else if(templateCardType.contains("out")){ + } else if (templateCardType.contains("out")) { // 如果点击的是出库审核 // 开启线程处理审批 new Thread(new Runnable() { @Override public void run() { - depositoryRecordService.reviewByQyWx(templateCard,crypt); + depositoryRecordService.reviewByQyWx(templateCard, crypt); } }).start(); } @@ -231,18 +227,18 @@ public class QyWxOperationController { new Thread(new Runnable() { @Override public void run() { - qyWxOperationService.updateTemplateCard(templateCard.getResponseCode(),userByPort.getName(), finalResult,crypt); + qyWxOperationService.updateTemplateCard(templateCard.getResponseCode(), userByPort.getName(), finalResult, crypt); } }).start(); // 待加密模板 String sRespData = String.format("" + "" + - "%s"+ - ""+ + "%s" + + "" + "" + - "",ToUserName,QyWxConfig.corpid,templateCard.getCreateTime(),"已"+result); + "", ToUserName, QyWxConfig.corpid, templateCard.getCreateTime(), "已" + result); // 加密 String sEncryptMsg = wxcpt.EncryptMsg(sRespData, sVerifyTimeStamp.toString(), sVerifyNonce); //3.响应消息 @@ -258,6 +254,7 @@ public class QyWxOperationController { /** * 用于企业微信登录 + * * @param code * @param action * @param state @@ -265,16 +262,15 @@ public class QyWxOperationController { * @return */ @GetMapping("/QyWxLogin") - public ModelAndView QyWxLogin(@RequestParam(required = false)String code, - @RequestParam(required = false)String action, - @RequestParam(required = false)String state, + public ModelAndView QyWxLogin(@RequestParam(required = false) String code, + @RequestParam(required = false) String action, + @RequestParam(required = false) String state, HttpServletRequest request, - HttpServletResponse response) - { + HttpServletResponse response) { ModelAndView mv = new ModelAndView(); - mv.addObject("userWxId",""); + mv.addObject("userWxId", ""); mv.setViewName("pages/user/login"); - if(code != null) { + if (code != null) { QyWxConfig.code = code; String header = request.getHeader("user-agent"); String crypt = Md5.crypt(header); @@ -284,43 +280,43 @@ public class QyWxOperationController { if (errCode == 0) { // 如果成功获取userid Map portInfo = PortConfig.findUserByQyWxUserId(userId); - UserByPort userByPort =(UserByPort) portInfo.get("user"); + 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; + String keyAndToken = key + "&" + token; // 将key与token暂存至池中保存 - UserKeyAndTokenPool.addKeyAndToken(userByPort.getNumber(),keyAndToken); + 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.setAttribute("token" + userByPort.getId(), token); + session.setAttribute("userToken", userByPort); session.setMaxInactiveInterval(1800); - mv.addObject("user",userByPort); + mv.addObject("user", userByPort); try { response.sendRedirect("https://jy.hxgk.group/"); } catch (IOException e) { e.printStackTrace(); } - }else{ + } 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); + mv.addObject("userWxId", userId); } - }else{ + } 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{ + } else { JSONObject captcha = PageController.Captcha(request); String picPath = (String) captcha.get("picPath"); String captchaid = (String) captcha.get("captchaid"); @@ -333,18 +329,19 @@ public class QyWxOperationController { /** * 用于获取用于调用企业微信接口的签名 + * * @param request * @return */ @GetMapping("/QyWxSignature") - public RestResponse getQyWXSignature(@RequestParam Map map,HttpServletRequest request){ + public RestResponse getQyWXSignature(@RequestParam Map map, HttpServletRequest request) { // 随机字符串 UserByPort userToken = (UserByPort) request.getAttribute("userToken"); - Map result = new HashMap<>(); + Map result = new HashMap<>(); // jsapi_ticket_app加密后 String s = ""; // jsapi_ticket_enterprises加密后 @@ -359,13 +356,13 @@ public class QyWxOperationController { // 访问url String url = QyWxConfig.jsApiUrl; - s = (String) redisTemplate.opsForHash().get("wms_QyWxScanQrCodeSignature","jsapi_ticket_app"); - if(s != null ){ - s1 = (String) redisTemplate.opsForHash().get("wms_QyWxScanQrCodeSignature","jsapi_ticket_enterprises"); - timestamp = Long.valueOf((String) redisTemplate.opsForHash().get("wms_QyWxScanQrCodeSignature","timestamp")); - url = (String) redisTemplate.opsForHash().get("wms_QyWxScanQrCodeSignature","url"); - noncestr =(String) redisTemplate.opsForHash().get("wms_QyWxScanQrCodeSignature","noncestr"); - }else { + s = (String) redisTemplate.opsForHash().get("wms_QyWxScanQrCodeSignature", "jsapi_ticket_app"); + if (s != null) { + s1 = (String) redisTemplate.opsForHash().get("wms_QyWxScanQrCodeSignature", "jsapi_ticket_enterprises"); + timestamp = Long.valueOf((String) redisTemplate.opsForHash().get("wms_QyWxScanQrCodeSignature", "timestamp")); + url = (String) redisTemplate.opsForHash().get("wms_QyWxScanQrCodeSignature", "url"); + noncestr = (String) redisTemplate.opsForHash().get("wms_QyWxScanQrCodeSignature", "noncestr"); + } else { timestamp = System.currentTimeMillis() / 1000; //生成从ASCII 32到126组成的随机字符串 @@ -397,28 +394,243 @@ public class QyWxOperationController { s = DigestUtils.sha1Hex(jsapi_ticket_app); s1 = DigestUtils.sha1Hex(jsapi_ticket_enterprises); - redisTemplate.opsForHash().put("wms_QyWxScanQrCodeSignature","jsapi_ticket_app",s); - redisTemplate.opsForHash().put("wms_QyWxScanQrCodeSignature","jsapi_ticket_enterprises",s1); - redisTemplate.opsForHash().put("wms_QyWxScanQrCodeSignature","timestamp",String.valueOf(timestamp)); - redisTemplate.opsForHash().put("wms_QyWxScanQrCodeSignature","url",url); - redisTemplate.opsForHash().put("wms_QyWxScanQrCodeSignature","noncestr",noncestr); + redisTemplate.opsForHash().put("wms_QyWxScanQrCodeSignature", "jsapi_ticket_app", s); + redisTemplate.opsForHash().put("wms_QyWxScanQrCodeSignature", "jsapi_ticket_enterprises", s1); + redisTemplate.opsForHash().put("wms_QyWxScanQrCodeSignature", "timestamp", String.valueOf(timestamp)); + redisTemplate.opsForHash().put("wms_QyWxScanQrCodeSignature", "url", url); + redisTemplate.opsForHash().put("wms_QyWxScanQrCodeSignature", "noncestr", noncestr); - redisTemplate.expire("wms_QyWxScanQrCodeSignature",expires_in, TimeUnit.SECONDS); + redisTemplate.expire("wms_QyWxScanQrCodeSignature", expires_in, TimeUnit.SECONDS); } result.put("timestamp", String.valueOf(timestamp)); - result.put("noncestr",noncestr); - result.put("jsapi_ticket_app",s); - result.put("jsapi_ticket_enterprises",s1); - result.put("corpid",QyWxConfig.corpid); + result.put("noncestr", noncestr); + result.put("jsapi_ticket_app", s); + result.put("jsapi_ticket_enterprises", s1); + result.put("corpid", QyWxConfig.corpid); result.put("agentid", String.valueOf(QyWxConfig.AgentId)); - result.put("url",url); + result.put("url", url); - System.out.println(result); return new RestResponse(result); } + /** + * 用于接收企业微信审批的回调 + * + * @param map + * @param response + * @param request + */ + @GetMapping("/approvalcallback") + public void approvalCallBackForGet(@RequestParam Map map, HttpServletResponse response, HttpServletRequest request) { + try { + // 构造解密对象 + WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(QyWxConfig.approvalToken, QyWxConfig.approvalEncodingAESKey, 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("/approvalcallback") + public void approvalCallBackForPost(@RequestParam Map param, + @RequestBody(required = false) Map map, + HttpServletRequest request, HttpServletResponse response) { + try { + + + String header = request.getHeader("user-agent"); + String crypt = Md5.crypt(header); + // 构造解密对象 + WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(QyWxConfig.approvalToken, QyWxConfig.approvalEncodingAESKey, 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("" + + "" + + "", ToUserName, Encrypt, AgentID); + // 解析后的数据 + String sMsg = wxcpt.DecryptMsg(sVerifyMsgSig, sVerifyTimeStamp.toString(), sVerifyNonce, sReqData); + // 将xml转为对应对象 + ApprovalCallBackInfo approvalCallBackInfo = (ApprovalCallBackInfo) QyWxXMLUtils.convertXmlStrToObject(ApprovalCallBackInfo.class, sMsg); + // 具体信息 + ApprovalInfo approvalInfo = approvalCallBackInfo.getApprovalInfo(); + + // 获取当前审批的编号 + String spNo = approvalInfo.getSpNo(); + + // 获取当前审批关联的主订单 + String mainId = (String) redisTemplate.opsForHash().get(spNo, "mainId"); + + // 获取所有审批流程信息 + List spRecord_list = approvalInfo.getSpRecord(); + + // 获取审批流程信息 + ApprovalInfo_SpRecord as = null; + // 获取审批节点详情 + ApprovalInfo_Details approvalInfo_details = null; + // 定义当前流程审批时间 + String as_SpTime = ""; + + + // 获取审批申请状态变化类型:1-提单;2-同意;3-驳回;4-转审;5-催办;6-撤销;8-通过后撤销;10-添加备注 + String spStatus = approvalInfo.getStatuChangeEvent(); + + for (int j = 0; j < spRecord_list.size(); j++) { + ApprovalInfo_SpRecord approvalInfo_SpRecord = spRecord_list.get(j); + // 获取当前审批节点详情。当节点为标签或上级时,一个节点可能有多个分支 + List details = approvalInfo_SpRecord.getDetails(); + // 定义审批操作时间 + String spTime = ""; + // 定义审批操作状态 + String ad_SpStatus = ""; + // 定义审批详情 + ApprovalInfo_Details ap_detail = null; + for (int i = 0; i < details.size(); i++) { + ApprovalInfo_Details ad = details.get(i); + // 获取节点分支审批人审批操作时间,0为尚未操作 + spTime = ad.getSpTime(); + // 如果当前审批人暂未处理 + if (!("0".equals(spTime))) { + // 设置当前处理的详情 + ap_detail = ad; + // 设置当前审批的状态 + ad_SpStatus = ad.getSpStatus(); + continue; + } + } + if ("0".equals(spTime)) { + // 如果当前审批节点未操作 + continue; + } else { + // 如果已经操作 + + // 盘点当前审批状态是否为回调时操作状态 + if (ad_SpStatus.equals(spStatus)) { + // 将当前审批进行暂存 + if (as == null) { + // 如果是当前并没有获取到审批节点 + as = approvalInfo_SpRecord; + as_SpTime = spTime; + approvalInfo_details = ap_detail; + } else { + // 如果已经获取到审批节点 + + // 获取当前审批节点处理时间 + Long aLong = Long.valueOf(spTime); + // 获取之前节点的审批时间 + Long aLong1 = Long.valueOf(as_SpTime); + + if (aLong >= aLong1) { + // 如果当前审批节点是最近处理 + + // 更新当前审批节点 + as = approvalInfo_SpRecord; + as_SpTime = spTime; + approvalInfo_details = ap_detail; + } + } + } else { + continue; + } + + } + } + + // 1-审批中;2-已同意;3-已驳回;4-已转审 + if (!("1".equals(spStatus))) { + + // 如果当前审批已同意 + if (QyWxConfig.out_approval_template_id.equals(approvalInfo.getTemplateId())) { + // 如果是物料出库申请审批 + + // 开启一个线程用于进行处理 + ApprovalInfo_Details finalApprovalInfo_details = approvalInfo_details; + new Thread(new Runnable() { + @Override + public void run() { + depositoryRecordService.reviewByQyWxApproval(mainId, finalApprovalInfo_details, crypt, spStatus, approvalInfo.getSpNo()); + } + }).start(); + + } else if (QyWxConfig.stockTaking_approval_template_id.equals(approvalInfo.getTemplateId())) { + // 如果是库存盘点审批 + // 开启一个线程用于进行处理 + ApprovalInfo_Details finalApprovalInfo_details = approvalInfo_details; + new Thread(new Runnable() { + @Override + public void run() { + stockTakingService.reviewByQyWxApproval(mainId, finalApprovalInfo_details, crypt, spStatus, approvalInfo.getSpNo()); + } + }).start(); + } + // 开启一个线程用于进行下步操作 + } + + } + } catch (AesException | IOException e) { + e.printStackTrace(); + } + } + } diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/StockTakingController.java b/src/main/java/com/dreamchaser/depository_manage/controller/StockTakingController.java index 6246d399..18cf7d6f 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/StockTakingController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/StockTakingController.java @@ -116,33 +116,78 @@ public class StockTakingController { success += stockTakingService.insertStockTaking(param); Object mainId = param.get("mainId"); - // 向企业微信发送消息 - JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingDepartmentManagerMessage(QyWxDepartmentManager.toString(), ObjectFormatUtil.toInteger(mainId),crypt); - // 将当前返回结果保存到redis中 - Map 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()+":QyWxStockTakingId:"+mainId,QyWxMessageMap); - // 设置过期时间为三天 - redisTemplateForHash.expire("user:"+userToken.getNumber()+":QyWxStockTakingId:"+mainId,72, TimeUnit.HOURS); + + // 用于向企业微信发送消息 + /*new Thread(new Runnable() { + @Override + public void run() { + // 向企业微信发送消息 + JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingDepartmentManagerMessage(QyWxDepartmentManager.toString(), ObjectFormatUtil.toInteger(mainId),crypt); + // 将当前返回结果保存到redis中 + Map 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()+":QyWxStockTakingId:"+mainId,QyWxMessageMap); + // 设置过期时间为三天 + redisTemplateForHash.expire("user:"+userToken.getNumber()+":QyWxStockTakingId:"+mainId,72, TimeUnit.HOURS); + } + }).start();*/ + + // 用于发送审批 + new Thread(new Runnable() { + @Override + public void run() { + JSONObject jsonObject = qyWxOperationService.sendApprovalTemplateStockTaking(crypt, userToken, ObjectFormatUtil.toInteger(mainId), QyWxDepartmentManager.toString()); + String sp_no = jsonObject.getString("sp_no"); + Map QyWxApprovalMap = new HashMap<>(); + QyWxApprovalMap.put("sp_no", sp_no); + QyWxApprovalMap.put("mainId", mainId.toString()); + redisTemplateForHash.opsForHash().putAll(sp_no, QyWxApprovalMap); + // 设置过期时间为7天 + redisTemplateForHash.expire(sp_no,7,TimeUnit.DAYS); + } + }).start(); + + } else{ // 如果只有一个表 success += stockTakingService.insertStockTaking(map); - // 向企业微信发送消息 Object mainId = map.get("mainId"); - JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingDepartmentManagerMessage(QyWxDepartmentManager.toString(), ObjectFormatUtil.toInteger(mainId),crypt); - // 将当前返回结果保存到redis中 - Map 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()+":QyWxStockTakingId:"+mainId,QyWxMessageMap); - // 设置过期时间为三天 - redisTemplateForHash.expire("user:"+userToken.getNumber()+":QyWxStockTakingId:"+mainId,72, TimeUnit.HOURS); + // 向企业微信发送消息 + /* new Thread(new Runnable() { + @Override + public void run() { + JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingDepartmentManagerMessage(QyWxDepartmentManager.toString(), ObjectFormatUtil.toInteger(mainId),crypt); + // 将当前返回结果保存到redis中 + Map 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()+":QyWxStockTakingId:"+mainId,QyWxMessageMap); + // 设置过期时间为三天 + redisTemplateForHash.expire("user:"+userToken.getNumber()+":QyWxStockTakingId:"+mainId,72, TimeUnit.HOURS); + } + }).start();*/ + + // 用于发送审批 + new Thread(new Runnable() { + @Override + public void run() { + JSONObject jsonObject = qyWxOperationService.sendApprovalTemplateStockTaking(crypt, userToken, ObjectFormatUtil.toInteger(mainId), QyWxDepartmentManager.toString()); + String sp_no = jsonObject.getString("sp_no"); + Map QyWxApprovalMap = new HashMap<>(); + QyWxApprovalMap.put("sp_no", sp_no); + QyWxApprovalMap.put("mainId", mainId.toString()); + redisTemplateForHash.opsForHash().putAll(sp_no, QyWxApprovalMap); + // 设置过期时间为7天 + redisTemplateForHash.expire(sp_no,7,TimeUnit.DAYS); + } + }).start(); + } if(params.size() > 0 ){ diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecord.java b/src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecord.java index b8fcd898..54fa9da5 100644 --- a/src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecord.java +++ b/src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecord.java @@ -103,7 +103,7 @@ public class ApplicationOutRecord { /** * 转移申请编号 */ - private Integer transferId; + private String transferId; /** * 对应库位id diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecordMin.java b/src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecordMin.java index c8f8f29b..c5c4364d 100644 --- a/src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecordMin.java +++ b/src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecordMin.java @@ -49,4 +49,9 @@ public class ApplicationOutRecordMin { */ private Integer state; + /** + * 转移申请编号 + */ + private Integer transferId; + } diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.java b/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.java index f92e224a..70c5ba69 100644 --- a/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.java +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.java @@ -300,6 +300,12 @@ public interface DepositoryRecordMapper { */ ApplicationOutRecordMin findApplicationOutMinById(Integer id); + /** + * 根据id批量获取出库子订单 + * @param list + * @return + */ + List findApplicationOutMinByIds(List list); /** * 根据主表获取所有子表 diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.xml b/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.xml index 79de4524..f81385e4 100644 --- a/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.xml +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.xml @@ -87,7 +87,6 @@ - @@ -105,6 +104,7 @@ + @@ -138,11 +138,11 @@ aorid,mid,mname,depositoryId,dname,applicantId,applicantTime,applyRemark,aorcode,aorpirce,aorquantity,departmenthead,departmentheadPass,departmentHeadTime,departmentheadMessage, - depositoryManager,depositoryManagerPass,depositoryManagerTime,depositoryManagerMessage,aorstate,istransfer,transferId,mcode,placeId,pass + depositoryManager,depositoryManagerPass,depositoryManagerTime,depositoryManagerMessage,aorstate,istransfer,mcode,placeId,pass - aorm.id,aorm.mid,aorm.depositoryId,aorm.placeId,aorm.quantity,aorm.code,aorm.checkId,aorm.parentId + aorm.id,aorm.mid,aorm.depositoryId,aorm.placeId,aorm.quantity,aorm.code,aorm.checkId,aorm.parentId,aorm.transferId + + + + @@ -156,6 +162,9 @@ + + + @@ -317,7 +317,7 @@
- @@ -328,7 +328,7 @@
- +
@@ -576,6 +576,7 @@ contentType: "application/json;charset=utf-8", success:function (res) { var idNumber = materialId.name.split("mid")[1]; + console.log(idNumber) // 获取物料与条形码的对应关系 var materialAndBarCodeList = d["materialAndBarCodeList"]; var barCode = $("#barCode" + idNumber); diff --git a/src/main/resources/templates/pages/application/application_multi.html b/src/main/resources/templates/pages/application/application_multi.html index 663f1e3f..badeab58 100644 --- a/src/main/resources/templates/pages/application/application_multi.html +++ b/src/main/resources/templates/pages/application/application_multi.html @@ -70,7 +70,7 @@ {field: 'depositoryName', width: '12%', title: '仓库名称'}, {field: 'placeCode', width: '12%', title: '库位编码'}, {field: 'quantity', width: '10%', title: '数量',edit:'quantity'}, - {field: 'price', width: '10%', title: '单价',edit:'price'}, + {field: 'price', width: '10%', title: '单价'}, {field: 'depositoryId', width: '10%', title: '仓库编号',edit:'quantity'}, {field: 'applyRemark', width: '10%', title: '备注说明',edit:'applyRemark'}, {title: '操作', minWidth: 250, toolbar: '#currentTableBar', align: "center"} diff --git a/src/main/resources/templates/pages/depository/table-in.html b/src/main/resources/templates/pages/depository/table-in.html index bf073b7e..3b0bfcb1 100644 --- a/src/main/resources/templates/pages/depository/table-in.html +++ b/src/main/resources/templates/pages/depository/table-in.html @@ -309,7 +309,7 @@ maxmin: true, shadeClose: true, //点击遮罩关闭层 area: ['70%', '70%'], - content: '/selectMaterial?mname=""&type=1', + content: '/selectMaterial?type=1&mname=""', move : '.layui-layer-title', fixed:false diff --git a/src/main/resources/templates/pages/depository/table-out.html b/src/main/resources/templates/pages/depository/table-out.html index 0f1211fa..a39ea1cc 100644 --- a/src/main/resources/templates/pages/depository/table-out.html +++ b/src/main/resources/templates/pages/depository/table-out.html @@ -110,7 +110,7 @@ maxmin: true, shadeClose: true, //点击遮罩关闭层 area: ['70%', '70%'], - content: '/selectMaterial?mname=""&type=1', + content: '/selectMaterial?type=1&mname=""', move : '.layui-layer-title', fixed:false diff --git a/src/main/resources/templates/pages/material/selectMaterial.html b/src/main/resources/templates/pages/material/selectMaterial.html index 2596dc62..9a6bc0c7 100644 --- a/src/main/resources/templates/pages/material/selectMaterial.html +++ b/src/main/resources/templates/pages/material/selectMaterial.html @@ -31,8 +31,8 @@ if (obj.data.children !== undefined) { return false } - $("#openSonByMaterial", window.parent.document).val(obj.data.title) - $("#mid", window.parent.document).val(obj.data.id) + $("#openSonByMaterial", window.parent.document).val(obj.data.title); + $("#mid", window.parent.document).val(obj.data.id); var index = parent.layer.getFrameIndex(window.name); parent.layer.close(index); } @@ -49,6 +49,7 @@ success: function (d) { layer.close(this.layerIndex); var data2 = d.data; + console.log(data2) test.reload({ data: data2 }); diff --git a/src/main/resources/templates/pages/material/selectMaterialByApproval.html b/src/main/resources/templates/pages/material/selectMaterialByApproval.html new file mode 100644 index 00000000..a185c9a9 --- /dev/null +++ b/src/main/resources/templates/pages/material/selectMaterialByApproval.html @@ -0,0 +1,74 @@ + + + + + layui + + + + + + + +
+ + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/pages/scanQrCode/ScanBarCodeByNew.html b/src/main/resources/templates/pages/scanQrCode/ScanBarCodeByNew.html index 4b7fe93b..f7cb9994 100644 --- a/src/main/resources/templates/pages/scanQrCode/ScanBarCodeByNew.html +++ b/src/main/resources/templates/pages/scanQrCode/ScanBarCodeByNew.html @@ -28,56 +28,54 @@ \ No newline at end of file diff --git a/src/main/resources/templates/pages/scanQrCode/ScanBarOrQrCodeOut.html b/src/main/resources/templates/pages/scanQrCode/ScanBarOrQrCodeOut.html index 4291f9ba..103d7a87 100644 --- a/src/main/resources/templates/pages/scanQrCode/ScanBarOrQrCodeOut.html +++ b/src/main/resources/templates/pages/scanQrCode/ScanBarOrQrCodeOut.html @@ -133,7 +133,26 @@ var flag = data.flag; if (flag === 0) { // 如果是无效码 - layer.msg("扫描失败,请确认扫描是否正确"); + layer.confirm("扫描失败,是否重新扫描", { + btn: ["确定","取消"] + },function () { + parent.parent.parent.wx.scanQRCode({ + desc: 'scanQRCode desc', + needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果, + scanType: ["barCode", "qrCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有 + success: function (res) { + // 回调 + var result = res.resultStr;//当needResult为1时返回处理结果 + var req = {}; + req.qrCode = result; + outboundLogic(req); + } + }) + },function () { + // 关闭当前页 + var index = parent.layer.getFrameIndex(window.name); + parent.layer.close(index); + }) } else if (flag === 1) { // 如果是物料 diff --git a/src/test/java/com/dreamchaser/depository_manage/Test.java b/src/test/java/com/dreamchaser/depository_manage/Test.java index 0f94a768..d421b5d4 100644 --- a/src/test/java/com/dreamchaser/depository_manage/Test.java +++ b/src/test/java/com/dreamchaser/depository_manage/Test.java @@ -8,15 +8,20 @@ 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.config.QyWx_approval_template.ApprovalTemplate; +import com.dreamchaser.depository_manage.config.QyWx_approval_template.Approval_template_summary_info; import com.dreamchaser.depository_manage.controller.PageController; import com.dreamchaser.depository_manage.entity.*; +import com.dreamchaser.depository_manage.mapper.DepositoryRecordMapper; import com.dreamchaser.depository_manage.mapper.MaterialMapper; import com.dreamchaser.depository_manage.mapper.MaterialTypeMapper; +import com.dreamchaser.depository_manage.pojo.ApplicationOutRecordP; import com.dreamchaser.depository_manage.pojo.MaterialP; import com.dreamchaser.depository_manage.pojo.StockTakingChildP; import com.dreamchaser.depository_manage.pojo.UserByPortP; import com.dreamchaser.depository_manage.pojo.callBackXml.CallBackBaseXml; import com.dreamchaser.depository_manage.pojo.callBackXml.CallBackXml_button; +import com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml.ApprovalCallBackInfo; import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard; import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard_SelectedItems; import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard_button_selection; @@ -24,6 +29,7 @@ import com.dreamchaser.depository_manage.service.*; import com.dreamchaser.depository_manage.service.impl.QyWxOperationService; import com.dreamchaser.depository_manage.utils.*; import lombok.extern.log4j.Log4j2; +import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang.StringEscapeUtils; import org.apache.http.protocol.HTTP; @@ -71,10 +77,18 @@ import org.xml.sax.InputSource; public class Test { + @Autowired + MaterialService materialService; + + @Autowired + MaterialMapper materialMapper; + + @Autowired + MaterialTypeMapper materialTypeMapper; @org.junit.Test public void test1() throws AesException, IOException, ParserConfigurationException, SAXException { - JSONObject userPortByQyWx = PortConfig.getUserPortByQyWx(102); - System.out.println(userPortByQyWx); + List objectList = materialService.InitTreeMenus(""); + }