QualityTaskServiceImpl.java 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. package edp.davinci.service.impl;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import edp.core.exception.NotFoundException;
  5. import edp.core.exception.ServerException;
  6. import edp.core.utils.SqlUtils;
  7. import edp.davinci.core.enums.LogNameEnum;
  8. import edp.davinci.dao.QualityAuditorMapper;
  9. import edp.davinci.dao.QualityTaskMapper;
  10. import edp.davinci.dao.SourceMapper;
  11. import edp.davinci.dao.ViewMapper;
  12. import edp.davinci.dto.qualityAuditor.QualityTaskDto;
  13. import edp.davinci.model.*;
  14. import edp.davinci.service.DataRulesService;
  15. import edp.davinci.service.DataSubjectService;
  16. import edp.davinci.service.QualityAuditorService;
  17. import edp.davinci.service.QualityTaskService;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.slf4j.Logger;
  20. import org.slf4j.LoggerFactory;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.stereotype.Service;
  23. import java.util.Date;
  24. import java.util.Iterator;
  25. import java.util.List;
  26. import java.util.Map;
  27. @Slf4j
  28. @Service("qualityTaskService")
  29. public class QualityTaskServiceImpl implements QualityTaskService {
  30. private static final Logger optLogger = LoggerFactory.getLogger(LogNameEnum.BUSINESS_OPERATION.getName());
  31. @Autowired
  32. private QualityTaskMapper qualityTaskMapper;
  33. @Autowired
  34. private ViewMapper viewMapper;
  35. @Autowired
  36. private SourceMapper sourceMapper;
  37. @Autowired
  38. private DataSubjectService dataSubjectService;
  39. @Autowired
  40. private DataRulesService dataRulesService;
  41. @Autowired
  42. private QualityAuditorMapper qualityAuditorMapper;
  43. @Autowired
  44. private SqlUtils sqlUtils;
  45. @Override
  46. public List<QualityTask> getQualityTask() {
  47. return qualityTaskMapper.getQualityTaskList();
  48. }
  49. @Override
  50. public List<QualityTask> getQualityTaskByPid(Long id) {
  51. return qualityTaskMapper.getQualityTaskListByPid(id);
  52. }
  53. @Override
  54. public QualityTask createQualityTask(QualityTask qualityTask) {
  55. qualityTaskMapper.insert(qualityTask);
  56. return qualityTask;
  57. }
  58. public QualityTask getQualityTask(Long id) {
  59. QualityTask qualityTask = qualityTaskMapper.getQualityTask(id);
  60. return qualityTask;
  61. }
  62. @Override
  63. public List<QualityTask> getQualityTaskListByViewId(Long viewId) {
  64. return qualityTaskMapper.getQualityTaskListByViewId(viewId);
  65. }
  66. @Override
  67. public List<QualityTaskDto> getQualityTaskListCondition(Long PId, String time) {
  68. return qualityTaskMapper.getQualityTaskListCondition(PId, time);
  69. }
  70. @Override
  71. public void updateQualityTask(QualityTask qualityTask) {
  72. qualityTaskMapper.update(qualityTask);
  73. }
  74. @Override
  75. public void deleteQualityTask(Long id) {
  76. qualityTaskMapper.deleteById(id);
  77. }
  78. @Override
  79. public void auditor(Long id) throws ServerException {
  80. QualityTask qualityTask = qualityTaskMapper.getQualityTask(id);
  81. if (null == qualityTask) {
  82. throw new ServerException("id 为 " + id + "质量任务不存在");
  83. }
  84. String tableName = qualityTask.getMetadataName();
  85. Long viewId = qualityTask.getViewId();
  86. View view = viewMapper.getById(viewId);
  87. String metadataConfig = qualityTask.getMetadataConfig();
  88. JSONArray jsonArray = JSONObject.parseArray(metadataConfig);
  89. // 稽核
  90. QualityAuditor qualityAuditor = new QualityAuditor();
  91. qualityAuditor.setAuditorTime(new Date());
  92. qualityAuditor.setTaskId(qualityTask.getId());
  93. qualityAuditor.setViewId(viewId);
  94. // 遍历JSONArray
  95. for (Iterator<Object> iterator = jsonArray.iterator(); iterator.hasNext(); ) {
  96. JSONObject next = (JSONObject) iterator.next();
  97. Long subjectId = next.getLong("subjectId");
  98. String fieldName = next.getString("fieldName");
  99. Source source = getSource(view.getSourceId());
  100. SqlUtils sqlUtils = this.sqlUtils.init(source);
  101. DataSubject dataSubject = dataSubjectService.getOneDataSubject(subjectId);
  102. if (null == dataSubject) {
  103. throw new ServerException("id 为 " + subjectId + " 数据标准不存在 ");
  104. }
  105. DataRules dataRules = dataRulesService.getDataRule(dataSubject.getId());
  106. if (null == dataRules) {
  107. throw new ServerException("id 为 " + subjectId + " 数据规则不存在 ");
  108. }
  109. JSONObject ruleConfig = JSONObject.parseObject(dataRules.getRuleConfig());
  110. String inspectionType = dataRules.getInspectionType();
  111. StringBuilder sql = new StringBuilder("select * from (" + view.getSql() + " ) v where 1 =1 ");
  112. List<Map<String, Object>> result = sqlUtils.query4List(sql.toString(), -1);
  113. // 1. 【完整性】
  114. if (dataRules.getRuleType().equalsIgnoreCase("not_null")) {
  115. // 非空
  116. sql.append(" and ");
  117. sql.append("v." + fieldName + " is not null ");
  118. }
  119. // 2. 【一致性】
  120. if (dataRules.getRuleType().equalsIgnoreCase("range")) {
  121. // 值域
  122. sql.append(" and ");
  123. sql.append("v." + fieldName + " > " + ruleConfig.get("from"));
  124. sql.append("v." + fieldName + " < " + ruleConfig.get("to"));
  125. }
  126. if (dataRules.getRuleType().equalsIgnoreCase("length")) {
  127. // 长度
  128. sql.append(" and len(v.");
  129. sql.append(fieldName + ") < " + ruleConfig.get("length"));
  130. }
  131. if (dataRules.getRuleType().equalsIgnoreCase("date_format")) {
  132. // 日期格式
  133. sql.append(" and ");
  134. sql.append(fieldName + " is not null ");
  135. }
  136. // 3. 【准确性】
  137. if (dataRules.getRuleType().equalsIgnoreCase("repeat_data")) {
  138. // 重复数据
  139. sql.append("select "+ fieldName +" from (" + view.getSql() + ") GROUP BY "+ fieldName +" HAVING Count(*)> 1");
  140. }
  141. // 4. 【规范性】
  142. if (dataRules.getRuleType().equalsIgnoreCase("null_data")) {
  143. // 日期格式
  144. sql.append(" and ");
  145. sql.append(fieldName + " is null ");
  146. }
  147. // 符合条件的
  148. List<Map<String, Object>> newResult = sqlUtils.query4List(sql.toString(), -1);
  149. // 计算
  150. if (result == null || newResult == null) {
  151. throw new ServerException("稽核数据不存在;sql:" + sql);
  152. }
  153. if (result.size() == 0) {
  154. throw new ServerException("稽核数据不存在;sql:" + sql);
  155. }
  156. int correct = newResult.size(); // 符合条件
  157. int error = result.size() - correct;
  158. if (inspectionType.equalsIgnoreCase("integrity")) {
  159. // 完整性
  160. qualityAuditor.setIntegrityCorrect(correct);
  161. qualityAuditor.setIntegrityError(error);
  162. }
  163. if (inspectionType.equalsIgnoreCase("uniformity")) {
  164. // 一致性
  165. qualityAuditor.setUniformityCorrect(correct);
  166. qualityAuditor.setUniformityError(error);
  167. }
  168. if (inspectionType.equalsIgnoreCase("normative")) {
  169. // 规范性
  170. qualityAuditor.setNormativeCorrect(correct);
  171. qualityAuditor.setNormativeError(error);
  172. }
  173. if (inspectionType.equalsIgnoreCase("accuracy")) {
  174. // 准确性
  175. qualityAuditor.setAccuracyCorrect(correct);
  176. qualityAuditor.setAccuracyError(error);
  177. }
  178. }
  179. qualityAuditorMapper.insert(qualityAuditor);
  180. }
  181. private Source getSource(Long id) {
  182. Source source = sourceMapper.getById(id);
  183. if (null == source) {
  184. log.error("Source({}) not found", id);
  185. throw new NotFoundException("Source is not found");
  186. }
  187. return source;
  188. }
  189. }