VisualdevController.java 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  1. package jnpf.base.controller;
  2. import cn.dev33.satoken.annotation.SaCheckPermission;
  3. import cn.dev33.satoken.annotation.SaMode;
  4. import cn.hutool.core.bean.BeanUtil;
  5. import cn.hutool.core.collection.CollectionUtil;
  6. import cn.hutool.core.util.ObjectUtil;
  7. import com.baomidou.dynamic.datasource.annotation.DSTransactional;
  8. import io.swagger.v3.oas.annotations.Operation;
  9. import io.swagger.v3.oas.annotations.Parameter;
  10. import io.swagger.v3.oas.annotations.Parameters;
  11. import io.swagger.v3.oas.annotations.tags.Tag;
  12. import jnpf.base.ActionResult;
  13. import jnpf.base.UserInfo;
  14. import jnpf.base.entity.*;
  15. import jnpf.base.model.*;
  16. import jnpf.base.model.Template6.BtnData;
  17. import jnpf.base.model.Template6.ColumnListField;
  18. import jnpf.base.model.form.VisualFieldModel;
  19. import jnpf.base.model.module.ModuleNameVO;
  20. import jnpf.base.model.module.PropertyJsonModel;
  21. import jnpf.base.model.online.VisualMenuModel;
  22. import jnpf.base.service.*;
  23. import jnpf.base.util.VisualUtil;
  24. import jnpf.base.util.visualUtil.PubulishUtil;
  25. import jnpf.base.vo.ListVO;
  26. import jnpf.base.vo.PageListVO;
  27. import jnpf.base.vo.PaginationVO;
  28. import jnpf.constant.GenerateConstant;
  29. import jnpf.constant.JnpfConst;
  30. import jnpf.constant.MsgCode;
  31. import jnpf.exception.DataException;
  32. import jnpf.exception.WorkFlowException;
  33. import jnpf.flowable.model.template.FlowByFormModel;
  34. import jnpf.model.OnlineDevData;
  35. import jnpf.model.visualJson.FieLdsModel;
  36. import jnpf.model.visualJson.FormCloumnUtil;
  37. import jnpf.model.visualJson.FormDataModel;
  38. import jnpf.model.visualJson.TableModel;
  39. import jnpf.model.visualJson.analysis.RecursionForm;
  40. import jnpf.onlinedev.model.PaginationModel;
  41. import jnpf.onlinedev.service.VisualdevModelDataService;
  42. import jnpf.onlinedev.util.onlineDevUtil.OnlinePublicUtils;
  43. import jnpf.permission.entity.UserEntity;
  44. import jnpf.permission.service.UserService;
  45. import jnpf.util.*;
  46. import jnpf.util.context.RequestContext;
  47. import jnpf.util.enums.DictionaryDataEnum;
  48. import jnpf.util.visiual.JnpfKeyConsts;
  49. import jnpf.workflow.service.TemplateApi;
  50. import org.springframework.beans.factory.annotation.Autowired;
  51. import org.springframework.transaction.annotation.Transactional;
  52. import org.springframework.web.bind.annotation.*;
  53. import java.util.*;
  54. import java.util.stream.Collectors;
  55. /**
  56. * 可视化基础模块
  57. *
  58. * @author JNPF开发平台组
  59. * @version V3.1.0
  60. * @copyright 引迈信息技术有限公司
  61. * @date 2019年9月27日 上午9:18
  62. */
  63. @Tag(name = "可视化基础模块", description = "Base")
  64. @RestController
  65. @RequestMapping("/api/visualdev/Base")
  66. public class VisualdevController extends SuperController<VisualdevService, VisualdevEntity> {
  67. @Autowired
  68. private VisualdevService visualdevService;
  69. @Autowired
  70. private VisualdevReleaseService visualdevReleaseService;
  71. @Autowired
  72. private UserService userService;
  73. @Autowired
  74. private DictionaryDataService dictionaryDataApi;
  75. @Autowired
  76. private VisualdevModelDataService visualdevModelDataService;
  77. @Autowired
  78. private PubulishUtil pubulishUtil;
  79. @Autowired
  80. private ModuleService moduleService;
  81. @Autowired
  82. private DataInterfaceService dataInterFaceApi;
  83. @Autowired
  84. private FilterService filterService;
  85. @Autowired
  86. private VisualAliasService aliasService;
  87. @Autowired
  88. private TemplateApi templateApi;
  89. @Autowired
  90. private SystemService systemService;
  91. @Operation(summary = "获取功能列表")
  92. @GetMapping
  93. @SaCheckPermission(value = {"onlineDev.formDesign", "onlineDev.sysForm", "generator.flowForm"}, mode = SaMode.OR)
  94. public ActionResult<PageListVO<VisualFunctionModel>> list(PaginationVisualdev paginationVisualdev) {
  95. SystemEntity infoByEnCode = systemService.getInfoByEnCode(RequestContext.getAppCode());
  96. paginationVisualdev.setSystemId(infoByEnCode.getId());
  97. // 全部功能表单模板
  98. List<VisualdevEntity> data = visualdevService.getList(paginationVisualdev);
  99. List<String> userId = data.stream().map(t -> t.getCreatorUserId()).collect(Collectors.toList());
  100. List<String> lastUserId = data.stream().map(t -> t.getLastModifyUserId()).collect(Collectors.toList());
  101. List<UserEntity> userEntities = userService.getUserName(userId);
  102. List<UserEntity> lastUserIdEntities = userService.getUserName(lastUserId);
  103. // 表单类型
  104. List<DictionaryDataEntity> dictionList = dictionaryDataApi.getListByTypeDataCode(DictionaryDataEnum.VISUALDEV.getDictionaryTypeId());
  105. List<VisualFunctionModel> modelAll = new LinkedList<>();
  106. // 遍历功能表单模板
  107. for (VisualdevEntity entity : data) {
  108. VisualFunctionModel model = JsonUtil.getJsonToBean(entity, VisualFunctionModel.class);
  109. // 是否在表单类型中存在,若存在进行装配
  110. DictionaryDataEntity dataEntity = dictionList.stream().filter(t -> t.getId().equals(entity.getCategory())).findFirst().orElse(null);
  111. //避免导入的功能丢失
  112. model.setCategory(dataEntity != null ? dataEntity.getFullName() : null);
  113. UserEntity creatorUser = userEntities.stream().filter(t -> t.getId().equals(model.getCreatorUserId())).findFirst().orElse(null);
  114. model.setCreatorUser(creatorUser != null ? creatorUser.getRealName() + "/" + creatorUser.getAccount() : "");
  115. UserEntity lastmodifyuser = lastUserIdEntities.stream().filter(t -> t.getId().equals(model.getLastModifyUserId())).findFirst().orElse(null);
  116. model.setLastModifyUser(lastmodifyuser != null ? lastmodifyuser.getRealName() + "/" + lastmodifyuser.getAccount() : "");
  117. model.setIsRelease(entity.getState());
  118. model.setHasPackage(true);
  119. modelAll.add(model);
  120. }
  121. PaginationVO paginationVO = JsonUtil.getJsonToBean(paginationVisualdev, PaginationVO.class);
  122. return ActionResult.page(modelAll, paginationVO);
  123. }
  124. @Operation(summary = "获取功能列表")
  125. @GetMapping("/list")
  126. public ActionResult<PageListVO<VisualDevListVO>> getList(PaginationVisualdev paginationVisualdev) {
  127. SystemEntity infoByEnCode = systemService.getInfoByEnCode(RequestContext.getAppCode());
  128. paginationVisualdev.setSystemId(infoByEnCode.getId());
  129. paginationVisualdev.setEnableFlow(1);
  130. List<VisualdevEntity> data = visualdevService.getPageList(paginationVisualdev);
  131. List<VisualDevListVO> modelAll = JsonUtil.getJsonToList(data, VisualDevListVO.class);
  132. //流程发起节点-调用弹窗添加系统表单是否引用
  133. if (paginationVisualdev.getFlowStart()) {
  134. List<String> flowFormStart = templateApi.getFormList();//流程发起节点的表单列表
  135. for (VisualDevListVO item : modelAll) {
  136. if (Objects.equals(item.getType(), 2)) {//系统表单被引用不能再选
  137. boolean contains = flowFormStart.contains(item.getId());
  138. item.setIsQuote(contains ? 1 : 0);
  139. }
  140. }
  141. }
  142. PaginationVO paginationVO = JsonUtil.getJsonToBean(paginationVisualdev, PaginationVO.class);
  143. return ActionResult.page(modelAll, paginationVO);
  144. }
  145. @Operation(summary = "获取功能列表下拉框")
  146. @Parameters({
  147. @Parameter(name = "type", description = "类型(1-表单设计,2-系统表单)"),
  148. @Parameter(name = "isRelease", description = "是否发布"),
  149. @Parameter(name = "webType", description = "页面类型(1、纯表单,2、表单加列表,3、表单列表工作流、4、数据视图)"),
  150. @Parameter(name = "enableFlow", description = "是否启用流程")
  151. })
  152. @GetMapping("/Selector")
  153. public ActionResult selectorList(Integer type, Integer isRelease, String webType, Integer enableFlow) {
  154. SystemEntity infoByEnCode = systemService.getInfoByEnCode(RequestContext.getAppCode());
  155. List<VisualdevEntity> allList;
  156. List<VisualdevEntity> list = new ArrayList<>();
  157. List<VisualdevTreeVO> voList = new ArrayList<>();
  158. String systemId = infoByEnCode.getId();
  159. if (Objects.equals(infoByEnCode.getIsMain(), 1)) {
  160. systemId = "";
  161. }
  162. if (isRelease != null) {
  163. List<VisualdevReleaseEntity> releaseEntities = visualdevReleaseService.selectorList(systemId);
  164. allList = JsonUtil.getJsonToList(releaseEntities, VisualdevEntity.class);
  165. } else {
  166. allList = visualdevService.selectorList(systemId);
  167. }
  168. if (webType != null) {
  169. String[] webTypes = webType.split(",");
  170. for (String wbType : webTypes) {
  171. List<VisualdevEntity> collect = allList.stream().filter(l -> l.getWebType().equals(Integer.valueOf(wbType))).collect(Collectors.toList());
  172. list.addAll(collect);
  173. }
  174. } else {
  175. list = allList;
  176. }
  177. //主系统,套件关联表单用应用分类
  178. if (Objects.equals(infoByEnCode.getIsMain(), 1)) {
  179. List<String> sysIds = list.stream().map(VisualdevEntity::getSystemId).collect(Collectors.toList());
  180. List<SystemEntity> listByIds = systemService.getListByIds(sysIds, null);
  181. for (SystemEntity se : listByIds) {
  182. VisualdevTreeVO vo = JsonUtil.getJsonToBean(se, VisualdevTreeVO.class);
  183. List<VisualdevTreeVO> childList = new ArrayList<>();
  184. for (VisualdevEntity entity : list) {
  185. if (vo.getId().equals(entity.getSystemId())) {
  186. VisualdevTreeVO model = JsonUtil.getJsonToBean(entity, VisualdevTreeVO.class);
  187. childList.add(model);
  188. }
  189. }
  190. if (CollectionUtil.isNotEmpty(childList)) {
  191. vo.setChildren(childList);
  192. voList.add(vo);
  193. }
  194. }
  195. ListVO listVO = new ListVO();
  196. listVO.setList(voList);
  197. return ActionResult.success(listVO);
  198. }
  199. //非主系统,关联表单用category分类
  200. List<DictionaryDataEntity> dataEntityList = new ArrayList<>();
  201. HashSet<String> cate = new HashSet<>(16);
  202. if (type != null) {
  203. list = list.stream().filter(t -> type.equals(t.getType())).collect(Collectors.toList());
  204. dataEntityList = dictionaryDataApi.getListByTypeDataCode(DictionaryDataEnum.getTypeId(type));
  205. // 遍历数据字典得到外部分类
  206. for (DictionaryDataEntity dataEntity : dataEntityList) {
  207. List<VisualdevEntity> num = list.stream().filter(t -> dataEntity.getId().equals(t.getCategory())).collect(Collectors.toList());
  208. if (num.size() <= 0) {
  209. continue;
  210. }
  211. int i = cate.size();
  212. cate.add(dataEntity.getId());
  213. if (cate.size() == i + 1) {
  214. VisualdevTreeVO visualdevTreeVO = new VisualdevTreeVO();
  215. visualdevTreeVO.setId(dataEntity.getId());
  216. visualdevTreeVO.setFullName(dataEntity.getFullName());
  217. visualdevTreeVO.setHasChildren(true);
  218. voList.add(visualdevTreeVO);
  219. }
  220. }
  221. } else {
  222. // type为空时
  223. for (VisualdevEntity entity : list) {
  224. DictionaryDataEntity dataEntity = dictionaryDataApi.getInfo(entity.getCategory());
  225. if (dataEntity != null) {
  226. int i = cate.size();
  227. cate.add(dataEntity.getId());
  228. if (cate.size() == i + 1) {
  229. VisualdevTreeVO visualdevTreeVO = new VisualdevTreeVO();
  230. visualdevTreeVO.setId(entity.getCategory());
  231. visualdevTreeVO.setFullName(dataEntity.getFullName());
  232. visualdevTreeVO.setHasChildren(true);
  233. voList.add(visualdevTreeVO);
  234. }
  235. }
  236. }
  237. }
  238. for (VisualdevTreeVO vo : voList) {
  239. List<VisualdevTreeVO> childList = new ArrayList<>();
  240. for (VisualdevEntity entity : list) {
  241. if (vo.getId().equals(entity.getCategory())) {
  242. VisualdevTreeVO model = JsonUtil.getJsonToBean(entity, VisualdevTreeVO.class);
  243. childList.add(model);
  244. }
  245. }
  246. vo.setChildren(childList);
  247. }
  248. ListVO listVO = new ListVO();
  249. listVO.setList(voList);
  250. return ActionResult.success(listVO);
  251. }
  252. @Operation(summary = "获取功能信息")
  253. @Parameters({
  254. @Parameter(name = "id", description = "主键"),
  255. })
  256. @GetMapping("/{id}")
  257. @SaCheckPermission(value = {"onlineDev.formDesign", "onlineDev.sysForm", "generator.flowForm"}, mode = SaMode.OR)
  258. public ActionResult info(@PathVariable("id") String id) throws DataException {
  259. UserInfo userInfo = UserProvider.getUser();
  260. VisualdevEntity entity = visualdevService.getInfo(id);
  261. VisualDevInfoVO vo = JsonUtilEx.getJsonToBeanEx(entity, VisualDevInfoVO.class);
  262. if (StringUtil.isNotEmpty(entity.getInterfaceId())) {
  263. DataInterfaceEntity info = dataInterFaceApi.getInfo(entity.getInterfaceId());
  264. if (info != null) {
  265. vo.setInterfaceName(info.getFullName());
  266. }
  267. }
  268. return ActionResult.success(vo);
  269. }
  270. /**
  271. * 获取表单主表属性下拉框
  272. *
  273. * @param id
  274. * @return
  275. */
  276. @Operation(summary = "获取表单主表属性下拉框")
  277. @Parameters({
  278. @Parameter(name = "id", description = "主键"),
  279. @Parameter(name = "filterType", description = "过滤类型:1-按键事件选择字段列表过滤"),
  280. })
  281. @GetMapping("/{id}/FormDataFields")
  282. @SaCheckPermission(value = {"onlineDev.formDesign", "onlineDev.sysForm", "generator.flowForm"}, mode = SaMode.OR)
  283. public ActionResult<ListVO<FormDataField>> getFormData(@PathVariable("id") String id, @RequestParam(value = "filterType", required = false) Integer filterType) {
  284. List<FormDataField> fieldList = visualdevModelDataService.fieldList(id, filterType);
  285. ListVO<FormDataField> listVO = new ListVO();
  286. listVO.setList(fieldList);
  287. return ActionResult.success(listVO);
  288. }
  289. /**
  290. * 关联数据分页数据
  291. *
  292. * @param id
  293. * @param paginationModel
  294. * @return
  295. */
  296. @Operation(summary = "关联数据分页数据")
  297. @Parameters({
  298. @Parameter(name = "id", description = "主键"),
  299. })
  300. @GetMapping("/{id}/FieldDataSelect")
  301. public ActionResult getFormData(@PathVariable("id") String id, PaginationModel paginationModel) {
  302. VisualdevEntity entity = visualdevService.getReleaseInfo(id);
  303. List<Map<String, Object>> realList = visualdevModelDataService.getPageList(entity, paginationModel);
  304. PaginationVO paginationVO = JsonUtil.getJsonToBean(paginationModel, PaginationVO.class);
  305. return ActionResult.page(realList, paginationVO);
  306. }
  307. /**
  308. * 复制功能
  309. *
  310. * @param id
  311. * @return
  312. */
  313. @Operation(summary = "复制功能")
  314. @Parameters({
  315. @Parameter(name = "id", description = "主键"),
  316. })
  317. @PostMapping("/{id}/Actions/Copy")
  318. @SaCheckPermission(value = {"onlineDev.formDesign", "onlineDev.sysForm", "generator.flowForm"}, mode = SaMode.OR)
  319. public ActionResult copyInfo(@PathVariable("id") String id) throws WorkFlowException {
  320. VisualdevReleaseEntity releaseEntity = visualdevReleaseService.getById(id);
  321. boolean b = releaseEntity != null;
  322. VisualdevEntity entity;
  323. String uuid = RandomUtil.uuId();
  324. //已发布取发布版本
  325. if (b) {
  326. entity = JsonUtil.getJsonToBean(releaseEntity, VisualdevEntity.class);
  327. //已发布复制命名规范
  328. aliasService.copy(releaseEntity.getId(), uuid);
  329. } else {
  330. entity = visualdevService.getInfo(id);
  331. }
  332. String copyNum = UUID.randomUUID().toString().substring(0, 5);
  333. entity.setFullName(entity.getFullName() + ".副本" + copyNum);
  334. entity.setLastModifyTime(null);
  335. entity.setLastModifyUserId(null);
  336. entity.setCreatorTime(null);
  337. entity.setId(uuid);
  338. entity.setEnCode(entity.getEnCode() + copyNum);
  339. VisualdevEntity entity1 = JsonUtil.getJsonToBean(entity, VisualdevEntity.class);
  340. if (entity1.getEnCode().length() > 50 || entity1.getFullName().length() > 50) {
  341. return ActionResult.fail(MsgCode.PRI006.get());
  342. }
  343. visualdevService.create(entity1);
  344. return ActionResult.success(MsgCode.SU007.get());
  345. }
  346. /**
  347. * 更新功能状态
  348. *
  349. * @param id 主键值
  350. * @return
  351. */
  352. @Operation(summary = "更新功能状态")
  353. @Parameters({
  354. @Parameter(name = "id", description = "主键"),
  355. })
  356. @PutMapping("/{id}/Actions/State")
  357. @SaCheckPermission(value = {"onlineDev.formDesign", "onlineDev.sysForm", "generator.flowForm"}, mode = SaMode.OR)
  358. public ActionResult update(@PathVariable("id") String id) throws Exception {
  359. VisualdevEntity entity = visualdevService.getInfo(id);
  360. if (entity != null) {
  361. boolean flag = visualdevService.update(entity.getId(), entity);
  362. if (flag == false) {
  363. return ActionResult.fail(MsgCode.FA002.get());
  364. }
  365. }
  366. return ActionResult.success(MsgCode.SU004.get());
  367. }
  368. @Operation(summary = "新建功能")
  369. @PostMapping
  370. @SaCheckPermission(value = {"onlineDev.formDesign", "onlineDev.sysForm", "generator.flowForm"}, mode = SaMode.OR)
  371. public ActionResult create(@RequestBody VisualDevCrForm visualDevCrForm) throws Exception {
  372. SystemEntity infoByEnCode = systemService.getInfoByEnCode(RequestContext.getAppCode());
  373. VisualdevEntity entity = JsonUtil.getJsonToBean(JsonUtilEx.getObjectToString(visualDevCrForm), VisualdevEntity.class);
  374. if (GenerateConstant.containKeyword(entity.getFullName())) {
  375. return ActionResult.fail("表单名称" + MsgCode.SYS128.get(entity.getFullName()));
  376. }
  377. if (visualdevService.getObjByEncode(entity.getEnCode(), entity.getType())) {
  378. return ActionResult.fail(MsgCode.EXIST002.get());
  379. }
  380. if (visualdevService.getCountByName(entity.getFullName(), entity.getType(), infoByEnCode.getId())) {
  381. return ActionResult.fail(MsgCode.EXIST001.get());
  382. }
  383. if (!VisualWebTypeEnum.DATA_VIEW.getType().equals(entity.getWebType())
  384. && !OnlineDevData.FORM_TYPE_SYS.equals(entity.getType())) {
  385. List<TableModel> tableModelList = JsonUtil.getJsonToList(entity.getVisualTables(), TableModel.class);
  386. FormDataModel formData = JsonUtil.getJsonToBean(entity.getFormData(), FormDataModel.class);
  387. //判断子表是否复用
  388. RecursionForm recursionForm = new RecursionForm();
  389. if (ObjectUtil.isNotNull(formData)) {
  390. //判断有表是否满足主键策略
  391. if (tableModelList.size() > 0) {
  392. boolean isIncre = Objects.equals(formData.getPrimaryKeyPolicy(), 2);
  393. String strategy = !isIncre ? "[雪花ID]" : "[自增长id]";
  394. for (TableModel tableModel : tableModelList) {
  395. Boolean isAutoIncre = visualdevService.getPrimaryDbField(entity.getDbLinkId(), tableModel.getTable());
  396. if (isAutoIncre == null) {
  397. return ActionResult.fail(MsgCode.FM011.get(tableModel.getTable()));
  398. }
  399. if (isIncre != isAutoIncre) {
  400. return ActionResult.fail(MsgCode.FM012.get(strategy, tableModel.getTable()));
  401. }
  402. }
  403. }
  404. List<FieLdsModel> list = JsonUtil.getJsonToList(formData.getFields(), FieLdsModel.class);
  405. recursionForm.setList(list);
  406. recursionForm.setTableModelList(tableModelList);
  407. if (FormCloumnUtil.repetition(recursionForm, new ArrayList<>())) {
  408. return ActionResult.fail(MsgCode.FM003.get());
  409. }
  410. //字段判断
  411. List<FieLdsModel> fields = new ArrayList<>();
  412. OnlinePublicUtils.getAllFields(fields, list);
  413. StringJoiner sj = new StringJoiner(",");
  414. for (FieLdsModel item : fields) {
  415. if (StringUtil.isNotEmpty(item.getVModel()) && GenerateConstant.containKeyword(item.getVModel())) {
  416. sj.add(item.getConfig().getLabel() + "-" + item.getVModel());
  417. }
  418. }
  419. if (StringUtil.isNotEmpty(sj.toString())) {
  420. return ActionResult.fail(MsgCode.SYS128.get(sj));
  421. }
  422. }
  423. }
  424. if (StringUtil.isEmpty(entity.getId())) {
  425. entity.setId(RandomUtil.uuId());
  426. }
  427. entity.setSystemId(systemService.getInfoByEnCode(RequestContext.getAppCode()).getId());
  428. visualdevService.create(entity);
  429. return ActionResult.success(MsgCode.SU001.get(), entity.getId());
  430. }
  431. @Operation(summary = "修改功能")
  432. @Parameters({
  433. @Parameter(name = "id", description = "主键"),
  434. })
  435. @PutMapping("/{id}")
  436. @SaCheckPermission(value = {"onlineDev.formDesign", "onlineDev.sysForm", "generator.flowForm"}, mode = SaMode.OR)
  437. public ActionResult update(@PathVariable("id") String id, @RequestBody VisualDevUpForm visualDevUpForm) throws Exception {
  438. SystemEntity infoByEnCode = systemService.getInfoByEnCode(RequestContext.getAppCode());
  439. VisualdevEntity visualdevEntity = visualdevService.getInfo(id);
  440. VisualdevEntity entity = JsonUtil.getJsonToBean(JsonUtilEx.getObjectToString(visualDevUpForm), VisualdevEntity.class);
  441. entity.setState(visualdevEntity.getState());
  442. if (GenerateConstant.containKeyword(entity.getFullName())) {
  443. return ActionResult.fail("表单名称" + MsgCode.SYS128.get(entity.getFullName()));
  444. }
  445. if (!Objects.equals(entity.getEnCode(), visualdevEntity.getEnCode()) && visualdevService.getObjByEncode(entity.getEnCode(), entity.getType())) {
  446. return ActionResult.fail(MsgCode.EXIST002.get());
  447. }
  448. if (!Objects.equals(entity.getFullName(), visualdevEntity.getFullName()) && visualdevService.getCountByName(entity.getFullName(), entity.getType(), infoByEnCode.getId())) {
  449. return ActionResult.fail(MsgCode.EXIST001.get());
  450. }
  451. VisualdevReleaseEntity releaseEntity = visualdevReleaseService.getById(id);
  452. // 如果不是在线的,默认更新所有配置
  453. if (!VisualWebTypeEnum.DATA_VIEW.getType().equals(entity.getWebType())
  454. && !OnlineDevData.FORM_TYPE_SYS.equals(entity.getType())) {
  455. Map<String, String> tableMap = visualdevService.getTableMap(entity.getFormData());
  456. filterService.updateRuleList(id, entity, 1, 1, tableMap);
  457. //已发布修改的时候,把表移除掉的时候需要提示选表
  458. List<TableModel> tableModelList = JsonUtil.getJsonToList(entity.getVisualTables(), TableModel.class);
  459. if (releaseEntity != null && !VisualWebTypeEnum.DATA_VIEW.getType().equals(releaseEntity.getWebType())) {
  460. if (tableModelList.size() == 0) {
  461. return ActionResult.fail(MsgCode.VS408.get());
  462. }
  463. }
  464. //判断子表是否复用
  465. if (ObjectUtil.isNotNull(entity.getFormData())) {
  466. FormDataModel formData = JsonUtil.getJsonToBean(entity.getFormData(), FormDataModel.class);
  467. List<FieLdsModel> list = JsonUtil.getJsonToList(formData.getFields(), FieLdsModel.class);
  468. if (tableModelList.size() > 0) {
  469. RecursionForm recursionForm = new RecursionForm();
  470. recursionForm.setList(list);
  471. recursionForm.setTableModelList(tableModelList);
  472. if (FormCloumnUtil.repetition(recursionForm, new ArrayList<>())) {
  473. return ActionResult.fail(MsgCode.FM003.get());
  474. }
  475. }
  476. //字段判断
  477. List<FieLdsModel> fields = new ArrayList<>();
  478. OnlinePublicUtils.getAllFields(fields, list);
  479. StringJoiner sj = new StringJoiner(",");
  480. for (FieLdsModel item : fields) {
  481. if (StringUtil.isNotEmpty(item.getVModel()) && GenerateConstant.containKeyword(item.getVModel())) {
  482. sj.add(item.getConfig().getLabel() + "-" + item.getVModel());
  483. }
  484. }
  485. if (StringUtil.isNotEmpty(sj.toString())) {
  486. return ActionResult.fail(MsgCode.SYS128.get(sj));
  487. }
  488. }
  489. }
  490. //修改状态
  491. boolean released = Objects.equals(visualdevEntity.getState(), 1);
  492. if (visualdevEntity != null && released) {
  493. entity.setState(2);
  494. }
  495. boolean flag = visualdevService.update(id, entity);
  496. if (!flag) {
  497. return ActionResult.fail(MsgCode.FA002.get());
  498. }else{
  499. visualdevService.initFlowState(entity);
  500. }
  501. return ActionResult.success(MsgCode.SU004.get());
  502. }
  503. @Operation(summary = "删除功能")
  504. @Parameters({
  505. @Parameter(name = "id", description = "主键"),
  506. })
  507. @DeleteMapping("/{id}")
  508. @SaCheckPermission(value = {"onlineDev.formDesign", "onlineDev.sysForm", "generator.flowForm"}, mode = SaMode.OR)
  509. public ActionResult delete(@PathVariable("id") String id) throws WorkFlowException {
  510. VisualdevEntity entity = visualdevService.getInfo(id);
  511. if (entity != null) {
  512. FlowByFormModel flowByFormId = templateApi.getFlowByFormId(id, false);
  513. if (flowByFormId != null && flowByFormId.getIsConfig()) {
  514. return ActionResult.fail(MsgCode.FM005.get());
  515. }
  516. if (Objects.equals(entity.getType(), 2) && moduleService.getModuleList(id).size() > 0) {
  517. return ActionResult.fail(MsgCode.FM014.get());
  518. }
  519. visualdevService.removeById(id);
  520. visualdevReleaseService.removeById(id);
  521. aliasService.removeByVisualId(id);
  522. return ActionResult.success(MsgCode.SU003.get());
  523. }
  524. return ActionResult.fail(MsgCode.FA003.get());
  525. }
  526. @Operation(summary = "获取模板按钮和列表字段")
  527. @Parameters({
  528. @Parameter(name = "moduleId", description = "模板id"),
  529. })
  530. @GetMapping("/ModuleBtn")
  531. @SaCheckPermission(value = {"onlineDev.formDesign", "onlineDev.sysForm", "generator.flowForm"}, mode = SaMode.OR)
  532. public ActionResult getModuleBtn(String moduleId) {
  533. VisualdevEntity visualdevEntity = visualdevService.getInfo(moduleId);
  534. //去除模板中的F_
  535. VisualUtil.delfKey(visualdevEntity);
  536. List<BtnData> btnData = new ArrayList<>();
  537. Map<String, Object> column = JsonUtil.stringToMap(visualdevEntity.getColumnData());
  538. if (column.get("columnBtnsList") != null) {
  539. btnData.addAll(JsonUtil.getJsonToList(JsonUtil.getJsonToListMap(column.get("columnBtnsList").toString()), BtnData.class));
  540. }
  541. if (column.get("btnsList") != null) {
  542. btnData.addAll(JsonUtil.getJsonToList(JsonUtil.getJsonToListMap(column.get("btnsList").toString()), BtnData.class));
  543. }
  544. return ActionResult.success(btnData);
  545. }
  546. @Operation(summary = "发布模板")
  547. @Parameters({
  548. @Parameter(name = "id", description = "主键"),
  549. })
  550. @PostMapping("/{id}/Actions/Release")
  551. @SaCheckPermission(value = {"onlineDev.formDesign", "onlineDev.sysForm", "generator.flowForm"}, mode = SaMode.OR)
  552. @DSTransactional(rollbackFor = Exception.class)
  553. public ActionResult publish(@PathVariable("id") String id) throws Exception {
  554. VisualdevEntity visualdevEntity = visualdevService.getInfo(id);
  555. if (GenerateConstant.containKeyword(visualdevEntity.getFullName())) {
  556. return ActionResult.fail("表单名称" + MsgCode.SYS128.get(visualdevEntity.getFullName()));
  557. }
  558. List<TableModel> tableModels = JsonUtil.getJsonToList(visualdevEntity.getVisualTables(), TableModel.class);
  559. String s = VisualUtil.checkPublishVisualModel(visualdevEntity, MsgCode.VS004.get());
  560. if (s != null) {
  561. return ActionResult.fail(s);
  562. }
  563. //数据视图没有formdata 系统表单不需要创表
  564. if (!VisualWebTypeEnum.DATA_VIEW.getType().equals(visualdevEntity.getWebType())
  565. && !OnlineDevData.FORM_TYPE_SYS.equals(visualdevEntity.getType())) {
  566. if (ObjectUtil.isNotNull(visualdevEntity.getFormData())) {
  567. FormDataModel formData = JsonUtil.getJsonToBean(visualdevEntity.getFormData(), FormDataModel.class);
  568. List<FieLdsModel> list = JsonUtil.getJsonToList(formData.getFields(), FieLdsModel.class);
  569. //字段判断
  570. List<FieLdsModel> fields = new ArrayList<>();
  571. OnlinePublicUtils.getAllFields(fields, list);
  572. StringJoiner sj = new StringJoiner(",");
  573. for (FieLdsModel item : fields) {
  574. if (StringUtil.isNotEmpty(item.getVModel()) && GenerateConstant.containKeyword(item.getVModel())) {
  575. sj.add(item.getConfig().getLabel() + "-" + item.getVModel());
  576. }
  577. }
  578. if (StringUtil.isNotEmpty(sj.toString())) {
  579. return ActionResult.fail(MsgCode.SYS128.get(sj));
  580. }
  581. }
  582. if (tableModels.size() == 0) {
  583. try {
  584. visualdevService.createTable(visualdevEntity);
  585. } catch (DataException e) {
  586. e.printStackTrace();
  587. throw new WorkFlowException(e.getMessage());
  588. } catch (WorkFlowException e) {
  589. e.printStackTrace();
  590. throw new WorkFlowException(MsgCode.VS003.get());
  591. }
  592. }
  593. Map<String, String> tableMap = visualdevService.getTableMap(visualdevEntity.getFormData());
  594. filterService.updateRuleList(id, visualdevEntity, 1, 1, tableMap);
  595. }
  596. //线上
  597. visualdevEntity.setState(1);
  598. visualdevEntity.setEnabledMark(1);
  599. visualdevService.updateById(visualdevEntity);
  600. //复制旧版本信息存储
  601. VisualdevReleaseEntity newRelease = new VisualdevReleaseEntity();
  602. newRelease.setVisualTables(visualdevEntity.getVisualTables());
  603. newRelease.setFormData(visualdevEntity.getFormData());
  604. newRelease.setColumnData(visualdevEntity.getColumnData());
  605. newRelease.setAppColumnData(visualdevEntity.getAppColumnData());
  606. newRelease.setWebType(visualdevEntity.getWebType());
  607. newRelease.setDbLinkId(visualdevEntity.getDbLinkId());
  608. String newContent = JsonUtil.getObjectToString(newRelease);
  609. VisualdevReleaseEntity byId = visualdevReleaseService.getById(visualdevEntity.getId());
  610. if (byId != null) {
  611. VisualdevReleaseEntity oldRelease = new VisualdevReleaseEntity();
  612. oldRelease.setVisualTables(byId.getVisualTables());
  613. oldRelease.setFormData(byId.getFormData());
  614. oldRelease.setColumnData(byId.getColumnData());
  615. oldRelease.setAppColumnData(byId.getAppColumnData());
  616. oldRelease.setWebType(byId.getWebType());
  617. oldRelease.setDbLinkId(byId.getDbLinkId());
  618. String oldContent = JsonUtil.getObjectToString(oldRelease);
  619. if (oldContent.equals(newContent)) {
  620. newContent = byId.getOldContent();
  621. } else {
  622. newContent = oldContent;
  623. }
  624. }
  625. VisualdevEntity clone = new VisualdevEntity();
  626. BeanUtil.copyProperties(visualdevEntity, clone);
  627. VisualdevReleaseEntity releaseEntity = JsonUtil.getJsonToBean(clone, VisualdevReleaseEntity.class);
  628. releaseEntity.setOldContent(newContent);
  629. visualdevReleaseService.setIgnoreLogicDelete().saveOrUpdate(releaseEntity);
  630. visualdevReleaseService.clearIgnoreLogicDelete();
  631. return ActionResult.success(MsgCode.SU011.get());
  632. }
  633. @Operation(summary = "生成菜单")
  634. @Parameters({
  635. @Parameter(name = "id", description = "主键"),
  636. })
  637. @PostMapping("/{id}/Actions/Module")
  638. @SaCheckPermission(value = {"onlineDev.formDesign", "onlineDev.sysForm", "generator.flowForm"}, mode = SaMode.OR)
  639. @Transactional(rollbackFor = Exception.class)
  640. public ActionResult createModule(@PathVariable("id") String id, @RequestBody VisualDevPubModel visualDevPubModel) throws Exception {
  641. VisualdevEntity visualdevEntity = visualdevService.getInfo(id);
  642. if (visualdevEntity == null) {
  643. ActionResult.fail(MsgCode.FA001.get());
  644. }
  645. visualdevEntity.setPlatformRelease(visualDevPubModel.getPlatformRelease());
  646. visualdevService.updateById(visualdevEntity);
  647. //将线上版本发布
  648. VisualdevEntity clone = BeanUtil.copyProperties(visualdevEntity, VisualdevEntity.class);
  649. VisualMenuModel visual;
  650. if (Objects.equals(visualdevEntity.getType(), 1)) {
  651. visual = VisualUtil.getVisual(clone, visualDevPubModel);
  652. visual.setType(3);
  653. visual.setWebType(visualdevEntity.getWebType());
  654. } else {
  655. visual = VisualUtil.getVisualHC(clone);
  656. visual.setType(11);
  657. visual.setWebAddress(clone.getWebAddress());
  658. visual.setAppAddress(clone.getAppAddress());
  659. }
  660. visual.setApp(visualDevPubModel.getApp());
  661. visual.setPc(visualDevPubModel.getPc());
  662. visual.setPcModuleParentId(visualDevPubModel.getPcModuleParentId());
  663. visual.setAppModuleParentId(visualDevPubModel.getAppModuleParentId());
  664. pubulishUtil.publishMenu(visual);
  665. return ActionResult.success(MsgCode.VS007.get());
  666. }
  667. @Operation(summary = "回滚模板")
  668. @Parameters({
  669. @Parameter(name = "id", description = "主键"),
  670. })
  671. @GetMapping("/{id}/Actions/RollbackTemplate")
  672. @SaCheckPermission(value = {"onlineDev.formDesign", "onlineDev.sysForm", "generator.flowForm"}, mode = SaMode.OR)
  673. public ActionResult RollbackTemplate(@PathVariable("id") String id) {
  674. VisualdevReleaseEntity releaseEntity = visualdevReleaseService.getById(id);
  675. boolean b = releaseEntity == null;
  676. if (b) {
  677. return ActionResult.fail(MsgCode.VS008.get());
  678. } else {
  679. VisualdevEntity visualdevEntity = JsonUtil.getJsonToBean(releaseEntity, VisualdevEntity.class);
  680. visualdevService.updateById(visualdevEntity);
  681. }
  682. return ActionResult.success(MsgCode.SU020.get());
  683. }
  684. @Operation(summary = "获取已发布菜单")
  685. @Parameters({
  686. @Parameter(name = "id", description = "主键"),
  687. })
  688. @GetMapping("/{id}/getReleaseMenu")
  689. @SaCheckPermission(value = {"onlineDev.formDesign", "onlineDev.sysForm", "generator.flowForm"}, mode = SaMode.OR)
  690. public ActionResult<VisualFunctionModel> getReleaseMenu(@PathVariable("id") String id) {
  691. VisualdevEntity entity = visualdevService.getById(id);
  692. if (entity != null) {
  693. VisualFunctionModel model = JsonUtil.getJsonToBean(entity, VisualFunctionModel.class);
  694. model.setAppIsRelease(0);
  695. model.setPcIsRelease(0);
  696. ModuleNameVO moduleNameVO = moduleService.getModuleNameList(entity.getId());
  697. if (moduleNameVO != null) {
  698. if (StringUtil.isNotEmpty(moduleNameVO.getPcNames())) {
  699. model.setPcIsRelease(1);
  700. model.setPcReleaseName(moduleNameVO.getPcNames());
  701. }
  702. if (StringUtil.isNotEmpty(moduleNameVO.getAppNames())) {
  703. model.setAppIsRelease(1);
  704. model.setAppReleaseName(moduleNameVO.getAppNames());
  705. }
  706. }
  707. return ActionResult.success(model);
  708. }
  709. return ActionResult.fail(MsgCode.FA012.get());
  710. }
  711. @Operation(summary = "获取列表字段")
  712. @Parameters({
  713. @Parameter(name = "menuId", description = "菜单id"),
  714. })
  715. @GetMapping("/getColumnList")
  716. public ActionResult<List<VisualFieldModel>> getColumnList(@RequestParam("menuId") String menuId) {
  717. ModuleEntity info = moduleService.getInfo(menuId);
  718. //3-功能表单,11-回传表单,9-流程表单
  719. if (info == null && !Arrays.asList(3, 9, 11).contains(info.getType())) {
  720. return ActionResult.fail(MsgCode.FA001.get());
  721. }
  722. String formId = info.getModuleId();
  723. if (Objects.equals(info.getType(), 9)) {
  724. PropertyJsonModel model = JsonUtil.getJsonToBean(info.getPropertyJson(), PropertyJsonModel.class);
  725. formId = templateApi.getFormByFlowId(model.getModuleId());
  726. }
  727. boolean isWeb = JnpfConst.WEB.equals(info.getCategory());
  728. VisualdevReleaseEntity byId = visualdevReleaseService.getById(formId);
  729. if (byId == null) {
  730. return ActionResult.fail(MsgCode.FA001.get());
  731. }
  732. List<VisualFieldModel> list = new ArrayList<>();
  733. if (Objects.equals(byId.getType(), 1)) {
  734. //在线表单 -- 列表
  735. if (Objects.equals(byId.getWebType(), 2)) {
  736. FormDataModel formData = JsonUtil.getJsonToBean(byId.getFormData(), FormDataModel.class);
  737. List<FieLdsModel> fieLdsModelList = JsonUtil.getJsonToList(formData.getFields(), FieLdsModel.class);
  738. List<FieLdsModel> allFields = new ArrayList<>();
  739. OnlinePublicUtils.recursionFormChildFields(allFields,fieLdsModelList);
  740. for (FieLdsModel field : allFields) {
  741. String tableName = StringUtil.isNotEmpty(field.getConfig().getRelationTable()) ? field.getConfig().getRelationTable() : field.getConfig().getTableName();
  742. VisualFieldModel vf = new VisualFieldModel();
  743. vf.setFieldId(field.getVModel());
  744. vf.setFieldName(field.getConfig().getLabel());
  745. vf.setJnpfKey(field.getConfig().getJnpfKey());
  746. vf.setMultiple(field.getMultiple());
  747. vf.setTableName(tableName);
  748. list.add(vf);
  749. }
  750. }
  751. } else {
  752. //回传表单
  753. List<VisualFieldModel> fieldList = StringUtil.isNotEmpty(byId.getFormData()) ?
  754. JsonUtil.getJsonToList(byId.getFormData(), VisualFieldModel.class).stream().filter(t ->
  755. !(t.getFieldId().toLowerCase().startsWith(JnpfKeyConsts.CHILD_TABLE_PREFIX) && !t.getFieldId().contains("-"))).collect(Collectors.toList())
  756. : new ArrayList<>();
  757. list.addAll(fieldList);
  758. }
  759. return ActionResult.success(list);
  760. }
  761. }