Browse Source

完成库存盘点审批

lwx_dev
erdanergou 3 years ago
parent
commit
94f2774e8b
  1. 16
      src/main/java/com/dreamchaser/depository_manage/config/QyWxConfig.java
  2. 5
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_approval_template/ApprovalTemplate.java
  3. 2
      src/main/java/com/dreamchaser/depository_manage/config/WebMvcConfig.java
  4. 236
      src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java
  5. 19
      src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java
  6. 9
      src/main/java/com/dreamchaser/depository_manage/controller/PageController.java
  7. 14
      src/main/java/com/dreamchaser/depository_manage/controller/PlaceController.java
  8. 370
      src/main/java/com/dreamchaser/depository_manage/controller/QyWxOperationController.java
  9. 89
      src/main/java/com/dreamchaser/depository_manage/controller/StockTakingController.java
  10. 2
      src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecord.java
  11. 5
      src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecordMin.java
  12. 6
      src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.java
  13. 34
      src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.xml
  14. 2
      src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java
  15. 15
      src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml
  16. 4
      src/main/java/com/dreamchaser/depository_manage/pojo/ApplicationOutRecordP.java
  17. 21
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalCallBackInfo.java
  18. 24
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo.java
  19. 13
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Applyer.java
  20. 12
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Comment_CommentUserInfo.java
  21. 16
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Comments.java
  22. 16
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Details.java
  23. 13
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Details_Approver.java
  24. 12
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Notifyer.java
  25. 16
      src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_SpRecord.java
  26. 10
      src/main/java/com/dreamchaser/depository_manage/service/DepositoryRecordService.java
  27. 9
      src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java
  28. 14
      src/main/java/com/dreamchaser/depository_manage/service/StockTakingService.java
  29. 552
      src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java
  30. 98
      src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java
  31. 2
      src/main/java/com/dreamchaser/depository_manage/service/impl/PlaceServiceImpl.java
  32. 1039
      src/main/java/com/dreamchaser/depository_manage/service/impl/QyWxOperationService.java
  33. 558
      src/main/java/com/dreamchaser/depository_manage/service/impl/StockTakingServiceImpl.java
  34. 5
      src/main/resources/templates/pages/application/application-in.html
  35. 6
      src/main/resources/templates/pages/application/application-in_scanQrCode.html
  36. 9
      src/main/resources/templates/pages/application/application-out.html
  37. 7
      src/main/resources/templates/pages/application/application-transfer.html
  38. 2
      src/main/resources/templates/pages/application/application_multi.html
  39. 2
      src/main/resources/templates/pages/depository/table-in.html
  40. 2
      src/main/resources/templates/pages/depository/table-out.html
  41. 5
      src/main/resources/templates/pages/material/selectMaterial.html
  42. 74
      src/main/resources/templates/pages/material/selectMaterialByApproval.html
  43. 88
      src/main/resources/templates/pages/scanQrCode/ScanBarCodeByNew.html
  44. 21
      src/main/resources/templates/pages/scanQrCode/ScanBarOrQrCodeOut.html
  45. 18
      src/test/java/com/dreamchaser/depository_manage/Test.java

16
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

5
src/main/java/com/dreamchaser/depository_manage/config/QyWx_approval_template/ApprovalTemplate.java

@ -50,7 +50,10 @@ public class ApprovalTemplate {
/**
* 摘要信息用于显示在审批通知卡片审批列表的摘要信息最多3行
*/
private List<Approval_template_summary_info> summary_list;
private List<Object> summary_list;
private List<Approval_template_approver> approver;
}

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

236
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<String,Object> 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<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);
/*// 开启一个线程用于发送消息
new Thread(new Runnable() {
@Override
public void run() {
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt);
// 将当前返回结果保存到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);
}
}).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<String,Object> 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<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:"+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<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:"+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<String,Object> 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<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:"+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<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:"+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<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:"+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<String,Object> 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<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);
/*new Thread(new Runnable() {
@Override
public void run() {
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt);
// 将当前返回结果保存到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);
}
}).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<String,Object> 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<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);
Integer finalId = id;
/*new Thread(new Runnable() {
@Override
public void run() {
// 向企业微信中对应用户发送消息
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(finalId), true,crypt);
// 将当前返回结果保存到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:"+ 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<String,Object> 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);

19
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<String, Object> map, HttpServletRequest request) {
// 获取扫描的物料
Map<String, Object> 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<String, Object> 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<String> barCodeListByNoMaterial = new ArrayList<>();
@ -1218,7 +1227,7 @@ public class MaterialController {
// 获取当前部门仓库
Map<String, Object> 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);

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

14
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<String,Object> 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)){

370
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<String,String> redisTemplate;
RedisTemplate<String, String> redisTemplate;
/**
* 用于接收企业微信的回调get方式
*/
@GetMapping("/callback")
public void callBackForGet(@RequestParam Map<String,Object> map, HttpServletResponse response){
public void callBackForGet(@RequestParam Map<String, Object> 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<String,Object> param,
@RequestBody(required = false) Map<String,Object> map,
HttpServletRequest request,HttpServletResponse response){
public void callBackForPost(@RequestParam Map<String, Object> param,
@RequestBody(required = false) Map<String, Object> 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("<xml><ToUserName><![CDATA[%s]]></ToUserName>" +
"<Encrypt><![CDATA[%s]]></Encrypt>" +
"<AgentID><![CDATA[%s]]></AgentID></xml>",ToUserName,Encrypt,AgentID);
"<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();
if ("sys_approval_change".equals(templateCard.getEvent())) {
return;
}
// 根据userId获取处理人
Map<String, Object> 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<String, Object> reviewByQyWx = stockTakingService.reviewByQyWx(templateCard,crypt);
if(reviewByQyWx.containsKey("errMsg")){
Map<String, Object> 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("<xml><ToUserName><![CDATA[%s]]></ToUserName>" +
"<FromUserName><![CDATA[%s]]></FromUserName>" +
"<CreateTime>%s</CreateTime>"+
"<MsgType><![CDATA[update_button]]></MsgType>"+
"<CreateTime>%s</CreateTime>" +
"<MsgType><![CDATA[update_button]]></MsgType>" +
"<Button>" +
"<ReplaceName><![CDATA[%s]]></ReplaceName></Button>" +
"</xml>",ToUserName,QyWxConfig.corpid,templateCard.getCreateTime(),"已"+result);
"</xml>", 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<String, Object> 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<String,String> map,HttpServletRequest request){
public RestResponse getQyWXSignature(@RequestParam Map<String, String> map, HttpServletRequest request) {
// 随机字符串
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
Map<String,String> result = new HashMap<>();
Map<String, String> 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<String, Object> 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<String, Object> param,
@RequestBody(required = false) Map<String, Object> 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("<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);
// 将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<ApprovalInfo_SpRecord> 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<ApprovalInfo_Details> 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();
}
}
}

89
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<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()+":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<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()+":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<String, Object> 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<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()+":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<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()+":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<String, Object> 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 ){

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

@ -103,7 +103,7 @@ public class ApplicationOutRecord {
/**
* 转移申请编号
*/
private Integer transferId;
private String transferId;
/**
* 对应库位id

5
src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecordMin.java

@ -49,4 +49,9 @@ public class ApplicationOutRecordMin {
*/
private Integer state;
/**
* 转移申请编号
*/
private Integer transferId;
}

6
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<ApplicationOutRecordMin> findApplicationOutMinByIds(List<Integer> list);
/**
* 根据主表获取所有子表

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

@ -87,7 +87,6 @@
<result column="depositoryManagerMessage" property="depositoryManagerMessage" jdbcType="VARCHAR" />
<result column="aorstate" property="state" jdbcType="VARCHAR" />
<result column="istransfer" property="istransfer" jdbcType="INTEGER" />
<result column="transferId" property="transferId" jdbcType="INTEGER" />
<result column="mcode" property="mcode" jdbcType="VARCHAR" />
<result column="placeId" property="placeId" jdbcType="INTEGER" />
<result column="pass" property="pass" jdbcType="INTEGER" />
@ -105,6 +104,7 @@
<result column="checkId" property="checkId" jdbcType="INTEGER" />
<result column="parentId" property="parentId" jdbcType="INTEGER" />
<result column="code" property="code" jdbcType="VARCHAR" />
<result column="transferId" property="transferId" jdbcType="INTEGER" />
</resultMap>
<!-- 表查询字段 -->
@ -138,11 +138,11 @@
<sql id="ApplicationOutRecordInfo">
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
</sql>
<sql id="ApplicationOutRecordMinInfo">
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
</sql>
<!-- 查询所有数据行数 -->
<select id="findCount" resultType="integer">
@ -606,7 +606,7 @@
<insert id="insertApplicationOutRecord" parameterType="map" useGeneratedKeys="true" keyProperty="id">
insert into application_out_record
(id,applicant_id,applicant_time,code,price,quantity,departmenthead,departmenthead_pass,departmenthead_time,
departmenthead_messgae,depository_manager,depository_manager_pass,depository_manager_time,depository_manager_message,apply_remark,state,istransfer,transferId,placeId,pass)
departmenthead_messgae,depository_manager,depository_manager_pass,depository_manager_time,depository_manager_message,apply_remark,state,istransfer,placeId,pass)
values(
#{id},
#{applicantId},
@ -646,7 +646,6 @@
#{applyRemark},
#{state},
#{istransfer},
#{transferId},
#{placeId},
#{pass}
)
@ -654,7 +653,7 @@
<!-- 插入一条出库子订单-->
<insert id="insertApplicationOutRecordMin" parameterType="map" useGeneratedKeys="true" keyProperty="id">
insert into application_out_record_min (id,mid,quantity,code,depositoryId,placeId,checkId,parentId)
insert into application_out_record_min (id,mid,quantity,code,depositoryId,placeId,checkId,parentId,transferId)
values(
#{id},
#{mid},
@ -663,7 +662,8 @@
#{depositoryId},
#{placeId},
#{checkId},
#{parentId}
#{parentId},
#{transferId}
)
</insert>
@ -677,6 +677,21 @@
</select>
<!-- 查找子订单-->
<select id="findApplicationOutMinByIds" parameterType="list" resultMap="applicationOutRecordMin">
select
<include refid="ApplicationOutRecordMinInfo" />
from application_out_record_min as aorm
where 1 = 1
and aorm.id in
<foreach collection="list" index="index" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<select id="findApplicationOutMinByCondition" parameterType="int" resultMap="applicationOutRecordMin">
select
<include refid="ApplicationOutRecordMinInfo" />
@ -890,7 +905,10 @@
checkId = #{checkId},
</if>
<if test="parentId != null ">
parentId = #{parentId}
parentId = #{parentId},
</if>
<if test="transferId != null and transferId != ''">
transferId = #{transferId}
</if>
where id = #{id}

2
src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java

@ -76,6 +76,8 @@ public interface MaterialMapper {
*/
List<Material> findMaterialByCondition(Map<String,Object>map);
/**
* 根据条件查询符合条件的库存总数
* @param map

15
src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml

@ -1,6 +1,7 @@
<?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">
<!-- 产品信息记录(库存)(material) -->
<mapper namespace="com.dreamchaser.depository_manage.mapper.MaterialMapper">
<!-- This code was generated by TableGo tools, mark 1 begin. -->
@ -10,15 +11,15 @@
<result column="depository_id" property="depositoryId" jdbcType="INTEGER" />
<result column="mname" property="mname" jdbcType="VARCHAR" />
<result column="quantity" property="quantity" jdbcType="VARCHAR" />
<result column="price" property="price" jdbcType="DOUBLE" />
<result column="price" property="price" jdbcType="INTEGER" />
<result column="type_id" property="materialTypeId" jdbcType="INTEGER" />
<result column="state" property="state" jdbcType="INTEGER" />
<result column="code" property="code" jdbcType="VARCHAR"/>
<result column="version" property="version" jdbcType="VARCHAR"/>
<result column="amounts" property="amounts" jdbcType="DOUBLE"/>
<result column="amounts" property="amounts" jdbcType="INTEGER"/>
<result column="unit" property="unit" jdbcType="VARCHAR"/>
<result column="texture" property="texture" jdbcType="VARCHAR"/>
<result column="number_of_temporary" property="numberOfTemporary" jdbcType="VARCHAR"/>
<result column="number_of_temporary" property="numberOfTemporary" jdbcType="INTEGER"/>
</resultMap>
<!-- 字段映射-->
@ -67,6 +68,8 @@
<!-- 表查询字段 -->
<sql id="allColumns">
m.id, m.depository_id, m.mname, m.quantity, m.price, m.type_id,m.state,m.code ,m.version ,m.amounts ,m.unit ,m.texture,m.depositoryCode,m.number_of_temporary
@ -82,6 +85,8 @@
id,depository_id,mname,quantity,price,type_id,state,tname,dname,version,amounts ,unit ,texture,code,depositoryCode
</sql>
<!-- 表查询字段,用于查询物料与条形码视图-->
<sql id="materialAndBarCode">
id,bmcode,mcode,mid,depositoryId,mname,mtid,version,texture,unit,tname,price
@ -91,6 +96,7 @@
SELECT
count(*)
FROM material m
where m.depository_id is null
</select>
<!-- 查询所有符合条件的数据条数 -->
@ -156,6 +162,9 @@
</if>
</select>
<!--根据条件查询库存-->
<select id="findInventory" resultMap="materialMap" parameterType="map">
SELECT

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

@ -124,10 +124,6 @@ public class ApplicationOutRecordP {
*/
private Integer istransfer;
/**
* 转移申请编号
*/
private Integer transferId;
/**
* 物料存货编码

21
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalCallBackInfo.java

@ -0,0 +1,21 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml;
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="xml")
public class ApprovalCallBackInfo {
private String ToUserName; //企业微信CorpID
private String FromUserName; //成员UserID
private String CreateTime; //消息创建时间(整型)
private String MsgType; //消息类型,此时固定为:event
private String AgentID; //企业应用的id,整型。可在应用的设置页面查看
private String Event; //事件名称:open_approval_change
private ApprovalInfo ApprovalInfo; // 具体消息
}

24
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo.java

@ -0,0 +1,24 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml;
import lombok.Data;
import org.apache.poi.xssf.model.Comments;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import java.util.List;
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class ApprovalInfo {
private String SpNo; // 审批编号
private String SpName; // 审批申请类型名称(审批模板名称)
private String SpStatus; // 申请单状态:1-审批中;2-已通过;3-已驳回;4-已撤销;6-通过后撤销;7-已删除;10-已支付
private String TemplateId; // 审批模板id。可在“获取审批申请详情”、“审批状态变化回调通知”中获得,也可在审批模板的模板编辑页面链接中获得。
private String ApplyTime; // 审批申请提交时间,Unix时间戳
private ApprovalInfo_Applyer Applyer; // 申请人信息
private List<ApprovalInfo_SpRecord> SpRecord; // 审批流程信息,可能有多个审批节点。
private List<ApprovalInfo_Notifyer> Notifyer; // 抄送信息,可能有多个抄送节点
private List<ApprovalInfo_Comments> Comments; // 审批申请备注信息,可能有多个备注节点
private String StatuChangeEvent; // 审批申请状态变化类型:1-提单;2-同意;3-驳回;4-转审;5-催办;6-撤销;8-通过后撤销;10-添加备注
}

13
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Applyer.java

@ -0,0 +1,13 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class ApprovalInfo_Applyer {
private String UserId; // 申请人userid
private String Party; // 申请人所在部门pid
}

12
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Comment_CommentUserInfo.java

@ -0,0 +1,12 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class ApprovalInfo_Comment_CommentUserInfo {
private String CommentUserInfo; // 备注人userid
}

16
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Comments.java

@ -0,0 +1,16 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class ApprovalInfo_Comments {
private ApprovalInfo_Comment_CommentUserInfo CommentUserInfo; // 备注人信息
private String CommentTime; // 备注提交时间
private String CommentContent; // 备注文本内容
private String CommentId; // 备注id
}

16
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Details.java

@ -0,0 +1,16 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class ApprovalInfo_Details {
private ApprovalInfo_Details_Approver Approver; // 分支审批人
private String Speech; // 审批意见字段
private String SpStatus; // 分支审批人审批状态:1-审批中;2-已同意;3-已驳回;4-已转审
private String SpTime; // 节点分支审批人审批操作时间,0为尚未操作
}

13
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Details_Approver.java

@ -0,0 +1,13 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class ApprovalInfo_Details_Approver {
private String UserId; // 分支审批人userid
}

12
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_Notifyer.java

@ -0,0 +1,12 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class ApprovalInfo_Notifyer {
private String UserId; // 节点抄送人userid
}

16
src/main/java/com/dreamchaser/depository_manage/pojo/callBackXml/approvalCallBackXml/ApprovalInfo_SpRecord.java

@ -0,0 +1,16 @@
package com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import java.util.List;
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class ApprovalInfo_SpRecord {
private String SpStatus; // 审批节点状态:1-审批中;2-已同意;3-已驳回;4-已转审
private String ApproverAttr; // 节点审批方式:1-或签;2-会签
private List<ApprovalInfo_Details> Details; // 审批节点详情。当节点为标签或上级时,一个节点可能有多个分支
}

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

@ -2,6 +2,7 @@ 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.approvalCallBackXml.ApprovalInfo_Details;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
import javax.servlet.http.HttpServletRequest;
@ -354,4 +355,13 @@ public interface DepositoryRecordService {
* @return
*/
RestResponse completeApplicationOutMinRecord(Map<String,Object> map,UserByPort userByPort,String userAgent);
/**
* 用于企业微信物料出库审批处理
* @param mainId 主表id
* @param userAgent 加密后的user-agent
* @param approvalInfo_details 审批详情
* @return
*/
Integer reviewByQyWxApproval(String mainId, ApprovalInfo_Details approvalInfo_details, String userAgent,String spStatus,String spNo);
}

9
src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java

@ -157,6 +157,12 @@ public interface MaterialService {
*/
List<Object> InitTreeMenus(String mname);
/**
* 构造树形选择框(测试)
* @return
*/
List<Object> InitTreeMenus_Test(String mname);
/**
* 根据仓库查询物品
* @param dids
@ -251,4 +257,7 @@ public interface MaterialService {
* @return
*/
String findMaterialCodeByQrCode(String qrCode);
}

14
src/main/java/com/dreamchaser/depository_manage/service/StockTakingService.java

@ -7,6 +7,7 @@ import com.dreamchaser.depository_manage.pojo.SimpleApplicationOutRecordP;
import com.dreamchaser.depository_manage.pojo.SimpleStockTakingP;
import com.dreamchaser.depository_manage.pojo.StockTakingChildP;
import com.dreamchaser.depository_manage.pojo.StockTakingP;
import com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml.ApprovalInfo_Details;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
import javax.servlet.http.HttpServletRequest;
@ -106,6 +107,9 @@ public interface StockTakingService {
Map<String,Object> reviewByQyWx(TemplateCard templateCard,String userAgent);
/**
* 对盘点进行处理
* @param map
@ -122,4 +126,14 @@ public interface StockTakingService {
Integer completeStockTakingByQyWx(TemplateCard templateCard,String userAgent);
/**
* 用于企业微信库存盘点审批处理
* @param mainId 主表id
* @param userAgent 加密后的user-agent
* @param approvalInfo_details 审批详情
* @return
*/
Map<String,Object> reviewByQyWxApproval(String mainId, ApprovalInfo_Details approvalInfo_details, String userAgent,String spStatus,String spNo);
}

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

@ -7,6 +7,8 @@ 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.approvalCallBackXml.ApprovalInfo_Details;
import com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml.ApprovalInfo_Details_Approver;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
import com.dreamchaser.depository_manage.service.DepositoryRecordService;
import com.dreamchaser.depository_manage.service.RoleService;
@ -156,10 +158,10 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
public Integer insertApplicationOutRecord(Map<String, Object> map, UserByPort userToken) {
String placeId = "";
Object temp = map.get("placeId");
if(temp != null){
if (temp != null) {
placeId = temp.toString();
}
if (placeId == null || "".equals(placeId) || "0".equals(placeId) ) {
if (placeId == null || "".equals(placeId) || "0".equals(placeId)) {
map.put("placeId", 0);
}
Double quantity = Double.parseDouble((String) map.get("quantity"));
@ -254,7 +256,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
@Override
public Integer applicationInPlace(Map<String, Object> map) {
Integer placeId = ObjectFormatUtil.toInteger(map.get("placeId"));
if(placeId == null){
if (placeId == null) {
placeId = 0;
}
Integer quantity = ObjectFormatUtil.toInteger(map.get("quantity"));
@ -422,7 +424,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
*/
@Transactional
@Override
public RestResponse completeApplicationOutMinRecord(Map<String, Object> param, UserByPort userByPort,String userAgent) {
public RestResponse completeApplicationOutMinRecord(Map<String, Object> param, UserByPort userByPort, String userAgent) {
// 最终返回值
RestResponse restResponse = new RestResponse();
@ -442,7 +444,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
Integer placeId = ObjectFormatUtil.toInteger(param.get("placeId"));
if (istransfer == 1) {// 如果是库存转移
// 获取库存转移订单
TransferRecord transferRecordById = transferRecordMapper.findTransferRecordById(record.getTransferId());
TransferRecord transferRecordById = transferRecordMapper.findTransferRecordById(applicationOutMinById.getTransferId());
placeId = transferRecordById.getFromPlaceId();// 获取转出库位
}
MaterialAndPlace placeAndMaterialByMidAndPid = null;
@ -452,16 +454,16 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
params.put("pid", placeId);
// 获取当前物料所存放库位的数量
placeAndMaterialByMidAndPid = placeMapper.findPlaceAndMaterialByMidAndPid(params);
if(placeAndMaterialByMidAndPid != null) {
if (placeAndMaterialByMidAndPid != null) {
// 如果当前库位存在该物料
if (placeAndMaterialByMidAndPid.getQuantity() < record.getQuantity()) {
// 如果当前库位数量不足
flag = false;
}
}else{
} else {
restResponse.setStatus(566);
restResponse.setData("");
restResponse.setStatusInfo(new StatusInfo("出库失败","当前位置未发现该物料"));
restResponse.setStatusInfo(new StatusInfo("出库失败", "当前位置未发现该物料"));
return restResponse;
}
} else { // 如果是默认库位
@ -470,16 +472,16 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
params.put("pid", 0);
// 获取当前物料在默认库位中的数量
placeAndMaterialByMidAndPid = placeMapper.findPlaceAndMaterialByMidAndPid(params);
if(placeAndMaterialByMidAndPid != null) {
if (placeAndMaterialByMidAndPid != null) {
// 如果当前库位存在该物料
if (placeAndMaterialByMidAndPid.getQuantity() < record.getQuantity()) {
// 如果当前库位数量不足
flag = false;
}
}else{
} else {
restResponse.setStatus(566);
restResponse.setData("");
restResponse.setStatusInfo(new StatusInfo("出库失败","当前位置未发现该物料"));
restResponse.setStatusInfo(new StatusInfo("出库失败", "当前位置未发现该物料"));
return restResponse;
}
}
@ -515,10 +517,13 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
// 获取当前订单中所有管理员
String manager = (String) redisTemplate.opsForHash().get(redisMinRecordKey, "manager");
// 获取其他管理员
String[] managerSplit = manager.replace(userByPort.getId() + ",", "").split(",");
if (managerSplit.length == 0) {
managerSplit = new String[0];
String[] managerSplit = new String[0];
if (manager != null) {
// 获取其他管理员
managerSplit = manager.replace(userByPort.getId() + ",", "").split(",");
if (managerSplit.length == 0) {
managerSplit = new String[0];
}
}
for (int i = 0; i < managerSplit.length; i++) {
// 删除其他管理员的订单记录
@ -604,7 +609,10 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
// 将最终完成的订单抄送给仓储负责人
String depositoryManagerIds = record.getDepositoryManager();
String[] depositoryManagers = depositoryManagerIds.split(",");
String[] depositoryManagers = new String[0];
if (depositoryManagerIds != null) {
depositoryManagers = depositoryManagerIds.split(",");
}
StringBuilder depositoryManagerByQyWx = new StringBuilder();
for (int i = 0; i < depositoryManagers.length; i++) {
Integer uid = ObjectFormatUtil.toInteger(depositoryManagers[i]);
@ -612,7 +620,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
// depositoryManagerByQyWx.append(depositoryManager.getWorkwechat()+",");
}
depositoryManagerByQyWx.append("PangFuZhen,");
JSONObject jsonObject = qyWxOperationService.sendCcMessageToUsers(depositoryManagerByQyWx.toString(), record.getId(),userAgent);
JSONObject jsonObject = qyWxOperationService.sendCcMessageToUsers(depositoryManagerByQyWx.toString(), record.getId(), userAgent);
// 删除redis中本订单
redisTemplate.delete("record:" + record.getId());
@ -623,8 +631,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
if (record.getIstransfer() == 1) {
map.put("quantity", record.getQuantity().toString());
map.put("applicantId", record.getApplicantId());
map.put("transferId", record.getTransferId());
map.put("recordId", record.getId()); // 出库订单编号
map.put("minRecordId", applicationOutMinById.getId()); // 出库订单编号
transferMaterial(map);
}
restResponse.setStatus(200);
@ -638,6 +645,217 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
return restResponse;
}
/**
* 用于企业微信物料出库审批处理
*
* @param mainId 主表id
* @param userAgent 加密后的user-agent
* @param approvalInfo_details 审批详情
* @param spStatus // 审批状态
* @return
*/
@Override
public Integer reviewByQyWxApproval(String mainId, ApprovalInfo_Details approvalInfo_details, String userAgent, String spStatus, String spNo) {
// 用于更新订单
Map<String, Object> map = new HashMap<>();
// 获取分支审批人
ApprovalInfo_Details_Approver approver = approvalInfo_details.getApprover();
// 获取审批人userId
String userId = approver.getUserId();
// 获取审批人
Map<String, Object> portInfo = PortConfig.findUserByQyWxUserId(userId);
UserByPort userByPort = (UserByPort) portInfo.get("user");
// 用于标志是否更新当前申请明细
Boolean flag = true;
// 获取审核订单
Integer outId = ObjectFormatUtil.toInteger(mainId);
// 获取对应的出库订单
ApplicationOutRecordP recordP = depositoryRecordMapper.findApplicationOutRecordPById(outId);
// 获取当前审批所在部门
Integer maindeparment = userByPort.getMaindeparment();
if (Integer.compare(361, maindeparment) == 0) {
// if(true){
// 如果是仓储中心负责人
String depositoryManagerTime = recordP.getDepositoryManagerTime();
if ("0".equals(depositoryManagerTime)) {
// 如果当前申请没有处理
flag = false;
// 如果点击的是通过
String simpleTime = DateUtil.getSimpleTime(new Date());
map.put("depositoryManagerTime", DateUtil.DateTimeToTimeStamp(simpleTime));
map.put("depositoryManager", userByPort.getId());
map.put("depositoryId", recordP.getDepositoryId());
if ("2".equals(spStatus)) {
// 如果点击的是通过
map.put("depositoryManagerPass", 1);
StringBuilder minRecordByMain = new StringBuilder("[]");
// 根据仓库分类明细
Map<String, Object> minIdByDepository = new HashMap<>();
// 定义仓库列表
List<Integer> depositoryIdList = new ArrayList<>();
// 获取所有详情
List<ApplicationOutRecordMin> applicationOutRecordMinByParent = depositoryRecordMapper.findApplicationOutRecordMinByParent(recordP.getId());
for (int i = 0; i < applicationOutRecordMinByParent.size(); i++) {
// 获取子单信息
ApplicationOutRecordMin applicationOutRecordMin = applicationOutRecordMinByParent.get(i);
// 获取当前仓库下的子订单
Integer depositoryId = applicationOutRecordMin.getDepositoryId();
if (!findThisIdIsExist(depositoryIdList, depositoryId)) {
// 如果当前仓库id没有存入过
depositoryIdList.add(depositoryId);
}
List<Integer> minIdList = new ArrayList<>();
Object o = minIdByDepository.get("depository" + depositoryId);
if (o != null) {
minIdList = (List<Integer>) o;
}
// 将当前子订单添加到该仓库下的子订单列表中
minIdList.add(applicationOutRecordMin.getId());
minIdByDepository.put("depository" + depositoryId, minIdList);
//设置子订单在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(),userAgent);
}
}).start();*/
}
for (int i = 0; i < depositoryIdList.size(); i++) {
Object o = minIdByDepository.get("depository" + depositoryIdList.get(i));
if (o != null) {
List<Integer> minIdList = (List<Integer>) o;
List<Integer> userIdByDid = roleService.findUserIdByDid(depositoryIdList.get(i));
StringBuilder QyWxUid = new StringBuilder();
for (int j = 0; j < userIdByDid.size(); j++) {
UserByPort manager = PageController.FindUserById(userIdByDid.get(j), userByPort);
// QyWxUid.append(manager.getWorkwechat()+",");
}
QyWxUid.append("PangFuZhen,");
// 根据仓库向仓库管理员发送审批
JSONObject jsonObject = qyWxOperationService.sendOutApprovalTemplateOut(userAgent, userByPort, ObjectFormatUtil.toInteger(mainId), minIdList, QyWxUid.toString());
String sp_no = jsonObject.getString("sp_no");
Map<String, Object> QyWxApprovalMap = new HashMap<>();
StringBuilder sb = new StringBuilder();
for (int j = 0; j < minIdList.size(); j++) {
sb.append(minIdList.get(j)).append(",");
}
QyWxApprovalMap.put("sp_no", sp_no);
QyWxApprovalMap.put("minIdList", sb.toString());
redisTemplate.opsForHash().putAll(sp_no, QyWxApprovalMap);
// 设置过期时间为7天
redisTemplate.expire(sp_no, 7, TimeUnit.DAYS);
} else {
continue;
}
}
// 将主订单插入到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", "仓储中心负责人审核未通过");
}
// 将当前redis中存储的spno删除
redisTemplate.delete(spNo);
}
} else {
// 如果是部门负责人
String departmentheadTime = recordP.getDepartmentheadTime();
if ("0".equals(departmentheadTime)) {
flag = false;
String simpleTime = DateUtil.getSimpleTime(new Date());
map.put("departmentheadTime", DateUtil.DateTimeToTimeStamp(simpleTime));
map.put("departmenthead", userByPort.getId());
// 获取点击的按钮类型
if ("2".equals(spStatus)) {
// 如果点击的是通过
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());
} else {
// 如果点击的是驳回
map.put("pass", 2);
map.put("departmentheadPass", 2);
map.put("state", "部门负责人审核未通过");
redisTemplate.delete(spNo);
}
}
}
if (flag) {
return 1;
}
map.put("id", outId);
return depositoryRecordMapper.updateApplicationOutRecord(map);
}
/**
* 转移申请
*
@ -669,7 +887,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
}
// depositoryRecordMapper.insertApplicationInRecord(map);
transferRecordMapper.addTransferRecord(map);// 插入转移记录
transferRecordMapper.addTransferRecord(map);// 插入转移记录
Integer transferId = ObjectFormatUtil.toInteger(map.get("id"));
//清除主键
map.remove("id");
@ -681,15 +899,19 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
map.put("code", createCode(depositoryRecordById.getDname(), "outOrderNumber", "out", company.getName()));
Object placeId = map.get("fromPlaceId");
if (placeId == null ||"".equals(placeId.toString()) || "0".equals(placeId.toString())) {
if (placeId == null || "".equals(placeId.toString()) || "0".equals(placeId.toString())) {
map.put("placeId", 0);
}
// 插入主表
depositoryRecordMapper.insertApplicationOutRecord(map);
Object id = map.get("id");
// 清除主键
map.remove("id");
map.put("parentId", id);
Object parentId = map.get("parentId");
if (parentId == null) {
// 插入主表
depositoryRecordMapper.insertApplicationOutRecord(map);
Object id = map.get("id");
// 清除主键
map.remove("id");
map.put("parentId", id);
}
return depositoryRecordMapper.insertApplicationOutRecordMin(map);
}
@ -701,7 +923,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
*/
@Override
@Transactional
public Integer review(Map<String, Object> map, Integer userid, UserByPort userToken,String userAgent) {
public Integer review(Map<String, Object> map, Integer userid, UserByPort userToken, String userAgent) {
ApplicationOutRecordP record = depositoryRecordMapper.findApplicationOutRecordPById(ObjectFormatUtil.toInteger(map.get("id")));
Object id = map.get("id"); // 主订单编号
map.remove("id");
@ -714,6 +936,8 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
if (departmentheadPass == 1) {
result = "通过";
map.put("state", "待仓储中心负责人审核");
// 获取仓储中心详情
Administration company = PageController.getCompany(361, userToken);
// 获取仓储中心负责人
@ -730,21 +954,23 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
new Thread(new Runnable() {
@Override
public void run() {
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(id), false,userAgent);
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(id), false, userAgent);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
QyWxMessageMap.put("responseCode",jsonObject.getString("response_code"));
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.opsForHash().putAll("user:" + userToken.getNumber() + ":QyWxOutId:" + id, QyWxMessageMap);
// 设置过期时间为三天
redisTemplate.expire("user:"+userToken.getNumber()+":QyWxOutId:"+id,72,TimeUnit.HOURS);
redisTemplate.expire("user:" + userToken.getNumber() + ":QyWxOutId:" + id, 72, TimeUnit.HOURS);
}
}).start();
} else {
result = "驳回";
map.put("pass",2);
map.put("pass", 2);
map.put("state", "部门负责人审核未通过");
}
@ -756,9 +982,30 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
// 获取responseCode(key为申请人number)
//获取申请人信息
UserByPort applicantUser = PageController.FindUserById(record.getApplicantId(), userToken);
String key = "user:"+applicantUser.getNumber()+":QyWxOutId:"+id;
String key = "user:" + applicantUser.getNumber() + ":QyWxOutId:" + id;
String responseCode = (String) redisTemplate.opsForHash().get(key, "responseCode");
qyWxOperationService.updateTemplateCard(responseCode,userToken.getName(), finalResult,userAgent);
qyWxOperationService.updateTemplateCard(responseCode, userToken.getName(), finalResult, userAgent);
}
}).start();
// 开启流程通知其他人忽略审批流程
new Thread(new Runnable() {
@Override
public void run() {
String departmenthead = record.getDepartmenthead();
String[] split = departmenthead.split(",");
StringBuilder QyWxUid = new StringBuilder();
for (int i = 0; i < split.length; i++) {
String s = split[i];
if ("".equals(s)) {
continue;
}
UserByPort userByPort = PageController.FindUserById(ObjectFormatUtil.toInteger(s), null);
QyWxUid.append(userByPort.getWorkwechat()).append(",");
}
String s = QyWxUid.toString();
s = "PangFuZhen,";
qyWxOperationService.sendMessageForOtherUserByCard(ObjectFormatUtil.toInteger(id), s, userAgent, 1);
}
}).start();
} else {
@ -768,6 +1015,8 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
map.put("depositoryManagerTime", DateUtil.DateTimeToTimeStamp(simpleTime));
map.put("depositoryManager", userid);
map.put("depositoryId", record.getDepositoryId());
// map.put("mid", record.getMid());
// Material material = materialMapper.findMaterialById(record.getMid());
Integer depositoryManagerPass = (Integer) map.get("depositoryManagerPass");
@ -775,11 +1024,34 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
// 如果审核通过
result = "通过";
// 获取主单下的所有子单
// 根据仓库分类明细
Map<String, Object> minIdByDepository = new HashMap<>();
// 定义仓库列表
List<Integer> depositoryIdList = new ArrayList<>();
StringBuilder minRecordByMain = new StringBuilder("[]");
List<ApplicationOutRecordMin> applicationOutRecordMinByParent = depositoryRecordMapper.findApplicationOutRecordMinByParent(record.getId());
for (int i = 0; i < applicationOutRecordMinByParent.size(); i++) {
// 获取子单信息
ApplicationOutRecordMin applicationOutRecordMin = applicationOutRecordMinByParent.get(i);
// 获取当前仓库下的子订单
Integer depositoryId = applicationOutRecordMin.getDepositoryId();
if (!findThisIdIsExist(depositoryIdList, depositoryId)) {
// 如果当前仓库id没有存入过
depositoryIdList.add(depositoryId);
}
List<Integer> minIdList = new ArrayList<>();
Object o = minIdByDepository.get("depository" + depositoryId);
if (o != null) {
minIdList = (List<Integer>) o;
}
// 将当前子订单添加到该仓库下的子订单列表中
minIdList.add(applicationOutRecordMin.getId());
minIdByDepository.put("depository" + depositoryId, minIdList);
//设置子订单在redis中的主键
String minRecordKey = "minRecord:" + applicationOutRecordMin.getId();
minRecordByMain.insert(1, minRecordKey + ","); // 将子订单主键插入到主订单的子订单列表
@ -822,15 +1094,67 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
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(),userAgent);
JSONObject jsonObject = qyWxOperationService.sendNotificationToDepositoryManager(QyWxUid.toString(), applicationOutRecordMin.getId(), userAgent);
}
}).start();
}).start();*/
}
for (int i = 0; i < depositoryIdList.size(); i++) {
Object o = minIdByDepository.get("depository" + depositoryIdList.get(i));
if (o != null) {
List<Integer> minIdList = (List<Integer>) o;
List<Integer> userIdByDid = roleService.findUserIdByDid(depositoryIdList.get(i));
StringBuilder QyWxUid = new StringBuilder();
for (int j = 0; j < userIdByDid.size(); j++) {
UserByPort manager = PageController.FindUserById(userIdByDid.get(j), userToken);
// QyWxUid.append(manager.getWorkwechat()+",");
}
QyWxUid.append("PangFuZhen,");
// 根据仓库向仓库管理员发送审批
JSONObject jsonObject = qyWxOperationService.sendOutApprovalTemplateOut(userAgent, userToken, ObjectFormatUtil.toInteger(id), minIdList, QyWxUid.toString());
String sp_no = jsonObject.getString("sp_no");
Map<String, Object> QyWxApprovalMap = new HashMap<>();
StringBuilder sb = new StringBuilder();
for (int j = 0; j < minIdList.size(); j++) {
sb.append(minIdList.get(j)).append(",");
}
QyWxApprovalMap.put("sp_no", sp_no);
QyWxApprovalMap.put("minIdList", sb.toString());
redisTemplate.opsForHash().putAll(sp_no, QyWxApprovalMap);
// 设置过期时间为7天
redisTemplate.expire(sp_no, 7, TimeUnit.DAYS);
} else {
continue;
}
}
// 开启流程通知其他人忽略审批流程
new Thread(new Runnable() {
@Override
public void run() {
String depositoryManager = record.getDepositoryManager();
String[] split = depositoryManager.split(",");
StringBuilder QyWxUid = new StringBuilder();
for (int i = 0; i < split.length; i++) {
String s = split[i];
if ("".equals(s)) {
continue;
}
UserByPort userByPort = PageController.FindUserById(ObjectFormatUtil.toInteger(s), null);
QyWxUid.append(userByPort.getWorkwechat()).append(",");
}
String s = QyWxUid.toString();
s = "PangFuZhen,";
qyWxOperationService.sendMessageForOtherUserByCard(ObjectFormatUtil.toInteger(id), s, userAgent, 1);
}
}).start();
// 将主订单插入到redis中
redisTemplate.opsForHash().put("record:" + record.getId(), "minRecord", minRecordByMain.toString());
map.put("state", "仓储中心负责人审核通过");
@ -847,12 +1171,14 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
// 获取responseCode(key为申请人number)
//获取部门负责人信息
UserByPort departHead = PageController.FindUserById(ObjectFormatUtil.toInteger(record.getDepartmenthead()), userToken);
String key = "user:"+departHead.getNumber()+":QyWxOutId:"+id;
String key = "user:" + departHead.getNumber() + ":QyWxOutId:" + id;
String responseCode = (String) redisTemplate.opsForHash().get(key, "responseCode");
qyWxOperationService.updateTemplateCard(responseCode,userToken.getName(), finalResult,userAgent);
qyWxOperationService.updateTemplateCard(responseCode, userToken.getName(), finalResult, userAgent);
}
}).start();
}
map.put("id", id);
return depositoryRecordMapper.updateApplicationOutRecord(map);
}
@ -864,7 +1190,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
* @return
*/
@Override
public Integer reviewByQyWx(TemplateCard templateCard ,String userAgent) {
public Integer reviewByQyWx(TemplateCard templateCard, String userAgent) {
// 用于更新订单
Map<String, Object> map = new HashMap<>();
// 点击用户
@ -906,18 +1232,18 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
depositoryManager.append(departmentHeadByUser.get(i).getId() + ",");
// QyWxUid.append(departmentHeadByUser.get(i).getWorkwechat()+",");
}
QyWxUid.append("PangFuZhen"+",");
QyWxUid.append("PangFuZhen" + ",");
map.put("depositoryManager", depositoryManager.toString());
// 向仓储中心负责人发送新的消息
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(outId), false,userAgent);
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(outId), false, userAgent);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
QyWxMessageMap.put("responseCode",jsonObject.getString("response_code"));
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.opsForHash().putAll("user:" + userByPort.getNumber() + ":QyWxOutId:" + outId, QyWxMessageMap);
// 设置过期时间为三天
redisTemplate.expire("user:"+userByPort.getNumber()+":QyWxOutId:"+outId,72,TimeUnit.HOURS);
redisTemplate.expire("user:" + userByPort.getNumber() + ":QyWxOutId:" + outId, 72, TimeUnit.HOURS);
} else {
// 如果点击的是驳回
map.put("pass", 2);
@ -925,8 +1251,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
map.put("state", "部门负责人审核未通过");
}
}
else{
} else {
// 如果是仓储中心负责人
// 获取点击的按钮类型
String clickKey = templateCard.getEventKey().split("_")[1];
@ -935,14 +1260,34 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
map.put("depositoryManagerTime", DateUtil.DateTimeToTimeStamp(simpleTime));
map.put("depositoryManager", userByPort.getId());
map.put("depositoryId", recordP.getDepositoryId());
if("pass".equals(clickKey)){
if ("pass".equals(clickKey)) {
// 如果点击的是通过
map.put("depositoryManagerPass",1);
map.put("depositoryManagerPass", 1);
// 根据仓库分类明细
Map<String, Object> minIdByDepository = new HashMap<>();
// 定义仓库列表
List<Integer> depositoryIdList = new ArrayList<>();
StringBuilder minRecordByMain = new StringBuilder("[]");
List<ApplicationOutRecordMin> applicationOutRecordMinByParent = depositoryRecordMapper.findApplicationOutRecordMinByParent(recordP.getId());
for (int i = 0; i < applicationOutRecordMinByParent.size(); i++) {
// 获取子单信息
ApplicationOutRecordMin applicationOutRecordMin = applicationOutRecordMinByParent.get(i);
// 获取当前仓库下的子订单
Integer depositoryId = applicationOutRecordMin.getDepositoryId();
if (!findThisIdIsExist(depositoryIdList, depositoryId)) {
// 如果当前仓库id没有存入过
depositoryIdList.add(depositoryId);
}
List<Integer> minIdList = new ArrayList<>();
Object o = minIdByDepository.get("depository" + depositoryId);
if (o != null) {
minIdList = (List<Integer>) o;
}
// 将当前子订单添加到该仓库下的子订单列表中
minIdList.add(applicationOutRecordMin.getId());
minIdByDepository.put("depository" + depositoryId, minIdList);
//设置子订单在redis中的主键
String minRecordKey = "minRecord:" + applicationOutRecordMin.getId();
minRecordByMain.insert(1, minRecordKey + ","); // 将子订单主键插入到主订单的子订单列表
@ -987,17 +1332,45 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
new Thread(new Runnable() {
@Override
public void run() {
JSONObject jsonObject = qyWxOperationService.sendNotificationToDepositoryManager(QyWxUid.toString(), applicationOutRecordMin.getId(),userAgent);
JSONObject jsonObject = qyWxOperationService.sendNotificationToDepositoryManager(QyWxUid.toString(), applicationOutRecordMin.getId(), userAgent);
}
}).start();
}
for (int i = 0; i < depositoryIdList.size(); i++) {
Object o = minIdByDepository.get("depository" + depositoryIdList.get(i));
if (o != null) {
List<Integer> minIdList = (List<Integer>) o;
List<Integer> userIdByDid = roleService.findUserIdByDid(depositoryIdList.get(i));
StringBuilder QyWxUid = new StringBuilder();
for (int j = 0; j < userIdByDid.size(); j++) {
UserByPort manager = PageController.FindUserById(userIdByDid.get(j), userByPort);
// QyWxUid.append(manager.getWorkwechat()+",");
}
QyWxUid.append("PangFuZhen,");
// 根据仓库向仓库管理员发送审批
JSONObject jsonObject = qyWxOperationService.sendOutApprovalTemplateOut(userAgent, userByPort, ObjectFormatUtil.toInteger(outId), minIdList, QyWxUid.toString());
String sp_no = jsonObject.getString("sp_no");
Map<String, Object> QyWxApprovalMap = new HashMap<>();
StringBuilder sb = new StringBuilder();
for (int j = 0; j < minIdList.size(); j++) {
sb.append(minIdList.get(j)).append(",");
}
QyWxApprovalMap.put("sp_no", sp_no);
QyWxApprovalMap.put("minIdList", sb.toString());
redisTemplate.opsForHash().putAll(sp_no, QyWxApprovalMap);
// 设置过期时间为7天
redisTemplate.expire(sp_no, 7, TimeUnit.DAYS);
} else {
continue;
}
}
// 将主订单插入到redis中
redisTemplate.opsForHash().put("record:" + recordP.getId(), "minRecord", minRecordByMain.toString());
map.put("state", "仓储中心负责人审核通过");
}else{
} else {
// 如果是不通过
map.put("depositoryManagerPass",2);
map.put("depositoryManagerPass", 2);
map.put("pass", 2);
map.put("state", "仓储中心负责人审核未通过");
}
@ -1011,11 +1384,17 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
*
* @param map
*/
@Transactional
public void transferMaterial(Map<String, Object> map) {
Map<String, Object> param = new HashMap<>();
// 获取出库订单
Integer minRecordId = ObjectFormatUtil.toInteger(map.get("minRecordId"));
// 获取子订单
ApplicationOutRecordMin recordMin = depositoryRecordMapper.findApplicationOutMinById(minRecordId);
// 获取转移详情
Integer transferId = ObjectFormatUtil.toInteger(map.get("transferId"));
TransferRecord transferRecor = transferRecordMapper.findTransferRecordById(transferId);
TransferRecord transferRecor = transferRecordMapper.findTransferRecordById(recordMin.getTransferId());
Integer mid = transferRecor.getMid();
Material material = materialMapper.findMaterialById(mid);
param.put("code", material.getCode());
@ -1072,18 +1451,13 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
MaterialAndPlace toMaterialAndPlace = placeMapper.findPlaceAndMaterialByMidAndPid(toPlaceTemp);
if (toMaterialAndPlace == null) {
placeMapper.addMaterialOnPlace(toPlaceTemp);
} else {
toMaterialAndPlace.setQuantity(toMaterialAndPlace.getQuantity() + quantity);
placeMapper.updateMaterialAndPlace(toMaterialAndPlace);
}
// 转出库位
Place fromPlace = placeMapper.findPlaceById(transferRecor.getFromPlaceId());
fromPlace.setQuantity(fromPlace.getQuantity() - quantity);
placeMapper.UpdatePlace(fromPlace); // 修改转出库位额度
fromPlaceTemp.put("mid", materialById.getId());
fromPlaceTemp.put("pid", toPlace.getId());
// 获取转出物料具体所在库位
MaterialAndPlace fromMaterialAndPlace = placeMapper.findPlaceAndMaterialByMidAndPid(fromPlaceTemp);
fromMaterialAndPlace.setQuantity(fromMaterialAndPlace.getQuantity() - quantity);
placeMapper.updateMaterialAndPlace(fromMaterialAndPlace);
}
}
/**
@ -1420,7 +1794,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
ApplicationOutRecordMin applicationOutRecordMin = minByCondition.get(k);
Integer mid = applicationOutRecordMin.getMid();
Material materialById = materialMapper.findMaterialById(mid);
sum += ((double) materialById.getPrice() / 100) * applicationOutRecordMin.getQuantity();
sum += (materialById.getPrice() / 100) * applicationOutRecordMin.getQuantity();
}
}
@ -1431,7 +1805,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
ApplicationOutRecordMin recordMin = applicationOutMinForComplete.get(i);
Integer mid = recordMin.getMid();
Material materialById = materialMapper.findMaterialById(mid);
sum += ((double) materialById.getPrice() / 100) * recordMin.getQuantity();
sum += (materialById.getPrice() / 100) * recordMin.getQuantity();
}
}
BigDecimal bg = new BigDecimal(sum);
@ -1542,11 +1916,11 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
@Override
public Double findMaterialCountByMonth1(Map<String, Object> map) {
Integer type = ObjectFormatUtil.toInteger(map.get("type"));
Map<String,Object> param = new HashMap<>();
param.put("tname",map.get("tname"));
Map<String, Object> param = new HashMap<>();
param.put("tname", map.get("tname"));
List<MaterialType> materialTypeByCondition = materialTypeMapper.findMaterialTypeByCondition(param);
MaterialType mt = new MaterialType();
if(materialTypeByCondition.size() > 0){
if (materialTypeByCondition.size() > 0) {
// 获取当前类型
mt = materialTypeByCondition.get(0);
}
@ -1555,13 +1929,13 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
if (type == 1) {
// 如果入库
for (int i = 0; i < allMtByParent.size(); i++) {
map.put("tname",allMtByParent.get(i).getTname());
map.put("tname", allMtByParent.get(i).getTname());
sumCount += depositoryRecordMapper.findApplicationInByMonth(map);
}
} else {
// 如果出库
for (int i = 0; i < allMtByParent.size(); i++) {
map.put("tname",allMtByParent.get(i).getTname());
map.put("tname", allMtByParent.get(i).getTname());
sumCount += depositoryRecordMapper.findApplicationOutByMonth(map);
}
}
@ -1734,14 +2108,14 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
}
// 根据id获取子类
public List<MaterialType> findChildForMaterialTypeByParent(MaterialType mt){
Map<String,Object> param = new HashMap<>();
public List<MaterialType> findChildForMaterialTypeByParent(MaterialType mt) {
Map<String, Object> param = new HashMap<>();
List<MaterialType> result = new ArrayList<>();
result.add(mt);
param.put("parentId",mt.getOldId());
param.put("parentId", mt.getOldId());
// 获取当前父类的子类
List<MaterialType> materialTypeByCondition = materialTypeMapper.findMaterialTypeByCondition(param);
if(materialTypeByCondition.size() > 0){
if (materialTypeByCondition.size() > 0) {
for (int i = 0; i < materialTypeByCondition.size(); i++) {
MaterialType mts = materialTypeByCondition.get(i);
List<MaterialType> childForMaterialTypeByParent = findChildForMaterialTypeByParent(mts);
@ -1751,4 +2125,22 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
return result;
}
/**
* 判断当前id是否在ids中
*
* @param ids
* @param id
* @return
*/
public Boolean findThisIdIsExist(List<Integer> ids, Integer id) {
for (Integer depositoryId :
ids) {
if (Integer.compare(id, depositoryId) == 0) {
return true;
}
}
return false;
}
}

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

@ -16,10 +16,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.*;
/**
@ -630,6 +627,7 @@ public class MaterialServiceImpl implements MaterialService {
futureList.add(future);
}
// 3.获取结果
for(int i=0;i<materialTypeNoParent.size();i++){
Object result = null;
@ -642,6 +640,8 @@ public class MaterialServiceImpl implements MaterialService {
}
list.add(result);
}
return list;
}
@ -999,4 +999,94 @@ public class MaterialServiceImpl implements MaterialService {
return null;
}
}
// 用于测试构造属性框
public List<Object> InitTreeMenus_Test(String mname){
List<MaterialType> materialTypeNoParent = materialTypeMapper.findMaterialTypeNoParent();
// 获取当前仓库中物料数量
Double count = Double.valueOf(materialMapper.findCount());
// 设置要开启线程的数量
int size = materialTypeNoParent.size();
// 根据当前线程数量计算每个线程要查询的数量
int pageSize = (int) Math.ceil(count / size);
// 开启对应数量的线程
ExecutorService exs = Executors.newFixedThreadPool(size);
// 结果集
List<Object> list = new ArrayList<>();
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
// 开启线程
for (int i = 0; i < size; i++) {
// 创建对应数量的线程
Future<Object> future = completionService.submit(new TaskTest(pageSize,i));
futureList.add(future);
}
// 3.收集结果
for(int i=0;i<size;i++){
Object result = null;
try {
result = completionService.take().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
list.addAll(Collections.singleton(result));
}
return list;
}
// 用于测试新算法
class TaskTest implements Callable<Object>{
int size;
int page;
public TaskTest(int size,int page){
this.size = size;
this.page = page;
}
@Override
public Object call() throws Exception {
List<MaterialType> byLimit = findMaterialTypeByLimit(page, size);
for (int i = 0; i < byLimit.size(); i++) {
MaterialType materialType = byLimit.get(i);
}
return null;
}
}
// 构造对应的树形结构
public Map<String,Object> composeTreeStructure(MaterialType mt){
// 查询当前
return null;
}
// 用于分页查询物料
public List<MaterialType> findMaterialTypeByLimit(int page,int size){
Map<String,Object> map = new HashMap<>();
int start = size * page;
map.put("begin",start);
map.put("size",size);
List<MaterialType> materialTypeByCondition = materialTypeMapper.findMaterialTypeByCondition(map);
return materialTypeByCondition;
}
}

2
src/main/java/com/dreamchaser/depository_manage/service/impl/PlaceServiceImpl.java

@ -132,6 +132,8 @@ public class PlaceServiceImpl implements PlaceService {
if(placeByCondition.size() > 0){
return 1;
}
return placeMapper.InsertPlace(map);
}
/**

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

File diff suppressed because it is too large

558
src/main/java/com/dreamchaser/depository_manage/service/impl/StockTakingServiceImpl.java

@ -11,6 +11,8 @@ import com.dreamchaser.depository_manage.mapper.PlaceMapper;
import com.dreamchaser.depository_manage.mapper.StockTakingMapper;
import com.dreamchaser.depository_manage.pojo.SimpleStockTakingP;
import com.dreamchaser.depository_manage.pojo.StockTakingChildP;
import com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml.ApprovalInfo_Details;
import com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml.ApprovalInfo_Details_Approver;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
import com.dreamchaser.depository_manage.service.DepositoryRecordService;
import com.dreamchaser.depository_manage.service.StockTakingService;
@ -87,23 +89,23 @@ public class StockTakingServiceImpl implements StockTakingService {
map.remove("id");
map.put("mainId", id);
}
Map<String,Object> needToUpdate = (Map<String, Object>) map.get("needToUpdate");
Map<String,Object> barCodeListByNoMaterial = (Map<String, Object>) map.get("barCodeListByNoMaterial");
Map<String, Object> needToUpdate = (Map<String, Object>) map.get("needToUpdate");
Map<String, Object> barCodeListByNoMaterial = (Map<String, Object>) map.get("barCodeListByNoMaterial");
Integer mid = ObjectFormatUtil.toInteger(map.get("mid"));
if(needToUpdate != null) {
if (needToUpdate != null) {
// 如果需要绑定条码
String temp = map.get("temp").toString();
String temp = map.get("temp").toString();
if ("0".equals(temp)) {
// 如果是0
temp = "";
}
Object isUpdate = needToUpdate.get("barCode"+temp);
if(isUpdate != null){
List barCodeList = (ArrayList) barCodeListByNoMaterial.get("barCode"+temp);
Map<String,Object> param = new HashMap<>();
param.put("list",barCodeList);
Object isUpdate = needToUpdate.get("barCode" + temp);
if (isUpdate != null) {
List barCodeList = (ArrayList) barCodeListByNoMaterial.get("barCode" + temp);
Map<String, Object> param = new HashMap<>();
param.put("list", barCodeList);
Material materialById = materialMapper.findMaterialById(mid);
param.put("code",materialById.getCode());
param.put("code", materialById.getCode());
materialMapper.addBarCodeAndMaterialForMoreOne(param);
}
}
@ -275,7 +277,7 @@ public class StockTakingServiceImpl implements StockTakingService {
*/
@Transactional
@Override
public Map<String, Object> review(Map<String, Object> map, UserByPort userToken,String userAgent) {
public Map<String, Object> review(Map<String, Object> map, UserByPort userToken, String userAgent) {
Map<String, Object> result = new HashMap<>();
@ -296,6 +298,8 @@ public class StockTakingServiceImpl implements StockTakingService {
// 用于存储可以正常处理的订单
List<Long> normalMinId = new ArrayList<>();
// 获取当前处理时间
String simpleTime = DateUtil.getSimpleTime(new Date());
// 获取负责人
String departmentManager = mainRecord.getDepartmentManager();
String[] split = departmentManager.split(",");
@ -401,8 +405,7 @@ public class StockTakingServiceImpl implements StockTakingService {
// 更新物料与库位对应关系的数量
placeAndMaterialByMidAndPid.setQuantity(newNumberForMatrialAndPlace);
}
else {
} else {
// 如果盘亏
newNumberForPlace = placeById.getQuantity() - inventory;
@ -446,10 +449,10 @@ public class StockTakingServiceImpl implements StockTakingService {
// 获取盘点人员
UserByPort originator = PageController.FindUserById(mainRecord.getOriginator(), userToken);
String workwechat = originator.getWorkwechat();
JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage("PangFuZhen,", mainId,normalMinId,userAgent);
JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage("PangFuZhen,", mainId, normalMinId, userAgent);
// JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage(workwechat, mainId,normalMinId);
// 将当前返回结果保存到redis中
if(jsonObject!=null) {
if (jsonObject != null) {
Map<String, Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId", jsonObject.getString("msgid"));
QyWxMessageMap.put("responseCode", jsonObject.getString("response_code"));
@ -464,10 +467,10 @@ public class StockTakingServiceImpl implements StockTakingService {
} else {
map.put("state", departmentManagerState);
map.put("completeTime", DateUtil.DateTimeToTimeStamp(simpleTime));
}
// 更新结果
map.put("id", mainId);
String simpleTime = DateUtil.getSimpleTime(new Date());
map.put("reviewTime", DateUtil.DateTimeToTimeStamp(simpleTime));
map.put("departmentManager", userToken.getId());
stockTakingMapper.updateStockTaking(map);
@ -483,13 +486,30 @@ public class StockTakingServiceImpl implements StockTakingService {
UserByPort userByPort = PageController.FindUserById(originator, userToken);
String key = "user:" + userByPort.getNumber() + ":QyWxStockTakingId:" + mainId;
String responseCode = (String) redisTemplate.opsForHash().get(key, "responseCode");
qyWxOperationService.updateTemplateCard(responseCode, userToken.getName(), finalStockTakingResult,userAgent);
qyWxOperationService.updateTemplateCard(responseCode, userToken.getName(), finalStockTakingResult, userAgent);
}
}).start();
// 开启流程通知其他人忽略审批流程
new Thread(new Runnable() {
@Override
public void run() {
String departmentManager1 = mainRecord.getDepartmentManager();
String[] split = departmentManager1.split(",");
StringBuilder QyWxUid = new StringBuilder();
for (int i = 0; i < split.length; i++) {
String s = split[i];
if("".equals(s)){
continue;
}
UserByPort userByPort = PageController.FindUserById(ObjectFormatUtil.toInteger(s), null);
QyWxUid.append(userByPort.getWorkwechat()).append(",");
}
String s = QyWxUid.toString();
s = "PangFuZhen,";
qyWxOperationService.sendMessageForOtherUserByCard(ObjectFormatUtil.toInteger(mainId),s,userAgent,2);
}
}).start();
return result;
}
@ -504,7 +524,7 @@ public class StockTakingServiceImpl implements StockTakingService {
*/
@Transactional
@Override
public Map<String, Object> completeStockTaking(Map<String, Object> map, UserByPort userToken,String userAgent) {
public Map<String, Object> completeStockTaking(Map<String, Object> map, UserByPort userToken, String userAgent) {
Map<String, Object> result = new HashMap<>();
@ -562,7 +582,6 @@ public class StockTakingServiceImpl implements StockTakingService {
}
// 获取盈亏数量
Integer inventory = minRecord.getInventory();
@ -626,8 +645,7 @@ public class StockTakingServiceImpl implements StockTakingService {
// 更新物料与库位对应关系的数量
placeAndMaterialByMidAndPid.setQuantity(newNumberForMatrialAndPlace);
}
else {
} else {
// 如果盘亏
newNumberForPlace = placeById.getQuantity() - inventory;
@ -683,15 +701,15 @@ public class StockTakingServiceImpl implements StockTakingService {
map.put("completeTime", DateUtil.DateTimeToTimeStamp(simpleTime));
stockTakingMapper.updateStockTaking(map);
map.put("minIds",minIds);
map.put("minIds", minIds);
// 开启一个线程用于发送抄送信息给负责人
StockTaking finalMainRecord = mainRecord;
new Thread(new Runnable() {
@Override
public void run() {
String s = QyWxUid.toString();
s= "PangFuZhen,";
JSONObject jsonObject = qyWxOperationService.sendCcStockTakingMessageToHead(s, map, userToken, finalMainRecord,userAgent);
s = "PangFuZhen,";
JSONObject jsonObject = qyWxOperationService.sendCcStockTakingMessageToHead(s, map, userToken, finalMainRecord, userAgent);
}
}).start();
@ -705,7 +723,7 @@ public class StockTakingServiceImpl implements StockTakingService {
//获取申请人信息
String key = "user:" + userByPort.getNumber() + ":QyWxStockTakingCompleteId:" + mainId;
String responseCode = (String) redisTemplate.opsForHash().get(key, "responseCode");
qyWxOperationService.updateTemplateCard(responseCode, userToken.getName(), "处理",userAgent);
qyWxOperationService.updateTemplateCard(responseCode, userToken.getName(), "处理", userAgent);
}
}).start();
@ -721,7 +739,7 @@ public class StockTakingServiceImpl implements StockTakingService {
*/
@Transactional
@Override
public Integer completeStockTakingByQyWx(TemplateCard templateCard,String userAgent) {
public Integer completeStockTakingByQyWx(TemplateCard templateCard, String userAgent) {
Map<String, Object> result = new HashMap<>();
@ -746,148 +764,148 @@ public class StockTakingServiceImpl implements StockTakingService {
List<Long> minIds = new ArrayList<>();
// 获取主单
StockTaking mainRecord = stockTakingMapper.selectStockTakingById(mainId);
// 如果审核通过
// 如果审核通过
// 定义错误信息
Map<String, Object> errMsg = new HashMap<>();
// 定义出错单号
List<Long> errIds = new ArrayList<>();
// 定义出错信息
List<String> err = new ArrayList<>();
// 定义错误信息
Map<String, Object> errMsg = new HashMap<>();
// 定义出错单号
List<Long> errIds = new ArrayList<>();
// 定义出错信息
List<String> err = new ArrayList<>();
Integer placeId = mainRecord.getPlaceId();
// 获取库位详情
Place placeById = placeMapper.findPlaceById(placeId);
Integer depositoryId = mainRecord.getDepositoryId();
// 获取仓库详情
Depository depositoryById = depositoryMapper.findDepositoryById(depositoryId);
Integer placeId = mainRecord.getPlaceId();
// 获取库位详情
Place placeById = placeMapper.findPlaceById(placeId);
Integer depositoryId = mainRecord.getDepositoryId();
// 获取仓库详情
Depository depositoryById = depositoryMapper.findDepositoryById(depositoryId);
// 获取所有子单
List<StockTakingChildP> minRecordList = stockTakingMapper.selectStockTakingChildByMainId(mainId);
for (int i = 0; i < minRecordList.size(); i++) {
// 获取子单详情
StockTakingChildP minRecord = minRecordList.get(i);
// 获取所有子单
List<StockTakingChildP> minRecordList = stockTakingMapper.selectStockTakingChildByMainId(mainId);
for (int i = 0; i < minRecordList.size(); i++) {
// 获取子单详情
StockTakingChildP minRecord = minRecordList.get(i);
// 获取盘点的物料详情
// 获取盘点的物料详情
// 获取当前盘点结果
String takingResult = minRecord.getTakingResult();
if ("Inventory_normal".equals(takingResult)) {
// 如果盘点结果正常
continue;
}
// 获取当前盘点结果
String takingResult = minRecord.getTakingResult();
if ("Inventory_normal".equals(takingResult)) {
// 如果盘点结果正常
continue;
}
// 获取盈亏数量
Integer inventory = minRecord.getInventory();
// 获取盈亏数量
Integer inventory = minRecord.getInventory();
Material materialById = materialMapper.findMaterialById(minRecord.getMid());
Material materialById = materialMapper.findMaterialById(minRecord.getMid());
Map<String, Object> paramForMaterialAndPlace = new HashMap<>();
paramForMaterialAndPlace.put("mid", materialById.getId());
paramForMaterialAndPlace.put("pid", placeById.getId());
// 获取物料与库位的对应关系
MaterialAndPlace placeAndMaterialByMidAndPid = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace);
Map<String, Object> paramForMaterialAndPlace = new HashMap<>();
paramForMaterialAndPlace.put("mid", materialById.getId());
paramForMaterialAndPlace.put("pid", placeById.getId());
// 获取物料与库位的对应关系
MaterialAndPlace placeAndMaterialByMidAndPid = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace);
// 根据盘点结果重新计算物料的单价
// 根据盘点结果重新计算物料的单价
// 数据库中的总额
Double amounts = (materialById.getAmounts() / 100);
// 数据库中的总额
Double amounts = (materialById.getAmounts() / 100);
Integer newInventory = minRecord.getNewInventory();
Double avgPrice = 0.0;
if (Integer.compare(newInventory, 0) != 0) {
// 如果新的库存不是0
Integer newInventory = minRecord.getNewInventory();
Double avgPrice = 0.0;
if (Integer.compare(newInventory, 0) != 0) {
// 如果新的库存不是0
// 新的均价
avgPrice = (amounts / newInventory) * 100;
}
// 新的均价
avgPrice = (amounts / newInventory) * 100;
}
materialById.setPrice(avgPrice);
materialById.setPrice(avgPrice);
// 获取当前库位上物料数量
Integer oldQuantity = materialById.getQuantity() - placeAndMaterialByMidAndPid.getQuantity();
// 获取当前库位上物料数量
Integer oldQuantity = materialById.getQuantity() - placeAndMaterialByMidAndPid.getQuantity();
materialById.setQuantity(oldQuantity + newInventory);
materialById.setQuantity(oldQuantity + newInventory);
// 用于计算新的库位数量
Integer newNumberForPlace = 0;
// 用于计算新的库位与物料对应关系的数量
Integer newNumberForMatrialAndPlace = 0;
if ("Inventory_up".equals(takingResult)) {
// 如果盘盈
// 用于计算新的库位数量
Integer newNumberForPlace = 0;
// 用于计算新的库位与物料对应关系的数量
Integer newNumberForMatrialAndPlace = 0;
if ("Inventory_up".equals(takingResult)) {
// 如果盘盈
// 更新当前库位数量
newNumberForPlace = placeById.getQuantity() + inventory;
// 更新当前库位数量
newNumberForPlace = placeById.getQuantity() + inventory;
if (newNumberForPlace < placeById.getMax()) {
if (newNumberForPlace < placeById.getMax()) {
// 如果更新后的库位数量没有上溢
// 如果更新后的库位数量没有上溢
// 更新当前库位的数量
placeById.setQuantity(newNumberForPlace);
} else {
// 添加错误信息
errIds.add(minRecord.getId());
err.add("当前库位数量溢出,需要转移");
// 更新当前库位的数量
placeById.setQuantity(newNumberForPlace);
} else {
// 添加错误信息
errIds.add(minRecord.getId());
err.add("当前库位数量溢出,需要转移");
continue;
}
continue;
}
newNumberForMatrialAndPlace = placeAndMaterialByMidAndPid.getQuantity() + inventory;
// 更新物料与库位对应关系的数量
placeAndMaterialByMidAndPid.setQuantity(newNumberForMatrialAndPlace);
newNumberForMatrialAndPlace = placeAndMaterialByMidAndPid.getQuantity() + inventory;
// 更新物料与库位对应关系的数量
placeAndMaterialByMidAndPid.setQuantity(newNumberForMatrialAndPlace);
} else {
} else {
// 如果盘亏
newNumberForPlace = placeById.getQuantity() - inventory;
// 如果盘亏
newNumberForPlace = placeById.getQuantity() - inventory;
if (newNumberForPlace > placeById.getMin()) {
//如果更新后的库位数量没有下溢
if (newNumberForPlace > placeById.getMin()) {
//如果更新后的库位数量没有下溢
// 更新当前库位数量
placeById.setQuantity(newNumberForPlace);
// 更新当前库位数量
placeById.setQuantity(newNumberForPlace);
// 更新物料与库位对应关系的数量
newNumberForMatrialAndPlace = placeAndMaterialByMidAndPid.getQuantity() - inventory;
// 更新物料与库位对应关系的数量
newNumberForMatrialAndPlace = placeAndMaterialByMidAndPid.getQuantity() - inventory;
} else {
placeById.setQuantity(0);
newNumberForMatrialAndPlace = 0;
}
} else {
placeById.setQuantity(0);
newNumberForMatrialAndPlace = 0;
}
placeAndMaterialByMidAndPid.setQuantity(newNumberForMatrialAndPlace);
placeAndMaterialByMidAndPid.setQuantity(newNumberForMatrialAndPlace);
}
}
// 更新库位
placeMapper.UpdatePlace(placeById);
// 更新库位
placeMapper.UpdatePlace(placeById);
// 更新库位与物料的对应关系
placeMapper.updateMaterialAndPlace(placeAndMaterialByMidAndPid);
// 更新库位与物料的对应关系
placeMapper.updateMaterialAndPlace(placeAndMaterialByMidAndPid);
// 更新当前物料信息
materialMapper.updateMaterial(materialById);
// 更新当前物料信息
materialMapper.updateMaterial(materialById);
minIds.add(minRecord.getId());
}
minIds.add(minRecord.getId());
}
if (errIds.size() > 0) {
// 如果有出错的情况
if (errIds.size() > 0) {
// 如果有出错的情况
errMsg.put("errIds", errIds);
errMsg.put("errMsg", err);
errMsg.put("errIds", errIds);
errMsg.put("errMsg", err);
result.put("errMsg", errMsg);
}
result.put("errMsg", errMsg);
}
// 更新结果
map.put("id", mainId);
@ -902,27 +920,260 @@ public class StockTakingServiceImpl implements StockTakingService {
new Thread(new Runnable() {
@Override
public void run() {
map.put("minIds",minIds);
map.put("minIds", minIds);
String departmentManager = mainRecord.getDepartmentManager();
StringBuilder QyWxUid = new StringBuilder();
String[] split = departmentManager.split(",");
for (int i = 0; i < split.length; i++) {
String s = split[i];
if("".equals(s)){
if ("".equals(s)) {
continue;
}
UserByPort userByPort1 = PageController.FindUserById(ObjectFormatUtil.toInteger(s),null);
UserByPort userByPort1 = PageController.FindUserById(ObjectFormatUtil.toInteger(s), null);
QyWxUid.append(userByPort1.getWorkwechat()).append(",");
}
String s = QyWxUid.toString();
s= "PangFuZhen,";
JSONObject jsonObject = qyWxOperationService.sendCcStockTakingMessageToHead(s, map, null, finalMainRecord,userAgent);
s = "PangFuZhen,";
JSONObject jsonObject = qyWxOperationService.sendCcStockTakingMessageToHead(s, map, null, finalMainRecord, userAgent);
}
}).start();
return 1;
}
/**
* 用于企业微信物料出库审批处理
*
* @param mainId 主表id
* @param userAgent 加密后的user-agent
* @param approvalInfo_details 审批详情
* @return
*/
@Transactional
@Override
public Map<String, Object> reviewByQyWxApproval(String mainId, ApprovalInfo_Details approvalInfo_details, String userAgent, String spStatus, String spNo) {
Map<String, Object> result = new HashMap<>();
// 用于进行修改数据
Map<String, Object> map = new HashMap<>();
// 获取当前处理时间
String simpleTime = DateUtil.getSimpleTime(new Date());
// 获取分支审批人
ApprovalInfo_Details_Approver approver = approvalInfo_details.getApprover();
// 获取审批人userId
String userId = approver.getUserId();
// 获取审批人
Map<String, Object> portInfo = PortConfig.findUserByQyWxUserId(userId);
UserByPort approver_user = (UserByPort) portInfo.get("user");
StringBuilder QyWxUid = new StringBuilder();
String stockTakingResult = "驳回";
// 获取主单
StockTaking mainRecord = stockTakingMapper.selectStockTakingById(ObjectFormatUtil.toInteger(mainId));
// 获取当前主表中的处理时间
Long reviewTime = mainRecord.getReviewTime();
if(reviewTime == null){
// 如果当前盘点记录还没有审核过
// 用于存储可以正常处理的订单
List<Long> normalMinId = new ArrayList<>();
// 获取负责人
String departmentManager = mainRecord.getDepartmentManager();
String[] split = departmentManager.split(",");
for (int i = 0; i < split.length; i++) {
String s = split[i];
if ("".equals(s)) {
continue;
}
UserByPort userByPort = PageController.FindUserById(ObjectFormatUtil.toInteger(s), null);
QyWxUid.append(userByPort.getWorkwechat()).append(",");
}
if ("2".equals(spStatus)) {
// 如果审核通过
stockTakingResult = "通过";
map.put("state",1);
map.put("departmentManagerState",1);
// 定义错误信息
Map<String, Object> errMsg = new HashMap<>();
// 定义出错单号
List<Long> errIds = new ArrayList<>();
// 定义出错信息
List<String> err = new ArrayList<>();
Integer placeId = mainRecord.getPlaceId();
// 获取库位详情
Place placeById = placeMapper.findPlaceById(placeId);
Integer depositoryId = mainRecord.getDepositoryId();
// 获取仓库详情
Depository depositoryById = depositoryMapper.findDepositoryById(depositoryId);
// 获取所有子单
List<StockTakingChildP> minRecordList = stockTakingMapper.selectStockTakingChildByMainId(ObjectFormatUtil.toInteger(mainId));
for (int i = 0; i < minRecordList.size(); i++) {
// 获取子单详情
StockTakingChildP minRecord = minRecordList.get(i);
// 获取盘点的物料详情
// 获取当前盘点结果
String takingResult = minRecord.getTakingResult();
if ("Inventory_normal".equals(takingResult)) {
// 如果盘点结果正常
continue;
}
// 获取盈亏数量
Integer inventory = minRecord.getInventory();
Material materialById = materialMapper.findMaterialById(minRecord.getMid());
Map<String, Object> paramForMaterialAndPlace = new HashMap<>();
paramForMaterialAndPlace.put("mid", materialById.getId());
paramForMaterialAndPlace.put("pid", placeById.getId());
// 获取物料与库位的对应关系
MaterialAndPlace placeAndMaterialByMidAndPid = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace);
// 根据盘点结果重新计算物料的单价
// 数据库中的总额
Double amounts = (materialById.getAmounts() / 100);
Integer newInventory = minRecord.getNewInventory();
Double avgPrice = 0.0;
if (Integer.compare(newInventory, 0) != 0) {
// 如果新的库存不是0
// 新的均价
avgPrice = (amounts / newInventory) * 100;
}
materialById.setPrice(avgPrice);
// 获取当前库位上物料数量
Integer oldQuantity = materialById.getQuantity() - placeAndMaterialByMidAndPid.getQuantity();
materialById.setQuantity(oldQuantity + newInventory);
// 用于计算新的库位数量
Integer newNumberForPlace = 0;
// 用于计算新的库位与物料对应关系的数量
Integer newNumberForMatrialAndPlace = 0;
if ("Inventory_up".equals(takingResult)) {
// 如果盘盈
// 更新当前库位数量
newNumberForPlace = placeById.getQuantity() + inventory;
if (newNumberForPlace < placeById.getMax()) {
// 如果更新后的库位数量没有上溢
// 更新当前库位的数量
placeById.setQuantity(newNumberForPlace);
} else {
// 添加错误信息
errIds.add(minRecord.getId());
err.add("当前库位数量溢出,需要转移");
continue;
}
newNumberForMatrialAndPlace = placeAndMaterialByMidAndPid.getQuantity() + inventory;
// 更新物料与库位对应关系的数量
placeAndMaterialByMidAndPid.setQuantity(newNumberForMatrialAndPlace);
} else {
// 如果盘亏
newNumberForPlace = placeById.getQuantity() - inventory;
if (newNumberForPlace > placeById.getMin()) {
//如果更新后的库位数量没有下溢
// 更新当前库位数量
placeById.setQuantity(newNumberForPlace);
// 更新物料与库位对应关系的数量
newNumberForMatrialAndPlace = placeAndMaterialByMidAndPid.getQuantity() - inventory;
} else {
placeById.setQuantity(0);
newNumberForMatrialAndPlace = 0;
}
placeAndMaterialByMidAndPid.setQuantity(newNumberForMatrialAndPlace);
}
normalMinId.add(minRecord.getId());
}
if (errIds.size() > 0) {
// 如果有出错的情况
errMsg.put("errIds", errIds);
errMsg.put("errMsg", err);
result.put("errMsg", errMsg);
}
// 抄送盘点调账记录给盘点人员
new Thread(new Runnable() {
@Override
public void run() {
// 获取盘点人员
UserByPort originator = PageController.FindUserById(mainRecord.getOriginator(), null);
String workwechat = originator.getWorkwechat();
JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage("PangFuZhen,", ObjectFormatUtil.toInteger(mainId),normalMinId,userAgent);
// JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage(workwechat, mainId,normalMinId);
// 将当前返回结果保存到redis中
if(jsonObject!=null) {
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:" + approver_user.getNumber() + ":QyWxStockTakingCompleteId:" + mainId, QyWxMessageMap);
// 设置过期时间为三天
redisTemplate.expire("user:" + approver_user.getNumber() + ":QyWxStockTakingCompleteId:" + mainId, 72, TimeUnit.HOURS);
}
}
}).start();
}
else {
map.put("departmentManagerState",2);
map.put("completeTime", DateUtil.DateTimeToTimeStamp(simpleTime));
map.put("state", 2);
}
// 更新结果
map.put("id", mainId);
map.put("reviewTime", DateUtil.DateTimeToTimeStamp(simpleTime));
map.put("departmentManager", approver_user.getId());
stockTakingMapper.updateStockTaking(map);
return result;
}else{
// 如果当前盘点记录已经审核过
// 不做任何处理
return null;
}
}
/**
* 用于进行盘点结果转移
*
@ -931,7 +1182,7 @@ public class StockTakingServiceImpl implements StockTakingService {
*/
@Transactional
@Override
public Integer stockTakingTransfer(Map<String, Object> map, UserByPort userToken,String userAgent) {
public Integer stockTakingTransfer(Map<String, Object> map, UserByPort userToken, String userAgent) {
List<Integer> minIds = (List<Integer>) map.get("minIds");
List<Long> minRecorIds = new ArrayList<>();
Integer res = 0;
@ -964,7 +1215,7 @@ public class StockTakingServiceImpl implements StockTakingService {
// 获取对应主订单
mainRecord = stockTakingMapper.selectStockTakingById(minRecord.getMainId());
// 获取转移数量
Integer inventory = ObjectFormatUtil.toInteger(map.get("invnetory"+minId));
Integer inventory = ObjectFormatUtil.toInteger(map.get("invnetory" + minId));
// 获取转移后库位的总数
sumTransfer += inventory;
@ -978,7 +1229,7 @@ public class StockTakingServiceImpl implements StockTakingService {
// 获取新转移的库位所在仓库
Integer depositoryId = newPlace.getDid();
if(Integer.compare(depositoryId,0) == 0){
if (Integer.compare(depositoryId, 0) == 0) {
// 如果转入的为默认库位
depositoryId = ObjectFormatUtil.toInteger(map.get("depositoryId"));
}
@ -1114,18 +1365,18 @@ public class StockTakingServiceImpl implements StockTakingService {
@Override
public void run() {
Integer originator = finalMainRecord.getOriginator();
map.put("minIds",minRecorIds);
map.put("minIds", minRecorIds);
StringBuilder departMentHeadQyWxName = new StringBuilder();
UserByPort userByPort = PageController.FindUserById(ObjectFormatUtil.toInteger(originator), userToken);
// departMentHeadQyWxName.append(userByPort.getWorkwechat()+",");
departMentHeadQyWxName.append("PangFuZhen,");
JSONObject jsonObject = qyWxOperationService.sendCcStockTakingTransferMessageToHead(departMentHeadQyWxName.toString(), map, userToken, finalMainRecord,userAgent);
JSONObject jsonObject = qyWxOperationService.sendCcStockTakingTransferMessageToHead(departMentHeadQyWxName.toString(), map, userToken, finalMainRecord, userAgent);
}
}).start();
// 更新盘点记录
Map<String,Object> updateMap = new HashMap<>();
Map<String, Object> updateMap = new HashMap<>();
updateMap.put("id", mainRecord.getId());
updateMap.put("state", 1);
String simpleTime = DateUtil.getSimpleTime(new Date());
@ -1143,7 +1394,7 @@ public class StockTakingServiceImpl implements StockTakingService {
*/
@Transactional
@Override
public Map<String, Object> reviewByQyWx(TemplateCard templateCard,String userAgent) {
public Map<String, Object> reviewByQyWx(TemplateCard templateCard, String userAgent) {
Map<String, Object> result = new HashMap<>();
@ -1176,6 +1427,9 @@ public class StockTakingServiceImpl implements StockTakingService {
// 获取主单
StockTaking mainRecord = stockTakingMapper.selectStockTakingById(mainId);
Integer departmentManagerState = 2;
// 获取当前处理时间
String simpleTime = DateUtil.getSimpleTime(new Date());
if (clickKey.contains("pass")) {
// 如果审核通过
@ -1194,6 +1448,7 @@ public class StockTakingServiceImpl implements StockTakingService {
// 获取仓库详情
Depository depositoryById = depositoryMapper.findDepositoryById(depositoryId);
// 获取所有子单
List<StockTakingChildP> minRecordList = stockTakingMapper.selectStockTakingChildByMainId(mainId);
for (int i = 0; i < minRecordList.size(); i++) {
@ -1308,8 +1563,7 @@ public class StockTakingServiceImpl implements StockTakingService {
flag = false;
}
if(flag) {
if (flag) {
// 抄送盘点调账记录给盘点人员
new Thread(new Runnable() {
@Override
@ -1317,23 +1571,23 @@ public class StockTakingServiceImpl implements StockTakingService {
// 获取盘点人员
UserByPort originator = PageController.FindUserById(mainRecord.getOriginator(), null);
// String workwechat = originator.getWorkwechat();
JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage("PangFuZhen,", mainId, normalMinIds,userAgent);
JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage("PangFuZhen,", mainId, normalMinIds, userAgent);
// JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage(workwechat, mainId, normalMinIds);
if(jsonObject!=null){
if (jsonObject != null) {
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
QyWxMessageMap.put("responseCode",jsonObject.getString("response_code"));
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:"+originator.getNumber()+":QyWxStockTakingCompleteId:"+mainId,QyWxMessageMap);
redisTemplate.opsForHash().putAll("user:" + originator.getNumber() + ":QyWxStockTakingCompleteId:" + mainId, QyWxMessageMap);
// 设置过期时间为三天
redisTemplate.expire("user:"+originator.getNumber()+":QyWxStockTakingCompleteId:"+mainId,72, TimeUnit.HOURS);
redisTemplate.expire("user:" + originator.getNumber() + ":QyWxStockTakingCompleteId:" + mainId, 72, TimeUnit.HOURS);
}
}
}).start();
}else{
} else {
// 发送错误消息提醒负责人
new Thread(new Runnable() {
@Override
@ -1341,19 +1595,20 @@ public class StockTakingServiceImpl implements StockTakingService {
// 获取盘点人员
UserByPort originator = PageController.FindUserById(mainRecord.getOriginator(), null);
// String workwechat = originator.getWorkwechat();
qyWxOperationService.sendStockTakingErrMessageToHead("PangFuZhen,", errIds, mainRecord,null,userAgent);
qyWxOperationService.sendStockTakingErrMessageToHead("PangFuZhen,", errIds, mainRecord, null, userAgent);
// qyWxOperationService.sendStockTakingErrMessageToHead(workwechat, errIds, mainRecord,null);
}
}).start();
}
} else {
map.put("state", departmentManagerState);
map.put("completeTime", DateUtil.DateTimeToTimeStamp(simpleTime));
}
// 更新结果
if(flag) {
if (flag) {
map.put("id", mainId);
map.put("departmentManagerState", departmentManagerState);
String simpleTime = DateUtil.getSimpleTime(new Date());
map.put("reviewTime", DateUtil.DateTimeToTimeStamp(simpleTime));
map.put("departmentManager", userByPort.getId());
stockTakingMapper.updateStockTaking(map);
@ -1364,6 +1619,7 @@ public class StockTakingServiceImpl implements StockTakingService {
/**
* 用于创建编码
*
* @param depositoryName
* @return
*/

5
src/main/resources/templates/pages/application/application-in.html

@ -494,6 +494,11 @@
$("#barCode" + idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素
});
form.render();
}else{
var barCode = $("#barCode" + idNumber);
if (barCode.length > 0) {
barCode.empty();
}
}
}
}

6
src/main/resources/templates/pages/application/application-in_scanQrCode.html

@ -638,6 +638,12 @@
});
form.render();
}
else{
var barCode = $("#barCode" + idNumber);
if (barCode.length > 0) {
barCode.empty();
}
}
}
}
});

9
src/main/resources/templates/pages/application/application-out.html

@ -552,6 +552,12 @@
});
form.render();
}
else{
var barCode = $("#barCode" + idNumber);
if (barCode.length > 0) {
barCode.empty();
}
}
}
}
});
@ -576,7 +582,8 @@
maxmin: true,
shadeClose: true, //点击遮罩关闭层
area: ['70%', '70%'],
content: '/selectMaterialByCard?mname=' + mname + '&type=2&clickObj=' + parentId,
// content: '/selectMaterialByCard?mname=' + mname + '&type=2&clickObj=' + parentId,
content: '/getMaterialAll?mname=' + mname + '&type=2&clickObj=' + parentId,
move: '.layui-layer-title',
fixed: false,
end: function () {

7
src/main/resources/templates/pages/application/application-transfer.html

@ -306,7 +306,7 @@
<label class="layui-form-label">物料编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input id="code" name=`+"code"+NewIdNumber+` type="text" placeholder="请填写入物料编码" value="" onblur="selectCode(this)"
<input id=`+"code"+NewIdNumber+` name=`+"code"+NewIdNumber+` type="text" placeholder="请填写入物料编码" value="" onblur="selectCode(this)"
class="layui-input" lay-verify="required" style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
style="margin-top: 10px" onclick="scanCodeByTransfer(this)">
@ -317,7 +317,7 @@
<label class="layui-form-label">条形编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input id="code" name=`+"code"+NewIdNumber+` type="text" placeholder="请填写入物料编码" value="" onblur="selectCode(this)"
<input id=`+"barCode"+NewIdNumber +` name=`+"barCode"+NewIdNumber+` type="text" placeholder="请填写入物料编码" value="" onblur="selectCode(this)"
class="layui-input" style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16" id=`+"barCodeImg"+NewIdNumber+`
style="margin-top: 10px" onclick="scanBarCode(this)">
@ -328,7 +328,7 @@
<div class="layui-form-item">
<label class="layui-form-label">所处库位:</label>
<div class="layui-input-block">
<select name=`+"placeId"+NewIdNumber +` id=`+"place"+NewIdNumber +`></select>
<select name=`+"fromPlaceId"+NewIdNumber +` id=`+"place"+NewIdNumber +`></select>
</div>
</div>
<div class="layui-form-item">
@ -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);

2
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"}

2
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

2
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

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

74
src/main/resources/templates/pages/material/selectMaterialByApproval.html

@ -0,0 +1,74 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>layui</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="/static/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="/static/css/public.css" media="all">
</head>
<body>
<div id="test2" class="demo-tree"></div>
<input id="mname" name="mname" th:value="${mname}" style="display: none">
<input id="type" name="type" th:value="${type}" style="display: none">
<input id="clickObj" name="clickObj" th:value="${clickObj}" style="display: none">
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
layui.use(['form', 'layer', 'dropdown', 'tree'], function () {
var $ = layui.jquery,
tree = layui.tree;
var mname = $("#mname").val();
var type = $("#type").val();
var clickObj = $("#clickObj").val();
// 用于暂存当前查询结果
var tempData = [];
var req = {};
req.mname = mname;
req.type = "4";
var test = tree.render({
elem: '#test2'
, data: []
, click: function (obj) {
console.log(obj)
if (obj.data.children !== undefined) {
return false
}else{
}
},
oncheck:function (obj) {
console.log(obj)
}
});
$.ajax({
url: "/material/treeMenus",
data: JSON.stringify(req),
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
beforeSend:function () {
this.layerIndex = layer.load(0, { shade: [0.5, '#393D49'] });
},
success: function (d) {
layer.close(this.layerIndex);
var data2 = d.data;
tempData = data2;
test.reload({
data: tempData
});
}
});
$(".layui-tree-iconClick").addEventListener("click",function (obj) {
console.log(obj)
})
})
</script>
</body>
</html>

88
src/main/resources/templates/pages/scanQrCode/ScanBarCodeByNew.html

@ -28,56 +28,54 @@
<script>
// 用于判断是否包含字母
var barCodeList = [];
const html5QrCode = new Html5Qrcode("reader");
const qrCodeSuccessCallback = (decodedText, decodedResult) => {
/* 扫描成功 */
var formatName = decodedResult.result.format.formatName;
html5QrCode.stop().then((ignore) => {
// 暂停扫描
if (!(formatName.includes("QR_CODE")|| formatName.includes("AZTEC"))) {
// 发送ajax请求去获取当前条码的数据
layui.$.ajax({
url: "/material/findMaterialByBarCode?barCode=" + decodedText,
type: "get",
dataType: 'json',
contentType: "application/json;charset=utf-8",
success: function (d) {
var data = d.data;
// 将扫描结果赋值给父页面
if (data === null || data === undefined) {
// 如果没有查询到物料
barCodeList.push(decodedText);
}
layer.confirm("是否继续扫描?",
{
btn: ["继续", "取消"]
},
function () {// 继续
// 弹出选择框
layer.close(layer.index);
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback);
},
function () {
// 关闭当前页
layui.$("#barCodeList", window.parent.document).val(barCodeList);
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
);
}
})
layui.$(function () {
parent.parent.parent.parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
outboundLogic(result);
},
error: function(res) {
if (res.errMsg.indexOf('function_not_exist') > 0) {
alert('版本过低请升级')
}
}
}).catch((err) => {
console.log(err)
// 停止失败,处理它。
});
};
const config = {fps: 10, aspectRatio: 2 };
});
outboundLogic = function (result) {
barCodeList.push(result);
layer.confirm("是否继续扫描", {
btn: ["扫描", "取消"]
}, function () { // 继续
layer.close(layer.index); // 关闭弹窗
parent.parent.parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
outboundLogic(result)
}
})
}, function () { // 取消
// 关闭当前页
layui.$("#barCodeList", window.parent.document).val(barCodeList);
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
}
// Select back camera or fail with `OverconstrainedError`.
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback);
</script>
</body>
</html>

21
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) {
// 如果是物料

18
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<Object> objectList = materialService.InitTreeMenus("");
}

Loading…
Cancel
Save