FlowFormDataUtil.java 83 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646
  1. package jnpf.base.util;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import com.baomidou.dynamic.datasource.annotation.DSTransactional;
  6. import jnpf.base.UserInfo;
  7. import jnpf.base.entity.VisualdevEntity;
  8. import jnpf.base.mapper.FlowFormDataMapper;
  9. import jnpf.base.model.ColumnDataModel;
  10. import jnpf.base.model.VisualConst;
  11. import jnpf.base.model.VisualDevJsonModel;
  12. import jnpf.base.model.flow.DataModel;
  13. import jnpf.base.model.form.ModuleFormModel;
  14. import jnpf.config.ConfigValueUtil;
  15. import jnpf.constant.MsgCode;
  16. import jnpf.database.model.dbtable.JdbcTableModel;
  17. import jnpf.database.model.entity.DbLinkEntity;
  18. import jnpf.database.util.ConnUtil;
  19. import jnpf.database.util.DbTypeUtil;
  20. import jnpf.database.util.DynamicDataSourceUtil;
  21. import jnpf.database.util.TenantDataSourceUtil;
  22. import jnpf.exception.DataException;
  23. import jnpf.exception.WorkFlowException;
  24. import jnpf.model.visualJson.*;
  25. import jnpf.model.visualJson.analysis.*;
  26. import jnpf.onlinedev.model.OnlineInfoModel;
  27. import jnpf.permission.entity.OrganizeEntity;
  28. import jnpf.permission.entity.UserEntity;
  29. import jnpf.permissions.PermissionInterfaceImpl;
  30. import jnpf.util.*;
  31. import jnpf.util.visiual.JnpfKeyConsts;
  32. import lombok.Cleanup;
  33. import lombok.extern.slf4j.Slf4j;
  34. import org.apache.commons.collections4.CollectionUtils;
  35. import org.apache.commons.collections4.MapUtils;
  36. import org.apache.commons.collections4.map.CaseInsensitiveMap;
  37. import org.mybatis.dynamic.sql.AndOrCriteriaGroup;
  38. import org.mybatis.dynamic.sql.BasicColumn;
  39. import org.mybatis.dynamic.sql.SqlBuilder;
  40. import org.mybatis.dynamic.sql.SqlTable;
  41. import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider;
  42. import org.mybatis.dynamic.sql.insert.GeneralInsertDSL;
  43. import org.mybatis.dynamic.sql.insert.render.GeneralInsertStatementProvider;
  44. import org.mybatis.dynamic.sql.render.RenderingStrategies;
  45. import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
  46. import org.mybatis.dynamic.sql.select.SelectModel;
  47. import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
  48. import org.mybatis.dynamic.sql.update.UpdateDSL;
  49. import org.mybatis.dynamic.sql.update.UpdateModel;
  50. import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
  51. import org.springframework.beans.factory.annotation.Autowired;
  52. import org.springframework.stereotype.Component;
  53. import java.math.BigDecimal;
  54. import java.sql.Connection;
  55. import java.sql.SQLException;
  56. import java.text.ParseException;
  57. import java.text.SimpleDateFormat;
  58. import java.util.*;
  59. import java.util.stream.Collectors;
  60. @Component
  61. @Slf4j
  62. public class FlowFormDataUtil {
  63. @Autowired
  64. private ConfigValueUtil configValueUtil;
  65. @Autowired
  66. private ServiceBaseUtil serviceUtil;
  67. @Autowired
  68. private FlowFormDataMapper flowFormDataMapper;
  69. @Autowired
  70. private FormInfoUtils formInfoUtils;
  71. @Autowired
  72. private VisualBillUtil visualBillUtil;
  73. /**
  74. * 从数据库取表主键
  75. *
  76. * @param conn
  77. * @param tableName 表名
  78. * @return
  79. */
  80. public String getTableKey(Connection conn, String tableName) throws SQLException {
  81. String pKeyName = JdbcTableModel.getPrimaryExculde(conn, tableName, configValueUtil.getMultiTenantColumn());
  82. if (StringUtil.isEmpty(pKeyName)) {
  83. pKeyName = TableFeildsEnum.FID.getField();
  84. }
  85. String databaseProductName = conn.getMetaData().getDatabaseProductName().trim();
  86. if (DbTypeUtil.needToUpperCase(databaseProductName)) {
  87. pKeyName = pKeyName.toUpperCase();
  88. }
  89. return pKeyName;
  90. }
  91. /**
  92. * 从配置取主键
  93. *
  94. * @param tableModel
  95. * @return String
  96. */
  97. public String getKey(TableModel tableModel, String databaseProductName) {
  98. boolean toUpperCase = false;
  99. if (StringUtil.isNotEmpty(databaseProductName)) {
  100. if (DbTypeUtil.needToUpperCase(databaseProductName)) {
  101. toUpperCase = !toUpperCase;
  102. }
  103. }
  104. String pKeyName = toUpperCase ? TableFeildsEnum.FID.getField().toUpperCase() : TableFeildsEnum.FID.getField();
  105. if (tableModel != null && tableModel.getFields() != null) {
  106. TableFields tableFields = tableModel.getFields().stream().filter(t -> Objects.equals(t.getPrimaryKey(), 1)
  107. && !t.getField().toLowerCase().contains(TableFeildsEnum.TENANTID.getField())).findFirst().orElse(null);
  108. pKeyName = Objects.nonNull(tableFields) ? tableFields.getField() : pKeyName;
  109. }
  110. return pKeyName;
  111. }
  112. /**
  113. * 获取流程任务id原字段 flowTaskId
  114. *
  115. * @param tableModel
  116. * @param databaseProductName
  117. * @return
  118. */
  119. public String getFlowTaskId(TableModel tableModel, String databaseProductName) {
  120. boolean toUpperCase = false;
  121. if (StringUtil.isNotEmpty(databaseProductName)) {
  122. if (DbTypeUtil.needToUpperCase(databaseProductName)) {
  123. toUpperCase = !toUpperCase;
  124. }
  125. }
  126. String pKeyName = toUpperCase ? TableFeildsEnum.FLOWTASKID.getField().toUpperCase() : TableFeildsEnum.FLOWTASKID.getField();
  127. if (tableModel != null && tableModel.getFields() != null) {
  128. TableFields tableFields = tableModel.getFields().stream().filter(t ->
  129. t.getField().toLowerCase().contains(TableFeildsEnum.FLOWTASKID.getField())).findFirst().orElse(null);
  130. pKeyName = Objects.nonNull(tableFields) ? tableFields.getField() : pKeyName;
  131. }
  132. return pKeyName;
  133. }
  134. //---------------------------------------------信息---------------------------------------------
  135. /**
  136. * 获取编辑页数据
  137. *
  138. * @param visualdevEntity
  139. * @param id
  140. * @return
  141. */
  142. public Map<String, Object> getEditDataInfo(VisualdevEntity visualdevEntity, String id, OnlineInfoModel infoModel) {
  143. Map<String, Object> allDataMap = new HashMap<>();
  144. FormDataModel formData = JsonUtil.getJsonToBean(visualdevEntity.getFormData(), FormDataModel.class);
  145. Boolean logicalDelete = formData.getLogicalDelete();
  146. //权限参数
  147. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(visualdevEntity.getColumnData(), ColumnDataModel.class);
  148. Boolean needP = false;
  149. List<String> formPerList = new ArrayList<>();
  150. if (columnDataModel != null && StringUtil.isNotEmpty(infoModel.getMenuId())) {
  151. needP = columnDataModel.getUseFormPermission();
  152. Map<String, Object> pMap = PermissionInterfaceImpl.getFormMap();
  153. if (pMap.get(infoModel.getMenuId()) != null) {
  154. formPerList = JsonUtil.getJsonToList(pMap.get(infoModel.getMenuId()), ModuleFormModel.class).stream()
  155. .map(ModuleFormModel::getEnCode).collect(Collectors.toList());
  156. }
  157. }
  158. Object mainId = id;
  159. boolean autoIncrement = Objects.equals(formData.getPrimaryKeyPolicy(), 2);
  160. if (autoIncrement) {
  161. mainId = Long.parseLong(id);
  162. }
  163. //是否开启并发锁
  164. String version = "";
  165. if (formData.getConcurrencyLock()) {
  166. //查询
  167. version = TableFeildsEnum.VERSION.getField();
  168. }
  169. List<FieLdsModel> list = JsonUtil.getJsonToList(formData.getFields(), FieLdsModel.class);
  170. List<TableModel> tableModelList = JsonUtil.getJsonToList(visualdevEntity.getVisualTables(), TableModel.class);
  171. RecursionForm recursionForm = new RecursionForm();
  172. recursionForm.setList(list);
  173. recursionForm.setTableModelList(tableModelList);
  174. List<FormAllModel> formAllModel = new ArrayList<>();
  175. FormCloumnUtil.recursionForm(recursionForm, formAllModel);
  176. //form的属性
  177. List<FormAllModel> mast = formAllModel.stream().filter(t -> FormEnum.mast.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
  178. List<FormAllModel> table = formAllModel.stream().filter(t -> FormEnum.table.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
  179. List<FormAllModel> mastTable = formAllModel.stream().filter(t -> FormEnum.mastTable.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
  180. TableModel mainTable = tableModelList.stream().filter(t -> t.getTypeId().equals("1")).findFirst().orElse(null);
  181. DbLinkEntity linkEntity = serviceUtil.getDbLink(visualdevEntity.getDbLinkId());
  182. try {
  183. DynamicDataSourceUtil.switchToDataSource(linkEntity);
  184. @Cleanup Connection conn = ConnUtil.getConnOrDefault(linkEntity);
  185. String dbType = conn.getMetaData().getDatabaseProductName();
  186. String pKeyName = this.getKey(mainTable, dbType);
  187. SqlTable mainSqlTable = SqlTable.of(mainTable.getTable());
  188. String flowTaskId = this.getFlowTaskId(mainTable, dbType);
  189. List<AndOrCriteriaGroup> groupList = new ArrayList<>();
  190. groupList.add(SqlBuilder.or(mainSqlTable.column(flowTaskId), SqlBuilder.isEqualTo(mainId.toString())));
  191. SelectStatementProvider render = SqlBuilder.select(mainSqlTable.allColumns())
  192. .from(mainSqlTable)
  193. .where(mainSqlTable.column(pKeyName), SqlBuilder.isEqualTo(mainId), groupList)
  194. .build().render(RenderingStrategies.MYBATIS3);
  195. Map<String, Object> mainAllMap = Optional.ofNullable(flowFormDataMapper.selectOneMappedRow(render)).orElse(new HashMap<>());
  196. if (mainAllMap.size() == 0) {
  197. return new HashMap<>();
  198. }
  199. //主表
  200. List<String> mainTableFields = mast.stream().filter(m -> StringUtil.isNotEmpty(m.getFormColumnModel().getFieLdsModel().getVModel()))
  201. .map(s -> s.getFormColumnModel().getFieLdsModel().getVModel()).collect(Collectors.toList());
  202. //开启权限移除字段
  203. if (needP) {
  204. if (CollectionUtils.isEmpty(formPerList)) {
  205. mainTableFields = Collections.EMPTY_LIST;
  206. } else {
  207. List<String> newList = new ArrayList<>();
  208. for (String item : mainTableFields) {
  209. if (formPerList.contains(item)) {
  210. newList.add(item);
  211. }
  212. }
  213. mainTableFields = newList;
  214. }
  215. }
  216. if (StringUtil.isNotEmpty(version)) {
  217. mainTableFields.add(version);
  218. }
  219. mainTableFields.add(pKeyName);
  220. mainTableFields.add(flowTaskId);
  221. List<BasicColumn> mainTableBasicColumn = mainTableFields.stream().map(m -> SqlTable.of(mainTable.getTable()).column(m)).collect(Collectors.toList());
  222. SelectStatementProvider mainRender = SqlBuilder.select(mainTableBasicColumn)
  223. .from(mainSqlTable)
  224. .where(mainSqlTable.column(pKeyName), SqlBuilder.isEqualTo(mainId), groupList)
  225. .build().render(RenderingStrategies.MYBATIS3);
  226. Map<String, Object> mainMap = flowFormDataMapper.selectOneMappedRow(mainRender);
  227. if (ObjectUtil.isNotEmpty(mainMap)) {
  228. //转换主表里的数据
  229. List<FieLdsModel> mainFieldList = mast.stream().filter(m -> StringUtil.isNotEmpty(m.getFormColumnModel().getFieLdsModel().getVModel()))
  230. .map(t -> t.getFormColumnModel().getFieLdsModel()).collect(Collectors.toList());
  231. mainMap = formInfoUtils.swapDataInfoType(mainFieldList, mainMap);
  232. allDataMap.putAll(mainMap);
  233. allDataMap.put(FlowFormConstant.FLOWTASKID, mainMap.get(flowTaskId));
  234. }
  235. //副表
  236. Map<String, List<FormMastTableModel>> groupByTableNames = mastTable.stream().map(mt -> mt.getFormMastTableModel()).collect(Collectors.groupingBy(ma -> ma.getTable()));
  237. Iterator<Map.Entry<String, List<FormMastTableModel>>> entryIterator = groupByTableNames.entrySet().iterator();
  238. while (entryIterator.hasNext()) {
  239. Map.Entry<String, List<FormMastTableModel>> next = entryIterator.next();
  240. String childTableName = next.getKey();
  241. List<FormMastTableModel> childMastTableList = next.getValue();
  242. //开启权限移除字段
  243. if (needP) {
  244. if (CollectionUtils.isEmpty(formPerList)) {
  245. childMastTableList = Collections.EMPTY_LIST;
  246. } else {
  247. List<FormMastTableModel> newList = new ArrayList<>();
  248. for (FormMastTableModel item : childMastTableList) {
  249. if (formPerList.contains(item.getVModel())) {
  250. newList.add(item);
  251. }
  252. }
  253. childMastTableList = newList;
  254. }
  255. }
  256. TableModel childTableModel = tableModelList.stream().filter(t -> t.getTable().equals(childTableName)).findFirst().orElse(null);
  257. SqlTable mastSqlTable = SqlTable.of(childTableName);
  258. List<BasicColumn> mastTableBasicColumn = childMastTableList.stream().filter(m -> StringUtil.isNotEmpty(m.getField()))
  259. .map(m -> mastSqlTable.column(m.getField())).collect(Collectors.toList());
  260. //添加副表关联字段,不然数据会空没有字段名称
  261. mastTableBasicColumn.add(mastSqlTable.column(childTableModel.getTableField()));
  262. //主表主键
  263. String mainField = childTableModel.getRelationField();
  264. Object mainValue = new CaseInsensitiveMap(mainAllMap).get(mainField);
  265. //子表外键
  266. String childFoIdFiled = childTableModel.getTableField();
  267. //外键字段是否varchar转换
  268. TableFields fogIdField = childTableModel.getFields().stream().filter(t -> t.getField().equals(childFoIdFiled)).findFirst().orElse(null);
  269. boolean fogIdTypeString = Objects.nonNull(fogIdField) ? fogIdField.getDataType().toLowerCase().contains("varchar") : false;
  270. if (fogIdTypeString) {
  271. mainValue = mainValue.toString();
  272. }
  273. QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder mastWhere = SqlBuilder.select(mastTableBasicColumn).from(mastSqlTable).where();
  274. mastWhere.and(mastSqlTable.column(childFoIdFiled), SqlBuilder.isEqualTo(mainValue));
  275. //逻辑删除不展示
  276. if (logicalDelete) {
  277. mastWhere.and(mastSqlTable.column(TableFeildsEnum.DELETEMARK.getField()), SqlBuilder.isNull());
  278. }
  279. SelectStatementProvider mastRender = mastWhere.build().render(RenderingStrategies.MYBATIS3);
  280. List<Map<String, Object>> childMapList = flowFormDataMapper.selectManyMappedRows(mastRender);
  281. if (CollectionUtils.isNotEmpty(childMapList)) {
  282. Map<String, Object> soloDataMap = childMapList.get(0);
  283. Map<String, Object> renameKeyMap = new HashMap<>();
  284. for (Map.Entry entry : soloDataMap.entrySet()) {
  285. FormMastTableModel model = childMastTableList.stream().filter(child -> child.getField().equalsIgnoreCase(String.valueOf(entry.getKey()))).findFirst().orElse(null);
  286. if (model != null) renameKeyMap.put(model.getVModel(), entry.getValue());
  287. }
  288. List<FieLdsModel> columnChildFields = childMastTableList.stream().map(cl -> cl.getMastTable().getFieLdsModel()).collect(Collectors.toList());
  289. renameKeyMap = formInfoUtils.swapDataInfoType(columnChildFields, renameKeyMap);
  290. allDataMap.putAll(renameKeyMap);
  291. }
  292. }
  293. //设计子表
  294. Boolean finalNeedP = needP;
  295. List<String> finalFormPerList = formPerList;
  296. table.stream().map(t -> t.getChildList()).forEach(
  297. t1 -> {
  298. try {
  299. String childTableName = t1.getTableName();
  300. TableModel tableModel = tableModelList.stream().filter(tm -> tm.getTable().equals(childTableName)).findFirst().orElse(null);
  301. SqlTable childSqlTable = SqlTable.of(childTableName);
  302. List<FormColumnModel> chilFieldList = t1.getChildList().stream().filter(t2 -> StringUtil.isNotEmpty(t2.getFieLdsModel().getVModel())).collect(Collectors.toList());
  303. String tableModelName = t1.getTableModel();
  304. //开启权限移除字段
  305. if (finalNeedP) {
  306. if (CollectionUtils.isEmpty(finalFormPerList)) {
  307. chilFieldList = Collections.EMPTY_LIST;
  308. } else {
  309. List<FormColumnModel> newList = new ArrayList<>();
  310. for (FormColumnModel item : chilFieldList) {
  311. if (finalFormPerList.contains(tableModelName + "-" + item.getFieLdsModel().getVModel())) {
  312. newList.add(item);
  313. }
  314. }
  315. chilFieldList = newList;
  316. }
  317. }
  318. List<BasicColumn> childFields = chilFieldList.stream().map(t2 -> childSqlTable.column(t2.getFieLdsModel().getVModel())).collect(Collectors.toList());
  319. childFields.add(childSqlTable.column(tableModel.getTableField()));
  320. String childKeyName = this.getKey(tableModel, dbType);
  321. childFields.add(childSqlTable.column(childKeyName));
  322. //主表主键
  323. String mainField = tableModel.getRelationField();
  324. Object mainValue = new CaseInsensitiveMap(mainAllMap).get(mainField);
  325. //子表外键
  326. String childFoIdFiled = tableModel.getTableField();
  327. TableFields fogIdField = tableModel.getFields().stream().filter(t -> t.getField().equals(childFoIdFiled)).findFirst().orElse(null);
  328. if (VisualConst.DB_INT_ALL.contains(fogIdField.getField().toLowerCase())) {
  329. mainValue = Long.parseLong(String.valueOf(mainValue));
  330. }
  331. QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder childWhere = SqlBuilder.select(childFields).from(childSqlTable).where();
  332. childWhere.and(childSqlTable.column(childFoIdFiled), SqlBuilder.isEqualTo(mainValue));
  333. //逻辑删除不展示
  334. if (logicalDelete) {
  335. childWhere.and(childSqlTable.column(TableFeildsEnum.DELETEMARK.getField()), SqlBuilder.isNull());
  336. }
  337. SelectStatementProvider childRender = childWhere.build().render(RenderingStrategies.MYBATIS3);
  338. List<Map<String, Object>> childMapList = flowFormDataMapper.selectManyMappedRows(childRender);
  339. if (ObjectUtil.isNotEmpty(childMapList)) {
  340. List<FieLdsModel> childFieldModels = t1.getChildList().stream().map(t2 -> t2.getFieLdsModel()).collect(Collectors.toList());
  341. childMapList = childMapList.stream().map(c1 -> {
  342. try {
  343. return formInfoUtils.swapDataInfoType(childFieldModels, c1);
  344. } catch (Exception e) {
  345. e.printStackTrace();
  346. }
  347. return c1;
  348. }).collect(Collectors.toList());
  349. Map<String, Object> childMap = new HashMap<>(1);
  350. childMap.put(t1.getTableModel(), childMapList);
  351. allDataMap.putAll(childMap);
  352. }
  353. } catch (Exception e) {
  354. e.printStackTrace();
  355. }
  356. }
  357. );
  358. for (String key : allDataMap.keySet()) {
  359. if (pKeyName.equalsIgnoreCase(key)) {
  360. allDataMap.put("id", allDataMap.get(key));
  361. break;
  362. }
  363. }
  364. } catch (Exception e) {
  365. e.printStackTrace();
  366. } finally {
  367. DynamicDataSourceUtil.clearSwitchDataSource();
  368. }
  369. return allDataMap;
  370. }
  371. //---------------------------------------------新增---------------------------------------------
  372. /**
  373. * 新增数据处理
  374. **/
  375. @DSTransactional
  376. public Map<String, Object> create(DataModel dataModel) throws WorkFlowException {
  377. try {
  378. //处理好的数据
  379. Map<String, Object> result = this.createDataList(dataModel);
  380. return result;
  381. } catch (DataException dataException) {
  382. throw new WorkFlowException(dataException.getMessage());
  383. } catch (Exception e) {
  384. //close
  385. e.printStackTrace();
  386. log.error("新增异常:{}", e.getMessage());
  387. throw new WorkFlowException(MsgCode.FA028.get(), e.getMessage());
  388. }
  389. }
  390. /**
  391. * 新增数据
  392. **/
  393. public Map<String, Object> createDataList(DataModel dataModel) throws SQLException, DataException {
  394. //处理好的数据
  395. Map<String, Object> result = new HashMap<>(16);
  396. List<TableModel> tableModelList = dataModel.getTableModelList();
  397. List<FormAllModel> formAllModel = dataModel.getFormAllModel();
  398. //有表数据处理
  399. if (tableModelList.size() > 0) {
  400. DbLinkEntity link = dataModel.getLink();
  401. DynamicDataSourceUtil.switchToDataSource(link);
  402. try {
  403. @Cleanup Connection conn = ConnUtil.getConnOrDefault(link);
  404. String dbType = conn.getMetaData().getDatabaseProductName().trim();
  405. dataModel.setDbType(dbType);
  406. //主表
  407. this.createMast(formAllModel, dataModel, result);
  408. //子表
  409. this.createTable(formAllModel, dataModel, result);
  410. //副表
  411. this.createMastTable(formAllModel, dataModel, result);
  412. } finally {
  413. DynamicDataSourceUtil.clearSwitchDataSource();
  414. }
  415. } else {
  416. //无表数据处理
  417. result = this.createAll(dataModel, formAllModel);
  418. }
  419. return result;
  420. }
  421. /**
  422. * 子表数据
  423. **/
  424. private void createTable(List<FormAllModel> formAllModel, DataModel dataModel, Map<String, Object> result) throws SQLException {
  425. List<TableModel> tableModelList = dataModel.getTableModelList();
  426. Map<String, Object> dataNewMap = dataModel.getDataNewMap();
  427. boolean autoIncrement = Objects.equals(dataModel.getPrimaryKeyPolicy(), 2);
  428. String flowId = "";
  429. if (dataNewMap.get(FlowFormConstant.FLOWID) != null && StringUtil.isNotEmpty(dataNewMap.get(FlowFormConstant.FLOWID).toString())) {
  430. flowId = dataNewMap.get(FlowFormConstant.FLOWID).toString();
  431. }
  432. UserEntity userEntity = dataModel.getUserEntity();
  433. //子表
  434. List<FormAllModel> tableForm = formAllModel.stream().filter(t -> FormEnum.table.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
  435. for (FormAllModel itemModel : tableForm) {
  436. FormColumnTableModel childModel = itemModel.getChildList();
  437. if (childModel.getDisabled()) continue;
  438. String key = childModel.getTableModel();
  439. String tableName = childModel.getTableName();
  440. //子表数据
  441. List<Map<String, Object>> chidList = dataNewMap.get(key) != null ? (List<Map<String, Object>>) dataNewMap.get(key) : new ArrayList<>();
  442. List<FormColumnModel> formColumnModels = childModel.getChildList().stream().filter(g -> StringUtil.isNotEmpty(g.getFieLdsModel().getVModel())).collect(Collectors.toList());
  443. // if (CollectionUtils.isEmpty(formColumnModels)) continue;
  444. if (Objects.equals(childModel.getIsNumLimit(), true) && chidList.size() > childModel.getNumLimit()) {
  445. throw new DataException(MsgCode.VS033.get(childModel.getLabel()));
  446. }
  447. //子表主键
  448. TableModel tableModel = tableModelList.stream().filter(k -> k.getTable().equals(tableName)).findFirst().orElse(null);
  449. String table = tableModel.getTable();
  450. //子表主键
  451. String childKeyName = this.getKey(tableModel, dataModel.getDbType());
  452. //子表外键字段
  453. String foreignKey = tableModel.getTableField();
  454. TableFields foreignField = tableModel.getFields().stream().filter(t -> t.getField().equalsIgnoreCase(foreignKey)).findFirst().orElse(null);
  455. if (foreignField == null) {
  456. throw new SQLException(MsgCode.COD001.get());
  457. }
  458. //主表关联字段
  459. Object foreignValue = dataNewMap.get(tableModel.getRelationField());
  460. if (VisualConst.DB_INT_ALL.contains(foreignField.getDataType())) {
  461. foreignValue = Long.parseLong(String.valueOf(foreignValue));
  462. }
  463. SqlTable sqlTable = SqlTable.of(table);
  464. for (Map<String, Object> objectMap : chidList) {
  465. if (StringUtil.isNotEmpty(flowId)) {
  466. objectMap.put(FlowFormConstant.FLOWID, flowId);
  467. }
  468. GeneralInsertDSL generalInsertDSL = SqlBuilder.insertInto(sqlTable).set(sqlTable.column(foreignKey)).toValue(foreignValue);
  469. for (FormColumnModel column : formColumnModels) {
  470. FieLdsModel fieLdsModel = column.getFieLdsModel();
  471. String childKey = fieLdsModel.getVModel();
  472. //表单字段和外键字段重复不写入(写入外键值)
  473. if (Objects.equals(foreignKey, childKey)) {
  474. continue;
  475. }
  476. Object data = objectMap.get(childKey);
  477. String fieldKey = fieLdsModel.getConfig().getParentVModel() + "-" + childKey;
  478. //流程表单权限
  479. if (CollectionUtils.isNotEmpty(dataModel.getFlowFormOperates())) {
  480. boolean hasOperate = isHasOperate(dataModel, fieldKey);
  481. if (!hasOperate) {
  482. continue;
  483. }
  484. } else if (dataModel.getNeedPermission()) {
  485. if (CollectionUtil.isNotEmpty(dataModel.getFormPerList())) {
  486. if (!dataModel.getFormPerList().contains(fieldKey)) {
  487. continue;
  488. }
  489. } else {
  490. continue;
  491. }
  492. }
  493. //处理系统自动生成
  494. data = this.create(fieLdsModel, data, true, userEntity, dataModel.isLinkOpen());
  495. data = visualBillUtil.getBillNumber(dataModel.getVisualId(), fieLdsModel, objectMap, data);
  496. getDSL(sqlTable, null, generalInsertDSL, fieLdsModel.getFormat(), childKey, data);
  497. }
  498. if (!autoIncrement) {
  499. generalInsertDSL = generalInsertDSL.set(sqlTable.column(childKeyName)).toValue(RandomUtil.uuId());
  500. }
  501. //租户信息
  502. addTenantId(generalInsertDSL, sqlTable);
  503. GeneralInsertStatementProvider insertRender = generalInsertDSL.build().render(RenderingStrategies.MYBATIS3);
  504. flowFormDataMapper.generalInsert(insertRender);
  505. }
  506. }
  507. }
  508. /**
  509. * 副表数据
  510. **/
  511. private void createMastTable(List<FormAllModel> formAllModel, DataModel dataModel, Map<String, Object> result) throws SQLException {
  512. List<TableModel> tableModelList = dataModel.getTableModelList();
  513. Map<String, Object> dataNewMap = dataModel.getDataNewMap();
  514. Integer primaryKeyPolicy = dataModel.getPrimaryKeyPolicy();
  515. UserEntity userEntity = dataModel.getUserEntity();
  516. //副表
  517. Map<String, List<FormAllModel>> mastTableAll = formAllModel.stream().filter(t -> FormEnum.mastTable.getMessage().equals(t.getJnpfKey())).collect(Collectors.groupingBy(e -> e.getFormMastTableModel().getTable()));
  518. for (String key : mastTableAll.keySet()) {
  519. Optional<TableModel> first = tableModelList.stream().filter(t -> t.getTable().equals(key)).findFirst();
  520. if (!first.isPresent()) {
  521. throw new SQLException(MsgCode.COD001.get());
  522. }
  523. TableModel tableModel = first.get();
  524. String tableModelTable = tableModel.getTable();
  525. String childKeyName = this.getKey(tableModel, dataModel.getDbType());
  526. //副表外键字段
  527. String foreignKey = tableModel.getTableField();
  528. TableFields foreignField = tableModel.getFields().stream().filter(t -> t.getField().equalsIgnoreCase(foreignKey)).findFirst().orElse(null);
  529. if (foreignField == null) {
  530. throw new SQLException(MsgCode.COD001.get());
  531. }
  532. //主表关联字段
  533. Object foreignValue = dataNewMap.get(tableModel.getRelationField());
  534. if (VisualConst.DB_INT_ALL.contains(foreignField.getDataType())) {
  535. foreignValue = Long.parseLong(String.valueOf(foreignValue));
  536. }
  537. List<FormAllModel> masTableList = mastTableAll.get(key);
  538. SqlTable sqlTable = SqlTable.of(tableModelTable);
  539. GeneralInsertDSL generalInsertDSL = SqlBuilder.insertInto(sqlTable).set(sqlTable.column(foreignKey)).toValue(foreignValue);
  540. for (FormAllModel model : masTableList) {
  541. FormMastTableModel formMastTableModel = model.getFormMastTableModel();
  542. FormColumnModel mastTable = formMastTableModel.getMastTable();
  543. FieLdsModel fieLdsModel = mastTable.getFieLdsModel();
  544. String mostTableKey = fieLdsModel.getVModel();
  545. String field = formMastTableModel.getField();
  546. //表单字段和外键字段重复不写入(写入外键值)
  547. if (StringUtil.isEmpty(mostTableKey) || Objects.equals(foreignKey, field)) {
  548. continue;
  549. }
  550. Object data = dataNewMap.get(mostTableKey);
  551. //流程表单权限
  552. if (CollectionUtils.isNotEmpty(dataModel.getFlowFormOperates())) {
  553. boolean hasOperate = isHasOperate(dataModel, mostTableKey);
  554. if (!hasOperate) {
  555. continue;
  556. }
  557. } else if (dataModel.getNeedPermission()) {
  558. if (CollectionUtil.isNotEmpty(dataModel.getFormPerList())) {
  559. if (!dataModel.getFormPerList().contains(mostTableKey)) {
  560. continue;
  561. }
  562. } else {
  563. continue;
  564. }
  565. }
  566. //处理系统自动生成
  567. data = this.create(fieLdsModel, data, true, userEntity, dataModel.isLinkOpen());
  568. data = visualBillUtil.getBillNumber(dataModel.getVisualId(), fieLdsModel, dataNewMap, data);
  569. //返回值
  570. result.put(mostTableKey, data);
  571. getDSL(sqlTable, null, generalInsertDSL, fieLdsModel.getFormat(), field, data);
  572. }
  573. //sql主键
  574. if (primaryKeyPolicy == 1) {
  575. generalInsertDSL = generalInsertDSL.set(sqlTable.column(childKeyName)).toValue(RandomUtil.uuId());
  576. }
  577. //租户信息
  578. addTenantId(generalInsertDSL, sqlTable);
  579. GeneralInsertStatementProvider insertRender = generalInsertDSL.build().render(RenderingStrategies.MYBATIS3);
  580. flowFormDataMapper.generalInsert(insertRender);
  581. }
  582. }
  583. /**
  584. * 主表数据
  585. **/
  586. private void createMast(List<FormAllModel> formAllModel, DataModel dataModel, Map<String, Object> result) throws SQLException {
  587. List<TableModel> tableModelList = dataModel.getTableModelList();
  588. Map<String, Object> dataNewMap = dataModel.getDataNewMap();
  589. Object mainId = dataModel.getMainId();
  590. boolean autoIncrement = Objects.equals(dataModel.getPrimaryKeyPolicy(), 2);
  591. if (autoIncrement) {
  592. mainId = Long.parseLong(dataModel.getMainId());
  593. }
  594. UserEntity userEntity = dataModel.getUserEntity();
  595. Optional<TableModel> first = tableModelList.stream().filter(t -> "1".equals(t.getTypeId())).findFirst();
  596. if (!first.isPresent()) {
  597. throw new SQLException(MsgCode.COD001.get());
  598. }
  599. TableModel tableModel = first.get();
  600. String mastTableName = tableModel.getTable();
  601. List<FormAllModel> mastForm = formAllModel.stream().filter(t -> FormEnum.mast.getMessage().equals(t.getJnpfKey())).filter(t -> StringUtil.isNotEmpty(t.getFormColumnModel().getFieLdsModel().getVModel())).collect(Collectors.toList());
  602. //新增字段
  603. String keyName = this.getKey(tableModel, dataModel.getDbType());
  604. SqlTable sqlTable = SqlTable.of(mastTableName);
  605. String flowTaskId = this.getFlowTaskId(tableModel, dataModel.getDbType());
  606. GeneralInsertDSL generalInsertDSL = SqlBuilder.insertInto(sqlTable).set(sqlTable.column(keyName)).toValue(mainId)
  607. .set(sqlTable.column(flowTaskId)).toValue(mainId.toString());
  608. if (autoIncrement) {
  609. generalInsertDSL = SqlBuilder.insertInto(sqlTable).set(sqlTable.column(flowTaskId)).toValue(mainId.toString());
  610. }
  611. for (FormAllModel model : mastForm) {
  612. FieLdsModel fieLdsModel = model.getFormColumnModel().getFieLdsModel();
  613. String field = fieLdsModel.getVModel();
  614. Object data = dataNewMap.get(field);
  615. data = data instanceof List ? JsonUtil.getObjectToString(data) : data;
  616. //流程表单权限
  617. if (CollectionUtils.isNotEmpty(dataModel.getFlowFormOperates())) {
  618. boolean hasOperate = isHasOperate(dataModel, field);
  619. if (!hasOperate) {
  620. continue;
  621. }
  622. } else if (dataModel.getNeedPermission()) {
  623. if (CollectionUtil.isNotEmpty(dataModel.getFormPerList())) {
  624. if (!dataModel.getFormPerList().contains(field)) {
  625. continue;
  626. }
  627. } else {
  628. continue;
  629. }
  630. }
  631. //处理系统自动生成
  632. data = this.create(fieLdsModel, data, true, userEntity, dataModel.isLinkOpen());
  633. data = visualBillUtil.getBillNumber(dataModel.getVisualId(), fieLdsModel, dataNewMap, data);
  634. if (JnpfKeyConsts.BILLRULE.equals(fieLdsModel.getConfig().getJnpfKey())) dataNewMap.put(field, data);
  635. getDSL(sqlTable, null, generalInsertDSL, fieLdsModel.getFormat(), field, data);
  636. }
  637. //判断是否开启锁
  638. if (dataModel.getConcurrencyLock()) {
  639. generalInsertDSL = generalInsertDSL.set(sqlTable.column(TableFeildsEnum.VERSION.getField())).toValue(dataNewMap.get(TableFeildsEnum.VERSION.getField()));
  640. }
  641. //添加流程引擎信息
  642. if (dataNewMap.get(FlowFormConstant.FLOWID) != null && StringUtil.isNotEmpty(dataNewMap.get(FlowFormConstant.FLOWID).toString())) {
  643. generalInsertDSL = generalInsertDSL.set(sqlTable.column(TableFeildsEnum.FLOWID.getField())).toValue(dataNewMap.get(FlowFormConstant.FLOWID));
  644. }
  645. //租户信息
  646. addTenantId(generalInsertDSL, sqlTable);
  647. GeneralInsertStatementProvider insertRender = generalInsertDSL.build().render(RenderingStrategies.MYBATIS3);
  648. flowFormDataMapper.generalInsert(insertRender);
  649. //设置实际主键id
  650. getRealMainId(dataModel, tableModel, keyName, autoIncrement, mastTableName, mainId);
  651. dataNewMap.put(keyName, dataModel.getMainId());
  652. }
  653. /**
  654. * 获取实际主键id
  655. *
  656. * @param dataModel
  657. * @param realIdKey 主表主键
  658. * @param autoIncrement 自增设置id
  659. * @param mastTableName
  660. * @throws SQLException
  661. */
  662. private void getRealMainId(DataModel dataModel, TableModel tableModel, String realIdKey, boolean autoIncrement, String mastTableName, Object flowTaskId) {
  663. if (autoIncrement) {
  664. String flowTaskKey = this.getFlowTaskId(tableModel, dataModel.getDbType());
  665. List<String> mastFile = new ArrayList<>();
  666. mastFile.add(flowTaskKey);
  667. mastFile.add(realIdKey);
  668. SqlTable mastSqlTable = SqlTable.of(mastTableName);
  669. SelectStatementProvider mastRender = SqlBuilder.select(mastFile.stream().map(m -> mastSqlTable.column(m)).collect(Collectors.toList()))
  670. .from(mastSqlTable)
  671. .where(mastSqlTable.column(flowTaskKey), SqlBuilder.isEqualTo(flowTaskId.toString()))
  672. .build().render(RenderingStrategies.MYBATIS3);
  673. Map<String, Object> map = flowFormDataMapper.selectOneMappedRow(mastRender);
  674. dataModel.setMainId(map.get(realIdKey) != null ? map.get(realIdKey).toString() : dataModel.getMainId());
  675. }
  676. }
  677. /**
  678. * 新增系统赋值
  679. **/
  680. private Object create(FieLdsModel fieLdsModel, Object dataValue, boolean isTable, UserEntity userEntity, boolean isLink) {
  681. UserInfo user = UserProvider.getUser();
  682. String jnpfKey = fieLdsModel.getConfig().getJnpfKey();
  683. String rule = fieLdsModel.getConfig().getRule();
  684. String format = DateTimeFormatConstant.getFormat(fieLdsModel.getFormat());
  685. Object value = dataValue;
  686. //外链跳过系统参数生成
  687. if (isLink) {
  688. List<String> systemAttList = new ArrayList<>();
  689. systemAttList.add(JnpfKeyConsts.CREATEUSER);
  690. systemAttList.add(JnpfKeyConsts.CURRORGANIZE);
  691. systemAttList.add(JnpfKeyConsts.CURRPOSITION);
  692. systemAttList.add(JnpfKeyConsts.CURRDEPT);
  693. systemAttList.add(JnpfKeyConsts.MODIFYUSER);
  694. if (systemAttList.contains(jnpfKey)) {
  695. return null;
  696. }
  697. }
  698. switch (jnpfKey) {
  699. case JnpfKeyConsts.CREATEUSER:
  700. value = userEntity.getId();
  701. break;
  702. case JnpfKeyConsts.CREATETIME:
  703. value = new Date();
  704. break;
  705. case JnpfKeyConsts.CURRORGANIZE:
  706. case JnpfKeyConsts.CURRDEPT:
  707. if (user != null && CollectionUtil.isNotEmpty(user.getOrganizeIds())) {
  708. value = JsonUtil.getObjectToString(user.getOrganizeIds());
  709. }
  710. break;
  711. case JnpfKeyConsts.MODIFYTIME:
  712. value = null;
  713. break;
  714. case JnpfKeyConsts.MODIFYUSER:
  715. value = null;
  716. break;
  717. case JnpfKeyConsts.CURRPOSITION:
  718. if (user != null && CollectionUtil.isNotEmpty(user.getPositionIds())) {
  719. value = JsonUtil.getObjectToString(user.getPositionIds());
  720. }
  721. break;
  722. case JnpfKeyConsts.BILLRULE:
  723. if (fieLdsModel.getConfig().getRuleType() == null || Objects.equals(fieLdsModel.getConfig().getRuleType(), 1)) {
  724. try {
  725. value = serviceUtil.getBillNumber(rule);
  726. } catch (Exception e) {
  727. value = null;
  728. }
  729. }
  730. break;
  731. case JnpfKeyConsts.DATE:
  732. case JnpfKeyConsts.DATE_CALCULATE:
  733. if (isTable) {
  734. try {
  735. if (dataValue == null || "".equals(dataValue)) {
  736. return null;
  737. }
  738. if (dataValue instanceof String) {
  739. try {
  740. SimpleDateFormat formatter = new SimpleDateFormat(format);
  741. value = formatter.parse(dataValue.toString());
  742. } catch (ParseException var3) {
  743. return null;
  744. }
  745. } else {
  746. value = new Date(Long.valueOf(String.valueOf(dataValue)));
  747. }
  748. } catch (Exception e) {
  749. }
  750. }
  751. break;
  752. case JnpfKeyConsts.NUM_INPUT:
  753. case JnpfKeyConsts.CALCULATE:
  754. if (isTable) {
  755. try {
  756. value = new BigDecimal(String.valueOf(dataValue));
  757. } catch (Exception e) {
  758. }
  759. }
  760. break;
  761. default:
  762. if (isTable) {
  763. value = this.valueToNull(value);
  764. }
  765. break;
  766. }
  767. return value;
  768. }
  769. /**
  770. * 无表插入数据
  771. **/
  772. private Map<String, Object> createAll(DataModel dataModel, List<FormAllModel> formAllModel) {
  773. Map<String, Object> dataNewMap = dataModel.getDataNewMap();
  774. UserEntity userEntity = dataModel.getUserEntity();
  775. //处理好的数据
  776. Map<String, Object> result = new HashMap<>(16);
  777. List<FormAllModel> mastForm = formAllModel.stream().filter(t -> FormEnum.mast.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
  778. List<FormAllModel> tableForm = formAllModel.stream().filter(t -> FormEnum.table.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
  779. for (String key : dataNewMap.keySet()) {
  780. FormAllModel model = mastForm.stream().filter(t -> key.equals(t.getFormColumnModel().getFieLdsModel().getVModel())).findFirst().orElse(null);
  781. if (model != null) {
  782. FieLdsModel fieLdsModel = model.getFormColumnModel().getFieLdsModel();
  783. Object data = dataNewMap.get(key);
  784. //处理系统自动生成
  785. data = this.create(fieLdsModel, data, false, userEntity, dataModel.isLinkOpen());
  786. result.put(key, data);
  787. } else {
  788. FormAllModel childModel = tableForm.stream().filter(t -> key.equals(t.getChildList().getTableModel())).findFirst().orElse(null);
  789. if (childModel != null) {
  790. //子表主键
  791. List<FormColumnModel> childList = childModel.getChildList().getChildList();
  792. List<Map<String, Object>> childDataMap = (List<Map<String, Object>>) dataNewMap.get(key);
  793. //子表处理的数据
  794. List<Map<String, Object>> childResult = new ArrayList<>();
  795. for (Map<String, Object> objectMap : childDataMap) {
  796. //子表单体处理的数据
  797. Map<String, Object> childOneResult = new HashMap<>(16);
  798. for (String childKey : objectMap.keySet()) {
  799. FormColumnModel columnModel = childList.stream().filter(t -> childKey.equals(t.getFieLdsModel().getVModel())).findFirst().orElse(null);
  800. if (columnModel != null) {
  801. FieLdsModel fieLdsModel = columnModel.getFieLdsModel();
  802. Object data = objectMap.get(childKey);
  803. //处理系统自动生成
  804. data = this.create(fieLdsModel, data, false, userEntity, dataModel.isLinkOpen());
  805. childOneResult.put(childKey, data);
  806. }
  807. }
  808. childResult.add(childOneResult);
  809. }
  810. result.put(key, childResult);
  811. }
  812. }
  813. }
  814. return result;
  815. }
  816. //--------------------------------------------修改 ----------------------------------------------------
  817. /**
  818. * 修改数据处理
  819. **/
  820. @DSTransactional
  821. public Map<String, Object> update(DataModel dataModel) throws WorkFlowException {
  822. try {
  823. //处理好的数据
  824. Map<String, Object> result = this.updateDataList(dataModel);
  825. return result;
  826. } catch (DataException dataException) {
  827. throw new WorkFlowException(dataException.getMessage());
  828. } catch (Exception e) {
  829. //close
  830. e.printStackTrace();
  831. log.error("修改异常:{}", e.getMessage());
  832. throw new WorkFlowException(MsgCode.FA029.get(), e.getMessage());
  833. }
  834. }
  835. /**
  836. * 修改数据
  837. **/
  838. public Map<String, Object> updateDataList(DataModel dataModel) throws SQLException, DataException {
  839. //处理好的数据
  840. Map<String, Object> result = new HashMap<>(16);
  841. List<TableModel> tableModelList = dataModel.getTableModelList();
  842. List<FormAllModel> formAllModel = dataModel.getFormAllModel();
  843. //有表数据处理
  844. if (tableModelList.size() > 0) {
  845. DbLinkEntity link = dataModel.getLink();
  846. DynamicDataSourceUtil.switchToDataSource(link);
  847. try {
  848. //系统数据
  849. @Cleanup Connection conn = ConnUtil.getConnOrDefault(link);
  850. String dbType = conn.getMetaData().getDatabaseProductName().trim();
  851. dataModel.setDbType(dbType);
  852. conn.setAutoCommit(false);
  853. //主表
  854. this.updateMast(formAllModel, dataModel, conn, result);
  855. //子表
  856. this.updateTable(formAllModel, dataModel, conn, result);
  857. //副表
  858. this.updateMastTable(formAllModel, dataModel, conn, result);
  859. } finally {
  860. DynamicDataSourceUtil.clearSwitchDataSource();
  861. }
  862. } else {
  863. //无表数据处理
  864. result = this.updateAll(dataModel, formAllModel);
  865. }
  866. return result;
  867. }
  868. /**
  869. * 子表数据
  870. **/
  871. private void updateTable(List<FormAllModel> formAllModel, DataModel dataModel, Connection conn, Map<String, Object> result) throws SQLException {
  872. Boolean onlyUpdate = dataModel.getOnlyUpdate();
  873. Boolean logicalDelete = dataModel.getLogicalDelete();
  874. List<TableModel> tableModelList = dataModel.getTableModelList();
  875. Map<String, Object> dataNewMap = dataModel.getDataNewMap();
  876. Map<String, Object> oldMainData = dataModel.getOldMainData();
  877. if (MapUtils.isEmpty(oldMainData)) {
  878. return;
  879. }
  880. boolean autoIncrement = Objects.equals(dataModel.getPrimaryKeyPolicy(), 2);
  881. String flowId = "";
  882. if (dataNewMap.get(FlowFormConstant.FLOWID) != null && StringUtil.isNotEmpty(dataNewMap.get(FlowFormConstant.FLOWID).toString())) {
  883. flowId = dataNewMap.get(FlowFormConstant.FLOWID).toString();
  884. }
  885. //子表
  886. List<FormAllModel> tableForm = formAllModel.stream().filter(t -> FormEnum.table.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
  887. for (FormAllModel itemModel : tableForm) {
  888. FormColumnTableModel childModel = itemModel.getChildList();
  889. if (childModel.getDisabled()) continue;
  890. String key = childModel.getTableModel();
  891. String tableName = childModel.getTableName();
  892. //子表数据
  893. List<Map<String, Object>> chidList = dataNewMap.get(key) != null ? (List<Map<String, Object>>) dataNewMap.get(key) : new ArrayList<>();
  894. List<FormColumnModel> formColumnModels = childModel.getChildList().stream().filter(g -> StringUtil.isNotEmpty(g.getFieLdsModel().getVModel())).collect(Collectors.toList());
  895. // if (CollectionUtils.isEmpty(formColumnModels)) continue;
  896. if (Objects.equals(childModel.getIsNumLimit(), true) && chidList.size() > childModel.getNumLimit()) {
  897. throw new DataException(MsgCode.VS033.get(childModel.getLabel()));
  898. }
  899. //子表主键
  900. TableModel tableModel = tableModelList.stream().filter(k -> k.getTable().equals(tableName)).findFirst().orElse(null);
  901. String table = tableModel.getTable();
  902. SqlTable sqlTable = SqlTable.of(table);
  903. String childPrimary = this.getKey(tableModel, dataModel.getDbType());
  904. //子表表外键字段
  905. String foreignKey = tableModel.getTableField();
  906. TableFields foreignField = tableModel.getFields().stream().filter(t -> t.getField().equalsIgnoreCase(foreignKey)).findFirst().orElse(null);
  907. if (foreignField == null) {
  908. throw new SQLException(MsgCode.COD001.get());
  909. }
  910. //主表关联字段
  911. Object foreignValue = dataNewMap.get(tableModel.getRelationField());
  912. Object oldForeignValue = oldMainData.get(tableModel.getRelationField());
  913. if (VisualConst.DB_INT_ALL.contains(foreignField.getDataType())) {
  914. foreignValue = Long.parseLong(String.valueOf(foreignValue));
  915. oldForeignValue = Long.parseLong(String.valueOf(oldForeignValue));
  916. }
  917. //查询旧的子表数据
  918. SelectStatementProvider render = SqlBuilder.select(sqlTable.column(childPrimary))
  919. .from(sqlTable)
  920. .where(sqlTable.column(foreignKey), SqlBuilder.isEqualTo(oldForeignValue))
  921. .build().render(RenderingStrategies.MYBATIS3);
  922. List<Object> childIdList = flowFormDataMapper.selectManyMappedRows(render).stream().map(t -> new CaseInsensitiveMap(t).get(childPrimary)).collect(Collectors.toList());
  923. List<Object> formDataIdList = chidList.stream().filter(t -> new CaseInsensitiveMap(t).containsKey(childPrimary)).map(t -> new CaseInsensitiveMap(t).get(childPrimary)).collect(Collectors.toList());
  924. List<Object> deleteList = childIdList.stream().filter(t -> {
  925. List<String> jsonToList = JsonUtil.getJsonToList(formDataIdList, String.class);
  926. if (!jsonToList.contains(String.valueOf(t))) {
  927. return true;
  928. }
  929. return false;
  930. }).collect(Collectors.toList());
  931. if (CollectionUtils.isNotEmpty(deleteList) && !onlyUpdate) {//删除子表id数据
  932. //是否开启逻辑删除
  933. if (logicalDelete) {
  934. UpdateDSL<UpdateModel> updateModelUpdateDSL = SqlBuilder.update(sqlTable);
  935. updateModelUpdateDSL.set(sqlTable.column(TableFeildsEnum.DELETEMARK.getField())).equalTo(1);
  936. updateModelUpdateDSL.set(sqlTable.column(TableFeildsEnum.DELETETIME.getField())).equalTo(new Date());
  937. updateModelUpdateDSL.set(sqlTable.column(TableFeildsEnum.DELETEUSERID.getField())).equalTo(UserProvider.getUser().getUserId());
  938. UpdateStatementProvider updateRender = updateModelUpdateDSL
  939. .where(sqlTable.column(childPrimary), SqlBuilder.isIn(deleteList))
  940. .build().render(RenderingStrategies.MYBATIS3);
  941. flowFormDataMapper.update(updateRender);
  942. } else {
  943. DeleteStatementProvider deleteRender = SqlBuilder.deleteFrom(sqlTable)
  944. .where(sqlTable.column(childPrimary), SqlBuilder.isIn(deleteList))
  945. .build().render(RenderingStrategies.MYBATIS3);
  946. flowFormDataMapper.delete(deleteRender);
  947. }
  948. }
  949. for (Map<String, Object> objectMap : chidList) {
  950. objectMap = new CaseInsensitiveMap(objectMap);
  951. boolean isUpdate = false;
  952. if (CollectionUtil.isNotEmpty(childIdList)) {
  953. List<String> jsonToList = JsonUtil.getJsonToList(childIdList, String.class);
  954. if (objectMap.get(childPrimary) != null && jsonToList.contains(String.valueOf(objectMap.get(childPrimary)))) {
  955. isUpdate = true;
  956. }
  957. }
  958. if (StringUtil.isNotEmpty(flowId)) {
  959. objectMap.put(FlowFormConstant.FLOWID, flowId);
  960. }
  961. GeneralInsertDSL generalInsertDSL = SqlBuilder.insertInto(sqlTable).set(sqlTable.column(foreignKey)).toValue(foreignValue);
  962. UpdateDSL<UpdateModel> updateModelUpdateDSL = SqlBuilder.update(sqlTable).set(sqlTable.column(foreignKey)).equalTo(foreignValue);
  963. for (FormColumnModel column : formColumnModels) {
  964. FieLdsModel fieLdsModel = column.getFieLdsModel();
  965. String childKey = fieLdsModel.getVModel();
  966. String jnpfkey = fieLdsModel.getConfig().getJnpfKey();
  967. Object data = objectMap.get(childKey);
  968. String fieldKey = fieLdsModel.getConfig().getParentVModel() + "-" + childKey;
  969. if (foreignKey.equalsIgnoreCase(childKey)) {
  970. continue;
  971. }
  972. //流程表单权限
  973. if (CollectionUtils.isNotEmpty(dataModel.getFlowFormOperates())) {
  974. boolean hasOperate = isHasOperate(dataModel, fieldKey);
  975. if (!hasOperate) {
  976. continue;
  977. }
  978. } else if (dataModel.getNeedPermission()) {
  979. if (CollectionUtil.isNotEmpty(dataModel.getFormPerList())) {
  980. if (!dataModel.getFormPerList().contains(fieldKey)) {
  981. continue;
  982. }
  983. } else {
  984. continue;
  985. }
  986. }
  987. if (isUpdate) {
  988. if (JnpfKeyConsts.CURRORGANIZE.equals(jnpfkey) || JnpfKeyConsts.CURRPOSITION.equals(jnpfkey)
  989. || JnpfKeyConsts.CREATETIME.equals(jnpfkey) || JnpfKeyConsts.CREATEUSER.equals(jnpfkey)) {
  990. continue;
  991. }
  992. } else {
  993. if (JnpfKeyConsts.MODIFYUSER.equals(jnpfkey) || JnpfKeyConsts.MODIFYTIME.equals(jnpfkey)) {
  994. continue;
  995. }
  996. }
  997. //处理系统自动生成
  998. data = this.update(fieLdsModel, data, true, objectMap.get(childPrimary) == null);
  999. data = visualBillUtil.getBillNumber(dataModel.getVisualId(), fieLdsModel, objectMap, data);
  1000. getDSL(sqlTable, null, generalInsertDSL, fieLdsModel.getFormat(), childKey, data);
  1001. getDSL(sqlTable, updateModelUpdateDSL, null, fieLdsModel.getFormat(), childKey, data);
  1002. }
  1003. if (isUpdate) {//修改
  1004. updateModelUpdateDSL.where(sqlTable.column(childPrimary), SqlBuilder.isEqualTo(objectMap.get(childPrimary)));
  1005. UpdateStatementProvider render1 = updateModelUpdateDSL.build().render(RenderingStrategies.MYBATIS3);
  1006. flowFormDataMapper.update(render1);
  1007. } else {//新增
  1008. //添加主键值和外键值
  1009. if (!autoIncrement) {
  1010. generalInsertDSL = generalInsertDSL.set(sqlTable.column(childPrimary)).toValue(RandomUtil.uuId());
  1011. }
  1012. //租户信息
  1013. addTenantId(generalInsertDSL, sqlTable);
  1014. GeneralInsertStatementProvider insertRender = generalInsertDSL.build().render(RenderingStrategies.MYBATIS3);
  1015. flowFormDataMapper.generalInsert(insertRender);
  1016. }
  1017. }
  1018. }
  1019. }
  1020. /**
  1021. * 副表数据
  1022. **/
  1023. private void updateMastTable(List<FormAllModel> formAllModel, DataModel dataModel, Connection conn, Map<String, Object> result) throws SQLException {
  1024. List<TableModel> tableModelList = dataModel.getTableModelList();
  1025. Map<String, Object> dataNewMap = dataModel.getDataNewMap();
  1026. Map<String, Object> oldMainData = dataModel.getOldMainData();
  1027. if (MapUtils.isEmpty(oldMainData)) {
  1028. return;
  1029. }
  1030. //副表
  1031. Map<String, List<FormAllModel>> mastTableAll = formAllModel.stream().filter(t -> FormEnum.mastTable.getMessage().equals(t.getJnpfKey())).collect(Collectors.groupingBy(e -> e.getFormMastTableModel().getTable()));
  1032. for (String key : mastTableAll.keySet()) {
  1033. List<FormAllModel> masTableList = mastTableAll.get(key);
  1034. //副表
  1035. Optional<TableModel> first = tableModelList.stream().filter(t -> t.getTable().equals(key)).findFirst();
  1036. if (!first.isPresent()) {
  1037. throw new SQLException(MsgCode.COD001.get());
  1038. }
  1039. TableModel tableModel = first.get();
  1040. String tableModelTable = tableModel.getTable();
  1041. SqlTable sqlTable = SqlTable.of(tableModelTable);
  1042. String childKeyName = this.getKey(tableModel, dataModel.getDbType());
  1043. //副表外键字段
  1044. String foreignKey = tableModel.getTableField();
  1045. TableFields foreignField = tableModel.getFields().stream().filter(t -> t.getField().equalsIgnoreCase(foreignKey)).findFirst().orElse(null);
  1046. if (foreignField == null) {
  1047. throw new SQLException(MsgCode.COD001.get());
  1048. }
  1049. //主表关联字段
  1050. Object foreignValue = dataNewMap.get(tableModel.getRelationField());
  1051. Object oldForeignValue = oldMainData.get(tableModel.getRelationField());
  1052. if (VisualConst.DB_INT_ALL.contains(foreignField.getDataType())) {
  1053. foreignValue = Long.parseLong(String.valueOf(foreignValue));
  1054. oldForeignValue = Long.parseLong(String.valueOf(oldForeignValue));
  1055. }
  1056. UpdateDSL<UpdateModel> updateModelUpdateDSL = SqlBuilder.update(sqlTable).set(sqlTable.column(foreignKey)).equalTo(foreignValue);
  1057. for (FormAllModel model : masTableList) {
  1058. FormMastTableModel formMastTableModel = model.getFormMastTableModel();
  1059. FormColumnModel mastTable = formMastTableModel.getMastTable();
  1060. FieLdsModel fieLdsModel = mastTable.getFieLdsModel();
  1061. String mostTableKey = fieLdsModel.getVModel();
  1062. String jnpfkey = fieLdsModel.getConfig().getJnpfKey();
  1063. Object data = dataNewMap.get(mostTableKey);
  1064. String field = formMastTableModel.getField();
  1065. //外键值写入不覆盖
  1066. if (foreignKey.equalsIgnoreCase(field)) {
  1067. continue;
  1068. }
  1069. //流程表单权限
  1070. if (CollectionUtils.isNotEmpty(dataModel.getFlowFormOperates())) {
  1071. boolean hasOperate = isHasOperate(dataModel, mostTableKey);
  1072. if (!hasOperate) {
  1073. continue;
  1074. }
  1075. } else if (dataModel.getNeedPermission()) {
  1076. if (CollectionUtil.isNotEmpty(dataModel.getFormPerList())) {
  1077. if (!dataModel.getFormPerList().contains(mostTableKey)) {
  1078. continue;
  1079. }
  1080. } else {
  1081. continue;
  1082. }
  1083. }
  1084. if (JnpfKeyConsts.CURRORGANIZE.equals(jnpfkey) || JnpfKeyConsts.CURRPOSITION.equals(jnpfkey)
  1085. || JnpfKeyConsts.CREATETIME.equals(jnpfkey) || JnpfKeyConsts.CREATEUSER.equals(jnpfkey)) {
  1086. continue;
  1087. }
  1088. //处理系统自动生成
  1089. data = this.update(fieLdsModel, data, true, false);
  1090. data = visualBillUtil.getBillNumber(dataModel.getVisualId(), fieLdsModel, dataNewMap, data);
  1091. getDSL(sqlTable, updateModelUpdateDSL, null, fieLdsModel.getFormat(), field, data);
  1092. }
  1093. UpdateStatementProvider updateStatementProvider = updateModelUpdateDSL
  1094. .where(sqlTable.column(foreignKey), SqlBuilder.isEqualTo(oldForeignValue))
  1095. .build().render(RenderingStrategies.MYBATIS3);
  1096. flowFormDataMapper.update(updateStatementProvider);
  1097. }
  1098. }
  1099. /**
  1100. * 主表数据
  1101. **/
  1102. private void updateMast(List<FormAllModel> formAllModel, DataModel dataModel, Connection conn, Map<String, Object> result) throws SQLException {
  1103. List<TableModel> tableModelList = dataModel.getTableModelList();
  1104. Map<String, Object> dataNewMap = dataModel.getDataNewMap();
  1105. List<FormAllModel> mastForm = formAllModel.stream().filter(t -> FormEnum.mast.getMessage().equals(t.getJnpfKey())).filter(
  1106. t -> StringUtil.isNotEmpty(t.getFormColumnModel().getFieLdsModel().getVModel())).collect(Collectors.toList());
  1107. Optional<TableModel> first = tableModelList.stream().filter(t -> "1".equals(t.getTypeId())).findFirst();
  1108. if (!first.isPresent()) {
  1109. throw new SQLException(MsgCode.COD001.get());
  1110. }
  1111. TableModel tableModel = first.get();
  1112. String mastTableName = tableModel.getTable();
  1113. SqlTable sqlTable = SqlTable.of(mastTableName);
  1114. TableFields keyFieldModel = tableModel.getFields().stream().filter(t -> Objects.equals(t.getPrimaryKey(), 1)
  1115. && !t.getField().toLowerCase().contains(TableFeildsEnum.TENANTID.getField())).findFirst().orElse(null);
  1116. if (keyFieldModel == null) {
  1117. throw new SQLException(MsgCode.COD001.get());
  1118. }
  1119. String keyName = keyFieldModel.getField();
  1120. //设置实际主键id
  1121. Object mainId = dataModel.getMainId();
  1122. if (VisualConst.DB_INT_ALL.contains(keyFieldModel.getDataType().toLowerCase())) {
  1123. mainId = Long.parseLong(dataModel.getMainId());
  1124. }
  1125. dataNewMap.put(keyName, mainId);
  1126. //查询旧的主表数据(用于确定修改时外键字段信息)
  1127. SelectStatementProvider render = SqlBuilder.select(sqlTable.allColumns())
  1128. .from(sqlTable)
  1129. .where(sqlTable.column(keyName), SqlBuilder.isEqualTo(mainId))
  1130. .build().render(RenderingStrategies.MYBATIS3);
  1131. List<Map<String, Object>> maps = flowFormDataMapper.selectManyMappedRows(render);
  1132. if (CollectionUtils.isEmpty(maps)) {
  1133. return;
  1134. }
  1135. dataModel.setOldMainData(maps.get(0));
  1136. UpdateDSL<UpdateModel> updateModelUpdateDSL = SqlBuilder.update(sqlTable);
  1137. int num = 0;
  1138. for (FormAllModel model : mastForm) {
  1139. FieLdsModel fieLdsModel = model.getFormColumnModel().getFieLdsModel();
  1140. String jnpfkey = fieLdsModel.getConfig().getJnpfKey();
  1141. String field = fieLdsModel.getVModel();
  1142. Object data = dataNewMap.get(field);
  1143. //流程表单权限
  1144. if (CollectionUtils.isNotEmpty(dataModel.getFlowFormOperates())) {
  1145. boolean hasOperate = isHasOperate(dataModel, field);
  1146. if (!hasOperate) {
  1147. continue;
  1148. }
  1149. } else if (dataModel.getNeedPermission()) {
  1150. if (CollectionUtil.isNotEmpty(dataModel.getFormPerList())) {
  1151. if (!dataModel.getFormPerList().contains(field)) {
  1152. continue;
  1153. }
  1154. } else {
  1155. continue;
  1156. }
  1157. }
  1158. if (JnpfKeyConsts.CURRORGANIZE.equals(jnpfkey) || JnpfKeyConsts.CURRPOSITION.equals(jnpfkey)
  1159. || JnpfKeyConsts.CREATETIME.equals(jnpfkey) || JnpfKeyConsts.CREATEUSER.equals(jnpfkey)) {
  1160. continue;
  1161. }
  1162. //处理系统自动生成
  1163. data = this.update(fieLdsModel, data, true, false);
  1164. data = visualBillUtil.getBillNumber(dataModel.getVisualId(), fieLdsModel, dataNewMap, data);
  1165. getDSL(sqlTable, updateModelUpdateDSL, null, fieLdsModel.getFormat(), field, data);
  1166. num++;
  1167. }
  1168. //判断是否开启锁
  1169. if (dataModel.getConcurrencyLock()) {
  1170. updateModelUpdateDSL = updateModelUpdateDSL.set(sqlTable.column(TableFeildsEnum.VERSION.getField())).equalTo(dataNewMap.get(TableFeildsEnum.VERSION.getField()));
  1171. }
  1172. //添加流程引擎信息
  1173. if (dataNewMap.get(FlowFormConstant.FLOWID) != null && StringUtil.isNotEmpty(dataNewMap.get(FlowFormConstant.FLOWID).toString())) {
  1174. updateModelUpdateDSL = updateModelUpdateDSL.set(sqlTable.column(TableFeildsEnum.FLOWID.getField())).equalTo(dataNewMap.get(FlowFormConstant.FLOWID));
  1175. }
  1176. UpdateStatementProvider updateStatementProvider = updateModelUpdateDSL
  1177. .where(sqlTable.column(keyName), SqlBuilder.isEqualTo(mainId))
  1178. .build().render(RenderingStrategies.MYBATIS3);
  1179. if (num > 0) {
  1180. flowFormDataMapper.update(updateStatementProvider);
  1181. }
  1182. }
  1183. /**
  1184. * 修改无表数据
  1185. **/
  1186. private Map<String, Object> updateAll(DataModel dataModel, List<FormAllModel> formAllModel) {
  1187. Map<String, Object> dataNewMap = dataModel.getDataNewMap();
  1188. //处理好的数据
  1189. Map<String, Object> result = new HashMap<>(16);
  1190. //系统数据
  1191. List<FormAllModel> mastForm = formAllModel.stream().filter(t -> FormEnum.mast.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
  1192. List<FormAllModel> tableForm = formAllModel.stream().filter(t -> FormEnum.table.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
  1193. for (String key : dataNewMap.keySet()) {
  1194. FormAllModel model = mastForm.stream().filter(t -> key.equals(t.getFormColumnModel().getFieLdsModel().getVModel())).findFirst().orElse(null);
  1195. if (model != null) {
  1196. FieLdsModel fieLdsModel = model.getFormColumnModel().getFieLdsModel();
  1197. Object data = dataNewMap.get(key);
  1198. //处理系统自动生成
  1199. data = this.update(fieLdsModel, data, false, false);
  1200. result.put(key, data);
  1201. } else {
  1202. FormAllModel childModel = tableForm.stream().filter(t -> key.equals(t.getChildList().getTableModel())).findFirst().orElse(null);
  1203. if (childModel != null) {
  1204. List<Map<String, Object>> childDataMap = (List<Map<String, Object>>) dataNewMap.get(key);
  1205. //子表处理的数据
  1206. List<Map<String, Object>> childResult = new ArrayList<>();
  1207. for (Map<String, Object> objectMap : childDataMap) {
  1208. //子表单体处理的数据
  1209. Map<String, Object> childOneResult = new HashMap<>(16);
  1210. for (String childKey : objectMap.keySet()) {
  1211. FormColumnModel columnModel = childModel.getChildList().getChildList().stream().filter(t -> childKey.equals(t.getFieLdsModel().getVModel())).findFirst().orElse(null);
  1212. if (columnModel != null) {
  1213. FieLdsModel fieLdsModel = columnModel.getFieLdsModel();
  1214. Object data = objectMap.get(childKey);
  1215. data = this.update(fieLdsModel, data, false, false);
  1216. childOneResult.put(childKey, data);
  1217. }
  1218. }
  1219. childResult.add(childOneResult);
  1220. }
  1221. result.put(key, childResult);
  1222. }
  1223. }
  1224. }
  1225. return result;
  1226. }
  1227. /**
  1228. * childNeedAdd子表id为空需要生成单据规则(除子表外其他都是false)
  1229. * 修改系统赋值
  1230. **/
  1231. private Object update(FieLdsModel fieLdsModel, Object dataValue, boolean isTable, boolean childNeedAdd) {
  1232. String jnpfKey = fieLdsModel.getConfig().getJnpfKey();
  1233. String rule = fieLdsModel.getConfig().getRule();
  1234. String format = DateTimeFormatConstant.getFormat(fieLdsModel.getFormat());
  1235. UserInfo user = UserProvider.getUser();
  1236. Object value = dataValue;
  1237. switch (jnpfKey) {
  1238. case JnpfKeyConsts.CREATEUSER:
  1239. value = user.getUserId();
  1240. break;
  1241. case JnpfKeyConsts.CREATETIME:
  1242. value = new Date();
  1243. break;
  1244. case JnpfKeyConsts.CURRORGANIZE:
  1245. case JnpfKeyConsts.CURRDEPT:
  1246. if (user != null && CollectionUtil.isNotEmpty(user.getOrganizeIds())) {
  1247. value = JsonUtil.getObjectToString(user.getOrganizeIds());
  1248. }
  1249. break;
  1250. case JnpfKeyConsts.MODIFYTIME:
  1251. if (!childNeedAdd) {
  1252. value = new Date();
  1253. }
  1254. break;
  1255. case JnpfKeyConsts.MODIFYUSER:
  1256. if (!childNeedAdd) {
  1257. value = user.getUserId();
  1258. }
  1259. break;
  1260. case JnpfKeyConsts.CURRPOSITION:
  1261. if (user != null && CollectionUtil.isNotEmpty(user.getPositionIds())) {
  1262. value = JsonUtil.getObjectToString(user.getPositionIds());
  1263. }
  1264. break;
  1265. case JnpfKeyConsts.BILLRULE:
  1266. if (Objects.equals(fieLdsModel.getConfig().getRuleType(), 1) && (childNeedAdd || ObjectUtil.isEmpty(dataValue))) {
  1267. try {
  1268. value = serviceUtil.getBillNumber(rule);
  1269. } catch (Exception e) {
  1270. value = null;
  1271. }
  1272. }
  1273. break;
  1274. case JnpfKeyConsts.DATE:
  1275. case JnpfKeyConsts.DATE_CALCULATE:
  1276. if (isTable) {
  1277. try {
  1278. if (dataValue == null || "".equals(dataValue)) {
  1279. return null;
  1280. }
  1281. if (dataValue instanceof String) {
  1282. try {
  1283. SimpleDateFormat formatter = new SimpleDateFormat(format);
  1284. value = formatter.parse(dataValue.toString());
  1285. } catch (ParseException var3) {
  1286. return null;
  1287. }
  1288. } else {
  1289. value = new Date(Long.valueOf(String.valueOf(dataValue)));
  1290. }
  1291. } catch (Exception e) {
  1292. }
  1293. }
  1294. break;
  1295. case JnpfKeyConsts.NUM_INPUT:
  1296. case JnpfKeyConsts.CALCULATE:
  1297. if (isTable) {
  1298. try {
  1299. value = new BigDecimal(String.valueOf(dataValue));
  1300. } catch (Exception e) {
  1301. }
  1302. }
  1303. break;
  1304. default:
  1305. if (isTable) {
  1306. value = this.valueToNull(value);
  1307. }
  1308. break;
  1309. }
  1310. return value;
  1311. }
  1312. /**
  1313. * 删除有表单条数据
  1314. *
  1315. * @param id
  1316. * @param visualDevJsonModel
  1317. * @return
  1318. * @throws SQLException
  1319. * @throws DataException
  1320. */
  1321. @DSTransactional
  1322. public boolean deleteTable(String id, VisualDevJsonModel visualDevJsonModel, DbLinkEntity linkEntity) throws Exception {
  1323. Boolean logicalDelete = visualDevJsonModel.getFormData().getLogicalDelete();
  1324. Integer primaryKeyPolicy = visualDevJsonModel.getFormData().getPrimaryKeyPolicy();
  1325. List<TableModel> tableModels = visualDevJsonModel.getVisualTables();
  1326. List<FieLdsModel> list = JsonUtil.getJsonToList(visualDevJsonModel.getFormData().getFields(), FieLdsModel.class);
  1327. RecursionForm recursionForm = new RecursionForm(list, tableModels);
  1328. List<FormAllModel> formAllModel = new ArrayList<>();
  1329. FormCloumnUtil.recursionForm(recursionForm, formAllModel);
  1330. List<FormAllModel> tableForm = formAllModel.stream().filter(t -> FormEnum.table.getMessage().equals(t.getJnpfKey())).collect(Collectors.toList());
  1331. Map<String, Boolean> disableMap = new HashMap<>();
  1332. for (FormAllModel allModel : tableForm) {
  1333. disableMap.put(allModel.getChildList().getTableName(), allModel.getChildList().getDisabled());
  1334. }
  1335. //主表
  1336. TableModel mainTableModel = tableModels.stream().filter(t -> "1".equals(t.getTypeId())).findFirst().orElse(null);
  1337. String mainTable = mainTableModel.getTable();
  1338. DynamicDataSourceUtil.switchToDataSource(linkEntity);
  1339. try {
  1340. @Cleanup Connection conn = ConnUtil.getConnOrDefault(linkEntity);
  1341. String dbType = conn.getMetaData().getDatabaseProductName().trim();
  1342. String pKeyName = this.getKey(mainTableModel, dbType);
  1343. String flowTaskId = this.getFlowTaskId(mainTableModel, dbType);
  1344. List<AndOrCriteriaGroup> groupList = new ArrayList<>();
  1345. groupList.add(SqlBuilder.or(SqlTable.of(mainTable).column(flowTaskId), SqlBuilder.isEqualTo(id)));
  1346. boolean autoIncrement = Objects.equals(primaryKeyPolicy, 2);
  1347. Object selectId = id;
  1348. if (autoIncrement) {
  1349. selectId = Long.parseLong(id);
  1350. }
  1351. SelectStatementProvider queryMain = SqlBuilder.select(SqlTable.of(mainTable).allColumns())
  1352. .from(SqlTable.of(mainTable))
  1353. .where(SqlTable.of(mainTable).column(pKeyName), SqlBuilder.isEqualTo(selectId), groupList)
  1354. .build().render(RenderingStrategies.MYBATIS3);
  1355. Map<String, Object> mainMap = flowFormDataMapper.selectOneMappedRow(queryMain);
  1356. if (MapUtils.isNotEmpty(mainMap)) {
  1357. Object realId = mainMap.get(pKeyName);
  1358. //是否开启逻辑删除
  1359. if (logicalDelete) {
  1360. SqlTable sqlt = SqlTable.of(mainTable);
  1361. UpdateDSL<UpdateModel> updateModelUpdateDSL = SqlBuilder.update(sqlt);
  1362. updateModelUpdateDSL.set(sqlt.column(TableFeildsEnum.DELETEMARK.getField())).equalTo(1);
  1363. updateModelUpdateDSL.set(sqlt.column(TableFeildsEnum.DELETETIME.getField())).equalTo(new Date());
  1364. updateModelUpdateDSL.set(sqlt.column(TableFeildsEnum.DELETEUSERID.getField())).equalTo(UserProvider.getUser().getUserId());
  1365. UpdateStatementProvider mainUpdate = updateModelUpdateDSL
  1366. .where(SqlTable.of(mainTable).column(pKeyName), SqlBuilder.isEqualTo(realId))
  1367. .build().render(RenderingStrategies.MYBATIS3);
  1368. flowFormDataMapper.update(mainUpdate);
  1369. } else {
  1370. DeleteStatementProvider mainDelete = SqlBuilder.deleteFrom(SqlTable.of(mainTable))
  1371. .where(SqlTable.of(mainTable).column(pKeyName), SqlBuilder.isEqualTo(realId))
  1372. .build().render(RenderingStrategies.MYBATIS3);
  1373. flowFormDataMapper.delete(mainDelete);
  1374. }
  1375. if (tableModels.size() > 1) {
  1376. //去除主表
  1377. tableModels.remove(mainTableModel);
  1378. for (TableModel table : tableModels) {
  1379. if (CollectionUtil.isNotEmpty(disableMap) && disableMap.get(table.getTable()) != null && disableMap.get(table.getTable())) {
  1380. continue;
  1381. }
  1382. //主表关联-字段值
  1383. Object relationFieldValue = mainMap.get(table.getRelationField());
  1384. //子表字段-key
  1385. String tableField = table.getTableField();
  1386. if (logicalDelete) {
  1387. SqlTable sqlt = SqlTable.of(table.getTable());
  1388. UpdateDSL<UpdateModel> updateModelUpdateDSL = SqlBuilder.update(sqlt);
  1389. updateModelUpdateDSL.set(sqlt.column(TableFeildsEnum.DELETEMARK.getField())).equalTo(1);
  1390. updateModelUpdateDSL.set(sqlt.column(TableFeildsEnum.DELETETIME.getField())).equalTo(new Date());
  1391. updateModelUpdateDSL.set(sqlt.column(TableFeildsEnum.DELETEUSERID.getField())).equalTo(UserProvider.getUser().getUserId());
  1392. UpdateStatementProvider mainUpdate = updateModelUpdateDSL
  1393. .where(SqlTable.of(table.getTable()).column(tableField), SqlBuilder.isEqualTo(relationFieldValue))
  1394. .build().render(RenderingStrategies.MYBATIS3);
  1395. flowFormDataMapper.update(mainUpdate);
  1396. } else {
  1397. DeleteStatementProvider childDeleteProvider = SqlBuilder.deleteFrom(SqlTable.of(table.getTable()))
  1398. .where(SqlTable.of(table.getTable()).column(tableField), SqlBuilder.isEqualTo(relationFieldValue))
  1399. .build().render(RenderingStrategies.MYBATIS3);
  1400. flowFormDataMapper.delete(childDeleteProvider);
  1401. }
  1402. }
  1403. }
  1404. }
  1405. } finally {
  1406. DynamicDataSourceUtil.clearSwitchDataSource();
  1407. }
  1408. return true;
  1409. }
  1410. /**
  1411. * 获取锁字段信息
  1412. *
  1413. * @param table
  1414. * @param linkEntity
  1415. * @param dataMap
  1416. * @param id
  1417. * @return
  1418. */
  1419. public Boolean getVersion(String table, DbLinkEntity linkEntity, Map dataMap, Object id) {
  1420. boolean canUpdate = true;
  1421. try {
  1422. DynamicDataSourceUtil.switchToDataSource(linkEntity);
  1423. @Cleanup Connection conn = ConnUtil.getConnOrDefault(linkEntity);
  1424. String pKeyName = this.getTableKey(conn, table);
  1425. SqlTable sqlTable = SqlTable.of(table);
  1426. SelectStatementProvider render = SqlBuilder.select(sqlTable.column(TableFeildsEnum.VERSION.getField()))
  1427. .from(sqlTable)
  1428. .where(sqlTable.column(pKeyName), SqlBuilder.isEqualTo(id))
  1429. .and(sqlTable.column(TableFeildsEnum.VERSION.getField()), SqlBuilder.isEqualTo(dataMap.get(TableFeildsEnum.VERSION.getField())))
  1430. .build().render(RenderingStrategies.MYBATIS3);
  1431. int count = flowFormDataMapper.selectManyMappedRows(render).size();
  1432. canUpdate = count > 0;
  1433. } catch (DataException | SQLException e) {
  1434. log.error("切换数据源异常");
  1435. } finally {
  1436. DynamicDataSourceUtil.clearSwitchDataSource();
  1437. }
  1438. return canUpdate;
  1439. }
  1440. /**
  1441. * 添加sql语句
  1442. *
  1443. * @param
  1444. * @return
  1445. * @copyright 引迈信息技术有限公司
  1446. * @date 2023/3/29
  1447. */
  1448. private void getDSL(SqlTable sqlTable, UpdateDSL<UpdateModel> updateModelUpdateDSL, GeneralInsertDSL generalInsertDSL,
  1449. String format, String field, Object data) {
  1450. boolean dataTimestamp = StringUtil.isNotEmpty(format) ? format.length() > 10 : true;
  1451. String dateFunc = dataTimestamp ? "to_timestamp" : "to_date";
  1452. if (data == null || StringUtil.isEmpty(data.toString())) {
  1453. if (generalInsertDSL != null) {
  1454. generalInsertDSL = generalInsertDSL.set(sqlTable.column(field)).toNull();
  1455. } else {
  1456. updateModelUpdateDSL = updateModelUpdateDSL.set(sqlTable.column(field)).equalToNull();
  1457. }
  1458. } else {
  1459. if (generalInsertDSL != null) {
  1460. generalInsertDSL = generalInsertDSL.set(sqlTable.column(field)).toValue(data);
  1461. } else {
  1462. updateModelUpdateDSL = updateModelUpdateDSL.set(sqlTable.column(field)).equalTo(data);
  1463. }
  1464. }
  1465. }
  1466. /**
  1467. * 判断数据为空或空数组转换成null
  1468. *
  1469. * @param value
  1470. * @return
  1471. */
  1472. private Object valueToNull(Object value) {
  1473. if (value instanceof List || value instanceof String[][]) {
  1474. List l = (List) value;
  1475. if (l.size() > 0) {
  1476. value = JsonUtil.getObjectToString(value);
  1477. } else {
  1478. value = null;
  1479. }
  1480. } else if (value instanceof CharSequence) {
  1481. if (StrUtil.isEmpty((CharSequence) value) || "[]".equals(value)) {
  1482. value = null;
  1483. }
  1484. }
  1485. return value;
  1486. }
  1487. /**
  1488. * 获取当前组织完整路径
  1489. *
  1490. * @param orgId
  1491. * @return
  1492. */
  1493. public String getCurrentOrgIds(String orgId, String showLevel) {
  1494. String orgIds = null;
  1495. OrganizeEntity organizeEntity = serviceUtil.getOrganizeInfo(orgId);
  1496. if (organizeEntity != null) {
  1497. if (StringUtil.isNotEmpty(organizeEntity.getOrganizeIdTree())) {
  1498. String[] split = organizeEntity.getOrganizeIdTree().split(",");
  1499. orgIds = split.length > 0 ? JsonUtil.getObjectToString(Arrays.asList(split)) : null;
  1500. }
  1501. }
  1502. if (!"all".equals(showLevel) && organizeEntity != null && "company".equals(organizeEntity.getCategory())) {
  1503. orgIds = null;
  1504. }
  1505. return orgIds;
  1506. }
  1507. /**
  1508. * 是否有流程表单权限
  1509. *
  1510. * @param dataModel
  1511. * @param field
  1512. * @return false 没有权限(需要跳过)
  1513. */
  1514. private boolean isHasOperate(DataModel dataModel, String field) {
  1515. boolean hasOperate = true;
  1516. for (Map<String, Object> item : dataModel.getFlowFormOperates()) {
  1517. if (field.equals(item.get("id")) && (item.get("write") == null || "false".equals(item.get("write").toString()))) {
  1518. hasOperate = false;
  1519. }
  1520. }
  1521. return hasOperate;
  1522. }
  1523. /**
  1524. * 添加租户信息
  1525. *
  1526. * @param generalInsertDSL
  1527. * @param sqlTable
  1528. */
  1529. private void addTenantId(GeneralInsertDSL generalInsertDSL, SqlTable sqlTable) {
  1530. //租户信息
  1531. String tenantId = TenantDataSourceUtil.getTenantColumn();
  1532. generalInsertDSL.set(sqlTable.column(TableFeildsEnum.TENANTID.getField())).toValue(tenantId);
  1533. }
  1534. public void saveState(VisualdevEntity visualdevEntity, String flowTaskId, Integer flowState) {
  1535. List<TableModel> tableModels = JsonUtil.getJsonToList(visualdevEntity.getVisualTables(), TableModel.class);
  1536. TableModel mainT = tableModels.stream().filter(t -> t.getTypeId().equals("1")).findFirst().orElse(null);
  1537. DbLinkEntity linkEntity = serviceUtil.getDbLink(visualdevEntity.getDbLinkId());
  1538. try {
  1539. DynamicDataSourceUtil.switchToDataSource(linkEntity);
  1540. SqlTable sqlt = SqlTable.of(mainT.getTable());
  1541. UpdateDSL<UpdateModel> updateModelUpdateDSL = SqlBuilder.update(sqlt);
  1542. updateModelUpdateDSL.set(sqlt.column(TableFeildsEnum.FLOWSTATE.getField())).equalTo(flowState);
  1543. UpdateStatementProvider mainUpdate = updateModelUpdateDSL
  1544. .where(SqlTable.of(mainT.getTable()).column(TableFeildsEnum.FLOWTASKID.getField()), SqlBuilder.isEqualTo(flowTaskId))
  1545. .build().render(RenderingStrategies.MYBATIS3);
  1546. flowFormDataMapper.update(mainUpdate);
  1547. } catch (Exception e) {
  1548. e.printStackTrace();
  1549. } finally {
  1550. DynamicDataSourceUtil.clearSwitchDataSource();
  1551. }
  1552. }
  1553. }