From 833a58155ffbea8bd84c46557cae3b617618812c Mon Sep 17 00:00:00 2001 From: pengjie <17373303529@163.com> Date: Thu, 7 Mar 2024 17:10:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/zhgd/config/CorsConfig.java | 1 + .../controller/admin/FileController.java | 165 +++++++++--------- .../admin/SystemUserAuthController.java | 139 ++++++++++++++- .../admin/SystemUserOpController.java | 21 ++- .../project/EngineeringController.java | 4 +- .../modules/basicdata/entity/Engineering.java | 5 + .../service/impl/EngineeringServiceImpl.java | 2 +- .../service/impl/SystemRoleServiceImpl.java | 2 +- .../service/impl/SystemUserServiceImpl.java | 47 ++++- .../basicdata/vo/SystemUserSyncVo.java | 3 + .../api/惠州项目管理政务版/在建项目指标.ms | 4 +- .../magic/api/惠州项目管理政务版/投资管理.ms | 24 +-- .../环境报警列表(最近20条).ms | 4 +- .../magic/api/监管决策BI/查询工程分类统计.ms | 64 ++++++- .../api/监管决策BI/顶部查询工程统计信息.ms | 4 +- tree.txt | Bin 84728 -> 0 bytes 16 files changed, 365 insertions(+), 124 deletions(-) delete mode 100644 tree.txt diff --git a/src/main/java/com/zhgd/config/CorsConfig.java b/src/main/java/com/zhgd/config/CorsConfig.java index 233e0b6..c81a1a3 100644 --- a/src/main/java/com/zhgd/config/CorsConfig.java +++ b/src/main/java/com/zhgd/config/CorsConfig.java @@ -16,6 +16,7 @@ public class CorsConfig{ config.setAllowCredentials(true); config.addAllowedOrigin("*"); // config.addAllowedOrigin("http://10.75.253.12:6090"); +// config.addAllowedOrigin("http://183.63.230.59:6090"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/admin/FileController.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/admin/FileController.java index c20a2bb..1cb7664 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/admin/FileController.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/admin/FileController.java @@ -1,6 +1,5 @@ package com.zhgd.xmgl.modules.basicdata.controller.admin; -import cn.xuyanwu.spring.file.storage.FileInfo; import cn.xuyanwu.spring.file.storage.FileStorageService; import com.zhgd.annotation.OperLog; import com.zhgd.file.FileUtil; @@ -17,7 +16,7 @@ import org.springframework.web.multipart.MultipartFile; import springfox.documentation.annotations.ApiIgnore; import javax.servlet.http.HttpServletResponse; -import java.net.URLEncoder; +import java.util.Locale; import java.util.Map; /** @@ -42,41 +41,56 @@ public class FileController { /** * 上传文件到指定存储平台,成功返回文件信息 */ - @OperLog(operModul = "文件管理", operType = "文件上传", operDesc = "文件上传") - @ApiOperation(value = "文件上传", notes = "文件上传", httpMethod="POST") - @PostMapping("/upload") - public Result uploadPlatform(MultipartFile file) { - return Result.success(fileStorageService.of(file) - .setPlatform("minio-1") //使用指定的存储平台 - .upload()); - } +// @OperLog(operModul = "文件管理", operType = "文件上传", operDesc = "文件上传") +// @ApiOperation(value = "文件上传", notes = "文件上传", httpMethod="POST") +// @PostMapping("/upload") +// public Result uploadPlatform(MultipartFile file) { +// return Result.success(fileStorageService.of(file) +// .setPlatform("minio-1") //使用指定的存储平台 +// .upload()); +// } /** * 上传文件到本地,成功返回文件信息 */ -// @OperLog(operModul = "文件管理", operType = "文件上传", operDesc = "文件上传") -// @ApiOperation(value = "文件上传", notes = "文件上传", httpMethod="POST") -// @PostMapping("/upload") -// public Result> upload(MultipartFile file) { -// String[] FILE_SUFFIX_SUPPORT ={".jsp",".php",".asp",".aspx"}; -// // 校验文件是否为空 -// if (file == null) { -// throw new RuntimeException("文件不能为空!"); -// } -// //得到文件名 -// String originalFilename = file.getOriginalFilename(); -// // 校验文件后缀 -// if (!originalFilename.contains(".")) { -// throw new RuntimeException("文件不能没有后缀!"); -// } -// String suffix = originalFilename.substring(originalFilename.lastIndexOf('.')); -// for (String s : FILE_SUFFIX_SUPPORT) { -// //转换为小写比较,Locale.ROOT为区域转换规则可不写 -// if (s.equals(suffix.toLowerCase(Locale.ROOT))) { -// throw new RuntimeException("请上传正常的文件!"); -// } -// } -// return Result.success(fileDetailService.upload(file)); + @OperLog(operModul = "文件管理", operType = "文件上传", operDesc = "文件上传") + @ApiOperation(value = "文件上传", notes = "文件上传", httpMethod="POST") + @PostMapping("/upload") + public Result> upload(MultipartFile file) { + String[] FILE_SUFFIX_SUPPORT ={".jsp",".php",".asp",".aspx"}; + // 校验文件是否为空 + if (file == null) { + throw new RuntimeException("文件不能为空!"); + } + //得到文件名 + String originalFilename = file.getOriginalFilename(); + // 校验文件后缀 + if (!originalFilename.contains(".")) { + throw new RuntimeException("文件不能没有后缀!"); + } + String suffix = originalFilename.substring(originalFilename.lastIndexOf('.')); + for (String s : FILE_SUFFIX_SUPPORT) { + //转换为小写比较,Locale.ROOT为区域转换规则可不写 + if (s.equals(suffix.toLowerCase(Locale.ROOT))) { + throw new RuntimeException("请上传正常的文件!"); + } + } + return Result.success(fileDetailService.upload(file)); + } + + /** + * 上传BASE64文件 + */ +// @OperLog(operModul = "文件管理", operType = "BASE64文件上传", operDesc = "BASE64文件上传") +// @ApiOperation(value = "BASE64文件上传", notes = "BASE64文件上传", httpMethod="POST") +// @ApiImplicitParam(name = "base64", value = "BASE64字符串", required = true, dataType = "String") +// @PostMapping("/uploadBase64") +// public Result uploadBase64(@ApiIgnore @RequestBody Map map) { +// String base64 = MapUtils.getString(map, "base64"); +// MultipartFile multipartFile = FileUtil.base64toMultipart(base64, "text.jpg"); +// return Result.success(fileStorageService.of(multipartFile) +// .setPlatform("minio-1") //使用指定的存储平台 +// .upload()); // } /** @@ -86,63 +100,31 @@ public class FileController { @ApiOperation(value = "BASE64文件上传", notes = "BASE64文件上传", httpMethod="POST") @ApiImplicitParam(name = "base64", value = "BASE64字符串", required = true, dataType = "String") @PostMapping("/uploadBase64") - public Result uploadBase64(@ApiIgnore @RequestBody Map map) { + public Result> uploadBase64(@ApiIgnore @RequestBody Map map) { String base64 = MapUtils.getString(map, "base64"); MultipartFile multipartFile = FileUtil.base64toMultipart(base64, "text.jpg"); - return Result.success(fileStorageService.of(multipartFile) - .setPlatform("minio-1") //使用指定的存储平台 - .upload()); + return Result.success(fileDetailService.upload(multipartFile)); } -// /** -// * 上传BASE64文件 -// */ -// @OperLog(operModul = "文件管理", operType = "BASE64文件上传", operDesc = "BASE64文件上传") -// @ApiOperation(value = "BASE64文件上传", notes = "BASE64文件上传", httpMethod="POST") -// @ApiImplicitParam(name = "base64", value = "BASE64字符串", required = true, dataType = "String") -// @PostMapping("/uploadBase64") -// public Result> uploadBase64(@ApiIgnore @RequestBody Map map) { -// String base64 = MapUtils.getString(map, "base64"); -// MultipartFile multipartFile = FileUtil.base64toMultipart(base64, "text.jpg"); -// return Result.success(fileDetailService.upload(multipartFile)); -// } - /** * 下载文件 */ - @OperLog(operModul = "文件管理", operType = "文件下载", operDesc = "文件下载") - @ApiOperation(value = "文件下载", notes = "文件下载", httpMethod="POST") - @ApiImplicitParam(name = "fileUrl", value = "文件路径", paramType = "body", dataType = "String") - @PostMapping("/download") - public void download(@ApiIgnore @RequestBody Map map, HttpServletResponse response) throws Exception { - // 获取文件信息 - String fileUrl = MapUtils.getString(map, "fileUrl"); - FileInfo fileInfo = fileStorageService.getFileInfoByUrl(fileUrl); - if (null == fileInfo) { - throw new Exception("缩略图文件下载失败,文件不存在!fileInfo:" + fileInfo); - } - response.setHeader("Content-disposition", "attachment; filename=" + fileUrl.substring(fileUrl.lastIndexOf("/") + 1)); - response.setContentType("application/octet-stream");// 定义输出类型 - fileStorageService.download(fileInfo).outputStream(response.getOutputStream()); - } - - /** - * 获取预览文件流 - */ - @OperLog(operModul = "文件管理", operType = "获取预览文件流", operDesc = "获取预览文件流") - @ApiOperation(value = "获取预览文件流", notes = "获取预览文件流", httpMethod="POST") - @GetMapping("/preview") - public void download(@RequestParam(value = "fileUrl", required = true) String fileUrl, HttpServletResponse response) throws Exception { - // 获取文件信息 - FileInfo fileInfo = fileStorageService.getFileInfoByUrl(fileUrl); - if (null == fileInfo) { - throw new Exception("缩略图文件预览失败,文件不存在!fileInfo:" + fileInfo); - } - response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileInfo.getOriginalFilename(), "UTF-8")); - response.setContentType("application/octet-stream");// 定义输出类型 - fileStorageService.download(fileInfo).outputStream(response.getOutputStream()); - } +// @OperLog(operModul = "文件管理", operType = "文件下载", operDesc = "文件下载") +// @ApiOperation(value = "文件下载", notes = "文件下载", httpMethod="POST") +// @ApiImplicitParam(name = "fileUrl", value = "文件路径", paramType = "body", dataType = "String") +// @PostMapping("/download") +// public void download(@ApiIgnore @RequestBody Map map, HttpServletResponse response) throws Exception { +// // 获取文件信息 +// String fileUrl = MapUtils.getString(map, "fileUrl"); +// FileInfo fileInfo = fileStorageService.getFileInfoByUrl(fileUrl); +// if (null == fileInfo) { +// throw new Exception("缩略图文件下载失败,文件不存在!fileInfo:" + fileInfo); +// } +// response.setHeader("Content-disposition", "attachment; filename=" + fileUrl.substring(fileUrl.lastIndexOf("/") + 1)); +// response.setContentType("application/octet-stream");// 定义输出类型 +// fileStorageService.download(fileInfo).outputStream(response.getOutputStream()); +// } /** * 获取预览文件流 @@ -152,6 +134,23 @@ public class FileController { // @GetMapping("/preview") // public void download(@RequestParam(value = "fileUrl", required = true) String fileUrl, HttpServletResponse response) throws Exception { // // 获取文件信息 -// fileDetailService.download(fileUrl, response); +// FileInfo fileInfo = fileStorageService.getFileInfoByUrl(fileUrl); +// if (null == fileInfo) { +// throw new Exception("缩略图文件预览失败,文件不存在!fileInfo:" + fileInfo); +// } +// response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileInfo.getOriginalFilename(), "UTF-8")); +// response.setContentType("application/octet-stream");// 定义输出类型 +// fileStorageService.download(fileInfo).outputStream(response.getOutputStream()); // } + + /** + * 获取预览文件流 + */ + @OperLog(operModul = "文件管理", operType = "获取预览文件流", operDesc = "获取预览文件流") + @ApiOperation(value = "获取预览文件流", notes = "获取预览文件流", httpMethod="POST") + @GetMapping("/preview") + public void download(@RequestParam(value = "fileUrl", required = true) String fileUrl, HttpServletResponse response) throws Exception { + // 获取文件信息 + fileDetailService.download(fileUrl, response); + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/admin/SystemUserAuthController.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/admin/SystemUserAuthController.java index 8b0adac..1fc8812 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/admin/SystemUserAuthController.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/admin/SystemUserAuthController.java @@ -9,12 +9,15 @@ import com.zhgd.jeecg.common.api.vo.Result; import com.zhgd.jeecg.common.constant.CommonConstant; import com.zhgd.mybatis.Aes; import com.zhgd.xmgl.modules.basicdata.dto.SystemUserAuthDto; -import com.zhgd.xmgl.modules.basicdata.entity.EnterpriseMain; -import com.zhgd.xmgl.modules.basicdata.entity.Government; -import com.zhgd.xmgl.modules.basicdata.entity.SystemUser; -import com.zhgd.xmgl.modules.basicdata.entity.SystemUserDataScope; +import com.zhgd.xmgl.modules.basicdata.entity.*; +import com.zhgd.xmgl.modules.basicdata.mapper.BaseActionMapper; +import com.zhgd.xmgl.modules.basicdata.mapper.SystemUserRoleMapper; import com.zhgd.xmgl.modules.basicdata.service.*; import com.zhgd.xmgl.modules.basicdata.vo.UserLoginVo; +import com.zhgd.xmgl.modules.safety.entity.InspectRecord; +import com.zhgd.xmgl.modules.safety.entity.ProjectSubItem; +import com.zhgd.xmgl.modules.safety.service.IInspectRecordService; +import com.zhgd.xmgl.modules.safety.service.IProjectSubItemService; import com.zhgd.xmgl.security.JwtTokenProvider; import com.zhgd.xmgl.security.SecurityUser; import com.zhgd.xmgl.security.SecurityUtil; @@ -32,8 +35,7 @@ import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; import javax.servlet.http.HttpServletRequest; -import java.util.Date; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; @@ -67,6 +69,12 @@ public class SystemUserAuthController { @Autowired private ISystemUserDataScopeService systemUserDataScopeService; + @Autowired + private BaseActionMapper baseActionMapper; + + @Autowired + private SystemUserRoleMapper systemUserRoleMapper; + /** * 用户登录 * @return @@ -267,4 +275,123 @@ public class SystemUserAuthController { ssoToken = ssoToken.replace("-", "+").replace("_", "/"); System.out.println(Aes.decrypt(ssoToken, "ssologin66!@#$%^")); } + + @Autowired + private IEngineeringService engineeringService; + + @Autowired + private IProjectSubItemService projectSubItemService; + + @Autowired + private IInspectRecordService inspectRecordService; + + @Operation(summary = "获取用户代办事项", description = "验证token的有效性", tags = {"user"}) + @GetMapping("/getToDoItems") + public RestResult>> getToDoItems() { + List> listMap = new ArrayList<>(); + SecurityUser user = SecurityUtil.getUser(); + Set actionCodes = new HashSet<>(); + if (user.isManager() && user.getAccountType() != 3) { + actionCodes = baseActionMapper.getActionCodes(user.getAccountType()).stream() + .map(a -> a.getActionCode()).collect(Collectors.toSet()); + } else { + SystemUserRole systemUserRole = systemUserRoleMapper.selectOne(Wrappers.lambdaQuery().eq(SystemUserRole::getUserId, user.getUserId())); + if (systemUserRole != null) { + String roleId = systemUserRole.getRoleId(); + actionCodes = baseActionMapper.getActionCodeByRole(roleId).stream() + .map(a -> a.getActionCode()).collect(Collectors.toSet()); + } + } + List engineerings = engineeringService.list(); + // 质量初审 + if (actionCodes.contains("quality_inspect_examine")) { + List list = inspectRecordService.list(Wrappers.lambdaQuery() + .eq(InspectRecord::getType, 2) + .eq(InspectRecord::getState, 3).eq(InspectRecord::getLevel, 1)); + for (InspectRecord inspectRecord : list) { + Map map = new HashMap<>(); + map.put("type", "质量管理初审"); + map.put("projectName", engineerings.stream().filter(e -> e.getEngineeringSn().equals(inspectRecord.getEngineeringSn())) + .collect(Collectors.toList()).get(0).getEngineeringName()); + listMap.add(map); + } + } + // 质量终审 + if (actionCodes.contains("quality_inspect_check")) { + List list = inspectRecordService.list(Wrappers.lambdaQuery() + .eq(InspectRecord::getType, 2) + .eq(InspectRecord::getState, 3).eq(InspectRecord::getLevel, 2)); + for (InspectRecord inspectRecord : list) { + Map map = new HashMap<>(); + map.put("type", "质量管理终审"); + map.put("projectName", engineerings.stream().filter(e -> e.getEngineeringSn().equals(inspectRecord.getEngineeringSn())) + .collect(Collectors.toList()).get(0).getEngineeringName()); + listMap.add(map); + } + } + // 质量整改 + if (actionCodes.contains("quality_inspect_update")) { + List list = inspectRecordService.list(Wrappers.lambdaQuery() + .eq(InspectRecord::getType, 2) + .eq(InspectRecord::getState, 2)); + for (InspectRecord inspectRecord : list) { + Map map = new HashMap<>(); + map.put("type", "质量问题整改"); + map.put("projectName", engineerings.stream().filter(e -> e.getEngineeringSn().equals(inspectRecord.getEngineeringSn())) + .collect(Collectors.toList()).get(0).getEngineeringName()); + listMap.add(map); + } + } + // 安全初审 + if (actionCodes.contains("safe_inspect_examine")) { + List list = inspectRecordService.list(Wrappers.lambdaQuery() + .eq(InspectRecord::getType, 1) + .eq(InspectRecord::getState, 3).eq(InspectRecord::getLevel, 1)); + for (InspectRecord inspectRecord : list) { + Map map = new HashMap<>(); + map.put("type", "安全管理初审"); + map.put("projectName", engineerings.stream().filter(e -> e.getEngineeringSn().equals(inspectRecord.getEngineeringSn())) + .collect(Collectors.toList()).get(0).getEngineeringName()); + listMap.add(map); + } + } + // 安全终审 + if (actionCodes.contains("safe_inspect_check")) { + List list = inspectRecordService.list(Wrappers.lambdaQuery() + .eq(InspectRecord::getType, 1) + .eq(InspectRecord::getState, 3).eq(InspectRecord::getLevel, 2)); + for (InspectRecord inspectRecord : list) { + Map map = new HashMap<>(); + map.put("type", "安全管理终审"); + map.put("projectName", engineerings.stream().filter(e -> e.getEngineeringSn().equals(inspectRecord.getEngineeringSn())) + .collect(Collectors.toList()).get(0).getEngineeringName()); + listMap.add(map); + } + } + // 安全整改 + if (actionCodes.contains("safe_inspect_update")) { + List list = inspectRecordService.list(Wrappers.lambdaQuery() + .eq(InspectRecord::getType, 1) + .eq(InspectRecord::getState, 2)); + for (InspectRecord inspectRecord : list) { + Map map = new HashMap<>(); + map.put("type", "安全问题整改"); + map.put("projectName", engineerings.stream().filter(e -> e.getEngineeringSn().equals(inspectRecord.getEngineeringSn())) + .collect(Collectors.toList()).get(0).getEngineeringName()); + listMap.add(map); + } + } + // 施工节点审批 + if (actionCodes.contains("sub_item_examine")) { + List list = projectSubItemService.list(Wrappers.lambdaQuery().eq(ProjectSubItem::getApprovalStatus, 0)); + for (ProjectSubItem projectSubItem : list) { + Map map = new HashMap<>(); + map.put("type", "施工节点审批"); + map.put("projectName", engineerings.stream().filter(e -> e.getEngineeringSn().equals(projectSubItem.getEngineeringSn())) + .collect(Collectors.toList()).get(0).getEngineeringName()); + listMap.add(map); + } + } + return RestResult.success().data(listMap); + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/admin/SystemUserOpController.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/admin/SystemUserOpController.java index 6093e7f..b2826c2 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/admin/SystemUserOpController.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/admin/SystemUserOpController.java @@ -98,7 +98,9 @@ public class SystemUserOpController { if (systemUserEntity == null) { result.error500("未找到对应实体"); } else { - boolean ok = systemUserService.removeInfo(systemUserEntity.getUserId()); + systemUserRoleService.remove(Wrappers.lambdaQuery() + .eq(SystemUserRole::getUserId, systemUserEntity.getUserId())); + boolean ok = systemUserService.removeById(systemUserEntity.getUserId()); if (ok) { result.success("删除成功!"); } @@ -123,7 +125,22 @@ public class SystemUserOpController { systemUserVo.setRoleId(systemUserOpVo.getRole()); systemUserVo.setState(systemUserOpVo.getEnable()); systemUserVo.setUserTel(systemUserOpVo.getNumPhone()); - systemUserService.updateInfo(systemUserVo); + SystemUser systemUser1 = systemUserService.getOne(Wrappers.lambdaQuery().eq(SystemUser::getAccount, systemUserOpVo.getName()) + .ne(SystemUser::getUserId, systemUserOpVo.getId())); + if (systemUser1 != null) { + throw new CustomException("该用户账号已被使用!"); + } + SystemUser systemUser = new SystemUser(); + BeanUtils.copyProperties(systemUserVo, systemUser); + systemUser.setShowPassword(systemUser.getPassword()); + systemUserService.updateById(systemUser); + //新增用户角色 + systemUserRoleService.remove(Wrappers.lambdaQuery() + .eq(SystemUserRole::getUserId, systemUser.getUserId())); + SystemUserRole systemUserRole = new SystemUserRole(); + systemUserRole.setRoleId(systemUserVo.getRoleId()); + systemUserRole.setUserId(systemUser.getUserId()); + systemUserRoleService.save(systemUserRole); result.success("修改成功!"); } return result; diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/project/EngineeringController.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/project/EngineeringController.java index fec3f14..b9beb68 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/project/EngineeringController.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/project/EngineeringController.java @@ -13,14 +13,12 @@ import com.zhgd.xmgl.modules.basicdata.entity.Engineering; import com.zhgd.xmgl.modules.basicdata.service.IEngineeringService; import com.zhgd.xmgl.modules.basicdata.statistics.EngineeringStat; import com.zhgd.xmgl.modules.basicdata.vo.EngineeringVo; -import com.zhgd.xmgl.valid.AddGroup; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -74,7 +72,7 @@ public class EngineeringController { @OperLog(operModul = "工程管理", operType = "新增", operDesc = "项目报监") @ApiOperation(value = " 项目报监", notes = "项目报监", httpMethod = "POST") @PostMapping(value = "/add") - public Result add(@RequestBody @Validated(AddGroup.class) EngineeringVo engineeringVo) { + public Result add(@RequestBody EngineeringVo engineeringVo) { Result result = new Result(); Engineering engineering = engineeringService.getOne(Wrappers.lambdaQuery() .eq(Engineering::getEngineeringName, engineeringVo.getEngineeringName())); diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/entity/Engineering.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/entity/Engineering.java index 0106d8c..1ac6622 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/entity/Engineering.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/entity/Engineering.java @@ -284,6 +284,11 @@ public class Engineering implements Serializable { */ @ApiModelProperty(value = "工程状态(1:未开工;2:在建;3:在建.普通停工;4:在建.处罚停工;5:在建.完工;6:待竣工;7:竣工;8:其他)") private Integer state; + /** + * 工程性质 + */ + @ApiModelProperty(value = "工程性质") + private Integer nature; /** * 工程状态名称 */ diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/EngineeringServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/EngineeringServiceImpl.java index da33977..aafb7b9 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/EngineeringServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/EngineeringServiceImpl.java @@ -103,7 +103,7 @@ public class EngineeringServiceImpl extends ServiceImpllambdaQuery() @@ -159,14 +160,54 @@ public class SystemUserServiceImpl extends ServiceImpllambdaQuery() .eq(SystemUserRole::getUserId, userId)); - return this.removeById(userId); + boolean flag = this.removeById(userId); + if (flag) { + SecurityUser user = SecurityUtil.getUser(); + SystemUserSyncVo systemUserSyncVo = new SystemUserSyncVo(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("uid", user.getAccount()); + jsonObject.put("exp", DateUtil.offsetMinute(new Date(), 10).getTime()); + systemUserSyncVo.setToken(Aes.hzEncrypt(JSON.toJSONString(jsonObject))); + systemUserSyncVo.setId(systemUser.getAccount()); + String result = asyncAttendance.syncUser(3, systemUserSyncVo); + if (result != null) { + JSONObject object = JSONObject.parseObject(result); + if (object.getInteger("code") != 200) { + throw new CustomException(object.getString("msg")); + } + } + } + return flag; } @Override diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/vo/SystemUserSyncVo.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/vo/SystemUserSyncVo.java index 50e58f3..741ce32 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/vo/SystemUserSyncVo.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/vo/SystemUserSyncVo.java @@ -11,6 +11,9 @@ public class SystemUserSyncVo { @ApiModelProperty(value = "token") private String token; + @ApiModelProperty(value = "用户ID(对应account属性,大平台主键ID)") + private String id; + @ApiModelProperty(value = "登录账号") private String uid; diff --git a/src/main/resources/magic/api/惠州项目管理政务版/在建项目指标.ms b/src/main/resources/magic/api/惠州项目管理政务版/在建项目指标.ms index 7f0b923..5ea07af 100644 --- a/src/main/resources/magic/api/惠州项目管理政务版/在建项目指标.ms +++ b/src/main/resources/magic/api/惠州项目管理政务版/在建项目指标.ms @@ -5,7 +5,7 @@ "groupId" : "1f3d3e5b9fe340bab84de67b0de08f44", "name" : "在建项目指标", "createTime" : null, - "updateTime" : 1693367757978, + "updateTime" : 1706864647618, "lock" : null, "createBy" : null, "updateBy" : "admin", @@ -34,4 +34,4 @@ "responseBodyDefinition" : null } ================================ -return db.selectOne("SELECT IFNULL(SUM(IF(is_important = 1 AND examine_state = 3, 1, 0)), 0) importance, IFNULL(SUM(IF(engineering_type = 2 AND state = 2 AND examine_state = 3, 1, 0)), 0) bridge, IFNULL(SUM(IF(engineering_type = 3 AND state = 2 AND examine_state = 3, 1, 0)), 0) tunnel, IFNULL(SUM(IF(engineering_type = 4 AND state = 2 AND examine_state = 3, 1, 0)), 0) station, IFNULL(SUM(IF(state = 8, 1, 0)), 0) rebuild, IFNULL(SUM(IF(state = 9, 1, 0)), 0) extension, IFNULL(SUM(IF(state IN(2, 8, 9), 1, 0)), 0) total, IFNULL(SUM(IF(state = 7, 1, 0)), 0) finished, IFNULL(SUM(IF(state in (3, 4), 1, 0)), 0) shutdown, IFNULL(SUM(IF(state in (2, 3, 4, 7), 1, 0)), 0) total1,(SELECT COUNT( * ) FROM engineering WHERE YEAR(examine_time) = YEAR(CURDATE()) AND examine_state = 3) newBuild FROM engineering WHERE #project ") \ No newline at end of file +return db.selectOne("SELECT COUNT( id ) num,SUM( engineering_cost ) cost,IFNULL( SUM( IF ( is_important = 1 AND examine_state = 3, 1, 0 )), 0 ) importance,IFNULL( SUM( IF ( engineering_type = 2, 1, 0 )), 0 ) bridge,IFNULL( SUM( IF ( engineering_type = 3, 1, 0 )), 0 ) tunnel,IFNULL( SUM( IF ( engineering_type = 4, 1, 0 )), 0 ) station,IFNULL( SUM( IF ( nature = 1, 1, 0 )), 0 ) newBuild, IFNULL( SUM( IF ( nature = 2, 1, 0 )), 0 ) reBuild,IFNULL( SUM( IF ( nature = 3, 1, 0 )), 0 ) extension,IFNULL( SUM( IF ( state = 4, 1, 0 )), 0 ) finished,IFNULL( SUM( IF ( state = 2, 1, 0 )), 0 ) building,IFNULL( SUM( IF ( state = 3, 1, 0 )), 0 ) shutdown FROM engineering WHERE #project ") \ No newline at end of file diff --git a/src/main/resources/magic/api/惠州项目管理政务版/投资管理.ms b/src/main/resources/magic/api/惠州项目管理政务版/投资管理.ms index f32e8b5..74ee45b 100644 --- a/src/main/resources/magic/api/惠州项目管理政务版/投资管理.ms +++ b/src/main/resources/magic/api/惠州项目管理政务版/投资管理.ms @@ -5,7 +5,7 @@ "groupId" : "1f3d3e5b9fe340bab84de67b0de08f44", "name" : "投资管理", "createTime" : null, - "updateTime" : 1690543632559, + "updateTime" : 1706587043096, "lock" : null, "createBy" : "admin", "updateBy" : "admin", @@ -37,20 +37,20 @@ BigDecimal applyAmountTotal = db.selectValue("SELECT IFNULL(SUM(apply_payment), BigDecimal paymentTotal = db.selectValue("SELECT IFNULL(SUM(payment), 0) FROM investment_payment_stat WHERE #project") BigDecimal big = new BigDecimal(10000); -result.put("paymentByMonth", paymentByMonth.divide(big)) -result.put("applyAmountByMonth", applyAmountByMonth.divide(big)) -result.put("realPayAmountByMonth", realPayAmountByMonth.divide(big)) +result.put("paymentByMonth", paymentByMonth.divide(big, 2, BigDecimal.ROUND_HALF_UP)) +result.put("applyAmountByMonth", applyAmountByMonth.divide(big, 2, BigDecimal.ROUND_HALF_UP)) +result.put("realPayAmountByMonth", realPayAmountByMonth.divide(big, 2, BigDecimal.ROUND_HALF_UP)) var unPayAmountByMonth = applyAmountByMonth.subtract(realPayAmountByMonth); -result.put("unPayAmountByMonth", unPayAmountByMonth > 0 ? unPayAmountByMonth.divide(big) : 0) +result.put("unPayAmountByMonth", unPayAmountByMonth > 0 ? unPayAmountByMonth.divide(big, 2, BigDecimal.ROUND_HALF_UP) : 0) -result.put("totalAmount", totalAmount.divide(big)) +result.put("totalAmount", totalAmount.divide(big, 2, BigDecimal.ROUND_HALF_UP)) result.put("payRatio", realPayAmountTotal == 0 ? 0 : realPayAmountTotal.divide(totalAmount, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")).doubleValue()) -result.put("paymentTotal", paymentTotal.divide(big)) -result.put("applyAmountTotal", applyAmountTotal.divide(big)) -result.put("settlementAmount", settlementAmount.divide(big)) +result.put("paymentTotal", paymentTotal.divide(big, 2, BigDecimal.ROUND_HALF_UP)) +result.put("applyAmountTotal", applyAmountTotal.divide(big, 2, BigDecimal.ROUND_HALF_UP)) +result.put("settlementAmount", settlementAmount.divide(big, 2, BigDecimal.ROUND_HALF_UP)) result.put("payRatio1", realPayAmountTotal == 0 ? 0 : realPayAmountTotal.divide(settlementAmount, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")).doubleValue()) -result.put("settlementAmountByYear", settlementAmountByYear.divide(big)) +result.put("settlementAmountByYear", settlementAmountByYear.divide(big, 2, BigDecimal.ROUND_HALF_UP)) result.put("payRatio2", realPayAmountByYear == 0 ? 0 : realPayAmountByYear.divide(totalAmountByYear, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")).doubleValue()) -result.put("realPayAmountTotal", realPayAmountTotal.divide(big)) -result.put("realPayAmountByYear", realPayAmountByYear.divide(big)) +result.put("realPayAmountTotal", realPayAmountTotal.divide(big, 2, BigDecimal.ROUND_HALF_UP)) +result.put("realPayAmountByYear", realPayAmountByYear.divide(big, 2, BigDecimal.ROUND_HALF_UP)) return result \ No newline at end of file diff --git a/src/main/resources/magic/api/惠州项目管理政务版/环境报警列表(最近20条).ms b/src/main/resources/magic/api/惠州项目管理政务版/环境报警列表(最近20条).ms index 93a2511..723eff9 100644 --- a/src/main/resources/magic/api/惠州项目管理政务版/环境报警列表(最近20条).ms +++ b/src/main/resources/magic/api/惠州项目管理政务版/环境报警列表(最近20条).ms @@ -5,7 +5,7 @@ "groupId" : "1f3d3e5b9fe340bab84de67b0de08f44", "name" : "环境报警列表(最近20条)", "createTime" : null, - "updateTime" : 1688215422339, + "updateTime" : 1706838795058, "lock" : null, "createBy" : null, "updateBy" : "admin", @@ -22,4 +22,4 @@ "responseBodyDefinition" : null } ================================ -return db.select("SELECT type, cause, create_time, state FROM environment_alarm WHERE #project order by create_time desc limit 20") \ No newline at end of file +return db.select("SELECT type, cause, date_format(create_time,'%Y-%m-%d %H:%i:%S') as create_time, state FROM environment_alarm WHERE #project order by create_time desc limit 20") \ No newline at end of file diff --git a/src/main/resources/magic/api/监管决策BI/查询工程分类统计.ms b/src/main/resources/magic/api/监管决策BI/查询工程分类统计.ms index dca9a8c..6a8aa95 100644 --- a/src/main/resources/magic/api/监管决策BI/查询工程分类统计.ms +++ b/src/main/resources/magic/api/监管决策BI/查询工程分类统计.ms @@ -5,7 +5,7 @@ "groupId" : "485e36d471af4f809398babc4abadafe", "name" : "查询工程分类统计", "createTime" : null, - "updateTime" : 1691574587721, + "updateTime" : 1699250036244, "lock" : null, "createBy" : null, "updateBy" : "admin", @@ -16,7 +16,7 @@ "requestBody" : "", "headers" : [ { "name" : "Authorization", - "value" : "Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJnZGFkbWluIiwiaWF0IjoxNjg0MjAxNzgwLCJleHAiOjE2ODQyODgxODB9.QDnW2gWL3dXo5IcVbFCkGWapOxm74MmSpqkJ6Zci7rc", + "value" : "Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJjc3p3IiwiaWF0IjoxNjk5MjQ5NDUyLCJleHAiOjE2OTkzMzU4NTJ9.vVpWEt2-sdJ91jcvecKd2JSNyV-D3EsppFdPFQGI0ZQ", "description" : null, "required" : false, "dataType" : "String", @@ -28,26 +28,76 @@ "children" : null } ], "paths" : [ ], - "responseBody" : "{\n \"result\": [\n {\n \"num\": 1,\n \"dict_value\": \"房屋建筑\",\n \"ratio\": 100\n },\n {\n \"num\": 0,\n \"dict_value\": \"市政公用\",\n \"ratio\": 0\n },\n {\n \"num\": 0,\n \"dict_value\": \"其他\",\n \"ratio\": 0\n }\n ],\n \"code\": 200,\n \"success\": true,\n \"message\": \"success\",\n \"timestamp\": \"1684201634237\"\n}", + "responseBody" : "{\n \"result\": [\n {\n \"num\": 1,\n \"dict_value\": \"房屋建筑\",\n \"ratio\": 50\n },\n {\n \"num\": 0,\n \"dict_value\": \"市政公用\",\n \"ratio\": 0\n },\n {\n \"num\": 1,\n \"dict_value\": \"其他\",\n \"ratio\": 50\n }\n ],\n \"code\": 200,\n \"success\": true,\n \"message\": \"success\",\n \"timestamp\": \"1699250029028\"\n}", "description" : null, "requestBodyDefinition" : null, - "responseBodyDefinition" : null + "responseBodyDefinition" : { + "name" : "", + "value" : "", + "description" : "", + "required" : false, + "dataType" : "Object", + "type" : null, + "defaultValue" : null, + "validateType" : "", + "error" : "", + "expression" : "", + "children" : [ { + "name" : "code", + "value" : "401", + "description" : "", + "required" : false, + "dataType" : "String", + "type" : null, + "defaultValue" : null, + "validateType" : "", + "error" : "", + "expression" : "", + "children" : [ ] + }, { + "name" : "success", + "value" : "false", + "description" : "", + "required" : false, + "dataType" : "Boolean", + "type" : null, + "defaultValue" : null, + "validateType" : "", + "error" : "", + "expression" : "", + "children" : [ ] + }, { + "name" : "message", + "value" : "登录信息异常,请刷新或重新登录!", + "description" : "", + "required" : false, + "dataType" : "String", + "type" : null, + "defaultValue" : null, + "validateType" : "", + "error" : "", + "expression" : "", + "children" : [ ] + } ] + } } ================================ import java.math.BigDecimal List list = db.select("SELECT d.dict_value, COUNT( a.id ) num FROM engineering a RIGHT JOIN system_dict_data d ON a.engineering_type = d.dict_label AND #projectalias WHERE a.examine_state = 3 AND d.dict_type = 'engineering_type' GROUP BY d.dict_value ORDER BY d.dict_sort") +List dictList = db.select("SELECT dict_value, dict_label num FROM system_dict_data where dict_type = 'engineering_type' ORDER BY dict_sort") + Map totalMap = db.selectOne("SELECT COUNT(id) num FROM engineering WHERE examine_state = 3 AND #project") String total = totalMap.get("num") List result = new ArrayList(); Integer other = 0; Integer index = 0 -for (item in list) { +for (item in dictList) { Map map = item var dict_value = map.get("dict_value") - var num = map.get("num")::int + var num = list.filter(item => item.dict_value.equals(dict_value)).size() Map resultMap = new HashMap(); - if (index < 3){ + if (index < 2){ resultMap.put("dict_value" ,dict_value) resultMap.put("num" ,num) BigDecimal totalNum = new BigDecimal(total); diff --git a/src/main/resources/magic/api/监管决策BI/顶部查询工程统计信息.ms b/src/main/resources/magic/api/监管决策BI/顶部查询工程统计信息.ms index cc90054..2ee857a 100644 --- a/src/main/resources/magic/api/监管决策BI/顶部查询工程统计信息.ms +++ b/src/main/resources/magic/api/监管决策BI/顶部查询工程统计信息.ms @@ -5,7 +5,7 @@ "groupId" : "485e36d471af4f809398babc4abadafe", "name" : "顶部查询工程统计信息", "createTime" : null, - "updateTime" : 1684807167570, + "updateTime" : 1706855342407, "lock" : null, "createBy" : null, "updateBy" : "admin", @@ -34,4 +34,4 @@ "responseBodyDefinition" : null } ================================ -return db.selectOne("SELECT IFNULL(SUM(IF(examine_state = 3, 1, 0)),0) total,IFNULL(SUM(IF(YEAR(start_time) = YEAR(NOW()) AND state > 1, 1, 0)),0) newBuild,IFNULL(SUM(IF(YEAR(start_time) = YEAR(NOW()) AND state = 7, 1, 0)),0) finish,IFNULL(SUM(IF(is_important = 1 AND state > 1, 1, 0)),0) important FROM engineering WHERE #project") \ No newline at end of file +return db.selectOne("SELECT IFNULL(SUM(IF(examine_state = 3, 1, 0)),0) total,IFNULL(SUM(IF(YEAR(start_time) = YEAR(NOW()) AND state > 1, 1, 0)),0) newBuild,IFNULL(SUM(IF(YEAR(start_time) = YEAR(NOW()) AND state = 7, 1, 0)),0) finish,IFNULL(SUM(IF(is_important = 1 AND state > 1, 1, 0)),0) important,IFNULL( SUM( IF ( examine_state = 3 AND state = 1, 1, 0 )), 0 ) unStart,IFNULL( SUM( IF ( examine_state = 3 AND state = 2, 1, 0 )), 0 ) building,IFNULL( SUM( IF ( examine_state = 3 AND state = 4, 1, 0 )), 0 ) complete FROM engineering WHERE #project") \ No newline at end of file diff --git a/tree.txt b/tree.txt deleted file mode 100644 index 870e569d6412bd5d9f56cca3bff8fc6b4ecf3dda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84728 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