SaasProjectController.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. package com.persagy.account.controller;
  2. import java.io.IOException;
  3. import java.net.URLEncoder;
  4. import java.nio.charset.StandardCharsets;
  5. import java.util.List;
  6. import java.util.Map;
  7. import javax.servlet.http.HttpServletResponse;
  8. import org.springframework.beans.BeanUtils;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.validation.annotation.Validated;
  11. import org.springframework.web.bind.annotation.ModelAttribute;
  12. import org.springframework.web.bind.annotation.RequestBody;
  13. import org.springframework.web.bind.annotation.RequestMapping;
  14. import org.springframework.web.bind.annotation.RequestMethod;
  15. import org.springframework.web.bind.annotation.RestController;
  16. import org.springframework.web.multipart.MultipartFile;
  17. import com.alibaba.excel.EasyExcel;
  18. import com.alibaba.excel.ExcelWriter;
  19. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  20. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  21. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  22. import com.google.common.collect.Lists;
  23. import com.persagy.account.manage.SaasAreaProjectHandler;
  24. import com.persagy.account.manage.SaasAuthHandler;
  25. import com.persagy.account.manage.SaasGroupProjectHandler;
  26. import com.persagy.account.manage.SaasProjectExcelDataHandler;
  27. import com.persagy.account.manage.SaasProjectSheetWriteHandler;
  28. import com.persagy.account.pojo.dto.SaasAccountProject;
  29. import com.persagy.account.pojo.dto.SaasArea;
  30. import com.persagy.account.pojo.dto.SaasGroup;
  31. import com.persagy.account.pojo.dto.SaasProject;
  32. import com.persagy.account.pojo.vo.BaseGroupVO;
  33. import com.persagy.account.pojo.vo.group.SaasGroupQueryVO;
  34. import com.persagy.account.pojo.vo.project.SaasProjectAreaUpdateVO;
  35. import com.persagy.account.pojo.vo.project.SaasProjectCreateVO;
  36. import com.persagy.account.pojo.vo.project.SaasProjectExcel;
  37. import com.persagy.account.pojo.vo.project.SaasProjectPageVO;
  38. import com.persagy.account.pojo.vo.project.SaasProjectQueryVO;
  39. import com.persagy.account.service.ISaasAccountProjectService;
  40. import com.persagy.account.service.ISaasAreaService;
  41. import com.persagy.account.service.ISaasGroupService;
  42. import com.persagy.account.service.ISaasProjectService;
  43. import com.persagy.common.constant.SaasCommonConstant;
  44. import com.persagy.common.enums.ResponseCode;
  45. import com.persagy.common.exception.BusinessException;
  46. import com.persagy.common.model.BaseUserModel;
  47. import com.persagy.common.utils.ResponseResult;
  48. import com.persagy.common.utils.ResponseResultUtil;
  49. import com.persagy.common.utils.StringUtil;
  50. import com.persagy.log.core.annotation.IgnoreLog;
  51. import com.persagy.security.constant.CipherConstants;
  52. import cn.hutool.core.collection.CollectionUtil;
  53. import io.swagger.annotations.Api;
  54. import io.swagger.annotations.ApiOperation;
  55. import lombok.extern.slf4j.Slf4j;
  56. /**
  57. * 项目信息
  58. *
  59. * @version 1.0.0
  60. * @company persagy
  61. * @author zhangqiankun
  62. * @date 2021-03-13 15:29:50
  63. */
  64. @Slf4j
  65. @Api(tags = "项目信息")
  66. @RestController
  67. @RequestMapping(value = "/project", method = RequestMethod.POST)
  68. public class SaasProjectController {
  69. @Autowired
  70. private SaasAuthHandler saasAuthHandler;
  71. @Autowired
  72. private ISaasAreaService saasAreaService;
  73. @Autowired
  74. private ISaasGroupService saasGroupService;
  75. @Autowired
  76. private ISaasProjectService saasProjectService;
  77. @Autowired
  78. private SaasAreaProjectHandler saasAreaProjectHandler;
  79. @Autowired
  80. private SaasGroupProjectHandler saasGroupProjectHandler;
  81. @Autowired
  82. private ISaasAccountProjectService saasAccountProjectService;
  83. /**
  84. * 项目信息查询,更新时间降序
  85. */
  86. @ApiOperation(value = "项目信息查询")
  87. @RequestMapping(value = "querySaasProjectList")
  88. public ResponseResult querySaasProjectList(@RequestBody @Validated SaasProjectQueryVO queryVO) {
  89. if (CollectionUtil.isNotEmpty(queryVO.getProjectIds()) && queryVO.getProjectIds().size() > 999) {
  90. return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "项目ID集合数量过大,请分批查询");
  91. }
  92. SaasProject saasProject = new SaasProject();
  93. BeanUtils.copyProperties(queryVO, saasProject);
  94. Page<SaasProject> projectList = this.saasGroupProjectHandler.querySaasProjectList(saasProject, null, null);
  95. return ResponseResultUtil.successResult(projectList.getRecords(), projectList.getTotal());
  96. }
  97. /**
  98. * 项目-区域平铺列表查询,权限过滤
  99. */
  100. @ApiOperation(value = "区域-项目平铺列表查询")
  101. @RequestMapping(value = "queryGroupProjectList")
  102. public ResponseResult queryGroupProjectList(@RequestBody @Validated BaseGroupVO queryVO) {
  103. LambdaQueryWrapper<SaasAccountProject> queryWrapper = new SaasAccountProject.Builder().createQueryWrapper()
  104. .groupCodeEq(queryVO.getGroupCode()).accountIdEq(queryVO.getAccountId()).builderQueryWrapper();
  105. List<SaasAccountProject> list = this.saasAccountProjectService.list(queryWrapper);
  106. if (list == null) {
  107. return ResponseResultUtil.successResult(Lists.newArrayList(), 0L);
  108. }
  109. return ResponseResultUtil.successResult(list, (long)list.size());
  110. }
  111. /**
  112. * 项目信息分页查询, 更新时间降序
  113. */
  114. @ApiOperation(value = "项目信息分页查询")
  115. @RequestMapping(value = "queryProjectPageList")
  116. public ResponseResult queryProjectPageList(@RequestBody @Validated SaasProjectPageVO pageVO) {
  117. SaasProject saasProject = new SaasProject();
  118. BeanUtils.copyProperties(pageVO, saasProject);
  119. Page<SaasProject> projectList = this.saasGroupProjectHandler.querySaasProjectList(saasProject, pageVO.getPage(), pageVO.getSize());
  120. return ResponseResultUtil.successResult(projectList.getRecords(), projectList.getTotal());
  121. }
  122. /**
  123. * 区域项目信息查询,结构:集团->区域->项目, 未做权限过滤
  124. */
  125. @ApiOperation(value = "查询集团区域项目信息")
  126. @RequestMapping(value = "queryAreaProjectTree")
  127. public ResponseResult queryAreaProjectTree(@RequestBody @Validated SaasProjectQueryVO model) {
  128. // 获取集团信息
  129. List<SaasGroup> groups = null;
  130. if (StringUtil.isBlank(model.getGroupCode())) {
  131. // 获取所有集团
  132. LambdaQueryWrapper<SaasGroup> queryWrapper = new SaasGroup.Builder().createQueryWrapper().validEq(SaasCommonConstant.STATUS_1).builderQueryWrapper();
  133. groups = this.saasGroupService.list(queryWrapper);
  134. } else {
  135. SaasGroup group = this.saasGroupService.getOne(model.getGroupCode());
  136. if (group == null) {
  137. return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "集团信息不存在");
  138. }
  139. groups = Lists.newArrayList(group);
  140. }
  141. if (CollectionUtil.isEmpty(groups)) {
  142. return ResponseResultUtil.errorResult(ResponseCode.C0320.getCode(), "集团信息不存在");
  143. }
  144. for (SaasGroup saasGroup : groups) {
  145. this.saasAreaProjectHandler.queryAreaProjectTree(saasGroup, model.isExcludeEmptyArea());
  146. }
  147. return ResponseResultUtil.successResult(groups);
  148. }
  149. /**
  150. * 区域项目信息查询,结构:集团->区域->项目, 根据账号ID做了权限过滤
  151. */
  152. @ApiOperation(value = "查询区域项目信息")
  153. @RequestMapping(value = "queryAllowAreaProjectTree")
  154. public ResponseResult queryAllowAreaProjectTree(@RequestBody @Validated SaasProjectQueryVO queryVO) {
  155. if (CollectionUtil.isNotEmpty(queryVO.getProjectIds()) && queryVO.getProjectIds().size() > 999) {
  156. return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "项目ID集合数量过大,请分批查询");
  157. }
  158. // 账号数据可见性的权限鉴定
  159. Map<String, String> authMap = this.saasAuthHandler.validAccountAuth(queryVO.getAccountId(), queryVO.getGroupCode());
  160. if (StringUtil.isNotBlank(authMap.get(CipherConstants.GROUP_CODE))) {
  161. queryVO.setGroupCode(authMap.get(CipherConstants.GROUP_CODE));
  162. }
  163. // 添加数据访问控制,账号可见域,0-所有集团项目,1-单集团所有项目(此时,集团编码需存在),2-其他
  164. String accountType = authMap.get(SaasCommonConstant.ACCOUNT_TYPE);
  165. List<SaasGroup> groups = this.saasAuthHandler.getAllowGroupList(queryVO.getAccountId(), queryVO.getGroupCode(), accountType);
  166. // 查询区域项目树
  167. for (SaasGroup saasGroup : groups) {
  168. List<SaasArea> areaList = this.saasAuthHandler.getAllowAreaList(queryVO.getAccountId(), queryVO.getGroupCode(), accountType, queryVO.isExcludeEmptyArea());
  169. saasGroup.setAreas(areaList);
  170. this.saasAreaProjectHandler.queryAllowAreaProjectTree(queryVO, saasGroup, areaList);
  171. if (queryVO.isExcludeEmptyArea()) {
  172. // 获取未分区下的可见项目
  173. SaasArea areaOne = this.saasAreaService.getAreaOne(null, saasGroup.getGroupCode(), SaasCommonConstant.STR_STATUS_MINUS_1, null);
  174. if (areaOne != null) {
  175. List<SaasProject> projects = this.saasAuthHandler.getAllowProjectList(queryVO.getAccountId(), queryVO.getGroupCode(), areaOne.getId());
  176. saasGroup.setProjects(projects);
  177. }
  178. }
  179. }
  180. return ResponseResultUtil.successResult(groups);
  181. }
  182. /**
  183. * 新增,集团编码与项目ID联合唯一,同时判断是否需要新增一条权限信息
  184. */
  185. @ApiOperation(value = "保存")
  186. @RequestMapping(value = "createSaasProject")
  187. public ResponseResult createSaasProject(@RequestBody @Validated SaasProjectCreateVO createVO) {
  188. SaasProject saasProject = new SaasProject();
  189. BeanUtils.copyProperties(createVO, saasProject);
  190. saasProject.setUpdateUser(createVO.getAccountId());
  191. saasProject.setId(null);
  192. if (StringUtil.isBlank(createVO.getAreaId())) {
  193. // 查询出未分区的区域ID
  194. SaasArea areaOne = this.saasAreaService.getAreaOne(null, createVO.getGroupCode(), SaasCommonConstant.STR_STATUS_MINUS_1, null);
  195. if (areaOne == null) {
  196. return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "此项目所属集团不存在未分区区域,请检查");
  197. }
  198. saasProject.setAreaId(areaOne.getId());
  199. }
  200. // 验证集团编码与项目ID的联合唯一性
  201. boolean exists = this.saasProjectService.validProjectData(saasProject, false);
  202. if (!exists) {
  203. return ResponseResultUtil.errorResult(ResponseCode.C0341.getCode(), "项目ID、项目本地编码、项目名称都必须唯一");
  204. }
  205. return this.saasGroupProjectHandler.createSaasProject(saasProject, createVO.getAccountId());
  206. }
  207. /**
  208. * 更新
  209. */
  210. @ApiOperation(value = "更新")
  211. @RequestMapping(value = "updateSaasProject")
  212. public ResponseResult updateSaasProject(@RequestBody @Validated SaasProjectCreateVO createVO) {
  213. if (StringUtil.isBlank(createVO.getId())) {
  214. return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "主键ID不可为空");
  215. }
  216. SaasProject saasProject = new SaasProject();
  217. BeanUtils.copyProperties(createVO, saasProject);
  218. saasProject.setUpdateUser(createVO.getAccountId());
  219. if (SaasCommonConstant.STR_STATUS_MINUS_1.equals(createVO.getAreaId())) {
  220. // 查询出未分区的区域ID
  221. SaasArea areaOne = this.saasAreaService.getAreaOne(null, createVO.getGroupCode(), SaasCommonConstant.STR_STATUS_MINUS_1, null);
  222. if (areaOne == null) {
  223. return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "此项目所属集团不存在未分区区域,请检查");
  224. }
  225. saasProject.setAreaId(areaOne.getId());
  226. }
  227. // 验证集团编码与项目ID的联合唯一性
  228. boolean exists = this.saasProjectService.validProjectData(saasProject, true);
  229. if (!exists) {
  230. return ResponseResultUtil.errorResult(ResponseCode.C0341.getCode(), "项目名称或项目ID或项目本地编码已存在");
  231. }
  232. LambdaUpdateWrapper<SaasProject> updateWrapper = new SaasProject.Builder().createUpdateWrapper()
  233. .idEq(createVO.getId()).groupCodeEq(createVO.getGroupCode()).projectIdEq(createVO.getProjectId())
  234. .validEq(SaasCommonConstant.STATUS_1).builderUpdateWrapper();
  235. exists = this.saasProjectService.update(saasProject, updateWrapper);
  236. return exists ? ResponseResultUtil.successResult("更新成功") : ResponseResultUtil.errorResult("更新失败");
  237. }
  238. /**
  239. * 批量变更项目所属区域
  240. */
  241. @ApiOperation(value = "批量变更项目所属区域")
  242. @RequestMapping(value = "batchUpdateProjectArea")
  243. public ResponseResult batchUpdateProjectArea(@RequestBody @Validated SaasProjectAreaUpdateVO batchVO) {
  244. if (batchVO.getProjectIds().size() > 100) {
  245. return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "项目ID过多,请多次处理");
  246. }
  247. SaasProject saasProject = new SaasProject();
  248. BeanUtils.copyProperties(batchVO, saasProject);
  249. saasProject.setUpdateUser(batchVO.getAccountId());
  250. boolean result = this.saasProjectService.batchUpdateProjectArea(saasProject, batchVO.getProjectIds());
  251. return result ? ResponseResultUtil.successResult("更新成功") : ResponseResultUtil.errorResult("更新失败");
  252. }
  253. /**
  254. * 物理删除
  255. */
  256. /*@ApiOperation(value = "删除")
  257. @RequestMapping(value = "deleteSaasProject")
  258. public ResponseResult deleteSaasProject(@RequestBody SaasProject saasProject) {
  259. boolean result = saasProjectService.removeById(saasProject.getId());
  260. return result ? ResponseResultUtil.successResult("删除成功") : ResponseResultUtil.errorResult("删除失败");
  261. }*/
  262. /******************************************************** upload file *****************************************************/
  263. /**
  264. * 项目数据上传模板下载
  265. *
  266. * @param baseVO
  267. * @param response
  268. * @return
  269. */
  270. @ApiOperation(value = "项目数据上传模板下载")
  271. @RequestMapping(value = "downloadProjectTemplate")
  272. public void downloadProjectTemplate(@RequestBody @Validated BaseUserModel baseVO, HttpServletResponse response) {
  273. // 优先判断是否存在集团信息
  274. SaasGroupQueryVO groupVO = new SaasGroupQueryVO();
  275. List<SaasGroup> list = this.saasGroupProjectHandler.querySaasGroupList(groupVO);
  276. if (CollectionUtil.isEmpty(list)) {
  277. throw new BusinessException("集团信息为空,请先添加集团");
  278. }
  279. ExcelWriter excelWriter = null;
  280. try {
  281. response.setContentType("application/vnd.ms-excel");
  282. String encode = StandardCharsets.UTF_8.name();
  283. response.setCharacterEncoding(encode);
  284. // 防止中文乱码
  285. String fileName = URLEncoder.encode("仪表批量上传模板", encode);
  286. response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
  287. EasyExcel.write(response.getOutputStream(), SaasProjectExcel.class)
  288. .registerWriteHandler(new SaasProjectSheetWriteHandler(saasGroupProjectHandler, saasAreaProjectHandler))
  289. .sheet("传项目信息").doWrite(SaasProjectExcel.getDemoData());
  290. /* excelWriter = EasyExcel.write(response.getOutputStream()).build();
  291. WriteSheet writeSheetOne = EasyExcel.writerSheet(0, SaasProjectExcel.SHEET_NAME_0)
  292. .registerWriteHandler(new SaasProjectSheetWriteHandler(saasGroupProjectHandler, saasAreaProjectHandler))
  293. .head(SaasProjectExcel.class).build();
  294. excelWriter.write(SaasProjectExcel.getDemoData(), writeSheetOne);*/
  295. } catch(Exception e) {
  296. log.error("项目数据上传模板下载失败", e);
  297. } finally {
  298. if (excelWriter != null) {
  299. excelWriter.finish();
  300. }
  301. }
  302. }
  303. /**
  304. * 项目数据上传
  305. *
  306. * @param model
  307. * @param file
  308. * @return
  309. */
  310. @IgnoreLog
  311. @ApiOperation(value = "项目数据直接上传")
  312. @RequestMapping(value = "directUploadProjectData")
  313. public ResponseResult directUploadProjectData(@ModelAttribute @Validated BaseUserModel model, MultipartFile file) {
  314. try {
  315. if (file == null) {
  316. return ResponseResultUtil.errorResult("未找到对应文件");
  317. }
  318. EasyExcel.read(file.getInputStream(), SaasProjectExcel.class,
  319. new SaasProjectExcelDataHandler(model, saasAreaService, saasProjectService)).sheet(0).doRead();
  320. return ResponseResultUtil.successResult();
  321. } catch(IOException e) {
  322. log.error("传感器数据流读取失败", e);
  323. }
  324. return ResponseResultUtil.errorResult();
  325. }
  326. }