VisualdevModelDataServiceImpl.java 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  1. package jnpf.onlinedev.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import com.baomidou.dynamic.datasource.annotation.DSTransactional;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import jnpf.base.ActionResult;
  7. import jnpf.base.UserInfo;
  8. import jnpf.base.entity.ModuleEntity;
  9. import jnpf.base.entity.VisualdevEntity;
  10. import jnpf.base.entity.VisualdevReleaseEntity;
  11. import jnpf.base.mapper.FlowFormDataMapper;
  12. import jnpf.base.model.*;
  13. import jnpf.base.model.OnlineImport.VisualdevModelDataInfoVO;
  14. import jnpf.base.model.flow.DataModel;
  15. import jnpf.base.model.flow.FlowFormDataModel;
  16. import jnpf.base.model.form.ModuleFormModel;
  17. import jnpf.base.model.module.PropertyJsonModel;
  18. import jnpf.base.service.DbLinkService;
  19. import jnpf.base.service.ModuleService;
  20. import jnpf.base.service.SuperServiceImpl;
  21. import jnpf.base.service.VisualdevReleaseService;
  22. import jnpf.base.util.FlowFormDataUtil;
  23. import jnpf.base.util.FormCheckUtils;
  24. import jnpf.constant.MsgCode;
  25. import jnpf.database.model.entity.DbLinkEntity;
  26. import jnpf.database.model.superQuery.SuperJsonModel;
  27. import jnpf.database.model.superQuery.SuperQueryJsonModel;
  28. import jnpf.database.util.ConnUtil;
  29. import jnpf.database.util.DynamicDataSourceUtil;
  30. import jnpf.exception.DataException;
  31. import jnpf.exception.WorkFlowException;
  32. import jnpf.flowable.entity.TaskEntity;
  33. import jnpf.model.OnlineDevData;
  34. import jnpf.model.visualJson.FieLdsModel;
  35. import jnpf.model.visualJson.FormCloumnUtil;
  36. import jnpf.model.visualJson.FormDataModel;
  37. import jnpf.model.visualJson.TableModel;
  38. import jnpf.model.visualJson.analysis.FormAllModel;
  39. import jnpf.model.visualJson.analysis.FormModel;
  40. import jnpf.model.visualJson.analysis.RecursionForm;
  41. import jnpf.onlinedev.entity.VisualdevModelDataEntity;
  42. import jnpf.onlinedev.mapper.VisualdevModelDataMapper;
  43. import jnpf.onlinedev.model.OnlineDevListModel.VisualColumnSearchVO;
  44. import jnpf.onlinedev.model.OnlineInfoModel;
  45. import jnpf.onlinedev.model.PaginationModel;
  46. import jnpf.onlinedev.model.PaginationModelExport;
  47. import jnpf.onlinedev.model.VisualParamModel;
  48. import jnpf.onlinedev.model.log.VisualLogForm;
  49. import jnpf.onlinedev.service.VisualDevInfoService;
  50. import jnpf.onlinedev.service.VisualDevListService;
  51. import jnpf.onlinedev.service.VisualLogService;
  52. import jnpf.onlinedev.service.VisualdevModelDataService;
  53. import jnpf.onlinedev.util.onlineDevUtil.OnlineDevInfoUtils;
  54. import jnpf.onlinedev.util.onlineDevUtil.OnlineProductSqlUtils;
  55. import jnpf.onlinedev.util.onlineDevUtil.OnlinePublicUtils;
  56. import jnpf.onlinedev.util.onlineDevUtil.OnlineSwapDataUtils;
  57. import jnpf.permission.entity.UserEntity;
  58. import jnpf.permission.model.authorize.OnlineDynamicSqlModel;
  59. import jnpf.permission.service.UserService;
  60. import jnpf.permissions.PermissionInterfaceImpl;
  61. import jnpf.util.*;
  62. import jnpf.util.context.RequestContext;
  63. import jnpf.util.visiual.JnpfKeyConsts;
  64. import jnpf.workflow.service.TaskApi;
  65. import jnpf.workflow.service.TemplateApi;
  66. import lombok.Cleanup;
  67. import org.mybatis.dynamic.sql.SqlBuilder;
  68. import org.mybatis.dynamic.sql.SqlTable;
  69. import org.mybatis.dynamic.sql.delete.DeleteDSL;
  70. import org.mybatis.dynamic.sql.delete.DeleteModel;
  71. import org.mybatis.dynamic.sql.render.RenderingStrategies;
  72. import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
  73. import org.mybatis.dynamic.sql.select.SelectModel;
  74. import org.springframework.beans.factory.annotation.Autowired;
  75. import org.springframework.stereotype.Service;
  76. import org.springframework.transaction.annotation.Transactional;
  77. import java.io.IOException;
  78. import java.sql.Connection;
  79. import java.sql.SQLException;
  80. import java.text.ParseException;
  81. import java.util.*;
  82. import java.util.stream.Collectors;
  83. /**
  84. * @author JNPF开发平台组
  85. * @version V3.1.0
  86. * @copyright 引迈信息技术有限公司(https://www.jnpfsoft.com)
  87. * @date 2021/3/16
  88. */
  89. @Service
  90. public class VisualdevModelDataServiceImpl extends SuperServiceImpl<VisualdevModelDataMapper, VisualdevModelDataEntity> implements VisualdevModelDataService {
  91. @Autowired
  92. private UserService userApi;
  93. @Autowired
  94. private DbLinkService dblinkService;
  95. @Autowired
  96. private VisualdevReleaseService visualdevReleaseService;
  97. @Autowired
  98. private VisualDevListService visualDevListService;
  99. @Autowired
  100. private OnlineSwapDataUtils onlineSwapDataUtils;
  101. @Autowired
  102. private FlowFormDataUtil flowFormDataUtil;
  103. @Autowired
  104. private FormCheckUtils formCheckUtils;
  105. @Autowired
  106. private TemplateApi templateApi;
  107. @Autowired
  108. private TaskApi taskApi;
  109. @Autowired
  110. private ModuleService moduleService;
  111. @Autowired
  112. private VisualLogService visualLogService;
  113. @Autowired
  114. private VisualDevInfoService visualDevInfoService;
  115. @Autowired
  116. private FlowFormDataMapper flowFormDataMapper;
  117. @Override
  118. public List<VisualdevModelDataEntity> getList(String modelId) {
  119. QueryWrapper<VisualdevModelDataEntity> queryWrapper = new QueryWrapper<>();
  120. queryWrapper.lambda().eq(VisualdevModelDataEntity::getVisualDevId, modelId);
  121. return this.list(queryWrapper);
  122. }
  123. /**
  124. * 表单字段
  125. *
  126. * @param id
  127. * @param filterType 过滤类型,0或者不传为默认过滤子表和关联表单,1-弹窗配置需要过滤掉的类型
  128. * @return
  129. */
  130. @Override
  131. public List<FormDataField> fieldList(String id, Integer filterType) {
  132. VisualdevReleaseEntity entity = visualdevReleaseService.getById(id);
  133. FormDataModel formData = JsonUtil.getJsonToBean(entity.getFormData(), FormDataModel.class);
  134. List<FieLdsModel> fieLdsModelList = JsonUtil.getJsonToList(formData.getFields(), FieLdsModel.class);
  135. List<FieLdsModel> mainFieldModelList = new ArrayList<>();
  136. OnlinePublicUtils.recursionFields(mainFieldModelList, fieLdsModelList);
  137. //过滤掉无法传递的组件
  138. List<String> notInList = new ArrayList<>();
  139. notInList.add(JnpfKeyConsts.RELATIONFORM);
  140. notInList.add(JnpfKeyConsts.CHILD_TABLE);
  141. if (Objects.equals(filterType, 1)) {
  142. notInList.add("link");
  143. notInList.add("button");
  144. notInList.add("JNPFText");
  145. notInList.add("alert");
  146. notInList.add(JnpfKeyConsts.POPUPSELECT);
  147. notInList.add(JnpfKeyConsts.QR_CODE);
  148. notInList.add(JnpfKeyConsts.BARCODE);
  149. notInList.add(JnpfKeyConsts.CREATEUSER);
  150. notInList.add(JnpfKeyConsts.CREATETIME);
  151. notInList.add(JnpfKeyConsts.UPLOADIMG);
  152. notInList.add(JnpfKeyConsts.UPLOADFZ);
  153. notInList.add(JnpfKeyConsts.MODIFYUSER);
  154. notInList.add(JnpfKeyConsts.MODIFYTIME);
  155. notInList.add(JnpfKeyConsts.CURRORGANIZE);
  156. notInList.add(JnpfKeyConsts.CURRPOSITION);
  157. notInList.add(JnpfKeyConsts.IFRAME);
  158. notInList.add(JnpfKeyConsts.RELATIONFORM_ATTR);
  159. notInList.add(JnpfKeyConsts.POPUPSELECT_ATTR);
  160. }
  161. List<FormDataField> formDataFieldList = mainFieldModelList.stream().filter(fieLdsModel ->
  162. !"".equals(fieLdsModel.getVModel())
  163. && StringUtil.isNotEmpty(fieLdsModel.getVModel())
  164. && !notInList.contains(fieLdsModel.getConfig().getJnpfKey())
  165. ).map(fieLdsModel -> {
  166. FormDataField formDataField = new FormDataField();
  167. formDataField.setLabel(fieLdsModel.getConfig().getLabel());
  168. formDataField.setVModel(fieLdsModel.getVModel());
  169. return formDataField;
  170. }).collect(Collectors.toList());
  171. return formDataFieldList;
  172. }
  173. @Override
  174. public List<Map<String, Object>> getPageList(VisualdevEntity entity, PaginationModel paginationModel) {
  175. // String json = null;
  176. // if (StringUtil.isNotEmpty(paginationModel.getKeyword())) {
  177. // Map<String, Object> map = new HashMap<>();
  178. // map.put(paginationModel.getRelationField(), paginationModel.getKeyword());
  179. // json = JsonUtil.getObjectToString(map);
  180. // }
  181. // paginationModel.setQueryJson(json);
  182. VisualDevJsonModel visualJsonModel = OnlinePublicUtils.getVisualJsonModel(entity);
  183. //判断请求客户端来源
  184. if (!RequestContext.isOrignPc()) {
  185. visualJsonModel.setColumnData(visualJsonModel.getAppColumnData());
  186. }
  187. List<Map<String, Object>> dataList = visualDevListService.getRelationFormList(visualJsonModel, paginationModel);
  188. return dataList;
  189. }
  190. @Override
  191. public List<Map<String, Object>> exportData(String[] keys, PaginationModelExport paginationModelExport, VisualDevJsonModel visualDevJsonModel) {
  192. PaginationModel paginationModel = new PaginationModel();
  193. BeanUtil.copyProperties(paginationModelExport, paginationModel);
  194. List<String> keyList = Arrays.asList(keys);
  195. List<Map<String, Object>> noSwapDataList;
  196. ColumnDataModel columnDataModel = visualDevJsonModel.getColumnData();
  197. List<VisualColumnSearchVO> searchVOList = new ArrayList<>();
  198. List<TableModel> visualTables = visualDevJsonModel.getVisualTables();
  199. TableModel mainTable = visualTables.stream().filter(vi -> vi.getTypeId().equals("1")).findFirst().orElse(null);
  200. //解析控件
  201. FormDataModel formDataModel = visualDevJsonModel.getFormData();
  202. List<FieLdsModel> fieLdsModels = JsonUtil.getJsonToList(formDataModel.getFields(), FieLdsModel.class);
  203. RecursionForm recursionForm = new RecursionForm(fieLdsModels, visualTables);
  204. List<FormAllModel> formAllModel = new ArrayList<>();
  205. FormCloumnUtil.recursionForm(recursionForm, formAllModel);
  206. //封装查询条件
  207. if (StringUtil.isNotEmpty(paginationModel.getQueryJson())) {
  208. Map<String, Object> keyJsonMap = JsonUtil.stringToMap(paginationModel.getQueryJson());
  209. searchVOList = JsonUtil.getJsonToList(columnDataModel.getSearchList(), VisualColumnSearchVO.class);
  210. searchVOList = searchVOList.stream().map(searchVO -> {
  211. searchVO.setValue(keyJsonMap.get(searchVO.getId()));
  212. return searchVO;
  213. }).filter(vo -> vo.getValue() != null && StringUtil.isNotEmpty(String.valueOf(vo.getValue()))).collect(Collectors.toList());
  214. //左侧树查询
  215. boolean b = false;
  216. if (columnDataModel.getTreeRelation() != null) {
  217. b = keyJsonMap.keySet().stream().anyMatch(t -> t.equalsIgnoreCase(String.valueOf(columnDataModel.getTreeRelation())));
  218. }
  219. if (b && keyJsonMap.size() > searchVOList.size()) {
  220. String relation = String.valueOf(columnDataModel.getTreeRelation());
  221. VisualColumnSearchVO vo = new VisualColumnSearchVO();
  222. vo.setSearchType("1");
  223. vo.setVModel(relation);
  224. vo.setValue(keyJsonMap.get(relation));
  225. searchVOList.add(vo);
  226. }
  227. }
  228. //菜单id
  229. String menuId = paginationModel.getMenuId();
  230. //菜单判断是否启用流程-添加流程状态
  231. ModuleEntity info = moduleService.getInfo(menuId);
  232. if (info != null) {
  233. //流程菜单
  234. boolean enableFlow = Objects.equals(info.getType(), 9);
  235. visualDevJsonModel.setEnableFlow(enableFlow);
  236. if (enableFlow) {
  237. PropertyJsonModel model = JsonUtil.getJsonToBean(info.getPropertyJson(), PropertyJsonModel.class);
  238. List<String> flowVersionIds = templateApi.getFlowIdsByTemplateId(model.getModuleId());
  239. visualDevJsonModel.setFlowId(model.getModuleId());
  240. visualDevJsonModel.setFlowVersionIds(flowVersionIds);
  241. }
  242. }
  243. if (visualDevJsonModel.getVisualTables().size() > 0) {
  244. //当前用户信息
  245. UserInfo userInfo = UserProvider.getUser();
  246. //封装搜索数据
  247. OnlineProductSqlUtils.queryList(formAllModel, visualDevJsonModel, paginationModel);
  248. noSwapDataList = visualDevListService.getListWithTable(visualDevJsonModel, paginationModel, userInfo, keyList);
  249. } else {
  250. noSwapDataList = visualDevListService.getWithoutTableData(visualDevJsonModel.getId());
  251. noSwapDataList = visualDevListService.getList(noSwapDataList, searchVOList, paginationModel);
  252. }
  253. //数据转换
  254. List<FieLdsModel> fields = new ArrayList<>();
  255. OnlinePublicUtils.recursionFields(fields, fieLdsModels);
  256. noSwapDataList = onlineSwapDataUtils.getSwapList(noSwapDataList, fields, visualDevJsonModel.getId(), false);
  257. return noSwapDataList;
  258. }
  259. @Override
  260. public VisualdevModelDataEntity getInfo(String id) {
  261. QueryWrapper<VisualdevModelDataEntity> queryWrapper = new QueryWrapper<>();
  262. queryWrapper.lambda().eq(VisualdevModelDataEntity::getId, id);
  263. return this.getOne(queryWrapper);
  264. }
  265. @Override
  266. public DataModel visualCreate(VisualParamModel visualParamModel) throws Exception {
  267. VisualdevEntity visualdevEntity = visualParamModel.getVisualdevEntity();
  268. Map<String, Object> map = visualParamModel.getData();
  269. boolean isLink = visualParamModel.getIsLink();
  270. boolean isUpload = visualParamModel.getIsUpload();
  271. FormDataModel formData = JsonUtil.getJsonToBean(visualdevEntity.getFormData(), FormDataModel.class);
  272. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(visualdevEntity.getColumnData(), ColumnDataModel.class);
  273. Boolean needP = false;
  274. List<String> formPerList = new ArrayList<>();
  275. if (columnDataModel != null && StringUtil.isNotEmpty(visualParamModel.getMenuId())) {
  276. needP = columnDataModel.getUseFormPermission();
  277. Map<String, Object> pMap = PermissionInterfaceImpl.getFormMap();
  278. if (pMap.get(visualParamModel.getMenuId()) != null) {
  279. formPerList = JsonUtil.getJsonToList(pMap.get(visualParamModel.getMenuId()), ModuleFormModel.class).stream()
  280. .map(ModuleFormModel::getEnCode).collect(Collectors.toList());
  281. }
  282. }
  283. List<FieLdsModel> list = JsonUtil.getJsonToList(formData.getFields(), FieLdsModel.class);
  284. List<TableModel> tableModels = JsonUtil.getJsonToList(visualdevEntity.getVisualTables(), TableModel.class);
  285. DbLinkEntity linkEntity = StringUtil.isNotEmpty(visualdevEntity.getDbLinkId()) ? dblinkService.getInfo(visualdevEntity.getDbLinkId()) : null;
  286. //递归遍历模板
  287. RecursionForm recursionForm = new RecursionForm(list, tableModels);
  288. List<FormAllModel> formAllModel = new ArrayList<>();
  289. FormCloumnUtil.recursionForm(recursionForm, formAllModel);
  290. //是否开启并发锁
  291. Boolean concurrency = false;
  292. Integer primaryKeyPolicy = formData.getPrimaryKeyPolicy();
  293. if (formData.getConcurrencyLock()) {
  294. //初始化version值
  295. map.put(TableFeildsEnum.VERSION.getField(), 0);
  296. concurrency = true;
  297. }
  298. OnlineSwapDataUtils.swapDatetime(list, map);
  299. //单行唯一校验
  300. if (!isUpload) {
  301. CheckFormModel checkFormModel = CheckFormModel.builder().formFieldList(list).dataMap(map).linkEntity(linkEntity).tableModelList(tableModels)
  302. .visualdevEntity(visualdevEntity).id(null).isLink(isLink).build();
  303. String b = formCheckUtils.checkForm(checkFormModel);
  304. if (StringUtil.isNotEmpty(b)) {
  305. throw new WorkFlowException(b);
  306. }
  307. }
  308. String mainId = RandomUtil.uuId();
  309. UserInfo userInfo = UserProvider.getUser();
  310. UserEntity info = userApi.getInfo(userInfo.getUserId());
  311. DataModel dataModel = DataModel.builder().visualId(visualdevEntity.getId())
  312. .dataNewMap(map).fieLdsModelList(list).tableModelList(tableModels).formAllModel(formAllModel)
  313. .mainId(mainId).link(linkEntity).userEntity(info).concurrencyLock(concurrency)
  314. .primaryKeyPolicy(primaryKeyPolicy).linkOpen(isLink)
  315. .needPermission(needP).formPerList(formPerList)
  316. .build();
  317. flowFormDataUtil.create(dataModel);
  318. //数据日志
  319. if (formData.isDataLog() && !isUpload && !isLink) {
  320. visualLogService.createEventLog(VisualLogForm.builder().modelId(visualdevEntity.getId()).dataId(dataModel.getMainId()).newData(map).type(0).build());
  321. }
  322. return dataModel;
  323. }
  324. @Override
  325. public DataModel visualUpdate(VisualParamModel visualParamModel) throws Exception {
  326. VisualdevEntity visualdevEntity = visualParamModel.getVisualdevEntity();
  327. Map<String, Object> map = visualParamModel.getData();
  328. String id = visualParamModel.getId();
  329. boolean isUpload = visualParamModel.getIsUpload();
  330. boolean onlyUpdate = visualParamModel.getOnlyUpdate();
  331. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(visualdevEntity.getColumnData(), ColumnDataModel.class);
  332. FormDataModel formData = JsonUtil.getJsonToBean(visualdevEntity.getFormData(), FormDataModel.class);
  333. Boolean needP = false;
  334. List<String> formPerList = new ArrayList<>();
  335. if (columnDataModel != null && StringUtil.isNotEmpty(visualParamModel.getMenuId())) {
  336. needP = columnDataModel.getUseFormPermission();
  337. Map<String, Object> pMap = PermissionInterfaceImpl.getFormMap();
  338. if (pMap.get(visualParamModel.getMenuId()) != null) {
  339. formPerList = JsonUtil.getJsonToList(pMap.get(visualParamModel.getMenuId()), ModuleFormModel.class).stream()
  340. .map(ModuleFormModel::getEnCode).collect(Collectors.toList());
  341. }
  342. }
  343. List<FieLdsModel> list = JsonUtil.getJsonToList(formData.getFields(), FieLdsModel.class);
  344. boolean inlineEdit = columnDataModel.getType() != null && columnDataModel.getType() == 4;
  345. if (inlineEdit && RequestContext.isOrignPc()) {
  346. list = JsonUtil.getJsonToList(columnDataModel.getColumnList(), FieLdsModel.class);
  347. list = list.stream().filter(f -> !f.getId().toLowerCase().contains(JnpfKeyConsts.CHILD_TABLE_PREFIX)).collect(Collectors.toList());
  348. }
  349. List<TableModel> tableModels = JsonUtil.getJsonToList(visualdevEntity.getVisualTables(), TableModel.class);
  350. TableModel mainT = tableModels.stream().filter(t -> t.getTypeId().equals("1")).findFirst().orElse(null);
  351. DbLinkEntity linkEntity = StringUtil.isNotEmpty(visualdevEntity.getDbLinkId()) ? dblinkService.getInfo(visualdevEntity.getDbLinkId()) : null;
  352. //递归遍历模板
  353. RecursionForm recursionForm = new RecursionForm(list, tableModels);
  354. List<FormAllModel> formAllModel = new ArrayList<>();
  355. FormCloumnUtil.recursionForm(recursionForm, formAllModel);
  356. //是否开启并发锁
  357. Boolean isConcurrencyLock = false;
  358. Integer primaryKeyPolicy = formData.getPrimaryKeyPolicy();
  359. if (formData.getConcurrencyLock()) {
  360. if (map.get(TableFeildsEnum.VERSION.getField()) == null) {
  361. map.put(TableFeildsEnum.VERSION.getField(), 0);
  362. } else {
  363. boolean version = true;
  364. try {
  365. Object realId = id;
  366. if (Objects.equals(primaryKeyPolicy, 2)) {
  367. realId = Long.parseLong(id);
  368. }
  369. version = flowFormDataUtil.getVersion(mainT.getTable(), linkEntity, map, realId);
  370. } catch (Exception e) {
  371. throw new WorkFlowException(e.getMessage(), e);
  372. }
  373. if (!version) {
  374. throw new WorkFlowException(MsgCode.VS405.get());
  375. } else {
  376. Integer vs = Integer.valueOf(String.valueOf(map.get(TableFeildsEnum.VERSION.getField())));
  377. map.put(TableFeildsEnum.VERSION.getField(), vs + 1);
  378. }
  379. }
  380. isConcurrencyLock = true;
  381. }
  382. OnlineSwapDataUtils.swapDatetime(list, map);
  383. //单行唯一校验
  384. if (!isUpload) {
  385. CheckFormModel checkFormModel = CheckFormModel.builder().formFieldList(list).dataMap(map).linkEntity(linkEntity).tableModelList(tableModels)
  386. .visualdevEntity(visualdevEntity).id(id).build();
  387. String b = formCheckUtils.checkForm(checkFormModel);
  388. if (StringUtil.isNotEmpty(b)) {
  389. throw new WorkFlowException(b);
  390. }
  391. }
  392. //数据日志
  393. VisualdevModelDataInfoVO resOld = visualDevInfoService.getDetailsDataInfo(id, visualdevEntity,
  394. OnlineInfoModel.builder().needRlationFiled(true).needSwap(false).formAllModel(formAllModel).build());
  395. Map<String, Object> oldData = JsonUtil.stringToMap(resOld.getData());
  396. UserInfo userInfo = UserProvider.getUser();
  397. UserEntity info = userApi.getInfo(userInfo.getUserId());
  398. DataModel dataModel = DataModel.builder().visualId(visualdevEntity.getId())
  399. .dataNewMap(map).fieLdsModelList(list).tableModelList(tableModels).formAllModel(formAllModel)
  400. .mainId(id).link(linkEntity).userEntity(info).concurrencyLock(isConcurrencyLock)
  401. .primaryKeyPolicy(primaryKeyPolicy).onlyUpdate(onlyUpdate).logicalDelete(formData.getLogicalDelete())
  402. .needPermission(needP).formPerList(formPerList)
  403. .build();
  404. flowFormDataUtil.update(dataModel);
  405. VisualdevModelDataInfoVO res = visualDevInfoService.getDetailsDataInfo(id, visualdevEntity,
  406. OnlineInfoModel.builder().needRlationFiled(true).needSwap(false).formAllModel(formAllModel).build());
  407. Map<String, Object> newData = JsonUtil.stringToMap(res.getData());
  408. VisualLogForm form = VisualLogForm.builder().modelId(visualdevEntity.getId()).dataId(id).oldData(oldData).newData(newData).type(1).build();
  409. //处理变更字段信息-任务流程用
  410. List<VisualLogModel> listLog = new ArrayList<>();
  411. visualLogService.addLog(form, listLog);
  412. dataModel.setListLog(listLog);
  413. //数据日志
  414. if (formData.isDataLog() && !isUpload) {
  415. form.setListLog(listLog);
  416. visualLogService.createEventLog(form);
  417. }
  418. return dataModel;
  419. }
  420. @Override
  421. public void visualDelete(VisualdevEntity visualdevEntity, List<Map<String, Object>> data) throws Exception {
  422. VisualDevJsonModel visualJsonModel = OnlinePublicUtils.getVisualJsonModel(visualdevEntity);
  423. //判断请求客户端来源
  424. if (!RequestContext.isOrignPc()) {
  425. visualJsonModel.setColumnData(visualJsonModel.getAppColumnData());
  426. }
  427. List<String> idsList = new ArrayList<>();
  428. StringJoiner errMess = new StringJoiner(",");
  429. //todo 流程关联
  430. for (Map<String, Object> map : data) {
  431. String id = String.valueOf(map.get(FlowFormConstant.ID));
  432. TaskEntity taskEntity = taskApi.getInfoSubmit(String.valueOf(map.get(FlowFormConstant.FLOWTASKID)), TaskEntity::getId,
  433. TaskEntity::getParentId, TaskEntity::getFullName, TaskEntity::getStatus);
  434. if (taskEntity != null) {
  435. try {
  436. taskApi.delete(taskEntity);
  437. idsList.add(id);
  438. } catch (Exception e) {
  439. errMess.add(e.getMessage());
  440. }
  441. } else {
  442. idsList.add(id);
  443. }
  444. }
  445. if (idsList.size() == 0) {
  446. throw new WorkFlowException(errMess.toString());
  447. }
  448. if (!StringUtil.isEmpty(visualdevEntity.getVisualTables()) && !OnlineDevData.TABLE_CONST.equals(visualdevEntity.getVisualTables())) {
  449. for (String id : idsList) {
  450. try {
  451. tableDelete(id, visualJsonModel);
  452. } catch (Exception e) {
  453. throw new WorkFlowException(e.getMessage(), e);
  454. }
  455. }
  456. }
  457. }
  458. @Transactional(rollbackFor = Exception.class)
  459. @Override
  460. public void delete(VisualdevModelDataEntity entity) {
  461. if (entity != null) {
  462. this.removeById(entity.getId());
  463. }
  464. }
  465. @Override
  466. public boolean tableDelete(String id, VisualDevJsonModel visualDevJsonModel) throws Exception {
  467. DbLinkEntity linkEntity = dblinkService.getInfo(visualDevJsonModel.getDbLinkId());
  468. VisualDevJsonModel model = BeanUtil.copyProperties(visualDevJsonModel, VisualDevJsonModel.class);
  469. return flowFormDataUtil.deleteTable(id, model, linkEntity);
  470. }
  471. @Override
  472. public ActionResult tableDeleteMore(List<String> ids, VisualDevJsonModel visualDevJsonModel) throws Exception {
  473. List<String> dataInfoVOList = new ArrayList<>();
  474. for (String id : ids) {
  475. boolean isDel = tableDelete(id, visualDevJsonModel);
  476. if (isDel) {
  477. dataInfoVOList.add(id);
  478. }
  479. }
  480. visualDevJsonModel.setDataIdList(dataInfoVOList);
  481. return ActionResult.success(MsgCode.SU003.get());
  482. }
  483. @Override
  484. @DSTransactional
  485. public void deleteByTableName(FlowFormDataModel model) throws Exception {
  486. String tableName = model.getTableName();
  487. List<Map<String, Object>> ruleList = model.getRuleList();
  488. String realTableName = tableName;
  489. VisualdevReleaseEntity entity = visualdevReleaseService.getById(model.getFormId());
  490. List<TableModel> tableModels = JsonUtil.getJsonToList(entity.getVisualTables(), TableModel.class);
  491. FormDataModel formData = JsonUtil.getJsonToBean(entity.getFormData(), FormDataModel.class);
  492. Boolean logicalDelete = formData.getLogicalDelete();
  493. DbLinkEntity linkEntity = StringUtil.isNotEmpty(entity.getDbLinkId()) ? dblinkService.getInfo(entity.getDbLinkId()) : null;
  494. List<FieLdsModel> fieLdsModels = JsonUtil.getJsonToList(formData.getFields(), FieLdsModel.class);
  495. List<FieLdsModel> fields = new ArrayList<>();
  496. OnlinePublicUtils.recursionFields(fields, fieLdsModels);
  497. if (StringUtil.isNotEmpty(tableName) && tableName.toLowerCase().contains(JnpfKeyConsts.CHILD_TABLE_PREFIX)) {
  498. FieLdsModel fieLdsModel = fields.stream().filter(t -> t.getVModel().equalsIgnoreCase(tableName)).findFirst().orElse(null);
  499. if (fieLdsModel != null) {
  500. realTableName = fieLdsModel.getConfig().getTableName();
  501. }
  502. }
  503. String finalRealTableName = realTableName;
  504. TableModel tableModel = tableModels.stream().filter(t -> t.getTable().equals(finalRealTableName)).findFirst().orElse(null);
  505. List<OnlineDynamicSqlModel> sqlModelList = new ArrayList<>();
  506. OnlineDynamicSqlModel sqlModel = new OnlineDynamicSqlModel();
  507. SqlTable sqlTable = SqlTable.of(tableModel.getTable());
  508. sqlModel.setSqlTable(sqlTable);
  509. sqlModel.setTableName(tableModel.getTable());
  510. sqlModelList.add(sqlModel);
  511. SuperJsonModel ruleJsonModel = null;
  512. //组装查询条件
  513. if (ObjectUtil.isNotEmpty(ruleList)) {
  514. ruleJsonModel = new SuperJsonModel();
  515. ruleJsonModel.setMatchLogic(model.getRuleMatchLogic());
  516. List<SuperQueryJsonModel> superQueryJsonModelList = new ArrayList<>();
  517. for (Object obj : ruleList) {
  518. SuperQueryJsonModel ruleQueryModel = JsonUtil.getJsonToBean(obj, SuperQueryJsonModel.class);
  519. List<FieLdsModel> groups = ruleQueryModel.getGroups();
  520. if (ObjectUtil.isNotEmpty(groups)) {
  521. groups.stream().forEach(group -> {
  522. if (group.getId().toLowerCase().contains(JnpfKeyConsts.CHILD_TABLE_PREFIX)) {
  523. group.setVModel(group.getId().split("-")[1]);
  524. }
  525. });
  526. }
  527. superQueryJsonModelList.add(ruleQueryModel);
  528. }
  529. ruleJsonModel.setConditionList(superQueryJsonModelList);
  530. }
  531. DynamicDataSourceUtil.switchToDataSource(linkEntity);
  532. try {
  533. @Cleanup Connection conn = ConnUtil.getConnOrDefault(linkEntity);
  534. String dbType = conn.getMetaData().getDatabaseProductName().trim();
  535. String pkeyId = flowFormDataUtil.getKey(tableModel, dbType);
  536. List<Object> idStringList = new ArrayList<>();
  537. if (ObjectUtil.isNotEmpty(ruleJsonModel)) {
  538. QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder where = SqlBuilder.selectDistinct(sqlTable.column(pkeyId)).from(sqlTable).where();
  539. OnlineProductSqlUtils.getSuperSql(where, ruleJsonModel, sqlModelList, dbType, null, false);
  540. List<Map<String, Object>> dataList = flowFormDataMapper.selectManyMappedRows(where.build().render(RenderingStrategies.MYBATIS3));
  541. idStringList = dataList.stream().map(m -> m.get(pkeyId)).distinct().collect(Collectors.toList());
  542. if (ObjectUtil.isEmpty(idStringList)) {
  543. idStringList.add("nodata");
  544. }
  545. }
  546. // if (logicalDelete) {
  547. // SqlTable sqlt = SqlTable.of(tableModel.getTable());
  548. // UpdateDSL<UpdateModel> updateModelUpdateDSL = SqlBuilder.update(sqlt);
  549. // updateModelUpdateDSL.set(sqlt.column(TableFeildsEnum.DELETEMARK.getField())).equalTo(1);
  550. // updateModelUpdateDSL.set(sqlt.column(TableFeildsEnum.DELETETIME.getField())).equalTo(new Date());
  551. // updateModelUpdateDSL.set(sqlt.column(TableFeildsEnum.DELETEUSERID.getField())).equalTo(UserProvider.getUser().getUserId());
  552. // UpdateDSL<UpdateModel>.UpdateWhereBuilder whereU = updateModelUpdateDSL.where();
  553. // if (ObjectUtil.isNotEmpty(idStringList)) {
  554. // whereU.and(sqlTable.column(pkeyId), SqlBuilder.isIn(idStringList));
  555. // }
  556. // flowFormDataMapper.update(whereU.build().render(RenderingStrategies.MYBATIS3));
  557. // } else {
  558. DeleteDSL<DeleteModel>.DeleteWhereBuilder whereD = SqlBuilder.deleteFrom(SqlTable.of(tableModel.getTable())).where();
  559. if (ObjectUtil.isNotEmpty(idStringList)) {
  560. whereD.and(sqlTable.column(pkeyId), SqlBuilder.isIn(idStringList));
  561. }
  562. flowFormDataMapper.delete(whereD.build().render(RenderingStrategies.MYBATIS3));
  563. // }
  564. } catch (Exception e) {
  565. e.printStackTrace();
  566. throw new WorkFlowException(MsgCode.FA103.get(),e.getMessage());
  567. } finally {
  568. DynamicDataSourceUtil.clearSwitchDataSource();
  569. }
  570. }
  571. }