|
@@ -0,0 +1,348 @@
|
|
|
|
+package com.persagy.person.controller;
|
|
|
|
+
|
|
|
|
+import java.io.IOException;
|
|
|
|
+import java.net.URLEncoder;
|
|
|
|
+import java.nio.charset.StandardCharsets;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
|
|
+
|
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
|
+
|
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
+import org.springframework.validation.annotation.Validated;
|
|
|
|
+import org.springframework.web.bind.annotation.ModelAttribute;
|
|
|
|
+import org.springframework.web.bind.annotation.RequestBody;
|
|
|
|
+import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
|
+import org.springframework.web.bind.annotation.RequestMethod;
|
|
|
|
+import org.springframework.web.bind.annotation.RestController;
|
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
|
+
|
|
|
|
+import com.alibaba.excel.EasyExcel;
|
|
|
|
+import com.alibaba.excel.ExcelWriter;
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
+import com.google.common.collect.Lists;
|
|
|
|
+import com.persagy.common.constant.SaasCommonConstant;
|
|
|
|
+import com.persagy.common.enums.ResponseCode;
|
|
|
|
+import com.persagy.common.exception.BusinessException;
|
|
|
|
+import com.persagy.common.model.BaseUserModel;
|
|
|
|
+import com.persagy.common.utils.ResponseResult;
|
|
|
|
+import com.persagy.common.utils.ResponseResultUtil;
|
|
|
|
+import com.persagy.common.utils.StringUtil;
|
|
|
|
+import com.persagy.log.core.annotation.IgnoreLog;
|
|
|
|
+import com.persagy.person.manage.SaasAreaProjectHandler;
|
|
|
|
+import com.persagy.person.manage.SaasAuthHandler;
|
|
|
|
+import com.persagy.person.manage.SaasGroupProjectHandler;
|
|
|
|
+import com.persagy.person.manage.SaasProjectExcelDataHandler;
|
|
|
|
+import com.persagy.person.manage.SaasProjectSheetWriteHandler;
|
|
|
|
+import com.persagy.person.pojo.dto.SaasAccountProject;
|
|
|
|
+import com.persagy.person.pojo.dto.SaasArea;
|
|
|
|
+import com.persagy.person.pojo.dto.SaasGroup;
|
|
|
|
+import com.persagy.person.pojo.dto.SaasProject;
|
|
|
|
+import com.persagy.person.pojo.vo.BaseGroupVO;
|
|
|
|
+import com.persagy.person.pojo.vo.group.SaasGroupQueryVO;
|
|
|
|
+import com.persagy.person.pojo.vo.project.SaasProjectAreaUpdateVO;
|
|
|
|
+import com.persagy.person.pojo.vo.project.SaasProjectCreateVO;
|
|
|
|
+import com.persagy.person.pojo.vo.project.SaasProjectExcel;
|
|
|
|
+import com.persagy.person.pojo.vo.project.SaasProjectPageVO;
|
|
|
|
+import com.persagy.person.pojo.vo.project.SaasProjectQueryVO;
|
|
|
|
+import com.persagy.person.service.ISaasAccountProjectService;
|
|
|
|
+import com.persagy.person.service.ISaasAreaService;
|
|
|
|
+import com.persagy.person.service.ISaasGroupService;
|
|
|
|
+import com.persagy.person.service.ISaasProjectService;
|
|
|
|
+
|
|
|
|
+import cn.hutool.core.collection.CollectionUtil;
|
|
|
|
+import io.swagger.annotations.Api;
|
|
|
|
+import io.swagger.annotations.ApiOperation;
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * 项目信息
|
|
|
|
+ *
|
|
|
|
+ * @version 1.0.0
|
|
|
|
+ * @company persagy
|
|
|
|
+ * @author zhangqiankun
|
|
|
|
+ * @date 2021-03-13 15:29:50
|
|
|
|
+ */
|
|
|
|
+@Slf4j
|
|
|
|
+@Api(tags = "项目信息")
|
|
|
|
+@RestController
|
|
|
|
+@RequestMapping(value = "/project", method = RequestMethod.POST)
|
|
|
|
+public class SaasProjectController {
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private SaasAuthHandler saasAuthHandler;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private ISaasAreaService saasAreaService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private ISaasGroupService saasGroupService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private ISaasProjectService saasProjectService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private SaasAreaProjectHandler saasAreaProjectHandler;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private SaasGroupProjectHandler saasGroupProjectHandler;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private ISaasAccountProjectService saasAccountProjectService;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 项目信息查询,更新时间降序
|
|
|
|
+ */
|
|
|
|
+ @ApiOperation(value = "项目信息查询")
|
|
|
|
+ @RequestMapping(value = "querySaasProjectList")
|
|
|
|
+ public ResponseResult querySaasProjectList(@RequestBody @Validated SaasProjectQueryVO queryVO) {
|
|
|
|
+ if (CollectionUtil.isNotEmpty(queryVO.getProjectIds()) && queryVO.getProjectIds().size() > 999) {
|
|
|
|
+ return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "项目ID集合数量过大,请分批查询");
|
|
|
|
+ }
|
|
|
|
+ SaasProject saasProject = new SaasProject();
|
|
|
|
+ BeanUtils.copyProperties(queryVO, saasProject);
|
|
|
|
+ Page<SaasProject> projectList = this.saasGroupProjectHandler.querySaasProjectList(saasProject, null, null);
|
|
|
|
+ return ResponseResultUtil.successResult(projectList.getRecords(), projectList.getTotal());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 项目-区域平铺列表查询,权限过滤
|
|
|
|
+ */
|
|
|
|
+ @ApiOperation(value = "区域-项目平铺列表查询")
|
|
|
|
+ @RequestMapping(value = "queryGroupProjectList")
|
|
|
|
+ public ResponseResult queryGroupProjectList(@RequestBody @Validated BaseGroupVO queryVO) {
|
|
|
|
+ LambdaQueryWrapper<SaasAccountProject> queryWrapper = new SaasAccountProject.Builder().createQueryWrapper()
|
|
|
|
+ .groupCodeEq(queryVO.getGroupCode()).accountIdEq(queryVO.getAccountId()).builderQueryWrapper();
|
|
|
|
+ List<SaasAccountProject> list = this.saasAccountProjectService.list(queryWrapper);
|
|
|
|
+ if (list == null) {
|
|
|
|
+ return ResponseResultUtil.successResult(Lists.newArrayList(), 0L);
|
|
|
|
+ }
|
|
|
|
+ return ResponseResultUtil.successResult(list, (long)list.size());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 项目信息分页查询, 更新时间降序
|
|
|
|
+ */
|
|
|
|
+ @ApiOperation(value = "项目信息分页查询")
|
|
|
|
+ @RequestMapping(value = "queryProjectPageList")
|
|
|
|
+ public ResponseResult queryProjectPageList(@RequestBody @Validated SaasProjectPageVO pageVO) {
|
|
|
|
+ SaasProject saasProject = new SaasProject();
|
|
|
|
+ BeanUtils.copyProperties(pageVO, saasProject);
|
|
|
|
+ Page<SaasProject> projectList = this.saasGroupProjectHandler.querySaasProjectList(saasProject, pageVO.getPage(), pageVO.getSize());
|
|
|
|
+ return ResponseResultUtil.successResult(projectList.getRecords(), projectList.getTotal());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 区域项目信息查询,结构:集团->区域->项目, 未做权限过滤
|
|
|
|
+ */
|
|
|
|
+ @ApiOperation(value = "查询集团区域项目信息")
|
|
|
|
+ @RequestMapping(value = "queryAreaProjectTree")
|
|
|
|
+ public ResponseResult queryAreaProjectTree(@RequestBody @Validated SaasProjectQueryVO model) {
|
|
|
|
+ // 获取集团信息
|
|
|
|
+ List<SaasGroup> groups = null;
|
|
|
|
+ if (StringUtil.isBlank(model.getGroupCode())) {
|
|
|
|
+ // 获取所有集团
|
|
|
|
+ LambdaQueryWrapper<SaasGroup> queryWrapper = new SaasGroup.Builder().createQueryWrapper().validEq(SaasCommonConstant.STATUS_1).builderQueryWrapper();
|
|
|
|
+ groups = this.saasGroupService.list(queryWrapper);
|
|
|
|
+ } else {
|
|
|
|
+ SaasGroup group = this.saasGroupService.getOne(model.getGroupCode());
|
|
|
|
+ if (group == null) {
|
|
|
|
+ return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "集团信息不存在");
|
|
|
|
+ }
|
|
|
|
+ groups = Lists.newArrayList(group);
|
|
|
|
+ }
|
|
|
|
+ if (CollectionUtil.isEmpty(groups)) {
|
|
|
|
+ return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "集团信息不存在");
|
|
|
|
+ }
|
|
|
|
+ for (SaasGroup saasGroup : groups) {
|
|
|
|
+ this.saasAreaProjectHandler.queryAreaProjectTree(saasGroup);
|
|
|
|
+ }
|
|
|
|
+ return ResponseResultUtil.successResult(groups);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 区域项目信息查询,结构:集团->区域->项目, 根据账号ID做了权限过滤
|
|
|
|
+ */
|
|
|
|
+ @ApiOperation(value = "查询区域项目信息")
|
|
|
|
+ @RequestMapping(value = "queryAllowAreaProjectTree")
|
|
|
|
+ public ResponseResult queryAllowAreaProjectTree(@RequestBody @Validated SaasProjectQueryVO queryVO) {
|
|
|
|
+ if (CollectionUtil.isNotEmpty(queryVO.getProjectIds()) && queryVO.getProjectIds().size() > 999) {
|
|
|
|
+ return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "项目ID集合数量过大,请分批查询");
|
|
|
|
+ }
|
|
|
|
+ // 账号数据可见性的权限鉴定
|
|
|
|
+ Map<String, String> authMap = this.saasAuthHandler.validGroupProjectAuth(queryVO.getAccountId(), queryVO.getGroupCode());
|
|
|
|
+ if (StringUtil.isNotBlank(authMap.get(SaasCommonConstant.GROUP_CODE))) {
|
|
|
|
+ queryVO.setGroupCode(authMap.get(SaasCommonConstant.GROUP_CODE));
|
|
|
|
+ }
|
|
|
|
+ // 添加数据访问控制,账号可见域,0-所有集团项目,1-单集团所有项目(此时,集团编码需存在),2-其他
|
|
|
|
+ String accountType = authMap.get(SaasCommonConstant.ACCOUNT_TYPE);
|
|
|
|
+ List<SaasGroup> groups = this.saasAuthHandler.getAllowGroupList(queryVO.getAccountId(), queryVO.getGroupCode(), accountType);
|
|
|
|
+ // 查询区域项目树
|
|
|
|
+ for (SaasGroup saasGroup : groups) {
|
|
|
|
+ List<SaasArea> areaList = this.saasAuthHandler.getAllowAreaList(queryVO.getAccountId(), queryVO.getGroupCode(), accountType);
|
|
|
|
+ saasGroup.setAreas(areaList);
|
|
|
|
+ this.saasAreaProjectHandler.queryAllowAreaProjectTree(queryVO, saasGroup, areaList);
|
|
|
|
+ }
|
|
|
|
+ return ResponseResultUtil.successResult(groups);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 新增,集团编码与项目ID联合唯一,同时判断是否需要新增一条权限信息
|
|
|
|
+ */
|
|
|
|
+ @ApiOperation(value = "保存")
|
|
|
|
+ @RequestMapping(value = "createSaasProject")
|
|
|
|
+ public ResponseResult createSaasProject(@RequestBody @Validated SaasProjectCreateVO createVO) {
|
|
|
|
+ SaasProject saasProject = new SaasProject();
|
|
|
|
+ BeanUtils.copyProperties(createVO, saasProject);
|
|
|
|
+ saasProject.setUpdateUser(createVO.getAccountId());
|
|
|
|
+ saasProject.setId(null);
|
|
|
|
+ if (StringUtil.isBlank(createVO.getAreaId())) {
|
|
|
|
+ // 查询出未分区的区域ID
|
|
|
|
+ SaasArea areaOne = this.saasAreaService.getAreaOne(null, createVO.getGroupCode(), SaasCommonConstant.STR_STATUS_MINUS_1, null);
|
|
|
|
+ if (areaOne == null) {
|
|
|
|
+ return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "此项目所属集团不存在未分区区域,请检查");
|
|
|
|
+ }
|
|
|
|
+ saasProject.setAreaId(areaOne.getId());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 验证集团编码与项目ID的联合唯一性
|
|
|
|
+ boolean exists = this.saasProjectService.validProjectData(saasProject, false);
|
|
|
|
+ if (!exists) {
|
|
|
|
+ return ResponseResultUtil.errorResult(ResponseCode.C0341.getCode(), "项目ID、项目本地编码、项目名称都必须唯一");
|
|
|
|
+ }
|
|
|
|
+ return this.saasGroupProjectHandler.createSaasProject(saasProject, createVO.getAccountId());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 更新
|
|
|
|
+ */
|
|
|
|
+ @ApiOperation(value = "更新")
|
|
|
|
+ @RequestMapping(value = "updateSaasProject")
|
|
|
|
+ public ResponseResult updateSaasProject(@RequestBody @Validated SaasProjectCreateVO createVO) {
|
|
|
|
+ if (StringUtil.isBlank(createVO.getId())) {
|
|
|
|
+ return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "主键ID不可为空");
|
|
|
|
+ }
|
|
|
|
+ SaasProject saasProject = new SaasProject();
|
|
|
|
+ BeanUtils.copyProperties(createVO, saasProject);
|
|
|
|
+ saasProject.setUpdateUser(createVO.getAccountId());
|
|
|
|
+ if (SaasCommonConstant.STR_STATUS_MINUS_1.equals(createVO.getAreaId())) {
|
|
|
|
+ // 查询出未分区的区域ID
|
|
|
|
+ SaasArea areaOne = this.saasAreaService.getAreaOne(null, createVO.getGroupCode(), SaasCommonConstant.STR_STATUS_MINUS_1, null);
|
|
|
|
+ if (areaOne == null) {
|
|
|
|
+ return ResponseResultUtil.errorResult(ResponseCode.A0400.getCode(), "此项目所属集团不存在未分区区域,请检查");
|
|
|
|
+ }
|
|
|
|
+ saasProject.setAreaId(areaOne.getId());
|
|
|
|
+ }
|
|
|
|
+ // 验证集团编码与项目ID的联合唯一性
|
|
|
|
+ boolean exists = this.saasProjectService.validProjectData(saasProject, true);
|
|
|
|
+ if (!exists) {
|
|
|
|
+ return ResponseResultUtil.errorResult(ResponseCode.C0341.getCode(), "项目名称或项目ID或项目本地编码已存在");
|
|
|
|
+ }
|
|
|
|
+ LambdaUpdateWrapper<SaasProject> updateWrapper = new SaasProject.Builder().createUpdateWrapper()
|
|
|
|
+ .idEq(createVO.getId()).groupCodeEq(createVO.getGroupCode()).projectIdEq(createVO.getProjectId())
|
|
|
|
+ .validEq(SaasCommonConstant.STATUS_1).builderUpdateWrapper();
|
|
|
|
+ exists = this.saasProjectService.update(saasProject, updateWrapper);
|
|
|
|
+ return exists ? ResponseResultUtil.successResult("更新成功") : ResponseResultUtil.errorResult("更新失败");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 批量变更项目所属区域
|
|
|
|
+ */
|
|
|
|
+ @ApiOperation(value = "批量变更项目所属区域")
|
|
|
|
+ @RequestMapping(value = "batchUpdateProjectArea")
|
|
|
|
+ public ResponseResult batchUpdateProjectArea(@RequestBody @Validated SaasProjectAreaUpdateVO batchVO) {
|
|
|
|
+ if (batchVO.getProjectIds().size() > 100) {
|
|
|
|
+ return ResponseResultUtil.errorResult(ResponseCode.A0402.getCode(), "项目ID过多,请多次处理");
|
|
|
|
+ }
|
|
|
|
+ SaasProject saasProject = new SaasProject();
|
|
|
|
+ BeanUtils.copyProperties(batchVO, saasProject);
|
|
|
|
+ saasProject.setUpdateUser(batchVO.getAccountId());
|
|
|
|
+ boolean result = this.saasProjectService.batchUpdateProjectArea(saasProject, batchVO.getProjectIds());
|
|
|
|
+ return result ? ResponseResultUtil.successResult("更新成功") : ResponseResultUtil.errorResult("更新失败");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 物理删除
|
|
|
|
+ */
|
|
|
|
+ /*@ApiOperation(value = "删除")
|
|
|
|
+ @RequestMapping(value = "deleteSaasProject")
|
|
|
|
+ public ResponseResult deleteSaasProject(@RequestBody SaasProject saasProject) {
|
|
|
|
+ boolean result = saasProjectService.removeById(saasProject.getId());
|
|
|
|
+ return result ? ResponseResultUtil.successResult("删除成功") : ResponseResultUtil.errorResult("删除失败");
|
|
|
|
+ }*/
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /******************************************************** upload file *****************************************************/
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 项目数据上传模板下载
|
|
|
|
+ *
|
|
|
|
+ * @param baseVO
|
|
|
|
+ * @param response
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ @ApiOperation(value = "项目数据上传模板下载")
|
|
|
|
+ @RequestMapping(value = "downloadProjectTemplate")
|
|
|
|
+ public void downloadProjectTemplate(@RequestBody @Validated BaseUserModel baseVO, HttpServletResponse response) {
|
|
|
|
+ // 优先判断是否存在集团信息
|
|
|
|
+ SaasGroupQueryVO groupVO = new SaasGroupQueryVO();
|
|
|
|
+ List<SaasGroup> list = this.saasGroupProjectHandler.querySaasGroupList(groupVO);
|
|
|
|
+ if (CollectionUtil.isEmpty(list)) {
|
|
|
|
+ throw new BusinessException("集团信息为空,请先添加集团");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ExcelWriter excelWriter = null;
|
|
|
|
+ try {
|
|
|
|
+ response.setContentType("application/vnd.ms-excel");
|
|
|
|
+ String encode = StandardCharsets.UTF_8.name();
|
|
|
|
+ response.setCharacterEncoding(encode);
|
|
|
|
+ // 防止中文乱码
|
|
|
|
+ String fileName = URLEncoder.encode("仪表批量上传模板", encode);
|
|
|
|
+ response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
|
|
|
|
+
|
|
|
|
+ EasyExcel.write(response.getOutputStream(), SaasProjectExcel.class)
|
|
|
|
+ .registerWriteHandler(new SaasProjectSheetWriteHandler(saasGroupProjectHandler, saasAreaProjectHandler))
|
|
|
|
+ .sheet("传项目信息").doWrite(SaasProjectExcel.getDemoData());
|
|
|
|
+
|
|
|
|
+ /* excelWriter = EasyExcel.write(response.getOutputStream()).build();
|
|
|
|
+ WriteSheet writeSheetOne = EasyExcel.writerSheet(0, SaasProjectExcel.SHEET_NAME_0)
|
|
|
|
+ .registerWriteHandler(new SaasProjectSheetWriteHandler(saasGroupProjectHandler, saasAreaProjectHandler))
|
|
|
|
+ .head(SaasProjectExcel.class).build();
|
|
|
|
+ excelWriter.write(SaasProjectExcel.getDemoData(), writeSheetOne);*/
|
|
|
|
+ } catch(Exception e) {
|
|
|
|
+ log.error("项目数据上传模板下载失败", e);
|
|
|
|
+ } finally {
|
|
|
|
+ if (excelWriter != null) {
|
|
|
|
+ excelWriter.finish();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 项目数据上传
|
|
|
|
+ *
|
|
|
|
+ * @param model
|
|
|
|
+ * @param file
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ @IgnoreLog
|
|
|
|
+ @ApiOperation(value = "项目数据直接上传")
|
|
|
|
+ @RequestMapping(value = "directUploadProjectData")
|
|
|
|
+ public ResponseResult directUploadProjectData(@ModelAttribute @Validated BaseUserModel model, MultipartFile file) {
|
|
|
|
+ try {
|
|
|
|
+ if (file == null) {
|
|
|
|
+ return ResponseResultUtil.errorResult("未找到对应文件");
|
|
|
|
+ }
|
|
|
|
+ EasyExcel.read(file.getInputStream(), SaasProjectExcel.class,
|
|
|
|
+ new SaasProjectExcelDataHandler(model, saasAreaService, saasProjectService)).sheet(0).doRead();
|
|
|
|
+ return ResponseResultUtil.successResult();
|
|
|
|
+ } catch(IOException e) {
|
|
|
|
+ log.error("传感器数据流读取失败", e);
|
|
|
|
+ }
|
|
|
|
+ return ResponseResultUtil.errorResult();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|