Commit b0f6c5ac by 刘泽志

已经完成字段与规则同步,需要改造的:

1:自动生成表
2:导入四舍五入测试
3:插入sql更新
4:导入数据要先清除本年度数据
5:机构字典
parent 4b6184fa
......@@ -14,10 +14,7 @@ import com.tbyf.his.web.dataImport.domain.param.AddFieldParam;
import com.tbyf.his.web.dataImport.domain.param.QueryFieldParam;
import com.tbyf.his.web.dataImport.domain.param.QueryMetaFieldParam;
import com.tbyf.his.web.dataImport.domain.param.UpdateFieldParam;
import com.tbyf.his.web.dataImport.entity.BindRule;
import com.tbyf.his.web.dataImport.entity.DataField;
import com.tbyf.his.web.dataImport.entity.ExcelData;
import com.tbyf.his.web.dataImport.entity.MetaField;
import com.tbyf.his.web.dataImport.entity.*;
import com.tbyf.his.web.dataImport.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......@@ -55,6 +52,9 @@ public class DataFieldController {
private BindRuleService bindRuleService;
@Autowired
private DataTemplateService dataTemplateService;
@Autowired
private ExcelDataService excelDataService;
@Autowired
......@@ -110,11 +110,19 @@ public class DataFieldController {
@IgnoreWebSecurity
@GetMapping("/reset")
@ApiOperation("根据基础模板重置字段")
public AjaxResult resetField(@RequestParam String excelId) {
public AjaxResult resetField(@RequestParam String excelId, @RequestParam(required = false) String year) {
final ExcelData excelData = excelDataService.getById(excelId);
// 获取待匹配的字段
// 获取元字段列表
final List<MetaField> metaFields = metaFieldService.list();
List<DataField> fieldMatchList = dataFieldService.listFieldMatchList(excelData.getTemplateId());
// 获取需要同步的字段列表
List<DataField> fieldMatchList = null;
if (StringUtils.isNotBlank(year)) {
DataTemplate template = dataTemplateService.getOne(Wrappers.lambdaQuery(DataTemplate.class)
.eq(DataTemplate::getYear, year).eq(DataTemplate::getOrgName, excelData.getOrgName()), false);
fieldMatchList = dataFieldService.list(Wrappers.lambdaQuery(DataField.class)
.eq(DataField::getTemplateId, template.getId()).isNotNull(DataField::getField));
}
// 删除掉之前的模板信息
final LambdaQueryWrapper<DataField> wrapper = Wrappers.lambdaQuery(DataField.class).eq(DataField::getTemplateId, excelData.getTemplateId());
final List<DataField> list = dataFieldService.list(wrapper);
if (!CollectionUtils.isEmpty(list)) {
......
......@@ -18,9 +18,11 @@ import com.tbyf.his.web.dataImport.domain.param.UpdateRuleParam;
import com.tbyf.his.web.dataImport.entity.BindRule;
import com.tbyf.his.web.dataImport.entity.DataField;
import com.tbyf.his.web.dataImport.entity.DataRule;
import com.tbyf.his.web.dataImport.entity.DataTemplate;
import com.tbyf.his.web.dataImport.service.BindRuleService;
import com.tbyf.his.web.dataImport.service.DataFieldService;
import com.tbyf.his.web.dataImport.service.DataRuleService;
import com.tbyf.his.web.dataImport.service.DataTemplateService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
......@@ -30,8 +32,7 @@ import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Collections;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
......@@ -53,6 +54,9 @@ public class DataRuleController {
@Autowired
private DataFieldService dataFieldService;
@Autowired
private DataTemplateService dataTemplateService;
@IgnoreWebSecurity
@GetMapping("")
@ApiOperation("规则查询")
......@@ -174,4 +178,96 @@ public class DataRuleController {
return AjaxResult.success();
}
@IgnoreWebSecurity
@GetMapping("/sync/year")
@ApiOperation("根据年份同步规则")
public AjaxResult syncRuleByYear(@RequestParam String templateId, @RequestParam String year) {
// 查询两个模板
DataTemplate sourceTemplate = dataTemplateService.getById(templateId);
DataTemplate targetTemplate = dataTemplateService.getOne(Wrappers.lambdaQuery(DataTemplate.class).eq(DataTemplate::getYear, year).eq(DataTemplate::getOrgName, sourceTemplate.getOrgName()), false);
List<DataField> fieldList = dataFieldService.list(Wrappers.lambdaQuery(DataField.class)
.eq(DataField::getTemplateId, sourceTemplate.getId())
.isNotNull(DataField::getField)
.select(DataField::getField, DataField::getId));
List<DataField> targetFieldList = dataFieldService.list(Wrappers.lambdaQuery(DataField.class)
.eq(DataField::getTemplateId, targetTemplate.getId())
.isNotNull(DataField::getField)
.select(DataField::getField, DataField::getId));
if (!CollectionUtils.isEmpty(fieldList)) {
List<BindRule> rules = new ArrayList<>();
List<BindRule> sourceBindList = bindRuleService.queryRuleList(sourceTemplate.getId());
List<BindRule> targetBindList = bindRuleService.queryRuleList(targetTemplate.getId());
// 字段规则同步
if (!CollectionUtils.isEmpty(targetBindList)) {
for (BindRule targetRule : targetBindList) {
Optional<DataField> first = fieldList.stream().filter(df -> StringUtils.equals(df.getField(), targetRule.getDataId())).findFirst();
if (first.isPresent()) {
boolean match = sourceBindList.stream()
.anyMatch(br -> StringUtils.equals(br.getDataId(), targetRule.getDataId()) && StringUtils.equals(br.getRuleId(), targetRule.getRuleId()));
if (!match) {
rules.add(new BindRule(first.get().getId(), targetRule.getRuleId()));
}
}
}
}
// 模板规则同步
List<DataRule> sourceRules = dataRuleService.queryTemplateRules(sourceTemplate.getId());
List<DataRule> targetRules = dataRuleService.queryTemplateRules(targetTemplate.getId());
if (!CollectionUtils.isEmpty(targetRules)) {
List<DataRule> datas = new ArrayList<>();
root:
for (DataRule targetRule : targetRules) {
String[] split = targetRule.getContent().split("=");
String[] split1 = split[0].split(",");
String[] split2 = split[1].split(",");
for (int i = 0; i < split1.length; i++) {
int finalI = i;
Optional<DataField> first = targetFieldList.stream().filter(item -> StringUtils.equals(item.getId(), split1[finalI])).findFirst();
if (first.isPresent()) {
Optional<DataField> first1 = fieldList.stream().filter(item -> StringUtils.equals(item.getField(), first.get().getField())).findFirst();
if (first1.isPresent()) {
split1[i] = first1.get().getId();
} else {
continue root;
}
} else {
continue root;
}
}
for (int j = 0; j < split2.length; j++) {
int finalI = j;
Optional<DataField> first = targetFieldList.stream().filter(item -> StringUtils.equals(item.getId(), split2[finalI])).findFirst();
if (first.isPresent()) {
Optional<DataField> first1 = fieldList.stream().filter(item -> StringUtils.equals(item.getField(), first.get().getField())).findFirst();
if (first1.isPresent()) {
split2[j] = first1.get().getId();
} else {
continue root;
}
} else {
continue root;
}
}
targetRule.setId(null);
targetRule.setContent(String.join(",", split1) + "=" + String.join(",", split2));
datas.add(targetRule);
}
if (!CollectionUtils.isEmpty(datas)) {
dataRuleService.saveBatch(datas);
datas.forEach(item -> {
BindRule rule = new BindRule();
rule.setDataId(sourceTemplate.getId())
.setRuleId(item.getId());
rules.add(rule);
});
}
}
if (!CollectionUtils.isEmpty(rules)) {
bindRuleService.saveBatch(rules);
}
}
return AjaxResult.success();
}
}
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.tbyf.his.common.annotation.IgnoreWebSecurity;
import com.tbyf.his.common.core.domain.AjaxResult;
import com.tbyf.his.common.utils.StringUtils;
import com.tbyf.his.common.utils.bean.BeanUtils;
import com.tbyf.his.web.dataImport.domain.param.*;
import com.tbyf.his.web.dataImport.entity.*;
......@@ -32,7 +33,7 @@ import java.util.stream.Collectors;
public class DataTemplateController {
@Autowired
private DataTemplateService dataImportService;
private DataTemplateService dataTemplateService;
@Autowired
private DataFieldService dataFieldService;
......@@ -50,7 +51,7 @@ public class DataTemplateController {
@GetMapping()
@ApiOperation("模板查询")
public AjaxResult queryTemplate(@Validated QueryTemplateParam param) {
return AjaxResult.success(dataImportService.queryTemplate(param));
return AjaxResult.success(dataTemplateService.queryTemplate(param));
}
@IgnoreWebSecurity
......@@ -82,7 +83,7 @@ public class DataTemplateController {
DataTemplate template = new DataTemplate();
BeanUtils.copyProperties(param, template);
template.initAdd();
dataImportService.save(template);
dataTemplateService.save(template);
return AjaxResult.success();
}
......@@ -93,7 +94,7 @@ public class DataTemplateController {
DataTemplate template = new DataTemplate();
BeanUtils.copyProperties(param, template);
template.initAdd();
dataImportService.updateById(template);
dataTemplateService.updateById(template);
return AjaxResult.success();
}
......@@ -101,7 +102,7 @@ public class DataTemplateController {
@GetMapping("/template/delete")
@ApiOperation("删除模板")
public AjaxResult deleteTemplate(@RequestParam String templateId) {
dataImportService.removeById(templateId);
dataTemplateService.removeById(templateId);
excelDataService.remove(Wrappers.lambdaQuery(ExcelData.class).eq(ExcelData::getTemplateId, templateId));
final LambdaQueryWrapper<DataField> wrapper = Wrappers.lambdaQuery(DataField.class).eq(DataField::getTemplateId, templateId);
final List<DataField> list = dataFieldService.list(wrapper);
......@@ -154,4 +155,16 @@ public class DataTemplateController {
return AjaxResult.success();
}
@IgnoreWebSecurity
@PostMapping("/otherYears")
@ApiOperation("查询此类型模板的其它年份列表")
public AjaxResult queryOtherYears(@RequestBody @Validated DataTemplate template) {
LambdaQueryWrapper<DataTemplate> queryWrapper = Wrappers.lambdaQuery(DataTemplate.class)
.eq(DataTemplate::getOrgName, template.getOrgName())
.ne(DataTemplate::getYear, template.getYear())
.select(DataTemplate::getYear);
List<DataTemplate> list = dataTemplateService.list(queryWrapper);
return AjaxResult.success(list.stream().filter(item-> StringUtils.isNotBlank(item.getYear())).map(DataTemplate::getYear).collect(Collectors.toList()));
}
}
......@@ -4,7 +4,9 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
......@@ -18,6 +20,8 @@ import java.io.Serializable;
@Accessors(chain = true)
@TableName(value = "bind_rule", autoResultMap = true)
@ApiModel(value = "数据规则绑定表", description = "数据规则绑定表")
@AllArgsConstructor
@NoArgsConstructor
public class BindRule implements Serializable {
private static final long serialVersionUID = 1L;
......
......@@ -3,10 +3,19 @@ package com.tbyf.his.web.dataImport.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tbyf.his.web.dataImport.entity.BindRule;
import java.util.List;
/**
* @author lzz
* @date 2023/2/7 11:22
*/
public interface BindRuleMapper extends BaseMapper<BindRule> {
/**
* 查询此模板下面的所有规则
* @param templateId
* @return
*/
List<BindRule> queryRuleList(String templateId);
}
......@@ -3,10 +3,19 @@ package com.tbyf.his.web.dataImport.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tbyf.his.web.dataImport.entity.DataRule;
import java.util.List;
/**
* @author lzz
* @date 2023/2/7 11:22
*/
public interface DataRuleMapper extends BaseMapper<DataRule> {
/**
* 查询全部模板规则
* @param templateId
* @return
*/
List<DataRule> queryTemplateRules(String templateId);
}
......@@ -3,10 +3,20 @@ package com.tbyf.his.web.dataImport.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tbyf.his.web.dataImport.entity.BindRule;
import java.util.List;
/**
* @author lzz
* @date 2023/2/7 11:23
*/
public interface BindRuleService extends IService<BindRule> {
/**
* 查询此模板下面的所有规则
* @param templateId
* @return
*/
List<BindRule> queryRuleList(String templateId);
}
......@@ -3,10 +3,21 @@ package com.tbyf.his.web.dataImport.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tbyf.his.web.dataImport.entity.DataRule;
import java.util.List;
/**
* @author lzz
* @date 2023/2/7 11:23
*/
public interface DataRuleService extends IService<DataRule> {
/**
* 查询全部模板规则
* @param templateId
* @return
*/
List<DataRule> queryTemplateRules(String templateId);
}
......@@ -7,8 +7,11 @@ import com.tbyf.his.web.dataImport.entity.BindRule;
import com.tbyf.his.web.dataImport.mapper.BindRuleMapper;
import com.tbyf.his.web.dataImport.service.BindRuleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author lzz
* @date 2023/2/7 11:24
......@@ -17,4 +20,12 @@ import org.springframework.stereotype.Service;
@Service
@DataSource(DataSourceType.MASTER)
public class BindRuleServiceImpl extends ServiceImpl<BindRuleMapper, BindRule> implements BindRuleService {
@Autowired
private BindRuleMapper bindRuleMapper;
@Override
public List<BindRule> queryRuleList(String templateId) {
return bindRuleMapper.queryRuleList(templateId);
}
}
......@@ -16,7 +16,9 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
......@@ -41,38 +43,52 @@ public class DataFieldServiceImpl extends ServiceImpl<DataFieldMapper, DataField
@Override
public void fieldMatch(List<MetaField> list, DataField field, List<DataField> fieldMatchList) {
// 先查询元字段里面有没有相互匹配的
final Optional<MetaField> first = list.stream().filter(item -> {
if (StringUtils.isBlank(field.getTitle())) {
return;
}
MetaField metaField = null;
DataField dataField = null;
if (!CollectionUtils.isEmpty(list)) {
list.forEach(item -> {
if (StringUtils.isNotBlank(item.getFieldComment())) {
return field.getTitle().contains(item.getFieldComment());
item.setRatio(DataImportUtils.getSimilarityRatio(field.getTitle(), item.getFieldComment()));
} else {
item.setRatio(0);
}
});
Optional<MetaField> max = list.stream().max(Comparator.comparing(MetaField::getRatio));
if (max.isPresent()) {
metaField = max.get();
}
return false;
}).findFirst();
if (first.isPresent()) {
field.setField(first.get().getId());
return;
}
if (!CollectionUtils.isEmpty(fieldMatchList)) {
fieldMatchList.forEach(item -> {
item.setRatio(item.getSimilarityRatio(field));
if (StringUtils.isNotBlank(item.getTitle())) {
item.setRatio(DataImportUtils.getSimilarityRatio(field.getTitle(), item.getTitle()));
} else {
item.setRatio(0);
}
});
final Optional<DataField> max = fieldMatchList.stream().max(Comparator.comparing(DataField::getRatio));
Optional<DataField> max = fieldMatchList.stream().max(Comparator.comparing(DataField::getRatio));
if (max.isPresent()) {
if (max.get().getRatio() > 2.2) {
field.setField(max.get().getId());
return;
dataField = max.get();
}
}
if (metaField == null) {
if (dataField != null && dataField.getRatio() > 0.3) {
field.setField(dataField.getField());
}
list.forEach(item -> {
if (StringUtils.isNotBlank(field.getTitle()) && StringUtils.isNotBlank(item.getFieldComment())) {
item.setRatio(DataImportUtils.getSimilarityRatio(field.getTitle(), item.getFieldComment()));
} else {
if (dataField == null) {
if (metaField.getRatio() > 0.3) {
field.setField(metaField.getId());
}
} else {
if (dataField.getRatio() >= metaField.getRatio()) {
field.setField(dataField.getField());
} else {
field.setField(metaField.getId());
}
});
final Optional<MetaField> max = list.stream().max(Comparator.comparing(MetaField::getRatio));
if (max.isPresent()) {
if (max.get().getRatio() > 0.5) {
field.setField(max.get().getId());
}
}
}
......
......@@ -7,8 +7,11 @@ import com.tbyf.his.web.dataImport.entity.DataRule;
import com.tbyf.his.web.dataImport.mapper.DataRuleMapper;
import com.tbyf.his.web.dataImport.service.DataRuleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author lzz
* @date 2023/2/7 11:24
......@@ -17,4 +20,11 @@ import org.springframework.stereotype.Service;
@Service
@DataSource(DataSourceType.MASTER)
public class DataRuleServiceImpl extends ServiceImpl<DataRuleMapper, DataRule> implements DataRuleService {
@Autowired
private DataRuleMapper dataRuleMapper;
@Override
public List<DataRule> queryTemplateRules(String templateId) {
return dataRuleMapper.queryTemplateRules(templateId);
}
}
<?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.tbyf.his.web.dataImport.mapper.BindRuleMapper">
<select id="queryRuleList" resultType="com.tbyf.his.web.dataImport.entity.BindRule">
select df.field as dataId, br.rule_id as ruleId
from data_field df
left join bind_rule br on df.id = br.data_id
where df.template_id = #{templateId}
and br.rule_id is not null
and df.field is not null
</select>
</mapper>
<?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.tbyf.his.web.dataImport.mapper.DataRuleMapper">
<select id="queryTemplateRules" resultType="com.tbyf.his.web.dataImport.entity.DataRule">
select dr.*
from data_template dt
left join bind_rule br on dt.id = br.data_id
left join data_rule dr on br.rule_id = dr.id
where dt.id = #{templateId}
and dr.id is not null
</select>
</mapper>
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 to comment