123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- package edp.davinci.service.impl;
- import com.alibaba.fastjson.JSONArray;
- import com.alibaba.fastjson.JSONObject;
- import edp.core.exception.NotFoundException;
- import edp.core.exception.ServerException;
- import edp.core.utils.SqlUtils;
- import edp.davinci.core.enums.LogNameEnum;
- import edp.davinci.dao.QualityAuditorMapper;
- import edp.davinci.dao.QualityTaskMapper;
- import edp.davinci.dao.SourceMapper;
- import edp.davinci.dao.ViewMapper;
- import edp.davinci.dto.qualityAuditor.QualityTaskDto;
- import edp.davinci.model.*;
- import edp.davinci.service.DataRulesService;
- import edp.davinci.service.DataSubjectService;
- import edp.davinci.service.QualityAuditorService;
- import edp.davinci.service.QualityTaskService;
- import lombok.extern.slf4j.Slf4j;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import java.util.Date;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- @Slf4j
- @Service("qualityTaskService")
- public class QualityTaskServiceImpl implements QualityTaskService {
- private static final Logger optLogger = LoggerFactory.getLogger(LogNameEnum.BUSINESS_OPERATION.getName());
- @Autowired
- private QualityTaskMapper qualityTaskMapper;
- @Autowired
- private ViewMapper viewMapper;
- @Autowired
- private SourceMapper sourceMapper;
- @Autowired
- private DataSubjectService dataSubjectService;
- @Autowired
- private DataRulesService dataRulesService;
- @Autowired
- private QualityAuditorMapper qualityAuditorMapper;
- @Autowired
- private SqlUtils sqlUtils;
- @Override
- public List<QualityTask> getQualityTask() {
- return qualityTaskMapper.getQualityTaskList();
- }
- @Override
- public List<QualityTask> getQualityTaskByPid(Long id) {
- return qualityTaskMapper.getQualityTaskListByPid(id);
- }
- @Override
- public QualityTask createQualityTask(QualityTask qualityTask) {
- qualityTaskMapper.insert(qualityTask);
- return qualityTask;
- }
- public QualityTask getQualityTask(Long id) {
- QualityTask qualityTask = qualityTaskMapper.getQualityTask(id);
- return qualityTask;
- }
- @Override
- public List<QualityTask> getQualityTaskListByViewId(Long viewId) {
- return qualityTaskMapper.getQualityTaskListByViewId(viewId);
- }
- @Override
- public List<QualityTaskDto> getQualityTaskListCondition(Long PId, String time) {
- return qualityTaskMapper.getQualityTaskListCondition(PId, time);
- }
- @Override
- public void updateQualityTask(QualityTask qualityTask) {
- qualityTaskMapper.update(qualityTask);
- }
- @Override
- public void deleteQualityTask(Long id) {
- qualityTaskMapper.deleteById(id);
- }
- @Override
- public void auditor(Long id) throws ServerException {
- QualityTask qualityTask = qualityTaskMapper.getQualityTask(id);
- if (null == qualityTask) {
- throw new ServerException("id 为 " + id + "质量任务不存在");
- }
- String tableName = qualityTask.getMetadataName();
- Long viewId = qualityTask.getViewId();
- View view = viewMapper.getById(viewId);
- String metadataConfig = qualityTask.getMetadataConfig();
- JSONArray jsonArray = JSONObject.parseArray(metadataConfig);
- // 稽核
- QualityAuditor qualityAuditor = new QualityAuditor();
- qualityAuditor.setAuditorTime(new Date());
- qualityAuditor.setTaskId(qualityTask.getId());
- qualityAuditor.setViewId(viewId);
- // 遍历JSONArray
- for (Iterator<Object> iterator = jsonArray.iterator(); iterator.hasNext(); ) {
- JSONObject next = (JSONObject) iterator.next();
- Long subjectId = next.getLong("subjectId");
- String fieldName = next.getString("fieldName");
- Source source = getSource(view.getSourceId());
- SqlUtils sqlUtils = this.sqlUtils.init(source);
- DataSubject dataSubject = dataSubjectService.getOneDataSubject(subjectId);
- if (null == dataSubject) {
- throw new ServerException("id 为 " + subjectId + " 数据标准不存在 ");
- }
- DataRules dataRules = dataRulesService.getDataRule(dataSubject.getId());
- if (null == dataRules) {
- throw new ServerException("id 为 " + subjectId + " 数据规则不存在 ");
- }
- JSONObject ruleConfig = JSONObject.parseObject(dataRules.getRuleConfig());
- String inspectionType = dataRules.getInspectionType();
- StringBuilder sql = new StringBuilder("select * from (" + view.getSql() + " ) v where 1 =1 ");
- System.out.println("☆☆☆☆☆☆☆☆☆☆☆" + sql.toString());
- List<Map<String, Object>> result = sqlUtils.query4List(sql.toString(), -1);
- // 1. 【完整性】
- if (dataRules.getRuleType().equalsIgnoreCase("not_null")) {
- // 非空
- sql.append(" and ");
- sql.append("v." + fieldName + " is not null ");
- }
- // 2. 【一致性】
- if (dataRules.getRuleType().equalsIgnoreCase("range")) {
- // 值域
- sql.append(" and ");
- sql.append("v." + fieldName + " > " + ruleConfig.get("from"));
- sql.append("v." + fieldName + " < " + ruleConfig.get("to"));
- }
- if (dataRules.getRuleType().equalsIgnoreCase("length")) {
- // 长度
- sql.append(" and len(v.");
- sql.append(fieldName + ") < " + ruleConfig.get("length"));
- }
- if (dataRules.getRuleType().equalsIgnoreCase("date_format")) {
- // 日期格式
- sql.append(" and ");
- sql.append(fieldName + " is not null ");
- }
- // 3. 【准确性】
- if (dataRules.getRuleType().equalsIgnoreCase("repeat_data")) {
- // 重复数据
- sql.append("select "+ fieldName +" from (" + view.getSql() + ") GROUP BY "+ fieldName +" HAVING Count(*)> 1");
- }
- // 4. 【规范性】
- if (dataRules.getRuleType().equalsIgnoreCase("null_data")) {
- // 日期格式
- sql.append(" and ");
- sql.append(fieldName + " is '' ");
- }
- System.err.println(">>>> 组装的sql为:" + sql.toString());
- // 符合条件的
- List<Map<String, Object>> newResult = sqlUtils.query4List(sql.toString(), -1);
- // 计算
- if (result == null || newResult == null) {
- throw new ServerException("稽核数据不存在;sql:" + sql);
- }
- if (result.size() == 0) {
- throw new ServerException("稽核数据不存在;sql:" + sql);
- }
- int correct = newResult.size(); // 符合条件
- int error = result.size() - correct;
- if (inspectionType.equalsIgnoreCase("integrity")) {
- // 完整性
- qualityAuditor.setIntegrityCorrect(correct);
- qualityAuditor.setIntegrityError(error);
- }
- if (inspectionType.equalsIgnoreCase("uniformity")) {
- // 一致性
- qualityAuditor.setUniformityCorrect(correct);
- qualityAuditor.setUniformityError(error);
- }
- if (inspectionType.equalsIgnoreCase("normative")) {
- // 规范性
- qualityAuditor.setNormativeCorrect(correct);
- qualityAuditor.setNormativeError(error);
- }
- if (inspectionType.equalsIgnoreCase("accuracy")) {
- // 准确性
- qualityAuditor.setAccuracyCorrect(correct);
- qualityAuditor.setAccuracyError(error);
- }
- }
- qualityAuditorMapper.insert(qualityAuditor);
- }
- private Source getSource(Long id) {
- Source source = sourceMapper.getById(id);
- if (null == source) {
- log.error("Source({}) not found", id);
- throw new NotFoundException("Source is not found");
- }
- return source;
- }
- }
|