Commit 4138aa95ca0e3cbb5eb9f47b583fcb230932b102

Authored by 李泰瑜
2 parents 905dfd20 c7ea4aba

Merge branch 'develop4' of http://172.16.29.40:8010/wms/wms4 into develop4

Showing 32 changed files with 552 additions and 422 deletions
ant-design-vue-jeecg/src/components/layouts/UserLayout.vue
... ... @@ -16,7 +16,7 @@
16 16  
17 17 <div class="footer">
18 18 <div class="copyright">
19   - Copyright &copy; 2022 华恒焊接股份有限公司
  19 + Copyright &copy; 2023 华恒焊接股份有限公司
20 20 </div>
21 21 </div>
22 22 </div>
... ...
huaheng-wms-core/src/main/java/org/jeecg/JeecgSystemApplication.java
... ... @@ -18,6 +18,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
18 18 import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
19 19 import org.springframework.boot.builder.SpringApplicationBuilder;
20 20 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
  21 +import org.springframework.cache.annotation.EnableCaching;
21 22 import org.springframework.context.ConfigurableApplicationContext;
22 23 import org.springframework.core.env.Environment;
23 24  
... ... @@ -28,6 +29,7 @@ import net.bytebuddy.asm.Advice.This;
28 29 * 单体启动类(采用此类启动为单体模式)
29 30 */
30 31 @Slf4j
  32 +@EnableCaching
31 33 @SpringBootApplication
32 34 @EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class})
33 35 public class JeecgSystemApplication extends SpringBootServletInitializer {
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java
... ... @@ -429,29 +429,28 @@ public class LoginController {
429 429 }
430 430 }
431 431  
  432 + // 暂时移除唯一登录功能
432 433 // 删除相同用户名称对应的key
433   - Collection<String> keys = redisTemplate.keys(CommonConstant.PREFIX_USER_TOKEN + "*");
434   - for (String key : keys) {
435   - String token = (String)redisUtil.get(key);
436   - LoginUser loginUser = sysBaseAPI.getUserByName(JwtUtil.getUsername(token));
437   - if (loginUser != null) {
438   - if (oConvertUtils.isNotEmpty(username) && loginUser.getUsername().contains(username)) {
439   - log.info("强制 " + sysUser.getRealname() + " 退出成功! ");
440   - // 清空用户登录Token缓存
441   - redisUtil.del(token);
442   - // 清空用户登录Token缓存
443   - redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + token);
444   - // 清空用户登录Shiro权限缓存
445   - redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId());
446   - // 清空用户的缓存信息(包括部门信息),例如sys:cache:user::<username>
447   - redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername()));
448   - // 调用shiro的logout
449   - SecurityUtils.getSubject().logout();
450   - //
451   - redisUtil.del(key);
452   - }
453   - }
454   - }
  434 +// Collection<String> keys = redisTemplate.keys(CommonConstant.PREFIX_USER_TOKEN + "*");
  435 +// for (String key : keys) {
  436 +// String token = (String)redisUtil.get(key);
  437 +// LoginUser loginUser = sysBaseAPI.getUserByName(JwtUtil.getUsername(token));
  438 +// if (loginUser != null) {
  439 +// if (oConvertUtils.isNotEmpty(username) && loginUser.getUsername().contains(username)) {
  440 +// log.info("强制 " + sysUser.getRealname() + " 退出成功! ");
  441 +// // 清空用户登录Token缓存
  442 +// redisUtil.del(token);
  443 +// // 清空用户登录Token缓存
  444 +// redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + token);
  445 +// // 清空用户登录Shiro权限缓存
  446 +// redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId());
  447 +// // 清空用户的缓存信息(包括部门信息),例如sys:cache:user::<username>
  448 +// redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername()));
  449 +// // 调用shiro的logout
  450 +// SecurityUtils.getSubject().logout();
  451 +// }
  452 +// }
  453 +// }
455 454 // update-end--Author:sunjianlei Date:20210802 for:获取用户租户信息
456 455 // 生成token
457 456 String token = HuahengJwtUtil.sign(username, syspassword, warehouseCode);
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/SysUserOnlineController.java
... ... @@ -136,8 +136,6 @@ public class SysUserOnlineController {
136 136 redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId());
137 137 // 清空用户的缓存信息
138 138 redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername()));
139   - // 真*清空Token
140   - redisUtil.del(key);
141 139 // 调用shiro的logout
142 140 SecurityUtils.getSubject().logout();
143 141 return Result.ok("退出登录成功!");
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/acs/controller/AcsController.java
... ... @@ -6,13 +6,13 @@ import javax.annotation.Resource;
6 6 import javax.servlet.http.HttpServletRequest;
7 7  
8 8 import org.jeecg.common.api.vo.Result;
9   -import org.jeecg.common.system.util.JwtUtil;
10 9 import org.jeecg.modules.wms.api.acs.entity.AcsStatus;
11 10 import org.jeecg.modules.wms.api.acs.service.IAcsService;
12   -import org.jeecg.modules.wms.framework.aspectj.PassApiAuthentication;
  11 +import org.jeecg.modules.wms.config.address.service.IAddressService;
13 12 import org.jeecg.modules.wms.framework.aspectj.lang.annotation.ApiLogger;
14 13 import org.jeecg.modules.wms.framework.controller.HuahengBaseController;
15 14 import org.jeecg.modules.wms.task.agvTask.service.IAgvTaskService;
  15 +import org.jeecg.utils.OkHttpUtils;
16 16 import org.jeecg.utils.StringUtils;
17 17 import org.jeecg.utils.constant.QuantityConstant;
18 18 import org.springframework.transaction.annotation.Transactional;
... ... @@ -22,6 +22,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
22 22 import org.springframework.web.bind.annotation.ResponseBody;
23 23 import org.springframework.web.bind.annotation.RestController;
24 24  
  25 +import com.alibaba.fastjson.JSON;
  26 +
25 27 import io.swagger.annotations.ApiOperation;
26 28  
27 29 @RestController
... ... @@ -30,15 +32,22 @@ public class AcsController extends HuahengBaseController {
30 32  
31 33 @Resource
32 34 private IAcsService acsService;
  35 +
33 36 @Resource
34 37 private IAgvTaskService agvTaskService;
35 38  
  39 + @Resource
  40 + private IAddressService addressService;
  41 +
36 42 // @PassApiAuthentication
37   - @ApiLogger(apiName = "API接口第三方Token校验测试", from = "TEST")
  43 +// @ApiLogger(apiName = "API接口第三方Token校验测试", from = "TEST")
38 44 @ResponseBody
39 45 @PostMapping(value = "/testTokenCheck")
40 46 public Result<?> testTokenCheck(@RequestBody Map<String, String> paramMap, HttpServletRequest request) {
41   - return new Result<>();
  47 + String url = "http://127.0.0.1:8080/wms/api/wms/acs/testTokenCheck";
  48 + String body = OkHttpUtils.sendPostByJsonStr(url, JSON.toJSONString(paramMap));
  49 +// String url = addressService.getUrlByParam(QuantityConstant.ADDRESS_AGV_TASK_ASSIGN);
  50 + return Result.ok(body);
42 51 }
43 52  
44 53  
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/acs/service/impl/AcsServiceImpl.java
... ... @@ -10,9 +10,9 @@ import org.jeecg.modules.wms.config.location.entity.Location;
10 10 import org.jeecg.modules.wms.config.location.service.ILocationService;
11 11 import org.jeecg.modules.wms.task.agvTask.entity.AgvTask;
12 12 import org.jeecg.modules.wms.task.agvTask.service.IAgvTaskService;
  13 +import org.jeecg.utils.OkHttpUtils;
13 14 import org.jeecg.utils.StringUtils;
14 15 import org.jeecg.utils.constant.QuantityConstant;
15   -import org.jeecg.utils.http.OkHttpUtils;
16 16 import org.springframework.stereotype.Service;
17 17  
18 18 import com.alibaba.fastjson.JSON;
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/erp/service/impl/ErpServiceImpl.java
... ... @@ -38,9 +38,9 @@ import org.jeecg.modules.wms.shipment.shipmentHeader.entity.ShipmentDetail;
38 38 import org.jeecg.modules.wms.shipment.shipmentHeader.entity.ShipmentHeader;
39 39 import org.jeecg.modules.wms.shipment.shipmentHeader.service.IShipmentDetailService;
40 40 import org.jeecg.modules.wms.shipment.shipmentHeader.service.IShipmentHeaderService;
  41 +import org.jeecg.utils.OkHttpUtils;
41 42 import org.jeecg.utils.StringUtils;
42 43 import org.jeecg.utils.constant.QuantityConstant;
43   -import org.jeecg.utils.http.OkHttpUtils;
44 44 import org.springframework.stereotype.Service;
45 45 import org.springframework.transaction.annotation.Transactional;
46 46  
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/servuce/impl/MesServiceImpl.java
... ... @@ -33,9 +33,9 @@ import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail;
33 33 import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader;
34 34 import org.jeecg.modules.wms.task.taskHeader.service.ITaskDetailService;
35 35 import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService;
  36 +import org.jeecg.utils.OkHttpUtils;
36 37 import org.jeecg.utils.StringUtils;
37 38 import org.jeecg.utils.constant.QuantityConstant;
38   -import org.jeecg.utils.http.OkHttpUtils;
39 39 import org.springframework.stereotype.Service;
40 40 import org.springframework.transaction.annotation.Transactional;
41 41  
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java
... ... @@ -35,9 +35,9 @@ import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail;
35 35 import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader;
36 36 import org.jeecg.modules.wms.task.taskHeader.service.ITaskDetailService;
37 37 import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService;
  38 +import org.jeecg.utils.OkHttpUtils;
38 39 import org.jeecg.utils.StringUtils;
39 40 import org.jeecg.utils.constant.QuantityConstant;
40   -import org.jeecg.utils.http.OkHttpUtils;
41 41 import org.springframework.stereotype.Service;
42 42 import org.springframework.transaction.annotation.Transactional;
43 43  
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/address/service/impl/AddressServiceImpl.java
... ... @@ -6,6 +6,7 @@ import org.apache.commons.math3.analysis.function.Add;
6 6 import org.jeecg.modules.wms.config.address.entity.Address;
7 7 import org.jeecg.modules.wms.config.address.mapper.AddressMapper;
8 8 import org.jeecg.modules.wms.config.address.service.IAddressService;
  9 +import org.springframework.cache.annotation.Cacheable;
9 10 import org.springframework.stereotype.Service;
10 11  
11 12 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
... ... @@ -20,6 +21,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
20 21 public class AddressServiceImpl extends ServiceImpl<AddressMapper, Address> implements IAddressService {
21 22  
22 23 @Override
  24 + @Cacheable(cacheNames = "getAddressByUrl#300", key = "#root.methodName + '_' + #url + '_' + #warehouseCode")
23 25 public Address getAddressByUrl(String url, String warehouseCode) {
24 26 LambdaQueryWrapper<Address> addressLambdaQueryWrapper = Wrappers.lambdaQuery();
25 27 addressLambdaQueryWrapper.eq(Address::getUrl, url).eq(Address::getWarehouseCode, warehouseCode).last(" limit 1");
... ... @@ -28,6 +30,7 @@ public class AddressServiceImpl extends ServiceImpl&lt;AddressMapper, Address&gt; impl
28 30 }
29 31  
30 32 @Override
  33 + @Cacheable(cacheNames = "getUrlByParam#300", key = "#root.methodName + '_' + #param + '_' + #warehouseCode + '_' + #zoneCode")
31 34 public String getUrlByParam(String param, String warehouseCode, String zoneCode) {
32 35 LambdaQueryWrapper<Address> addressLambdaQueryWrapper = Wrappers.lambdaQuery();
33 36 addressLambdaQueryWrapper.eq(Address::getParam, param).eq(Address::getWarehouseCode, warehouseCode).eq(Address::getZoneCode, zoneCode);
... ... @@ -39,7 +42,9 @@ public class AddressServiceImpl extends ServiceImpl&lt;AddressMapper, Address&gt; impl
39 42 return url;
40 43 }
41 44  
  45 + /** #300 缓存300秒 */
42 46 @Override
  47 + @Cacheable(cacheNames = "getUrlByParam#300", key = "#root.methodName + '_' + #param")
43 48 public String getUrlByParam(String param) {
44 49 LambdaQueryWrapper<Address> addressLambdaQueryWrapper = Wrappers.lambdaQuery();
45 50 addressLambdaQueryWrapper.eq(Address::getParam, param);
... ... @@ -47,8 +52,6 @@ public class AddressServiceImpl extends ServiceImpl&lt;AddressMapper, Address&gt; impl
47 52 if (address == null) {
48 53 return null;
49 54 }
50   - String url = address.getUrl();
51   - return url;
  55 + return address.getUrl();
52 56 }
53   -
54 57 }
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/location/service/impl/LocationServiceImpl.java
... ... @@ -93,10 +93,13 @@ public class LocationServiceImpl extends ServiceImpl&lt;LocationMapper, Location&gt; i
93 93 if (location == null) {
94 94 return false;
95 95 }
  96 + boolean success = false;
96 97 // 如果这个托盘号已经在库位表里,那么不能再写入
97   - boolean success = havaContainerCodeInLocation(containerCode, warehouseCode);
98   - if (success) {
99   - throw new ServiceException("库位表已经存在这个容器号,不能再写入");
  98 + if (StringUtils.isNotEmpty(containerCode)) {
  99 + success = havaContainerCodeInLocation(containerCode, warehouseCode);
  100 + if (success) {
  101 + throw new ServiceException("库位表已经存在这个容器号,不能再写入");
  102 + }
100 103 }
101 104 location.setContainerCode(containerCode);
102 105 location.setStatus(status);
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/aspectj/ApiAuthenticationAspect.java
... ... @@ -10,6 +10,7 @@ import org.aspectj.lang.annotation.Aspect;
10 10 import org.aspectj.lang.annotation.Before;
11 11 import org.aspectj.lang.annotation.Pointcut;
12 12 import org.aspectj.lang.reflect.MethodSignature;
  13 +import org.bouncycastle.crypto.RuntimeCryptoException;
13 14 import org.jeecg.modules.wms.framework.aspectj.dto.RSA256Key;
14 15 import org.jeecg.utils.HuahengJwtUtil;
15 16 import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -23,9 +24,11 @@ import com.auth0.jwt.JWTVerifier;
23 24 import com.auth0.jwt.algorithms.Algorithm;
24 25 import com.auth0.jwt.exceptions.JWTVerificationException;
25 26 import com.auth0.jwt.interfaces.DecodedJWT;
  27 +import com.baomidou.mybatisplus.extension.service.IService;
26 28  
27 29 import cn.hutool.core.date.DatePattern;
28 30 import cn.hutool.core.date.DateUtil;
  31 +import cn.hutool.core.util.StrUtil;
29 32 import lombok.extern.slf4j.Slf4j;
30 33  
31 34 /**
... ... @@ -68,12 +71,16 @@ public class ApiAuthenticationAspect {
68 71 ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
69 72 HttpServletRequest request = attributes.getRequest();
70 73 String token = request.getHeader("token");
  74 + if (token == null) {
  75 + log.error("Authentication token is null");
  76 + throw new RuntimeException("Authentication token is null");
  77 + }
71 78 try {
72 79 Algorithm algorithm = Algorithm.RSA256(rsa256Key.getPublicKey(), rsa256Key.getPrivateKey());
73 80 JWTVerifier verifier = JWT.require(algorithm).withIssuer(HuahengJwtUtil.HUAHENG_SYSTEM_ID).build();
74 81 verifier.verify(token);
75 82 } catch (JWTVerificationException e) {
76   - log.error("TOKEN认证失败:{}", e.getMessage());
  83 + log.error(e.getMessage());
77 84 throw e;
78 85 }
79 86 }
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/aspectj/ApiLogAspect.java
... ... @@ -27,6 +27,7 @@ import org.jeecg.modules.wms.config.address.service.IAddressService;
27 27 import org.jeecg.modules.wms.framework.aspectj.lang.annotation.ApiLogger;
28 28 import org.jeecg.modules.wms.monitor.apiLog.entity.ApiLog;
29 29 import org.jeecg.modules.wms.monitor.apiLog.service.IApiLogService;
  30 +import org.jeecg.utils.HuahengJwtUtil;
30 31 import org.jeecg.utils.ServletUtils;
31 32 import org.jeecg.utils.SpringUtils;
32 33 import org.jeecg.utils.StringUtils;
... ... @@ -239,47 +240,47 @@ public class ApiLogAspect {
239 240 /**
240 241 * 记录WMS调用第三方系统接口的请求信息
241 242 * 在OKHttpUtils.bodypost方法中直接调用本类static方法
  243 + * @param apiLog
242 244 **/
243   - public static ApiLog initApiLog(Request request, String body) {
244   - ApiLog log = new ApiLog();
  245 + public static void initApiLog(ApiLog apiLog, Request request, String body) {
245 246 try {
246   - log.setApiMethod(request.method());
247   - log.setUrl(request.url().toString());
248   - log.setRequestTime(new Date());
249   - parseUrl(log, request.url().url());
250   - log.setRequestHeader(request.headers().toString());
251   - log.setRequestBody(body);
  247 + apiLog.setApiMethod(request.method());
  248 + apiLog.setUrl(request.url().toString());
  249 + apiLog.setRequestTime(new Date());
  250 + parseUrl(apiLog, request.url().url());
  251 + apiLog.setRequestHeader(request.headers().toString());
  252 + apiLog.setRequestBody(body);
252 253 } catch (Exception e) {
253 254 e.printStackTrace();
254 255 }
255   - return log;
256 256 }
257 257  
258 258 /** 记录响应头信息 **/
259   - public static void finishApiLog(ApiLog log, Response response, String body) {
  259 + public static void finishApiLog(ApiLog log, Response response, String responseBody) {
260 260 try {
261   - log.setResponseBody(body);
262 261 log.setResponseTime(new Date());
263 262 Long duration = log.getResponseTime().getTime() - log.getRequestTime().getTime();
264 263 log.setDuration(duration.intValue());
  264 + if (response == null) {
  265 + return;
  266 + }
265 267 log.setHttpCode(response.code());
266   -
267   - // 响应头
268 268 log.setResponseHeader(response.headers().toString());
269   - Result ajaxResult = null;
  269 + log.setResponseBody(responseBody);
  270 + Result result = null;
270 271 try {
271   - ajaxResult = JSON.parseObject(body, Result.class);
  272 + result = JSON.parseObject(responseBody, Result.class);
272 273 } catch (Exception ex) {
273   - body = JSON.parse(body).toString();
274   - ajaxResult = JSON.parseObject(body, Result.class);
  274 + responseBody = JSON.parse(responseBody).toString();
  275 + result = JSON.parseObject(responseBody, Result.class);
275 276 }
276   - log.setRetCode(ajaxResult.getCode());
  277 + log.setRetCode(result.getCode());
277 278 } catch (Exception e) {
278 279 e.printStackTrace();
279 280 } finally {
280 281 try {
281 282 if (StringUtils.isNotEmpty(log.getResponseBody()) && log.getResponseBody().length() > 2001) {
282   - log.setResponseBody(log.getResponseBody().substring(0, 2000) + "...\nResponseBodyLength:" + log.getResponseBody().length());
  283 + log.setResponseBody(log.getResponseBody().substring(0, 2000) + "...\n");
283 284 }
284 285 } catch (Exception e) {
285 286 e.printStackTrace();
... ... @@ -289,16 +290,16 @@ public class ApiLogAspect {
289 290 }
290 291  
291 292 /** 根据url,从address表中判断调用的去向 **/
292   - public static void parseUrl(ApiLog log, URL url) {
  293 + public static void parseUrl(ApiLog apiLog, URL url) {
293 294 try {
294 295 String[] spList = url.toString().split("/");
295 296 String apiName = spList[spList.length - 1];
296 297 String ip = JeecgSystemApplication.getLocalHostExactAddress().getHostAddress();
297   - Address address = addressService.getAddressByUrl(url.toString(), QuantityConstant.DEFAULT_WAREHOUSE);
298   - log.setApiName(apiName);
299   - log.setRequestFrom("WMS");
300   - log.setIp(ip);
301   - log.setResponseBy(address.getParam().toUpperCase());
  298 + apiLog.setApiName(apiName);
  299 + apiLog.setRequestFrom(HuahengJwtUtil.HUAHENG_SYSTEM_ID);
  300 + apiLog.setIp(ip);
  301 +// Address address = addressService.getAddressByUrl(url.toString(), QuantityConstant.DEFAULT_WAREHOUSE);
  302 +// apiLog.setResponseBy(address.getParam().toUpperCase());
302 303 } catch (Exception e) {
303 304 e.printStackTrace();
304 305 }
... ... @@ -398,7 +399,7 @@ public class ApiLogAspect {
398 399 public static void setApiLogException(ApiLog log, Exception e) {
399 400 try {
400 401 String exception = ExceptionUtils.getFullStackTrace(e);
401   - String shortExpInfo = e.getMessage() + "\n" + org.apache.commons.lang3.StringUtils.left(exception, 1000);
  402 + String shortExpInfo = e.getMessage() + "\n" + org.apache.commons.lang3.StringUtils.left(exception, 1000) + "...";
402 403 log.setException(shortExpInfo);
403 404 } catch (Exception ex) {
404 405 ex.printStackTrace();
... ... @@ -408,7 +409,7 @@ public class ApiLogAspect {
408 409 public static void setApiLogThrowable(ApiLog log, Throwable e) {
409 410 try {
410 411 String exception = ExceptionUtils.getFullStackTrace(e);
411   - String shortExpInfo = e.getMessage() + "\n" + org.apache.commons.lang3.StringUtils.left(exception, 1000);
  412 + String shortExpInfo = e.getMessage() + "\n" + org.apache.commons.lang3.StringUtils.left(exception, 1000) + "...";
412 413 log.setException(shortExpInfo);
413 414 } catch (Exception ex) {
414 415 ex.printStackTrace();
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/HuahengBaseController.java
... ... @@ -5,7 +5,7 @@ import java.util.concurrent.TimeUnit;
5 5 import javax.annotation.Nonnull;
6 6  
7 7 import org.jeecg.common.api.vo.Result;
8   -import org.jeecg.utils.RedissonDistributedLocker;
  8 +import org.jeecg.utils.support.RedissonDistributedLocker;
9 9 import org.springframework.beans.factory.annotation.Autowired;
10 10  
11 11 import cn.hutool.core.date.SystemClock;
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/impl/ShipmentCombinationServiceImpl.java
... ... @@ -135,9 +135,9 @@ public class ShipmentCombinationServiceImpl implements IShipmentCombinationServi
135 135 }
136 136 }
137 137 if (over) {
138   - return Result.OK("出库单已经配盘");
  138 + return Result.OK("出库单已经配盘", null);
139 139 }
140   - return Result.OK("自动组盘成功");
  140 + return Result.OK("自动组盘成功", null);
141 141 }
142 142  
143 143 @Override
... ... @@ -210,7 +210,7 @@ public class ShipmentCombinationServiceImpl implements IShipmentCombinationServi
210 210 throw new ServiceException(result.getMessage());
211 211 }
212 212 }
213   - return Result.OK("自动组盘成功");
  213 + return Result.OK("自动组盘成功", null);
214 214 }
215 215  
216 216 @Override
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java
... ... @@ -25,6 +25,7 @@ import org.jeecg.modules.wms.config.port.entity.Port;
25 25 import org.jeecg.modules.wms.config.port.service.IPortService;
26 26 import org.jeecg.modules.wms.config.zone.entity.Zone;
27 27 import org.jeecg.modules.wms.config.zone.service.IZoneService;
  28 +import org.jeecg.modules.wms.framework.aspectj.lang.annotation.ApiLogger;
28 29 import org.jeecg.modules.wms.framework.controller.HuahengBaseController;
29 30 import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail;
30 31 import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader;
... ... @@ -648,4 +649,46 @@ public class TaskHeaderController extends HuahengBaseController {
648 649 return Result.OK(portList);
649 650 }
650 651  
  652 + /**
  653 + * 修复空出的数据
  654 + * @return
  655 + */
  656 + @AutoLog(value = "修复空出的数据")
  657 + @PostMapping("/handleEmptyOut")
  658 + @ApiOperation("修复空出的数据")
  659 + @ResponseBody
  660 + @ApiLogger(apiName = "修复空出的数据", from = "WMS")
  661 + public Result handleEmptyOut(@RequestBody String taskNo) {
  662 + Result result = taskHeaderService.handleEmptyOut(taskNo);
  663 + return result;
  664 + }
  665 +
  666 + /**
  667 + * 修复重入的数据
  668 + * @return
  669 + */
  670 + @AutoLog(value = "修复重入的数据")
  671 + @PostMapping("/handleDoubleIn")
  672 + @ApiOperation("修复重入的数据")
  673 + @ResponseBody
  674 + @ApiLogger(apiName = "修复重入的数据", from = "WMS")
  675 + public Result handleDoubleIn(@RequestBody String taskNo) {
  676 + Result result = taskHeaderService.handleDoubleIn(taskNo);
  677 + return result;
  678 + }
  679 +
  680 + /**
  681 + * 修复取货错的数据
  682 + * @return
  683 + */
  684 + @AutoLog(value = "修复取货错的数据")
  685 + @PostMapping("handlePickupError")
  686 + @ApiOperation("修复取货错的数据")
  687 + @ResponseBody
  688 + @ApiLogger(apiName = "修复取货错的数据", from = "WMS")
  689 + public Result handlePickupError(@RequestBody String taskNo) {
  690 + Result result = taskHeaderService.handlePickupError(taskNo);
  691 + return result;
  692 + }
  693 +
651 694 }
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java
... ... @@ -2126,14 +2126,14 @@ public class TaskHeaderServiceImpl extends ServiceImpl&lt;TaskHeaderMapper, TaskHea
2126 2126 if (StringUtils.isNotEmpty(lastStatus)) {
2127 2127 container.setStatus(lastStatus); // 解决空托盘组移库问题
2128 2128 }
2129   - if (StringUtils.isNotEmpty(fromLocationCode)) {
2130   - success = containerService.havaLocationCodeByContainer(fromLocationCode, warehouseCode);
2131   - if (success) {
2132   - throw new ServiceException("库位表已经存在这个容器号,不能再写入");
2133   - }
2134   - }
  2129 +// if (StringUtils.isNotEmpty(fromLocationCode)) {
  2130 +// success = containerService.havaLocationCodeByContainer(fromLocationCode, warehouseCode);
  2131 +// if (success) {
  2132 +// throw new ServiceException("库位表已经存在这个容器号,不能再写入");
  2133 +// }
  2134 +// }
2135 2135 container.setLastStatus(QuantityConstant.EMPTY_STRING);
2136   - container.setLocationCode(fromLocationCode);
  2136 +// container.setLocationCode(fromLocationCode);
2137 2137 success = containerService.updateById(container);
2138 2138 if (!success) {
2139 2139 throw new ServiceException("取消任务时, 更新容器失败");
... ...
huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java
... ... @@ -28,7 +28,7 @@ public class HuahengJwtUtil {
28 28 /** token失效时间 1天 */
29 29 public static final long EXPIRE_TIME = 24 * 60 * 60 * 1000;
30 30  
31   - public static final String HUAHENG_SYSTEM_ID = "HUAHENG-WMS4-4.0.1";
  31 + public static final String HUAHENG_SYSTEM_ID = "HUAHENG-WMS4";
32 32  
33 33 /**
34 34 * 根据request中的token获取用户账号
... ...
huaheng-wms-core/src/main/java/org/jeecg/utils/OkHttpUtils.java 0 → 100644
  1 +package org.jeecg.utils;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +import com.alibaba.fastjson.TypeReference;
  5 +import com.alibaba.fastjson.parser.Feature;
  6 +import com.aliyun.oss.ServiceException;
  7 +import com.xkcoding.http.util.StringUtil;
  8 +
  9 +import antlr.StringUtils;
  10 +import cn.hutool.core.util.StrUtil;
  11 +import net.bytebuddy.asm.Advice.This;
  12 +import okhttp3.*;
  13 +import org.jeecg.modules.wms.framework.aspectj.ApiLogAspect;
  14 +import org.jeecg.modules.wms.monitor.apiLog.entity.ApiLog;
  15 +import org.slf4j.Logger;
  16 +import org.slf4j.LoggerFactory;
  17 +import org.springframework.messaging.support.ErrorMessage;
  18 +
  19 +import java.io.IOException;
  20 +import java.lang.reflect.Type;
  21 +import java.util.HashMap;
  22 +import java.util.Map;
  23 +import java.util.Objects;
  24 +import java.util.concurrent.TimeUnit;
  25 +import java.util.concurrent.TimeoutException;
  26 +
  27 +import javax.validation.constraints.NotNull;
  28 +
  29 +/**
  30 + * OkHttp发送请求
  31 + * @author huaheng
  32 + * @Date 2022-5-30
  33 + */
  34 +public class OkHttpUtils {
  35 +
  36 + private static final Logger log = LoggerFactory.getLogger(OkHttpUtils.class);
  37 +
  38 + /**
  39 + * 最多重试次数
  40 + */
  41 + public final static int MAX_RENTRY_COUNT = 3;
  42 +
  43 + /**
  44 + * 最大连接时间(秒)
  45 + */
  46 + public final static int CONNECTION_TIMEOUT = 1;
  47 +
  48 + /**
  49 + * 最大读取时间(秒)
  50 + */
  51 + public final static int READ_TIMEOUT = 30;
  52 +
  53 + /**
  54 + * 最大写入时间(秒)
  55 + */
  56 + public final static int WRITE_TIMEOUT = 30;
  57 +
  58 + /**
  59 + * JSON格式
  60 + */
  61 + public static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json; charset=utf-8");
  62 + /**
  63 + * OkHTTP线程池最大空闲线程数
  64 + */
  65 + public final static int MAX_IDLE_CONNECTIONS = 100;
  66 + /**
  67 + * OkHTTP线程池空闲线程存活时间(秒)
  68 + */
  69 + public final static long KEEP_ALIVE_DURATION = 60;
  70 +
  71 + private static final String CONTENT_TYPE = "Content-Type";
  72 +
  73 + /** 访问接口参数配置 */
  74 + private final static OkHttpClient HTTP_CLIENT =
  75 + new OkHttpClient.Builder().connectTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS).readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
  76 + .writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS).addInterceptor(new OkHttpUtils.OkhttpInterceptor(MAX_RENTRY_COUNT)) // 过滤器,设置最大重试次数
  77 + .retryOnConnectionFailure(false).connectionPool(new ConnectionPool(MAX_IDLE_CONNECTIONS, KEEP_ALIVE_DURATION, TimeUnit.SECONDS)).build();
  78 +
  79 + /**
  80 + * 向指定 URL 发送GET方法的请求
  81 + * @param url 发送请求的 URL
  82 + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式
  83 + * @return 所代表远程资源的响应结果
  84 + * @throws Exception
  85 + */
  86 + public static String sendGet(String url, String param) {
  87 + Map<String, String> headers = new HashMap<String, String>();
  88 + return sendGet(url, headers, param);
  89 + }
  90 +
  91 + /**
  92 + * 向指定 URL 发送GET方法的请求
  93 + * @param url 发送请求的 URL
  94 + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式
  95 + * @param headers 请求头
  96 + * @return 所代表远程资源的响应结果
  97 + * @throws Exception
  98 + */
  99 + public static String sendGet(String url, Map<String, String> headers, String param) {
  100 + ApiLog apiLog = new ApiLog();
  101 + Request.Builder builder = new Request.Builder();
  102 + buildHeader(builder, headers);
  103 + Request request = builder.url(url + "?" + param).get().build();
  104 + Response response = null;
  105 + String result = null;
  106 + try {
  107 + ApiLogAspect.initApiLog(apiLog, request, param);
  108 + response = HTTP_CLIENT.newCall(request).execute();
  109 + result = response.body().string();
  110 + } catch (Exception e) {
  111 + String errorString =
  112 + StrUtil.format("执行GET请求异常,url:{},header:{},param:{},errorMessage:{}", url, JSON.toJSONString(headers), param, e.getMessage());
  113 + ApiLogAspect.setApiLogException(apiLog, e);
  114 + throw new RuntimeException(errorString, e);
  115 + } finally {
  116 + ApiLogAspect.finishApiLog(apiLog, response, result);
  117 + }
  118 + if (response.isSuccessful() && Objects.nonNull(response.body())) {// 调用成功
  119 + log.info("执行GET请求成功,url:{},header:{},param:{},result:{}", url, JSON.toJSONString(headers), param, result);
  120 + } else {
  121 + String errorString = StrUtil.format("执行GET请求失败,url:{},header:{},param:{},responseCode:{},responseMessage:{}", url,
  122 + JSON.toJSONString(headers), param, response.code(), response.message());
  123 + throw new ServiceException(errorString);
  124 + }
  125 + return result;
  126 + }
  127 +
  128 + /**
  129 + * 向指定 URL 发送POST方法的请求
  130 + * @param url 发送请求的 URL
  131 + * @param param 请求参数,请求参数是 name1=value1&name2=value2 的形式
  132 + * @return 远程资源的响应结果
  133 + * @throws IOException
  134 + */
  135 + public static String sendPost(String url, String param) throws IOException {
  136 + Map<String, String> headers = new HashMap<String, String>();
  137 + return sendPost(url, headers, param);
  138 + }
  139 +
  140 + /**
  141 + * 向指定 URL 发送POST方法的请求
  142 + * @param url 发送请求的 URL
  143 + * @param param 请求参数,请求参数是 name1=value1&name2=value2 的形式
  144 + * @param headers 请求头
  145 + * @return 远程资源的响应结果
  146 + * @throws IOException
  147 + */
  148 + public static String sendPost(String url, Map<String, String> headers, String param) {
  149 + ApiLog apiLog = new ApiLog();
  150 + Request.Builder builder = new Request.Builder();
  151 + buildHeader(builder, headers);
  152 + FormBody body = new FormBody.Builder().build();
  153 + Request request = builder.url(url + "?" + param).post(body).build();
  154 + Response response = null;
  155 + String result = null;
  156 + try {
  157 + ApiLogAspect.initApiLog(apiLog, request, param);
  158 + response = HTTP_CLIENT.newCall(request).execute();
  159 + result = response.body().string();
  160 + } catch (Exception e) {
  161 + String errorString =
  162 + StrUtil.format("执行POST请求异常,url:{},header:{},param:{},errorMessage:{}", url, JSON.toJSONString(headers), param, e.getMessage());
  163 + ApiLogAspect.setApiLogException(apiLog, e);
  164 + throw new RuntimeException(errorString, e);
  165 + } finally {
  166 + ApiLogAspect.finishApiLog(apiLog, response, result);
  167 + }
  168 + if (response.isSuccessful() && Objects.nonNull(response.body())) {// 调用成功
  169 + log.info("执行POST请求成功,url:{},header:{},param:{},result:{}", url, JSON.toJSONString(headers), param, result);
  170 + } else {
  171 + String errorString = StrUtil.format("执行POST请求失败,url:{},header:{},param:{},responseCode:{},responseMessage:{}", url,
  172 + JSON.toJSONString(headers), param, response.code(), response.message());
  173 + throw new RuntimeException(errorString);
  174 + }
  175 + return result;
  176 + }
  177 +
  178 + public static String sendPostByJsonStr(String url, String jsonString) {
  179 + Map<String, String> headers = new HashMap<String, String>();
  180 + return sendPostByJsonStr(url, headers, jsonString);
  181 + }
  182 +
  183 + /**
  184 + * JSONString形式发送POST请求
  185 + * @throws Exception
  186 + * @throws IOException
  187 + */
  188 + public static String sendPostByJsonStr(String url, Map<String, String> headers, String jsonString) {
  189 + ApiLog apiLog = new ApiLog();
  190 + headers.put("Accept", "application/json");// 设置接收数据的格式
  191 + headers.put("Content-Type", "application/json");// 设置发送数据的格式
  192 + Request.Builder builder = new Request.Builder();
  193 + buildHeader(builder, headers);
  194 + RequestBody body = RequestBody.create(MEDIA_TYPE_JSON, jsonString);
  195 + Request request = builder.url(url).post(body).build();
  196 + Response response = null;
  197 + String result = null;
  198 + try {
  199 + ApiLogAspect.initApiLog(apiLog, request, jsonString);
  200 + response = HTTP_CLIENT.newCall(request).execute();
  201 + result = response.body().string();
  202 + } catch (Exception e) {
  203 + String errorString = StrUtil.format("执行POST请求异常,url:{},header:{},param:{},errorMessage:{}", url, JSON.toJSONString(headers), jsonString, e.getMessage());
  204 + ApiLogAspect.setApiLogException(apiLog, e);
  205 + throw new RuntimeException(errorString);
  206 + } finally {
  207 + ApiLogAspect.finishApiLog(apiLog, response, result);
  208 + }
  209 + if (response.isSuccessful() && Objects.nonNull(response.body())) {// 调用成功
  210 + log.info("执行POST请求成功,url:{},header:{},param:{},result:{}", url, JSON.toJSONString(headers), jsonString, result);
  211 + } else {
  212 + String errorString = StrUtil.format("执行POST请求失败,url:{},header:{},param:{},responseCode:{},responseMessage:{}", url,
  213 + JSON.toJSONString(headers), jsonString, response.code(), response.message());
  214 + throw new RuntimeException(errorString);
  215 + }
  216 + return result;
  217 + }
  218 +
  219 + /**
  220 + * 设置请求头
  221 + * @param builder .
  222 + * @param headers 请求头
  223 + */
  224 + private static void buildHeader(Request.Builder builder, Map<String, String> headers) {
  225 + if (Objects.nonNull(headers) && headers.size() > 0) {
  226 + headers.forEach((k, v) -> {
  227 + if (Objects.nonNull(k) && Objects.nonNull(v)) {
  228 + builder.addHeader(k, v);
  229 + }
  230 + });
  231 + }
  232 + }
  233 +
  234 + /**
  235 + * 支持嵌套泛型的POST请求
  236 + * @param url 链接
  237 + * @param json 请求json
  238 + * @param type 嵌套泛型
  239 + * @return 响应对象, 可进行强转。
  240 + * @throws Exception
  241 + */
  242 + public static <T> T sendPostByJsonStr(String url, String jsonString, TypeReference<T> type) throws Exception {
  243 + String result = sendPostByJsonStr(url, jsonString);
  244 + if (Objects.nonNull(result) && Objects.nonNull(type)) {
  245 + return JSON.parseObject(result, type);
  246 + }
  247 + return null;
  248 + }
  249 +
  250 + public static class OkhttpInterceptor implements Interceptor {
  251 + // 最大重试次数
  252 + private int maxRentry;
  253 +
  254 + public OkhttpInterceptor(int maxRentry) {
  255 + this.maxRentry = maxRentry;
  256 + }
  257 +
  258 + /** 递归 2次下发请求,如果仍然失败 则返回 null 但是 intercept must not return null. 返回 null 会报 IllegalStateException 异常 */
  259 + public Response intercept(@NotNull Chain chain) throws IOException {
  260 + return retry(chain, 0);
  261 + }
  262 +
  263 + private Response retry(Chain chain, int retryCent) throws IOException {
  264 + Request request = chain.request();
  265 + Response response = null;
  266 + try {
  267 + response = chain.proceed(request);
  268 + } catch (Exception e) {
  269 + if (maxRentry > retryCent) {
  270 + return retry(chain, retryCent + 1);
  271 + }
  272 + if (Objects.isNull(response)) {
  273 + throw e;
  274 + }
  275 + }
  276 + return response;
  277 + }
  278 + }
  279 +}
... ...
huaheng-wms-core/src/main/java/org/jeecg/utils/SecretKeyUtils.java
... ... @@ -16,13 +16,9 @@ import java.util.Map;
16 16  
17 17 import org.jeecg.modules.wms.framework.aspectj.dto.RSA256Key;
18 18  
19   -import sun.misc.BASE64Decoder;
20   -import sun.misc.BASE64Encoder;
21   -
22 19 /**
23 20 * KeyPairGenerator https://www.jianshu.com/p/4de1ee0e7206 key的生成使用方法
24 21 */
25   -@SuppressWarnings("restriction")
26 22 public class SecretKeyUtils {
27 23  
28 24 public static final String KEY_ALGORITHM = "RSA";
... ... @@ -68,12 +64,12 @@ public class SecretKeyUtils {
68 64  
69 65 // 解码返回byte
70 66 public static byte[] decryptBASE64(String key) throws Exception {
71   - return (new BASE64Decoder()).decodeBuffer(key);
  67 + return Base64.getDecoder().decode(key);
72 68 }
73 69  
74 70 // 编码返回字符串
75 71 public static String encryptBASE64(byte[] key) throws Exception {
76   - return (new BASE64Encoder()).encodeBuffer(key);
  72 + return Base64.getEncoder().encodeToString(key);
77 73 }
78 74  
79 75 // 使用KeyPairGenerator 生成公私钥,存放于map对象中
... ...
huaheng-wms-core/src/main/java/org/jeecg/utils/StringUtils.java
1 1 package org.jeecg.utils;
2 2  
3   -import org.apache.commons.lang.text.StrBuilder;
4   -import org.jeecg.utils.support.StrFormatter;
5   -
6 3 import java.lang.reflect.Field;
7 4 import java.util.Collection;
8 5 import java.util.Map;
9 6  
  7 +import org.apache.commons.lang.text.StrBuilder;
  8 +
10 9 /**
11 10 * 字符串工具类
12 11 * @author huaheng
... ... @@ -238,25 +237,6 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
238 237 }
239 238  
240 239 /**
241   - * 格式化文本, {} 表示占位符<br>
242   - * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
243   - * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
244   - * 例:<br>
245   - * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
246   - * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
247   - * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
248   - * @param template 文本模板,被替换的部分用 {} 表示
249   - * @param params 参数值
250   - * @return 格式化后的文本
251   - */
252   - public static String format(String template, Object... params) {
253   - if (isEmpty(params) || isEmpty(template)) {
254   - return template;
255   - }
256   - return StrFormatter.format(template, params);
257   - }
258   -
259   - /**
260 240 * 驼峰首字符小写
261 241 */
262 242 public static String uncapitalize(String str) {
... ...
huaheng-wms-core/src/main/java/org/jeecg/utils/config/HuahengRedisConfig.java 0 → 100644
  1 +package org.jeecg.utils.config;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonAutoDetect;
  4 +import com.fasterxml.jackson.annotation.PropertyAccessor;
  5 +import com.fasterxml.jackson.databind.ObjectMapper;
  6 +import lombok.extern.slf4j.Slf4j;
  7 +
  8 +import org.jeecg.utils.manager.RedisConfigCacheManager;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.context.annotation.Bean;
  11 +import org.springframework.context.annotation.Configuration;
  12 +import org.springframework.context.annotation.Primary;
  13 +import org.springframework.data.redis.cache.RedisCacheConfiguration;
  14 +import org.springframework.data.redis.cache.RedisCacheManager;
  15 +import org.springframework.data.redis.cache.RedisCacheWriter;
  16 +import org.springframework.data.redis.connection.RedisConnectionFactory;
  17 +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
  18 +import org.springframework.data.redis.serializer.RedisSerializationContext;
  19 +import org.springframework.data.redis.serializer.RedisSerializer;
  20 +import org.springframework.data.redis.serializer.StringRedisSerializer;
  21 +
  22 +import java.time.Duration;
  23 +
  24 +@Slf4j
  25 +@Configuration
  26 +public class HuahengRedisConfig {
  27 +
  28 + @Bean
  29 + @Primary
  30 + public RedisCacheManager redisCacheManager(RedisConnectionFactory factory) {
  31 + ObjectMapper om = new ObjectMapper();
  32 + RedisSerializer<String> redisSerializer = new StringRedisSerializer();
  33 + Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
  34 + // 解决查询缓存转换异常的问题
  35 + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  36 + om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  37 + jackson2JsonRedisSerializer.setObjectMapper(om);
  38 + // 配置序列化(解决乱码的问题)
  39 + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMillis(-1))
  40 + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
  41 + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)).disableCachingNullValues();
  42 + RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(factory);
  43 +
  44 + /*
  45 + * return RedisConfigCacheManager.builder(factory).withInitialCacheConfigurations().transactionAware().build();
  46 + */
  47 + return new RedisConfigCacheManager(cacheWriter, config);
  48 + }
  49 +}
0 50 \ No newline at end of file
... ...
huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengShiroConfig.java renamed to huaheng-wms-core/src/main/java/org/jeecg/utils/config/HuahengShiroConfig.java
1   -package org.jeecg.utils;
  1 +package org.jeecg.utils.config;
2 2  
3 3 import java.util.LinkedHashMap;
4 4 import java.util.Map;
... ...
huaheng-wms-core/src/main/java/org/jeecg/utils/http/OkHttpUtils.java deleted
1   -package org.jeecg.utils.http;
2   -
3   -import com.alibaba.fastjson.JSON;
4   -import com.alibaba.fastjson.TypeReference;
5   -import com.alibaba.fastjson.parser.Feature;
6   -
7   -import net.bytebuddy.asm.Advice.This;
8   -import okhttp3.*;
9   -import org.jeecg.modules.wms.framework.aspectj.ApiLogAspect;
10   -import org.jeecg.modules.wms.monitor.apiLog.entity.ApiLog;
11   -import org.slf4j.Logger;
12   -import org.slf4j.LoggerFactory;
13   -
14   -import java.io.IOException;
15   -import java.lang.reflect.Type;
16   -import java.util.HashMap;
17   -import java.util.Map;
18   -import java.util.Objects;
19   -import java.util.concurrent.TimeUnit;
20   -
21   -import javax.validation.constraints.NotNull;
22   -
23   -/**
24   - * OkHttp发送请求
25   - * @author huaheng
26   - * @Date 2022-5-30
27   - */
28   -public class OkHttpUtils {
29   -
30   - private static final Logger log = LoggerFactory.getLogger(OkHttpUtils.class);
31   -
32   - /**
33   - * 最多重试次数
34   - */
35   - public final static int MAX_RENTRY_COUNT = 3;
36   -
37   - /**
38   - * 最大连接时间(秒)
39   - */
40   - public final static int CONNECTION_TIMEOUT = 1;
41   -
42   - /**
43   - * 最大读取时间(秒)
44   - */
45   - public final static int READ_TIMEOUT = 30;
46   -
47   - /**
48   - * 最大写入时间(秒)
49   - */
50   - public final static int WRITE_TIMEOUT = 30;
51   -
52   - /**
53   - * JSON格式
54   - */
55   - public static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json; charset=utf-8");
56   - /**
57   - * OkHTTP线程池最大空闲线程数
58   - */
59   - public final static int MAX_IDLE_CONNECTIONS = 100;
60   - /**
61   - * OkHTTP线程池空闲线程存活时间
62   - */
63   - public final static long KEEP_ALIVE_DURATION = 30L;
64   -
65   - private static final String CONTENT_TYPE = "Content-Type";
66   -
67   - /**
68   - * client 配置重试
69   - */
70   - private final static OkHttpClient HTTP_CLIENT =
71   - new OkHttpClient.Builder().connectTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS).readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
72   - .writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS).addInterceptor(new OkHttpUtils.OkhttpInterceptor(MAX_RENTRY_COUNT)) // 过滤器,设置最大重试次数
73   - .retryOnConnectionFailure(false).connectionPool(new ConnectionPool(MAX_IDLE_CONNECTIONS, KEEP_ALIVE_DURATION, TimeUnit.MINUTES)).build();
74   -
75   - /**
76   - * 向指定 URL 发送GET方法的请求
77   - * @param url 发送请求的 URL //* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
78   - * @return 所代表远程资源的响应结果
79   - */
80   - public static String sendGet(String url, String param) {
81   - ApiLog apiLog = null;
82   - // headers 请求头
83   - Map<String, String> headers = new HashMap<>();
84   - // 请求URI
85   - String urlNameString = url + "?" + param;
86   - Request.Builder builder = new Request.Builder();
87   - buildHeader(builder, headers);
88   -
89   - Request request = builder.url(urlNameString).get().build();
90   - Response response = null;
91   - String result = null;
92   - try {
93   - apiLog = ApiLogAspect.initApiLog(request, param);
94   - response = HTTP_CLIENT.newCall(request).execute();
95   - if (response.isSuccessful() && Objects.nonNull(response.body())) {
96   - result = response.body().string();
97   - log.info("执行GET请求,url:{},header:{},param:{} 成功,返回结果:{}", url, JSON.toJSONString(headers), param, result);
98   - }
99   - } catch (IOException e) {
100   - log.error("执行GET请求,url:{},header:{},param:{} 失败!", url, JSON.toJSONString(headers), param, e);
101   - ApiLogAspect.setApiLogException(apiLog, e);
102   - } finally {
103   - ApiLogAspect.finishApiLog(apiLog, response, result);
104   - }
105   - return result;
106   - }
107   -
108   - /**
109   - * 向指定 URL 发送POST方法的请求
110   - * @param url 发送请求的 URL
111   - * @param param 请求参数,请求参数是 name1=value1&name2=value2 的形式。
112   - * @return 远程资源的响应结果
113   - * @throws IOException
114   - */
115   - public static String sendPost(String url, String param) {
116   - ApiLog apiLog = null;
117   - FormBody.Builder builder = new FormBody.Builder();
118   - String urlNameString = url + "?" + param;
119   - FormBody body = builder.build();
120   - Request request = new Request.Builder().url(urlNameString).post(body).build();
121   - Response response = null;
122   - String result = null;
123   - try {
124   - apiLog = ApiLogAspect.initApiLog(request, param);
125   - response = HTTP_CLIENT.newCall(request).execute();
126   - // 调用成功
127   - if (response.isSuccessful() && response.body() != null) {
128   - result = response.body().string();
129   - log.info("执行GET请求,url:{},param:{} 成功,返回结果:{}", url, param, result);
130   - }
131   - } catch (IOException e) {
132   - log.error("执行GET请求,url:{},param:{} 失败!", url, param, e);
133   - ApiLogAspect.setApiLogException(apiLog, e);
134   - } finally {
135   - ApiLogAspect.finishApiLog(apiLog, response, result);
136   - }
137   - return result;
138   - }
139   -
140   - /** JSONString形式发送POST请求
141   - * @throws IOException */
142   - public static String sendPostByJsonStr(String url, String json) {
143   - ApiLog apiLog = null;
144   - // using above json body as a input to post API call
145   - RequestBody body = RequestBody.create(MEDIA_TYPE_JSON, json);
146   - // headers 请求头
147   - Map<String, String> headers = new HashMap<>();
148   - headers.put("Accept", "application/json");// 设置接收数据的格式
149   - headers.put("Content-Type", "application/json");// 设置发送数据的格式
150   - Request.Builder builder = new Request.Builder();
151   - buildHeader(builder, headers);
152   - Request request = builder.url(url).post(body).build();
153   - Response response = null;
154   - String result = null;
155   - try {
156   - apiLog = ApiLogAspect.initApiLog(request, json);
157   - response = HTTP_CLIENT.newCall(request).execute();
158   - if (response.isSuccessful() && Objects.nonNull(response.body())) {
159   - result = response.body().string();
160   - log.info("执行POST请求,url:{},header:{},param:{} 成功,返回结果:{}", url, JSON.toJSONString(headers), json, result);
161   - }
162   - } catch (IOException e) {
163   - log.error("执行POST请求,url:{},header:{},param:{} 失败!", url, JSON.toJSONString(headers), json, e);
164   - ApiLogAspect.setApiLogException(apiLog, e);
165   - } finally {
166   - ApiLogAspect.finishApiLog(apiLog, response, result);
167   - }
168   - return result;
169   - }
170   -
171   - /**
172   - * 设置请求头
173   - * @param builder .
174   - * @param headers 请求头
175   - */
176   - private static void buildHeader(Request.Builder builder, Map<String, String> headers) {
177   - if (Objects.nonNull(headers) && headers.size() > 0) {
178   - headers.forEach((k, v) -> {
179   - if (Objects.nonNull(k) && Objects.nonNull(v)) {
180   - builder.addHeader(k, v);
181   - }
182   - });
183   - }
184   - }
185   -
186   - /**
187   - * 支持嵌套泛型的POST请求
188   - * @param url 链接
189   - * @param json 请求json
190   - * @param type 嵌套泛型
191   - * @return 响应对象, 可进行强转。
192   - * @throws IOException
193   - */
194   - public static <T> T sendPostByJsonStr(String url, String jsonString, TypeReference<T> type) throws IOException {
195   - String result = sendPostByJsonStr(url, jsonString);
196   - if (Objects.nonNull(result) && Objects.nonNull(type)) {
197   - return JSON.parseObject(result, type);
198   - }
199   - return null;
200   - }
201   -
202   - public static class OkhttpInterceptor implements Interceptor {
203   - // 最大重试次数
204   - private int maxRentry;
205   -
206   - public OkhttpInterceptor(int maxRentry) {
207   - this.maxRentry = maxRentry;
208   - }
209   -
210   - @NotNull
211   - @Override
212   - public Response intercept(@NotNull Chain chain) throws IOException {
213   - /*
214   - * 递归 2次下发请求,如果仍然失败 则返回 null ,但是 intercept must not return null. 返回 null 会报 IllegalStateException 异常
215   - */
216   - return retry(chain, 0);
217   - }
218   -
219   - private Response retry(Chain chain, int retryCent) {
220   - Request request = chain.request();
221   - Response response = null;
222   - try {
223   - response = chain.proceed(request);
224   - } catch (Exception e) {
225   - if (maxRentry > retryCent) {
226   - return retry(chain, retryCent + 1);
227   - }
228   - }
229   - return response;
230   - }
231   - }
232   -
233   -}
huaheng-wms-core/src/main/java/org/jeecg/utils/CustomLogContextListener.java renamed to huaheng-wms-core/src/main/java/org/jeecg/utils/listener/CustomLogContextListener.java
1   -package org.jeecg.utils;
  1 +package org.jeecg.utils.listener;
2 2  
3 3 import ch.qos.logback.classic.Level;
4 4 import ch.qos.logback.classic.Logger;
... ...
huaheng-wms-core/src/main/java/org/jeecg/utils/manager/RedisConfigCacheManager.java 0 → 100644
  1 +package org.jeecg.utils.manager;
  2 +
  3 +import java.time.Duration;
  4 +import java.util.Map;
  5 +
  6 +import org.apache.commons.lang3.StringUtils;
  7 +import org.springframework.data.redis.cache.CacheKeyPrefix;
  8 +import org.springframework.data.redis.cache.RedisCache;
  9 +import org.springframework.data.redis.cache.RedisCacheConfiguration;
  10 +import org.springframework.data.redis.cache.RedisCacheManager;
  11 +import org.springframework.data.redis.cache.RedisCacheWriter;
  12 +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
  13 +import org.springframework.data.redis.serializer.RedisSerializationContext;
  14 +
  15 +import lombok.extern.slf4j.Slf4j;
  16 +
  17 +/**
  18 + * redis 配置类
  19 + */
  20 +@Slf4j
  21 +public class RedisConfigCacheManager extends RedisCacheManager {
  22 +
  23 + public RedisConfigCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {
  24 + super(cacheWriter, defaultCacheConfiguration);
  25 + }
  26 +
  27 + public RedisConfigCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration, String... initialCacheNames) {
  28 + super(cacheWriter, defaultCacheConfiguration, initialCacheNames);
  29 + }
  30 +
  31 + public RedisConfigCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration, boolean allowInFlightCacheCreation,
  32 + String... initialCacheNames) {
  33 + super(cacheWriter, defaultCacheConfiguration, allowInFlightCacheCreation, initialCacheNames);
  34 + }
  35 +
  36 + public RedisConfigCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration,
  37 + Map<String, RedisCacheConfiguration> initialCacheConfigurations) {
  38 + super(cacheWriter, defaultCacheConfiguration, initialCacheConfigurations);
  39 + }
  40 +
  41 + public RedisConfigCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration,
  42 + Map<String, RedisCacheConfiguration> initialCacheConfigurations, boolean allowInFlightCacheCreation) {
  43 + super(cacheWriter, defaultCacheConfiguration, initialCacheConfigurations, allowInFlightCacheCreation);
  44 + }
  45 +
  46 + private static final RedisSerializationContext.SerializationPair<Object> DEFAULT_PAIR =
  47 + RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer());
  48 +
  49 + private static final CacheKeyPrefix DEFAULT_CACHE_KEY_PREFIX = cacheName -> cacheName + ":";
  50 +
  51 + @Override
  52 + protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {
  53 + final int lastIndexOf = StringUtils.lastIndexOf(name, '#');
  54 + if (lastIndexOf > -1) {
  55 + final String ttl = StringUtils.substring(name, lastIndexOf + 1);
  56 + final Duration duration = Duration.ofSeconds(Long.parseLong(ttl));
  57 + cacheConfig = cacheConfig.entryTtl(duration);
  58 + // 修改缓存key和value值的序列化方式
  59 + cacheConfig = cacheConfig.computePrefixWith(DEFAULT_CACHE_KEY_PREFIX).serializeValuesWith(DEFAULT_PAIR);
  60 + final String cacheName = StringUtils.substring(name, 0, lastIndexOf);
  61 + return super.createRedisCache(cacheName, cacheConfig);
  62 + } else {
  63 + // 修改缓存key和value值的序列化方式
  64 + cacheConfig = cacheConfig.computePrefixWith(DEFAULT_CACHE_KEY_PREFIX).serializeValuesWith(DEFAULT_PAIR);
  65 + return super.createRedisCache(name, cacheConfig);
  66 + }
  67 + // throw new RuntimeException("字符串中必须包含#号,#号后为过期时间, -1为永不过期");
  68 + }
  69 +}
0 70 \ No newline at end of file
... ...
huaheng-wms-core/src/main/java/org/jeecg/utils/RedissonDistributedLocker.java renamed to huaheng-wms-core/src/main/java/org/jeecg/utils/support/RedissonDistributedLocker.java
1   -package org.jeecg.utils;
  1 +package org.jeecg.utils.support;
2 2  
3 3 import java.util.concurrent.TimeUnit;
4 4  
... ...
huaheng-wms-core/src/main/java/org/jeecg/utils/support/StrFormatter.java deleted
1   -package org.jeecg.utils.support;
2   -
3   -import org.jeecg.utils.StringUtils;
4   -
5   -/**
6   - * 字符串格式化
7   - * @author huaheng
8   - */
9   -public class StrFormatter {
10   -
11   - public static final String EMPTY_JSON = "{}";
12   - public static final char C_BACKSLASH = '\\';
13   - public static final char C_DELIM_START = '{';
14   - public static final char C_DELIM_END = '}';
15   -
16   - /**
17   - * 格式化字符串<br>
18   - * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
19   - * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
20   - * 例:<br>
21   - * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
22   - * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
23   - * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
24   - * @param strPattern 字符串模板
25   - * @param argArray 参数列表
26   - * @return 结果
27   - */
28   - public static String format(final String strPattern, final Object... argArray) {
29   - if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) {
30   - return strPattern;
31   - }
32   - final int strPatternLength = strPattern.length();
33   -
34   - // 初始化定义好的长度以获得更好的性能
35   - StringBuilder sbuf = new StringBuilder(strPatternLength + 50);
36   -
37   - int handledPosition = 0;
38   - int delimIndex;// 占位符所在位置
39   - for (int argIndex = 0; argIndex < argArray.length; argIndex++) {
40   - delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);
41   - if (delimIndex == -1) {
42   - if (handledPosition == 0) {
43   - return strPattern;
44   - } else { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
45   - sbuf.append(strPattern, handledPosition, strPatternLength);
46   - return sbuf.toString();
47   - }
48   - } else {
49   - if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) {
50   - if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) {
51   - // 转义符之前还有一个转义符,占位符依旧有效
52   - sbuf.append(strPattern, handledPosition, delimIndex - 1);
53   - sbuf.append(Convert.utf8Str(argArray[argIndex]));
54   - handledPosition = delimIndex + 2;
55   - } else {
56   - // 占位符被转义
57   - argIndex--;
58   - sbuf.append(strPattern, handledPosition, delimIndex - 1);
59   - sbuf.append(C_DELIM_START);
60   - handledPosition = delimIndex + 1;
61   - }
62   - } else {
63   - // 正常占位符
64   - sbuf.append(strPattern, handledPosition, delimIndex);
65   - sbuf.append(Convert.utf8Str(argArray[argIndex]));
66   - handledPosition = delimIndex + 2;
67   - }
68   - }
69   - }
70   - // append the characters following the last {} pair.
71   - // 加入最后一个占位符后所有的字符
72   - sbuf.append(strPattern, handledPosition, strPattern.length());
73   -
74   - return sbuf.toString();
75   - }
76   -
77   -}
huaheng-wms-core/src/main/resources/application-dev.yml
... ... @@ -276,6 +276,7 @@ logging:
276 276 org.jeecg.common: WARN
277 277 org.jeecg.modules: WARN
278 278 org.jeecg.modules.wms: DEBUG
  279 + org.jeecg.config.shiro: INFO
279 280 #swagger
280 281 knife4j:
281 282 #开启增强配置
... ...
huaheng-wms-core/src/main/resources/application-prod.yml
... ... @@ -265,6 +265,7 @@ logging:
265 265 org.jeecg.common: WARN
266 266 org.jeecg.modules: WARN
267 267 org.jeecg.modules.wms: DEBUG
  268 + org.jeecg.config.shiro: INFO
268 269 #swagger
269 270 knife4j:
270 271 #开启增强配置
... ...
huaheng-wms-core/src/main/resources/application.yml
... ... @@ -6,4 +6,4 @@ spring:
6 6  
7 7 huaheng:
8 8 system:
9   - Id: HUAHENG-WMS4-4.0.1
  9 + Id: HUAHENG-WMS4
... ...
huaheng-wms-core/src/main/resources/logback-spring.xml
... ... @@ -2,7 +2,7 @@
2 2 <configuration debug="false">
3 3  
4 4 <!-- 监听器,指定日志文件存放目录 -->
5   - <contextListener class="org.jeecg.utils.CustomLogContextListener" />
  5 + <contextListener class="org.jeecg.utils.listener.CustomLogContextListener" />
6 6  
7 7 <!--定义日志文件的存储地址 -->
8 8 <property name="LOG_HOME" value="${LOG_PATH}/logs" />
... ...