From 45917f2501ce4796be21e7f622ce6756277ff5cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Wed, 13 May 2026 09:44:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(role):=20=E5=AE=8C=E5=96=84=E4=BB=93?= =?UTF-8?q?=E5=BA=93=E7=AE=A1=E7=90=86=E5=91=98=E8=A7=92=E8=89=B2=E5=8F=8A?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=AE=A1=E6=89=B9=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在常量类中新增仓库管理员角色代码常量ROLE_CODE_CANGKUGUANLIYUAN - 在角色服务接口及实现类中新增根据角色代码查询用户的方法getUsersByCode - 在角色Mapper及XML文件中新增对应SQL查询语句支持 - QmsIssueTicketControllerService中新增仓库管理员角色相关待办事项创建逻辑 - QmsIssueTicketDetailVO新增是否有审批权限字段withApprovalAuthority及赋值逻辑 - 来料检测任务详情和不合格项关联数据完善,支持图片信息加载 - 审批签名逻辑完善,关联部门领导审批状态信息显示 - 将代码中仓库管理员角色的字符串引用统一替换为常量 - 修复UserUtil中拼写错误的方法名getPurchaseGropu改为getPurchaseGroup --- ...nspectionTaskNonconformanceController.java | 3 +- .../QmsIssueTicketControllerService.java | 168 ++++++++++-------- .../nflg/wms/common/constant/Constant.java | 5 + .../pojo/vo/QmsIssueTicketDetailVO.java | 5 + .../com/nflg/wms/common/util/UserUtil.java | 2 +- .../wms/repository/mapper/RoleMapper.java | 3 + .../wms/repository/service/IRoleService.java | 3 + .../service/impl/RoleServiceImpl.java | 6 + .../src/main/resources/mapper/RoleMapper.xml | 11 +- 9 files changed, 130 insertions(+), 76 deletions(-) diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIncomingInspectionTaskNonconformanceController.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIncomingInspectionTaskNonconformanceController.java index 1f4ba067..3559f4a7 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIncomingInspectionTaskNonconformanceController.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIncomingInspectionTaskNonconformanceController.java @@ -1,6 +1,7 @@ package com.nflg.qms.admin.controller; import com.nflg.qms.admin.service.QmsIssueTicketControllerService; +import com.nflg.wms.common.constant.Constant; import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.qo.QmsIncomingInspectionTaskNonconformanceSearchQO; @@ -37,7 +38,7 @@ public class QmsIncomingInspectionTaskNonconformanceController extends BaseContr public ApiResult> search(@Valid @RequestBody QmsIncomingInspectionTaskNonconformanceSearchQO request) { User user = userService.getById(UserUtil.getUserId()); request.setPurchaseGroup(user.getPurchasingGroup()); - request.setIsWarehouseManager(UserUtil.getRoles().contains("CANGKUGUANLIYUAN")); + request.setIsWarehouseManager(UserUtil.getRoles().contains(Constant.ROLE_CODE_CANGKUGUANLIYUAN)); return ApiResult.success(nonconformanceService.search(request)); } diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketControllerService.java index 70b285b1..dfde6631 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketControllerService.java @@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.nflg.wms.common.constant.Constant; import com.nflg.wms.common.constant.STATE; import com.nflg.wms.common.exception.NflgException; import com.nflg.wms.common.pojo.PageData; @@ -75,6 +76,9 @@ public class QmsIssueTicketControllerService { @Resource private WmsIncomingInspectionTaskCallbackService wmsIncomingInspectionTaskCallbackService; + @Resource + private IRoleService roleService; + /** * 发起巡检工单 * 1. 校验工单存在且来源类型为巡检(sourceType=2) @@ -124,12 +128,12 @@ public class QmsIssueTicketControllerService { .map(String::trim) .map(Long::valueOf) .collect(Collectors.toList()); - + if (CollectionUtil.isNotEmpty(imageIds)) { List fileRecords = fileUploadRecordService.lambdaQuery() .in(FileUploadRecord::getId, imageIds) .list(); - + for (FileUploadRecord record : fileRecords) { VUtil.trueThrowBusinessError(StrUtil.isBlank(record.getFileName())) .throwMessage("图片文件名不能为空"); @@ -436,7 +440,7 @@ public class QmsIssueTicketControllerService { // 构建返回值 final Map finalImageMap = imageMap; final Map finalStatusItemMap = statusItemMap; - + return failedItems.stream().map(item -> { QmsPdiInspectionResultVO vo = new QmsPdiInspectionResultVO(); vo.setId(item.getId()); @@ -457,7 +461,7 @@ public class QmsIssueTicketControllerService { if (statusItem != null) { vo.setComponentsDes(statusItem.getComponentsDes()); vo.setInspectionContent(statusItem.getInspectionContent()); - + // 解析检测示例图 if (StrUtil.isNotBlank(statusItem.getInspectionImage())) { List exampleImageList = Arrays.stream(statusItem.getInspectionImage().split(",")) @@ -658,12 +662,12 @@ public class QmsIssueTicketControllerService { .map(FileUploadVO::getId) .filter(Objects::nonNull) .collect(Collectors.toList()); - + if (CollectionUtil.isNotEmpty(imageIds)) { List fileRecords = fileUploadRecordService.lambdaQuery() .in(FileUploadRecord::getId, imageIds) .list(); - + for (FileUploadRecord record : fileRecords) { VUtil.trueThrowBusinessError(StrUtil.isBlank(record.getFileName())) .throwMessage("图片文件名不能为空"); @@ -754,8 +758,8 @@ public class QmsIssueTicketControllerService { .set(QmsIssueTicket::getImageIds, request.getImages() == null ? "" : StrUtil.join(",", request.getImages().stream() - .map(com.nflg.wms.common.pojo.vo.FileUploadVO::getId) - .toList())) + .map(com.nflg.wms.common.pojo.vo.FileUploadVO::getId) + .toList())) .set(QmsIssueTicket::getRemark, request.getRemark()) .set(QmsIssueTicket::getUpdateUserId, currentUserId) .set(QmsIssueTicket::getUpdateUserName, currentUserName) @@ -1054,6 +1058,15 @@ public class QmsIssueTicketControllerService { issueTicketToDoService.saveBatch(todoItems); } } + } else if (detail.getInspectionType() == 1) { + List users = roleService.getUsersByCode(Constant.ROLE_CODE_CANGKUGUANLIYUAN); + List todoItems = users.stream().map(user -> new QmsIssueTicketToDo() + .setTicketId(entity.getId()) + .setHandlerUserId(user.getId()) + ).toList(); + if (CollectionUtil.isNotEmpty(todoItems)) { + issueTicketToDoService.saveBatch(todoItems); + } } } @@ -1095,52 +1108,55 @@ public class QmsIssueTicketControllerService { } // 查询关联的来料检测任务详情及检验记录 - if (Objects.nonNull(entity.getSourceId())) { - // 来料检测任务详情 - QmsIncomingInspectionTaskVO taskDetail = incomingInspectionTaskControllerService.getDetail(entity.getSourceId()); - vo.setTaskDetail(taskDetail); + // 来料检测任务详情 + QmsIncomingInspectionTaskVO taskDetail = incomingInspectionTaskControllerService.getDetail(entity.getSourceId()); + vo.setTaskDetail(taskDetail); - List datas = incomingInspectionTaskControllerService.getNonconformanceDataGroups(entity.getSourceId()); - List records = new ArrayList<>(); - datas.forEach(record -> { - QmsIssueTicketInspectionRecordItemVO r = records.stream() - .filter(item -> item.getId().equals(record.getId())) - .findFirst() - .orElseGet(() -> { - QmsIssueTicketInspectionRecordItemVO r1 = new QmsIssueTicketInspectionRecordItemVO() - .setId(record.getId()) - .setName(record.getName()) - .setLegend(record.getLegend()) - .setUnqualifiedQty(0) - .setImageIds(record.getImageIds()); - records.add(r1); - return r1; - }); - r.setUnqualifiedQty(r.getUnqualifiedQty() + record.getUnqualifiedQty()); - if (StrUtil.isNotBlank(r.getImageIds())) { - r.setImageIds(StrUtil.join(",", r.getImageIds(), record.getImageIds())); - } - }); - records.stream() - .filter(record -> StrUtil.isNotBlank(record.getImageIds())) - .forEach(record -> { - if (StrUtil.isNotBlank(record.getImageIds())) { - record.setImages(fileUploadRecordService.lambdaQuery() - .in(FileUploadRecord::getId, Arrays.stream(StrUtil.splitToLong(record.getImageIds(), ",")).boxed().toList()) - .list() - .stream() - .map(file -> new FileUploadVO() - .setId(file.getId()) - .setFileName(file.getFileName()) - .setUrl(file.getUrl()) - ) - .collect(Collectors.toList()) - ); - } + List datas = incomingInspectionTaskControllerService.getNonconformanceDataGroups(entity.getSourceId()); + List records = new ArrayList<>(); + datas.forEach(record -> { + QmsIssueTicketInspectionRecordItemVO r = records.stream() + .filter(item -> item.getId().equals(record.getId())) + .findFirst() + .orElseGet(() -> { + QmsIssueTicketInspectionRecordItemVO r1 = new QmsIssueTicketInspectionRecordItemVO() + .setId(record.getId()) + .setName(record.getName()) + .setLegend(record.getLegend()) + .setUnqualifiedQty(0) + .setImageIds(record.getImageIds()); + records.add(r1); + return r1; }); - vo.setRecords(records); - } + r.setUnqualifiedQty(r.getUnqualifiedQty() + record.getUnqualifiedQty()); + if (StrUtil.isNotBlank(r.getImageIds())) { + r.setImageIds(StrUtil.join(",", r.getImageIds(), record.getImageIds())); + } + }); + records.stream() + .filter(record -> StrUtil.isNotBlank(record.getImageIds())) + .forEach(record -> { + if (StrUtil.isNotBlank(record.getImageIds())) { + record.setImages(fileUploadRecordService.lambdaQuery() + .in(FileUploadRecord::getId, Arrays.stream(StrUtil.splitToLong(record.getImageIds(), ",")).boxed().toList()) + .list() + .stream() + .map(file -> new FileUploadVO() + .setId(file.getId()) + .setFileName(file.getFileName()) + .setUrl(file.getUrl()) + ) + .collect(Collectors.toList()) + ); + } + }); + vo.setRecords(records); + if (taskDetail.getInspectionType() == 0) { + vo.setWithApprovalAuthority(StrUtil.equals(UserUtil.getPurchaseGroup(), taskDetail.getPurchaseGroup())); + } else if (taskDetail.getInspectionType() == 1) { + vo.setWithApprovalAuthority(UserUtil.getRoles().contains(Constant.ROLE_CODE_CANGKUGUANLIYUAN)); + } return vo; } @@ -1438,7 +1454,7 @@ public class QmsIssueTicketControllerService { vo.setCreateUserName(ticket.getCreateUserName()); vo.setCreateTime(ticket.getCreateTime()); vo.setCreator(ticket.getCreateUserName()); - + // 工单类型:根据sourceType转换 if (ticket.getSourceType() != null) { switch (ticket.getSourceType()) { @@ -1641,7 +1657,7 @@ public class QmsIssueTicketControllerService { vo.setRootCause(rootCause); vo.setTemporaryMeasures(temporaryMeasures); vo.setPermanentMeasures(permanentMeasures); - + // 构建相关人员签字(按部门,只返回已审批的) Map signatures = buildSignatures(processes); vo.setSignatures(signatures); @@ -1721,24 +1737,24 @@ public class QmsIssueTicketControllerService { */ private Map buildSignatures(List processes) { Map signatures = new HashMap<>(); - + for (QmsIssueTicketProcess process : processes) { // 只返回已审批的记录(approvalStatus 不为 null) if (process.getApprovalStatus() == null) { continue; } - + // 查询处理人的部门信息 if (process.getHandlerUserId() != null) { UserInterior userInterior = userInteriorService.lambdaQuery() .eq(UserInterior::getUserId, process.getHandlerUserId()) .one(); - + if (userInterior != null && userInterior.getDeptId() != null) { Department department = departmentService.getById(userInterior.getDeptId()); if (department != null) { String deptName = department.getName(); - + // 查询部门领导 Department leaderDept = departmentService.getById(userInterior.getDeptId()); String leaderName = null; @@ -1748,31 +1764,31 @@ public class QmsIssueTicketControllerService { leaderName = leaderUser.getUserName(); } } - + // 如果领导未审批,跳过 if (StrUtil.isBlank(leaderName)) { continue; } - + // 构建签名:姓名(状态) String statusText = convertApprovalStatus(process.getApprovalStatus()); String signature = leaderName + "(" + statusText + ")"; - + // 构建签字信息 QmsPdiTicketMyDetailVO.SignatureInfo signatureInfo = new QmsPdiTicketMyDetailVO.SignatureInfo(); signatureInfo.setDeptName(deptName); signatureInfo.setApprovalOpinion(process.getApprovalOpinion()); - signatureInfo.setApprovalTime(process.getApprovalTime() != null - ? process.getApprovalTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + signatureInfo.setApprovalTime(process.getApprovalTime() != null + ? process.getApprovalTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : null); signatureInfo.setSignature(signature); - + signatures.put(deptName, signatureInfo); } } } } - + return signatures; } @@ -1786,14 +1802,22 @@ public class QmsIssueTicketControllerService { return "未审批"; } switch (status) { - case 0: return "通过"; - case 1: return "驳回"; - case 2: return "重检"; - case 3: return "报废"; - case 4: return "维修"; - case 5: return "挑选使用"; - case 6: return "让渡使用"; - default: return "未知"; + case 0: + return "通过"; + case 1: + return "驳回"; + case 2: + return "重检"; + case 3: + return "报废"; + case 4: + return "维修"; + case 5: + return "挑选使用"; + case 6: + return "让渡使用"; + default: + return "未知"; } } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/constant/Constant.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/constant/Constant.java index eda0b1be..506edf97 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/constant/Constant.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/constant/Constant.java @@ -39,4 +39,9 @@ public class Constant { public static final String DICTIONARY_AD_TYPE ="AdvertisementType"; public static final String DICTIONARY_AD_POSITION ="AdvertisementPosition"; + + /** + * 仓库管理员角色代码 + */ + public static final String ROLE_CODE_CANGKUGUANLIYUAN="CANGKUGUANLIYUAN"; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsIssueTicketDetailVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsIssueTicketDetailVO.java index 2490c361..9150c5cf 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsIssueTicketDetailVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsIssueTicketDetailVO.java @@ -133,6 +133,11 @@ public class QmsIssueTicketDetailVO { */ private LocalDateTime completeTime; + /** + * 是否有审批权限 + */ + private boolean withApprovalAuthority = false; + /** * 来料检测任务详情 */ diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/util/UserUtil.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/util/UserUtil.java index d38de1dc..96523ca6 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/util/UserUtil.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/util/UserUtil.java @@ -32,7 +32,7 @@ public class UserUtil { return UserType.findByValue(Integer.parseInt(StpUtil.getExtra(Constant.LOGIN_EXTRA_USER_TYPE).toString())); } - public static String getPurchaseGropu(){ + public static String getPurchaseGroup(){ return (String) StpUtil.getExtra(Constant.LOGIN_EXTRA_PURCHASING_GROUP); } } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/RoleMapper.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/RoleMapper.java index a30ec8fd..1c425e61 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/RoleMapper.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/RoleMapper.java @@ -7,6 +7,7 @@ import com.nflg.wms.common.pojo.qo.RoleSearchQO; import com.nflg.wms.common.pojo.vo.MenuVO; import com.nflg.wms.common.pojo.vo.RoleVO; import com.nflg.wms.repository.entity.Role; +import com.nflg.wms.repository.entity.User; import java.util.List; @@ -23,4 +24,6 @@ public interface RoleMapper extends BaseMapper { IPage search(RoleSearchQO request, Page objectPage); List getMenusByRoleCodes(Long serviceId, Long userId); + + List getUsersByCode(String code); } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IRoleService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IRoleService.java index 0818617d..87ec50a5 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IRoleService.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IRoleService.java @@ -9,6 +9,7 @@ import com.nflg.wms.common.pojo.qo.RoleUpdateQO; import com.nflg.wms.common.pojo.vo.MenuVO; import com.nflg.wms.common.pojo.vo.RoleVO; import com.nflg.wms.repository.entity.Role; +import com.nflg.wms.repository.entity.User; import java.util.List; @@ -31,4 +32,6 @@ public interface IRoleService extends IService { void enable(EnableQO request, String userName); List getMenusByRoleCodes(Long serviceId, Long userId); + + List getUsersByCode(String code); } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/RoleServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/RoleServiceImpl.java index c2a3a6e9..63216f68 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/RoleServiceImpl.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/RoleServiceImpl.java @@ -12,6 +12,7 @@ import com.nflg.wms.common.pojo.vo.RoleVO; import com.nflg.wms.common.util.VUtil; import com.nflg.wms.repository.entity.Menu; import com.nflg.wms.repository.entity.Role; +import com.nflg.wms.repository.entity.User; import com.nflg.wms.repository.mapper.RoleMapper; import com.nflg.wms.repository.service.IAuditLogService; import com.nflg.wms.repository.service.IMenuService; @@ -108,6 +109,11 @@ public class RoleServiceImpl extends ServiceImpl implements IR return menus; } + @Override + public List getUsersByCode(String code) { + return baseMapper.getUsersByCode(code); + } + private void bindParent(MenuVO menu, List datas) { if (!Objects.equals(0L, menu.getParentId())) { Menu mp = menuService.getById(menu.getParentId()); diff --git a/nflg-wms-repository/src/main/resources/mapper/RoleMapper.xml b/nflg-wms-repository/src/main/resources/mapper/RoleMapper.xml index 277261bf..98fd2dbf 100644 --- a/nflg-wms-repository/src/main/resources/mapper/RoleMapper.xml +++ b/nflg-wms-repository/src/main/resources/mapper/RoleMapper.xml @@ -1,7 +1,6 @@ - + +