Merge remote-tracking branch 'origin/qms/develop' into qms/develop

This commit is contained in:
funny 2026-05-13 11:09:28 +08:00
commit 8c20a832f9
9 changed files with 130 additions and 76 deletions

View File

@ -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<PageData<QmsIncomingInspectionTaskNonconformanceVO>> 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));
}

View File

@ -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<FileUploadRecord> 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<Long, FileUploadRecord> finalImageMap = imageMap;
final Map<Long, QmsPdiDetectionRulesStatusItem> 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<QmsPdiTaskRecordDetailVO.FileDetailVO> 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<FileUploadRecord> 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<User> users = roleService.getUsersByCode(Constant.ROLE_CODE_CANGKUGUANLIYUAN);
List<QmsIssueTicketToDo> 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<QmsIssueTicketInspectionRecordItemVO> datas = incomingInspectionTaskControllerService.getNonconformanceDataGroups(entity.getSourceId());
List<QmsIssueTicketInspectionRecordItemVO> 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<QmsIssueTicketInspectionRecordItemVO> datas = incomingInspectionTaskControllerService.getNonconformanceDataGroups(entity.getSourceId());
List<QmsIssueTicketInspectionRecordItemVO> 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<String, QmsPdiTicketMyDetailVO.SignatureInfo> signatures = buildSignatures(processes);
vo.setSignatures(signatures);
@ -1721,24 +1737,24 @@ public class QmsIssueTicketControllerService {
*/
private Map<String, QmsPdiTicketMyDetailVO.SignatureInfo> buildSignatures(List<QmsIssueTicketProcess> processes) {
Map<String, QmsPdiTicketMyDetailVO.SignatureInfo> 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 "未知";
}
}

View File

@ -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";
}

View File

@ -133,6 +133,11 @@ public class QmsIssueTicketDetailVO {
*/
private LocalDateTime completeTime;
/**
* 是否有审批权限
*/
private boolean withApprovalAuthority = false;
/**
* 来料检测任务详情
*/

View File

@ -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);
}
}

View File

@ -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<Role> {
IPage<RoleVO> search(RoleSearchQO request, Page<?> objectPage);
List<MenuVO> getMenusByRoleCodes(Long serviceId, Long userId);
List<User> getUsersByCode(String code);
}

View File

@ -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<Role> {
void enable(EnableQO request, String userName);
List<MenuVO> getMenusByRoleCodes(Long serviceId, Long userId);
List<User> getUsersByCode(String code);
}

View File

@ -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<RoleMapper, Role> implements IR
return menus;
}
@Override
public List<User> getUsersByCode(String code) {
return baseMapper.getUsersByCode(code);
}
private void bindParent(MenuVO menu, List<MenuVO> datas) {
if (!Objects.equals(0L, menu.getParentId())) {
Menu mp = menuService.getById(menu.getParentId());

View File

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nflg.wms.repository.mapper.RoleMapper">
<select id="search" resultType="com.nflg.wms.common.pojo.vo.RoleVO">
SELECT *
FROM role
@ -17,7 +16,7 @@
</select>
<select id="getMenusByRoleCodes" resultType="com.nflg.wms.common.pojo.vo.MenuVO">
SELECT DISTINCT m.id, m.name, m.url, m.component, m.parent_id AS "parentId", m.show,m.sort
SELECT DISTINCT m.id, m.name, m.url, m.component, m.parent_id AS "parentId", m.show, m.sort
FROM role r
INNER JOIN role_menu_map rmm ON r.id = rmm.role_id
INNER JOIN menu m ON rmm.menu_id = m.id
@ -28,4 +27,12 @@
AND m.service_desc_id = #{serviceId}
order by m.id
</select>
<select id="getUsersByCode" resultType="com.nflg.wms.repository.entity.User">
SELECT u.*
FROM role r
INNER JOIN user_role_map urm ON r."id" = urm.role_id
INNER JOIN "user" u ON urm.user_id = u."id"
WHERE r.code = #{code}
</select>
</mapper>