Commit b3c5e98a by 刘栋

UDI-用户数据隔离

parent 605580c6
Showing with 328 additions and 29 deletions
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
<alibaba.version>2021.1</alibaba.version> <alibaba.version>2021.1</alibaba.version>
<lombok.version>1.18.20</lombok.version> <lombok.version>1.18.20</lombok.version>
<fastjson.version>1.2.57</fastjson.version> <fastjson.version>1.2.57</fastjson.version>
<mybatisplus.version>3.4.0</mybatisplus.version> <mybatisplus.version>3.5.6</mybatisplus.version>
<mybatisplus.dynamic.datasource.version>3.4.1</mybatisplus.dynamic.datasource.version> <mybatisplus.dynamic.datasource.version>3.4.1</mybatisplus.dynamic.datasource.version>
<spring.version>5.3.7</spring.version> <spring.version>5.3.7</spring.version>
<redis.version>2.4.2</redis.version> <redis.version>2.4.2</redis.version>
......
...@@ -180,7 +180,23 @@ ...@@ -180,7 +180,23 @@
<artifactId>hutool-all</artifactId> <artifactId>hutool-all</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
<version>2.11.4</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.4</version>
</dependency>
<dependency> <dependency>
<groupId>com.infynova</groupId> <groupId>com.infynova</groupId>
......
...@@ -21,7 +21,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; ...@@ -21,7 +21,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
@EnableDiscoveryClient @EnableDiscoveryClient
@MapperScan(UdiConstant.MAPPER_PACKAGE_NAME) @MapperScan(UdiConstant.MAPPER_PACKAGE_NAME)
@EnableMethodCache(basePackages = {UdiConstant.UDI_PACKAGE_NAME}) @EnableMethodCache(basePackages = {UdiConstant.UDI_PACKAGE_NAME})
@SpringBootApplication(scanBasePackages = {"com.infynova.udi"}) @SpringBootApplication(scanBasePackages = {"com.infynova.udi","com.infynova.common"})
public class UdiApplication { public class UdiApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(UdiApplication.class, args); SpringApplication.run(UdiApplication.class, args);
......
...@@ -24,7 +24,8 @@ import java.time.format.DateTimeFormatter; ...@@ -24,7 +24,8 @@ import java.time.format.DateTimeFormatter;
* @date 2020/9/15 * @date 2020/9/15
* @return * @return
*/ */
@Configuration @Deprecated
//@Configuration
public class JsonSerializerManage { public class JsonSerializerManage {
@Bean @Bean
......
...@@ -6,7 +6,7 @@ import com.fasterxml.jackson.databind.ser.std.StdSerializer; ...@@ -6,7 +6,7 @@ import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import java.io.IOException; import java.io.IOException;
@Deprecated
public class LongToStringSerializer extends StdSerializer<Long> { public class LongToStringSerializer extends StdSerializer<Long> {
protected LongToStringSerializer(Class<Long> t) { protected LongToStringSerializer(Class<Long> t) {
super(t); super(t);
......
package com.infynova.udi.config.mybatis;
/**
* @author liudong
* 2024/5/17 19:25
* @version 1.0
*/
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import com.infynova.common.core.context.SpringContextUtils;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@Component
public class CustomTenantHandler implements TenantLineHandler {
@Override
public Expression getTenantId() {
// 假设有一个租户上下文,能够从中获取当前用户的租户
Long identityId = SpringContextUtils.getIdentityId();
// 返回租户ID的表达式
return new LongValue(identityId);
}
@Override
public String getTenantIdColumn() {
return "create_by";
}
@Override
public boolean ignoreTable(String tableName) {
// 根据需要返回是否忽略该表
if(StringUtils.equals("product",tableName)){
return true;
}
return false;
}
}
/*
* Copyright [2021] [SaasPlatform ]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.infynova.udi.config.mybatis;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.infynova.common.core.context.HeaderCode;
import com.infynova.common.core.context.SpringContextUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Slf4j
@Component
public class MybatisInterceptor implements MetaObjectHandler {
/**
* 如果请求的实体有参数则默认不会替换值
*
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
if (metaObject.hasGetter("createTime")) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);
}
if (metaObject.hasGetter("createBy") && metaObject.getValue("createBy") == null) {
this.strictInsertFill(metaObject, "createBy", Long.class, SpringContextUtils.getIdentityId());
}
if (metaObject.hasGetter("operatorId") && metaObject.getValue("operatorId") == null) {
this.strictInsertFill(metaObject, "operatorId", Long.class, SpringContextUtils.getIdentityId());
}
if (metaObject.hasGetter("updateTime")) {
this.strictInsertFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
}
if (metaObject.hasGetter("updateBy")) {
this.strictInsertFill(metaObject, "updateBy", Long.class, SpringContextUtils.getIdentityId());
}
if (metaObject.hasGetter("tenantId") && metaObject.getValue("tenantId") == null) {
// udi使用创建人id作为数据隔离用途
this.strictInsertFill(metaObject, "tenantId", Long.class, SpringContextUtils.getIdentityId());
}
}
/**
* 如果请求的实体有参数则默认不会替换值
*
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
if (metaObject.hasGetter("updateTime")) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
}
if (metaObject.hasGetter("updateBy")) {
this.strictUpdateFill(metaObject, "updateBy", Long.class, SpringContextUtils.getIdentityId());
}
if (metaObject.hasGetter("updateName") && metaObject.getValue("updateName") == null) {
this.strictInsertFill(metaObject, "updateName", String.class, SpringContextUtils.get(HeaderCode.USER_NAME));
}
}
}
package com.infynova.udi.config; package com.infynova.udi.config.mybatis;
import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.core.injector.ISqlInjector; import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.extension.injector.methods.AlwaysUpdateSomeColumnById; import com.baomidou.mybatisplus.extension.injector.methods.AlwaysUpdateSomeColumnById;
import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn; import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
import java.util.List; import java.util.List;
/** /**
...@@ -22,12 +26,18 @@ import java.util.List; ...@@ -22,12 +26,18 @@ import java.util.List;
@Configuration @Configuration
public class MybatisPlusConfig { public class MybatisPlusConfig {
@Resource
private CustomTenantHandler customTenantHandler;
@Bean @Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() { public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件 // 分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
TenantLineInnerInterceptor tenantInterceptor = new TenantLineInnerInterceptor();
tenantInterceptor.setTenantLineHandler(customTenantHandler);
interceptor.addInnerInterceptor(tenantInterceptor);
return interceptor; return interceptor;
} }
...@@ -35,8 +45,8 @@ public class MybatisPlusConfig { ...@@ -35,8 +45,8 @@ public class MybatisPlusConfig {
public ISqlInjector sqlInjector() { public ISqlInjector sqlInjector() {
return new DefaultSqlInjector() { return new DefaultSqlInjector() {
@Override @Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass) { public List<AbstractMethod> getMethodList(org.apache.ibatis.session.Configuration configuration, Class<?> mapperClass, TableInfo tableInfo) {
List<AbstractMethod> methodList = super.getMethodList(mapperClass); List<AbstractMethod> methodList = super.getMethodList(configuration,mapperClass,tableInfo);
methodList.add(new InsertBatchSomeColumn()); methodList.add(new InsertBatchSomeColumn());
methodList.add(new AlwaysUpdateSomeColumnById()); methodList.add(new AlwaysUpdateSomeColumnById());
return methodList; return methodList;
......
...@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; ...@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.infynova.common.core.api.ResponseData; import com.infynova.common.core.api.ResponseData;
import com.infynova.common.core.context.HeaderCode;
import com.infynova.common.core.context.SpringContextUtils;
import com.infynova.udi.dto.UdiListQry; import com.infynova.udi.dto.UdiListQry;
import com.infynova.udi.service.helper.UdiEasyExcelHelper; import com.infynova.udi.service.helper.UdiEasyExcelHelper;
import com.infynova.udi.service.UdiService; import com.infynova.udi.service.UdiService;
......
...@@ -29,25 +29,6 @@ public class UdiHelperController { ...@@ -29,25 +29,6 @@ public class UdiHelperController {
@Resource @Resource
private MatchHelper matchHelper; private MatchHelper matchHelper;
@ApiOperationSupport(order = 10000)
@ApiOperation(value = "测试对码匹配", notes = "测试对码匹配", hidden = true)
@GetMapping("tranMatchRate")
public ResponseData<?> tranMatchRate() {
log.info("tranMatchRate");
matchHelper.tranMatchRate();
return ResponseData.ok();
}
// @ApiOperationSupport(order = 10000)
// @ApiOperation(value = "测试分词器", notes = "测试分词器", hidden = true)
// @GetMapping("splitWord")
// public ResponseData<String> splitWord(@RequestParam(name = "word") String word) throws Exception {
// log.info("splitWord:");
// List<String> splitWord = IKAnalyzerSupport.iKSegmenterToList(word);
// String result = splitWord.stream().map(String::valueOf).distinct().collect(Collectors.joining("|")) ;
// return ResponseData.ok(result);
// }
@Resource @Resource
private TaskUploadHelper taskUploadHelper; private TaskUploadHelper taskUploadHelper;
...@@ -55,7 +36,7 @@ public class UdiHelperController { ...@@ -55,7 +36,7 @@ public class UdiHelperController {
private TaskHelper taskHelper; private TaskHelper taskHelper;
@ApiOperationSupport(order = 10000) @ApiOperationSupport(order = 10000)
@ApiOperation(value = "测试转换数据", notes = "测试转换数据", hidden = true) @ApiOperation(value = "测试任务转换数据", notes = "测试任务转换数据", hidden = true)
@PostMapping("testTranData") @PostMapping("testTranData")
public ResponseData<?> testTranData(@RequestBody @Valid IdQry idQry) { public ResponseData<?> testTranData(@RequestBody @Valid IdQry idQry) {
log.info("testTranData:"+ JSON.toJSONString(idQry)); log.info("testTranData:"+ JSON.toJSONString(idQry));
...@@ -79,4 +60,15 @@ public class UdiHelperController { ...@@ -79,4 +60,15 @@ public class UdiHelperController {
log.info("getTaskNo:"); log.info("getTaskNo:");
return ResponseData.ok(taskHelper.getTaskNo()); return ResponseData.ok(taskHelper.getTaskNo());
} }
@ApiOperationSupport(order = 20000)
@ApiOperation(value = "测试对码匹配", notes = "测试对码匹配", hidden = true)
@GetMapping("tranMatchRate")
public ResponseData<?> tranMatchRate() {
log.info("tranMatchRate");
matchHelper.tranMatchRate();
return ResponseData.ok();
}
} }
...@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; ...@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.infynova.common.core.api.ResponseData; import com.infynova.common.core.api.ResponseData;
import com.infynova.common.core.context.SpringContextUtils;
import com.infynova.udi.dto.*; import com.infynova.udi.dto.*;
import com.infynova.udi.entity.MatchData; import com.infynova.udi.entity.MatchData;
import com.infynova.udi.entity.MatchTemp; import com.infynova.udi.entity.MatchTemp;
...@@ -43,6 +44,7 @@ public class UdiMatchDataController { ...@@ -43,6 +44,7 @@ public class UdiMatchDataController {
@PostMapping("list") @PostMapping("list")
public ResponseData<Page<UdiMatchDataVo>> list(@RequestBody @Valid UdiMatchDetailListQry udiMatchDetailListQry){ public ResponseData<Page<UdiMatchDataVo>> list(@RequestBody @Valid UdiMatchDetailListQry udiMatchDetailListQry){
log.info("list:"+ JSON.toJSONString(udiMatchDetailListQry)); log.info("list:"+ JSON.toJSONString(udiMatchDetailListQry));
udiMatchDetailListQry.setCreateBy(SpringContextUtils.getIdentityId());
return ResponseData.ok(matchDataService.queryMatchDataPage(udiMatchDetailListQry)); return ResponseData.ok(matchDataService.queryMatchDataPage(udiMatchDetailListQry));
} }
...@@ -51,6 +53,7 @@ public class UdiMatchDataController { ...@@ -51,6 +53,7 @@ public class UdiMatchDataController {
@PostMapping("export") @PostMapping("export")
public void export(@RequestBody @Valid UdiMatchDetailListQry udiMatchDetailListQry) throws IOException { public void export(@RequestBody @Valid UdiMatchDetailListQry udiMatchDetailListQry) throws IOException {
log.info("export:"+ JSON.toJSONString(udiMatchDetailListQry)); log.info("export:"+ JSON.toJSONString(udiMatchDetailListQry));
udiMatchDetailListQry.setCreateBy(SpringContextUtils.getIdentityId());
udiMatchDetailListQry.setPageSize(-1); udiMatchDetailListQry.setPageSize(-1);
Page<UdiMatchDataVo> page = matchDataService.queryMatchDataPage(udiMatchDetailListQry); Page<UdiMatchDataVo> page = matchDataService.queryMatchDataPage(udiMatchDetailListQry);
List<UdiMatchDataExportVo> exportList = new ArrayList<>(); List<UdiMatchDataExportVo> exportList = new ArrayList<>();
......
...@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; ...@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.infynova.common.core.api.ResponseData; import com.infynova.common.core.api.ResponseData;
import com.infynova.common.core.context.SpringContextUtils;
import com.infynova.udi.dto.*; import com.infynova.udi.dto.*;
import com.infynova.udi.service.helper.UdiEasyExcelHelper; import com.infynova.udi.service.helper.UdiEasyExcelHelper;
import com.infynova.udi.service.TaskImportService; import com.infynova.udi.service.TaskImportService;
...@@ -82,6 +83,7 @@ public class UdiMatchTaskController { ...@@ -82,6 +83,7 @@ public class UdiMatchTaskController {
@PostMapping("list") @PostMapping("list")
public ResponseData<Page<UdiMatchListVo>> list(@RequestBody @Valid UdiMatchTaskListQry udiMatchTaskListQry){ public ResponseData<Page<UdiMatchListVo>> list(@RequestBody @Valid UdiMatchTaskListQry udiMatchTaskListQry){
log.info("list:"+ JSON.toJSONString(udiMatchTaskListQry)); log.info("list:"+ JSON.toJSONString(udiMatchTaskListQry));
udiMatchTaskListQry.setCreateBy(SpringContextUtils.getIdentityId());
return ResponseData.ok(taskService.queryTaskPage(udiMatchTaskListQry)); return ResponseData.ok(taskService.queryTaskPage(udiMatchTaskListQry));
} }
......
...@@ -72,4 +72,7 @@ public class UdiMatchDetailListQry extends PageVo { ...@@ -72,4 +72,7 @@ public class UdiMatchDetailListQry extends PageVo {
*/ */
@ApiModelProperty(value = "处理状态:0-待处理、10-处理中、44-无需处理、100-已处理") @ApiModelProperty(value = "处理状态:0-待处理、10-处理中、44-无需处理、100-已处理")
private List<Integer> updateStatusList; private List<Integer> updateStatusList;
@ApiModelProperty(value = "租户=创建人数据隔离",hidden = true)
private Long createBy;
} }
...@@ -32,4 +32,7 @@ public class UdiMatchTaskListQry extends PageVo { ...@@ -32,4 +32,7 @@ public class UdiMatchTaskListQry extends PageVo {
@ApiModelProperty(value = "上传时间结束") @ApiModelProperty(value = "上传时间结束")
private LocalDate uploadTimeEnd; private LocalDate uploadTimeEnd;
@ApiModelProperty(value = "租户=创建人数据隔离",hidden = true)
private Long createBy;
} }
...@@ -154,7 +154,13 @@ public class MatchData { ...@@ -154,7 +154,13 @@ public class MatchData {
@ApiModelProperty(value = "灭菌方式") @ApiModelProperty(value = "灭菌方式")
private String sterilizationMethod; private String sterilizationMethod;
/** 租户=创建人数据隔离 */
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty(value = "租户=创建人数据隔离")
private Long tenantId;
/** 创建人id */ /** 创建人id */
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "创建人id") @ApiModelProperty(value = "创建人id")
private Long createBy; private Long createBy;
...@@ -163,10 +169,12 @@ public class MatchData { ...@@ -163,10 +169,12 @@ public class MatchData {
private String createName; private String createName;
/** 创建时间 */ /** 创建时间 */
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "创建时间") @ApiModelProperty(value = "创建时间")
private LocalDateTime createTime; private LocalDateTime createTime;
/** 修改人id */ /** 修改人id */
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "修改人id") @ApiModelProperty(value = "修改人id")
private Long updateBy; private Long updateBy;
...@@ -175,6 +183,7 @@ public class MatchData { ...@@ -175,6 +183,7 @@ public class MatchData {
private String updateName; private String updateName;
/** 修改时间 */ /** 修改时间 */
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "修改时间") @ApiModelProperty(value = "修改时间")
private LocalDateTime updateTime; private LocalDateTime updateTime;
......
package com.infynova.udi.entity; package com.infynova.udi.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
...@@ -133,7 +135,13 @@ public class MatchTemp { ...@@ -133,7 +135,13 @@ public class MatchTemp {
@ApiModelProperty(value = "灭菌方式") @ApiModelProperty(value = "灭菌方式")
private String sterilizationMethod; private String sterilizationMethod;
/** 租户=创建人数据隔离 */
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty(value = "租户=创建人数据隔离")
private Long tenantId;
/** 创建人id */ /** 创建人id */
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "创建人id") @ApiModelProperty(value = "创建人id")
private Long createBy; private Long createBy;
...@@ -142,10 +150,12 @@ public class MatchTemp { ...@@ -142,10 +150,12 @@ public class MatchTemp {
private String createName; private String createName;
/** 创建时间 */ /** 创建时间 */
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "创建时间") @ApiModelProperty(value = "创建时间")
private LocalDateTime createTime; private LocalDateTime createTime;
/** 修改人id */ /** 修改人id */
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "修改人id") @ApiModelProperty(value = "修改人id")
private Long updateBy; private Long updateBy;
...@@ -154,6 +164,7 @@ public class MatchTemp { ...@@ -154,6 +164,7 @@ public class MatchTemp {
private String updateName; private String updateName;
/** 修改时间 */ /** 修改时间 */
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "修改时间") @ApiModelProperty(value = "修改时间")
private LocalDateTime updateTime; private LocalDateTime updateTime;
......
...@@ -85,6 +85,7 @@ public class Task { ...@@ -85,6 +85,7 @@ public class Task {
private String matchTimeDesc; private String matchTimeDesc;
/** 操作人id */ /** 操作人id */
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "操作人id") @ApiModelProperty(value = "操作人id")
private Long operatorId; private Long operatorId;
...@@ -92,7 +93,13 @@ public class Task { ...@@ -92,7 +93,13 @@ public class Task {
@ApiModelProperty(value = "操作人") @ApiModelProperty(value = "操作人")
private String operator; private String operator;
/** 租户=创建人数据隔离 */
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty(value = "租户=创建人数据隔离")
private Long tenantId;
/** 创建人id */ /** 创建人id */
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "创建人id") @ApiModelProperty(value = "创建人id")
private Long createBy; private Long createBy;
...@@ -101,10 +108,12 @@ public class Task { ...@@ -101,10 +108,12 @@ public class Task {
private Long creator; private Long creator;
/** 创建时间 */ /** 创建时间 */
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "创建时间") @ApiModelProperty(value = "创建时间")
private LocalDateTime createTime; private LocalDateTime createTime;
/** 修改时间 */ /** 修改时间 */
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "修改时间") @ApiModelProperty(value = "修改时间")
private LocalDateTime updateTime; private LocalDateTime updateTime;
......
package com.infynova.udi.entity; package com.infynova.udi.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.infynova.udi.enums.task.TaskRecordEnum; import com.infynova.udi.enums.task.TaskRecordEnum;
import com.infynova.udi.enums.task.TaskRecordTypeEnum; import com.infynova.udi.enums.task.TaskRecordTypeEnum;
...@@ -37,7 +39,13 @@ public class TaskRecord { ...@@ -37,7 +39,13 @@ public class TaskRecord {
@ApiModelProperty(value = "记录标识:0-普通、1-上传、2-对码") @ApiModelProperty(value = "记录标识:0-普通、1-上传、2-对码")
private Integer recordType; private Integer recordType;
/** 租户=创建人数据隔离 */
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty(value = "租户=创建人数据隔离")
private Long tenantId;
/** 创建人id */ /** 创建人id */
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "创建人id") @ApiModelProperty(value = "创建人id")
private Long createBy; private Long createBy;
...@@ -46,6 +54,7 @@ public class TaskRecord { ...@@ -46,6 +54,7 @@ public class TaskRecord {
private Long creator; private Long creator;
/** 创建时间 */ /** 创建时间 */
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "创建时间") @ApiModelProperty(value = "创建时间")
private LocalDateTime createTime; private LocalDateTime createTime;
} }
......
package com.infynova.udi.filter;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.infynova.common.core.constant.AuthRedisKeyConstant;
import com.infynova.common.core.context.HeaderCode;
import com.infynova.common.core.context.SpringContextUtils;
import com.infynova.common.core.exception.SaasException;
import com.infynova.common.core.exception.SaasNotTokenException;
import com.infynova.common.core.jwt.AuthUtil;
import com.infynova.common.core.jwt.model.JwtUserInfo;
import com.infynova.udi.exception.CommonExceptionCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.Ordered;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
/**
* @author liudong
* 2024/5/16 18:13
* @version 1.0
*/
@Slf4j
@WebFilter(urlPatterns = "/*", filterName = "IdentityFilter")
@Component
public class IdentityFilter implements Filter {
private final static String LOG_PREFIX = "身份验证";
@Resource
private RedisTemplate<String, Object> redisTemplate;
@Resource
private AuthUtil authUtil;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info(LOG_PREFIX+"初始化~");
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
// 进行身份验证逻辑,例如检查用户是否已登录,或者检查请求中的认证信息等
// 如果验证成功,则调用chain.doFilter(request, response)来继续执行请求,否则可以返回未经授权的错误信息
// 客户端
// 获取请求头的值
String clientCode = httpRequest.getHeader(HeaderCode.CLIENT_CODE);
// token
String token = httpRequest.getHeader(HeaderCode.TOKEN);
//log.info("请求路径:{}", httpRequest.getPathInfo());
//log.info("请求客户端:{}", clientCode);
if (StrUtil.isBlank(token)) {
throw new SaasException(CommonExceptionCode.SYSTEM_401);
}
JwtUserInfo authInfo = authUtil.getAuthInfo(token);
Optional.ofNullable(authInfo).orElseThrow(() -> new SaasNotTokenException(CommonExceptionCode.SYSTEM_401));
String identityId = String.valueOf(authInfo.getIdentityId());
Long identityInvalid = (Long) redisTemplate.opsForValue().get(AuthRedisKeyConstant.USER_INVALID_JWT + identityId);
if (ObjectUtil.isNotNull(identityInvalid)) {
log.error("TOKEN失效-用户禁用 {}", token);
throw new SaasNotTokenException(CommonExceptionCode.SYSTEM_401);
}
SpringContextUtils.set(HeaderCode.IDENTITY_ID,identityId);
SpringContextUtils.set(HeaderCode.USER_NAME, authInfo.getUserName());
SpringContextUtils.set(HeaderCode.ACCOUNT_ID, String.valueOf(authInfo.getAccountId()));
SpringContextUtils.set(HeaderCode.DEPT_ID, String.valueOf(authInfo.getDeptId()));
SpringContextUtils.set(HeaderCode.DEPT_CODE, authInfo.getDeptCode());
SpringContextUtils.set(HeaderCode.USER_TYPE, String.valueOf(authInfo.getUserType()));
SpringContextUtils.set(HeaderCode.DATA_SCOPE, String.valueOf(authInfo.getDeptCode()));
SpringContextUtils.set(HeaderCode.TENANT_ID, String.valueOf(authInfo.getTenantId()));
chain.doFilter(request, response);
}
@Override
public void destroy() {
log.info(LOG_PREFIX+"销毁~");
Filter.super.destroy();
}
}
...@@ -25,5 +25,5 @@ public interface MatchDataMapper extends SuperMapper<MatchData> { ...@@ -25,5 +25,5 @@ public interface MatchDataMapper extends SuperMapper<MatchData> {
Set<Long> queryMatchWaitingTask(); Set<Long> queryMatchWaitingTask();
List<TaskMatchStatisticVo> queryTaskMatchStatistic(@Param("taskIds") Collection<Long> taskIds); List<TaskMatchStatisticVo> queryTaskMatchStatistic(@Param("taskIds") Collection<Long> taskIds, @Param("createBy") Long createBy);
} }
...@@ -3,6 +3,7 @@ package com.infynova.udi.service.impl; ...@@ -3,6 +3,7 @@ package com.infynova.udi.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.infynova.common.core.context.SpringContextUtils;
import com.infynova.udi.dto.UdiAllMatchQry; import com.infynova.udi.dto.UdiAllMatchQry;
import com.infynova.udi.dto.UdiBatchMatchQry; import com.infynova.udi.dto.UdiBatchMatchQry;
import com.infynova.udi.dto.UdiMatchConfirmationDto; import com.infynova.udi.dto.UdiMatchConfirmationDto;
...@@ -80,7 +81,7 @@ public class MatchDataServiceImpl extends BaseService implements MatchDataServic ...@@ -80,7 +81,7 @@ public class MatchDataServiceImpl extends BaseService implements MatchDataServic
*/ */
@Override @Override
public List<TaskMatchStatisticVo> queryTaskMatchStatistic(List<Long> taskIds) { public List<TaskMatchStatisticVo> queryTaskMatchStatistic(List<Long> taskIds) {
return matchDataMapper.queryTaskMatchStatistic(taskIds); return matchDataMapper.queryTaskMatchStatistic(taskIds, SpringContextUtils.getIdentityId());
} }
/** /**
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
match_data as md match_data as md
left join task as t on t.id = md.task_id left join task as t on t.id = md.task_id
<where> <where>
AND md.create_by = #{query.createBy}
<if test=" query.taskId != null" > <if test=" query.taskId != null" >
AND md.task_id = #{query.taskId} AND md.task_id = #{query.taskId}
</if> </if>
...@@ -62,6 +63,7 @@ ...@@ -62,6 +63,7 @@
SUM(IF(match_status = 99, 1, 0)) AS never SUM(IF(match_status = 99, 1, 0)) AS never
from match_data from match_data
<where> <where>
AND create_by = #{createBy}
<if test=" taskIds != null and taskIds.size > 0"> <if test=" taskIds != null and taskIds.size > 0">
AND task_id IN <foreach collection="taskIds" item="taskId" open="(" close=")" separator=","> #{taskId} </foreach> AND task_id IN <foreach collection="taskIds" item="taskId" open="(" close=")" separator=","> #{taskId} </foreach>
</if> </if>
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
from from
task as t task as t
<where> <where>
AND t.create_by = #{query.createBy}
<if test=" query.taskStatusList != null and query.taskStatusList.size() > 0"> <if test=" query.taskStatusList != null and query.taskStatusList.size() > 0">
AND t.task_status IN <foreach collection="query.taskStatusList" item="taskStatus" open="(" close=")" separator=","> #{taskStatus} </foreach> AND t.task_status IN <foreach collection="query.taskStatusList" item="taskStatus" open="(" close=")" separator=","> #{taskStatus} </foreach>
</if> </if>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment