SmartDataTaskServiceImpl.java 53 KB

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