From 9d3682a3f97c7b2181b3ab4309e34650b1f113f9 Mon Sep 17 00:00:00 2001 From: liuzhaotian Date: Fri, 28 Jun 2024 10:34:16 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E6=8E=92=E5=8D=95=E7=AE=A1=E7=90=86-?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8E=92=E5=8D=95Bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/plan/vo/PlanSaveReqVO.java | 3 +++ .../executor/controller/admin/plan/vo/PlatePage.java | 2 +- .../src/main/resources/mapper/plate/PlateMapper.xml | 3 ++- .../dal/mysql/remainplaten/RemainPlateMapper.java | 11 ++++++----- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanSaveReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanSaveReqVO.java index 5221c9a49..29a61fb0e 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanSaveReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlanSaveReqVO.java @@ -52,6 +52,9 @@ public class PlanSaveReqVO { @Schema(description = "生产单id与商品id 列表",requiredMode = Schema.RequiredMode.REQUIRED) private List itemList; + @Schema(description = "商品数量") + private Long goodsNum; + @Schema(description = "备注") private String remark; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlatePage.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlatePage.java index 7dc39e75b..3e5084c9f 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlatePage.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/PlatePage.java @@ -15,7 +15,7 @@ public class PlatePage { @Schema(description = "生产单id") private Long orderId; @Schema(description = "商品id") - private String goodsId; + private Long goodsId; @Schema(description = "板名称") private String name; @Schema(description = "商品名称") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml index 05955764b..953db9838 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml @@ -336,6 +336,7 @@ select distinct b.id as orderId, + c.id as goodsId, c.width, c.height, c.thickness, @@ -359,7 +360,7 @@ #{orderIds} - group by b.id ,c.goods_name,c.width,c.height,c.thickness, c.material, c.color; + group by c.id,b.id ,c.goods_name,c.width,c.height,c.thickness, c.material, c.color; diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/remainplaten/RemainPlateMapper.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/remainplaten/RemainPlateMapper.java index 3cdc618b0..0faad6d24 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/remainplaten/RemainPlateMapper.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/remainplaten/RemainPlateMapper.java @@ -20,20 +20,21 @@ public interface RemainPlateMapper extends BaseMapperX { default PageResult selectPage(RemainPlatePageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(RemainPlateDO::getPlanId, reqVO.getPlanId()) + .likeIfPresent(RemainPlateDO::getId,reqVO.getId() != null ? reqVO.getId().toString() : null) + .eqIfPresent(RemainPlateDO::getPlanId, reqVO.getPlanId() != null ? reqVO.getPlanId().toString() : null) .eqIfPresent(RemainPlateDO::getInitPlanId, reqVO.getInitPlanId()) .eqIfPresent(RemainPlateDO::getStatus, reqVO.getStatus()) .eqIfPresent(RemainPlateDO::getGoodsId, reqVO.getGoodsId()) .eqIfPresent(RemainPlateDO::getIsCutting, reqVO.getIsCutting()) .likeIfPresent(RemainPlateDO::getName, reqVO.getName()) - .eqIfPresent(RemainPlateDO::getMaterial, reqVO.getMaterial()) - .eqIfPresent(RemainPlateDO::getColor, reqVO.getColor()) + .likeIfPresent(RemainPlateDO::getMaterial, reqVO.getMaterial()) + .likeIfPresent(RemainPlateDO::getColor, reqVO.getColor()) .eqIfPresent(RemainPlateDO::getThickness, reqVO.getThickness()) .eqIfPresent(RemainPlateDO::getBrand, reqVO.getBrand()) .eqIfPresent(RemainPlateDO::getPlaceStyle, reqVO.getPlaceStyle()) - .eqIfPresent(RemainPlateDO::getStore, reqVO.getStore()) + .likeIfPresent(RemainPlateDO::getStore, reqVO.getStore()) .eqIfPresent(RemainPlateDO::getCount, reqVO.getCount()) - .eqIfPresent(RemainPlateDO::getRemark, reqVO.getRemark()) + .likeIfPresent(RemainPlateDO::getRemark, reqVO.getRemark()) .eqIfPresent(RemainPlateDO::getUseType, reqVO.getUseType()) .eqIfPresent(RemainPlateDO::getOrganId, reqVO.getOrganId()) .eqIfPresent(RemainPlateDO::getOutLineJson, reqVO.getOutLineJson()) From 6aff54a3a54f5eab024e897893c5e13ff9c0ba44 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Fri, 28 Jun 2024 14:34:53 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E6=9D=83=E9=99=90=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=201=E3=80=81=E7=B3=BB=E7=BB=9F/?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E7=AE=A1=E7=90=86=E4=B8=AD=E7=9A=84=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E8=AE=BE=E8=AE=A1=E6=9D=83=E9=99=90=E4=B8=B2=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=9B=202=E3=80=81=E8=A7=92=E8=89=B2=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E6=8E=88=E6=9D=83=E6=B8=85=E7=A9=BAMENU=5FROLE=5FID?= =?UTF-8?q?=5FLIST:*:=E8=8F=9C=E5=8D=95id=EF=BC=8C=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E5=88=86=E9=85=8D=E7=94=A8=E6=88=B7=E6=B8=85=E7=A9=BAUSER=5FRO?= =?UTF-8?q?LE=5FID=5FLIST:*:=E7=94=A8=E6=88=B7id=E7=BC=93=E5=AD=98?= =?UTF-8?q?=EF=BC=8C=E8=A7=A3=E5=86=B3=E5=86=85=E7=BD=AE=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9D=83=E9=99=90=E5=86=85=E5=AE=B9=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E7=AB=8B=E5=8D=B3=E7=94=9F=E6=95=88=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/label/LabelController.java | 8 ++-- .../LabelTemplateController.java | 2 +- .../permission/PermissionServiceImpl.java | 44 ++++++++++++++----- 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/label/LabelController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/label/LabelController.java index 297209cb6..5a0dcb680 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/label/LabelController.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/label/LabelController.java @@ -37,7 +37,7 @@ public class LabelController { @PostMapping("/create") @Operation(summary = "创建标签") - //@PreAuthorize("@ss.hasPermission('system:label:create')") + @PreAuthorize("@ss.hasPermission('sysTagDesignManager:create')") @OperateLog(enable = false) public CommonResult createLabel(@Valid @RequestBody LabelSaveReqVO createReqVO) { return success(labelService.createLabel(createReqVO)); @@ -45,7 +45,7 @@ public class LabelController { @PutMapping("/update") @Operation(summary = "更新标签") - //@PreAuthorize("@ss.hasPermission('system:label:update')") + @PreAuthorize("@ss.hasPermission('sysTagDesignManager:update')") @OperateLog(enable = false) public CommonResult updateLabel(@Valid @RequestBody LabelSaveReqVO updateReqVO) { labelService.updateLabel(updateReqVO); @@ -55,7 +55,7 @@ public class LabelController { @DeleteMapping("/delete") @Operation(summary = "删除标签") @Parameter(name = "id", description = "编号", required = true) - //@PreAuthorize("@ss.hasPermission('system:label:delete')") + @PreAuthorize("@ss.hasPermission('sysTagDesignManager:delete')") public CommonResult deleteLabel(@RequestParam("id") Long id) { labelService.deleteLabel(id); return success(true); @@ -90,7 +90,7 @@ public class LabelController { @GetMapping("/group-list") @Operation(summary = "获得分组标签列表") - //@PreAuthorize("@ss.hasPermission('system:label:query')") + @PreAuthorize("@ss.hasAnyPermissions('system:label-template:query','sysTagDesignManager:query')") @OperateLog(enable = false) public CommonResult>> getGroupList(@RequestParam(value = "organId", required = false) Long organId) { return success(labelService.getGroupList(organId)); diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/labeltemplate/LabelTemplateController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/labeltemplate/LabelTemplateController.java index b70693f5a..1e95e771e 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/labeltemplate/LabelTemplateController.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/labeltemplate/LabelTemplateController.java @@ -87,7 +87,7 @@ public class LabelTemplateController { @GetMapping("/getDefault") @Operation(summary = "获得默认标签模板") @Parameter(name = "type", description = "标签类型", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('system:label-template:query')") + @PreAuthorize("@ss.hasAnyPermissions('system:label-template:query','sysTagDesignManager:query')") @OperateLog(enable = false) public CommonResult getDefaultLabelTemplate(@RequestParam("type") String type) { return success(labelTemplateService.getDefaultLabelTemplate(type)); diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/PermissionServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/PermissionServiceImpl.java index a4a7ce9e2..3fcfe7e05 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/PermissionServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/PermissionServiceImpl.java @@ -39,7 +39,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Caching; +import org.springframework.data.redis.core.Cursor; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ScanOptions; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -205,14 +207,15 @@ public class PermissionServiceImpl implements PermissionService { // 角色菜单权限发生修改,通知刷新本地缓存 if (CollectionUtil.isNotEmpty(createMenuIds) || CollectionUtil.isNotEmpty(deleteMenuIds)) { CompletableFuture.runAsync(() -> { - // 当前操作人和所操作的目标菜单机构不同时,清空MENU_ROLE_ID_LIST:目标机构id:菜单id的缓存 + // 当前操作人和所操作的目标菜单机构不同时,清空MENU_ROLE_ID_LIST:*:菜单id的缓存 if (ObjectUtil.notEqual(finalOrganId, currentOrganId)) { // 获取新增和删除菜单id的并集 Collection delMenuIds = CollUtil.union(createMenuIds, deleteMenuIds); - // 构建批量删除的key集合 - Set delKeys = delMenuIds.stream().map(menuId -> String.format(String.valueOf(new StringBuffer(RedisKeyConstants.MENU_ROLE_ID_LIST).append(":%s:%s")), finalOrganId, menuId)).collect(Collectors.toSet()); - Long batchDelNum = redisTemplate.delete(delKeys); - log.info("[assignRoleMenu] 批量删除redis[MENU_ROLE_ID_LIST]数量:{}", batchDelNum); + delMenuIds.forEach(delMenuId -> { + String patternKey = String.format(String.valueOf(new StringBuffer(RedisKeyConstants.MENU_ROLE_ID_LIST).append(":*:%s")), delMenuId); + Long batchDelNum = scanAndDelKeys(patternKey); + log.info("[assignRoleMenu] 批量删除redis[{}]数量:{}", patternKey, batchDelNum); + }); } redisTemplate.convertAndSend(RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, ""); }).exceptionally(e -> { @@ -222,6 +225,26 @@ public class PermissionServiceImpl implements PermissionService { } } + /** + * scan所有匹配的redis key并删除 + * + * @param keyPattern 模糊匹配的表达式 + */ + private Long scanAndDelKeys(String keyPattern) { + // 根据keyPattern scan匹配的redis key + List delKeys = new ArrayList<>(); + Cursor cursor = redisTemplate.scan(ScanOptions.scanOptions().match(keyPattern).count(200).build()); + while (cursor.hasNext()) { + delKeys.add(cursor.next()); + } + cursor.close(); + // 删除匹配到的key + if (CollectionUtil.isNotEmpty(delKeys)) { + redisTemplate.delete(delKeys); + } + return 0L; + } + @Override @Transactional(rollbackFor = Exception.class) @Caching(evict = { @@ -362,14 +385,15 @@ public class PermissionServiceImpl implements PermissionService { // 角色菜单权限发生修改,通知刷新本地缓存 if (CollectionUtil.isNotEmpty(createRoleUserIds) || CollectionUtil.isNotEmpty(deleteRoleUserIds)) { CompletableFuture.runAsync(() -> { - // 当前操作人和所操作的目标菜单机构不同时,清空USER_ROLE_ID_LIST:目标机构id:用户id的缓存 + // 当前操作人和所操作的目标菜单机构不同时,清空USER_ROLE_ID_LIST:*:用户id的缓存 if (ObjectUtil.notEqual(finalOrganId, currentOrganId)) { // 获取新增和删除用户id的并集 Collection delRoleUserIds = CollUtil.union(createRoleUserIds, deleteRoleUserIds); - // 构建批量删除的key集合 - Set delKeys = delRoleUserIds.stream().map(userId -> String.format(String.valueOf(new StringBuffer(RedisKeyConstants.USER_ROLE_ID_LIST).append(":%s:%s")), finalOrganId, userId)).collect(Collectors.toSet()); - Long batchDelNum = redisTemplate.delete(delKeys); - log.info("[batchAssignRoleUsers] 批量删除redis[USER_ROLE_ID_LIST]数量:{}", batchDelNum); + delRoleUserIds.forEach(delRoleUserId -> { + String patternKey = String.format(String.valueOf(new StringBuffer(RedisKeyConstants.USER_ROLE_ID_LIST).append(":*:%s")), delRoleUserId); + Long batchDelNum = scanAndDelKeys(patternKey); + log.info("[batchAssignRoleUsers] 批量删除redis[{}]数量:{}", patternKey, batchDelNum); + }); } redisTemplate.convertAndSend(RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, ""); }).exceptionally(e -> { From 4c3e61f12582f859bdc6f82140549900687b53d7 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Fri, 28 Jun 2024 16:55:37 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=9D=83=E9=99=90=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=201=E3=80=81=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E6=9D=83=E9=99=90=E6=97=A5=E5=BF=97=E6=8F=90=E7=A4=BA=E4=BC=98?= =?UTF-8?q?=E5=8C=96=EF=BC=9B=202=E3=80=81=E4=BF=AE=E5=A4=8D=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E5=A2=9E=E5=88=A0=E6=94=B9=E6=B8=85=E7=90=86=E7=BC=93?= =?UTF-8?q?=E5=AD=98=EF=BC=8C=E5=AE=9E=E6=97=B6=E7=94=9F=E6=95=88=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/permission/MenuServiceImpl.java | 93 ++++++++++++++++++- .../permission/PermissionServiceImpl.java | 8 +- 2 files changed, 94 insertions(+), 7 deletions(-) diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/MenuServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/MenuServiceImpl.java index 451cd61b3..83191914a 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/MenuServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/MenuServiceImpl.java @@ -1,6 +1,8 @@ package com.cf.imes.module.system.service.permission; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.organ.core.aop.OrganIgnore; import com.cf.imes.module.system.controller.admin.permission.vo.menu.MenuListReqVO; @@ -8,13 +10,18 @@ import com.cf.imes.module.system.controller.admin.permission.vo.menu.MenuSaveVO; import com.cf.imes.module.system.dal.dataobject.permission.MenuDO; import com.cf.imes.module.system.dal.mysql.permission.MenuMapper; import com.cf.imes.module.system.dal.redis.RedisKeyConstants; +import com.cf.imes.module.system.dal.redis.RedisRefreshChannelTopicConstants; import com.cf.imes.module.system.enums.permission.MenuTypeEnum; import com.cf.imes.module.system.service.organ.OrganService; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.context.annotation.Lazy; +import org.springframework.data.redis.core.Cursor; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ScanOptions; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,6 +29,7 @@ import javax.annotation.Resource; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.concurrent.CompletableFuture; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.framework.common.util.collection.CollectionUtils.convertList; @@ -44,6 +52,9 @@ public class MenuServiceImpl implements MenuService { @Lazy // 延迟,避免循环依赖报错 private OrganService organService; + @Autowired + private RedisTemplate redisTemplate; + @Override @CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, key = "#createReqVO.permission", condition = "#createReqVO.permission != null") @@ -57,8 +68,13 @@ public class MenuServiceImpl implements MenuService { MenuDO menu = BeanUtils.toBean(createReqVO, MenuDO.class); initMenuProperty(menu); menuMapper.insert(menu); + + Long menuId = menu.getId(); + // 清理缓存 + flushCacheWhenOperateMenu(menuId, createReqVO.getPermission(), null); + // 返回 - return menu.getId(); + return menuId; } @Override @@ -66,7 +82,8 @@ public class MenuServiceImpl implements MenuService { allEntries = true) // allEntries 清空所有缓存,因为 permission 如果变更,涉及到新老两个 permission。直接清理,简单有效 public void updateMenu(MenuSaveVO updateReqVO) { // 校验更新的菜单是否存在 - if (menuMapper.selectById(updateReqVO.getId()) == null) { + MenuDO menuDO = menuMapper.selectById(updateReqVO.getId()); + if (menuDO == null) { throw exception(MENU_NOT_EXISTS); } // 校验父菜单存在 @@ -78,6 +95,13 @@ public class MenuServiceImpl implements MenuService { MenuDO updateObj = BeanUtils.toBean(updateReqVO, MenuDO.class); initMenuProperty(updateObj); menuMapper.updateById(updateObj); + + // 权限串发生改变清空缓存 + String oldPermission = menuDO.getPermission(); + String newPermission = updateReqVO.getPermission(); + if (ObjectUtil.notEqual(oldPermission, newPermission)) { + flushCacheWhenOperateMenu(menuDO.getId(), newPermission, oldPermission); + } } @Override @@ -90,13 +114,76 @@ public class MenuServiceImpl implements MenuService { throw exception(MENU_EXISTS_CHILDREN); } // 校验删除的菜单是否存在 - if (menuMapper.selectById(id) == null) { + MenuDO menuDO = menuMapper.selectById(id); + if (menuDO == null) { throw exception(MENU_NOT_EXISTS); } // 标记删除 menuMapper.deleteById(id); // 删除授予给角色的权限 permissionService.processMenuDeleted(id); + + // 清理缓存 + flushCacheWhenOperateMenu(id, null, menuDO.getPermission()); + } + + /** + * 菜单增删改时清理缓存 + * + * @param menuId 菜单id + * @param newPermission 新权限串 + * @param oldPermission 旧权限串 + */ + private void flushCacheWhenOperateMenu(Long menuId, String newPermission, String oldPermission) { + CompletableFuture.runAsync(() -> { + if (ObjectUtil.isNotNull(oldPermission)) { + // 移除 USER_ROLE_ID_LIST:*:旧的permission + String oldMenuPerPattern = String.format(String.valueOf(new StringBuffer(RedisKeyConstants.PERMISSION_MENU_ID_LIST).append(":*:%s")), oldPermission); + Long oldBatchDelPerNum = scanAndDelKeys(oldMenuPerPattern); + log.info("[updateMenu] 批量删除redis[{}]数量:{}", oldMenuPerPattern, oldBatchDelPerNum); + } + + if (ObjectUtil.isNotNull(newPermission)) { + // 移除 USER_ROLE_ID_LIST:*:新的permission + String newMenuPerPattern = String.format(String.valueOf(new StringBuffer(RedisKeyConstants.PERMISSION_MENU_ID_LIST).append(":*:%s")), newPermission); + Long newBatchDelPerNum = scanAndDelKeys(newMenuPerPattern); + log.info("[updateMenu] 批量删除redis[{}]数量:{}", newMenuPerPattern, newBatchDelPerNum); + } + + if (ObjectUtil.isNotNull(menuId)) { + // 移除 MENU_ROLE_ID_LIST:*:menuId + String menuRolePattern = String.format(String.valueOf(new StringBuffer(RedisKeyConstants.MENU_ROLE_ID_LIST).append(":*:%s")), menuId); + Long batchDelRoleNum = scanAndDelKeys(menuRolePattern); + log.info("[deleteMenu] 批量删除redis[{}]数量:{}", menuRolePattern, batchDelRoleNum); + } + + // 清空本地缓存 + redisTemplate.convertAndSend(RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, ""); + }).exceptionally(e -> { + log.error("[deleteMenu] redis 清空PERMISSION_MENU_ID_LIST或message发送失败, topic:{}, 异常:{}", RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, e); + return null; + }); + } + + + /** + * scan所有匹配的redis key并删除 + * + * @param keyPattern 模糊匹配的表达式 + */ + private Long scanAndDelKeys(String keyPattern) { + // 根据keyPattern scan匹配的redis key + List delKeys = new ArrayList<>(); + Cursor cursor = redisTemplate.scan(ScanOptions.scanOptions().match(keyPattern).count(200).build()); + while (cursor.hasNext()) { + delKeys.add(cursor.next()); + } + cursor.close(); + // 删除匹配到的key + if (CollectionUtil.isNotEmpty(delKeys)) { + return redisTemplate.delete(delKeys); + } + return 0L; } @Override diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/PermissionServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/PermissionServiceImpl.java index 3fcfe7e05..804c3d7fe 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/PermissionServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/PermissionServiceImpl.java @@ -219,7 +219,7 @@ public class PermissionServiceImpl implements PermissionService { } redisTemplate.convertAndSend(RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, ""); }).exceptionally(e -> { - log.error("[assignRoleMenu] redis message发送失败, topic:{}, 异常:{}", RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, e); + log.error("[assignRoleMenu] redis 清空MENU_ROLE_ID_LIST或message发送失败, topic:{}, 异常:{}", RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, e); return null; }); } @@ -240,7 +240,7 @@ public class PermissionServiceImpl implements PermissionService { cursor.close(); // 删除匹配到的key if (CollectionUtil.isNotEmpty(delKeys)) { - redisTemplate.delete(delKeys); + return redisTemplate.delete(delKeys); } return 0L; } @@ -397,7 +397,7 @@ public class PermissionServiceImpl implements PermissionService { } redisTemplate.convertAndSend(RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, ""); }).exceptionally(e -> { - log.error("[batchAssignRoleUsers] redis message发送失败, topic:{}, 异常:{}", RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, e); + log.error("[batchAssignRoleUsers] redis 清空USER_ROLE_ID_LIST或message发送失败, topic:{}, 异常:{}", RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, e); return null; }); } @@ -479,7 +479,7 @@ public class PermissionServiceImpl implements PermissionService { redisTemplate.delete(String.format(String.valueOf(new StringBuffer(RedisKeyConstants.USER_ROLE_ID_LIST).append(":%s:%s")), organId, userId)); redisTemplate.convertAndSend(RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, ""); }).exceptionally(e -> { - log.error("[assignUserRole] redis 清空USER_ROLE_ID_LIST或message发送失败, topic:{}, 异常:{}", RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, e); + log.error("[assignUserRole] redis message发送失败, topic:{}, 异常:{}", RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, e); return null; }); } From 8a6b25be02148e36d4b94a0cef8c68d843df4141 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Fri, 28 Jun 2024 17:06:35 +0800 Subject: [PATCH 4/6] =?UTF-8?q?bug#174=20=E7=94=A8=E6=88=B7=E7=AE=A1?= =?UTF-8?q?=E7=90=86>=E6=96=B0=E5=A2=9E=E7=94=A8=E6=88=B7=EF=BC=8C?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/user/vo/user/UserSaveReqVO.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserSaveReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserSaveReqVO.java index 0ffb03ddc..a88ef6c82 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserSaveReqVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserSaveReqVO.java @@ -17,10 +17,10 @@ public class UserSaveReqVO { @Schema(description = "用户编号", example = "1024") private Long id; - @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "chenfeng") - @NotBlank(message = "用户账号不能为空") - @Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户账号由 数字、字母 组成") - @Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符") + @Schema(description = "a", requiredMode = Schema.RequiredMode.REQUIRED, example = "chenfeng") + @NotBlank(message = "用户名不能为空") + @Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户名由 数字、字母 组成") + @Size(min = 4, max = 30, message = "用户名长度为 4-30 个字符") private String username; @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "晨丰") From a4342d012613ecb8f35605288c0dd373c0a2097a Mon Sep 17 00:00:00 2001 From: liuzhaotian Date: Fri, 28 Jun 2024 17:12:21 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E7=A6=85=E9=81=93Bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/plan/bo/GoodsIds.java | 25 +++++++++++++++++++ .../controller/admin/plan/bo/OrderSource.java | 9 +++++++ .../admin/plan/vo/OrderPageReqVOCopy.java | 4 +-- .../admin/pack/vo/PlateDetailsRespVO.java | 2 +- .../query/vo/pack/PackageDetailsRespVO.java | 4 +++ .../dal/mysql/query/OrderItemMapper.xml | 15 ++++++----- .../system/api/process/ProcessApiImpl.java | 3 ++- .../service/user/AdminUserServiceImpl.java | 4 ++- 8 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/GoodsIds.java diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/GoodsIds.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/GoodsIds.java new file mode 100644 index 000000000..734968c1b --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/GoodsIds.java @@ -0,0 +1,25 @@ +package com.cf.imes.module.executor.controller.admin.plan.bo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + + +@Data + +public class GoodsIds { + + + @Schema(description = "大板ID") + private Long id; + + @Schema(description = "生产单ID") + private Long orderId; + + @Schema(description = "板材库的大板ID") + private Long goodsId; + + @Schema(description = "余料板ID") + private Long remainId; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/OrderSource.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/OrderSource.java index 82c9a9a5a..dd036d6d4 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/OrderSource.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/OrderSource.java @@ -16,6 +16,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; import java.util.List; /** @@ -40,6 +42,11 @@ public class OrderSource { @Schema(description = "排单数据") private PlanDO plan; + + @Schema(description = "大板ID列表") + private List goodsIdList; + + @Schema(description = "生产单列表") private List orderList; @@ -61,4 +68,6 @@ public class OrderSource { private List orderPackReqVOS; + + } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderPageReqVOCopy.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderPageReqVOCopy.java index 2afba1064..a3f074eaa 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderPageReqVOCopy.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/vo/OrderPageReqVOCopy.java @@ -32,8 +32,8 @@ public class OrderPageReqVOCopy extends PageParam { private String consigneeAddress; @Schema(description = "状态列表") private List stateList; - /*@Schema(description = "矩形") - private Boolean rectangle;*/ + @Schema(description = "矩形") + private Boolean rectangle; @Schema(description = "异形") private Boolean specialShaped; @Schema(description = "造型") diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/pack/vo/PlateDetailsRespVO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/pack/vo/PlateDetailsRespVO.java index ae6ababa6..09249debb 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/pack/vo/PlateDetailsRespVO.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/pack/vo/PlateDetailsRespVO.java @@ -75,7 +75,7 @@ public class PlateDetailsRespVO { @Schema(description = "排孔", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("排孔") - private String rowHole; + private Boolean rowHole; @Schema(description = "加工组", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("加工组") diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/query/vo/pack/PackageDetailsRespVO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/query/vo/pack/PackageDetailsRespVO.java index b7b4f7958..46488b4b4 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/query/vo/pack/PackageDetailsRespVO.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/query/vo/pack/PackageDetailsRespVO.java @@ -14,6 +14,10 @@ public class PackageDetailsRespVO { @Schema(description = "柜体名称", requiredMode = Schema.RequiredMode.REQUIRED) private String cabinetName; + + @Schema(description = "板材ID", requiredMode = Schema.RequiredMode.REQUIRED) + private String plateId; + @Schema(description = "板编号", requiredMode = Schema.RequiredMode.REQUIRED) private String plateNo; diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/query/OrderItemMapper.xml b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/query/OrderItemMapper.xml index 1f74708b4..3ee524e11 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/query/OrderItemMapper.xml +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/query/OrderItemMapper.xml @@ -6,7 +6,8 @@ - + + @@ -32,7 +33,8 @@ og.name as name, ob.room_name as roomName, ob.name as bodyName, - op.id as palteId, + op.plate_no as plateNo, + op.id as plateId, op.name as plateName, ogs.material as plateMaterial, ogs.color as palteColor, @@ -44,8 +46,7 @@ op.remark as remark, op.is_special_shaped as specialShaped, op.is_sculpt as profiling, - - CASE WHEN op.front_hole_count = 0 or op.back_model_count = 0 or op.side_hole_count = 0 THEN false ELSE true END AS rowHole + op.is_row_hole as rowHole from order_item oi join order_plate op on oi.plate_id = op.id and oi.organ_id = op.organ_id @@ -150,8 +151,7 @@ op.remark as remark, op.is_special_shaped as specialShaped, op.is_sculpt as profiling, - - CASE WHEN op.front_hole_count = 0 or op.back_model_count = 0 or op.side_hole_count = 0 THEN false ELSE true END AS rowHole + op.is_row_hole as rowHole from order_item oi join order_plate op on oi.plate_id = op.id and oi.organ_id = op.organ_id @@ -433,8 +433,7 @@ op.remark as remark, op.is_special_shaped as specialShaped, op.is_sculpt as profiling, - - CASE WHEN op.front_hole_count = 0 or op.back_model_count = 0 or op.side_hole_count = 0 THEN false ELSE true END AS rowHole + op.is_row_hole as rowHole from order_item oi join order_plate op on oi.plate_id = op.id and oi.organ_id = op.organ_id diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/api/process/ProcessApiImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/api/process/ProcessApiImpl.java index d69a96aba..dd401dd48 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/api/process/ProcessApiImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/api/process/ProcessApiImpl.java @@ -31,7 +31,8 @@ public class ProcessApiImpl implements ProcessApi { ProcessDO processDO = processMapper.selectByType(ProcessProcessingTypeEnum.COMPONENTPROCESSING.getNumber(),getUserOrganId()); - return processDO.getPieceRate(); + + return processDO == null ? BigDecimal.ZERO : processDO.getPieceRate(); } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java index 63c042333..1f8196fd2 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java @@ -363,7 +363,9 @@ public class AdminUserServiceImpl implements AdminUserService { // 关闭数据权限,避免因为没有数据权限,查询不到数据,进而导致唯一校验不正确 DataPermissionUtils.executeIgnore(() -> { // 校验用户的密码是否符合规则 - validatePassword(password); + if(password != null) { + validatePassword(password); + } // 校验用户存在 validateUserExists(id); // 校验用户名唯一 From 9833ee28c8863fa1b417641e2c5b9f30a16b3862 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Fri, 28 Jun 2024 17:44:20 +0800 Subject: [PATCH 6/6] =?UTF-8?q?infra=E5=BE=AE=E6=9C=8D=E5=8A=A1dev?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6nacos=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cf-module-infra-biz/src/main/resources/bootstrap-dev.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cf-module-infra/cf-module-infra-biz/src/main/resources/bootstrap-dev.yaml b/cf-module-infra/cf-module-infra-biz/src/main/resources/bootstrap-dev.yaml index fd587eab7..eff6d09c7 100644 --- a/cf-module-infra/cf-module-infra-biz/src/main/resources/bootstrap-dev.yaml +++ b/cf-module-infra/cf-module-infra-biz/src/main/resources/bootstrap-dev.yaml @@ -3,7 +3,7 @@ spring: cloud: nacos: - server-addr: 127.0.0.1:8848 + server-addr: 192.168.1.205:8848 username: nacos password: nacos discovery: @@ -18,7 +18,7 @@ spring: nacos: # Nacos Config 配置项,对应 NacosConfigProperties 配置属性类 config: - server-addr: 127.0.0.1:8848 # Nacos 服务器地址 + server-addr: 192.168.1.205:8848 # Nacos 服务器地址 namespace: dev # 命名空间 dev 的ID,不能直接使用 dev 名称。创建命名空间的时候需要指定ID为 dev,这里使用 dev 开发环境 group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP name: ${spring.application.name} # 使用的 Nacos 配置集的 dataId,默认为 spring.application.name