From 58bdefaea5e019115cbbd468be5f9f3accd0b0ed Mon Sep 17 00:00:00 2001 From: GUO <1923636941@qq.com> Date: Sun, 5 May 2024 22:34:36 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zhgd/mybatis/DataScopeHandler.java | 114 ++++++++++-------- .../zhgd/mybatis/DataScopeInterceptor.java | 53 ++++---- .../basicdata/service/INoticeService.java | 10 ++ .../service/impl/NoticeServiceImpl.java | 16 ++- .../impl/QualityRectifyRecordServiceImpl.java | 11 +- ...curityQualityRectifyRecordServiceImpl.java | 10 +- 6 files changed, 128 insertions(+), 86 deletions(-) diff --git a/src/main/java/com/zhgd/mybatis/DataScopeHandler.java b/src/main/java/com/zhgd/mybatis/DataScopeHandler.java index 1bc972c5e..49fb63a51 100644 --- a/src/main/java/com/zhgd/mybatis/DataScopeHandler.java +++ b/src/main/java/com/zhgd/mybatis/DataScopeHandler.java @@ -2,6 +2,7 @@ package com.zhgd.mybatis; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler; import com.zhgd.annotation.DataScope; import com.zhgd.xmgl.modules.worker.entity.EnterpriseInfo; @@ -124,68 +125,75 @@ public class DataScopeHandler implements DataPermissionHandler { } private PlainSelect dataScopeFilterByProject(PlainSelect plainSelect, UserInfo user, Object obj) { - DataScope ds = (DataScope) obj; + JSONObject jo = (JSONObject) obj; + Object parameter = jo.get("parameter"); + DataScope ds = jo.getObject("ds", DataScope.class); init(plainSelect); List expressions = new ArrayList<>(); - if (user.getAccountType() == 6) { - List filterEnterprises = getNeedFilterLeftExpression(plainSelect, getFieldEnterpriseTables(), ds); - if (CollUtil.isNotEmpty(filterEnterprises)) { - List enterpriseIds = userEnterpriseService.getEnterpriseIdsIfSubProject(); + if (!DataScopeInterceptor.findIgnoreDataScope(parameter, ds)) { + if (user.getAccountType() == 6) { + List filterEnterprises = getNeedFilterLeftExpression(plainSelect, getFieldEnterpriseTables(), ds); + if (CollUtil.isNotEmpty(filterEnterprises)) { + List enterpriseIds = userEnterpriseService.getEnterpriseIdsIfSubProject(); + for (String filterEnterprise : filterEnterprises) { + inExpression(filterEnterprise, enterpriseIds, plainSelect); + } + } + + List filterItems = getNeedFilterLeftExpression(plainSelect, getFieldVideoTables(), ds); + if (CollUtil.isNotEmpty(filterItems)) { + List videoItems = userDevAuthorityService.getVideoItemsIfSubProject(); + for (String item : filterItems) { + inExpression(item, videoItems, plainSelect); + } + } + + } else if (user.getAccountType() == 11) { + List filterEnterprises = getNeedFilterLeftExpression(plainSelect, getFieldEnterpriseTables(), ds); + EnterpriseInfo ei = enterpriseInfoMapper.getXzSupplierByUserId(SecurityUtils.getUser().getUserId()); + Long id; + if (ei == null) { + id = -1L; + } else { + id = ei.getId(); + } for (String filterEnterprise : filterEnterprises) { - inExpression(filterEnterprise, enterpriseIds, plainSelect); + String sql = StrUtil.format(" ({} = {} OR {} IN ( SELECT DISTINCT t.enterprise_id FROM " + + "(SELECT t.id FROM project_enterprise t WHERE t.enterprise_id = {}) t2 join project_enterprise t on find_in_set( t2.id, ancestors ) )) ", + filterEnterprise, id, filterEnterprise, id); + Expression expression = null; + try { + expression = CCJSqlParserUtil.parseCondExpression(sql); + expressions.add(expression); + } catch (JSQLParserException e) { + log.error(e.getMessage(), e); + } } - } - - List filterItems = getNeedFilterLeftExpression(plainSelect, getFieldVideoTables(), ds); - if (CollUtil.isNotEmpty(filterItems)) { - List videoItems = userDevAuthorityService.getVideoItemsIfSubProject(); - for (String item : filterItems) { - inExpression(item, videoItems, plainSelect); + Expression dataExpression; + if (expressions.size() > 1) { + //数据权限大于1个,之间用或 + OrExpression orExpression = new OrExpression(expressions.get(0), expressions.get(1)); + for (int i = 2; i < expressions.size(); i++) { + orExpression = new OrExpression(orExpression, expressions.get(i)); + } + // 数据权限使用单独的括号 防止与其他条件冲突 + dataExpression = new Parenthesis(orExpression); + } else { + dataExpression = expressions.get(0); } - } - - } else if (user.getAccountType() == 11) { - List filterEnterprises = getNeedFilterLeftExpression(plainSelect, getFieldEnterpriseTables(), ds); - EnterpriseInfo ei = enterpriseInfoMapper.getXzSupplierByUserId(SecurityUtils.getUser().getUserId()); - Long id; - if (ei == null) { - id = -1L; - } else { - id = ei.getId(); - } - for (String filterEnterprise : filterEnterprises) { - String sql = StrUtil.format(" ({} = {} OR {} IN ( SELECT DISTINCT t.enterprise_id FROM " + - "(SELECT t.id FROM project_enterprise t WHERE t.enterprise_id = {}) t2 join project_enterprise t on find_in_set( t2.id, ancestors ) )) ", - filterEnterprise, id, filterEnterprise, id); - Expression expression = null; - try { - expression = CCJSqlParserUtil.parseCondExpression(sql); - expressions.add(expression); - } catch (JSQLParserException e) { - log.error(e.getMessage(), e); + Expression where = plainSelect.getWhere(); + if (where != null) { + where = new AndExpression(where, dataExpression); + } else { + where = dataExpression; } + plainSelect.setWhere(where); } - Expression dataExpression; - if (expressions.size() > 1) { - //数据权限大于1个,之间用或 - OrExpression orExpression = new OrExpression(expressions.get(0), expressions.get(1)); - for (int i = 2; i < expressions.size(); i++) { - orExpression = new OrExpression(orExpression, expressions.get(i)); - } - // 数据权限使用单独的括号 防止与其他条件冲突 - dataExpression = new Parenthesis(orExpression); - } else { - dataExpression = expressions.get(0); - } - Expression where = plainSelect.getWhere(); - if (where != null) { - where = new AndExpression(where, dataExpression); - } else { - where = dataExpression; - } - plainSelect.setWhere(where); } + if (!DataScopeInterceptor.isNotSqlTest()) { + equalsTo("'qqq'", "'qqq'", plainSelect); + } //List scopeIds = systemUserDataScopeService.list(Wrappers.lambdaQuery().eq(SystemUserDataScope::getUserId, user.getUserId())) // .stream().map(u -> u.getRelevanceId()).collect(Collectors.toList()); diff --git a/src/main/java/com/zhgd/mybatis/DataScopeInterceptor.java b/src/main/java/com/zhgd/mybatis/DataScopeInterceptor.java index f968798a0..b2d6ce84d 100644 --- a/src/main/java/com/zhgd/mybatis/DataScopeInterceptor.java +++ b/src/main/java/com/zhgd/mybatis/DataScopeInterceptor.java @@ -23,7 +23,10 @@ import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.SqlCommandType; import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.SQLException; @@ -38,6 +41,25 @@ public class DataScopeInterceptor extends JsqlParserSupport implements InnerInte @Setter private DataScopeHandler dataScopeHandler; + public static boolean findIgnoreDataScope(Object parameter, DataScope annotation) { + if (annotation == null || !annotation.enable()) { + return true; + } + if (parameter instanceof Map) { + for (Object val : ((Map) parameter).values()) { + if (val instanceof String) { + if (val.equals("ignoreDataScope")) { + return true; + } + } + } + } + if (parameter instanceof String) { + return parameter.equals("ignoreDataScope"); + } + return false; + } + public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) { PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh); MappedStatement ms = mpSh.mappedStatement(); @@ -77,37 +99,26 @@ public class DataScopeInterceptor extends JsqlParserSupport implements InnerInte Method[] declaredMethods = clazz.getDeclaredMethods(); Optional dsOption = Arrays.stream(declaredMethods).filter(method -> method.getName().equals(methodName)).map(method -> method.getAnnotation(DataScope.class)).filter(Objects::nonNull).findFirst(); annotation = dsOption.orElseGet(() -> clazz.getAnnotation(DataScope.class)); - if (findIgnoreDataScope(parameter, annotation)) { + if (findIgnoreDataScope(parameter, annotation) && isNotSqlTest()) { return; } PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql); - mpBs.sql(this.parserSingle(mpBs.sql(), annotation)); + JSONObject jo = new JSONObject(); + jo.put("ds", annotation); + jo.put("parameter", parameter); + mpBs.sql(this.parserSingle(mpBs.sql(), jo)); } catch (Exception e) { log.error(e.getMessage(), e); } } - protected void processSelect(Select select, int index, String sql, Object obj) { - this.processSelectBody(select.getSelectBody(), obj); + public static boolean isNotSqlTest() { + HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest(); + return request.getParameter("qqq") == null; } - private boolean findIgnoreDataScope(Object parameter, DataScope annotation) { - if (annotation == null || !annotation.enable()) { - return true; - } - if (parameter instanceof Map) { - for (Object val : ((Map) parameter).values()) { - if (val instanceof String) { - if (val.equals("ignoreDataScope")) { - return true; - } - } - } - } - if (parameter instanceof String) { - return parameter.equals("ignoreDataScope"); - } - return false; + protected void processSelect(Select select, int index, String sql, Object obj) { + this.processSelectBody(select.getSelectBody(), obj); } protected void processSelectBody(SelectBody selectBody, Object obj) { diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/INoticeService.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/INoticeService.java index d97ec4cf3..124b77316 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/INoticeService.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/INoticeService.java @@ -30,5 +30,15 @@ public interface INoticeService extends IService { */ void addUserNotice(Long accountId, String msg, String title, String type); + /** + * 发通知,给某人和app通知 + * + * @param accountId 账号id + * @param msg 消息内容 + * @param title 标题 + * @param type 类型 + */ + void addUserNoticeAndApp(Long accountId, String msg, String title, String type); + void sendProjectNoicte(String projectSn, String title, String msg, String type); } diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/NoticeServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/NoticeServiceImpl.java index dd394a66f..fb7a9d816 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/NoticeServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/NoticeServiceImpl.java @@ -11,11 +11,12 @@ import com.zhgd.xmgl.modules.basicdata.entity.SystemUser; import com.zhgd.xmgl.modules.basicdata.mapper.NoticeMapper; import com.zhgd.xmgl.modules.basicdata.mapper.SystemUserMapper; import com.zhgd.xmgl.modules.basicdata.service.INoticeService; +import com.zhgd.xmgl.push.service.UniPushService; import org.apache.commons.collections.MapUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.text.SimpleDateFormat; import java.util.Date; @@ -39,6 +40,9 @@ public class NoticeServiceImpl extends ServiceImpl impleme @Value("${mqtt-scope}") private String scope; + @Lazy + @Autowired + private UniPushService uniPushService; @Override public IPage selectNoticePageList(Map map) { @@ -77,6 +81,16 @@ public class NoticeServiceImpl extends ServiceImpl impleme sendPushMessage(notice); } + @Override + public void addUserNoticeAndApp(Long accountId, String msg, String title, String type) { + addUserNotice(accountId, msg, title, type); + SystemUser systemUser = systemUserMapper.selectById(accountId); + if (systemUser == null) { + return; + } + uniPushService.pushToSingleByAlias(systemUser.getClientId(), title, msg, null); + } + @Override public void sendProjectNoicte(String projectSn, String title, String msg, String type) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRectifyRecordServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRectifyRecordServiceImpl.java index e00bc8fc6..b305a49de 100644 --- a/src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRectifyRecordServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRectifyRecordServiceImpl.java @@ -11,7 +11,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gexin.fastjson.JSON; import com.gexin.fastjson.JSONArray; import com.gexin.fastjson.JSONObject; -import com.zhgd.jeecg.common.mybatis.EntityMap; import com.zhgd.xmgl.call.SanjiangDataCall; import com.zhgd.xmgl.modules.basicdata.service.INoticeService; import com.zhgd.xmgl.modules.quality.entity.QualityInspectionRecord; @@ -80,7 +79,7 @@ public class QualityRectifyRecordServiceImpl extends ServiceImpl