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 getQualityTask() { return qualityTaskMapper.getQualityTaskList(); } @Override public List 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 getQualityTaskListByViewId(Long viewId) { return qualityTaskMapper.getQualityTaskListByViewId(viewId); } @Override public List 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 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 "); List> 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 null "); } // 符合条件的 List> 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; } }