VisualdevServiceImpl.java 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649
  1. package jnpf.base.service.impl;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.alibaba.fastjson.JSONArray;
  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.google.common.collect.ImmutableList;
  8. import com.google.common.collect.Lists;
  9. import jnpf.base.entity.VisualdevEntity;
  10. import jnpf.base.entity.VisualdevReleaseEntity;
  11. import jnpf.base.mapper.FlowFormDataMapper;
  12. import jnpf.base.mapper.VisualdevMapper;
  13. import jnpf.base.model.PaginationVisualdev;
  14. import jnpf.base.model.dbtable.vo.DbFieldVO;
  15. import jnpf.base.model.form.VisualTableModel;
  16. import jnpf.base.service.*;
  17. import jnpf.base.util.ConcurrencyUtils;
  18. import jnpf.base.util.VisualDevTableCre;
  19. import jnpf.base.util.VisualUtils;
  20. import jnpf.constant.CodeConst;
  21. import jnpf.constant.JnpfConst;
  22. import jnpf.constant.MsgCode;
  23. import jnpf.database.constant.DbAliasConst;
  24. import jnpf.database.model.dbfield.DbFieldModel;
  25. import jnpf.database.model.dbfield.base.DbFieldModelBase;
  26. import jnpf.database.model.dbtable.DbTableFieldModel;
  27. import jnpf.database.model.entity.DbLinkEntity;
  28. import jnpf.database.util.ConnUtil;
  29. import jnpf.database.util.DataSourceUtil;
  30. import jnpf.database.util.DynamicDataSourceUtil;
  31. import jnpf.exception.WorkFlowException;
  32. import jnpf.flowable.entity.TaskEntity;
  33. import jnpf.model.OnlineDevData;
  34. import jnpf.model.visualJson.*;
  35. import jnpf.model.visualJson.analysis.FormAllModel;
  36. import jnpf.model.visualJson.analysis.FormEnum;
  37. import jnpf.model.visualJson.analysis.FormMastTableModel;
  38. import jnpf.model.visualJson.analysis.RecursionForm;
  39. import jnpf.model.visualJson.config.ConfigModel;
  40. import jnpf.permission.service.CodeNumService;
  41. import jnpf.util.*;
  42. import jnpf.util.visiual.JnpfKeyConsts;
  43. import jnpf.workflow.service.TaskApi;
  44. import lombok.Cleanup;
  45. import lombok.SneakyThrows;
  46. import org.apache.commons.collections4.CollectionUtils;
  47. import org.mybatis.dynamic.sql.SqlBuilder;
  48. import org.mybatis.dynamic.sql.SqlTable;
  49. import org.mybatis.dynamic.sql.render.RenderingStrategies;
  50. import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
  51. import org.mybatis.dynamic.sql.select.SelectModel;
  52. import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
  53. import org.mybatis.dynamic.sql.update.UpdateDSL;
  54. import org.mybatis.dynamic.sql.update.UpdateModel;
  55. import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
  56. import org.springframework.beans.factory.annotation.Autowired;
  57. import org.springframework.scheduling.annotation.Async;
  58. import org.springframework.stereotype.Service;
  59. import java.sql.Connection;
  60. import java.util.*;
  61. import java.util.stream.Collectors;
  62. /**
  63. * @author JNPF开发平台组
  64. * @version V3.1.0
  65. * @copyright 引迈信息技术有限公司(https://www.jnpfsoft.com)
  66. * @date 2021/3/16
  67. */
  68. @Service
  69. public class VisualdevServiceImpl extends SuperServiceImpl<VisualdevMapper, VisualdevEntity> implements VisualdevService {
  70. @Autowired
  71. private VisualDevTableCre visualDevTableCreUtil;
  72. @Autowired
  73. private ConcurrencyUtils concurrencyUtils;
  74. @Autowired
  75. private DbTableService dbTableService;
  76. @Autowired
  77. private DbLinkService dblinkService;
  78. @Autowired
  79. private DataSourceUtil dataSourceUtil;
  80. @Autowired
  81. private FilterService filterService;
  82. @Autowired
  83. private VisualdevReleaseService visualdevReleaseService;
  84. @Autowired
  85. private CodeNumService codeNumService;
  86. @Autowired
  87. private FlowFormDataMapper flowFormDataMapper;
  88. @Autowired
  89. private TaskApi taskApi;
  90. @Override
  91. public List<VisualdevEntity> getList(PaginationVisualdev paginationVisualdev) {
  92. // 定义变量判断是否需要使用修改时间倒序
  93. boolean flag = false;
  94. QueryWrapper<VisualdevEntity> queryWrapper = new QueryWrapper<>();
  95. queryWrapper.lambda().select(VisualdevEntity::getId, VisualdevEntity::getCategory, VisualdevEntity::getEnCode, VisualdevEntity::getFullName,
  96. VisualdevEntity::getCreatorTime, VisualdevEntity::getCreatorUserId, VisualdevEntity::getLastModifyTime, VisualdevEntity::getLastModifyUserId,
  97. VisualdevEntity::getEnabledMark, VisualdevEntity::getSortCode, VisualdevEntity::getState, VisualdevEntity::getType, VisualdevEntity::getEnableFlow,
  98. VisualdevEntity::getWebType, VisualdevEntity::getVisualTables, VisualdevEntity::getPlatformRelease);
  99. if (!StringUtil.isEmpty(paginationVisualdev.getKeyword())) {
  100. flag = true;
  101. queryWrapper.lambda().and(t -> t.like(VisualdevEntity::getFullName, paginationVisualdev.getKeyword())
  102. .or().like(VisualdevEntity::getEnCode, paginationVisualdev.getKeyword()));
  103. }
  104. if (ObjectUtil.isNotEmpty(paginationVisualdev.getType())) {
  105. queryWrapper.lambda().eq(VisualdevEntity::getType, paginationVisualdev.getType());
  106. }
  107. if (StringUtil.isNotEmpty(paginationVisualdev.getCategory())) {
  108. flag = true;
  109. queryWrapper.lambda().eq(VisualdevEntity::getCategory, paginationVisualdev.getCategory());
  110. }
  111. //---功能类型查询
  112. if (paginationVisualdev.getWebType() != null) {//普通表单
  113. flag = true;
  114. //2-表单:改成查询纯表单和列表
  115. if (Objects.equals(paginationVisualdev.getWebType(), 2)) {
  116. queryWrapper.lambda().in(VisualdevEntity::getWebType, Arrays.asList(1, 2));
  117. } else {
  118. queryWrapper.lambda().eq(VisualdevEntity::getWebType, paginationVisualdev.getWebType());
  119. }
  120. }
  121. if (StringUtil.isNotEmpty(paginationVisualdev.getSystemId())) {//普通表单
  122. queryWrapper.lambda().eq(VisualdevEntity::getSystemId, paginationVisualdev.getSystemId());
  123. }
  124. //状态
  125. if (StringUtil.isNotEmpty(paginationVisualdev.getIsRelease())) {
  126. flag = true;
  127. List<String> releaseList = Arrays.asList(paginationVisualdev.getIsRelease().split(","));
  128. if (releaseList.size() > 1) {
  129. List<Integer> jsonToList = JsonUtil.getJsonToList(releaseList, Integer.class);
  130. queryWrapper.lambda().in(VisualdevEntity::getState, jsonToList);
  131. } else if (releaseList.size() == 1) {
  132. queryWrapper.lambda().eq(VisualdevEntity::getState, paginationVisualdev.getIsRelease());
  133. }
  134. }
  135. // 排序
  136. queryWrapper.lambda().orderByAsc(VisualdevEntity::getSortCode).orderByDesc(VisualdevEntity::getCreatorTime);
  137. if (flag) {
  138. queryWrapper.lambda().orderByDesc(VisualdevEntity::getLastModifyTime);
  139. }
  140. Page<VisualdevEntity> page = new Page<>(paginationVisualdev.getCurrentPage(), paginationVisualdev.getPageSize());
  141. IPage<VisualdevEntity> userPage = this.page(page, queryWrapper);
  142. return paginationVisualdev.setData(userPage.getRecords(), page.getTotal());
  143. }
  144. @Override
  145. public List<VisualdevEntity> getPageList(PaginationVisualdev paginationVisualdev) {
  146. QueryWrapper<VisualdevReleaseEntity> queryWrapper = new QueryWrapper<>();
  147. queryWrapper.lambda().select(
  148. VisualdevReleaseEntity::getId,
  149. VisualdevReleaseEntity::getFullName,
  150. VisualdevReleaseEntity::getType,
  151. VisualdevReleaseEntity::getEnableFlow,
  152. VisualdevReleaseEntity::getEnCode);
  153. //1-集成助手,查询列表, 2-流程表单查询,纯表单和列表
  154. if (paginationVisualdev.getWebType() != null) {
  155. List<Integer> webType = ImmutableList.of(1, 2, 4);
  156. if (Objects.equals(paginationVisualdev.getWebType(), 1)) {
  157. webType = ImmutableList.of(2);
  158. } else if (Objects.equals(paginationVisualdev.getWebType(), 2)) {
  159. webType = ImmutableList.of(1, 2);
  160. }
  161. queryWrapper.lambda().in(VisualdevReleaseEntity::getWebType, webType);
  162. }
  163. if (!StringUtil.isEmpty(paginationVisualdev.getKeyword())) {
  164. queryWrapper.lambda().like(VisualdevReleaseEntity::getFullName, paginationVisualdev.getKeyword());
  165. }
  166. if (ObjectUtil.isNotEmpty(paginationVisualdev.getType())) {
  167. queryWrapper.lambda().eq(VisualdevReleaseEntity::getType, paginationVisualdev.getType());
  168. }
  169. if (StringUtil.isNotEmpty(paginationVisualdev.getCategory())) {
  170. queryWrapper.lambda().eq(VisualdevReleaseEntity::getCategory, paginationVisualdev.getCategory());
  171. }
  172. if (StringUtil.isNotEmpty(paginationVisualdev.getSystemId())) {
  173. queryWrapper.lambda().eq(VisualdevReleaseEntity::getSystemId, paginationVisualdev.getSystemId());
  174. }
  175. if (Objects.equals(paginationVisualdev.getEnableFlow(), 1)) {
  176. queryWrapper.lambda().and(
  177. t -> t.isNull(VisualdevReleaseEntity::getEnableFlow).or()
  178. .eq(VisualdevReleaseEntity::getEnableFlow, 1)
  179. );
  180. }
  181. // 排序
  182. queryWrapper.lambda().orderByAsc(VisualdevReleaseEntity::getSortCode).orderByDesc(VisualdevReleaseEntity::getCreatorTime);
  183. Page<VisualdevReleaseEntity> page = new Page<>(paginationVisualdev.getCurrentPage(), paginationVisualdev.getPageSize());
  184. IPage<VisualdevReleaseEntity> userPage = visualdevReleaseService.page(page, queryWrapper);
  185. List<VisualdevEntity> list = JsonUtil.getJsonToList(userPage.getRecords(), VisualdevEntity.class);
  186. return paginationVisualdev.setData(list, page.getTotal());
  187. }
  188. @Override
  189. public List<VisualdevEntity> getList() {
  190. QueryWrapper<VisualdevEntity> queryWrapper = new QueryWrapper<>();
  191. queryWrapper.lambda().orderByAsc(VisualdevEntity::getSortCode).orderByDesc(VisualdevEntity::getCreatorTime);
  192. return this.list(queryWrapper);
  193. }
  194. @Override
  195. public VisualdevEntity getInfo(String id) {
  196. if (StringUtil.isBlank(id)) return null;
  197. QueryWrapper<VisualdevEntity> queryWrapper = new QueryWrapper<>();
  198. queryWrapper.lambda().eq(VisualdevEntity::getId, id);
  199. return this.getOne(queryWrapper);
  200. }
  201. @Override
  202. public VisualdevEntity getReleaseInfo(String id) {
  203. VisualdevReleaseEntity visualdevReleaseEntity = visualdevReleaseService.getById(id);
  204. VisualdevEntity visualdevEntity = null;
  205. if (visualdevReleaseEntity != null) {
  206. visualdevEntity = JsonUtil.getJsonToBean(visualdevReleaseEntity, VisualdevEntity.class);
  207. }
  208. if (visualdevEntity == null) {
  209. visualdevEntity = getById(id);
  210. }
  211. return visualdevEntity;
  212. }
  213. @Override
  214. public Map<String, String> getTableMap(String formData) {
  215. Map<String, String> tableMap = new HashMap<>();
  216. if (StringUtil.isEmpty(formData)) {
  217. return tableMap;
  218. }
  219. FormDataModel formDataModel = JsonUtil.getJsonToBean(formData, FormDataModel.class);
  220. String fields = formDataModel.getFields();
  221. List<FieLdsModel> list = JsonUtil.getJsonToList(fields, FieLdsModel.class);
  222. list.forEach(item -> {
  223. this.solveTableName(item, tableMap);
  224. });
  225. return tableMap;
  226. }
  227. private void solveTableName(FieLdsModel item, Map tableMap) {
  228. ConfigModel config = item.getConfig();
  229. if (config != null) {
  230. List<FieLdsModel> children = config.getChildren();
  231. if ("table".equals(config.getJnpfKey())) {
  232. if (children != null && children.size() > 0) {
  233. FieLdsModel fieLdsModel = children.get(0);
  234. String parentVModel = item.getVModel();
  235. String relationTable = fieLdsModel.getConfig().getRelationTable();
  236. if (StringUtil.isNotBlank(relationTable)) {
  237. tableMap.put(parentVModel, relationTable);
  238. }
  239. }
  240. }
  241. if (children != null) {
  242. children.forEach(item2 -> {
  243. this.solveTableName(item2, tableMap);
  244. });
  245. }
  246. }
  247. }
  248. ;
  249. @Override
  250. @SneakyThrows
  251. public Boolean create(VisualdevEntity entity) {
  252. if (StringUtil.isEmpty(entity.getId())) {
  253. entity.setId(RandomUtil.uuId());
  254. }
  255. if (OnlineDevData.FORM_TYPE_DEV.equals(entity.getType())) {
  256. FormDataModel formDataModel = JsonUtil.getJsonToBean(entity.getFormData(), FormDataModel.class);
  257. if (formDataModel != null) {
  258. //是否开启安全锁
  259. int primaryKeyPolicy = formDataModel.getPrimaryKeyPolicy();
  260. //判断是否要创表
  261. List<TableModel> tableModels = JsonUtil.getJsonToList(entity.getVisualTables(), TableModel.class);
  262. //有表
  263. if (tableModels.size() > 0) {
  264. Map<String, String> tableMap = this.getTableMap(entity.getFormData());
  265. // 保存app,pc过滤配置
  266. filterService.saveRuleList(entity.getId(), entity, 1, 1, tableMap);
  267. for (TableModel tableModel : tableModels) {
  268. Boolean isAutoIncre = this.getPrimaryDbField(entity.getDbLinkId(), tableModel.getTable());
  269. // 1:雪花ID 2:自增ID
  270. if (primaryKeyPolicy == 1) {
  271. if (isAutoIncre != null && isAutoIncre) {
  272. throw new WorkFlowException(MsgCode.VS022.get(tableModel.getTable()));
  273. }
  274. } else if (primaryKeyPolicy == 2) {
  275. if (isAutoIncre == null || !isAutoIncre) {
  276. throw new WorkFlowException(MsgCode.VS023.get(tableModel.getTable()));
  277. }
  278. }
  279. }
  280. try {
  281. String tableJsonMap = addDbFileds(entity.getDbLinkId(), tableModels, formDataModel);
  282. if (StringUtil.isNotEmpty(tableJsonMap)) {
  283. entity.setVisualTables(tableJsonMap);
  284. }
  285. } catch (Exception e) {
  286. e.printStackTrace();
  287. }
  288. }
  289. }
  290. }
  291. if (StringUtil.isEmpty(entity.getEnCode())) {
  292. setAutoEnCode(entity);
  293. }
  294. entity.setEnabledMark(0);
  295. entity.setState(0);
  296. entity.setCreatorTime(new Date());
  297. entity.setCreatorUserId(UserProvider.getLoginUserId());
  298. entity.setLastModifyTime(null);
  299. entity.setLastModifyUserId(null);
  300. this.setIgnoreLogicDelete().removeById(entity.getId());
  301. boolean result = this.setIgnoreLogicDelete().saveOrUpdate(entity);
  302. this.clearIgnoreLogicDelete();
  303. return result;
  304. }
  305. /**
  306. * 数据库表,添加字段
  307. *
  308. * @param dbLinkId 数据链接id
  309. * @param visualTables 表列表
  310. * @param formDataModel 表单属性
  311. * @throws Exception
  312. */
  313. private String addDbFileds(String dbLinkId, List<TableModel> visualTables, FormDataModel formDataModel) throws Exception {
  314. if (CollectionUtils.isEmpty(visualTables)) return null;
  315. List<Map<String, Object>> tableJsonMap = new ArrayList<>();
  316. Boolean concurrencyLock = formDataModel.getConcurrencyLock();
  317. Boolean logicalDelete = formDataModel.getLogicalDelete();
  318. //在各个表创建多租户字段强
  319. for (TableModel tableModel : visualTables) {
  320. boolean isMainTable = tableModel.getTypeId().equals("1");
  321. List<DbFieldModel> dbFieldModelList = dbTableService.getFieldList(dbLinkId, tableModel.getTable());
  322. List<DbFieldModelBase> fieldList = JsonUtil.getJsonToList(dbFieldModelList, DbFieldModelBase.class);
  323. List<DbFieldModel> addList = new ArrayList<>();
  324. DbLinkEntity dbLink = dblinkService.getInfo(dbLinkId);
  325. String type = dbLink != null ? dbLink.getDbType() : dataSourceUtil.getDbType();
  326. concurrencyUtils.createTenantId(fieldList, type, addList);
  327. if (logicalDelete) {
  328. concurrencyUtils.creDeleteMark(fieldList, type, addList);
  329. }
  330. if (isMainTable && concurrencyLock) {
  331. concurrencyUtils.createVersion(fieldList, type, addList);
  332. }
  333. if (isMainTable) {
  334. //流程字段强制生成
  335. concurrencyUtils.createFlowEngine(fieldList, type, addList);
  336. concurrencyUtils.createFlowTaskId(fieldList, type, addList);
  337. concurrencyUtils.createFlowState(fieldList, type, addList);
  338. }
  339. concurrencyUtils.addFileds(tableModel.getTable(), dbLinkId, addList);
  340. List<DbFieldVO> voList = new ArrayList<>();
  341. List<DbFieldModelBase> listAll = new ArrayList<>();
  342. listAll.addAll(fieldList);
  343. listAll.addAll(addList);
  344. for (DbFieldModelBase item : listAll) {
  345. DbFieldVO tableFields = new DbFieldVO();
  346. tableFields.setField(item.getField());
  347. tableFields.setFieldName(item.getComment());
  348. tableFields.setDataType(item.getDataType());
  349. tableFields.setDataLength(item.getLength());
  350. tableFields.setPrimaryKey(DbAliasConst.PRIMARY_KEY.getNum(item.getIsPrimaryKey()));
  351. tableFields.setAllowNull(DbAliasConst.ALLOW_NULL.getNum(item.getNullSign()));
  352. tableFields.setAutoIncrement(DbAliasConst.AUTO_INCREMENT.getNum(item.getIsAutoIncrement()));
  353. tableFields.setIdentity(DbAliasConst.AUTO_INCREMENT.getNum(item.getIsAutoIncrement()));
  354. voList.add(tableFields);
  355. }
  356. Map<String, Object> stringObjectMap = JsonUtil.entityToMap(tableModel);
  357. stringObjectMap.put("fields", voList);
  358. tableJsonMap.add(stringObjectMap);
  359. }
  360. return JsonUtil.getObjectToString(tableJsonMap);
  361. }
  362. @Override
  363. public boolean update(String id, VisualdevEntity entity) throws Exception {
  364. entity.setId(id);
  365. entity.setLastModifyUserId(UserProvider.getUser().getUserId());
  366. entity.setLastModifyTime(DateUtil.getNowDate());
  367. if (StringUtil.isEmpty(entity.getEnCode())) {
  368. setAutoEnCode(entity);
  369. }
  370. if (OnlineDevData.FORM_TYPE_DEV.equals(entity.getType())) {
  371. //代码生成修改时就要生成字段
  372. FormDataModel formDataModel = JsonUtil.getJsonToBean(entity.getFormData(), FormDataModel.class);
  373. if (formDataModel != null) {
  374. int primaryKeyPolicy = formDataModel.getPrimaryKeyPolicy();
  375. //判断是否要创表
  376. List<TableModel> visualTables = JsonUtil.getJsonToList(entity.getVisualTables(), TableModel.class);
  377. //有表
  378. if (visualTables.size() > 0) {
  379. if (formDataModel != null) {
  380. try {
  381. //字段强制生成
  382. String tableJsonMap = addDbFileds(entity.getDbLinkId(), visualTables, formDataModel);
  383. if (StringUtil.isNotEmpty(tableJsonMap)) {
  384. entity.setVisualTables(tableJsonMap);
  385. }
  386. } catch (Exception e) {
  387. e.printStackTrace();
  388. }
  389. //判断自增是否匹配
  390. concurrencyUtils.checkAutoIncrement(primaryKeyPolicy, entity.getDbLinkId(), visualTables);
  391. }
  392. }
  393. }
  394. }
  395. return this.updateById(entity);
  396. }
  397. @Override
  398. public Boolean getObjByEncode(String encode, Integer type) {
  399. if (StringUtil.isEmpty(encode)) return false;
  400. QueryWrapper<VisualdevEntity> visualWrapper = new QueryWrapper<>();
  401. visualWrapper.lambda().eq(VisualdevEntity::getEnCode, encode).eq(VisualdevEntity::getType, type);
  402. Integer count = (int) this.count(visualWrapper);
  403. return count > 0;
  404. }
  405. @Override
  406. public void setAutoEnCode(VisualdevEntity entity) {
  407. if (Objects.equals(1, entity.getType())) {
  408. entity.setEnCode(codeNumService.getCodeFunction(() -> codeNumService.getCodeOnce(CodeConst.ZXBD), code -> this.getObjByEncode(code, entity.getType())));
  409. } else {
  410. entity.setEnCode(codeNumService.getCodeFunction(() -> codeNumService.getCodeOnce(CodeConst.BDHC), code -> this.getObjByEncode(code, entity.getType())));
  411. }
  412. }
  413. @Override
  414. public Boolean getCountByName(String name, Integer type, String systemId) {
  415. QueryWrapper<VisualdevEntity> visualWrapper = new QueryWrapper<>();
  416. visualWrapper.lambda().eq(VisualdevEntity::getFullName, name).eq(VisualdevEntity::getType, type);
  417. if (StringUtil.isNotEmpty(systemId)) {
  418. visualWrapper.lambda().eq(VisualdevEntity::getSystemId, systemId);
  419. }
  420. Integer count = (int) this.count(visualWrapper);
  421. return count > 0;
  422. }
  423. @Override
  424. public void createTable(VisualdevEntity entity) throws Exception {
  425. FormDataModel formDataModel = JsonUtil.getJsonToBean(entity.getFormData(), FormDataModel.class);
  426. //是否开启安全锁
  427. Boolean concurrencyLock = formDataModel.getConcurrencyLock();
  428. int primaryKeyPolicy = formDataModel.getPrimaryKeyPolicy();
  429. Boolean logicalDelete = formDataModel.getLogicalDelete();
  430. String dbLinkId = entity.getDbLinkId();
  431. Map<String, Object> formMap = JsonUtil.stringToMap(entity.getFormData());
  432. List<FieLdsModel> list = JsonUtil.getJsonToList(formMap.get("fields"), FieLdsModel.class);
  433. JSONArray formJsonArray = JsonUtil.getJsonToJsonArray(String.valueOf(formMap.get("fields")));
  434. List<TableModel> visualTables = JsonUtil.getJsonToList(entity.getVisualTables(), TableModel.class);
  435. List<FormAllModel> formAllModel = new ArrayList<>();
  436. RecursionForm recursionForm = new RecursionForm();
  437. recursionForm.setTableModelList(visualTables);
  438. recursionForm.setList(list);
  439. FormCloumnUtil.recursionForm(recursionForm, formAllModel);
  440. String tableName = "mt" + RandomUtil.uuId();
  441. if (StringUtil.isNotEmpty(formDataModel.getTableName())) {
  442. tableName = formDataModel.getTableName();
  443. visualDevTableCreUtil.checkName(tableName, dbLinkId);
  444. }
  445. VisualTableModel model = new VisualTableModel(formJsonArray, formAllModel, tableName, dbLinkId, entity.getFullName(), concurrencyLock, primaryKeyPolicy, logicalDelete);
  446. List<TableModel> tableModelList = visualDevTableCreUtil.tableList(model);
  447. formMap.put("fields", formJsonArray);
  448. //更新
  449. entity.setFormData(JsonUtil.getObjectToString(formMap));
  450. entity.setVisualTables(JsonUtil.getObjectToString(tableModelList));
  451. }
  452. @Override
  453. public Boolean getPrimaryDbField(String linkId, String table) throws Exception {
  454. DbTableFieldModel dbTableModel = dbTableService.getDbTableModel(linkId, table);
  455. List<DbFieldModel> data = dbTableModel.getDbFieldModelList();
  456. DbFieldModel dbFieldModel = data.stream().filter(DbFieldModel::getIsPrimaryKey).findFirst().orElse(null);
  457. if (dbFieldModel != null) {
  458. return dbFieldModel.getIsAutoIncrement() != null && dbFieldModel.getIsAutoIncrement();
  459. } else {
  460. return null;
  461. }
  462. }
  463. @Override
  464. public List<VisualdevEntity> selectorList(String systemId) {
  465. QueryWrapper<VisualdevEntity> queryWrapper = new QueryWrapper<>();
  466. queryWrapper.lambda().select(
  467. VisualdevEntity::getId,
  468. VisualdevEntity::getFullName,
  469. VisualdevEntity::getWebType,
  470. VisualdevEntity::getType,
  471. VisualdevEntity::getSystemId,
  472. VisualdevEntity::getCategory);
  473. if (StringUtil.isNotEmpty(systemId)) {
  474. queryWrapper.lambda().eq(VisualdevEntity::getSystemId, systemId);
  475. }
  476. return this.list(queryWrapper);
  477. }
  478. @Override
  479. public List<TableFields> storedFieldList(VisualdevEntity entity) {
  480. List<TableFields> resultList = new ArrayList<>();
  481. if (entity != null) {
  482. // 是否存在关联数据库
  483. try {
  484. DbLinkEntity linkEntity = null;
  485. if (StringUtil.isNotEmpty(entity.getDbLinkId())) {
  486. linkEntity = dblinkService.getInfo(entity.getDbLinkId());
  487. }
  488. //获取主表
  489. List<TableModel> listTable = JsonUtil.getJsonToList(entity.getVisualTables(), TableModel.class);
  490. String mainTable = listTable.stream().filter(t -> "1".equals(t.getTypeId())).findFirst().orElse(null).getTable();
  491. //获取主键
  492. String pKeyName = VisualUtils.getpKey(linkEntity, mainTable);
  493. resultList.add(new TableFields(pKeyName, "表单主键"));
  494. FormDataModel formData = JsonUtil.getJsonToBean(entity.getFormData(), FormDataModel.class);
  495. List<FieLdsModel> list = JsonUtil.getJsonToList(formData.getFields(), FieLdsModel.class);
  496. List<FormAllModel> formAllModel = new ArrayList<>();
  497. RecursionForm recursionForm = new RecursionForm();
  498. recursionForm.setTableModelList(JsonUtil.getJsonToList(entity.getVisualTables(), TableModel.class));
  499. recursionForm.setList(list);
  500. FormCloumnUtil.recursionForm(recursionForm, formAllModel);
  501. List<FormAllModel> mast = formAllModel.stream().filter(t -> FormEnum.mast.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
  502. //列表子表数据
  503. List<FormAllModel> mastTable = formAllModel.stream().filter(t -> FormEnum.mastTable.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
  504. for (FormAllModel item : mast) {
  505. FieLdsModel fieLdsModel = item.getFormColumnModel().getFieLdsModel();
  506. addField(fieLdsModel.getVModel(), fieLdsModel, resultList);
  507. }
  508. for (FormAllModel item : mastTable) {
  509. FormMastTableModel formMastTableModel = item.getFormMastTableModel();
  510. FieLdsModel fieLdsModel = formMastTableModel.getMastTable().getFieLdsModel();
  511. addField(formMastTableModel.getVModel(), fieLdsModel, resultList);
  512. }
  513. } catch (Exception e) {
  514. log.error(e.getMessage());
  515. }
  516. }
  517. return resultList;
  518. }
  519. /**
  520. * 添加字段(统一过滤条件)
  521. *
  522. * @param realVmodel
  523. * @param fieLdsModel
  524. * @param resultList
  525. */
  526. private static void addField(String realVmodel, FieLdsModel fieLdsModel, List<TableFields> resultList) {
  527. List<String> list = Arrays.asList(JnpfKeyConsts.COM_INPUT, JnpfKeyConsts.BILLRULE);
  528. if (StringUtil.isNotEmpty(fieLdsModel.getVModel()) && list.contains(fieLdsModel.getConfig().getJnpfKey())) {
  529. resultList.add(new TableFields(realVmodel + JnpfConst.FIELD_SUFFIX_JNPFID, fieLdsModel.getConfig().getLabel()));
  530. }
  531. }
  532. @Override
  533. @Async
  534. public void initFlowState(VisualdevEntity entity) {
  535. DbLinkEntity linkEntity = dblinkService.getInfo(entity.getDbLinkId());
  536. List<TableModel> visualTables = JsonUtil.getJsonToList(entity.getVisualTables(), TableModel.class);
  537. TableModel mainTable = visualTables.stream().filter(t -> "1".equals(t.getTypeId())).findFirst().orElse(null);
  538. if (mainTable == null) {
  539. return;
  540. }
  541. SqlTable sqlTable = SqlTable.of(mainTable.getTable());
  542. String flowTaskIdKey = TableFeildsEnum.FLOWTASKID.getField();
  543. List<String> flowTaskIdList = new ArrayList<>();
  544. try {
  545. DynamicDataSourceUtil.switchToDataSource(linkEntity);
  546. @Cleanup Connection connection = ConnUtil.getConnOrDefault(linkEntity);
  547. String databaseProductName = connection.getMetaData().getDatabaseProductName().trim();
  548. boolean isUpdate = databaseProductName.equalsIgnoreCase("oracle") || databaseProductName.equalsIgnoreCase("DM DBMS");
  549. flowTaskIdKey = isUpdate ? TableFeildsEnum.FLOWTASKID.getField().toUpperCase() : TableFeildsEnum.FLOWTASKID.getField();
  550. QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder where = SqlBuilder.select(sqlTable.column(flowTaskIdKey)).from(sqlTable)
  551. .where(sqlTable.column(TableFeildsEnum.FLOWSTATE.getField()), SqlBuilder.isNull());
  552. SelectStatementProvider render = where.build().render(RenderingStrategies.MYBATIS3);
  553. List<Map<String, Object>> dataList = flowFormDataMapper.selectManyMappedRows(render);
  554. if (dataList.isEmpty()) {
  555. return;
  556. }
  557. //将state为空的全部修改成0
  558. String finalFlowTaskIdKey = flowTaskIdKey;
  559. flowTaskIdList = dataList.stream().map(t -> String.valueOf(t.get(finalFlowTaskIdKey))).collect(Collectors.toList());
  560. List<List<String>> flowTaskIds = Lists.partition(flowTaskIdList, 1000);
  561. UpdateDSL<UpdateModel> updateModelUpdateDSL = SqlBuilder.update(sqlTable);
  562. updateModelUpdateDSL.set(sqlTable.column(TableFeildsEnum.FLOWSTATE.getField())).equalTo(0);
  563. UpdateDSL<UpdateModel>.UpdateWhereBuilder where1 = updateModelUpdateDSL.where();
  564. for (List<String> item : flowTaskIds) {
  565. where1.or(sqlTable.column(flowTaskIdKey), SqlBuilder.isIn(item));
  566. }
  567. UpdateStatementProvider updateSP = where1.build().render(RenderingStrategies.MYBATIS3);
  568. flowFormDataMapper.update(updateSP);
  569. } catch (Exception e) {
  570. e.printStackTrace();
  571. return;
  572. } finally {
  573. DynamicDataSourceUtil.clearSwitchDataSource();
  574. }
  575. List<TaskEntity> tasks = taskApi.getInfosSubmit(flowTaskIdList.toArray(new String[]{}), TaskEntity::getStatus, TaskEntity::getId);
  576. try {
  577. DynamicDataSourceUtil.switchToDataSource(linkEntity);
  578. //根据不同的流程状态分组修改
  579. Map<Integer, List<TaskEntity>> collect = tasks.stream().collect(Collectors.groupingBy(TaskEntity::getStatus));
  580. for (Integer status : collect.keySet()) {
  581. List<TaskEntity> taskList = collect.get(status);
  582. if (!taskList.isEmpty()) {
  583. List<String> itemFlowTaskIds = taskList.stream().map(TaskEntity::getId).collect(Collectors.toList());
  584. if (itemFlowTaskIds.isEmpty()) {
  585. continue;
  586. }
  587. UpdateDSL<UpdateModel> updateDsl = SqlBuilder.update(sqlTable);
  588. updateDsl.set(sqlTable.column(TableFeildsEnum.FLOWSTATE.getField())).equalTo(status);
  589. UpdateDSL<UpdateModel>.UpdateWhereBuilder where2 = updateDsl.where();
  590. List<List<String>> lists = Lists.partition(itemFlowTaskIds, 1000);
  591. for (List<String> item : lists) {
  592. where2.or(sqlTable.column(flowTaskIdKey), SqlBuilder.isIn(item));
  593. }
  594. UpdateStatementProvider updateSP1 = where2.build().render(RenderingStrategies.MYBATIS3);
  595. flowFormDataMapper.update(updateSP1);
  596. }
  597. }
  598. } catch (Exception e) {
  599. e.printStackTrace();
  600. } finally {
  601. DynamicDataSourceUtil.clearSwitchDataSource();
  602. }
  603. }
  604. }