VisualController.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. package jnpf.visualdata.controller;
  2. import cn.dev33.satoken.annotation.SaCheckPermission;
  3. import cn.hutool.http.HttpRequest;
  4. import cn.hutool.http.Method;
  5. import com.google.common.base.Joiner;
  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.controller.SuperController;
  12. import jnpf.base.vo.DownloadVO;
  13. import jnpf.base.vo.ListVO;
  14. import jnpf.config.ConfigValueUtil;
  15. import jnpf.constant.FileTypeConstant;
  16. import jnpf.constant.MsgCode;
  17. import jnpf.emnus.ModuleTypeEnum;
  18. import jnpf.entity.FileParameter;
  19. import jnpf.exception.DataException;
  20. import jnpf.model.FileListVO;
  21. import jnpf.util.*;
  22. import jnpf.util.FileExport;
  23. import jnpf.util.FileUploadUtils;
  24. import jnpf.util.context.RequestContext;
  25. import jnpf.visualdata.entity.VisualCategoryEntity;
  26. import jnpf.visualdata.entity.VisualConfigEntity;
  27. import jnpf.visualdata.entity.VisualEntity;
  28. import jnpf.visualdata.enums.VisualImgEnum;
  29. import jnpf.visualdata.model.VisualPageVO;
  30. import jnpf.visualdata.model.visual.*;
  31. import jnpf.visualdata.model.visualcategory.VisualCategoryListVO;
  32. import jnpf.visualdata.model.visualconfig.VisualConfigInfoModel;
  33. import jnpf.visualdata.model.visualfile.ImageVO;
  34. import jnpf.visualdata.service.VisualCategoryService;
  35. import jnpf.visualdata.service.VisualConfigService;
  36. import jnpf.visualdata.service.VisualService;
  37. import lombok.extern.slf4j.Slf4j;
  38. import okhttp3.Headers;
  39. import okhttp3.OkHttpClient;
  40. import okhttp3.Request;
  41. import org.dromara.x.file.storage.core.FileInfo;
  42. import org.springframework.beans.factory.annotation.Autowired;
  43. import org.springframework.http.MediaType;
  44. import org.springframework.web.bind.annotation.*;
  45. import org.springframework.web.multipart.MultipartFile;
  46. import jakarta.validation.Valid;
  47. import java.io.IOException;
  48. import java.time.Duration;
  49. import java.util.*;
  50. import java.util.stream.Collectors;
  51. /**
  52. * 大屏基本信息
  53. *
  54. * @author JNPF开发平台组
  55. * @version V3.1.0
  56. * @copyright 引迈信息技术有限公司
  57. * @date 2021年6月15日
  58. */
  59. @RestController
  60. @Tag(name = "大屏基本信息", description = "visual")
  61. @RequestMapping("/api/blade-visual/visual")
  62. @Slf4j
  63. public class VisualController extends SuperController<VisualService, VisualEntity> {
  64. @Autowired
  65. private FileExport fileExport;
  66. @Autowired
  67. private VisualService visualService;
  68. @Autowired
  69. private VisualConfigService configService;
  70. @Autowired
  71. private ConfigValueUtil configValueUtil;
  72. @Autowired
  73. private VisualCategoryService categoryService;
  74. /**
  75. * 列表
  76. *
  77. * @param pagination 分页模型
  78. * @return
  79. */
  80. @Operation(summary = "分页")
  81. @GetMapping("/list")
  82. @SaCheckPermission("onlineDev.dataScreen")
  83. public ActionResult list(VisualPaginationModel pagination) {
  84. List<VisualEntity> data = visualService.getList(pagination);
  85. List<VisualListVO> list = JsonUtil.getJsonToList(data, VisualListVO.class);
  86. VisualPageVO paginationVO = JsonUtil.getJsonToBean(pagination, VisualPageVO.class);
  87. paginationVO.setRecords(list);
  88. return ActionResult.success(paginationVO);
  89. }
  90. /**
  91. * 详情
  92. *
  93. * @param id 主键
  94. * @return
  95. */
  96. @Operation(summary = "详情")
  97. @GetMapping("/detail")
  98. @Parameters({
  99. @Parameter(name = "id", description = "主键", required = true),
  100. })
  101. public ActionResult<VisualInfoVO> info(@RequestParam("id")String id) {
  102. VisualEntity visual = visualService.getInfo(id);
  103. VisualConfigEntity config = configService.getInfo(id);
  104. VisualInfoVO vo = new VisualInfoVO();
  105. vo.setVisual(JsonUtil.getJsonToBean(visual, VisualInfoModel.class));
  106. vo.setConfig(JsonUtil.getJsonToBean(config, VisualConfigInfoModel.class));
  107. return ActionResult.success(vo);
  108. }
  109. /**
  110. * 新增
  111. *
  112. * @param visualCrform 大屏模型
  113. * @return
  114. */
  115. @Operation(summary = "新增")
  116. @PostMapping("/save")
  117. @Parameters({
  118. @Parameter(name = "visualCrform", description = "大屏模型",required = true),
  119. })
  120. @SaCheckPermission("onlineDev.dataScreen")
  121. public ActionResult create(@RequestBody @Valid VisualCrform visualCrform) {
  122. VisualEntity visual = JsonUtil.getJsonToBean(visualCrform.getVisual(), VisualEntity.class);
  123. visual.setBackgroundUrl(VisusalImgUrl.url + configValueUtil.getBiVisualPath() + "bg/bg1.png");
  124. VisualConfigEntity config = JsonUtil.getJsonToBean(visualCrform.getConfig(), VisualConfigEntity.class);
  125. visualService.create(visual, config);
  126. Map<String, String> data = new HashMap<>(16);
  127. data.put("id", visual.getId());
  128. return ActionResult.success(data);
  129. }
  130. /**
  131. * 修改
  132. *
  133. * @param categoryUpForm 大屏模型
  134. * @return
  135. */
  136. @Operation(summary = "修改")
  137. @PostMapping("/update")
  138. @Parameters({
  139. @Parameter(name = "categoryUpForm", description = "大屏模型",required = true),
  140. })
  141. @SaCheckPermission("onlineDev.dataScreen")
  142. public ActionResult update(@RequestBody VisualUpform categoryUpForm) {
  143. VisualEntity visual = JsonUtil.getJsonToBean(categoryUpForm.getVisual(), VisualEntity.class);
  144. VisualConfigEntity config = JsonUtil.getJsonToBean(categoryUpForm.getConfig(), VisualConfigEntity.class);
  145. visualService.update(visual.getId(), visual, config);
  146. return ActionResult.success(MsgCode.SU004.get());
  147. }
  148. /**
  149. * 删除
  150. *
  151. * @param ids 主键
  152. * @return
  153. */
  154. @Operation(summary = "删除")
  155. @PostMapping("/remove")
  156. @Parameters({
  157. @Parameter(name = "ids", description = "主键", required = true),
  158. })
  159. @SaCheckPermission("onlineDev.dataScreen")
  160. public ActionResult delete(@RequestParam("ids")String ids) {
  161. VisualEntity entity = visualService.getInfo(ids);
  162. if (entity != null) {
  163. visualService.delete(entity);
  164. return ActionResult.success(MsgCode.SU003.get());
  165. }
  166. return ActionResult.fail(MsgCode.FA003.get());
  167. }
  168. /**
  169. * 复制
  170. *
  171. * @param id 主键
  172. * @return
  173. */
  174. @Operation(summary = "复制")
  175. @PostMapping("/copy")
  176. @Parameters({
  177. @Parameter(name = "id", description = "主键", required = true),
  178. })
  179. @SaCheckPermission("onlineDev.dataScreen")
  180. public ActionResult copy(@RequestParam("id")String id) {
  181. VisualEntity entity = visualService.getInfo(id);
  182. VisualConfigEntity config = configService.getInfo(id);
  183. if (entity != null) {
  184. entity.setTitle(entity.getTitle() + "_复制");
  185. visualService.create(entity, config);
  186. return ActionResult.success(MsgCode.SU005.get(), entity.getId());
  187. }
  188. return ActionResult.fail(MsgCode.FA001.get());
  189. }
  190. /**
  191. * 获取类型
  192. *
  193. * @return
  194. */
  195. @Operation(summary = "获取类型")
  196. @GetMapping("/category")
  197. @SaCheckPermission("onlineDev.dataScreen")
  198. public ActionResult<List<VisualCategoryListVO>> list() {
  199. List<VisualCategoryEntity> data = categoryService.getList();
  200. List<VisualCategoryListVO> list = JsonUtil.getJsonToList(data, VisualCategoryListVO.class);
  201. return ActionResult.success(list);
  202. }
  203. /**
  204. * 上传文件
  205. *
  206. * @param file 文件
  207. * @param type 类型
  208. * @return
  209. */
  210. @NoDataSourceBind()
  211. @Operation(summary = "上传文件")
  212. @Parameters({
  213. @Parameter(name = "type", description = "类型",required = true),
  214. })
  215. @PostMapping(value = "/put-file/{type}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
  216. public ActionResult<ImageVO> file(MultipartFile file, @PathVariable("type") String type) {
  217. ImageVO vo = new ImageVO();
  218. VisualImgEnum imgEnum = VisualImgEnum.getByMessage(type);
  219. if (imgEnum != null) {
  220. String path = imgEnum.getMessage();
  221. String filePath = configValueUtil.getBiVisualPath() + path + "/";
  222. String name = RandomUtil.uuId() + "." + UpUtil.getFileType(file);
  223. //上传文件
  224. FileInfo fileInfo = FileUploadUtils.uploadFile(new FileParameter(filePath, name), file);
  225. vo.setOriginalName(fileInfo.getOriginalFilename());
  226. vo.setLink(VisusalImgUrl.url + fileInfo.getPath() + fileInfo.getFilename());
  227. vo.setName(VisusalImgUrl.url + fileInfo.getPath() + fileInfo.getFilename());
  228. }
  229. return ActionResult.success(vo);
  230. }
  231. /**
  232. * 获取图片列表
  233. *
  234. * @param type 文件夹
  235. * @return
  236. */
  237. @NoDataSourceBind()
  238. @Operation(summary = "获取图片列表")
  239. @GetMapping("/{type}")
  240. @Parameters({
  241. @Parameter(name = "type", description = "文件夹", required = true),
  242. })
  243. public ActionResult<List<ImageVO>> getFile(@PathVariable("type") String type) {
  244. List<ImageVO> vo = new ArrayList<>();
  245. VisualImgEnum imgEnum = VisualImgEnum.getByMessage(type);
  246. if (imgEnum != null) {
  247. String path = configValueUtil.getBiVisualPath() + imgEnum.getMessage() + "/";
  248. List<FileListVO> fileList = FileUploadUtils.getFileList(new FileParameter().setRemotePath(path));
  249. fileList.forEach(fileListVO -> {
  250. ImageVO imageVO = new ImageVO();
  251. imageVO.setName(fileListVO.getFileName());
  252. imageVO.setLink(VisusalImgUrl.url + fileListVO.getFileName());
  253. imageVO.setOriginalName(fileListVO.getFileName());
  254. vo.add(imageVO);
  255. });
  256. }
  257. return ActionResult.success(vo);
  258. }
  259. /**
  260. * 大屏下拉框
  261. */
  262. @Operation(summary = "大屏下拉框")
  263. @GetMapping("/Selector")
  264. @SaCheckPermission("onlineDev.dataScreen")
  265. public ActionResult<ListVO<VisualSelectorVO>> selector() {
  266. List<VisualEntity> visualList = visualService.getList();
  267. List<VisualCategoryEntity> categoryList = categoryService.getList();
  268. List<VisualSelectorVO> listVos = new ArrayList<>();
  269. for (VisualCategoryEntity category : categoryList) {
  270. VisualSelectorVO categoryModel = new VisualSelectorVO();
  271. categoryModel.setId(category.getCategoryvalue());
  272. categoryModel.setFullName(category.getCategorykey());
  273. List<VisualEntity> visualAll = visualList.stream().filter(t -> t.getCategory().equals(Integer.parseInt(category.getCategoryvalue()))).collect(Collectors.toList());
  274. if (visualAll.size() > 0) {
  275. List<VisualSelectorVO> childList = new ArrayList<>();
  276. for (VisualEntity visual : visualAll) {
  277. VisualSelectorVO visualModel = new VisualSelectorVO();
  278. visualModel.setId(visual.getId());
  279. visualModel.setFullName(visual.getTitle());
  280. visualModel.setChildren(null);
  281. visualModel.setHasChildren(false);
  282. childList.add(visualModel);
  283. }
  284. categoryModel.setHasChildren(true);
  285. categoryModel.setChildren(childList);
  286. listVos.add(categoryModel);
  287. }
  288. }
  289. ListVO vo = new ListVO();
  290. vo.setList(listVos);
  291. return ActionResult.success(vo);
  292. }
  293. /**
  294. * 大屏导出
  295. *
  296. * @param id 主键
  297. * @return
  298. */
  299. @Operation(summary = "大屏导出")
  300. @PostMapping("/{id}/Actions/ExportData")
  301. @Parameters({
  302. @Parameter(name = "id", description = "主键", required = true),
  303. })
  304. @SaCheckPermission("onlineDev.dataScreen")
  305. public ActionResult<DownloadVO> exportData(@PathVariable("id") String id) {
  306. VisualEntity entity = visualService.getInfo(id);
  307. VisualConfigEntity configEntity = configService.getInfo(id);
  308. VisualModel model = new VisualModel();
  309. model.setEntity(entity);
  310. model.setConfigEntity(configEntity);
  311. DownloadVO downloadVO = fileExport.exportFile(model, FileTypeConstant.TEMPORARY, entity.getTitle(), ModuleTypeEnum.VISUAL_DATA.getTableName());
  312. return ActionResult.success(downloadVO);
  313. }
  314. /**
  315. * 大屏导入
  316. *
  317. * @param multipartFile 文件
  318. * @return
  319. */
  320. @Operation(summary = "大屏导入")
  321. @SaCheckPermission("onlineDev.dataScreen")
  322. @PostMapping(value = "/Model/Actions/ImportData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
  323. public ActionResult ImportData(MultipartFile multipartFile) throws DataException {
  324. //判断是否为.json结尾
  325. if (FileUtil.existsSuffix(multipartFile, ModuleTypeEnum.VISUAL_DATA.getTableName())) {
  326. return ActionResult.fail(MsgCode.IMP002.get());
  327. }
  328. //获取文件内容
  329. String fileContent = FileUtil.getFileContent(multipartFile);
  330. VisualModel vo = JsonUtil.getJsonToBean(fileContent, VisualModel.class);
  331. visualService.createImport(vo.getEntity(), vo.getConfigEntity());
  332. return ActionResult.success(MsgCode.SU000.get());
  333. }
  334. /**
  335. * 获取API动态数据
  336. *
  337. * @param apiRequest 大屏模型
  338. * @return
  339. */
  340. @Operation(summary = "获取API动态数据")
  341. @PostMapping(value = "/GetApiData")
  342. @Parameters({
  343. @Parameter(name = "apiRequest", description = "大屏模型",required = true),
  344. })
  345. public String getApiData(@RequestBody @Valid VisualApiRequest apiRequest) throws IOException {
  346. OkHttpClient client = new OkHttpClient.Builder().callTimeout(Duration.ofSeconds(apiRequest.getTimeout())).build();
  347. Headers headers;
  348. Request request;
  349. if (!apiRequest.getHeaders().isEmpty()) {
  350. Headers.Builder builder = new Headers.Builder();
  351. apiRequest.getHeaders().forEach((k, v) -> {
  352. builder.add(k, v);
  353. });
  354. headers = builder.build();
  355. } else {
  356. headers = new Headers.Builder().build();
  357. }
  358. if (apiRequest.getMethod().equalsIgnoreCase("post")) {
  359. request = new Request.Builder().url(apiRequest.getUrl())
  360. .post(okhttp3.RequestBody.create(okhttp3.MediaType.parse("application/json;charset=utf-8"), apiRequest.getParams().isEmpty() ? "" : JsonUtil.getObjectToString(apiRequest.getParams())))
  361. .headers(headers)
  362. .build();
  363. } else {
  364. String params = Joiner.on("&")
  365. .useForNull("")
  366. .withKeyValueSeparator("=")
  367. .join(apiRequest.getParams());
  368. request = new Request.Builder().url(apiRequest.getUrl() + (apiRequest.getUrl().contains("?") ? "&" : "?") + params)
  369. .get()
  370. .headers(headers)
  371. .build();
  372. }
  373. return client.newCall(request).execute().body().string();
  374. }
  375. /**
  376. * 获取API动态数据
  377. *
  378. * @param proxyModel 代理模型
  379. * @return
  380. */
  381. @Operation(summary = "获取API动态数据")
  382. @PostMapping(value = "/proxy")
  383. @Parameters({
  384. @Parameter(name = "proxyModel", description = "代理模型",required = true),
  385. })
  386. public String getApiData(@RequestBody @Valid VisualProxyModel proxyModel) throws IOException {
  387. Map<String, String> headers;
  388. boolean isForm = false;
  389. if (!proxyModel.getHeaders().isEmpty()) {
  390. headers = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
  391. headers.putAll(proxyModel.getHeaders());
  392. if(headers.containsKey("form")){
  393. //头部指定当前为form表单
  394. isForm = true;
  395. }
  396. } else {
  397. headers = new HashMap<>(1, 1);
  398. }
  399. //Header无自定义TOKEN 取当前TOKEN
  400. if(!headers.containsKey("Authorization")){
  401. String token = UserProvider.getToken();
  402. if(StringUtil.isNotEmpty(token)){
  403. headers.put("Authorization", token);
  404. }
  405. }
  406. HttpRequest httpRequest = HttpRequest.of(proxyModel.getUrl()).method(Method.valueOf(proxyModel.getMethod().toUpperCase())).addHeaders(headers);
  407. if(isForm){
  408. httpRequest.form(proxyModel.getData());
  409. }else if(proxyModel.getData() != null && !proxyModel.getData().isEmpty()){
  410. httpRequest.body(JsonUtil.getObjectToString(proxyModel.getData()));
  411. }else {
  412. httpRequest.form(proxyModel.getParams());
  413. }
  414. try {
  415. return httpRequest.timeout(10000).execute().body();
  416. } catch (Exception e){
  417. log.info("接口请求失败 {} {}", proxyModel.getUrl(), e.getMessage());
  418. throw new DataException(MsgCode.FA037.get());
  419. }
  420. }
  421. }