From c146b3b52e58d2c227f3196d4c6990d1c704fdd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=AA=E4=BA=91=E6=98=8A?= Date: Thu, 13 Aug 2020 22:29:31 +0800 Subject: [PATCH 1/6] =?UTF-8?q?fix:=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=A9=BA=E6=8C=87=E9=92=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/estsh/i3plus/core/apiservice/mq/ScheduleQueueReceiver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/ScheduleQueueReceiver.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/ScheduleQueueReceiver.java index b64f989..9d79c9d 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/ScheduleQueueReceiver.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/ScheduleQueueReceiver.java @@ -84,7 +84,7 @@ public class ScheduleQueueReceiver { imppLog.insertSysLogTaskTime(logTaskTime); // 定时任务失败通知 - if (CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() == logTaskTime.getTaskStatus() + if (CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() == logTaskTime.getTaskStatusVal() && CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == taskPlan.getIsNotice()) { // 设置通知邮件内容 SysMessage sysMessage = new SysMessage(); From a67f6b691843ae84c0ec03888ff418c41d03dc77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=AA=E4=BA=91=E6=98=8A?= Date: Thu, 13 Aug 2020 22:34:09 +0800 Subject: [PATCH 2/6] =?UTF-8?q?fix:=E5=BE=AE=E6=9C=8D=E5=8A=A1=E5=A4=9A?= =?UTF-8?q?=E5=AE=9E=E4=BE=8B=E4=B8=8B=E5=8D=95=E5=8F=B7=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/iservice/base/ISynchronizedService.java | 10 + .../api/iservice/busi/ISysOrderNoRuleService.java | 8 + .../controller/base/WhiteController.java | 49 ++++- .../controller/busi/SysOrderNoRuleController.java | 24 ++- .../serviceimpl/base/SynchronizedService.java | 14 ++ .../serviceimpl/busi/SysOrderNoRuleService.java | 51 ++++- .../i3plus/core/apiservice/util/CloneTool.java | 231 +++++++++++++++++++++ 7 files changed, 380 insertions(+), 7 deletions(-) create mode 100644 modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/CloneTool.java diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/base/ISynchronizedService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/base/ISynchronizedService.java index 317e832..b25fdd3 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/base/ISynchronizedService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/base/ISynchronizedService.java @@ -3,6 +3,8 @@ package cn.estsh.i3plus.core.api.iservice.base; import cn.estsh.i3plus.pojo.platform.bean.SysOrderNoRule; import io.swagger.annotations.ApiOperation; +import java.util.List; + /** * @Description : * @Reference : @@ -20,4 +22,12 @@ public interface ISynchronizedService { @ApiOperation(value = "根据code查询最新单号规则") SysOrderNoRule nextOrderNo(String code); + /** + * 根据单号代码获取单号信息 + * @param code 单号代码 + * @return 单号信息 + */ + @ApiOperation(value = "根据code查询最新单号规则") + List nextOrderNo(String code, int num); + } diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysOrderNoRuleService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysOrderNoRuleService.java index a177138..ce61dbb 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysOrderNoRuleService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysOrderNoRuleService.java @@ -64,6 +64,14 @@ public interface ISysOrderNoRuleService { SysOrderNoRule doGetSysOrderNoRuleCode(String code); /** + * 根据单号代码获取单号信息 + * @param code 单号代码 + * @return 单号信息 + */ + @ApiOperation(value = "根据code查询最新单号规则") + List doGetSysOrderNoRuleByCodeAndNum(String code,int num); + + /** * 根据id修改单号规则状态 * @param id 单号ID * @param status 单号状态 diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java index 7674183..36ea43f 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java @@ -38,6 +38,12 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.stream.Collectors; + +import static cn.estsh.i3plus.platform.common.util.CommonConstWords.REDIS_PREFIX_LOCK_BATCH_GET_ORDER_NO; +import static cn.estsh.i3plus.platform.common.util.CommonConstWords.REDIS_PREFIX_LOCK_GET_ORDER_NO; /** * @Description : @@ -63,6 +69,9 @@ public class WhiteController extends CoreBaseController { private ISystemLoginService systemLoginService; @Autowired + private ISysOrderNoRuleService sysOrderNoRuleService; + + @Autowired private ISysUserService userService; @Autowired @@ -92,7 +101,7 @@ public class WhiteController extends CoreBaseController { @Autowired private SysUserPasswordUtil userPasswordUtil; - @Resource(name=CommonConstWords.IMPP_REDIS_RES) + @Resource(name = CommonConstWords.IMPP_REDIS_RES) private ImppRedis redisRes; @Autowired @@ -398,15 +407,50 @@ public class WhiteController extends CoreBaseController { @GetMapping(value = "/sys-order-no-rule/get-order-no/{code}") @ApiOperation(value = "根据单号规则代码,生成单号") public ResultBean getOrderNo(@PathVariable("code") String code) { + Lock lock = redisCore.getFairLock(REDIS_PREFIX_LOCK_GET_ORDER_NO); try { ValidatorBean.checkNotNull(code, "code不能为空"); + // 获取锁 + lock.lock(); + SysOrderNoRule sysOrderNoRule = synchronizedService.nextOrderNo(code); return ResultBean.success("操作成功").setResultObject(sysOrderNoRule).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); } catch (ImppBusiException busExcep) { return ResultBean.fail(busExcep); } catch (Exception e) { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } finally { + lock.unlock(); + } + } + + /** + * 根据单号规则代码,生成单号 + * + * @param code 单号规则代码 + * @param num 生成数量 + * @return 处理结果 + */ + @GetMapping(value = "/sys-order-no-rule/get-order-no/{code}/{num}") + @ApiOperation(value = "根据单号规则代码,生成单号") + public ResultBean getOrderNo(@PathVariable("code") String code, @PathVariable("num") Integer num) { + Lock lock = redisCore.getFairLock(REDIS_PREFIX_LOCK_BATCH_GET_ORDER_NO); + try { + ValidatorBean.checkNotNull(code, "code不能为空"); + ValidatorBean.checkNotZero(num, "次数不能为零"); + + // 获取锁 + lock.tryLock(15, TimeUnit.SECONDS); + + List orderNoList = synchronizedService.nextOrderNo(code, num).stream().map(SysOrderNoRule::getOrderNo).collect(Collectors.toList()); + return ResultBean.success("操作成功").setResultList(orderNoList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + } catch (ImppBusiException busExcep) { + return ResultBean.fail(busExcep); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } finally { + lock.unlock(); } } @@ -435,6 +479,7 @@ public class WhiteController extends CoreBaseController { /** * 获取登录平台信息 + * * @return */ private CommonEnumUtil.LOG_LOGIN_PLATFORM getLoginPlatform(){ @@ -514,6 +559,7 @@ public class WhiteController extends CoreBaseController { /** * 根据条件分页查询用户信息 + * * @param model 查询条件 * @return 处理结果 */ @@ -554,6 +600,7 @@ public class WhiteController extends CoreBaseController { /** * 缺失资源开关 + * * @return */ @AnnoIgnoreLog diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java index 4c145c5..bfbdb76 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java @@ -12,6 +12,7 @@ import cn.estsh.i3plus.platform.common.tool.StringTool; import cn.estsh.i3plus.platform.common.tool.ZipTool; import cn.estsh.i3plus.platform.common.util.CommonConstWords; import cn.estsh.i3plus.platform.common.util.PlatformConstWords; +import cn.estsh.i3plus.pojo.base.bean.ImppFile; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; @@ -22,7 +23,6 @@ import cn.estsh.impp.framework.base.controller.CoreBaseController; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.fileservice.ImppFileService; -import cn.estsh.i3plus.pojo.base.bean.ImppFile; import cn.estsh.impp.framework.boot.util.ImppRedis; import cn.estsh.impp.framework.boot.util.ResultBean; import cn.estsh.impp.framework.boot.util.ValidatorBean; @@ -38,6 +38,11 @@ import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.stream.Collectors; + +import static cn.estsh.i3plus.platform.common.util.CommonConstWords.REDIS_PREFIX_LOCK_GET_ORDER_NO; /** * @Description :系统单号规则管理服务 @@ -388,15 +393,21 @@ public class SysOrderNoRuleController extends CoreBaseController { @GetMapping(value = "/get-order-no/{code}") @ApiOperation(value = "根据单号规则代码,生成单号") public ResultBean getOrderNo(@PathVariable("code") String code) { + Lock lock = redisCore.getLock(REDIS_PREFIX_LOCK_GET_ORDER_NO); try { ValidatorBean.checkNotNull(code, "code不能为空"); + // 获取锁 + lock.tryLock(10, TimeUnit.SECONDS); + SysOrderNoRule sysOrderNoRule = synchronizedService.nextOrderNo(code); return ResultBean.success("操作成功").setResultObject(sysOrderNoRule).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); } catch (ImppBusiException busExcep) { return ResultBean.fail(busExcep); } catch (Exception e) { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } finally { + lock.unlock(); } } @@ -409,19 +420,22 @@ public class SysOrderNoRuleController extends CoreBaseController { @GetMapping(value = "/get-order-no/{code}/{num}") @ApiOperation(value = "根据单号规则代码,生成单号") public ResultBean getOrderNo(@PathVariable("code") String code,@PathVariable("num") Integer num) { + Lock lock = redisCore.getLock(REDIS_PREFIX_LOCK_GET_ORDER_NO); try { ValidatorBean.checkNotNull(code, "code不能为空"); ValidatorBean.checkNotZero(num,"次数不能为零"); - List orderNoList = new ArrayList<>(); - for (int i = 0; i < num; i++) { - orderNoList.add(synchronizedService.nextOrderNo(code).getOrderNo()); - } + // 获取锁 + lock.tryLock(10, TimeUnit.SECONDS); + + List orderNoList = synchronizedService.nextOrderNo(code,num).stream().map(SysOrderNoRule::getOrderNo).collect(Collectors.toList()); return ResultBean.success("操作成功").setResultList(orderNoList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); } catch (ImppBusiException busExcep) { return ResultBean.fail(busExcep); } catch (Exception e) { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } finally { + lock.unlock(); } } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SynchronizedService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SynchronizedService.java index 95904f8..4edf7d5 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SynchronizedService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SynchronizedService.java @@ -6,6 +6,8 @@ import cn.estsh.i3plus.pojo.platform.bean.SysOrderNoRule; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + /** * @Description : * @Reference : @@ -23,4 +25,16 @@ public class SynchronizedService implements ISynchronizedService { public synchronized SysOrderNoRule nextOrderNo(String code) { return sysOrderNoRuleService.doGetSysOrderNoRuleCode(code); } + + /** + * 根据单号代码获取单号信息 + * + * @param code 单号代码 + * @param num + * @return 单号信息 + */ + @Override + public synchronized List nextOrderNo(String code, int num) { + return sysOrderNoRuleService.doGetSysOrderNoRuleByCodeAndNum(code,num); + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRuleService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRuleService.java index 4d5e82e..40c4cc4 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRuleService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRuleService.java @@ -1,7 +1,9 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.busi; import cn.estsh.i3plus.core.api.iservice.busi.ISysOrderNoRuleService; +import cn.estsh.i3plus.core.apiservice.util.CloneTool; import cn.estsh.i3plus.core.apiservice.util.OrderNoMakeUtil; +import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; import cn.estsh.i3plus.platform.common.tool.StringTool; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.bean.ListPager; @@ -13,13 +15,13 @@ import cn.estsh.i3plus.pojo.platform.bean.SysOrderNoRule; import cn.estsh.i3plus.pojo.platform.repository.SysOrderNoRuleRepository; import cn.estsh.i3plus.pojo.platform.sqlpack.CoreHqlPack; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; -import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; /** @@ -114,6 +116,53 @@ public class SysOrderNoRuleService implements ISysOrderNoRuleService { } } + /** + * 根据单号代码获取单号信息 + * + * @param code 单号代码 + * @param num + * @return 单号信息 + */ + @Override + public synchronized List doGetSysOrderNoRuleByCodeAndNum(String code, int num) { + SysOrderNoRule sysOrderNoRule = sysOrderNoRuleRDao.getByProperty("orderNoRuleCode", code); + sysOrderNoRuleRDao.detachObject(sysOrderNoRule); + List resultList = new ArrayList<>(); + + if (sysOrderNoRule == null) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode()) + .setErrorDetail("[" + code + "]规则代码不存在存在") + .setErrorSolution("请重新输入规则代码") + .build(); + } else if (sysOrderNoRule.getOrderNoRuleStatus() == CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("[" + code + "]单号规则已禁用") + .setErrorSolution("请重新输入规则代码") + .build(); + } else { + try { + for (int i = 0; i < num; i++) { + sysOrderNoRule = OrderNoMakeUtil.next((SysOrderNoRule) CloneTool.clone(sysOrderNoRule)); + resultList.add(sysOrderNoRule); + } + }catch (Exception e){ + LOGGER.error("单号生成异常:",e); + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION.getCode()) + .setErrorDetail("单号生成异常 %s",e.getMessage()) + .build(); + } + + sysOrderNoRuleRDao.update(sysOrderNoRule); + return resultList; + } + } + @Override public void updateSysOrderNoRuleCodeStatusById(Long id, Integer status) { sysOrderNoRuleRDao.updateByProperties("id", id, "orderNoRuleStatus", status); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/CloneTool.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/CloneTool.java new file mode 100644 index 0000000..cf6b035 --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/CloneTool.java @@ -0,0 +1,231 @@ +package cn.estsh.i3plus.core.apiservice.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.*; + +/** + * @Description : + * @Reference : + * @Author : yunhao + * @CreateDate : 2020-08-12 13:44 + * @Modify: + **/ +public class CloneTool { + + public static final Logger LOGGER = LoggerFactory.getLogger(CloneTool.class); + + /** + * 无需进行复制的特殊类型数组 + */ + static Class[] needlessCloneClasses = new Class[]{String.class,Boolean.class,Character.class,Byte.class,Short.class, + Integer.class,Long.class,Float.class,Double.class,Void.class,Object.class,Class.class + }; + /** + * 判断该类型对象是否无需复制 + * @param c 指定类型 + * @return 如果不需要复制则返回真,否则返回假 + */ + private static boolean isNeedlessClone(Class c){ + if(c.isPrimitive()){//基本类型 + return true; + } + for(Class tmp:needlessCloneClasses){//是否在无需复制类型数组里 + if(c.equals(tmp)){ + return true; + } + } + return false; + } + + /** + * 尝试创建新对象 + * @param value 原始对象 + * @return 新的对象 + * @throws IllegalAccessException + */ + private static Object createObject(Object value) throws IllegalAccessException{ + try { + return value.getClass().newInstance(); + } catch (InstantiationException e) { + return null; + } catch (IllegalAccessException e) { + throw e; + } + } + + /** + * 复制对象数据 + * @param value 原始对象 + * @param level 复制深度。小于0为无限深度,即将深入到最基本类型和Object类级别的数据复制; + * 大于0则按照其值复制到指定深度的数据,等于0则直接返回对象本身而不进行任何复制行为。 + * @return 返回复制后的对象 + * @throws IllegalAccessException + * @throws InstantiationException + */ + public static Object clone(Object value,int level) throws IllegalAccessException, InstantiationException { + if(value==null){ + return null; + } + if(level==0){ + return value; + } + Class c = value.getClass(); + if(isNeedlessClone(c)){ + return value; + } + level--; + if(value instanceof Collection){//复制新的集合 + Collection tmp = (Collection)c.newInstance(); + for(Object v:(Collection)value){ + tmp.add(clone(v,level));//深度复制 + } + value = tmp; + } + else if(c.isArray()){//复制新的Array + //首先判断是否为基本数据类型 + if(c.equals(int[].class)){ + int[] old = (int[])value; + value = (int[]) Arrays.copyOf(old, old.length); + } + else if(c.equals(short[].class)){ + short[] old = (short[])value; + value = (short[])Arrays.copyOf(old, old.length); + } + else if(c.equals(char[].class)){ + char[] old = (char[])value; + value = (char[])Arrays.copyOf(old, old.length); + } + else if(c.equals(float[].class)){ + float[] old = (float[])value; + value = (float[])Arrays.copyOf(old, old.length); + } + else if(c.equals(double[].class)){ + double[] old = (double[])value; + value = (double[])Arrays.copyOf(old, old.length); + } + else if(c.equals(long[].class)){ + long[] old = (long[])value; + value = (long[])Arrays.copyOf(old, old.length); + } + else if(c.equals(boolean[].class)){ + boolean[] old = (boolean[])value; + value = (boolean[])Arrays.copyOf(old, old.length); + } + else if(c.equals(byte[].class)){ + byte[] old = (byte[])value; + value = (byte[])Arrays.copyOf(old, old.length); + } + else { + Object[] old = (Object[])value; + Object[] tmp = (Object[])Arrays.copyOf(old, old.length, old.getClass()); + for(int i = 0;i fields = new HashSet(); + while(c!=null&&!c.equals(Object.class)){ + fields.addAll(Arrays.asList(c.getDeclaredFields())); + c = c.getSuperclass(); + } + for(Field field:fields){ + if(!Modifier.isFinal(field.getModifiers())){//仅复制非final字段 + field.setAccessible(true); + field.set(tmp, clone(field.get(value),level));//深度复制 + } + } + value = tmp; + } + return value; + } + + /** + * 浅表复制对象 + * @param value 原始对象 + * @return 复制后的对象,只复制一层 + * @throws IllegalAccessException + * @throws InstantiationException + */ + public static Object clone(Object value) throws IllegalAccessException, InstantiationException { + return clone(value,1); + } + + /** + * 深度复制对象 + * @param value 原始对象 + * @return 复制后的对象 + * @throws IllegalAccessException + * @throws InstantiationException + */ + public static Object deepClone(Object value) throws IllegalAccessException, InstantiationException { + return clone(value,-1); + } + + +//数据:100 深度:10 测试 +//======普通赋值====== +//数据:100 深度:10 +//普通赋值耗时:4~8 +//======克隆工具1====== +//数据:100 深度:10 +//克隆工具1耗时:1272~1987 +//======克隆工具2-1====== +//数据:100 深度:10 +//克隆工具2-1耗时:5~7 +//======克隆工具2-2====== +//数据:100 深度:10 +//克隆工具2-2耗时:15~19 +// +//数据:100 深度:20 测试 +//======普通赋值====== +//数据:100 深度:20 +//普通赋值耗时:6 +//======克隆工具1====== +//数据:100 深度:20 +//克隆工具1耗时:1772 +//======克隆工具2-1====== +//数据:100 深度:20 +//克隆工具2-1耗时:71 +//======克隆工具2-2====== +//数据:100 深度:20 +//克隆工具2-2耗时:216 +// 性能低 +// public static T clone(Object cloneObj) { +// ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); +// ObjectOutputStream out; +// try { +// out = new ObjectOutputStream(byteOut); +// out.writeObject(cloneObj); +// +// ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); +// +// ObjectInputStream in = new ObjectInputStream(byteIn); +// +// T retObj = (T) in.readObject(); +// +// return retObj; +// } catch (IOException | ClassNotFoundException e) { +// LOGGER.error("对象" + cloneObj.getClass().getName() + "克隆异常:", e); +// } +// return null; +// } + +} From 29f40a4dc7d5be8774ad68fbea58a5075bb89dd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=AA=E4=BA=91=E6=98=8A?= Date: Mon, 24 Aug 2020 20:39:42 +0800 Subject: [PATCH 3/6] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0=E6=9D=A1=E7=A0=81?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E6=A0=A1=E9=AA=8C=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/apiservice/util/BarcodeParseUtil.java | 72 +++++++++++++++++++--- 1 file changed, 64 insertions(+), 8 deletions(-) diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/BarcodeParseUtil.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/BarcodeParseUtil.java index 7220b2f..5f58d8c 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/BarcodeParseUtil.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/BarcodeParseUtil.java @@ -1,6 +1,7 @@ package cn.estsh.i3plus.core.apiservice.util; import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; +import cn.estsh.i3plus.platform.common.tool.JsonUtilTool; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.platform.bean.SysBarcodeRule; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; @@ -17,7 +18,8 @@ import java.util.Map; **/ public final class BarcodeParseUtil { - private BarcodeParseUtil(){} + private BarcodeParseUtil() { + } /** * 按指定规则解析条码 @@ -47,17 +49,71 @@ public final class BarcodeParseUtil { String[] barcodeKey = barcodeRule.getBarcodeRule().split(barcodeRule.getBarcodeSeparator()); String[] barcodeValue = barcode.split(barcodeRule.getBarcodeSeparator()); - // 避免出现长度不相等 - int size = barcodeKey.length; - if (barcodeKey.length != barcodeValue.length) { - size = Math.min(barcodeKey.length,barcodeValue.length); - } + // 校验 + verifyBarcode(barcodeRule,barcodeKey,barcodeValue,barcode); // 匹配条码数据 HashMap barcodeMap = new HashMap<>(); - for (int i = 0; i < size; i++) { - barcodeMap.put(barcodeKey[i], barcodeValue[i]); + for (int i = 0; i < barcodeKey.length; i++) { + barcodeMap.put(barcodeKey[i], barcodeValue.length > i ? barcodeValue[i] : null); } return barcodeMap; } + + /** + * 条码校验 + * + * @param barcodeRule 校验模式 + * @param barcodeKey 条码key + * @param barcodeValue 条码值 + */ + private static void verifyBarcode(SysBarcodeRule barcodeRule, String[] barcodeKey, String[] barcodeValue, String barcode) { + boolean verifyFail = false; + if (barcodeRule.getCheckModeVal() == CommonEnumUtil.BARCODE_CHECK_MODE.SEPARATOR_NUM.getValue()) { + // 校验分隔符的数量 + int separatorNum = barcode.length() - barcode.replaceAll(barcodeRule.getBarcodeSeparator(), "").length() + 1; + verifyFail = barcodeKey.length != separatorNum; + } else if (barcodeRule.getCheckModeVal() == CommonEnumUtil.BARCODE_CHECK_MODE.ANALYTIC_NUM.getValue()) { + // 校验解析后的数量是否相等 + verifyFail = barcodeKey.length != barcodeValue.length; + } + + if (verifyFail) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("条码与规则不匹配!") + .build(); + } + } + + public static void main(String[] args) { + String str = "{\n" + + "\t\t\"id\": \"1202112194247430144\",\n" + + "\t\t\"organizeCode\": \"\",\n" + + "\t\t\"isValid\": 1,\n" + + "\t\t\"isDeleted\": 2,\n" + + "\t\t\"createUser\": \"qianhuasheng\",\n" + + "\t\t\"createDatetime\": \"2019-12-04 14:27:35\",\n" + + "\t\t\"modifyUser\": \"qianhuasheng\",\n" + + "\t\t\"modifyDatetime\": \"2019-12-04 14:27:35\",\n" + + "\t\t\"createDateTimeStart\": null,\n" + + "\t\t\"createDateTimeEnd\": null,\n" + + "\t\t\"modifyDateTimeStart\": null,\n" + + "\t\t\"modifyDateTimeEnd\": null,\n" + + "\t\t\"orderByParam\": \"\",\n" + + "\t\t\"ascOrDesc\": 1,\n" + + "\t\t\"sortParamMap\": null,\n" + + "\t\t\"name\": \"VDA生产标签打印解析二维码\",\n" + + "\t\t\"barcodeRuleCode\": \"VDA_REPORT_SN_2D\",\n" + + "\t\t\"barcodeRule\": \"partNo|express\",\n" + + "\t\t\"barcodeSeparator\": \"|\",\n" + + "\t\t\"barcodeRuleDescription\": \"VDA生产标签打印解析二维码\",\n" + + "\t\t\"isValidVal\": 1,\n" + + "\t\t\"checkMode\": 10,\n" + + "\t\t\"isDeletedVal\": 2\n" + + "\t}"; + + System.out.println(parse(JsonUtilTool.decode(str,SysBarcodeRule.class),"YFRHU|")); + } } From 137a14133feb5d8eba48673b493723b3b69063c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=AA=E4=BA=91=E6=98=8A?= Date: Mon, 24 Aug 2020 20:52:23 +0800 Subject: [PATCH 4/6] =?UTF-8?q?feat:=E5=8D=95=E5=8F=B7=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/iservice/busi/ICoreMemTreeService.java | 6 ++ .../api/iservice/busi/ISysOrderNoRuleService.java | 29 ++++--- .../controller/base/WhiteController.java | 33 +++----- .../serviceimpl/base/SynchronizedService.java | 54 ++++++++++++- .../serviceimpl/busi/CoreMemTreeService.java | 19 +++++ .../serviceimpl/busi/SysOrderNoRuleService.java | 93 ++++++++-------------- .../serviceimpl/busi/TestTransService.java | 1 - .../i3plus/core/apiservice/util/CloneTool.java | 8 +- .../i3plus/core/apiservice/util/NoSqlPack.java | 1 + .../core/apiservice/util/OrderNoMakeUtil.java | 8 +- 10 files changed, 145 insertions(+), 107 deletions(-) diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ICoreMemTreeService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ICoreMemTreeService.java index 2ec503c..49fbbf1 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ICoreMemTreeService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ICoreMemTreeService.java @@ -161,6 +161,12 @@ public interface ICoreMemTreeService { @ApiOperation(value = "查询功能子节点",notes = "根据用户ID 查询功能树") List packTreeSysMenuByUserId(Long userId); + /** + * 根据用户ID 和 节点ID 查询功能树 + * @param userId + * @param parentId + * @return + */ @ApiOperation(value = "查询功能子节点",notes = "根据用户ID 和 节点ID 查询功能树") List packTreeSysMenuByUserIdAndParentId(Long userId,Long parentId); diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysOrderNoRuleService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysOrderNoRuleService.java index ce61dbb..9cdfc13 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysOrderNoRuleService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysOrderNoRuleService.java @@ -46,6 +46,15 @@ public interface ISysOrderNoRuleService { @ApiOperation(value = "根据id查询单号规则") SysOrderNoRule getSysOrderNoRuleById(Long id); + + /** + * 根据code 查询单号 + * @param code 单号code + * @return 单号信息 + */ + @ApiOperation(value = "根据code查询单号规则") + SysOrderNoRule getSysOrderNoRuleByCode(String code); + /** * 获取分页单号信息 * @param sysOrderNoRule 单号查询条件 @@ -57,19 +66,11 @@ public interface ISysOrderNoRuleService { /** * 根据单号代码获取单号信息 - * @param code 单号代码 - * @return 单号信息 - */ - @ApiOperation(value = "根据code查询最新单号规则") - SysOrderNoRule doGetSysOrderNoRuleCode(String code); - - /** - * 根据单号代码获取单号信息 - * @param code 单号代码 + * @param orderNoRule 单号代码 * @return 单号信息 */ - @ApiOperation(value = "根据code查询最新单号规则") - List doGetSysOrderNoRuleByCodeAndNum(String code,int num); + @ApiOperation(value = "根据单号代码获取单号信息") + List doGetSysOrderNoRuleByNum(SysOrderNoRule orderNoRule,int num); /** * 根据id修改单号规则状态 @@ -100,4 +101,10 @@ public interface ISysOrderNoRuleService { */ @ApiOperation(value = "批量添加编号规则") void insertSysOrderNoRuleList(List sysOrderNoRuleList); + + /** + * 除一级缓存对象,设为游离态 + * @param sysOrderNoRule + */ + void detachSysOrderNoRule(SysOrderNoRule sysOrderNoRule); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java index 36ea43f..ca3bdfa 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java @@ -2,7 +2,6 @@ package cn.estsh.i3plus.core.apiservice.controller.base; import cn.estsh.i3plus.core.api.iservice.base.ISynchronizedService; import cn.estsh.i3plus.core.api.iservice.base.ISystemInitService; -import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginService; import cn.estsh.i3plus.core.api.iservice.busi.*; import cn.estsh.i3plus.core.apiservice.util.SysUserPasswordUtil; import cn.estsh.i3plus.platform.common.convert.ConvertBean; @@ -32,19 +31,15 @@ import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authc.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.Lock; import java.util.stream.Collectors; -import static cn.estsh.i3plus.platform.common.util.CommonConstWords.REDIS_PREFIX_LOCK_BATCH_GET_ORDER_NO; -import static cn.estsh.i3plus.platform.common.util.CommonConstWords.REDIS_PREFIX_LOCK_GET_ORDER_NO; - /** * @Description : * @Reference : @@ -66,12 +61,6 @@ public class WhiteController extends CoreBaseController { private ISysLocaleResourceService sysLocaleResourceService; @Autowired - private ISystemLoginService systemLoginService; - - @Autowired - private ISysOrderNoRuleService sysOrderNoRuleService; - - @Autowired private ISysUserService userService; @Autowired @@ -110,6 +99,9 @@ public class WhiteController extends CoreBaseController { @Resource(name= CommonConstWords.IMPP_REDIS_SESSION) private ImppRedis redisSession; + @Autowired + private RabbitTemplate rabbitTemplate; + @GetMapping(value = "/sys-locale-language/list") @ApiOperation(value = "查询可用语言",notes = "查询可用语言") @@ -407,21 +399,15 @@ public class WhiteController extends CoreBaseController { @GetMapping(value = "/sys-order-no-rule/get-order-no/{code}") @ApiOperation(value = "根据单号规则代码,生成单号") public ResultBean getOrderNo(@PathVariable("code") String code) { - Lock lock = redisCore.getFairLock(REDIS_PREFIX_LOCK_GET_ORDER_NO); try { ValidatorBean.checkNotNull(code, "code不能为空"); - // 获取锁 - lock.lock(); - SysOrderNoRule sysOrderNoRule = synchronizedService.nextOrderNo(code); return ResultBean.success("操作成功").setResultObject(sysOrderNoRule).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); } catch (ImppBusiException busExcep) { return ResultBean.fail(busExcep); } catch (Exception e) { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); - } finally { - lock.unlock(); } } @@ -435,22 +421,16 @@ public class WhiteController extends CoreBaseController { @GetMapping(value = "/sys-order-no-rule/get-order-no/{code}/{num}") @ApiOperation(value = "根据单号规则代码,生成单号") public ResultBean getOrderNo(@PathVariable("code") String code, @PathVariable("num") Integer num) { - Lock lock = redisCore.getFairLock(REDIS_PREFIX_LOCK_BATCH_GET_ORDER_NO); try { ValidatorBean.checkNotNull(code, "code不能为空"); ValidatorBean.checkNotZero(num, "次数不能为零"); - // 获取锁 - lock.tryLock(15, TimeUnit.SECONDS); - List orderNoList = synchronizedService.nextOrderNo(code, num).stream().map(SysOrderNoRule::getOrderNo).collect(Collectors.toList()); return ResultBean.success("操作成功").setResultList(orderNoList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); } catch (ImppBusiException busExcep) { return ResultBean.fail(busExcep); } catch (Exception e) { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); - } finally { - lock.unlock(); } } @@ -652,4 +632,9 @@ public class WhiteController extends CoreBaseController { } } + @GetMapping(value = "/send-test-mq") + @ApiOperation(value = "测试发送mq", notes = "测试发送mq") + public void sendTestMq(String paramStr) { + rabbitTemplate.convertAndSend(PlatformConstWords.QUEUE_IMPP_DEMO, paramStr); + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SynchronizedService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SynchronizedService.java index 4edf7d5..7ee498a 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SynchronizedService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SynchronizedService.java @@ -2,12 +2,22 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.base; import cn.estsh.i3plus.core.api.iservice.base.ISynchronizedService; import cn.estsh.i3plus.core.api.iservice.busi.ISysOrderNoRuleService; +import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; +import cn.estsh.i3plus.platform.common.util.CommonConstWords; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.platform.bean.SysOrderNoRule; +import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; +import cn.estsh.impp.framework.boot.util.ImppRedis; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.math.NumberUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.List; +import static cn.estsh.i3plus.platform.common.util.CommonConstWords.REDIS_PREFIX_LOCK_GET_ORDER_NO; + /** * @Description : * @Reference : @@ -21,9 +31,21 @@ public class SynchronizedService implements ISynchronizedService { @Autowired private ISysOrderNoRuleService sysOrderNoRuleService; + @Resource(name = CommonConstWords.IMPP_REDIS_RES) + private ImppRedis redisRes; + @Override public synchronized SysOrderNoRule nextOrderNo(String code) { - return sysOrderNoRuleService.doGetSysOrderNoRuleCode(code); + List list = nextOrderNo(code, NumberUtils.INTEGER_ONE); + if (CollectionUtils.isEmpty(list)) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode()) + .setErrorDetail("[" + code + "] 生成失败") + .setErrorSolution("请重新输入规则代码") + .build(); + } + return list.stream().findFirst().get(); } /** @@ -35,6 +57,34 @@ public class SynchronizedService implements ISynchronizedService { */ @Override public synchronized List nextOrderNo(String code, int num) { - return sysOrderNoRuleService.doGetSysOrderNoRuleByCodeAndNum(code,num); + String redisKey = REDIS_PREFIX_LOCK_GET_ORDER_NO + ":" + code; + //先拿规则 + SysOrderNoRule codeRole = sysOrderNoRuleService.getSysOrderNoRuleByCode(code); + if (codeRole == null) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode()) + .setErrorDetail("[" + code + "]规则代码不存在存在") + .setErrorSolution("请重新输入规则代码") + .build(); + } else if (codeRole.getOrderNoRuleStatus() == CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("[" + code + "]单号规则已禁用") + .setErrorSolution("请重新输入规则代码") + .build(); + } + + sysOrderNoRuleService.detachSysOrderNoRule(codeRole); + + Long incr = codeRole.getSerialNoIncrement() * num; + //缓存增加 + //先判断redis是否存在,如果不存在,则用默认初始值+步长*数量,如果存在,则添加步长 * 数量 + codeRole.setSerialNo(redisRes.putObjAdditational(redisKey, codeRole.getSerialNo(), incr)-incr); + + // 生成单号更缓存 + return sysOrderNoRuleService.doGetSysOrderNoRuleByNum(codeRole, num); } + } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreMemTreeService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreMemTreeService.java index d24cdff..096912b 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreMemTreeService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreMemTreeService.java @@ -6,6 +6,8 @@ import cn.estsh.i3plus.pojo.base.enumutil.ModelEnumUtil; import cn.estsh.i3plus.pojo.model.platform.CommonTreeModel; import cn.estsh.i3plus.pojo.platform.bean.*; import org.apache.commons.collections.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -24,6 +26,8 @@ import java.util.stream.Collectors; @Service public class CoreMemTreeService implements ICoreMemTreeService { + public static final Logger LOGGER = LoggerFactory.getLogger(CoreMemTreeService.class); + @Autowired private IPersonnelService personnelService; @@ -623,16 +627,31 @@ public class CoreMemTreeService implements ICoreMemTreeService { return packTreeSysMenuByUserIdAndParentId(userId, CommonEnumUtil.PARENT.DEFAULT.getValue()); } + /** + * 根据用户ID 和 节点ID 查询功能树 + * @param userId + * @param parentId + * @return + */ @Override public List packTreeSysMenuByUserIdAndParentId(Long userId, Long parentId) { + // 查询用户关联角色 + long startTime = System.currentTimeMillis(); List roleList = personnelService.findSysRefUserRole(userId); + long roleTime = System.currentTimeMillis(); + LOGGER.info("查询用户所关联的角色信息耗时:{}",roleTime - startTime); if (roleList != null && roleList.size() > 0) { + // 查询角色关联菜单 List refRoleMenuList = personnelService.findSysRefRoleMenuByRefUserRole(roleList); + long refRoleMenuTime = System.currentTimeMillis(); + LOGGER.info("查询角色关联菜单:{}",refRoleMenuTime - roleTime); if (refRoleMenuList != null && refRoleMenuList.size() > 0) { List menuList = menuService.findAll(); + // 构建菜单树 List menuRootTree = packTreeSysMenu(menuList, parentId); + // return packTreeSysMenuBySysRefRoleMenu(menuRootTree, refRoleMenuList); } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRuleService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRuleService.java index 40c4cc4..98d8195 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRuleService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRuleService.java @@ -15,7 +15,6 @@ import cn.estsh.i3plus.pojo.platform.bean.SysOrderNoRule; import cn.estsh.i3plus.pojo.platform.repository.SysOrderNoRuleRepository; import cn.estsh.i3plus.pojo.platform.sqlpack.CoreHqlPack; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; -import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -78,6 +77,17 @@ public class SysOrderNoRuleService implements ISysOrderNoRuleService { return sysOrderNoRuleRDao.getById(id); } + /** + * 根据code 查询单号 + * + * @param code 单号code + * @return 单号信息 + */ + @Override + public SysOrderNoRule getSysOrderNoRuleByCode(String code) { + return sysOrderNoRuleRDao.getByProperty("orderNoRuleCode",code); + } + @Override public ListPager querySysOrderNoRuleByPager(SysOrderNoRule sysOrderNoRule, Pager pager) { if (sysOrderNoRule == null) { @@ -90,77 +100,32 @@ public class SysOrderNoRuleService implements ISysOrderNoRuleService { } } - @Override - @ApiOperation(value = "根据code查询最新单号规则") - public synchronized SysOrderNoRule doGetSysOrderNoRuleCode(String code) { - SysOrderNoRule sysOrderNoRule = sysOrderNoRuleRDao.getByProperty("orderNoRuleCode", code); - - if (sysOrderNoRule == null) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode()) - .setErrorDetail("[" + code + "]规则代码不存在存在") - .setErrorSolution("请重新输入规则代码") - .build(); - } else if (sysOrderNoRule.getOrderNoRuleStatus() == CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) - .setErrorDetail("[" + code + "]单号规则已禁用") - .setErrorSolution("请重新输入规则代码") - .build(); - } else { - sysOrderNoRule = OrderNoMakeUtil.next(sysOrderNoRule); - sysOrderNoRuleRDao.update(sysOrderNoRule); - return sysOrderNoRule; - } - } - /** * 根据单号代码获取单号信息 * - * @param code 单号代码 + * @param sysOrderNoRule 单号代码 * @param num * @return 单号信息 */ @Override - public synchronized List doGetSysOrderNoRuleByCodeAndNum(String code, int num) { - SysOrderNoRule sysOrderNoRule = sysOrderNoRuleRDao.getByProperty("orderNoRuleCode", code); - sysOrderNoRuleRDao.detachObject(sysOrderNoRule); + public synchronized List doGetSysOrderNoRuleByNum(SysOrderNoRule sysOrderNoRule, int num) { List resultList = new ArrayList<>(); - - if (sysOrderNoRule == null) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode()) - .setErrorDetail("[" + code + "]规则代码不存在存在") - .setErrorSolution("请重新输入规则代码") - .build(); - } else if (sysOrderNoRule.getOrderNoRuleStatus() == CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) { + try { + for (int i = 0; i < num; i++) { + sysOrderNoRule = OrderNoMakeUtil.next(CloneTool.clone(sysOrderNoRule)); + resultList.add(sysOrderNoRule); + } + }catch (Exception e){ + LOGGER.error("单号生成异常:",e); throw ImppExceptionBuilder.newInstance() .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) - .setErrorDetail("[" + code + "]单号规则已禁用") - .setErrorSolution("请重新输入规则代码") + .setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION.getCode()) + .setErrorDetail("单号生成异常 %s",e.getMessage()) .build(); - } else { - try { - for (int i = 0; i < num; i++) { - sysOrderNoRule = OrderNoMakeUtil.next((SysOrderNoRule) CloneTool.clone(sysOrderNoRule)); - resultList.add(sysOrderNoRule); - } - }catch (Exception e){ - LOGGER.error("单号生成异常:",e); - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION.getCode()) - .setErrorDetail("单号生成异常 %s",e.getMessage()) - .build(); - } - - sysOrderNoRuleRDao.update(sysOrderNoRule); - return resultList; } + + sysOrderNoRuleRDao.update(sysOrderNoRule); + return resultList; } @Override @@ -185,5 +150,13 @@ public class SysOrderNoRuleService implements ISysOrderNoRuleService { sysOrderNoRuleRDao.saveAll(sysOrderNoRuleList); } + /** + * @param sysOrderNoRule + */ + @Override + public void detachSysOrderNoRule(SysOrderNoRule sysOrderNoRule) { + sysOrderNoRuleRDao.detachObject(sysOrderNoRule); + } + } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestTransService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestTransService.java index 488e71a..e42e027 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestTransService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestTransService.java @@ -167,7 +167,6 @@ public class TestTransService implements ITestTransService { @Override public void insertRedis() { - sysDepartmentRDao.insert(new SysDepartment()); for (int i = 0; i < 1000; i++) { imppRedis.putObject(i + "", i); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/CloneTool.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/CloneTool.java index cf6b035..825ce87 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/CloneTool.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/CloneTool.java @@ -164,8 +164,8 @@ public class CloneTool { * @throws IllegalAccessException * @throws InstantiationException */ - public static Object clone(Object value) throws IllegalAccessException, InstantiationException { - return clone(value,1); + public static T clone(T value) throws IllegalAccessException, InstantiationException { + return (T) clone(value,1); } /** @@ -175,8 +175,8 @@ public class CloneTool { * @throws IllegalAccessException * @throws InstantiationException */ - public static Object deepClone(Object value) throws IllegalAccessException, InstantiationException { - return clone(value,-1); + public static T deepClone(T value) throws IllegalAccessException, InstantiationException { + return (T) clone(value,-1); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/NoSqlPack.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/NoSqlPack.java index cfe7e62..7e1d800 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/NoSqlPack.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/NoSqlPack.java @@ -103,6 +103,7 @@ public class NoSqlPack { result.andStringEquals("remoteIp",bean.getRemoteIp()); // result.andStringEquals("requestUrl",bean.getRequestUrl()); result.andTextLike("requestUrl",bean.getRequestUrl()); + result.andStringLike("userLoginName",bean.getUserLoginName()); result.andStringEquals("createUser",bean.getCreateUser()); result.andStringLike("operateMessage",bean.getOperateMessage()); result.andStringDateTimeBetween("createDatetime",bean.getCreateDateTimeStart(),bean.getCreateDateTimeEnd()); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/OrderNoMakeUtil.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/OrderNoMakeUtil.java index 7b0dcda..b865b6b 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/OrderNoMakeUtil.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/OrderNoMakeUtil.java @@ -1,16 +1,14 @@ package cn.estsh.i3plus.core.apiservice.util; +import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; import cn.estsh.i3plus.platform.common.util.PlatformConstWords; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.platform.bean.SysOrderNoRule; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; -import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; -import com.alibaba.fastjson.JSON; import org.apache.commons.lang3.StringUtils; + import java.text.MessageFormat; import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Locale; /** * @Description : 单号生成工具类 @@ -59,7 +57,7 @@ public class OrderNoMakeUtil { orderNoRule.setSerialNo(orderNoRule.getSerialNo() + orderNoRule.getSerialNoIncrement()); } } else { - orderNoRule.setSerialNo(orderNoRule.getSerialNoSeed()); + orderNoRule.setSerialNo(orderNoRule.getSerialNoSeed() * orderNoRule.getSerialNoIncrement()); } replace(orderNo, PlatformConstWords.SERIAL_NO, String.format(serialNoFormatStr, orderNoRule.getSerialNo())); From 7c88ff29d37a48bdf1bdbc9fe433da22cd699c04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=AA=E4=BA=91=E6=98=8A?= Date: Mon, 24 Aug 2020 20:52:45 +0800 Subject: [PATCH 5/6] =?UTF-8?q?feat:=E5=8D=95=E5=8F=B7=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/busi/SysOrderNoRuleController.java | 16 ---------------- .../controller/busi/SysToolTypeController.java | 8 +------- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java index bfbdb76..605752b 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java @@ -38,12 +38,8 @@ import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.Lock; import java.util.stream.Collectors; -import static cn.estsh.i3plus.platform.common.util.CommonConstWords.REDIS_PREFIX_LOCK_GET_ORDER_NO; - /** * @Description :系统单号规则管理服务 * @Reference : @@ -393,21 +389,15 @@ public class SysOrderNoRuleController extends CoreBaseController { @GetMapping(value = "/get-order-no/{code}") @ApiOperation(value = "根据单号规则代码,生成单号") public ResultBean getOrderNo(@PathVariable("code") String code) { - Lock lock = redisCore.getLock(REDIS_PREFIX_LOCK_GET_ORDER_NO); try { ValidatorBean.checkNotNull(code, "code不能为空"); - // 获取锁 - lock.tryLock(10, TimeUnit.SECONDS); - SysOrderNoRule sysOrderNoRule = synchronizedService.nextOrderNo(code); return ResultBean.success("操作成功").setResultObject(sysOrderNoRule).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); } catch (ImppBusiException busExcep) { return ResultBean.fail(busExcep); } catch (Exception e) { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); - } finally { - lock.unlock(); } } @@ -420,22 +410,16 @@ public class SysOrderNoRuleController extends CoreBaseController { @GetMapping(value = "/get-order-no/{code}/{num}") @ApiOperation(value = "根据单号规则代码,生成单号") public ResultBean getOrderNo(@PathVariable("code") String code,@PathVariable("num") Integer num) { - Lock lock = redisCore.getLock(REDIS_PREFIX_LOCK_GET_ORDER_NO); try { ValidatorBean.checkNotNull(code, "code不能为空"); ValidatorBean.checkNotZero(num,"次数不能为零"); - // 获取锁 - lock.tryLock(10, TimeUnit.SECONDS); - List orderNoList = synchronizedService.nextOrderNo(code,num).stream().map(SysOrderNoRule::getOrderNo).collect(Collectors.toList()); return ResultBean.success("操作成功").setResultList(orderNoList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); } catch (ImppBusiException busExcep) { return ResultBean.fail(busExcep); } catch (Exception e) { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); - } finally { - lock.unlock(); } } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysToolTypeController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysToolTypeController.java index 1c2f012..e306978 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysToolTypeController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysToolTypeController.java @@ -1,7 +1,7 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; import cn.estsh.i3plus.core.api.iservice.busi.ISysToolTypeService; -import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; import cn.estsh.i3plus.platform.common.tool.StringTool; import cn.estsh.i3plus.platform.common.util.PlatformConstWords; import cn.estsh.i3plus.pojo.base.bean.ListPager; @@ -14,7 +14,6 @@ import cn.estsh.impp.framework.base.controller.CoreBaseController; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; -import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; import cn.estsh.impp.framework.boot.util.ResultBean; import cn.estsh.impp.framework.boot.util.ValidatorBean; import io.swagger.annotations.Api; @@ -55,8 +54,6 @@ public class SysToolTypeController extends CoreBaseController{ ValidatorBean.beginValid(toolType).notNull("name",toolType.getName()); toolType.setOrganizeCode(AuthUtil.getOrganize().getOrganizeCode()); - // 添加初始化 - ConvertBean.modelInitialize(toolType, AuthUtil.getSessionUser()); toolTypeService.insertSysToolType(toolType); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); @@ -82,9 +79,6 @@ public class SysToolTypeController extends CoreBaseController{ // 条件校验 ValidatorBean.beginValid(toolType).notNull("name",toolType.getName()); - // 添加初始化 - ConvertBean.modelUpdate(toolType,user); - toolTypeService.updateSysToolType(toolType); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ From 85f11d7d0a37452f0b0db5a08dfa40dcd95c193a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=AA=E4=BA=91=E6=98=8A?= Date: Mon, 24 Aug 2020 21:48:23 +0800 Subject: [PATCH 6/6] =?UTF-8?q?fix:=E5=88=86=E9=9A=94=E7=AC=A6=E8=AE=A1?= =?UTF-8?q?=E6=95=B0=E6=AF=94=E8=BE=83=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/apiservice/util/BarcodeParseUtil.java | 34 ++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/BarcodeParseUtil.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/BarcodeParseUtil.java index 5f58d8c..b8ff211 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/BarcodeParseUtil.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/BarcodeParseUtil.java @@ -5,6 +5,8 @@ import cn.estsh.i3plus.platform.common.tool.JsonUtilTool; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.platform.bean.SysBarcodeRule; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; +import cn.estsh.impp.framework.boot.util.ImppRedis; +import cn.estsh.impp.framework.boot.util.SpringContextsUtil; import java.util.HashMap; import java.util.Map; @@ -21,6 +23,22 @@ public final class BarcodeParseUtil { private BarcodeParseUtil() { } + private static ImppRedis redisRes; + + /** + * 按指定规则解析条码 + * + * @param barcodeRuleCode 条码规则信息 + * @param barcode 条码 + * @return 条码数据 + */ + public static Map parse(String barcodeRuleCode, String barcode) { + if (redisRes == null) { + redisRes = SpringContextsUtil.getRedisRes(); + } + return parse((SysBarcodeRule) redisRes.getObject(barcodeRuleCode), barcode); + } + /** * 按指定规则解析条码 * @@ -40,23 +58,32 @@ public final class BarcodeParseUtil { .build(); } + Long start=System.currentTimeMillis(); //特殊分隔符处理 barcodeRule.setBarcodeSeparator(barcodeRule.getBarcodeSeparator().replaceAll("\\\\", "\\\\\\\\")); barcodeRule.setBarcodeSeparator(barcodeRule.getBarcodeSeparator().replaceAll("\\|", "\\\\|")); barcodeRule.setBarcodeSeparator(barcodeRule.getBarcodeSeparator().replaceAll("\\.", "\\\\.")); + Long tsfgf=System.currentTimeMillis(); + System.out.println("特殊分隔符处理" + (tsfgf - start)); // 分隔条码信息 String[] barcodeKey = barcodeRule.getBarcodeRule().split(barcodeRule.getBarcodeSeparator()); String[] barcodeValue = barcode.split(barcodeRule.getBarcodeSeparator()); + Long fgtm =System.currentTimeMillis(); + System.out.println("分隔条码信息" + (fgtm - tsfgf)); // 校验 verifyBarcode(barcodeRule,barcodeKey,barcodeValue,barcode); + Long jy =System.currentTimeMillis(); + System.out.println("校验" + (jy - fgtm)); // 匹配条码数据 HashMap barcodeMap = new HashMap<>(); for (int i = 0; i < barcodeKey.length; i++) { barcodeMap.put(barcodeKey[i], barcodeValue.length > i ? barcodeValue[i] : null); } + Long pp =System.currentTimeMillis(); + System.out.println("匹配条码数据" + (pp - jy)); return barcodeMap; } @@ -71,8 +98,11 @@ public final class BarcodeParseUtil { boolean verifyFail = false; if (barcodeRule.getCheckModeVal() == CommonEnumUtil.BARCODE_CHECK_MODE.SEPARATOR_NUM.getValue()) { // 校验分隔符的数量 - int separatorNum = barcode.length() - barcode.replaceAll(barcodeRule.getBarcodeSeparator(), "").length() + 1; - verifyFail = barcodeKey.length != separatorNum; + int barcodeSeparatorNum = barcode.length() - barcode.replaceAll(barcodeRule.getBarcodeSeparator(), "").length() + 1; + int ruleSeparatorNum =barcodeRule.getBarcodeRule().length() + - barcodeRule.getBarcodeRule().replaceAll(barcodeRule.getBarcodeSeparator(), "").length() + 1; + + verifyFail = ruleSeparatorNum != barcodeSeparatorNum; } else if (barcodeRule.getCheckModeVal() == CommonEnumUtil.BARCODE_CHECK_MODE.ANALYTIC_NUM.getValue()) { // 校验解析后的数量是否相等 verifyFail = barcodeKey.length != barcodeValue.length;