VisualdevModelDataController.java 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026
  1. package jnpf.onlinedev.controller;
  2. import cn.dev33.satoken.annotation.SaCheckPermission;
  3. import cn.dev33.satoken.stp.StpUtil;
  4. import cn.hutool.core.collection.CollectionUtil;
  5. import com.google.common.collect.ImmutableList;
  6. import io.swagger.v3.oas.annotations.Operation;
  7. import io.swagger.v3.oas.annotations.Parameter;
  8. import io.swagger.v3.oas.annotations.Parameters;
  9. import io.swagger.v3.oas.annotations.tags.Tag;
  10. import jnpf.base.ActionResult;
  11. import jnpf.base.ActionResultCode;
  12. import jnpf.base.controller.SuperController;
  13. import jnpf.base.entity.*;
  14. import jnpf.base.model.ColumnDataModel;
  15. import jnpf.base.model.OnlineImport.ExcelImportModel;
  16. import jnpf.base.model.OnlineImport.ImportExcelFieldModel;
  17. import jnpf.base.model.OnlineImport.VisualImportModel;
  18. import jnpf.base.model.OnlineImport.VisualdevModelDataInfoVO;
  19. import jnpf.base.model.VisualDevJsonModel;
  20. import jnpf.base.model.VisualWebTypeEnum;
  21. import jnpf.base.model.flow.DataModel;
  22. import jnpf.base.model.flow.FlowLaunchModel;
  23. import jnpf.base.model.module.PropertyJsonModel;
  24. import jnpf.base.service.*;
  25. import jnpf.base.util.FormExecelUtils;
  26. import jnpf.base.util.VisualUtil;
  27. import jnpf.base.util.VisualUtils;
  28. import jnpf.base.vo.DownloadVO;
  29. import jnpf.base.vo.PaginationVO;
  30. import jnpf.constant.FileTypeConstant;
  31. import jnpf.constant.JnpfConst;
  32. import jnpf.constant.MsgCode;
  33. import jnpf.constant.PermissionConst;
  34. import jnpf.emnus.ExportModelTypeEnum;
  35. import jnpf.emnus.ModuleTypeEnum;
  36. import jnpf.entity.FileParameter;
  37. import jnpf.exception.DataException;
  38. import jnpf.exception.WorkFlowException;
  39. import jnpf.flowable.entity.TaskEntity;
  40. import jnpf.flowable.model.task.FlowModel;
  41. import jnpf.flowable.model.trigger.TriggerDataModel;
  42. import jnpf.integrate.util.IntegrateUtil;
  43. import jnpf.model.ExcelModel;
  44. import jnpf.model.OnlineDevData;
  45. import jnpf.model.TransferModel;
  46. import jnpf.model.visualJson.FieLdsModel;
  47. import jnpf.model.visualJson.FormDataModel;
  48. import jnpf.model.visualJson.UploaderTemplateModel;
  49. import jnpf.model.visualJson.config.HeaderModel;
  50. import jnpf.onlinedev.entity.VisualdevModelDataEntity;
  51. import jnpf.onlinedev.model.*;
  52. import jnpf.onlinedev.service.VisualDevInfoService;
  53. import jnpf.onlinedev.service.VisualDevListService;
  54. import jnpf.onlinedev.service.VisualPersonalService;
  55. import jnpf.onlinedev.service.VisualdevModelDataService;
  56. import jnpf.onlinedev.util.onlineDevUtil.OnlineDevListUtils;
  57. import jnpf.onlinedev.util.onlineDevUtil.OnlinePublicUtils;
  58. import jnpf.onlinedev.util.onlineDevUtil.OnlineSwapDataUtils;
  59. import jnpf.permission.service.CodeNumService;
  60. import jnpf.permission.service.UserService;
  61. import jnpf.util.*;
  62. import jnpf.util.context.RequestContext;
  63. import jnpf.util.visiual.JnpfKeyConsts;
  64. import jnpf.workflow.service.TaskApi;
  65. import lombok.extern.slf4j.Slf4j;
  66. import org.dromara.x.file.storage.core.FileInfo;
  67. import org.springframework.beans.factory.annotation.Autowired;
  68. import org.springframework.http.MediaType;
  69. import org.springframework.web.bind.annotation.*;
  70. import org.springframework.web.multipart.MultipartFile;
  71. import java.io.File;
  72. import java.io.IOException;
  73. import java.io.InputStream;
  74. import java.sql.SQLException;
  75. import java.text.ParseException;
  76. import java.util.*;
  77. import java.util.stream.Collectors;
  78. /**
  79. * 0代码无表开发
  80. *
  81. * @author JNPF开发平台组
  82. * @version V3.1.0
  83. * @copyright 引迈信息技术有限公司
  84. * @date 2019年9月27日 上午9:18
  85. */
  86. @Slf4j
  87. @Tag(name = "0代码无表开发", description = "OnlineDev")
  88. @RestController
  89. @RequestMapping("/api/visualdev/OnlineDev")
  90. public class VisualdevModelDataController extends SuperController<VisualdevModelDataService, VisualdevModelDataEntity> {
  91. @Autowired
  92. private VisualdevModelDataService visualdevModelDataService;
  93. @Autowired
  94. private VisualdevService visualdevService;
  95. @Autowired
  96. private FileExport fileExport;
  97. @Autowired
  98. private VisualDevListService visualDevListService;
  99. @Autowired
  100. private VisualDevInfoService visualDevInfoService;
  101. @Autowired
  102. private VisualdevReleaseService visualdevReleaseService;
  103. @Autowired
  104. private OnlineSwapDataUtils onlineSwapDataUtils;
  105. @Autowired
  106. private IntegrateUtil integrateUtil;
  107. @Autowired
  108. private ModuleService moduleService;
  109. @Autowired
  110. private ModuleUseNumService moduleUseNumService;
  111. @Autowired
  112. private VisualAliasService aliasService;
  113. @Autowired
  114. private TaskApi taskApi;
  115. @Autowired
  116. private VisualPersonalService visualPersonalService;
  117. @Autowired
  118. private UserService userService;
  119. @Autowired
  120. private SystemService systemService;
  121. @Autowired
  122. private CodeNumService codeNumService;
  123. @Operation(summary = "获取数据列表")
  124. @Parameters({
  125. @Parameter(name = "modelId", description = "模板id"),
  126. })
  127. @PostMapping("/{modelId}/List")
  128. public ActionResult list(@PathVariable("modelId") String modelId, @RequestBody PaginationModel paginationModel) throws WorkFlowException {
  129. StpUtil.checkPermission(modelId);
  130. paginationModel.setSystemCode(RequestContext.getAppCode());
  131. VisualdevReleaseEntity visualdevEntity = visualdevReleaseService.getById(modelId);
  132. VisualDevJsonModel visualJsonModel = OnlinePublicUtils.getVisualJsonModel(visualdevEntity);
  133. //判断请求客户端来源
  134. if (!RequestContext.isOrignPc()) {
  135. visualJsonModel.setColumnData(visualJsonModel.getAppColumnData());
  136. }
  137. ColumnDataModel columnDataModel = visualJsonModel.getColumnData();
  138. List<Map<String, Object>> realList;
  139. if (VisualWebTypeEnum.FORM.getType().equals(visualdevEntity.getWebType())) {
  140. realList = new ArrayList<>();
  141. } else if (VisualWebTypeEnum.DATA_VIEW.getType().equals(visualdevEntity.getWebType())) {//
  142. //数据视图的接口数据获取、
  143. realList = onlineSwapDataUtils.getInterfaceData(visualdevEntity, paginationModel, columnDataModel);
  144. } else {
  145. realList = visualDevListService.getDataList(visualJsonModel, paginationModel);
  146. }
  147. //判断数据是否分组
  148. if (OnlineDevData.COLUMNTYPE_THREE.equals(columnDataModel.getType()) && StringUtil.isEmpty(paginationModel.getExtraQueryJson())) {
  149. realList = OnlineDevListUtils.groupData(realList, columnDataModel);
  150. }
  151. //树形列表
  152. if (OnlineDevData.COLUMNTYPE_FIVE.equals(columnDataModel.getType()) && StringUtil.isEmpty(paginationModel.getExtraQueryJson())) {
  153. realList = OnlineDevListUtils.treeListData(realList, columnDataModel);
  154. }
  155. PaginationVO paginationVO = JsonUtil.getJsonToBean(paginationModel, PaginationVO.class);
  156. return ActionResult.page(realList, paginationVO);
  157. }
  158. @Operation(summary = "树形异步查询子列表接口")
  159. @Parameters({
  160. @Parameter(name = "modelId", description = "模板id"),
  161. @Parameter(name = "id", description = "数据id"),
  162. })
  163. @PostMapping("/{modelId}/List/{id}")
  164. public ActionResult listTree(@PathVariable("modelId") String modelId, @RequestBody PaginationModel paginationModel, @PathVariable("id") String id) throws WorkFlowException {
  165. StpUtil.checkPermission(modelId);
  166. VisualdevReleaseEntity visualdevEntity = visualdevReleaseService.getById(modelId);
  167. VisualDevJsonModel visualJsonModel = OnlinePublicUtils.getVisualJsonModel(visualdevEntity);
  168. //判断请求客户端来源
  169. if (!RequestContext.isOrignPc()) {
  170. visualJsonModel.setColumnData(visualJsonModel.getAppColumnData());
  171. }
  172. List<Map<String, Object>> realList = visualDevListService.getDataList(visualJsonModel, paginationModel);
  173. ColumnDataModel columnDataModel = visualJsonModel.getColumnData();
  174. String parentField = columnDataModel.getParentField() + "_id";
  175. List<Map<String, Object>> collect = realList.stream().filter(item -> id.equals(item.get(parentField))).collect(Collectors.toList());
  176. PaginationVO paginationVO = JsonUtil.getJsonToBean(paginationModel, PaginationVO.class);
  177. return ActionResult.page(collect, paginationVO);
  178. }
  179. @Operation(summary = "获取列表表单配置JSON")
  180. @Parameters({
  181. @Parameter(name = "modelId", description = "模板id"),
  182. @Parameter(name = "type", description = "类型0-草稿,1-发布"),
  183. })
  184. @GetMapping("/{modelId}/Config")
  185. public ActionResult getData(@PathVariable("modelId") String modelId,
  186. @RequestParam(value = "type", required = false) String type,
  187. @RequestParam(value = "personal", required = false) Integer personal,
  188. @RequestParam(value = "menuId", required = false) String menuId) throws WorkFlowException {
  189. StpUtil.checkPermissionOr(modelId, "onlineDev.formDesign", "onlineDev.flowEngine", "generator.webForm", "generator.flowForm");
  190. //app调用应用的在线开发功能,记录该菜单点击次数
  191. if (!RequestContext.isOrignPc()) {
  192. moduleUseNumService.insertOrUpdateUseNum(menuId);
  193. }
  194. VisualdevEntity entity;
  195. //线上版本
  196. if ("0".equals(type)) {
  197. entity = visualdevService.getInfo(modelId);
  198. } else {
  199. VisualdevReleaseEntity releaseEntity = visualdevReleaseService.getById(modelId);
  200. entity = JsonUtil.getJsonToBean(releaseEntity, VisualdevEntity.class);
  201. }
  202. if (entity == null) {
  203. return ActionResult.fail(MsgCode.VS412.get());
  204. }
  205. String s = VisualUtil.checkPublishVisualModel(entity, MsgCode.VS005.get());
  206. if (s != null) {
  207. return ActionResult.fail(s);
  208. }
  209. DataInfoVO vo = JsonUtil.getJsonToBean(entity, DataInfoVO.class);
  210. if (Objects.equals(entity.getType(), 1) && !VisualWebTypeEnum.DATA_VIEW.getType().equals(entity.getWebType())) {
  211. vo.setPropsValueList(visualdevService.storedFieldList(entity));
  212. }
  213. //页面初始化获取个性化配置
  214. if (Objects.equals(1, personal)) {
  215. visualPersonalService.setDataInfoVO(menuId, vo);
  216. }
  217. return ActionResult.success(vo);
  218. }
  219. @Operation(summary = "获取表单配置JSON")
  220. @Parameters({
  221. @Parameter(name = "modelId", description = "模板id"),
  222. })
  223. @GetMapping("/{modelId}/FormData")
  224. public ActionResult<ColumnDataInfoVO> getFormData(@PathVariable("modelId") String modelId) {
  225. StpUtil.checkPermission(modelId);
  226. VisualdevEntity entity = visualdevService.getInfo(modelId);
  227. return ActionResult.success(entity.getFormData());
  228. }
  229. @Operation(summary = "获取数据信息")
  230. @Parameters({
  231. @Parameter(name = "modelId", description = "模板id"),
  232. })
  233. @GetMapping("/{modelId}/{id}")
  234. public ActionResult info(@PathVariable("id") String id,
  235. @PathVariable("modelId") String modelId,
  236. @RequestParam(name = "menuId", required = false) String menuId) throws DataException {
  237. StpUtil.checkPermission(modelId);
  238. VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(modelId);
  239. VisualdevModelDataInfoVO editDataInfo = visualDevInfoService.getEditDataInfo(id, visualdevEntity, OnlineInfoModel.builder().menuId(menuId).build());
  240. return ActionResult.success(editDataInfo);
  241. }
  242. @Operation(summary = "获取数据信息(带转换数据)")
  243. @Parameters({
  244. @Parameter(name = "modelId", description = "模板id"),
  245. @Parameter(name = "id", description = "数据id"),
  246. @Parameter(name = "propsValue", description = "存储字段(非必传)")
  247. })
  248. @PostMapping("/{modelId}/DataChange")
  249. public ActionResult infoWithDataChange(@PathVariable("modelId") String modelId,
  250. @RequestBody VisualInfoParam visualInfoParam) {
  251. StpUtil.checkPermission(modelId);
  252. String id = visualInfoParam.getId() instanceof String ? (String) visualInfoParam.getId() : JsonUtil.getObjectToString(visualInfoParam.getId());
  253. String propsValue = StringUtil.isNotEmpty(visualInfoParam.getPropsValue()) && visualInfoParam.getPropsValue().contains(JnpfConst.FIELD_SUFFIX_JNPFID) ?
  254. visualInfoParam.getPropsValue().split(JnpfConst.FIELD_SUFFIX_JNPFID)[0] : visualInfoParam.getPropsValue();
  255. VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(modelId);
  256. String columnData = RequestContext.isOrignPc() ? visualdevEntity.getColumnData() : visualdevEntity.getAppColumnData();
  257. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(columnData, ColumnDataModel.class);
  258. if (columnDataModel != null && columnDataModel.getUseBtnPermission()) {
  259. StpUtil.checkPermission(modelId + "::" + PermissionConst.BTN_DETAIL);
  260. }
  261. VisualdevModelDataInfoVO vo = visualDevInfoService.getDetailsDataInfo(id, visualdevEntity,
  262. OnlineInfoModel.builder().needRlationFiled(true).needSwap(true).propsValue(propsValue).menuId(visualInfoParam.getMenuId()).build());
  263. return ActionResult.success(vo);
  264. }
  265. @Operation(summary = "添加数据")
  266. @Parameters({
  267. @Parameter(name = "modelId", description = "模板id"),
  268. @Parameter(name = "visualdevModelDataCrForm", description = "功能数据创建表单"),
  269. })
  270. @PostMapping("/{modelId}")
  271. public ActionResult create(@PathVariable("modelId") String modelId, @RequestBody VisualdevModelDataCrForm visualdevModelDataCrForm) throws Exception {
  272. StpUtil.checkPermission(modelId);
  273. String menuId = visualdevModelDataCrForm.getMenuId();
  274. VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(modelId);
  275. String columnData = RequestContext.isOrignPc() ? visualdevEntity.getColumnData() : visualdevEntity.getAppColumnData();
  276. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(columnData, ColumnDataModel.class);
  277. if (columnDataModel != null && columnDataModel.getUseBtnPermission()) {
  278. StpUtil.checkPermission(modelId + "::" + PermissionConst.BTN_ADD);
  279. }
  280. Map<String, Object> map = JsonUtil.stringToMap(visualdevModelDataCrForm.getData());
  281. DataModel dataModel = visualdevModelDataService.visualCreate(VisualParamModel.builder().visualdevEntity(visualdevEntity).data(map).menuId(menuId).build());
  282. AsyncExecuteModel model = new AsyncExecuteModel();
  283. model.setModelId(modelId);
  284. model.setTrigger(1);
  285. model.setDataId(ImmutableList.of(dataModel.getMainId()));
  286. model.setUserInfo(UserProvider.getUser());
  287. integrateUtil.asyncExecute(model);
  288. return ActionResult.success(MsgCode.SU001.get());
  289. }
  290. @Operation(summary = "修改数据")
  291. @Parameters({
  292. @Parameter(name = "modelId", description = "模板id"),
  293. @Parameter(name = "id", description = "数据id"),
  294. @Parameter(name = "visualdevModelDataUpForm", description = "功能数据修改表单"),
  295. })
  296. @PutMapping("/{modelId}/{id}")
  297. public ActionResult update(@PathVariable("id") String id, @PathVariable("modelId") String modelId, @RequestBody VisualdevModelDataUpForm visualdevModelDataUpForm) throws Exception {
  298. StpUtil.checkPermission(modelId);
  299. String menuId = visualdevModelDataUpForm.getMenuId();
  300. Map<String, Object> data = JsonUtil.stringToMap(visualdevModelDataUpForm.getData());
  301. VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(modelId);
  302. String columnData = RequestContext.isOrignPc() ? visualdevEntity.getColumnData() : visualdevEntity.getAppColumnData();
  303. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(columnData, ColumnDataModel.class);
  304. if (columnDataModel != null && columnDataModel.getUseBtnPermission()) {
  305. StpUtil.checkPermission(modelId + "::" + PermissionConst.BTN_EDIT);
  306. }
  307. DataModel dataModel = visualdevModelDataService.visualUpdate(VisualParamModel.builder().visualdevEntity(visualdevEntity).data(data).menuId(menuId).id(id).build());
  308. AsyncExecuteModel model = new AsyncExecuteModel();
  309. model.setModelId(modelId);
  310. model.setTrigger(2);
  311. model.setDataId(ImmutableList.of(id));
  312. model.setDataModel(dataModel);
  313. model.setUserInfo(UserProvider.getUser());
  314. integrateUtil.asyncExecute(model);
  315. return ActionResult.success(MsgCode.SU004.get());
  316. }
  317. //接口废弃全部走批量接口
  318. @Operation(summary = "删除数据")
  319. @Parameters({
  320. @Parameter(name = "modelId", description = "模板id"),
  321. @Parameter(name = "id", description = "数据id"),
  322. })
  323. @DeleteMapping("/{modelId}/{id}")
  324. public ActionResult delete(@PathVariable("id") String id, @PathVariable("modelId") String modelId) throws Exception {
  325. StpUtil.checkPermission(modelId);
  326. VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(modelId);
  327. String columnData = RequestContext.isOrignPc() ? visualdevEntity.getColumnData() : visualdevEntity.getAppColumnData();
  328. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(columnData, ColumnDataModel.class);
  329. if (columnDataModel != null && columnDataModel.getUseBtnPermission()) {
  330. StpUtil.checkPermissionOr(modelId + "::" + PermissionConst.BTN_REMOVE, modelId + "::" + PermissionConst.BTN_BATCHREMOVE);
  331. }
  332. VisualDevJsonModel visualJsonModel = OnlinePublicUtils.getVisualJsonModel(visualdevEntity);
  333. //判断请求客户端来源
  334. if (!RequestContext.isOrignPc()) {
  335. visualJsonModel.setColumnData(visualJsonModel.getAppColumnData());
  336. }
  337. if (!StringUtil.isEmpty(visualdevEntity.getVisualTables()) && !OnlineDevData.TABLE_CONST.equals(visualdevEntity.getVisualTables())) {
  338. //树形递归删除
  339. if (OnlineDevData.COLUMNTYPE_FIVE.equals(visualJsonModel.getColumnData().getType())) {
  340. try {
  341. ActionResult listTreeAction = listTree(modelId, new PaginationModel(), id);
  342. if (listTreeAction != null && listTreeAction.getCode() == 200 && listTreeAction.getData() instanceof Object) {
  343. Map map = JsonUtil.getJsonToBean(listTreeAction.getData(), Map.class);
  344. List<Map<String, Object>> list = JsonUtil.getJsonToListMap(map.get("list").toString());
  345. if (list.size() > 0) {
  346. for (Map<String, Object> item : list) {
  347. this.delete(item.get("id").toString(), modelId);
  348. }
  349. }
  350. }
  351. } catch (Exception e) {
  352. e.printStackTrace();
  353. log.error("子数据删除异常:{}", e.getMessage());
  354. }
  355. }
  356. List<VisualdevModelDataInfoVO> dataInfoVOList = new ArrayList<>();
  357. VisualdevModelDataInfoVO editDataInfo = visualDevInfoService.getEditDataInfo(id, visualdevEntity, OnlineInfoModel.builder().build());
  358. dataInfoVOList.add(editDataInfo);
  359. List<VisualdevModelDataInfoVO> deleteData = integrateUtil.dataList(modelId, 3, ImmutableList.of(id));
  360. // Map<String, Object> map = JsonUtil.stringToMap(editDataInfo.getData());
  361. // TaskEntity taskEntity = taskApi.getInfoSubmit(map.get(FlowFormConstant.FLOWTASKID).toString(), TaskEntity::getId,
  362. // TaskEntity::getParentId, TaskEntity::getFullName, TaskEntity::getStatus);
  363. // if(taskEntity != null){
  364. // return ActionResult.fail(MsgCode.WF063.get());
  365. // }
  366. boolean result = visualdevModelDataService.tableDelete(id, visualJsonModel);
  367. if (result) {
  368. AsyncExecuteModel model = new AsyncExecuteModel();
  369. model.setModelId(modelId);
  370. model.setTrigger(3);
  371. model.setDataId(ImmutableList.of(id));
  372. model.setUserInfo(UserProvider.getUser());
  373. integrateUtil.asyncExecute(model);
  374. return ActionResult.success(MsgCode.SU003.get());
  375. } else {
  376. return ActionResult.fail(MsgCode.FA003.get());
  377. }
  378. }
  379. return ActionResult.fail(MsgCode.FA003.get());
  380. }
  381. @Operation(summary = "批量删除数据")
  382. @Parameters({
  383. @Parameter(name = "modelId", description = "模板id"),
  384. @Parameter(name = "idsVo", description = "批量处理参数"),
  385. })
  386. @PostMapping("/batchDelete/{modelId}")
  387. public ActionResult batchDelete(@RequestBody BatchRemoveIdsVo idsVo, @PathVariable("modelId") String modelId) throws Exception {
  388. StpUtil.checkPermission(modelId);
  389. VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(modelId);
  390. String columnData = RequestContext.isOrignPc() ? visualdevEntity.getColumnData() : visualdevEntity.getAppColumnData();
  391. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(columnData, ColumnDataModel.class);
  392. if (columnDataModel != null && columnDataModel.getUseBtnPermission()) {
  393. StpUtil.checkPermissionOr(modelId + "::" + PermissionConst.BTN_REMOVE, modelId + "::" + PermissionConst.BTN_BATCHREMOVE);
  394. }
  395. VisualDevJsonModel visualJsonModel = OnlinePublicUtils.getVisualJsonModel(visualdevEntity);
  396. //判断请求客户端来源
  397. if (!RequestContext.isOrignPc()) {
  398. visualJsonModel.setColumnData(visualJsonModel.getAppColumnData());
  399. }
  400. List<String> idsList = new ArrayList<>();
  401. List<String> idsVoList = Arrays.asList(idsVo.getIds());
  402. String errMess = "";
  403. List<Map<String, Object>> dataMap = new ArrayList<>();
  404. for (String id : idsVoList) {
  405. VisualdevModelDataInfoVO editDataInfo = visualDevInfoService.getEditDataInfo(id, visualdevEntity, OnlineInfoModel.builder().build());
  406. Map<String, Object> map = JsonUtil.stringToMap(editDataInfo.getData());
  407. dataMap.add(map);
  408. if (StringUtil.isNotBlank(idsVo.getFlowId())) {
  409. TaskEntity taskEntity = taskApi.getInfoSubmit(map.get(FlowFormConstant.FLOWTASKID).toString(), TaskEntity::getId,
  410. TaskEntity::getParentId, TaskEntity::getFullName, TaskEntity::getStatus);
  411. if (taskEntity != null) {
  412. try {
  413. taskApi.delete(taskEntity);
  414. idsList.add(id);
  415. } catch (Exception e) {
  416. errMess = e.getMessage();
  417. }
  418. } else {
  419. idsList.add(id);
  420. }
  421. } else {
  422. idsList.add(id);
  423. }
  424. }
  425. if (idsList.size() == 0) {
  426. return ActionResult.fail(errMess);
  427. }
  428. List<VisualdevModelDataInfoVO> dataInfoVOList = integrateUtil.dataList(modelId, 3, idsList);
  429. if (!StringUtil.isEmpty(visualdevEntity.getVisualTables()) && !OnlineDevData.TABLE_CONST.equals(visualdevEntity.getVisualTables())) {
  430. AsyncExecuteModel model = new AsyncExecuteModel();
  431. model.setModelId(modelId);
  432. model.setTrigger(3);
  433. model.setDataId(idsList);
  434. model.setUserInfo(UserProvider.getUser());
  435. List<TriggerDataModel> triggerDataModels = integrateUtil.asyncDelExecute(model);
  436. ActionResult result = visualdevModelDataService.tableDeleteMore(idsList, visualJsonModel);
  437. if (!triggerDataModels.isEmpty()) {
  438. model.setDataMap(dataMap);
  439. integrateUtil.asyncExecute(model);
  440. }
  441. return result;
  442. }
  443. return ActionResult.fail(MsgCode.FA003.get());
  444. }
  445. @Operation(summary = "导入数据")
  446. @Parameters({
  447. @Parameter(name = "modelId", description = "模板id"),
  448. @Parameter(name = "visualImportModel", description = "导入参数"),
  449. })
  450. @PostMapping("{modelId}/ImportData")
  451. public ActionResult<ExcelImportModel> imports(@PathVariable("modelId") String modelId, @RequestBody VisualImportModel visualImportModel) throws Exception {
  452. StpUtil.checkPermission(modelId);
  453. VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(modelId);
  454. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(visualdevEntity.getColumnData(), ColumnDataModel.class);
  455. if (columnDataModel != null && columnDataModel.getUseBtnPermission()) {
  456. StpUtil.checkPermission(modelId + "::" + PermissionConst.BTN_UPLOAD);
  457. }
  458. VisualDevJsonModel visualJsonModel = OnlinePublicUtils.getVisualJsonModel(visualdevEntity);
  459. FormDataModel formData = visualJsonModel.getFormData();
  460. List<FieLdsModel> fieldsModelList = JsonUtil.getJsonToList(formData.getFields(), FieLdsModel.class);
  461. List<FieLdsModel> allFieLds = new ArrayList<>();
  462. VisualUtils.recursionFields(fieldsModelList, allFieLds);
  463. visualJsonModel.setFormListModels(allFieLds);
  464. visualJsonModel.setFlowId(visualImportModel.getFlowId());
  465. //复杂表头数据 还原成普通数据
  466. List<Map<String, Object>> listData = new ArrayList<>();
  467. List<Map<String, Object>> headerRow = new ArrayList<>();
  468. if (visualImportModel.isType()) {
  469. ActionResult result = ImportPreview(modelId, visualImportModel.getFileName());
  470. if (result == null) {
  471. throw new Exception(MsgCode.FA018.get());
  472. }
  473. if (result.getCode() != 200) {
  474. return result;
  475. }
  476. if (result.getData() instanceof Map) {
  477. Map<String, Object> data = (Map<String, Object>) result.getData();
  478. listData = (List<Map<String, Object>>) data.get("dataRow");
  479. headerRow = (List<Map<String, Object>>) data.get("headerRow");
  480. }
  481. } else {
  482. listData = visualImportModel.getList();
  483. }
  484. List<Map<String, Object>> mapList = VisualUtils.complexImportsDataOnline(listData, visualdevEntity);
  485. ExcelImportModel excelData = onlineSwapDataUtils.createExcelData(mapList, visualJsonModel, visualdevEntity);
  486. List<VisualdevModelDataInfoVO> dataInfoList = excelData.getDataInfoList();
  487. List<String> addIdList = new ArrayList<>();
  488. List<String> updateIdList = new ArrayList<>();
  489. for (VisualdevModelDataInfoVO dataInfoVO : dataInfoList) {
  490. Integer trigger = StringUtil.isEmpty(dataInfoVO.getIntegrateId()) ? 1 : 2;
  491. if (Objects.equals(trigger, 1)) {
  492. addIdList.add(dataInfoVO.getId().toString());
  493. } else {
  494. updateIdList.add(dataInfoVO.getId().toString());
  495. }
  496. }
  497. List<VisualdevModelDataInfoVO> addData = integrateUtil.dataList(modelId, 1, addIdList);
  498. integrateUtil.asyncList(addData, UserProvider.getUser());
  499. List<VisualdevModelDataInfoVO> updateData = integrateUtil.dataList(modelId, 2, updateIdList);
  500. integrateUtil.asyncList(updateData, UserProvider.getUser());
  501. //复杂表头-表头和数据处理
  502. List<HeaderModel> complexHeaderList = columnDataModel.getComplexHeaderList();
  503. if (!Objects.equals(columnDataModel.getType(), 3) && !Objects.equals(columnDataModel.getType(), 5)) {
  504. List<Map<String, Object>> mapList1 = VisualUtils.complexHeaderDataHandel(excelData.getFailResult(), complexHeaderList, false);
  505. excelData.setFailResult(mapList1);
  506. }
  507. excelData.setHeaderRow(headerRow);
  508. return ActionResult.success(excelData);
  509. }
  510. @Operation(summary = "导出")
  511. @Parameters({
  512. @Parameter(name = "modelId", description = "模板id"),
  513. @Parameter(name = "paginationModelExport", description = "导出参数"),
  514. })
  515. @PostMapping("/{modelId}/Actions/ExportData")
  516. public ActionResult export(@PathVariable("modelId") String modelId, @RequestBody PaginationModelExport paginationModelExport) throws ParseException, IOException, SQLException, DataException {
  517. StpUtil.checkPermission(modelId);
  518. ModuleEntity menuInfo = moduleService.getInfo(paginationModelExport.getMenuId());
  519. VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(modelId);
  520. if (visualdevEntity == null) {
  521. ActionResult.fail(MsgCode.FA001.get());
  522. }
  523. String excelName = "";
  524. if (menuInfo != null) {
  525. excelName = menuInfo.getFullName();
  526. } else {
  527. excelName = visualdevEntity.getFullName();
  528. }
  529. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(visualdevEntity.getColumnData(), ColumnDataModel.class);
  530. if (columnDataModel != null && columnDataModel.getUseBtnPermission()) {
  531. StpUtil.checkPermission(modelId + "::" + PermissionConst.BTN_DOWNLOAD);
  532. }
  533. VisualDevJsonModel visualJsonModel = OnlinePublicUtils.getVisualJsonModel(visualdevEntity);
  534. //判断请求客户端来源
  535. if (!RequestContext.isOrignPc()) {
  536. visualJsonModel.setColumnData(visualJsonModel.getAppColumnData());
  537. }
  538. String[] keys = paginationModelExport.getSelectKey();
  539. List<String> selectKey = Arrays.asList(paginationModelExport.getSelectKey());
  540. List<Object> selectIds = Arrays.asList(paginationModelExport.getSelectIds());
  541. //关键字过滤
  542. List<Map<String, Object>> realList;
  543. DownloadVO vo;
  544. if (VisualWebTypeEnum.DATA_VIEW.getType().equals(visualdevEntity.getWebType())) {//视图查询数据
  545. VisualdevReleaseEntity visualdevREntity = JsonUtil.getJsonToBean(visualdevEntity, VisualdevReleaseEntity.class);
  546. realList = onlineSwapDataUtils.getInterfaceData(visualdevREntity, paginationModelExport, visualJsonModel.getColumnData());
  547. if ("2".equals(paginationModelExport.getDataType()) && StringUtil.isBlank(columnDataModel.getViewKey())) {
  548. ActionResult.fail(MsgCode.VS029.get());
  549. }
  550. realList = "2".equals(paginationModelExport.getDataType()) ? realList.stream().filter(t -> selectIds.contains(t.get(columnDataModel.getViewKey()))).collect(Collectors.toList()) : realList;
  551. vo = VisualUtils.createModelExcelApiData(visualdevEntity.getColumnData(), realList, Arrays.asList(keys), "表单信息", excelName, new ExcelModel());
  552. } else {
  553. ExcelModel excelModel = onlineSwapDataUtils.getDefaultValue(visualdevEntity.getFormData(), selectKey);
  554. realList = visualdevModelDataService.exportData(keys, paginationModelExport, visualJsonModel);
  555. realList = "2".equals(paginationModelExport.getDataType()) ? realList.stream().filter(t -> selectIds.contains(t.get("id"))).collect(Collectors.toList()) : realList;
  556. vo = VisualUtils.createModelExcel(visualdevEntity, realList, Arrays.asList(keys), "表单信息", excelName, excelModel);
  557. }
  558. return ActionResult.success(vo);
  559. }
  560. @Operation(summary = "功能导出")
  561. @Parameters({
  562. @Parameter(name = "modelId", description = "模板id"),
  563. })
  564. @PostMapping("/{modelId}/Actions/Export")
  565. @SaCheckPermission("onlineDev.formDesign")
  566. public ActionResult exportData(@PathVariable("modelId") String modelId) {
  567. VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(modelId);
  568. BaseDevModelVO vo = JsonUtil.getJsonToBean(visualdevEntity, BaseDevModelVO.class);
  569. List<VisualAliasEntity> list = aliasService.getList(visualdevEntity.getId());
  570. vo.setAliasListJson(JsonUtil.getObjectToString(list));
  571. vo.setModelType(ExportModelTypeEnum.Design.getMessage());
  572. DownloadVO downloadVO = fileExport.exportFile(vo, FileTypeConstant.TEMPORARY, visualdevEntity.getFullName(), ModuleTypeEnum.VISUAL_DEV.getTableName());
  573. return ActionResult.success(downloadVO);
  574. }
  575. @Operation(summary = "功能导入")
  576. @PostMapping(value = "/Actions/Import", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
  577. @SaCheckPermission("onlineDev.formDesign")
  578. public ActionResult ImportData(@RequestParam("type") Integer type, @RequestPart("file") MultipartFile multipartFile) throws WorkFlowException {
  579. SystemEntity sysInfo = systemService.getInfoByEnCode(RequestContext.getAppCode());
  580. if (sysInfo == null) {
  581. return ActionResult.fail(MsgCode.FA001.get());
  582. }
  583. //判断是否为.json结尾
  584. if (FileUtil.existsSuffix(multipartFile, ModuleTypeEnum.VISUAL_DEV.getTableName())) {
  585. return ActionResult.fail(MsgCode.IMP002.get());
  586. }
  587. //获取文件内容
  588. String fileContent = FileUtil.getFileContent(multipartFile);
  589. BaseDevModelVO vo = JsonUtil.getJsonToBean(fileContent, BaseDevModelVO.class);
  590. VisualdevEntity visualdevEntity = JsonUtil.getJsonToBean(vo, VisualdevEntity.class);
  591. if (!sysInfo.getId().equals(visualdevEntity.getSystemId())) {
  592. visualdevEntity.setId(RandomUtil.uuId());
  593. visualdevService.setAutoEnCode(visualdevEntity);
  594. visualdevEntity.setSystemId(sysInfo.getId());
  595. }
  596. StringJoiner errList = new StringJoiner("、");
  597. String copyNum = UUID.randomUUID().toString().substring(0, 5);
  598. if (visualdevService.getInfo(visualdevEntity.getId()) != null) {
  599. if (Objects.equals(type, 0)) {
  600. errList.add("ID");
  601. } else {
  602. visualdevEntity.setId(RandomUtil.uuId());
  603. }
  604. }
  605. if (visualdevService.getObjByEncode(visualdevEntity.getEnCode(), visualdevEntity.getType())) {
  606. if (Objects.equals(type, 0)) {
  607. errList.add(MsgCode.IMP009.get());
  608. } else {
  609. visualdevEntity.setEnCode(visualdevEntity.getEnCode() + copyNum);
  610. }
  611. }
  612. if (visualdevService.getCountByName(visualdevEntity.getFullName(), visualdevEntity.getType(), sysInfo.getId())) {
  613. if (Objects.equals(type, 0)) {
  614. errList.add(MsgCode.IMP008.get());
  615. } else {
  616. visualdevEntity.setFullName(visualdevEntity.getFullName() + ".副本" + copyNum);
  617. }
  618. }
  619. if (Objects.equals(type, 0) && errList.length() > 0) {
  620. return ActionResult.fail(errList + MsgCode.IMP007.get());
  621. }
  622. if (visualdevEntity.getId() != null) {
  623. visualdevService.setIgnoreLogicDelete().removeById(visualdevEntity.getId());
  624. visualdevService.clearIgnoreLogicDelete();
  625. }
  626. if (Objects.equals(visualdevEntity.getType(), 1)) {
  627. visualdevEntity.setDbLinkId("0");
  628. }
  629. visualdevEntity.setCreatorTime(DateUtil.getNowDate());
  630. visualdevEntity.setCreatorUserId(UserProvider.getUser().getUserId());
  631. visualdevEntity.setLastModifyTime(null);
  632. visualdevEntity.setLastModifyUserId(null);
  633. visualdevEntity.setState(0);
  634. visualdevService.save(visualdevEntity);
  635. if (StringUtil.isNotEmpty(vo.getAliasListJson())) {
  636. List<VisualAliasEntity> jsonToList = JsonUtil.getJsonToList(vo.getAliasListJson(), VisualAliasEntity.class);
  637. for (VisualAliasEntity aliasEntity : jsonToList) {
  638. aliasService.copyEntity(aliasEntity, visualdevEntity.getId());
  639. }
  640. }
  641. return ActionResult.success(MsgCode.IMP001.get());
  642. }
  643. @Operation(summary = "模板下载")
  644. @Parameters({
  645. @Parameter(name = "modelId", description = "模板id"),
  646. @Parameter(name = "menuId", description = "菜单id"),
  647. })
  648. @GetMapping("/{modelId}/TemplateDownload")
  649. public ActionResult<DownloadVO> templateDownload(@PathVariable("modelId") String modelId,
  650. @RequestParam(value = "menuId", required = false) String menuId) {
  651. StpUtil.checkPermission(modelId);
  652. ModuleEntity menuInfo = moduleService.getInfo(menuId);
  653. VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(modelId);
  654. if (visualdevEntity == null) {
  655. ActionResult.fail(MsgCode.FA001.get());
  656. }
  657. String menuFullName = "";
  658. if (menuInfo != null) {
  659. menuFullName = menuInfo.getFullName();
  660. } else {
  661. menuFullName = visualdevEntity.getFullName();
  662. }
  663. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(visualdevEntity.getColumnData(), ColumnDataModel.class);
  664. if (columnDataModel != null && columnDataModel.getUseBtnPermission()) {
  665. StpUtil.checkPermission(modelId + "::" + PermissionConst.BTN_DOWNLOAD);
  666. }
  667. UploaderTemplateModel uploaderTemplateModel = JsonUtil.getJsonToBean(columnDataModel.getUploaderTemplateJson(), UploaderTemplateModel.class);
  668. List<String> selectKey = uploaderTemplateModel.getSelectKey();
  669. ExcelModel excelModel = onlineSwapDataUtils.getDefaultValue(visualdevEntity.getFormData(), selectKey);
  670. List<Map<String, Object>> dataList = new ArrayList<>();
  671. dataList.add(excelModel.getDataMap());
  672. DownloadVO vo = VisualUtils.createModelExcel(visualdevEntity, dataList, selectKey, "导入模板", menuFullName + "导入模板", excelModel);
  673. return ActionResult.success(vo);
  674. }
  675. @Operation(summary = "上传文件")
  676. @PostMapping("/Uploader")
  677. public ActionResult<Object> Uploader() {
  678. List<MultipartFile> list = UpUtil.getFileAll();
  679. MultipartFile file = list.get(0);
  680. if (file.getOriginalFilename().endsWith(".xlsx") || file.getOriginalFilename().endsWith(".xls")) {
  681. String fileName = XSSEscape.escape(RandomUtil.uuId() + "." + UpUtil.getFileType(file));
  682. //上传文件
  683. FileInfo fileInfo = FileUploadUtils.uploadFile(new FileParameter(FileTypeConstant.TEMPORARY, fileName), file);
  684. DownloadVO vo = DownloadVO.builder().build();
  685. vo.setName(fileInfo.getFilename());
  686. return ActionResult.success(vo);
  687. } else {
  688. return ActionResult.fail(MsgCode.ETD110.get());
  689. }
  690. }
  691. @Operation(summary = "导入预览")
  692. @Parameters({
  693. @Parameter(name = "modelId", description = "模板id"),
  694. @Parameter(name = "fileName", description = "文件名"),
  695. })
  696. @GetMapping("/{modelId}/ImportPreview")
  697. public ActionResult<Map<String, Object>> ImportPreview(@PathVariable("modelId") String modelId, String fileName) throws Exception {
  698. StpUtil.checkPermission(modelId);
  699. Map<String, Object> previewMap = null;
  700. try {
  701. VisualdevReleaseEntity entity = visualdevReleaseService.getById(modelId);
  702. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(entity.getColumnData(), ColumnDataModel.class);
  703. if (columnDataModel != null && columnDataModel.getUseBtnPermission()) {
  704. StpUtil.checkPermission(modelId + "::" + PermissionConst.BTN_UPLOAD);
  705. }
  706. FormDataModel formDataModel = JsonUtil.getJsonToBean(entity.getFormData(), FormDataModel.class);
  707. UploaderTemplateModel uploaderTemplateModel = JsonUtil.getJsonToBean(columnDataModel.getUploaderTemplateJson(), UploaderTemplateModel.class);
  708. List<FieLdsModel> fieLdsModels = JsonUtil.getJsonToList(formDataModel.getFields(), FieLdsModel.class);
  709. List<FieLdsModel> allFields = new ArrayList<>();
  710. OnlinePublicUtils.recursionFormFields(allFields, fieLdsModels);
  711. List<String> selectKey = uploaderTemplateModel.getSelectKey();
  712. //子表tableField
  713. Set<String> tablefield1 = selectKey.stream().filter(s -> s.toLowerCase().startsWith(JnpfKeyConsts.CHILD_TABLE_PREFIX)).map(s -> s.substring(0, s.indexOf("-"))).collect(Collectors.toSet());
  714. File temporary = FileUploadUtils.downloadFileToLocal(new FileParameter(FileTypeConstant.TEMPORARY, fileName));
  715. //判断有无子表
  716. String tablefield = selectKey.stream().filter(s -> s.toLowerCase().startsWith(JnpfKeyConsts.CHILD_TABLE_PREFIX)).findFirst().orElse(null);
  717. //判断有没有复杂表头
  718. boolean hasComplex = false;
  719. for (HeaderModel item : columnDataModel.getComplexHeaderList()) {
  720. if (item.getChildColumns() != null && item.getChildColumns().size() > 0) {
  721. List<String> childColumns = new ArrayList<>(item.getChildColumns());
  722. childColumns.retainAll(selectKey);
  723. if (childColumns.size() > 0) {
  724. hasComplex = true;
  725. }
  726. }
  727. }
  728. //有子表需要取第二行的表头
  729. Integer i = tablefield != null || hasComplex ? 2 : 1;
  730. //读取excel中数据
  731. InputStream inputStream = ExcelUtil.solveOrginTitle(temporary, i);
  732. List<Map> excelDataList = ExcelUtil.importExcelByInputStream(inputStream, 0, i, Map.class);
  733. //数据超过100条
  734. if (excelDataList != null && excelDataList.size() > 1000) {
  735. return ActionResult.fail(MsgCode.ETD117.get());
  736. }
  737. //todo 备用方案,读取不到时间暂用此方法
  738. ExcelUtil.imoportExcelToMap(temporary, i, excelDataList);
  739. //列表字段
  740. List<Map<String, Object>> columns = new ArrayList<>();
  741. List<ImportExcelFieldModel> chiImList = new ArrayList<>();
  742. List<ImportExcelFieldModel> allImList = new ArrayList<>();
  743. selectKey.stream().forEach(s -> {
  744. String requiredStr = "";
  745. ImportExcelFieldModel importExcel = new ImportExcelFieldModel();
  746. if (s.toLowerCase().startsWith(JnpfKeyConsts.CHILD_TABLE_PREFIX)) {
  747. String table = s.substring(0, s.indexOf("-"));
  748. String field = s.substring(s.indexOf("-") + 1);
  749. FieLdsModel fieLdsModel = allFields.stream().filter(t -> t.getVModel().equals(table)).findFirst().orElse(null);
  750. List<FieLdsModel> children = fieLdsModel.getConfig().getChildren();
  751. FieLdsModel fieLdsModel1 = children.stream().filter(t -> t.getVModel().equals(field)).findFirst().orElse(null);
  752. requiredStr = fieLdsModel1.getConfig().isRequired() ? "*" : "";
  753. importExcel.setField(field);
  754. importExcel.setTableField(table);
  755. importExcel.setFullName(requiredStr + fieLdsModel1.getConfig().getLabel());
  756. importExcel.setJnpfKey(fieLdsModel1.getConfig().getJnpfKey());
  757. chiImList.add(importExcel);
  758. } else {
  759. FieLdsModel fieLdsModel = allFields.stream().filter(t -> t.getVModel().equals(s)).findFirst().orElse(null);
  760. requiredStr = fieLdsModel.getConfig().isRequired() ? "*" : "";
  761. importExcel.setField(s);
  762. importExcel.setFullName(requiredStr + fieLdsModel.getConfig().getLabel());
  763. importExcel.setJnpfKey(fieLdsModel.getConfig().getJnpfKey());
  764. allImList.add(importExcel);
  765. }
  766. });
  767. Map<String, List<ImportExcelFieldModel>> groups = chiImList.stream().collect(Collectors.groupingBy(ImportExcelFieldModel::getTableField, LinkedHashMap::new, Collectors.toList()));
  768. for (Map.Entry<String, List<ImportExcelFieldModel>> entry : groups.entrySet()) {
  769. ImportExcelFieldModel importExcel = new ImportExcelFieldModel();
  770. List<ImportExcelFieldModel> value = entry.getValue();
  771. ImportExcelFieldModel im = value.get(0);
  772. FieLdsModel fieLdsModel = allFields.stream().filter(f -> entry.getKey().equals(f.getVModel())).findFirst().orElse(null);
  773. String tableName = fieLdsModel.getConfig().getLabel();
  774. importExcel.setField(entry.getKey());
  775. importExcel.setFullName(tableName);
  776. importExcel.setJnpfKey("table");
  777. // value.stream().forEach(im1->im1.setFullName(im1.getFullName().replace(tableName+"-","")));
  778. importExcel.setChildren(value);
  779. allImList.add(importExcel);
  780. }
  781. for (ImportExcelFieldModel importExcel : allImList) {
  782. Map<String, Object> selectMap = new HashMap<>(16);
  783. selectMap.put("id", importExcel.getField());
  784. selectMap.put("fullName", importExcel.getFullName());
  785. selectMap.put("jnpfKey", importExcel.getJnpfKey());
  786. if (importExcel.getChildren() != null) {
  787. List<ImportExcelFieldModel> children = importExcel.getChildren();
  788. List<Map<String, Object>> childMapList = new ArrayList<>();
  789. for (ImportExcelFieldModel childIm : children) {
  790. Map<String, Object> childMap = new HashMap<>(16);
  791. childMap.put("id", childIm.getField());
  792. childMap.put("fullName", childIm.getFullName());
  793. childMap.put("jnpfKey", childIm.getJnpfKey());
  794. childMapList.add(childMap);
  795. }
  796. selectMap.put("children", childMapList);
  797. }
  798. columns.add(selectMap);
  799. }
  800. List<Map<String, Object>> results = FormExecelUtils.dataMergeChildTable(excelDataList, selectKey);
  801. previewMap = new HashMap<>();
  802. //复杂表头-表头和数据处理
  803. List<HeaderModel> complexHeaderList = columnDataModel.getComplexHeaderList();
  804. if (!Objects.equals(columnDataModel.getType(), 3) && !Objects.equals(columnDataModel.getType(), 5)) {
  805. columns = VisualUtils.complexHeaderHandelOnline(columns, complexHeaderList);
  806. }
  807. previewMap.put("dataRow", results);
  808. previewMap.put("headerRow", columns);
  809. } catch (Exception e) {
  810. e.printStackTrace();
  811. return ActionResult.fail(MsgCode.VS407.get());
  812. }
  813. return ActionResult.success(previewMap);
  814. }
  815. @Operation(summary = "导出异常报告")
  816. @Parameters({
  817. @Parameter(name = "modelId", description = "模板id"),
  818. @Parameter(name = "visualImportModel", description = "导出参数"),
  819. })
  820. @PostMapping("/{modelId}/ImportExceptionData")
  821. public ActionResult<DownloadVO> ImportExceptionData(@PathVariable("modelId") String modelId, @RequestBody VisualImportModel visualImportModel) {
  822. StpUtil.checkPermission(modelId);
  823. String menuFullName = "";
  824. if (StringUtil.isNotEmpty(visualImportModel.getMenuId())) {
  825. ModuleEntity menuInfo = moduleService.getInfo(visualImportModel.getMenuId());
  826. if (menuInfo != null && StringUtil.isNotEmpty(menuInfo.getFullName())) {
  827. menuFullName = menuInfo.getFullName();
  828. }
  829. }
  830. VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(modelId);
  831. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(visualdevEntity.getColumnData(), ColumnDataModel.class);
  832. if (columnDataModel != null && columnDataModel.getUseBtnPermission()) {
  833. StpUtil.checkPermission(modelId + "::" + PermissionConst.BTN_DOWNLOAD);
  834. }
  835. UploaderTemplateModel uploaderTemplateModel = JsonUtil.getJsonToBean(columnDataModel.getUploaderTemplateJson(), UploaderTemplateModel.class);
  836. List<String> selectKey = uploaderTemplateModel.getSelectKey();
  837. ExcelModel excelModel = onlineSwapDataUtils.getDefaultValue(visualdevEntity.getFormData(), selectKey);
  838. DownloadVO vo = VisualUtils.createModelExcel(visualdevEntity, visualImportModel.getList(), selectKey, "错误报告", menuFullName + "错误报告", excelModel);
  839. return ActionResult.success(vo);
  840. }
  841. @Operation(summary = "自定义按钮发起审批")
  842. @Parameters({
  843. @Parameter(name = "modelId", description = "模板id"),
  844. @Parameter(name = "visualImportModel", description = "导出参数"),
  845. })
  846. @PostMapping("/{modelId}/actionLaunchFlow")
  847. public ActionResult<DownloadVO> actionLaunchFlow(@PathVariable("modelId") String modelId, @RequestBody FlowLaunchModel model) {
  848. StpUtil.checkPermission(modelId);
  849. VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(modelId);
  850. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(visualdevEntity.getColumnData(), ColumnDataModel.class);
  851. if (columnDataModel != null && columnDataModel.getUseBtnPermission()) {
  852. StpUtil.checkPermission(modelId + "::" + model.getBtnCode());
  853. }
  854. //用户列表
  855. List<String> userList = new ArrayList<>();
  856. if (Objects.equals(1, model.getCurrentUser())) {
  857. userList.add(UserProvider.getUser().getUserId());
  858. }
  859. if (Objects.equals(1, model.getCustomUser()) && CollectionUtil.isNotEmpty(model.getInitiator())) {
  860. userList.addAll(userService.getUserIdList(model.getInitiator()));
  861. userList = new ArrayList<>(new HashSet<>(userList));
  862. }
  863. //数据列表
  864. List<Map<String, Object>> formDataList = new ArrayList<>();
  865. List<List<TransferModel>> dataList = model.getDataList();
  866. if (CollectionUtil.isNotEmpty(dataList)) {
  867. for (List<TransferModel> itemList : dataList) {
  868. if (CollectionUtil.isNotEmpty(itemList)) {
  869. Map<String, Object> map = new HashMap<>();
  870. Map<String, List<Map<String, Object>>> tableList = new HashMap<>();
  871. for (TransferModel transferModel : itemList) {
  872. String[] table = transferModel.getTargetField().split("-");
  873. String[] value = transferModel.getSourceValue().split("-");
  874. List<Map<String, Object>> list = tableList.get(table[0]) != null ? tableList.get(table[0]) : new ArrayList<>();
  875. if (table.length > 1) {
  876. if (value.length > 1) {
  877. if (transferModel.getDefaultValue() instanceof List) {
  878. List<Object> data = (List<Object>) transferModel.getDefaultValue();
  879. int num = data.size() - list.size();
  880. for (int i = 0; i < num; i++) {
  881. list.add(new HashMap<>());
  882. }
  883. for (int i = 0; i < data.size(); i++) {
  884. Map<String, Object> objectMap = list.get(i);
  885. objectMap.put(table[1], data.get(i));
  886. }
  887. }
  888. } else {
  889. if (1 > list.size()) {
  890. list.add(new HashMap<>());
  891. }
  892. for (Map<String, Object> objectMap : list) {
  893. objectMap.put(table[1], transferModel.getDefaultValue());
  894. }
  895. }
  896. tableList.put(table[0], list);
  897. }
  898. map.put(transferModel.getTargetField(), transferModel.getDefaultValue());
  899. }
  900. map.putAll(tableList);
  901. formDataList.add(map);
  902. }
  903. }
  904. }
  905. FlowModel flowModel = new FlowModel();
  906. flowModel.setTemplateId(model.getTemplate());
  907. flowModel.setUserIds(userList);
  908. flowModel.setFormDataList(formDataList);
  909. flowModel.setHasPermission(model.getHasPermission());
  910. ActionResult actionResult = taskApi.launchFlow(flowModel);
  911. if (actionResult == null || !ActionResultCode.Success.getCode().equals(actionResult.getCode())) {
  912. return ActionResult.fail(actionResult.getMsg());
  913. }
  914. return ActionResult.success(actionResult.getMsg());
  915. }
  916. @Operation(summary = "根据菜单获取功能配置(流程是直接通过菜单确定表单)")
  917. @Parameters({
  918. @Parameter(name = "menuId", description = "菜单id"),
  919. })
  920. @GetMapping("/Config")
  921. public ActionResult getConfigByMenu(@RequestParam(value = "menuId", required = false) String menuId,
  922. @RequestParam(value = "systemId", required = false) String systemId) {
  923. StpUtil.checkPermissionOr(menuId, "onlineDev.formDesign", "generator.webForm", "generator.flowForm");
  924. //app调用应用的在线开发功能,记录该菜单点击次数
  925. if (!RequestContext.isOrignPc()) {
  926. moduleUseNumService.insertOrUpdateUseNum(menuId);
  927. }
  928. VisualdevReleaseEntity releaseEntity = null;
  929. ModuleEntity info = moduleService.getInfo(menuId);
  930. if (info != null && StringUtil.isNotEmpty(info.getPropertyJson())) {
  931. PropertyJsonModel propertyJsonModel = JsonUtil.getJsonToBean(info.getPropertyJson(), PropertyJsonModel.class);
  932. String modelId = propertyJsonModel.getModuleId();
  933. releaseEntity = visualdevReleaseService.getById(modelId);
  934. }
  935. if (releaseEntity == null || (StringUtil.isNotEmpty(systemId) && !Objects.equals(info.getSystemId(), systemId))) {
  936. return ActionResult.fail(MsgCode.FA001.get());
  937. }
  938. VisualdevEntity entity = JsonUtil.getJsonToBean(releaseEntity, VisualdevEntity.class);
  939. String s = VisualUtil.checkPublishVisualModel(entity, MsgCode.VS005.get());
  940. if (s != null) {
  941. return ActionResult.fail(s);
  942. }
  943. DataInfoVO vo = JsonUtil.getJsonToBean(entity, DataInfoVO.class);
  944. return ActionResult.success(vo);
  945. }
  946. }