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/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 a177138..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,11 +66,11 @@ public interface ISysOrderNoRuleService { /** * 根据单号代码获取单号信息 - * @param code 单号代码 + * @param orderNoRule 单号代码 * @return 单号信息 */ - @ApiOperation(value = "根据code查询最新单号规则") - SysOrderNoRule doGetSysOrderNoRuleCode(String code); + @ApiOperation(value = "根据单号代码获取单号信息") + List doGetSysOrderNoRuleByNum(SysOrderNoRule orderNoRule,int num); /** * 根据id修改单号规则状态 @@ -92,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 7674183..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,12 +31,14 @@ 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.stream.Collectors; /** * @Description : @@ -60,9 +61,6 @@ public class WhiteController extends CoreBaseController { private ISysLocaleResourceService sysLocaleResourceService; @Autowired - private ISystemLoginService systemLoginService; - - @Autowired private ISysUserService userService; @Autowired @@ -92,7 +90,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 @@ -101,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 = "查询可用语言") @@ -410,6 +411,29 @@ public class WhiteController extends CoreBaseController { } } + /** + * 根据单号规则代码,生成单号 + * + * @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) { + try { + ValidatorBean.checkNotNull(code, "code不能为空"); + ValidatorBean.checkNotZero(num, "次数不能为零"); + + 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); + } + } + @PostMapping(value = "/sys-find-user/list") @ApiOperation(value = "查询用户列表信息",notes = "查询用户列表信息") public ResultBean findSysUserInfoList(UserDetailModel model){ @@ -435,6 +459,7 @@ public class WhiteController extends CoreBaseController { /** * 获取登录平台信息 + * * @return */ private CommonEnumUtil.LOG_LOGIN_PLATFORM getLoginPlatform(){ @@ -514,6 +539,7 @@ public class WhiteController extends CoreBaseController { /** * 根据条件分页查询用户信息 + * * @param model 查询条件 * @return 处理结果 */ @@ -554,6 +580,7 @@ public class WhiteController extends CoreBaseController { /** * 缺失资源开关 + * * @return */ @AnnoIgnoreLog @@ -605,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/controller/busi/SysOrderNoRuleController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java index 4c145c5..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 @@ -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,7 @@ import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * @Description :系统单号规则管理服务 @@ -413,10 +414,7 @@ public class SysOrderNoRuleController extends CoreBaseController { ValidatorBean.checkNotNull(code, "code不能为空"); ValidatorBean.checkNotZero(num,"次数不能为零"); - List orderNoList = new ArrayList<>(); - for (int i = 0; i < num; i++) { - orderNoList.add(synchronizedService.nextOrderNo(code).getOrderNo()); - } + 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); 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){ 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(); 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..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,10 +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 : @@ -19,8 +31,60 @@ 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(); + } + + /** + * 根据单号代码获取单号信息 + * + * @param code 单号代码 + * @param num + * @return 单号信息 + */ + @Override + public synchronized List nextOrderNo(String code, int 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 4d5e82e..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 @@ -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,12 @@ 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; /** @@ -76,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) { @@ -88,30 +100,32 @@ public class SysOrderNoRuleService implements ISysOrderNoRuleService { } } + /** + * 根据单号代码获取单号信息 + * + * @param sysOrderNoRule 单号代码 + * @param num + * @return 单号信息 + */ @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()) { + public synchronized List doGetSysOrderNoRuleByNum(SysOrderNoRule sysOrderNoRule, int num) { + List resultList = new ArrayList<>(); + 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 { - sysOrderNoRule = OrderNoMakeUtil.next(sysOrderNoRule); - sysOrderNoRuleRDao.update(sysOrderNoRule); - return sysOrderNoRule; } + + sysOrderNoRuleRDao.update(sysOrderNoRule); + return resultList; } @Override @@ -136,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/BarcodeParseUtil.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/BarcodeParseUtil.java index 7220b2f..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 @@ -1,9 +1,12 @@ 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; +import cn.estsh.impp.framework.boot.util.ImppRedis; +import cn.estsh.impp.framework.boot.util.SpringContextsUtil; import java.util.HashMap; import java.util.Map; @@ -17,7 +20,24 @@ import java.util.Map; **/ public final class BarcodeParseUtil { - private 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); + } /** * 按指定规则解析条码 @@ -38,26 +58,92 @@ 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)); - // 避免出现长度不相等 - int size = barcodeKey.length; - if (barcodeKey.length != barcodeValue.length) { - size = Math.min(barcodeKey.length,barcodeValue.length); - } + // 校验 + verifyBarcode(barcodeRule,barcodeKey,barcodeValue,barcode); + Long jy =System.currentTimeMillis(); + System.out.println("校验" + (jy - fgtm)); // 匹配条码数据 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); } + Long pp =System.currentTimeMillis(); + System.out.println("匹配条码数据" + (pp - jy)); 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 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; + } + + 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|")); + } } 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..825ce87 --- /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 T clone(T value) throws IllegalAccessException, InstantiationException { + return (T) clone(value,1); + } + + /** + * 深度复制对象 + * @param value 原始对象 + * @return 复制后的对象 + * @throws IllegalAccessException + * @throws InstantiationException + */ + public static T deepClone(T value) throws IllegalAccessException, InstantiationException { + return (T) 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; +// } + +} 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()));