SmartDataTaskServiceImpl.java 51 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000
  1. package com.template.services.impl;
  2. import com.alibaba.fastjson2.JSONArray;
  3. import com.alibaba.fastjson2.JSONObject;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.baomidou.mybatisplus.core.metadata.IPage;
  6. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  7. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8. import com.template.common.utils.CommonUtil;
  9. import com.template.common.utils.DBUtil;
  10. import com.template.common.utils.QuartzJobUtils;
  11. import com.template.mapper.SmartDataSourceMapper;
  12. import com.template.mapper.SmartDataTaskMapper;
  13. import com.template.model.pojo.SmartDataSourceJobParams;
  14. import com.template.model.pojo.SmartDataTask;
  15. import com.template.model.pojo.SmartDepartment;
  16. import com.template.model.result.PageUtils;
  17. import com.template.services.SmartDataTaskService;
  18. import org.quartz.CronExpression;
  19. import org.quartz.Scheduler;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.stereotype.Service;
  22. import org.springframework.util.StringUtils;
  23. import java.sql.Connection;
  24. import java.sql.PreparedStatement;
  25. import java.sql.ResultSet;
  26. import java.sql.SQLException;
  27. import java.time.LocalDateTime;
  28. import java.time.format.DateTimeFormatter;
  29. import java.time.format.DateTimeParseException;
  30. import java.util.ArrayList;
  31. import java.util.HashMap;
  32. import java.util.List;
  33. import java.util.Map;
  34. import java.util.regex.Matcher;
  35. import java.util.regex.Pattern;
  36. /**
  37. * <p>
  38. * 数据源任务 服务实现类
  39. * </p>
  40. *
  41. * @author ceshi
  42. * @since 2023-12-05
  43. */
  44. @Service
  45. public class SmartDataTaskServiceImpl extends ServiceImpl<SmartDataTaskMapper, SmartDataTask> implements SmartDataTaskService {
  46. @Autowired
  47. private SmartDataTaskMapper smartDataTaskMapper;
  48. @Autowired
  49. private SmartDataSourceMapper smartDataSourceMapper;
  50. @Autowired
  51. private Scheduler scheduler;
  52. // 添加任务1-任务基本信息
  53. @Override
  54. public Map<String, Object> insertSmartDataTask1(SmartDataTask smartDataTask) {
  55. // 检测参数,还有是否存在重复记录
  56. // 任务属性
  57. if (smartDataTask.getTkName() == null) {
  58. return CommonUtil.getReturnMap("1", "【任务名称】不能为空!");
  59. }
  60. // 只能包含字母、数字、下划线和中文,且长度为5-32位
  61. if (!CommonUtil.checkStrByRegx("^[\\w\\u4e00-\\u9fa5]{4,32}$", smartDataTask.getTkName())) {
  62. return CommonUtil.getReturnMap("1", "【任务名称】只能包含字母、数字、下划线和中文,且长度为4-32位!");
  63. }
  64. QueryWrapper<SmartDataTask> queryWrapper = new QueryWrapper<>();
  65. queryWrapper.eq(smartDataTask.getTkName() != null, "tk_name", smartDataTask.getTkName());
  66. SmartDataTask sdt = smartDataTaskMapper.selectOne(queryWrapper);
  67. if (sdt != null) {
  68. return CommonUtil.getReturnMap("1", "任务名有重名!");
  69. }
  70. if (smartDataTask.getTkDtId() == null) {
  71. return CommonUtil.getReturnMap("1", "【部门id】不能为空!");
  72. }
  73. int numOfDepartment = smartDataTaskMapper.isHaveDepartmentById(smartDataTask.getTkDtId());
  74. if (numOfDepartment == 0) {
  75. return CommonUtil.getReturnMap("1", "【部门】不存在!");
  76. }
  77. if (smartDataTask.getTkSyncPolicy() == null) {
  78. return CommonUtil.getReturnMap("1", "【同步策略】不能为空!");
  79. }
  80. // 来源库设置
  81. if (smartDataTask.getTkDsIdSource() == null) {
  82. return CommonUtil.getReturnMap("1", "【来源数据源id】不能为空!");
  83. }
  84. SmartDataSourceJobParams dsSource = smartDataSourceMapper.getDataSourceInfo(smartDataTask.getTkDsIdSource());
  85. if (dsSource == null) {
  86. return CommonUtil.getReturnMap("1", "选择的【来源数据源】不存在!");
  87. }
  88. if (smartDataTask.getTkExchangeType() == null) {
  89. return CommonUtil.getReturnMap("1", "【交换方式】不能为空!");
  90. }
  91. if (smartDataTask.getTkSql() == null) {
  92. return CommonUtil.getReturnMap("1", "【自定义SQL语句】不能为空!");
  93. }
  94. // 目的库设置
  95. if (smartDataTask.getTkDsIdDestination() == null) {
  96. return CommonUtil.getReturnMap("1", "【目标数据源id】不能为空!");
  97. }
  98. SmartDataSourceJobParams dsDestination = smartDataSourceMapper.getDataSourceInfo(smartDataTask.getTkDsIdDestination());
  99. if (dsDestination == null) {
  100. return CommonUtil.getReturnMap("1", "选择的【目标数据源】不存在!");
  101. }
  102. if (smartDataTask.getTkDestTable() == null) {
  103. return CommonUtil.getReturnMap("1", "【目标数据表】不能为空!");
  104. }
  105. // 高级设置
  106. if (smartDataTask.getTkExchangeServer() == null) {
  107. return CommonUtil.getReturnMap("1", "【交换服务器】不能为空!");
  108. }
  109. if (smartDataTask.getTkExchangeServer() == 1) {
  110. if (smartDataTask.getTkExchangeServerId() == null) {
  111. return CommonUtil.getReturnMap("1", "【指定服务器id】不能为空!");
  112. }
  113. }
  114. if (smartDataTask.getTkOptCfgAutoManual() == null) {
  115. return CommonUtil.getReturnMap("1", "【运行参数配置】不能为空!");
  116. }
  117. if (smartDataTask.getTkOptCfgAutoManual() == 1) {
  118. if (smartDataTask.getTkOptCfgRsNum() == null) {
  119. return CommonUtil.getReturnMap("1", "【运行参数配置:记录数】不能为空!");
  120. }
  121. if (smartDataTask.getTkOptCfgRsNum() > 100) {
  122. return CommonUtil.getReturnMap("1", "【运行参数配置:记录数】不能大于100!");
  123. }
  124. if (smartDataTask.getTkOptCfgThreadsNum() == null) {
  125. return CommonUtil.getReturnMap("1", "【运行参数配置:线程数】不能为空!");
  126. }
  127. if (smartDataTask.getTkOptCfgThreadsNum() > 10) {
  128. return CommonUtil.getReturnMap("1", "【运行参数配置:线程数】不能大于10!");
  129. }
  130. }
  131. if (smartDataTask.getTkRsIncorrectData() == null) {
  132. return CommonUtil.getReturnMap("1", "【是否记录错误数据】不能为空!");
  133. }
  134. if (smartDataTask.getTkDsSourceCharset() == null) {
  135. return CommonUtil.getReturnMap("1", "【来源数据源字符集】不能为空!");
  136. }
  137. if (!smartDataTask.getTkDsSourceCharset().equals("UTF8") && !smartDataTask.getTkDsSourceCharset().equals("GBK")) {
  138. return CommonUtil.getReturnMap("1", "【来源数据源字符集】只能为UTF8或GBK!");
  139. }
  140. if (smartDataTask.getTkDsDestinationCharset() == null) {
  141. return CommonUtil.getReturnMap("1", "【目标数据源字符集】不能为空!");
  142. }
  143. if (!smartDataTask.getTkDsDestinationCharset().equals("UTF8") && !smartDataTask.getTkDsDestinationCharset().equals("GBK")) {
  144. return CommonUtil.getReturnMap("1", "【目标数据源字符集】只能为UTF8或GBK!");
  145. }
  146. queryWrapper.eq(smartDataTask.getTkDtId() != null, "tk_dt_id", smartDataTask.getTkDtId());
  147. queryWrapper.eq(smartDataTask.getTkDsIdSource() != null, "tk_ds_id_source", smartDataTask.getTkDsIdSource());
  148. queryWrapper.eq(smartDataTask.getTkSyncPolicy() != null, "tk_sync_policy", smartDataTask.getTkSyncPolicy());
  149. queryWrapper.eq(smartDataTask.getTkExchangeType() != null, "tk_exchange_type", smartDataTask.getTkExchangeType());
  150. // 交换方式:0自定义SQL语句,1数据视图,2数据表,如果是1或2,tkSql传视图或表格名称即可
  151. if (smartDataTask.getTkExchangeType() == 0) {
  152. queryWrapper.eq(StringUtils.hasText(smartDataTask.getTkSql()), "tk_sql", smartDataTask.getTkSql());
  153. } else {
  154. String sql = "SELECT * FROM " + smartDataTask.getTkSql().substring(0, smartDataTask.getTkSql().indexOf("["));
  155. queryWrapper.eq(StringUtils.hasText(smartDataTask.getTkSql()), "tk_sql", sql);
  156. smartDataTask.setTkSql(sql);
  157. }
  158. queryWrapper.eq(smartDataTask.getTkDsIdDestination() != null, "tk_ds_id_destination", smartDataTask.getTkDsIdDestination());
  159. queryWrapper.eq(smartDataTask.getTkDestTable() != null, "tk_dest_table", smartDataTask.getTkDestTable());
  160. queryWrapper.eq(smartDataTask.getTkExchangeServer() != null, "tk_exchange_server", smartDataTask.getTkExchangeServer());
  161. queryWrapper.eq(smartDataTask.getTkExchangeServer() != null && smartDataTask.getTkExchangeServerId() != null, "tk_exchange_server_id", smartDataTask.getTkExchangeServerId());
  162. queryWrapper.eq(smartDataTask.getTkOptCfgAutoManual() != null, "tk_opt_cfg_auto_manual", smartDataTask.getTkOptCfgAutoManual());
  163. queryWrapper.eq(smartDataTask.getTkOptCfgAutoManual() != null && smartDataTask.getTkOptCfgRsNum() != null, "tk_opt_cfg_rs_num", smartDataTask.getTkOptCfgRsNum());
  164. queryWrapper.eq(smartDataTask.getTkOptCfgAutoManual() != null && smartDataTask.getTkOptCfgThreadsNum() != null, "tk_opt_cfg_threads_num", smartDataTask.getTkOptCfgThreadsNum());
  165. queryWrapper.eq(smartDataTask.getTkRsIncorrectData() != null, "tk_rs_incorrect_data", smartDataTask.getTkRsIncorrectData());
  166. queryWrapper.eq(smartDataTask.getTkDsSourceCharset() != null, "tk_ds_source_charset", smartDataTask.getTkDsSourceCharset());
  167. queryWrapper.eq(StringUtils.hasText(smartDataTask.getTkDsDestinationCharset()), "tk_ds_destination_charset", smartDataTask.getTkDsDestinationCharset());
  168. sdt = smartDataTaskMapper.selectOne(queryWrapper);
  169. if (sdt != null) {
  170. return CommonUtil.getReturnMap("1", "有重复记录!");
  171. }
  172. // 插入记录,插入成功后获取记录的id返回
  173. int result = smartDataTaskMapper.insert(smartDataTask);
  174. if (result > 0) {
  175. // 获取数据源对应的表、视图、Sql对应的结构
  176. return CommonUtil.getReturnMap("0", this.getMetaData(smartDataTask, dsSource, dsDestination, "添加"));
  177. } else {
  178. return CommonUtil.getReturnMap("1", "【添加任务-任务基本信息】添加失败!");
  179. }
  180. }
  181. private Map<String, Object> getMetaData(SmartDataTask smartDataTask, SmartDataSourceJobParams dsSource, SmartDataSourceJobParams dsDestination, String action) {
  182. // 源连接
  183. DBUtil dsSourceDbUtil = new DBUtil(dsSource.getDsUrl(), dsSource.getDsUser(), dsSource.getDsPassword(), dsSource.getDsClsDriver(), "UTF8");
  184. Map<String, Object> dsSourceMap = dsSourceDbUtil.getConnection();
  185. if (dsSourceMap.get("code") == "1") {
  186. return CommonUtil.getReturnMap("1", "【来源数据源】连接失败!");
  187. }
  188. Connection dsSourceConn = (Connection) dsSourceMap.get("msg");
  189. // 解析字段名称、字段类型、字段大小等
  190. Map<String, Object> metaDataBySql = dsSourceDbUtil.getMetaDataBySql(dsSourceConn, smartDataTask.getTkSql());
  191. if (metaDataBySql.get("code") == "1") {
  192. return CommonUtil.getReturnMap("1", metaDataBySql.get("msg"));
  193. }
  194. List<Map<String, String>> listSource = (List<Map<String, String>>) metaDataBySql.get("msg");
  195. // 目标连接
  196. DBUtil dbDestinationUtil = new DBUtil(dsDestination.getDsUrl(), dsDestination.getDsUser(), dsDestination.getDsPassword(), dsDestination.getDsClsDriver(), "UTF8");
  197. Map<String, Object> dsDestinationMap = dbDestinationUtil.getConnection();
  198. if (dsDestinationMap.get("code") == "1") {
  199. return CommonUtil.getReturnMap("1", "【目标数据源】连接失败!");
  200. }
  201. Connection dsDestinationConn = (Connection) dsDestinationMap.get("msg");
  202. // 目标数据表
  203. Map<String, Object> metaDataByTable = dbDestinationUtil.getMetaDataByTable(dsDestinationConn, smartDataTask.getTkDestTable().substring(0, smartDataTask.getTkDestTable().indexOf("[")));
  204. if (metaDataByTable.get("code") == "1") {
  205. return CommonUtil.getReturnMap("1", metaDataByTable.get("msg"));
  206. }
  207. List<Map<String, String>> listDestination = (List<Map<String, String>>) metaDataByTable.get("msg");
  208. // 组合返回数据
  209. Map<String, Object> returnMap = new HashMap<>();
  210. returnMap.put("tkId", smartDataTask.getTkId());
  211. returnMap.put("msg", "【" + action + "任务-任务基本信息】" + action + "成功!");
  212. returnMap.put("dsSourceMetaData", listSource);
  213. returnMap.put("dsDestinationMetaData", listDestination);
  214. return returnMap;
  215. }
  216. // 添加任务2-字段配置
  217. @Override
  218. public Map<String, Object> insertSmartDataTask2(JSONObject requestData) {
  219. return this.insertOrUpdate2(requestData, "添加");
  220. }
  221. private Map<String, Object> insertOrUpdate2(JSONObject requestData, String action) {
  222. // 任务ID
  223. if (requestData.containsKey("tkId")) {
  224. // tkId 存在
  225. int tkId = requestData.getIntValue("tkId");
  226. if (tkId <= 0) {
  227. return CommonUtil.getReturnMap("1", "任务id错误!");
  228. }
  229. // 字段对应关系
  230. if (requestData.containsKey("colRelationship")) {
  231. JSONArray colRelationshipArray = requestData.getJSONArray("colRelationship");
  232. if (colRelationshipArray.size() > 0) {
  233. String colRelationship = colRelationshipArray.toString();
  234. // 检测是否有修改
  235. if (action.equals("编辑")) {
  236. SmartDataTask smartDataTask = smartDataTaskMapper.selectColRelationship(tkId);
  237. if (JSONArray.parseArray(smartDataTask.getTkColRelationship()).equals(colRelationshipArray)) {
  238. return CommonUtil.getReturnMap("1", "数据未修改,请修改后再提交!");
  239. }
  240. }
  241. // 检测数据类型和字段长度是否符合要求
  242. for (int i = 0; i < colRelationshipArray.size(); i++) {
  243. JSONObject colRelationshipObj = colRelationshipArray.getJSONObject(i);
  244. String colSource = colRelationshipObj.getString("colSource");
  245. String colSourceType = colRelationshipObj.getString("colSourceType");
  246. Integer colSourceSize = colRelationshipObj.getInteger("colSourceSize");
  247. String colDestination = colRelationshipObj.getString("colDestination");
  248. String colDestinationType = colRelationshipObj.getString("colDestinationType");
  249. Integer colDestinationSize = colRelationshipObj.getInteger("colDestinationSize");
  250. // 判断字段类型是否一致
  251. if (!colSourceType.equals(colDestinationType)) {
  252. return CommonUtil.getReturnMap("1", "来源字段类型【" + colSource + "】与 目标字段类型【" + colDestination + "】不一致!");
  253. }
  254. // 判断目标字段长度是否小于来源字段长度
  255. if (colSourceSize > colDestinationSize) {
  256. return CommonUtil.getReturnMap("1", "目标字段长度【" + colSource + "】小于 来源字段长度【" + colDestination + "】!");
  257. }
  258. }
  259. // 存数据库中
  260. int num = smartDataTaskMapper.insertColRelationship(tkId, colRelationship);
  261. if (num > 0) {
  262. return CommonUtil.getReturnMap("0", "【" + action + "任务-字段配置】" + action + "成功!");
  263. } else {
  264. return CommonUtil.getReturnMap("1", "【" + action + "任务-字段配置】" + action + "失败!");
  265. }
  266. } else {
  267. return CommonUtil.getReturnMap("1", "字段对应关系为空!");
  268. }
  269. } else {
  270. return CommonUtil.getReturnMap("1", "字段对应关系为空!");
  271. }
  272. } else {
  273. // tkId 不存在
  274. return CommonUtil.getReturnMap("1", "任务ID为空!");
  275. }
  276. }
  277. // 添加任务3-定时信息
  278. @Override
  279. public Map<String, Object> insertSmartDataTask3(SmartDataTask smartDataTask) {
  280. return this.insertOrUpdate3(smartDataTask, "添加");
  281. }
  282. private Map<String, Object> insertOrUpdate3(SmartDataTask smartDataTask, String action) {
  283. if (smartDataTask.getTkManualOrAuto() == null) {
  284. return CommonUtil.getReturnMap("1", "【手动或定时执行】不能为空!");
  285. }
  286. if (smartDataTask.getTkManualOrAuto() == 0) {
  287. if (smartDataTask.getTkExeType() == null) {
  288. return CommonUtil.getReturnMap("1", "【执行方式】不能为空!");
  289. }
  290. if (smartDataTask.getTkRepetTime() == null) {
  291. return CommonUtil.getReturnMap("1", "【重复时间】不能为空!");
  292. }
  293. // 生成cron表达式
  294. Map<String, Object> stringObjectMap = generateCron(smartDataTask.getTkExeType(), smartDataTask.getTkRepetTime());
  295. if (stringObjectMap.get("code") == "1") {
  296. return stringObjectMap;
  297. }
  298. String cron = (String) stringObjectMap.get("msg");
  299. if (CronExpression.isValidExpression(cron)) {
  300. smartDataTask.setTkCron(cron);
  301. } else {
  302. return CommonUtil.getReturnMap("1", "生成的【定时表达式】不正确!请联系管理员!" + cron);
  303. }
  304. } else {
  305. smartDataTask.setTkCron("");
  306. smartDataTask.setTkExeType(-1);
  307. smartDataTask.setTkRepetTime("");
  308. }
  309. // 检测是否有重复记录
  310. if (action.equals("编辑")) {
  311. int numSDT = smartDataTaskMapper.isRepeatTask(smartDataTask);
  312. if (numSDT > 0) {
  313. return CommonUtil.getReturnMap("1", "数据未修改,请修改后再提交!");
  314. }
  315. }
  316. // 入库
  317. int num = smartDataTaskMapper.updateById(smartDataTask);
  318. if (num > 0) {
  319. return CommonUtil.getReturnMap("0", "【" + action + "任务-定时信息】" + action + "成功!");
  320. } else {
  321. return CommonUtil.getReturnMap("1", "【" + action + "任务-定时信息】" + action + "失败!");
  322. }
  323. }
  324. // 生成cron表达式
  325. private Map<String, Object> generateCron(Integer exeType, String repetTime) {
  326. if (exeType == 0) {
  327. if (repetTime.endsWith("天")) {
  328. String n = CommonUtil.getNumberFromString(repetTime);
  329. if (n != null) {
  330. return CommonUtil.getReturnMap("0", "0 0 0 1/" + n + " * ?");
  331. } else {
  332. return CommonUtil.getReturnMap("1", "【重复时间】格式错误,要求:x天");
  333. }
  334. } else if (repetTime.endsWith("小时")) {
  335. String n = CommonUtil.getNumberFromString(repetTime);
  336. if (n != null) {
  337. return CommonUtil.getReturnMap("0", "0 0 0/" + n + " * * ?");
  338. } else {
  339. return CommonUtil.getReturnMap("1", "【重复时间】格式错误,要求:x小时");
  340. }
  341. } else if (repetTime.endsWith("分钟")) {
  342. String n = CommonUtil.getNumberFromString(repetTime);
  343. if (n != null) {
  344. return CommonUtil.getReturnMap("0", "0 0/" + n + " * * * ?");
  345. } else {
  346. return CommonUtil.getReturnMap("1", "【重复时间】格式错误,要求:x分钟");
  347. }
  348. } else {
  349. return CommonUtil.getReturnMap("1", "【重复时间】格式错误,要求:x天 或者 x小时 或者 x分钟");
  350. }
  351. } else if (exeType == 1) {
  352. // 检查是否是格式:2023-12-19 09:40
  353. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
  354. try {
  355. LocalDateTime dateTime = LocalDateTime.parse(repetTime, formatter);
  356. int year = dateTime.getYear();
  357. int month = dateTime.getMonthValue();
  358. int day = dateTime.getDayOfMonth();
  359. int hour = dateTime.getHour();
  360. int minute = dateTime.getMinute();
  361. return CommonUtil.getReturnMap("0", String.format("0 %d %d %d %d ? %d", minute, hour, day, month, year));
  362. } catch (DateTimeParseException e) {
  363. return CommonUtil.getReturnMap("1", "【重复时间】格式错误,要求:2023-12-19 09:40");
  364. }
  365. } else if (exeType == 2) {
  366. // 检查是否是格式:09:40
  367. if (isOnlyHourAndMinute(repetTime)) {
  368. String[] split = repetTime.split(":");
  369. int hour = Integer.parseInt(split[0]);
  370. int minute = Integer.parseInt(split[1]);
  371. return CommonUtil.getReturnMap("0", String.format("0 %d %d 1/1 * ?", minute, hour));
  372. } else {
  373. return CommonUtil.getReturnMap("1", "【重复时间】格式错误,要求:09:40");
  374. }
  375. } else if (exeType == 3) {
  376. // 检查是否是格式:周日 09:40
  377. String[] split = repetTime.split(" ");
  378. if (split.length != 2) {
  379. return CommonUtil.getReturnMap("1", "【重复时间】格式错误1,要求:周日 09:40");
  380. }
  381. String weekday = ""; // MON, TUE, WED, THU, FRI, SAT, SUN
  382. if ("周一".equals(split[0])) weekday = "MON";
  383. else if ("周二".equals(split[0])) weekday = "TUE";
  384. else if ("周三".equals(split[0])) weekday = "WED";
  385. else if ("周四".equals(split[0])) weekday = "THU";
  386. else if ("周五".equals(split[0])) weekday = "FRI";
  387. else if ("周六".equals(split[0])) weekday = "SAT";
  388. else if ("周日".equals(split[0])) weekday = "SUN";
  389. else CommonUtil.getReturnMap("1", "【重复时间】格式错误2,要求:周日 09:40");
  390. if (isOnlyHourAndMinute(split[1])) {
  391. String[] hour_minute = split[1].split(":");
  392. int hour = Integer.parseInt(hour_minute[0]);
  393. int minute = Integer.parseInt(hour_minute[1]);
  394. return CommonUtil.getReturnMap("0", String.format("0 %d %d ? * %s", minute, hour, weekday));
  395. } else {
  396. return CommonUtil.getReturnMap("1", "【重复时间】格式错误3,要求:周日 09:40");
  397. }
  398. } else if (exeType == 4) {
  399. // 检查是否是格式:19 09:40
  400. String[] split = repetTime.split(" ");
  401. if (split.length != 2) {
  402. return CommonUtil.getReturnMap("1", "【重复时间】格式错误1,要求:19 09:40");
  403. }
  404. int day = Integer.parseInt(split[0]);
  405. if (day > 30 || day < 1) CommonUtil.getReturnMap("1", "【重复时间】格式错误2,要求:19 09:40");
  406. if (isOnlyHourAndMinute(split[1])) {
  407. String[] hour_minute = split[1].split(":");
  408. int hour = Integer.parseInt(hour_minute[0]);
  409. int minute = Integer.parseInt(hour_minute[1]);
  410. return CommonUtil.getReturnMap("0", String.format("0 %d %d %d * ?", minute, hour, day));
  411. } else {
  412. return CommonUtil.getReturnMap("1", "【重复时间】格式错误3,要求:19 09:40");
  413. }
  414. } else {
  415. return CommonUtil.getReturnMap("1", "【执行方式】格式错误,要求:0间隔执行,1定点执行,2每天,3每周,4每月");
  416. }
  417. }
  418. // 判断时分
  419. private boolean isOnlyHourAndMinute(String time) {
  420. String regex = "^([01]?[0-9]|2[0-3]):[0-5][0-9]$";
  421. Pattern pattern = Pattern.compile(regex);
  422. Matcher matcher = pattern.matcher(time);
  423. return matcher.matches();
  424. }
  425. @Override
  426. public Map<String, Object> updateSmartDataTaskById1(SmartDataTask smartDataTask) {
  427. if (smartDataTask.getTkId() == null) {
  428. return CommonUtil.getReturnMap("1", "【任务id】不能为空!");
  429. }
  430. // 任务属性
  431. SmartDataTask sdc = smartDataTaskMapper.selectById(smartDataTask.getTkId());
  432. if (sdc == null) {
  433. return CommonUtil.getReturnMap("1", "要修改的【任务】不存在!");
  434. }
  435. if (smartDataTask.getTkName() == null) {
  436. return CommonUtil.getReturnMap("1", "【任务名称】不能为空!");
  437. }
  438. // 只能包含字母、数字、下划线和中文,且长度为5-32位
  439. if (!CommonUtil.checkStrByRegx("^[\\w\\u4e00-\\u9fa5]{4,32}$", smartDataTask.getTkName())) {
  440. return CommonUtil.getReturnMap("1", "【任务名称】只能包含字母、数字、下划线和中文,且长度为4-32位!");
  441. }
  442. int numOfDataTask = smartDataTaskMapper.isRepeatTaskName(smartDataTask);
  443. if (numOfDataTask > 0) {
  444. return CommonUtil.getReturnMap("1", "任务名有重名!");
  445. }
  446. if (smartDataTask.getTkDtId() == null) {
  447. return CommonUtil.getReturnMap("1", "【部门id】不能为空!");
  448. }
  449. int numOfDepartment = smartDataTaskMapper.isHaveDepartmentById(smartDataTask.getTkDtId());
  450. if (numOfDepartment == 0) {
  451. return CommonUtil.getReturnMap("1", "【部门】不存在!");
  452. }
  453. if (smartDataTask.getTkSyncPolicy() == null) {
  454. return CommonUtil.getReturnMap("1", "【同步策略】不能为空!");
  455. }
  456. // 来源库设置
  457. if (smartDataTask.getTkDsIdSource() == null) {
  458. return CommonUtil.getReturnMap("1", "【来源数据源id】不能为空!");
  459. }
  460. SmartDataSourceJobParams dsSource = smartDataSourceMapper.getDataSourceInfo(smartDataTask.getTkDsIdSource());
  461. if (dsSource == null) {
  462. return CommonUtil.getReturnMap("1", "选择的【来源数据源】不存在!");
  463. }
  464. if (smartDataTask.getTkExchangeType() == null) {
  465. return CommonUtil.getReturnMap("1", "【交换方式】不能为空!");
  466. }
  467. if (smartDataTask.getTkSql() == null) {
  468. return CommonUtil.getReturnMap("1", "【自定义SQL语句】不能为空!");
  469. }
  470. // 目的库设置
  471. if (smartDataTask.getTkDsIdDestination() == null) {
  472. return CommonUtil.getReturnMap("1", "【目标数据源id】不能为空!");
  473. }
  474. SmartDataSourceJobParams dsDestination = smartDataSourceMapper.getDataSourceInfo(smartDataTask.getTkDsIdDestination());
  475. if (dsDestination == null) {
  476. return CommonUtil.getReturnMap("1", "选择的【目标数据源】不存在!");
  477. }
  478. if (smartDataTask.getTkDestTable() == null) {
  479. return CommonUtil.getReturnMap("1", "【目标数据表】不能为空!");
  480. }
  481. // 高级设置
  482. if (smartDataTask.getTkExchangeServer() == null) {
  483. return CommonUtil.getReturnMap("1", "【交换服务器】不能为空!");
  484. }
  485. if (smartDataTask.getTkExchangeServer() == 1) {
  486. if (smartDataTask.getTkExchangeServerId() == null) {
  487. return CommonUtil.getReturnMap("1", "【指定服务器id】不能为空!");
  488. }
  489. }
  490. if (smartDataTask.getTkOptCfgAutoManual() == null) {
  491. return CommonUtil.getReturnMap("1", "【运行参数配置】不能为空!");
  492. }
  493. if (smartDataTask.getTkOptCfgAutoManual() == 1) {
  494. if (smartDataTask.getTkOptCfgRsNum() == null) {
  495. return CommonUtil.getReturnMap("1", "【运行参数配置:记录数】不能为空!");
  496. }
  497. if (smartDataTask.getTkOptCfgRsNum() > 100) {
  498. return CommonUtil.getReturnMap("1", "【运行参数配置:记录数】不能大于100!");
  499. }
  500. if (smartDataTask.getTkOptCfgThreadsNum() == null) {
  501. return CommonUtil.getReturnMap("1", "【运行参数配置:线程数】不能为空!");
  502. }
  503. if (smartDataTask.getTkOptCfgThreadsNum() > 10) {
  504. return CommonUtil.getReturnMap("1", "【运行参数配置:线程数】不能大于10!");
  505. }
  506. }
  507. if (smartDataTask.getTkRsIncorrectData() == null) {
  508. return CommonUtil.getReturnMap("1", "【是否记录错误数据】不能为空!");
  509. }
  510. if (smartDataTask.getTkDsSourceCharset() == null) {
  511. return CommonUtil.getReturnMap("1", "【来源数据源字符集】不能为空!");
  512. }
  513. if (!smartDataTask.getTkDsSourceCharset().equals("UTF8") && !smartDataTask.getTkDsSourceCharset().equals("GBK")) {
  514. return CommonUtil.getReturnMap("1", "【来源数据源字符集】只能为UTF8或GBK!");
  515. }
  516. if (smartDataTask.getTkDsDestinationCharset() == null) {
  517. return CommonUtil.getReturnMap("1", "【目标数据源字符集】不能为空!");
  518. }
  519. if (!smartDataTask.getTkDsDestinationCharset().equals("UTF8") && !smartDataTask.getTkDsDestinationCharset().equals("GBK")) {
  520. return CommonUtil.getReturnMap("1", "【目标数据源字符集】只能为UTF8或GBK!");
  521. }
  522. QueryWrapper<SmartDataTask> queryWrapper = new QueryWrapper<>();
  523. queryWrapper.eq(smartDataTask.getTkName() != null, "tk_name", smartDataTask.getTkName());
  524. queryWrapper.eq(smartDataTask.getTkDtId() != null, "tk_dt_id", smartDataTask.getTkDtId());
  525. queryWrapper.eq(smartDataTask.getTkDsIdSource() != null, "tk_ds_id_source", smartDataTask.getTkDsIdSource());
  526. queryWrapper.eq(smartDataTask.getTkSyncPolicy() != null, "tk_sync_policy", smartDataTask.getTkSyncPolicy());
  527. queryWrapper.eq(smartDataTask.getTkExchangeType() != null, "tk_exchange_type", smartDataTask.getTkExchangeType());
  528. // 交换方式:0自定义SQL语句,1数据视图,2数据表,如果是1或2,tkSql传视图或表格名称即可
  529. if (smartDataTask.getTkExchangeType() == 0) {
  530. queryWrapper.eq(StringUtils.hasText(smartDataTask.getTkSql()), "tk_sql", smartDataTask.getTkSql());
  531. } else {
  532. String sql = "SELECT * FROM " + smartDataTask.getTkSql().substring(0, smartDataTask.getTkSql().indexOf("["));
  533. queryWrapper.eq(StringUtils.hasText(smartDataTask.getTkSql()), "tk_sql", sql);
  534. smartDataTask.setTkSql(sql);
  535. }
  536. queryWrapper.eq(smartDataTask.getTkDsIdDestination() != null, "tk_ds_id_destination", smartDataTask.getTkDsIdDestination());
  537. queryWrapper.eq(smartDataTask.getTkDestTable() != null, "tk_dest_table", smartDataTask.getTkDestTable());
  538. queryWrapper.eq(smartDataTask.getTkExchangeServer() != null, "tk_exchange_server", smartDataTask.getTkExchangeServer());
  539. queryWrapper.eq(smartDataTask.getTkExchangeServer() != null && smartDataTask.getTkExchangeServerId() != null, "tk_exchange_server_id", smartDataTask.getTkExchangeServerId());
  540. queryWrapper.eq(smartDataTask.getTkOptCfgAutoManual() != null, "tk_opt_cfg_auto_manual", smartDataTask.getTkOptCfgAutoManual());
  541. queryWrapper.eq(smartDataTask.getTkOptCfgAutoManual() != null && smartDataTask.getTkOptCfgRsNum() != null, "tk_opt_cfg_rs_num", smartDataTask.getTkOptCfgRsNum());
  542. queryWrapper.eq(smartDataTask.getTkOptCfgAutoManual() != null && smartDataTask.getTkOptCfgThreadsNum() != null, "tk_opt_cfg_threads_num", smartDataTask.getTkOptCfgThreadsNum());
  543. queryWrapper.eq(smartDataTask.getTkRsIncorrectData() != null, "tk_rs_incorrect_data", smartDataTask.getTkRsIncorrectData());
  544. queryWrapper.eq(smartDataTask.getTkDsSourceCharset() != null, "tk_ds_source_charset", smartDataTask.getTkDsSourceCharset());
  545. queryWrapper.eq(StringUtils.hasText(smartDataTask.getTkDsDestinationCharset()), "tk_ds_destination_charset", smartDataTask.getTkDsDestinationCharset());
  546. SmartDataTask sdt = smartDataTaskMapper.selectOne(queryWrapper);
  547. if (sdt != null) {
  548. return CommonUtil.getReturnMap("1", "数据未修改,请修改后再提交!");
  549. }
  550. int result = smartDataTaskMapper.updateById(smartDataTask);
  551. if (result > 0) {
  552. // 获取数据源对应的表、视图、Sql对应的结构
  553. Map<String, Object> returnMap = this.getMetaData(smartDataTask, dsSource, dsDestination, "编辑");
  554. if (returnMap.get("code") == null) {
  555. // 获取字段对应关系
  556. String colRelationship = smartDataTaskMapper.getColRelationship(smartDataTask);
  557. JSONArray jsonArray = JSONArray.parseArray(colRelationship);
  558. returnMap.put("colRelationship", jsonArray);
  559. }
  560. return CommonUtil.getReturnMap("0", returnMap);
  561. } else {
  562. return CommonUtil.getReturnMap("1", "【编辑任务-任务基本信息】失败!");
  563. }
  564. }
  565. @Override
  566. public Map<String, Object> updateSmartDataTaskById2(JSONObject requestData) {
  567. return this.insertOrUpdate2(requestData, "编辑");
  568. }
  569. @Override
  570. public Map<String, Object> updateSmartDataTaskById3(SmartDataTask smartDataTask) {
  571. return this.insertOrUpdate3(smartDataTask, "编辑");
  572. }
  573. // 判断之前状态是否启用
  574. public Map<String, Object> updateSmartDataTaskActivation(SmartDataTask smartDataTask) {
  575. // 检测参数,还有是否存在重复记录
  576. if (smartDataTask.getTkId() == null) {
  577. return CommonUtil.getReturnMap("1", "【任务id】不能为空!");
  578. }
  579. SmartDataTask sdc = smartDataTaskMapper.selectById(smartDataTask.getTkId());
  580. if (sdc == null) {
  581. return CommonUtil.getReturnMap("1", "要修改的【任务】不存在!");
  582. }
  583. if (smartDataTask.getTkActivation() == null) {
  584. return CommonUtil.getReturnMap("1", "【是否启用】不能为空!");
  585. }
  586. int result = smartDataTaskMapper.markTaskById(smartDataTask);
  587. if (result > 0) {
  588. return CommonUtil.getReturnMap(String.valueOf(result), "标注成功!");
  589. } else {
  590. if (smartDataTask.getTkActivation() == 1) {
  591. return CommonUtil.getReturnMap("0", "标注失败,之前已是启用状态!");
  592. } else {
  593. return CommonUtil.getReturnMap("1", "标注失败,之前已是启用状态!");
  594. }
  595. }
  596. }
  597. @Override
  598. public PageUtils<SmartDataTask> queryPageSmartDataTasks(int currentPage, int pageCount, SmartDataTask smartDataTask) {
  599. Page<SmartDataTask> page = new Page<>(currentPage, pageCount);
  600. QueryWrapper<SmartDataTask> queryWrapper = new QueryWrapper<>();
  601. queryWrapper.like(smartDataTask.getTkName() != null, "tk_name", smartDataTask.getTkName());
  602. queryWrapper.eq(smartDataTask.getTkDsIdSource() != null, "tk_ds_id_source", smartDataTask.getTkDsIdSource());
  603. queryWrapper.eq(smartDataTask.getTkDsIdDestination() != null, "tk_ds_id_destination", smartDataTask.getTkDsIdDestination());
  604. queryWrapper.eq(smartDataTask.getTkExchangeType() != null, "tk_exchange_type", smartDataTask.getTkExchangeType());
  605. queryWrapper.eq(smartDataTask.getTkExeType() != null, "tk_exe_type", smartDataTask.getTkExeType());
  606. queryWrapper.like(smartDataTask.getTkDestTable() != null, "tk_dest_table", smartDataTask.getTkDestTable());
  607. queryWrapper.eq(smartDataTask.getTkActivation() != null, "tk_activation", smartDataTask.getTkActivation());
  608. queryWrapper.orderByAsc("tk_deleted");
  609. queryWrapper.orderByDesc("tk_update_time");
  610. IPage<SmartDataTask> result = smartDataTaskMapper.selectPage(page, queryWrapper);
  611. return new PageUtils<>(result);
  612. }
  613. @Override
  614. public Map<String, Object> deleteSmartDataTaskById(int id, int delMethod) {
  615. if (delMethod == 0) {
  616. // 逻辑删除
  617. int num = smartDataTaskMapper.logicDeleteMarkTaskById(id);
  618. if (num > 0) {
  619. return CommonUtil.getReturnMap("0", "逻辑删除成功");
  620. }
  621. return CommonUtil.getReturnMap("1", "逻辑删除失败");
  622. } else if (delMethod == 1) {
  623. // 恢复逻辑删除
  624. int num = smartDataTaskMapper.restoreLogicDeleteMarkTaskById(id);
  625. if (num > 0) {
  626. return CommonUtil.getReturnMap("0", "恢复逻辑删除成功");
  627. }
  628. return CommonUtil.getReturnMap("1", "恢复逻辑删除失败");
  629. } else if (delMethod == 9) {
  630. // 物理删除
  631. int num = smartDataTaskMapper.physicsDeleteMarkTaskById(id);
  632. if (num > 0) {
  633. return CommonUtil.getReturnMap("0", "物理删除成功");
  634. }
  635. return CommonUtil.getReturnMap("1", "物理删除失败");
  636. } else {
  637. // 错误
  638. return CommonUtil.getReturnMap("1", "删除方式错误");
  639. }
  640. }
  641. @Override
  642. public SmartDataTask getSmartById(int id) {
  643. return smartDataTaskMapper.selectById(id);
  644. }
  645. // 校验任务名是否存在
  646. public Map<String, Object> TaskNameValidator(SmartDataTask smartDataTask) {
  647. if (smartDataTask.getTkName() == null) {
  648. return CommonUtil.getReturnMap(String.valueOf(1), "任务名称为空!");
  649. }
  650. QueryWrapper<SmartDataTask> queryWrapper = new QueryWrapper<>();
  651. queryWrapper.eq(smartDataTask.getTkName() != null, "tk_name", smartDataTask.getTkName());
  652. SmartDataTask smartDataTask_return = smartDataTaskMapper.selectOne(queryWrapper);
  653. if (smartDataTask_return == null) {
  654. return CommonUtil.getReturnMap(String.valueOf(1), "【" + smartDataTask.getTkName() + "】没有找到!");
  655. } else {
  656. return CommonUtil.getReturnMap(String.valueOf(0), smartDataTask_return);
  657. }
  658. }
  659. @Override
  660. public Map<String, Object> createJob(SmartDataTask smartDataTask) {
  661. // 校验任务名是否存在
  662. Map<String, Object> tmp_map = TaskNameValidator(smartDataTask);
  663. if ("1".equals(tmp_map.get("code"))) {
  664. return tmp_map;
  665. }
  666. SmartDataTask smartDataTask_return = (SmartDataTask) tmp_map.get("msg");
  667. if (smartDataTask_return.getTkCron() == null) {
  668. return CommonUtil.getReturnMap(String.valueOf(1), "任务调度cron表达式为空!该任务未设置【定时信息】!");
  669. }
  670. // 来源数据源id
  671. Integer tkDsIdSource = smartDataTask_return.getTkDsIdSource();
  672. // 目标数据源id
  673. Integer tkDsIdDestination = smartDataTask_return.getTkDsIdDestination();
  674. // 根据id,获取数据源url、user、password、driver等
  675. SmartDataSourceJobParams dsSourceInfo = smartDataSourceMapper.getDataSourceInfo(tkDsIdSource);
  676. dsSourceInfo.setExchangeType(smartDataTask_return.getTkExchangeType());
  677. dsSourceInfo.setSourceSql(smartDataTask_return.getTkSql());
  678. SmartDataSourceJobParams dsDestinationInfo = smartDataSourceMapper.getDataSourceInfo(tkDsIdDestination);
  679. dsDestinationInfo.setDestinationTable(smartDataTask_return.getTkDestTable());
  680. Map<String, Object> returnMap = QuartzJobUtils.createScheduleJob(scheduler, smartDataTask_return, dsSourceInfo, dsDestinationInfo);
  681. if ("0".equals(returnMap.get("code"))) {
  682. smartDataTask.setTkId(smartDataTask_return.getTkId());
  683. // 下次执行的时间
  684. String nextExeTime = QuartzJobUtils.getNextExeTime(smartDataTask_return.getTkCron());
  685. // 更新数据库中的下次执行时间
  686. smartDataTask.setTkNextExeTime(nextExeTime);
  687. smartDataTask.setTkActivation(1);
  688. Map<String, Object> stringStringMap = updateSmartDataTaskActivation(smartDataTask);
  689. String msg;
  690. if ("0".equals(stringStringMap.get("code"))) {
  691. msg = (String) returnMap.get("msg") + stringStringMap.get("msg");
  692. } else {
  693. msg = (String) returnMap.get("msg") + stringStringMap.get("msg");
  694. }
  695. return CommonUtil.getReturnMap("0", msg);
  696. } else {
  697. return returnMap;
  698. }
  699. }
  700. @Override
  701. public Map<String, Object> pauseJob(SmartDataTask smartDataTask) {
  702. Map<String, Object> tmp_map = TaskNameValidator(smartDataTask);
  703. if ("1".equals(tmp_map.get("code"))) {
  704. return tmp_map;
  705. }
  706. SmartDataTask smartDataTask_return = (SmartDataTask) tmp_map.get("msg");
  707. return QuartzJobUtils.pauseScheduleJob(scheduler, smartDataTask_return.getTkName());
  708. }
  709. @Override
  710. public Map<String, Object> resumeJob(SmartDataTask smartDataTask) {
  711. Map<String, Object> tmp_map = TaskNameValidator(smartDataTask);
  712. if ("1".equals(tmp_map.get("code"))) {
  713. return tmp_map;
  714. }
  715. SmartDataTask smartDataTask_return = (SmartDataTask) tmp_map.get("msg");
  716. return QuartzJobUtils.resumeScheduleJob(scheduler, smartDataTask_return.getTkName());
  717. }
  718. @Override
  719. public Map<String, Object> updateJob(SmartDataTask smartDataTask) {
  720. Map<String, Object> tmp_map = TaskNameValidator(smartDataTask);
  721. if ("1".equals(tmp_map.get("code"))) {
  722. return tmp_map;
  723. }
  724. SmartDataTask smartDataTask_return = (SmartDataTask) tmp_map.get("msg");
  725. return QuartzJobUtils.updateScheduleJob(scheduler, smartDataTask_return);
  726. }
  727. @Override
  728. public Map<String, Object> deleteJob(SmartDataTask smartDataTask) {
  729. Map<String, Object> tmp_map = TaskNameValidator(smartDataTask);
  730. if ("1".equals(tmp_map.get("code"))) {
  731. return tmp_map;
  732. }
  733. SmartDataTask smartDataTask_return = (SmartDataTask) tmp_map.get("msg");
  734. Map<String, Object> returnMap = QuartzJobUtils.deleteScheduleJob(scheduler, smartDataTask_return.getTkName());
  735. if ("0".equals(returnMap.get("code"))) {
  736. smartDataTask.setTkId(smartDataTask_return.getTkId());
  737. // 更新数据库中的下次执行时间
  738. smartDataTask.setTkNextExeTime(null);
  739. smartDataTask.setTkActivation(0);
  740. Map<String, Object> stringStringMap = updateSmartDataTaskActivation(smartDataTask);
  741. String msg;
  742. if ("0".equals(stringStringMap.get("code"))) {
  743. msg = (String) returnMap.get("msg") + stringStringMap.get("msg");
  744. } else {
  745. msg = (String) returnMap.get("msg") + stringStringMap.get("msg");
  746. }
  747. return CommonUtil.getReturnMap("0", msg);
  748. } else {
  749. return CommonUtil.getReturnMap("1", returnMap.get("msg"));
  750. }
  751. }
  752. @Override
  753. public Map<String, Object> runOnceJob(SmartDataTask smartDataTask) {
  754. Map<String, Object> tmp_map = TaskNameValidator(smartDataTask);
  755. if ("1".equals(tmp_map.get("code"))) {
  756. return tmp_map;
  757. }
  758. SmartDataTask smartDataTask_return = (SmartDataTask) tmp_map.get("msg");
  759. return QuartzJobUtils.runOnce(scheduler, smartDataTask_return.getTkName());
  760. }
  761. @Override
  762. public Map<String, Object> getDepart() {
  763. // 获取部门
  764. List<SmartDepartment> depart = smartDataSourceMapper.getDepart();
  765. if (depart != null) {
  766. return CommonUtil.getReturnMap("0", depart);
  767. } else {
  768. return CommonUtil.getReturnMap("1", "部门为空");
  769. }
  770. }
  771. @Override
  772. public Map<String, Object> getSyncPolicy() {
  773. // 获取同步策略: 0插入更新,1更新标记,2清空插入
  774. Map<String, Object> syncPolicy1 = new HashMap<>();
  775. Map<String, Object> syncPolicy2 = new HashMap<>();
  776. Map<String, Object> syncPolicy3 = new HashMap<>();
  777. syncPolicy1.put("name", "插入更新");
  778. syncPolicy1.put("value", 0);
  779. syncPolicy2.put("name", "更新标记");
  780. syncPolicy2.put("value", 1);
  781. syncPolicy3.put("name", "清空插入");
  782. syncPolicy3.put("value", 2);
  783. List<Map<String, Object>> list = new ArrayList<>();
  784. list.add(syncPolicy1);
  785. list.add(syncPolicy2);
  786. list.add(syncPolicy3);
  787. return CommonUtil.getReturnMap("0", list);
  788. }
  789. @Override
  790. public Map<String, Object> getExchangeType() {
  791. // 获取同步策略: 0插入更新,1更新标记,2清空插入
  792. Map<String, Object> syncPolicy1 = new HashMap<>();
  793. Map<String, Object> syncPolicy2 = new HashMap<>();
  794. Map<String, Object> syncPolicy3 = new HashMap<>();
  795. syncPolicy1.put("name", "自定义SQL语句");
  796. syncPolicy1.put("value", 0);
  797. syncPolicy2.put("name", "数据视图");
  798. syncPolicy2.put("value", 1);
  799. syncPolicy3.put("name", "数据表");
  800. syncPolicy3.put("value", 2);
  801. List<Map<String, Object>> list = new ArrayList<>();
  802. list.add(syncPolicy1);
  803. list.add(syncPolicy2);
  804. list.add(syncPolicy3);
  805. return CommonUtil.getReturnMap("0", list);
  806. }
  807. @Override
  808. public Map<String, Object> testSql(String json) {
  809. if (json == null) {
  810. return CommonUtil.getReturnMap("1", "json参数为空");
  811. }
  812. int dsIdSource, exchangeType;
  813. String sql;
  814. try {
  815. JSONObject jsonObject = JSONObject.parseObject(json);
  816. dsIdSource = jsonObject.getInteger("dsIdSource");
  817. exchangeType = jsonObject.getInteger("exchangeType");
  818. sql = jsonObject.getString("sql");
  819. } catch (Exception e) {
  820. return CommonUtil.getReturnMap("1", "请检查参数:【数据源id】、【交换方式】、【自定义sql语句】是否为空");
  821. }
  822. // 获取数据源id对应的数据源
  823. SmartDataSourceJobParams dataSourceInfo = smartDataSourceMapper.getDataSourceInfo(dsIdSource);
  824. // 只有sql语句的交换方式才需要检查
  825. if (exchangeType == 0) {
  826. // sql语句
  827. if (dataSourceInfo != null) {
  828. DBUtil dbUtil = new DBUtil(dataSourceInfo.getDsUrl(), dataSourceInfo.getDsUser(), dataSourceInfo.getDsPassword(), dataSourceInfo.getDsClsDriver(), "UTF8");
  829. Map<String, Object> map_return = dbUtil.getConnection();
  830. if (map_return.get("code") == "0") {
  831. Map<String, Object> metaDataBySql = dbUtil.getMetaDataBySql((Connection) map_return.get("msg"), sql);
  832. if (metaDataBySql.get("code") == "0") {
  833. return CommonUtil.getReturnMap("0", "SQL语句正确");
  834. } else {
  835. return CommonUtil.getReturnMap("1", metaDataBySql.get("msg"));
  836. }
  837. } else {
  838. return CommonUtil.getReturnMap("1", map_return.get("msg"));
  839. }
  840. } else {
  841. return CommonUtil.getReturnMap("1", "来源数据源不存在");
  842. }
  843. } else {
  844. return CommonUtil.getReturnMap("1", "只有【自定义SQL语句】的交换方式才需要测试sql");
  845. }
  846. }
  847. @Override
  848. // 获取表
  849. public Map<String, Object> getTables(String json) {
  850. // 查询数据库中的表
  851. String sql = "SELECT TABLE_NAME tname,TABLE_COMMENT tcomment FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{db}';";
  852. // 调用getTablesOrViews方法,传入json和sql,获取表
  853. return getTablesOrViews(json, sql);
  854. }
  855. @Override
  856. //获取视图
  857. public Map<String, Object> getViews(String json) {
  858. // 查询数据库中指定数据库的视图
  859. String sql = "SELECT TABLE_NAME tname,TABLE_COMMENT tcomment FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{db}' AND TABLE_TYPE = 'VIEW';";
  860. // 返回视图
  861. return getTablesOrViews(json, sql);
  862. }
  863. // 获取表或视图信息
  864. private Map<String, Object> getTablesOrViews(String json, String sql) {
  865. // 判断json是否为空
  866. if (json == null) {
  867. // 如果为空,返回提示信息
  868. return CommonUtil.getReturnMap("1", "json参数为空");
  869. }
  870. int dsIdSource;
  871. try {
  872. // 将json字符串转换为JSONObject对象
  873. JSONObject jsonObject = JSONObject.parseObject(json);
  874. // 从JSONObject对象中获取dsIdSource的值
  875. dsIdSource = jsonObject.getInteger("dsIdSource");
  876. } catch (Exception e) {
  877. // 如果获取失败,返回提示信息
  878. return CommonUtil.getReturnMap("1", "请检查参数:【数据源id】是否为空");
  879. }
  880. // 获取数据源信息
  881. SmartDataSourceJobParams dataSourceInfo = smartDataSourceMapper.getDataSourceInfo(dsIdSource);
  882. if (dataSourceInfo != null) {
  883. // 创建DBUtil对象
  884. DBUtil dbUtil = new DBUtil(dataSourceInfo.getDsUrl(), dataSourceInfo.getDsUser(), dataSourceInfo.getDsPassword(), dataSourceInfo.getDsClsDriver(), "UTF8");
  885. // 获取连接
  886. Map<String, Object> map_return = dbUtil.getConnection();
  887. if (map_return.get("code") == "0") {
  888. // 获取连接
  889. Connection conn = (Connection) map_return.get("msg");
  890. // 获取数据库名
  891. String db = dataSourceInfo.getDsUrl().substring(dataSourceInfo.getDsUrl().lastIndexOf("/") + 1);
  892. // 查询表或视图信息
  893. sql = sql.replace("{db}", db);
  894. Map<String, Object> tableMetaData = dbUtil.query(conn, sql);
  895. if (tableMetaData.get("code") == "0") {
  896. Map<String, Object> map = (Map<String, Object>) tableMetaData.get("msg");
  897. ResultSet rs = (ResultSet) map.get("rs");
  898. PreparedStatement stmt = (PreparedStatement) map.get("stmt");
  899. try {
  900. List<String> list = new ArrayList<>();
  901. while (rs.next()) {
  902. // 将表名和表注释添加到list中
  903. list.add(rs.getString("tname") + " [" + rs.getString("tcomment") + "]");
  904. }
  905. // 关闭结果集
  906. dbUtil.closeResultSet(rs);
  907. // 关闭预处理语句
  908. dbUtil.closeStatement(stmt);
  909. // 关闭连接
  910. dbUtil.closeConnection(conn);
  911. // 返回表信息
  912. return CommonUtil.getReturnMap("0", list);
  913. } catch (SQLException e) {
  914. // 如果出现异常,返回异常信息
  915. return CommonUtil.getReturnMap("1", e.getMessage());
  916. }
  917. } else {
  918. // 如果查询失败,返回查询失败信息
  919. return CommonUtil.getReturnMap("1", tableMetaData.get("msg"));
  920. }
  921. } else {
  922. // 如果获取连接失败,返回获取连接失败信息
  923. return CommonUtil.getReturnMap("1", map_return.get("msg"));
  924. }
  925. } else {
  926. // 如果数据源不存在,返回提示信息
  927. return CommonUtil.getReturnMap("1", "数据源不存在");
  928. }
  929. }
  930. }