package com.persagy.account.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.account.manage.SaasAreaProjectHandler; import com.persagy.account.manage.SaasAuthHandler; import com.persagy.account.manage.SaasGroupProjectHandler; import com.persagy.account.manage.SaasProjectExcelDataHandler; import com.persagy.account.manage.SaasProjectSheetWriteHandler; import com.persagy.account.pojo.dto.SaasAccountProject; import com.persagy.account.pojo.dto.SaasArea; import com.persagy.account.pojo.dto.SaasGroup; import com.persagy.account.pojo.dto.SaasProject; import com.persagy.account.pojo.vo.BaseGroupVO; import com.persagy.account.pojo.vo.group.SaasGroupQueryVO; import com.persagy.account.pojo.vo.project.SaasProjectAreaUpdateVO; import com.persagy.account.pojo.vo.project.SaasProjectCreateVO; import com.persagy.account.pojo.vo.project.SaasProjectExcel; import com.persagy.account.pojo.vo.project.SaasProjectPageVO; import com.persagy.account.pojo.vo.project.SaasProjectQueryVO; import com.persagy.account.service.ISaasAccountProjectService; import com.persagy.account.service.ISaasAreaService; import com.persagy.account.service.ISaasGroupService; import com.persagy.account.service.ISaasProjectService; 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.security.constant.CipherConstants; 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 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 queryWrapper = new SaasAccountProject.Builder().createQueryWrapper() .groupCodeEq(queryVO.getGroupCode()).accountIdEq(queryVO.getAccountId()).builderQueryWrapper(); List 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 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 groups = null; if (StringUtil.isBlank(model.getGroupCode())) { // 获取所有集团 LambdaQueryWrapper 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.C0320.getCode(), "集团信息不存在"); } for (SaasGroup saasGroup : groups) { this.saasAreaProjectHandler.queryAreaProjectTree(saasGroup, model.isExcludeEmptyArea()); } 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 authMap = this.saasAuthHandler.validAccountAuth(queryVO.getAccountId(), queryVO.getGroupCode()); if (StringUtil.isNotBlank(authMap.get(CipherConstants.GROUP_CODE))) { queryVO.setGroupCode(authMap.get(CipherConstants.GROUP_CODE)); } // 添加数据访问控制,账号可见域,0-所有集团项目,1-单集团所有项目(此时,集团编码需存在),2-其他 String accountType = authMap.get(SaasCommonConstant.ACCOUNT_TYPE); List groups = this.saasAuthHandler.getAllowGroupList(queryVO.getAccountId(), queryVO.getGroupCode(), accountType); // 查询区域项目树 for (SaasGroup saasGroup : groups) { List areaList = this.saasAuthHandler.getAllowAreaList(queryVO.getAccountId(), queryVO.getGroupCode(), accountType, queryVO.isExcludeEmptyArea()); saasGroup.setAreas(areaList); this.saasAreaProjectHandler.queryAllowAreaProjectTree(queryVO, saasGroup, areaList); if (queryVO.isExcludeEmptyArea()) { // 获取未分区下的可见项目 SaasArea areaOne = this.saasAreaService.getAreaOne(null, saasGroup.getGroupCode(), SaasCommonConstant.STR_STATUS_MINUS_1, null); if (areaOne != null) { List projects = this.saasAuthHandler.getAllowProjectList(queryVO.getAccountId(), queryVO.getGroupCode(), areaOne.getId()); saasGroup.setProjects(projects); } } } 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 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 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(); } }