feat:qms阶段性提交

This commit is contained in:
FCL
2026-01-09 11:26:52 +08:00
parent 10716a0ec5
commit 7e7295cb74
38 changed files with 865 additions and 349 deletions

View File

@@ -0,0 +1,10 @@
package com.zt.plat.module.qms.enums;
public interface QmsSupplierConstant {
String OPERATING_ITEMS_KEY = "operatingItems";
// 供应商属性资质key
String CERTIFICATION_KEY = "certification";
// 评价流程key
String EVALUATION_FLOW_KEY= "OFFICE_SUPPLIER_EVALUATION";
}

View File

@@ -321,6 +321,8 @@ public class BusinessSubSampleServiceImpl implements BusinessSubSampleService {
* */ * */
BusinessSubSampleExtendRespVO respVO = BeanUtils.toBean(businessSubSampleDO, BusinessSubSampleExtendRespVO.class); BusinessSubSampleExtendRespVO respVO = BeanUtils.toBean(businessSubSampleDO, BusinessSubSampleExtendRespVO.class);
respVO.setIsPrint(printFlag); respVO.setIsPrint(printFlag);
respVO.setWarehouseName(warehouseDO.getName());
respVO.setWarehouseLocationCode(locationDO.getCode());
return respVO; return respVO;
} }

View File

@@ -869,19 +869,17 @@ public class SampleAnalysisAuditServiceImpl implements SampleAnalysisAuditServic
.filter(r -> r.getAssessmentLevel() == 1) .filter(r -> r.getAssessmentLevel() == 1)
.findFirst() .findFirst()
.orElse(rule); .orElse(rule);
// if (value.compareTo(new BigDecimal(next.getMinimumValue())) >= 0 && value.compareTo(new BigDecimal(next.getMaximumValue())) <= 0) { if (value.compareTo(new BigDecimal(rule.getMinimumValue())) >= 0 && value.compareTo(new BigDecimal(rule.getMaximumValue())) <= 0) {
// return next; return next;
// } }
return next;
} else if (rule.getAssessmentLevel() == 4) { } else if (rule.getAssessmentLevel() == 4) {
ConfigAssayMethodProjectAssessmentDO prev = rules.stream() ConfigAssayMethodProjectAssessmentDO prev = rules.stream()
.filter(r -> r.getAssessmentLevel() == 3) .filter(r -> r.getAssessmentLevel() == 3)
.findFirst() .findFirst()
.orElse(rule); .orElse(rule);
// if (value.compareTo(new BigDecimal(prev.getMinimumValue())) >= 0 && value.compareTo(new BigDecimal(prev.getMaximumValue())) <= 0) { if (value.compareTo(new BigDecimal(rule.getMinimumValue())) >= 0 && value.compareTo(new BigDecimal(rule.getMaximumValue())) <= 0) {
// return prev; return prev;
// } }
return prev;
} else { } else {
if (value.compareTo(new BigDecimal(rule.getMinimumValue())) >= 0 && value.compareTo(new BigDecimal(rule.getMaximumValue())) <= 0) { if (value.compareTo(new BigDecimal(rule.getMinimumValue())) >= 0 && value.compareTo(new BigDecimal(rule.getMaximumValue())) <= 0) {
return rule; return rule;

View File

@@ -1,6 +1,8 @@
package com.zt.plat.module.qms.common.dic.dal.mapper; package com.zt.plat.module.qms.common.dic.dal.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.datapermission.core.annotation.DeptDataPermissionIgnore;
import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX; import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.zt.plat.framework.mybatis.core.query.MPJLambdaWrapperX; import com.zt.plat.framework.mybatis.core.query.MPJLambdaWrapperX;
@@ -21,6 +23,12 @@ import java.util.List;
@Mapper @Mapper
public interface DictionaryBusinessMapper extends BaseMapperX<DictionaryBusinessDO> { public interface DictionaryBusinessMapper extends BaseMapperX<DictionaryBusinessDO> {
@DeptDataPermissionIgnore(enable = "true")
default List<DictionaryBusinessDO> selectListWithoutPermissionCheck(Wrapper<DictionaryBusinessDO> queryWrapper){
return selectList(queryWrapper);
}
@DeptDataPermissionIgnore(enable = "true")
default PageResult<DictionaryBusinessDO> selectPage(DictionaryBusinessPageReqVO reqVO) { default PageResult<DictionaryBusinessDO> selectPage(DictionaryBusinessPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<DictionaryBusinessDO>() return selectPage(reqVO, new LambdaQueryWrapperX<DictionaryBusinessDO>()
.eqIfPresent(DictionaryBusinessDO::getIdPath, reqVO.getIdPath()) .eqIfPresent(DictionaryBusinessDO::getIdPath, reqVO.getIdPath())
@@ -37,6 +45,7 @@ public interface DictionaryBusinessMapper extends BaseMapperX<DictionaryBusiness
.orderByAsc(DictionaryBusinessDO::getSortNo)); .orderByAsc(DictionaryBusinessDO::getSortNo));
} }
@DeptDataPermissionIgnore(enable = "true")
default List<DictionaryBusinessExtendRespVO> selectItemByCategoryKeys(List<String> keys) { default List<DictionaryBusinessExtendRespVO> selectItemByCategoryKeys(List<String> keys) {
return selectJoinList(DictionaryBusinessExtendRespVO.class, new MPJLambdaWrapperX<DictionaryBusinessDO>() return selectJoinList(DictionaryBusinessExtendRespVO.class, new MPJLambdaWrapperX<DictionaryBusinessDO>()
.leftJoin(DictionaryBusinessDO.class, "dbd", DictionaryBusinessDO::getId, DictionaryBusinessDO::getParentId) .leftJoin(DictionaryBusinessDO.class, "dbd", DictionaryBusinessDO::getId, DictionaryBusinessDO::getParentId)
@@ -56,6 +65,7 @@ public interface DictionaryBusinessMapper extends BaseMapperX<DictionaryBusiness
* @param filterSql 条件sql * @param filterSql 条件sql
* @param keys 存储字段值 作为查询条件in * @param keys 存储字段值 作为查询条件in
*/ */
@DeptDataPermissionIgnore(enable = "true")
List<DictModel> queryTableDictCustom(@Param("table") String table, @Param("text") String text, @Param("code") String code, @Param("filterSql") String filterSql, List<DictModel> queryTableDictCustom(@Param("table") String table, @Param("text") String text, @Param("code") String code, @Param("filterSql") String filterSql,
@Param("keys") List<String> keys); @Param("keys") List<String> keys);
@@ -64,7 +74,10 @@ public interface DictionaryBusinessMapper extends BaseMapperX<DictionaryBusiness
* @param code * @param code
* @param key * @param key
*/ */
@DeptDataPermissionIgnore(enable = "true")
String queryDictTextByKey(@Param("code") String code, @Param("key") String key); String queryDictTextByKey(@Param("code") String code, @Param("key") String key);
@DeptDataPermissionIgnore(enable = "true")
String queryDictTextByID(@Param("code") String code, @Param("id") String id); String queryDictTextByID(@Param("code") String code, @Param("id") String id);
} }

View File

@@ -145,7 +145,7 @@ public class DictionaryBusinessServiceImpl implements DictionaryBusinessService
query.in(DictionaryBusinessDO::getKey, dictCodeList); query.in(DictionaryBusinessDO::getKey, dictCodeList);
query.eq(DictionaryBusinessDO::getNodeType, DataTypeConstant.DATA_TYPE_CATEGORY); query.eq(DictionaryBusinessDO::getNodeType, DataTypeConstant.DATA_TYPE_CATEGORY);
// query.eq(DictionaryBusinessDO::getDeleted, 0); // query.eq(DictionaryBusinessDO::getDeleted, 0);
List<DictionaryBusinessDO> parList = dictionaryBusinessMapper.selectList(query); List<DictionaryBusinessDO> parList = dictionaryBusinessMapper.selectListWithoutPermissionCheck(query);
if(parList.isEmpty()) if(parList.isEmpty())
return dictMap; return dictMap;
List<Long> parIds = parList.stream().map(DictionaryBusinessDO::getId).toList(); List<Long> parIds = parList.stream().map(DictionaryBusinessDO::getId).toList();
@@ -159,7 +159,7 @@ public class DictionaryBusinessServiceImpl implements DictionaryBusinessService
query.in(DictionaryBusinessDO::getKey, itemKeys); query.in(DictionaryBusinessDO::getKey, itemKeys);
else else
query.in(DictionaryBusinessDO::getId, itemKeys); query.in(DictionaryBusinessDO::getId, itemKeys);
List<DictionaryBusinessDO> itemList = dictionaryBusinessMapper.selectList(query); List<DictionaryBusinessDO> itemList = dictionaryBusinessMapper.selectListWithoutPermissionCheck(query);
List<DictModelMany> modelItemList = new ArrayList<>(); List<DictModelMany> modelItemList = new ArrayList<>();
for(DictionaryBusinessDO item: itemList){ for(DictionaryBusinessDO item: itemList){
Long parId = item.getParentId(); Long parId = item.getParentId();
@@ -185,7 +185,7 @@ public class DictionaryBusinessServiceImpl implements DictionaryBusinessService
// query.in(DictionaryBusinessDO::getKey, dictCodeList); // query.in(DictionaryBusinessDO::getKey, dictCodeList);
// query.eq(DictionaryBusinessDO::getNodeType, DataTypeConstant.DATA_TYPE_CATEGORY); // query.eq(DictionaryBusinessDO::getNodeType, DataTypeConstant.DATA_TYPE_CATEGORY);
//// query.eq(DictionaryBusinessDO::getDeleted, 0); //// query.eq(DictionaryBusinessDO::getDeleted, 0);
// List<DictionaryBusinessDO> parList = dictionaryBusinessMapper.selectList(query); // List<DictionaryBusinessDO> parList = dictionaryBusinessMapper.selectListWithoutPermissionCheck(query);
// if(parList.isEmpty()) // if(parList.isEmpty())
// return dictMap; // return dictMap;
// List<Long> parIds = parList.stream().map(DictionaryBusinessDO::getId).toList(); // List<Long> parIds = parList.stream().map(DictionaryBusinessDO::getId).toList();
@@ -193,7 +193,7 @@ public class DictionaryBusinessServiceImpl implements DictionaryBusinessService
// query.in(DictionaryBusinessDO::getParentId, parIds); // query.in(DictionaryBusinessDO::getParentId, parIds);
// query.eq(DictionaryBusinessDO::getNodeType, DataTypeConstant.DATA_TYPE_DATA); // query.eq(DictionaryBusinessDO::getNodeType, DataTypeConstant.DATA_TYPE_DATA);
// query.in(DictionaryBusinessDO::getId, ids); // query.in(DictionaryBusinessDO::getId, ids);
// List<DictionaryBusinessDO> itemList = dictionaryBusinessMapper.selectList(query); // List<DictionaryBusinessDO> itemList = dictionaryBusinessMapper.selectListWithoutPermissionCheck(query);
// List<DictModelMany> modelItemList = new ArrayList<>(); // List<DictModelMany> modelItemList = new ArrayList<>();
// for(DictionaryBusinessDO item: itemList){ // for(DictionaryBusinessDO item: itemList){
// Long parId = item.getParentId(); // Long parId = item.getParentId();
@@ -216,7 +216,7 @@ public class DictionaryBusinessServiceImpl implements DictionaryBusinessService
LambdaQueryWrapper<DictionaryBusinessDO> query = new LambdaQueryWrapper<>(); LambdaQueryWrapper<DictionaryBusinessDO> query = new LambdaQueryWrapper<>();
query.eq(DictionaryBusinessDO::getKey, key); query.eq(DictionaryBusinessDO::getKey, key);
query.eq(DictionaryBusinessDO::getNodeType, DataTypeConstant.DATA_TYPE_CATEGORY); query.eq(DictionaryBusinessDO::getNodeType, DataTypeConstant.DATA_TYPE_CATEGORY);
List<DictionaryBusinessDO> list = dictionaryBusinessMapper.selectList(query); List<DictionaryBusinessDO> list = dictionaryBusinessMapper.selectListWithoutPermissionCheck(query);
if(list.isEmpty()) if(list.isEmpty())
throw exception(DICTIONARY_BUSINESS_NOT_EXISTS); throw exception(DICTIONARY_BUSINESS_NOT_EXISTS);
if(list.size() > 1) if(list.size() > 1)
@@ -234,7 +234,7 @@ public class DictionaryBusinessServiceImpl implements DictionaryBusinessService
LambdaQueryWrapper<DictionaryBusinessDO> query = new LambdaQueryWrapper<>(); LambdaQueryWrapper<DictionaryBusinessDO> query = new LambdaQueryWrapper<>();
query.eq(DictionaryBusinessDO::getKey, key); query.eq(DictionaryBusinessDO::getKey, key);
query.eq(DictionaryBusinessDO::getNodeType, DataTypeConstant.DATA_TYPE_DATA); query.eq(DictionaryBusinessDO::getNodeType, DataTypeConstant.DATA_TYPE_DATA);
List<DictionaryBusinessDO> list = dictionaryBusinessMapper.selectList(query); List<DictionaryBusinessDO> list = dictionaryBusinessMapper.selectListWithoutPermissionCheck(query);
if(list.isEmpty()) if(list.isEmpty())
return CommonResult.error(DICTIONARY_BUSINESS_NOT_EXISTS); return CommonResult.error(DICTIONARY_BUSINESS_NOT_EXISTS);
if(list.size() > 1) if(list.size() > 1)
@@ -325,7 +325,7 @@ public class DictionaryBusinessServiceImpl implements DictionaryBusinessService
LambdaQueryWrapper<DictionaryBusinessDO> query = new LambdaQueryWrapper<>(); LambdaQueryWrapper<DictionaryBusinessDO> query = new LambdaQueryWrapper<>();
query.eq(DictionaryBusinessDO::getNodeType, DataTypeConstant.DATA_TYPE_CATEGORY); query.eq(DictionaryBusinessDO::getNodeType, DataTypeConstant.DATA_TYPE_CATEGORY);
query.orderByAsc(DictionaryBusinessDO::getSortNo); query.orderByAsc(DictionaryBusinessDO::getSortNo);
return dictionaryBusinessMapper.selectList(query); return dictionaryBusinessMapper.selectListWithoutPermissionCheck(query);
} }
@Override @Override
@@ -335,7 +335,7 @@ public class DictionaryBusinessServiceImpl implements DictionaryBusinessService
if(!ObjectUtils.isEmpty(nodeType)) if(!ObjectUtils.isEmpty(nodeType))
query.eq(DictionaryBusinessDO::getNodeType, nodeType); query.eq(DictionaryBusinessDO::getNodeType, nodeType);
query.orderByAsc(DictionaryBusinessDO::getSortNo); query.orderByAsc(DictionaryBusinessDO::getSortNo);
return dictionaryBusinessMapper.selectList(query); return dictionaryBusinessMapper.selectListWithoutPermissionCheck(query);
} }
@Override @Override

View File

@@ -0,0 +1,78 @@
package com.zt.plat.module.qms.core.aspect;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zt.plat.framework.common.pojo.CommonResult;
import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.security.core.LoginUser;
import com.zt.plat.module.qms.core.aspect.annotation.Dict;
import com.zt.plat.module.qms.core.aspect.annotation.QmsPermission;
import com.zt.plat.module.qms.core.constant.CommonConstant;
import com.zt.plat.module.qms.core.legend.LegendApi;
import com.zt.plat.module.qms.core.legend.LegendConvertUtils;
import com.zt.plat.module.qms.core.legend.vo.DictModel;
import com.zt.plat.module.qms.framework.datapermission.QMSPermissionContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static com.zt.plat.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
import static com.zt.plat.module.qms.core.constant.CacheConstant.QMS_DICT_BIZ_CACHE;
import static com.zt.plat.module.qms.core.constant.CacheConstant.QMS_DICT_TABLE_CACHE;
import static com.zt.plat.module.qms.core.constant.DataTypeConstant.DICT_ANNOTATION_SPLIT;
@Aspect
@Component
@Slf4j
public class QmsPermissionAspect {
/**
* 定义切点Pointcut
*/
@Pointcut("@annotation(com.zt.plat.module.qms.core.aspect.annotation.QmsPermission)")
public void executeService() {
}
@Before("executeService()")
public void doBefore(JoinPoint point) throws Throwable {
handleDataScope(point);
}
private void handleDataScope(JoinPoint joinPoint){
QmsPermission annotation = getAnnotationByJoinPoint(joinPoint);
if(annotation == null)
return;
QMSPermissionContextHolder.setContext(true, annotation.deptDataRoleCodes(), annotation.moduleDataRoleCodes(), annotation.deptIdColumn(), annotation.userIdColumn(), annotation.custom());
}
private QmsPermission getAnnotationByJoinPoint(JoinPoint joinPoint) {
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
if (method != null) {
return method.getAnnotation(QmsPermission.class);
}
return null;
}
}

View File

@@ -12,13 +12,16 @@ public @interface QmsPermission {
boolean enable() default true; //默认开启 boolean enable() default true; //默认开启
//部门数据查看权限 //部门数据查看权限
String deptLeaderRoleCode() default "ytjyDeptAndSub"; String deptDataRoleCodes() default ""; //指定部门数据查看角色,多值半角逗号分隔
//模块数据权限-具有此角色可查看本模块所有数据 //模块数据权限-具有此角色可查看本模块所有数据
String moduleDataRoleCode() default ""; String moduleDataRoleCodes() default "ytjyAdmin"; //指定所有数据查看角色,多值半角逗号分隔
String deptColumn() default "DEPT_ID"; String deptIdColumn() default "DEPT_ID"; //部门id列
String userColumn() default "CREATOR"; String userIdColumn() default "CREATOR"; //人员id列
//todo 考虑支持模块自定义扩展。参数传入表达式,通过表达式计算权限
String custom() default "";
} }

View File

@@ -1,42 +1,42 @@
//package com.zt.plat.module.qms.framework.mybatis; package com.zt.plat.module.qms.framework.mybatis;
//
//
//import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
//import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor;
//import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
//import com.zt.plat.module.qms.framework.datapermission.QMSMultiDataPermissionHandler; import com.zt.plat.module.qms.framework.datapermission.QMSMultiDataPermissionHandler;
//import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
//import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.After;
//import org.springframework.beans.factory.SmartInitializingSingleton; import org.springframework.beans.factory.SmartInitializingSingleton;
//import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
//
//import java.util.List; import java.util.List;
//
//@Configuration //@Configuration
//public class QMSDataPermissionConfig implements SmartInitializingSingleton { public class QMSDataPermissionConfig implements SmartInitializingSingleton {
// @Autowired @Autowired
// private MybatisPlusInterceptor mybatisPlusInterceptor; private MybatisPlusInterceptor mybatisPlusInterceptor;
@Autowired
private QMSMultiDataPermissionHandler qmsMultiDataPermissionHandler;
@Override
public void afterSingletonsInstantiated() {
List<InnerInterceptor> interceptors = mybatisPlusInterceptor.getInterceptors();
// 避免重复注册
boolean exists = interceptors.stream()
.filter(i -> i instanceof DataPermissionInterceptor)
.map(i -> (DataPermissionInterceptor) i)
.anyMatch(i -> i.getDataPermissionHandler() == qmsMultiDataPermissionHandler);
if (!exists) {
mybatisPlusInterceptor.addInnerInterceptor(new DataPermissionInterceptor(qmsMultiDataPermissionHandler));
}
}
// @PostConstruct
// public void addDataPermissionInterceptor() {
// //
// @Autowired
// private QMSMultiDataPermissionHandler qmsMultiDataPermissionHandler;
//
// @Override
// public void afterSingletonsInstantiated() {
// List<InnerInterceptor> interceptors = mybatisPlusInterceptor.getInterceptors();
// // 避免重复注册
// boolean exists = interceptors.stream()
// .filter(i -> i instanceof DataPermissionInterceptor)
// .map(i -> (DataPermissionInterceptor) i)
// .anyMatch(i -> i.getDataPermissionHandler() == qmsMultiDataPermissionHandler);
// if (!exists) {
// mybatisPlusInterceptor.addInnerInterceptor(new DataPermissionInterceptor(qmsMultiDataPermissionHandler));
// }
// } // }
//
//// @PostConstruct }
//// public void addDataPermissionInterceptor() {
////
//// }
//
//}

Some files were not shown because too many files have changed in this diff Show More