Browse Source

完成库存盘点功能

lwx_dev
erdanergou 3 years ago
parent
commit
03529342c5
  1. 76
      src/main/java/com/dreamchaser/depository_manage/config/QyWxConfig.java
  2. 3
      src/main/java/com/dreamchaser/depository_manage/config/WebMvcConfig.java
  3. 29
      src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java
  4. 35
      src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java
  5. 404
      src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java
  6. 77
      src/main/java/com/dreamchaser/depository_manage/controller/PageController.java
  7. 69
      src/main/java/com/dreamchaser/depository_manage/controller/PlaceController.java
  8. 120
      src/main/java/com/dreamchaser/depository_manage/controller/QyWxOperationController.java
  9. 21
      src/main/java/com/dreamchaser/depository_manage/controller/StockTakingController.java
  10. 8
      src/main/java/com/dreamchaser/depository_manage/converter/ExcelMaterialCodeConverter.java
  11. 2
      src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoByInventory.java
  12. 30
      src/main/java/com/dreamchaser/depository_manage/entity/PidOrDidAndCode.java
  13. 2
      src/main/java/com/dreamchaser/depository_manage/intercepter/UserInterceptor.java
  14. 2
      src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java
  15. 2
      src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml
  16. 2
      src/main/java/com/dreamchaser/depository_manage/mapper/MaterialTypeMapper.xml
  17. 143
      src/main/java/com/dreamchaser/depository_manage/mapper/QrCodeMapper.xml
  18. 5
      src/main/java/com/dreamchaser/depository_manage/pojo/PlaceP.java
  19. 10
      src/main/java/com/dreamchaser/depository_manage/pojo/RestResponse.java
  20. 6
      src/main/java/com/dreamchaser/depository_manage/service/DepositoryRecordService.java
  21. 15
      src/main/java/com/dreamchaser/depository_manage/service/DepositoryService.java
  22. 20
      src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java
  23. 22
      src/main/java/com/dreamchaser/depository_manage/service/PlaceService.java
  24. 10
      src/main/java/com/dreamchaser/depository_manage/service/StockTakingService.java
  25. 20
      src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java
  26. 30
      src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryServiceImpl.java
  27. 31
      src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java
  28. 45
      src/main/java/com/dreamchaser/depository_manage/service/impl/PlaceServiceImpl.java
  29. 42
      src/main/java/com/dreamchaser/depository_manage/service/impl/QyWxOperationService.java
  30. 26
      src/main/java/com/dreamchaser/depository_manage/service/impl/StockTakingServiceImpl.java
  31. 111
      src/main/resources/templates/index.html
  32. 14
      src/main/resources/templates/index_back.html
  33. 128
      src/main/resources/templates/pages/QyWxScanCode/QyWxScanBarCodeIn.html
  34. 502
      src/main/resources/templates/pages/application/application-in.html
  35. 266
      src/main/resources/templates/pages/application/application-in_scanQrCode.html
  36. 74
      src/main/resources/templates/pages/application/application-out.html
  37. 419
      src/main/resources/templates/pages/application/application-transfer.html
  38. 24
      src/main/resources/templates/pages/material/material-add.html
  39. 32
      src/main/resources/templates/pages/material/material-view.html
  40. 29
      src/main/resources/templates/pages/place/place_edit.html
  41. 2
      src/main/resources/templates/pages/scanQrCode/ScanBarCode.html
  42. 2
      src/main/resources/templates/pages/scanQrCode/ScanBarCodeByNew.html
  43. 2
      src/main/resources/templates/pages/scanQrCode/ScanBarCodeForTaking.html
  44. 126
      src/main/resources/templates/pages/scanQrCode/ScanBarCodeIn.html
  45. 2
      src/main/resources/templates/pages/scanQrCode/ScanBarCodeOut.html
  46. 504
      src/main/resources/templates/pages/scanQrCode/ScanBarOrQrCodeOut.html
  47. 2
      src/main/resources/templates/pages/scanQrCode/ScanCodeByTaking.html
  48. 507
      src/main/resources/templates/pages/scanQrCode/ScanQrCode.html
  49. 291
      src/main/resources/templates/pages/stockTaking/stockTaking.html
  50. 31
      src/main/resources/templates/pages/warehouse/warehouse_view.html
  51. 6
      src/test/java/com/dreamchaser/depository_manage/Test.java

76
src/main/java/com/dreamchaser/depository_manage/config/QyWxConfig.java

@ -4,9 +4,13 @@ package com.dreamchaser.depository_manage.config;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.config.QyWx_template_card.*; import com.dreamchaser.depository_manage.config.QyWx_template_card.*;
import com.dreamchaser.depository_manage.entity.UserByPort;
import com.dreamchaser.depository_manage.utils.HttpUtils; import com.dreamchaser.depository_manage.utils.HttpUtils;
import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; import com.dreamchaser.depository_manage.utils.ObjectFormatUtil;
import lombok.Data; import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; import java.net.URLEncoder;
@ -14,46 +18,68 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit;
// 用于实现企业微信相关功能 // 用于实现企业微信相关功能
@Data @Data
@Component
public class QyWxConfig { public class QyWxConfig {
public static String corpid = "ww02f310301953277a"; // 企业的CorpID public static String corpid = "ww02f310301953277a"; // 企业的CorpID
public static String secret = "GYwyoAGwMwumAVFrFn-RZIc2q11P3pm8NWY9pWDjLqw"; // 应用的凭证密钥 public static String secret = "GYwyoAGwMwumAVFrFn-RZIc2q11P3pm8NWY9pWDjLqw"; // 应用的凭证密钥
public static int AgentId = 1000037; //应用agentid public static int AgentId = 1000037; //应用agentid
public static String callBackUrl = "https://jy.hxgk.group/QyWxLogin"; public static String callBackUrl = "https://jy.hxgk.group/QyWxLogin";
public static String token = ""; //access_token
public static String code = ""; //userCode public static String code = ""; //userCode
public static String sendMessage_url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN"; public static String sendMessage_url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN";
public static RedisTemplate<String,String> redisTemplate;
// 用于回调配置的token // 用于回调配置的token
public static String sToken = "sM4MFE44fAKdtqvq81HYygqmrdUn"; public static String sToken = "sM4MFE44fAKdtqvq81HYygqmrdUn";
// 用于回调配置的EncodingAESKey // 用于回调配置的EncodingAESKey
public static String sEncodingAESKey = "10cruMoq3ixrQQngJcMN6CzOYrHWmHMpxp2Xn5iYrsk"; public static String sEncodingAESKey = "10cruMoq3ixrQQngJcMN6CzOYrHWmHMpxp2Xn5iYrsk";
// 用于jsapi的url
public static String jsApiUrl = "https://jy.hxgk.group/";
@Autowired
public void setRedisTemplate(RedisTemplate<String,String> redisTemplate){
QyWxConfig.redisTemplate = redisTemplate;
}
// 用于获取企业微信对应token // 用于获取企业微信对应token
public static String GetQYWXToken(){ public static String GetQYWXToken(String UserAgent){
String url = String.format(" https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s",QyWxConfig.corpid,QyWxConfig.secret); String token_redis = redisTemplate.opsForValue().get("wms_access_token_"+UserAgent);
String get = HttpUtils.doGet(url); if(token_redis != null){
JSONObject jsonObject = JSONObject.parseObject(get); return token_redis;
Integer errcord = ObjectFormatUtil.toInteger(jsonObject.get("errcode")); }
String accessToken = (String) jsonObject.get("access_token"); else {
String errmsg = (String) jsonObject.get("errmsg"); String url = String.format(" https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s", QyWxConfig.corpid, QyWxConfig.secret);
if(errcord == 0){ String get = HttpUtils.doGet(url);
// 如果成功获取access_token JSONObject jsonObject = JSONObject.parseObject(get);
return accessToken; Integer errcord = ObjectFormatUtil.toInteger(jsonObject.get("errcode"));
}else{ String accessToken = (String) jsonObject.get("access_token");
// 否则返回空值 String errmsg = (String) jsonObject.get("errmsg");
return "visitToFail:"+errmsg; if (errcord == 0) {
// 如果成功获取access_token
Integer expires_in = jsonObject.getInteger("expires_in");
redisTemplate.opsForValue().set("wms_access_token_"+UserAgent,accessToken);
redisTemplate.expire("wms_access_token_"+UserAgent,expires_in, TimeUnit.SECONDS);
return accessToken;
} else {
// 否则返回空值
return "visitToFail:" + errmsg;
}
} }
} }
// 根据获取到的用户code以及token获取用户id // 根据获取到的用户code以及token获取用户id
public static JSONObject GetQYWXUserId(){ public static JSONObject GetQYWXUserId(String UserAgent){
String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=%s&code=%s",QyWxConfig.token,QyWxConfig.code); String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=%s&code=%s",QyWxConfig.GetQYWXToken(UserAgent),QyWxConfig.code);
String get = HttpUtils.doGet(url); String get = HttpUtils.doGet(url);
JSONObject jsonObject = JSONObject.parseObject(get); JSONObject jsonObject = JSONObject.parseObject(get);
return jsonObject; return jsonObject;
@ -72,6 +98,24 @@ public class QyWxConfig {
return url; return url;
} }
// 获取企业的jsapi_ticket
public static JSONObject getQyWxJsApiTicketForEnterprise(String UserAgent){
// 如果token不为"",则使用token,否则获取新token
String tempToken = GetQYWXToken(UserAgent);
String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=%s",tempToken);
String get = HttpUtils.doGet(url);
JSONObject jsonObject = JSONObject.parseObject(get);
return jsonObject;
}
// 获取应用的jsapi_ticket
public static JSONObject getQyWxJsApiTicketForApp(String UserAgent){
// 如果token不为"",则使用token,否则获取新token
String tempToken = GetQYWXToken(UserAgent);
String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/ticket/get?access_token=%s&type=agent_config",tempToken);
String get = HttpUtils.doGet(url);
JSONObject jsonObject = JSONObject.parseObject(get);
return jsonObject;
}
} }

3
src/main/java/com/dreamchaser/depository_manage/config/WebMvcConfig.java

@ -16,7 +16,8 @@ public class WebMvcConfig implements WebMvcConfigurer {
registry.addInterceptor(new UserInterceptor()) registry.addInterceptor(new UserInterceptor())
.addPathPatterns("/**") .addPathPatterns("/**")
.excludePathPatterns("/login", "/register", "/sendCode", "/error","/QyWxLogin","/callback") .excludePathPatterns("/login", "/register", "/sendCode", "/error","/QyWxLogin","/callback")
.excludePathPatterns("/static/**"); .excludePathPatterns("/static/**")
.excludePathPatterns("/static/js/**");
} }

29
src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java

@ -1,5 +1,6 @@
package com.dreamchaser.depository_manage.controller; package com.dreamchaser.depository_manage.controller;
import cn.hutool.core.lang.Snowflake;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.config.PortConfig; import com.dreamchaser.depository_manage.config.PortConfig;
@ -1325,4 +1326,32 @@ public class DepositoryController {
Depository depositoryRecordById = depositoryService.findDepositoryRecordById(depositoryId); Depository depositoryRecordById = depositoryService.findDepositoryRecordById(depositoryId);
return new RestResponse(depositoryRecordById); return new RestResponse(depositoryRecordById);
} }
// 构造仓库二维码
@PostMapping("/createQrCode")
public RestResponse createQrCode(@RequestBody Map<String,Object> map) {
// 通过雪花算法计算随机数
Snowflake snowflake = new Snowflake(10,10,true);
String qrCode = snowflake.nextIdStr();
Integer depositoryId = ObjectFormatUtil.toInteger(map.get("depositoryId"));
Depository depository = depositoryService.findDepositoryRecordById(depositoryId);
String qrCodeByDepository = depositoryService.findQrCodeByDepository(depository.getId());
if(qrCodeByDepository == null) {
Map<String, Object> param = new HashMap<>();
param.put("depositoryId", depository.getId());
param.put("qrCode", qrCode);
depositoryService.addQrCodeByDepository(param);
}else{
qrCode = qrCodeByDepository;
}
try {
// 二维码保存信息
return RestResponse.CreateQrCode(qrCode);
} catch (IOException e) {
return new RestResponse("err: " + e.getMessage(), 678, new StatusInfo("失败", "请联系开发人员"));
}
}
} }

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

@ -8,10 +8,7 @@ import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.pojo.*; import com.dreamchaser.depository_manage.pojo.*;
import com.dreamchaser.depository_manage.service.*; import com.dreamchaser.depository_manage.service.*;
import com.dreamchaser.depository_manage.service.impl.QyWxOperationService; import com.dreamchaser.depository_manage.service.impl.QyWxOperationService;
import com.dreamchaser.depository_manage.utils.CrudUtil; import com.dreamchaser.depository_manage.utils.*;
import com.dreamchaser.depository_manage.utils.DateUtil;
import com.dreamchaser.depository_manage.utils.HttpUtils;
import com.dreamchaser.depository_manage.utils.ObjectFormatUtil;
import org.apache.http.protocol.HTTP; import org.apache.http.protocol.HTTP;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
@ -287,6 +284,8 @@ public class DepositoryRecordController {
@PostMapping("/applicationOut") @PostMapping("/applicationOut")
public RestResponse insertApplicationOutRecord(@RequestBody Map<String,Object> map, HttpServletRequest request){ public RestResponse insertApplicationOutRecord(@RequestBody Map<String,Object> map, HttpServletRequest request){
UserByPort userToken= (UserByPort) request.getAttribute("userToken"); UserByPort userToken= (UserByPort) request.getAttribute("userToken");
String header = request.getHeader("user-agent");
String crypt = Md5.crypt(header);
map.put("applicantId",userToken.getId()); map.put("applicantId",userToken.getId());
// 获取当前部门负责人 // 获取当前部门负责人
List<UserByPort> departmentHeadByUsers = findDepartmentHeadByUser(userToken); List<UserByPort> departmentHeadByUsers = findDepartmentHeadByUser(userToken);
@ -312,7 +311,7 @@ public class DepositoryRecordController {
integer += depositoryRecordService.insertApplicationOutMin(map); integer += depositoryRecordService.insertApplicationOutMin(map);
} }
// 向企业微信中对应用户发送消息 // 向企业微信中对应用户发送消息
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt);
// 将当前返回结果保存到redis中 // 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>(); Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -361,7 +360,7 @@ public class DepositoryRecordController {
map.remove("id"); map.remove("id");
// 插入子订单 // 插入子订单
integer += depositoryRecordService.insertApplicationOutMin(map); integer += depositoryRecordService.insertApplicationOutMin(map);
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt);
// 将当前返回结果保存到redis中 // 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>(); Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -589,7 +588,9 @@ public class DepositoryRecordController {
@PutMapping("/review") @PutMapping("/review")
public RestResponse review(@RequestBody Map<String,Object> map, HttpServletRequest request){ public RestResponse review(@RequestBody Map<String,Object> map, HttpServletRequest request){
UserByPort userToken= (UserByPort) request.getAttribute("userToken"); UserByPort userToken= (UserByPort) request.getAttribute("userToken");
Integer review = depositoryRecordService.review(map, userToken.getId(),userToken); String header = request.getHeader("user-agent");
String crypt = Md5.crypt(header);
Integer review = depositoryRecordService.review(map, userToken.getId(),userToken,crypt);
if(review != -1) { if(review != -1) {
return CrudUtil.postHandle(review, 1); return CrudUtil.postHandle(review, 1);
}else{ }else{
@ -602,6 +603,8 @@ public class DepositoryRecordController {
public RestResponse transfer(@RequestBody Map<String,Object> map, HttpServletRequest request){ public RestResponse transfer(@RequestBody Map<String,Object> map, HttpServletRequest request){
UserByPort userToken= (UserByPort) request.getAttribute("userToken"); UserByPort userToken= (UserByPort) request.getAttribute("userToken");
List<UserByPort> departmentHeadByUsers = findDepartmentHeadByUser(userToken); List<UserByPort> departmentHeadByUsers = findDepartmentHeadByUser(userToken);
String header = request.getHeader("user-agent");
String crypt = Md5.crypt(header);
StringBuilder departmentHeadId = new StringBuilder(); StringBuilder departmentHeadId = new StringBuilder();
StringBuilder departMentHeadQyWxName = new StringBuilder(); StringBuilder departMentHeadQyWxName = new StringBuilder();
/*for (int i = 0; i < departmentHeadByUsers.size(); i++) { /*for (int i = 0; i < departmentHeadByUsers.size(); i++) {
@ -620,7 +623,7 @@ public class DepositoryRecordController {
if(params.size() < 1 && map.size() > 4){ if(params.size() < 1 && map.size() > 4){
integer += depositoryRecordService.transferApply(map,userToken); integer += depositoryRecordService.transferApply(map,userToken);
Object id = map.get("parentId"); Object id = map.get("parentId");
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt);
// 将当前返回结果保存到redis中 // 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>(); Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -642,7 +645,7 @@ public class DepositoryRecordController {
insert.put("code",map.get("code"+temp)); insert.put("code",map.get("code"+temp));
integer += depositoryRecordService.transferApply(insert,userToken); integer += depositoryRecordService.transferApply(insert,userToken);
Object id = insert.get("parentId"); Object id = insert.get("parentId");
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt);
// 将当前返回结果保存到redis中 // 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>(); Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -654,7 +657,7 @@ public class DepositoryRecordController {
} }
integer += depositoryRecordService.transferApply(map,userToken); integer += depositoryRecordService.transferApply(map,userToken);
Object id = map.get("parentId"); Object id = map.get("parentId");
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt);
// 将当前返回结果保存到redis中 // 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>(); Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -756,6 +759,8 @@ public class DepositoryRecordController {
@PostMapping("/createMultiApplication") @PostMapping("/createMultiApplication")
public RestResponse createMultiApplication(@RequestBody Map<String,Object> map,HttpServletRequest request){ public RestResponse createMultiApplication(@RequestBody Map<String,Object> map,HttpServletRequest request){
UserByPort userToken= (UserByPort) request.getAttribute("userToken"); UserByPort userToken= (UserByPort) request.getAttribute("userToken");
String header = request.getHeader("user-agent");
String crypt = Md5.crypt(header);
Integer quantity = ObjectFormatUtil.toInteger(map.get("quantity")); Integer quantity = ObjectFormatUtil.toInteger(map.get("quantity"));
map.put("quantity",quantity.toString()); map.put("quantity",quantity.toString());
map.put("price",map.get("price").toString()); map.put("price",map.get("price").toString());
@ -798,7 +803,7 @@ public class DepositoryRecordController {
} }
success += depositoryRecordService.insertApplicationOutMin(map); success += depositoryRecordService.insertApplicationOutMin(map);
// 向企业微信中对应用户发送消息 // 向企业微信中对应用户发送消息
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt);
// 将当前返回结果保存到redis中 // 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>(); Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -825,6 +830,8 @@ public class DepositoryRecordController {
@PostMapping("/createMultiApplications") @PostMapping("/createMultiApplications")
public RestResponse createMultiApplications(@RequestBody Map<String,Object> map,HttpServletRequest request){ public RestResponse createMultiApplications(@RequestBody Map<String,Object> map,HttpServletRequest request){
UserByPort userToken= (UserByPort) request.getAttribute("userToken"); UserByPort userToken= (UserByPort) request.getAttribute("userToken");
String header = request.getHeader("user-agent");
String crypt = Md5.crypt(header);
// 获取要处理的类型 // 获取要处理的类型
String type = (String) map.get("type"); String type = (String) map.get("type");
Integer success = 0; Integer success = 0;
@ -964,7 +971,7 @@ public class DepositoryRecordController {
} }
} }
// 向企业微信中对应用户发送消息 // 向企业微信中对应用户发送消息
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true,crypt);
// 将当前返回结果保存到redis中 // 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>(); Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -989,12 +996,14 @@ public class DepositoryRecordController {
@PostMapping("/isCheckOut") @PostMapping("/isCheckOut")
public RestResponse isCheckOut(@RequestBody Map<String,Object> map,HttpServletRequest request){ public RestResponse isCheckOut(@RequestBody Map<String,Object> map,HttpServletRequest request){
UserByPort userToken = (UserByPort) request.getAttribute("userToken"); UserByPort userToken = (UserByPort) request.getAttribute("userToken");
String header = request.getHeader("user-agent");
String crypt = Md5.crypt(header);
Integer placeId =ObjectFormatUtil.toInteger(map.get("placeId")); Integer placeId =ObjectFormatUtil.toInteger(map.get("placeId"));
if(placeId == null){ if(placeId == null){
// 如果是仓库,则使用默认库位 // 如果是仓库,则使用默认库位
map.put("placeId",0); map.put("placeId",0);
} }
RestResponse restResponse = depositoryRecordService.completeApplicationOutMinRecord(map, userToken); RestResponse restResponse = depositoryRecordService.completeApplicationOutMinRecord(map, userToken,crypt);
return restResponse; return restResponse;
} }

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

@ -1,5 +1,6 @@
package com.dreamchaser.depository_manage.controller; package com.dreamchaser.depository_manage.controller;
import cn.hutool.core.lang.Snowflake;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.config.JM_3DES; import com.dreamchaser.depository_manage.config.JM_3DES;
@ -349,20 +350,32 @@ public class MaterialController {
// 构造物料二维码 // 构造物料二维码
@GetMapping("/createQrCode") @PostMapping("/createQrCode")
public RestResponse createQrCode(@RequestParam("mid") Integer mid) { public RestResponse createQrCode(@RequestBody Map<String, Object> map) {
Material materialById = materialService.findMaterialById(mid); // 通过雪花算法计算随机数
// 二维码保存信息 Snowflake snowflake = new Snowflake(10, 10, true);
Map<String, Object> code = new HashMap<>(); String qrCode = snowflake.nextIdStr();
code.put("mname", materialById.getMname());
code.put("mcode", materialById.getCode()); Integer mid = ObjectFormatUtil.toInteger(map.get("mid"));
code.put("verison", materialById.getVersion()); Material material = materialService.findMaterialById(mid);
code.put("quantity", materialById.getQuantity());
String qrCodeByMcode = materialService.findQrCodeByMcode(material.getCode());
if (qrCodeByMcode == null) {
Map<String, Object> param = new HashMap<>();
param.put("mcode", material.getCode());
param.put("qrCode", qrCode);
materialService.addQrCodeByMaterial(param);
} else {
qrCode = qrCodeByMcode;
}
try { try {
return RestResponse.CreateQrCode(code); // 二维码保存信息
return RestResponse.CreateQrCode(qrCode);
} catch (IOException e) { } catch (IOException e) {
return new RestResponse("err: " + e.getMessage(), 678, new StatusInfo("失败", "请联系开发人员")); return new RestResponse("err: " + e.getMessage(), 678, new StatusInfo("失败", "请联系开发人员"));
} }
} }
// 将扫描结果数据暂存到redis中 // 将扫描结果数据暂存到redis中
@ -524,6 +537,88 @@ public class MaterialController {
return new RestResponse(jsonObject); return new RestResponse(jsonObject);
} }
// 获取扫描结果并跳转到入库
@PostMapping("/qywxApplicationInScanQrCode")
public RestResponse qywxApplicationInScanQrCode(@RequestBody Map<String, Object> map, HttpServletRequest request) {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
// 获取当前用户所在部门拥有的仓库
List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userByPort.getMaindeparment().toString());
// 获取当前扫描的二维码
String qrCode = (String) map.get("qrCode");
// 根据扫描的二维码获取对应的物料编码
String mcode = materialService.findMaterialCodeByQrCode(qrCode);
// 根据物料编码获取物料
Material material = materialService.findMaterialByCode(mcode);
Map<String, Object> param = new HashMap<>();
List<PlaceP> placePList = new ArrayList<>();
param.put("mcode", mcode);
MaterialP mp = new MaterialP(material);
// 获取物料与条形码的对应关系
List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(param);
for (int j = 0; j < depositoryByAdminorg.size(); j++) {
Depository depository = depositoryByAdminorg.get(j);
param.put("code", material.getCode());
param.put("depositoryId", depository.getId());
// 获取当前仓库下是否有当前物料的库存
List<MaterialP> inventory = materialService.findInventory(param);
if (inventory.size() > 0) {
mp = inventory.get(0);
List<PlaceP> place = placeService.findPlaceByMidAndDid(mp.getId(), depository.getId());
placePList.addAll(place);
}
}
// 设置当前物料在相关仓库下的所有库位
mp.setPlacePList(placePList);
// 设置物料与条形码的对应关系
mp.setMaterialAndBarCodeList(materialByBarCodeByCondition);
return new RestResponse(mp);
}
// 获取扫描结果并跳转到库存转移
@PostMapping("/qywxApplicationTransferScanQrCode")
public RestResponse qywxApplicationTransferScanQrCode(@RequestBody Map<String, Object> map, HttpServletRequest request) {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
// 获取当前用户所在部门拥有的仓库
List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userByPort.getMaindeparment().toString());
// 获取当前扫描的二维码
String qrCode = (String) map.get("qrCode");
// 根据扫描的二维码获取对应的物料编码
String mcode = materialService.findMaterialCodeByQrCode(qrCode);
// 根据物料编码获取物料
Material material = materialService.findMaterialByCode(mcode);
Map<String, Object> param = new HashMap<>();
List<PlaceP> placePList = new ArrayList<>();
param.put("mcode", mcode);
MaterialP mp = null;
// 获取物料与条形码的对应关系
List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(param);
Boolean flag = false;
for (int j = 0; j < depositoryByAdminorg.size(); j++) {
Depository depository = depositoryByAdminorg.get(j);
param.put("code", material.getCode());
param.put("depositoryId", depository.getId());
// 获取当前仓库下是否有当前物料的库存
List<MaterialP> inventory = materialService.findInventory(param);
if (inventory.size() > 0) {
mp = inventory.get(0);
List<PlaceP> place = placeService.findPlaceByMidAndDid(mp.getId(), depository.getId());
placePList.addAll(place);
flag = true;
}
}
if (flag) {
// 设置当前物料在相关仓库下的所有库位
mp.setPlacePList(placePList);
// 设置物料与条形码的对应关系
mp.setMaterialAndBarCodeList(materialByBarCodeByCondition);
}
return new RestResponse(mp);
}
// 获取扫描结果并跳转到盘点 // 获取扫描结果并跳转到盘点
@PostMapping("/stockTaking_scanQrCode") @PostMapping("/stockTaking_scanQrCode")
@ -582,6 +677,60 @@ public class MaterialController {
return new RestResponse(jsonObject); return new RestResponse(jsonObject);
} }
// 获取扫描结果并跳转到盘点
@PostMapping("/qywxStockTakingScanQrCode")
public RestResponse qywxStockTakingScanQrCode(@RequestBody Map<String, Object> map, HttpServletRequest request) {
// 获取扫描的物料
Map<String, Object> param = new HashMap<>();
String placeId = (String) map.get("placeId");
// 获取当前扫描的二维码
String qrCode = (String) map.get("qrCode");
// 根据扫描的二维码获取对应的物料编码
String mcode = materialService.findMaterialCodeByQrCode(qrCode);
// 根据物料编码获取物料
Material material = materialService.findMaterialByCode(mcode);
// 用于标识是否成功获取
boolean flag = true;
param.put("mcode", material.getCode());
MaterialP mp = new MaterialP(material);
// 获取物料与条形码的对应关系
List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(param);
param.put("code", material.getCode());
param.put("depositoryId", map.get("depositoryId"));
List<MaterialP> inventory = materialService.findInventory(param);
if (inventory.size() > 0) {
MaterialP materialP = inventory.get(0);
if (!"0".equals(placeId)) {
// 如果不是默认库位
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(ObjectFormatUtil.toInteger(placeId), materialP.getId());
if (placeAndMaterialByMidAndPid == null) {
// 如果当前物料不在该库位
flag = false;
}else{
mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity());
}
} else {
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(0, materialP.getId());
if (placeAndMaterialByMidAndPid == null) {
// 如果当前物料不在该库位
flag = false;
}else{
mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity());
}
}
mp = materialP;
} else {
flag = false;
}
mp.setMaterialAndBarCodeList(materialByBarCodeByCondition);
if (flag) {
// 如果成功获取
return new RestResponse(mp);
}
return new RestResponse(null);
}
// 获取条形码扫描结果 // 获取条形码扫描结果
@GetMapping("/application_in_scanBarCode") @GetMapping("/application_in_scanBarCode")
public RestResponse applicationInScanBarCode(HttpServletRequest request) { public RestResponse applicationInScanBarCode(HttpServletRequest request) {
@ -630,6 +779,37 @@ public class MaterialController {
} }
// 获取企业微信条形码扫描结果
@PostMapping("/qywxApplicationInScanBarCode")
public RestResponse qywxApplicationInScanBarCode(@RequestBody Map<String, Object> map, HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
String qrCode = (String) map.get("qrCode");
Map<String, Object> result = new HashMap<>();
List<Object> materialList = new ArrayList<>();
// 获取当前用户所在部门拥有的仓库
List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userToken.getMaindeparment().toString());
Map<String, Object> param = new HashMap<>();
// 获取条形码与物料的映射
MaterialAndBarCode materialByBarCode = null;
for (int j = 0; j < depositoryByAdminorg.size(); j++) {
param.put("depositoryId", depositoryByAdminorg.get(j).getId());
param.put("barCode", qrCode);
// 通过仓库与条形码获取对应关系
materialByBarCode = materialService.findMaterialByBarCodeByBarCodeAndDepositoryId(param);
if (materialByBarCode != null) {
// 如果获取到对应关系
break;
}
}
if (materialByBarCode == null) {
// 如果没有获取到
materialByBarCode = materialService.findMaterialByBarCode(qrCode);
}
result.put("material", materialByBarCode);
return new RestResponse(result);
}
// 获取条形码扫描结果 // 获取条形码扫描结果
@GetMapping("/application_transfer_scanBarCode") @GetMapping("/application_transfer_scanBarCode")
public RestResponse applicationTransferScanBarCode(HttpServletRequest request) { public RestResponse applicationTransferScanBarCode(HttpServletRequest request) {
@ -681,28 +861,54 @@ public class MaterialController {
return new RestResponse(result); return new RestResponse(result);
} }
@PostMapping("/qywxApplicationTransferScanBarCode")
public RestResponse qywxApplicationTransferScanBarCode(@RequestBody Map<String, Object> map, HttpServletRequest request) {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
// 获取当前用户部门所拥有仓库
List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userByPort.getMaindeparment().toString());
// 获取扫描的条形码
String qrCode = (String) map.get("qrCode");
// 获取条形码与物料的映射
MaterialAndBarCode materialByBarCode = materialService.findMaterialByBarCode(qrCode);
if (materialByBarCode != null) {
for (int j = 0; j < depositoryByAdminorg.size(); j++) {
List<PlaceP> placePList = new ArrayList<>();
Boolean isExist = false;
Map<String, Object> param = new HashMap<>();
param.put("depositoryId", depositoryByAdminorg.get(j).getId());
param.put("code", materialByBarCode.getMcode());
List<MaterialP> inventory = materialService.findInventory(param);
if (inventory.size() > 0) {
// 如果存在该物料
MaterialP materialP = inventory.get(0);
materialByBarCode.setMid(materialP.getId());
List<PlaceP> placeByMidAndDid = placeService.findPlaceByMidAndDid(materialP.getId(), depositoryByAdminorg.get(j).getId());
placePList.addAll(placeByMidAndDid);
isExist = true;
}
if (isExist) {
materialByBarCode.setPlacePList(placePList);
return new RestResponse(materialByBarCode);
}
}
return new RestResponse(null);
}
return new RestResponse(null);
}
// 获取条形码扫描结果 // 获取条形码扫描结果
@GetMapping("/application_out_scanBarCode") @PostMapping("/qywxApplicationOutScanBarCode")
public RestResponse applicationOutScanBarCode(HttpServletRequest request) { public RestResponse qywxApplicationOutScanBarCode(@RequestBody Map<String, Object> map, HttpServletRequest request) {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken"); UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
// 获取当前用户部门所拥有仓库 // 获取当前用户部门所拥有仓库
List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userByPort.getMaindeparment().toString()); List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userByPort.getMaindeparment().toString());
String scanBarCodeValue = redisTemplate.opsForValue().get("temporaryBarCodeValueForMaterial" + userByPort.getNumber()).toString(); String barCode = (String) map.get("qrCode");
redisTemplate.delete("temporaryBarCodeValueForMaterial" + userByPort.getNumber()); // 获取条形码与物料的映射
JSONObject jsonObject = JSONObject.parseObject(scanBarCodeValue); MaterialAndBarCode materialByBarCode = materialService.findMaterialByBarCode(barCode);
JSONArray barCodeList = (JSONArray) jsonObject.get("barCodeList"); if (materialByBarCode != null) {
// 获取标志位,用于判断是否扫描二维码
Boolean flag = jsonObject.getBoolean("flag");
Map<String, Object> result = new HashMap<>();
List<Object> materialList = new ArrayList<>();
for (int i = 0; i < barCodeList.size(); i++) {
// 获取具体的条形码
String barCode = barCodeList.getString(i);
// 获取条形码与物料的映射
MaterialAndBarCode materialByBarCode = materialService.findMaterialByBarCode(barCode);
Boolean isExist = false;
List<PlaceP> placePList = new ArrayList<>(); List<PlaceP> placePList = new ArrayList<>();
for (int j = 0; j < depositoryByAdminorg.size(); j++) { for (int j = 0; j < depositoryByAdminorg.size(); j++) {
Boolean isExist = false;
Map<String, Object> param = new HashMap<>(); Map<String, Object> param = new HashMap<>();
param.put("depositoryId", depositoryByAdminorg.get(j).getId()); param.put("depositoryId", depositoryByAdminorg.get(j).getId());
param.put("code", materialByBarCode.getMcode()); param.put("code", materialByBarCode.getMcode());
@ -715,23 +921,16 @@ public class MaterialController {
placePList.addAll(placeByMidAndDid); placePList.addAll(placeByMidAndDid);
isExist = true; isExist = true;
} }
if (isExist) {
return new RestResponse(materialByBarCode);
}
} }
if (isExist) { return new RestResponse(null);
materialByBarCode.setPlacePList(placePList);
materialList.add(materialByBarCode);
}
} }
result.put("materialList", materialList); return new RestResponse(null);
if (flag) {
String scanQrCodeValue = redisTemplate.opsForValue().get("scanQrCodeValue" + userByPort.getNumber()).toString();
redisTemplate.delete("scanQrCodeValue" + userByPort.getNumber());
JSONObject parseObject = JSONObject.parseObject(scanQrCodeValue);
result.put("depository", parseObject.get("depository"));
result.put("place", parseObject.get("place"));
}
return new RestResponse(result);
}
}
// 获取条形码扫描结果 // 获取条形码扫描结果
@PostMapping("/stockTaking_scanBarCode") @PostMapping("/stockTaking_scanBarCode")
@ -847,7 +1046,69 @@ public class MaterialController {
} }
} }
result.put("materialList", materialList); result.put("materialList", materialList);
result.put("barCodeListByNoMaterial",barCodeListByNoMaterial); result.put("barCodeListByNoMaterial", barCodeListByNoMaterial);
return new RestResponse(result);
}
@PostMapping("/qywxStockTakingScanBarCode")
public RestResponse qywxStockTakingScanBarCode(@RequestBody Map<String, Object> map, HttpServletRequest request) {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
// 获取具体的条形码
String barCode = (String) map.get("qrCode");
Map<String, Object> result = new HashMap<>();
MaterialP material = null;
String placeId = (String) map.get("placeId");
// 用于存储没有对应关系的条形码
List<String> barCodeListByNoMaterial = new ArrayList<>();
// 获取条形码与物料的映射
MaterialAndBarCode materialByBarCode = materialService.findMaterialByBarCode(barCode);
if (materialByBarCode != null) {
// 如果存在对应关系
Boolean isExist = false;
Map<String, Object> param = new HashMap<>();
// 判断所在仓库
param.put("depositoryId", map.get("depositoryId"));
param.put("code", materialByBarCode.getMcode());
List<MaterialP> inventory = materialService.findInventory(param);
MaterialP mp = new MaterialP();
if (inventory.size() > 0) {
// 如果存在该物料
MaterialP materialP = inventory.get(0);
// 设置标志位true
isExist = true;
if (!"0".equals(placeId)) {
// 如果不是默认库位
// 获取物料与库位的对应关系
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(ObjectFormatUtil.toInteger(placeId), materialP.getId());
if (placeAndMaterialByMidAndPid == null) {
isExist = false;
} else {
mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity());
}
} else {
// 获取物料与库位的对应关系
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(0, materialP.getId());
if (placeAndMaterialByMidAndPid == null) {
isExist = false;
} else {
mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity());
}
}
mp = materialP;
}
if (isExist) {
material = mp;
}
} else {
// 如果当前条形码不存对应物料
barCodeListByNoMaterial.add(barCode);
}
result.put("material", material);
result.put("barCodeListByNoMaterial", barCodeListByNoMaterial);
return new RestResponse(result); return new RestResponse(result);
} }
@ -1004,4 +1265,65 @@ public class MaterialController {
} }
/**
* 用于查询当前扫描的二维码为仓库还是物料
* @param map
* @param request
* @return
*/
@PostMapping("/qywxScanCodeOut")
public RestResponse qywxScanCodeOut(@RequestBody Map<String,Object> map,HttpServletRequest request){
String qrCode = (String) map.get("qrCode");
String materialCode = materialService.findMaterialCodeByQrCode(qrCode);
Map<String,Object> result = new HashMap<>();
// 0为非法码,1为物料,2为库位,3为仓库
Integer flag = 0;
if(materialCode != null){
// 如果当前不为空,则扫描的为物料二维码
flag = 1;
Material materialByCode = materialService.findMaterialByCode(materialCode);
result.put("material",materialByCode);
}else{
// 如果为空,则扫描的为条形码
MaterialAndBarCode materialByBarCode = materialService.findMaterialByBarCode(qrCode);
if(materialByBarCode != null){
// 如果不为空,则扫描的为物料条形码
Material material = materialService.findMaterialById(materialByBarCode.getMid());
flag = 1;
result.put("material",material);
}else{
// 如果为空,则扫描的可能为库位码
PidOrDidAndCode locationByQrCode = placeService.findLocationByQrCode(qrCode);
if(locationByQrCode != null){
// 如果不为空,则是库位码
// 1为库位2为仓库
Integer locationFlag = locationByQrCode.getFlag();
if(Integer.compare(locationFlag,1) == 0){
// 如果是库位
Place placeById = placeService.findPlaceById(ObjectFormatUtil.toInteger(locationByQrCode.getPid()));
List<MaterialAndPlace> placeAndMaterialByPid = placeService.findPlaceAndMaterialByPid(placeById.getId());
PlaceP pp = new PlaceP(placeById);
List<String> mcodeList = new ArrayList<>();
for (int i = 0; i < placeAndMaterialByPid.size(); i++) {
MaterialAndPlace materialAndPlace = placeAndMaterialByPid.get(i);
Material materialById = materialService.findMaterialById(materialAndPlace.getMid());
mcodeList.add(materialById.getCode());
}
pp.setMcodeList(mcodeList);
result.put("place",pp);
flag = 2;
}else{
// 如果是仓库
Depository depository = depositoryService.findDepositoryRecordById(ObjectFormatUtil.toInteger(locationByQrCode.getDepositoryId()));
result.put("depository",depository);
flag = 3;
}
}
}
}
result.put("flag",flag);
return new RestResponse(result);
}
} }

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

@ -16,6 +16,8 @@ import com.dreamchaser.depository_manage.service.*;
import com.dreamchaser.depository_manage.utils.*; import com.dreamchaser.depository_manage.utils.*;
import com.sun.org.apache.xpath.internal.operations.Mod; import com.sun.org.apache.xpath.internal.operations.Mod;
import javafx.geometry.Pos; import javafx.geometry.Pos;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.http.protocol.HTTP; import org.apache.http.protocol.HTTP;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -119,7 +121,6 @@ public class PageController {
@GetMapping("/login") @GetMapping("/login")
public ModelAndView login(HttpServletRequest request) { public ModelAndView login(HttpServletRequest request) {
ModelAndView mv = new ModelAndView(); ModelAndView mv = new ModelAndView();
QyWxConfig.token = QyWxConfig.GetQYWXToken();
JSONObject captcha = Captcha(request); JSONObject captcha = Captcha(request);
String picPath = (String) captcha.get("picPath"); String picPath = (String) captcha.get("picPath");
String captchaid = (String) captcha.get("captchaid"); String captchaid = (String) captcha.get("captchaid");
@ -459,21 +460,6 @@ public class PageController {
map.put("mcode",material.getCode()); map.put("mcode",material.getCode());
// 获取物料与条形码的对应关系 // 获取物料与条形码的对应关系
List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(map); List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(map);
Map<String,Object> params = new HashMap<>();
params.put("mid",material.getId());
params.put("mname",material.getMname());
params.put("code",material.getCode());
params.put("version",material.getVersion());
String context = JSONObject.toJSONString(params);
// 将待展示数据进行加密操作
context = JM_3DES.encode3Des(JM_3DES.JM_Key,context);
String qrCode = "";
try {
qrCode = CreateQrCodeUtil.createQrCode(context, 200, 200);
} catch (IOException e) {
throw new MyException(e.getMessage());
}
mv.addObject("qrCode",qrCode);
mv.addObject("record", materialService.findMaterialAndTypeById(id)); mv.addObject("record", materialService.findMaterialAndTypeById(id));
mv.addObject("barCodeList",materialByBarCodeByCondition); mv.addObject("barCodeList",materialByBarCodeByCondition);
mv.addObject("materialTypes", materialTypeService.findMaterialTypeAll()); mv.addObject("materialTypes", materialTypeService.findMaterialTypeAll());
@ -830,21 +816,7 @@ public class PageController {
if (id != null) { if (id != null) {
Depository depositoryRecordById = depositoryService.findDepositoryRecordById(id); Depository depositoryRecordById = depositoryService.findDepositoryRecordById(id);
// 用于二维码存放数据 // 用于二维码存放数据
Map<String,Object> param = new HashMap<>();
param.put("code",depositoryRecordById.getCode());
param.put("did",depositoryRecordById.getId());
param.put("dname",depositoryRecordById.getDname());
param.put("introduce",depositoryRecordById.getIntroduce());
String context = JSONObject.toJSONString(param);
// 将待展示数据进行加密操作
context = JM_3DES.encode3Des(JM_3DES.JM_Key,context);
String qrCode = "";
try {
qrCode = CreateQrCodeUtil.createQrCode(context,200,200);
} catch (IOException e) {
e.printStackTrace();
}
mv.addObject("qrCode",qrCode);
mv.addObject("record", depositoryRecordById); mv.addObject("record", depositoryRecordById);
Integer cid = depositoryRecordById.getCid(); Integer cid = depositoryRecordById.getCid();
List<AdministrationP> postList = findCompanyBySuperior(cid.toString(),userToken); List<AdministrationP> postList = findCompanyBySuperior(cid.toString(),userToken);
@ -883,36 +855,6 @@ public class PageController {
if (id != null) { if (id != null) {
mv.addObject("id", id); mv.addObject("id", id);
Place placeById = placeService.findPlaceById(id); Place placeById = placeService.findPlaceById(id);
// 用于二维码存放数据
Map<String,Object> param = new HashMap<>();
param.put("pid",placeById.getId());
Depository depositoryRecordById = depositoryService.findDepositoryRecordById(placeById.getDid());
param.put("dname",depositoryRecordById.getDname());
param.put("code",placeById.getCode());
param.put("depositoryId",depositoryRecordById.getId());
List<MaterialAndPlace> placeAndMaterialByPid = placeService.findPlaceAndMaterialByPid(placeById.getId());
StringBuilder mname = new StringBuilder();
StringBuilder mcodeList = new StringBuilder();
StringBuilder midList = new StringBuilder();
for (int i = 0; i < placeAndMaterialByPid.size(); i++) {
Material materialById = materialService.findMaterialById(placeAndMaterialByPid.get(i).getMid());
mname.append(materialById.getMname()).append(", ");
midList.append(materialById.getId()).append(",");
mcodeList.append(materialById.getCode()).append(",");
}
param.put("mname",mname.toString());
param.put("midList",midList.toString());
param.put("mcodeList",mcodeList.toString());
String context = JSONObject.toJSONString(param);
// 将待展示数据进行加密操作
context = JM_3DES.encode3Des(JM_3DES.JM_Key,context);
String qrCode = "";
try {
qrCode = CreateQrCodeUtil.createQrCode(context,200,200);
} catch (IOException e) {
e.printStackTrace();
}
mv.addObject("qrCode",qrCode);
mv.addObject("place", placeById); mv.addObject("place", placeById);
} else { } else {
throw new MyException("缺少必要参数!"); throw new MyException("缺少必要参数!");
@ -1820,7 +1762,16 @@ public class PageController {
@GetMapping("/scanBarCodeIn") @GetMapping("/scanBarCodeIn")
public String scanBarCodeIn(){ public String scanBarCodeIn(){
return "pages/scanQrCode/ScanBarCodeIn"; // return "pages/scanQrCode/ScanBarCodeIn";
return "pages/QyWxScanCode/QyWxScanBarCodeIn";
}
@GetMapping("/qywxScanBarCodeIn")
public ModelAndView qywxScanBarCodeIn(HttpServletRequest request){
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/QyWxScanCode/QyWxScanBarCodeIn");
return mv;
} }
@GetMapping("/scanBarCodeOut") @GetMapping("/scanBarCodeOut")
@ -2020,4 +1971,6 @@ public class PageController {
} }
} }

69
src/main/java/com/dreamchaser/depository_manage/controller/PlaceController.java

@ -1,11 +1,13 @@
package com.dreamchaser.depository_manage.controller; package com.dreamchaser.depository_manage.controller;
import cn.hutool.core.lang.Snowflake;
import com.baomidou.mybatisplus.extension.api.R; import com.baomidou.mybatisplus.extension.api.R;
import com.dreamchaser.depository_manage.entity.*; import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.exception.MyException; import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.pojo.MaterialP; import com.dreamchaser.depository_manage.pojo.MaterialP;
import com.dreamchaser.depository_manage.pojo.PlaceP; import com.dreamchaser.depository_manage.pojo.PlaceP;
import com.dreamchaser.depository_manage.pojo.RestResponse; import com.dreamchaser.depository_manage.pojo.RestResponse;
import com.dreamchaser.depository_manage.pojo.StatusInfo;
import com.dreamchaser.depository_manage.service.DepositoryService; import com.dreamchaser.depository_manage.service.DepositoryService;
import com.dreamchaser.depository_manage.service.MaterialService; import com.dreamchaser.depository_manage.service.MaterialService;
import com.dreamchaser.depository_manage.service.PlaceService; import com.dreamchaser.depository_manage.service.PlaceService;
@ -16,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.*; import java.util.*;
@RestController @RestController
@ -257,4 +260,70 @@ public class PlaceController {
return new RestResponse(placeList); return new RestResponse(placeList);
} }
// 构造仓库二维码
@PostMapping("/createQrCode")
public RestResponse createQrCode(@RequestBody Map<String,Object> map) {
// 通过雪花算法计算随机数
Snowflake snowflake = new Snowflake(10,10,true);
String qrCode = snowflake.nextIdStr();
Integer pid = ObjectFormatUtil.toInteger(map.get("pid"));
String qrCodeByDepository = placeService.findQrCodeByPlace(pid);
if(qrCodeByDepository == null) {
Map<String, Object> param = new HashMap<>();
param.put("pid", pid);
param.put("qrCode", qrCode);
placeService.addQrCodeByPlace(param);
}else{
qrCode = qrCodeByDepository;
}
try {
// 二维码保存信息
return RestResponse.CreateQrCode(qrCode);
} catch (IOException e) {
return new RestResponse("err: " + e.getMessage(), 678, new StatusInfo("失败", "请联系开发人员"));
}
}
// 用于扫描入库位置
@PostMapping("/qywxApplicationInScanQrCode")
public RestResponse qywxApplicationInScanQrCode(@RequestBody Map<String,Object> map,HttpServletRequest request){
// 获取扫描的码值
String qrCode = (String) map.get("qrCode");
// 根据二维码获取对应位置信息
PidOrDidAndCode locationByQrCode = placeService.findLocationByQrCode(qrCode);
Map<String,Object> result = new HashMap<>();
result.put("flag",0);
if(locationByQrCode != null){
// 获取当前标志位(1为库位2为仓库)
Integer flag = locationByQrCode.getFlag();
if(Integer.compare(1,flag) == 0){
// 如果当前位置为库位
// 获取当前库位
Place place = placeService.findPlaceById(Integer.parseInt(locationByQrCode.getPid().toString()));
PlaceP placeP = new PlaceP(place);
if(Integer.compare(0,placeP.getId()) == 0){
// 如果是默认库位
placeP.setDepositoryName("默认库位-0000");
}else {
Depository depository = depositoryService.findDepositoryRecordById(placeP.getDid());
placeP.setDepositoryName(depository.getDname() + "-"+placeP.getCode());
}
result.put("flag",1);
result.put("place",placeP);
}else {
// 如果当前位置为仓库
// 获取当前仓库
Depository depository = depositoryService.findDepositoryRecordById(Integer.parseInt(locationByQrCode.getDepositoryId().toString()));
result.put("flag",2);
result.put("depository",depository);
}
}
return new RestResponse(result);
}
} }

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

@ -9,6 +9,7 @@ import com.dreamchaser.depository_manage.config.QyWxJMJM.com.qq.weixin.mp.aes.WX
import com.dreamchaser.depository_manage.entity.CallBackLog; import com.dreamchaser.depository_manage.entity.CallBackLog;
import com.dreamchaser.depository_manage.entity.StockTaking; import com.dreamchaser.depository_manage.entity.StockTaking;
import com.dreamchaser.depository_manage.entity.UserByPort; 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.CallBackBaseXml;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard; 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.AuthenticationTokenPool;
@ -18,11 +19,15 @@ import com.dreamchaser.depository_manage.service.DepositoryRecordService;
import com.dreamchaser.depository_manage.service.DepositoryService; import com.dreamchaser.depository_manage.service.DepositoryService;
import com.dreamchaser.depository_manage.service.StockTakingService; import com.dreamchaser.depository_manage.service.StockTakingService;
import com.dreamchaser.depository_manage.service.impl.QyWxOperationService; 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.ObjectFormatUtil;
import com.dreamchaser.depository_manage.utils.QyWxXMLUtils; import com.dreamchaser.depository_manage.utils.QyWxXMLUtils;
import io.micrometer.core.instrument.util.IOUtils; 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.joda.time.format.FormatUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -38,11 +43,13 @@ import java.time.Instant;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit;
/** /**
* 用于企业微信相关操作的控制器 * 用于企业微信相关操作的控制器
*/ */
@RestController
@Controller @Controller
public class QyWxOperationController { public class QyWxOperationController {
@ -63,6 +70,9 @@ public class QyWxOperationController {
StockTakingService stockTakingService; StockTakingService stockTakingService;
@Autowired
RedisTemplate<String,String> redisTemplate;
/** /**
* 用于接收企业微信的回调get方式 * 用于接收企业微信的回调get方式
*/ */
@ -110,6 +120,8 @@ public class QyWxOperationController {
try { 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);
// 企业微信加密签名 // 企业微信加密签名
@ -186,7 +198,7 @@ public class QyWxOperationController {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
Map<String, Object> reviewByQyWx = stockTakingService.reviewByQyWx(templateCard); Map<String, Object> reviewByQyWx = stockTakingService.reviewByQyWx(templateCard,crypt);
if(reviewByQyWx.containsKey("errMsg")){ if(reviewByQyWx.containsKey("errMsg")){
} }
@ -197,7 +209,7 @@ public class QyWxOperationController {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
stockTakingService.completeStockTakingByQyWx(templateCard); stockTakingService.completeStockTakingByQyWx(templateCard,crypt);
} }
}).start(); }).start();
} }
@ -209,7 +221,7 @@ public class QyWxOperationController {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
depositoryRecordService.reviewByQyWx(templateCard); depositoryRecordService.reviewByQyWx(templateCard,crypt);
} }
}).start(); }).start();
} }
@ -219,7 +231,7 @@ public class QyWxOperationController {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
qyWxOperationService.updateTemplateCard(templateCard.getResponseCode(),userByPort.getName(), finalResult); qyWxOperationService.updateTemplateCard(templateCard.getResponseCode(),userByPort.getName(), finalResult,crypt);
} }
}).start(); }).start();
@ -256,14 +268,17 @@ public class QyWxOperationController {
public ModelAndView QyWxLogin(@RequestParam(required = false)String code, public ModelAndView QyWxLogin(@RequestParam(required = false)String code,
@RequestParam(required = false)String action, @RequestParam(required = false)String action,
@RequestParam(required = false)String state, @RequestParam(required = false)String state,
HttpServletRequest request) HttpServletRequest request,
HttpServletResponse response)
{ {
ModelAndView mv = new ModelAndView(); ModelAndView mv = new ModelAndView();
mv.addObject("userWxId",""); mv.addObject("userWxId","");
mv.setViewName("pages/user/login"); mv.setViewName("pages/user/login");
if(code != null) { if(code != null) {
QyWxConfig.code = code; QyWxConfig.code = code;
JSONObject jsonObject = QyWxConfig.GetQYWXUserId(); String header = request.getHeader("user-agent");
String crypt = Md5.crypt(header);
JSONObject jsonObject = QyWxConfig.GetQYWXUserId(crypt);
Integer errCode = jsonObject.getInteger("errcode"); Integer errCode = jsonObject.getInteger("errcode");
String userId = jsonObject.getString("userid"); String userId = jsonObject.getString("userid");
if (errCode == 0) { if (errCode == 0) {
@ -285,7 +300,11 @@ public class QyWxOperationController {
session.setAttribute("userToken",userByPort); session.setAttribute("userToken",userByPort);
session.setMaxInactiveInterval(1800); session.setMaxInactiveInterval(1800);
mv.addObject("user",userByPort); mv.addObject("user",userByPort);
mv.setViewName("index"); try {
response.sendRedirect("https://jy.hxgk.group/");
} catch (IOException e) {
e.printStackTrace();
}
}else{ }else{
JSONObject captcha = PageController.Captcha(request); JSONObject captcha = PageController.Captcha(request);
String picPath = (String) captcha.get("picPath"); String picPath = (String) captcha.get("picPath");
@ -312,7 +331,94 @@ public class QyWxOperationController {
} }
/**
* 用于获取用于调用企业微信接口的签名
* @param request
* @return
*/
@GetMapping("/QyWxSignature")
public RestResponse getQyWXSignature(@RequestParam Map<String,String> map,HttpServletRequest request){
// 随机字符串
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
Map<String,String> result = new HashMap<>();
// jsapi_ticket_app加密后
String s = "";
// jsapi_ticket_enterprises加密后
String s1 = "";
// 时间戳
long timestamp = 0;
// 随机字符串
String noncestr = "";
// 访问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 {
timestamp = System.currentTimeMillis() / 1000;
//生成从ASCII 32到126组成的随机字符串
// String noncestr = RandomStringUtils.randomAscii(10);
noncestr = String.valueOf(timestamp);
// 获取企业的jsapi_ticket
String header = request.getHeader("user-agent");
String crypt = Md5.crypt(header);
JSONObject ticketForApp = QyWxConfig.getQyWxJsApiTicketForApp(crypt);
JSONObject ticketForEnterprise = QyWxConfig.getQyWxJsApiTicketForEnterprise(crypt);
Integer errcodeForEnterprise = ticketForEnterprise.getInteger("errcode");
Integer errcodeForApp = ticketForApp.getInteger("errcode");
// 获取企业的jsapi_ticket
String ticketForEnterprises = "";
String ticketForEnterApps = "";
if (Integer.compare(0, errcodeForEnterprise) == 0) {
ticketForEnterprises = ticketForEnterprise.getString("ticket");
}
if (Integer.compare(0, errcodeForApp) == 0) {
ticketForEnterApps = ticketForApp.getString("ticket");
}
Integer expires_in = ticketForEnterprise.getInteger("expires_in");
// 步骤1. 将这些参数拼接成字符串string1:
String jsapi_ticket_app = "jsapi_ticket=" + ticketForEnterApps + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + url;
String jsapi_ticket_enterprises = "jsapi_ticket=" + ticketForEnterprises + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + url;
// 步骤2. 对string1进行sha1签名,得到signature
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.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("agentid", String.valueOf(QyWxConfig.AgentId));
result.put("url",url);
System.out.println(result);
return new RestResponse(result);
}
} }

21
src/main/java/com/dreamchaser/depository_manage/controller/StockTakingController.java

@ -13,6 +13,7 @@ import com.dreamchaser.depository_manage.service.PlaceService;
import com.dreamchaser.depository_manage.service.StockTakingService; import com.dreamchaser.depository_manage.service.StockTakingService;
import com.dreamchaser.depository_manage.service.impl.QyWxOperationService; import com.dreamchaser.depository_manage.service.impl.QyWxOperationService;
import com.dreamchaser.depository_manage.utils.CrudUtil; import com.dreamchaser.depository_manage.utils.CrudUtil;
import com.dreamchaser.depository_manage.utils.Md5;
import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; import com.dreamchaser.depository_manage.utils.ObjectFormatUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
@ -55,6 +56,9 @@ public class StockTakingController {
UserByPort userToken = (UserByPort) request.getAttribute("userToken"); UserByPort userToken = (UserByPort) request.getAttribute("userToken");
String header = request.getHeader("user-agent");
String crypt = Md5.crypt(header);
List params = (ArrayList) map.get("params"); List params = (ArrayList) map.get("params");
String departmentManagerId = (String) map.get("departmentManagerId"); String departmentManagerId = (String) map.get("departmentManagerId");
@ -113,7 +117,7 @@ public class StockTakingController {
Object mainId = param.get("mainId"); Object mainId = param.get("mainId");
// 向企业微信发送消息 // 向企业微信发送消息
JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingDepartmentManagerMessage(QyWxDepartmentManager.toString(), ObjectFormatUtil.toInteger(mainId)); JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingDepartmentManagerMessage(QyWxDepartmentManager.toString(), ObjectFormatUtil.toInteger(mainId),crypt);
// 将当前返回结果保存到redis中 // 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>(); Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -129,7 +133,7 @@ public class StockTakingController {
success += stockTakingService.insertStockTaking(map); success += stockTakingService.insertStockTaking(map);
// 向企业微信发送消息 // 向企业微信发送消息
Object mainId = map.get("mainId"); Object mainId = map.get("mainId");
JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingDepartmentManagerMessage(QyWxDepartmentManager.toString(), ObjectFormatUtil.toInteger(mainId)); JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingDepartmentManagerMessage(QyWxDepartmentManager.toString(), ObjectFormatUtil.toInteger(mainId),crypt);
// 将当前返回结果保存到redis中 // 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>(); Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -162,8 +166,10 @@ public class StockTakingController {
// 用于审核 // 用于审核
@PostMapping("/review") @PostMapping("/review")
public RestResponse review(@RequestBody Map<String,Object> map,HttpServletRequest request){ public RestResponse review(@RequestBody Map<String,Object> map,HttpServletRequest request){
String header = request.getHeader("user-agent");
String crypt = Md5.crypt(header);
UserByPort userToken= (UserByPort) request.getAttribute("userToken"); UserByPort userToken= (UserByPort) request.getAttribute("userToken");
Map<String, Object> review = stockTakingService.review(map, userToken); Map<String, Object> review = stockTakingService.review(map, userToken,crypt);
if(review.containsKey("errMsg")){ if(review.containsKey("errMsg")){
// 如果有出错情况 // 如果有出错情况
@ -178,7 +184,9 @@ public class StockTakingController {
@PostMapping("/complete") @PostMapping("/complete")
public RestResponse complete(@RequestBody Map<String,Object> map,HttpServletRequest request){ public RestResponse complete(@RequestBody Map<String,Object> map,HttpServletRequest request){
UserByPort userToken= (UserByPort) request.getAttribute("userToken"); UserByPort userToken= (UserByPort) request.getAttribute("userToken");
Map<String, Object> complete = stockTakingService.completeStockTaking(map, userToken); String header = request.getHeader("user-agent");
String crypt = Md5.crypt(header);
Map<String, Object> complete = stockTakingService.completeStockTaking(map, userToken,crypt);
if(complete.containsKey("errMsg")){ if(complete.containsKey("errMsg")){
// 如果有出错情况 // 如果有出错情况
return new RestResponse(complete,666,new StatusInfo("有错误","发现错误")); return new RestResponse(complete,666,new StatusInfo("有错误","发现错误"));
@ -216,7 +224,8 @@ public class StockTakingController {
public RestResponse stockTransfer(@RequestBody Map<String,Object> map,HttpServletRequest request) { public RestResponse stockTransfer(@RequestBody Map<String,Object> map,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken"); UserByPort userToken = (UserByPort) request.getAttribute("userToken");
String header = request.getHeader("user-agent");
String crypt = Md5.crypt(header);
String minIds = (String) map.get("minIds"); String minIds = (String) map.get("minIds");
String[] split = minIds.split(","); String[] split = minIds.split(",");
List<Integer> minIdList = new ArrayList<>(); List<Integer> minIdList = new ArrayList<>();
@ -230,7 +239,7 @@ public class StockTakingController {
} }
map.put("minIds",minIdList); map.put("minIds",minIdList);
Integer transfer = stockTakingService.stockTakingTransfer(map, userToken); Integer transfer = stockTakingService.stockTakingTransfer(map, userToken,crypt);
return CrudUtil.postHandle(transfer,minIdList.size()); return CrudUtil.postHandle(transfer,minIdList.size());
} }
} }

8
src/main/java/com/dreamchaser/depository_manage/converter/ExcelMaterialCodeConverter.java

@ -20,7 +20,7 @@ import java.util.List;
* 用于物料分类上级编码 * 用于物料分类上级编码
*/ */
@Component @Component
public class ExcelMaterialCodeConverter implements Converter<Long> { public class ExcelMaterialCodeConverter implements Converter<String> {
@Autowired @Autowired
private MaterialService materialService; private MaterialService materialService;
@ -28,7 +28,7 @@ public class ExcelMaterialCodeConverter implements Converter<Long> {
private static ExcelMaterialCodeConverter excelMaterialCodeConverter; private static ExcelMaterialCodeConverter excelMaterialCodeConverter;
@Override @Override
public Class<?> supportJavaTypeKey() { public Class<?> supportJavaTypeKey() {
return Long.class; return String.class;
} }
@Override @Override
@ -43,12 +43,12 @@ public class ExcelMaterialCodeConverter implements Converter<Long> {
* @return * @return
*/ */
@Override @Override
public Long convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { public String convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
Material material = excelMaterialCodeConverter.materialService.findMaterialByCode(cellData.getStringValue()); Material material = excelMaterialCodeConverter.materialService.findMaterialByCode(cellData.getStringValue());
if(material == null) { if(material == null) {
throw new RuntimeException("没有该物料"); throw new RuntimeException("没有该物料");
} }
return Long.valueOf(cellData.getStringValue()); return (cellData.getStringValue());
} }
@PostConstruct @PostConstruct

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

@ -15,7 +15,7 @@ public class ExcelInfoByInventory {
/** 物料编号 */ /** 物料编号 */
@ExcelProperty("EAS编号") @ExcelProperty("EAS编号")
private Long id; private String id;
/** 存货编码 */ /** 存货编码 */
@ExcelProperty(value = "编码",converter = ExcelMaterialCodeConverter.class) @ExcelProperty(value = "编码",converter = ExcelMaterialCodeConverter.class)

30
src/main/java/com/dreamchaser/depository_manage/entity/PidOrDidAndCode.java

@ -0,0 +1,30 @@
package com.dreamchaser.depository_manage.entity;
import lombok.Data;
/**
* 用于存储二维码与仓库或库位之间的关系
*/
@Data
public class PidOrDidAndCode {
/**
* id
*/
private Long id;
/**
库位id
*/
private Long pid;
/**
* 仓库id
*/
private Long depositoryId;
/**
* 标志1为库位2为仓库
*/
private Integer flag;
/**
* 对应码值
*/
private String code;
}

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

@ -30,6 +30,7 @@ public class UserInterceptor extends HandlerInterceptorAdapter {
HttpServletResponse response, Object handler) throws MyException { HttpServletResponse response, Object handler) throws MyException {
String header = request.getHeader("user-agent"); String header = request.getHeader("user-agent");
String token =null; String token =null;
String servletPath = request.getServletPath();
HttpSession session = request.getSession(); HttpSession session = request.getSession();
UserByPort userByPort = (UserByPort) session.getAttribute("userToken"); UserByPort userByPort = (UserByPort) session.getAttribute("userToken");
if(userByPort!=null){ if(userByPort!=null){
@ -55,7 +56,6 @@ public class UserInterceptor extends HandlerInterceptorAdapter {
if(isMobileDevice(request)){ if(isMobileDevice(request)){
if(header.contains("wxwork")) { if(header.contains("wxwork")) {
// 如果是企业微信跳转 // 如果是企业微信跳转
QyWxConfig.token = QyWxConfig.GetQYWXToken();
response.sendRedirect(QyWxConfig.getQYWXCodeUrl()); response.sendRedirect(QyWxConfig.getQYWXCodeUrl());
}else{ }else{

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

@ -214,4 +214,6 @@ public interface MaterialMapper {
List<Material> findMaterialByType(Long oldId); List<Material> findMaterialByType(Long oldId);
} }

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

@ -65,6 +65,8 @@
</resultMap> </resultMap>
<!-- 表查询字段 --> <!-- 表查询字段 -->
<sql id="allColumns"> <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 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

2
src/main/java/com/dreamchaser/depository_manage/mapper/MaterialTypeMapper.xml

@ -107,7 +107,7 @@
<select id="findMaterialTypeById" resultMap="materialTypeMap" parameterType="integer"> <select id="findMaterialTypeById" resultMap="materialTypeMap" parameterType="integer">
SELECT SELECT
<include refid="allColumns" /> <include refid="allColumns" />
FROM material_type mt WHERE mt.id = #{id} and mt.state != 3 and mt.state != 4 FROM material_type mt WHERE mt.oldId = #{id} and mt.state != 3 and mt.state != 4
</select> </select>
<!-- 根据主键查询数据 --> <!-- 根据主键查询数据 -->

143
src/main/java/com/dreamchaser/depository_manage/mapper/QrCodeMapper.xml

@ -0,0 +1,143 @@
<?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.QrCodeMapper">
<!-- This code was generated by TableGo tools, mark 1 begin. -->
<!-- 条形码与物料对应-->
<resultMap id="QrCodeAndLocationMap" type="com.dreamchaser.depository_manage.entity.PidOrDidAndCode">
<id column="id" property="id" jdbcType="INTEGER" />
<result column="code" property="code" jdbcType="VARCHAR"/>
<result column="pid" property="pid" jdbcType="INTEGER"/>
<result column="flag" property="flag" jdbcType="INTEGER"/>
<result column="depositoryId" property="depositoryId" jdbcType="INTEGER"/>
</resultMap>
<!-- 表查询字段 -->
<sql id="allColumns">
pdac.id,pdac.code,pdac.pid,pdac.flag,pdac.depositoryId
</sql>
<select id="findLocationByCondition" resultType="map" resultMap="QrCodeAndLocationMap">
select
<include refid="allColumns"/>
from pidordidandcode pdac
where 1 = 1
<if test="id != null and id != ''">
and id = #{id}
</if>
<if test="pid != null">
and pid = #{pid}
</if>
<if test="depositoryId != null and depositoryId != ''">
and depositoryId = #{depositoryId}
</if>
<if test="flag != null and flag != ''">
and flag = #{flag}
</if>
<if test="qrCode != null and qrCode!=''">
and code = #{qrCode}
</if>
</select>
<insert id="addQrCodeAndMaterial" parameterType="map">
insert into qrcodeandmaterial(id,qrcode,mcode)
values (
#{id},
#{qrCode},
#{mcode}
)
</insert>
<insert id="addQrCodeAndMaterialForMoreOne" parameterType="map">
insert into qrcodeandmaterial(id,mcode,qrcode)
values
<foreach collection="list" index="index" item="item" separator=",">
(#{id},
#{code},
#{item})
</foreach>
</insert>
<select id="selectQrCodeByMcode" parameterType="string" resultType="string">
select qrcode
from qrcodeandmaterial
where mcode = #{mcode}
</select>
<select id="findMaterialCodeByQrCode" parameterType="string" resultType="string">
select mcode
from qrcodeandmaterial
where qrcode = #{qrcode}
</select>
<!-- 删除映射-->
<delete id="deleteQrCodeAndMaterial" parameterType="map">
delete
from qrcodeandmaterial
where 1 = 1
<if test="qrCode != null and qrCode != ''">
and qrcode = #{qrCode}
</if>
<if test="mcode != null and mcode != ''">
and mcode = #{mcode}
</if>
<if test="id != null and id != ''">
and id = #{id}
</if>
</delete>
<select id="selectQrCodeByDepositoryOrPlace" parameterType="map" resultType="string">
select code
from pidordidandcode
where 1 = 1
<if test="pid != null">
and pid = #{pid}
</if>
<if test="depositoryId != null and depositoryId != ''">
and depositoryId = #{depositoryId}
</if>
<if test="flag != null and flag != ''">
and flag = #{flag}
</if>
</select>
<insert id="addQrCodeByPidOrDid" parameterType="map">
insert into pidordidandcode(id,pid,depositoryId,flag,code)
values (
#{id},
#{pid},
#{depositoryId},
#{flag},
#{qrCode}
)
</insert>
<insert id="addQrCodeByPidOrDidForMoreOne" parameterType="map">
insert into pidordidandcode(id,pid,depositoryId,flag,code)
values
<foreach collection="list" index="index" item="item" separator=",">
( #{id},
#{pid},
#{depositoryId},
#{flag},
#{item})
</foreach>
</insert>
</mapper>

5
src/main/java/com/dreamchaser/depository_manage/pojo/PlaceP.java

@ -1,8 +1,11 @@
package com.dreamchaser.depository_manage.pojo; package com.dreamchaser.depository_manage.pojo;
import com.dreamchaser.depository_manage.entity.MaterialAndPlace;
import com.dreamchaser.depository_manage.entity.Place; import com.dreamchaser.depository_manage.entity.Place;
import lombok.Data; import lombok.Data;
import java.util.List;
@Data @Data
public class PlaceP { public class PlaceP {
@ -73,6 +76,8 @@ public class PlaceP {
*/ */
private String depositoryName; private String depositoryName;
private List<String> mcodeList;
public PlaceP(Integer id, Integer x, Integer y, Integer z, Integer mid, Integer did, String code, Integer min, Integer max, Integer state, String mname, String mcode, String depositoryCode, String depositoryName) { public PlaceP(Integer id, Integer x, Integer y, Integer z, Integer mid, Integer did, String code, Integer min, Integer max, Integer state, String mname, String mcode, String depositoryCode, String depositoryName) {
this.id = id; this.id = id;
this.x = x; this.x = x;

10
src/main/java/com/dreamchaser/depository_manage/pojo/RestResponse.java

@ -63,9 +63,13 @@ public class RestResponse implements Serializable {
this.statusInfo = statusInfo; this.statusInfo = statusInfo;
} }
public static RestResponse CreateQrCode(Map<String,Object> params) throws IOException { /**
// 获取要生产二维码的内容 * 生成二维码
String context = JSONObject.toJSONString(params); * @param context 随机数
* @return
* @throws IOException
*/
public static RestResponse CreateQrCode(String context) throws IOException {
// 生成base64类型图片 // 生成base64类型图片
String qrCode = CreateQrCodeUtil.createQrCode(context, 200, 200); String qrCode = CreateQrCodeUtil.createQrCode(context, 200, 200);
return new RestResponse(qrCode,200,new StatusInfo("成功!","二维码生成成功")); return new RestResponse(qrCode,200,new StatusInfo("成功!","二维码生成成功"));

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

@ -40,7 +40,7 @@ public interface DepositoryRecordService {
* @param map 仓库调度信息 * @param map 仓库调度信息
* @return 受影响的行数 * @return 受影响的行数
*/ */
Integer review(Map<String,Object> map,Integer userId,UserByPort userToken); Integer review(Map<String,Object> map,Integer userId,UserByPort userToken,String userAgent);
/** /**
@ -48,7 +48,7 @@ public interface DepositoryRecordService {
* @param templateCard * @param templateCard
* @return * @return
*/ */
Integer reviewByQyWx(TemplateCard templateCard); Integer reviewByQyWx(TemplateCard templateCard,String userAgent);
/** /**
@ -353,5 +353,5 @@ public interface DepositoryRecordService {
* @param userByPort * @param userByPort
* @return * @return
*/ */
RestResponse completeApplicationOutMinRecord(Map<String,Object> map,UserByPort userByPort); RestResponse completeApplicationOutMinRecord(Map<String,Object> map,UserByPort userByPort,String userAgent);
} }

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

@ -161,4 +161,19 @@ public interface DepositoryService {
*/ */
List<Depository> findDepositoryByAdminorgAndUser(UserByPort userByPort); List<Depository> findDepositoryByAdminorgAndUser(UserByPort userByPort);
/**
* 获取仓库对应的二维码
* @param did
* @return
*/
String findQrCodeByDepository(Integer did);
/**
* 用于添加仓库与二维码的对应关系
* @param map
* @return
*/
Integer addQrCodeByDepository(Map<String,Object> map);
} }

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

@ -231,4 +231,24 @@ public interface MaterialService {
* @return * @return
*/ */
Integer delBarCodeByMaterial(Map<String,Object> map); Integer delBarCodeByMaterial(Map<String,Object> map);
/**
* 用于添加二维码与物料的对应关系
*/
Integer addQrCodeByMaterial(Map<String,Object> map);
/**
* 根据物料编码获取与二维码的对应关系
* @param Mcode
* @return
*/
String findQrCodeByMcode(String Mcode);
/**
* 根据二维码获取对应的物料编码
* @param qrCode
* @return
*/
String findMaterialCodeByQrCode(String qrCode);
} }

22
src/main/java/com/dreamchaser/depository_manage/service/PlaceService.java

@ -1,6 +1,7 @@
package com.dreamchaser.depository_manage.service; package com.dreamchaser.depository_manage.service;
import com.dreamchaser.depository_manage.entity.MaterialAndPlace; import com.dreamchaser.depository_manage.entity.MaterialAndPlace;
import com.dreamchaser.depository_manage.entity.PidOrDidAndCode;
import com.dreamchaser.depository_manage.entity.Place; import com.dreamchaser.depository_manage.entity.Place;
import com.dreamchaser.depository_manage.pojo.PlaceP; import com.dreamchaser.depository_manage.pojo.PlaceP;
@ -124,4 +125,25 @@ public interface PlaceService {
* @return * @return
*/ */
Integer updateMaterialAndPlace(MaterialAndPlace mp); Integer updateMaterialAndPlace(MaterialAndPlace mp);
/**
* 获取库位对应的二维码
* @param pid
* @return
*/
String findQrCodeByPlace(Integer pid);
/**
* 用于添加库位与二维码的对应关系
* @param map
* @return
*/
Integer addQrCodeByPlace(Map<String,Object> map);
/**
* 根据二维码的值获取对应位置
*/
PidOrDidAndCode findLocationByQrCode(String qrCode);
} }

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

@ -89,21 +89,21 @@ public interface StockTakingService {
* @param map * @param map
* @return * @return
*/ */
Map<String,Object> review(Map<String,Object> map, UserByPort userToken); Map<String,Object> review(Map<String,Object> map, UserByPort userToken,String userAgent);
/** /**
* 用于进行盘点结果转移 * 用于进行盘点结果转移
* @param map * @param map
* @return * @return
*/ */
Integer stockTakingTransfer(Map<String,Object> map,UserByPort userToken); Integer stockTakingTransfer(Map<String,Object> map,UserByPort userToken,String userAgent);
/** /**
* 用于企业微信的审核申请处理 * 用于企业微信的审核申请处理
* @param templateCard * @param templateCard
* @return * @return
*/ */
Map<String,Object> reviewByQyWx(TemplateCard templateCard); Map<String,Object> reviewByQyWx(TemplateCard templateCard,String userAgent);
/** /**
@ -112,14 +112,14 @@ public interface StockTakingService {
* @param userToken * @param userToken
* @return * @return
*/ */
Map<String,Object> completeStockTaking(Map<String,Object> map, UserByPort userToken); Map<String,Object> completeStockTaking(Map<String,Object> map, UserByPort userToken,String userAgent);
/** /**
* 用于企业微信的审核申请处理 * 用于企业微信的审核申请处理
* @param templateCard * @param templateCard
* @return * @return
*/ */
Integer completeStockTakingByQyWx(TemplateCard templateCard); Integer completeStockTakingByQyWx(TemplateCard templateCard,String userAgent);
} }

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

@ -422,7 +422,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
*/ */
@Transactional @Transactional
@Override @Override
public RestResponse completeApplicationOutMinRecord(Map<String, Object> param, UserByPort userByPort) { public RestResponse completeApplicationOutMinRecord(Map<String, Object> param, UserByPort userByPort,String userAgent) {
// 最终返回值 // 最终返回值
RestResponse restResponse = new RestResponse(); RestResponse restResponse = new RestResponse();
@ -612,7 +612,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
// depositoryManagerByQyWx.append(depositoryManager.getWorkwechat()+","); // depositoryManagerByQyWx.append(depositoryManager.getWorkwechat()+",");
} }
depositoryManagerByQyWx.append("PangFuZhen,"); depositoryManagerByQyWx.append("PangFuZhen,");
JSONObject jsonObject = qyWxOperationService.sendCcMessageToUsers(depositoryManagerByQyWx.toString(), record.getId()); JSONObject jsonObject = qyWxOperationService.sendCcMessageToUsers(depositoryManagerByQyWx.toString(), record.getId(),userAgent);
// 删除redis中本订单 // 删除redis中本订单
redisTemplate.delete("record:" + record.getId()); redisTemplate.delete("record:" + record.getId());
@ -701,7 +701,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
*/ */
@Override @Override
@Transactional @Transactional
public Integer review(Map<String, Object> map, Integer userid, UserByPort userToken) { public Integer review(Map<String, Object> map, Integer userid, UserByPort userToken,String userAgent) {
ApplicationOutRecordP record = depositoryRecordMapper.findApplicationOutRecordPById(ObjectFormatUtil.toInteger(map.get("id"))); ApplicationOutRecordP record = depositoryRecordMapper.findApplicationOutRecordPById(ObjectFormatUtil.toInteger(map.get("id")));
Object id = map.get("id"); // 主订单编号 Object id = map.get("id"); // 主订单编号
map.remove("id"); map.remove("id");
@ -730,7 +730,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(id), false); JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(id), false,userAgent);
// 将当前返回结果保存到redis中 // 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>(); Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -758,7 +758,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
UserByPort applicantUser = PageController.FindUserById(record.getApplicantId(), userToken); 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"); String responseCode = (String) redisTemplate.opsForHash().get(key, "responseCode");
qyWxOperationService.updateTemplateCard(responseCode,userToken.getName(), finalResult); qyWxOperationService.updateTemplateCard(responseCode,userToken.getName(), finalResult,userAgent);
} }
}).start(); }).start();
} else { } else {
@ -826,7 +826,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
JSONObject jsonObject = qyWxOperationService.sendNotificationToDepositoryManager(QyWxUid.toString(), applicationOutRecordMin.getId()); JSONObject jsonObject = qyWxOperationService.sendNotificationToDepositoryManager(QyWxUid.toString(), applicationOutRecordMin.getId(),userAgent);
} }
}).start(); }).start();
} }
@ -849,7 +849,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
UserByPort departHead = PageController.FindUserById(ObjectFormatUtil.toInteger(record.getDepartmenthead()), userToken); 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"); String responseCode = (String) redisTemplate.opsForHash().get(key, "responseCode");
qyWxOperationService.updateTemplateCard(responseCode,userToken.getName(), finalResult); qyWxOperationService.updateTemplateCard(responseCode,userToken.getName(), finalResult,userAgent);
} }
}).start(); }).start();
} }
@ -864,7 +864,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
* @return * @return
*/ */
@Override @Override
public Integer reviewByQyWx(TemplateCard templateCard ) { public Integer reviewByQyWx(TemplateCard templateCard ,String userAgent) {
// 用于更新订单 // 用于更新订单
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
// 点击用户 // 点击用户
@ -909,7 +909,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
QyWxUid.append("PangFuZhen"+","); QyWxUid.append("PangFuZhen"+",");
map.put("depositoryManager", depositoryManager.toString()); map.put("depositoryManager", depositoryManager.toString());
// 向仓储中心负责人发送新的消息 // 向仓储中心负责人发送新的消息
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(outId), false); JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(outId), false,userAgent);
// 将当前返回结果保存到redis中 // 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>(); Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -987,7 +987,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
JSONObject jsonObject = qyWxOperationService.sendNotificationToDepositoryManager(QyWxUid.toString(), applicationOutRecordMin.getId()); JSONObject jsonObject = qyWxOperationService.sendNotificationToDepositoryManager(QyWxUid.toString(), applicationOutRecordMin.getId(),userAgent);
} }
}).start(); }).start();
} }

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

@ -4,6 +4,7 @@ import com.dreamchaser.depository_manage.controller.PageController;
import com.dreamchaser.depository_manage.entity.*; import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.mapper.DepositoryMapper; import com.dreamchaser.depository_manage.mapper.DepositoryMapper;
import com.dreamchaser.depository_manage.mapper.PlaceMapper; import com.dreamchaser.depository_manage.mapper.PlaceMapper;
import com.dreamchaser.depository_manage.mapper.QrCodeMapper;
import com.dreamchaser.depository_manage.mapper.RoleMapper; import com.dreamchaser.depository_manage.mapper.RoleMapper;
import com.dreamchaser.depository_manage.pojo.RoleAndDepository; import com.dreamchaser.depository_manage.pojo.RoleAndDepository;
import com.dreamchaser.depository_manage.service.DepositoryService; import com.dreamchaser.depository_manage.service.DepositoryService;
@ -29,6 +30,9 @@ public class DepositoryServiceImpl implements DepositoryService {
@Autowired @Autowired
PlaceMapper placeMapper; PlaceMapper placeMapper;
@Autowired
QrCodeMapper qrCodeMapper;
/** /**
* 根据条件插入数据 * 根据条件插入数据
* *
@ -491,6 +495,32 @@ public class DepositoryServiceImpl implements DepositoryService {
return depositoryList; return depositoryList;
} }
/**
* 获取仓库对应的二维码
* @param did
* @return
*/
@Override
public String findQrCodeByDepository(Integer did) {
Map<String,Object> map = new HashMap<>();
// 1为库位2为仓库
map.put("flag",2);
map.put("depositoryId",did);
return qrCodeMapper.selectQrCodeByDepositoryOrPlace(map);
}
/**
* 用于添加仓库与二维码的对应关系
* @param map
* @return
*/
@Override
public Integer addQrCodeByDepository(Map<String, Object> map) {
// 1为库位2为仓库
map.put("flag",2);
return qrCodeMapper.addQrCodeByPidOrDid(map);
}
//判断是否有子类 //判断是否有子类
public boolean isChildForDepository(Integer parentId) { public boolean isChildForDepository(Integer parentId) {
boolean flag = false; boolean flag = false;

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

@ -4,6 +4,7 @@ import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.mapper.DepositoryMapper; import com.dreamchaser.depository_manage.mapper.DepositoryMapper;
import com.dreamchaser.depository_manage.mapper.MaterialMapper; import com.dreamchaser.depository_manage.mapper.MaterialMapper;
import com.dreamchaser.depository_manage.mapper.MaterialTypeMapper; import com.dreamchaser.depository_manage.mapper.MaterialTypeMapper;
import com.dreamchaser.depository_manage.mapper.QrCodeMapper;
import com.dreamchaser.depository_manage.pojo.MaterialP; import com.dreamchaser.depository_manage.pojo.MaterialP;
import com.dreamchaser.depository_manage.pojo.PlaceP; import com.dreamchaser.depository_manage.pojo.PlaceP;
import com.dreamchaser.depository_manage.service.MaterialService; import com.dreamchaser.depository_manage.service.MaterialService;
@ -38,6 +39,8 @@ public class MaterialServiceImpl implements MaterialService {
@Autowired @Autowired
PlaceService placeService; PlaceService placeService;
@Autowired
QrCodeMapper qrCodeMapper;
/** /**
* 增加一条库存记录 * 增加一条库存记录
* *
@ -578,6 +581,34 @@ public class MaterialServiceImpl implements MaterialService {
return materialMapper.deleteBarCodeAndMaterial(map); return materialMapper.deleteBarCodeAndMaterial(map);
} }
/**
* 用于添加二维码与物料的对应关系
*/
@Override
public Integer addQrCodeByMaterial(Map<String, Object> map) {
return qrCodeMapper.addQrCodeAndMaterial(map);
}
/**
* 根据物料编码获取与二维码的对应关系
* @param Mcode
* @return
*/
@Override
public String findQrCodeByMcode(String Mcode) {
return qrCodeMapper.selectQrCodeByMcode(Mcode);
}
/**
* 根据二维码获取对应的物料编码
* @param qrCode
* @return
*/
@Override
public String findMaterialCodeByQrCode(String qrCode) {
return qrCodeMapper.findMaterialCodeByQrCode(qrCode);
}
/** /**
* 构造树形选择框 * 构造树形选择框
* @return * @return

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

@ -2,8 +2,10 @@ package com.dreamchaser.depository_manage.service.impl;
import com.dreamchaser.depository_manage.entity.Depository; import com.dreamchaser.depository_manage.entity.Depository;
import com.dreamchaser.depository_manage.entity.MaterialAndPlace; import com.dreamchaser.depository_manage.entity.MaterialAndPlace;
import com.dreamchaser.depository_manage.entity.PidOrDidAndCode;
import com.dreamchaser.depository_manage.entity.Place; import com.dreamchaser.depository_manage.entity.Place;
import com.dreamchaser.depository_manage.mapper.PlaceMapper; import com.dreamchaser.depository_manage.mapper.PlaceMapper;
import com.dreamchaser.depository_manage.mapper.QrCodeMapper;
import com.dreamchaser.depository_manage.pojo.PlaceP; import com.dreamchaser.depository_manage.pojo.PlaceP;
import com.dreamchaser.depository_manage.service.DepositoryService; import com.dreamchaser.depository_manage.service.DepositoryService;
import com.dreamchaser.depository_manage.service.PlaceService; import com.dreamchaser.depository_manage.service.PlaceService;
@ -25,6 +27,9 @@ public class PlaceServiceImpl implements PlaceService {
@Autowired @Autowired
DepositoryService depositoryService; DepositoryService depositoryService;
@Autowired
QrCodeMapper qrCodeMapper;
/** /**
* 查找所有库位 * 查找所有库位
* @return * @return
@ -248,5 +253,45 @@ public class PlaceServiceImpl implements PlaceService {
return placeMapper.updateMaterialAndPlace(mp); return placeMapper.updateMaterialAndPlace(mp);
} }
/**
* 获取库位对应的二维码
* @param pid
* @return
*/
@Override
public String findQrCodeByPlace(Integer pid) {
Map<String,Object> map = new HashMap<>();
// 1为库位2为仓库
map.put("flag",1);
map.put("pid",pid);
return qrCodeMapper.selectQrCodeByDepositoryOrPlace(map);
}
/**
* 用于添加库位与二维码的对应关系
* @param map
* @return
*/
@Override
public Integer addQrCodeByPlace(Map<String, Object> map) {
// 1为库位2为仓库
map.put("flag",1);
return qrCodeMapper.addQrCodeByPidOrDid(map);
}
/**
* 根据二维码的值获取对应位置
*/
@Override
public PidOrDidAndCode findLocationByQrCode(String qrCode) {
Map<String,Object> map = new HashMap<>();
map.put("qrCode",qrCode);
List<PidOrDidAndCode> locationByCondition = qrCodeMapper.findLocationByCondition(map);
if(locationByCondition.size()>0){
return locationByCondition.get(0);
}
return null;
}
} }

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

@ -53,7 +53,7 @@ public class QyWxOperationService {
* @param flag 用于判断发送类型是部门负责人还是仓储负责人(true为部门false为仓储) * @param flag 用于判断发送类型是部门负责人还是仓储负责人(true为部门false为仓储)
* @return * @return
*/ */
public JSONObject sendQyWxToApplicationOutMessage(String uid, Integer outId, Boolean flag) { public JSONObject sendQyWxToApplicationOutMessage(String uid, Integer outId, Boolean flag,String userAgent) {
// 获取将要发送申请的订单记录 // 获取将要发送申请的订单记录
ApplicationOutRecordP applicationOutRecordPById = depositoryRecordMapper.findApplicationOutRecordPById(outId); ApplicationOutRecordP applicationOutRecordPById = depositoryRecordMapper.findApplicationOutRecordPById(outId);
@ -80,7 +80,7 @@ public class QyWxOperationService {
} }
// 1.获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url // 1.获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url
String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token; String accessToken = QyWxConfig.GetQYWXToken(userAgent);
// 2.获取发送对象,并转成json // 2.获取发送对象,并转成json
ButtonInteraction buttonInteraction = new ButtonInteraction(); ButtonInteraction buttonInteraction = new ButtonInteraction();
// 1.1非必需 // 1.1非必需
@ -244,7 +244,7 @@ public class QyWxOperationService {
* @param mainId 盘点记录编号 * @param mainId 盘点记录编号
* @return * @return
*/ */
public JSONObject sendQyWxToStockTakingDepartmentManagerMessage(String uid, Integer mainId){ public JSONObject sendQyWxToStockTakingDepartmentManagerMessage(String uid, Integer mainId,String userAgent){
// 获取盘点主记录 // 获取盘点主记录
StockTaking mainRecord = stockTakingMapper.selectStockTakingById(mainId); StockTaking mainRecord = stockTakingMapper.selectStockTakingById(mainId);
@ -308,7 +308,7 @@ public class QyWxOperationService {
} }
// 1.获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url // 1.获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url
String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token; String accessToken = QyWxConfig.GetQYWXToken(userAgent);
// 2.获取发送对象,并转成json // 2.获取发送对象,并转成json
ButtonInteraction buttonInteraction = new ButtonInteraction(); ButtonInteraction buttonInteraction = new ButtonInteraction();
// 1.1非必需 // 1.1非必需
@ -490,7 +490,7 @@ public class QyWxOperationService {
* @param mainId 盘点记录编号 * @param mainId 盘点记录编号
* @return * @return
*/ */
public JSONObject sendQyWxToStockTakingMessage(String uid, Integer mainId,List<Long> normalMinId){ public JSONObject sendQyWxToStockTakingMessage(String uid, Integer mainId,List<Long> normalMinId,String userAgent){
// 获取盘点主记录 // 获取盘点主记录
StockTaking mainRecord = stockTakingMapper.selectStockTakingById(mainId); StockTaking mainRecord = stockTakingMapper.selectStockTakingById(mainId);
@ -558,7 +558,7 @@ public class QyWxOperationService {
} }
// 1.获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url // 1.获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url
String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token; String accessToken = QyWxConfig.GetQYWXToken(userAgent);
// 2.获取发送对象,并转成json // 2.获取发送对象,并转成json
ButtonInteraction buttonInteraction = new ButtonInteraction(); ButtonInteraction buttonInteraction = new ButtonInteraction();
// 1.1非必需 // 1.1非必需
@ -733,7 +733,7 @@ public class QyWxOperationService {
* @param outId 订单编号 * @param outId 订单编号
* @return * @return
*/ */
public JSONObject sendCcMessageToUsers(String uid, Integer outId) { public JSONObject sendCcMessageToUsers(String uid, Integer outId,String userAgent) {
// 获取已经完成的订单 // 获取已经完成的订单
ApplicationOutRecordP recordP = depositoryRecordMapper.findApplicationOutRecordPById(outId); ApplicationOutRecordP recordP = depositoryRecordMapper.findApplicationOutRecordPById(outId);
// 申请人id // 申请人id
@ -788,7 +788,7 @@ public class QyWxOperationService {
System.out.println(jsonString); System.out.println(jsonString);
// 3.获取请求的url // 3.获取请求的url
// 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url // 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url
String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token; String accessToken = QyWxConfig.GetQYWXToken(userAgent);
String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken); String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken);
// 4.调用接口,发送消息 // 4.调用接口,发送消息
@ -809,7 +809,7 @@ public class QyWxOperationService {
* @param map * @param map
* @return * @return
*/ */
public JSONObject sendCcStockTakingMessageToHead(String uid, Map<String, Object> map, UserByPort userToken, StockTaking mainRecord) { public JSONObject sendCcStockTakingMessageToHead(String uid, Map<String, Object> map, UserByPort userToken, StockTaking mainRecord,String userAgent) {
/** /**
* 获取完成的订单 * 获取完成的订单
@ -898,7 +898,7 @@ public class QyWxOperationService {
System.out.println(jsonString); System.out.println(jsonString);
// 3.获取请求的url // 3.获取请求的url
// 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url // 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url
String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token; String accessToken =QyWxConfig.GetQYWXToken(userAgent);
String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken); String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken);
// 4.调用接口,发送消息 // 4.调用接口,发送消息
@ -918,7 +918,7 @@ public class QyWxOperationService {
* @param mainRecord 主订单 * @param mainRecord 主订单
* @return * @return
*/ */
public JSONObject sendStockTakingErrMessageToHead(String uid,List<Long> errIds,StockTaking mainRecord,UserByPort userToken){ public JSONObject sendStockTakingErrMessageToHead(String uid,List<Long> errIds,StockTaking mainRecord,UserByPort userToken,String userAgent){
MessageByMarkDown markDown = new MessageByMarkDown(); MessageByMarkDown markDown = new MessageByMarkDown();
//设置消息接收者 //设置消息接收者
@ -992,7 +992,7 @@ public class QyWxOperationService {
System.out.println(jsonString); System.out.println(jsonString);
// 3.获取请求的url // 3.获取请求的url
// 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url // 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url
String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token; String accessToken = QyWxConfig.GetQYWXToken(userAgent) ;
String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken); String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken);
// 4.调用接口,发送消息 // 4.调用接口,发送消息
@ -1011,7 +1011,7 @@ public class QyWxOperationService {
* @param map * @param map
* @return * @return
*/ */
public JSONObject sendCcStockTakingTransferMessageToHead(String uid, Map<String, Object> map, UserByPort userToken, StockTaking mainRecord){ public JSONObject sendCcStockTakingTransferMessageToHead(String uid, Map<String, Object> map, UserByPort userToken, StockTaking mainRecord,String userAgent){
/** /**
* 获取要转移的订单 * 获取要转移的订单
@ -1128,7 +1128,7 @@ public class QyWxOperationService {
System.out.println(jsonString); System.out.println(jsonString);
// 3.获取请求的url // 3.获取请求的url
// 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url // 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url
String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token; String accessToken = QyWxConfig.GetQYWXToken(userAgent) ;
String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken); String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken);
// 4.调用接口,发送消息 // 4.调用接口,发送消息
@ -1148,7 +1148,7 @@ public class QyWxOperationService {
* @param outMinId * @param outMinId
* @return * @return
*/ */
public JSONObject sendNotificationToDepositoryManager(String uid, Integer outMinId) { public JSONObject sendNotificationToDepositoryManager(String uid, Integer outMinId,String userAgent) {
// 需要出库的子订单 // 需要出库的子订单
ApplicationOutRecordMin recordMin = depositoryRecordMapper.findApplicationOutMinById(outMinId); ApplicationOutRecordMin recordMin = depositoryRecordMapper.findApplicationOutMinById(outMinId);
// 获取其主订单 // 获取其主订单
@ -1253,7 +1253,7 @@ public class QyWxOperationService {
// 卡片整体点击事件 // 卡片整体点击事件
TemplateCard_card_action card_action = new TemplateCard_card_action(); TemplateCard_card_action card_action = new TemplateCard_card_action();
card_action.setType(1); card_action.setType(1);
card_action.setUrl("https://jy.hxgk.group/ApplicationOutMinByDidForMobile?depositoryId=" + depositoryRecordById.getId() + "&state=0"); card_action.setUrl("https://jy.hxgk.group/");
text_notice.setCard_action(card_action); text_notice.setCard_action(card_action);
//跳转指引样式的列表 //跳转指引样式的列表
@ -1271,7 +1271,7 @@ public class QyWxOperationService {
// 3.获取请求的url // 3.获取请求的url
// 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url // 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url
String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token; String accessToken = QyWxConfig.GetQYWXToken(userAgent);
String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken); String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken);
// 4.调用接口,发送消息 // 4.调用接口,发送消息
@ -1290,8 +1290,8 @@ public class QyWxOperationService {
* @param msgid 待撤回消息的id * @param msgid 待撤回消息的id
* @return * @return
*/ */
public String withdrawQyWxMessage(String msgid) { public String withdrawQyWxMessage(String msgid,String userAgent) {
String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/message/recall?access_token=%s", QyWxConfig.token); String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/message/recall?access_token=%s", QyWxConfig.GetQYWXToken(userAgent));
Map<String, Object> param = new HashMap<>(); Map<String, Object> param = new HashMap<>();
param.put("msgid", msgid); param.put("msgid", msgid);
String jsonString = JSONObject.toJSONString(param); String jsonString = JSONObject.toJSONString(param);
@ -1314,8 +1314,8 @@ public class QyWxOperationService {
* @param response_code * @param response_code
* @return * @return
*/ */
public JSONObject updateTemplateCard(String response_code, String userName, String state) { public JSONObject updateTemplateCard(String response_code, String userName, String state,String userAgent) {
String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/message/update_template_card?access_token=" + QyWxConfig.token + "&debug=1"); String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/message/update_template_card?access_token=" + QyWxConfig.GetQYWXToken(userAgent) + "&debug=1");
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("atall", 1); map.put("atall", 1);
map.put("agentid", QyWxConfig.AgentId); map.put("agentid", QyWxConfig.AgentId);

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

@ -275,7 +275,7 @@ public class StockTakingServiceImpl implements StockTakingService {
*/ */
@Transactional @Transactional
@Override @Override
public Map<String, Object> review(Map<String, Object> map, UserByPort userToken) { public Map<String, Object> review(Map<String, Object> map, UserByPort userToken,String userAgent) {
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
@ -446,7 +446,7 @@ public class StockTakingServiceImpl implements StockTakingService {
// 获取盘点人员 // 获取盘点人员
UserByPort originator = PageController.FindUserById(mainRecord.getOriginator(), userToken); UserByPort originator = PageController.FindUserById(mainRecord.getOriginator(), userToken);
String workwechat = originator.getWorkwechat(); String workwechat = originator.getWorkwechat();
JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage("PangFuZhen,", mainId,normalMinId); JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage("PangFuZhen,", mainId,normalMinId,userAgent);
// JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage(workwechat, mainId,normalMinId); // JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage(workwechat, mainId,normalMinId);
// 将当前返回结果保存到redis中 // 将当前返回结果保存到redis中
if(jsonObject!=null) { if(jsonObject!=null) {
@ -483,7 +483,7 @@ public class StockTakingServiceImpl implements StockTakingService {
UserByPort userByPort = PageController.FindUserById(originator, userToken); UserByPort userByPort = PageController.FindUserById(originator, userToken);
String key = "user:" + userByPort.getNumber() + ":QyWxStockTakingId:" + mainId; String key = "user:" + userByPort.getNumber() + ":QyWxStockTakingId:" + mainId;
String responseCode = (String) redisTemplate.opsForHash().get(key, "responseCode"); String responseCode = (String) redisTemplate.opsForHash().get(key, "responseCode");
qyWxOperationService.updateTemplateCard(responseCode, userToken.getName(), finalStockTakingResult); qyWxOperationService.updateTemplateCard(responseCode, userToken.getName(), finalStockTakingResult,userAgent);
} }
}).start(); }).start();
@ -504,7 +504,7 @@ public class StockTakingServiceImpl implements StockTakingService {
*/ */
@Transactional @Transactional
@Override @Override
public Map<String, Object> completeStockTaking(Map<String, Object> map, UserByPort userToken) { public Map<String, Object> completeStockTaking(Map<String, Object> map, UserByPort userToken,String userAgent) {
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
@ -691,7 +691,7 @@ public class StockTakingServiceImpl implements StockTakingService {
public void run() { public void run() {
String s = QyWxUid.toString(); String s = QyWxUid.toString();
s= "PangFuZhen,"; s= "PangFuZhen,";
JSONObject jsonObject = qyWxOperationService.sendCcStockTakingMessageToHead(s, map, userToken, finalMainRecord); JSONObject jsonObject = qyWxOperationService.sendCcStockTakingMessageToHead(s, map, userToken, finalMainRecord,userAgent);
} }
}).start(); }).start();
@ -705,7 +705,7 @@ public class StockTakingServiceImpl implements StockTakingService {
//获取申请人信息 //获取申请人信息
String key = "user:" + userByPort.getNumber() + ":QyWxStockTakingCompleteId:" + mainId; String key = "user:" + userByPort.getNumber() + ":QyWxStockTakingCompleteId:" + mainId;
String responseCode = (String) redisTemplate.opsForHash().get(key, "responseCode"); String responseCode = (String) redisTemplate.opsForHash().get(key, "responseCode");
qyWxOperationService.updateTemplateCard(responseCode, userToken.getName(), "处理"); qyWxOperationService.updateTemplateCard(responseCode, userToken.getName(), "处理",userAgent);
} }
}).start(); }).start();
@ -721,7 +721,7 @@ public class StockTakingServiceImpl implements StockTakingService {
*/ */
@Transactional @Transactional
@Override @Override
public Integer completeStockTakingByQyWx(TemplateCard templateCard) { public Integer completeStockTakingByQyWx(TemplateCard templateCard,String userAgent) {
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
@ -916,7 +916,7 @@ public class StockTakingServiceImpl implements StockTakingService {
} }
String s = QyWxUid.toString(); String s = QyWxUid.toString();
s= "PangFuZhen,"; s= "PangFuZhen,";
JSONObject jsonObject = qyWxOperationService.sendCcStockTakingMessageToHead(s, map, null, finalMainRecord); JSONObject jsonObject = qyWxOperationService.sendCcStockTakingMessageToHead(s, map, null, finalMainRecord,userAgent);
} }
}).start(); }).start();
@ -931,7 +931,7 @@ public class StockTakingServiceImpl implements StockTakingService {
*/ */
@Transactional @Transactional
@Override @Override
public Integer stockTakingTransfer(Map<String, Object> map, UserByPort userToken) { public Integer stockTakingTransfer(Map<String, Object> map, UserByPort userToken,String userAgent) {
List<Integer> minIds = (List<Integer>) map.get("minIds"); List<Integer> minIds = (List<Integer>) map.get("minIds");
List<Long> minRecorIds = new ArrayList<>(); List<Long> minRecorIds = new ArrayList<>();
Integer res = 0; Integer res = 0;
@ -1119,7 +1119,7 @@ public class StockTakingServiceImpl implements StockTakingService {
UserByPort userByPort = PageController.FindUserById(ObjectFormatUtil.toInteger(originator), userToken); UserByPort userByPort = PageController.FindUserById(ObjectFormatUtil.toInteger(originator), userToken);
// departMentHeadQyWxName.append(userByPort.getWorkwechat()+","); // departMentHeadQyWxName.append(userByPort.getWorkwechat()+",");
departMentHeadQyWxName.append("PangFuZhen,"); departMentHeadQyWxName.append("PangFuZhen,");
JSONObject jsonObject = qyWxOperationService.sendCcStockTakingTransferMessageToHead(departMentHeadQyWxName.toString(), map, userToken, finalMainRecord); JSONObject jsonObject = qyWxOperationService.sendCcStockTakingTransferMessageToHead(departMentHeadQyWxName.toString(), map, userToken, finalMainRecord,userAgent);
} }
}).start(); }).start();
@ -1143,7 +1143,7 @@ public class StockTakingServiceImpl implements StockTakingService {
*/ */
@Transactional @Transactional
@Override @Override
public Map<String, Object> reviewByQyWx(TemplateCard templateCard) { public Map<String, Object> reviewByQyWx(TemplateCard templateCard,String userAgent) {
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
@ -1317,7 +1317,7 @@ public class StockTakingServiceImpl implements StockTakingService {
// 获取盘点人员 // 获取盘点人员
UserByPort originator = PageController.FindUserById(mainRecord.getOriginator(), null); UserByPort originator = PageController.FindUserById(mainRecord.getOriginator(), null);
// String workwechat = originator.getWorkwechat(); // String workwechat = originator.getWorkwechat();
JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage("PangFuZhen,", mainId, normalMinIds); JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage("PangFuZhen,", mainId, normalMinIds,userAgent);
// JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage(workwechat, mainId, normalMinIds); // JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage(workwechat, mainId, normalMinIds);
if(jsonObject!=null){ if(jsonObject!=null){
// 将当前返回结果保存到redis中 // 将当前返回结果保存到redis中
@ -1341,7 +1341,7 @@ public class StockTakingServiceImpl implements StockTakingService {
// 获取盘点人员 // 获取盘点人员
UserByPort originator = PageController.FindUserById(mainRecord.getOriginator(), null); UserByPort originator = PageController.FindUserById(mainRecord.getOriginator(), null);
// String workwechat = originator.getWorkwechat(); // String workwechat = originator.getWorkwechat();
qyWxOperationService.sendStockTakingErrMessageToHead("PangFuZhen,", errIds, mainRecord,null); qyWxOperationService.sendStockTakingErrMessageToHead("PangFuZhen,", errIds, mainRecord,null,userAgent);
// qyWxOperationService.sendStockTakingErrMessageToHead(workwechat, errIds, mainRecord,null); // qyWxOperationService.sendStockTakingErrMessageToHead(workwechat, errIds, mainRecord,null);
} }
}).start(); }).start();

111
src/main/resources/templates/index.html

@ -5,7 +5,8 @@
<meta charset="utf-8"> <meta charset="utf-8">
<title>仓库管理系统</title> <title>仓库管理系统</title>
<meta name="keywords" content="layuimini,layui,layui模板,layui后台,后台模板,admin,admin模板,layui mini"> <meta name="keywords" content="layuimini,layui,layui模板,layui后台,后台模板,admin,admin模板,layui mini">
<meta name="description" content="layuimini基于layui的轻量级前端后台管理框架,最简洁、易用的后台框架模板,面向所有层次的前后端程序,只需提供一个接口就直接初始化整个框架,无需复杂操作。"> <meta name="description"
content="layuimini基于layui的轻量级前端后台管理框架,最简洁、易用的后台框架模板,面向所有层次的前后端程序,只需提供一个接口就直接初始化整个框架,无需复杂操作。">
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
@ -23,7 +24,7 @@
<![endif]--> <![endif]-->
<!-- vue相关--> <!-- vue相关-->
<script src="../static/js/vue/vue.js"></script> <script src="../static/js/vue/vue.js"></script>
<script src="../static/js/vue/vue.min.js"></script> <script src="../static/js/vue/vue.min.js"></script>
<script src="../static/js/vue/vue-router.js"></script> <script src="../static/js/vue/vue-router.js"></script>
@ -49,7 +50,7 @@
<!--手机端头部菜单--> <!--手机端头部菜单-->
<ul class="layui-nav layui-layout-left layuimini-header-menu layuimini-mobile-show"> <ul class="layui-nav layui-layout-left layuimini-header-menu layuimini-mobile-show">
<li class="layui-nav-item"> <li class="layui-nav-item">
<a href="javascript:;"><i class="fa fa-list-ul"></i> 选择模块</a> <a href="javascript:"><i class="fa fa-list-ul"></i> 选择模块</a>
<dl class="layui-nav-child layuimini-menu-header-mobile"> <dl class="layui-nav-child layuimini-menu-header-mobile">
</dl> </dl>
</li> </li>
@ -59,37 +60,39 @@
<li class="layui-nav-item" lay-unselect> <li class="layui-nav-item" lay-unselect>
<a href="javascript:;" id="scan"><i class="fa fa-square-o" aria-hidden="true"></i></a> <a href="javascript:" id="scan"><i class="fa fa-square-o" aria-hidden="true"></i></a>
</li> </li>
<li class="layui-nav-item" lay-unselect> <li class="layui-nav-item" lay-unselect>
<a href="javascript:;" data-refresh="刷新"><i class="fa fa-refresh"></i></a> <a href="javascript:" data-refresh="刷新"><i class="fa fa-refresh"></i></a>
</li> </li>
<li class="layui-nav-item" lay-unselect> <li class="layui-nav-item" lay-unselect>
<a href="javascript:;" data-clear="清理" class="layuimini-clear"><i class="fa fa-trash-o"></i></a> <a href="javascript:" data-clear="清理" class="layuimini-clear"><i class="fa fa-trash-o"></i></a>
</li> </li>
<li class="layui-nav-item mobile layui-hide-xs" lay-unselect> <li class="layui-nav-item mobile layui-hide-xs" lay-unselect>
<a href="javascript:;" data-check-screen="full"><i class="fa fa-arrows-alt"></i></a> <a href="javascript:" data-check-screen="full"><i class="fa fa-arrows-alt"></i></a>
</li> </li>
<li class="layui-nav-item layuimini-setting"> <li class="layui-nav-item layuimini-setting">
<a href="javascript:;" th:text="${user.getName()}"></a> <a href="javascript:" th:text="${user.getName()}"></a>
<div id="uid" th:text="${user.getId()}" style="display: none"></div> <div id="uid" th:text="${user.getId()}" style="display: none"></div>
<dl class="layui-nav-child"> <dl class="layui-nav-child">
<dd> <dd>
<a href="javascript:;" layuimini-content-href="/account_look" data-title="基本资料" data-icon="fa fa-gears">基本资料<span class="layui-badge-dot"></span></a> <a href="javascript:" layuimini-content-href="/account_look" data-title="基本资料"
data-icon="fa fa-gears">基本资料<span class="layui-badge-dot"></span></a>
</dd> </dd>
<dd style="display: none"> <dd style="display: none">
<a href="javascript:;" layuimini-content-href="/user_password" data-title="修改密码" data-icon="fa fa-gears">修改密码</a> <a href="javascript:" layuimini-content-href="/user_password" data-title="修改密码"
data-icon="fa fa-gears">修改密码</a>
</dd> </dd>
<dd> <dd>
<hr> <hr>
</dd> </dd>
<dd> <dd>
<a href="javascript:;" class="login-out">退出登录</a> <a href="javascript:" class="login-out">退出登录</a>
</dd> </dd>
</dl> </dl>
</li> </li>
<li class="layui-nav-item layuimini-select-bgcolor" lay-unselect> <li class="layui-nav-item layuimini-select-bgcolor" lay-unselect>
<a href="javascript:;" data-bgcolor="配色方案"><i class="fa fa-ellipsis-v"></i></a> <a href="javascript:" data-bgcolor="配色方案"><i class="fa fa-ellipsis-v"></i></a>
</li> </li>
</ul> </ul>
</div> </div>
@ -122,11 +125,11 @@
<li class="layui-tab-tool layui-icon layui-icon-down"> <li class="layui-tab-tool layui-icon layui-icon-down">
<ul class="layui-nav close-box"> <ul class="layui-nav close-box">
<li class="layui-nav-item"> <li class="layui-nav-item">
<a href="javascript:;"><span class="layui-nav-more"></span></a> <a href="javascript:"><span class="layui-nav-more"></span></a>
<dl class="layui-nav-child"> <dl class="layui-nav-child">
<dd><a href="javascript:;" layuimini-tab-close="current">关 闭 当 前</a></dd> <dd><a href="javascript:" layuimini-tab-close="current">关 闭 当 前</a></dd>
<dd><a href="javascript:;" layuimini-tab-close="other">关 闭 其 他</a></dd> <dd><a href="javascript:" layuimini-tab-close="other">关 闭 其 他</a></dd>
<dd><a href="javascript:;" layuimini-tab-close="all">关 闭 全 部</a></dd> <dd><a href="javascript:" layuimini-tab-close="all">关 闭 全 部</a></dd>
</dl> </dl>
</li> </li>
</ul> </ul>
@ -142,14 +145,18 @@
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script> <script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script src="/static/js/lay-config.js?v=2.0.0" charset="utf-8"></script> <script src="/static/js/lay-config.js?v=2.0.0" charset="utf-8"></script>
<script src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"></script>
<script> <script>
layui.use(['jquery', 'layer', 'miniAdmin','miniTongji'], function () {
layui.use(['jquery', 'layer', 'miniAdmin'], function () {
var $ = layui.jquery, var $ = layui.jquery,
layer = layui.layer, layer = layui.layer,
miniAdmin = layui.miniAdmin, miniAdmin = layui.miniAdmin;
miniTongji = layui.miniTongji;
var uid = $("#uid").text(); var uid = $("#uid").text();
var options = { var options = {
clearUrl: "/static/api/clear.json", // 缓存清理接口 clearUrl: "/static/api/clear.json", // 缓存清理接口
@ -161,11 +168,11 @@
pageAnim: true, // iframe窗口动画 pageAnim: true, // iframe窗口动画
maxTabNum: 20, // 最大的tab打开数量 maxTabNum: 20, // 最大的tab打开数量
}; };
options.iniUrl= "/index/menus?uid="+uid; // 初始化接口 options.iniUrl = "/index/menus?uid=" + uid; // 初始化接口
miniAdmin.render(options); miniAdmin.render(options);
$("#scan").on("click",function () { $("#scan").on("click", function () {
layer.open({ layer.open({
type: 2, type: 2,
title: '扫码', title: '扫码',
@ -173,41 +180,55 @@
maxmin: true, maxmin: true,
shadeClose: true, //点击遮罩关闭层 shadeClose: true, //点击遮罩关闭层
area: ['100%', '100%'], area: ['100%', '100%'],
move : '.layui-layer-title', move: '.layui-layer-title',
fixed:false, fixed: false,
content: '/scanQrCode' content: '/scanQrCode'
}) })
}); });
// 百度统计代码,只统计指定域名
miniTongji.render({
specific: true,
domains: [
'99php.cn',
'layuimini.99php.cn',
'layuimini-onepage.99php.cn',
],
});
$('.login-out').on("click", function () { $('.login-out').on("click", function () {
$.ajax({ $.ajax({
url:"/loginOut", url: "/loginOut",
type: 'get', type: 'get',
dataType: 'json', dataType: 'json',
contentType: "application/json;charset=utf-8", contentType: "application/json;charset=utf-8",
beforeSend: function () { beforeSend: function () {
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']}); this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']});
}, },
success: function (data) { success: function (data) {
layer.close(this.layerIndex); layer.close(this.layerIndex);
layer.msg(data.statusInfo.message, function () { layer.msg(data.statusInfo.message, function () {
window.location = '/login'; window.location = '/login';
}); });
} }
}); });
}); });
let url = window.location.href.split("#")[0];
var req = {};
req.url = url;
$.ajax({
url: "/QyWxSignature",
type: "get",
datatype: "json",
data: (req),
contentType: "application/json;charset=utf-8",
success: function (d) {
var data = d.data;
wx.config({
beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: data.corpid, // 必填,企业微信的corpID
timestamp: data.timestamp, // 必填,生成签名的时间戳
nonceStr: data.noncestr, // 必填,生成签名的随机串
signature: data.jsapi_ticket_enterprises,// 必填,签名,见 附录-JS-SDK使用权限签名算法
jsApiList: ['scanQRCode'] // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来
});
}
});
}); });
</script> </script>

14
src/main/resources/templates/index_back.html

@ -134,8 +134,7 @@
layui.use(['jquery', 'layer', 'miniAdmin','miniTongji'], function () { layui.use(['jquery', 'layer', 'miniAdmin','miniTongji'], function () {
var $ = layui.jquery, var $ = layui.jquery,
layer = layui.layer, layer = layui.layer,
miniAdmin = layui.miniAdmin, miniAdmin = layui.miniAdmin;
miniTongji = layui.miniTongji;
var authority = $("#authority").text() var authority = $("#authority").text()
let map = new Map(); let map = new Map();
map.set("roleId",authority) map.set("roleId",authority)
@ -174,21 +173,12 @@
// console.log(result.json) // console.log(result.json)
options.iniUrl = result.json; options.iniUrl = result.json;
} }
}) });
miniAdmin.render(options); miniAdmin.render(options);
// 百度统计代码,只统计指定域名
miniTongji.render({
specific: true,
domains: [
'99php.cn',
'layuimini.99php.cn',
'layuimini-onepage.99php.cn',
],
});
$('.login-out').on("click", function () { $('.login-out').on("click", function () {
layer.msg('退出登录成功', function () { layer.msg('退出登录成功', function () {

128
src/main/resources/templates/pages/QyWxScanCode/QyWxScanBarCodeIn.html

@ -0,0 +1,128 @@
<!DOCTYPE html>
<html lang="en">
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>企业微信扫码</title>
</head>
<body>
<script src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"></script>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
/* wx.config({
beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: 'ww02f310301953277a', // 必填,企业微信的corpID
timestamp: timestamp, // 必填,生成签名的时间戳
nonceStr: noncestr, // 必填,生成签名的随机串
signature: jsapi_ticket,// 必填,签名,见 附录-JS-SDK使用权限签名算法
jsApiList: ["scanQRCode"] // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来
});*/
let url = window.location.href.split("#")[0];
let dataByQyWx = {};
var req = {};
req.url = url;
layui.$.ajax({
url:"/QyWxSignature",
type:"get",
datatype:"json",
data:(req),
contentType: "application/json;charset=utf-8",
success:function (d) {
var data = d.data;
dataByQyWx = data;
wx.config({
beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: data.corpid, // 必填,企业微信的corpID
timestamp: data.timestamp, // 必填,生成签名的时间戳
nonceStr: data.noncestr, // 必填,生成签名的随机串
signature: data.jsapi_ticket_enterprises,// 必填,签名,见 附录-JS-SDK使用权限签名算法
jsApiList: ['ready','error'] // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来
});
// 用于获取签名
wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
wx.agentConfig({
corpid: dataByQyWx.corpid, // 必填,企业微信的corpid,必须与当前登录的企业一致
agentid: dataByQyWx.agentid, // 必填,企业微信的应用id (e.g. 1000247)
timestamp:dataByQyWx.timestamp , // 必填,生成签名的时间戳
nonceStr: dataByQyWx.noncestr, // 必填,生成签名的随机串
signature: dataByQyWx.jsapi_ticket_app,// 必填,签名,见附录-JS-SDK使用权限签名算法
jsApiList: ['scanQRCode','chooseImage'], //必填,传入需要使用的接口名称
success: function(res) {
// 回调
/* wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 0, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function(res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
},
error: function(res) {
if (res.errMsg.indexOf('function_not_exist') > 0) {
alert('版本过低请升级')
}
}
});*/
alert("agentConfig===success===")
wx.chooseImage({
count: 1, // 默认9
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
defaultCameraMode: "normal", //表示进入拍照界面的默认模式,目前有normal与batch两种选择,normal表示普通单拍模式,batch表示连拍模式,不传该参数则为normal模式。从3.0.26版本开始支持front和batch_front两种值,其中front表示默认为前置摄像头单拍模式,batch_front表示默认为前置摄像头连拍模式。(注:用户进入拍照界面仍然可自由切换两种模式)
isSaveToAlbum: 1, //整型值,0表示拍照时不保存到系统相册,1表示自动保存,默认值是1
success: function (res) {
var localIds = res.localIds; // 返回选定照片的本地ID列表,
// andriod中localId可以作为img标签的src属性显示图片;
alert(res)
// iOS应当使用 getLocalImgData 获取图片base64数据,从而用于img标签的显示(在img标签内使用 wx.chooseImage 的 localid 显示可能会不成功)
}
});
wx.invoke('openUserProfile', {
"type": 1, //1表示该userid是企业成员,2表示该userid是外部联系人
"userid": "PangFuZhen" //可以是企业成员,也可以是外部联系人
}, function(res) {
if(res.err_msg != "openUserProfile:ok") {
//错误处理
}
});
},
fail: function(res) {
if(res.errMsg.indexOf('function not exist') > -1){
alert('版本过低请升级')
}
alert("fail"+res)
}
});
});
wx.error(function(res){
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
alert("Error:"+res)
});
}
});
</script>
</body>
</html>

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

@ -28,7 +28,8 @@
.layui-input-block { .layui-input-block {
margin-left: 80px; margin-left: 80px;
} }
.layui-form-select{
.layui-form-select {
width: 100%; width: 100%;
border-style: none; border-style: none;
} }
@ -58,7 +59,7 @@
style="border-style: none" style="border-style: none"
id="openSonByMaterial" onblur="selectMaterialByName(this)" id="openSonByMaterial" onblur="selectMaterialByName(this)"
lay-verify="required"/> lay-verify="required"/>
<i class="layui-icon layui-icon-search" style="display: inline" <i class="layui-icon layui-icon-search" style="display: inline;"
id="selectMaterial" onclick="selectMaterial(this)"></i> id="selectMaterial" onclick="selectMaterial(this)"></i>
</div> </div>
<input type="text" name="mid" class="layui-input" id="mid" <input type="text" name="mid" class="layui-input" id="mid"
@ -87,7 +88,8 @@
value="" value=""
class="layui-input" class="layui-input"
style="border-style: none"> style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16" id="barCodeImg" <img src="/static/images/search.ico" height="16" width="16"
id="barCodeImg"
style="margin-top: 10px" onclick="scanBarCode(this)"> style="margin-top: 10px" onclick="scanBarCode(this)">
</div> </div>
</div> </div>
@ -109,59 +111,66 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">仓库:</label> <label class="layui-form-label">仓库:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="text" placeholder="请选择仓库" class="layui-input" <div class="inputdiv">
id="openSonByDepository" readonly onclick="openDepositoryTree(this)" <input type="text" placeholder="请选择仓库" class="layui-input" style="border-style: none"
lay-verify="required"/> id="openSonByDepository" readonly
<input type="text" name="depositoryId" class="layui-input" id="depositoryId" onclick="openDepositoryTree(this)"
style="display: none" lay-verify="required"/> lay-verify="required"/>
<input type="text" name="placeId" class="layui-input" id="placeId" <input type="text" name="depositoryId" class="layui-input"
style="display: none" lay-verify="required"/> id="depositoryId"
style="display: none" lay-verify="required"/>
<input type="text" name="placeId" class="layui-input" id="placeId"
style="display: none" lay-verify="required"/>
<img src="/static/images/search.ico" height="16" width="16"
id="scanLocation"
style="margin-top: 10px" onclick="scanLocationByQrCode(this)">
</div>
</div> </div>
</div> </div>
<div class="layui-form-item"> </div>
<label class="layui-form-label">备注说明:</label> <div class="layui-form-item">
<div class="layui-input-block"> <label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<textarea name="applyRemark" placeholder="请填写相关原因及申请原因" value="" <textarea name="applyRemark" placeholder="请填写相关原因及申请原因" value=""
class="layui-textarea"></textarea> class="layui-textarea"></textarea>
</div>
</div> </div>
<i class="layui-icon layui-icon-addition" style="display: inline"
onclick="addItem(this)"></i>
</div> </div>
<i class="layui-icon layui-icon-addition" style="display: inline"
onclick="addItem(this)"></i>
</div>
<!-- 提交按钮--> <!-- 提交按钮-->
<div class="layui-form-item" id="btn_sub"> <div class="layui-form-item" id="btn_sub">
<div class="layui-input-block" style="bottom: 15px;"> <div class="layui-input-block" style="bottom: 15px;">
<button id="submitForm" class="layui-btn" lay-submit lay-filter="formStep" <button id="submitForm" class="layui-btn" lay-submit lay-filter="formStep"
style="margin-left: 15%"> style="margin-left: 15%">
&emsp;提交&emsp; &emsp;提交&emsp;
</button> </button>
</div>
</div> </div>
</div> </div>
</form> </form>
</div> </div>
<!-- 下一步--> <!-- 下一步-->
<div> <div>
<form class="layui-form" style="margin: 0 auto;max-width: 460px;padding-top: 40px;"> <form class="layui-form" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
<div style="text-align: center;margin-top: 90px;"> <div style="text-align: center;margin-top: 90px;">
<i class="layui-icon layui-circle" <i class="layui-icon layui-circle"
style="color: white;font-size:30px;font-weight:bold;background: #52C41A;padding: 20px;line-height: 80px;">&#xe605;</i> style="color: white;font-size:30px;font-weight:bold;background: #52C41A;padding: 20px;line-height: 80px;">&#xe605;</i>
<div style="font-size: 24px;color: #333;font-weight: 500;margin-top: 30px;"> <div style="font-size: 24px;color: #333;font-weight: 500;margin-top: 30px;">
提交成功 提交成功
</div> </div>
<div style="text-align: center;margin-top: 50px;"> <div style="text-align: center;margin-top: 50px;">
<button class="layui-btn next">再填写一次</button> <button class="layui-btn next">再填写一次</button>
</div>
</div> </div>
</div>
</form> </form>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script> <script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script src="/static/js/lay-config.js?v=1.0.4" charset="utf-8"></script> <script src="/static/js/lay-config.js?v=1.0.4" charset="utf-8"></script>
@ -198,10 +207,12 @@
function scanBarCode(obj) { function scanBarCode(obj) {
} }
// 用于重新渲染该页面 // 用于扫描入库位置
function Coverpage(num, obj) { function scanLocationByQrCode(obj) {
} }
// 用于暂存卡片个数 // 用于暂存卡片个数
var params = []; var params = [];
let scanValue = {}; let scanValue = {};
@ -254,7 +265,7 @@
errMsg += "物料编码: "; errMsg += "物料编码: ";
errMsg += err[i]["code"]; errMsg += err[i]["code"];
} }
if(err.length>0) { if (err.length > 0) {
errMsg += "添加失败,请选择新仓库或库位"; errMsg += "添加失败,请选择新仓库或库位";
layer.msg(errMsg, { layer.msg(errMsg, {
icon: 5, icon: 5,
@ -262,7 +273,7 @@
}, function () { }, function () {
step.next('#stepForm'); step.next('#stepForm');
}); });
}else{ } else {
step.next('#stepForm'); step.next('#stepForm');
} }
} }
@ -336,7 +347,7 @@
<input id="barcode" name=` + "barCode" + NewIdNumber + ` type="text" placeholder="请填写入条形编码" value="" <input id="barcode" name=` + "barCode" + NewIdNumber + ` type="text" placeholder="请填写入条形编码" value=""
class="layui-input" style="border-style: none"> class="layui-input" style="border-style: none">
<img src="/static/images/search.ico" height="16" <img src="/static/images/search.ico" height="16"
id = `+"barCodeImg"+NewIdNumber+` id = ` + "barCodeImg" + NewIdNumber + `
width="16" style="margin-top: 10px" onclick="scanBarCode(this)" > width="16" style="margin-top: 10px" onclick="scanBarCode(this)" >
</div> </div>
</div> </div>
@ -358,14 +369,18 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">仓库:</label> <label class="layui-form-label">仓库:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="text" placeholder="请选择仓库" class="layui-input" <div class="inputdiv">
<input type="text" placeholder="请选择仓库" class="layui-input" style="border-style: none"
id="openSonByDepository" readonly onclick="openDepositoryTree(this)" id="openSonByDepository" readonly onclick="openDepositoryTree(this)"
lay-verify="required"/> lay-verify="required"/>
<input type="text" name=` + "depositoryId" + NewIdNumber + ` class="layui-input" id="depositoryId" <input type="text" name=` + "depositoryId" + NewIdNumber + ` class="layui-input" id="depositoryId"
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" <input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId"
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<img src="/static/images/search.ico" height="16" width="16"
id="scanLocation"
style="margin-top: 10px" onclick="scanLocationByQrCode(this)">
</div>
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -448,7 +463,7 @@
materialId.value = ""; materialId.value = "";
priceValue.value = ""; priceValue.value = "";
obj.value = ""; obj.value = "";
$("#barCode"+idNumber).remove(); $("#barCode" + idNumber).remove();
form.render(); form.render();
} else { } else {
@ -457,17 +472,17 @@
priceValue.value = d.price; priceValue.value = d.price;
// 获取物料与条形码的对应关系 // 获取物料与条形码的对应关系
var materialAndBarCodeList = d["materialAndBarCodeList"]; var materialAndBarCodeList = d["materialAndBarCodeList"];
if(materialAndBarCodeList.length > 0){ if (materialAndBarCodeList.length > 0) {
// 如果有对应的条形码 // 如果有对应的条形码
var barCodeInput = barCodeItem.childNodes[1].childNodes[1]; var barCodeInput = barCodeItem.childNodes[1].childNodes[1];
var barCodeImg = barCodeItem.childNodes[1].childNodes[3]; var barCodeImg = barCodeItem.childNodes[1].childNodes[3];
var id = barCodeInput.id; var id = barCodeInput.id;
$("#"+id).remove(); $("#" + id).remove();
$("#barCode"+idNumber).empty(); $("#barCode" + idNumber).empty();
var barCode = $("#barCode"+idNumber); var barCode = $("#barCode" + idNumber);
if(barCode.length > 0) { if (barCode.length > 0) {
barCode.empty(); barCode.empty();
}else{ } else {
var barCodeSelect = ` var barCodeSelect = `
<select id=` + "barCode" + idNumber + ` name=` + "barCode" + idNumber + `> <select id=` + "barCode" + idNumber + ` name=` + "barCode" + idNumber + `>
</select>`; </select>`;
@ -476,7 +491,7 @@
form.render(); form.render();
$.each(materialAndBarCodeList, function (index, item) { $.each(materialAndBarCodeList, function (index, item) {
$("#barCode"+idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素 $("#barCode" + idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素
}); });
form.render(); form.render();
} }
@ -484,7 +499,6 @@
} }
}); });
}; };
// 用于实现点击搜索按钮 // 用于实现点击搜索按钮
selectMaterial = function (obj) { selectMaterial = function (obj) {
var parent = obj.parentNode.parentNode.parentNode.parentNode; var parent = obj.parentNode.parentNode.parentNode.parentNode;
@ -532,22 +546,22 @@
codeValue.value = code; codeValue.value = code;
priceValue.value = material.price; priceValue.value = material.price;
var materialAndBarCodeList = material["materialAndBarCodeList"]; var materialAndBarCodeList = material["materialAndBarCodeList"];
if(materialAndBarCodeList.length > 0){ if (materialAndBarCodeList.length > 0) {
// 如果有对应的条形码 // 如果有对应的条形码
var barCodeInput = barCodeItem.childNodes[1].childNodes[1]; var barCodeInput = barCodeItem.childNodes[1].childNodes[1];
var barCodeImg = barCodeItem.childNodes[1].childNodes[3]; var barCodeImg = barCodeItem.childNodes[1].childNodes[3];
var id = barCodeInput.id; var id = barCodeInput.id;
$("#"+id).remove(); $("#" + id).remove();
// barCodeInput.style = "display:none"; // barCodeInput.style = "display:none";
var idNumber = materialId.name.split("mid")[1]; var idNumber = materialId.name.split("mid")[1];
var barCodeSelect = ` var barCodeSelect = `
<select id=`+"barCode"+idNumber+` name=`+"barCode"+idNumber+ `> <select id=` + "barCode" + idNumber + ` name=` + "barCode" + idNumber + `>
</select>`; </select>`;
$("#"+barCodeImg.id).before(barCodeSelect); $("#" + barCodeImg.id).before(barCodeSelect);
form.render(); form.render();
$.each(materialAndBarCodeList, function (index, item) { $.each(materialAndBarCodeList, function (index, item) {
$("#barCode"+idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素 $("#barCode" + idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素
}); });
form.render(); form.render();
} }
@ -557,7 +571,6 @@
} }
}); });
}; };
//用于实现物料名称搜索 //用于实现物料名称搜索
selectMaterialByName = function (obj) { selectMaterialByName = function (obj) {
// 输入code // 输入code
@ -601,238 +614,142 @@
} }
}); });
}; };
// 用于重新渲染该页面
Coverpage = function (num, obj) {
var parent = $("#cardParent");
// 获取待添加父类
NewIdNumber = num;
if (num === 0) { // 如果是第一个
NewIdNumber = "";
}
var depositoryItem = `
<div class="layui-form-item">
<label class="layui-form-label">仓库:</label>
<div class="layui-input-block">
<input type="text" placeholder="请选择仓库" class="layui-input"
id="openSonByDepository" readonly onclick="openDepositoryTree(this)"
lay-verify="required"/>
<input type="text" name=` + "depositoryId" + NewIdNumber + ` class="layui-input" id="depositoryId"
style="display: none" lay-verify="required"/>
<input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" value="0"
style="display: none" lay-verify="required"/>
</div>
</div>
`;
if (scanValue.depository !== undefined && scanValue.depository !== null && scanValue.depository !== "") {
let depository = scanValue.depository;
// 如果扫描了仓库
depositoryItem = `<div class="layui-form-item">
<label class="layui-form-label">仓库:</label>
<div class="layui-input-block">
<input type="text" placeholder="请选择仓库" class="layui-input" value=` + depository.dname + `
id="openSonByDepository" readonly onclick="openDepositoryTree(this)"
lay-verify="required"/>
<input type="text" name=` + "depositoryId" + NewIdNumber + ` class="layui-input" id="depositoryId" value=` + depository.did + `
style="display: none" lay-verify="required"/>
<input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" value="0"
style="display: none" lay-verify="required"/>
</div>
</div>`;
}
if (scanValue.place !== undefined && scanValue.place !== null && scanValue.place !== "") {
// 如果扫描了库位
let place = scanValue.place;
depositoryItem = `<div class="layui-form-item">
<label class="layui-form-label">仓库:</label>
<div class="layui-input-block">
<input type="text" placeholder="请选择仓库" class="layui-input"
id="openSonByDepository" readonly onclick="openDepositoryTree(this)" value=` + place.dname + "-" + place.code + `
lay-verify="required"/>
<input type="text" name=` + "depositoryId" + NewIdNumber + ` class="layui-input" id="depositoryId" value=` + place.depositoryId + `
style="display: none" lay-verify="required"/>
<input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" value=` + place.pid + `
style="display: none" lay-verify="required"/>
</div>
</div>`;
}
var firstItem =
// 前半部分
` <div class="layui-card-body" style="padding-right: 0px" id=` + "cardItem" + NewIdNumber + `>
<hr>
<i class="layui-icon layui-icon-subtraction" style="display: inline" onclick="deleteItem(this)"></i>
<div class="layui-form-item">
<label class="layui-form-label">物料名称</label>
<div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择物料" class="layui-input" style="border-style: none"
id="openSonByMaterial" lay-verify="required" value="${obj.mname}" onblur="selectMaterialByName(this)"/>
<i class="layui-icon layui-icon-search" style="display: inline" id="selectMaterial" onclick="selectMaterial(this)"></i>
</div>
<input type="text" name=` + "mid" + NewIdNumber + ` class="layui-input" id="mid" value="${obj.mid}"
style="display: none" lay-verify="required" />
</div>
</div>
<div class="layui-form-item">
<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="请填写入物料编码" onblur="selectCode(this)"
class="layui-input" lay-verify="required" value="${obj.code}" style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16" style="margin-top: 10px" onclick="scanCodeInStorage(this)" >
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">条形编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<select id=`+"barCode"+NewIdNumber+` name=`+"barCode"+NewIdNumber+`></select>
<img src="/static/images/search.ico" height="16" width="16" style="margin-top: 10px" onclick="scanBarCode(this)" >
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料单价:</label>
<div class="layui-input-block">
<input name=` + "price" + NewIdNumber + ` type="number" placeholder="请填写入物料单价" value="${obj.price}"
class="layui-input" lay-verify="number">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料数量:</label>
<div class="layui-input-block">
<input name=` + "quantity" + NewIdNumber + ` type="number" placeholder="请填写入物料数量" value=""
class="layui-input" lay-verify="number">
</div>
</div>`;
var lastItem = `<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<textarea name=` + "applyRemark" + NewIdNumber + ` placeholder="请填写相关原因及申请原因" value=""
class="layui-textarea"></textarea>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" onclick="addItem(this)"></i>
</div>`;
// 获取当前高度
var height = parseInt(($("#stepForm").css('height')).split("px")[0]);
if (NewIdNumber !== "") {
params.push(NewIdNumber)
}
$("#stepForm").css("height", height + 532 + 'px');
var materialItem = firstItem + depositoryItem + lastItem; // 最终
$("#btn_sub").prepend(materialItem)
};
// 用于扫码入库 // 用于扫码入库
scanCodeInStorage = function () { scanCodeInStorage = function (obj) {
layer.open({ parent.wx.scanQRCode({
type: 2, desc: 'scanQRCode desc',
title: '扫码', needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
skin: 'layui-layer-rim', scanType: ["qrCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
maxmin: true, success: function (res) {
shadeClose: true, //点击遮罩关闭层 // 回调
area: ['100%', '100%'], var result = res.resultStr;//当needResult为1时返回处理结果
move: '.layui-layer-title', var req = {};
fixed: false, req.qrCode = result;
content: '/scanQrCodeIn',
end: function () {
$.ajax({ $.ajax({
url: "/material/application_in_scanQrCode", url: "/material/qywxApplicationInScanQrCode",
type: "get", type: "post",
dataType: 'json', dataType: 'json',
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8", contentType: "application/json;charset=utf-8",
success: function (d) { success: function (d) {
var data = d.data; var data = d.data;
var materialList = data["materialList"];
var depository = data["depository"]; var parent = obj.parentNode.parentNode.parentNode.parentNode;
var place = data["place"]; var codeChildren = parent.childNodes[7];
if (depository !== undefined && depository !== null && depository !== "") { var priceChildren = parent.childNodes[11];
// 如果扫描到仓库 var materialChildren = parent.childNodes[5];
scanValue.depository = depository; // 条形码
} var barCodeChildren = parent.childNodes[9];
if (place !== undefined && place !== null && place !== "") { var codeItem = codeChildren.childNodes[3].childNodes[1];
// 如果扫描到库位 var codeValue = codeItem.childNodes[1];
scanValue.place = place; var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes;
var materialName = materialItem[1];
var materialId = materialName.parentNode.parentNode.childNodes[3];
var mname = materialName.value;
// 单价条目
var priceItem = priceChildren.childNodes[3].childNodes;
var priceValue = priceItem[1];
// 条形码条码
var barCodeItem = barCodeChildren.childNodes[3];
var code = data.code;
if (code === undefined) {
code = "";
} }
if (materialList.length > 0) { materialName.value = data.mname;
for (let i = 1; i <= materialList.length; i++) { materialId.value = data.id;
materialList[i-1].mid = materialList[i-1].id; codeValue.value = code;
Coverpage(i, materialList[i - 1]); priceValue.value = data.price;
var materialbyBarCodeList = materialList[i-1]["materialAndBarCodeList"]; var materialAndBarCodeList = data["materialAndBarCodeList"];
$.each(materialbyBarCodeList, function (index, item) { var idNumber = materialId.name.split("mid")[1];
$("#barCode"+i).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素 if (materialAndBarCodeList.length > 0) {
}); // 如果有对应的条形码
var barCodeInput = barCodeItem.childNodes[1].childNodes[1];
var barCodeImg = barCodeItem.childNodes[1].childNodes[3];
var id = barCodeInput.id;
$("#" + id).remove();
$("#barCode" + idNumber).empty();
var barCode = $("#barCode" + idNumber);
if (barCode.length > 0) {
barCode.empty();
} else {
var barCodeSelect = `
<select id=` + "barCode" + idNumber + ` name=` + "barCode" + idNumber + `>
</select>`;
$("#" + barCodeImg.id).before(barCodeSelect);
} }
form.render(); form.render();
} else { $.each(materialAndBarCodeList, function (index, item) {
var material = {}; $("#barCode" + idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素
material.mname = ''; });
material.mid = ''; form.render();
material.code = '';
Coverpage(0, material);
} }
} }
}) })
} }
}) })
}; };
// 用于扫描二维码
scanBarCode = function (obj) { scanBarCode = function (obj) {
layer.open({ parent.wx.scanQRCode({
type: 2, desc: 'scanQRCode desc',
title: '扫码', needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
skin: 'layui-layer-rim', scanType: ["barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
maxmin: true, success: function (res) {
shadeClose: true, //点击遮罩关闭层 // 回调
area: ['100%', '100%'], var result = res.resultStr;//当needResult为1时返回处理结果
move: '.layui-layer-title', var req = {};
fixed: false, req.qrCode = result;
content: '/scanBarCodeIn',
end: function () {
$.ajax({ $.ajax({
url: "/material/application_in_scanBarCode", url: "/material/qywxApplicationInScanBarCode",
type: "get", type: "post",
dataType: 'json', dataType: 'json',
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8", contentType: "application/json;charset=utf-8",
success: function (d) { success: function (d) {
var data = d.data; var data = d.data;
var materialList = data["materialList"]; var material = data["material"];
var depository = data["depository"]; var parent = obj.parentNode.parentNode.parentNode.parentNode;
var place = data["place"]; var codeChildren = parent.childNodes[7];
if (depository !== undefined && depository !== null && depository !== "") { var priceChildren = parent.childNodes[11];
// 如果扫描到仓库 var materialChildren = parent.childNodes[5];
scanValue.depository = depository; // 条形码
} var barCodeChildren = parent.childNodes[9];
if (place !== undefined && place !== null && place !== "") { var codeItem = codeChildren.childNodes[3].childNodes[1];
// 如果扫描到库位 var codeValue = codeItem.childNodes[1];
scanValue.place = place; var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes;
} var materialName = materialItem[1];
if (materialList.length > 0) { var materialId = materialName.parentNode.parentNode.childNodes[3];
for (let i = 1; i <= materialList.length; i++) { var mname = materialName.value;
materialList[i-1].code = materialList[i-1].mcode; // 单价条目
Coverpage(i, materialList[i - 1]); var priceItem = priceChildren.childNodes[3].childNodes;
$.each(materialList, function (index, item) { var priceValue = priceItem[1];
$("#barCode"+i).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素 // 条形码条码
});
} var barCodeItem = barCodeChildren.childNodes[3];
form.render(); var code = material.mcode;
if (code === undefined) {
code = "";
} }
materialName.value = material.mname;
materialId.value = material.mid;
codeValue.value = code;
priceValue.value = material.price;
var barCodeInput = barCodeItem.childNodes[1].childNodes[1];
barCodeInput.value = result;
form.render();
} }
}) })
},
error: function (res) {
if (res.errMsg.indexOf('function_not_exist') > 0) {
alert('版本过低请升级')
}
alert(res)
} }
}) });
}; };
// 用于打开仓库树形菜单 // 用于打开仓库树形菜单
openDepositoryTree = function (obj) { openDepositoryTree = function (obj) {
@ -849,8 +766,55 @@
fixed: false, fixed: false,
content: '/selectDepositoryByCard?type=1&clickObj=' + parentId, content: '/selectDepositoryByCard?type=1&clickObj=' + parentId,
}); });
} };
// 用于扫描入库位置
scanLocationByQrCode = function (obj) {
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var req = {};
req.qrCode = result;
$.ajax({
url: "/place/qywxApplicationInScanQrCode",
type: "post",
dataType: 'json',
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (d) {
var data = d.data;
var flag = data["flag"];
var parent = obj.parentNode;
var depositoryName = parent.childNodes[1];
var depositoryId = parent.childNodes[3];
var placeId = parent.childNodes[5];
if(flag === 0){
// 如果没有获取到位置
layer.msg("当前二维码错误,请重新扫描");
}else if(flag === 1){
// 如果获取到的是库位
var place = data["place"];
placeId.value = place.id;
depositoryId.value = place.did;
depositoryName.value = place.depositoryName;
}else if(flag === 2){
// 如果获取到的是仓库
var depository = data["depository"];
placeId.value = "0";
depositoryId.value = depository.id;
depositoryName.value = depository.dname;
}
}
})
}
})
}
}) })
</script> </script>

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

@ -99,6 +99,18 @@
function selectMaterial(obj) { function selectMaterial(obj) {
} }
// 用于扫码入库
function scanCodeInStorage(obj) {
}
// 用于扫描条形码
function scanBarCode(obj) {
}
// 用于扫描入库位置
function scanLocationByQrCode(obj) {
}
// 用于物料名称查询 // 用于物料名称查询
function selectMaterialByName(obj) { function selectMaterialByName(obj) {
} }
@ -173,6 +185,7 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">仓库:</label> <label class="layui-form-label">仓库:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择仓库" class="layui-input" <input type="text" placeholder="请选择仓库" class="layui-input"
id="openSonByDepository" readonly onclick="openDepositoryTree(this)" id="openSonByDepository" readonly onclick="openDepositoryTree(this)"
lay-verify="required"/> lay-verify="required"/>
@ -180,7 +193,11 @@
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" value="0" <input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" value="0"
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<img src="/static/images/search.ico" height="16" width="16"
id="scanLocation"
style="margin-top: 10px" onclick="scanLocationByQrCode(this)">
</div>
</div> </div>
</div> </div>
`; `;
@ -190,6 +207,7 @@
depositoryItem = `<div class="layui-form-item"> depositoryItem = `<div class="layui-form-item">
<label class="layui-form-label">仓库:</label> <label class="layui-form-label">仓库:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择仓库" class="layui-input" value=` + depository.dname + ` <input type="text" placeholder="请选择仓库" class="layui-input" value=` + depository.dname + `
id="openSonByDepository" readonly onclick="openDepositoryTree(this)" id="openSonByDepository" readonly onclick="openDepositoryTree(this)"
lay-verify="required"/> lay-verify="required"/>
@ -197,7 +215,10 @@
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" value="0" <input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" value="0"
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<img src="/static/images/search.ico" height="16" width="16"
id="scanLocation"
style="margin-top: 10px" onclick="scanLocationByQrCode(this)">
</div>
</div> </div>
</div>`; </div>`;
} }
@ -208,6 +229,7 @@
depositoryItem = `<div class="layui-form-item"> depositoryItem = `<div class="layui-form-item">
<label class="layui-form-label">仓库:</label> <label class="layui-form-label">仓库:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择仓库" class="layui-input" <input type="text" placeholder="请选择仓库" class="layui-input"
id="openSonByDepository" readonly onclick="openDepositoryTree(this)" value=` + place.dname + "-" + place.code + ` id="openSonByDepository" readonly onclick="openDepositoryTree(this)" value=` + place.dname + "-" + place.code + `
lay-verify="required"/> lay-verify="required"/>
@ -215,7 +237,10 @@
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" value=` + place.pid + ` <input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" value=` + place.pid + `
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<img src="/static/images/search.ico" height="16" width="16"
id="scanLocation"
style="margin-top: 10px" onclick="scanLocationByQrCode(this)">
</div>
</div> </div>
</div>`; </div>`;
@ -240,15 +265,18 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">物料编码:</label> <label class="layui-form-label">物料编码:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<div class="inputdiv">
<input id="code" name=` + "code" + NewIdNumber + ` type="text" placeholder="请填写入物料编码" onblur="selectCode(this)" <input id="code" name=` + "code" + NewIdNumber + ` type="text" placeholder="请填写入物料编码" onblur="selectCode(this)"
class="layui-input" lay-verify="required" value="${obj.code}"> class="layui-input" lay-verify="required" value="${obj.code}">
<img src="/static/images/search.ico" height="16" width="16"
style="margin-top: 10px" onclick="scanCodeInStorage(this)">
</div>
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">条形编码:</label> <label class="layui-form-label">条形编码:</label>
<div class="layui-input-block" style="margin: 0px;"> <div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv"> <div class="inputdiv">
<select id=`+"barCode"+NewIdNumber+` name=`+"barCode"+NewIdNumber+`></select> <select id=`+"barCode"+NewIdNumber+` name=`+"barCode"+NewIdNumber+`></select>
<img id= `+"barCodeImg"+NewIdNumber+` name=`+"barCodeImg"+NewIdNumber+` src="/static/images/search.ico" height="16" width="16" style="margin-top: 10px" onclick="scanBarCode(this)" > <img id= `+"barCodeImg"+NewIdNumber+` name=`+"barCodeImg"+NewIdNumber+` src="/static/images/search.ico" height="16" width="16" style="margin-top: 10px" onclick="scanBarCode(this)" >
</div> </div>
@ -379,6 +407,7 @@
var depositoryItem = ` <div class="layui-form-item"> var depositoryItem = ` <div class="layui-form-item">
<label class="layui-form-label">仓库:</label> <label class="layui-form-label">仓库:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择仓库" class="layui-input" <input type="text" placeholder="请选择仓库" class="layui-input"
id="openSonByDepository" readonly onclick="openDepositoryTree(this)" id="openSonByDepository" readonly onclick="openDepositoryTree(this)"
lay-verify="required"/> lay-verify="required"/>
@ -386,7 +415,11 @@
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" <input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId"
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<img src="/static/images/search.ico" height="16" width="16"
id="scanLocation"
style="margin-top: 10px" onclick="scanLocationByQrCode(this)">
</div>
</div> </div>
</div> </div>
`; `;
@ -396,6 +429,7 @@
depositoryItem = `<div class="layui-form-item"> depositoryItem = `<div class="layui-form-item">
<label class="layui-form-label">仓库:</label> <label class="layui-form-label">仓库:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择仓库" class="layui-input" value=` + depository.dname + ` <input type="text" placeholder="请选择仓库" class="layui-input" value=` + depository.dname + `
id="openSonByDepository" readonly onclick="openDepositoryTree(this)" id="openSonByDepository" readonly onclick="openDepositoryTree(this)"
lay-verify="required"/> lay-verify="required"/>
@ -403,7 +437,11 @@
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" value="0" <input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" value="0"
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<img src="/static/images/search.ico" height="16" width="16"
id="scanLocation"
style="margin-top: 10px" onclick="scanLocationByQrCode(this)">
</div>
</div> </div>
</div>`; </div>`;
} }
@ -414,6 +452,7 @@
depositoryItem = `<div class="layui-form-item"> depositoryItem = `<div class="layui-form-item">
<label class="layui-form-label">仓库:</label> <label class="layui-form-label">仓库:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择仓库" class="layui-input" <input type="text" placeholder="请选择仓库" class="layui-input"
id="openSonByDepository" readonly onclick="openDepositoryTree(this)" value=` + place.dname + "-" + place.code + ` id="openSonByDepository" readonly onclick="openDepositoryTree(this)" value=` + place.dname + "-" + place.code + `
lay-verify="required"/> lay-verify="required"/>
@ -421,7 +460,11 @@
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" value=` + place.pid + ` <input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" value=` + place.pid + `
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<img src="/static/images/search.ico" height="16" width="16"
id="scanLocation"
style="margin-top: 10px" onclick="scanLocationByQrCode(this)">
</div>
</div> </div>
</div>`; </div>`;
@ -446,8 +489,12 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">物料编码:</label> <label class="layui-form-label">物料编码:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<div class="inputdiv">
<input id="code" name=` + "code" + NewIdNumber + ` type="text" placeholder="请填写入物料编码" value="" onblur="selectCode(this)" <input id="code" name=` + "code" + NewIdNumber + ` type="text" placeholder="请填写入物料编码" value="" onblur="selectCode(this)"
class="layui-input" lay-verify="required"> class="layui-input" lay-verify="required">
<img src="/static/images/search.ico" height="16" width="16"
style="margin-top: 10px" onclick="scanCodeInStorage(this)">
</div>
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -490,7 +537,7 @@
// 获取当前高度 // 获取当前高度
var height = parseInt(($("#stepForm").css('height')).split("px")[0]); var height = parseInt(($("#stepForm").css('height')).split("px")[0]);
params.push(NewIdNumber) params.push(NewIdNumber)
$("#stepForm").css("height", height + 530 + 'px'); $("#stepForm").css("height", height + 535 + 'px');
var materialItem = firstItem + depositoryItem + lastItem; var materialItem = firstItem + depositoryItem + lastItem;
$("#" + parentId).after(materialItem); $("#" + parentId).after(materialItem);
}; };
@ -504,7 +551,7 @@
// 获取祖父节点 // 获取祖父节点
var reparent = parent.parentNode; var reparent = parent.parentNode;
var height = parseInt(($("#stepForm").css('height')).split("px")[0]); var height = parseInt(($("#stepForm").css('height')).split("px")[0]);
$("#stepForm").css("height", height - 530 + 'px'); $("#stepForm").css("height", height - 535 + 'px');
params = remove(params, parentId); params = remove(params, parentId);
reparent.removeChild(parent); reparent.removeChild(parent);
}; };
@ -683,50 +730,66 @@
}; };
scanBarCode = function (obj) { scanBarCode = function (obj) {
layer.open({ parent.parent.wx.scanQRCode({
type: 2, desc: 'scanQRCode desc',
title: '扫码', needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
skin: 'layui-layer-rim', scanType: ["barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
maxmin: true, success: function (res) {
shadeClose: true, //点击遮罩关闭层 // 回调
area: ['100%', '100%'], var result = res.resultStr;//当needResult为1时返回处理结果
move: '.layui-layer-title', var req = {};
fixed: false, req.qrCode = result;
content: '/scanBarCodeIn',
end: function () {
$.ajax({ $.ajax({
url: "/material/application_in_scanBarCode", url: "/material/qywxApplicationInScanBarCode",
type: "get", type: "post",
dataType: 'json', dataType: 'json',
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8", contentType: "application/json;charset=utf-8",
success: function (d) { success: function (d) {
var data = d.data; var data = d.data;
var materialList = data["materialList"]; var material = data["material"];
var depository = data["depository"]; var parent = obj.parentNode.parentNode.parentNode.parentNode;
var place = data["place"]; var codeChildren = parent.childNodes[7];
if (depository !== undefined && depository !== null && depository !== "") { var priceChildren = parent.childNodes[11];
// 如果扫描到仓库 var materialChildren = parent.childNodes[5];
scanValue.depository = depository; // 条形码
} var barCodeChildren = parent.childNodes[9];
if (place !== undefined && place !== null && place !== "") { var codeItem = codeChildren.childNodes[3].childNodes[1];
// 如果扫描到库位 var codeValue = codeItem.childNodes[1];
scanValue.place = place; var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes;
} var materialName = materialItem[1];
if (materialList.length > 0) { var materialId = materialName.parentNode.parentNode.childNodes[3];
for (let i = 1; i <= materialList.length; i++) { var mname = materialName.value;
materialList[i-1].code = materialList[i-1].mcode; // 单价条目
Coverpage(i, materialList[i - 1]); var priceItem = priceChildren.childNodes[3].childNodes;
$.each(materialList, function (index, item) { var priceValue = priceItem[1];
$("#barCode"+i).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素 // 条形码条码
});
} var barCodeItem = barCodeChildren.childNodes[3];
form.render(); var code = material.mcode;
if (code === undefined) {
code = "";
} }
materialName.value = material.mname;
materialId.value = material.mid;
codeValue.value = code;
priceValue.value = material.price;
var barCodeInput = barCodeItem.childNodes[1].childNodes[1];
barCodeInput.value = result;
form.render();
} }
}) })
},
error: function (res) {
if (res.errMsg.indexOf('function_not_exist') > 0) {
alert('版本过低请升级')
}
alert(res)
} }
}) });
}; }
// 用于打开仓库树形菜单 // 用于打开仓库树形菜单
openDepositoryTree = function (obj) { openDepositoryTree = function (obj) {
@ -744,6 +807,129 @@
content: '/selectDepositoryByCard?type=1&clickObj=' + parentId, content: '/selectDepositoryByCard?type=1&clickObj=' + parentId,
}); });
} }
// 用于扫码入库
scanCodeInStorage = function (obj) {
parent.parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var req = {};
req.qrCode = result;
$.ajax({
url: "/material/qywxApplicationInScanQrCode",
type: "post",
dataType: 'json',
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (d) {
var data = d.data;
var parent = obj.parentNode.parentNode.parentNode.parentNode;
var codeChildren = parent.childNodes[7];
var priceChildren = parent.childNodes[11];
var materialChildren = parent.childNodes[5];
// 条形码
var barCodeChildren = parent.childNodes[9];
var codeItem = codeChildren.childNodes[3].childNodes[1];
var codeValue = codeItem.childNodes[1];
var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes;
var materialName = materialItem[1];
var materialId = materialName.parentNode.parentNode.childNodes[3];
var mname = materialName.value;
// 单价条目
var priceItem = priceChildren.childNodes[3].childNodes;
var priceValue = priceItem[1];
// 条形码条码
var barCodeItem = barCodeChildren.childNodes[3];
var code = data.code;
if (code === undefined) {
code = "";
}
materialName.value = data.mname;
materialId.value = data.id;
codeValue.value = code;
priceValue.value = data.price;
var materialAndBarCodeList = data["materialAndBarCodeList"];
var idNumber = materialId.name.split("mid")[1];
if (materialAndBarCodeList.length > 0) {
// 如果有对应的条形码
var barCodeInput = barCodeItem.childNodes[1].childNodes[1];
var barCodeImg = barCodeItem.childNodes[1].childNodes[3];
var id = barCodeInput.id;
$("#" + id).remove();
$("#barCode" + idNumber).empty();
var barCode = $("#barCode" + idNumber);
if (barCode.length > 0) {
barCode.empty();
} else {
var barCodeSelect = `
<select id=` + "barCode" + idNumber + ` name=` + "barCode" + idNumber + `>
</select>`;
$("#" + barCodeImg.id).before(barCodeSelect);
}
form.render();
$.each(materialAndBarCodeList, function (index, item) {
$("#barCode" + idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素
});
form.render();
}
}
})
}
})
};
// 用于扫描入库位置
scanLocationByQrCode = function (obj) {
parent.parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var req = {};
req.qrCode = result;
$.ajax({
url: "/place/qywxApplicationInScanQrCode",
type: "post",
dataType: 'json',
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (d) {
var data = d.data;
var flag = data["flag"];
var parent = obj.parentNode;
var depositoryName = parent.childNodes[1];
var depositoryId = parent.childNodes[3];
var placeId = parent.childNodes[5];
if(flag === 0){
// 如果没有获取到位置
layer.msg("当前二维码错误,请重新扫描");
}else if(flag === 1){
// 如果获取到的是库位
var place = data["place"];
placeId.value = place.id;
depositoryId.value = place.did;
depositoryName.value = place.depositoryName;
}else if(flag === 2){
// 如果获取到的是仓库
var depository = data["depository"];
placeId.value = "0";
depositoryId.value = depository.id;
depositoryName.value = depository.dname;
}
}
})
}
})
}
}) })
</script> </script>
</body> </body>

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

@ -555,45 +555,53 @@
}; };
scanBarCode = function (obj) { scanBarCode = function (obj) {
layer.open({ parent.wx.scanQRCode({
type: 2, desc: 'scanQRCode desc',
title: '扫码', needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
skin: 'layui-layer-rim', scanType: ["barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
maxmin: true, success: function(res) {
shadeClose: true, //点击遮罩关闭层 // 回调
area: ['100%', '100%'], var result = res.resultStr;//当needResult为1时返回处理结果
move: '.layui-layer-title', var req = {};
fixed: false, req.qrCode = result;
content: '/scanBarCodeOut',
end: function () {
$.ajax({ $.ajax({
url: "/material/application_out_scanBarCode", url: "/material/qywxApplicationOutScanBarCode",
type: "get", type: "post",
dataType: 'json', dataType: 'json',
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8", contentType: "application/json;charset=utf-8",
success: function (d) { success: function (d) {
// 获取对应元素
var parent = obj.parentNode.parentNode.parentNode.parentNode;
var MaterialChildren = parent.childNodes[5];
var materialItem = MaterialChildren.childNodes[3].childNodes[1].childNodes;
var barCodeChildren = parent.childNodes[9];
var materialName = materialItem[1];
var materialId = materialName.parentNode.parentNode.childNodes[3];
// 条形码条码
var barCodeItem = barCodeChildren.childNodes[3];
// 物料编码
var materialCodeItem = parent.childNodes[7].childNodes[3];
var materialCode = materialCodeItem.childNodes[1];
var data = d.data; var data = d.data;
var materialList = data["materialList"];
var depository = data["depository"]; if (data !== null) {
var place = data["place"];
if (depository !== undefined && depository !== null && depository !== "") { materialName.value = data.mname;
// 如果扫描到仓库 materialId.value = data.mid;
scanValue.depository = depository; materialCode.value = data.mcode;
} var barCodeInput = barCodeItem.childNodes[1].childNodes[1];
if (place !== undefined && place !== null && place !== "") { barCodeInput.value = result;
// 如果扫描到库位
scanValue.place = place;
}
if (materialList.length > 0) {
for (let i = 1; i <= materialList.length; i++) {
materialList[i-1].code = materialList[i-1].mcode;
Coverpage(i, materialList[i - 1]);
$.each(materialList, function (index, item) {
$("#barCode"+i).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素
});
}
form.render();
} }
} }
}) })
} }

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

@ -95,13 +95,18 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">仓库:</label> <label class="layui-form-label">仓库:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="text" placeholder="请选择仓库" class="layui-input" <div class="inputdiv">
<input type="text" placeholder="请选择仓库" class="layui-input" style="border-style: none"
id="openSonByDepository" readonly onclick="openDepositoryTree(this)" id="openSonByDepository" readonly onclick="openDepositoryTree(this)"
lay-verify="required"/> lay-verify="required"/>
<input type="text" name="depositoryId" class="layui-input" id="depositoryId" <input type="text" name="depositoryId" class="layui-input" id="depositoryId"
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<input type="text" name="placeId" class="layui-input" id="placeId" <input type="text" name="placeId" class="layui-input" id="placeId"
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<img src="/static/images/search.ico" height="16" width="16"
id="scanLocation"
style="margin-top: 10px" onclick="scanLocationByQrCode(this)">
</div>
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -173,8 +178,10 @@
function scanBarCode() { function scanBarCode() {
} }
// 用于重新渲染该页面
function Coverpage(num, obj) { // 用于扫描位置
function scanLocationByQrCode() {
} }
// 用于暂存卡片个数 // 用于暂存卡片个数
var params = []; var params = [];
@ -309,7 +316,7 @@
<div class="inputdiv"> <div class="inputdiv">
<input id="code" name=`+"code"+NewIdNumber+` type="text" placeholder="请填写入物料编码" value="" onblur="selectCode(this)" <input id="code" name=`+"code"+NewIdNumber+` type="text" placeholder="请填写入物料编码" value="" onblur="selectCode(this)"
class="layui-input" style="border-style: none"> class="layui-input" style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16" id="barCodeImg" <img src="/static/images/search.ico" height="16" width="16" id=`+"barCodeImg"+NewIdNumber+`
style="margin-top: 10px" onclick="scanBarCode(this)"> style="margin-top: 10px" onclick="scanBarCode(this)">
</div> </div>
@ -331,13 +338,18 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">仓库:</label> <label class="layui-form-label">仓库:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="text" placeholder="请选择仓库" class="layui-input" <div class="inputdiv">
<input type="text" placeholder="请选择仓库" class="layui-input" style="border-style: none"
id="openSonByDepository" readonly onclick="openDepositoryTree(this)" id="openSonByDepository" readonly onclick="openDepositoryTree(this)"
lay-verify="required"/> lay-verify="required"/>
<input type="text" name=`+"depositoryId"+NewIdNumber+` class="layui-input" id="depositoryId" <input type="text" name=`+"depositoryId"+NewIdNumber+` class="layui-input" id="depositoryId"
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<input type="text" name=`+"placeId"+NewIdNumber+` class="layui-input" id="placeId" <input type="text" name=`+"placeId"+NewIdNumber+` class="layui-input" id="placeId"
style="display: none" lay-verify="required"/> style="display: none" lay-verify="required"/>
<img src="/static/images/search.ico" height="16" width="16"
id="scanLocation"
style="margin-top: 10px" onclick="scanLocationByQrCode(this)">
</div>
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -356,141 +368,6 @@
$("#"+parentId).after(materialItem); $("#"+parentId).after(materialItem);
}; };
// 实现卡片重新渲染
Coverpage = function (num, obj) {
console.log(obj)
var parent = $("#cardParent");
// 获取待添加父类
NewIdNumber = num;
if (num === 0) { // 如果是第一个
NewIdNumber = "";
}
var depositoryItem = `
<div class="layui-form-item">
<label class="layui-form-label">仓库:</label>
<div class="layui-input-block">
<input type="text" placeholder="请选择仓库" class="layui-input"
id="openSonByDepository" readonly onclick="openDepositoryTree(this)"
lay-verify="required"/>
<input type="text" name=` + "depositoryId" + NewIdNumber + ` class="layui-input" id="depositoryId"
style="display: none" lay-verify="required"/>
<input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" value="0"
style="display: none" lay-verify="required"/>
</div>
</div>
`;
if (scanValue.depository !== undefined && scanValue.depository !== null && scanValue.depository !== "") {
let depository = scanValue.depository;
// 如果扫描了仓库
depositoryItem = `<div class="layui-form-item">
<label class="layui-form-label">仓库:</label>
<div class="layui-input-block">
<input type="text" placeholder="请选择仓库" class="layui-input" value=` + depository.dname + `
id="openSonByDepository" readonly onclick="openDepositoryTree(this)"
lay-verify="required"/>
<input type="text" name=` + "depositoryId" + NewIdNumber + ` class="layui-input" id="depositoryId" value=` + depository.did + `
style="display: none" lay-verify="required"/>
<input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" value="0"
style="display: none" lay-verify="required"/>
</div>
</div>`;
}
if (scanValue.place !== undefined && scanValue.place !== null && scanValue.place !== "") {
// 如果扫描了库位
let place = scanValue.place;
depositoryItem = `<div class="layui-form-item">
<label class="layui-form-label">仓库:</label>
<div class="layui-input-block">
<input type="text" placeholder="请选择仓库" class="layui-input"
id="openSonByDepository" readonly onclick="openDepositoryTree(this)" value=` + place.dname + "-" + place.code + `
lay-verify="required"/>
<input type="text" name=` + "depositoryId" + NewIdNumber + ` class="layui-input" id="depositoryId" value=` + place.depositoryId + `
style="display: none" lay-verify="required"/>
<input type="text" name=` + "placeId" + NewIdNumber + ` class="layui-input" id="placeId" value=` + place.pid + `
style="display: none" lay-verify="required"/>
</div>
</div>`;
}
var firstItem =
// 前半部分
` <div class="layui-card-body" style="padding-right: 0px" id=` + "cardItem" + NewIdNumber + `>
<hr>
<i class="layui-icon layui-icon-subtraction" style="display: inline" onclick="deleteItem(this)"></i>
<div class="layui-form-item">
<label class="layui-form-label">物料名称</label>
<div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择物料" class="layui-input" style="border-style: none"
id="openSonByMaterial" lay-verify="required" value="${obj.mname}" onblur="selectMaterialByName(this)"/>
<i class="layui-icon layui-icon-search" style="display: inline" id="selectMaterial" onclick="selectMaterial(this)"></i>
</div>
<input type="text" name=` + "mid" + NewIdNumber + ` class="layui-input" id="mid" value="${obj.mid}"
style="display: none" lay-verify="required" />
</div>
</div>
<div class="layui-form-item">
<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="请填写入物料编码" onblur="selectCode(this)"
class="layui-input" lay-verify="required" value="${obj.code}" style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16" style="margin-top: 10px" onclick="scanCodeByTransfer(this)" >
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">条形编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<select id=`+"barCode"+NewIdNumber+` name=`+"barCode"+NewIdNumber+`></select>
<img src="/static/images/search.ico" height="16" width="16" style="margin-top: 10px" onclick="scanBarCode(this)" >
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">所处库位:</label>
<div class="layui-input-block">
<select name=`+"fromPlaceId"+NewIdNumber +` id=`+"place"+NewIdNumber +`></select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料数量:</label>
<div class="layui-input-block">
<input name=` + "quantity" + NewIdNumber + ` type="number" placeholder="请填写入物料数量" value=""
class="layui-input" lay-verify="number">
</div>
</div>`;
var lastItem = `<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<textarea name=` + "applyRemark" + NewIdNumber + ` placeholder="请填写相关原因及申请原因" value=""
class="layui-textarea"></textarea>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" onclick="addItem(this)"></i>
</div>`;
// 获取当前高度
var height = parseInt(($("#stepForm").css('height')).split("px")[0]);
if (NewIdNumber !== "") {
params.push(NewIdNumber)
}
$("#stepForm").css("height", height + 532 + 'px');
var materialItem = firstItem + depositoryItem + lastItem; // 最终
$("#btn_sub").before(materialItem)
};
// 实现卡片删除 // 实现卡片删除
deleteItem = function (obj) { deleteItem = function (obj) {
@ -508,52 +385,61 @@
// 用于实现扫描条形码 // 用于实现扫描条形码
scanBarCode = function (obj) { scanBarCode = function (obj) {
layer.open({
type: 2, parent.wx.scanQRCode({
title: '扫码', desc: 'scanQRCode desc',
skin: 'layui-layer-rim', needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
maxmin: true, scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
shadeClose: true, //点击遮罩关闭层 success: function (res) {
area: ['100%', '100%'], // 回调
move: '.layui-layer-title', var result = res.resultStr;//当needResult为1时返回处理结果
fixed: false, var req = {};
content: '/scanBarCodeIn', req.qrCode = result;
end: function () {
$.ajax({ $.ajax({
url: "/material/application_transfer_scanBarCode", url: "/material/qywxApplicationTransferScanBarCode",
type: "get", type: "post",
dataType: 'json', dataType: 'json',
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8", contentType: "application/json;charset=utf-8",
success: function (d) { success: function (d) {
// 获取对应元素
var parent = obj.parentNode.parentNode.parentNode.parentNode;
var barCodeChildren = parent.childNodes[9];
var children = parent.childNodes[5];
var materialItem = children.childNodes[3].childNodes[1];
var materialName = materialItem.childNodes[1];
var materialId = materialName.parentNode.parentNode.childNodes[3];
// 条形码条码
var barCodeItem = barCodeChildren.childNodes[3];
// 物料编码
var materialCodeItem = parent.childNodes[7].childNodes[3].childNodes[1];
var materialCode = materialCodeItem.childNodes[1];
var data = d.data; var data = d.data;
console.log(data) if(data!==null) {
var materialList = data["materialList"];
var depository = data["depository"]; materialName.value = data.mname;
var place = data["place"]; materialId.value = data.mid;
if (depository !== undefined && depository !== null && depository !== "") { materialCode.value = data.mcode;
// 如果扫描到仓库 var barCodeInput = barCodeItem.childNodes[1].childNodes[1];
scanValue.depository = depository; barCodeInput.value = result;
}
if (place !== undefined && place !== null && place !== "") { var codeId = obj.id.split("barCodeImg")[1];
// 如果扫描到库位
scanValue.place = place; $('#place' + codeId).empty();
} $.each(data.placePList, function (index, item) {
if (materialList.length > 0) { $('#place' + codeId).append(new Option(item.depositoryName + "-" + item.code, item.id));//往下拉菜单里添加元素
for (let i = 1; i <= materialList.length; i++) { });
materialList[i-1].code = materialList[i-1].mcode;
var placePList = materialList[i-1]["placePList"];
Coverpage(i, materialList[i - 1]);
$.each(materialList, function (index, item) {
$("#barCode"+i).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素
});
$.each(placePList, function (index, item) {
$("#place"+i).append(new Option(item.depositoryName +"-" +item.code, item.id));//往下拉菜单里添加元素
});
}
form.render(); form.render();
} }
} }
}) });
} }
}) })
}; };
@ -572,64 +458,81 @@
} }
// 用于扫码功能 // 用于扫码功能
scanCodeByTransfer = function () { scanCodeByTransfer = function (obj) {
layer.open({ parent.wx.scanQRCode({
type: 2, desc: 'scanQRCode desc',
title: '扫码', needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
skin: 'layui-layer-rim', scanType: ["qrCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
maxmin: true, success: function (res) {
shadeClose: true, //点击遮罩关闭层 // 回调
area: ['100%', '100%'], var result = res.resultStr;//当needResult为1时返回处理结果
move: '.layui-layer-title', var req = {};
fixed: false, req.qrCode = result;
content: '/scanQrCodeTransfer',
end: function () {
$.ajax({ $.ajax({
url: "/material/application_in_scanQrCode", url: "/material/qywxApplicationTransferScanQrCode",
type: "get", type: "post",
dataType: 'json', dataType: 'json',
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8", contentType: "application/json;charset=utf-8",
success: function (d) { success: function (d) {
var data = d.data; var data = d.data;
var materialList = data["materialList"]; // 获取对应元素
var depository = data["depository"]; var parent = obj.parentNode.parentNode.parentNode.parentNode;
var place = data["place"]; var barCodeChildren = parent.childNodes[9];
if (depository !== undefined && depository !== null && depository !== "") { var children = parent.childNodes[5];
// 如果扫描到仓库 var materialItem = children.childNodes[3].childNodes[1];
scanValue.depository = depository; var materialName = materialItem.childNodes[1];
var materialId = materialName.parentNode.parentNode.childNodes[3];
// 条形码条码
var barCodeItem = barCodeChildren.childNodes[3];
// 物料编码
var materialCodeItem = parent.childNodes[7].childNodes[3].childNodes[1];
var materialCode = materialCodeItem.childNodes[1];
var idNumber = materialId.name.split("mid")[1];
// 获取物料与条形码的对应关系
var materialAndBarCodeList = data["materialAndBarCodeList"];
var barCode = $("#barCode" + idNumber);
if (barCode.length > 0) {
barCode.empty();
} }
if (place !== undefined && place !== null && place !== "") { if (materialAndBarCodeList.length > 0) {
// 如果扫描到库位 // 如果有对应的条形码
scanValue.place = place; var barCodeInput = barCodeItem.childNodes[1].childNodes[1];
} var barCodeImg = barCodeItem.childNodes[1].childNodes[3];
if (materialList.length > 0) { var id = barCodeInput.id;
for (let i = 1; i <= materialList.length; i++) { $("#" + id).remove();
Coverpage(i, materialList[i - 1]); $("#barCode" + idNumber).empty();
var materialbyBarCodeList = materialList[i-1]["materialAndBarCodeList"]; var barCode = $("#barCode" + idNumber);
$.each(materialbyBarCodeList, function (index, item) { if (barCode.length > 0) {
$("#barCode"+i).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素 barCode.empty();
}); } else {
var placePList = materialList[i - 1]["placePList"]; var barCodeSelect = `
$.each(placePList, function (index, item) { <select id=` + "barCode" + idNumber + ` name=` + "barCode" + idNumber + `>
$("#place"+i).append(new Option(item.depositoryName + "-" + item.code, item.id));//往下拉菜单里添加元素 </select>`;
}); $("#" + barCodeImg.id).before(barCodeSelect);
} }
form.render(); form.render();
} else { $.each(materialAndBarCodeList, function (index, item) {
var material = {}; $("#barCode" + idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素
material.mname = ''; });
material.mid = ''; form.render();
material.code = '';
Coverpage(0, material);
} }
$('#place' + idNumber).empty();
$.each(data.placePList, function (index, item) {
$('#place' + idNumber).append(new Option(item.depositoryName + "-" + item.code, item.id));//往下拉菜单里添加元素
});
form.render();
materialName.value = data.mname;
materialId.value = data.id;
materialCode.value = data.code;
} }
}) })
} }
}) })
}; };
// 用于实现通过编码查询物料 // 用于实现通过编码查询物料
selectCode = function(obj){ selectCode = function(obj){
// 输入code // 输入code
@ -669,26 +572,38 @@
data:JSON.stringify(req), data:JSON.stringify(req),
contentType: "application/json;charset=utf-8", contentType: "application/json;charset=utf-8",
success:function (res) { success:function (res) {
var idNumber = materialId.name.split("mid")[1];
// 获取物料与条形码的对应关系 // 获取物料与条形码的对应关系
var materialAndBarCodeList = d["materialAndBarCodeList"]; var materialAndBarCodeList = d["materialAndBarCodeList"];
if(materialAndBarCodeList.length > 0){ var barCode = $("#barCode" + idNumber);
if (barCode.length > 0) {
barCode.empty();
}
if (materialAndBarCodeList.length > 0) {
// 如果有对应的条形码 // 如果有对应的条形码
var barCodeInput = barCodeItem.childNodes[1].childNodes[1]; var barCodeInput = barCodeItem.childNodes[1].childNodes[1];
var barCodeImg = barCodeItem.childNodes[1].childNodes[3]; var barCodeImg = barCodeItem.childNodes[1].childNodes[3];
var id = barCodeInput.id; var id = barCodeInput.id;
$("#"+id).remove(); $("#" + id).remove();
var idNumber = materialId.name.split("mid")[1]; var barCode = $("#barCode" + idNumber);
var barCodeSelect = ` if (barCode.length > 0) {
<select id=`+"barCode"+idNumber+` name=`+"barCode"+idNumber+ `> barCode.empty();
} else {
var barCodeSelect = `
<select id=` + "barCode" + idNumber + ` name=` + "barCode" + idNumber + `>
</select>`; </select>`;
$("#"+barCodeImg.id).before(barCodeSelect); $("#" + barCodeImg.id).before(barCodeSelect);
}
form.render();
$.each(materialAndBarCodeList, function (index, item) { $.each(materialAndBarCodeList, function (index, item) {
$("#barCode"+idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素 $("#barCode" + idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素
}); });
form.render();
} }
$('#place'+codeId).empty(); $('#place' + codeId).empty();
$.each(res.data, function (index, item) { $.each(res.data, function (index, item) {
$('#place'+codeId).append(new Option(item.depositoryName+"-"+item.code, item.id));//往下拉菜单里添加元素 $('#place' + codeId).append(new Option(item.depositoryName + "-" + item.code, item.id));//往下拉菜单里添加元素
}); });
form.render(); form.render();
materialName.value = d.mname; materialName.value = d.mname;
@ -809,6 +724,52 @@
content: '/selectDepositoryByCard?type=1&clickObj='+parentId, content: '/selectDepositoryByCard?type=1&clickObj='+parentId,
}); });
} }
// 用于扫描入库位置
scanLocationByQrCode = function (obj) {
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var req = {};
req.qrCode = result;
$.ajax({
url: "/place/qywxApplicationInScanQrCode",
type: "post",
dataType: 'json',
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (d) {
var data = d.data;
var flag = data["flag"];
var parent = obj.parentNode;
var depositoryName = parent.childNodes[1];
var depositoryId = parent.childNodes[3];
var placeId = parent.childNodes[5];
if(flag === 0){
// 如果没有获取到位置
layer.msg("当前二维码错误,请重新扫描");
}else if(flag === 1){
// 如果获取到的是库位
var place = data["place"];
placeId.value = place.id;
depositoryId.value = place.did;
depositoryName.value = place.depositoryName;
}else if(flag === 2){
// 如果获取到的是仓库
var depository = data["depository"];
placeId.value = 0;
depositoryId.value = depository.id;
depositoryName.value = depository.dname;
}
}
})
}
})
}
}) })

24
src/main/resources/templates/pages/material/material-add.html

@ -55,7 +55,7 @@
<label class="layui-form-label">规格型号:</label> <label class="layui-form-label">规格型号:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="text" placeholder="请填写规格型号" class="layui-input" <input type="text" placeholder="请填写规格型号" class="layui-input"
name="version" lay-verify="required"/> name="version"/>
</div> </div>
</div> </div>
@ -72,14 +72,14 @@
<label class="layui-form-label">材质:</label> <label class="layui-form-label">材质:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="text" placeholder="请填写材质名称" class="layui-input" <input type="text" placeholder="请填写材质名称" class="layui-input"
name="texture" lay-verify="required"/> name="texture" />
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">计量单位:</label> <label class="layui-form-label">计量单位:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="text" placeholder="请填写计量单位" class="layui-input" <input type="text" placeholder="请填写计量单位" class="layui-input"
name="unit" lay-verify="required"/> name="unit" />
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -147,17 +147,13 @@
}; };
scanBarCode = function(){ scanBarCode = function(){
layer.open({ parent.wx.scanQRCode({
type: 2, desc: 'scanQRCode desc',
title: '扫码', needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
skin: 'layui-layer-rim', scanType: ["barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
maxmin: true, success: function (res) {
shadeClose: true, //点击遮罩关闭层 var result = res.resultStr;//当needResult为1时返回处理结果
area: ['100%', '100%'], $("#barcode").val(result)
move: '.layui-layer-title',
fixed: false,
content: '/scanBarCode',
end: function () {
} }
}) })
}; };

32
src/main/resources/templates/pages/material/material-view.html

@ -93,7 +93,8 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">二维码</label> <label class="layui-form-label">二维码</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
<img src="" id="qrCode" th:src="${qrCode}"> <input id="createCode" type="button" class="layui-btn layui-btn-radius layui-btn-normal" onclick="createQrCode()" value="生成二维码"/>
<img id="qrCode" style="display:none;">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -120,6 +121,12 @@
<script> <script>
function changeQrCodeState() { function changeQrCodeState() {
}; };
function createQrCode() {
};
function checkBarCode() {
}
var barCode = []; var barCode = [];
var flag = false; var flag = false;
layui.use('form', function () { layui.use('form', function () {
@ -186,6 +193,29 @@
fixed: false, fixed: false,
content: '/checkBarCode?mid='+mid, content: '/checkBarCode?mid='+mid,
}) })
};
createQrCode = function () {
var mid = $("#mid").val();
var req = {};
req.mid = mid;
$.ajax({
url: "/material/createQrCode",
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
data: JSON.stringify(req),
beforeSend: function () {
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']});
},
success: function (d) {
var data = d.data;
layer.close(this.layerIndex);
$("#qrCode").attr("src",data);
$("#qrCode").show();
$("#createCode").hide();
}
})
} }
}); });

29
src/main/resources/templates/pages/place/place_edit.html

@ -22,7 +22,7 @@
style="margin: 0 auto;max-width: 700px;padding-top: 100px; padding-bottom: 200px" lay-filter="form1"> style="margin: 0 auto;max-width: 700px;padding-top: 100px; padding-bottom: 200px" lay-filter="form1">
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">库位行:</label> <label class="layui-form-label">库位行:</label>
<input th:value="${place.getId()}" name = "id" type="text" style="display: none"> <input th:value="${place.getId()}" id="placeId" name = "id" type="text" style="display: none">
<input th:value="${place.getDid()}" id="depositoryId" name = "did" type="text" style="display: none"> <input th:value="${place.getDid()}" id="depositoryId" name = "did" type="text" style="display: none">
<div class="layui-input-block"> <div class="layui-input-block">
<input type="text" placeholder="请填写行数" class="layui-input" th:value="${place.getX()}" <input type="text" placeholder="请填写行数" class="layui-input" th:value="${place.getX()}"
@ -60,7 +60,8 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">二维码</label> <label class="layui-form-label">二维码</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
<img src="" id="qrCode" th:src="${qrCode}"> <img id="qrCode" style="display:none;">
<input id="createCode" type="button" class="layui-btn layui-btn-radius layui-btn-normal" onclick="createQrCode()" value="生成二维码"/>
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -85,7 +86,9 @@
<script> <script>
var data; var data;
function createQrCode() {
};
layui.use(['form', 'layer','dropdown','tree'], function () { layui.use(['form', 'layer','dropdown','tree'], function () {
var $ = layui.jquery, var $ = layui.jquery,
form = layui.form, form = layui.form,
@ -130,6 +133,28 @@
return false; return false;
}); });
createQrCode = function () {
var placeId = $("#placeId").val();
var req = {};
req.pid = placeId;
$.ajax({
url: "/place/createQrCode",
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
data: JSON.stringify(req),
beforeSend: function () {
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']});
},
success: function (d) {
var data = d.data;
layer.close(this.layerIndex);
$("#qrCode").attr("src",data);
$("#qrCode").show();
$("#createCode").hide();
}
})
}
}); });
</script> </script>

2
src/main/resources/templates/pages/scanQrCode/ScanBarCode.html

@ -58,7 +58,7 @@
// 停止失败,处理它。 // 停止失败,处理它。
}); });
}; };
const config = { fps: 10, qrbox: { width: 250, height: 250 } }; const config = { fps: 10, aspectRatio: 2 };
// Select back camera or fail with `OverconstrainedError`. // Select back camera or fail with `OverconstrainedError`.
html5QrCode.start({ facingMode: { exact: "environment"} }, config, qrCodeSuccessCallback); html5QrCode.start({ facingMode: { exact: "environment"} }, config, qrCodeSuccessCallback);

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

@ -74,7 +74,7 @@
// 停止失败,处理它。 // 停止失败,处理它。
}); });
}; };
const config = {fps: 10, qrbox: {width: 250, height: 250}}; const config = {fps: 10, aspectRatio: 2 };
// Select back camera or fail with `OverconstrainedError`. // Select back camera or fail with `OverconstrainedError`.
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback); html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback);

2
src/main/resources/templates/pages/scanQrCode/ScanBarCodeForTaking.html

@ -123,7 +123,7 @@
// 停止失败,处理它。 // 停止失败,处理它。
}); });
}; };
const config = { fps: 10, qrbox: { width: 250, height: 250 } }; const config = { fps: 10, aspectRatio: 2 };
// Select back camera or fail with `OverconstrainedError`. // Select back camera or fail with `OverconstrainedError`.
html5QrCode.start({ facingMode: { exact: "environment"} }, config, qrCodeSuccessCallback); html5QrCode.start({ facingMode: { exact: "environment"} }, config, qrCodeSuccessCallback);

126
src/main/resources/templates/pages/scanQrCode/ScanBarCodeIn.html

@ -1,126 +0,0 @@
<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>扫码</title>
<link rel="stylesheet" href="/static/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="/static/css/layuimini.css?v=2.0.4.2" media="all">
<link rel="stylesheet" href="/static/css/themes/default.css" media="all">
<link rel="stylesheet" href="/static/lib/font-awesome-4.7.0/css/font-awesome.min.css" media="all">
<!--[if lt IE 9]>
<script src="/static/js/html5.min.js"></script>
<script src="/static/js/respond.min.js"></script>
<![endif]-->
<!-- vue相关-->
<script src="../static/js/vue/vue.js"></script>
<script src="../static/js/vue/vue-router.js"></script>
<script src="../static/lib/http-vue-loader/src/httpVueLoader.js"></script>
<script src="../static/js/VueQrcodeReader.umd.min.js"></script>
<script src="/static/js/scanBarCode/html5-qrcode.min.js"></script>
</head>
<body>
<div style="width: 500px" id="reader">
</div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
// 用于判断是否包含字母
var regString = /[a-zA-Z]+/;
let barCodeList = [];
var depository;
var place;
// 是否扫描二维码标志位
var flag = false;
const html5QrCode = new Html5Qrcode("reader");
const qrCodeSuccessCallback = (decodedText, decodedResult) => {
/* 扫描成功 */
// console.log(regString.test(decodedText));
var formatName = decodedResult.result.format.formatName;
if (formatName.includes("QR_CODE")||formatName.includes("AZTEC")) {
console.log("二维码",decodedText);
// 如果扫描的位本地二维码
flag = true;
// 先解密
let jmResult = {};
jmResult.result = decodedText;
layui.$.ajax({
url: "/material/decode3Des",
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
data: JSON.stringify(jmResult),
success:function (d) {
let parse = JSON.parse(d.data);
if (parse.did !== undefined) {
// 如果扫描的是仓库二维码
depository = parse;
}
if (parse.pid !== undefined) {
// 如果扫描的是库位二维码
place = parse;
}
}
})
}else{
// console.log("条形码",decodedText);
// 如果是条形码
barCodeList.push(decodedText);
}
html5QrCode.stop().then((ignore) => {
// 暂停扫描
layer.confirm("是否继续扫描?",
{
btn: ["继续", "取消"]
},
function () {// 继续
// 弹出选择框
layer.close(layer.index);
html5QrCode.start({ facingMode: { exact: "environment"} }, config, qrCodeSuccessCallback);
},
function () { // 取消当前操作
layer.close(layer.index); // 关闭弹窗
// 将数据暂存到redis
var param = {};
param.barCodeList = barCodeList;
param.flag = flag;
layui.$.ajax({
url:"/material/temporaryBarCodeValueForMaterial",
type:"post",
datatype:"json",
data:JSON.stringify(param),
contentType: "application/json;charset=utf-8",
});
if(flag){
var params = {};
params.depository = depository;
params.place = place;
params.materialList = [];
layui.$.ajax({
url: "/material/temporaryValue",
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
data: JSON.stringify(params)
});
}
// 关闭当前页
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
)
}).catch((err) => {
console.log(err)
// 停止失败,处理它。
});
};
const config = { fps: 10, qrbox: { width: 250, height: 250 } };
// Select back camera or fail with `OverconstrainedError`.
html5QrCode.start({ facingMode: { exact: "environment"} }, config, qrCodeSuccessCallback);
</script>
</body>
</html>

2
src/main/resources/templates/pages/scanQrCode/ScanBarCodeOut.html

@ -115,7 +115,7 @@
// 停止失败,处理它。 // 停止失败,处理它。
}); });
}; };
const config = { fps: 10, qrbox: { width: 250, height: 250 } }; const config = { fps: 10, aspectRatio: 2 };
// Select back camera or fail with `OverconstrainedError`. // Select back camera or fail with `OverconstrainedError`.
html5QrCode.start({ facingMode: { exact: "environment"} }, config, qrCodeSuccessCallback); html5QrCode.start({ facingMode: { exact: "environment"} }, config, qrCodeSuccessCallback);

504
src/main/resources/templates/pages/scanQrCode/ScanBarOrQrCodeOut.html

@ -43,247 +43,30 @@
var depository = null; var depository = null;
var place = null; var place = null;
var material = null; var material = null;
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")) {
// 如果是二维码
let params = {}; // 用于暂存扫描结果
let jmResult = {};
jmResult.result = decodedText;
// 解密当前二维码
layui.$.ajax({
url: "/material/decode3Des",
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
data: JSON.stringify(jmResult),
success: function (d) {
let parse = JSON.parse(d.data);
console.log(parse);
if (parse.did !== undefined) {
//如果扫描的为仓库
depository = parse;// 将扫描结果保存到vue中
if (material == null) {
// 如果还没有扫描物料
layer.confirm("请扫描物料", {
btn: ["扫描", "取消"]
}, function () { // 继续
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback); // 继续扫描
layer.close(layer.index); // 关闭弹窗
}, function () { // 取消
// 关闭当前页
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
} else {
// 如果已经扫描物料
if (depositoryId !== parse.did && Number(depositoryId) !== parse.did && depositoryId !== parse.did.toString()) {
// 如果当前仓库不是订单对应仓库
depository = null;
place = null;
layer.msg("出库仓库不正确,请重新扫描");
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback); // 继续扫描
} else {
// 如果正确
var req = {};
req.id = id;
isOutTrue(req);
}
}
} else if (parse.pid !== undefined) {
// 如果扫描的为库位
place = parse;// 将扫描结果保存到vue中
if ( material == null) {
// 如果还没有扫描物料
layer.confirm("请扫描物料", {
btn: ["扫描", "取消"]
}, function () { // 继续
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback); // 继续扫描
layer.close(layer.index); // 关闭弹窗
}, function () { // 取消
// 关闭当前页
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}) layui.$(function () {
} else { parent.parent.parent.wx.scanQRCode({
if (depositoryId !== parse.depositoryId && Number(depositoryId) !== parse.depositoryId && depositoryId !== parse.depositoryId.toString()) { desc: 'scanQRCode desc',
// 如果当前仓库不是订单对应仓库 needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
depository = null; scanType: ["barCode","qrCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
place = null; success: function (res) {
layer.msg("出库库位所在仓库不正确,请重新扫描"); // 回调
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback); // 继续扫描 var result = res.resultStr;//当needResult为1时返回处理结果
} else if (parse.mcodeList.indexOf(mcode) === -1) { var req = {};
// 如果当前库位不存在该物料 req.qrCode = result;
depository = null; outboundLogic(req);
place = null;
layer.msg("出库库位不含该物料,请重新扫描"); },
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback); // 继续扫描 error: function(res) {
} else { if (res.errMsg.indexOf('function_not_exist') > 0) {
var req = {}; alert('版本过低请升级')
req.placeId = place.pid; }
req.id = id;
isOutTrue(req);
}
}
} else if (parse.mid !== undefined) {
// 如果扫描的为物料
material = parse;// 将扫描结果保存到vue中
if (mcode !== material.code && Number(mcode) !== material.code && mcode !== material.code.toString()) {
material = null;
layer.msg("出库物料不正确,请重新扫描");
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback); // 继续扫描
} else {
if (depository !== null) { // 如果已经扫描仓库
if (depositoryId !== depository.did && Number(depositoryId) !== depository.did && depositoryId !== depository.did.toString()) {
// 如果扫描的仓库不是订单要求的仓库
layer.confirm("当前仓库不符合要求,请移步至正确仓库", {
btn: ["确定"]
}, function () {
// 关闭当前页
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
} else {
// 如果是出库位置为默认库位
var req = {};
req.id = id;
// 弹出确定框
isOutTrue(req);
}
} else if ( place != null) {
// 如果已经扫描库位
if (depositoryId !== place.depositoryId && Number(depositoryId) !== place.depositoryId && depositoryId !== place.depositoryId.toString()) {
// 如果当前仓库不是订单对应仓库
depository = null;
place = null;
layer.msg("出库库位所在仓库不正确,请重新扫描");
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback); // 继续扫描
} else if ( place.mcodeList.indexOf(mcode) === -1) {
// 如果当前库位不存在该物料
depository = null;
place = null;
layer.msg("出库库位不含该物料,请重新扫描");
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback); // 继续扫描
} else {
var req = {};
req.id = id;
req.placeId = place.pid;
// 弹出确定框
isOutTrue(req);
}
} else {
layer.confirm("请扫描仓库或库位", {
btn: ["扫描", "取消"]
}, function () { // 继续
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback); // 继续扫描
layer.close(layer.index); // 关闭弹窗
}, function () { // 取消
// 关闭当前页
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
}
}
}
}
});
}
else {
// 如果是条码
// 发送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) {
// 如果没有查询到物料
layer.msg("未查询到对应物料,请重新扫描");
// 继续扫描
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback); // 继续扫描
} else {
material =data;
// 查询到物料
if (mcode !== data.code && Number(mcode) !== data.code && mcode !== data.code.toString()) {
material = null;
layer.msg("出库物料不正确,请重新扫描");
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback); // 继续扫描
} else {
if (depository !== null) { // 如果已经扫描仓库
if (depositoryId !== depository.did && Number(depositoryId) !== depository.did && depositoryId !== depository.did.toString()) {
// 如果扫描的仓库不是订单要求的仓库
layer.confirm("当前仓库不符合要求,请移步至正确仓库", {
btn: ["确定"]
}, function () {
//关闭当前页
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
} else {
// 如果是出库位置为默认库位
var req = {};
req.id = id;
// 弹出确定框
isOutTrue(req);
}
} else if (place != null) {
// 如果已经扫描库位
if (depositoryId !== place.depositoryId && Number(depositoryId) !== place.depositoryId && depositoryId !== place.depositoryId.toString()) {
// 如果当前仓库不是订单对应仓库
depository = null;
place = null;
layer.msg("出库库位所在仓库不正确,请重新扫描");
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback); // 继续扫描
} else if (place.mcodeList.indexOf(mcode) === -1) {
// 如果当前库位不存在该物料
depository = null;
place = null;
layer.msg("出库库位不含该物料,请重新扫描");
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback); // 继续扫描
} else {
var req = {};
req.id = id;
req.placeId = place.pid;
// 弹出确定框
isOutTrue(req);
}
} else {
layer.confirm("请扫描仓库或库位", {
btn: ["扫描", "取消"]
}, function () { // 继续
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback); // 继续扫描
layer.close(layer.index); // 关闭弹窗
}, function () { // 取消
// 将vue中暂存的库位置为空
material = null;
//关闭当前页
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
}
}
}
}
})
} }
}).catch((err) => {
console.log(err)
// 停止失败,处理它。
}); });
});
};
// 弹出出库确定弹出框 // 弹出出库确定弹出框
isOutTrue = function (req) { isOutTrue = function (req) {
@ -330,12 +113,257 @@
depository = null; depository = null;
material = null; material = null;
place = null; place = null;
layer.close(layer.index);
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
};
// 具体出库逻辑
outboundLogic = function (req) {
layui.$.ajax({
url: "/material/qywxScanCodeOut",
type: "post",
dataType: 'json',
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (d) {
var data = d.data;
// 获取标准
var flag = data.flag;
if (flag === 0) {
// 如果是无效码
layer.msg("扫描失败,请确认扫描是否正确");
}
else if (flag === 1) {
// 如果是物料
material = data.material;
if (mcode !== material.code && Number(mcode) !== material.code && mcode !== material.code.toString()) {
layer.confirm("出库物料不正确,请重新扫描", {
btn: ["确定","取消"]
}, function(){
material = null;
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 (depository !== null) { // 如果已经扫描仓库
if (depositoryId !== depository.did && Number(depositoryId) !== depository.did && depositoryId !== depository.did.toString()) {
// 如果扫描的仓库不是订单要求的仓库
layer.confirm("当前仓库不符合要求,请移步至正确仓库", {
btn: ["确定"]
}, function () {
// 关闭当前页
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
} else {
// 如果是出库位置为默认库位
var param = {};
param.id = id;
param.placeId = place.id;
// 弹出确定框
isOutTrue(param);
}
}
else if (place != null) {
// 如果已经扫描库位
if (depositoryId !== place.did && Number(depositoryId) !== place.did && depositoryId !== place.did.toString()) {
// 如果当前仓库不是订单对应仓库
depository = null;
place = null;
layer.confirm("当前库位不符合要求,请移步至正确库位", {
btn: ["确定"]
}, function () {
// 关闭当前页
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
} else if (place.mcodeList.indexOf(mcode) === -1) {
// 如果当前库位不存在该物料
depository = null;
place = null;
layer.confirm("出库库位不含该物料,请重新扫描", {
btn: ["确定"]
}, function () {
// 关闭当前页
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
} else {
var param = {};
param.id = id;
param.placeId = place.id;
// 弹出确定框
isOutTrue(param);
}
}
else {
layer.confirm("请扫描仓库或库位", {
btn: ["扫描", "取消"]
}, function () { // 继续
layer.close(layer.index); // 关闭弹窗
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 === 2) {
// 如果扫描的为库位
place = data.place;// 将扫描结果保存到vue中
if ( material == null) {
// 如果还没有扫描物料
layer.confirm("请扫描物料", {
btn: ["扫描", "取消"]
}, function () { // 继续
layer.close(layer.index); // 关闭弹窗
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 (depositoryId !== place.did && Number(depositoryId) !== place.did && depositoryId !== place.did.toString()) {
// 如果当前仓库不是订单对应仓库
depository = null;
place = null;
layer.confirm("当前库位不符合要求,请移步至正确库位", {
btn: ["确定"]
}, function () {
// 关闭当前页
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
} else if (place.mcodeList.indexOf(mcode) === -1) {
// 如果当前库位不存在该物料
depository = null;
place = null;
layer.confirm("出库库位不含该物料,请重新扫描", {
btn: ["确定"]
}, function () {
// 关闭当前页
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
} else {
var param = {};
param.id = id;
param.placeId = place.id;
// 弹出确定框
isOutTrue(param);
}
}
}
else if (flag === 3) {
// 如果是仓库
depository = data.depository;// 将扫描结果保存到vue中
if (material == null) {
// 如果还没有扫描物料
layer.confirm("请扫描物料", {
btn: ["扫描", "取消"]
}, function () { // 继续
layer.close(layer.index); // 关闭弹窗
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 (depositoryId !== depository.id && Number(depositoryId) !== depository.id && depositoryId !== depository.id.toString()) {
// 如果当前仓库不是订单对应仓库
depository = null;
place = null;
layer.confirm("当前仓库不符合要求,请移步至正确仓库", {
btn: ["确定"]
}, function () {
// 关闭当前页
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
} else {
// 如果正确
var param = {};
param.id = id;
// 弹出确定框
isOutTrue(param);
}
}
}
}
}) })
} }
const config = {fps: 10, qrbox: {width: 250, height: 250}};
// Select back camera or fail with `OverconstrainedError`.
html5QrCode.start({facingMode: {exact: "environment"}}, config, qrCodeSuccessCallback);
</script> </script>
</body> </body>
</html> </html>

2
src/main/resources/templates/pages/scanQrCode/ScanCodeByTaking.html

@ -91,7 +91,7 @@
// 停止失败,处理它。 // 停止失败,处理它。
}); });
}; };
const config = { fps: 10, qrbox: { width: 250, height: 250 } }; const config = { fps: 10, aspectRatio: 2 };
// Select back camera or fail with `OverconstrainedError`. // Select back camera or fail with `OverconstrainedError`.
html5QrCode.start({ facingMode: { exact: "environment"} }, config, qrCodeSuccessCallback); html5QrCode.start({ facingMode: { exact: "environment"} }, config, qrCodeSuccessCallback);

507
src/main/resources/templates/pages/scanQrCode/ScanQrCode.html

@ -46,300 +46,259 @@
</style> </style>
</head> </head>
<body> <body>
<div id="app">
<qrcode-stream :camera="camera" @decode="onDecode" @init="onInit" :track="paintBoundingBox">
<div v-if="validationPending" class="validation-pending">
Long validation in progress...
</div>
</qrcode-stream>
</div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script> <script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script> <script>
Vue.use(httpVueLoader);
var vue = new Vue({ function outboundLogic() {
data() {
return {
isValid: undefined,
camera: 'auto',
result: '',
error: '',
materialList: [],
depository: null,
place: null
} };
}, function temporaryScanValue() {
computed: {
validationPending() { }
return this.isValid === undefined function chooseInOrOut() {
&& this.camera === 'off'
}
var materialList = [],
depository= null,
place=null;
let params = {}; // 用于暂存扫描结果
layui.$(function () {
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var req = {};
req.qrCode = result;
outboundLogic(req);
}, },
}, error: function (res) {
methods: { if (res.errMsg.indexOf('function_not_exist') > 0) {
onDecode(result) { alert('版本过低请升级')
let params = {}; // 用于暂存扫描结果 }
this.result = result; }
let jmResult = {}; });
jmResult.result = result; })
layui.$.ajax({
url: "/material/decode3Des",
type: 'post',
dataType: 'json', outboundLogic = function (req) {
contentType: "application/json;charset=utf-8", layui.$.ajax({
data: JSON.stringify(jmResult), url: "/material/qywxScanCodeOut",
success:function (d) { type: "post",
let parse = JSON.parse(d.data); dataType: 'json',
vue.turnCameraOff(); // 暂停扫描 data: JSON.stringify(req),
if (parse.did !== undefined) { contentType: "application/json;charset=utf-8",
// 如果扫描的是仓库二维码 success: function (d) {
vue.depository = parse;// 将扫描结果保存到vue中 var data = d.data;
params.depository = vue.depository; // 获取标准
params.place = vue.place; var flag = data.flag;
params.materialList = vue.materialList; if (flag === 0) {
if (vue.materialList.length > 0) { // 如果是无效码
// 如果有物料 layer.msg("扫描失败,请确认扫描是否正确");
vue.temporaryScanValue(params); // 将数据暂存至redis中 }
vue.chooseInOrOut(); // 弹出选择框 else if (flag === 1) {
} else { // 如果是物料
// 如果没有 material = data.material;
layer.confirm("暂未选择物料,是否继续扫描", { materialList.push(material);
btn:["继续","取消"] layer.confirm("是否继续扫描",
},function () { // 继续 {
vue.turnCameraOn(); // 继续扫描 btn: ["继续", "取消"]
layer.close(layer.index); // 关闭弹窗 },
},function () { // 取消 function () { // 继续扫描物料
vue.temporaryScanValue(params); // 将数据暂存 layer.close(layer.index); // 关闭弹窗
vue.chooseInOrOut(); // 弹出选择框 parent.wx.scanQRCode({
}) desc: 'scanQRCode desc',
} needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
} scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
else if (parse.pid !== undefined) { success: function (res) {
// 如果扫描的是库位二维码 // 回调
vue.place = parse; // 将扫描结果保存到vue中 var result = res.resultStr;//当needResult为1时返回处理结果
params.depository = vue.depository; var param = {};
params.place = vue.place; param.qrCode = result;
params.materialList = vue.materialList; outboundLogic(param);
if (vue.materialList.length > 0) { },
// 如果有物料 error: function (res) {
vue.temporaryScanValue(params); // 将数据暂存至redis中 if (res.errMsg.indexOf('function_not_exist') > 0) {
vue.chooseInOrOut(); // 弹出选择框 alert('版本过低请升级')
}
}
});
},
function () {
// 不扫描物料
params.materialList = materialList;
params.depository = depository;
params.place = place;
temporaryScanValue(params); // 将物料暂存
if (depository !== null || place !== null) {
// 如果已经扫描了仓库或库位
// 弹出选择框
chooseInOrOut();
} else { } else {
// 如果没有 // 如果没有扫描仓库或库位
layer.confirm("当前并未扫描物料,是否继续扫描", layer.confirm("暂未扫描仓库,是否继续该操作",
{btn:["继续","取消"]}, {
function () { // 继续扫描 btn: ["继续", "取消"]
vue.turnCameraOn(); // 继续扫描
layer.close(layer.index); // 关闭弹窗
}, },
function () { function () {// 继续
vue.temporaryScanValue(params); // 将数据暂存
vue.chooseInOrOut(); // 弹出选择框
}
)
}
}
else if (parse.mid !== undefined) {
// 如果扫描的是物料二维码
vue.materialList.push(parse);
layer.confirm("是否继续扫描",
{
btn: ["继续", "取消"]
},
function () { // 继续扫描物料
vue.turnCameraOn(); // 继续扫描
layer.close(layer.index); // 关闭弹窗
},
function () {
// 不扫描物料
params.materialList = vue.materialList;
params.depository = vue.depository;
params.place = vue.place;
vue.temporaryScanValue(params); // 将物料暂存
if ( vue.depository !== null || vue.place !== null) {
// 如果已经扫描了仓库或库位
// 弹出选择框 // 弹出选择框
vue.chooseInOrOut(); chooseInOrOut();
} },
else { function () { // 取消当前操作
// 如果没有扫描仓库或库位 layer.close(layer.index); // 关闭弹窗
layer.confirm("暂未扫描仓库,是否继续该操作", parent.wx.scanQRCode({
{ desc: 'scanQRCode desc',
btn: ["继续", "取消"] needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
}, scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
function () {// 继续 success: function (res) {
// 弹出选择框 // 回调
vue.chooseInOrOut(); var result = res.resultStr;//当needResult为1时返回处理结果
var param = {};
param.qrCode = result;
outboundLogic(param);
}, },
function () { // 取消当前操作 error: function (res) {
vue.turnCameraOn(); // 继续扫描 if (res.errMsg.indexOf('function_not_exist') > 0) {
layer.close(layer.index); // 关闭弹窗 alert('版本过低请升级')
}
} }
) });
} }
} )
) }
} })
}
else if (flag === 2) {
// 如果扫描的为库位
place = data.place;// 暂存扫描结果
params.depository = depository;
params.place = place;
params.materialList = materialList;
if (materialList.length > 0) {
// 如果有物料
temporaryScanValue(params); // 将数据暂存至redis中
chooseInOrOut(); // 弹出选择框
} else {
// 如果没有
layer.confirm("当前并未扫描物料,是否继续扫描",
{btn:["继续","取消"]},
function () { // 继续扫描
layer.close(layer.index); // 关闭弹窗
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var req = {};
req.qrCode = result;
outboundLogic(req);
},
error: function (res) {
if (res.errMsg.indexOf('function_not_exist') > 0) {
alert('版本过低请升级')
}
}
})
},
function () {
temporaryScanValue(params); // 将数据暂存
chooseInOrOut(); // 弹出选择框
}
)
} }
});
},
/*layer.confirm("请选择入库|出库",{ } else if (flag === 3) {
btn:["入库","出库"]}, // 如果是仓库
function () { depository = data.depository;
layer.open({ params.depository = depository;
type: 2, params.place = place;
title: '入库', params.materialList = materialList;
skin: 'layui-layer-rim', if (materialList.length > 0) {
maxmin: true, // 如果有物料
shadeClose: true, //点击遮罩关闭层 temporaryScanValue(params); // 将数据暂存至redis中
area: ['100%', '100%'], chooseInOrOut(); // 弹出选择框
move : '.layui-layer-title',
fixed:false,
content: '/application_in_back?mid='+material.mid,
})
},function () {
let req = {};
req.code = material.code;
req.type = "out";
layui.$.ajax({
url: "/material/findMatrialByCode",
type: "get",
dataType: 'json',
data:(req),
contentType: "application/json;charset=utf-8",
success: function (d) {
var d = d.data;
if(d !== null){
if(d == null) {
layer.msg("没有该编码,请确认是否输入正确");
}else{
layer.open({
type: 2,
title: '出库',
skin: 'layui-layer-rim',
maxmin: true,
shadeClose: true, //点击遮罩关闭层
area: ['100%', '100%'],
move : '.layui-layer-title',
fixed:false,
content: '/application_out_back?code='+d.code+"&depositoryCode="+d.depositoryCode,
})
}
}
}
})
}
)*/
async onInit(promise) {
try {
await promise.then(this.resetValidationState)
} catch (error) {
if (error.name === 'NotAllowedError') {
this.error = "ERROR: you need to grant camera access permission"
} else if (error.name === 'NotFoundError') {
this.error = "ERROR: no camera on this device"
} else if (error.name === 'NotSupportedError') {
this.error = "ERROR: secure context required (HTTPS, localhost)"
} else if (error.name === 'NotReadableError') {
this.error = "ERROR: is the camera already in use?"
} else if (error.name === 'OverconstrainedError') {
this.error = "ERROR: installed cameras are not suitable"
} else if (error.name === 'StreamApiNotSupportedError') {
this.error = "ERROR: Stream API is not supported in this browser"
} else if (error.name === 'InsecureContextError') {
this.error = 'ERROR: Camera access is only permitted in secure context. Use HTTPS or localhost rather than HTTP.';
} else { } else {
this.error = `ERROR: Camera error (${error.name})` // 如果没有
layer.confirm("暂未选择物料,是否继续扫描", {
btn:["继续","取消"]
},function () { // 继续
layer.close(layer.index); // 关闭弹窗
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var req = {};
req.qrCode = result;
outboundLogic(req);
},
error: function (res) {
if (res.errMsg.indexOf('function_not_exist') > 0) {
alert('版本过低请升级')
}
}
});
},function () { // 取消
temporaryScanValue(params); // 将数据暂存
chooseInOrOut(); // 弹出选择框
})
} }
console.log(this.error)
} }
} }
, })
resetValidationState() { };
this.isValid = undefined temporaryScanValue = function (params) {
} layui.$.ajax({
, url: "/material/temporaryValue",
// 绘制二维码跟踪框 type: 'post',
paintBoundingBox(detectedCodes, ctx) { dataType: 'json',
for (const detectedCode of detectedCodes) { contentType: "application/json;charset=utf-8",
const {boundingBox: {x, y, width, height}} = detectedCode; data: JSON.stringify(params)
ctx.lineWidth = 2; });
ctx.strokeStyle = '#007bff'; };
ctx.strokeRect(x, y, width, height) // 弹出入库|出库选择框
} chooseInOrOut = function () {
} layer.confirm("是否入库", {
, btn: ["入库", "取消"]
// 打开相机
turnCameraOn() {
this.camera = 'auto'
}
,
// 关闭相机
turnCameraOff() {
this.camera = 'off'
}, },
// 将扫描到的数据暂存到redis function () { // 选择入库
temporaryScanValue(params) { layer.open({
layui.$.ajax({ type: 2,
url: "/material/temporaryValue", title: '入库',
type: 'post', skin: 'layui-layer-rim',
dataType: 'json', maxmin: true,
contentType: "application/json;charset=utf-8", shadeClose: true, //点击遮罩关闭层
data: JSON.stringify(params) area: ['100%', '100%'],
}); move: '.layui-layer-title',
fixed: false,
content: '/application_in_scanQrCode',
end: function () {
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
})
}, },
// 弹出入库|出库选择框 function () { // 选择取消
chooseInOrOut(){ var index = parent.layer.getFrameIndex(window.name);
layer.confirm("是否入库", { parent.layer.close(index);
btn: ["入库"]
}, })
function () { // 选择入库 }
layer.open({
type: 2,
title: '入库',
skin: 'layui-layer-rim',
maxmin: true,
shadeClose: true, //点击遮罩关闭层
area: ['100%', '100%'],
move: '.layui-layer-title',
fixed: false,
content: '/application_in_scanQrCode',
end:function () {
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
})
},
function () { // 选择出库
layui.$.ajax({ // 判断当前物料是否存在库存
url:"/material/IsMaterialExist",
type:"get",
dataType: 'json',
contentType: "application/json;charset=utf-8",
success:function (d) {
layer.open({
type: 2,
title: '出库',
skin: 'layui-layer-rim',
maxmin: true,
shadeClose: true, //点击遮罩关闭层
area: ['100%', '100%'],
move: '.layui-layer-title',
fixed: false,
content: '/application_Out_scanQrCode',
end:function () {
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
})
}
});
})
}
}
}).$mount('#app')
</script> </script>
</body> </body>
</html> </html>

291
src/main/resources/templates/pages/stockTaking/stockTaking.html

@ -206,7 +206,8 @@
<!-- 提交按钮--> <!-- 提交按钮-->
<div class="layui-form-item" style="margin-top: 10px;"> <div class="layui-form-item" style="margin-top: 10px;">
<div class="layui-input-block"> <div class="layui-input-block">
<button type="button" class="layui-btn layui-btn-normal layui-btn-lg" lay-submit <button type="button" class="layui-btn layui-btn-normal layui-btn-lg"
lay-submit
lay-filter="formStep"> lay-filter="formStep">
&emsp;提交&emsp; &emsp;提交&emsp;
</button> </button>
@ -391,12 +392,12 @@
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']}); this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']});
}, },
success: function (data) { success: function (data) {
layer.msg("申请提交成功", { layer.msg("申请提交成功", {
icon: 6,//成功的表情 icon: 6,//成功的表情
time: 500 //1秒关闭(如果不配置,默认是3秒) time: 500 //1秒关闭(如果不配置,默认是3秒)
}, function () { }, function () {
step.next('#stepForm'); step.next('#stepForm');
}); });
}, },
complete: function () { complete: function () {
layer.close(this.layerIndex); layer.close(this.layerIndex);
@ -567,33 +568,51 @@
// 扫码盘点位置 // 扫码盘点位置
scanCode = function () { scanCode = function () {
layer.open({ parent.wx.scanQRCode({
type: 2, desc: 'scanQRCode desc',
title: '弹窗内容', needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
skin: 'layui-layer-rim', scanType: ["qrCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
maxmin: true, success: function (res) {
shadeClose: true, //点击遮罩关闭层 // 回调
area: ['100%', '100%'], var result = res.resultStr;//当needResult为1时返回处理结果
move: '.layui-layer-title', var req = {};
fixed: false, req.qrCode = result;
content: '/scanCodeByTaking', $.ajax({
end: function () { url: "/place/qywxApplicationInScanQrCode",
var nowDepositoryId = $("#depositoryId").val(); type: "post",
var nowPlaceId = $("#placeId").val(); dataType: 'json',
if (nowDepositoryId !== depositoryId || nowPlaceId !== placeId) { data: JSON.stringify(req),
// 如果重新选择盘点位置 contentType: "application/json;charset=utf-8",
var nowDepositoryName = $("#openSonByDepository").val(); success: function (d) {
$("#form1")[0].reset(); var data = d.data;
$("#depositoryId").val(nowDepositoryId); var flag = data["flag"];
$("#placeId").val(nowPlaceId); if(flag === 0){
$("#openSonByDepository").val(nowDepositoryName); // 如果没有获取到位置
form.render(); layer.msg("当前二维码错误,请重新扫描");
} }else if(flag === 1){
depositoryId = nowDepositoryId; // 如果获取到的是库位
placeId = nowPlaceId; var place = data["place"];
$("#placeId").val(place.id);
$("#openSonByDepository").val(place.depositoryName);
$("#depositoryId").val(place.did);
depositoryId = place.did;
placeId = place.id;
}else if(flag === 2){
// 如果获取到的是仓库
var depository = data["depository"];
$("#placeId").val("0");
$("#openSonByDepository").val(depository.dname);
$("#depositoryId").val(depository.id);
depositoryId = depository.id;
placeId = "0";
}
}
})
} }
}); })
}; };
@ -650,7 +669,7 @@
end: function () { end: function () {
var mid = materialId.value; var mid = materialId.value;
$.ajax({ $.ajax({
url: "/material/findMatrialByIdAndPid?mid=" + mid+"&pid="+placeId, url: "/material/findMatrialByIdAndPid?mid=" + mid + "&pid=" + placeId,
type: "get", type: "get",
dataType: 'json', dataType: 'json',
contentType: "application/json;charset=utf-8", contentType: "application/json;charset=utf-8",
@ -1041,9 +1060,9 @@
}; };
// 用于扫描物料编码 // 用于扫描物料编码
scanMaterialCodeForTaking = function () { scanMaterialCodeForTaking = function (obj) {
if (depositoryId !== undefined && departmentManagerId !== undefined && departmentManagerId !== "") { if (depositoryId !== undefined && departmentManagerId !== undefined && departmentManagerId !== "") {
layer.open({ /*layer.open({
type: 2, type: 2,
title: '扫码', title: '扫码',
skin: 'layui-layer-rim', skin: 'layui-layer-rim',
@ -1079,7 +1098,92 @@
} }
}) })
} }
}) })*/
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var req = {};
req.qrCode = result;
req.placeId = placeId;
req.depositoryId = depositoryId;
$.ajax({
url: "/material/qywxStockTakingScanQrCode",
type: "post",
dataType: 'json',
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (d) {
var data = d.data;
var parent = obj.parentNode.parentNode.parentNode.parentNode;
var parentId = parent.id;
// 物料编码父级
var codeChildren = parent.childNodes[7];
// 物料名称父级
var materialChildren = parent.childNodes[5];
// 物料类型父级
var typeChildren = parent.childNodes[11];
// 材质父级
var textureChildren = parent.childNodes[13];
// 规格型号父级
var versionChildren = parent.childNodes[15];
// 计量单位父级
var unitChildren = parent.childNodes[17];
// 库存数量父级
var inventoryChildren = parent.childNodes[19];
// 条形码父级
var barCodeChildren = parent.childNodes[9];
// 编码条目
var codeItem = codeChildren.childNodes[3].childNodes[1];
// 具体条码
var codeValue = codeItem.childNodes[1];
// 物料条目
var materialItem = materialChildren.childNodes[3].childNodes;
// 物料名称
var materialName = materialItem[1].childNodes[1];
// 物料编码
var materialId = materialItem[3];
// 物料种类条目
var materialTypeItem = typeChildren.childNodes[3].childNodes;
// 条形码条目
var barCodeItem = barCodeChildren.childNodes[3];
materialName.value = data.mname;
materialId.value = data.id;
materialTypeItem[1].value = data.typeName;
materialTypeItem[3].value = data.typeId;
codeValue.value = data.code;
textureChildren.childNodes[3].childNodes[1].value = data.texture === null || data.texture === undefined ? '' : data.texture;
versionChildren.childNodes[3].childNodes[1].value = data.version === null || data.version === undefined ? '' : data.version;
unitChildren.childNodes[3].childNodes[1].value = data.unit === null || data.unit === undefined ? '' : data.unit;
inventoryChildren.childNodes[3].childNodes[1].value = data.quantity;
// 获取物料与条形码的对应关系
var materialAndBarCodeList = data["materialAndBarCodeList"];
if (materialAndBarCodeList !== null && materialAndBarCodeList.length > 0) {
var barCodeInput = barCodeItem.childNodes[1].childNodes[1];
var barCodeImg = barCodeItem.childNodes[1].childNodes[3];
var id = barCodeInput.id;
var idNumber = materialId.name.split("mid")[1];
form.render();
$.each(materialAndBarCodeList, function (index, item) {
$("#barCode" + idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素
});
form.render();
}
}
})
}
})
} else { } else {
layer.msg("请先选择盘点位置或负责人", { layer.msg("请先选择盘点位置或负责人", {
icon: 0, icon: 0,
@ -1092,69 +1196,105 @@
var id = obj.id; var id = obj.id;
id = id.split("barCodeImg")[1]; id = id.split("barCodeImg")[1];
if (depositoryId !== undefined && departmentManagerId !== undefined && departmentManagerId !== "") { if (depositoryId !== undefined && departmentManagerId !== undefined && departmentManagerId !== "") {
layer.open({ parent.wx.scanQRCode({
type: 2, desc: 'scanQRCode desc',
title: '扫码', needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
skin: 'layui-layer-rim', scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
maxmin: true, success: function (res) {
shadeClose: true, //点击遮罩关闭层 // 回调
area: ['100%', '100%'], var result = res.resultStr;//当needResult为1时返回处理结果
move: '.layui-layer-title',
fixed: false,
content: '/scanBarCodeForTaking',
end: function () {
var req = {}; var req = {};
req.qrCode = result;
req.depositoryId = depositoryId; req.depositoryId = depositoryId;
req.placeId = placeId; req.placeId = placeId;
$.ajax({ $.ajax({
url: "/material/stockTaking_scanBarCode", url: "/material/qywxStockTakingScanBarCode",
type: "post", type: "post",
dataType: 'json', dataType: 'json',
data: JSON.stringify(req), data: JSON.stringify(req),
contentType: "application/json;charset=utf-8", contentType: "application/json;charset=utf-8",
success: function (d) { success: function (d) {
var data = d.data; var data = d.data;
var materialList = data["materialList"]; var material = data["material"];
var barCodeListByNoMaterial = data["barCodeListByNoMaterial"]; var barCodeListByNoMaterial = data["barCodeListByNoMaterial"];
if (materialList.length > 0) { if (material !== null) {
for (let i = 1; i <= materialList.length; i++) { var parent = obj.parentNode.parentNode.parentNode.parentNode;
Coverpage(i, materialList[i - 1]); var parentId = parent.id;
var materialAndBarCodeList = materialList[i - 1]["materialAndBarCodeList"]; // 物料编码父级
$.each(materialAndBarCodeList, function (index, item) { var codeChildren = parent.childNodes[7];
$("#barCode" + i).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素 // 物料名称父级
}); var materialChildren = parent.childNodes[5];
} // 物料类型父级
var typeChildren = parent.childNodes[11];
// 材质父级
var textureChildren = parent.childNodes[13];
// 规格型号父级
var versionChildren = parent.childNodes[15];
// 计量单位父级
var unitChildren = parent.childNodes[17];
// 库存数量父级
var inventoryChildren = parent.childNodes[19];
// 条形码父级
var barCodeChildren = parent.childNodes[9];
// 编码条目
var codeItem = codeChildren.childNodes[3].childNodes[1];
// 具体条码
var codeValue = codeItem.childNodes[1];
// 物料条目
var materialItem = materialChildren.childNodes[3].childNodes;
// 物料名称
var materialName = materialItem[1].childNodes[1];
// 物料编码
var materialId = materialItem[3];
// 物料种类条目
var materialTypeItem = typeChildren.childNodes[3].childNodes;
// 条形码条目
var barCodeItem = barCodeChildren.childNodes[3];
materialName.value = material.mname;
materialId.value = material.id;
codeValue.value = material.code;
materialTypeItem[1].value = material.typeName;
materialTypeItem[3].value = material.typeId;
textureChildren.childNodes[3].childNodes[1].value = material.texture === null || material.texture === undefined ? '' : material.texture;
versionChildren.childNodes[3].childNodes[1].value = material.version === null || material.version === undefined ? '' : material.version;
unitChildren.childNodes[3].childNodes[1].value = material.unit === null || material.unit === undefined ? '' : material.unit;
inventoryChildren.childNodes[3].childNodes[1].value = material.quantity;
$("#barCode" + id).append(new Option(result, 0));//往下拉菜单里添加元素
form.render(); form.render();
} }
if(barCodeListByNoMaterial.length > 0){ if (barCodeListByNoMaterial.length > 0) {
// 如果扫描的条形码没有对应的物料 // 如果扫描的条形码没有对应的物料
var content = '<div style="padding: 50px; line-height: 22px; background-color: #393D49; color: #fff; font-weight: 300;">' + var content = '<div style="padding: 50px; line-height: 22px; background-color: #393D49; color: #fff; font-weight: 300;">' +
'<p>未发现的条码,是否需要添加对应关系</p><hr>' + '<p>未发现的条码,是否需要添加对应关系</p><hr>' +
'<table>'; '<table>';
for (let i = 0; i < barCodeListByNoMaterial.length; i++) { for (let i = 0; i < barCodeListByNoMaterial.length; i++) {
var item = "<tr><td>"+barCodeListByNoMaterial[i]+"</td></tr>" var item = "<tr><td>" + barCodeListByNoMaterial[i] + "</td></tr>";
content+=item; content += item;
} }
content+='</table></div>'; content += '</table></div>';
layer.open({ layer.open({
type: 1 type: 1
,title: false //不显示标题栏 , title: false //不显示标题栏
,closeBtn: false , closeBtn: false
,area: '300px;' , area: '300px;'
,shade: 0.8 , shade: 0.8
,id: 'LAY_layuipro' //设定一个id,防止重复弹出 , id: 'LAY_layuipro' //设定一个id,防止重复弹出
,btn: ['添加', '取消'] , btn: ['添加', '取消']
,btnAlign:'c' , btnAlign: 'c'
,moveType: 1 //拖拽模式,0或者1 , moveType: 1 //拖拽模式,0或者1
,content: content , content: content
,success: function(layero){ , success: function (layero) {
var btn = layero.find('.layui-layer-btn'); var btn = layero.find('.layui-layer-btn');
btn.find('.layui-layer-btn0').click(function () { btn.find('.layui-layer-btn0').click(function () {
$.each(barCodeListByNoMaterial, function (index, item) { $.each(barCodeListByNoMaterial, function (index, item) {
$("#barCode"+id).append(new Option(item, index));//往下拉菜单里添加元素 $("#barCode" + id).append(new Option(item, index));//往下拉菜单里添加元素
}); });
barCodeList["barCode"+id] = barCodeListByNoMaterial; barCodeList["barCode" + id] = barCodeListByNoMaterial;
needToUpdate["barCode"+id] = true; needToUpdate["barCode" + id] = true;
form.render() form.render()
}); });
} }
@ -1164,7 +1304,8 @@
} }
}) })
} }
}) });
} else { } else {
layer.msg("请先选择盘点位置或负责人", { layer.msg("请先选择盘点位置或负责人", {
icon: 0, icon: 0,

31
src/main/resources/templates/pages/warehouse/warehouse_view.html

@ -16,7 +16,7 @@
<div class="layui-form-item" style="display: none"> <div class="layui-form-item" style="display: none">
<label class="layui-form-label">仓库编号</label> <label class="layui-form-label">仓库编号</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="text" th:value="${record.getId()}" name="id" required lay-verify="required" autocomplete="off" class="layui-input" readonly="readonly"> <input type="text" th:value="${record.getId()}" id="did" name="id" required lay-verify="required" autocomplete="off" class="layui-input" readonly="readonly">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -85,7 +85,8 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">二维码</label> <label class="layui-form-label">二维码</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
<img src="" id="qrCode" th:src="${qrCode}"> <img id="qrCode" style="display:none;">
<input id="createCode" type="button" class="layui-btn layui-btn-radius layui-btn-normal" onclick="createQrCode()" value="生成二维码"/>
</div> </div>
</div> </div>
<div class="layui-form-item" style="display: none"> <div class="layui-form-item" style="display: none">
@ -103,6 +104,9 @@
</form> </form>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script> <script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script> <script>
function createQrCode() {
};
layui.use('form', function(){ layui.use('form', function(){
var form = layui.form, $ = layui.$; var form = layui.form, $ = layui.$;
@ -159,6 +163,29 @@
}) })
return false; return false;
}); });
createQrCode = function () {
var depositoryId = $("#did").val();
var req = {};
req.depositoryId = depositoryId;
$.ajax({
url: "/repository/createQrCode",
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
data: JSON.stringify(req),
beforeSend: function () {
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']});
},
success: function (d) {
var data = d.data;
layer.close(this.layerIndex);
$("#qrCode").attr("src",data);
$("#qrCode").show();
$("#createCode").hide();
}
})
}
}); });
</script> </script>

6
src/test/java/com/dreamchaser/depository_manage/Test.java

@ -71,13 +71,11 @@ import org.xml.sax.InputSource;
public class Test { public class Test {
@Autowired
QyWxOperationService qyWxOperationService;
@org.junit.Test @org.junit.Test
public void test1() throws AesException, IOException, ParserConfigurationException, SAXException { public void test1() throws AesException, IOException, ParserConfigurationException, SAXException {
System.out.println(DateUtil.TimeStampToDateTime(Long.valueOf("1667962474000")));
} }

Loading…
Cancel
Save