QualityTaskServiceImpl.java 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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 QualityTask getQualityTaskByCronJobId(Long cronJobId) {
  64. QualityTask qualityTask = qualityTaskMapper.getQualityTaskByCronJobId(cronJobId);
  65. return qualityTask;
  66. }
  67. @Override
  68. public List<QualityTask> getQualityTaskListByViewId(Long viewId) {
  69. return qualityTaskMapper.getQualityTaskListByViewId(viewId);
  70. }
  71. @Override
  72. public List<QualityTaskDto> getQualityTaskListCondition(Long PId, String time) {
  73. return qualityTaskMapper.getQualityTaskListCondition(PId, time);
  74. }
  75. @Override
  76. public void updateQualityTask(QualityTask qualityTask) {
  77. qualityTaskMapper.update(qualityTask);
  78. }
  79. @Override
  80. public void deleteQualityTask(Long id) {
  81. qualityTaskMapper.deleteById(id);
  82. }
  83. @Override
  84. public void auditor(Long id) throws ServerException {
  85. QualityTask qualityTask = qualityTaskMapper.getQualityTask(id);
  86. if (null == qualityTask) {
  87. throw new ServerException("id 为 " + id + "质量任务不存在");
  88. }
  89. String tableName = qualityTask.getMetadataName();
  90. Long viewId = qualityTask.getViewId();
  91. View view = viewMapper.getById(viewId);
  92. String metadataConfig = qualityTask.getMetadataConfig();
  93. JSONArray jsonArray = JSONObject.parseArray(metadataConfig);
  94. // 稽核
  95. QualityAuditor qualityAuditor = new QualityAuditor();
  96. qualityAuditor.setAuditorTime(new Date());
  97. qualityAuditor.setTaskId(qualityTask.getId());
  98. qualityAuditor.setViewId(viewId);
  99. // 遍历JSONArray
  100. for (Iterator<Object> iterator = jsonArray.iterator(); iterator.hasNext(); ) {
  101. JSONObject next = (JSONObject) iterator.next();
  102. Long subjectId = next.getLong("subjectId");
  103. String fieldName = next.getString("fieldName");
  104. Source source = getSource(view.getSourceId());
  105. SqlUtils sqlUtils = this.sqlUtils.init(source);
  106. DataSubject dataSubject = dataSubjectService.getOneDataSubject(subjectId);
  107. if (null == dataSubject) {
  108. throw new ServerException("id 为 " + subjectId + " 数据标准不存在 ");
  109. }
  110. List<DataRules> dataRulesList = dataRulesService.getDataRulesListBySubjectId(dataSubject.getId());
  111. if (null == dataRulesList || dataRulesList.size() == 0) {
  112. throw new ServerException("id 为 " + subjectId + " 数据规则不存在 ");
  113. }
  114. //
  115. for(DataRules dataRules : dataRulesList){
  116. JSONObject ruleConfig = JSONObject.parseObject(dataRules.getRuleConfig());
  117. String inspectionType = dataRules.getInspectionType();
  118. String viewSql = view.getSql();
  119. if(viewSql.contains(";")){
  120. viewSql = viewSql.replace(";","");
  121. }
  122. StringBuilder sql = new StringBuilder("select * from (" + viewSql + " ) v where 1 =1 ");
  123. System.out.println("☆☆☆☆☆☆☆☆☆☆☆" + sql.toString());
  124. List<Map<String, Object>> result = sqlUtils.query4List(sql.toString(), -1);
  125. // 1. 【完整性】
  126. if (dataRules.getRuleType().equalsIgnoreCase("not_null")) {
  127. // 非空
  128. sql.append(" and ");
  129. sql.append("v." + fieldName + " is not null ");
  130. }
  131. // 2. 【一致性】
  132. if (dataRules.getRuleType().equalsIgnoreCase("range")) {
  133. // 值域
  134. sql.append(" and ");
  135. sql.append("v." + fieldName + " > " + ruleConfig.get("from"));
  136. sql.append(" and ");
  137. sql.append("v." + fieldName + " < " + ruleConfig.get("to"));
  138. }
  139. if (dataRules.getRuleType().equalsIgnoreCase("length")) {
  140. // 长度
  141. sql.append(" and len(v.");
  142. sql.append(fieldName + ") < " + ruleConfig.get("length"));
  143. }
  144. if (dataRules.getRuleType().equalsIgnoreCase("date_format")) {
  145. // 日期格式
  146. sql.append(" and ");
  147. sql.append(fieldName + " is not null ");
  148. }
  149. // 3. 【准确性】
  150. if (dataRules.getRuleType().equalsIgnoreCase("repeat_data")) {
  151. // 重复数据
  152. sql.append(" in ( ");
  153. sql.append("select "+ fieldName +" from (" + view.getSql() + ") k GROUP BY "+ fieldName +" HAVING Count(*)> 1");
  154. sql.append(" ) ");
  155. }
  156. // 4. 【规范性】
  157. if (dataRules.getRuleType().equalsIgnoreCase("null_data")) {
  158. sql.append(" and ");
  159. // 空字符串判断 LENGTH(trim(a))=0
  160. sql.append(" LENGTH(trim("+fieldName+")) !=0 ");
  161. }
  162. System.err.println(">>>> 组装的sql为:" + sql.toString());
  163. // 符合条件的
  164. List<Map<String, Object>> newResult = sqlUtils.query4List(sql.toString(), -1);
  165. // 计算
  166. if (result == null || newResult == null) {
  167. throw new ServerException("稽核数据不存在;sql:" + sql);
  168. }
  169. if (result.size() == 0) {
  170. throw new ServerException("稽核数据不存在;sql:" + sql);
  171. }
  172. Integer correct = newResult.size(); // 符合条件
  173. Integer error = result.size() - correct;
  174. if (inspectionType.equalsIgnoreCase("integrity")) {
  175. // 完整性
  176. qualityAuditor.setIntegrityCorrect(qualityAuditor.getIntegrityCorrect() + correct);
  177. qualityAuditor.setIntegrityError(qualityAuditor.getIntegrityError()+error);
  178. }
  179. if (inspectionType.equalsIgnoreCase("uniformity")) {
  180. // 一致性
  181. qualityAuditor.setUniformityCorrect(qualityAuditor.getUniformityCorrect()+ correct);
  182. qualityAuditor.setUniformityError(qualityAuditor.getUniformityError()+error);
  183. }
  184. if (inspectionType.equalsIgnoreCase("normative")) {
  185. // 规范性
  186. qualityAuditor.setNormativeCorrect(qualityAuditor.getNormativeCorrect()+ correct);
  187. qualityAuditor.setNormativeError(qualityAuditor.getNormativeError()+ error);
  188. }
  189. if (inspectionType.equalsIgnoreCase("accuracy")) {
  190. // 准确性
  191. qualityAuditor.setAccuracyCorrect(qualityAuditor.getAccuracyCorrect()+ correct);
  192. qualityAuditor.setAccuracyError(qualityAuditor.getAccuracyError() +error);
  193. }
  194. }
  195. }
  196. qualityAuditorMapper.insert(qualityAuditor);
  197. }
  198. private Source getSource(Long id) {
  199. Source source = sourceMapper.getById(id);
  200. if (null == source) {
  201. log.error("Source({}) not found", id);
  202. throw new NotFoundException("Source is not found");
  203. }
  204. return source;
  205. }
  206. }