QualityTaskServiceImpl.java 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  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. System.out.println("☆☆☆☆☆☆☆☆☆☆☆" + sql.toString());
  113. List<Map<String, Object>> result = sqlUtils.query4List(sql.toString(), -1);
  114. // 1. 【完整性】
  115. if (dataRules.getRuleType().equalsIgnoreCase("not_null")) {
  116. // 非空
  117. sql.append(" and ");
  118. sql.append("v." + fieldName + " is not null ");
  119. }
  120. // 2. 【一致性】
  121. if (dataRules.getRuleType().equalsIgnoreCase("range")) {
  122. // 值域
  123. sql.append(" and ");
  124. sql.append("v." + fieldName + " > " + ruleConfig.get("from"));
  125. sql.append("v." + fieldName + " < " + ruleConfig.get("to"));
  126. }
  127. if (dataRules.getRuleType().equalsIgnoreCase("length")) {
  128. // 长度
  129. sql.append(" and len(v.");
  130. sql.append(fieldName + ") < " + ruleConfig.get("length"));
  131. }
  132. if (dataRules.getRuleType().equalsIgnoreCase("date_format")) {
  133. // 日期格式
  134. sql.append(" and ");
  135. sql.append(fieldName + " is not null ");
  136. }
  137. // 3. 【准确性】
  138. if (dataRules.getRuleType().equalsIgnoreCase("repeat_data")) {
  139. // 重复数据
  140. sql.append("select "+ fieldName +" from (" + view.getSql() + ") GROUP BY "+ fieldName +" HAVING Count(*)> 1");
  141. }
  142. // 4. 【规范性】
  143. if (dataRules.getRuleType().equalsIgnoreCase("null_data")) {
  144. // 日期格式
  145. sql.append(" and ");
  146. sql.append(fieldName + " is '' ");
  147. }
  148. System.err.println(">>>> 组装的sql为:" + sql.toString());
  149. // 符合条件的
  150. List<Map<String, Object>> newResult = sqlUtils.query4List(sql.toString(), -1);
  151. // 计算
  152. if (result == null || newResult == null) {
  153. throw new ServerException("稽核数据不存在;sql:" + sql);
  154. }
  155. if (result.size() == 0) {
  156. throw new ServerException("稽核数据不存在;sql:" + sql);
  157. }
  158. int correct = newResult.size(); // 符合条件
  159. int error = result.size() - correct;
  160. if (inspectionType.equalsIgnoreCase("integrity")) {
  161. // 完整性
  162. qualityAuditor.setIntegrityCorrect(correct);
  163. qualityAuditor.setIntegrityError(error);
  164. }
  165. if (inspectionType.equalsIgnoreCase("uniformity")) {
  166. // 一致性
  167. qualityAuditor.setUniformityCorrect(correct);
  168. qualityAuditor.setUniformityError(error);
  169. }
  170. if (inspectionType.equalsIgnoreCase("normative")) {
  171. // 规范性
  172. qualityAuditor.setNormativeCorrect(correct);
  173. qualityAuditor.setNormativeError(error);
  174. }
  175. if (inspectionType.equalsIgnoreCase("accuracy")) {
  176. // 准确性
  177. qualityAuditor.setAccuracyCorrect(correct);
  178. qualityAuditor.setAccuracyError(error);
  179. }
  180. }
  181. qualityAuditorMapper.insert(qualityAuditor);
  182. }
  183. private Source getSource(Long id) {
  184. Source source = sourceMapper.getById(id);
  185. if (null == source) {
  186. log.error("Source({}) not found", id);
  187. throw new NotFoundException("Source is not found");
  188. }
  189. return source;
  190. }
  191. }