diff --git a/.gitignore b/.gitignore index e625a99..4bf7246 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,15 @@ application-my.yaml /urbanops-ui-app/unpackage/ **/.DS_Store old/ +/.claudeignore +/docs/all_test.html +/docs/ppt-assets/animations.css +/docs/ppt-assets/base.css +/CLAUDE.md +/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/ErrorCodeConstants_手动操作.java +/docs/ppt-assets/fonts.css +/docs/ppt-assets/runtime.js +/.claude/settings.local.json +/docs/ppt-assets/style.css +/docs/urbanops-architecture-ppt.html +/docs/urbanops-tech-sharing.html diff --git a/pom.xml b/pom.xml index 5d1fce6..74308ca 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,7 @@ 3.5.5 1.6.3 UTF-8 + yyyyMMdd-HHmm diff --git a/sql/mysql/garden_problem_type-fix.sql b/sql/mysql/garden_problem_type-fix.sql new file mode 100644 index 0000000..a7c5d85 --- /dev/null +++ b/sql/mysql/garden_problem_type-fix.sql @@ -0,0 +1,35 @@ +-- ================================================= +-- garden_problem_type 表结构补全 +-- 原因:BaseDO 包含 create_time/update_time/creator/updater/deleted +-- MyBatis Plus @TableLogic 自动 WHERE deleted=0 +-- 缺少这些列会导致 SQL 报错或无数据返回 +-- ================================================= + +-- 如果表已存在数据,先备份 +-- CREATE TABLE garden_problem_type_bak AS SELECT * FROM garden_problem_type; + +-- 方案1:删表重建(无重要数据时) +DROP TABLE IF EXISTS `garden_problem_type`; +CREATE TABLE `garden_problem_type` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `type_code` varchar(32) NOT NULL COMMENT '问题类型编码', + `type_name` varchar(64) NOT NULL COMMENT '问题类型名称', + `level` tinyint NOT NULL COMMENT '层级:1一级 2二级 3三级', + `parent_code` varchar(32) DEFAULT NULL COMMENT '父级类型编码', + `sort` int DEFAULT 0 COMMENT '排序序号', + `status` tinyint DEFAULT 1 COMMENT '状态 1启用 0禁用', + `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` tinyint NOT NULL DEFAULT 0 COMMENT '逻辑删除 0正常 1删除', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_type_code` (`type_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='问题类型三级分类表'; + +-- 方案2:已有数据时,用 ALTER 补齐缺失列(按需执行) +-- ALTER TABLE garden_problem_type ADD COLUMN `creator` varchar(64) DEFAULT '' COMMENT '创建者' AFTER `status`; +-- ALTER TABLE garden_problem_type ADD COLUMN `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' AFTER `creator`; +-- ALTER TABLE garden_problem_type ADD COLUMN `updater` varchar(64) DEFAULT '' COMMENT '更新者' AFTER `create_time`; +-- ALTER TABLE garden_problem_type ADD COLUMN `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' AFTER `updater`; +-- ALTER TABLE garden_problem_type ADD COLUMN `deleted` tinyint NOT NULL DEFAULT 0 COMMENT '逻辑删除' AFTER `update_time`; diff --git a/sql/mysql/problem-type-menu-auto.sql b/sql/mysql/problem-type-menu-auto.sql new file mode 100644 index 0000000..05a0766 --- /dev/null +++ b/sql/mysql/problem-type-menu-auto.sql @@ -0,0 +1,33 @@ +-- ================================================= +-- 问题类型配置 - 菜单与权限 SQL(自动查找父菜单ID) +-- 直接执行即可,自动从「工单管理」下挂载菜单 +-- ================================================= + +-- 查询当前最大 ID 作为起始值 +SET @maxId = (SELECT IFNULL(MAX(id), 5000) FROM system_menu); + +-- 查询工单管理 菜单ID +SET @parentId = (SELECT id FROM system_menu WHERE name = '工单管理' AND type = 1 LIMIT 1); + +-- 如果找不到工单管理,尝试匹配 workorder 关键字 +-- SET @parentId = (SELECT id FROM system_menu WHERE (name LIKE '%工单%' OR path LIKE '%workorder%') AND type = 1 LIMIT 1); + +-- 1. 二级菜单:问题类型 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) +VALUES (@maxId + 1, '问题类型', '', 2, 10, @parentId, 'problem-type', 'ep:list', 'garden/problemType/index', 'ProblemType', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); + +-- 2. 按钮:查询 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) +VALUES (@maxId + 2, '问题类型查询', 'garden:problem-type:query', 3, 1, @maxId + 1, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); + +-- 3. 按钮:创建 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) +VALUES (@maxId + 3, '问题类型创建', 'garden:problem-type:create', 3, 2, @maxId + 1, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); + +-- 4. 按钮:更新 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) +VALUES (@maxId + 4, '问题类型更新', 'garden:problem-type:update', 3, 3, @maxId + 1, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); + +-- 5. 按钮:删除 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) +VALUES (@maxId + 5, '问题类型删除', 'garden:problem-type:delete', 3, 4, @maxId + 1, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); diff --git a/sql/mysql/problem-type-menu.sql b/sql/mysql/problem-type-menu.sql new file mode 100644 index 0000000..c2b59f5 --- /dev/null +++ b/sql/mysql/problem-type-menu.sql @@ -0,0 +1,35 @@ +-- ================================================= +-- 问题类型配置 - 菜单与权限 SQL +-- 说明: +-- 1. 请先查询「工单管理」的菜单 ID,替换下面 @parentId 为实际值 +-- 查询语句:SELECT id FROM system_menu WHERE name = '工单管理' AND type = 1; +-- 2. 修改下面 @menuId 为可用的起始 ID(确保不与已有菜单 ID 冲突) +-- 查询最大ID:SELECT MAX(id) FROM system_menu; +-- 3. 执行前请备份 system_menu 表 +-- ================================================= + +-- 请根据实际情况替换以下变量值: +-- SET @parentId = (SELECT id FROM system_menu WHERE name = '工单管理' AND type = 1); +-- SET @menuId = (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu); + +-- 示例:假设工单管理 parent_id = 2000,起始 menu_id = 5100 + +-- 1. 二级菜单:问题类型 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) +VALUES (@menuId, '问题类型', '', 2, 10, @parentId, 'problem-type', 'ep:list', 'garden/problemType/index', 'ProblemType', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); + +-- 2. 按钮权限:查询 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) +VALUES (@menuId + 1, '问题类型查询', 'garden:problem-type:query', 3, 1, @menuId, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); + +-- 3. 按钮权限:创建 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) +VALUES (@menuId + 2, '问题类型创建', 'garden:problem-type:create', 3, 2, @menuId, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); + +-- 4. 按钮权限:更新 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) +VALUES (@menuId + 3, '问题类型更新', 'garden:problem-type:update', 3, 3, @menuId, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); + +-- 5. 按钮权限:删除 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) +VALUES (@menuId + 4, '问题类型删除', 'garden:problem-type:delete', 3, 4, @menuId, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); diff --git a/urbanops-dependencies/pom.xml b/urbanops-dependencies/pom.xml index 5f0399f..79802ac 100644 --- a/urbanops-dependencies/pom.xml +++ b/urbanops-dependencies/pom.xml @@ -76,6 +76,7 @@ 2.1.1 2.1.0 4.7.7-20250808.182223 + yyyyMMdd-HHmm diff --git a/urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/pojo/PageParam.java b/urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/pojo/PageParam.java index d9d9d8e..60363c8 100644 --- a/urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/pojo/PageParam.java +++ b/urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/pojo/PageParam.java @@ -72,7 +72,8 @@ public class PageParam implements Serializable { public void setOrderByColumn(String orderByColumn) { if (!StringUtils.hasText(orderByColumn)) { this.orderByColumn = "id"; - return; + } else { + this.orderByColumn = orderByColumn; } } diff --git a/urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/util/date/DateUtils.java b/urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/util/date/DateUtils.java index 6446d5c..808c8e2 100644 --- a/urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/util/date/DateUtils.java +++ b/urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/util/date/DateUtils.java @@ -3,6 +3,7 @@ package com.zteits.urbanops.framework.common.util.date; import cn.hutool.core.date.LocalDateTimeUtil; import java.time.*; +import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.Date; @@ -18,6 +19,9 @@ public class DateUtils { */ public static final String TIME_ZONE_DEFAULT = "GMT+8"; + public static final ZoneId DEFAULT_ZONE = ZoneId.of("GMT+8"); // 东八区 + + /** * 秒转换成毫秒 */ @@ -27,6 +31,10 @@ public class DateUtils { public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss"; + public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + public static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + /** * 将 LocalDateTime 转换成 Date * diff --git a/urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/util/validation/ValidationUtils.java b/urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/util/validation/ValidationUtils.java index 228fd35..f3129fa 100644 --- a/urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/util/validation/ValidationUtils.java +++ b/urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/util/validation/ValidationUtils.java @@ -18,8 +18,9 @@ import java.util.regex.Pattern; */ public class ValidationUtils { - private static final Pattern PATTERN_MOBILE = Pattern.compile("^(?:(?:\\+|00)86)?1(?:(?:3[\\d])|(?:4[0,1,4-9])|(?:5[0-3,5-9])|(?:6[2,5-7])|(?:7[0-8])|(?:8[\\d])|(?:9[0-3,5-9]))\\d{8}$"); - + //private static final Pattern PATTERN_MOBILE = Pattern.compile("^(?:(?:\\+|00)86)?1(?:(?:3[\\d])|(?:4[0,1,4-9])|(?:5[0-3,5-9])|(?:6[2,5-7])|(?:7[0-8])|(?:8[\\d])|(?:9[0-3,5-9]))\\d{8}$"); + //add by wq 20260327 手机号码校验覆盖全号段 + private static final Pattern PATTERN_MOBILE = Pattern.compile("^(?:\\+86|0086)?1[3-9]\\d{9}$"); private static final Pattern PATTERN_URL = Pattern.compile("^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]"); private static final Pattern PATTERN_XML_NCNAME = Pattern.compile("[a-zA-Z_][\\-_.0-9_a-zA-Z$]*"); @@ -51,5 +52,4 @@ public class ValidationUtils { throw new ConstraintViolationException(constraintViolations); } } - } diff --git a/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/convert/BusinessLineConvert.java b/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/convert/BusinessLineConvert.java new file mode 100644 index 0000000..4781cd0 --- /dev/null +++ b/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/convert/BusinessLineConvert.java @@ -0,0 +1,112 @@ +package com.zteits.urbanops.framework.excel.core.convert; + +import cn.idev.excel.converters.Converter; +import cn.idev.excel.enums.CellDataTypeEnum; +import cn.idev.excel.metadata.GlobalConfiguration; +import cn.idev.excel.metadata.data.ReadCellData; +import cn.idev.excel.metadata.data.WriteCellData; +import cn.idev.excel.metadata.property.ExcelContentProperty; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class BusinessLineConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + /** + * 导入:业务线名称(园林,市政) → 编码(yl,sz) + */ + @Override + public Object convertToJavaData(ReadCellData readCellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + String cellValue = readCellData.getStringValue(); + if (cellValue == null || cellValue.isBlank()) { + return null; + } + + try { + // 按逗号切割 + String[] lineArray = cellValue.split(","); + StringBuilder codeSb = new StringBuilder(); + + for (String line : lineArray) { + String code = convertLineToCode(line.trim()); + if (codeSb.length() > 0) { + codeSb.append(","); + } + codeSb.append(code); + } + + return codeSb.toString(); + } catch (Exception e) { + log.error("[convertToJavaData][业务线转换异常] {}", cellValue, e); + return null; + } + } + + /** + * 导出:业务线编码(yl,sz) → 名称(园林,市政) + */ + @Override + public WriteCellData convertToExcelData(Object value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + if (value == null) { + return new WriteCellData<>(""); + } + + try { + String codeValue = String.valueOf(value); + String[] codeArray = codeValue.split(","); + StringBuilder nameSb = new StringBuilder(); + + for (String code : codeArray) { + String name = convertCodeToLine(code.trim()); + if (nameSb.length() > 0) { + nameSb.append(","); + } + nameSb.append(name); + } + + return new WriteCellData<>(nameSb.toString()); + } catch (Exception e) { + log.error("[convertToExcelData][业务线转换异常] {}", value, e); + return new WriteCellData<>(""); + } + } + + /** + * 名称 → 编码 + */ + private String convertLineToCode(String line) { + return switch (line) { + case "园林" -> "yl"; + case "市政" -> "sz"; + case "物业" -> "wy"; + case "秩序管理" -> "zx"; + case "环境卫生" -> "hj"; + default -> ""; + }; + } + + /** + * 编码 → 名称 + */ + private String convertCodeToLine(String code) { + return switch (code) { + case "yl" -> "园林"; + case "sz" -> "市政"; + case "wy" -> "物业"; + case "zx" -> "秩序管理"; + case "hj" -> "环境卫生"; + default -> ""; + }; + } +} diff --git a/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/convert/ImageListConverter.java b/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/convert/ImageListConverter.java new file mode 100644 index 0000000..5dedf72 --- /dev/null +++ b/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/convert/ImageListConverter.java @@ -0,0 +1,122 @@ +package com.zteits.urbanops.framework.excel.core.convert; + +import cn.idev.excel.converters.Converter; +import cn.idev.excel.enums.CellDataTypeEnum; +import cn.idev.excel.metadata.GlobalConfiguration; +import cn.idev.excel.metadata.data.ImageData; +import cn.idev.excel.metadata.data.ReadCellData; +import cn.idev.excel.metadata.data.WriteCellData; +import cn.idev.excel.metadata.property.ExcelContentProperty; +import cn.idev.excel.util.FileUtils; +import cn.idev.excel.util.ListUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StringUtils; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.List; + +@Slf4j +public class ImageListConverter implements Converter> { + + // 横向排列:每张图片宽度 + 间距 + private static final int IMAGE_WIDTH = 120; + private static final int IMAGE_GAP = 15; + private static final int MAX_IMAGE_SIZE = 10 * 1024 * 1024; + private static final int CONNECT_TIMEOUT = 5000; + private static final int READ_TIMEOUT = 10000; + + @Override + public Class supportJavaTypeKey() { + return List.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.EMPTY; + } + + @Override + public List convertToJavaData(ReadCellData readCellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + return null; + } + + @Override + public WriteCellData convertToExcelData(List imageList, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + try { + if (imageList == null || imageList.isEmpty()) { + return new WriteCellData<>("无图片"); + } + + List imageDataList = ListUtils.newArrayList(); + int leftOffset = 0; // 横向偏移量 + + for (String path : imageList) { + if (!StringUtils.hasText(path)) continue; + + byte[] imageBytes = path.startsWith("http") ? loadNetworkImage(path) : loadLocalImage(path); + if (imageBytes == null || imageBytes.length == 0 || imageBytes.length > MAX_IMAGE_SIZE) { + log.warn("跳过无效图片:{}", path); + continue; + } + + ImageData imageData = new ImageData(); + imageData.setImage(imageBytes); + imageData.setImageType(ImageData.ImageType.PICTURE_TYPE_PNG); + + // ====================== 核心:横向偏移 ====================== + imageData.setLeft(leftOffset); + // ============================================================= + + imageDataList.add(imageData); + leftOffset += IMAGE_WIDTH + IMAGE_GAP; + } + + if (imageDataList.isEmpty()) { + return new WriteCellData<>("无有效图片"); + } + + WriteCellData writeCellData = new WriteCellData<>(); + writeCellData.setType(CellDataTypeEnum.EMPTY); + writeCellData.setImageDataList(imageDataList); + + return writeCellData; + + } catch (Exception e) { + log.error("图片导出失败", e); + return new WriteCellData<>("图片加载失败"); + } + } + + private byte[] loadLocalImage(String imagePath) throws Exception { + File file = new File(imagePath); + if (!file.exists() || !file.isFile()) { + log.warn("本地图片不存在:{}", imagePath); + return null; + } + return FileUtils.readFileToByteArray(file); + } + + private byte[] loadNetworkImage(String imageUrl) throws Exception { + URL url = new URL(imageUrl); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setConnectTimeout(CONNECT_TIMEOUT); + conn.setReadTimeout(READ_TIMEOUT); + try { + if (conn.getResponseCode() != 200) return null; + try (InputStream in = conn.getInputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream()) { + byte[] buffer = new byte[4096]; + int len; + while ((len = in.read(buffer)) != -1) out.write(buffer, 0, len); + return out.toByteArray(); + } + } finally { + conn.disconnect(); + } + } +} diff --git a/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/convert/ListToStringConverter.java b/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/convert/ListToStringConverter.java new file mode 100644 index 0000000..bf46808 --- /dev/null +++ b/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/convert/ListToStringConverter.java @@ -0,0 +1,40 @@ +package com.zteits.urbanops.framework.excel.core.convert; +import cn.idev.excel.converters.Converter; +import cn.hutool.core.collection.CollectionUtil; +import cn.idev.excel.enums.CellDataTypeEnum; +import cn.idev.excel.metadata.GlobalConfiguration; +import cn.idev.excel.metadata.data.WriteCellData; +import cn.idev.excel.metadata.property.ExcelContentProperty; + +import java.util.List; + +/** + * List 转 Excel 字符串转换器(将List用逗号拼接成字符串) + */ +public class ListToStringConverter implements Converter> { + + @Override + public Class supportJavaTypeKey() { + // 声明支持的Java类型:List + return List.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + // Excel单元格类型:字符串 + return CellDataTypeEnum.STRING; + } + + @Override + public WriteCellData convertToExcelData(List value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + // 核心转换逻辑:List为空返回空字符串,否则用逗号拼接 + if (CollectionUtil.isEmpty(value)) { + return new WriteCellData<>(""); + } + String joinStr = String.join(",", value.stream() + .map(Object::toString) + .toArray(String[]::new)); + return new WriteCellData<>(joinStr); + } +} \ No newline at end of file diff --git a/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/handler/ImageColumnWidthHandler.java b/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/handler/ImageColumnWidthHandler.java new file mode 100644 index 0000000..c8c49ae --- /dev/null +++ b/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/handler/ImageColumnWidthHandler.java @@ -0,0 +1,25 @@ +package com.zteits.urbanops.framework.excel.core.handler; + +import cn.idev.excel.write.handler.SheetWriteHandler; +import cn.idev.excel.write.handler.context.SheetWriteHandlerContext; +import lombok.RequiredArgsConstructor; +import org.apache.poi.ss.usermodel.Sheet; + +/** + * 图片列自动加宽处理器 + */ +@RequiredArgsConstructor +public class ImageColumnWidthHandler implements SheetWriteHandler { + + // 需要加宽的列索引(从0开始),比如你的图片列在第3列,就传2 + private final int imageColumnIndex; + // 加宽后的列宽(单位:字符宽度,Excel默认1个字符宽度≈256像素) + private final int columnWidth; + + @Override + public void afterSheetCreate(SheetWriteHandlerContext context) { + Sheet sheet = context.getWriteSheetHolder().getSheet(); + // 设置指定列的宽度 + sheet.setColumnWidth(imageColumnIndex, columnWidth); + } +} diff --git a/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/util/ExcelUtils.java b/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/util/ExcelUtils.java index 84dfded..7a02cdf 100644 --- a/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/util/ExcelUtils.java +++ b/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/util/ExcelUtils.java @@ -44,9 +44,27 @@ public class ExcelUtils { } public static List read(MultipartFile file, Class head) throws IOException { - return FastExcelFactory.read(file.getInputStream(), head, null) - .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 - .doReadAllSync(); + List list = FastExcelFactory.read(file.getInputStream(), head, null) + .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 + .doReadAllSync(); + + // 过滤:对象不为 null + 不是全字段 null + if (list != null) { + list.removeIf(item -> { + if (item == null) return true; + // 判断所有字段是否都为 null + for (java.lang.reflect.Field field : item.getClass().getDeclaredFields()) { + field.setAccessible(true); + try { + if (field.get(item) != null) { + return false; + } + } catch (Exception e) { } + } + return true; + }); + } + return list; } public static List read(MultipartFile file, Class head, Integer startIndex) throws IOException { diff --git a/urbanops-module-api/urbanops-module-garden-api/src/main/java/com/zteits/urbanops/module/garden/dto/material/MaterialInventoryOutDto.java b/urbanops-module-api/urbanops-module-garden-api/src/main/java/com/zteits/urbanops/module/garden/dto/material/MaterialInventoryOutDto.java index 53f388e..ddba1f0 100644 --- a/urbanops-module-api/urbanops-module-garden-api/src/main/java/com/zteits/urbanops/module/garden/dto/material/MaterialInventoryOutDto.java +++ b/urbanops-module-api/urbanops-module-garden-api/src/main/java/com/zteits/urbanops/module/garden/dto/material/MaterialInventoryOutDto.java @@ -17,6 +17,9 @@ public class MaterialInventoryOutDto { @Schema(description = "入库ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "18713") private Long id; + @Schema(description = "库存ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "111") + private Long inventoryId; + @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14541") @NotNull(message = "物料ID不能为空") private Long materialId; diff --git a/urbanops-module-api/urbanops-module-garden-api/src/main/java/com/zteits/urbanops/module/garden/dto/road/RoadReqDTO.java b/urbanops-module-api/urbanops-module-garden-api/src/main/java/com/zteits/urbanops/module/garden/dto/road/RoadReqDTO.java index 2374d35..8d7c89a 100644 --- a/urbanops-module-api/urbanops-module-garden-api/src/main/java/com/zteits/urbanops/module/garden/dto/road/RoadReqDTO.java +++ b/urbanops-module-api/urbanops-module-garden-api/src/main/java/com/zteits/urbanops/module/garden/dto/road/RoadReqDTO.java @@ -22,4 +22,6 @@ public class RoadReqDTO { @Schema(description = "维度", example = "121.40476") private String latitude; + @Schema(description = "道路名称", example = "中国") + private String roadName; } diff --git a/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/BpmTaskApiImpl.java b/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/BpmTaskApiImpl.java index f857c37..61ab3df 100644 --- a/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/BpmTaskApiImpl.java +++ b/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/BpmTaskApiImpl.java @@ -15,6 +15,7 @@ import org.springframework.util.StringUtils; import org.springframework.validation.annotation.Validated; import java.util.*; +import java.util.stream.Collectors; import java.util.stream.Stream; import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertSetByFlatMap; @@ -69,8 +70,13 @@ public class BpmTaskApiImpl implements BpmTaskApi{ Set userIds = convertSetByFlatMap(taskList, task -> Stream.of(NumberUtils.parseLong(task.getAssignee()), NumberUtils.parseLong(task.getOwner()))); Map userMap = adminUserApi.getUserMap(userIds); + + // 过滤掉所有deleteReason = MI_END的任务,再进行遍历 + List nonMIEndTaskList = taskList.stream() + .filter(task -> !"MI_END".equals(task.getDeleteReason())) + .collect(Collectors.toList()); // 5. 按任务结束时间倒序→创建时间倒序排序,确保取到最新任务 - HistoricTaskInstance lastTask = taskList.stream() + HistoricTaskInstance lastTask = nonMIEndTaskList.stream() .reduce((first, last) -> last) // 遍历到最后一个元素 .orElse(null); // 空列表返回null // 存储最后一个任务,后续封装VO diff --git a/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/controller/admin/task/BpmProcessInstanceController.java b/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/controller/admin/task/BpmProcessInstanceController.java index ec590c3..29f591b 100644 --- a/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/controller/admin/task/BpmProcessInstanceController.java +++ b/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/controller/admin/task/BpmProcessInstanceController.java @@ -23,6 +23,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.annotation.security.PermitAll; import jakarta.validation.Valid; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.repository.ProcessDefinition; @@ -173,7 +174,8 @@ public class BpmProcessInstanceController { @GetMapping("/get-approval-detail") @Operation(summary = "获得审批详情") @Parameter(name = "id", description = "流程实例的编号", required = true) - @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") + //@PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") + @PermitAll @SuppressWarnings("unchecked") public CommonResult getApprovalDetail(@Valid BpmApprovalDetailReqVO reqVO) { if (StrUtil.isNotEmpty(reqVO.getProcessVariablesStr())) { diff --git a/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/controller/admin/task/BpmTaskController.java b/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/controller/admin/task/BpmTaskController.java index b781b36..92ed20a 100644 --- a/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/controller/admin/task/BpmTaskController.java +++ b/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/controller/admin/task/BpmTaskController.java @@ -20,6 +20,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.annotation.security.PermitAll; import jakarta.validation.Valid; import org.flowable.bpmn.model.UserTask; import org.flowable.engine.history.HistoricProcessInstance; @@ -124,7 +125,8 @@ public class BpmTaskController { @GetMapping("/list-by-process-instance-id") @Operation(summary = "获得指定流程实例的任务列表", description = "包括完成的、未完成的") @Parameter(name = "processInstanceId", description = "流程实例的编号", required = true) - @PreAuthorize("@ss.hasPermission('bpm:task:query')") + //@PreAuthorize("@ss.hasPermission('bpm:task:query')") + @PermitAll public CommonResult> getTaskListByProcessInstanceId( @RequestParam("processInstanceId") String processInstanceId) { List taskList = taskService.getTaskListByProcessInstanceId(processInstanceId, true); diff --git a/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/service/task/BpmTaskServiceImpl.java b/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/service/task/BpmTaskServiceImpl.java index b8978e0..b416243 100644 --- a/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/service/task/BpmTaskServiceImpl.java @@ -286,7 +286,14 @@ public class BpmTaskServiceImpl implements BpmTaskService { || task.getCreateTime().before(DateUtils.of(pageVO.getCreateTime()[0])) || task.getCreateTime().after(DateUtils.of(pageVO.getCreateTime()[1]))); } - return new PageResult<>(tasks, count); + + // 过滤掉所有deleteReason = MI_END的任务,再进行遍历 解决管理端 或签任务展示 系统自动取消的问题 + List nonMIEndTaskList = tasks.stream() + .filter(task -> !"MI_END".equals(task.getDeleteReason())) + .collect(Collectors.toList()); + + + return new PageResult<>(nonMIEndTaskList, count); } @Override diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/road/RoadApiImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/road/RoadApiImpl.java index 46e31c5..428601d 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/road/RoadApiImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/road/RoadApiImpl.java @@ -14,6 +14,7 @@ import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.HashMap; @@ -44,9 +45,12 @@ public class RoadApiImpl implements RoadApi { param.put("companyCode", reqDTO.getBusiLine()); param.put("longitude", reqDTO.getLongitude()); param.put("latitude", reqDTO.getLatitude()); + if (StringUtils.hasText(reqDTO.getRoadName())) { + param.put("roadName", reqDTO.getRoadName()); + } String responseBody = HttpUtils.post(roadInfoUrl, null, JSON.toJSONString(param)); - log.info("获取道路信息接口,系统:{},经度:{},维度:{},返回结果:{}", reqDTO.getBusiLine(), reqDTO.getLongitude(), reqDTO.getLatitude(), responseBody); + log.info("获取道路信息接口,系统:{},经度:{},维度:{},roadName:{},返回结果:{}", reqDTO.getBusiLine(), reqDTO.getLongitude(), reqDTO.getLatitude(), reqDTO.getRoadName(), responseBody); JSONObject response = JSONUtil.parseObj(responseBody); if (response.getInt("code") != 200) { return new ArrayList<>(); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/AssignTasksController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/AssignTasksController.java index 5a9f7e8..4c67452 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/AssignTasksController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/AssignTasksController.java @@ -1,21 +1,22 @@ package com.zteits.urbanops.module.garden.controller.admin.assigntasks; import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.StrUtil; import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; import com.zteits.urbanops.framework.common.pojo.CommonResult; import com.zteits.urbanops.framework.common.pojo.PageParam; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.common.util.object.BeanUtils; import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; -import com.zteits.urbanops.framework.translate.core.TranslateUtils; import com.zteits.urbanops.module.garden.controller.admin.assigntasks.vo.AssignTasksPageReqVO; import com.zteits.urbanops.module.garden.controller.admin.assigntasks.vo.AssignTasksRespVO; import com.zteits.urbanops.module.garden.controller.admin.assigntasks.vo.AssignTasksSaveReqVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.UnitIntegralRespVO; +import com.zteits.urbanops.module.garden.convert.AssignTaskConvert; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasks.AssignTasksDO; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasksinfo.AssignTasksInfoDO; import com.zteits.urbanops.module.garden.service.assigntasks.AssignTasksService; import com.zteits.urbanops.module.garden.service.assigntasksinfo.AssignTasksInfoService; +import com.zteits.urbanops.module.garden.service.unitintegraltotal.UnitIntegralService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -46,6 +47,9 @@ public class AssignTasksController { @Resource private AssignTasksInfoService asignTasksInfoService; + @Resource + private UnitIntegralService unitIntegralService; + @PostMapping("/create") @Operation(summary = "创建派单任务主表(记录派单任务基本信息)") @PreAuthorize("@ss.hasPermission('garden:assign-tasks:create')") @@ -90,7 +94,13 @@ public class AssignTasksController { } AssignTasksRespVO assignTasksRespVO = BeanUtils.toBean(assignTasks, AssignTasksRespVO.class); List assignTaskInfoList = asignTasksInfoService.getAssignTasksInfos(assignTasks.getId()); - assignTasksRespVO.setAssignTaskInfoList(assignTaskInfoList); + //add by 20260307 convert 转换获取任务积分 + List taskIds = assignTaskInfoList.stream() + .map(AssignTasksInfoDO::getId) + .distinct() // 去重重复的taskId + .collect(Collectors.toList()); + List unitIntegralList = unitIntegralService.queryIntegralByRelatedTaskIds(taskIds); + assignTasksRespVO.setAssignTaskInfoList(AssignTaskConvert.INSTANCE.buildTaskInfo(assignTaskInfoList, unitIntegralList)); //获取单位集合 List companyIds = CollectionUtil.isEmpty(assignTaskInfoList) ? Collections.emptyList() diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksRespVO.java index c8843cc..82d8162 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksRespVO.java @@ -3,8 +3,7 @@ package com.zteits.urbanops.module.garden.controller.admin.assigntasks.vo; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import com.fasterxml.jackson.annotation.JsonFormat; -import com.fhs.core.trans.vo.VO; -import com.zteits.urbanops.module.garden.dal.dataobject.assigntasksinfo.AssignTasksInfoDO; +import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoRespVO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -12,6 +11,7 @@ import java.util.Date; import java.util.List; import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +import static com.zteits.urbanops.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; @Schema(description = "管理后台 - 派单任务主表(记录派单任务基本信息) Response VO") @Data @@ -38,12 +38,12 @@ public class AssignTasksRespVO { @Schema(description = "任务创建时间(派单时间)", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("派达时间") - @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT ) private Date createTime; @Schema(description = "任务截止时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("任务截止时间") - @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) private Date deadline; @Schema(description = "任务备注(如:特殊要求、注意事项等)") @@ -64,7 +64,7 @@ public class AssignTasksRespVO { private String updater; private List companyIds; - private List assignTaskInfoList; + private List assignTaskInfoList; public void setParentFinish(Integer parentFinish) { this.parentFinish = parentFinish; diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksSaveReqVO.java index 9fb7007..b96ef28 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksSaveReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksSaveReqVO.java @@ -43,7 +43,11 @@ public class AssignTasksSaveReqVO { private Integer parentFinish; @Schema(description = "整体完成时间(仅当parent_finish=1时有值)") - @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @JsonFormat( + pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, + timezone = "GMT+8", + shape = JsonFormat.Shape.STRING + ) private Date finishTime; @Schema(description = "任务备注(如:特殊要求、注意事项等)") diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/AssignTasksInfoController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/AssignTasksInfoController.java index 030467c..1f62078 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/AssignTasksInfoController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/AssignTasksInfoController.java @@ -10,11 +10,14 @@ import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.Ass import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoRespVO; import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoSaveReqVO; import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoUpdReqVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.UnitIntegralRespVO; import com.zteits.urbanops.module.garden.convert.AssignTaskConvert; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasks.AssignTasksDO; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasksinfo.AssignTasksInfoDO; import com.zteits.urbanops.module.garden.service.assigntasks.AssignTasksService; import com.zteits.urbanops.module.garden.service.assigntasksinfo.AssignTasksInfoService; +import com.zteits.urbanops.module.garden.service.assigntasksinfo.QuartzRemindService; +import com.zteits.urbanops.module.garden.service.unitintegraltotal.UnitIntegralService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -26,7 +29,12 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.io.IOException; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Date; import java.util.List; +import java.util.stream.Collectors; import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; @@ -42,6 +50,8 @@ public class AssignTasksInfoController { private AssignTasksInfoService assignTasksInfoService; @Resource private AssignTasksService assignTasksService; + @Resource + private UnitIntegralService unitIntegralService; @PostMapping("/create") @Operation(summary = "创建派单任务-单位关联表(记录单位接收派单后的执行详情)") @@ -83,7 +93,11 @@ public class AssignTasksInfoController { public CommonResult getAssignTasksInfo(@RequestParam("id") Long id) { AssignTasksInfoDO assignTasksInfo = assignTasksInfoService.getAssignTasksInfo(id); AssignTasksDO tasksDO = assignTasksService.getAssignTasks(assignTasksInfo.getTaskId()); - return success(AssignTaskConvert.INSTANCE.buildTask(assignTasksInfo, tasksDO)); + //add by 20260307 convert 转换获取任务积分 + List taskIds = new ArrayList<>(); + taskIds.add(assignTasksInfo.getId()); + List unitIntegralList = unitIntegralService.queryIntegralByRelatedTaskIds(taskIds); + return success(AssignTaskConvert.INSTANCE.buildTask(assignTasksInfo, tasksDO, unitIntegralList)); //return success(BeanUtils.toBean(assignTasksInfo, AssignTasksInfoRespVO.class)); } @@ -93,26 +107,16 @@ public class AssignTasksInfoController { public CommonResult> getAssignTasksInfoPage(@Valid AssignTasksInfoPageReqVO pageReqVO) { pageReqVO.setCompanyId(getCompanyId()); PageResult pageResult = assignTasksInfoService.getAssignTasksInfoPage(pageReqVO); -// if (pageResult == null || pageResult.getList() == null || pageResult.getList().isEmpty()) { -// return success(BeanUtils.toBean(pageResult, AssignTasksInfoRespVO.class)); -// } -// List assignIds = pageResult.getList().stream() -// .map(AssignTasksInfoDO::getTaskId) -// .distinct() -// .collect(Collectors.toList()); -// List taskList = assignTasksService.getAssignTasksList(assignIds); -// if (CollectionUtils.isNotEmpty(taskList)) { -// Map taskMap = taskList.stream() -// .collect(Collectors.toMap( -// AssignTasksDO::getId, // Key:任务ID -// task -> task, -// (existing, replacement) -> replacement -// )); -// return success(AssignTaskConvert.INSTANCE.buildTaskPage(pageResult, taskMap)); -// } else { -// return CommonResult.error(BAD_REQUEST.getCode(), "派单数据异常"); -// } - return success(BeanUtils.toBean(pageResult, AssignTasksInfoRespVO.class)); + if (pageResult == null || pageResult.getList() == null || pageResult.getList().isEmpty()) { + return success(BeanUtils.toBean(pageResult, AssignTasksInfoRespVO.class)); + } + //add by 20260307 convert 转换获取任务积分 + List taskIds = pageResult.getList().stream() + .map(AssignTasksInfoDO::getId) + .distinct() // 去重重复的taskId + .collect(Collectors.toList()); + List unitIntegralList = unitIntegralService.queryIntegralByRelatedTaskIds(taskIds); + return success(AssignTaskConvert.INSTANCE.buildTaskPage(pageResult, unitIntegralList)); } @GetMapping("/list") @Operation(summary = "获得派单任务-单位关联表(记录单位接收派单后的执行详情)分页") @@ -120,26 +124,13 @@ public class AssignTasksInfoController { public CommonResult> list(@Valid AssignTasksInfoPageReqVO pageReqVO) { pageReqVO.setCompanyId(getCompanyId()); PageResult pageResult = assignTasksInfoService.getAssignTasksInfoPage(pageReqVO); -// if (pageResult == null || pageResult.getList() == null || pageResult.getList().isEmpty()) { -// return success(BeanUtils.toBean(pageResult, AssignTasksInfoRespVO.class)); -// } -// List assignIds = pageResult.getList().stream() -// .map(AssignTasksInfoDO::getTaskId) -// .distinct() -// .collect(Collectors.toList()); -// List taskList = assignTasksService.getAssignTasksList(assignIds); -// if (CollectionUtils.isNotEmpty(taskList)) { -// Map taskMap = taskList.stream() -// .collect(Collectors.toMap( -// AssignTasksDO::getId, // Key:任务ID -// task -> task, -// (existing, replacement) -> replacement -// )); -// return success(AssignTaskConvert.INSTANCE.buildTaskPage(pageResult, taskMap)); -// } else { -// return CommonResult.error(BAD_REQUEST.getCode(), "派单数据异常"); -// } - return success(BeanUtils.toBean(pageResult, AssignTasksInfoRespVO.class)); + //add by 20260307 convert 转换获取任务积分 + List taskIds = pageResult.getList().stream() + .map(AssignTasksInfoDO::getId) + .distinct() // 去重重复的taskId + .collect(Collectors.toList()); + List unitIntegralList = unitIntegralService.queryIntegralByRelatedTaskIds(taskIds); + return success(AssignTaskConvert.INSTANCE.buildTaskPage(pageResult, unitIntegralList)); } @GetMapping("/export-excel") @Operation(summary = "导出派单任务-单位关联表(记录单位接收派单后的执行详情) Excel") @@ -179,4 +170,28 @@ public class AssignTasksInfoController { public CommonResult feedback(@RequestBody AssignTasksInfoUpdReqVO assignTaskCompany) { return success(assignTasksInfoService.feedbackAssignTaskCompany(assignTaskCompany)); } + + + @Resource + private QuartzRemindService quartzRemindService; + + @Operation(summary = "到期提醒") + @GetMapping(value = "/createDeadlineRemind") + public void deadlineRemindTest(@RequestParam("id") Long id) { + // 2. 注册Quartz任务:到期前3小时触发 + try { + LocalDateTime now = LocalDateTime.now(); + LocalDateTime triggerTime = now.plusHours(3).plusMinutes(3); // 现在往后推3小时3分钟 + Date triggerDate = Date.from( + triggerTime.atZone(ZoneId.systemDefault()) // 绑定时区 + .toInstant() // 转为Instant(含时区的时间戳) + ); + //quartzRemindService.registerRemindJob(id, triggerDate); + + unitIntegralService.resetUnitIntegralTotal(); + } catch (Exception e) { + throw new RuntimeException("任务创建失败"); + } + } + } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/vo/AssignTasksInfoRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/vo/AssignTasksInfoRespVO.java index 9dd99c8..95bba4d 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/vo/AssignTasksInfoRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/vo/AssignTasksInfoRespVO.java @@ -139,4 +139,9 @@ public class AssignTasksInfoRespVO { @TableField(typeHandler = JacksonTypeHandler.class) private List templateFile; + + /*当前积分*/ + private Integer totalIntegral; + + } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/CostFeeController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/CostFeeController.java index fee8c95..124fba1 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/CostFeeController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/CostFeeController.java @@ -5,16 +5,24 @@ import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; import com.zteits.urbanops.module.garden.controller.admin.costfee.vo.WaterFeeImport; import com.zteits.urbanops.module.garden.enums.TemplateEnum; import com.zteits.urbanops.module.garden.service.costfee.CostFeeService; +import com.zteits.urbanops.module.system.api.dept.DeptApi; +import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.security.PermitAll; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import lombok.Data; import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -23,7 +31,6 @@ import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Method; import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; import java.util.*; import static com.zteits.urbanops.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; @@ -49,6 +56,12 @@ public class CostFeeController{ @Value("${static.resource.server.enable}") private Boolean staticResourceServerenable; + @Autowired + private ResourceLoader resourceLoader; + + @jakarta.annotation.Resource + private DeptApi deptApi; + // Excel文件校验相关 private static final List ALLOWED_EXCEL_SUFFIX = Arrays.asList(".xlsx", ".xlsm"); private static final String EXCEL_MIME_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; @@ -59,6 +72,7 @@ public class CostFeeController{ */ @GetMapping("/get-import-template") @Operation(summary = "获得导入用户模板") + @PermitAll public void importTemplate(HttpServletResponse response, @RequestParam("templateName") String templateName) throws IOException { // 参数校验 @@ -74,29 +88,150 @@ public class CostFeeController{ return; } - if (staticResourceServerenable) { - // 构建完整的静态服务器URL(确保路径正确) - String serverUrl = staticResourceServerUrl; - if (serverUrl != null && !serverUrl.endsWith("/")) { - serverUrl += "/"; // 确保URL以/结尾,避免拼接错误 - } + writeAndModifyTemplate(response, template.getName(), template.getStartIndex()); + } + + private void writeAndModifyTemplate(HttpServletResponse response, + String downloadFileName, + int startIndexRow) throws IOException { + + // 拼接模板路径 + String serverUrl = staticResourceServerUrl; + if (serverUrl != null && !serverUrl.endsWith("/")) { + serverUrl += "/"; + } + String fullPath = serverUrl + downloadFileName; + fullPath = fullPath.replace("\\", "/"); + + Resource resource = resourceLoader.getResource(fullPath); + + // 检查文件是否存在 + if (!resource.exists()) { + response.sendError(HttpServletResponse.SC_NOT_FOUND, "模板文件不存在"); + return; + } + + // 设置下载响应头 + response.reset(); + response.setContentType(EXCEL_MIME_TYPE); + // response.setCharacterEncoding("UTF-8"); + String encodedName = URLEncoder.encode(downloadFileName, "UTF-8"); + // 标准文件名编码(Chrome / Edge / Firefox 全兼容) + response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + encodedName); + // 浏览器缓存配置(必须) + response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + response.setHeader("Pragma", "no-cache"); + response.setHeader("Expires", "0"); + + + try (InputStream in = resource.getInputStream(); + XSSFWorkbook workbook = new XSSFWorkbook(in); + OutputStream out = response.getOutputStream()) { - String encodedFileName = URLEncoder.encode(template.getName().split("\\.")[0], StandardCharsets.UTF_8.name()); + Sheet sheet = workbook.getSheetAt(0); - String templateFileName = encodedFileName + "." + template.getName().split("\\.")[1]; + // ============================================== + // 获取最新单位列表 + // ============================================== + List companyList = deptApi.getSubDeptList(); + List newUnits = companyList.stream() + .map(DeptRespDTO::getName) + .filter(Objects::nonNull) + .toList(); - String templateUrl = serverUrl + templateFileName; // 包含templates目录 + log.info("加载到单位列表:{},共{}条", newUnits, newUnits.size()); - // 方式1:重定向到静态资源服务器 - response.sendRedirect(templateUrl); - } else { - String templateFileName = templateName + "." + template.getName().split("\\.")[1]; + // ============================================== + // 生成新下拉 + 自动赋值 + // ============================================== + createDropdownAndSetValue(sheet, newUnits, startIndexRow); + + // 写入并强制刷新 + workbook.write(out); + out.flush(); - // 写入模板文件到响应 - writeTemplateToResponse(response, template.getName(), templateFileName); + } catch (Exception e) { + log.error("模板处理失败", e); + throw new IOException("文件处理失败", e); } } + /** + * 创建下拉框 + 给单元格赋值 + */ + private void createDropdownAndSetValue(Sheet sheet, List options, int startRow) { + if (options.isEmpty()) { + log.error("下拉选项为空,不创建"); + return; + } + + // 获取表头行 + Row headerRow = sheet.getRow(startRow - 1); + if (headerRow == null) { + log.error("表头行不存在:{}", startRow - 1); + return; + } + + // 查找“所属单位”列 + int targetCol = -1; + for (Cell cell : headerRow) { + if (cell != null && cell.getCellType() == CellType.STRING) { + String val = cell.getStringCellValue().trim(); + if (val.contains("所属单位") || val.contains("所属公司") ) { + targetCol = cell.getColumnIndex(); + break; + } + } + } + + if (targetCol == -1) { + log.error("未找到【所属单位】列表头"); + return; + } + + // 取消列隐藏 + sheet.setColumnHidden(targetCol, false); + + // ============================================== + // 遍历行:清空原有内容 + 设置默认值 + // ============================================== + int endRow = 100; + for (int r = startRow; r <= endRow; r++) { + Row row = sheet.getRow(r); + if (row == null) { + row = sheet.createRow(r); + } + + Cell cell = row.getCell(targetCol); + if (cell == null) { + cell = row.createCell(targetCol); + } + String unit = cell.getStringCellValue(); + // 默认赋值【第一个单位】,你可以根据业务改成其他值 + if (!StringUtils.isEmpty(unit)) { + cell.setCellValue(options.get(0)); + } + } + + // ============================================== + // 创建下拉框(作用范围:startRow ~ 1000行) + // ============================================== + CellRangeAddressList regions = new CellRangeAddressList(startRow, endRow, targetCol, targetCol); + DataValidationHelper helper = sheet.getDataValidationHelper(); + DataValidationConstraint constraint = helper.createExplicitListConstraint( + options.toArray(new String[0]) + ); + DataValidation validation = helper.createValidation(constraint, regions); + // 下拉框基础配置 + validation.setEmptyCellAllowed(true); + validation.setSuppressDropDownArrow(true); // 显示箭头 + validation.setShowErrorBox(true); + validation.setShowPromptBox(true); // 启用点击弹出提示 + sheet.addValidationData(validation); + + log.info("【成功】为列{}添加下拉并赋值,行{}~{},选项数:{}", + targetCol, startRow, endRow, options.size()); + } /** * Excel文件上传预览 @@ -214,31 +349,6 @@ public class CostFeeController{ } /** - * 写入模板文件到响应流 - */ - private void writeTemplateToResponse(HttpServletResponse response, String filename, String templatePath) throws IOException { - // 设置响应头 - response.setContentType(EXCEL_MIME_TYPE); - response.setCharacterEncoding("UTF-8"); - String encodedFileName = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20"); - response.setHeader("Content-Disposition", "attachment;filename=" + encodedFileName); - response.setHeader("Cache-Control", "no-store"); // 禁止缓存 - - // 读取模板文件并写入响应 - try (InputStream in = new ClassPathResource("template/" + templatePath).getInputStream(); - OutputStream out = response.getOutputStream()) { - - byte[] buffer = new byte[4096]; - int bytesRead; - while ((bytesRead = in.read(buffer)) != -1) { - out.write(buffer, 0, bytesRead); - } - out.flush(); - } - } - - - /** * 校验Excel文件有效性(后缀+MIME类型) */ private boolean isValidExcelFile(MultipartFile file) { diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MaterialInventoryInImport.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MaterialInventoryInImport.java new file mode 100644 index 0000000..d8a9e7c --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MaterialInventoryInImport.java @@ -0,0 +1,83 @@ +package com.zteits.urbanops.module.garden.controller.admin.costfee.vo; + +import cn.idev.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + * @Classname MaterialInventoryInImport + * @Description 物料批量入库 + * @Date 2026/1/15 22:22 + * @Created by wangqian + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class MaterialInventoryInImport { + + + @ExcelProperty(index = 1) + @NotEmpty(message = "物料名称不能为空") + private String materialName; + + @NotEmpty(message = "耗材类型不能为空") + @ExcelProperty(index = 2) + private String materialTypeName; + + @NotEmpty(message = "类别名称不能为空") + @ExcelProperty(index = 3) + private String typeName; + + + @NotEmpty(message = "类别明细不能为空") + @ExcelProperty(index = 4) + private String typeDetailName; + + @NotEmpty(message = "物料规格不能为空") + @ExcelProperty(index = 5) + private String specifications; + + @NotEmpty(message = "物料单位不能为空") + @ExcelProperty(index = 6) + private String unitName; + + @NotNull(message = "单价不能为空") + @ExcelProperty(index = 7) + private BigDecimal materialPrice; + + @NotNull(message = "入库数量不能为空") + @ExcelProperty(index = 8) + @Positive(message = "数量必须为正整数") + private Long inInventoryNum; + + @NotNull(message = "采购日期不能为空") + @ExcelProperty(index = 9) + @JsonFormat(pattern = "yyyy-MM-dd") + private LocalDate buyDate; + + @NotEmpty(message = "供应商名称不能为空") + @ExcelProperty(index = 10) + private String supplierName; + + @NotEmpty(message = "联系人不能为空") + @ExcelProperty(index = 11) + private String contactsName; + + @NotEmpty(message = "联系电话不能为空") + @ExcelProperty(index = 12) + private String contactsPhone; + + @NotEmpty(message = "归属公司不能为空") + @ExcelProperty(index = 13) + private String belongCompanyName; +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MaterialInventoryOutImport.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MaterialInventoryOutImport.java new file mode 100644 index 0000000..0f189f0 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MaterialInventoryOutImport.java @@ -0,0 +1,69 @@ +package com.zteits.urbanops.module.garden.controller.admin.costfee.vo; + +import cn.idev.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * @Classname MaterialInventoryOutImport + * @Description 物料批量出库 + * @Date 2026/1/15 22:22 + * @Created by wangqian + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class MaterialInventoryOutImport { + + + + @ExcelProperty(index = 1) + @NotEmpty(message = "物料名称不能为空") + private String materialName; + + @NotEmpty(message = "耗材类型不能为空") + @ExcelProperty(index = 2) + private String materialTypeName; + + @NotEmpty(message = "类别名称不能为空") + @ExcelProperty(index = 3) + private String typeName; + + @NotEmpty(message = "类别明细不能为空") + @ExcelProperty(index = 4) + private String typeDetailName; + + @NotEmpty(message = "物料规格不能为空") + @ExcelProperty(index = 5) + private String specifications; + + @NotEmpty(message = "物料单位不能为空") + @ExcelProperty(index = 6) + private String unitName; + + @ExcelProperty(index = 7) + @NotNull(message = "出库数量不能为空") + @Positive(message = "数量必须为正整数") + private Long outInventoryNum; + + @NotNull(message = "出库日期不能为空") + @ExcelProperty(index = 8) + @JsonFormat(pattern = "yyyy-MM-dd") + private LocalDate outDate; + + @NotEmpty(message = "归属公司不能为空") + @ExcelProperty(index = 9) + private String belongCompanyName; +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MechanicalCostImport.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MechanicalCostImport.java index ea73b37..5e3ca15 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MechanicalCostImport.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MechanicalCostImport.java @@ -84,7 +84,7 @@ public class MechanicalCostImport { @ExcelProperty(index = 9) @NotNull(message = "使用年限不能为空") @Positive(message = "使用年限必须为正整数") - private Long serviceLife; + private Integer serviceLife; /** * 结束使用时间 diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/device/DeviceClockRecordController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/device/DeviceClockRecordController.java new file mode 100644 index 0000000..e42ca96 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/device/DeviceClockRecordController.java @@ -0,0 +1,104 @@ +package com.zteits.urbanops.module.garden.controller.admin.device; + +import org.springframework.web.bind.annotation.*; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import jakarta.validation.constraints.*; +import jakarta.validation.*; +import jakarta.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.CommonResult; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; + +import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; + +import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; +import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.*; + +import com.zteits.urbanops.module.garden.controller.admin.device.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.device.DeviceClockRecordDO; +import com.zteits.urbanops.module.garden.service.device.DeviceClockRecordService; + +@Tag(name = "管理后台 - 员工打卡记录") +@RestController +@RequestMapping("/garden/device-clock-record") +@Validated +public class DeviceClockRecordController { + + @Resource + private DeviceClockRecordService deviceClockRecordService; + + @PostMapping("/create") + @Operation(summary = "创建员工打卡记录") + @PreAuthorize("@ss.hasPermission('garden:device-clock-record:create')") + public CommonResult createDeviceClockRecord(@Valid @RequestBody DeviceClockRecordSaveReqVO createReqVO) { + return success(deviceClockRecordService.createDeviceClockRecord(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新员工打卡记录") + @PreAuthorize("@ss.hasPermission('garden:device-clock-record:update')") + public CommonResult updateDeviceClockRecord(@Valid @RequestBody DeviceClockRecordSaveReqVO updateReqVO) { + deviceClockRecordService.updateDeviceClockRecord(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除员工打卡记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('garden:device-clock-record:delete')") + public CommonResult deleteDeviceClockRecord(@RequestParam("id") Integer id) { + deviceClockRecordService.deleteDeviceClockRecord(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除员工打卡记录") + @PreAuthorize("@ss.hasPermission('garden:device-clock-record:delete')") + public CommonResult deleteDeviceClockRecordList(@RequestParam("ids") List ids) { + deviceClockRecordService.deleteDeviceClockRecordListByIds(ids); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得员工打卡记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('garden:device-clock-record:query')") + public CommonResult getDeviceClockRecord(@RequestParam("id") Integer id) { + DeviceClockRecordDO deviceClockRecord = deviceClockRecordService.getDeviceClockRecord(id); + return success(BeanUtils.toBean(deviceClockRecord, DeviceClockRecordRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得员工打卡记录分页") + @PreAuthorize("@ss.hasPermission('garden:device-clock-record:query')") + public CommonResult> getDeviceClockRecordPage(@Valid DeviceClockRecordPageReqVO pageReqVO) { + PageResult pageResult = deviceClockRecordService.getDeviceClockRecordPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, DeviceClockRecordRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出员工打卡记录 Excel") + @PreAuthorize("@ss.hasPermission('garden:device-clock-record:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportDeviceClockRecordExcel(@Valid DeviceClockRecordPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = deviceClockRecordService.getDeviceClockRecordPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "员工打卡记录.xls", "数据", DeviceClockRecordRespVO.class, + BeanUtils.toBean(list, DeviceClockRecordRespVO.class)); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/device/vo/DeviceClockRecordPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/device/vo/DeviceClockRecordPageReqVO.java new file mode 100644 index 0000000..b0124b3 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/device/vo/DeviceClockRecordPageReqVO.java @@ -0,0 +1,66 @@ +package com.zteits.urbanops.module.garden.controller.admin.device.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 员工打卡记录分页 Request VO") +@Data +public class DeviceClockRecordPageReqVO extends PageParam { + + @Schema(description = "设备编码") + private String deviceCode; + + @Schema(description = "设备名称", example = "李四") + private String deviceName; + + @Schema(description = "打卡类型:上班/下班", example = "2") + private String punchType; + + @Schema(description = "高德GCJ02坐标系纬度") + private BigDecimal latGcj02; + + @Schema(description = "高德GCJ02坐标系经度") + private BigDecimal lngGcj02; + + @Schema(description = "详细地址") + private String address; + + @Schema(description = "84坐标经度") + private BigDecimal lng; + + @Schema(description = "84坐标纬度") + private BigDecimal lat; + + @Schema(description = "状态位") + private Integer statusBit; + + @Schema(description = "警告位") + private Integer warnBit; + + @Schema(description = "提交人用户ID", example = "20708") + private Long userId; + + @Schema(description = "用户昵称", example = "张三") + private String nickname; + + @Schema(description = "归属(一级部门id)", example = "10917") + private Long companyId; + + @Schema(description = "部门ID", example = "126") + private Long deptId; + + @Schema(description = "业务线: yl-园林;wy-物业:sz-市政;例如:yl,wy") + private String busiLine; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/device/vo/DeviceClockRecordRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/device/vo/DeviceClockRecordRespVO.java new file mode 100644 index 0000000..a01eae2 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/device/vo/DeviceClockRecordRespVO.java @@ -0,0 +1,84 @@ +package com.zteits.urbanops.module.garden.controller.admin.device.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import cn.idev.excel.annotation.*; + +@Schema(description = "管理后台 - 员工打卡记录 Response VO") +@Data +@ExcelIgnoreUnannotated +public class DeviceClockRecordRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10971") + @ExcelProperty("主键ID") + private Integer id; + + @Schema(description = "设备编码", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("设备编码") + private String deviceCode; + + @Schema(description = "设备名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + @ExcelProperty("设备名称") + private String deviceName; + + @Schema(description = "打卡类型:上班/下班", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @ExcelProperty("打卡类型:上班/下班") + private String punchType; + + @Schema(description = "高德GCJ02坐标系纬度") + @ExcelProperty("高德GCJ02坐标系纬度") + private BigDecimal latGcj02; + + @Schema(description = "高德GCJ02坐标系经度") + @ExcelProperty("高德GCJ02坐标系经度") + private BigDecimal lngGcj02; + + @Schema(description = "详细地址") + @ExcelProperty("详细地址") + private String address; + + @Schema(description = "84坐标经度") + @ExcelProperty("84坐标经度") + private BigDecimal lng; + + @Schema(description = "84坐标纬度") + @ExcelProperty("84坐标纬度") + private BigDecimal lat; + + @Schema(description = "状态位") + @ExcelProperty("状态位") + private Integer statusBit; + + @Schema(description = "警告位") + @ExcelProperty("警告位") + private Integer warnBit; + + @Schema(description = "提交人用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "20708") + @ExcelProperty("提交人用户ID") + private Long userId; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @ExcelProperty("用户昵称") + private String nickname; + + @Schema(description = "归属(一级部门id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "10917") + @ExcelProperty("归属(一级部门id)") + private Long companyId; + + @Schema(description = "部门ID", example = "126") + @ExcelProperty("部门ID") + private Long deptId; + + @Schema(description = "业务线: yl-园林;wy-物业:sz-市政;例如:yl,wy", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("业务线: yl-园林;wy-物业:sz-市政;例如:yl,wy") + private String busiLine; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/device/vo/DeviceClockRecordSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/device/vo/DeviceClockRecordSaveReqVO.java new file mode 100644 index 0000000..909bdb7 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/device/vo/DeviceClockRecordSaveReqVO.java @@ -0,0 +1,68 @@ +package com.zteits.urbanops.module.garden.controller.admin.device.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import jakarta.validation.constraints.*; +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 员工打卡记录新增/修改 Request VO") +@Data +public class DeviceClockRecordSaveReqVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10971") + private Integer id; + + @Schema(description = "设备编码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "设备编码不能为空") + private String deviceCode; + + @Schema(description = "设备名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + @NotEmpty(message = "设备名称不能为空") + private String deviceName; + + @Schema(description = "打卡类型:上班/下班", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotEmpty(message = "打卡类型:上班/下班不能为空") + private String punchType; + + @Schema(description = "高德GCJ02坐标系纬度") + private BigDecimal latGcj02; + + @Schema(description = "高德GCJ02坐标系经度") + private BigDecimal lngGcj02; + + @Schema(description = "详细地址") + private String address; + + @Schema(description = "84坐标经度") + private BigDecimal lng; + + @Schema(description = "84坐标纬度") + private BigDecimal lat; + + @Schema(description = "状态位") + private Integer statusBit; + + @Schema(description = "警告位") + private Integer warnBit; + + @Schema(description = "提交人用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "20708") + @NotNull(message = "提交人用户ID不能为空") + private Long userId; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @NotEmpty(message = "用户昵称不能为空") + private String nickname; + + @Schema(description = "归属(一级部门id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "10917") + @NotNull(message = "归属(一级部门id)不能为空") + private Long companyId; + + @Schema(description = "部门ID", example = "126") + private Long deptId; + + @Schema(description = "业务线: yl-园林;wy-物业:sz-市政;例如:yl,wy", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "业务线: yl-园林;wy-物业:sz-市政;例如:yl,wy不能为空") + private String busiLine; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/DeviceUserController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/DeviceUserController.java index c20e690..86c0dc6 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/DeviceUserController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/DeviceUserController.java @@ -40,25 +40,32 @@ public class DeviceUserController { @PostMapping("/create") @Operation(summary = "创建设备用户关系") - @PreAuthorize("@ss.hasPermission('garden:device-user:create')") + // @PreAuthorize("@ss.hasPermission('garden:device-user:create')") public CommonResult createDeviceUser(@Valid @RequestBody DeviceUserSaveReqVO createReqVO) { return success(deviceUserService.createDeviceUser(createReqVO)); } - @PutMapping("/update") + @PutMapping("/update/device") @Operation(summary = "更新设备用户关系") - @PreAuthorize("@ss.hasPermission('garden:device-user:update')") - public CommonResult updateDeviceUser(@Valid @RequestBody DeviceUserSaveReqVO updateReqVO) { - deviceUserService.updateDeviceUser(updateReqVO); + //@PreAuthorize("@ss.hasPermission('garden:device-user:update')") + public CommonResult updateDevice(@Valid @RequestBody DeviceUserUpdateReqVO updateReqVO) { + deviceUserService.updateDevice(updateReqVO); return success(true); } + @GetMapping("/get/device_no") + @Operation(summary = "通过设备编码获取设备绑定信息") + public CommonResult getDeviceUserByDeviceNo(@RequestParam("deviceNo") @NotBlank String deviceNo) { + DeviceUserRespVO deviceUser = deviceUserService.getDeviceUserByDeviceNo(deviceNo); + return success(deviceUser); + } + @DeleteMapping("/delete") @Operation(summary = "删除设备用户关系") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('garden:device-user:delete')") - public CommonResult deleteDeviceUser(@RequestParam("user_id") @NotNull Long userId, - @RequestParam("device_no") @NotBlank String deviceNo) { + public CommonResult deleteDeviceUser(@RequestParam("userId") @NotNull Long userId, + @RequestParam("deviceNo") @NotBlank String deviceNo) { deviceUserService.deleteDeviceUser(userId, deviceNo); return success(true); } @@ -85,8 +92,8 @@ public class DeviceUserController { @Operation(summary = "获得设备用户关系分页") //@PreAuthorize("@ss.hasPermission('garden:device-user:query')") public CommonResult> getDeviceUserPage(@Valid DeviceUserPageReqVO pageReqVO) { - PageResult pageResult = deviceUserService.getDeviceUserPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, DeviceUserRespVO.class)); + PageResult pageResult = deviceUserService.getDeviceUserPage(pageReqVO); + return success(pageResult); } @GetMapping("/export-excel") @@ -96,10 +103,20 @@ public class DeviceUserController { public void exportDeviceUserExcel(@Valid DeviceUserPageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = deviceUserService.getDeviceUserPage(pageReqVO).getList(); + List list = deviceUserService.getDeviceUserPage(pageReqVO).getList(); // 导出 Excel ExcelUtils.write(response, "设备用户关系.xls", "数据", DeviceUserRespVO.class, - BeanUtils.toBean(list, DeviceUserRespVO.class)); + list); } + @PostMapping("/findDeviceDeptTree") + @Operation(summary = "获取IOT设备tree") + //@PreAuthorize("@ss.hasPermission('garden:device-user:query')") + public CommonResult findDeviceDeptTree(@Valid @RequestBody DeviceDeptTreeReqVO reqVO) { + DeviceDeptTreeRespVO deviceUser = deviceUserService.findDeviceDeptTree(reqVO); + return success(deviceUser); + } + + + } \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceDeptTreeReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceDeptTreeReqVO.java new file mode 100644 index 0000000..b78db76 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceDeptTreeReqVO.java @@ -0,0 +1,24 @@ +package com.zteits.urbanops.module.garden.controller.admin.deviceuser.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - IOT设备") +@Data +public class DeviceDeptTreeReqVO { + + /** + * 设备编码 精确查询 + */ + private String deviceCode; + + /** + * 设备名称 模糊查询 + */ + private String deviceName; + + /** + * 设备归属部门名称 模糊查询 + */ + private String deviceDeptName; +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceDeptTreeRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceDeptTreeRespVO.java new file mode 100644 index 0000000..85db1a6 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceDeptTreeRespVO.java @@ -0,0 +1,68 @@ +package com.zteits.urbanops.module.garden.controller.admin.deviceuser.vo; + + +import lombok.Data; +import java.util.Date; +import java.util.List; + +/** + * 设备部门树响应数据 + * + * @author your-name + * @since 2023-xx-xx + */ +@Data +public class DeviceDeptTreeRespVO { + + /** + * 编码 + */ + private String code; + + /** + * 名称 + */ + private String name; + /** + * 父编码 + */ + private String parentCode; + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 部门状态(0正常 1停用) + */ + private String status; + + /** + * 设备数量 + */ + private Integer deviceCount; + + /** + * 创建时间 + */ + private Date createTime; + /** + * 节点类型:1部门 3设备 + */ + private Integer nodeType; + + /** + * 节点类型为设备时,该值有值 + * 产品名称 + */ + private String productName; + /** + * 节点类型为设备时,该值有值 + * 产品编码 + */ + private String productCode; + /** + * 子节点,和当前一样的结构 + */ + private List children; +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserRespVO.java index 86689c8..2626933 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserRespVO.java @@ -57,5 +57,12 @@ public class DeviceUserRespVO { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; + @Schema(description = "归属(一级部门id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "20800") + @ExcelProperty("归属(一级部门id)") + private String companyName; + + @ExcelProperty("部门(道路负责部门)") + private String deptName; + } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserSaveReqVO.java index dc6b20e..002d604 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserSaveReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserSaveReqVO.java @@ -35,8 +35,10 @@ public class DeviceUserSaveReqVO { @Data public static class DeviceInfoDO { + + private String productCode; + @Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") - @NotEmpty(message = "产品名称不能为空") private String productName; @Schema(description = "设备标识", requiredMode = Schema.RequiredMode.REQUIRED) diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserUpdateReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserUpdateReqVO.java new file mode 100644 index 0000000..5f7b9e0 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserUpdateReqVO.java @@ -0,0 +1,42 @@ +package com.zteits.urbanops.module.garden.controller.admin.deviceuser.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; + +import java.util.List; + +@Schema(description = "管理后台 - 设备用户关系新增/修改 Request VO") +@Data +public class DeviceUserUpdateReqVO { + + @Schema(description = "设备信息") + @NotNull + @Size(min = 1, message = "道路信息不能为空") + @Valid + private List deviceInfoList; + + @Data + public static class DeviceInfoDO { + @Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @NotEmpty(message = "产品名称不能为空") + private String productName; + + @Schema(description = "设备标识", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "设备标识不能为空") + private String deviceNo; + + @Schema(description = "设备名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @NotEmpty(message = "设备名称不能为空") + private String deviceName; + + @Schema(description = "连接状态 : 在线:ONLINE || 离线:OFFLINE || 未连接:INIT", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "连接状态 : 在线:ONLINE || 离线:OFFLINE || 未连接:INIT") + private String deviceState; + + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/EmergencyTaskController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/EmergencyTaskController.java new file mode 100644 index 0000000..a84b95f --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/EmergencyTaskController.java @@ -0,0 +1,180 @@ +package com.zteits.urbanops.module.garden.controller.admin.emergencytask; + +import com.zteits.urbanops.framework.common.biz.system.dict.dto.DictDataRespDTO; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import jakarta.validation.*; +import jakarta.servlet.http.*; +import java.util.*; +import java.io.IOException; +import java.util.stream.Collectors; + +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.CommonResult; + +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; + +import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; + +import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; +import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.*; + +import com.zteits.urbanops.module.garden.controller.admin.emergencytask.vo.*; +import com.zteits.urbanops.module.garden.service.emergencytask.EmergencyTaskService; + +@Tag(name = "管理后台 - 抢险任务主") +@RestController +@RequestMapping("/garden/emergency-task") +@Validated +public class EmergencyTaskController { + + @Resource + private EmergencyTaskService emergencyTaskService; + + @PostMapping("/create") + @Operation(summary = "创建抢险任务主") + @PreAuthorize("@ss.hasPermission('garden:emergency-task:create')") + public CommonResult createEmergencyTask(@Valid @RequestBody EmergencyTaskSaveReqVO createReqVO) { + return success(emergencyTaskService.createEmergencyTask(createReqVO, true)); + } + + @PutMapping("/update") + @Operation(summary = "更新抢险任务主") + @PreAuthorize("@ss.hasPermission('garden:emergency-task:update')") + public CommonResult updateEmergencyTask(@Valid @RequestBody EmergencyTaskSaveReqVO updateReqVO) { + emergencyTaskService.updateEmergencyTask(updateReqVO); + return success(true); + } + + @PostMapping("/approval") + @Operation(summary = "抢险任务审批") + @PreAuthorize("@ss.hasPermission('garden:emergency-task:approval')") + public CommonResult approvalEmergencyTask(@Valid @RequestBody EmergencyTaskApprovalReqVO createReqVO) { + return success(emergencyTaskService.approvalEmergencyTask(createReqVO)); + } + + @DeleteMapping("/delete/task_no") + @Operation(summary = "删除抢险任务主") + @Parameter(name = "task_no", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('garden:emergency-task:delete')") + public CommonResult deleteEmergencyTask(@RequestParam("task_no") String taskNo) { + emergencyTaskService.deleteEmergencyTaskByTaskNo(taskNo); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除抢险任务主") + @PreAuthorize("@ss.hasPermission('garden:emergency-task:delete')") + public CommonResult deleteEmergencyTaskList(@RequestParam("ids") List ids) { + emergencyTaskService.deleteEmergencyTaskListByIds(ids); + return success(true); + } + + @GetMapping("/get/task_no") + @Operation(summary = "获得抢险任务主") + @Parameter(name = "task_no", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('garden:emergency-task:query')") + public CommonResult getEmergencyTask(@RequestParam("task_no") String taskNo) { + EmergencyTaskRespVO emergencyTask = emergencyTaskService.getEmergencyTaskByTaskNo(taskNo); + return success(emergencyTask); + } + + @GetMapping("/page") + @Operation(summary = "获得抢险任务主分页") + @PreAuthorize("@ss.hasPermission('garden:emergency-task:query')") + public CommonResult> getEmergencyTaskPage(@Valid EmergencyTaskPageReqVO pageReqVO) { + PageResult pageResult = emergencyTaskService.getEmergencyTaskPage(pageReqVO); + return success(pageResult); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出抢险任务主 Excel") + @PreAuthorize("@ss.hasPermission('garden:emergency-task:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportEmergencyTaskExcel(@Valid EmergencyTaskPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = emergencyTaskService.getEmergencyTaskPage(pageReqVO).getList(); + List respList = new ArrayList<>(); + + //险情类型 1:树木倒伏 2:树木折枝 + List dictDataList = emergencyTaskService.getDictDataList("hazard_type"); + + //险情危害 1:砸车 2:砸房 3:砸人 4:无 + List hazardRiskList = emergencyTaskService.getDictDataList("hazard_risk"); + //树木权属 1:专业权属 2:街道权属 3:其他 + List treePermissionsList = emergencyTaskService.getDictDataList("tree_permissions"); + //机械类型 1:三轮车;2:货车;3:挖掘机 + List mechanicalTypeNameList = emergencyTaskService.getDictDataList("mechanical_type_name"); + + //案件状态 1-待提交 2-待审核 3-驳回 + List rescueStatusList = emergencyTaskService.getDictDataList("rescue_status"); + + + list.forEach(emergencyTask -> { + EmergencyTaskExcleRespVO emergencyTaskExcleRespVO = new EmergencyTaskExcleRespVO(); + emergencyTaskExcleRespVO.setTaskNo(emergencyTask.getTaskNo()); + emergencyTaskExcleRespVO.setDiscoveryTime(emergencyTask.getDiscoveryTime()); + emergencyTaskExcleRespVO.setEmergencyTypeName(getLabel(dictDataList, emergencyTask.getEmergencyTypeId())); + emergencyTaskExcleRespVO.setEmergencyHarmName(getLabel(hazardRiskList, emergencyTask.getEmergencyHarmId())); + emergencyTaskExcleRespVO.setTreeOwnershipName(getLabel(treePermissionsList, emergencyTask.getTreeOwnershipId())); + emergencyTaskExcleRespVO.setEmergencyLocation(emergencyTask.getEmergencyLocation()); + emergencyTaskExcleRespVO.setReporter(emergencyTask.getReporter()); + emergencyTaskExcleRespVO.setContactPhone(emergencyTask.getContactPhone()); + emergencyTaskExcleRespVO.setEmergencyImg(emergencyTask.getEmergencyImg()); + emergencyTaskExcleRespVO.setTreeSpecies(emergencyTask.getTreeSpecies()); + emergencyTaskExcleRespVO.setTreeSpec(emergencyTask.getTreeSpec()); + emergencyTaskExcleRespVO.setRescueStartTime(emergencyTask.getRescueStartTime()); + emergencyTaskExcleRespVO.setRescueCompleteTime(emergencyTask.getRescueCompleteTime()); + emergencyTaskExcleRespVO.setPersonnelCount(emergencyTask.getPersonnelCount()); + emergencyTaskExcleRespVO.setEmergencyEndImg(emergencyTask.getEmergencyEndImg()); + emergencyTaskExcleRespVO.setRemarks(emergencyTask.getRemarks()); + emergencyTaskExcleRespVO.setBusiStatus(getLabel(rescueStatusList, emergencyTask.getBusiStatus())); + emergencyTaskExcleRespVO.setCompanyName(emergencyTask.getCompanyName()); + emergencyTaskExcleRespVO.setApprovalUserName(emergencyTask.getApprovalUserName()); + emergencyTaskExcleRespVO.setApprovalRemarks(emergencyTask.getApprovalRemarks()); + emergencyTaskExcleRespVO.setCreatorName(emergencyTask.getCreatorName()); + emergencyTaskExcleRespVO.setCreateTime(emergencyTask.getCreateTime()); + emergencyTaskExcleRespVO.setUpdaterName(emergencyTask.getUpdaterName()); + List machineryList = new ArrayList<>(); + if(CollectionUtils.isEmpty(emergencyTask.getEmergencyMachineryList())){ + emergencyTaskExcleRespVO.setMachineryInfo(Collections.emptyList()); + }else{ + emergencyTask.getEmergencyMachineryList().forEach(emergencyMachinery -> { + String machineryName = getLabel(mechanicalTypeNameList, emergencyMachinery.getMachineryNameId()); + Integer machineryCount = emergencyMachinery.getMachineryCount(); + machineryList.add(machineryName + ":" + machineryCount); + }); + emergencyTaskExcleRespVO.setMachineryInfo(machineryList); + } + respList.add(emergencyTaskExcleRespVO); + }); + + + // 导出 Excel + ExcelUtils.write(response, "抢险任务主.xls", "数据", EmergencyTaskExcleRespVO.class, respList); + } + + private String getLabel(List dictDataList, Integer id){ + if(CollectionUtils.isEmpty(dictDataList)){ + return ""; + } + Map nameMap = dictDataList.stream() + .collect(Collectors.toMap( + DictDataRespDTO::getValue, // Key=id + DictDataRespDTO::getLabel // Value=name + )); + + return nameMap.get(String.valueOf( id)); + } + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyMachineryPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyMachineryPageReqVO.java new file mode 100644 index 0000000..4ccc4cf --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyMachineryPageReqVO.java @@ -0,0 +1,35 @@ +package com.zteits.urbanops.module.garden.controller.admin.emergencytask.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 抢险机械子分页 Request VO") +@Data +public class EmergencyMachineryPageReqVO extends PageParam { + + @Schema(description = "关联任务主表ID", example = "24066") + private Long taskId; + + @Schema(description = "机械名称(如:三轮车)", example = "21485") + private Integer machineryNameId; + + @Schema(description = "机械数量", example = "28764") + private Integer machineryCount; + + @Schema(description = "创建者", example = "李四") + private String creatorName; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "更新者", example = "张三") + private String updaterName; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyMachineryRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyMachineryRespVO.java new file mode 100644 index 0000000..50f114f --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyMachineryRespVO.java @@ -0,0 +1,43 @@ +package com.zteits.urbanops.module.garden.controller.admin.emergencytask.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import cn.idev.excel.annotation.*; + +@Schema(description = "管理后台 - 抢险机械子 Response VO") +@Data +@ExcelIgnoreUnannotated +public class EmergencyMachineryRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1541") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "关联任务主表ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "24066") + @ExcelProperty("关联任务主表ID") + private Long taskId; + + @Schema(description = "机械名称(如:三轮车)", requiredMode = Schema.RequiredMode.REQUIRED, example = "21485") + @ExcelProperty("机械名称(如:三轮车)") + private Integer machineryNameId; + + @Schema(description = "机械数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "28764") + @ExcelProperty("机械数量") + private Integer machineryCount; + + @Schema(description = "创建者", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + @ExcelProperty("创建者") + private String creatorName; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "更新者", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @ExcelProperty("更新者") + private String updaterName; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyMachinerySaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyMachinerySaveReqVO.java new file mode 100644 index 0000000..3923168 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyMachinerySaveReqVO.java @@ -0,0 +1,20 @@ +package com.zteits.urbanops.module.garden.controller.admin.emergencytask.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import jakarta.validation.constraints.*; + +@Schema(description = "管理后台 - 抢险机械子新增/修改 Request VO") +@Data +public class EmergencyMachinerySaveReqVO { + + @Schema(description = "机械名称(如:三轮车)", requiredMode = Schema.RequiredMode.REQUIRED, example = "21485") + @NotNull(message = "机械名称(如:三轮车)不能为空") + private Integer machineryNameId; + + @Schema(description = "机械数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "28764") + @NotNull(message = "机械数量不能为空") + private Integer machineryCount; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskApprovalReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskApprovalReqVO.java new file mode 100644 index 0000000..94be619 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskApprovalReqVO.java @@ -0,0 +1,25 @@ +package com.zteits.urbanops.module.garden.controller.admin.emergencytask.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.*; +import lombok.Data; + +@Schema(description = "管理后台 - 抢险任务主新增/修改 Request VO") +@Data +public class EmergencyTaskApprovalReqVO { + + @Schema(description = "任务编号(唯一标识,如生成规则:TASK+时间戳)", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "任务编号(唯一标识,如生成规则:TASK+时间戳)不能为空") + private String taskNo; + + + @Schema(description = "案件状态 1-待提交 2-待审核 3-驳回 4-关闭;5-完结", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "案件状态 1-待提交 2-待审核 3-驳回 4-关闭;5-完结 不能为空") + @Min(value = 1, message = "案件状态 1-待提交 2-待审核 3-驳回 4-关闭;5-完结不能小于 1") + @Max(value = 5, message = "案件状态 1-待提交 2-待审核 3-驳回 4-关闭;5-完结不能大于 5") + private Integer busiStatus; + + @Schema(description = "审批备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "审批备注") + private String approvalRemarks; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskExcleRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskExcleRespVO.java new file mode 100644 index 0000000..41cf6d2 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskExcleRespVO.java @@ -0,0 +1,119 @@ +package com.zteits.urbanops.module.garden.controller.admin.emergencytask.vo; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.write.style.ColumnWidth; +import com.zteits.urbanops.framework.excel.core.convert.ImageListConverter; +import com.zteits.urbanops.framework.excel.core.convert.ListToStringConverter; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 抢险任务主 Response VO") +@Data +@ExcelIgnoreUnannotated +public class EmergencyTaskExcleRespVO { + + @Schema(description = "任务编号(唯一标识,如生成规则:TASK+时间戳)", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("案件编号") + private String taskNo; + + @Schema(description = "发现险情时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("发现险情时间") + private LocalDateTime discoveryTime; + + @Schema(description = "险情类型(如:树木倒伏)", requiredMode = Schema.RequiredMode.REQUIRED, example = "5209") + @ExcelProperty("险情类型") + private String emergencyTypeName; + + @Schema(description = "险情危害(如:无)", requiredMode = Schema.RequiredMode.REQUIRED, example = "16325") + @ExcelProperty("险情危害") + private String emergencyHarmName; + + @Schema(description = "树木权属(如:专业权属)", requiredMode = Schema.RequiredMode.REQUIRED, example = "19498") + @ExcelProperty("树木权属") + private String treeOwnershipName; + + @Schema(description = "险情地点", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("险情地点") + private String emergencyLocation; + + @Schema(description = "上报人", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("上报人") + private String reporter; + + @Schema(description = "联系电话", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("联系电话") + private String contactPhone; + + @Schema(description = "抢险开始时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("抢险开始时间") + private LocalDateTime rescueStartTime; + + @Schema(description = "抢险中照片", requiredMode = Schema.RequiredMode.REQUIRED) + //@ExcelProperty(value="抢险中照片", converter = ListToStringConverter.class) + @ExcelProperty(value = "抢险中照片", converter = ImageListConverter.class) + @ColumnWidth(70) + private List emergencyImg; + + @Schema(description = "树种(如:国槐)") + @ExcelProperty("树种") + private String treeSpecies; + + @Schema(description = "树木规格") + @ExcelProperty("树木规格") + private String treeSpec; + + @Schema(description = "抢险完成时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("抢险完成时间") + private LocalDateTime rescueCompleteTime; + + @Schema(description = "出动人员数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "3371") + @ExcelProperty("出动人员数量") + private Integer personnelCount; + + @Schema(description = "抢险结束照片", requiredMode = Schema.RequiredMode.REQUIRED) + //@ExcelProperty(value="抢险结束照片", converter = ListToStringConverter.class) + @ExcelProperty(value = "抢险结束照片", converter = ImageListConverter.class) + @ColumnWidth(70) + private List emergencyEndImg; + + @Schema(description = "备注") + @ExcelProperty("备注") + private String remarks; + + @Schema(description = "案件状态 1-待提交 2-待审核 3-驳回 4-关闭;5-完结", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("案件状态") + private String busiStatus; + + @Schema(description = "审批人", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + @ExcelProperty("审批人") + private String approvalUserName; + + @Schema(description = "审批备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "审批备注") + @ExcelProperty("审批备注") + private String approvalRemarks; + + + @Schema(description = "创建者", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + @ExcelProperty("创建者") + private String creatorName; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "更新者", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @ExcelProperty("更新者") + private String updaterName; + + @ExcelProperty(value="机械信息", converter = ListToStringConverter.class) + private List machineryInfo; + + @Schema(description = "归属(一级部门id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "20800") + @ExcelProperty("归属公司") + private String companyName; + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskPageReqVO.java new file mode 100644 index 0000000..30a4253 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskPageReqVO.java @@ -0,0 +1,52 @@ +package com.zteits.urbanops.module.garden.controller.admin.emergencytask.vo; + +import lombok.*; + +import java.time.LocalDate; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; +import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 抢险任务主分页 Request VO") +@Data +public class EmergencyTaskPageReqVO extends PageParam { + + @Schema(description = "任务编号(唯一标识,如生成规则:TASK+时间戳)") + private String taskNo; + + @Schema(description = "险情类型(如:树木倒伏)", example = "5209") + private Integer emergencyTypeId; + + @Schema(description = "险情危害(如:无)", example = "16325") + private Integer emergencyHarmId; + + @Schema(description = "树木权属(如:专业权属)", example = "19498") + private Integer treeOwnershipId; + + @Schema(description = "险情地点") + private String emergencyLocation; + + @Schema(description = "抢险开始时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate startTime; + + @Schema(description = "抢险结束时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate endTime; + + + @Schema(description = "案件状态 1-待提交 2-待审核 3-驳回 4-关闭;5-完结", example = "1") + private Integer busiStatus; + + @Schema(description = "归属(一级部门id)", example = "6353") + private Long companyId; + + + private List busiStatusList; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskRespVO.java new file mode 100644 index 0000000..e2a7f39 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskRespVO.java @@ -0,0 +1,139 @@ +package com.zteits.urbanops.module.garden.controller.admin.emergencytask.vo; + +import com.zteits.urbanops.framework.excel.core.convert.ListToStringConverter; +import com.zteits.urbanops.module.garden.dal.dataobject.emergencytask.EmergencyMachineryDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import cn.idev.excel.annotation.*; + +@Schema(description = "管理后台 - 抢险任务主 Response VO") +@Data +@ExcelIgnoreUnannotated +public class EmergencyTaskRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10092") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "任务编号(唯一标识,如生成规则:TASK+时间戳)", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("任务编号(唯一标识,如生成规则:TASK+时间戳)") + private String taskNo; + + @Schema(description = "发现险情时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("发现险情时间") + private LocalDateTime discoveryTime; + + @Schema(description = "险情类型(如:树木倒伏)", requiredMode = Schema.RequiredMode.REQUIRED, example = "5209") + @ExcelProperty("险情类型:1:树木倒伏 2:树木折枝") + private Integer emergencyTypeId; + + @Schema(description = "险情危害(如:无)", requiredMode = Schema.RequiredMode.REQUIRED, example = "16325") + @ExcelProperty("险情危害(如:无)") + private Integer emergencyHarmId; + + @Schema(description = "树木权属(如:专业权属)", requiredMode = Schema.RequiredMode.REQUIRED, example = "19498") + @ExcelProperty("树木权属 1:砸车 2:砸房 3:砸人 4:无") + private Integer treeOwnershipId; + + @Schema(description = "险情地点", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("险情地点") + private String emergencyLocation; + + @Schema(description = "上报人", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("上报人") + private String reporter; + + @Schema(description = "联系电话", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("联系电话") + private String contactPhone; + + @Schema(description = "抢险开始时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("抢险开始时间") + private LocalDateTime rescueStartTime; + + @Schema(description = "抢险中照片", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty(value="抢险中照片", converter = ListToStringConverter.class) + private List emergencyImg; + + @Schema(description = "树种(如:国槐)") + @ExcelProperty("树种(如:国槐)") + private String treeSpecies; + + @Schema(description = "树木规格(如:胸径20厘米)") + @ExcelProperty("树木规格(如:胸径20厘米)") + private String treeSpec; + + @Schema(description = "抢险完成时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("抢险完成时间") + private LocalDateTime rescueCompleteTime; + + @Schema(description = "出动人员数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "3371") + @ExcelProperty("出动人员数量") + private Integer personnelCount; + + @Schema(description = "抢险结束照片", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty(value="抢险结束照片", converter = ListToStringConverter.class) + private List emergencyEndImg; + + @Schema(description = "备注") + @ExcelProperty("备注") + private String remarks; + + @Schema(description = "案件状态 1-待提交 2-待审核 3-驳回 4-关闭;5-完结", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("案件状态 1-待提交 2-待审核 3-驳回 4-关闭;5-完结") + private Integer busiStatus; + + @Schema(description = "工作流审批状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("工作流审批状态") + private Integer status; + + @Schema(description = "流程实例的编号", example = "30197") + @ExcelProperty("流程实例的编号") + private String processInstanceId; + + @Schema(description = "审批人ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "20789") + @ExcelProperty("审批人ID") + private String approvalUserId; + + @Schema(description = "审批人", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + @ExcelProperty("审批人") + private String approvalUserName; + + @Schema(description = "审批备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "审批备注") + @ExcelProperty("审批备注") + private String approvalRemarks; + + @Schema(description = "归属(一级部门id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "6353") + @ExcelProperty("归属(一级部门id)") + private Long companyId; + + @Schema(description = "部门ID(道路负责部门id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "27559") + @ExcelProperty("部门ID(道路负责部门id)") + private Long deptId; + + @Schema(description = "创建者", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + @ExcelProperty("创建者") + private String creatorName; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "更新者", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @ExcelProperty("更新者") + private String updaterName; + + @ExcelProperty(value="机械信息", converter = ListToStringConverter.class) + private List emergencyMachineryList; + + @Schema(description = "归属(一级部门id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "20800") + @ExcelProperty("归属(一级部门id)") + private String companyName; + + @Schema(description = "部门(道路负责部门id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "12055") + @ExcelProperty("部门") + private String deptName; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskSaveReqVO.java new file mode 100644 index 0000000..5583125 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskSaveReqVO.java @@ -0,0 +1,99 @@ +package com.zteits.urbanops.module.garden.controller.admin.emergencytask.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import jakarta.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 抢险任务主新增/修改 Request VO") +@Data +public class EmergencyTaskSaveReqVO { + + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "30197") + private String taskNo; + + @Schema(description = "发现险情时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "发现险情时间不能为空") + private LocalDateTime discoveryTime; + + @Schema(description = "险情类型(如:树木倒伏)", requiredMode = Schema.RequiredMode.REQUIRED, example = "5209") + @NotNull(message = "险情类型(如:树木倒伏)不能为空") + private Integer emergencyTypeId; + + @Schema(description = "险情危害(如:无)", requiredMode = Schema.RequiredMode.REQUIRED, example = "16325") + @NotNull(message = "险情危害(如:无)不能为空") + private Integer emergencyHarmId; + + @Schema(description = "树木权属(如:专业权属)", requiredMode = Schema.RequiredMode.REQUIRED, example = "19498") + @NotNull(message = "树木权属(如:专业权属)不能为空") + private Integer treeOwnershipId; + + @Schema(description = "险情地点", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "险情地点不能为空") + @Size(max = 100, message = "险情地点长度不能超过 100 个字符") + private String emergencyLocation; + + @Schema(description = "上报人", requiredMode = Schema.RequiredMode.REQUIRED) + private String reporter; + + @Schema(description = "联系电话", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "联系电话不能为空") + @Pattern(regexp = "^1[3-9]\\d{9}$", message = "联系电话格式不正确,应为 11 位手机号") + private String contactPhone; + + @Schema(description = "抢险开始时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "抢险开始时间不能为空") + private LocalDateTime rescueStartTime; + + @Schema(description = "抢险中照片", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "抢险中照片不能为空") + @Size(min = 1, message = "抢险中照片最少1张") + private List emergencyImg; + + @Schema(description = "树种(如:国槐)") + @Size(max = 100, message = "险情地点长度不能超过 255 个字符") + private String treeSpecies; + + @Schema(description = "树木规格(如:胸径20厘米)") + @Size(max = 100, message = "树木规格100个字符") + private String treeSpec; + + @Schema(description = "抢险完成时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "抢险完成时间不能为空") + private LocalDateTime rescueCompleteTime; + + @Schema(description = "出动人员数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "3371") + @NotNull(message = "出动人员数量不能为空") + private Integer personnelCount; + + @Schema(description = "抢险结束照片", requiredMode = Schema.RequiredMode.REQUIRED) + private List emergencyEndImg; + + @Schema(description = "备注") + private String remarks; + + @Schema(description = "案件状态 1-待提交 2-待审核 3-驳回 4-关闭;5-完结", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "案件状态 1-待提交 2-待审核 3-驳回 4-关闭;5-完结不能为空") + private Integer busiStatus; + + @Schema(description = "工作流审批状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "工作流审批状态不能为空") + private Integer status; + + @Schema(description = "流程实例的编号", example = "30197") + private String processInstanceId; + + @Schema(description = "审批人ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "20789") + @NotEmpty(message = "审批人ID不能为空") + private String approvalUserId; + + @Schema(description = "审批人", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + @NotEmpty(message = "审批人不能为空") + private String approvalUserName; + + @Schema(description = "使用机械", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + private List emergencyMachineryList; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitTaskStatisticsRespVo.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitTaskStatisticsRespVo.java index 3500d39..06392eb 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitTaskStatisticsRespVo.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitTaskStatisticsRespVo.java @@ -13,6 +13,8 @@ public class CommitTaskStatisticsRespVo { private String dateValue; + private String currentDate; + private String busiLine; private String busiLineName; diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/WorkOrderTrendRespVo.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/WorkOrderTrendRespVo.java index 1111295..3a93cf6 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/WorkOrderTrendRespVo.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/WorkOrderTrendRespVo.java @@ -19,7 +19,7 @@ public class WorkOrderTrendRespVo { private String companyName; - private String totalCount; + private Integer totalCount; } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/InspectionPlanCommitController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/InspectionPlanCommitController.java index 56e51ca..f1bce26 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/InspectionPlanCommitController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/InspectionPlanCommitController.java @@ -1,5 +1,8 @@ package com.zteits.urbanops.module.garden.controller.admin.inspectionplan; +import com.zteits.urbanops.framework.common.biz.system.permission.dto.DeptDataPermissionRespDTO; +import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; +import com.zteits.urbanops.module.system.api.permission.PermissionApi; import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -37,6 +40,9 @@ public class InspectionPlanCommitController { @Resource private InspectionPlanCommitService inspectionPlanCommitService; + @Resource + private PermissionApi permissionApi; + @PostMapping("/create") @Operation(summary = "创建巡检计划提交明细") @PreAuthorize("@ss.hasPermission('garden:inspection-plan-commit:create')") @@ -83,6 +89,9 @@ public class InspectionPlanCommitController { @Operation(summary = "获得巡检计划提交明细分页") @PreAuthorize("@ss.hasPermission('garden:inspection-plan-commit:query')") public CommonResult> getInspectionPlanCommitPage(@Valid InspectionPlanCommitPageReqVO pageReqVO) { + //获取登录人权限 + DeptDataPermissionRespDTO deptDataPermission = permissionApi.getDeptDataPermission(SecurityFrameworkUtils.getLoginUserId()); + pageReqVO.setDeptIds(deptDataPermission.getDeptIds()); PageResult pageResult = inspectionPlanCommitService.getInspectionPlanCommitPage(pageReqVO); return success(BeanUtils.toBean(pageResult, InspectionPlanCommitRespVO.class)); } @@ -100,4 +109,4 @@ public class InspectionPlanCommitController { BeanUtils.toBean(list, InspectionPlanCommitRespVO.class)); } -} \ No newline at end of file +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/InspectionPlanController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/InspectionPlanController.java index d5a2cac..0c666fd 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/InspectionPlanController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/InspectionPlanController.java @@ -1,10 +1,12 @@ package com.zteits.urbanops.module.garden.controller.admin.inspectionplan; import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; +import com.zteits.urbanops.framework.common.biz.system.permission.dto.DeptDataPermissionRespDTO; import com.zteits.urbanops.framework.common.pojo.CommonResult; import com.zteits.urbanops.framework.common.pojo.PageParam; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import com.zteits.urbanops.framework.datapermission.core.annotation.DataPermission; import com.zteits.urbanops.framework.datapermission.core.util.DataPermissionUtils; import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; @@ -40,6 +42,7 @@ import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.PLAN_RA @RequestMapping("/garden/inspection-plan") @Validated @Slf4j +@DataPermission(enable = false) public class InspectionPlanController { @Resource @@ -123,14 +126,22 @@ public class InspectionPlanController { @Operation(summary = "获得巡检计划汇总分页") @PreAuthorize("@ss.hasPermission('garden:inspection-plan:query')") public CommonResult> getInspectionPlanPage(@Valid InspectionPlanPageReqVO pageReqVO) { - Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); - if(pageReqVO.getCompanyId() == null){ - if(permissionApi.hasAnyRoles(loginUserId, "super_admin")){ - pageReqVO.setCompanyId( null); - }else{ - pageReqVO.setCompanyId(SecurityFrameworkUtils.getCompanyId()); - } - } +// Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); +// if(pageReqVO.getCompanyId() == null){ +// if(permissionApi.hasAnyRoles(loginUserId, "super_admin")){ +// pageReqVO.setCompanyId( null); +// }else{ +// Long companyId = SecurityFrameworkUtils.getCompanyId(); +// if(null == companyId || companyId == 0L || companyId == 100L){ +// companyId = null; +// } +// pageReqVO.setCompanyId(companyId); +// } +// } + + //获取登录人权限 + DeptDataPermissionRespDTO deptDataPermission = permissionApi.getDeptDataPermission(SecurityFrameworkUtils.getLoginUserId()); + pageReqVO.setDeptIds(deptDataPermission.getDeptIds()); PageResult pageResult = inspectionPlanService.getInspectionPlanPage(pageReqVO); return success(pageResult); } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanCommitPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanCommitPageReqVO.java index 8e1bdbd..6d9c6d5 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanCommitPageReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanCommitPageReqVO.java @@ -4,6 +4,7 @@ import lombok.*; import java.time.LocalDate; import java.util.List; +import java.util.Set; import io.swagger.v3.oas.annotations.media.Schema; import com.zteits.urbanops.framework.common.pojo.PageParam; @@ -71,4 +72,6 @@ public class InspectionPlanCommitPageReqVO extends PageParam { @Schema(description = "创建结束时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) private LocalDate createTimeEnd; -} \ No newline at end of file + + private Set deptIds; +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanPageReqVO.java index a1ce769..ad3053d 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanPageReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanPageReqVO.java @@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import com.zteits.urbanops.framework.common.pojo.PageParam; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; +import java.util.Set; import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -52,4 +53,5 @@ public class InspectionPlanPageReqVO extends PageParam { @Schema(description = "完成状态 : 1:未完成;2:已完成") private Integer finishState; -} \ No newline at end of file + private Set deptIds; +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/MaintainPlanCommitController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/MaintainPlanCommitController.java index 7ded608..4c5568b 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/MaintainPlanCommitController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/MaintainPlanCommitController.java @@ -1,5 +1,8 @@ package com.zteits.urbanops.module.garden.controller.admin.maintainplan; +import com.zteits.urbanops.framework.common.biz.system.permission.dto.DeptDataPermissionRespDTO; +import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; +import com.zteits.urbanops.module.system.api.permission.PermissionApi; import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -37,6 +40,10 @@ public class MaintainPlanCommitController { @Resource private MaintainPlanCommitService maintainPlanCommitService; + @Resource + private PermissionApi permissionApi; + + @PostMapping("/create") @Operation(summary = "创建养护计划明细") @PreAuthorize("@ss.hasPermission('garden:maintain-plan-commit:create')") @@ -92,6 +99,9 @@ public class MaintainPlanCommitController { @Operation(summary = "获得养护计划明细分页") @PreAuthorize("@ss.hasPermission('garden:maintain-plan-commit:query')") public CommonResult> getMaintainPlanCommitPage(@Valid MaintainPlanCommitPageReqVO pageReqVO) { + //获取登录人权限 + DeptDataPermissionRespDTO deptDataPermission = permissionApi.getDeptDataPermission(SecurityFrameworkUtils.getLoginUserId()); + pageReqVO.setDeptIds(deptDataPermission.getDeptIds()); PageResult pageResult = maintainPlanCommitService.getMaintainPlanCommitPage(pageReqVO); return success(pageResult); } @@ -109,4 +119,4 @@ public class MaintainPlanCommitController { BeanUtils.toBean(list, MaintainPlanCommitRespVO.class)); } -} \ No newline at end of file +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/MaintainPlanController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/MaintainPlanController.java index 9b42aa2..4960c86 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/MaintainPlanController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/MaintainPlanController.java @@ -1,10 +1,12 @@ package com.zteits.urbanops.module.garden.controller.admin.maintainplan; import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; +import com.zteits.urbanops.framework.common.biz.system.permission.dto.DeptDataPermissionRespDTO; import com.zteits.urbanops.framework.common.pojo.CommonResult; import com.zteits.urbanops.framework.common.pojo.PageParam; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import com.zteits.urbanops.framework.datapermission.core.annotation.DataPermission; import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; import com.zteits.urbanops.module.garden.controller.admin.maintainplan.vo.MaintainPlanPageReqVO; @@ -39,6 +41,7 @@ import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.PLAN_RA @RequestMapping("/garden/maintain-plan") @Validated @Slf4j +@DataPermission(enable = false) public class MaintainPlanController { @Resource @@ -122,14 +125,21 @@ public class MaintainPlanController { @Operation(summary = "获得养护计划汇总分页") @PreAuthorize("@ss.hasPermission('garden:maintain-plan:query')") public CommonResult> getMaintainPlanPage(@Valid MaintainPlanPageReqVO pageReqVO) { - if(pageReqVO.getCompanyId() == null){ - Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); - if(permissionApi.hasAnyRoles(loginUserId, "super_admin")){ - pageReqVO.setCompanyId( null); - }else{ - pageReqVO.setCompanyId(SecurityFrameworkUtils.getCompanyId()); - } - } +// if(pageReqVO.getCompanyId() == null){ +// Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); +// if(permissionApi.hasAnyRoles(loginUserId, "super_admin")){ +// pageReqVO.setCompanyId( null); +// }else{ +// Long companyId = SecurityFrameworkUtils.getCompanyId(); +// if(null == companyId || companyId == 0L || companyId == 100L){ +// companyId = null; +// } +// pageReqVO.setCompanyId(companyId); +// } +// } + //获取登录人权限 + DeptDataPermissionRespDTO deptDataPermission = permissionApi.getDeptDataPermission(SecurityFrameworkUtils.getLoginUserId()); + pageReqVO.setDeptIds(deptDataPermission.getDeptIds()); PageResult pageResult = maintainPlanService.getMaintainPlanPage(pageReqVO); return success(pageResult); } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanCommitPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanCommitPageReqVO.java index 5106a68..75b81b3 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanCommitPageReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanCommitPageReqVO.java @@ -7,6 +7,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import com.zteits.urbanops.framework.common.pojo.PageParam; import org.springframework.format.annotation.DateTimeFormat; import java.util.List; +import java.util.Set; import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -68,4 +69,5 @@ public class MaintainPlanCommitPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) private LocalDate createTimeEnd; + private Set deptIds; } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanPageReqVO.java index 546f05b..bc2e044 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanPageReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanPageReqVO.java @@ -7,6 +7,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import com.zteits.urbanops.framework.common.pojo.PageParam; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; +import java.util.Set; import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -53,4 +54,6 @@ public class MaintainPlanPageReqVO extends PageParam { @Schema(description = "完成状态 : 1:未完成;2:已完成") private Integer finishState; -} \ No newline at end of file + private Set deptIds; + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/material/vo/MaterialSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/material/vo/MaterialSaveReqVO.java index 65222b1..c644824 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/material/vo/MaterialSaveReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/material/vo/MaterialSaveReqVO.java @@ -69,7 +69,6 @@ public class MaterialSaveReqVO { private String unitName; @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "随便") - @NotEmpty(message = "备注不能为空") private String remark; @Schema(description = "是否关联工单:0-否,1-是") diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialinventory/vo/MaterialInventoryPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialinventory/vo/MaterialInventoryPageReqVO.java index 88b1fb0..40cc3d6 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialinventory/vo/MaterialInventoryPageReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialinventory/vo/MaterialInventoryPageReqVO.java @@ -71,4 +71,6 @@ public class MaterialInventoryPageReqVO extends PageParam { @Schema(description = "部门ID", example = "11349") private Long deptId; -} \ No newline at end of file + @Schema(description = "出库查询", example = "0") + private Integer outInventoryQuery; +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialinventoryout/vo/MaterialInventoryOutSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialinventoryout/vo/MaterialInventoryOutSaveReqVO.java index a92e3f9..5abdaee 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialinventoryout/vo/MaterialInventoryOutSaveReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialinventoryout/vo/MaterialInventoryOutSaveReqVO.java @@ -13,6 +13,9 @@ public class MaterialInventoryOutSaveReqVO { @Schema(description = "入库ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "18713") private Long id; + @Schema(description = "库存ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "库存ID不能为空") + private Long inventoryId; @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14541") @NotNull(message = "物料ID不能为空") diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialname/MaterialNameController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialname/MaterialNameController.java new file mode 100644 index 0000000..ecc1d48 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialname/MaterialNameController.java @@ -0,0 +1,119 @@ +package com.zteits.urbanops.module.garden.controller.admin.materialname; + +import org.springframework.web.bind.annotation.*; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import jakarta.validation.constraints.*; +import jakarta.validation.*; +import jakarta.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.CommonResult; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; + +import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; + +import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; +import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.*; + +import com.zteits.urbanops.module.garden.controller.admin.materialname.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.materialname.MaterialNameDO; +import com.zteits.urbanops.module.garden.service.materialname.MaterialNameService; + +@Tag(name = "管理后台 - 物料名称") +@RestController +@RequestMapping("/garden/material-name") +@Validated +public class MaterialNameController { + + @Resource + private MaterialNameService materialNameService; + + @PostMapping("/create") + @Operation(summary = "创建物料名称") + @PreAuthorize("@ss.hasPermission('garden:material-name:create')") + public CommonResult createMaterialName(@Valid @RequestBody MaterialNameSaveReqVO createReqVO) { + return success(materialNameService.createMaterialName(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新物料名称") + @PreAuthorize("@ss.hasPermission('garden:material-name:update')") + public CommonResult updateMaterialName(@Valid @RequestBody MaterialNameSaveReqVO updateReqVO) { + materialNameService.updateMaterialName(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除物料名称") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('garden:material-name:delete')") + public CommonResult deleteMaterialName(@RequestParam("id") Long id) { + materialNameService.deleteMaterialName(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除物料名称") + @PreAuthorize("@ss.hasPermission('garden:material-name:delete')") + public CommonResult deleteMaterialNameList(@RequestParam("ids") List ids) { + materialNameService.deleteMaterialNameListByIds(ids); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得物料名称") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('garden:material-name:query')") + public CommonResult getMaterialName(@RequestParam("id") Long id) { + MaterialNameDO materialName = materialNameService.getMaterialName(id); + return success(BeanUtils.toBean(materialName, MaterialNameRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得物料名称分页") + @PreAuthorize("@ss.hasPermission('garden:material-name:query')") + public CommonResult> getMaterialNamePage(@Valid MaterialNamePageReqVO pageReqVO) { + PageResult pageResult = materialNameService.getMaterialNamePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, MaterialNameRespVO.class)); + } + + @GetMapping("/list") + @Operation(summary = "获得物料名称列表(支持模糊搜索)") + @PreAuthorize("@ss.hasPermission('garden:material-name:query')") + public CommonResult> getMaterialNameList( + @RequestParam(value = "materialName", required = false) String materialName) { + // 构建查询条件 + MaterialNamePageReqVO pageReqVO = new MaterialNamePageReqVO(); + pageReqVO.setMaterialName(materialName); + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + + // 查询数据 + List list = materialNameService.getMaterialNamePage(pageReqVO).getList(); + return success(BeanUtils.toBean(list, MaterialNameRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出物料名称 Excel") + @PreAuthorize("@ss.hasPermission('garden:material-name:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportMaterialNameExcel(@Valid MaterialNamePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = materialNameService.getMaterialNamePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "物料名称.xls", "数据", MaterialNameRespVO.class, + BeanUtils.toBean(list, MaterialNameRespVO.class)); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialname/vo/MaterialNamePageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialname/vo/MaterialNamePageReqVO.java new file mode 100644 index 0000000..48e0893 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialname/vo/MaterialNamePageReqVO.java @@ -0,0 +1,32 @@ +package com.zteits.urbanops.module.garden.controller.admin.materialname.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 物料名称分页 Request VO") +@Data +public class MaterialNamePageReqVO extends PageParam { + + @Schema(description = "物料名称ID", example = "14631") + private Long materialId; + + @Schema(description = "物料名称", example = "张三") + private String materialName; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "部门ID", example = "23084") + private Long deptId; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialname/vo/MaterialNameRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialname/vo/MaterialNameRespVO.java new file mode 100644 index 0000000..0a567c4 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialname/vo/MaterialNameRespVO.java @@ -0,0 +1,39 @@ +package com.zteits.urbanops.module.garden.controller.admin.materialname.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import cn.idev.excel.annotation.*; + +@Schema(description = "管理后台 - 物料名称 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MaterialNameRespVO { + + @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "32592") + @ExcelProperty("自增主键") + private Long id; + + @Schema(description = "物料名称ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14631") + @ExcelProperty("物料名称ID") + private Long materialId; + + @Schema(description = "物料名称", example = "张三") + @ExcelProperty("物料名称") + private String materialName; + + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "创建时间") + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "部门ID", example = "23084") + @ExcelProperty("部门ID") + private Long deptId; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialname/vo/MaterialNameSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialname/vo/MaterialNameSaveReqVO.java new file mode 100644 index 0000000..d2b4be4 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialname/vo/MaterialNameSaveReqVO.java @@ -0,0 +1,28 @@ +package com.zteits.urbanops.module.garden.controller.admin.materialname.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import jakarta.validation.constraints.*; + +@Schema(description = "管理后台 - 物料名称新增/修改 Request VO") +@Data +public class MaterialNameSaveReqVO { + + @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "32592") + private Long id; + + @Schema(description = "物料名称ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14631") + private Long materialId; + + @NotEmpty(message = "物料名称不能为空") + @Schema(description = "物料名称", example = "张三") + private String materialName; + + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") + private String remark; + + @Schema(description = "部门ID", example = "23084") + private Long deptId; + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialspecification/MaterialSpecificationController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialspecification/MaterialSpecificationController.java new file mode 100644 index 0000000..5da0b65 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialspecification/MaterialSpecificationController.java @@ -0,0 +1,119 @@ +package com.zteits.urbanops.module.garden.controller.admin.materialspecification; + +import org.springframework.web.bind.annotation.*; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import jakarta.validation.constraints.*; +import jakarta.validation.*; +import jakarta.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.CommonResult; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; + +import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; + +import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; +import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.*; + +import com.zteits.urbanops.module.garden.controller.admin.materialspecification.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.materialspecification.MaterialSpecificationDO; +import com.zteits.urbanops.module.garden.service.materialspecification.MaterialSpecificationService; + +@Tag(name = "管理后台 - 物料规格") +@RestController +@RequestMapping("/garden/material-specification") +@Validated +public class MaterialSpecificationController { + + @Resource + private MaterialSpecificationService materialSpecificationService; + + @PostMapping("/create") + @Operation(summary = "创建物料规格") + @PreAuthorize("@ss.hasPermission('garden:material-specification:create')") + public CommonResult createMaterialSpecification(@Valid @RequestBody MaterialSpecificationSaveReqVO createReqVO) { + return success(materialSpecificationService.createMaterialSpecification(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新物料规格") + @PreAuthorize("@ss.hasPermission('garden:material-specification:update')") + public CommonResult updateMaterialSpecification(@Valid @RequestBody MaterialSpecificationSaveReqVO updateReqVO) { + materialSpecificationService.updateMaterialSpecification(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除物料规格") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('garden:material-specification:delete')") + public CommonResult deleteMaterialSpecification(@RequestParam("id") Long id) { + materialSpecificationService.deleteMaterialSpecification(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除物料规格") + @PreAuthorize("@ss.hasPermission('garden:material-specification:delete')") + public CommonResult deleteMaterialSpecificationList(@RequestParam("ids") List ids) { + materialSpecificationService.deleteMaterialSpecificationListByIds(ids); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得物料规格") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('garden:material-specification:query')") + public CommonResult getMaterialSpecification(@RequestParam("id") Long id) { + MaterialSpecificationDO materialSpecification = materialSpecificationService.getMaterialSpecification(id); + return success(BeanUtils.toBean(materialSpecification, MaterialSpecificationRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得物料规格分页") + @PreAuthorize("@ss.hasPermission('garden:material-specification:query')") + public CommonResult> getMaterialSpecificationPage(@Valid MaterialSpecificationPageReqVO pageReqVO) { + PageResult pageResult = materialSpecificationService.getMaterialSpecificationPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, MaterialSpecificationRespVO.class)); + } + + @GetMapping("/list") + @Operation(summary = "获得物料规格列表(支持模糊搜索)") + @PreAuthorize("@ss.hasPermission('garden:material-specification:query')") + public CommonResult> getMaterialSpecificationList( + @RequestParam(value = "specifications", required = false) String specifications) { + // 构建查询条件 + MaterialSpecificationPageReqVO pageReqVO = new MaterialSpecificationPageReqVO(); + pageReqVO.setSpecifications(specifications); + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + + // 查询数据 + List list = materialSpecificationService.getMaterialSpecificationPage(pageReqVO).getList(); + return success(BeanUtils.toBean(list, MaterialSpecificationRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出物料规格 Excel") + @PreAuthorize("@ss.hasPermission('garden:material-specification:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportMaterialSpecificationExcel(@Valid MaterialSpecificationPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = materialSpecificationService.getMaterialSpecificationPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "物料规格.xls", "数据", MaterialSpecificationRespVO.class, + BeanUtils.toBean(list, MaterialSpecificationRespVO.class)); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialspecification/vo/MaterialSpecificationPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialspecification/vo/MaterialSpecificationPageReqVO.java new file mode 100644 index 0000000..4fcf08f --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialspecification/vo/MaterialSpecificationPageReqVO.java @@ -0,0 +1,32 @@ +package com.zteits.urbanops.module.garden.controller.admin.materialspecification.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 物料规格分页 Request VO") +@Data +public class MaterialSpecificationPageReqVO extends PageParam { + + @Schema(description = "规格编码") + private String specCode; + + @Schema(description = "规格名称") + private String specifications; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "部门ID", example = "18158") + private Long deptId; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialspecification/vo/MaterialSpecificationRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialspecification/vo/MaterialSpecificationRespVO.java new file mode 100644 index 0000000..cd5bae5 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialspecification/vo/MaterialSpecificationRespVO.java @@ -0,0 +1,39 @@ +package com.zteits.urbanops.module.garden.controller.admin.materialspecification.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import cn.idev.excel.annotation.*; + +@Schema(description = "管理后台 - 物料规格 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MaterialSpecificationRespVO { + + @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "15081") + @ExcelProperty("自增主键") + private Long id; + + @Schema(description = "规格编码") + @ExcelProperty("规格编码") + private String specCode; + + @Schema(description = "规格名称", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("规格名称") + private String specifications; + + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "创建时间") + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "部门ID", example = "18158") + @ExcelProperty("部门ID") + private Long deptId; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialspecification/vo/MaterialSpecificationSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialspecification/vo/MaterialSpecificationSaveReqVO.java new file mode 100644 index 0000000..61820f6 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialspecification/vo/MaterialSpecificationSaveReqVO.java @@ -0,0 +1,28 @@ +package com.zteits.urbanops.module.garden.controller.admin.materialspecification.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import jakarta.validation.constraints.*; + +@Schema(description = "管理后台 - 物料规格新增/修改 Request VO") +@Data +public class MaterialSpecificationSaveReqVO { + + @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "15081") + private Long id; + + @Schema(description = "规格编码") + private String specCode; + + @Schema(description = "规格名称", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "规格名称不能为空") + private String specifications; + + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") + private String remark; + + @Schema(description = "部门ID", example = "18158") + private Long deptId; + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialunit/MaterialUnitController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialunit/MaterialUnitController.java new file mode 100644 index 0000000..5484e40 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialunit/MaterialUnitController.java @@ -0,0 +1,119 @@ +package com.zteits.urbanops.module.garden.controller.admin.materialunit; + +import org.springframework.web.bind.annotation.*; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import jakarta.validation.constraints.*; +import jakarta.validation.*; +import jakarta.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.CommonResult; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; + +import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; + +import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; +import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.*; + +import com.zteits.urbanops.module.garden.controller.admin.materialunit.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.materialunit.MaterialUnitDO; +import com.zteits.urbanops.module.garden.service.materialunit.MaterialUnitService; + +@Tag(name = "管理后台 - 物料单位") +@RestController +@RequestMapping("/garden/material-unit") +@Validated +public class MaterialUnitController { + + @Resource + private MaterialUnitService materialUnitService; + + @PostMapping("/create") + @Operation(summary = "创建物料单位") + @PreAuthorize("@ss.hasPermission('garden:material-unit:create')") + public CommonResult createMaterialUnit(@Valid @RequestBody MaterialUnitSaveReqVO createReqVO) { + return success(materialUnitService.createMaterialUnit(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新物料单位") + @PreAuthorize("@ss.hasPermission('garden:material-unit:update')") + public CommonResult updateMaterialUnit(@Valid @RequestBody MaterialUnitSaveReqVO updateReqVO) { + materialUnitService.updateMaterialUnit(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除物料单位") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('garden:material-unit:delete')") + public CommonResult deleteMaterialUnit(@RequestParam("id") Long id) { + materialUnitService.deleteMaterialUnit(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除物料单位") + @PreAuthorize("@ss.hasPermission('garden:material-unit:delete')") + public CommonResult deleteMaterialUnitList(@RequestParam("ids") List ids) { + materialUnitService.deleteMaterialUnitListByIds(ids); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得物料单位") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('garden:material-unit:query')") + public CommonResult getMaterialUnit(@RequestParam("id") Long id) { + MaterialUnitDO materialUnit = materialUnitService.getMaterialUnit(id); + return success(BeanUtils.toBean(materialUnit, MaterialUnitRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得物料单位分页") + @PreAuthorize("@ss.hasPermission('garden:material-unit:query')") + public CommonResult> getMaterialUnitPage(@Valid MaterialUnitPageReqVO pageReqVO) { + PageResult pageResult = materialUnitService.getMaterialUnitPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, MaterialUnitRespVO.class)); + } + + @GetMapping("/list") + @Operation(summary = "获得物料单位列表(支持模糊搜索)") + @PreAuthorize("@ss.hasPermission('garden:material-unit:query')") + public CommonResult> getMaterialUnitList( + @RequestParam(value = "unitName", required = false) String unitName) { + // 构建查询条件 + MaterialUnitPageReqVO pageReqVO = new MaterialUnitPageReqVO(); + pageReqVO.setUnitName(unitName); + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + + // 查询数据 + List list = materialUnitService.getMaterialUnitPage(pageReqVO).getList(); + return success(BeanUtils.toBean(list, MaterialUnitRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出物料单位 Excel") + @PreAuthorize("@ss.hasPermission('garden:material-unit:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportMaterialUnitExcel(@Valid MaterialUnitPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = materialUnitService.getMaterialUnitPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "物料单位.xls", "数据", MaterialUnitRespVO.class, + BeanUtils.toBean(list, MaterialUnitRespVO.class)); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialunit/vo/MaterialUnitPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialunit/vo/MaterialUnitPageReqVO.java new file mode 100644 index 0000000..8b846ce --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialunit/vo/MaterialUnitPageReqVO.java @@ -0,0 +1,32 @@ +package com.zteits.urbanops.module.garden.controller.admin.materialunit.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 物料单位分页 Request VO") +@Data +public class MaterialUnitPageReqVO extends PageParam { + + @Schema(description = "单位ID", example = "22342") + private Long unitId; + + @Schema(description = "单位名称", example = "张三") + private String unitName; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "部门ID", example = "8809") + private Long deptId; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialunit/vo/MaterialUnitRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialunit/vo/MaterialUnitRespVO.java new file mode 100644 index 0000000..94e4452 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialunit/vo/MaterialUnitRespVO.java @@ -0,0 +1,39 @@ +package com.zteits.urbanops.module.garden.controller.admin.materialunit.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import cn.idev.excel.annotation.*; + +@Schema(description = "管理后台 - 物料单位 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MaterialUnitRespVO { + + @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "8413") + @ExcelProperty("自增主键") + private Long id; + + @Schema(description = "单位ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "22342") + @ExcelProperty("单位ID") + private Long unitId; + + @Schema(description = "单位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @ExcelProperty("单位名称") + private String unitName; + + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你说的对") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "创建时间") + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "部门ID", example = "8809") + @ExcelProperty("部门ID") + private Long deptId; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialunit/vo/MaterialUnitSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialunit/vo/MaterialUnitSaveReqVO.java new file mode 100644 index 0000000..ad0dd12 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/materialunit/vo/MaterialUnitSaveReqVO.java @@ -0,0 +1,28 @@ +package com.zteits.urbanops.module.garden.controller.admin.materialunit.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import jakarta.validation.constraints.*; + +@Schema(description = "管理后台 - 物料单位新增/修改 Request VO") +@Data +public class MaterialUnitSaveReqVO { + + @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "8413") + private Long id; + + @Schema(description = "单位ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "22342") + private Long unitId; + + @Schema(description = "单位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @NotEmpty(message = "单位名称不能为空") + private String unitName; + + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你说的对") + private String remark; + + @Schema(description = "部门ID", example = "8809") + private Long deptId; + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostPageReqVO.java index 0a13d83..8f6f708 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostPageReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostPageReqVO.java @@ -1,7 +1,11 @@ package com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.fasterxml.jackson.annotation.JsonFormat; import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.module.garden.dal.dataobject.mechanicalcost.MechanicalCostDO; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.AssertTrue; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -9,6 +13,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; +import java.util.Map; import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -44,14 +49,16 @@ public class MechanicalCostPageReqVO extends PageParam { private String vehicleType; @Schema(description = "开始使用时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @JsonFormat(pattern = "yyyy-MM-dd", shape = JsonFormat.Shape.STRING) + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate[] startUseTime; @Schema(description = "使用年限") private Long serviceLife; @Schema(description = "结束使用时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @JsonFormat(pattern = "yyyy-MM-dd", shape = JsonFormat.Shape.STRING) + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate[] endUseTime; @Schema(description = "归属公司", example = "张三") @@ -67,6 +74,16 @@ public class MechanicalCostPageReqVO extends PageParam { private String remark; @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; + + //对应前端排序字段 + public static final Map> SORT_FIELD_MAP = Map.of( + "id", MechanicalCostDO::getId, + "unitPrice", MechanicalCostDO::getUnitPrice, + "quantity", MechanicalCostDO::getQuantity, + "serviceLife", MechanicalCostDO::getServiceLife, + "startUseTime", MechanicalCostDO::getStartUseTime, + "endUseTime" , MechanicalCostDO::getEndUseTime + ); + } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicaldepreciation/vo/MechanicalDepreciationPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicaldepreciation/vo/MechanicalDepreciationPageReqVO.java index 27ea59a..b3e6c8e 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicaldepreciation/vo/MechanicalDepreciationPageReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicaldepreciation/vo/MechanicalDepreciationPageReqVO.java @@ -1,11 +1,11 @@ package com.zteits.urbanops.module.garden.controller.admin.mechanicaldepreciation.vo; -import lombok.*; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; import com.zteits.urbanops.framework.common.pojo.PageParam; -import java.math.BigDecimal; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; import java.time.LocalDateTime; import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -51,4 +51,4 @@ public class MechanicalDepreciationPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; -} \ No newline at end of file +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostPageReqVO.java index 45f63a7..ab99e69 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostPageReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostPageReqVO.java @@ -1,6 +1,8 @@ package com.zteits.urbanops.module.garden.controller.admin.personalcost.vo; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.module.garden.dal.dataobject.personalcost.PersonalCostDO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -8,6 +10,7 @@ import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; +import java.util.Map; import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -46,4 +49,11 @@ public class PersonalCostPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; + public static final Map> SORT_FIELD_MAP = Map.of( + "id", PersonalCostDO::getId, + "salaryMonth", PersonalCostDO::getSalaryMonth, + "salaryAmount", PersonalCostDO::getSalaryAmount, + "createTime", PersonalCostDO::getCreateTime + ); + } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/PlanRateController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/PlanRateController.java index 39b585f..04edd1b 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/PlanRateController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/PlanRateController.java @@ -119,8 +119,7 @@ public class PlanRateController { @Operation(summary = "获得计划频次分页") @PreAuthorize("@ss.hasPermission('garden:plan-rate:query')") public CommonResult> getPlanRatePage(@Valid PlanRatePageReqVO pageReqVO) { - PageResult pageResult = planRateService.getPlanRatePage(pageReqVO); - return success(BeanUtils.toBean(pageResult, PlanRateRespVO.class)); + return success(planRateService.getPlanRatePage(pageReqVO)); } @GetMapping("/export-excel") @@ -130,7 +129,7 @@ public class PlanRateController { public void exportPlanRateExcel(@Valid PlanRatePageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = planRateService.getPlanRatePage(pageReqVO).getList(); + List list = planRateService.getPlanRatePage(pageReqVO).getList(); // 导出 Excel ExcelUtils.write(response, "计划频次.xls", "数据", PlanRateRespVO.class, BeanUtils.toBean(list, PlanRateRespVO.class)); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/PlanRateDetailController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/PlanRateDetailController.java index ffaf7dc..b5de6af 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/PlanRateDetailController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/PlanRateDetailController.java @@ -82,8 +82,9 @@ public class PlanRateDetailController { @PreAuthorize("@ss.hasPermission('garden:plan-rate-detail:query')") public CommonResult getPlanRateValue(@RequestParam("busi_Line") @NotBlank String busiLine, @RequestParam("plan_type_id") @NotNull Integer planTypeId, - @RequestParam("level_id") @NotNull Integer levelId) { - return success(planRateDetailService.getPlanRateValue(busiLine, planTypeId, levelId)); + @RequestParam("level_id") @NotNull Integer levelId, + @RequestParam("company_id") Long companyId) { + return success(planRateDetailService.getPlanRateValue(busiLine, planTypeId, levelId, companyId)); } @GetMapping("/page") diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/vo/PlanRatePageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/vo/PlanRatePageReqVO.java index 761f594..2cf1642 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/vo/PlanRatePageReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/vo/PlanRatePageReqVO.java @@ -1,5 +1,6 @@ package com.zteits.urbanops.module.garden.controller.admin.planrate.vo; +import io.swagger.v3.oas.annotations.Hidden; import jakarta.validation.constraints.NotNull; import lombok.*; import java.util.*; @@ -30,4 +31,8 @@ public class PlanRatePageReqVO extends PageParam { @NotNull(message = "类型:1:养护;2:巡查不能为空") private Integer type; + @Schema(description = "公司ID", requiredMode = Schema.RequiredMode.REQUIRED) + @Hidden + private Long companyId; + } \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/vo/PlanRateRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/vo/PlanRateRespVO.java index 4ad804d..bcb6b25 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/vo/PlanRateRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/vo/PlanRateRespVO.java @@ -36,4 +36,10 @@ public class PlanRateRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; + @Schema(description = "公司ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long companyId; + + @Schema(description = "公司", requiredMode = Schema.RequiredMode.REQUIRED) + private String companyName; + } \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/vo/PlanRateSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/vo/PlanRateSaveReqVO.java index c5f248a..f8d3153 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/vo/PlanRateSaveReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/vo/PlanRateSaveReqVO.java @@ -29,6 +29,9 @@ public class PlanRateSaveReqVO { @NotNull(message = "类型:1:养护;2:巡查不能为空") private Integer type; + @Schema(description = "公司ID") + private Long companyId; + @NotNull@NotNull(message = "频次明细不能为空") @Size(min = 1) @Valid diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/problemtype/GardenProblemTypeController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/problemtype/GardenProblemTypeController.java new file mode 100644 index 0000000..de849b9 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/problemtype/GardenProblemTypeController.java @@ -0,0 +1,147 @@ +package com.zteits.urbanops.module.garden.controller.admin.problemtype; + +import com.zteits.urbanops.module.garden.controller.admin.problemtype.vo.ProblemTypePageReqVO; +import com.zteits.urbanops.module.garden.controller.admin.problemtype.vo.ProblemTypeRespVO; +import com.zteits.urbanops.module.garden.controller.admin.problemtype.vo.ProblemTypeSaveReqVO; +import org.springframework.web.bind.annotation.*; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import jakarta.validation.*; +import java.util.*; + +import com.zteits.urbanops.framework.common.pojo.CommonResult; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; + +import com.zteits.urbanops.module.garden.dal.dataobject.problemtype.GardenProblemTypeDO; +import com.zteits.urbanops.module.garden.dal.mysql.problemtype.GardenProblemTypeMapper; +import com.zteits.urbanops.module.garden.service.problemtype.GardenProblemTypeService; + +@Tag(name = "管理后台 - 问题类型配置") +@RestController +@RequestMapping("/garden/problem-type") +@Validated +public class GardenProblemTypeController { + + @Resource + private GardenProblemTypeService gardenProblemTypeService; + + @Resource + private GardenProblemTypeMapper gardenProblemTypeMapper; + + @PostMapping("/create") + @Operation(summary = "创建问题类型(二级/三级)") + @PreAuthorize("@ss.hasPermission('garden:problem-type:create')") + public CommonResult createProblemType(@Valid @RequestBody ProblemTypeSaveReqVO createReqVO) { + return success(gardenProblemTypeService.createProblemType(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新问题类型(二级/三级)") + @PreAuthorize("@ss.hasPermission('garden:problem-type:update')") + public CommonResult updateProblemType(@Valid @RequestBody ProblemTypeSaveReqVO updateReqVO) { + gardenProblemTypeService.updateProblemType(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除问题类型") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('garden:problem-type:delete')") + public CommonResult deleteProblemType(@RequestParam("id") Long id) { + gardenProblemTypeService.deleteProblemType(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得问题类型") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('garden:problem-type:query')") + public CommonResult getProblemType(@RequestParam("id") Long id) { + GardenProblemTypeDO problemType = gardenProblemTypeService.getProblemType(id); + ProblemTypeRespVO respVO = BeanUtils.toBean(problemType, ProblemTypeRespVO.class); + fillParentNames(Arrays.asList(respVO)); + return success(respVO); + } + + @GetMapping("/page") + @Operation(summary = "获得问题类型分页") + @PreAuthorize("@ss.hasPermission('garden:problem-type:query')") + public CommonResult> getProblemTypePage(@Valid ProblemTypePageReqVO pageReqVO) { + PageResult pageResult = gardenProblemTypeService.getProblemTypePage(pageReqVO); + PageResult voPageResult = BeanUtils.toBean(pageResult, ProblemTypeRespVO.class); + fillParentNames(voPageResult.getList()); + return success(voPageResult); + } + + @GetMapping("/list-by-parent") + @Operation(summary = "根据父级编码和层级查询子类型列表(级联下拉用)") + @PreAuthorize("@ss.hasPermission('garden:problem-type:query')") + public CommonResult> getProblemTypeListByParent( + @RequestParam(value = "parentCode", required = false) String parentCode, + @RequestParam("level") Integer level) { + List list = gardenProblemTypeService.getProblemTypeByParentCode(parentCode, level); + return success(BeanUtils.toBean(list, ProblemTypeRespVO.class)); + } + + @GetMapping("/generate-next-code") + @Operation(summary = "根据父级编码生成下一个类型编码") + @PreAuthorize("@ss.hasPermission('garden:problem-type:create')") + public CommonResult generateNextCode(@RequestParam("parentCode") String parentCode) { + return success(gardenProblemTypeService.generateNextCode(parentCode)); + } + + @PostMapping("/sync-level-one") + @Operation(summary = "从字典表同步一级类型") + @PreAuthorize("@ss.hasPermission('garden:problem-type:create')") + public CommonResult syncLevelOne() { + return success(gardenProblemTypeService.syncLevelOneFromDict()); + } + + /** + * 填充每个记录的层级名称: + * level 1 → levelOneName = 自身 typeName + * level 2 → levelTwoName = 自身 typeName, levelOneName = 父级 typeName + * level 3 → levelOneName = 祖父 typeName, levelTwoName = 父级 typeName + */ + private void fillParentNames(List list) { + if (list == null || list.isEmpty()) { + return; + } + for (ProblemTypeRespVO vo : list) { + if (vo.getLevel() == null) continue; + if (vo.getLevel() == 1) { + vo.setLevelOneName(vo.getTypeName()); + } else if (vo.getLevel() == 2) { + vo.setLevelTwoName(vo.getTypeName()); + if (vo.getParentCode() != null) { + GardenProblemTypeDO parent = gardenProblemTypeMapper.selectByTypeCode(vo.getParentCode()); + if (parent != null) { + vo.setLevelOneName(parent.getTypeName()); + } + } + } else if (vo.getLevel() == 3) { + if (vo.getParentCode() != null) { + GardenProblemTypeDO parent = gardenProblemTypeMapper.selectByTypeCode(vo.getParentCode()); + if (parent != null) { + vo.setLevelTwoName(parent.getTypeName()); + if (parent.getParentCode() != null) { + GardenProblemTypeDO grandParent = gardenProblemTypeMapper + .selectByTypeCode(parent.getParentCode()); + if (grandParent != null) { + vo.setLevelOneName(grandParent.getTypeName()); + } + } + } + } + } + } + } + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/problemtype/vo/ProblemTypePageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/problemtype/vo/ProblemTypePageReqVO.java new file mode 100644 index 0000000..3110603 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/problemtype/vo/ProblemTypePageReqVO.java @@ -0,0 +1,29 @@ +package com.zteits.urbanops.module.garden.controller.admin.problemtype.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import com.zteits.urbanops.framework.common.pojo.PageParam; + +@Schema(description = "管理后台 - 问题类型分页 Request VO") +@Data +public class ProblemTypePageReqVO extends PageParam { + + @Schema(description = "问题类型编码", example = "PT001") + private String typeCode; + + @Schema(description = "问题类型名称", example = "树木倒伏") + private String typeName; + + @Schema(description = "层级:1一级 2二级 3三级", example = "2") + private Integer level; + + @Schema(description = "父级类型编码", example = "BIZ_GARDEN") + private String parentCode; + + @Schema(description = "一级类型编码(级联筛选)", example = "yl") + private String levelOneCode; + + @Schema(description = "状态 1启用 0禁用", example = "1") + private Integer status; + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/problemtype/vo/ProblemTypeRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/problemtype/vo/ProblemTypeRespVO.java new file mode 100644 index 0000000..2638443 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/problemtype/vo/ProblemTypeRespVO.java @@ -0,0 +1,54 @@ +package com.zteits.urbanops.module.garden.controller.admin.problemtype.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import cn.idev.excel.annotation.*; + +@Schema(description = "管理后台 - 问题类型 Response VO") +@Data +@ExcelIgnoreUnannotated +public class ProblemTypeRespVO { + + @Schema(description = "主键ID", example = "1") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "问题类型编码", example = "PT001") + @ExcelProperty("问题类型编码") + private String typeCode; + + @Schema(description = "问题类型名称", example = "树木倒伏") + @ExcelProperty("问题类型名称") + private String typeName; + + @Schema(description = "层级:1一级 2二级 3三级", example = "2") + @ExcelProperty("层级") + private Integer level; + + @Schema(description = "父级类型编码", example = "BIZ_GARDEN") + @ExcelProperty("父级类型编码") + private String parentCode; + + @Schema(description = "排序序号", example = "1") + @ExcelProperty("排序序号") + private Integer sort; + + @Schema(description = "状态 1启用 0禁用", example = "1") + @ExcelProperty("状态") + private Integer status; + + @Schema(description = "一级类型名称") + private String levelOneName; + + @Schema(description = "二级类型名称") + private String levelTwoName; + + @Schema(description = "创建者") + @ExcelProperty("创建者") + private String creator; + + @Schema(description = "创建时间") + @ExcelProperty("创建时间") + private String createTime; + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/problemtype/vo/ProblemTypeSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/problemtype/vo/ProblemTypeSaveReqVO.java new file mode 100644 index 0000000..8d785e1 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/problemtype/vo/ProblemTypeSaveReqVO.java @@ -0,0 +1,36 @@ +package com.zteits.urbanops.module.garden.controller.admin.problemtype.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import jakarta.validation.constraints.*; + +@Schema(description = "管理后台 - 问题类型新增/修改 Request VO") +@Data +public class ProblemTypeSaveReqVO { + + @Schema(description = "主键ID", example = "1") + private Long id; + + @Schema(description = "问题类型编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "PT001") + @NotEmpty(message = "问题类型编码不能为空") + private String typeCode; + + @Schema(description = "问题类型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "树木倒伏") + @NotEmpty(message = "问题类型名称不能为空") + private String typeName; + + @Schema(description = "层级:1一级 2二级 3三级", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "层级不能为空") + private Integer level; + + @Schema(description = "父级类型编码", example = "BIZ_GARDEN") + private String parentCode; + + @Schema(description = "排序序号", example = "1") + private Integer sort; + + @Schema(description = "状态 1启用 0禁用", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + private Integer status; + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostPageReqVO.java index 011bb0e..e89994d 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostPageReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostPageReqVO.java @@ -1,9 +1,11 @@ package com.zteits.urbanops.module.garden.controller.admin.rentalmechanicalcost.vo; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.fasterxml.jackson.annotation.JsonFormat; import com.zteits.urbanops.framework.common.pojo.PageParam; import com.zteits.urbanops.module.garden.dal.dataobject.rentalmechanicalcost.RentalMechanicalCostDO; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.AssertTrue; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -25,14 +27,17 @@ public class RentalMechanicalCostPageReqVO extends PageParam { @Schema(description = "租赁总价格", example = "316") private BigDecimal rentalTotalPriceMax; @Schema(description = "开始使用时间") + @JsonFormat(pattern = "yyyy-MM-dd", shape = JsonFormat.Shape.STRING) @DateTimeFormat(pattern = "yyyy-MM-dd") - private Date startUseTime; + private LocalDate[] startUseTime; @Schema(description = "使用时长(天)") private Integer useDuration; @Schema(description = "结束日期") - private LocalDate endUseTime; + @JsonFormat(pattern = "yyyy-MM-dd", shape = JsonFormat.Shape.STRING) + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate[] endUseTime; @Schema(description = "数量") private Integer quantity; @@ -42,9 +47,11 @@ public class RentalMechanicalCostPageReqVO extends PageParam { public static final Map> SORT_FIELD_MAP = Map.of( "id", RentalMechanicalCostDO::getId, + "rentalTotalPrice",RentalMechanicalCostDO::getRentalTotalPrice, "quantity", RentalMechanicalCostDO::getQuantity, "useDuration", RentalMechanicalCostDO::getUseDuration, "startUseTime", RentalMechanicalCostDO::getStartUseTime, "endUseTime", RentalMechanicalCostDO::getEndUseTime ); + } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/RoadController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/RoadController.java index bda1056..f2b0464 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/RoadController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/RoadController.java @@ -2,6 +2,9 @@ package com.zteits.urbanops.module.garden.controller.admin.road; import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; import com.zteits.urbanops.module.system.api.permission.PermissionApi; +import jakarta.annotation.security.PermitAll; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -36,6 +39,7 @@ import com.zteits.urbanops.module.garden.service.road.RoadService; @RequestMapping("/garden/road") @Validated public class RoadController { + private static final Logger log = LoggerFactory.getLogger(RoadController.class); @Resource private RoadService roadService; @@ -93,7 +97,11 @@ public class RoadController { if(permissionApi.hasAnyRoles(loginUserId, "super_admin")){ pageReqVO.setCompanyId( null); }else{ - pageReqVO.setCompanyId(SecurityFrameworkUtils.getCompanyId()); + Long companyId = SecurityFrameworkUtils.getCompanyId(); + if(null == companyId || companyId == 0L || companyId == 100L){ + companyId = null; + } + pageReqVO.setCompanyId(companyId); } } PageResult pageResult = roadService.getRoadPage(pageReqVO); @@ -124,19 +132,30 @@ public class RoadController { @Operation(summary = "物联网查询道路") @GetMapping("/queryAllRoadList") - public CommonResult> queryAllRoadList(@RequestParam(required = false)String roadName,@RequestParam(required = false)String deptCode,@RequestParam(required = false)String companyCode) { + @PermitAll + public Map queryAllRoadList(@RequestParam(required = false) String roadName, @RequestParam(required = false) String deptCode, @RequestParam(required = false) String companyCode) { + log.info("物联网查询道路:companyCode:{},roadName:{},deptCode:{}",companyCode,roadName,deptCode); RoadListReqVO reqVO = new RoadListReqVO(); reqVO.setRoadName(roadName); - reqVO.setCompanyId(Long.valueOf(deptCode)); + // 处理deptCode为空的情况 + if (deptCode != null && !deptCode.isEmpty()) { + reqVO.setDeptId(Long.valueOf(deptCode)); + } reqVO.setBusiLine(companyCode); List roadList = roadService.getRoadList(reqVO); - List deptResps = roadList.stream().map(manager -> { - SysRoadRespVO sysDeptResp = new SysRoadRespVO(); - sysDeptResp.setRoadCode(manager.getId()+""); - sysDeptResp.setRoadName(manager.getRoadName()); - return sysDeptResp; + List> roadResps = roadList.stream().map(manager -> { + Map roadMap = new HashMap<>(); + roadMap.put("roadCode", manager.getId() + ""); + roadMap.put("roadName", manager.getRoadName()); + return roadMap; }).collect(Collectors.toList()); - return success(deptResps); + + // 构建返回格式 + Map result = new HashMap<>(); + result.put("msg", "操作成功"); + result.put("code", 200); + result.put("data", roadResps); + return result; } } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/vo/RoadListReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/vo/RoadListReqVO.java index b6ce26f..6587982 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/vo/RoadListReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/vo/RoadListReqVO.java @@ -26,8 +26,11 @@ public class RoadListReqVO { @NotNull(message = "归属(一级部门id)不能为空") private Long companyId; + @Schema(description = "部门ID", example = "126") + private Long deptId; + @Schema(description = "业务看", example = "yl") @NotEmpty(message = "创建者不能为空") private String busiLine; -} \ No newline at end of file +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/UnitIntegralAddController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/UnitIntegralAddController.java new file mode 100644 index 0000000..7dc5d4b --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/UnitIntegralAddController.java @@ -0,0 +1,104 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraladd; + +import org.springframework.web.bind.annotation.*; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import jakarta.validation.constraints.*; +import jakarta.validation.*; +import jakarta.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.CommonResult; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; + +import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; + +import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; +import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.*; + +import com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraladd.UnitIntegralAddDO; +import com.zteits.urbanops.module.garden.service.unitintegraladd.UnitIntegralAddService; + +@Tag(name = "管理后台 - 积分增加记录") +@RestController +@RequestMapping("/garden/unit-integral-add") +@Validated +public class UnitIntegralAddController { + + @Resource + private UnitIntegralAddService unitIntegralAddService; + + @PostMapping("/create") + @Operation(summary = "创建积分增加记录") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-add:create')") + public CommonResult createUnitIntegralAdd(@Valid @RequestBody UnitIntegralAddSaveReqVO createReqVO) { + return success(unitIntegralAddService.createUnitIntegralAdd(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新积分增加记录") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-add:update')") + public CommonResult updateUnitIntegralAdd(@Valid @RequestBody UnitIntegralAddSaveReqVO updateReqVO) { + unitIntegralAddService.updateUnitIntegralAdd(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除积分增加记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('garden:unit-integral-add:delete')") + public CommonResult deleteUnitIntegralAdd(@RequestParam("id") Long id) { + unitIntegralAddService.deleteUnitIntegralAdd(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除积分增加记录") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-add:delete')") + public CommonResult deleteUnitIntegralAddList(@RequestParam("ids") List ids) { + unitIntegralAddService.deleteUnitIntegralAddListByIds(ids); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得积分增加记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-add:query')") + public CommonResult getUnitIntegralAdd(@RequestParam("id") Long id) { + UnitIntegralAddDO unitIntegralAdd = unitIntegralAddService.getUnitIntegralAdd(id); + return success(BeanUtils.toBean(unitIntegralAdd, UnitIntegralAddRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得积分增加记录分页") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-add:query')") + public CommonResult> getUnitIntegralAddPage(@Valid UnitIntegralAddPageReqVO pageReqVO) { + PageResult pageResult = unitIntegralAddService.getUnitIntegralAddPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, UnitIntegralAddRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出积分增加记录 Excel") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-add:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportUnitIntegralAddExcel(@Valid UnitIntegralAddPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = unitIntegralAddService.getUnitIntegralAddPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "积分增加记录.xls", "数据", UnitIntegralAddRespVO.class, + BeanUtils.toBean(list, UnitIntegralAddRespVO.class)); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddPageReqVO.java new file mode 100644 index 0000000..d491e90 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddPageReqVO.java @@ -0,0 +1,56 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 积分增加记录分页 Request VO") +@Data +public class UnitIntegralAddPageReqVO extends PageParam { + + @Schema(description = "来源类型 01:派单", example = "1") + private String sourceType; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", example = "1") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", example = "26490") + private String unitId; + + @Schema(description = "单位名称(冗余,避免联表查询)", example = "芋艿") + private String unitName; + + @Schema(description = "关联ID(关联业务表主键)", example = "24947") + private Long relatedTaskId; + + @Schema(description = "业务名称(冗余)", example = "张三") + private String relatedTaskName; + + @Schema(description = "本次增加积分(正数)") + private Integer addIntegral; + + @Schema(description = "增加原因(如:到期前上报奖励、到期后上报奖励等)", example = "不好") + private String addReason; + + @Schema(description = "增加前总积分(对账用)") + private Integer beforeIntegral; + + @Schema(description = "增加后总积分(对账用)") + private Integer afterIntegral; + + @Schema(description = "工单号") + private String workNo; + + @Schema(description = "备注(补充积分增加的特殊说明)", example = "你说的对") + private String remark; + + @Schema(description = "积分增加操作时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddRespVO.java new file mode 100644 index 0000000..b983f46 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddRespVO.java @@ -0,0 +1,71 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import cn.idev.excel.annotation.*; + +@Schema(description = "管理后台 - 积分增加记录 Response VO") +@Data +@ExcelIgnoreUnannotated +public class UnitIntegralAddRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12471") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "来源类型 01:派单", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("来源类型 01:派单") + private String sourceType; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("单位类型:01:公司 02:班组 03:个人") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "26490") + @ExcelProperty("单位ID(部门表 id)") + private String unitId; + + @Schema(description = "单位名称(冗余,避免联表查询)", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @ExcelProperty("单位名称(冗余,避免联表查询)") + private String unitName; + + @Schema(description = "关联ID(关联业务表主键)", requiredMode = Schema.RequiredMode.REQUIRED, example = "24947") + @ExcelProperty("关联ID(关联业务表主键)") + private Long relatedTaskId; + + @Schema(description = "业务名称(冗余)", example = "张三") + @ExcelProperty("业务名称(冗余)") + private String relatedTaskName; + + @Schema(description = "本次增加积分(正数)", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("本次增加积分(正数)") + private Integer addIntegral; + + @Schema(description = "增加原因(如:到期前上报奖励、到期后上报奖励等)", requiredMode = Schema.RequiredMode.REQUIRED, example = "不好") + @ExcelProperty("增加原因(如:到期前上报奖励、到期后上报奖励等)") + private String addReason; + + @Schema(description = "增加前总积分(对账用)") + @ExcelProperty("增加前总积分(对账用)") + private Integer beforeIntegral; + + @Schema(description = "增加后总积分(对账用)") + @ExcelProperty("增加后总积分(对账用)") + private Integer afterIntegral; + + @Schema(description = "工单号") + @ExcelProperty("工单号") + private String workNo; + + @Schema(description = "备注(补充积分增加的特殊说明)", example = "你说的对") + @ExcelProperty("备注(补充积分增加的特殊说明)") + private String remark; + + @Schema(description = "积分增加操作时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("积分增加操作时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddSaveReqVO.java new file mode 100644 index 0000000..19b2978 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddSaveReqVO.java @@ -0,0 +1,58 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import jakarta.validation.constraints.*; + +@Schema(description = "管理后台 - 积分增加记录新增/修改 Request VO") +@Data +public class UnitIntegralAddSaveReqVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12471") + private Long id; + + @Schema(description = "来源类型 01:派单", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotEmpty(message = "来源类型 01:派单不能为空") + private String sourceType; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotEmpty(message = "单位类型:01:公司 02:班组 03:个人不能为空") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "26490") + @NotEmpty(message = "单位ID(部门表 id)不能为空") + private String unitId; + + @Schema(description = "单位名称(冗余,避免联表查询)", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotEmpty(message = "单位名称(冗余,避免联表查询)不能为空") + private String unitName; + + @Schema(description = "关联ID(关联业务表主键)", requiredMode = Schema.RequiredMode.REQUIRED, example = "24947") + @NotNull(message = "关联ID(关联业务表主键)不能为空") + private Long relatedTaskId; + + @Schema(description = "业务名称(冗余)", example = "张三") + private String relatedTaskName; + + @Schema(description = "本次增加积分(正数)", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "本次增加积分(正数)不能为空") + private Integer addIntegral; + + @Schema(description = "增加原因(如:到期前上报奖励、到期后上报奖励等)", requiredMode = Schema.RequiredMode.REQUIRED, example = "不好") + @NotEmpty(message = "增加原因(如:到期前上报奖励、到期后上报奖励等)不能为空") + private String addReason; + + @Schema(description = "增加前总积分(对账用)") + private Integer beforeIntegral; + + @Schema(description = "增加后总积分(对账用)") + private Integer afterIntegral; + + @Schema(description = "工单号") + private String workNo; + + @Schema(description = "备注(补充积分增加的特殊说明)", example = "你说的对") + private String remark; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/UnitIntegralSubController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/UnitIntegralSubController.java new file mode 100644 index 0000000..cbedea6 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/UnitIntegralSubController.java @@ -0,0 +1,104 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegralsub; + +import org.springframework.web.bind.annotation.*; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import jakarta.validation.constraints.*; +import jakarta.validation.*; +import jakarta.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.CommonResult; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; + +import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; + +import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; +import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.*; + +import com.zteits.urbanops.module.garden.controller.admin.unitintegralsub.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegralsub.UnitIntegralSubDO; +import com.zteits.urbanops.module.garden.service.unitintegralsub.UnitIntegralSubService; + +@Tag(name = "管理后台 - 积分扣减记录") +@RestController +@RequestMapping("/garden/unit-integral-sub") +@Validated +public class UnitIntegralSubController { + + @Resource + private UnitIntegralSubService unitIntegralSubService; + + @PostMapping("/create") + @Operation(summary = "创建积分扣减记录") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-sub:create')") + public CommonResult createUnitIntegralSub(@Valid @RequestBody UnitIntegralSubSaveReqVO createReqVO) { + return success(unitIntegralSubService.createUnitIntegralSub(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新积分扣减记录") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-sub:update')") + public CommonResult updateUnitIntegralSub(@Valid @RequestBody UnitIntegralSubSaveReqVO updateReqVO) { + unitIntegralSubService.updateUnitIntegralSub(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除积分扣减记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('garden:unit-integral-sub:delete')") + public CommonResult deleteUnitIntegralSub(@RequestParam("id") Long id) { + unitIntegralSubService.deleteUnitIntegralSub(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除积分扣减记录") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-sub:delete')") + public CommonResult deleteUnitIntegralSubList(@RequestParam("ids") List ids) { + unitIntegralSubService.deleteUnitIntegralSubListByIds(ids); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得积分扣减记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-sub:query')") + public CommonResult getUnitIntegralSub(@RequestParam("id") Long id) { + UnitIntegralSubDO unitIntegralSub = unitIntegralSubService.getUnitIntegralSub(id); + return success(BeanUtils.toBean(unitIntegralSub, UnitIntegralSubRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得积分扣减记录分页") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-sub:query')") + public CommonResult> getUnitIntegralSubPage(@Valid UnitIntegralSubPageReqVO pageReqVO) { + PageResult pageResult = unitIntegralSubService.getUnitIntegralSubPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, UnitIntegralSubRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出积分扣减记录 Excel") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-sub:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportUnitIntegralSubExcel(@Valid UnitIntegralSubPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = unitIntegralSubService.getUnitIntegralSubPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "积分扣减记录.xls", "数据", UnitIntegralSubRespVO.class, + BeanUtils.toBean(list, UnitIntegralSubRespVO.class)); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubPageReqVO.java new file mode 100644 index 0000000..1f867e3 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubPageReqVO.java @@ -0,0 +1,56 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegralsub.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 积分扣减记录分页 Request VO") +@Data +public class UnitIntegralSubPageReqVO extends PageParam { + + @Schema(description = "来源类型 01:派单", example = "1") + private String sourceType; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", example = "1") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", example = "13254") + private String unitId; + + @Schema(description = "单位名称(冗余,避免联表查询)", example = "芋艿") + private String unitName; + + @Schema(description = "关联任务ID(外键,关联业务表主键)", example = "21804") + private Long relatedTaskId; + + @Schema(description = "业务名称(冗余)", example = "芋艿") + private String relatedTaskName; + + @Schema(description = "本次扣减积分(正数,存储扣减数值)") + private Integer subIntegral; + + @Schema(description = "扣减原因(如:任务打回等)", example = "不香") + private String subReason; + + @Schema(description = "扣减前总积分(对账用)") + private Integer beforeIntegral; + + @Schema(description = "扣减后总积分(对账用)") + private Integer afterIntegral; + + @Schema(description = "工单号") + private String workNo; + + @Schema(description = "备注(补充扣减的特殊说明)", example = "随便") + private String remark; + + @Schema(description = "积分扣减操作时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubRespVO.java new file mode 100644 index 0000000..dfa67ae --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubRespVO.java @@ -0,0 +1,71 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegralsub.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import cn.idev.excel.annotation.*; + +@Schema(description = "管理后台 - 积分扣减记录 Response VO") +@Data +@ExcelIgnoreUnannotated +public class UnitIntegralSubRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "499") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "来源类型 01:派单", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("来源类型 01:派单") + private String sourceType; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("单位类型:01:公司 02:班组 03:个人") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "13254") + @ExcelProperty("单位ID(部门表 id)") + private String unitId; + + @Schema(description = "单位名称(冗余,避免联表查询)", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @ExcelProperty("单位名称(冗余,避免联表查询)") + private String unitName; + + @Schema(description = "关联任务ID(外键,关联业务表主键)", requiredMode = Schema.RequiredMode.REQUIRED, example = "21804") + @ExcelProperty("关联任务ID(外键,关联业务表主键)") + private Long relatedTaskId; + + @Schema(description = "业务名称(冗余)", example = "芋艿") + @ExcelProperty("业务名称(冗余)") + private String relatedTaskName; + + @Schema(description = "本次扣减积分(正数,存储扣减数值)", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("本次扣减积分(正数,存储扣减数值)") + private Integer subIntegral; + + @Schema(description = "扣减原因(如:任务打回等)", requiredMode = Schema.RequiredMode.REQUIRED, example = "不香") + @ExcelProperty("扣减原因(如:任务打回等)") + private String subReason; + + @Schema(description = "扣减前总积分(对账用)") + @ExcelProperty("扣减前总积分(对账用)") + private Integer beforeIntegral; + + @Schema(description = "扣减后总积分(对账用)") + @ExcelProperty("扣减后总积分(对账用)") + private Integer afterIntegral; + + @Schema(description = "工单号") + @ExcelProperty("工单号") + private String workNo; + + @Schema(description = "备注(补充扣减的特殊说明)", example = "随便") + @ExcelProperty("备注(补充扣减的特殊说明)") + private String remark; + + @Schema(description = "积分扣减操作时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("积分扣减操作时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubSaveReqVO.java new file mode 100644 index 0000000..6c1e700 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubSaveReqVO.java @@ -0,0 +1,58 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegralsub.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import jakarta.validation.constraints.*; + +@Schema(description = "管理后台 - 积分扣减记录新增/修改 Request VO") +@Data +public class UnitIntegralSubSaveReqVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "499") + private Long id; + + @Schema(description = "来源类型 01:派单", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotEmpty(message = "来源类型 01:派单不能为空") + private String sourceType; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotEmpty(message = "单位类型:01:公司 02:班组 03:个人不能为空") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "13254") + @NotEmpty(message = "单位ID(部门表 id)不能为空") + private String unitId; + + @Schema(description = "单位名称(冗余,避免联表查询)", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotEmpty(message = "单位名称(冗余,避免联表查询)不能为空") + private String unitName; + + @Schema(description = "关联任务ID(外键,关联业务表主键)", requiredMode = Schema.RequiredMode.REQUIRED, example = "21804") + @NotNull(message = "关联任务ID(外键,关联业务表主键)不能为空") + private Long relatedTaskId; + + @Schema(description = "业务名称(冗余)", example = "芋艿") + private String relatedTaskName; + + @Schema(description = "本次扣减积分(正数,存储扣减数值)", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "本次扣减积分(正数,存储扣减数值)不能为空") + private Integer subIntegral; + + @Schema(description = "扣减原因(如:任务打回等)", requiredMode = Schema.RequiredMode.REQUIRED, example = "不香") + @NotEmpty(message = "扣减原因(如:任务打回等)不能为空") + private String subReason; + + @Schema(description = "扣减前总积分(对账用)") + private Integer beforeIntegral; + + @Schema(description = "扣减后总积分(对账用)") + private Integer afterIntegral; + + @Schema(description = "工单号") + private String workNo; + + @Schema(description = "备注(补充扣减的特殊说明)", example = "随便") + private String remark; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/UnitIntegralTotalController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/UnitIntegralTotalController.java new file mode 100644 index 0000000..c57a2c0 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/UnitIntegralTotalController.java @@ -0,0 +1,141 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal; + +import com.zteits.urbanops.module.garden.service.unitintegraltotal.UnitIntegralService; +import org.springframework.web.bind.annotation.*; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import jakarta.validation.constraints.*; +import jakarta.validation.*; +import jakarta.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.CommonResult; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; + +import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; + +import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; +import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.*; + +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraltotal.UnitIntegralTotalDO; +import com.zteits.urbanops.module.garden.service.unitintegraltotal.UnitIntegralTotalService; + +@Tag(name = "管理后台 - 单位积分累计") +@RestController +@RequestMapping("/garden/unit-integral-total") +@Validated +public class UnitIntegralTotalController { + + @Resource + private UnitIntegralTotalService unitIntegralTotalService; + + @Resource + private UnitIntegralService unitIntegralService; + + @PostMapping("/create") + @Operation(summary = "创建单位积分累计") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-total:create')") + public CommonResult createUnitIntegralTotal(@Valid @RequestBody UnitIntegralTotalSaveReqVO createReqVO) { + return success(unitIntegralTotalService.createUnitIntegralTotal(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新单位积分累计") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-total:update')") + public CommonResult updateUnitIntegralTotal(@Valid @RequestBody UnitIntegralTotalSaveReqVO updateReqVO) { + unitIntegralTotalService.updateUnitIntegralTotal(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除单位积分累计") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('garden:unit-integral-total:delete')") + public CommonResult deleteUnitIntegralTotal(@RequestParam("id") Long id) { + unitIntegralTotalService.deleteUnitIntegralTotal(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除单位积分累计") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-total:delete')") + public CommonResult deleteUnitIntegralTotalList(@RequestParam("ids") List ids) { + unitIntegralTotalService.deleteUnitIntegralTotalListByIds(ids); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得单位积分累计") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-total:query')") + public CommonResult getUnitIntegralTotal(@RequestParam("id") Long id) { + UnitIntegralTotalDO unitIntegralTotal = unitIntegralTotalService.getUnitIntegralTotal(id); + return success(BeanUtils.toBean(unitIntegralTotal, UnitIntegralTotalRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得单位积分累计分页") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-total:query')") + public CommonResult> getUnitIntegralTotalPage(@Valid UnitIntegralTotalPageReqVO pageReqVO) { + PageResult pageResult = unitIntegralTotalService.getUnitIntegralTotalPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, UnitIntegralTotalRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出单位积分累计 Excel") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-total:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportUnitIntegralTotalExcel(@Valid UnitIntegralTotalPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = unitIntegralTotalService.getUnitIntegralTotalPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "单位积分累计.xls", "数据", UnitIntegralTotalRespVO.class, + BeanUtils.toBean(list, UnitIntegralTotalRespVO.class)); + } + + @PostMapping ("/unitIntegralCreate") + public void testCreate() { + unitIntegralService.createUnitIntegral("01", "200", "测试"); + } + + @PostMapping ("/unitIntegralAdd") + public void testAdd() { + UnitIntegralSaveReqVO updateReqVO = new UnitIntegralSaveReqVO(); + updateReqVO.setTotalIntegral(100); + updateReqVO.setUnitType("01"); + updateReqVO.setUnitId("100"); + updateReqVO.setUnitName("西城园林"); + updateReqVO.setSourceType("01"); + updateReqVO.setReason("测试"); + updateReqVO.setRelatedTaskId(11111111111L); + updateReqVO.setRelatedTaskName("任务派发"); + + unitIntegralService.addUnitIntegral(updateReqVO); + } + @PostMapping ("/unitIntegralSub") + public void testSub() { + UnitIntegralSaveReqVO updateReqVO = new UnitIntegralSaveReqVO(); + updateReqVO.setTotalIntegral(100); + updateReqVO.setUnitType("01"); + updateReqVO.setUnitId("100"); + updateReqVO.setUnitName("西城园林"); + updateReqVO.setSourceType("01"); + updateReqVO.setReason("测试"); + updateReqVO.setRelatedTaskId(11111111112L); + updateReqVO.setRelatedTaskName("任务派发"); + + unitIntegralService.subUnitIntegral(updateReqVO); + } +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralRespVO.java new file mode 100644 index 0000000..b6e12c9 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralRespVO.java @@ -0,0 +1,19 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 单位积分累计新增/修改 Request VO") +@Data +public class UnitIntegralRespVO { + @Schema(description = "来源类型 01:派单", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private String sourceType; + + @Schema(description = "关联ID(关联业务表主键)", requiredMode = Schema.RequiredMode.REQUIRED, example = "24947") + private Long relatedTaskId; + + @Schema(description = "当前总积分") + private Integer totalIntegral; + + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralSaveReqVO.java new file mode 100644 index 0000000..3328dc6 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralSaveReqVO.java @@ -0,0 +1,62 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +@Schema(description = "管理后台 - 单位积分累计新增/修改 Request VO") +@Data +public class UnitIntegralSaveReqVO { + @Schema(description = "查询日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "yyyy") + private String statDate; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotEmpty(message = "单位类型:01:公司 02:班组 03:个人不能为空") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "22785") + @NotEmpty(message = "单位ID(部门表 id)不能为空") + private String unitId; + + @Schema(description = "单位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "西城") + @NotEmpty(message = "单位名称不能为空") + private String unitName; + + @Schema(description = "当前总积分") + private Integer totalIntegral; + + @Schema(description = "来源类型 01:派单", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotEmpty(message = "来源类型 01:派单不能为空") + private String sourceType; + + @Schema(description = "关联ID(关联业务表主键)", requiredMode = Schema.RequiredMode.REQUIRED, example = "24947") + @NotNull(message = "关联ID(关联业务表主键)不能为空") + private Long relatedTaskId; + + @Schema(description = "业务名称(冗余)", example = "张三") + private String relatedTaskName; + + @Schema(description = "原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "不好") + private String reason; + + @Schema(description = "工单号") + private String workNo; + + public String getStatDate() { + if (StringUtils.isBlank(statDate)) { + // 获取当前年份,转为字符串(如 2026) + return LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy")); + } + // 2. 若有值,直接返回(兼容传入的年份) + return statDate; + } + + public void setStatDate(String statDate) { + this.statDate = statDate; + } +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalPageReqVO.java new file mode 100644 index 0000000..e0c185e --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalPageReqVO.java @@ -0,0 +1,44 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 单位积分累计分页 Request VO") +@Data +public class UnitIntegralTotalPageReqVO extends PageParam { + + @Schema(description = "积分汇总的统计日期(格式:YYYY)") + private String statDate; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", example = "1") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", example = "22785") + private String unitId; + + @Schema(description = "单位名称", example = "王五") + private String unitName; + + @Schema(description = "当前总积分(累计增加-累计扣减)") + private Integer totalIntegral; + + @Schema(description = "累计增加积分") + private Integer totalAdd; + + @Schema(description = "累计扣减积分") + private Integer totalSub; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "关联记录创建时间(派单给单位的时间)") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalRespVO.java new file mode 100644 index 0000000..3d61ebb --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalRespVO.java @@ -0,0 +1,55 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import cn.idev.excel.annotation.*; + +@Schema(description = "管理后台 - 单位积分累计 Response VO") +@Data +@ExcelIgnoreUnannotated +public class UnitIntegralTotalRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "640") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "积分汇总的统计日期(格式:YYYY)", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("积分汇总的统计日期(格式:YYYY)") + private String statDate; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("单位类型:01:公司 02:班组 03:个人") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "22785") + @ExcelProperty("单位ID(部门表 id)") + private String unitId; + + @Schema(description = "单位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") + @ExcelProperty("单位名称") + private String unitName; + + @Schema(description = "当前总积分(累计增加-累计扣减)") + @ExcelProperty("当前总积分(累计增加-累计扣减)") + private Integer totalIntegral; + + @Schema(description = "累计增加积分") + @ExcelProperty("累计增加积分") + private Integer totalAdd; + + @Schema(description = "累计扣减积分") + @ExcelProperty("累计扣减积分") + private Integer totalSub; + + @Schema(description = "备注", example = "你猜") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "关联记录创建时间(派单给单位的时间)", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("关联记录创建时间(派单给单位的时间)") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalSaveReqVO.java new file mode 100644 index 0000000..51d6072 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalSaveReqVO.java @@ -0,0 +1,43 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import jakarta.validation.constraints.*; + +@Schema(description = "管理后台 - 单位积分累计新增/修改 Request VO") +@Data +public class UnitIntegralTotalSaveReqVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "640") + private Long id; + + @Schema(description = "积分汇总的统计日期(格式:YYYY)", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "积分汇总的统计日期(格式:YYYY)不能为空") + private String statDate; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotEmpty(message = "单位类型:01:公司 02:班组 03:个人不能为空") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "22785") + @NotEmpty(message = "单位ID(部门表 id)不能为空") + private String unitId; + + @Schema(description = "单位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") + @NotEmpty(message = "单位名称不能为空") + private String unitName; + + @Schema(description = "当前总积分(累计增加-累计扣减)") + private Integer totalIntegral; + + @Schema(description = "累计增加积分") + private Integer totalAdd; + + @Schema(description = "累计扣减积分") + private Integer totalSub; + + @Schema(description = "备注", example = "你猜") + private String remark; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/wasterecord/vo/WasteRecordPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/wasterecord/vo/WasteRecordPageReqVO.java index 5c6e414..c683dc7 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/wasterecord/vo/WasteRecordPageReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/wasterecord/vo/WasteRecordPageReqVO.java @@ -66,7 +66,7 @@ public class WasteRecordPageReqVO extends PageParam { public static final Map> SORT_FIELD_MAP = Map.of( "id", WasteRecordDO::getId, - "vehicleLoad", WasteRecordDO::getWasteType, + "vehicleLoad", WasteRecordDO::getVehicleLoad, "transportTimes", WasteRecordDO::getTransportTimes, "totalCost", WasteRecordDO::getTotalCost, "createTime", WasteRecordDO::getCreateTime diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/app/maintainplan/vo/AppMaintainPlanCommitDetailPageRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/app/maintainplan/vo/AppMaintainPlanCommitDetailPageRespVO.java index ca2f0c3..49c5610 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/app/maintainplan/vo/AppMaintainPlanCommitDetailPageRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/app/maintainplan/vo/AppMaintainPlanCommitDetailPageRespVO.java @@ -59,6 +59,9 @@ public class AppMaintainPlanCommitDetailPageRespVO { @Schema(description = "完成状态 1:未完成;2:进行中;3:已完成", requiredMode = Schema.RequiredMode.REQUIRED) private Integer finishState; + @Schema(description = "完成时间") + private LocalDateTime finishTime; + @Schema(description = "执行开始时间") private LocalDateTime beginTime; diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/convert/AppGardenWorkOrderConvert.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/convert/AppGardenWorkOrderConvert.java index 956ce17..2410fd9 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/convert/AppGardenWorkOrderConvert.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/convert/AppGardenWorkOrderConvert.java @@ -24,7 +24,7 @@ public interface AppGardenWorkOrderConvert { orderReqVO.setPressingType(2);//紧急 orderReqVO.setOrderName(inspectionPlanDO.getPlanName()); orderReqVO.setSourceId(1);//来源ID 工单来源 1、巡查 - orderReqVO.setSourceName("园林巡查上报"); + orderReqVO.setSourceName("巡查上报"); orderReqVO.setThirdWorkNo(planNo); orderReqVO.setOrderType("C"); orderReqVO.setPressingType(createReqVO.getPressingType()); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/convert/AssignTaskConvert.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/convert/AssignTaskConvert.java index 0fc0bf0..a507a7a 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/convert/AssignTaskConvert.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/convert/AssignTaskConvert.java @@ -2,16 +2,18 @@ package com.zteits.urbanops.module.garden.convert; import com.zteits.urbanops.framework.common.pojo.PageResult; -import com.zteits.urbanops.framework.common.util.collection.CollectionUtils; import com.zteits.urbanops.framework.common.util.object.BeanUtils; import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoRespVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.UnitIntegralRespVO; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasks.AssignTasksDO; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasksinfo.AssignTasksInfoDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * @Classname AssignTaskConvert @@ -23,25 +25,94 @@ import java.util.Map; public interface AssignTaskConvert { AssignTaskConvert INSTANCE = Mappers.getMapper(AssignTaskConvert.class); - default PageResult buildTaskPage(PageResult pageResult, Map taskMap) { - List taskVOList = CollectionUtils.convertList(pageResult.getList(), task -> { - AssignTasksInfoRespVO taskVO = BeanUtils.toBean(task, AssignTasksInfoRespVO.class); - AssignTasksDO tasksDO = taskMap.get(taskVO.getTaskId()); - if (tasksDO != null) { - taskVO.setTaskName(tasksDO.getTaskName()); - taskVO.setTaskType(tasksDO.getTaskType()); - taskVO.setDeadline(tasksDO.getDeadline()); - } - return taskVO; - }); + default PageResult buildTaskPage(PageResult pageResult, List unitIntegralList) { + //1.源列表为空直接返回空列表 + if (org.apache.commons.collections4.CollectionUtils.isEmpty(pageResult.getList())) { + return new PageResult<>(Collections.emptyList(), pageResult.getTotal()); + } + //2、构建积分Map:Key为String类型的任务ID(匹配relatedTaskId的类型),避免类型不匹配 + Map integralMap = org.apache.commons.collections4.CollectionUtils.isEmpty(pageResult.getList()) + ? Collections.emptyMap() : unitIntegralList.stream() + .collect( + Collectors.toMap(UnitIntegralRespVO::getRelatedTaskId, + integral -> integral, + (existing, replacement) -> replacement + ) + ); + // 3. 转换任务DO为VO,并绑定积分 + List taskVOList = pageResult.getList().stream() + .map(taskDO -> { + // 转换DO到VO + AssignTasksInfoRespVO taskVO = new AssignTasksInfoRespVO(); + BeanUtils.copyProperties(taskDO, taskVO); + + // 4. 匹配积分:将Long类型的taskId转为String,匹配Map的Key + Long taskIdStr = taskDO.getId() == null ? null : taskDO.getId(); + UnitIntegralRespVO integralVO = integralMap.get(taskIdStr); + + // 5. 积分赋值:无积分则设为0 + taskVO.setTotalIntegral(integralVO != null ? integralVO.getTotalIntegral() : 0); + + return taskVO; + }) + .collect(Collectors.toList()); + return new PageResult<>(taskVOList, pageResult.getTotal()); } - default AssignTasksInfoRespVO buildTask(AssignTasksInfoDO tasksInfoDO, AssignTasksDO tasksDO) { + default AssignTasksInfoRespVO buildTask(AssignTasksInfoDO tasksInfoDO, AssignTasksDO tasksDO, List unitIntegralList) { AssignTasksInfoRespVO taskVO = BeanUtils.toBean(tasksInfoDO, AssignTasksInfoRespVO.class); if (tasksDO != null) { taskVO.setTemplateFile(tasksDO.getTemplateFile()); } + //2、构建积分Map:Key为String类型的任务ID(匹配relatedTaskId的类型),避免类型不匹配 + Map integralMap = org.apache.commons.collections4.CollectionUtils.isEmpty(unitIntegralList) + ? Collections.emptyMap() : unitIntegralList.stream() + .collect( + Collectors.toMap(UnitIntegralRespVO::getRelatedTaskId, + integral -> integral, + (existing, replacement) -> replacement + ) + ); + // 4. 匹配积分:将Long类型的taskId转为String,匹配Map的Key + Long taskIdStr = tasksInfoDO.getId() == null ? null : tasksInfoDO.getId(); + UnitIntegralRespVO integralVO = integralMap.get(taskIdStr); + // 5. 积分赋值:无积分则设为0 + taskVO.setTotalIntegral(integralVO != null ? integralVO.getTotalIntegral() : 0); return taskVO; } + default List buildTaskInfo(List assignTaskInfoList, List unitIntegralList) { + //1.源列表为空直接返回空列表 + if (org.apache.commons.collections4.CollectionUtils.isEmpty(assignTaskInfoList)) { + return Collections.emptyList(); + } + //2、构建积分Map:Key为String类型的任务ID(匹配relatedTaskId的类型),避免类型不匹配 + Map integralMap = org.apache.commons.collections4.CollectionUtils.isEmpty(unitIntegralList) + ? Collections.emptyMap() : unitIntegralList.stream() + .collect( + Collectors.toMap(UnitIntegralRespVO::getRelatedTaskId, + integral -> integral, + (existing, replacement) -> replacement + ) + ); + // 3. 转换任务DO为VO,并绑定积分 + List taskVOList = assignTaskInfoList.stream() + .map(taskDO -> { + // 转换DO到VO + AssignTasksInfoRespVO taskVO = new AssignTasksInfoRespVO(); + BeanUtils.copyProperties(taskDO, taskVO); + + // 4. 匹配积分:将Long类型的taskId转为String,匹配Map的Key + Long taskIdStr = taskDO.getId() == null ? null : taskDO.getId(); + UnitIntegralRespVO integralVO = integralMap.get(taskIdStr); + + // 5. 积分赋值:无积分则设为0 + taskVO.setTotalIntegral(integralVO != null ? integralVO.getTotalIntegral() : 0); + + return taskVO; + }) + .collect(Collectors.toList()); + + return taskVOList; + } } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/assigntasksinfo/AssignTasksInfoDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/assigntasksinfo/AssignTasksInfoDO.java index 905a6e6..0b97b33 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/assigntasksinfo/AssignTasksInfoDO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/assigntasksinfo/AssignTasksInfoDO.java @@ -117,5 +117,7 @@ public class AssignTasksInfoDO extends BaseDO { * 是否打回0:正常 1:打回 */ private Integer isReject; + /*是否发送成功 0:未发送 1:已发送*/ + private Integer remindStatue; } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/device/DeviceClockRecordDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/device/DeviceClockRecordDO.java new file mode 100644 index 0000000..d25349b --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/device/DeviceClockRecordDO.java @@ -0,0 +1,96 @@ +package com.zteits.urbanops.module.garden.dal.dataobject.device; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; + +/** + * 员工打卡记录 DO + * + * @author 超级管理员 + */ +@TableName("garden_device_clock_record") +@KeySequence("garden_device_clock_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceClockRecordDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Integer id; + /** + * 设备编码 + */ + private String deviceCode; + /** + * 设备名称 + */ + private String deviceName; + /** + * 打卡类型:上班/下班 + */ + private String punchType; + /** + * 高德GCJ02坐标系纬度 + */ + private BigDecimal latGcj02; + /** + * 高德GCJ02坐标系经度 + */ + private BigDecimal lngGcj02; + /** + * 详细地址 + */ + private String address; + /** + * 84坐标经度 + */ + private BigDecimal lng; + /** + * 84坐标纬度 + */ + private BigDecimal lat; + /** + * 状态位 + */ + private Integer statusBit; + /** + * 警告位 + */ + private Integer warnBit; + /** + * 提交人用户ID + */ + private Long userId; + /** + * 用户昵称 + */ + private String nickname; + /** + * 归属(一级部门id) + */ + private Long companyId; + /** + * 部门ID + */ + private Long deptId; + /** + * 业务线: yl-园林;wy-物业:sz-市政;例如:yl,wy + */ + private String busiLine; + + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/deviceuser/DeviceUserDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/deviceuser/DeviceUserDO.java index 5abf0bb..6db3ef1 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/deviceuser/DeviceUserDO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/deviceuser/DeviceUserDO.java @@ -43,6 +43,8 @@ public class DeviceUserDO extends BaseDO { * 提交人用户 */ private String userName; + + private String productCode; /** * 产品名称 */ diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/emergencytask/EmergencyMachineryDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/emergencytask/EmergencyMachineryDO.java new file mode 100644 index 0000000..09de353 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/emergencytask/EmergencyMachineryDO.java @@ -0,0 +1,52 @@ +package com.zteits.urbanops.module.garden.dal.dataobject.emergencytask; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; + +/** + * 抢险机械子 DO + * + * @author 超级管理员 + */ +@TableName("garden_emergency_machinery") +@KeySequence("garden_emergency_machinery_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EmergencyMachineryDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 任务编号(唯一标识,如生成规则:TASK+时间戳) + */ + private String taskNo; + /** + * 机械名称(如:三轮车) + */ + private Integer machineryNameId; + /** + * 机械数量 + */ + private Integer machineryCount; + /** + * 创建者 + */ + private String creatorName; + /** + * 更新者 + */ + private String updaterName; + + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/emergencytask/EmergencyTaskDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/emergencytask/EmergencyTaskDO.java new file mode 100644 index 0000000..d19711d --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/emergencytask/EmergencyTaskDO.java @@ -0,0 +1,144 @@ +package com.zteits.urbanops.module.garden.dal.dataobject.emergencytask; + +import com.zteits.urbanops.framework.mybatis.core.type.StringArrayToListTypeHandler; +import com.zteits.urbanops.framework.mybatis.core.type.StringListTypeHandler; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; + +/** + * 抢险任务主 DO + * + * @author 超级管理员 + */ +@TableName(value="garden_emergency_task", autoResultMap = true) +@KeySequence("garden_emergency_task_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EmergencyTaskDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 任务编号(唯一标识,如生成规则:TASK+时间戳) + */ + private String taskNo; + /** + * 发现险情时间 + */ + private LocalDateTime discoveryTime; + /** + * 险情类型(如:树木倒伏) + */ + private Integer emergencyTypeId; + /** + * 险情危害(如:无) + */ + private Integer emergencyHarmId; + /** + * 树木权属(如:专业权属) + */ + private Integer treeOwnershipId; + /** + * 险情地点 + */ + private String emergencyLocation; + /** + * 上报人 + */ + private String reporter; + /** + * 联系电话 + */ + private String contactPhone; + /** + * 抢险开始时间 + */ + private LocalDateTime rescueStartTime; + /** + * 抢险中照片 + */ + @TableField(typeHandler = StringArrayToListTypeHandler.class) + private List emergencyImg; + /** + * 树种(如:国槐) + */ + private String treeSpecies; + /** + * 树木规格(如:胸径20厘米) + */ + private String treeSpec; + /** + * 抢险完成时间 + */ + private LocalDateTime rescueCompleteTime; + /** + * 出动人员数量 + */ + private Integer personnelCount; + /** + * 抢险结束照片 + */ + @TableField(typeHandler = StringArrayToListTypeHandler.class) + private List emergencyEndImg; + /** + * 备注 + */ + private String remarks; + /** + * 案件状态 1-待提交 2-待审核 3-驳回 4-关闭;5-完结 + */ + private Integer busiStatus; + /** + * 工作流审批状态 + */ + private Integer status; + /** + * 流程实例的编号 + */ + private String processInstanceId; + /** + * 审批人ID + */ + private String approvalUserId; + /** + * 审批人 + */ + private String approvalUserName; + + /** + * 审批备注 + */ + private String approvalRemarks; + /** + * 归属(一级部门id) + */ + private Long companyId; + /** + * 部门ID(道路负责部门id) + */ + private Long deptId; + /** + * 创建者 + */ + private String creatorName; + /** + * 更新者 + */ + private String updaterName; + + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/materialname/MaterialNameDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/materialname/MaterialNameDO.java new file mode 100644 index 0000000..c78f41e --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/materialname/MaterialNameDO.java @@ -0,0 +1,48 @@ +package com.zteits.urbanops.module.garden.dal.dataobject.materialname; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; + +/** + * 物料名称 DO + * + * @author 超级管理员 + */ +@TableName("garden_material_name") +@KeySequence("garden_material_name_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MaterialNameDO extends BaseDO { + + /** + * 自增主键 + */ + @TableId + private Long id; + /** + * 物料名称ID + */ + private Long materialId; + /** + * 物料名称 + */ + private String materialName; + /** + * 备注 + */ + private String remark; + /** + * 部门ID + */ + private Long deptId; + + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/materialspecification/MaterialSpecificationDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/materialspecification/MaterialSpecificationDO.java new file mode 100644 index 0000000..79160e7 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/materialspecification/MaterialSpecificationDO.java @@ -0,0 +1,48 @@ +package com.zteits.urbanops.module.garden.dal.dataobject.materialspecification; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; + +/** + * 物料规格 DO + * + * @author 超级管理员 + */ +@TableName("garden_material_specification") +@KeySequence("garden_material_specification_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MaterialSpecificationDO extends BaseDO { + + /** + * 自增主键 + */ + @TableId + private Long id; + /** + * 规格编码 + */ + private String specCode; + /** + * 规格名称 + */ + private String specifications; + /** + * 备注 + */ + private String remark; + /** + * 部门ID + */ + private Long deptId; + + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/materialunit/MaterialUnitDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/materialunit/MaterialUnitDO.java new file mode 100644 index 0000000..00fd154 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/materialunit/MaterialUnitDO.java @@ -0,0 +1,48 @@ +package com.zteits.urbanops.module.garden.dal.dataobject.materialunit; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; + +/** + * 物料单位 DO + * + * @author 超级管理员 + */ +@TableName("garden_material_unit") +@KeySequence("garden_material_unit_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MaterialUnitDO extends BaseDO { + + /** + * 自增主键 + */ + @TableId + private Long id; + /** + * 单位ID + */ + private Long unitId; + /** + * 单位名称 + */ + private String unitName; + /** + * 备注 + */ + private String remark; + /** + * 部门ID + */ + private Long deptId; + + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/planrate/PlanRateDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/planrate/PlanRateDO.java index f03fa8c..c811f1c 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/planrate/PlanRateDO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/planrate/PlanRateDO.java @@ -47,6 +47,10 @@ public class PlanRateDO extends BaseDO { * 类型:1:养护;2:巡查 */ private Integer type; + /** + * 公司ID + */ + private Long companyId; } \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/problemtype/GardenProblemTypeDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/problemtype/GardenProblemTypeDO.java new file mode 100644 index 0000000..dc4a53b --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/problemtype/GardenProblemTypeDO.java @@ -0,0 +1,52 @@ +package com.zteits.urbanops.module.garden.dal.dataobject.problemtype; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; + +/** + * 问题类型三级分类 DO + * + * @author 超级管理员 + */ +@TableName("garden_problem_type") +@KeySequence("garden_problem_type_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class GardenProblemTypeDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 问题类型编码 + */ + private String typeCode; + /** + * 问题类型名称 + */ + private String typeName; + /** + * 层级:1一级 2二级 3三级 + */ + private Integer level; + /** + * 父级类型编码 + */ + private String parentCode; + /** + * 排序序号 + */ + private Integer sort; + /** + * 状态 1启用 0禁用 + */ + private Integer status; + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/taskstatistics/TaskStatisticsDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/taskstatistics/TaskStatisticsDO.java index 10a891f..84f9609 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/taskstatistics/TaskStatisticsDO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/taskstatistics/TaskStatisticsDO.java @@ -32,14 +32,24 @@ public class TaskStatisticsDO extends BaseDO { */ private String busiDate; /** + * 业务线 + */ + private String busiLine; + /** * 归属(一级部门id) */ - private Integer companyId; + private Long companyId; + + private String companyName; /** * 部门ID(道路负责部门id) */ private Long deptId; /** + * 角色 + */ + private String roleIds; + /** * 用户id */ private Long userId; @@ -83,6 +93,7 @@ public class TaskStatisticsDO extends BaseDO { * 工单未完成数 */ private Integer woUnfinished; + /** * 备注 */ diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegraladd/UnitIntegralAddDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegraladd/UnitIntegralAddDO.java new file mode 100644 index 0000000..3d58252 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegraladd/UnitIntegralAddDO.java @@ -0,0 +1,80 @@ +package com.zteits.urbanops.module.garden.dal.dataobject.unitintegraladd; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; + +/** + * 积分增加记录 DO + * + * @author 超级管理员 + */ +@TableName("garden_unit_integral_add") +@KeySequence("garden_unit_integral_add_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UnitIntegralAddDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 来源类型 01:派单 + */ + private String sourceType; + /** + * 单位类型:01:公司 02:班组 03:个人 + */ + private String unitType; + /** + * 单位ID(部门表 id) + */ + private String unitId; + /** + * 单位名称(冗余,避免联表查询) + */ + private String unitName; + /** + * 关联ID(关联业务表主键) + */ + private Long relatedTaskId; + /** + * 业务名称(冗余) + */ + private String relatedTaskName; + /** + * 本次增加积分(正数) + */ + private Integer addIntegral; + /** + * 增加原因(如:到期前上报奖励、到期后上报奖励等) + */ + private String addReason; + /** + * 增加前总积分(对账用) + */ + private Integer beforeIntegral; + /** + * 增加后总积分(对账用) + */ + private Integer afterIntegral; + /** + * 工单号 + */ + private String workNo; + /** + * 备注(补充积分增加的特殊说明) + */ + private String remark; + + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegralsub/UnitIntegralSubDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegralsub/UnitIntegralSubDO.java new file mode 100644 index 0000000..9ff17da --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegralsub/UnitIntegralSubDO.java @@ -0,0 +1,80 @@ +package com.zteits.urbanops.module.garden.dal.dataobject.unitintegralsub; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; + +/** + * 积分扣减记录 DO + * + * @author 超级管理员 + */ +@TableName("garden_unit_integral_sub") +@KeySequence("garden_unit_integral_sub_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UnitIntegralSubDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 来源类型 01:派单 + */ + private String sourceType; + /** + * 单位类型:01:公司 02:班组 03:个人 + */ + private String unitType; + /** + * 单位ID(部门表 id) + */ + private String unitId; + /** + * 单位名称(冗余,避免联表查询) + */ + private String unitName; + /** + * 关联任务ID(外键,关联业务表主键) + */ + private Long relatedTaskId; + /** + * 业务名称(冗余) + */ + private String relatedTaskName; + /** + * 本次扣减积分(正数,存储扣减数值) + */ + private Integer subIntegral; + /** + * 扣减原因(如:任务打回等) + */ + private String subReason; + /** + * 扣减前总积分(对账用) + */ + private Integer beforeIntegral; + /** + * 扣减后总积分(对账用) + */ + private Integer afterIntegral; + /** + * 工单号 + */ + private String workNo; + /** + * 备注(补充扣减的特殊说明) + */ + private String remark; + + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegraltotal/UnitIntegralTotalDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegraltotal/UnitIntegralTotalDO.java new file mode 100644 index 0000000..f61250e --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegraltotal/UnitIntegralTotalDO.java @@ -0,0 +1,64 @@ +package com.zteits.urbanops.module.garden.dal.dataobject.unitintegraltotal; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; + +/** + * 单位积分累计 DO + * + * @author 超级管理员 + */ +@TableName("garden_unit_integral_total") +@KeySequence("garden_unit_integral_total_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UnitIntegralTotalDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 积分汇总的统计日期(格式:YYYY) + */ + private String statDate; + /** + * 单位类型:01:公司 02:班组 03:个人 + */ + private String unitType; + /** + * 单位ID(部门表 id) + */ + private String unitId; + /** + * 单位名称 + */ + private String unitName; + /** + * 当前总积分(累计增加-累计扣减) + */ + private Integer totalIntegral; + /** + * 累计增加积分 + */ + private Integer totalAdd; + /** + * 累计扣减积分 + */ + private Integer totalSub; + /** + * 备注 + */ + private String remark; + + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/assigntasksinfo/AssignTasksInfoMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/assigntasksinfo/AssignTasksInfoMapper.java index 7ed9554..e761082 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/assigntasksinfo/AssignTasksInfoMapper.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/assigntasksinfo/AssignTasksInfoMapper.java @@ -46,4 +46,7 @@ public interface AssignTasksInfoMapper extends BaseMapperX { * 批量更新“是否超时”字段 */ public int batchUpdateIsOverdue(@Param("list") List taskInfoList); + + /*查询超时派单*/ + public List selectOutTimeAssignTaskInfo(); } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/device/DeviceClockRecordMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/device/DeviceClockRecordMapper.java new file mode 100644 index 0000000..9ac9972 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/device/DeviceClockRecordMapper.java @@ -0,0 +1,41 @@ +package com.zteits.urbanops.module.garden.dal.mysql.device; + +import java.util.*; + +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; +import com.zteits.urbanops.module.garden.dal.dataobject.device.DeviceClockRecordDO; +import org.apache.ibatis.annotations.Mapper; +import com.zteits.urbanops.module.garden.controller.admin.device.vo.*; + +/** + * 员工打卡记录 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceClockRecordMapper extends BaseMapperX { + + default PageResult selectPage(DeviceClockRecordPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DeviceClockRecordDO::getDeviceCode, reqVO.getDeviceCode()) + .likeIfPresent(DeviceClockRecordDO::getDeviceName, reqVO.getDeviceName()) + .eqIfPresent(DeviceClockRecordDO::getPunchType, reqVO.getPunchType()) + .eqIfPresent(DeviceClockRecordDO::getLatGcj02, reqVO.getLatGcj02()) + .eqIfPresent(DeviceClockRecordDO::getLngGcj02, reqVO.getLngGcj02()) + .eqIfPresent(DeviceClockRecordDO::getAddress, reqVO.getAddress()) + .eqIfPresent(DeviceClockRecordDO::getLng, reqVO.getLng()) + .eqIfPresent(DeviceClockRecordDO::getLat, reqVO.getLat()) + .eqIfPresent(DeviceClockRecordDO::getStatusBit, reqVO.getStatusBit()) + .eqIfPresent(DeviceClockRecordDO::getWarnBit, reqVO.getWarnBit()) + .eqIfPresent(DeviceClockRecordDO::getUserId, reqVO.getUserId()) + .likeIfPresent(DeviceClockRecordDO::getNickname, reqVO.getNickname()) + .eqIfPresent(DeviceClockRecordDO::getCompanyId, reqVO.getCompanyId()) + .eqIfPresent(DeviceClockRecordDO::getDeptId, reqVO.getDeptId()) + .eqIfPresent(DeviceClockRecordDO::getBusiLine, reqVO.getBusiLine()) + .betweenIfPresent(DeviceClockRecordDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DeviceClockRecordDO::getId)); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/deviceuser/DeviceUserMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/deviceuser/DeviceUserMapper.java index e1ccf58..93cb632 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/deviceuser/DeviceUserMapper.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/deviceuser/DeviceUserMapper.java @@ -27,6 +27,8 @@ public interface DeviceUserMapper extends BaseMapperX { .eqIfPresent(DeviceUserDO::getDeviceNo, reqVO.getDeviceNo()) .likeIfPresent(DeviceUserDO::getDeviceName, reqVO.getDeviceName()) .eqIfPresent(DeviceUserDO::getDeviceState, reqVO.getDeviceState()) + .eqIfPresent(DeviceUserDO::getCompanyId, reqVO.getCompanyId()) + .orderByDesc(DeviceUserDO::getId)); } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/emergencytask/EmergencyMachineryMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/emergencytask/EmergencyMachineryMapper.java new file mode 100644 index 0000000..541ef64 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/emergencytask/EmergencyMachineryMapper.java @@ -0,0 +1,33 @@ +package com.zteits.urbanops.module.garden.dal.mysql.emergencytask; + +import java.util.*; + +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; +import com.zteits.urbanops.module.garden.dal.dataobject.emergencytask.EmergencyMachineryDO; +import org.apache.ibatis.annotations.Mapper; +import com.zteits.urbanops.module.garden.controller.admin.emergencytask.vo.*; +import org.apache.ibatis.annotations.Param; + +/** + * 抢险机械子 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface EmergencyMachineryMapper extends BaseMapperX { + + default PageResult selectPage(EmergencyMachineryPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(EmergencyMachineryDO::getMachineryNameId, reqVO.getMachineryNameId()) + .eqIfPresent(EmergencyMachineryDO::getMachineryCount, reqVO.getMachineryCount()) + .likeIfPresent(EmergencyMachineryDO::getCreatorName, reqVO.getCreatorName()) + .betweenIfPresent(EmergencyMachineryDO::getCreateTime, reqVO.getCreateTime()) + .likeIfPresent(EmergencyMachineryDO::getUpdaterName, reqVO.getUpdaterName()) + .orderByDesc(EmergencyMachineryDO::getId)); + } + + int deleteByTaskNo(@Param("taskNo") String taskNo); + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/emergencytask/EmergencyTaskMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/emergencytask/EmergencyTaskMapper.java new file mode 100644 index 0000000..86d4f00 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/emergencytask/EmergencyTaskMapper.java @@ -0,0 +1,53 @@ +package com.zteits.urbanops.module.garden.dal.mysql.emergencytask; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.*; + +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; +import com.zteits.urbanops.module.garden.dal.dataobject.emergencytask.EmergencyTaskDO; +import org.apache.ibatis.annotations.Mapper; +import com.zteits.urbanops.module.garden.controller.admin.emergencytask.vo.*; +import org.apache.ibatis.annotations.Param; +import org.springframework.util.CollectionUtils; + +/** + * 抢险任务主 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface EmergencyTaskMapper extends BaseMapperX { + + default PageResult selectPage(EmergencyTaskPageReqVO reqVO) { + LocalDateTime startDateTime = null; + LocalDateTime endDateTime = null; + if (reqVO.getStartTime() != null) { + startDateTime = reqVO.getStartTime().atStartOfDay(); + } + // 处理结束时间 (转为当天 23:59:59...) + if (reqVO.getEndTime() != null) { + endDateTime = reqVO.getEndTime().atTime(LocalTime.MAX); + } + LambdaQueryWrapperX sql = new LambdaQueryWrapperX() + .likeIfPresent(EmergencyTaskDO::getTaskNo, reqVO.getTaskNo()) + .eqIfPresent(EmergencyTaskDO::getEmergencyTypeId, reqVO.getEmergencyTypeId()) + .eqIfPresent(EmergencyTaskDO::getEmergencyHarmId, reqVO.getEmergencyHarmId()) + .eqIfPresent(EmergencyTaskDO::getTreeOwnershipId, reqVO.getTreeOwnershipId()) + .likeIfPresent(EmergencyTaskDO::getEmergencyLocation, reqVO.getEmergencyLocation()) + .eqIfPresent(EmergencyTaskDO::getBusiStatus, reqVO.getBusiStatus()) + .eqIfPresent(EmergencyTaskDO::getCompanyId, reqVO.getCompanyId()) + .betweenIfPresent(EmergencyTaskDO::getDiscoveryTime, startDateTime, endDateTime); + if(!CollectionUtils.isEmpty(reqVO.getBusiStatusList())){ + sql.in(EmergencyTaskDO::getBusiStatus, reqVO.getBusiStatusList()); + } + sql.orderByDesc(EmergencyTaskDO::getId); + return selectPage(reqVO, sql); + } + + int deleteByTaskNo(@Param("taskNo") String taskNo); + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/homepage/HomepageSummaryMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/homepage/HomepageSummaryMapper.java index 6f98416..c811deb 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/homepage/HomepageSummaryMapper.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/homepage/HomepageSummaryMapper.java @@ -10,9 +10,11 @@ import com.zteits.urbanops.module.garden.controller.app.homepage.vo.CommonTaskSt import com.zteits.urbanops.module.garden.controller.app.homepage.vo.TaskCompletionStatusRspVo; import com.zteits.urbanops.module.garden.controller.app.homepage.vo.TaskDetailsRspVo; import com.zteits.urbanops.module.garden.dal.dataobject.departmentcost.DepartmentCostDO; +import com.zteits.urbanops.module.garden.dal.dataobject.taskstatistics.TaskStatisticsDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.time.LocalDateTime; import java.util.List; import java.util.Map; @@ -98,7 +100,7 @@ public interface HomepageSummaryMapper extends BaseMapperX { * @Description 工单趋势 * @Date 2025/12/30 23:40 */ - List countWorkOrderTrend(@Param("companyId") Long companyId, @Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("queryState") String queryState); + List countWorkOrderTrend(@Param("companyId") Long companyId, @Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("queryState") String queryState, @Param("currentDate") String currentDate); /** * @Author wangqian @@ -137,7 +139,7 @@ public interface HomepageSummaryMapper extends BaseMapperX { * @param userId * @Return com.baomidou.mybatisplus.core.metadata.IPage */ - IPage queryPendingTaskDetails(IPage page, @Param("roleIds") List roleIds, @Param("userId") Long userId, @Param("deptId") Long deptId); + IPage queryPendingTaskDetails(IPage page, @Param("roleIds") List roleIds, @Param("userId") Long userId, @Param("deptId") Long deptId, @Param("currentDate") LocalDateTime currentDate); /** * @Author wangqian @@ -198,5 +200,10 @@ public interface HomepageSummaryMapper extends BaseMapperX { * @Return java.util.List> */ List countWorkOrderCompleted(@Param("beginTime") String beginTime, @Param("endTime") String endTime); - + /** + * @Author wangqian + * @Description 获取用户初始化数据 + * @Date 2026/1/12 0:45 + */ + List getUserAll(@Param("busiDate") String busiDate); } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/inspectionplan/InspectionPlanInterceptMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/inspectionplan/InspectionPlanInterceptMapper.java index f7b3497..9550e41 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/inspectionplan/InspectionPlanInterceptMapper.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/inspectionplan/InspectionPlanInterceptMapper.java @@ -31,7 +31,8 @@ public interface InspectionPlanInterceptMapper extends BaseMapperX .betweenIfPresent(MaintainPlanDO::getBeginTime, reqVO.getBeginTime()) .betweenIfPresent(MaintainPlanDO::getEndTime, reqVO.getEndTime()) .eq(MaintainPlanDO::getDeleted,0) + .inIfPresent(MaintainPlanDO::getDeptId, reqVO.getDeptIds()) .orderByDesc(MaintainPlanDO::getId)); } -} \ No newline at end of file +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/materialinventory/MaterialInventoryMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/materialinventory/MaterialInventoryMapper.java index bc6e60b..d60136f 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/materialinventory/MaterialInventoryMapper.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/materialinventory/MaterialInventoryMapper.java @@ -18,27 +18,34 @@ import com.zteits.urbanops.module.garden.controller.admin.materialinventory.vo.* public interface MaterialInventoryMapper extends BaseMapperX { default PageResult selectPage(MaterialInventoryPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(MaterialInventoryDO::getMaterialId, reqVO.getMaterialId()) - .likeIfPresent(MaterialInventoryDO::getMaterialName, reqVO.getMaterialName()) - .eqIfPresent(MaterialInventoryDO::getMaterialTypeId, reqVO.getMaterialTypeId()) - .likeIfPresent(MaterialInventoryDO::getMaterialTypeName, reqVO.getMaterialTypeName()) - .eqIfPresent(MaterialInventoryDO::getTypeId, reqVO.getTypeId()) - .likeIfPresent(MaterialInventoryDO::getTypeName, reqVO.getTypeName()) - .eqIfPresent(MaterialInventoryDO::getTypeDetailId, reqVO.getTypeDetailId()) - .likeIfPresent(MaterialInventoryDO::getTypeDetailName, reqVO.getTypeDetailName()) - .eqIfPresent(MaterialInventoryDO::getSpecifications, reqVO.getSpecifications()) - .eqIfPresent(MaterialInventoryDO::getBelongCompanyId, reqVO.getBelongCompanyId()) - .likeIfPresent(MaterialInventoryDO::getBelongCompanyName, reqVO.getBelongCompanyName()) - .eqIfPresent(MaterialInventoryDO::getUnitId, reqVO.getUnitId()) - .likeIfPresent(MaterialInventoryDO::getUnitName, reqVO.getUnitName()) - .eqIfPresent(MaterialInventoryDO::getCurrentNum, reqVO.getCurrentNum()) - .eqIfPresent(MaterialInventoryDO::getOutTotalNum, reqVO.getOutTotalNum()) - .eqIfPresent(MaterialInventoryDO::getInventoryTotalNum, reqVO.getInventoryTotalNum()) - .betweenIfPresent(MaterialInventoryDO::getCreateTime, reqVO.getCreateTime()) - .eqIfPresent(MaterialInventoryDO::getInventoryAlermNum, reqVO.getInventoryAlermNum()) - .eqIfPresent(MaterialInventoryDO::getDeptId, reqVO.getDeptId()) - .orderByDesc(MaterialInventoryDO::getMaterialId)); + + LambdaQueryWrapperX queryWrapper = new LambdaQueryWrapperX() + .eqIfPresent(MaterialInventoryDO::getMaterialId, reqVO.getMaterialId()) + .likeIfPresent(MaterialInventoryDO::getMaterialName, reqVO.getMaterialName()) + .eqIfPresent(MaterialInventoryDO::getMaterialTypeId, reqVO.getMaterialTypeId()) + .likeIfPresent(MaterialInventoryDO::getMaterialTypeName, reqVO.getMaterialTypeName()) + .eqIfPresent(MaterialInventoryDO::getTypeId, reqVO.getTypeId()) + .likeIfPresent(MaterialInventoryDO::getTypeName, reqVO.getTypeName()) + .eqIfPresent(MaterialInventoryDO::getTypeDetailId, reqVO.getTypeDetailId()) + .likeIfPresent(MaterialInventoryDO::getTypeDetailName, reqVO.getTypeDetailName()) + .eqIfPresent(MaterialInventoryDO::getSpecifications, reqVO.getSpecifications()) + .eqIfPresent(MaterialInventoryDO::getBelongCompanyId, reqVO.getBelongCompanyId()) + .likeIfPresent(MaterialInventoryDO::getBelongCompanyName, reqVO.getBelongCompanyName()) + .eqIfPresent(MaterialInventoryDO::getUnitId, reqVO.getUnitId()) + .likeIfPresent(MaterialInventoryDO::getUnitName, reqVO.getUnitName()) + .eqIfPresent(MaterialInventoryDO::getCurrentNum, reqVO.getCurrentNum()) + .eqIfPresent(MaterialInventoryDO::getOutTotalNum, reqVO.getOutTotalNum()) + .eqIfPresent(MaterialInventoryDO::getInventoryTotalNum, reqVO.getInventoryTotalNum()) + .betweenIfPresent(MaterialInventoryDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(MaterialInventoryDO::getInventoryAlermNum, reqVO.getInventoryAlermNum()) + .eqIfPresent(MaterialInventoryDO::getDeptId, reqVO.getDeptId()); + //库存大于0 + if (reqVO.getOutInventoryQuery() != null && 0 == reqVO.getOutInventoryQuery()) { + queryWrapper.gt(MaterialInventoryDO::getCurrentNum, 0); + } + queryWrapper.orderByDesc(MaterialInventoryDO::getMaterialId); + + return selectPage(reqVO,queryWrapper); } } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/materialname/MaterialNameMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/materialname/MaterialNameMapper.java new file mode 100644 index 0000000..81083a2 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/materialname/MaterialNameMapper.java @@ -0,0 +1,30 @@ +package com.zteits.urbanops.module.garden.dal.mysql.materialname; + +import java.util.*; + +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; +import com.zteits.urbanops.module.garden.dal.dataobject.materialname.MaterialNameDO; +import org.apache.ibatis.annotations.Mapper; +import com.zteits.urbanops.module.garden.controller.admin.materialname.vo.*; + +/** + * 物料名称 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface MaterialNameMapper extends BaseMapperX { + + default PageResult selectPage(MaterialNamePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MaterialNameDO::getMaterialId, reqVO.getMaterialId()) + .likeIfPresent(MaterialNameDO::getMaterialName, reqVO.getMaterialName()) + .eqIfPresent(MaterialNameDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(MaterialNameDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(MaterialNameDO::getDeptId, reqVO.getDeptId()) + .orderByDesc(MaterialNameDO::getId)); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/materialspecification/MaterialSpecificationMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/materialspecification/MaterialSpecificationMapper.java new file mode 100644 index 0000000..9e77eda --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/materialspecification/MaterialSpecificationMapper.java @@ -0,0 +1,30 @@ +package com.zteits.urbanops.module.garden.dal.mysql.materialspecification; + +import java.util.*; + +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; +import com.zteits.urbanops.module.garden.dal.dataobject.materialspecification.MaterialSpecificationDO; +import org.apache.ibatis.annotations.Mapper; +import com.zteits.urbanops.module.garden.controller.admin.materialspecification.vo.*; + +/** + * 物料规格 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface MaterialSpecificationMapper extends BaseMapperX { + + default PageResult selectPage(MaterialSpecificationPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MaterialSpecificationDO::getSpecCode, reqVO.getSpecCode()) + .likeIfPresent(MaterialSpecificationDO::getSpecifications, reqVO.getSpecifications()) + .eqIfPresent(MaterialSpecificationDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(MaterialSpecificationDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(MaterialSpecificationDO::getDeptId, reqVO.getDeptId()) + .orderByDesc(MaterialSpecificationDO::getId)); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/materialunit/MaterialUnitMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/materialunit/MaterialUnitMapper.java new file mode 100644 index 0000000..286b54f --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/materialunit/MaterialUnitMapper.java @@ -0,0 +1,30 @@ +package com.zteits.urbanops.module.garden.dal.mysql.materialunit; + +import java.util.*; + +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; +import com.zteits.urbanops.module.garden.dal.dataobject.materialunit.MaterialUnitDO; +import org.apache.ibatis.annotations.Mapper; +import com.zteits.urbanops.module.garden.controller.admin.materialunit.vo.*; + +/** + * 物料单位 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface MaterialUnitMapper extends BaseMapperX { + + default PageResult selectPage(MaterialUnitPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MaterialUnitDO::getUnitId, reqVO.getUnitId()) + .likeIfPresent(MaterialUnitDO::getUnitName, reqVO.getUnitName()) + .eqIfPresent(MaterialUnitDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(MaterialUnitDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(MaterialUnitDO::getDeptId, reqVO.getDeptId()) + .orderByDesc(MaterialUnitDO::getId)); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/mechanicalcost/MechanicalCostMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/mechanicalcost/MechanicalCostMapper.java index 53bfdf0..25ea3eb 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/mechanicalcost/MechanicalCostMapper.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/mechanicalcost/MechanicalCostMapper.java @@ -5,6 +5,7 @@ import java.util.*; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; +import com.zteits.urbanops.module.garden.controller.admin.wasterecord.vo.WasteRecordPageReqVO; import com.zteits.urbanops.module.garden.dal.dataobject.mechanicalcost.MechanicalCostDO; import org.apache.ibatis.annotations.Mapper; import com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo.*; @@ -20,7 +21,7 @@ public interface MechanicalCostMapper extends BaseMapperX { default PageResult selectPage(MechanicalCostPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(MechanicalCostDO::getMechType, reqVO.getMechType()) - .eqIfPresent(MechanicalCostDO::getMechCode, reqVO.getMechCode()) + .likeIfPresent(MechanicalCostDO::getMechCode, reqVO.getMechCode()) .likeIfPresent(MechanicalCostDO::getMechName, reqVO.getMechName()) .eqIfPresent(MechanicalCostDO::getMechCategory, reqVO.getMechCategory()) .eqIfPresent(MechanicalCostDO::getUnitPrice, reqVO.getUnitPrice()) @@ -36,7 +37,11 @@ public interface MechanicalCostMapper extends BaseMapperX { .eqIfPresent(MechanicalCostDO::getDeptId, reqVO.getDeptId()) .eqIfPresent(MechanicalCostDO::getRemark, reqVO.getRemark()) .betweenIfPresent(MechanicalCostDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(MechanicalCostDO::getId)); + //.orderByDesc(MechanicalCostDO::getId)); + .orderBy(true, reqVO.getSortAsc(), + MechanicalCostPageReqVO.SORT_FIELD_MAP.get(reqVO.getOrderByColumn()) + ) + ); } public List selectDuplicateIds(List keyList); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/personalcost/PersonalCostMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/personalcost/PersonalCostMapper.java index 16baa86..d485c1e 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/personalcost/PersonalCostMapper.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/personalcost/PersonalCostMapper.java @@ -5,6 +5,7 @@ import java.util.*; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; +import com.zteits.urbanops.module.garden.controller.admin.rentalmechanicalcost.vo.RentalMechanicalCostPageReqVO; import com.zteits.urbanops.module.garden.dal.dataobject.personalcost.PersonalCostDO; import org.apache.ibatis.annotations.Mapper; import com.zteits.urbanops.module.garden.controller.admin.personalcost.vo.*; @@ -29,7 +30,11 @@ public interface PersonalCostMapper extends BaseMapperX { .eqIfPresent(PersonalCostDO::getDeptId, reqVO.getDeptId()) .eqIfPresent(PersonalCostDO::getRemark, reqVO.getRemark()) .betweenIfPresent(PersonalCostDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(PersonalCostDO::getId)); + //.orderByDesc(PersonalCostDO::getId)) + .orderBy(true, reqVO.getSortAsc(), + PersonalCostPageReqVO.SORT_FIELD_MAP.get(reqVO.getOrderByColumn()) + ) + ); } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/planrate/PlanRateDetailMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/planrate/PlanRateDetailMapper.java index 890ed95..7092037 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/planrate/PlanRateDetailMapper.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/planrate/PlanRateDetailMapper.java @@ -31,4 +31,6 @@ public interface PlanRateDetailMapper extends BaseMapperX { int deleteByRateNo(@Param("rateNo") String rateNo); + PlanRateDetailDO getPlanRateDetail(@Param("busiLine") String busiLine, @Param("planTypeId") Integer planTypeId, @Param("levelId") Integer levelId, @Param("companyId") Long companyId); + } \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/planrate/PlanRateInterceptMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/planrate/PlanRateInterceptMapper.java index 73f6040..6817117 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/planrate/PlanRateInterceptMapper.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/planrate/PlanRateInterceptMapper.java @@ -24,6 +24,7 @@ public interface PlanRateInterceptMapper extends BaseMapperX { .eqIfPresent(PlanRateDO::getPlanTypeId, reqVO.getPlanTypeId()) .eqIfPresent(PlanRateDO::getStdPlan, reqVO.getStdPlan()) .eq(PlanRateDO::getType, reqVO.getType()) + .eqIfPresent(PlanRateDO::getCompanyId, reqVO.getCompanyId()) .orderByDesc(PlanRateDO::getId)); } } \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/problemtype/GardenProblemTypeMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/problemtype/GardenProblemTypeMapper.java new file mode 100644 index 0000000..8805a5a --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/problemtype/GardenProblemTypeMapper.java @@ -0,0 +1,87 @@ +package com.zteits.urbanops.module.garden.dal.mysql.problemtype; + +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; +import com.zteits.urbanops.module.garden.controller.admin.problemtype.vo.ProblemTypePageReqVO; +import com.zteits.urbanops.module.garden.dal.dataobject.problemtype.GardenProblemTypeDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 问题类型 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface GardenProblemTypeMapper extends BaseMapperX { + + default PageResult selectPage(ProblemTypePageReqVO reqVO) { + LambdaQueryWrapperX wrapper = new LambdaQueryWrapperX() + .eqIfPresent(GardenProblemTypeDO::getLevel, reqVO.getLevel()) + .eqIfPresent(GardenProblemTypeDO::getStatus, reqVO.getStatus()) + .likeIfPresent(GardenProblemTypeDO::getTypeName, reqVO.getTypeName()) + .likeIfPresent(GardenProblemTypeDO::getTypeCode, reqVO.getTypeCode()); + wrapper.orderByAsc(GardenProblemTypeDO::getSort); + wrapper.orderByAsc(GardenProblemTypeDO::getId); + + // 级联筛选:如果传了 levelOneCode,查出所有二级编码做 IN 查询 + if (reqVO.getLevelOneCode() != null && !reqVO.getLevelOneCode().isEmpty()) { + List levelTwoList = selectByParentCodeAndLevel(reqVO.getLevelOneCode(), 2); + List parentCodes = new ArrayList<>(); + parentCodes.add(reqVO.getLevelOneCode()); // 包含一级自身 + parentCodes.addAll(levelTwoList.stream().map(GardenProblemTypeDO::getTypeCode).collect(Collectors.toList())); + wrapper.in(GardenProblemTypeDO::getParentCode, parentCodes); + } else { + wrapper.eqIfPresent(GardenProblemTypeDO::getParentCode, reqVO.getParentCode()); + } + + return selectPage(reqVO, wrapper); + } + + /** + * 根据 parentCode 和 level 查询子类型列表 + */ + default List selectByParentCodeAndLevel(String parentCode, Integer level) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(GardenProblemTypeDO::getParentCode, parentCode) + .eqIfPresent(GardenProblemTypeDO::getLevel, level) + .eq(GardenProblemTypeDO::getStatus, 1) + .orderByAsc(GardenProblemTypeDO::getSort) + .orderByAsc(GardenProblemTypeDO::getId)); + } + + /** + * 根据 typeCode 查询唯一记录 + */ + default GardenProblemTypeDO selectByTypeCode(String typeCode) { + return selectOne(new LambdaQueryWrapperX() + .eq(GardenProblemTypeDO::getTypeCode, typeCode)); + } + + /** + * 生成下一个编码:父级编码 + 5位递增序号 + * 如 parentCode=BIZ_GARDEN → BIZ_GARDEN00001, BIZ_GARDEN00002 + */ + default String generateNextCode(String parentCode) { + List list = selectList(new LambdaQueryWrapperX() + .likeRight(GardenProblemTypeDO::getTypeCode, parentCode) + .orderByDesc(GardenProblemTypeDO::getTypeCode) + .last("LIMIT 1")); + if (list == null || list.isEmpty()) { + return parentCode + "00001"; + } + String maxCode = list.get(0).getTypeCode(); + String seqStr = maxCode.substring(parentCode.length()); + try { + int seq = Integer.parseInt(seqStr) + 1; + return parentCode + String.format("%05d", seq); + } catch (NumberFormatException e) { + return parentCode + "00001"; + } + } + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/rentalmechanicalcost/RentalMechanicalCostMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/rentalmechanicalcost/RentalMechanicalCostMapper.java index 9d0ebda..fe335b1 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/rentalmechanicalcost/RentalMechanicalCostMapper.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/rentalmechanicalcost/RentalMechanicalCostMapper.java @@ -28,11 +28,11 @@ public interface RentalMechanicalCostMapper extends BaseMapperX { .likeIfPresent(RoadDO::getCreatorName, reqVO.getCreatorName()) .betweenIfPresent(RoadDO::getCreateTime, reqVO.getCreateTime()) .likeIfPresent(RoadDO::getUpdaterName, reqVO.getUpdaterName()) - .orderBy(true, reqVO.getSortAsc(), + .orderBy(false, reqVO.getSortAsc(), RoadPageReqVO.SORT_FIELD_MAP.get(reqVO.getOrderByColumn()) ) ); } -} \ No newline at end of file +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/tree/TreeMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/tree/TreeMapper.java index cf5a5d8..5dd0870 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/tree/TreeMapper.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/tree/TreeMapper.java @@ -3,6 +3,7 @@ package com.zteits.urbanops.module.garden.dal.mysql.tree; import java.util.*; import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.datapermission.core.annotation.DataPermission; import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; import com.zteits.urbanops.framework.mybatis.core.query.MPJLambdaWrapperX; @@ -73,6 +74,7 @@ public interface TreeMapper extends BaseMapperX { ); } + @DataPermission(enable = true) List selectCompanyDeptRoadTreeData(TreeVO tree); // default List selectCompanyDeptRoadTreeData(TreeVO tree) { diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegraladd/UnitIntegralAddMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegraladd/UnitIntegralAddMapper.java new file mode 100644 index 0000000..f4e178d --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegraladd/UnitIntegralAddMapper.java @@ -0,0 +1,38 @@ +package com.zteits.urbanops.module.garden.dal.mysql.unitintegraladd; + +import java.util.*; + +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraladd.UnitIntegralAddDO; +import org.apache.ibatis.annotations.Mapper; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo.*; + +/** + * 积分增加记录 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface UnitIntegralAddMapper extends BaseMapperX { + + default PageResult selectPage(UnitIntegralAddPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(UnitIntegralAddDO::getSourceType, reqVO.getSourceType()) + .eqIfPresent(UnitIntegralAddDO::getUnitType, reqVO.getUnitType()) + .eqIfPresent(UnitIntegralAddDO::getUnitId, reqVO.getUnitId()) + .likeIfPresent(UnitIntegralAddDO::getUnitName, reqVO.getUnitName()) + .eqIfPresent(UnitIntegralAddDO::getRelatedTaskId, reqVO.getRelatedTaskId()) + .likeIfPresent(UnitIntegralAddDO::getRelatedTaskName, reqVO.getRelatedTaskName()) + .eqIfPresent(UnitIntegralAddDO::getAddIntegral, reqVO.getAddIntegral()) + .eqIfPresent(UnitIntegralAddDO::getAddReason, reqVO.getAddReason()) + .eqIfPresent(UnitIntegralAddDO::getBeforeIntegral, reqVO.getBeforeIntegral()) + .eqIfPresent(UnitIntegralAddDO::getAfterIntegral, reqVO.getAfterIntegral()) + .eqIfPresent(UnitIntegralAddDO::getWorkNo, reqVO.getWorkNo()) + .eqIfPresent(UnitIntegralAddDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(UnitIntegralAddDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UnitIntegralAddDO::getId)); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegralsub/UnitIntegralSubMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegralsub/UnitIntegralSubMapper.java new file mode 100644 index 0000000..caf2283 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegralsub/UnitIntegralSubMapper.java @@ -0,0 +1,38 @@ +package com.zteits.urbanops.module.garden.dal.mysql.unitintegralsub; + +import java.util.*; + +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegralsub.UnitIntegralSubDO; +import org.apache.ibatis.annotations.Mapper; +import com.zteits.urbanops.module.garden.controller.admin.unitintegralsub.vo.*; + +/** + * 积分扣减记录 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface UnitIntegralSubMapper extends BaseMapperX { + + default PageResult selectPage(UnitIntegralSubPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(UnitIntegralSubDO::getSourceType, reqVO.getSourceType()) + .eqIfPresent(UnitIntegralSubDO::getUnitType, reqVO.getUnitType()) + .eqIfPresent(UnitIntegralSubDO::getUnitId, reqVO.getUnitId()) + .likeIfPresent(UnitIntegralSubDO::getUnitName, reqVO.getUnitName()) + .eqIfPresent(UnitIntegralSubDO::getRelatedTaskId, reqVO.getRelatedTaskId()) + .likeIfPresent(UnitIntegralSubDO::getRelatedTaskName, reqVO.getRelatedTaskName()) + .eqIfPresent(UnitIntegralSubDO::getSubIntegral, reqVO.getSubIntegral()) + .eqIfPresent(UnitIntegralSubDO::getSubReason, reqVO.getSubReason()) + .eqIfPresent(UnitIntegralSubDO::getBeforeIntegral, reqVO.getBeforeIntegral()) + .eqIfPresent(UnitIntegralSubDO::getAfterIntegral, reqVO.getAfterIntegral()) + .eqIfPresent(UnitIntegralSubDO::getWorkNo, reqVO.getWorkNo()) + .eqIfPresent(UnitIntegralSubDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(UnitIntegralSubDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UnitIntegralSubDO::getId)); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegraltotal/UnitIntegralTotalMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegraltotal/UnitIntegralTotalMapper.java new file mode 100644 index 0000000..1a45cfb --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegraltotal/UnitIntegralTotalMapper.java @@ -0,0 +1,43 @@ +package com.zteits.urbanops.module.garden.dal.mysql.unitintegraltotal; + +import java.util.*; + +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraltotal.UnitIntegralTotalDO; +import org.apache.ibatis.annotations.Mapper; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.*; +import org.apache.ibatis.annotations.Param; + +/** + * 单位积分累计 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface UnitIntegralTotalMapper extends BaseMapperX { + + default PageResult selectPage(UnitIntegralTotalPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(UnitIntegralTotalDO::getStatDate, reqVO.getStatDate()) + .eqIfPresent(UnitIntegralTotalDO::getUnitType, reqVO.getUnitType()) + .eqIfPresent(UnitIntegralTotalDO::getUnitId, reqVO.getUnitId()) + .likeIfPresent(UnitIntegralTotalDO::getUnitName, reqVO.getUnitName()) + .eqIfPresent(UnitIntegralTotalDO::getTotalIntegral, reqVO.getTotalIntegral()) + .eqIfPresent(UnitIntegralTotalDO::getTotalAdd, reqVO.getTotalAdd()) + .eqIfPresent(UnitIntegralTotalDO::getTotalSub, reqVO.getTotalSub()) + .eqIfPresent(UnitIntegralTotalDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(UnitIntegralTotalDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UnitIntegralTotalDO::getId)); + } + + + /** + * 根据任务ID列表统计总积分 + * @param relatedTaskIds 关联任务ID列表 + * @return 积分统计结果 + */ + List queryIntegralByRelatedTaskIds(@Param("relatedTaskIds") List relatedTaskIds); + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/waterfee/WaterFeeMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/waterfee/WaterFeeMapper.java index 3ea92a7..327919d 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/waterfee/WaterFeeMapper.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/waterfee/WaterFeeMapper.java @@ -20,8 +20,8 @@ public interface WaterFeeMapper extends BaseMapperX { default PageResult selectPage(WaterFeePageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(WaterFeeDO::getFeeMonth, reqVO.getFeeMonth()) - .eqIfPresent(WaterFeeDO::getMeterCode, reqVO.getMeterCode()) - .eqIfPresent(WaterFeeDO::getMeterAddress, reqVO.getMeterAddress()) + .likeIfPresent(WaterFeeDO::getMeterCode, reqVO.getMeterCode()) + .likeIfPresent(WaterFeeDO::getMeterAddress, reqVO.getMeterAddress()) .eqIfPresent(WaterFeeDO::getMeterDoorplate, reqVO.getMeterDoorplate()) .eqIfPresent(WaterFeeDO::getWaterUsage, reqVO.getWaterUsage()) .eqIfPresent(WaterFeeDO::getTotalFee, reqVO.getTotalFee()) diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/redis/IntegralLockCoreRedisDAO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/redis/IntegralLockCoreRedisDAO.java new file mode 100644 index 0000000..db50caa --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/redis/IntegralLockCoreRedisDAO.java @@ -0,0 +1,75 @@ +package com.zteits.urbanops.module.garden.dal.redis; + +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; + +import java.util.concurrent.TimeUnit; + +/** + * 积分操作分布式锁通用工具类 + */ +@Slf4j +@Component +public class IntegralLockCoreRedisDAO { + + // 积分操作锁前缀 + private static final String INTEGRAL_LOCK_PREFIX = "integral:operate:%s:%s"; + // 锁持有超时时间(30秒) + public static final long INTEGRAL_LOCK_TIMEOUT_MILLIS = 30 * 1000L; + + @Resource + private RedissonClient redissonClient; + + /** + * 加锁执行积分操作逻辑 + * @param unitId 单位ID + * @param statDate 统计日期 + * @param timeoutMillis 锁持有超时时间 + * @param runnable 要执行的核心业务逻辑 + */ + public void lock(String unitId, String statDate, Long timeoutMillis, Runnable runnable) { + // 空值校验 + Assert.hasText(unitId, "单位ID不能为空"); + Assert.hasText(statDate, "统计日期不能为空"); + Assert.notNull(timeoutMillis, "锁超时时间不能为空"); + Assert.notNull(runnable, "执行逻辑不能为空"); + + // 构建细粒度锁Key + String lockKey = String.format(INTEGRAL_LOCK_PREFIX, unitId, statDate); + RLock lock = redissonClient.getLock(lockKey); + boolean lockAcquired = false; + + try { + // 非阻塞获取锁:3秒等待超时,timeoutMillis自动过期 + lockAcquired = lock.tryLock(3, timeoutMillis, TimeUnit.MILLISECONDS); + if (!lockAcquired) { + String errorMsg = String.format("获取积分操作锁失败,单位ID:%s,统计日期:%s", unitId, statDate); + log.error(errorMsg); + throw new RuntimeException(errorMsg); + } + log.info("成功获取积分操作锁,锁Key:{}", lockKey); + + // 执行核心业务逻辑 + runnable.run(); + + } catch (InterruptedException e) { + log.error("获取积分操作锁被中断,单位ID:{},统计日期:{}", unitId, statDate, e); + Thread.currentThread().interrupt(); + throw new RuntimeException("积分操作锁获取被中断,请重试", e); + } finally { + // 安全释放锁 + if (lockAcquired && lock.isHeldByCurrentThread()) { + try { + lock.unlock(); + log.info("成功释放积分操作锁,锁Key:{}", lockKey); + } catch (Exception e) { + log.error("释放积分操作锁异常,锁Key:{}", lockKey, e); + } + } + } + } +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/AssignTasksConstants.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/AssignTasksConstants.java index cc798f5..00ff17e 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/AssignTasksConstants.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/AssignTasksConstants.java @@ -29,6 +29,13 @@ public class AssignTasksConstants { /* 催办短信场景配置*/ public static final int ASSIGN_TASK_SCENE = 6; + /* 催办短信场景配置--测试环境*/ + public static final int ASSIGN_TASK_SCENE_TEST = 8; + /* 到期短信场景配置*/ + public static final int ASSIGN_TASK_REMIND_ADVANCE_SCENE = 7; + //截至日期3小时 -发短信使用 + public static final String REMIND_ADVANCE_HOURS = "3"; + /*办理人角色*/ public static final String ASSIGN_ROLE_KEY = "zgs_leader"; /** diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CommonConstants.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CommonConstants.java index 7f8b04b..0bf87a0 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CommonConstants.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CommonConstants.java @@ -14,4 +14,16 @@ public interface CommonConstants { public static final String QUERY_TYPE_SOURCE_ID = "source_id"; + /*单位*/ + public static final String UNIT_INTEGRAL_UNIT_TYPE_01 = "01"; + + /*班组*/ + public static final String UNIT_INTEGRAL_UNIT_TYPE_02 = "02"; + + /*个人*/ + public static final String UNIT_INTEGRAL_UNIT_TYPE_03 = "03"; + + + /*积分来源 01:任务反馈*/ + public static final String UNIT_INTEGRAL_SOURCE_TYPE_01 = "01"; } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/TemplateEnum.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/TemplateEnum.java index d11a53e..063eaa6 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/TemplateEnum.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/TemplateEnum.java @@ -60,6 +60,20 @@ public enum TemplateEnum { 2, RentalMechanicalCostImport.class, true // 新增默认值 + ), + MATERIAL_INVENTORY_IN( + "materialInventory_in", + "物料入库模板.xlsx", + 1, + MaterialInventoryInImport.class, + true // 新增默认值 + ), + MATERIAL_INVENTORY_OUT( + "materialInventory_out", + "物料出库模板.xlsx", + 1, + MaterialInventoryOutImport.class, + true // 新增默认值 ); // 模板编码(前端传递的标识) diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/framework/datapermission/config/TreeDataPermissionConfiguration.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/framework/datapermission/config/TreeDataPermissionConfiguration.java index 055a73e..135f7a3 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/framework/datapermission/config/TreeDataPermissionConfiguration.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/framework/datapermission/config/TreeDataPermissionConfiguration.java @@ -17,8 +17,10 @@ public class TreeDataPermissionConfiguration { return rule -> { // 为garden_tree表配置基于部门的数据权限 rule.addDeptColumn("garden_tree", "dept_id"); + rule.addDeptColumn("garden_road", "dept_id"); rule.addDeptColumn("garden_oldtrees", "dept_id"); + rule.addDeptColumn("garden_emergency_task", "dept_id"); }; } -} \ No newline at end of file +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/job/task/ExpireRemindJob.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/job/task/ExpireRemindJob.java new file mode 100644 index 0000000..52f4560 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/job/task/ExpireRemindJob.java @@ -0,0 +1,163 @@ +package com.zteits.urbanops.module.garden.job.task; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.zteits.urbanops.module.garden.dal.dataobject.assigntasksinfo.AssignTasksInfoDO; +import com.zteits.urbanops.module.garden.enums.AssignTasksConstants; +import com.zteits.urbanops.module.garden.service.assigntasksinfo.AssignTasksInfoService; +import com.zteits.urbanops.module.garden.service.assigntasksinfo.QuartzRemindService; +import com.zteits.urbanops.module.garden.util.LocalIpUtils; +import com.zteits.urbanops.module.system.api.sms.SmsCodeApi; +import com.zteits.urbanops.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; +import jakarta.annotation.Resource; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.quartz.SchedulerException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @Classname ExpireRemindJob + * @Description 任务到期提醒Job(Quartz一次性触发) + * @Date 2026/3/9 19:27 + * @Created by wangqian + */ +@Service +public class ExpireRemindJob implements Job { + private static final Logger log = LoggerFactory.getLogger(ExpireRemindJob.class); + + @Resource + private AssignTasksInfoService assignTasksInfoService; + @Resource + private QuartzRemindService quartzRemindService; + + @Resource + private SmsCodeApi smsCodeApi; + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException { + // 1. 从JobDataMap获取任务ID,增加空值校验和日志上下文 + Long taskId = (Long) context.getMergedJobDataMap().get("taskId"); + if (taskId == null) { + log.error("【到期提醒Job】执行失败:任务ID为空"); + return; + } + log.info("【到期提醒Job】开始执行,任务ID:{}", taskId); + + // 2. 统一封装任务移除逻辑,避免重复代码 + try { + // 2.1 查询任务信息,增加空指针和业务状态校验 + AssignTasksInfoDO task = assignTasksInfoService.getAssignTasksInfo(taskId); + if (task == null) { + log.warn("【到期提醒Job】任务不存在,任务ID:{},执行移除触发器", taskId); + removeRemindJobSafely(taskId); + return; + } + + // 2.2 任务已完成(finish=1),无需提醒,直接移除触发器 + if (1 == task.getFinish()) { + log.info("【到期提醒Job】任务已完成,无需提醒,任务ID:{},执行移除触发器", taskId); + removeRemindJobSafely(taskId); + return; + } + // 2.3 新增判断:到期时间距离当前时间小于3小时,无需提醒 +// LocalDateTime deadline = task.getDeadline(); +// LocalDateTime now = LocalDateTime.now(); +// // 计算当前时间到到期时间的时长(单位:小时) +// long hoursUntilDeadline = java.time.Duration.between(now, deadline).toHours(); +// // 核心判断:到期前不足3天时(包括已过期),不提醒 +// if (hoursUntilDeadline < 3) { +// log.info("【到期提醒Job】任务到期前不足3小时,无需提醒,任务ID:{},到期时间:{},当前时间:{}", +// taskId, deadline, now); +// removeRemindJobSafely(taskId); +// return; +// } + + // 3. 核心提醒逻辑(示例:短信/站内信/邮件) + executeRemindLogic(task); + + // 4. 提醒成功后,更新任务状态+移除触发器(核心优化:成功也移除) + updateTaskRemindStatus(taskId); + removeRemindJobSafely(taskId); + log.info("【到期提醒Job】执行成功,任务ID:{}", taskId); + + } catch (Exception e) { + // 5. 全局异常捕获,保证Job不中断,记录详细日志+尝试移除触发器 + log.error("【到期提醒Job】执行异常,任务ID:{}", taskId, e); + removeRemindJobSafely(taskId); + // 可选:抛出异常让Quartz标记Job执行失败(根据业务需求决定) + // throw new JobExecutionException("到期提醒任务执行失败", e, false); + } + } + + /** + * 执行具体的提醒逻辑(解耦核心业务,便于维护) + * @param task 任务信息 + */ + private void executeRemindLogic(AssignTasksInfoDO task) { + String taskName = task.getTaskName(); + LocalDateTime deadline = task.getDeadline(); + String remindContent = String.format("您有【%s】上报任务,距离截止时间【%s】小时,请及时处理。", taskName, AssignTasksConstants.REMIND_ADVANCE_HOURS); + + List matchUserList = assignTasksInfoService.getUsersByCompanyId(task.getCompanyId()); + Map templateParams = new HashMap(); + templateParams.put("taskName", task.getTaskName()); + templateParams.put("hours", AssignTasksConstants.REMIND_ADVANCE_HOURS); + // 5. 发送短信通知 + log.info("【到期提醒逻辑】发送短信 signMap: {}", JSONObject.toJSONString(templateParams)); + for (AdminUserRespDTO adminUserRespDTO : matchUserList) { + String phonenumber = adminUserRespDTO.getMobile(); + if (StringUtils.isEmpty(phonenumber)) { + continue; + } + SmsCodeSendReqDTO reqDTO = new SmsCodeSendReqDTO(); + reqDTO.setScene(AssignTasksConstants.ASSIGN_TASK_REMIND_ADVANCE_SCENE); + reqDTO.setMobile(phonenumber);//手机号 + reqDTO.setTemplateParams(templateParams);//短信参数 + reqDTO.setCreateIp(LocalIpUtils.getLocalIp()); + smsCodeApi.openSendSmsCode(reqDTO); + log.info("提交单位任务成功,已通知填报人:手机号:{},任务ID={}", phonenumber, task.getId()); + } + log.info("【到期提醒逻辑】执行提醒,任务名称:{},到期时间:{},提醒内容:{}", taskName, deadline, remindContent); + } + + /** + * 更新任务提醒状态(解耦状态更新逻辑,便于扩展) + * @param taskId 任务ID + */ + private void updateTaskRemindStatus(Long taskId) { + try { + // 实际业务:更新数据库中任务的提醒状态(如remind_status=1 表示已提醒) + assignTasksInfoService.updateRemindStatus(taskId, 1); + log.debug("【到期提醒Job】更新任务提醒状态成功,任务ID:{}", taskId); + } catch (Exception e) { + // 状态更新失败单独捕获,不影响触发器移除 + log.error("【到期提醒Job】更新任务提醒状态失败,任务ID:{}", taskId, e); + } + } + + /** + * 安全移除提醒任务(封装移除逻辑,避免重复try-catch,保证移除操作不抛异常) + * @param taskId 任务ID + */ + private void removeRemindJobSafely(Long taskId) { + if (taskId == null) { + return; + } + try { + quartzRemindService.removeRemindJob(taskId); + log.debug("【到期提醒Job】移除触发器成功,任务ID:{}", taskId); + } catch (SchedulerException e) { + // 移除失败仅记录日志,不中断主流程 + log.error("【到期提醒Job】移除触发器失败,任务ID:{}", taskId, e); + } + } +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/job/task/ResetYearUnitIntegralJob.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/job/task/ResetYearUnitIntegralJob.java new file mode 100644 index 0000000..740c8eb --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/job/task/ResetYearUnitIntegralJob.java @@ -0,0 +1,31 @@ +package com.zteits.urbanops.module.garden.job.task; + +import com.zteits.urbanops.framework.quartz.core.handler.JobHandler; +import com.zteits.urbanops.module.garden.service.unitintegraltotal.UnitIntegralService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +/** + * @Classname ResetYearPointJob + * @Description 年底积分清零 + * @Date 2026/3/11 17:04 + * @Created by wangqian + */ +@Component +@Slf4j +public class ResetYearUnitIntegralJob implements JobHandler { + + @Resource + private UnitIntegralService unitIntegralService; + + @Override + public String execute(String param) throws Exception { + log.info("【年底积分清零】开始执行" + LocalDateTime.now()); + unitIntegralService.resetUnitIntegralTotal(); + log.info("【年底积分清零】开始结束" + LocalDateTime.now()); + return "Successfully"; + } +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasks/AssignTasksServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasks/AssignTasksServiceImpl.java index d28d970..5e40b16 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasks/AssignTasksServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasks/AssignTasksServiceImpl.java @@ -3,6 +3,7 @@ package com.zteits.urbanops.module.garden.service.assigntasks; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.util.date.DateUtils; import com.zteits.urbanops.framework.common.util.object.BeanUtils; import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; import com.zteits.urbanops.module.bpm.api.task.BpmProcessInstanceApi; @@ -15,20 +16,20 @@ import com.zteits.urbanops.module.garden.dal.mysql.assigntasks.AssignTasksMapper import com.zteits.urbanops.module.garden.dal.mysql.assigntasksinfo.AssignTasksInfoMapper; import com.zteits.urbanops.module.garden.enums.AssignTasksConstants; import com.zteits.urbanops.module.garden.service.assigntasksinfo.AssignTasksInfoService; +import com.zteits.urbanops.module.garden.service.assigntasksinfo.QuartzRemindService; +import com.zteits.urbanops.module.garden.service.unitintegraltotal.UnitIntegralService; import com.zteits.urbanops.module.system.api.permission.RoleApi; import com.zteits.urbanops.module.system.api.user.AdminUserApi; -import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.quartz.SchedulerException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.validation.annotation.Validated; import java.time.LocalDateTime; -import java.time.ZoneId; import java.util.*; -import java.util.function.Function; import java.util.stream.Collectors; import static com.zteits.urbanops.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; @@ -68,10 +69,27 @@ public class AssignTasksServiceImpl implements AssignTasksService { @Resource private BpmProcessInstanceApi processInstanceApi; + @Resource + private UnitIntegralService unitIntegralService; + @Resource + private QuartzRemindService quartzRemindService; @Transactional(rollbackFor = Exception.class) @Override public Long createAssignTasks(AssignTasksSaveReqVO createReqVO) { + // 核心校验逻辑 + Date deadline = createReqVO.getDeadline(); + // 1. 先校验deadline是否为空(避免空指针) + if (deadline == null) { + throw exception0(BAD_REQUEST.getCode(), "到期日不能为空"); + } + // 2. 获取当前时间(绑定业务时区,避免时区偏差) + Date now = new Date(); + // 3. 核心判断:到期日 小于 当前时间 → 抛出异常 + if (deadline.before(now)) { + throw exception0(BAD_REQUEST.getCode(), "到期日不能小于当前日期"); + } + // // 插入 AssignTasksDO assignTasks = BeanUtils.toBean(createReqVO, AssignTasksDO.class); assignTasksMapper.insert(assignTasks); @@ -112,8 +130,21 @@ public class AssignTasksServiceImpl implements AssignTasksService { //修改派单信息 taskInfo.setTaskName(updateReqVO.getTaskName()); taskInfo.setTaskType(updateReqVO.getTaskType()); - taskInfo.setDeadline(updateReqVO.getDeadline().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); + // 核心转换逻辑 + Date deadlineDate = updateReqVO.getDeadline(); + // 空值判断 + Date转LocalDateTime(绑定东八区,避免时区偏差) + LocalDateTime deadlineLdt = deadlineDate != null + ? deadlineDate.toInstant().atZone(DateUtils.DEFAULT_ZONE).toLocalDateTime() + : null; + taskInfo.setDeadline(deadlineLdt); assignTasksInfoMapper.updateById(taskInfo); + try { + //删除定时提醒 + quartzRemindService.removeRemindJob(taskInfo.getId()); + assignTasksInfoService.createRemindJob(taskInfo.getDeadline(), taskInfo.getId()); + } catch (SchedulerException exception) { + throw exception0(BAD_REQUEST.getCode(),"创建到期定时提醒异常"); + } } } } @@ -204,45 +235,33 @@ public class AssignTasksServiceImpl implements AssignTasksService { // 1. 初始化统计变量:记录更新成功的超时记录数 int updatedCount = 0; LocalDateTime now = LocalDateTime.now(); // 提前获取当前时间(同一批处理时间一致) - log.info("开始处理超时派单,当前时间:{}", now); - + String batchId = String.valueOf(System.currentTimeMillis()); // 批次ID,便于日志追踪 + log.info("[派单超时处理-{}] 开始处理超时派单,当前时间:{}", batchId, now); try { - // 2. 查询所有“未完成的派单”(parentFinish=0) - List assignTasks = assignTasksMapper.selectList(AssignTasksDO::getParentFinish,0); - - if (CollectionUtils.isEmpty(assignTasks)) { - log.info("无未完成的派单,无需处理"); + List timeoutTaskInfos = new ArrayList<>(); + List taskInfoList = assiAssignTasksInfoMapper.selectOutTimeAssignTaskInfo(); + if (CollectionUtils.isEmpty(taskInfoList)) { + log.info("[派单超时处理-{}] 无超时派单,无需处理", batchId); return 0; } - - List timeoutTaskInfos = new ArrayList<>(); - - for (AssignTasksDO assignTasksDO : assignTasks) { - //查询所有符合条件的派单详情(taskId in 列表 + finish=0) - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); - queryWrapper.eq(AssignTasksInfoDO::getFinish, 0); - queryWrapper.eq(AssignTasksInfoDO::getTaskId, assignTasksDO.getId()); - queryWrapper.eq(AssignTasksInfoDO::getIsOverdue, 0); - List taskInfoList = assiAssignTasksInfoMapper.selectList(queryWrapper); - if (CollectionUtils.isEmpty(taskInfoList)) { - log.info("未找到未完成的派单详情,无需处理"); - continue; - } - - // 4. 筛选“已超时”的派单详情(截止时间 < 当前时间) - for (AssignTasksInfoDO taskInfo : taskInfoList) { - // 4.1 转换:将数据库的Date - LocalDateTime deadline = assignTasks.get(0).getDeadline(); - // 4.2 比较:截止时间早于当前时间 → 超时 - if (deadline.isBefore(now)) { - taskInfo.setIsOverdue(1); // 标记为超时 - timeoutTaskInfos.add(taskInfo); - } + // 4. 筛选“已超时”的派单详情(截止时间 < 当前时间) + for (AssignTasksInfoDO taskInfo : taskInfoList) { + Long detailId = taskInfo.getId(); + LocalDateTime deadline = taskInfo.getDeadline(); + String deadlineStr = deadline.format(DateUtils.DATE_TIME_FORMATTER); + String nowStr = now.format(DateUtils.DATE_TIME_FORMATTER); + boolean isOverdue = deadline.isBefore(now); + log.info("[派单超时处理-{}] 派单详情ID:{} 时间对比 - 截止时间(deadline):{},当前时间(now):{},是否超时:{}", + batchId, detailId, deadlineStr, nowStr, isOverdue); + if (isOverdue) { + taskInfo.setIsOverdue(1); // 标记为超时 + timeoutTaskInfos.add(taskInfo); + log.debug("[派单超时处理-{}] 派单详情ID:{} 已超时(截止时间:{})", + batchId, taskInfo.getId(), deadline); } } - if (CollectionUtils.isEmpty(timeoutTaskInfos)) { - log.info("无超时的派单详情,无需更新"); + log.info("[派单超时处理-{}] 无超时的派单详情,无需更新", batchId); return 0; } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoService.java index 616f11b..79408bb 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoService.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoService.java @@ -6,8 +6,10 @@ import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.Ass import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoUpdReqVO; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasks.AssignTasksDO; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasksinfo.AssignTasksInfoDO; +import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; import jakarta.validation.Valid; +import java.time.LocalDateTime; import java.util.List; /** @@ -102,4 +104,28 @@ public interface AssignTasksInfoService { * @Return int */ public int feedbackAssignTaskCompany(@Valid AssignTasksInfoUpdReqVO tdAssignTaskCompany); + + /** + * @Author wangqian + * @Description 根据单位获取单位管理员 + * @Date 2026/3/9 20:45 + * @Param companyId + */ + List getUsersByCompanyId(Long companyId); + /** + * @Author wangqian + * @Description 创建到期提醒定时器 + * @Date 2026/3/12 20:51 + * @Param deadline + * @param id + * @Return void + */ + public void createRemindJob(LocalDateTime deadline, Long id); + + /** + * @Author wangqian + * @Description 更新发送标识 + * @Return void + */ + public void updateRemindStatus(Long taskId,int remindStatue); } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java index d1cd72f..4905dbc 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java @@ -3,15 +3,20 @@ package com.zteits.urbanops.module.garden.service.assigntasksinfo; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.util.date.DateUtils; import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import com.zteits.urbanops.framework.security.core.LoginUser; import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoPageReqVO; import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoSaveReqVO; import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoUpdReqVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.UnitIntegralSaveReqVO; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasks.AssignTasksDO; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasksinfo.AssignTasksInfoDO; import com.zteits.urbanops.module.garden.dal.mysql.assigntasks.AssignTasksMapper; import com.zteits.urbanops.module.garden.dal.mysql.assigntasksinfo.AssignTasksInfoMapper; import com.zteits.urbanops.module.garden.enums.AssignTasksConstants; +import com.zteits.urbanops.module.garden.enums.CommonConstants; +import com.zteits.urbanops.module.garden.service.unitintegraltotal.UnitIntegralService; import com.zteits.urbanops.module.system.api.dept.DeptApi; import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; import com.zteits.urbanops.module.system.api.permission.RoleApi; @@ -19,16 +24,19 @@ import com.zteits.urbanops.module.system.api.sms.SmsCodeApi; import com.zteits.urbanops.module.system.api.sms.dto.code.SmsCodeSendReqDTO; import com.zteits.urbanops.module.system.api.user.AdminUserApi; import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; -import com.zteits.urbanops.module.system.dal.dataobject.permission.RoleDO; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; @@ -65,12 +73,22 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { @Resource private SmsCodeApi smsCodeApi; - // 时间格式常量(与之前保持一致) - public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss"; + @Resource + private UnitIntegralService unitIntegralService; + + @Resource + private QuartzRemindService quartzRemindService; + // 定义固定时区(推荐东八区,避免服务器时区影响) + + // 提前提醒(3小时) + private static final long REMIND_ADVANCE_HOURS = 3L; + + @Value("${spring.profiles.active}") + private String profilesServer; // 1. 定义线程安全的格式化器(全局复用,无需重复创建) private static final DateTimeFormatter DEADLINE_FORMATTER = DateTimeFormatter - .ofPattern(FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + .ofPattern(DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) .withZone(ZoneId.of("GMT+8")); // 时区与之前配置一致,避免偏移 @Override public Long createAssignTasksInfo(AssignTasksInfoSaveReqVO createReqVO) { @@ -115,7 +133,8 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { public AssignTasksInfoDO getAssignTasksInfo(Long id) { AssignTasksInfoDO assignTasksInfoDO = assignTasksInfoMapper.selectById(id); //分公司管理员查看,变为已读 - if (assignTasksInfoDO != null) { + LoginUser loginUser = getLoginUser(); + if (assignTasksInfoDO != null && loginUser != null) { Integer newFlag = assignTasksInfoDO.getNewFlag(); if (newFlag != null && newFlag == 0) { //更新为已读 @@ -156,10 +175,58 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { assignTaskInfo.setTaskType(assignTasks.getTaskType()); assignTaskInfo.setDeadline(assignTasks.getDeadline()); assignTasksInfoMapper.insert(assignTaskInfo); + // add by 20260307 初始化单位积分 + unitIntegralService.createUnitIntegral(CommonConstants.UNIT_INTEGRAL_UNIT_TYPE_01, String.valueOf(companyId), assignTaskInfo.getCompanyName()); + //注册到期提醒定时器 + createRemindJob(assignTaskInfo.getDeadline(), assignTaskInfo.getId()); } } } + public void createRemindJob(LocalDateTime deadline, Long id){ + + // 2. 计算:当前时间 + 3小时 是否超过截止时间(即截止时间不足3小时) + LocalDateTime now = LocalDateTime.now(DateUtils.DEFAULT_ZONE); // 当前东八区时间 + LocalDateTime remindThreshold = now.plusHours(REMIND_ADVANCE_HOURS); + + //核心判断:截止时间 <= (当前时间+3小时),不创建定时任务 + if (deadline.isBefore(remindThreshold)) { + String formattedDeadline = deadline.format(DateUtils.DATE_FORMATTER); + String formattedThreshold = remindThreshold.format(DateUtils.DATE_FORMATTER); + log.info("任务ID={} 无需创建定时任务:截止时间={},不足{}小时(阈值时间={})", + id, formattedDeadline, REMIND_ADVANCE_HOURS, formattedThreshold); + return; // 直接返回,不创建定时任务 + } + + // 3. 安全转换LocalDateTime到Date(指定东八区,避免时区问题) + Date triggerDate = Date.from( + deadline.atZone(DateUtils.DEFAULT_ZONE) // 绑定东八区(业务时区) + .toInstant() // 转为Instant + ); + + // 4. 规范日志输出(使用占位符,格式化时间) + String formattedDeadline = deadline.format(DateUtils.DATE_FORMATTER); + log.info("创建定时任务:任务ID={}, 截止时间(LocalDateTime)={}, 转换后Date时间={}", + id, + formattedDeadline, + triggerDate); + + // 5. 注册定时任务 + try { + quartzRemindService.registerRemindJob(id, triggerDate); + } catch (SchedulerException e) { + throw exception0(BAD_REQUEST.getCode(),"创建到期定时提醒异常"); + } + } + + @Override + public void updateRemindStatus(Long taskId, int remindStatue) { + AssignTasksInfoDO assignTasksInfoDO = new AssignTasksInfoDO(); + assignTasksInfoDO.setId(taskId); + assignTasksInfoDO.setRemindStatue(remindStatue); + assignTasksInfoMapper.updateById(assignTasksInfoDO); + } + @Override public List getAssignTasksInfos(Long taskId) { if (taskId == null) { @@ -170,6 +237,7 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { //派单驳回 @Override + @Transactional public int rejectAssignTaskCompany(AssignTasksInfoUpdReqVO tdAssignTaskCompany) { AssignTasksInfoDO assignTaskInfo = assignTasksInfoMapper.selectById(tdAssignTaskCompany.getId()); //单位任务完成状态(0:未完成,1:已完成) @@ -181,6 +249,19 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { updateAssignTaskInfo.setIsReject(AssignTasksConstants.ASSIGN_TASK_REJECT_1); updateAssignTaskInfo.setRejectRemark(tdAssignTaskCompany.getRejectRemark()); updateAssignTaskInfo.setNewFlag(AssignTasksConstants.ASSIGN_TASK_NEWFLAG_0); + + //add bt 20260307 驳回积分扣减 + UnitIntegralSaveReqVO updateReqVO = new UnitIntegralSaveReqVO(); + updateReqVO.setUnitType(CommonConstants.UNIT_INTEGRAL_UNIT_TYPE_01); + updateReqVO.setUnitId(String.valueOf(assignTaskInfo.getCompanyId())); + updateReqVO.setUnitName(assignTaskInfo.getCompanyName()); + updateReqVO.setSourceType(CommonConstants.UNIT_INTEGRAL_SOURCE_TYPE_01); + updateReqVO.setRelatedTaskId(assignTaskInfo.getId()); + updateReqVO.setRelatedTaskName(assignTaskInfo.getTaskName()); + updateReqVO.setTotalIntegral(getUnitCurIngeral(assignTaskInfo.getDeadline())); + updateReqVO.setReason("任务上报驳回积分扣减"); + unitIntegralService.subUnitIntegral(updateReqVO); + return assignTasksInfoMapper.updateById(updateAssignTaskInfo); } else { throw exception(ASSIGN_TASKS_INFO_TASKID_REJECT); @@ -241,7 +322,11 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { continue; } SmsCodeSendReqDTO reqDTO = new SmsCodeSendReqDTO(); - reqDTO.setScene(AssignTasksConstants.ASSIGN_TASK_SCENE); + if ("prod".equals(profilesServer)) { + reqDTO.setScene(AssignTasksConstants.ASSIGN_TASK_SCENE); + } else { + reqDTO.setScene(AssignTasksConstants.ASSIGN_TASK_SCENE_TEST); + } reqDTO.setMobile(phonenumber);//手机号 reqDTO.setTemplateParams(templateParams);//短信参数 reqDTO.setCreateIp(getClientIP()); @@ -266,6 +351,7 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { } @Override + @Transactional public int feedbackAssignTaskCompany(AssignTasksInfoUpdReqVO tdAssignTaskCompany) { AssignTasksInfoDO assignTaskInfo = assignTasksInfoMapper.selectById(tdAssignTaskCompany.getId()); if (assignTaskInfo != null) { @@ -280,9 +366,89 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { updateAssignTaskInfo.setWritePersonId(String.valueOf(user.getId())); updateAssignTaskInfo.setWritePerson(getLoginUserNickname()); updateAssignTaskInfo.setWritePersonPhone(user.getMobile()); + + // add 增加单位积分 + UnitIntegralSaveReqVO updateReqVO = new UnitIntegralSaveReqVO(); + updateReqVO.setUnitType(CommonConstants.UNIT_INTEGRAL_UNIT_TYPE_01); + updateReqVO.setUnitId(String.valueOf(assignTaskInfo.getCompanyId())); + updateReqVO.setUnitName(assignTaskInfo.getCompanyName()); + updateReqVO.setSourceType(CommonConstants.UNIT_INTEGRAL_SOURCE_TYPE_01); + updateReqVO.setRelatedTaskId(assignTaskInfo.getId()); + updateReqVO.setRelatedTaskName(assignTaskInfo.getTaskName()); + + updateReqVO.setTotalIntegral(getUnitCurIngeral(assignTaskInfo.getDeadline())); + if (1 == updateReqVO.getTotalIntegral()) { + updateReqVO.setReason("超时任务上报"); + } + updateReqVO.setReason("任务上报"); + unitIntegralService.addUnitIntegral(updateReqVO); + return assignTasksInfoMapper.updateById(updateAssignTaskInfo); } else { throw exception(ASSIGN_TASKS_INFO_NOT_EXISTS); } } + + @Override + public List getUsersByCompanyId(Long companyId) { + //用户角色 + List userIds = roleApi.getUserIdsByRoleCode(AssignTasksConstants.ASSIGN_ROLE_KEY); + if (CollectionUtils.isEmpty(userIds)) { + //未配置 + throw exception0(BAD_REQUEST.getCode(),"未配置子公司管理员角色"); + } + //填报人信息 + List users = adminUserApi.getUserList(userIds); + if(CollectionUtils.isEmpty(users)) { + //没有权限 + throw exception0(BAD_REQUEST.getCode(),"未配置分公司管理员"); + } + + // 收集所有匹配companyId的用户,无匹配则返回空集合(而非null) + List matchUserList = users.stream() + .filter(user -> { + // 防御性判空:过滤掉null用户或deptId为空的用户 + if (user == null || user.getDeptId() == null) { + return false; + } + // 过滤停用 + if (1 == user.getStatus()) { + return false; + } + // 安全比较companyId和deptId(兼容null) + return Objects.equals(companyId, user.getDeptId()); + }) + .collect(Collectors.toList()); + return matchUserList; + } + + /** + * @Author wangqian + * @Description 获取单位当前积分 + * 1、已填报&未超期 展示3分 + * + * 2、已填报&超期 展示1分 + * + * 3、未填报 展示0分 + * @Date 2026/3/8 13:23 + * @Param + * @Return java.lang.Integer + */ + private Integer getUnitCurIngeral(LocalDateTime deadline){ + if (deadline == null) { + throw exception0(BAD_REQUEST.getCode(), "截止时间为null"); + } + LocalDateTime now = LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS); + boolean isOverdue = deadline.isBefore(now); + log.info("截止时间:{},当前时间:{},超期判定:{},返回积分:{}", + deadline, now, isOverdue, isOverdue ? 1 : 3); + return isOverdue ? 1 : 3; + } + // 测试方法(验证逻辑正确性) + public static void main(String[] args) { + AssignTasksInfoServiceImpl uitl = new AssignTasksInfoServiceImpl(); + // 测试1:未超期(截止时间为1小时后) + LocalDateTime notOverdue = LocalDateTime.now().plusHours(1); + System.out.println(uitl.getUnitCurIngeral(notOverdue)); // 输出3 + } } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/QuartzRemindService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/QuartzRemindService.java new file mode 100644 index 0000000..6bb168a --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/QuartzRemindService.java @@ -0,0 +1,93 @@ +package com.zteits.urbanops.module.garden.service.assigntasksinfo; + +import com.zteits.urbanops.module.garden.job.task.ExpireRemindJob; +import lombok.extern.slf4j.Slf4j; +import org.quartz.*; +import org.quartz.impl.matchers.GroupMatcher; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Set; + + +/** + * 动态注册到期提醒Quartz任务的服务 + */ +@Service +@Slf4j +public class QuartzRemindService { + // 任务组名(自定义,便于管理) + private static final String REMIND_JOB_GROUP = "EXPIRE_REMIND_GROUP"; + + @Autowired + private Scheduler scheduler; + + /** + * 动态注册“到期前3小时提醒”任务 + * + * @param jobId 待提醒的任务信息 + * @throws SchedulerException 调度器异常 + */ + public void registerRemindJob(Long jobId, Date expireTime) throws SchedulerException { + // 1. 校验参数 + if (jobId == null || expireTime == null) { + throw new IllegalArgumentException("任务信息不完整,无法注册提醒"); + } + + // 2. 计算触发时间:到期时间 - 3小时 + long expireTimeStamp = expireTime.getTime(); + long triggerTimeStamp = expireTimeStamp - 3 * 60 * 60 * 1000L; // 3小时毫秒数 + Date triggerTime = new Date(triggerTimeStamp); + // 3. 定义JobKey(唯一标识:任务ID + 组名) + JobKey jobKey = new JobKey("REMIND_JOB_" + jobId, REMIND_JOB_GROUP); + + // 4. 检查任务是否已存在,存在则先删除 + if (scheduler.checkExists(jobKey)) { + scheduler.deleteJob(jobKey); + } + + // 5. 构建JobDetail(绑定自定义的ExpireRemindJob) + JobDetail jobDetail = JobBuilder.newJob(ExpireRemindJob.class).withIdentity(jobKey) + // 传递参数(任务ID)到Job中 + .usingJobData("taskId", jobId).storeDurably(false).build(); + + // 6. 构建Trigger(一次性触发,触发时间为计算的“到期前3小时”) + Trigger trigger = TriggerBuilder.newTrigger() + .withIdentity("REMIND_TRIGGER_" + jobId, REMIND_JOB_GROUP) + .startAt(triggerTime) + // 只触发一次(到期提醒只需一次) + .withSchedule(SimpleScheduleBuilder.simpleSchedule().withMisfireHandlingInstructionFireNow()).build(); + + // 7. 注册任务到调度器 + scheduler.scheduleJob(jobDetail, trigger); + SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + log.info("【动态注册到期提醒任务成功】任务ID:{},触发时间:{}", jobId, sf.format(triggerTime)); + } + + /** + * 移除指定的提醒任务 + * + * @param taskId 任务ID + * @throws SchedulerException 调度器异常 + */ + public void removeRemindJob(Long taskId) throws SchedulerException { + JobKey jobKey = new JobKey("REMIND_JOB_" + taskId, REMIND_JOB_GROUP); + if (scheduler.checkExists(jobKey)) { + scheduler.deleteJob(jobKey); + log.info("【移除到期提醒任务成功】任务ID:{}", taskId); + } + } + + /** + * 查看所有已注册的提醒任务 + * + * @return 任务Key集合 + * @throws SchedulerException 调度器异常 + */ + public Set listAllRemindJobs() throws SchedulerException { + return scheduler.getJobKeys(GroupMatcher.jobGroupEquals(REMIND_JOB_GROUP)); + } + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeServiceImpl.java index c97235a..d596d95 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeServiceImpl.java @@ -5,12 +5,16 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.zteits.urbanops.module.garden.controller.admin.costfee.CostFeeController; import com.zteits.urbanops.module.garden.controller.admin.costfee.vo.*; import com.zteits.urbanops.module.garden.dal.dataobject.departmentcost.DepartmentCostDO; +import com.zteits.urbanops.module.garden.dal.dataobject.material.MaterialDO; +import com.zteits.urbanops.module.garden.dal.dataobject.materialinventoryin.MaterialInventoryInDO; +import com.zteits.urbanops.module.garden.dal.dataobject.materialinventoryout.MaterialInventoryOutDO; import com.zteits.urbanops.module.garden.dal.dataobject.mechanicalcost.MechanicalCostDO; import com.zteits.urbanops.module.garden.dal.dataobject.personalcost.PersonalCostDO; import com.zteits.urbanops.module.garden.dal.dataobject.rentalmechanicalcost.RentalMechanicalCostDO; import com.zteits.urbanops.module.garden.dal.dataobject.wasterecord.WasteRecordDO; import com.zteits.urbanops.module.garden.dal.dataobject.waterfee.WaterFeeDO; import com.zteits.urbanops.module.garden.dal.mysql.departmentcost.DepartmentCostMapper; +import com.zteits.urbanops.module.garden.dal.mysql.material.MaterialMapper; import com.zteits.urbanops.module.garden.dal.mysql.mechanicalcost.MechanicalCostMapper; import com.zteits.urbanops.module.garden.dal.mysql.personalcost.PersonalCostMapper; import com.zteits.urbanops.module.garden.dal.mysql.rentalmechanicalcost.RentalMechanicalCostMapper; @@ -19,6 +23,9 @@ import com.zteits.urbanops.module.garden.dal.mysql.waterfee.WaterFeeMapper; import com.zteits.urbanops.module.garden.enums.AssignTasksConstants; import com.zteits.urbanops.module.garden.enums.CostFeeConstants; import com.zteits.urbanops.module.garden.enums.TemplateEnum; +import com.zteits.urbanops.module.garden.service.material.MaterialService; +import com.zteits.urbanops.module.garden.service.materialinventoryin.MaterialInventoryInService; +import com.zteits.urbanops.module.garden.service.materialinventoryout.MaterialInventoryOutService; import com.zteits.urbanops.module.system.api.dept.DeptApi; import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; import jakarta.annotation.Resource; @@ -84,6 +91,12 @@ public class CostFeeServiceImpl implements CostFeeService { private RentalMechanicalCostMapper rentalMechanicalCostMapper; @Autowired private WasteRecordMapper wasteRecordMapper; + @Resource + private MaterialMapper materialMapper; + @Resource + private MaterialInventoryInService materialInventoryInService; + @Resource + private MaterialInventoryOutService materialInventoryOutService; @Override @@ -193,6 +206,8 @@ public class CostFeeServiceImpl implements CostFeeService { log.info("数据列表为空,跳过插入操作"); return; } + //总公司 + DeptRespDTO deptRespDTO = deptApi.getDept(getCompanyId()); //单位集合 List companyList = deptApi.getSubDeptList(); // 1. 预加载部门映射(循环外加载,避免重复查询) @@ -207,7 +222,7 @@ public class CostFeeServiceImpl implements CostFeeService { )); - // 模板类型校验 + // 模板类型校验 Class importClass = template.getImportClass(); // 从枚举获取导入类,避免switch // 根据不同模板类型执行不同的处理逻辑 if (WaterFeeImport.class.isAssignableFrom(importClass)) { @@ -226,8 +241,8 @@ public class CostFeeServiceImpl implements CostFeeService { WaterFeeDO fee = new WaterFeeDO(); BeanUtils.copyProperties(importObj, fee); fee.setCompanyId(String.valueOf(getCompanyId())); - if (getCompanyId() == 100) { - fee.setCompanyName("蓟城山水"); + if (deptRespDTO.getParentId() == 0) { + fee.setCompanyName(Objects.toString(deptRespDTO.getName(), "")); } else { // 设置单位id fee.setCompanyName(String.valueOf(companyIdToNamedMap.get(getCompanyId()))); @@ -412,6 +427,73 @@ public class CostFeeServiceImpl implements CostFeeService { } log.info("成功插入 {} 园林废弃物费用数据", dataList.size()); + } else if (MaterialInventoryInImport.class.isAssignableFrom(importClass)) { + List feeList = (List)dataList; + List saveFeeList = new ArrayList<>(CollectionUtils.isEmpty(feeList) ? 0 : feeList.size()); + if (!CollectionUtils.isEmpty(feeList)) { + Map materialMap = getMaterialAllMap(); + for (MaterialInventoryInImport importObj : feeList) { + MaterialInventoryInDO inventoryDO = new MaterialInventoryInDO(); + BeanUtils.copyProperties(importObj, inventoryDO); + //时间 + inventoryDO.setBuyDate(importObj.getBuyDate().atStartOfDay()); + String checkKey = importObj.getMaterialName() + "|" + + importObj.getMaterialTypeName() + "|" + + importObj.getTypeName() + "|" + + importObj.getTypeDetailName() + "|" + + importObj.getSpecifications() + "|" + + importObj.getUnitName(); + MaterialDO materialDO = materialMap.get(checkKey); + if (materialDO != null) { + inventoryDO.setMaterialId(materialDO.getMaterialId()); + inventoryDO.setMaterialTypeId(materialDO.getMaterialTypeId()); + inventoryDO.setTypeId(materialDO.getTypeId()); + inventoryDO.setTypeDetailId(materialDO.getTypeDetailId()); + inventoryDO.setUnitId(materialDO.getUnitId()); + inventoryDO.setBelongCompanyId(nameToCompanyIdMap.get(inventoryDO.getBelongCompanyName())); + } + saveFeeList.add(inventoryDO); + } + } + //入库 + if (!saveFeeList.isEmpty()) { + materialInventoryInService.batchCreateMaterialInventoryIn(saveFeeList); + } + log.info("成功插入 {} 物料入库数据", dataList.size()); + } else if (MaterialInventoryOutImport.class.isAssignableFrom(importClass)) { + + List feeList = (List)dataList; + List saveFeeList = new ArrayList<>(CollectionUtils.isEmpty(feeList) ? 0 : feeList.size()); + if (!CollectionUtils.isEmpty(feeList)) { + Map materialMap = getMaterialAllMap(); + for (MaterialInventoryOutImport importObj : feeList) { + MaterialInventoryOutDO inventoryDO = new MaterialInventoryOutDO(); + BeanUtils.copyProperties(importObj, inventoryDO); + //时间 + inventoryDO.setOutDate(importObj.getOutDate().atStartOfDay()); + String checkKey = importObj.getMaterialName() + "|" + + importObj.getMaterialTypeName() + "|" + + importObj.getTypeName() + "|" + + importObj.getTypeDetailName() + "|" + + importObj.getSpecifications() + "|" + + importObj.getUnitName(); + MaterialDO materialDO = materialMap.get(checkKey); + if (materialDO != null) { + inventoryDO.setMaterialId(materialDO.getMaterialId()); + inventoryDO.setMaterialTypeId(materialDO.getMaterialTypeId()); + inventoryDO.setTypeId(materialDO.getTypeId()); + inventoryDO.setTypeDetailId(materialDO.getTypeDetailId()); + inventoryDO.setUnitId(materialDO.getUnitId()); + inventoryDO.setBelongCompanyId(nameToCompanyIdMap.get(inventoryDO.getBelongCompanyName())); + } + saveFeeList.add(inventoryDO); + } + } + //出库 + if (!saveFeeList.isEmpty()) { + materialInventoryOutService.batchCreateMaterialInventoryOut(saveFeeList); + } + log.info("成功插入 {} 物料出库数据", dataList.size()); } } @@ -532,7 +614,7 @@ public class CostFeeServiceImpl implements CostFeeService { Set> violations = validator.validate(importBean); if (!violations.isEmpty()) { // 收集所有校验错误信息(比如“用水量不能为空”“格式应为两位小数”) - // StringBuilder errorMsg = new StringBuilder(); + // StringBuilder errorMsg = new StringBuilder(); for (ConstraintViolation violation : violations) { //errorMsg.append(violation.getMessage()).append(";"); throw exception0(BAD_REQUEST.getCode() ,String.format( @@ -564,13 +646,13 @@ public class CostFeeServiceImpl implements CostFeeService { // 收集所有校验错误信息(比如“用水量不能为空”“格式应为两位小数”) //StringBuilder errorMsg = new StringBuilder(); for (ConstraintViolation violation : violations) { - // errorMsg.append(violation.getMessage()).append(";"); + // errorMsg.append(violation.getMessage()).append(";"); throw exception0(BAD_REQUEST.getCode() ,String.format( "第[{}]条数据:"+ violation.getMessage() ), rowNum); } // 抛出包含行号和所有错误的异常 - // throw exception0(BAD_REQUEST.getCode(), errorMsg.toString().trim(), violations); + // throw exception0(BAD_REQUEST.getCode(), errorMsg.toString().trim(), violations); } Long companyId = nameToCompanyIdMap.get(importBean.getCompanyName()); //单位校验 @@ -686,9 +768,9 @@ public class CostFeeServiceImpl implements CostFeeService { Set> violations = validator.validate(importBean); if (!violations.isEmpty()) { // 收集所有校验错误信息(比如“用水量不能为空”“格式应为两位小数”) - // StringBuilder errorMsg = new StringBuilder(); + // StringBuilder errorMsg = new StringBuilder(); for (ConstraintViolation violation : violations) { - // errorMsg.append(violation.getMessage()).append(";"); + // errorMsg.append(violation.getMessage()).append(";"); throw exception0(BAD_REQUEST.getCode() ,String.format( "第[{}]条数据:"+violation.getMessage() ), rowNum); @@ -776,9 +858,112 @@ public class CostFeeServiceImpl implements CostFeeService { throw exception0(BAD_REQUEST.getCode(), String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); } } + } else if (MaterialInventoryInImport.class.isAssignableFrom(importClass)) { + //物料入库 + List importList = (List) dataList; + + // 2. 遍历,逐个创建 + for (int i = 0; i < importList.size(); i++) { + int rowNum = i + 1; // 第i条数据 → 第rowNum行(对应Excel导入的行号逻辑) + MaterialInventoryInImport importBean = importList.get(i); + + try { + // 2.1 执行校验(替换原 ValidationUtils,直接用 Validator 校验,确保抛出 ConstraintViolationException) + Set> violations = validator.validate(importBean); + if (!violations.isEmpty()) { + for (ConstraintViolation violation : violations) { + //errorMsg.append(violation.getMessage()).append(";"); + throw exception0(BAD_REQUEST.getCode() ,String.format( + "第[{}]条数据:"+violation.getMessage() + ), rowNum); + } + } + + Long companyId = nameToCompanyIdMap.get(importBean.getBelongCompanyName()); + //单位校验 + validatecompany(rowNum, importBean.getBelongCompanyName(), companyId, belongCompanyId); + } catch (ConstraintViolationException ex) { + // 5. 包装异常,明确行号 + 真实校验错误( + throw exception0(BAD_REQUEST.getCode(), String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); + } + } + // 业务校验,检查物料信息是否正确 + validateMaterialIn(importList); + + } else if (MaterialInventoryOutImport.class.isAssignableFrom(importClass)) { + //物料出库 + List importList = (List) dataList; + // 2. 遍历,逐个创建 + for (int i = 0; i < importList.size(); i++) { + int rowNum = i + 1; // 第i条数据 → 第rowNum行(对应Excel导入的行号逻辑) + MaterialInventoryOutImport importBean = importList.get(i); + + try { + // 2.1 执行校验(替换原 ValidationUtils,直接用 Validator 校验,确保抛出 ConstraintViolationException) + Set> violations = validator.validate(importBean); + if (!violations.isEmpty()) { + for (ConstraintViolation violation : violations) { + //errorMsg.append(violation.getMessage()).append(";"); + throw exception0(BAD_REQUEST.getCode() ,String.format( + "第[{}]条数据:"+violation.getMessage() + ), rowNum); + } + } + + Long companyId = nameToCompanyIdMap.get(importBean.getBelongCompanyName()); + //单位校验 + validatecompany(rowNum, importBean.getBelongCompanyName(), companyId, belongCompanyId); + } catch (ConstraintViolationException ex) { + // 5. 包装异常,明确行号 + 真实校验错误( + throw exception0(BAD_REQUEST.getCode(), String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); + } + } + // 业务校验,检查物料信息是否正确 + validateMaterialOut(importList); } } + private void validateMaterialIn(List importList) { + Set materialSet = getMaterialAllSet(); + for (int i = 0; i < importList.size() ; i++) { + int rowNum = i + 1; + MaterialInventoryInImport importBean = importList.get(i); + String checkKey = importBean.getMaterialName() + "|" + + importBean.getMaterialTypeName() + "|" + + importBean.getTypeName() + "|" + + importBean.getTypeDetailName() + "|" + + importBean.getSpecifications() + "|" + + importBean.getUnitName(); + + if (materialSet.contains(checkKey) == false) { + throw exception0(BAD_REQUEST.getCode(), String.format( + "第%d条数据:导入的物料信息有误", + rowNum + )); + } + } + } + + private void validateMaterialOut(List importList) { + Set materialSet = getMaterialAllSet(); + for (int i = 0; i < importList.size() ; i++) { + int rowNum = i + 1; + MaterialInventoryOutImport importBean = importList.get(i); + String checkKey = importBean.getMaterialName().trim() + "|" + + importBean.getMaterialTypeName().trim() + "|" + + importBean.getTypeName().trim() + "|" + + importBean.getTypeDetailName().trim() + "|" + + importBean.getSpecifications().trim() + "|" + + importBean.getUnitName().trim(); + + if (materialSet.contains(checkKey) == false) { + throw exception0(BAD_REQUEST.getCode(), String.format( + "第%d条数据:%s信息有误", + rowNum, checkKey + )); + } + } + } private void validatecompany(int rowNum, String companyName, Long companyId, Long belongCompanyId){ // 校验数组长度是否一致 if (companyId == null) { @@ -998,4 +1183,52 @@ public class CostFeeServiceImpl implements CostFeeService { return list; } + + /** + * @Author wangqian + * @Description 获取物料详情 + * @Date 2026/1/16 9:22 + */ + private Set getMaterialAllSet() { + List material = materialMapper.selectList(); + Set materialKeySet = material.stream() + // 第一步:将MaterialDO转换为拼接key(处理空值) + .map(CostFeeServiceImpl::buildMaterialKey) + // 第三步:收集为Set(HashSet,自动去重) + .collect(Collectors.toCollection(HashSet::new)); + + return materialKeySet; + } + private Map getMaterialAllMap() { + List material = materialMapper.selectList(); + Map materialMap = material.stream() + // 转换为Map:key=拼接字符串,value=MaterialDO + .collect(Collectors.toMap( + // 第一个参数:生成Map的key(调用抽离的拼接方法) + CostFeeServiceImpl::buildMaterialKey, + // 第二个参数:生成Map的value(直接用当前MaterialDO对象) + m -> m, + // 第三个参数:重复key的合并规则(避免DuplicateKeyException) + // 规则1:保留第一个出现的对象(推荐,避免覆盖) + (existingValue, newValue) -> existingValue + + )); + return materialMap; + } + /** + * 抽离key拼接方法(复用性高,与checkKey规则完全一致) + * @param materialDO 物料对象 + * @return 拼接后的key(格式:A|B|C|D|E|F) + */ + private static String buildMaterialKey(MaterialDO materialDO) { + // 空值处理:字段为null时用空字符串替代,避免key中出现null + String materialName = materialDO.getMaterialName() == null ? "" : materialDO.getMaterialName(); + String materialTypeName = materialDO.getMaterialTypeName() == null ? "" : materialDO.getMaterialTypeName(); + String typeName = materialDO.getTypeName() == null ? "" : materialDO.getTypeName(); + String typeDetailName = materialDO.getTypeDetailName() == null ? "" : materialDO.getTypeDetailName(); + String specifications = materialDO.getSpecifications() == null ? "" : materialDO.getSpecifications(); + String unitName = materialDO.getUnitName() == null ? "" : materialDO.getUnitName(); + + return materialName.trim() + "|" + materialTypeName.trim() + "|" + typeName.trim() + "|" + typeDetailName.trim() + "|" + specifications.trim() + "|" + unitName.trim(); + } } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/device/DeviceClockRecordService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/device/DeviceClockRecordService.java new file mode 100644 index 0000000..90f78fb --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/device/DeviceClockRecordService.java @@ -0,0 +1,62 @@ +package com.zteits.urbanops.module.garden.service.device; + +import java.util.*; +import jakarta.validation.*; +import com.zteits.urbanops.module.garden.controller.admin.device.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.device.DeviceClockRecordDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; + +/** + * 员工打卡记录 Service 接口 + * + * @author 超级管理员 + */ +public interface DeviceClockRecordService { + + /** + * 创建员工打卡记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createDeviceClockRecord(@Valid DeviceClockRecordSaveReqVO createReqVO); + + /** + * 更新员工打卡记录 + * + * @param updateReqVO 更新信息 + */ + void updateDeviceClockRecord(@Valid DeviceClockRecordSaveReqVO updateReqVO); + + /** + * 删除员工打卡记录 + * + * @param id 编号 + */ + void deleteDeviceClockRecord(Integer id); + + /** + * 批量删除员工打卡记录 + * + * @param ids 编号 + */ + void deleteDeviceClockRecordListByIds(List ids); + + /** + * 获得员工打卡记录 + * + * @param id 编号 + * @return 员工打卡记录 + */ + DeviceClockRecordDO getDeviceClockRecord(Integer id); + + /** + * 获得员工打卡记录分页 + * + * @param pageReqVO 分页查询 + * @return 员工打卡记录分页 + */ + PageResult getDeviceClockRecordPage(DeviceClockRecordPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/device/DeviceClockRecordServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/device/DeviceClockRecordServiceImpl.java new file mode 100644 index 0000000..6e9ba4c --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/device/DeviceClockRecordServiceImpl.java @@ -0,0 +1,85 @@ +package com.zteits.urbanops.module.garden.service.device; + +import cn.hutool.core.collection.CollUtil; +import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import com.zteits.urbanops.module.garden.controller.admin.device.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.device.DeviceClockRecordDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; + +import com.zteits.urbanops.module.garden.dal.mysql.device.DeviceClockRecordMapper; + +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.diffList; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; + +/** + * 员工打卡记录 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class DeviceClockRecordServiceImpl implements DeviceClockRecordService { + + @Resource + private DeviceClockRecordMapper deviceClockRecordMapper; + + @Override + public Integer createDeviceClockRecord(DeviceClockRecordSaveReqVO createReqVO) { + // 插入 + DeviceClockRecordDO deviceClockRecord = BeanUtils.toBean(createReqVO, DeviceClockRecordDO.class); + deviceClockRecordMapper.insert(deviceClockRecord); + + // 返回 + return deviceClockRecord.getId(); + } + + @Override + public void updateDeviceClockRecord(DeviceClockRecordSaveReqVO updateReqVO) { + // 校验存在 + validateDeviceClockRecordExists(updateReqVO.getId()); + // 更新 + DeviceClockRecordDO updateObj = BeanUtils.toBean(updateReqVO, DeviceClockRecordDO.class); + deviceClockRecordMapper.updateById(updateObj); + } + + @Override + public void deleteDeviceClockRecord(Integer id) { + // 校验存在 + validateDeviceClockRecordExists(id); + // 删除 + deviceClockRecordMapper.deleteById(id); + } + + @Override + public void deleteDeviceClockRecordListByIds(List ids) { + // 删除 + deviceClockRecordMapper.deleteByIds(ids); + } + + + private void validateDeviceClockRecordExists(Integer id) { + if (deviceClockRecordMapper.selectById(id) == null) { + // throw exception(DEVICE_CLOCK_RECORD_NOT_EXISTS); + } + } + + @Override + public DeviceClockRecordDO getDeviceClockRecord(Integer id) { + return deviceClockRecordMapper.selectById(id); + } + + @Override + public PageResult getDeviceClockRecordPage(DeviceClockRecordPageReqVO pageReqVO) { + return deviceClockRecordMapper.selectPage(pageReqVO); + } + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/deviceuser/DeviceUserService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/deviceuser/DeviceUserService.java index 6cdb73c..bba2f3f 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/deviceuser/DeviceUserService.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/deviceuser/DeviceUserService.java @@ -5,9 +5,6 @@ import jakarta.validation.*; import com.zteits.urbanops.module.garden.controller.admin.deviceuser.vo.*; import com.zteits.urbanops.module.garden.dal.dataobject.deviceuser.DeviceUserDO; import com.zteits.urbanops.framework.common.pojo.PageResult; -import com.zteits.urbanops.framework.common.pojo.PageParam; -import jakarta.validation.constraints.NotNull; -import org.springframework.web.bind.annotation.RequestParam; /** * 设备用户关系 Service 接口 @@ -59,7 +56,7 @@ public interface DeviceUserService { * @param pageReqVO 分页查询 * @return 设备用户关系分页 */ - PageResult getDeviceUserPage(DeviceUserPageReqVO pageReqVO); + PageResult getDeviceUserPage(DeviceUserPageReqVO pageReqVO); /** @@ -69,4 +66,26 @@ public interface DeviceUserService { */ Integer deleteDeviceUser(Long userId, String deviceNo); + /** + * 获得设备用户关系树-从iot + * + * @param reqVO 树查询 + * @return 设备用户关系树 + */ + DeviceDeptTreeRespVO findDeviceDeptTree(DeviceDeptTreeReqVO reqVO); + + /** + * IOT更新设备信息 + * + * @param updateReqVO 更新信息 + * @return 更新结果 + */ + Boolean updateDevice(DeviceUserUpdateReqVO updateReqVO); + + /** + * 通过设备编码查询对象 + * @return 设备用户关系树 + */ + DeviceUserRespVO getDeviceUserByDeviceNo(String deviceNo); + } \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/deviceuser/DeviceUserServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/deviceuser/DeviceUserServiceImpl.java index c4b62ec..86f81ed 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/deviceuser/DeviceUserServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/deviceuser/DeviceUserServiceImpl.java @@ -1,26 +1,34 @@ package com.zteits.urbanops.module.garden.service.deviceuser; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.zteits.urbanops.framework.datapermission.core.annotation.DataPermission; import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; +import com.zteits.urbanops.module.garden.controller.admin.maintainplan.vo.MaintainPlanRespVO; +import com.zteits.urbanops.module.garden.util.DeviceDeptTreeUtils; +import com.zteits.urbanops.module.garden.util.http.OkHttpClientUtil; +import com.zteits.urbanops.module.system.api.dept.DeptApi; +import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import jakarta.annotation.Resource; +import org.springframework.util.StringUtils; import org.springframework.validation.annotation.Validated; -import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.*; +import java.util.stream.Collectors; + import com.zteits.urbanops.module.garden.controller.admin.deviceuser.vo.*; import com.zteits.urbanops.module.garden.dal.dataobject.deviceuser.DeviceUserDO; import com.zteits.urbanops.framework.common.pojo.PageResult; -import com.zteits.urbanops.framework.common.pojo.PageParam; import com.zteits.urbanops.framework.common.util.object.BeanUtils; import com.zteits.urbanops.module.garden.dal.mysql.deviceuser.DeviceUserMapper; -import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; -import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.diffList; -import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; /** * 设备用户关系 Service 实现类 @@ -31,9 +39,15 @@ import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; @Validated public class DeviceUserServiceImpl implements DeviceUserService { + @Value("${urbanops.iot.device.host}") + private String iotHost; + @Resource private DeviceUserMapper deviceUserMapper; + @Resource + private DeptApi deptApi; + @Override public Long createDeviceUser(DeviceUserSaveReqVO createReqVO) { LocalDateTime now = LocalDateTime.now(); @@ -44,20 +58,22 @@ public class DeviceUserServiceImpl implements DeviceUserService { DeviceUserDO deviceUser = new DeviceUserDO(); deviceUser.setDeviceNo(deviceInfo.getDeviceNo()); deviceUser.setDeviceName(deviceInfo.getDeviceName()); + deviceUser.setProductCode(deviceInfo.getProductCode()); deviceUser.setProductName(deviceInfo.getProductName()); deviceUser.setCompanyId(createReqVO.getCompanyId()); deviceUser.setDeptId(createReqVO.getDeptId()); - deviceUser.setUserId(Long.parseLong(userId)); - deviceUser.setUserName(userName); - deviceUser.setCreateTime( now); + deviceUser.setUserId(createReqVO.getUserId()); + deviceUser.setUserName(createReqVO.getUserName()); + deviceUser.setDeviceState(deviceInfo.getDeviceState()); + deviceUser.setCreateTime(now); deviceUser.setCreator(userId); deviceUser.setCreatorName(userName); deviceUser.setUpdater(userId); - deviceUser.setUpdateTime( now); + deviceUser.setUpdateTime(now); list.add(deviceUser); }); // 插入 - deviceUserMapper.insert( list); + deviceUserMapper.insert(list); return 1L; } @@ -79,10 +95,10 @@ public class DeviceUserServiceImpl implements DeviceUserService { } @Override - public void deleteDeviceUserListByIds(List ids) { + public void deleteDeviceUserListByIds(List ids) { // 删除 deviceUserMapper.deleteByIds(ids); - } + } private void validateDeviceUserExists(Long id) { @@ -96,9 +112,35 @@ public class DeviceUserServiceImpl implements DeviceUserService { return deviceUserMapper.selectById(id); } + @DataPermission(enable = false) @Override - public PageResult getDeviceUserPage(DeviceUserPageReqVO pageReqVO) { - return deviceUserMapper.selectPage(pageReqVO); + public PageResult getDeviceUserPage(DeviceUserPageReqVO pageReqVO) { + if(pageReqVO.getCompanyId() == null){ + pageReqVO.setCompanyId(SecurityFrameworkUtils.getCompanyId()); + } + PageResult pageResult = deviceUserMapper.selectPage(pageReqVO); + PageResult pageResultVO = BeanUtils.toBean(pageResult, DeviceUserRespVO.class); + if(CollectionUtil.isEmpty(pageResultVO.getList())){ + return PageResult.empty(); + } + //公司 + Set companyIds = pageResultVO.getList().stream().map(DeviceUserRespVO::getCompanyId).collect(Collectors.toSet()); + //部门 + Set deptIds = pageResultVO.getList().stream().map(DeviceUserRespVO::getDeptId).collect(Collectors.toSet()); + deptIds.addAll(companyIds); + /*1.获取部门*/ + Map deptMap = deptApi.getDeptMap(deptIds); + pageResultVO.getList().forEach(deviceUserRespVO -> { + DeptRespDTO deptRespDTO = deptMap.get(deviceUserRespVO.getDeptId()); + if(deptRespDTO != null){ + deviceUserRespVO.setDeptName(deptRespDTO.getName()); + } + DeptRespDTO company = deptMap.get(deviceUserRespVO.getCompanyId()); + if(company != null){ + deviceUserRespVO.setCompanyName(company.getName()); + } + }); + return pageResultVO; } @Override @@ -106,4 +148,59 @@ public class DeviceUserServiceImpl implements DeviceUserService { return deviceUserMapper.deleteDeviceUser(userId, deviceNo); } + @Override + public DeviceDeptTreeRespVO findDeviceDeptTree(DeviceDeptTreeReqVO reqVO) { + Map params = new HashMap<>(); + params.put("deviceCode", reqVO.getDeviceCode()); + params.put("deviceName", reqVO.getDeviceName()); + params.put("deviceDeptName", reqVO.getDeviceDeptName()); + String json = OkHttpClientUtil.doPostJson(iotHost + "/deviceApi/findDeviceDeptTree", params); + JSONObject jsonObject = JSONObject.parseObject(json); + if (!jsonObject.getInteger("code").equals(200)) { + return null; + } + + List deviceDeptTreeList = JSONArray.parseArray(jsonObject.getString("data"), DeviceDeptTreeRespVO.class); + if (CollectionUtil.isEmpty(deviceDeptTreeList)) { + return null; + } + //获取所有已绑定设备列表 + List list = deviceUserMapper.selectList(); + if (CollectionUtil.isEmpty(list)) { + return deviceDeptTreeList.get(0); + } + List deviceNos = list.stream().map(deviceUserDO -> deviceUserDO.getDeviceNo()).collect(Collectors.toList()); + // + DeviceDeptTreeUtils.removeDevicesByCodes(deviceDeptTreeList, deviceNos); + return deviceDeptTreeList.get(0); + } + + @Override + public Boolean updateDevice(DeviceUserUpdateReqVO updateReqVO) { + updateReqVO.getDeviceInfoList().forEach(deviceInfo -> { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.lambda().set(!StringUtils.isEmpty(deviceInfo.getProductName()), DeviceUserDO::getProductName, deviceInfo.getProductName()) + .set(!StringUtils.isEmpty(deviceInfo.getDeviceName()), DeviceUserDO::getDeviceName, deviceInfo.getDeviceName()) + .set(!StringUtils.isEmpty(deviceInfo.getDeviceState()), DeviceUserDO::getDeviceState, deviceInfo.getDeviceState()) + .eq(DeviceUserDO::getDeviceNo, deviceInfo.getDeviceNo()); + deviceUserMapper.update(updateWrapper); + }); + + return true; + } + + @Override + public DeviceUserRespVO getDeviceUserByDeviceNo(String deviceNo) { + QueryWrapper query = new QueryWrapper<>(); + query.lambda().eq(DeviceUserDO::getDeviceNo, deviceNo); + List list = deviceUserMapper.selectList(query); + if (CollectionUtil.isEmpty(list)) { + return null; + } + + DeviceUserRespVO deviceUserRes = new DeviceUserRespVO(); + BeanUtils.copyProperties(list.get(0), deviceUserRes); + return deviceUserRes; + } + } \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyMachineryService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyMachineryService.java new file mode 100644 index 0000000..9219a3a --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyMachineryService.java @@ -0,0 +1,62 @@ +package com.zteits.urbanops.module.garden.service.emergencytask; + +import java.util.*; +import jakarta.validation.*; +import com.zteits.urbanops.module.garden.controller.admin.emergencytask.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.emergencytask.EmergencyMachineryDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; + +/** + * 抢险机械子 Service 接口 + * + * @author 超级管理员 + */ +public interface EmergencyMachineryService { + + /** + * 创建抢险机械子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createEmergencyMachinery(@Valid EmergencyMachinerySaveReqVO createReqVO); + + /** + * 更新抢险机械子 + * + * @param updateReqVO 更新信息 + */ + void updateEmergencyMachinery(@Valid EmergencyMachinerySaveReqVO updateReqVO); + + /** + * 删除抢险机械子 + * + * @param id 编号 + */ + void deleteEmergencyMachinery(Long id); + + /** + * 批量删除抢险机械子 + * + * @param ids 编号 + */ + void deleteEmergencyMachineryListByIds(List ids); + + /** + * 获得抢险机械子 + * + * @param id 编号 + * @return 抢险机械子 + */ + EmergencyMachineryDO getEmergencyMachinery(Long id); + + /** + * 获得抢险机械子分页 + * + * @param pageReqVO 分页查询 + * @return 抢险机械子分页 + */ + PageResult getEmergencyMachineryPage(EmergencyMachineryPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyMachineryServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyMachineryServiceImpl.java new file mode 100644 index 0000000..7f60f1a --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyMachineryServiceImpl.java @@ -0,0 +1,85 @@ +package com.zteits.urbanops.module.garden.service.emergencytask; + +import cn.hutool.core.collection.CollUtil; +import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import com.zteits.urbanops.module.garden.controller.admin.emergencytask.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.emergencytask.EmergencyMachineryDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; + +import com.zteits.urbanops.module.garden.dal.mysql.emergencytask.EmergencyMachineryMapper; + +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.diffList; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; + +/** + * 抢险机械子 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class EmergencyMachineryServiceImpl implements EmergencyMachineryService { + + @Resource + private EmergencyMachineryMapper emergencyMachineryMapper; + + @Override + public Long createEmergencyMachinery(EmergencyMachinerySaveReqVO createReqVO) { + // 插入 + EmergencyMachineryDO emergencyMachinery = BeanUtils.toBean(createReqVO, EmergencyMachineryDO.class); + emergencyMachineryMapper.insert(emergencyMachinery); + + // 返回 + return emergencyMachinery.getId(); + } + + @Override + public void updateEmergencyMachinery(EmergencyMachinerySaveReqVO updateReqVO) { + // 校验存在 + // validateEmergencyMachineryExists(updateReqVO.getId()); + // 更新 + EmergencyMachineryDO updateObj = BeanUtils.toBean(updateReqVO, EmergencyMachineryDO.class); + emergencyMachineryMapper.updateById(updateObj); + } + + @Override + public void deleteEmergencyMachinery(Long id) { + // 校验存在 + validateEmergencyMachineryExists(id); + // 删除 + emergencyMachineryMapper.deleteById(id); + } + + @Override + public void deleteEmergencyMachineryListByIds(List ids) { + // 删除 + emergencyMachineryMapper.deleteByIds(ids); + } + + + private void validateEmergencyMachineryExists(Long id) { + if (emergencyMachineryMapper.selectById(id) == null) { + //throw exception(EMERGENCY_MACHINERY_NOT_EXISTS); + } + } + + @Override + public EmergencyMachineryDO getEmergencyMachinery(Long id) { + return emergencyMachineryMapper.selectById(id); + } + + @Override + public PageResult getEmergencyMachineryPage(EmergencyMachineryPageReqVO pageReqVO) { + return emergencyMachineryMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyTaskService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyTaskService.java new file mode 100644 index 0000000..c242f2c --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyTaskService.java @@ -0,0 +1,88 @@ +package com.zteits.urbanops.module.garden.service.emergencytask; + +import java.util.*; + +import com.zteits.urbanops.framework.common.biz.system.dict.dto.DictDataRespDTO; +import jakarta.validation.*; +import com.zteits.urbanops.module.garden.controller.admin.emergencytask.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.emergencytask.EmergencyTaskDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; + +/** + * 抢险任务主 Service 接口 + * + * @author 超级管理员 + */ +public interface EmergencyTaskService { + + /** + * 创建抢险任务主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createEmergencyTask(@Valid EmergencyTaskSaveReqVO createReqVO, boolean isSave); + + /** + * 集团审批 + * @param createReqVO + * @return + */ + int approvalEmergencyTask(EmergencyTaskApprovalReqVO createReqVO); + + /** + * 更新抢险任务主 + * + * @param updateReqVO 更新信息 + */ + void updateEmergencyTask(@Valid EmergencyTaskSaveReqVO updateReqVO); + + /** + * 删除抢险任务主 + * + * @param id 编号 + */ + void deleteEmergencyTask(Long id); + + /** + * 删除抢险任务主 + * + * @param taskNO 编号 + */ + void deleteEmergencyTaskByTaskNo(String taskNO); + + /** + * 批量删除抢险任务主 + * + * @param ids 编号 + */ + void deleteEmergencyTaskListByIds(List ids); + + /** + * 获得抢险任务主 + * + * @param id 编号 + * @return 抢险任务主 + */ + EmergencyTaskDO getEmergencyTask(Long id); + + /** + * 获得抢险任务主 + * + * @param taskNo 编号 + * @return 抢险任务主 + */ + EmergencyTaskRespVO getEmergencyTaskByTaskNo(String taskNo); + + /** + * 获得抢险任务主分页 + * + * @param pageReqVO 分页查询 + * @return 抢险任务主分页 + */ + PageResult getEmergencyTaskPage(EmergencyTaskPageReqVO pageReqVO); + + List getDictDataList(String dictType); + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyTaskServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyTaskServiceImpl.java new file mode 100644 index 0000000..4728a33 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyTaskServiceImpl.java @@ -0,0 +1,260 @@ +package com.zteits.urbanops.module.garden.service.emergencytask; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.zteits.urbanops.framework.common.biz.system.dict.dto.DictDataRespDTO; +import com.zteits.urbanops.framework.datapermission.core.annotation.DataPermission; +import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; +import com.zteits.urbanops.module.garden.dal.dataobject.emergencytask.EmergencyMachineryDO; +import com.zteits.urbanops.module.garden.dal.mysql.emergencytask.EmergencyMachineryMapper; +import com.zteits.urbanops.module.system.api.dept.DeptApi; +import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; +import com.zteits.urbanops.module.system.api.dict.DictDataApi; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +import com.zteits.urbanops.module.garden.controller.admin.emergencytask.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.emergencytask.EmergencyTaskDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; + +import com.zteits.urbanops.module.garden.dal.mysql.emergencytask.EmergencyTaskMapper; + +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.diffList; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; + +/** + * 抢险任务主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class EmergencyTaskServiceImpl implements EmergencyTaskService { + + @Resource + private EmergencyTaskMapper emergencyTaskMapper; + + @Resource + private EmergencyMachineryMapper emergencyMachineryMapper; + + @Resource + protected DeptApi deptApi; + + @Resource + private DictDataApi dictDataApi; + + @Transactional(rollbackFor = Exception.class) + @Override + public Long createEmergencyTask(EmergencyTaskSaveReqVO createReqVO, boolean isSave) { + String userId = SecurityFrameworkUtils.getLoginUserId() + ""; + String userName = SecurityFrameworkUtils.getLoginUserNickname(); + String taskNo = createReqVO.getTaskNo(); + if(StringUtils.isEmpty(createReqVO.getTaskNo())){ + taskNo = "T" + System.currentTimeMillis() + RandomUtil.randomInt(1000, 9999); + } + Long companyId = SecurityFrameworkUtils.getCompanyId(); + Long deptId = SecurityFrameworkUtils.getDeptId(); + // 插入 + EmergencyTaskDO emergencyTask = new EmergencyTaskDO(); + emergencyTask.setTaskNo(taskNo); + emergencyTask.setDiscoveryTime(createReqVO.getDiscoveryTime()); + emergencyTask.setEmergencyTypeId(createReqVO.getEmergencyTypeId()); + emergencyTask.setEmergencyHarmId(createReqVO.getEmergencyHarmId()); + emergencyTask.setTreeOwnershipId(createReqVO.getTreeOwnershipId()); + emergencyTask.setEmergencyLocation(createReqVO.getEmergencyLocation()); + emergencyTask.setReporter(createReqVO.getReporter()); + emergencyTask.setContactPhone(createReqVO.getContactPhone()); + emergencyTask.setRescueStartTime(createReqVO.getRescueStartTime()); + emergencyTask.setEmergencyImg(createReqVO.getEmergencyImg()); + emergencyTask.setTreeSpec(createReqVO.getTreeSpec()); + emergencyTask.setTreeSpecies(createReqVO.getTreeSpecies()); + emergencyTask.setRescueCompleteTime(createReqVO.getRescueCompleteTime()); + emergencyTask.setPersonnelCount(createReqVO.getPersonnelCount()); + emergencyTask.setEmergencyEndImg(createReqVO.getEmergencyEndImg()); + emergencyTask.setRemarks(createReqVO.getRemarks()); + emergencyTask.setBusiStatus(createReqVO.getBusiStatus()); + emergencyTask.setStatus(createReqVO.getStatus()); + emergencyTask.setCompanyId(companyId); + emergencyTask.setDeptId(deptId); + emergencyTask.setUpdater(userId); + emergencyTask.setUpdaterName(userName); + emergencyTask.setApprovalRemarks(""); + if(isSave){ + emergencyTask.setCreator(userId); + emergencyTask.setCreatorName(userName); + emergencyTaskMapper.insert(emergencyTask); + }else{ + emergencyTaskMapper.update(emergencyTask, new UpdateWrapper().eq("task_no", taskNo)); + } + + List list = new ArrayList<>(); + String finalTaskNo = taskNo; + createReqVO.getEmergencyMachineryList().forEach(emergencyMachinery -> { + EmergencyMachineryDO emergencyMachineryDO = new EmergencyMachineryDO(); + emergencyMachineryDO.setTaskNo(finalTaskNo); + emergencyMachineryDO.setMachineryNameId(emergencyMachinery.getMachineryNameId()); + emergencyMachineryDO.setMachineryCount(emergencyMachinery.getMachineryCount()); + emergencyMachineryDO.setCreator(userId); + emergencyMachineryDO.setCreatorName(userName); + emergencyMachineryDO.setUpdater(userId); + emergencyMachineryDO.setUpdaterName(userName); + list.add(emergencyMachineryDO); + }); + + if(CollUtil.isNotEmpty(list)){ + emergencyMachineryMapper.insertBatch(list); + } + + + // 返回 + return emergencyTask.getId(); + } + + @Override + public int approvalEmergencyTask(EmergencyTaskApprovalReqVO createReqVO) { + String userId = SecurityFrameworkUtils.getLoginUserId() + ""; + String userName = SecurityFrameworkUtils.getLoginUserNickname(); + UpdateWrapper sqlWrapper = new UpdateWrapper<>(); + sqlWrapper.lambda() + .set(EmergencyTaskDO::getApprovalRemarks, createReqVO.getApprovalRemarks()) + .set(EmergencyTaskDO::getApprovalUserId, userId) + .set(EmergencyTaskDO::getApprovalUserName, userName) + .set(EmergencyTaskDO::getBusiStatus, createReqVO.getBusiStatus()) + .set(EmergencyTaskDO::getUpdateTime, new Date()) + .eq(EmergencyTaskDO::getTaskNo, createReqVO.getTaskNo()); + return emergencyTaskMapper.update(sqlWrapper); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void updateEmergencyTask(EmergencyTaskSaveReqVO updateReqVO) { + // 校验存在 + validateEmergencyTaskExists(updateReqVO.getTaskNo()); + emergencyMachineryMapper.deleteByTaskNo(updateReqVO.getTaskNo()); + this.createEmergencyTask(updateReqVO, false); + } + + @Override + public void deleteEmergencyTask(Long id) { + // 校验存在 + //validateEmergencyTaskExists(id); + // 删除 + emergencyTaskMapper.deleteById(id); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteEmergencyTaskByTaskNo(String taskNO) { + emergencyTaskMapper.deleteByTaskNo(taskNO); + emergencyMachineryMapper.deleteByTaskNo(taskNO); + } + + @Override + public void deleteEmergencyTaskListByIds(List ids) { + // 删除 + emergencyTaskMapper.deleteByIds(ids); + } + + + private void validateEmergencyTaskExists(String taskNo) { + EmergencyTaskDO emergencyTaskDO = emergencyTaskMapper.selectOne(EmergencyTaskDO::getTaskNo, taskNo); + if(null == emergencyTaskDO){ + throw exception(EMERGENCY_TASK_NOT_EXISTS); + } + } + + @Override + public EmergencyTaskDO getEmergencyTask(Long id) { + return emergencyTaskMapper.selectById(id); + } + + @Override + public EmergencyTaskRespVO getEmergencyTaskByTaskNo(String taskNo) { + EmergencyTaskRespVO emergencyTaskRespVO = new EmergencyTaskRespVO(); + EmergencyTaskDO emergencyTaskDO = emergencyTaskMapper.selectOne(EmergencyTaskDO::getTaskNo, taskNo); + if(null != emergencyTaskDO){ + BeanUtils.copyProperties(emergencyTaskDO, emergencyTaskRespVO); + } + List detailList = emergencyMachineryMapper.selectList(EmergencyMachineryDO::getTaskNo, emergencyTaskRespVO.getTaskNo()); + if(!CollectionUtil.isEmpty(detailList)){ + emergencyTaskRespVO.setEmergencyMachineryList(detailList); + } + return emergencyTaskRespVO; + } + + @Override + public PageResult getEmergencyTaskPage(EmergencyTaskPageReqVO pageReqVO) { + Long companyId = SecurityFrameworkUtils.getCompanyId(); + //超级管理员全返回 + if(companyId != null && companyId.equals(100L)){ + pageReqVO.setBusiStatusList(Arrays.asList(2,3,4,5)); + } + PageResult page = emergencyTaskMapper.selectPage(pageReqVO); + + List list = page.getList(); + List listTwo = BeanUtils.toBean(list, EmergencyTaskRespVO.class); + + listTwo.forEach(emergencyTaskRespVO -> { + List detailList = emergencyMachineryMapper.selectList(EmergencyMachineryDO::getTaskNo, emergencyTaskRespVO.getTaskNo()); + if(!CollectionUtil.isEmpty(detailList)){ + emergencyTaskRespVO.setEmergencyMachineryList(detailList); + } + }); + addDataInspectionPlan(listTwo); + + // 转换返回 + return new PageResult<>(listTwo, page.getTotal()); + + } + + + + /** + * 回填部门/公司/角色 + * @param list 分页对象 + */ + private void addDataInspectionPlan(List list ){ + if(CollectionUtils.isEmpty(list)){ + return ; + } + //公司 + Set companyIds = list.stream().map(EmergencyTaskRespVO::getCompanyId).collect(Collectors.toSet()); + //部门 + Set deptIds = list.stream().map(EmergencyTaskRespVO::getDeptId).collect(Collectors.toSet()); + deptIds.addAll(companyIds); + /*1.获取部门*/ + Map deptMap = deptApi.getDeptMap(deptIds); + + list.forEach(plan -> { +// DeptRespDTO dept = deptMap.get(plan.getDeptId()); +// if (dept != null) { +// plan.setDeptName(dept.getName()); +// +// } + DeptRespDTO company = deptMap.get(plan.getCompanyId()); + if(company != null){ + plan.setCompanyName(company.getName()); + } + }); + } + + @Override + public List getDictDataList(String dataType){ + return dictDataApi.getDictDataList(dataType); + } + + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/HomepageSummaryServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/HomepageSummaryServiceImpl.java index d32794b..ccc02bc 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/HomepageSummaryServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/HomepageSummaryServiceImpl.java @@ -1,5 +1,6 @@ package com.zteits.urbanops.module.garden.service.homepage; +import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.esotericsoftware.minlog.Log; @@ -91,12 +92,12 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ Integer inspTotal = Objects.isNull(dayVo.getInspTotal()) ? 0 : dayVo.getInspTotal(); Integer woTotal = Objects.isNull(dayVo.getWoTotal()) ? 0 : dayVo.getWoTotal(); - Integer mtUnfinished = Objects.isNull(dayVo.getMtUnfinished()) ? 0 : dayVo.getMtUnfinished(); - Integer inspUnfinished = Objects.isNull(dayVo.getInspUnfinished()) ? 0 : dayVo.getInspUnfinished(); - Integer woUnfinished = Objects.isNull(dayVo.getWoUnfinished()) ? 0 : dayVo.getWoUnfinished(); + Integer mtCompleted = Objects.isNull(dayVo.getMtCompleted()) ? 0 : dayVo.getMtCompleted(); + Integer inspCompleted = Objects.isNull(dayVo.getInspCompleted()) ? 0 : dayVo.getInspCompleted(); + Integer woCompleted = Objects.isNull(dayVo.getWoCompleted()) ? 0 : dayVo.getWoCompleted(); // 计算赋值 - vo.setCompletedNum(mtTotal + inspTotal + woTotal); - vo.setCountpendingNum(mtUnfinished + inspUnfinished + woUnfinished); + vo.setCompletedNum(mtCompleted + inspCompleted + woCompleted); + vo.setCountpendingNum(mtTotal + inspTotal + woTotal); } }); } @@ -114,7 +115,7 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ //待办 Long deptId = SecurityFrameworkUtils.getDeptId(); List roleIds = roleApi.getRoleIdsByUserId(SecurityFrameworkUtils.getLoginUserId()); - mpPage = homepageSummaryMapper.queryPendingTaskDetails(mpPage, roleIds, userId, deptId); + mpPage = homepageSummaryMapper.queryPendingTaskDetails(mpPage, roleIds, userId, deptId, LocalDateTime.now()); } return new PageResult<>(mpPage.getRecords(), mpPage.getTotal()); } @@ -137,13 +138,14 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ if (StringUtils.isEmpty(busiDate)) { busiDate = yesterday.format(formatter); } + List taskStatisticsList = initUserData(busiDate); + String beginTime = busiDate + " 00:00:00"; String endTime = busiDate + " 23:59:59"; Log.info("昨天开始时间:" + beginTime); Log.info("昨天结束时间:" + endTime); //获取正常用户 - List userList = userApi.getUserList(); - if (CollectionUtils.isEmpty(userList)){ + if (CollectionUtils.isEmpty(taskStatisticsList)){ return; } //巡查已完成 @@ -189,56 +191,26 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ (oldVo, newVo) -> newVo, HashMap::new )); -// //巡查计划数 -// List inspTotal = homepageSummaryMapper.countInspPendingTask(beginTime, endTime); -// Map inspTotalMap = inspTotal.stream() -// .filter(vo -> Objects.nonNull(vo)) -// .collect(Collectors.toMap( -// // Map的key:从VO中提取Long类型的roleId(核心修正点) -// CommonTaskStatusVo::getRoleId, -// vo -> vo, -// (oldVo, newVo) -> newVo, -// HashMap::new -// )); -// //养护计划数量 -// List mtTotal = homepageSummaryMapper.countMtPendingTask(beginTime, endTime); -// Map mtTotalMap = mtTotal.stream() -// .filter(vo -> Objects.nonNull(vo)) -// .collect(Collectors.toMap( -// // Map的key:从VO中提取Long类型的roleId(核心修正点) -// CommonTaskStatusVo::getRoleId, -// vo -> vo, -// (oldVo, newVo) -> newVo, -// HashMap::new -// )); + List taskStatisticsDOList = new ArrayList<>(); //根据用户查询任务数量 - for (AdminUserRespDTO adminUserRespDTO : userList) { - Long userId = adminUserRespDTO.getId(); - Long deptId = adminUserRespDTO.getDeptId(); - List roles = roleApi.getRoleIdsByUserId(userId); - if (CollectionUtils.isEmpty(roles)) { - continue; - } - if (roles.contains(1L)) {//超级管理员 - continue; - } - if (roles.contains(2L)) {//普通角色 - continue; - } - if (roles.contains(159L)) {//管理员 - continue; - } - if (roles.contains(168L)) {//子公司管理员 - continue; - } - //deptApi.get + for (TaskStatisticsDO statisticsVo : taskStatisticsList) { + Long userId = statisticsVo.getUserId(); + Long deptId = statisticsVo.getDeptId(); + String[] roles = statisticsVo.getRoleIds().split(","); TaskStatisticsDO statisticsDO = new TaskStatisticsDO(); - statisticsDO.setBusiDate(busiDate); - statisticsDO.setUserId(userId); - statisticsDO.setUserName(statisticsDO.getUserName()); - //statisticsDO.setCompanyId(); - statisticsDO.setDeptId(adminUserRespDTO.getDeptId()); + BeanUtil.copyProperties(statisticsVo, statisticsDO); + //初始化参数 + statisticsDO.setInspTotal(0); + statisticsDO.setInspUnfinished(0); + statisticsDO.setInspCompleted(0); + statisticsDO.setMtTotal(0); + statisticsDO.setMtCompleted(0); + statisticsDO.setMtUnfinished(0); + statisticsDO.setWoTotal(0); + statisticsDO.setWoCompleted(0); + statisticsDO.setWoUnfinished(0); + //2、查询巡查任务数量及已完成数量 Integer inspTotalCount = 0; List inspTotal = homepageSummaryMapper.countInspPendingTask(beginTime, endTime, deptId); @@ -251,7 +223,7 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ (oldVo, newVo) -> newVo, HashMap::new )); - for (Long role : roles) { + for (String role : roles) { CommonTaskStatusVo countVo = inspTotalMap.get(role); if (null != countVo) { inspTotalCount = countVo.getTotalCount(); @@ -277,7 +249,7 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ HashMap::new )); //3、查询养护计划任务数量 - for (Long role : roles) { + for (String role : roles) { CommonTaskStatusVo countVo = mtTotalMap.get(role); if (null != countVo) { mtTotalCount = countVo.getTotalCount(); @@ -293,12 +265,12 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ //4、工单任务数量 Integer woCompCount = Optional.ofNullable(woCompletedMap) - .map(map -> map.get(userId)) + .flatMap(map -> Optional.ofNullable(map.get(userId))) .map(CommonTaskStatusVo::getTotalCount) .orElse(0); statisticsDO.setWoCompleted(woCompCount); Integer woUnfiCount = Optional.ofNullable(woPendingMap) - .map(map -> map.get(userId)) + .flatMap(map -> Optional.ofNullable(map.get(userId))) .map(CommonTaskStatusVo::getTotalCount) .orElse(0); statisticsDO.setWoUnfinished(woUnfiCount); @@ -315,6 +287,20 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ //批量保存 taskStatisticsMapper.insertBatch(taskStatisticsDOList); } + /** + * @Author wangqian + * @Description 初始化对象集合 + * @Date 2026/1/11 23:55 + */ + private List initUserData(String busiDate) { + List taskStatisticsList = new ArrayList<>(); + //获取正常用户 + List userList = homepageSummaryMapper.getUserAll(busiDate); + if (CollectionUtils.isEmpty(userList)){ + return taskStatisticsList; + } + return userList; + } private List addTaskDefaultData(List days){ List newList = new ArrayList<>(); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/MaintainSummaryServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/MaintainSummaryServiceImpl.java index 8cae044..27490b5 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/MaintainSummaryServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/MaintainSummaryServiceImpl.java @@ -3,6 +3,7 @@ package com.zteits.urbanops.module.garden.service.homepage; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.zteits.urbanops.framework.common.biz.system.dict.dto.DictDataRespDTO; +import com.zteits.urbanops.framework.common.util.date.DateUtils; import com.zteits.urbanops.framework.common.util.object.BeanUtils; import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.*; @@ -20,6 +21,9 @@ import org.springframework.stereotype.Service; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -38,9 +42,12 @@ public class MaintainSummaryServiceImpl implements MaintainSummaryService { @Resource private DictDataApi dictDataApi; + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd") + .withZone(ZoneId.of("Asia/Shanghai")); + @Override public Map getSummary() { - Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); + Long companyId = SecurityFrameworkUtils.getCompanyId(); if(null == companyId || companyId == 0L || companyId == 100L){ companyId = null; } @@ -65,13 +72,13 @@ public class MaintainSummaryServiceImpl implements MaintainSummaryService { @Override public Map getWorkTaskTrend(HomePageSummaryReqVO req) { - Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); + Long companyId = SecurityFrameworkUtils.getCompanyId(); if(null == companyId || companyId == 0L || companyId == 100L){ companyId = null; } Map chartData = new HashMap<>(); //1、数据结构初始化 - List days = getDays(req.beginTime, req.endTime); + List days = getDays(req.getBeginTime(), req.getEndTime()); List dictDataList = dictDataApi.getDictDataList(DictTypeConstants.BUSINESS_LINE); List allBusiLines = dictDataList.stream().map(DictDataRespDTO::getValue).collect(Collectors.toList()); Map> defaultData = addTaskDefaultData(req, days, dictDataList); @@ -131,7 +138,7 @@ public class MaintainSummaryServiceImpl implements MaintainSummaryService { // 遍历默认数据列表,匹配并赋值巡检计划数据 for (CommitTaskStatisticsRespVo defaultVo : defaultVoList) { // 构建默认VO的唯一标识(与巡检计划的标识保持一致) - String matchKey = defaultVo.getDateValue() + "_" + defaultVo.getBusiLine(); + String matchKey = defaultVo.getCurrentDate() + "_" + defaultVo.getBusiLine(); if (inspectionMap.containsKey(matchKey)) { CommitTaskStatisticsRespVo inspectVo = inspectionMap.get(matchKey); defaultVo.setInspectionPlanNum(inspectVo.getInspectionPlanNum()); @@ -157,7 +164,7 @@ public class MaintainSummaryServiceImpl implements MaintainSummaryService { // 遍历默认数据列表,匹配并赋值养护计划数据 for (CommitTaskStatisticsRespVo defaultVo : defaultVoList) { - String matchKey = defaultVo.getDateValue() + "_" + defaultVo.getBusiLine(); + String matchKey = defaultVo.getCurrentDate() + "_" + defaultVo.getBusiLine(); if (maintainMap.containsKey(matchKey)) { CommitTaskStatisticsRespVo maintainVo = maintainMap.get(matchKey); // 赋值: @@ -178,7 +185,12 @@ public class MaintainSummaryServiceImpl implements MaintainSummaryService { chartData.put("data", defaultData); //日期集合 - chartData.put("timeData",days); + List monthDays = days.stream() + .map(dateStr -> dateStr.substring(5, 7) + "." + dateStr.substring(8)) + .collect(Collectors.toList()); + chartData.put("timeData",monthDays); + + return chartData; } /** @@ -188,7 +200,7 @@ public class MaintainSummaryServiceImpl implements MaintainSummaryService { */ @Override public Map getWorkOrderRatio(HomePageSummaryReqVO req) { - Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); + Long companyId = SecurityFrameworkUtils.getCompanyId(); if(null == companyId || companyId == 0L || companyId == 100L){ companyId = null; } @@ -279,7 +291,7 @@ public class MaintainSummaryServiceImpl implements MaintainSummaryService { */ @Override public Map getWorkOrderDistribution(HomePageSummaryReqVO req) { - Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); + Long companyId = SecurityFrameworkUtils.getCompanyId(); if(null == companyId || companyId == 0L || companyId == 100L){ companyId = null; } @@ -345,7 +357,7 @@ public class MaintainSummaryServiceImpl implements MaintainSummaryService { @Override public Map getWorkOrderDistributionBySource(HomePageSummaryReqVO req) { - Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); + Long companyId = SecurityFrameworkUtils.getCompanyId(); if(null == companyId || companyId == 0L || companyId == 100L){ companyId = null; } @@ -419,7 +431,7 @@ public class MaintainSummaryServiceImpl implements MaintainSummaryService { */ @Override public List> getWorkOrderHeatmap() { - Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); + Long companyId = SecurityFrameworkUtils.getCompanyId(); if(null == companyId || companyId == 0L || companyId == 100L){ companyId = null; } @@ -433,7 +445,7 @@ public class MaintainSummaryServiceImpl implements MaintainSummaryService { */ @Override public Map getWorkOrderTrend(HomePageSummaryReqVO req) { - Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); + Long companyId = SecurityFrameworkUtils.getCompanyId(); if(null == companyId || companyId == 0L || companyId == 100L){ companyId = null; } @@ -445,7 +457,10 @@ public class MaintainSummaryServiceImpl implements MaintainSummaryService { // 1. 初始化响应Map Map> respMap = addDefaultData(req); // 2、汇总工单数量 - List countList = homepageSummaryMapper.countWorkOrderTrend(companyId, req.getBeginTime(), req.getEndTime(), req.getQueryState()); + LocalDate currentLocalDate = LocalDate.now(ZoneId.of("Asia/Shanghai")); + // 2. 格式化为yyyy-MM-dd字符串 + String currentDate = currentLocalDate.format(DATE_FORMATTER); + List countList = homepageSummaryMapper.countWorkOrderTrend(companyId, req.getBeginTime(), req.getEndTime(), req.getQueryState(), currentDate); Map> busiLineGroup; if (CollectionUtils.isNotEmpty(countList)) { busiLineGroup = countList.stream() @@ -475,7 +490,7 @@ public class MaintainSummaryServiceImpl implements MaintainSummaryService { // 3.2 构建「联合标识-真实totalCount」的Map,提高匹配效率 // 联合标识:companyId_dateValue(因为busiLine已匹配,内部无需重复拼接) - Map realCountMap = realVoList.stream() + Map realCountMap = realVoList.stream() .filter(realVo -> realVo.getCompanyId() != null && realVo.getDateValue() != null) // 过滤空值,避免异常 .collect(Collectors.toMap( // 键:companyId + "_" + dateValue(唯一标识) @@ -513,18 +528,17 @@ public class MaintainSummaryServiceImpl implements MaintainSummaryService { companyList.forEach(resp ->{ WorkOrderTrendRespVo type = new WorkOrderTrendRespVo(); type.setDateValue(dayy); - type.setTotalCount("0"); // 默认总数为0 + type.setTotalCount(0); // 默认总数为0 type.setCompanyId(String.valueOf(resp.getId())); type.setCompanyName(resp.getName()); newList.add(type); }); }); - List dictDataList = dictDataApi.getDictDataList(DictTypeConstants.BUSINESS_LINE); - List busiLines = dictDataList.stream().map(DictDataRespDTO::getValue).collect(Collectors.toList()); - + String busiLines = SecurityFrameworkUtils.getBusiLine(); + String[] busiLineArray = busiLines.split(","); // 6. 为每个业务线生成专属列表并赋值busiLine - for (String type : busiLines) { + for (String type : busiLineArray) { // 核心:通过map拷贝对象并设置busiLine,避免引用共享 List busiLineList = newList.stream() // 拷贝原对象,创建新对象并设置当前业务线 @@ -553,7 +567,8 @@ public class MaintainSummaryServiceImpl implements MaintainSummaryService { //1、日期赋值 days.forEach(dayy->{ CommitTaskStatisticsRespVo vo = new CommitTaskStatisticsRespVo(); - vo.setDateValue(dayy); + vo.setDateValue(dayy.substring(5).replace("-",".")); + vo.setCurrentDate(dayy); vo.setPlanNum(0); // 默认总数为0 vo.setPlanFinishNum(0); vo.setInspectionPlanNum(0); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanCommitServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanCommitServiceImpl.java index a0a511d..09c5102 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanCommitServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanCommitServiceImpl.java @@ -18,6 +18,7 @@ import com.zteits.urbanops.module.garden.convert.AppGardenWorkOrderConvert; import com.zteits.urbanops.module.garden.dal.dataobject.inspectionplan.InspectionPlanCommitDO; import com.zteits.urbanops.module.garden.dal.dataobject.inspectionplan.InspectionPlanDO; import com.zteits.urbanops.module.garden.dal.dataobject.inspectionplan.InspectionPlanDetailDO; +import com.zteits.urbanops.module.garden.dal.dataobject.maintainplan.MaintainPlanCommitDO; import com.zteits.urbanops.module.garden.dal.dataobject.road.RoadDO; import com.zteits.urbanops.module.garden.dal.mysql.inspectionplan.InspectionPlanCommitMapper; import com.zteits.urbanops.module.garden.dal.mysql.inspectionplan.InspectionPlanDetailMapper; @@ -43,7 +44,7 @@ import java.util.*; import java.util.stream.Collectors; import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.INSPECTION_PLAN_NOT_EXISTS; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; /** @@ -76,6 +77,10 @@ public class InspectionPlanCommitServiceImpl implements InspectionPlanCommitServ @Override public Long createInspectionPlanCommit(InspectionPlanCommitSaveReqVO createReqVO) { + List list = inspectionPlanCommitMapper.selectList(InspectionPlanCommitDO::getPlanNo, createReqVO.getPlanNo()); + if(!CollectionUtils.isEmpty(list)){ + throw exception(INSPECTION_COMMIT_PLAN__EXISTS); + } // 插入 InspectionPlanCommitDO inspectionPlanCommit = BeanUtils.toBean(createReqVO, InspectionPlanCommitDO.class); inspectionPlanCommitMapper.insert(inspectionPlanCommit); @@ -103,6 +108,7 @@ public class InspectionPlanCommitServiceImpl implements InspectionPlanCommitServ InspectionPlanCommitDO inspectionPlanCommit = getInspectionPlanCommitDO(createReqVO, inspectionPlanDO); inspectionPlanCommit.setTransWorkNo(orderNO); + inspectionPlanCommit.setFinishTime(LocalDateTime.now()); /*4.查询计划明细最大次数*/ Long countNum = inspectionPlanCommitMapper.selectCount(new QueryWrapper().lambda() .eq(InspectionPlanCommitDO::getPlanNo, createReqVO.getPlanNo())); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanDetailServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanDetailServiceImpl.java index 38dc40d..e376c04 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanDetailServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanDetailServiceImpl.java @@ -21,6 +21,7 @@ import org.springframework.validation.annotation.Validated; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.List; @@ -111,8 +112,10 @@ public class InspectionPlanDetailServiceImpl implements InspectionPlanDetailServ public void updateExpiredInspectionPlanDetails() { // 更新过期的计划明细状态为过期(3) LocalDateTime localDateTime = LocalDate.now().atStartOfDay(); //00:00:00 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + String formattedTime = localDateTime.format(formatter); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.lt(InspectionPlanDetailDO::getEndTime, localDateTime) + updateWrapper.lt(InspectionPlanDetailDO::getEndTime, formattedTime) .set(InspectionPlanDetailDO::getFinishState, FinishStateEnum.EXPIRED.getStatus()) // 设置为过期状态 .eq(InspectionPlanDetailDO::getFinishState, FinishStateEnum.NOT_FINISHED.getStatus()); inspectionPlanDetailMapper.update(null, updateWrapper); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanServiceImpl.java index 13ec0d0..01dc4e1 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanServiceImpl.java @@ -6,9 +6,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.zteits.urbanops.framework.common.exception.ErrorCode; import com.zteits.urbanops.framework.common.pojo.CommonResult; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import com.zteits.urbanops.framework.datapermission.core.annotation.DataPermission; import com.zteits.urbanops.framework.dict.core.DictFrameworkUtils; import com.zteits.urbanops.framework.mybatis.core.util.MyBatisUtils; import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; @@ -88,6 +90,12 @@ public class InspectionPlanServiceImpl implements InspectionPlanService { @Transactional(rollbackFor = Exception.class) @Override public CommonResult createInspectionPlan(InspectionPlanSaveReqVO createReqVO) { + createReqVO.getRoadListReqVO().forEach(road -> { + if (road.getDeptId() == null || road.getRoadId() == 0L) { + ErrorCode errorCode = new ErrorCode(INSPECTION_PLAN_NOT_EXISTS.getCode(), road.getRoadName()+"未配置部门信息,请在道路管理界面配置班组"); + throw exception(errorCode); + } + }); //存在性校验 validateInspectionPlanExists(createReqVO); LocalDateTime now = LocalDateTime.now(); @@ -296,6 +304,7 @@ public class InspectionPlanServiceImpl implements InspectionPlanService { * * @param list 分页对象 */ + private void addDataInspectionPlan(List list) { if (CollectionUtils.isEmpty(list)) { return; diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanCommitServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanCommitServiceImpl.java index 347cd22..57674a0 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanCommitServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanCommitServiceImpl.java @@ -63,6 +63,10 @@ public class MaintainPlanCommitServiceImpl implements MaintainPlanCommitService @Override public Long createMaintainPlanCommit(MaintainPlanCommitSaveReqVO createReqVO) { + List list = maintainPlanCommitMapper.selectList(MaintainPlanCommitDO::getPlanNo, createReqVO.getPlanNo()); + if(!CollectionUtils.isEmpty(list)){ + throw exception(MAINTAIN_PLAN_NOT_EXISTS); + } // 插入 MaintainPlanCommitDO maintainPlanCommit = BeanUtils.toBean(createReqVO, MaintainPlanCommitDO.class); maintainPlanCommitMapper.insert(maintainPlanCommit); @@ -120,6 +124,7 @@ public class MaintainPlanCommitServiceImpl implements MaintainPlanCommitService commitDO.setCreator(userId+""); commitDO.setUserName(userName); commitDO.setCreateTime( now); + commitDO.setFinishTime( now); commitDO.setUpdater(userId+""); commitDO.setUpdateTime( now); commitDO.setUpdaterName(userName); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanDetailServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanDetailServiceImpl.java index 6a58e59..ebfe43a 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanDetailServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanDetailServiceImpl.java @@ -30,6 +30,7 @@ import org.springframework.validation.annotation.Validated; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -154,14 +155,40 @@ public class MaintainPlanDetailServiceImpl implements MaintainPlanDetailService public void updateExpiredMaintainPlanDetails() { // 更新过期的计划明细状态为过期(3) LocalDateTime localDateTime = LocalDate.now().atStartOfDay(); //00:00:00 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + String formattedTime = localDateTime.format(formatter); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.lt(MaintainPlanDetailDO::getEndTime, localDateTime) + updateWrapper.lt(MaintainPlanDetailDO::getEndTime, formattedTime) .set(MaintainPlanDetailDO::getFinishState, FinishStateEnum.EXPIRED.getStatus()) // 设置为过期状态 .eq(MaintainPlanDetailDO::getFinishState, FinishStateEnum.NOT_FINISHED.getStatus()); maintainPlanDetailMapper.update(updateWrapper); } + public static void main(String[] args) { + // 获取当天0点的LocalDateTime对象 + LocalDateTime localDateTime = LocalDate.now().atStartOfDay(); + + // 1. 直接打印对象(默认toString格式) + System.out.println("默认toString格式: " + localDateTime); + // 输出示例(假设当前日期是2026-01-16):2026-01-16T00:00 + + // 2. 自定义格式输出(更易读) + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + String formattedTime = localDateTime.format(formatter); + System.out.println("自定义格式: " + formattedTime); + // 输出示例:2026-01-16 00:00:00.000 + + // 3. 拆解查看各部分值 + System.out.println("年: " + localDateTime.getYear()); // 2026 + System.out.println("月: " + localDateTime.getMonthValue()); // 1 + System.out.println("日: " + localDateTime.getDayOfMonth()); // 16 + System.out.println("时: " + localDateTime.getHour()); // 0 + System.out.println("分: " + localDateTime.getMinute()); // 0 + System.out.println("秒: " + localDateTime.getSecond()); // 0 + System.out.println("纳秒: " + localDateTime.getNano()); // 0 + } + @Override public void updateExpiredMaintainPlans() { // 更新过期的计划状态为过期(3) diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanServiceImpl.java index af7934b..c036166 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanServiceImpl.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.RandomUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.zteits.urbanops.framework.common.exception.ErrorCode; import com.zteits.urbanops.framework.common.pojo.CommonResult; import com.zteits.urbanops.framework.dict.core.DictFrameworkUtils; import com.zteits.urbanops.framework.mybatis.core.util.MyBatisUtils; @@ -102,6 +103,12 @@ public class MaintainPlanServiceImpl implements MaintainPlanService { @Override public CommonResult createMaintainPlan(MaintainPlanSaveReqVO createReqVO) { + createReqVO.getRoadListReqVO().forEach(road -> { + if (road.getDeptId() == null || road.getRoadId() == 0L) { + ErrorCode errorCode = new ErrorCode(INSPECTION_PLAN_NOT_EXISTS.getCode(), road.getRoadName() + "未配置部门信息,请在道路管理界面配置班组"); + throw exception(errorCode); + } + }); //存在性校验 validateMaintainPlanExists(createReqVO); LocalDateTime now = LocalDateTime.now(); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/material/MaterialServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/material/MaterialServiceImpl.java index 828c937..baf8409 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/material/MaterialServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/material/MaterialServiceImpl.java @@ -1,6 +1,8 @@ package com.zteits.urbanops.module.garden.service.material; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.zteits.urbanops.module.system.api.dept.DeptApi; +import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; import org.springframework.stereotype.Service; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -17,6 +19,7 @@ import static com.zteits.urbanops.framework.common.exception.enums.GlobalErrorCo import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception0; import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; +import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getCompanyId; import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; /** @@ -31,6 +34,9 @@ public class MaterialServiceImpl implements MaterialService { @Resource private MaterialMapper materialMapper; + @Resource + private DeptApi deptApi; + @Override public Long createMaterial(MaterialSaveReqVO createReqVO) { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -46,6 +52,11 @@ public class MaterialServiceImpl implements MaterialService { createReqVO.setFullCode(createReqVO.getTypeDetailId()+createReqVO.getMaterialCode()+createReqVO.getSpecCode()); // 插入 MaterialDO material = BeanUtils.toBean(createReqVO, MaterialDO.class); + material.setBelongCompanyId(getCompanyId()); + DeptRespDTO deptRespDTO = deptApi.getDept(getCompanyId()); + if (deptRespDTO != null) { + material.setBelongCompanyName(deptRespDTO.getName()); + } materialMapper.insert(material); // 返回 diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventory/MaterialInventoryServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventory/MaterialInventoryServiceImpl.java index f111e66..d9fb76f 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventory/MaterialInventoryServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventory/MaterialInventoryServiceImpl.java @@ -107,6 +107,9 @@ public class MaterialInventoryServiceImpl implements MaterialInventoryService { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(MaterialInventoryDO::getBelongCompanyId, materialInventory.getBelongCompanyId()); queryWrapper.eq(MaterialInventoryDO::getMaterialId, materialInventory.getMaterialId()); + queryWrapper.eq(MaterialInventoryDO::getMaterialTypeId, materialInventory.getMaterialTypeId()); + queryWrapper.eq(MaterialInventoryDO::getTypeDetailId, materialInventory.getTypeDetailId()); + queryWrapper.eq(MaterialInventoryDO::getTypeId, materialInventory.getTypeId()); MaterialInventoryDO object = materialInventoryMapper.selectOne(queryWrapper); if(object != null){ object.setInventoryTotalNum(object.getInventoryTotalNum()+ materialInventory.getCurrentNum()); @@ -127,7 +130,7 @@ public class MaterialInventoryServiceImpl implements MaterialInventoryService { @Override public MaterialInventoryDO selectMaterialInventoryByMaterialId(Long materialId, Long companyId) { if (materialId == null) { - throw exception0(BAD_REQUEST.getCode(),"更新库存失败:typeDetailId为空!"); + throw exception0(BAD_REQUEST.getCode(),"更新库存失败:materialId为空!"); } LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(MaterialInventoryDO::getMaterialId, materialId); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryin/MaterialInventoryInService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryin/MaterialInventoryInService.java index e5b5727..2006aad 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryin/MaterialInventoryInService.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryin/MaterialInventoryInService.java @@ -58,5 +58,13 @@ public interface MaterialInventoryInService { * @return 物料入库分页 */ PageResult getMaterialInventoryInPage(MaterialInventoryInPageReqVO pageReqVO); + /** + * @Author wangqian + * @Description 批量入库 + * @Date 2026/1/16 20:25 + * @Param createReqVO + * @Return void + */ + void batchCreateMaterialInventoryIn(List list); -} \ No newline at end of file +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryin/MaterialInventoryInServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryin/MaterialInventoryInServiceImpl.java index 21ab444..92ab280 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryin/MaterialInventoryInServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryin/MaterialInventoryInServiceImpl.java @@ -8,6 +8,7 @@ import com.zteits.urbanops.module.garden.dal.mysql.material.MaterialMapper; import com.zteits.urbanops.module.garden.service.materialinventory.MaterialInventoryService; import com.zteits.urbanops.module.system.api.dept.DeptApi; import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -144,7 +145,7 @@ public class MaterialInventoryInServiceImpl implements MaterialInventoryInServic if (null == materialInventoryIn) { throw exception(MATERIAL_INVENTORY_IN_NOT_EXISTS); } - MaterialInventoryDO inventory = materialInventoryService.selectMaterialInventoryByMaterialId(materialInventoryIn.getMaterialId(),getCompanyId()); + MaterialInventoryDO inventory = materialInventoryService.selectMaterialInventoryByMaterialId(materialInventoryIn.getMaterialId(),materialInventoryIn.getBelongCompanyId()); if(null == inventory){ throw exception0(BAD_REQUEST.getCode(),"参数错误"); } @@ -187,4 +188,38 @@ public class MaterialInventoryInServiceImpl implements MaterialInventoryInServic return materialInventoryInMapper.selectPage(pageReqVO); } + + @Transactional + @Override + public void batchCreateMaterialInventoryIn(List list) { + if (CollectionUtils.isEmpty(list)) { + return; + } + for (MaterialInventoryInDO in : list) { + in.setInventoryInNo(System.currentTimeMillis()+ RandomUtil.randomInt(10, 100000)+""); + in.setDeptId(getLoginUserDeptId()); + materialInventoryInMapper.insert(in); + + //更新库存 + MaterialInventoryDO inventory = new MaterialInventoryDO(); + inventory.setMaterialId(in.getMaterialId()); + inventory.setMaterialName(in.getMaterialName()); + inventory.setMaterialTypeId(in.getMaterialTypeId()); + inventory.setMaterialTypeName(in.getMaterialTypeName()); + inventory.setTypeId(in.getTypeId()); + inventory.setTypeName(in.getTypeName()); + inventory.setTypeDetailId(in.getTypeDetailId()); + inventory.setTypeDetailName(in.getTypeDetailName()); + inventory.setSpecifications(in.getSpecifications()); + inventory.setBelongCompanyId(in.getBelongCompanyId()); + inventory.setBelongCompanyName(in.getBelongCompanyName()); + inventory.setUnitId(in.getUnitId()); + inventory.setUnitName(in.getUnitName()); + inventory.setCurrentNum(in.getInInventoryNum()); + inventory.setOutTotalNum(0L); + inventory.setInventoryTotalNum(in.getInInventoryNum()); + inventory.setDeptId(getLoginUserDeptId()); + materialInventoryService.insertMaterialInventory(inventory); + } + } } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryout/MaterialInventoryOutService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryout/MaterialInventoryOutService.java index 7030aea..9e9abdd 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryout/MaterialInventoryOutService.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryout/MaterialInventoryOutService.java @@ -59,4 +59,13 @@ public interface MaterialInventoryOutService { */ PageResult getMaterialInventoryOutPage(MaterialInventoryOutPageReqVO pageReqVO); -} \ No newline at end of file + /** + * @Author wangqian + * @Description 批量出库 + * @Date 2026/1/16 21:40 + * @Param list + * @Return void + */ + void batchCreateMaterialInventoryOut(List list); + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryout/MaterialInventoryOutServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryout/MaterialInventoryOutServiceImpl.java index 575ab3c..5f5f3ea 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryout/MaterialInventoryOutServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryout/MaterialInventoryOutServiceImpl.java @@ -14,7 +14,10 @@ import com.zteits.urbanops.module.garden.service.materialinventory.MaterialInven import com.zteits.urbanops.module.system.api.dept.DeptApi; import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.List; @@ -53,7 +56,8 @@ public class MaterialInventoryOutServiceImpl implements MaterialInventoryOutServ if(null == material){ throw exception0(BAD_REQUEST.getCode(), "无效参数-materialId"); } - MaterialInventoryDO materialInventory = materialInventoryService.selectMaterialInventoryByMaterialId(material.getMaterialId(),getCompanyId()); + + MaterialInventoryDO materialInventory = materialInventoryService.getMaterialInventory(createReqVO.getInventoryId()); if(null == materialInventory){ throw exception0(BAD_REQUEST.getCode(),createReqVO.getMaterialName()+"没有库存"); } @@ -75,10 +79,10 @@ public class MaterialInventoryOutServiceImpl implements MaterialInventoryOutServ out.setTypeDetailId(material.getTypeDetailId()); out.setTypeDetailName(material.getTypeDetailName()); out.setSpecifications(material.getSpecifications()); -// out.setBelongCompanyId(material.getBelongCompanyId()); -// out.setBelongCompanyName(material.getBelongCompanyName()); - out.setBelongCompanyId(deptRespDTO.getId()); - out.setBelongCompanyName(deptRespDTO.getName()); + out.setBelongCompanyId(materialInventory.getBelongCompanyId()); + out.setBelongCompanyName(materialInventory.getBelongCompanyName()); + //out.setBelongCompanyId(deptRespDTO.getId()); + // out.setBelongCompanyName(deptRespDTO.getName()); out.setOutInventoryNum(createReqVO.getOutInventoryNum()); out.setUnitId(material.getUnitId()); out.setUnitName(material.getUnitName()); @@ -108,7 +112,7 @@ public class MaterialInventoryOutServiceImpl implements MaterialInventoryOutServ throw exception(MATERIAL_INVENTORY_OUT_NOT_EXISTS); } - MaterialInventoryDO inventory = materialInventoryService.selectMaterialInventoryByMaterialId(materialInventoryOut.getMaterialId(),getCompanyId()); + MaterialInventoryDO inventory = materialInventoryService.selectMaterialInventoryByMaterialId(materialInventoryOut.getMaterialId(),materialInventoryOut.getBelongCompanyId()); if(null == inventory){ throw exception0(BAD_REQUEST.getCode(),"参数错误"); } @@ -154,4 +158,33 @@ public class MaterialInventoryOutServiceImpl implements MaterialInventoryOutServ return materialInventoryOutMapper.selectPage(pageReqVO); } + + @Override + @Transactional + public void batchCreateMaterialInventoryOut(List list) { + if (CollectionUtils.isEmpty(list)) { + return; + } + for (MaterialInventoryOutDO out : list) { + MaterialInventoryDO materialInventory = materialInventoryService.selectMaterialInventoryByMaterialId(out.getMaterialId(), out.getBelongCompanyId()); + if(null == materialInventory){ + throw exception0(BAD_REQUEST.getCode(),out.getMaterialName()+"没有库存"); + } + + //当前库存不足,无法出库 + if(materialInventory.getCurrentNum() < out.getOutInventoryNum()){ + throw exception0(BAD_REQUEST.getCode(),"当前库存不足,无法出库"); + } + DeptRespDTO deptRespDTO = deptApi.getDept(getCompanyId()); + if(null == deptRespDTO){ + throw exception0(BAD_REQUEST.getCode(), "无效参数-登录人所属单位为空"); + } + out.setInventoryOutNo(System.currentTimeMillis()+ RandomUtil.randomInt(10, 100000)+""); + materialInventoryOutMapper.insert(out); + + //更新库存 + materialInventoryService.updateInVentoryByMaterialId(materialInventory, out.getOutInventoryNum()); + } + + } } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialname/MaterialNameService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialname/MaterialNameService.java new file mode 100644 index 0000000..d231f07 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialname/MaterialNameService.java @@ -0,0 +1,62 @@ +package com.zteits.urbanops.module.garden.service.materialname; + +import java.util.*; +import jakarta.validation.*; +import com.zteits.urbanops.module.garden.controller.admin.materialname.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.materialname.MaterialNameDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; + +/** + * 物料名称 Service 接口 + * + * @author 超级管理员 + */ +public interface MaterialNameService { + + /** + * 创建物料名称 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMaterialName(@Valid MaterialNameSaveReqVO createReqVO); + + /** + * 更新物料名称 + * + * @param updateReqVO 更新信息 + */ + void updateMaterialName(@Valid MaterialNameSaveReqVO updateReqVO); + + /** + * 删除物料名称 + * + * @param id 编号 + */ + void deleteMaterialName(Long id); + + /** + * 批量删除物料名称 + * + * @param ids 编号 + */ + void deleteMaterialNameListByIds(List ids); + + /** + * 获得物料名称 + * + * @param id 编号 + * @return 物料名称 + */ + MaterialNameDO getMaterialName(Long id); + + /** + * 获得物料名称分页 + * + * @param pageReqVO 分页查询 + * @return 物料名称分页 + */ + PageResult getMaterialNamePage(MaterialNamePageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialname/MaterialNameServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialname/MaterialNameServiceImpl.java new file mode 100644 index 0000000..da0525d --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialname/MaterialNameServiceImpl.java @@ -0,0 +1,128 @@ +package com.zteits.urbanops.module.garden.service.materialname; + +import cn.hutool.core.collection.CollUtil; +import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import com.zteits.urbanops.module.garden.controller.admin.materialname.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.materialname.MaterialNameDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; + +import com.zteits.urbanops.module.garden.dal.mysql.materialname.MaterialNameMapper; + +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; +import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; + +/** + * 物料名称 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MaterialNameServiceImpl implements MaterialNameService { + + @Resource + private MaterialNameMapper materialNameMapper; + + @Override + public Long createMaterialName(MaterialNameSaveReqVO createReqVO) { + // 校验物料名称是否重复 + validateMaterialNameUnique(null, createReqVO.getMaterialName()); + + // 生成物料名称ID:获取数据库中最大的值然后+1 + Long materialId = generateMaterialId(); + + // 插入 + MaterialNameDO materialName = BeanUtils.toBean(createReqVO, MaterialNameDO.class); + materialName.setMaterialId(materialId); + materialNameMapper.insert(materialName); + + // 返回 + return materialName.getId(); + } + + /** + * 生成物料名称ID + * 规则:获取数据库中最大的值然后+1 + */ + private Long generateMaterialId() { + // 获取所有物料名称 + List allMaterials = materialNameMapper.selectList(); + + long maxId = 0; + if (CollUtil.isNotEmpty(allMaterials)) { + // 遍历找到最大的ID值 + for (MaterialNameDO material : allMaterials) { + if (material.getMaterialId() != null && material.getMaterialId() > maxId) { + maxId = material.getMaterialId(); + } + } + } + + // 生成新ID:最大ID+1 + return maxId + 1; + } + + @Override + public void updateMaterialName(MaterialNameSaveReqVO updateReqVO) { + // 校验存在 + validateMaterialNameExists(updateReqVO.getId()); + // 校验物料名称是否重复 + validateMaterialNameUnique(updateReqVO.getId(), updateReqVO.getMaterialName()); + // 更新 + MaterialNameDO updateObj = BeanUtils.toBean(updateReqVO, MaterialNameDO.class); + materialNameMapper.updateById(updateObj); + } + + /** + * 校验物料名称是否唯一 + */ + private void validateMaterialNameUnique(Long id, String materialName) { + List existingMaterials = materialNameMapper.selectList(new LambdaQueryWrapperX() + .eq(MaterialNameDO::getMaterialName, materialName) + .neIfPresent(MaterialNameDO::getId, id)); + if (CollUtil.isNotEmpty(existingMaterials)) { + throw exception(MATERIAL_NAME_EXISTS); + } + } + + @Override + public void deleteMaterialName(Long id) { + // 校验存在 + validateMaterialNameExists(id); + // 删除 + materialNameMapper.deleteById(id); + } + + @Override + public void deleteMaterialNameListByIds(List ids) { + // 删除 + materialNameMapper.deleteByIds(ids); + } + + + private void validateMaterialNameExists(Long id) { + if (materialNameMapper.selectById(id) == null) { + throw exception(MATERIAL_NAME_NOT_EXISTS); + } + } + + @Override + public MaterialNameDO getMaterialName(Long id) { + return materialNameMapper.selectById(id); + } + + @Override + public PageResult getMaterialNamePage(MaterialNamePageReqVO pageReqVO) { + return materialNameMapper.selectPage(pageReqVO); + } + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialspecification/MaterialSpecificationService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialspecification/MaterialSpecificationService.java new file mode 100644 index 0000000..45a1852 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialspecification/MaterialSpecificationService.java @@ -0,0 +1,62 @@ +package com.zteits.urbanops.module.garden.service.materialspecification; + +import java.util.*; +import jakarta.validation.*; +import com.zteits.urbanops.module.garden.controller.admin.materialspecification.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.materialspecification.MaterialSpecificationDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; + +/** + * 物料规格 Service 接口 + * + * @author 超级管理员 + */ +public interface MaterialSpecificationService { + + /** + * 创建物料规格 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMaterialSpecification(@Valid MaterialSpecificationSaveReqVO createReqVO); + + /** + * 更新物料规格 + * + * @param updateReqVO 更新信息 + */ + void updateMaterialSpecification(@Valid MaterialSpecificationSaveReqVO updateReqVO); + + /** + * 删除物料规格 + * + * @param id 编号 + */ + void deleteMaterialSpecification(Long id); + + /** + * 批量删除物料规格 + * + * @param ids 编号 + */ + void deleteMaterialSpecificationListByIds(List ids); + + /** + * 获得物料规格 + * + * @param id 编号 + * @return 物料规格 + */ + MaterialSpecificationDO getMaterialSpecification(Long id); + + /** + * 获得物料规格分页 + * + * @param pageReqVO 分页查询 + * @return 物料规格分页 + */ + PageResult getMaterialSpecificationPage(MaterialSpecificationPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialspecification/MaterialSpecificationServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialspecification/MaterialSpecificationServiceImpl.java new file mode 100644 index 0000000..7e5ee42 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialspecification/MaterialSpecificationServiceImpl.java @@ -0,0 +1,135 @@ +package com.zteits.urbanops.module.garden.service.materialspecification; + +import cn.hutool.core.collection.CollUtil; +import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import com.zteits.urbanops.module.garden.controller.admin.materialspecification.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.materialspecification.MaterialSpecificationDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; + +import com.zteits.urbanops.module.garden.dal.mysql.materialspecification.MaterialSpecificationMapper; + +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; +import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; + +/** + * 物料规格 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MaterialSpecificationServiceImpl implements MaterialSpecificationService { + + @Resource + private MaterialSpecificationMapper materialSpecificationMapper; + + @Override + public Long createMaterialSpecification(MaterialSpecificationSaveReqVO createReqVO) { + // 校验规格名称是否重复 + validateSpecificationsUnique(null, createReqVO.getSpecifications()); + + // 生成规格编码:获取数据库中最大的值然后+1 + String specCode = generateSpecCode(); + + // 插入 + MaterialSpecificationDO materialSpecification = BeanUtils.toBean(createReqVO, MaterialSpecificationDO.class); + materialSpecification.setSpecCode(specCode); + materialSpecificationMapper.insert(materialSpecification); + + // 返回 + return materialSpecification.getId(); + } + + /** + * 生成规格编码 + * 规则:获取数据库中最大的值然后+1 + */ + private String generateSpecCode() { + // 获取所有物料规格 + List allSpecifications = materialSpecificationMapper.selectList(); + + int maxCode = 0; + if (CollUtil.isNotEmpty(allSpecifications)) { + // 遍历找到最大的编码 + for (MaterialSpecificationDO spec : allSpecifications) { + if (spec.getSpecCode() != null) { + try { + int code = Integer.parseInt(spec.getSpecCode()); + if (code > maxCode) { + maxCode = code; + } + } catch (NumberFormatException e) { + // 忽略非数字编码 + } + } + } + } + + // 生成新编码:最大编码+1 + return String.valueOf(maxCode + 1); + } + + @Override + public void updateMaterialSpecification(MaterialSpecificationSaveReqVO updateReqVO) { + // 校验存在 + validateMaterialSpecificationExists(updateReqVO.getId()); + // 校验规格名称是否重复 + validateSpecificationsUnique(updateReqVO.getId(), updateReqVO.getSpecifications()); + // 更新 + MaterialSpecificationDO updateObj = BeanUtils.toBean(updateReqVO, MaterialSpecificationDO.class); + materialSpecificationMapper.updateById(updateObj); + } + + /** + * 校验规格名称是否唯一 + */ + private void validateSpecificationsUnique(Long id, String specifications) { + List existingSpecifications = materialSpecificationMapper.selectList(new LambdaQueryWrapperX() + .eq(MaterialSpecificationDO::getSpecifications, specifications) + .neIfPresent(MaterialSpecificationDO::getId, id)); + if (CollUtil.isNotEmpty(existingSpecifications)) { + throw exception(MATERIAL_SPECIFICATION_NAME_EXISTS); + } + } + + @Override + public void deleteMaterialSpecification(Long id) { + // 校验存在 + validateMaterialSpecificationExists(id); + // 删除 + materialSpecificationMapper.deleteById(id); + } + + @Override + public void deleteMaterialSpecificationListByIds(List ids) { + // 删除 + materialSpecificationMapper.deleteByIds(ids); + } + + + private void validateMaterialSpecificationExists(Long id) { + if (materialSpecificationMapper.selectById(id) == null) { + throw exception(MATERIAL_SPECIFICATION_NOT_EXISTS); + } + } + + @Override + public MaterialSpecificationDO getMaterialSpecification(Long id) { + return materialSpecificationMapper.selectById(id); + } + + @Override + public PageResult getMaterialSpecificationPage(MaterialSpecificationPageReqVO pageReqVO) { + return materialSpecificationMapper.selectPage(pageReqVO); + } + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialunit/MaterialUnitService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialunit/MaterialUnitService.java new file mode 100644 index 0000000..9b814b3 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialunit/MaterialUnitService.java @@ -0,0 +1,62 @@ +package com.zteits.urbanops.module.garden.service.materialunit; + +import java.util.*; +import jakarta.validation.*; +import com.zteits.urbanops.module.garden.controller.admin.materialunit.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.materialunit.MaterialUnitDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; + +/** + * 物料单位 Service 接口 + * + * @author 超级管理员 + */ +public interface MaterialUnitService { + + /** + * 创建物料单位 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMaterialUnit(@Valid MaterialUnitSaveReqVO createReqVO); + + /** + * 更新物料单位 + * + * @param updateReqVO 更新信息 + */ + void updateMaterialUnit(@Valid MaterialUnitSaveReqVO updateReqVO); + + /** + * 删除物料单位 + * + * @param id 编号 + */ + void deleteMaterialUnit(Long id); + + /** + * 批量删除物料单位 + * + * @param ids 编号 + */ + void deleteMaterialUnitListByIds(List ids); + + /** + * 获得物料单位 + * + * @param id 编号 + * @return 物料单位 + */ + MaterialUnitDO getMaterialUnit(Long id); + + /** + * 获得物料单位分页 + * + * @param pageReqVO 分页查询 + * @return 物料单位分页 + */ + PageResult getMaterialUnitPage(MaterialUnitPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialunit/MaterialUnitServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialunit/MaterialUnitServiceImpl.java new file mode 100644 index 0000000..fffc4a4 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialunit/MaterialUnitServiceImpl.java @@ -0,0 +1,128 @@ +package com.zteits.urbanops.module.garden.service.materialunit; + +import cn.hutool.core.collection.CollUtil; +import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import com.zteits.urbanops.module.garden.controller.admin.materialunit.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.materialunit.MaterialUnitDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; + +import com.zteits.urbanops.module.garden.dal.mysql.materialunit.MaterialUnitMapper; + +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; +import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; + +/** + * 物料单位 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MaterialUnitServiceImpl implements MaterialUnitService { + + @Resource + private MaterialUnitMapper materialUnitMapper; + + @Override + public Long createMaterialUnit(MaterialUnitSaveReqVO createReqVO) { + // 校验单位名称是否重复 + validateUnitNameUnique(null, createReqVO.getUnitName()); + + // 生成单位ID:获取数据库中最大的值然后+1 + Long unitId = generateUnitId(); + + // 插入 + MaterialUnitDO materialUnit = BeanUtils.toBean(createReqVO, MaterialUnitDO.class); + materialUnit.setUnitId(unitId); + materialUnitMapper.insert(materialUnit); + + // 返回 + return materialUnit.getId(); + } + + /** + * 生成单位ID + * 规则:获取数据库中最大的值然后+1 + */ + private Long generateUnitId() { + // 获取所有物料单位 + List allUnits = materialUnitMapper.selectList(); + + long maxId = 0; + if (CollUtil.isNotEmpty(allUnits)) { + // 遍历找到最大的ID值 + for (MaterialUnitDO unit : allUnits) { + if (unit.getUnitId() != null && unit.getUnitId() > maxId) { + maxId = unit.getUnitId(); + } + } + } + + // 生成新ID:最大ID+1 + return maxId + 1; + } + + @Override + public void updateMaterialUnit(MaterialUnitSaveReqVO updateReqVO) { + // 校验存在 + validateMaterialUnitExists(updateReqVO.getId()); + // 校验单位名称是否重复 + validateUnitNameUnique(updateReqVO.getId(), updateReqVO.getUnitName()); + // 更新 + MaterialUnitDO updateObj = BeanUtils.toBean(updateReqVO, MaterialUnitDO.class); + materialUnitMapper.updateById(updateObj); + } + + /** + * 校验单位名称是否唯一 + */ + private void validateUnitNameUnique(Long id, String unitName) { + List existingUnits = materialUnitMapper.selectList(new LambdaQueryWrapperX() + .eq(MaterialUnitDO::getUnitName, unitName) + .neIfPresent(MaterialUnitDO::getId, id)); + if (CollUtil.isNotEmpty(existingUnits)) { + throw exception(MATERIAL_UNIT_NAME_EXISTS); + } + } + + @Override + public void deleteMaterialUnit(Long id) { + // 校验存在 + validateMaterialUnitExists(id); + // 删除 + materialUnitMapper.deleteById(id); + } + + @Override + public void deleteMaterialUnitListByIds(List ids) { + // 删除 + materialUnitMapper.deleteByIds(ids); + } + + + private void validateMaterialUnitExists(Long id) { + if (materialUnitMapper.selectById(id) == null) { + throw exception(MATERIAL_UNIT_NOT_EXISTS); + } + } + + @Override + public MaterialUnitDO getMaterialUnit(Long id) { + return materialUnitMapper.selectById(id); + } + + @Override + public PageResult getMaterialUnitPage(MaterialUnitPageReqVO pageReqVO) { + return materialUnitMapper.selectPage(pageReqVO); + } + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/mechanicaldepreciation/MechanicalDepreciationServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/mechanicaldepreciation/MechanicalDepreciationServiceImpl.java index 5ba7882..6763512 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/mechanicaldepreciation/MechanicalDepreciationServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/mechanicaldepreciation/MechanicalDepreciationServiceImpl.java @@ -211,7 +211,10 @@ public class MechanicalDepreciationServiceImpl implements MechanicalDepreciation depreciation.setAccumulatedDepreciation(accumulatedDepreciation); depreciation.setRemainingPeriods(totalMonths - (i + 1)); // 剩余期数=总月数-已计提月数 depreciation.setDepreciationPeriod(depreciationPeriods.get(i)); - + depreciation.setCreator("0"); + depreciation.setUpdater("0"); + depreciation.setCreateTime(LocalDateTime.now()); + depreciation.setUpdateTime(LocalDateTime.now()); toSaveList.add(depreciation); } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/personalcost/PersonalCostServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/personalcost/PersonalCostServiceImpl.java index 589bbbb..60b4e41 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/personalcost/PersonalCostServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/personalcost/PersonalCostServiceImpl.java @@ -22,6 +22,7 @@ import java.util.stream.Collectors; import static com.zteits.urbanops.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception0; +import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getCompanyId; import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.PERSONAL_COST_NOT_EXISTS; /** @@ -118,6 +119,9 @@ public class PersonalCostServiceImpl implements PersonalCostService { @Override public PageResult getPersonalCostPage(PersonalCostPageReqVO pageReqVO) { + if (getCompanyId() != 100) { + pageReqVO.setCompanyId(String.valueOf(getCompanyId())); + } return personalCostMapper.selectPage(pageReqVO); } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/planrate/PlanRateDetailService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/planrate/PlanRateDetailService.java index 86e4344..e0cc774 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/planrate/PlanRateDetailService.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/planrate/PlanRateDetailService.java @@ -65,6 +65,6 @@ public interface PlanRateDetailService { * @param levelId 道路等级 * @return 对象 */ - PlanRateDetailRespVO getPlanRateValue(String busiLine,Integer planTypeId,Integer levelId); + PlanRateDetailRespVO getPlanRateValue(String busiLine,Integer planTypeId,Integer levelId, Long companyId); } \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/planrate/PlanRateDetailServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/planrate/PlanRateDetailServiceImpl.java index 21160c6..c2725b7 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/planrate/PlanRateDetailServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/planrate/PlanRateDetailServiceImpl.java @@ -5,6 +5,7 @@ import com.zteits.urbanops.framework.common.biz.system.dict.dto.DictDataRespDTO; import com.zteits.urbanops.module.garden.dal.dataobject.planrate.PlanRateDO; import com.zteits.urbanops.module.garden.dal.mysql.planrate.PlanRateMapper; import com.zteits.urbanops.module.system.api.dict.DictDataApi; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Service; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -92,12 +93,8 @@ public class PlanRateDetailServiceImpl implements PlanRateDetailService { @Override - public PlanRateDetailRespVO getPlanRateValue(String busiLine, Integer planTypeId, Integer levelId) { - QueryWrapper sql = new QueryWrapper<>(); - sql.lambda().eq(PlanRateDetailDO::getBusiLine, busiLine) - .eq(PlanRateDetailDO::getPlanTypeId, planTypeId) - .eq(PlanRateDetailDO::getLevelId, levelId); - PlanRateDetailDO planRateDetailDO = planRateDetailMapper.selectOne(sql); + public PlanRateDetailRespVO getPlanRateValue(String busiLine, Integer planTypeId, Integer levelId, Long companyId) { + PlanRateDetailDO planRateDetailDO = planRateDetailMapper.getPlanRateDetail(busiLine, planTypeId, levelId, companyId); if (planRateDetailDO == null) { throw exception(PLAN_RATE_NOT_EXISTS); } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/planrate/PlanRateService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/planrate/PlanRateService.java index e020402..0d58fb6 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/planrate/PlanRateService.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/planrate/PlanRateService.java @@ -64,7 +64,7 @@ public interface PlanRateService { * @param pageReqVO 分页查询 * @return 计划频次分页 */ - PageResult getPlanRatePage(PlanRatePageReqVO pageReqVO); + PageResult getPlanRatePage(PlanRatePageReqVO pageReqVO); /** * 获得计划频次明细 diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/planrate/PlanRateServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/planrate/PlanRateServiceImpl.java index 2cb2e9c..8adcb72 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/planrate/PlanRateServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/planrate/PlanRateServiceImpl.java @@ -12,13 +12,17 @@ import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; import com.zteits.urbanops.module.garden.dal.dataobject.planrate.PlanRateDetailDO; import com.zteits.urbanops.module.garden.dal.mysql.planrate.PlanRateDetailMapper; import com.zteits.urbanops.module.garden.dal.mysql.planrate.PlanRateInterceptMapper; +import com.zteits.urbanops.module.system.api.dept.DeptApi; +import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; import org.springframework.stereotype.Service; import jakarta.annotation.Resource; +import org.springframework.util.CollectionUtils; import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.*; +import java.util.stream.Collectors; import com.zteits.urbanops.module.garden.controller.admin.planrate.vo.*; import com.zteits.urbanops.module.garden.dal.dataobject.planrate.PlanRateDO; @@ -51,12 +55,19 @@ public class PlanRateServiceImpl implements PlanRateService { @Resource private DictDataCommonApi dictDataCommonApi; + @Resource + private DeptApi deptApi; + @Transactional(rollbackFor = Exception.class) @Override public Long createPlanRate(PlanRateSaveReqVO createReqVO) { // 校验存在 - validatePlanRateExists(createReqVO.getPlanTypeId(), createReqVO.getBusiLine()); + //validatePlanRateExists(createReqVO.getPlanTypeId(), createReqVO.getBusiLine()); LocalDateTime now = LocalDateTime.now(); + Long companyId = SecurityFrameworkUtils.getCompanyId(); + if(createReqVO.getCompanyId() != null){ + companyId = createReqVO.getCompanyId(); + } String userName = SecurityFrameworkUtils.getLoginUserId() + ""; String rateNo = DateUtil.format(new Date(), "yyyyMMddHHmmssSSS") + RandomUtil.randomInt(1000); PlanRateDO planRate = new PlanRateDO(); @@ -65,6 +76,7 @@ public class PlanRateServiceImpl implements PlanRateService { planRate.setBusiLine(createReqVO.getBusiLine()); planRate.setPlanTypeId(createReqVO.getPlanTypeId()); planRate.setType(createReqVO.getType()); + planRate.setCompanyId(companyId); planRate.setCreator(userName); planRate.setCreateTime(now); planRate.setUpdater(userName); @@ -86,7 +98,7 @@ public class PlanRateServiceImpl implements PlanRateService { detailDO.setUpdater(userName); detailDO.setUpdateTime(now); list.add(detailDO); - validatePlanRateDetailExists(createReqVO.getBusiLine(), createReqVO.getPlanTypeId(), detail.getLevelId()); + //validatePlanRateDetailExists(createReqVO.getBusiLine(), createReqVO.getPlanTypeId(), detail.getLevelId()); }); /*2.插入频次明细*/ planRateDetailMapper.insertBatch(list); @@ -124,7 +136,7 @@ public class PlanRateServiceImpl implements PlanRateService { detailDO.setUpdater(userName); detailDO.setUpdateTime(now); list.add(detailDO); - validatePlanRateDetailExists(updateReqVO.getBusiLine(), updateReqVO.getPlanTypeId(), detail.getLevelId()); + //validatePlanRateDetailExists(updateReqVO.getBusiLine(), updateReqVO.getPlanTypeId(), detail.getLevelId()); }); /*3.插入频次明细*/ planRateDetailMapper.insertBatch(list); @@ -181,8 +193,28 @@ public class PlanRateServiceImpl implements PlanRateService { } @Override - public PageResult getPlanRatePage(PlanRatePageReqVO pageReqVO) { - return planRateInterceptMapper.selectForPage(pageReqVO); + public PageResult getPlanRatePage(PlanRatePageReqVO pageReqVO) { + Long companyId = SecurityFrameworkUtils.getCompanyId(); + if(companyId == 100L){ + companyId = null; + } + pageReqVO.setCompanyId(companyId); + PageResult pageResult = planRateInterceptMapper.selectForPage(pageReqVO); + if(CollectionUtils.isEmpty(pageResult.getList())){ + return PageResult.empty(); + } + PageResult result = BeanUtils.toBean(pageResult, PlanRateRespVO.class); + List companyIds = result.getList().stream().map(PlanRateRespVO::getCompanyId).collect(Collectors.toList()); + Map deptMap = deptApi.getDeptMap(companyIds); + result.getList().forEach(planRate -> { + DeptRespDTO deptRespDTO = deptMap.get(planRate.getCompanyId()); + if(deptRespDTO !=null){ + planRate.setCompanyName(deptRespDTO.getName()); + } + + }); + + return result; } @Override diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/problemtype/GardenProblemTypeService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/problemtype/GardenProblemTypeService.java new file mode 100644 index 0000000..3c3bcc7 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/problemtype/GardenProblemTypeService.java @@ -0,0 +1,80 @@ +package com.zteits.urbanops.module.garden.service.problemtype; + +import com.zteits.urbanops.module.garden.controller.admin.problemtype.vo.ProblemTypePageReqVO; +import com.zteits.urbanops.module.garden.controller.admin.problemtype.vo.ProblemTypeSaveReqVO; +import com.zteits.urbanops.module.garden.dal.dataobject.problemtype.GardenProblemTypeDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * 问题类型配置 Service 接口 + * + * @author 超级管理员 + */ +public interface GardenProblemTypeService { + + /** + * 创建问题类型 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createProblemType(@Valid ProblemTypeSaveReqVO createReqVO); + + /** + * 更新问题类型 + * + * @param updateReqVO 更新信息 + */ + void updateProblemType(@Valid ProblemTypeSaveReqVO updateReqVO); + + /** + * 删除问题类型 + * + * @param id 编号 + */ + void deleteProblemType(Long id); + + /** + * 获得问题类型 + * + * @param id 编号 + * @return 问题类型 + */ + GardenProblemTypeDO getProblemType(Long id); + + /** + * 获得问题类型分页 + * + * @param pageReqVO 分页查询 + * @return 问题类型分页 + */ + PageResult getProblemTypePage(ProblemTypePageReqVO pageReqVO); + + /** + * 根据父级编码和层级查询子类型列表 + * + * @param parentCode 父级编码 + * @param level 层级 + * @return 子类型列表 + */ + List getProblemTypeByParentCode(String parentCode, Integer level); + + /** + * 根据父级编码生成下一个类型编码 + * + * @param parentCode 父级编码 + * @return 新编码 + */ + String generateNextCode(String parentCode); + + /** + * 从字典表同步一级类型到 garden_problem_type + * + * @return 同步数量 + */ + int syncLevelOneFromDict(); + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/problemtype/GardenProblemTypeServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/problemtype/GardenProblemTypeServiceImpl.java new file mode 100644 index 0000000..89e4928 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/problemtype/GardenProblemTypeServiceImpl.java @@ -0,0 +1,122 @@ +package com.zteits.urbanops.module.garden.service.problemtype; + +import com.zteits.urbanops.framework.common.enums.CommonStatusEnum; +import com.zteits.urbanops.module.garden.controller.admin.problemtype.vo.ProblemTypePageReqVO; +import com.zteits.urbanops.module.garden.controller.admin.problemtype.vo.ProblemTypeSaveReqVO; +import com.zteits.urbanops.module.system.dal.dataobject.dict.DictDataDO; +import com.zteits.urbanops.module.system.service.dict.DictDataService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; +import jakarta.annotation.Resource; + +import java.util.List; + +import com.zteits.urbanops.module.garden.dal.dataobject.problemtype.GardenProblemTypeDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; + +import com.zteits.urbanops.module.garden.dal.mysql.problemtype.GardenProblemTypeMapper; + +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; + +/** + * 问题类型配置 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class GardenProblemTypeServiceImpl implements GardenProblemTypeService { + + @Resource + private GardenProblemTypeMapper gardenProblemTypeMapper; + + @Resource + private DictDataService dictDataService; + + @Override + public Long createProblemType(ProblemTypeSaveReqVO createReqVO) { + // 校验编码唯一性 + validateTypeCodeUnique(createReqVO.getTypeCode(), null); + // 插入 + GardenProblemTypeDO problemType = BeanUtils.toBean(createReqVO, GardenProblemTypeDO.class); + gardenProblemTypeMapper.insert(problemType); + return problemType.getId(); + } + + @Override + public void updateProblemType(ProblemTypeSaveReqVO updateReqVO) { + // 校验存在 + validateProblemTypeExists(updateReqVO.getId()); + // 校验编码唯一性(排除自身) + validateTypeCodeUnique(updateReqVO.getTypeCode(), updateReqVO.getId()); + // 更新 + GardenProblemTypeDO updateObj = BeanUtils.toBean(updateReqVO, GardenProblemTypeDO.class); + gardenProblemTypeMapper.updateById(updateObj); + } + + @Override + public void deleteProblemType(Long id) { + // 校验存在 + validateProblemTypeExists(id); + // 删除 + gardenProblemTypeMapper.deleteById(id); + } + + private void validateProblemTypeExists(Long id) { + if (gardenProblemTypeMapper.selectById(id) == null) { + throw exception(PROBLEM_TYPE_NOT_EXISTS); + } + } + + private void validateTypeCodeUnique(String typeCode, Long excludeId) { + GardenProblemTypeDO exist = gardenProblemTypeMapper.selectByTypeCode(typeCode); + if (exist != null && (excludeId == null || !exist.getId().equals(excludeId))) { + throw exception(PROBLEM_TYPE_CODE_EXISTS); + } + } + + @Override + public GardenProblemTypeDO getProblemType(Long id) { + return gardenProblemTypeMapper.selectById(id); + } + + @Override + public PageResult getProblemTypePage(ProblemTypePageReqVO pageReqVO) { + return gardenProblemTypeMapper.selectPage(pageReqVO); + } + + @Override + public List getProblemTypeByParentCode(String parentCode, Integer level) { + return gardenProblemTypeMapper.selectByParentCodeAndLevel(parentCode, level); + } + + @Override + public String generateNextCode(String parentCode) { + return gardenProblemTypeMapper.generateNextCode(parentCode); + } + + @Override + public int syncLevelOneFromDict() { + List dictList = dictDataService.getDictDataList( + CommonStatusEnum.ENABLE.getStatus(), "business_line"); + int count = 0; + for (DictDataDO dict : dictList) { + GardenProblemTypeDO exist = gardenProblemTypeMapper.selectByTypeCode(dict.getValue()); + if (exist == null) { + GardenProblemTypeDO entity = new GardenProblemTypeDO(); + entity.setTypeCode(dict.getValue()); + entity.setTypeName(dict.getLabel()); + entity.setLevel(1); + entity.setParentCode(null); + entity.setSort(dict.getSort()); + entity.setStatus(CommonStatusEnum.ENABLE.getStatus()); + gardenProblemTypeMapper.insert(entity); + count++; + } + } + return count; + } + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/road/RoadServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/road/RoadServiceImpl.java index 4d07a79..f5d27ec 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/road/RoadServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/road/RoadServiceImpl.java @@ -159,13 +159,24 @@ public class RoadServiceImpl implements RoadService { QueryWrapper sql = new QueryWrapper<>(); sql.select("id", "road_name", "level_id","company_id","dept_id"); - sql.lambda().eq(RoadDO::getCompanyId, reqVO.getCompanyId()) - .eq(RoadDO::getLevelId, reqVO.getLevelId()) - .eq(RoadDO::getBusiLine, reqVO.getBusiLine()) - .likeRight(StringUtils.isNotEmpty(reqVO.getRoadName()), RoadDO::getRoadName, reqVO.getRoadName()); + if (reqVO.getCompanyId() != null) { + sql.lambda().eq(RoadDO::getCompanyId, reqVO.getCompanyId()); + } + if (reqVO.getDeptId() != null) { + sql.lambda().eq(RoadDO::getDeptId, reqVO.getDeptId()); + } + if (reqVO.getLevelId() != null) { + sql.lambda().eq(RoadDO::getLevelId, reqVO.getLevelId()); + } + if (reqVO.getBusiLine() != null) { + sql.lambda().eq(RoadDO::getBusiLine, reqVO.getBusiLine()); + } + if (StringUtils.isNotEmpty(reqVO.getRoadName())) { + sql.lambda().like(RoadDO::getRoadName, reqVO.getRoadName()); + } return roadMapper.selectList(sql); } -} \ No newline at end of file +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/tree/TreeServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/tree/TreeServiceImpl.java index bf4d96c..9cf450a 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/tree/TreeServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/tree/TreeServiceImpl.java @@ -11,6 +11,7 @@ import com.zteits.urbanops.module.garden.dal.mysql.treechangelog.TreeChangeLogMa import com.zteits.urbanops.module.garden.service.road.RoadService; import com.zteits.urbanops.module.system.dal.dataobject.dept.DeptDO; import com.zteits.urbanops.module.system.dal.mysql.dept.DeptMapper; +import com.zteits.urbanops.module.system.service.dept.DeptService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; @@ -61,7 +62,7 @@ public class TreeServiceImpl implements TreeService { private RedisTemplate redisTemplate; @Resource - private DeptMapper deptMapper; + private DeptService deptService; public static final String CACHE_REPEAT_KEY = "gardenTree:repeat:"; @@ -178,80 +179,28 @@ public class TreeServiceImpl implements TreeService { @Override public List getCompanyDeptRoadTreeData(TreeVO tree) { -// List sysDepts = deptMapper.selectList(); + List companies = deptService.getSubDeptListAll(); + List companyDeptRoadVOS = treeMapper.selectCompanyDeptRoadTreeData(tree); + if (!CollectionUtils.isEmpty(companyDeptRoadVOS) && !CollectionUtils.isEmpty(companies)) { + Map companyNameMap = companies.stream() + .collect(Collectors.toMap(DeptDO::getId, DeptDO::getName, (a, b) -> a)); + companyDeptRoadVOS.stream() + .filter(Objects::nonNull) + .forEach(vo -> { + Long cid = vo.getCompanyId(); + if (cid == null) { + return; + } + String name = companyNameMap.get(cid); + if (StringUtils.hasText(name)) { + vo.setCompanyName(name); + } + }); + } -// // 按公司分组所有部门 -// Map> companyDeptsMap = sysDepts.stream() -// .filter(d -> d.getParentId() != null) -// .collect(Collectors.groupingBy(DeptDO::getParentId)); -// -// // 过滤出叶子部门(没有子部门的部门) -// Map> companyLeafDeptsMap = new HashMap<>(); -// for (Map.Entry> entry : companyDeptsMap.entrySet()) { -// Long companyId = entry.getKey(); -// List depts = entry.getValue(); -// -// // 构建部门ID到部门的映射 -// Map deptMap = depts.stream() -// .collect(Collectors.toMap(DeptDO::getId, d -> d)); -// -// // 找出叶子部门(其parentId不在deptMap中的部门,或者其parentId为0的部门) -// List leafDepts = depts.stream() -// .filter(d -> d.getParentId() == 0 || !deptMap.containsKey(d.getParentId())) -// .collect(Collectors.toList()); -// -// companyLeafDeptsMap.put(companyId, leafDepts); -// } -// -// // 建立现有结果的映射: 公司ID -> CompanyDeptRoadVO -// Map existingCompanyMap = companyDeptRoadVOS.stream() -// .collect(Collectors.toMap( -// CompanyDeptRoadVO::getCompanyId, -// vo -> vo, -// (existing, replacement) -> existing -// )); -// -// // 遍历所有公司,补充缺失的公司和部门 -// for (Map.Entry> entry : companyLeafDeptsMap.entrySet()) { -// Long companyId = entry.getKey(); -// List depts = entry.getValue(); -// -// CompanyDeptRoadVO companyVO; -// if (!existingCompanyMap.containsKey(companyId)) { -// // 如果公司不存在,创建新的公司对象 -// companyVO = new CompanyDeptRoadVO(); -// companyVO.setCompanyId(companyId); -// companyVO.setCompanyName(DictFrameworkUtils.parseDictDataValue("belongCompanyId", companyId + "")); -// companyVO.setDepts(new ArrayList<>()); -// companyDeptRoadVOS.add(companyVO); -// } else { -// companyVO = existingCompanyMap.get(companyId); -// } -// -// // 建立该公司下已存在的部门映射: 部门ID -> DeptVO -// Map existingDeptMap = companyVO.getDepts().stream() -// .collect(Collectors.toMap( -// deptVO -> Long.valueOf(deptVO.getDeptId()), -// deptVO -> deptVO, -// (existing, replacement) -> existing -// )); -// -// // 补充缺失的部门(仅叶子部门) -// for (DeptDO sysDept : depts) { -// Long deptId = sysDept.getId(); -// if (!existingDeptMap.containsKey(deptId)) { -// // 创建缺失的部门对象 -// CompanyDeptRoadVO.DeptVO missingDept = new CompanyDeptRoadVO.DeptVO(); -// missingDept.setDeptId(deptId); -// missingDept.setDeptName(sysDept.getName()); -// missingDept.setRoads(new ArrayList<>()); -// companyVO.getDepts().add(missingDept); -// } -// } -// } return companyDeptRoadVOS; } @@ -269,4 +218,4 @@ public class TreeServiceImpl implements TreeService { return new PageResult<>(roadTreeVOS, treePage.getTotal()); } -} \ No newline at end of file +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraladd/UnitIntegralAddService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraladd/UnitIntegralAddService.java new file mode 100644 index 0000000..9aa78ca --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraladd/UnitIntegralAddService.java @@ -0,0 +1,62 @@ +package com.zteits.urbanops.module.garden.service.unitintegraladd; + +import java.util.*; +import jakarta.validation.*; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraladd.UnitIntegralAddDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; + +/** + * 积分增加记录 Service 接口 + * + * @author 超级管理员 + */ +public interface UnitIntegralAddService { + + /** + * 创建积分增加记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUnitIntegralAdd(@Valid UnitIntegralAddSaveReqVO createReqVO); + + /** + * 更新积分增加记录 + * + * @param updateReqVO 更新信息 + */ + void updateUnitIntegralAdd(@Valid UnitIntegralAddSaveReqVO updateReqVO); + + /** + * 删除积分增加记录 + * + * @param id 编号 + */ + void deleteUnitIntegralAdd(Long id); + + /** + * 批量删除积分增加记录 + * + * @param ids 编号 + */ + void deleteUnitIntegralAddListByIds(List ids); + + /** + * 获得积分增加记录 + * + * @param id 编号 + * @return 积分增加记录 + */ + UnitIntegralAddDO getUnitIntegralAdd(Long id); + + /** + * 获得积分增加记录分页 + * + * @param pageReqVO 分页查询 + * @return 积分增加记录分页 + */ + PageResult getUnitIntegralAddPage(UnitIntegralAddPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraladd/UnitIntegralAddServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraladd/UnitIntegralAddServiceImpl.java new file mode 100644 index 0000000..49862d6 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraladd/UnitIntegralAddServiceImpl.java @@ -0,0 +1,85 @@ +package com.zteits.urbanops.module.garden.service.unitintegraladd; + +import cn.hutool.core.collection.CollUtil; +import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraladd.UnitIntegralAddDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; + +import com.zteits.urbanops.module.garden.dal.mysql.unitintegraladd.UnitIntegralAddMapper; + +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.diffList; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; + +/** + * 积分增加记录 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class UnitIntegralAddServiceImpl implements UnitIntegralAddService { + + @Resource + private UnitIntegralAddMapper unitIntegralAddMapper; + + @Override + public Long createUnitIntegralAdd(UnitIntegralAddSaveReqVO createReqVO) { + // 插入 + UnitIntegralAddDO unitIntegralAdd = BeanUtils.toBean(createReqVO, UnitIntegralAddDO.class); + unitIntegralAddMapper.insert(unitIntegralAdd); + + // 返回 + return unitIntegralAdd.getId(); + } + + @Override + public void updateUnitIntegralAdd(UnitIntegralAddSaveReqVO updateReqVO) { + // 校验存在 + validateUnitIntegralAddExists(updateReqVO.getId()); + // 更新 + UnitIntegralAddDO updateObj = BeanUtils.toBean(updateReqVO, UnitIntegralAddDO.class); + unitIntegralAddMapper.updateById(updateObj); + } + + @Override + public void deleteUnitIntegralAdd(Long id) { + // 校验存在 + validateUnitIntegralAddExists(id); + // 删除 + unitIntegralAddMapper.deleteById(id); + } + + @Override + public void deleteUnitIntegralAddListByIds(List ids) { + // 删除 + unitIntegralAddMapper.deleteByIds(ids); + } + + + private void validateUnitIntegralAddExists(Long id) { + if (unitIntegralAddMapper.selectById(id) == null) { + throw exception(UNIT_INTEGRAL_ADD_NOT_EXISTS); + } + } + + @Override + public UnitIntegralAddDO getUnitIntegralAdd(Long id) { + return unitIntegralAddMapper.selectById(id); + } + + @Override + public PageResult getUnitIntegralAddPage(UnitIntegralAddPageReqVO pageReqVO) { + return unitIntegralAddMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegralsub/UnitIntegralSubService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegralsub/UnitIntegralSubService.java new file mode 100644 index 0000000..4044baf --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegralsub/UnitIntegralSubService.java @@ -0,0 +1,62 @@ +package com.zteits.urbanops.module.garden.service.unitintegralsub; + +import java.util.*; +import jakarta.validation.*; +import com.zteits.urbanops.module.garden.controller.admin.unitintegralsub.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegralsub.UnitIntegralSubDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; + +/** + * 积分扣减记录 Service 接口 + * + * @author 超级管理员 + */ +public interface UnitIntegralSubService { + + /** + * 创建积分扣减记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUnitIntegralSub(@Valid UnitIntegralSubSaveReqVO createReqVO); + + /** + * 更新积分扣减记录 + * + * @param updateReqVO 更新信息 + */ + void updateUnitIntegralSub(@Valid UnitIntegralSubSaveReqVO updateReqVO); + + /** + * 删除积分扣减记录 + * + * @param id 编号 + */ + void deleteUnitIntegralSub(Long id); + + /** + * 批量删除积分扣减记录 + * + * @param ids 编号 + */ + void deleteUnitIntegralSubListByIds(List ids); + + /** + * 获得积分扣减记录 + * + * @param id 编号 + * @return 积分扣减记录 + */ + UnitIntegralSubDO getUnitIntegralSub(Long id); + + /** + * 获得积分扣减记录分页 + * + * @param pageReqVO 分页查询 + * @return 积分扣减记录分页 + */ + PageResult getUnitIntegralSubPage(UnitIntegralSubPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegralsub/UnitIntegralSubServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegralsub/UnitIntegralSubServiceImpl.java new file mode 100644 index 0000000..ab4b134 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegralsub/UnitIntegralSubServiceImpl.java @@ -0,0 +1,85 @@ +package com.zteits.urbanops.module.garden.service.unitintegralsub; + +import cn.hutool.core.collection.CollUtil; +import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import com.zteits.urbanops.module.garden.controller.admin.unitintegralsub.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegralsub.UnitIntegralSubDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; + +import com.zteits.urbanops.module.garden.dal.mysql.unitintegralsub.UnitIntegralSubMapper; + +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.diffList; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; + +/** + * 积分扣减记录 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class UnitIntegralSubServiceImpl implements UnitIntegralSubService { + + @Resource + private UnitIntegralSubMapper unitIntegralSubMapper; + + @Override + public Long createUnitIntegralSub(UnitIntegralSubSaveReqVO createReqVO) { + // 插入 + UnitIntegralSubDO unitIntegralSub = BeanUtils.toBean(createReqVO, UnitIntegralSubDO.class); + unitIntegralSubMapper.insert(unitIntegralSub); + + // 返回 + return unitIntegralSub.getId(); + } + + @Override + public void updateUnitIntegralSub(UnitIntegralSubSaveReqVO updateReqVO) { + // 校验存在 + validateUnitIntegralSubExists(updateReqVO.getId()); + // 更新 + UnitIntegralSubDO updateObj = BeanUtils.toBean(updateReqVO, UnitIntegralSubDO.class); + unitIntegralSubMapper.updateById(updateObj); + } + + @Override + public void deleteUnitIntegralSub(Long id) { + // 校验存在 + validateUnitIntegralSubExists(id); + // 删除 + unitIntegralSubMapper.deleteById(id); + } + + @Override + public void deleteUnitIntegralSubListByIds(List ids) { + // 删除 + unitIntegralSubMapper.deleteByIds(ids); + } + + + private void validateUnitIntegralSubExists(Long id) { + if (unitIntegralSubMapper.selectById(id) == null) { + throw exception(UNIT_INTEGRAL_SUB_NOT_EXISTS); + } + } + + @Override + public UnitIntegralSubDO getUnitIntegralSub(Long id) { + return unitIntegralSubMapper.selectById(id); + } + + @Override + public PageResult getUnitIntegralSubPage(UnitIntegralSubPageReqVO pageReqVO) { + return unitIntegralSubMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralService.java new file mode 100644 index 0000000..3f28a3b --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralService.java @@ -0,0 +1,74 @@ +package com.zteits.urbanops.module.garden.service.unitintegraltotal; + +import com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo.UnitIntegralAddRespVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.UnitIntegralRespVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.UnitIntegralSaveReqVO; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraladd.UnitIntegralAddDO; +import jakarta.validation.Valid; + +import java.util.List; +import java.util.Map; + +/** + * @Classname UnitIntegralService + * @Description 单位积分操作 + * @Date 2026/3/6 12:17 + * @Created by wangqian + */ +public interface UnitIntegralService { + + /** + * @Author wangqian + * @Description 单位积分表初始化 + * @Date 2026/3/7 11:10 + * @Param unitType + * @Param unitId + * @param unitName + * @Return void + */ + void createUnitIntegral(String unitType, String unitId, String unitName); + + /** + * @Author wangqian + * @Description 根据关联表id查询单位积分 + * @Date 2026/3/8 11:34 + * @Param relatedTaskId + * @Return java.util.List + */ + List queryIntegralByRelatedTaskIds(@Valid List relatedTaskIds); + + /** + * @Author wangqian + * @Description 获取最后一条增加的积分 + * @Date 2026/3/8 13:39 + */ + UnitIntegralAddRespVO queryLastIntegralByRelatedTaskId(@Valid Long relatedTaskId); + + /** + * @Author wangqian + * @Description 增加积分 + * @Date 2026/3/6 12:20 + * @Param updateReqVO + * @Return void + */ + void addUnitIntegral(@Valid UnitIntegralSaveReqVO reqVO); + + + /** + * @Author wangqian + * @Description 扣减积分 + * @Date 2026/3/6 12:20 + * @Param updateReqVO + * @Return void + */ + void subUnitIntegral(@Valid UnitIntegralSaveReqVO reqVO); + + + + /** + * 批量删除单位积分累计 + * + */ + void resetUnitIntegralTotal(); + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralServiceImpl.java new file mode 100644 index 0000000..7e70d96 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralServiceImpl.java @@ -0,0 +1,396 @@ +package com.zteits.urbanops.module.garden.service.unitintegraltotal; + +import cn.hutool.extra.spring.SpringUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo.UnitIntegralAddRespVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo.UnitIntegralAddSaveReqVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegralsub.vo.UnitIntegralSubSaveReqVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.UnitIntegralRespVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.UnitIntegralSaveReqVO; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraladd.UnitIntegralAddDO; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegralsub.UnitIntegralSubDO; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraltotal.UnitIntegralTotalDO; +import com.zteits.urbanops.module.garden.dal.mysql.unitintegraladd.UnitIntegralAddMapper; +import com.zteits.urbanops.module.garden.dal.mysql.unitintegralsub.UnitIntegralSubMapper; +import com.zteits.urbanops.module.garden.dal.mysql.unitintegraltotal.UnitIntegralTotalMapper; +import com.zteits.urbanops.module.garden.dal.redis.IntegralLockCoreRedisDAO; +import com.zteits.urbanops.module.garden.service.unitintegraladd.UnitIntegralAddService; +import com.zteits.urbanops.module.garden.service.unitintegralsub.UnitIntegralSubService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import static com.zteits.urbanops.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; +import static com.zteits.urbanops.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR; +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception0; +import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * @Classname UnitIntegralServiceImpl + * @Description 单位积分操作 + * @Date 2026/3/6 12:39 + * @Created by wangqian + */ +@Service +@Slf4j +public class UnitIntegralServiceImpl implements UnitIntegralService{ + + @Resource + private UnitIntegralTotalMapper unitIntegralTotalMapper; + @Resource + private UnitIntegralAddMapper unitIntegralAddMapper; + + @Resource + private UnitIntegralSubService unitIntegralSubService; + + @Resource + private UnitIntegralAddService unitIntegralAddService; + @Resource + private RedissonClient redissonClient; + @Resource + private IntegralLockCoreRedisDAO integralLockCoreRedisDAO; + @Resource + private UnitIntegralSubMapper unitIntegralSubMapper; + // 锁前缀(区分加/减积分锁) + private static final String LOCK_PREFIX_INTEGRAL = "integral:"; + + // 统一构建锁Key + private String buildLockKey(String unitId, String statDate) { + return LOCK_PREFIX_INTEGRAL + unitId + ":" + statDate; + } + /** + * 初始化积分表 + */ + @Override + public void createUnitIntegral(String unitType, String unitId, String unitName) { + String statDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy")); + // 1. 参数校验 + if (StringUtils.isEmpty(unitType)) { + throw exception0(BAD_REQUEST.getCode(),"单位类型不能为空"); + } + if (StringUtils.isEmpty(unitId)) { + throw exception0(BAD_REQUEST.getCode(),"单位编码不能为空"); + } + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(UnitIntegralTotalDO.class) + .eq(UnitIntegralTotalDO::getUnitType, unitType) + .eq(UnitIntegralTotalDO::getStatDate, statDate) + .eq(UnitIntegralTotalDO::getUnitId, unitId) + .eq(UnitIntegralTotalDO::getDeleted, 0); + UnitIntegralTotalDO unitIntegralTotalDO = unitIntegralTotalMapper.selectOne(queryWrapper); + if (unitIntegralTotalDO == null) { + UnitIntegralTotalDO saveDO = new UnitIntegralTotalDO(); + saveDO.setStatDate(statDate); + saveDO.setTotalAdd(0); // 累计增加 = 本次增加 + saveDO.setTotalSub(0); // 初始扣减为0 + saveDO.setTotalIntegral(0); // 初始总积分 = 本次增加 + saveDO.setUnitType(unitType); + saveDO.setUnitId(unitId); + if (StringUtils.isEmpty(unitName)) { + //数据库查询补全 + } else { + saveDO.setUnitName(unitName); + } + unitIntegralTotalMapper.insert(saveDO); + } + } + + @Override + public List queryIntegralByRelatedTaskIds(List relatedTaskIds) { + return unitIntegralTotalMapper.queryIntegralByRelatedTaskIds(relatedTaskIds); + } + + @Override + public UnitIntegralAddRespVO queryLastIntegralByRelatedTaskId(Long relatedTaskId) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(UnitIntegralAddDO.class) + .eq(UnitIntegralAddDO::getRelatedTaskId, relatedTaskId) + .eq(UnitIntegralAddDO::getDeleted, 0) + .orderByDesc(UnitIntegralAddDO::getId) + .last("LIMIT 1"); // 取第一条(MyBatis-Plus通用写法,兼容多数数据库) + UnitIntegralAddDO unitIntegralAddDO = unitIntegralAddMapper.selectOne(queryWrapper); + if (unitIntegralAddDO == null) { + return null; + } + return BeanUtils.toBean(unitIntegralAddDO, UnitIntegralAddRespVO.class); + } + + /** + * 增加单位积分(核心方法) + * @param reqVO 积分增加请求(注意:totalIntegral 为「本次增加积分」) + */ + @Override + public void addUnitIntegral(UnitIntegralSaveReqVO reqVO){ + // 1. 参数校验 + if (reqVO == null) { + throw exception0(BAD_REQUEST.getCode(), "积分增加请求参数不能为空"); + } + if (reqVO.getTotalIntegral() <= 0) { + throw exception0(BAD_REQUEST.getCode(), "本次增加积分必须为正数"); + } + if (ObjectUtils.isEmpty(reqVO.getUnitId()) || ObjectUtils.isEmpty(reqVO.getStatDate())) { + throw exception0(BAD_REQUEST.getCode(), "单位ID和统计日期不能为空"); + } + + // 2. 调用通用锁工具类,加锁执行核心逻辑(参考executeNotify的Runnable风格) + integralLockCoreRedisDAO.lock( + reqVO.getUnitId(), + reqVO.getStatDate(), + IntegralLockCoreRedisDAO.INTEGRAL_LOCK_TIMEOUT_MILLIS, + () -> { + // 3. 锁内二次校验(关键!避免分布式锁并发问题,参考executeNotify的dbTask校验) + // 场景:两个线程同时通过前置校验,第一个执行完后,第二个拿到锁仍会执行,需校验数据库状态 + LambdaQueryWrapper checkWrapper = Wrappers.lambdaQuery(UnitIntegralTotalDO.class) + .eq(UnitIntegralTotalDO::getUnitId, reqVO.getUnitId()) + .eq(UnitIntegralTotalDO::getStatDate, reqVO.getStatDate()) + .eq(UnitIntegralTotalDO::getUnitType, reqVO.getUnitType()) + .eq(UnitIntegralTotalDO::getDeleted, 0); + UnitIntegralTotalDO dbTotalDO = unitIntegralTotalMapper.selectOne(checkWrapper); + + // 4. 调用带事务的核心执行方法(自注入避免事务失效) + getSelf().executeAddUnitIntegral0(reqVO, dbTotalDO); + } + ); + } + /** + * 积分增加核心执行方法(带事务,内部调用) + */ + @Transactional(rollbackFor = Exception.class) + public void executeAddUnitIntegral0(UnitIntegralSaveReqVO reqVO, UnitIntegralTotalDO unitIntegralTotalDO) { + int beforeIntegral = 0; // 本次增加前的累计增加积分 + int afterIntegral = 0; // 本次增加后的累计增加积分 + int currentAdd = reqVO.getTotalIntegral(); // 本次增加积分(重命名,语义更准) + + // 5. 新增/更新总积分表(核心逻辑) + if (unitIntegralTotalDO != null) { + // 5.1 已有记录:更新积分 + beforeIntegral = unitIntegralTotalDO.getTotalAdd(); + int newTotalAdd = beforeIntegral + currentAdd; + // 更新累计增加积分 + 当前总积分(累计增加 - 累计扣减) + unitIntegralTotalDO.setTotalAdd(newTotalAdd); + unitIntegralTotalDO.setTotalIntegral(newTotalAdd - unitIntegralTotalDO.getTotalSub()); + unitIntegralTotalDO.setUpdateTime(LocalDateTime.now()); + unitIntegralTotalDO.setUpdater(String.valueOf(getLoginUserId())); + unitIntegralTotalMapper.updateById(unitIntegralTotalDO); + afterIntegral = newTotalAdd; + + log.info("更新单位积分成功,单位ID:{},统计日期:{},本次增加:{},累计增加:{}", + reqVO.getUnitId(), reqVO.getStatDate(), currentAdd, newTotalAdd); + } else { + // 5.2 无记录:插入新记录 + UnitIntegralTotalDO saveDO = new UnitIntegralTotalDO(); + BeanUtils.copyProperties(reqVO, saveDO); + saveDO.setTotalAdd(currentAdd); // 累计增加 = 本次增加 + saveDO.setTotalSub(0); // 初始扣减为0 + saveDO.setTotalIntegral(currentAdd); // 初始总积分 = 本次增加 + unitIntegralTotalMapper.insert(saveDO); + afterIntegral = currentAdd; + + log.info("新增单位积分成功,单位ID:{},统计日期:{},本次增加:{}", + reqVO.getUnitId(), reqVO.getStatDate(), currentAdd); + } + // 5. 新增积分明细 + createAddDetail(reqVO, beforeIntegral, afterIntegral, currentAdd); + log.info("积分增加成功,单位ID:{},本次增加:{}", reqVO.getUnitId(), currentAdd); + } + /** + * 封装增加明细创建逻辑 + */ + private void createAddDetail(UnitIntegralSaveReqVO reqVO, int before, int after, int currentAdd) { + UnitIntegralAddSaveReqVO detailVO = new UnitIntegralAddSaveReqVO(); + BeanUtils.copyProperties(reqVO, detailVO); + detailVO.setAddIntegral(currentAdd); // 本次增加积分 + detailVO.setBeforeIntegral(before); // 增加前累计扣减积分 + detailVO.setAfterIntegral(after); // 增加后累计扣减积分 + detailVO.setAddReason(reqVO.getReason()); + unitIntegralAddService.createUnitIntegralAdd(detailVO); + } + /** + * 扣减单位积分(核心方法) + * @param reqVO 积分扣减请求(totalIntegral 为「本次扣减积分」) + */ + @Override + public void subUnitIntegral(UnitIntegralSaveReqVO reqVO){ + // 1. 前置参数校验 + if (reqVO == null) { + throw exception0(BAD_REQUEST.getCode(), "积分扣减请求参数不能为空"); + } + if (reqVO.getTotalIntegral() <= 0) { + throw exception0(BAD_REQUEST.getCode(), "本次扣减积分必须为正数"); // 修复文案错误 + } + if (ObjectUtils.isEmpty(reqVO.getUnitId()) || ObjectUtils.isEmpty(reqVO.getStatDate())) { + throw exception0(BAD_REQUEST.getCode(), "单位ID和统计日期不能为空"); + } + + // 2. 调用通用锁工具类,加锁执行核心逻辑(参考executeNotify的Runnable风格) + integralLockCoreRedisDAO.lock( + reqVO.getUnitId(), + reqVO.getStatDate(), + IntegralLockCoreRedisDAO.INTEGRAL_LOCK_TIMEOUT_MILLIS, + () -> { + // 3. 锁内二次校验(关键!避免分布式锁并发问题,参考executeNotify的dbTask校验) + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(UnitIntegralTotalDO.class) + .eq(UnitIntegralTotalDO::getUnitType, reqVO.getUnitType()) + .eq(UnitIntegralTotalDO::getStatDate, reqVO.getStatDate()) + .eq(UnitIntegralTotalDO::getUnitId, reqVO.getUnitId()) + .eq(UnitIntegralTotalDO::getDeleted, 0); // 排除已删除的积分记录 + UnitIntegralTotalDO unitIntegralTotalDO = unitIntegralTotalMapper.selectOne(queryWrapper); + // 4. 校验积分记录是否存在(锁内校验,避免并发删除场景) + if (unitIntegralTotalDO == null) { + String errorMsg = String.format("单位积分记录不存在,单位ID:%s,统计日期:%s", + reqVO.getUnitId(), reqVO.getStatDate()); + log.error(errorMsg); + throw exception0(BAD_REQUEST.getCode(), errorMsg); + } + + // 5. 调用带事务的核心扣减方法 + getSelf().executeSubUnitIntegral0(reqVO, unitIntegralTotalDO); + } + ); + } + + @Override + @Transactional + public void resetUnitIntegralTotal() { + // 1. 记录方法执行开始 + log.info("【单位积分重置】开始执行单位积分数据重置操作"); + try { + // ========== 处理单位积分总额表 ========== + log.info("【单位积分重置】开始处理单位积分总额表数据"); + List unitIntegralTotaList = unitIntegralTotalMapper.selectList(UnitIntegralTotalDO::getDeleted, 0); + if (CollectionUtils.isEmpty(unitIntegralTotaList)) { + log.info("【单位积分重置】单位积分总额表无未重置数据,无需处理"); + } else { + log.info("【单位积分重置】单位积分总额表重置完成,共重置{}条数据", unitIntegralTotaList.size()); + for (UnitIntegralTotalDO unitIntegralTotalDO : unitIntegralTotaList) { + String statDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy")); + if (statDate.equals(unitIntegralTotalDO.getStatDate())){ + unitIntegralTotalDO.setTotalIntegral(0); + unitIntegralTotalDO.setTotalAdd(0); + unitIntegralTotalDO.setTotalSub(0); + unitIntegralTotalMapper.updateById(unitIntegralTotalDO); + } else { + unitIntegralTotalMapper.deleteById(unitIntegralTotalDO.getId()); + } + } +// List idList = unitIntegralTotaList.stream() +// .map(UnitIntegralTotalDO::getId) +// .collect(Collectors.toList()); +// int deleteCount = unitIntegralTotalMapper.deleteByIds(idList); +// log.info("【单位积分重置】单位积分总额表删除完成,共删除{}条数据,删除的ID列表:{}", deleteCount, idList); + } + +// // ========== 处理单位积分增加表 ========== +// log.info("【单位积分重置】开始处理单位积分增加表数据"); +// List unitIntegralAddList = unitIntegralAddMapper.selectList(UnitIntegralAddDO::getDeleted, 0); +// if (CollectionUtils.isEmpty(unitIntegralAddList)) { +// log.info("【单位积分重置】单位积分增加表无未重置数据,无需处理"); +// } else { +// List addIdList = unitIntegralAddList.stream() +// .map(UnitIntegralAddDO::getId) +// .collect(Collectors.toList()); +// int addDeleteCount = unitIntegralAddMapper.deleteByIds(addIdList); +// log.info("【单位积分重置】单位积分增加表重置完成,共重置{}条数据,重置的ID列表:{}", addDeleteCount, addIdList); +// } +// +// // ========== 处理单位积分扣减表 ========== +// log.info("【单位积分重置】开始处理单位积分扣减表数据"); +// List unitIntegralSubList = unitIntegralSubMapper.selectList(UnitIntegralSubDO::getDeleted, 0); +// if (CollectionUtils.isEmpty(unitIntegralSubList)) { +// log.info("【单位积分重置】单位积分扣减表无未重置数据,无需处理"); +// } else { +// List subIdList = unitIntegralSubList.stream() +// .map(UnitIntegralSubDO::getId) +// .collect(Collectors.toList()); +// int subDeleteCount = unitIntegralSubMapper.deleteByIds(subIdList); +// // 修复原日志中“重置增加单位积分总额”的文案错误,改为“单位积分扣减表” +// log.info("【单位积分重置】单位积分扣减表重置完成,共删除{}条数据,重置的ID列表:{}", subDeleteCount, subIdList); +// } + + // 2. 记录方法执行成功 + log.info("【单位积分重置】单位积分数据重置操作执行完成,所有表处理完毕"); + + } catch (Exception e) { + // 3. 记录异常日志(包含堆栈信息) + log.error("【单位积分重置】执行单位积分数据重置操作失败", e); + // 抛出异常触发事务回滚,保证数据一致性 + throw new RuntimeException("重置单位积分数据失败", e); + } + } + + /** + * 扣减积分核心执行方法(带事务,内部调用) + */ + @Transactional(rollbackFor = Exception.class) + public void executeSubUnitIntegral0(UnitIntegralSaveReqVO reqVO, UnitIntegralTotalDO unitIntegralTotalDO) { + // 1. 初始化核心变量 + int currentSub = reqVO.getTotalIntegral(); // 本次扣减积分 + int beforeSub = unitIntegralTotalDO.getTotalSub(); // 扣减前累计扣减积分 + int afterSub = beforeSub + currentSub; // 扣减后累计扣减积分 + int currentTotalIntegral = unitIntegralTotalDO.getTotalAdd() - afterSub; // 扣减后总积分 + + // 2. 业务规则校验:扣减后总积分不能为负数 + if (currentTotalIntegral < 0) { + String errorMsg = String.format("单位积分扣减失败,扣减后总积分为负!单位ID:%s,当前累计增加:%s,本次扣减:%s,累计扣减:%s", + reqVO.getUnitId(), unitIntegralTotalDO.getTotalAdd(), currentSub, beforeSub); + log.error(errorMsg); + throw exception0(BAD_REQUEST.getCode(),errorMsg); + } + + // 3. 更新积分总表(核心扣减逻辑) + unitIntegralTotalDO.setTotalSub(afterSub); // 更新累计扣减积分 + unitIntegralTotalDO.setTotalIntegral(currentTotalIntegral); // 更新当前总积分 + unitIntegralTotalDO.setUpdateTime(LocalDateTime.now()); + unitIntegralTotalDO.setUpdater(String.valueOf(getLoginUserId())); + unitIntegralTotalMapper.updateById(unitIntegralTotalDO); + + log.info("单位积分扣减成功,单位ID:{},统计日期:{},本次扣减:{},扣减前累计扣减:{},扣减后累计扣减:{},扣减后总积分:{}", + reqVO.getUnitId(), reqVO.getStatDate(), currentSub, beforeSub, afterSub, currentTotalIntegral); + + // 8. 新增扣减明细 + // 新增减积分明细 + createSubDetail(reqVO, beforeSub, afterSub, currentSub); + log.info("单位{}减积分成功,本次减{},累计减{},剩余{}", + reqVO.getUnitId(), currentSub, afterSub, currentSub); + } + + /** + * 封装扣减明细创建逻辑 + */ + private void createSubDetail(UnitIntegralSaveReqVO updateReqVO, int beforeSub, int afterSub, int currentSub) { + UnitIntegralSubSaveReqVO detailVO = new UnitIntegralSubSaveReqVO(); + BeanUtils.copyProperties(updateReqVO, detailVO); + detailVO.setSubIntegral(currentSub); // 本次扣减积分 + detailVO.setBeforeIntegral(beforeSub); // 扣减前累计扣减积分 + detailVO.setAfterIntegral(afterSub); // 扣减后累计扣减积分 + detailVO.setSubReason(updateReqVO.getReason()); + unitIntegralSubService.createUnitIntegralSub(detailVO); + log.info("新增积分扣减明细成功,单位ID:{},明细ID:{}", updateReqVO.getUnitId(), detailVO.getId()); + } + + + /** + * 获得自身的代理对象,解决 AOP 生效问题 + * + * @return 自己 + */ + private UnitIntegralServiceImpl getSelf() { + return SpringUtil.getBean(getClass()); + } + + + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralTotalService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralTotalService.java new file mode 100644 index 0000000..f1e8f9e --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralTotalService.java @@ -0,0 +1,62 @@ +package com.zteits.urbanops.module.garden.service.unitintegraltotal; + +import java.util.*; +import jakarta.validation.*; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraltotal.UnitIntegralTotalDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; + +/** + * 单位积分累计 Service 接口 + * + * @author 超级管理员 + */ +public interface UnitIntegralTotalService { + + /** + * 创建单位积分累计 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUnitIntegralTotal(@Valid UnitIntegralTotalSaveReqVO createReqVO); + + /** + * 更新单位积分累计 + * + * @param updateReqVO 更新信息 + */ + void updateUnitIntegralTotal(@Valid UnitIntegralTotalSaveReqVO updateReqVO); + + /** + * 删除单位积分累计 + * + * @param id 编号 + */ + void deleteUnitIntegralTotal(Long id); + + /** + * 批量删除单位积分累计 + * + * @param ids 编号 + */ + void deleteUnitIntegralTotalListByIds(List ids); + + /** + * 获得单位积分累计 + * + * @param id 编号 + * @return 单位积分累计 + */ + UnitIntegralTotalDO getUnitIntegralTotal(Long id); + + /** + * 获得单位积分累计分页 + * + * @param pageReqVO 分页查询 + * @return 单位积分累计分页 + */ + PageResult getUnitIntegralTotalPage(UnitIntegralTotalPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralTotalServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralTotalServiceImpl.java new file mode 100644 index 0000000..20b003d --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralTotalServiceImpl.java @@ -0,0 +1,85 @@ +package com.zteits.urbanops.module.garden.service.unitintegraltotal; + +import cn.hutool.core.collection.CollUtil; +import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraltotal.UnitIntegralTotalDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; + +import com.zteits.urbanops.module.garden.dal.mysql.unitintegraltotal.UnitIntegralTotalMapper; + +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.diffList; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; + +/** + * 单位积分累计 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class UnitIntegralTotalServiceImpl implements UnitIntegralTotalService { + + @Resource + private UnitIntegralTotalMapper unitIntegralTotalMapper; + + @Override + public Long createUnitIntegralTotal(UnitIntegralTotalSaveReqVO createReqVO) { + // 插入 + UnitIntegralTotalDO unitIntegralTotal = BeanUtils.toBean(createReqVO, UnitIntegralTotalDO.class); + unitIntegralTotalMapper.insert(unitIntegralTotal); + + // 返回 + return unitIntegralTotal.getId(); + } + + @Override + public void updateUnitIntegralTotal(UnitIntegralTotalSaveReqVO updateReqVO) { + // 校验存在 + validateUnitIntegralTotalExists(updateReqVO.getId()); + // 更新 + UnitIntegralTotalDO updateObj = BeanUtils.toBean(updateReqVO, UnitIntegralTotalDO.class); + unitIntegralTotalMapper.updateById(updateObj); + } + + @Override + public void deleteUnitIntegralTotal(Long id) { + // 校验存在 + validateUnitIntegralTotalExists(id); + // 删除 + unitIntegralTotalMapper.deleteById(id); + } + + @Override + public void deleteUnitIntegralTotalListByIds(List ids) { + // 删除 + unitIntegralTotalMapper.deleteByIds(ids); + } + + + private void validateUnitIntegralTotalExists(Long id) { + if (unitIntegralTotalMapper.selectById(id) == null) { + throw exception(UNIT_INTEGRAL_TOTAL_NOT_EXISTS); + } + } + + @Override + public UnitIntegralTotalDO getUnitIntegralTotal(Long id) { + return unitIntegralTotalMapper.selectById(id); + } + + @Override + public PageResult getUnitIntegralTotalPage(UnitIntegralTotalPageReqVO pageReqVO) { + return unitIntegralTotalMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/DeviceDeptTreeUtils.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/DeviceDeptTreeUtils.java new file mode 100644 index 0000000..f125384 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/DeviceDeptTreeUtils.java @@ -0,0 +1,86 @@ +package com.zteits.urbanops.module.garden.util; + +import com.zteits.urbanops.module.garden.controller.admin.deviceuser.vo.DeviceDeptTreeRespVO; + +import java.util.*; + +public class DeviceDeptTreeUtils { + + + /** + * 批量删除指定codes的设备节点 + * + * @param treeNodes 树节点列表 + * @param codes 待删除的设备编码列表 + * @return 删除成功的设备数量 + */ + public static int removeDevicesByCodes(List treeNodes, List codes) { + if (treeNodes == null || treeNodes.isEmpty() || codes == null || codes.isEmpty()) { + return 0; + } + + Set codeSet = new HashSet<>(codes); // 转换为Set提高查找效率 + return removeDevicesInternal(treeNodes, codeSet); + } + + /** + * 内部递归删除方法 + */ + private static int removeDevicesInternal(List treeNodes, Set codeSet) { + if (treeNodes == null || treeNodes.isEmpty()) { + return 0; + } + + int removedCount = 0; + Iterator iterator = treeNodes.iterator(); + while (iterator.hasNext()) { + DeviceDeptTreeRespVO node = iterator.next(); + + // 检查当前节点是否需要删除(是设备节点且code在待删除列表中) + if (node.getNodeType() != null && node.getNodeType() == 3 && + codeSet.contains(node.getCode())) { + iterator.remove(); + removedCount++; + } else { + // 递归处理子节点 + if (node.getChildren() != null) { + removedCount += removeDevicesInternal(node.getChildren(), codeSet); + } + } + } + + return removedCount; + } + + /** + * 获取所有设备节点 + */ + public static List getAllDevices(List treeNodes) { + List devices = new ArrayList<>(); + collectDevices(treeNodes, devices); + return devices; + } + + /** + * 递归收集所有设备节点 + */ + private static void collectDevices(List nodes, List devices) { + if (nodes == null || nodes.isEmpty()) { + return; + } + + for (DeviceDeptTreeRespVO node : nodes) { + // 如果是设备节点,添加到结果列表 + if (node.getNodeType() != null && node.getNodeType() == 3) { + devices.add(node); + } + + // 递归处理子节点 + if (node.getChildren() != null && !node.getChildren().isEmpty()) { + collectDevices(node.getChildren(), devices); + } + } + } + +} + diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/LocalIpUtils.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/LocalIpUtils.java new file mode 100644 index 0000000..7bfc4ba --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/LocalIpUtils.java @@ -0,0 +1,54 @@ +package com.zteits.urbanops.module.garden.util; + +import java.net.*; +import java.util.Enumeration; +/** + * @Classname LocalIpUtils + * @Description 获取本机内网IP + * @Date 2026/3/12 17:53 + * @Created by wangqian + */ +public class LocalIpUtils { + + /** + * 获取本机内网IP(排除回环地址、虚拟网卡) + * @return 本机IP字符串,获取失败返回 null + */ + public static String getLocalIp() { + try { + // 遍历所有网络接口 + Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); + while (interfaces.hasMoreElements()) { + NetworkInterface ni = interfaces.nextElement(); + // 跳过虚拟网卡、回环网卡、非运行状态的网卡 + if (ni.isLoopback() || ni.isVirtual() || !ni.isUp()) { + continue; + } + + // 遍历该网卡下的所有IP地址 + Enumeration addresses = ni.getInetAddresses(); + while (addresses.hasMoreElements()) { + InetAddress addr = addresses.nextElement(); + // 只取IPv4地址(排除IPv6) + if (addr instanceof Inet4Address) { + String ip = addr.getHostAddress(); + // 排除回环地址(127.x.x.x) + if (!ip.startsWith("127.")) { + return ip; + } + } + } + } + } catch (SocketException e) { + e.printStackTrace(); + } + // 如果没找到,返回回环地址兜底 + return "127.0.0.1"; + } + + // 测试方法 + public static void main(String[] args) { + String localIp = getLocalIp(); + System.out.println("本机内网IP:" + localIp); + } +} diff --git a/urbanops-module-garden/src/main/resources/mapper/assigntasksinfo/AssignTasksInfoMapper.xml b/urbanops-module-garden/src/main/resources/mapper/assigntasksinfo/AssignTasksInfoMapper.xml index c178e12..ead055a 100644 --- a/urbanops-module-garden/src/main/resources/mapper/assigntasksinfo/AssignTasksInfoMapper.xml +++ b/urbanops-module-garden/src/main/resources/mapper/assigntasksinfo/AssignTasksInfoMapper.xml @@ -25,4 +25,21 @@ and finish = 0 + + + diff --git a/urbanops-module-garden/src/main/resources/mapper/device/DeviceClockRecordMapper.xml b/urbanops-module-garden/src/main/resources/mapper/device/DeviceClockRecordMapper.xml new file mode 100644 index 0000000..a16b475 --- /dev/null +++ b/urbanops-module-garden/src/main/resources/mapper/device/DeviceClockRecordMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/urbanops-module-garden/src/main/resources/mapper/emergencytask/EmergencyMachineryMapper.xml b/urbanops-module-garden/src/main/resources/mapper/emergencytask/EmergencyMachineryMapper.xml new file mode 100644 index 0000000..1fec125 --- /dev/null +++ b/urbanops-module-garden/src/main/resources/mapper/emergencytask/EmergencyMachineryMapper.xml @@ -0,0 +1,15 @@ + + + + + + + DELETE FROM garden_emergency_machinery WHERE task_no = #{taskNo} + + + \ No newline at end of file diff --git a/urbanops-module-garden/src/main/resources/mapper/emergencytask/EmergencyTaskMapper.xml b/urbanops-module-garden/src/main/resources/mapper/emergencytask/EmergencyTaskMapper.xml new file mode 100644 index 0000000..1b05fce --- /dev/null +++ b/urbanops-module-garden/src/main/resources/mapper/emergencytask/EmergencyTaskMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + DELETE FROM garden_emergency_task WHERE task_no = #{taskNo} + + + \ No newline at end of file diff --git a/urbanops-module-garden/src/main/resources/mapper/homepage/HomepageSummaryMapper.xml b/urbanops-module-garden/src/main/resources/mapper/homepage/HomepageSummaryMapper.xml index 0c7aad1..d66ea61 100644 --- a/urbanops-module-garden/src/main/resources/mapper/homepage/HomepageSummaryMapper.xml +++ b/urbanops-module-garden/src/main/resources/mapper/homepage/HomepageSummaryMapper.xml @@ -44,7 +44,7 @@ workorder_main_info t t.deleted = 0 - AND t.buz_status != '200' + AND t.buz_status NOT IN ('200', '140') AND t.worker_company_id = #{companyId} @@ -63,7 +63,7 @@ workorder_main_info t t.deleted = 0 - AND t.buz_status = '200' + AND t.buz_status IN ('200', '140') AND t.worker_company_id = #{companyId} @@ -254,35 +254,33 @@ @@ -377,9 +375,10 @@ SELECT taskName, busiDateTime, pressingType FROM ( - SELECT a.plan_name as taskName,a.begin_time as busiDateTime,null as pressingType + SELECT + a.plan_name as taskName,c.begin_time as busiDateTime,null as pressingType from garden_inspection_plan a - INNER JOIN garden_inspection_plan_role b on a.batch_no=b.batch_no - where a.finish_state in(1,3) and a.dept_id = #{deptId} - AND b.role_id IN - - #{roleId} - - union all - SELECT a.plan_name as taskName,a.begin_time as busiDateTime, null as pressingType - from garden_maintain_plan a - INNER JOIN garden_maintain_plan_role b on a.batch_no=b.batch_no - where a.finish_state in(1,3) and a.dept_id = #{deptId} - AND b.role_id IN - - #{roleId} - + INNER JOIN garden_inspection_plan_role b on a.batch_no=b.batch_no + inner join garden_inspection_plan_detail c on a.batch_no=c.batch_no + where a.deleted = b.deleted and a.deleted = 0 + and c.finish_state = 1 + and c.begin_time <= #{currentDate} + AND c.end_time >= #{currentDate} + and a.dept_id = #{deptId} + AND b.role_id IN + + #{roleId} + + + union all + + SELECT + a.plan_name as taskName,c.begin_time as busiDateTime, null as pressingType + from garden_maintain_plan a + INNER JOIN garden_maintain_plan_role b on a.batch_no=b.batch_no + inner join garden_maintain_plan_detail c on a.batch_no=c.batch_no + where a.deleted=b.deleted and a.deleted = 0 + and c.finish_state = 1 + and c.begin_time <= #{currentDate} + AND c.end_time >= #{currentDate} + and a.dept_id = #{deptId} + AND b.role_id IN + + #{roleId} + + union all + SELECT m.order_name as taskName ,m.create_time as busiDateTime , m.pressing_type as pressingType FROM act_ru_task t @@ -481,7 +496,7 @@ FROM garden_maintain_plan_detail a INNER JOIN garden_maintain_plan_role b ON a.batch_no = b.batch_no - WHERE a.finish_state IN (1, 3) and a.dept_id = #{deptId} -- 1:未完成;3:已过期 + WHERE a.deleted = 0 and a.finish_state = 1 and a.dept_id = #{deptId} -- 1:未完成;3:已过期 AND a.begin_time <= #{beginTime} @@ -498,12 +513,12 @@ FROM garden_inspection_plan_detail a INNER JOIN garden_inspection_plan_role b ON a.batch_no = b.batch_no - WHERE a.finish_state IN (1, 3) and a.dept_id = #{deptId} -- 1:未完成;3:已过期 + WHERE a.deleted = 0 and a.finish_state = 1 and a.dept_id = #{deptId} -- 1:未完成;3:已过期 AND a.begin_time <= #{beginTime} - AND a.begin_time >= #{endTime} + AND a.end_time >= #{endTime} GROUP BY role_id @@ -512,7 +527,7 @@ + + + diff --git a/urbanops-module-garden/src/main/resources/mapper/inspectionplan/InspectionPlanCommitMapper.xml b/urbanops-module-garden/src/main/resources/mapper/inspectionplan/InspectionPlanCommitMapper.xml index 81e35fc..87e2091 100644 --- a/urbanops-module-garden/src/main/resources/mapper/inspectionplan/InspectionPlanCommitMapper.xml +++ b/urbanops-module-garden/src/main/resources/mapper/inspectionplan/InspectionPlanCommitMapper.xml @@ -94,7 +94,15 @@ - order by a.id desc + + + and b.dept_id in + + #{deptId} + + + + order by a.create_time desc + SELECT + b.* + FROM + garden_plan_rate a, + garden_plan_rate_detail b + WHERE + a.rate_no=b.rate_no + and b.busi_line=#{busiLine} + and b.level_id=#{levelId} + and b.plan_type_id=#{planTypeId} + and a.company_id= #{companyId} + limit 1 + \ No newline at end of file diff --git a/urbanops-module-garden/src/main/resources/mapper/tree/TreeMapper.xml b/urbanops-module-garden/src/main/resources/mapper/tree/TreeMapper.xml index f70f9d3..376edc9 100644 --- a/urbanops-module-garden/src/main/resources/mapper/tree/TreeMapper.xml +++ b/urbanops-module-garden/src/main/resources/mapper/tree/TreeMapper.xml @@ -27,9 +27,7 @@ \ No newline at end of file diff --git a/urbanops-module-garden/src/main/resources/mapper/unitintegraltotal/UnitIntegralTotalMapper.xml b/urbanops-module-garden/src/main/resources/mapper/unitintegraltotal/UnitIntegralTotalMapper.xml new file mode 100644 index 0000000..da25ab7 --- /dev/null +++ b/urbanops-module-garden/src/main/resources/mapper/unitintegraltotal/UnitIntegralTotalMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + diff --git a/urbanops-module-system/pom.xml b/urbanops-module-system/pom.xml index f5d8717..a52b79d 100644 --- a/urbanops-module-system/pom.xml +++ b/urbanops-module-system/pom.xml @@ -123,7 +123,21 @@ pinyin4j 2.5.1 - + + com.auth0 + java-jwt + 3.8.1 + + + io.jsonwebtoken + jjwt + 0.9.1 + + + com.smart.uaa + sdk + 1.0.1 + diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/dept/DeptController.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/dept/DeptController.java index 6fcd73a..4e0f116 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/dept/DeptController.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/dept/DeptController.java @@ -11,16 +11,19 @@ import com.zteits.urbanops.module.system.util.tree.Dept; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.security.PermitAll; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; import jakarta.validation.Valid; -import java.util.List; + +import java.util.*; import java.util.stream.Collectors; import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertSet; @Tag(name = "管理后台 - 部门") @RestController @@ -124,18 +127,30 @@ public class DeptController { @Operation(summary = "查询所有组织") @GetMapping("/queryAllDeptList") - public CommonResult> queryAllDeptList(@RequestParam(required = false)String companyCode) { - List sysDepts = deptService.getSubDeptAllList(); - List deptResps = sysDepts.stream().map(sysDept -> { - SysDeptRespVO sysDeptResp = new SysDeptRespVO(); - sysDeptResp.setDeptCode(sysDept.getId()+""); - sysDeptResp.setDeptName(sysDept.getName()); - sysDeptResp.setParentDeptCode(sysDept.getParentId()+""); - sysDeptResp.setOrderNum(sysDept.getSort()); - sysDeptResp.setStatus(sysDept.getStatus().toString()); - return sysDeptResp; + @PermitAll + public Map queryAllDeptList( @RequestParam(required = false) Long deptId) { + List sysDepts = new ArrayList<>(); + if(deptId != null){ + sysDepts = deptService.getChildDeptList(deptId); + }else { + sysDepts = deptService.getDeptAllList(); + } + List> deptResps = sysDepts.stream().map(sysDept -> { + Map deptMap = new HashMap<>(); + deptMap.put("deptCode", sysDept.getId() + ""); + deptMap.put("deptName", sysDept.getName()); + // parentDeptCode为空时返回空字符串 + deptMap.put("parentDeptCode", sysDept.getParentId() == null || sysDept.getParentId() == 0 ? "" : sysDept.getParentId() + ""); + deptMap.put("orderNum", sysDept.getSort()); + return deptMap; }).collect(Collectors.toList()); - return success(deptResps); + + // 构建返回格式 + Map result = new HashMap<>(); + result.put("msg", "操作成功"); + result.put("code", 200); + result.put("data", deptResps); + return result; } } diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/user/UserController.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/user/UserController.java index de2f271..983ba8c 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/user/UserController.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/user/UserController.java @@ -11,15 +11,20 @@ import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; import com.zteits.urbanops.module.system.controller.admin.user.vo.user.*; import com.zteits.urbanops.module.system.convert.user.UserConvert; import com.zteits.urbanops.module.system.dal.dataobject.dept.DeptDO; +import com.zteits.urbanops.module.system.dal.dataobject.permission.RoleDO; import com.zteits.urbanops.module.system.dal.dataobject.user.AdminUserDO; import com.zteits.urbanops.module.system.enums.common.SexEnum; import com.zteits.urbanops.module.system.service.dept.DeptService; +import com.zteits.urbanops.module.system.service.permission.PermissionService; +import com.zteits.urbanops.module.system.service.permission.RoleService; import com.zteits.urbanops.module.system.service.user.AdminUserService; +import com.zteits.urbanops.module.system.util.dept.DeptCacheHelper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.annotation.security.PermitAll; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; @@ -31,10 +36,13 @@ import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; +import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getDeptId; @Tag(name = "管理后台 - 用户") @RestController @@ -47,6 +55,12 @@ public class UserController { @Resource private DeptService deptService; + @Resource + private PermissionService permissionService; + + @Resource + private RoleService roleService; + @PostMapping("/create") @Operation(summary = "新增用户") @PreAuthorize("@ss.hasPermission('system:user:create')") @@ -101,16 +115,47 @@ public class UserController { @Operation(summary = "获得用户分页列表") @PreAuthorize("@ss.hasPermission('system:user:query')") public CommonResult> getUserPage(@Valid UserPageReqVO pageReqVO) { - // 获得用户分页列表 + // 1. 获得用户分页列表(AdminUserDO 是数据库实体) PageResult pageResult = userService.getUserPage(pageReqVO); if (CollUtil.isEmpty(pageResult.getList())) { - return success(new PageResult<>(pageResult.getTotal())); + // 无数据时,返回空分页结果(保持返回结构一致) + return CommonResult.success(new PageResult<>(pageResult.getTotal())); } - // 拼接数据 + + // 2. 提取当前页所有用户ID(用于批量查询,避免N+1查询问题) + List userIdList = pageResult.getList().stream() + .map(AdminUserDO::getId) + .collect(Collectors.toList()); + + // 3. 批量拼接关联数据:部门信息(原有逻辑,保持不变) Map deptMap = deptService.getDeptMap( - convertList(pageResult.getList(), AdminUserDO::getDeptId)); - return success(new PageResult<>(UserConvert.INSTANCE.convertList(pageResult.getList(), deptMap), - pageResult.getTotal())); + pageResult.getList().stream().map(AdminUserDO::getDeptId).collect(Collectors.toList()) + ); + + // 4. 批量拼接关联数据:角色信息(核心修正与完善) + // 4.1 批量获取「用户ID-角色ID列表」的映射(从权限服务获取,批量查询提升效率) + Map> userId2RoleIdListMap = permissionService.getUserRoleIdListByUserIds(userIdList); + // 4.2 提取所有涉及的角色ID,去重后批量查询角色信息(从缓存获取,符合芋道缓存规范) + List allRoleIdList = userId2RoleIdListMap.values().stream() + .flatMap(List::stream) + .distinct() + .collect(Collectors.toList()); + Map roleMap = roleService.getRoleMapFromCache(allRoleIdList); // 批量查询角色缓存,返回「角色ID-角色DO」映射 + // 4.3 封装「用户ID-角色列表」的映射(供转换VO使用) + Map> userId2RoleListMap = userId2RoleIdListMap.entrySet().stream() + .collect(Collectors.toMap( + Map.Entry::getKey, + entry -> entry.getValue().stream() + .map(roleMap::get) // 从角色映射中获取对应RoleDO(可能返回null) + .filter(Objects::nonNull) // 过滤null的RoleDO对象,解决报错核心 + .collect(Collectors.toList()) + )); + + // 5. 转换VO并拼接关联数据(修改转换器,支持接收角色映射) + List userRespVOList = UserConvert.INSTANCE.convertList(pageResult.getList(), deptMap, userId2RoleListMap); + + // 6. 封装并返回结果 + return CommonResult.success(new PageResult<>(userRespVOList, pageResult.getTotal())); } @PostMapping("/listForPage") @@ -171,11 +216,20 @@ public class UserController { public void importTemplate(HttpServletResponse response) throws IOException { // 手动创建导出 demo List list = Arrays.asList( - UserImportExcelVO.builder().username("yunai").deptId(1L).email("yunai@iocoder.cn").mobile("15601691300") - .nickname("全域").status(CommonStatusEnum.ENABLE.getStatus()).sex(SexEnum.MALE.getSex()).build(), - UserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@iocoder.cn").mobile("15601701300") - .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SexEnum.FEMALE.getSex()).build() + UserImportExcelVO.builder() + .username("示例:zhangshan") + .nickname("张山") + .mobile("15601691300") + .sex(SexEnum.MALE.getSex()) + .email("yunai@iocoder.cn") + .deptId(255L) + // .status(CommonStatusEnum.ENABLE.getStatus()) + .busiLine("yl,sz") // 简洁示例 + .isInner(1) + .build() ); + //初始化部门 + DeptCacheHelper.init(deptService, getDeptId()); // 输出 ExcelUtils.write(response, "用户导入模板.xls", "用户列表", UserImportExcelVO.class, list); } diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/user/vo/user/UserImportExcelVO.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/user/vo/user/UserImportExcelVO.java index fad3d2e..de8c4f1 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/user/vo/user/UserImportExcelVO.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/user/vo/user/UserImportExcelVO.java @@ -2,8 +2,12 @@ package com.zteits.urbanops.module.system.controller.admin.user.vo.user; import cn.idev.excel.annotation.ExcelProperty; import com.zteits.urbanops.framework.excel.core.annotations.DictFormat; +import com.zteits.urbanops.framework.excel.core.annotations.ExcelColumnSelect; import com.zteits.urbanops.framework.excel.core.convert.DictConvert; import com.zteits.urbanops.module.system.enums.DictTypeConstants; +import com.zteits.urbanops.framework.excel.core.convert.BusinessLineConvert; +import com.zteits.urbanops.module.system.framework.excel.convert.DeptConvert; +import com.zteits.urbanops.module.system.framework.excel.core.DeptExcelColumnSelectFunction; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -18,18 +22,12 @@ import lombok.NoArgsConstructor; @NoArgsConstructor public class UserImportExcelVO { - @ExcelProperty("登录名称") + @ExcelProperty("用户账户") private String username; @ExcelProperty("用户名称") private String nickname; - @ExcelProperty("部门编号") - private Long deptId; - - @ExcelProperty("用户邮箱") - private String email; - @ExcelProperty("手机号码") private String mobile; @@ -37,8 +35,24 @@ public class UserImportExcelVO { @DictFormat(DictTypeConstants.USER_SEX) private Integer sex; - @ExcelProperty(value = "账号状态", converter = DictConvert.class) - @DictFormat(DictTypeConstants.COMMON_STATUS) - private Integer status; + @ExcelProperty("邮箱") + private String email; + + @ExcelProperty(value = "归属部门名称", converter = DeptConvert.class) + @ExcelColumnSelect(functionName = DeptExcelColumnSelectFunction.NAME) + private Long deptId; + + //@ExcelProperty(value = "账号状态", converter = DictConvert.class) + //@DictFormat(DictTypeConstants.COMMON_STATUS) + //private Integer status; + + @ExcelProperty(value = "业务线", converter = BusinessLineConvert.class) + private String busiLine; + + @ExcelProperty(value = "是否是内部员工", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SYSTEM_IS_INNER) + private Integer isInner; + @ExcelProperty(value = "备注") + private String remark; } diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/user/vo/user/UserPageReqVO.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/user/vo/user/UserPageReqVO.java index f8f486b..6863909 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/user/vo/user/UserPageReqVO.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/user/vo/user/UserPageReqVO.java @@ -19,6 +19,8 @@ import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YE @EqualsAndHashCode(callSuper = true) public class UserPageReqVO extends PageParam { + @Schema(description = "用户昵称,模糊匹配", example = "urbanops") + private String nickname; @Schema(description = "用户账号,模糊匹配", example = "urbanops") private String username; diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/user/vo/user/UserRespVO.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/user/vo/user/UserRespVO.java index 9cb21ee..93a8666 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/user/vo/user/UserRespVO.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/admin/user/vo/user/UserRespVO.java @@ -38,6 +38,9 @@ public class UserRespVO{ @ExcelProperty("部门名称") private String deptName; + @Schema(description = "角色名称") + private String roleNames; + @Schema(description = "岗位编号数组", example = "1") private Set postIds; diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/app/appmodule/AppAppModuleController.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/app/appmodule/AppAppModuleController.java index 4503f3c..ecb8d1e 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/app/appmodule/AppAppModuleController.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/app/appmodule/AppAppModuleController.java @@ -7,9 +7,11 @@ import com.zteits.urbanops.module.system.controller.app.appmodule.vo.AppModuleVO import com.zteits.urbanops.module.system.convert.appmodule.AppModuleConvert; import com.zteits.urbanops.module.system.dal.dataobject.appmodule.AppModuleDO; import com.zteits.urbanops.module.system.service.appmodule.AppModuleService; +import com.zteits.urbanops.module.system.service.permission.PermissionService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -21,6 +23,7 @@ import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; @@ -34,29 +37,60 @@ import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; @RestController @RequestMapping("/member/app-module") @Validated +@Slf4j public class AppAppModuleController { + /** + * 园林巡查员角色ID + */ + private static final Long ROLE_ID_PATROL = 178L; + + /** + * 园林巡查员角色ID + */ + private static final Long ROLE_ID_PATROL_ZX = 202L; + /** + * 全域督察员角色ID + */ + private static final Long ROLE_ID_INSPECTOR = 183L; + /** + * 巡查工单模块ID + */ + private static final Long MODULE_ID_PATROL_WORKORDER = 7L; + @Resource private AppModuleService appModuleService; + @Resource + private PermissionService permissionService; + @GetMapping("/list") @Operation(summary = "获取 App 功能模块列表", description = "获取用户可见的功能模块列表") public CommonResult> getAppModuleList(AppModuleListReqVO reqVO) { // 获取当前登录用户ID Long userId = SecurityFrameworkUtils.getLoginUserId(); - + // 查询用户可见的模块列表 List list = appModuleService.getVisibleAppModuleList(userId, reqVO); - + + // 如果用户同时拥有园林巡查员(178)和全域督察员(183)角色,则隐藏巡查工单菜单,只显示督查工单菜单 + if (userId != null) { + Set roleIds = permissionService.getUserRoleIdListByUserId(userId); + if (roleIds.contains(ROLE_ID_PATROL_ZX) && roleIds.contains(ROLE_ID_INSPECTOR)) { + log.info("[getAppModuleList] 用户({})同时拥有巡查员和督察员角色,隐藏巡查工单菜单", userId); + list.removeIf(module -> MODULE_ID_PATROL_WORKORDER.equals(module.getId())); + } + } + // 填充统计数据(根据extra中的statisticKey配置) // appModuleService.fillModuleStatistics(list, userId); - + // 转换为 VO 列表并构建树 List modules = AppModuleConvert.INSTANCE.convertAppList(list); List moduleTree = buildModuleTree(modules); - + // MapStruct 转换已通过 @AfterMapping 自动填充 statisticCount - + return success(moduleTree); } diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/app/dept/AppDeptController.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/app/dept/AppDeptController.java new file mode 100644 index 0000000..843f0e1 --- /dev/null +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/controller/app/dept/AppDeptController.java @@ -0,0 +1,34 @@ + +package com.zteits.urbanops.module.system.controller.app.dept; + +import com.zteits.urbanops.framework.common.pojo.CommonResult; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import com.zteits.urbanops.module.system.controller.admin.dept.vo.dept.*; +import com.zteits.urbanops.module.system.dal.dataobject.dept.DeptDO; +import com.zteits.urbanops.module.system.service.dept.DeptService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 部门") +@RestController +@RequestMapping("/system/dept") +@Validated +public class AppDeptController { + + @Resource + private DeptService deptService; + + @GetMapping("/sub-list") + @Operation(summary = "获取二级部门列表") + public CommonResult> getSubDeptList() { + List list = deptService.getSubDeptListAll(); + return success(BeanUtils.toBean(list, DeptRespVO.class)); + } +} diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/convert/user/UserConvert.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/convert/user/UserConvert.java index 22fa340..3f32ad8 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/convert/user/UserConvert.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/convert/user/UserConvert.java @@ -1,5 +1,6 @@ package com.zteits.urbanops.module.system.convert.user; +import cn.hutool.core.collection.CollUtil; import com.zteits.urbanops.framework.common.util.collection.CollectionUtils; import com.zteits.urbanops.framework.common.util.collection.MapUtils; import com.zteits.urbanops.framework.common.util.object.BeanUtils; @@ -16,14 +17,79 @@ import com.zteits.urbanops.module.system.dal.dataobject.user.AdminUserDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; -@Mapper +@Mapper(componentModel = "spring") public interface UserConvert { UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); + /** + * 转换单个用户VO,拼接部门和角色信息 + */ + default UserRespVO convert(AdminUserDO adminUserDO, Map deptMap, Map> userId2RoleListMap) { + // 1. 判空处理,避免空指针 + if (adminUserDO == null) { + return null; + } + // 2. 新建VO对象,手动拷贝所有字段(对应原MapStruct自动映射的同名字段) + UserRespVO userRespVO = BeanUtils.toBean(adminUserDO,UserRespVO.class); + // 3. 手动调用辅助方法,设置拼接后的部门名称和角色名称 + userRespVO.setDeptName(getDeptName(adminUserDO.getDeptId(), deptMap)); + userRespVO.setRoleNames(getRoleNames(adminUserDO.getId(), userId2RoleListMap)); + + return userRespVO; + } + /** + * 批量转换用户VO + */ + default List convertList(List adminUserDOList, Map deptMap, Map> userId2RoleListMap) { + // 1. 判空处理 + if (CollUtil.isEmpty(adminUserDOList)) { + return new ArrayList<>(); + } + + // 2. 遍历单个转换,收集结果 + List userRespVOList = new ArrayList<>(); + for (AdminUserDO adminUserDO : adminUserDOList) { + UserRespVO userRespVO = convert(adminUserDO, deptMap, userId2RoleListMap); + if (userRespVO != null) { + userRespVOList.add(userRespVO); + } + } + + return userRespVOList; + } + /** + * 从部门映射中获取部门名称 + */ + default String getDeptName(Long deptId, Map deptMap) { + if (deptId == null || deptMap == null) { + return null; + } + DeptDO deptDO = deptMap.get(deptId); + return deptDO != null ? deptDO.getName() : null; + } + + /** + * 从角色映射中获取角色名称(拼接为逗号分隔字符串) + */ + default String getRoleNames(Long userId, Map> userId2RoleListMap) { + if (userId == null || userId2RoleListMap == null) { + return null; + } + List roleDOList = userId2RoleListMap.get(userId); + if (CollUtil.isEmpty(roleDOList)) { + return null; + } + // 拼接角色名称为逗号分隔的字符串(如:"管理员,普通用户") + return roleDOList.stream() + .map(RoleDO::getName) + .collect(Collectors.joining(",")); + } default List convertList(List list, Map deptMap) { return CollectionUtils.convertList(list, user -> convert(user, deptMap.get(user.getDeptId()))); } diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/dal/mysql/user/AdminUserMapper.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/dal/mysql/user/AdminUserMapper.java index 69908da..c53b29e 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/dal/mysql/user/AdminUserMapper.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/dal/mysql/user/AdminUserMapper.java @@ -29,6 +29,7 @@ public interface AdminUserMapper extends BaseMapperX { default PageResult selectPage(UserPageReqVO reqVO, Collection deptIds, Collection userIds) { return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(AdminUserDO::getNickname, reqVO.getNickname()) .likeIfPresent(AdminUserDO::getUsername, reqVO.getUsername()) .likeIfPresent(AdminUserDO::getMobile, reqVO.getMobile()) .eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus()) diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/DictTypeConstants.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/DictTypeConstants.java index 3a9b504..006c12a 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/DictTypeConstants.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/DictTypeConstants.java @@ -30,6 +30,8 @@ public interface DictTypeConstants { String WORKORDER_TYPE = "work_order_type"; //工单类型 + String SYSTEM_IS_INNER = "system_is_inner";//是否是内部员工 + diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/sms/SmsSceneEnum.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/sms/SmsSceneEnum.java index 1e5314a..45887b4 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/sms/SmsSceneEnum.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/sms/SmsSceneEnum.java @@ -21,7 +21,9 @@ public enum SmsSceneEnum implements ArrayValuable { MEMBER_UPDATE_PASSWORD(3, "user-update-password", "会员用户 - 修改密码"), MEMBER_RESET_PASSWORD(4, "user-reset-password", "会员用户 - 忘记密码"), USER_SMS_LOGIN(5, "SMS_319860269", "用户 - 手机号登陆"), - YL_USER_SMS_SUBMISSION(6, "SMS_493695107", "园林派单业务催交发送短信"), + YL_USER_SMS_SUBMISSION(6, "SMS_500485270", "园林派单业务催交发送短信"), + YL_USER_SMS_REMIND_ADVANCE(7, "SMS_501726147", "园林派单业务到期前短信提醒"), + YL_USER_SMS_SUBMISSION_TEST(8, "SMS_493695107", "园林派单业务催交发送短信-测试环境模板"), ADMIN_MEMBER_LOGIN(21, "admin-sms-login", "后台用户 - 手机号登录"), ADMIN_MEMBER_REGISTER(22, "admin-sms-register", "后台用户 - 手机号注册"), diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/social/SocialTypeEnum.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/social/SocialTypeEnum.java index 041f8ef..1322f30 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/social/SocialTypeEnum.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/social/SocialTypeEnum.java @@ -53,7 +53,11 @@ public enum SocialTypeEnum implements ArrayValuable { * @see 接入文档 */ WECHAT_MINI_PROGRAM(34, "WECHAT_MINI_PROGRAM"), - ; + + /** + * UAA + */ + UAA(35, "UAA"); public static final Integer[] ARRAYS = Arrays.stream(values()).map(SocialTypeEnum::getType).toArray(Integer[]::new); diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/framework/excel/convert/DeptConvert.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/framework/excel/convert/DeptConvert.java new file mode 100644 index 0000000..e819e88 --- /dev/null +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/framework/excel/convert/DeptConvert.java @@ -0,0 +1,106 @@ +package com.zteits.urbanops.module.system.framework.excel.convert; + +import cn.hutool.core.convert.Convert; +import cn.hutool.extra.spring.SpringUtil; +import cn.idev.excel.converters.Converter; +import cn.idev.excel.enums.CellDataTypeEnum; +import cn.idev.excel.metadata.GlobalConfiguration; +import cn.idev.excel.metadata.data.ReadCellData; +import cn.idev.excel.metadata.data.WriteCellData; +import cn.idev.excel.metadata.property.ExcelContentProperty; +import com.zteits.urbanops.module.system.dal.dataobject.dept.DeptDO; +import com.zteits.urbanops.module.system.service.dept.DeptService; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 若依框架 部门Excel转换器(官方规范版) + * 全程走缓存,绝不重复查询数据库 + * + * @author ruoyi + */ +@Slf4j +public class DeptConvert implements Converter { + + /** + * 若依 部门Service(走系统缓存) + */ + private static final DeptService deptService = SpringUtil.getBean(DeptService.class); + + /** + * 若依系统全局缓存:ID -> 部门名称 + */ + private static final Map DEPT_CACHE; + + /** + * 若依系统全局缓存:名称 -> 部门ID + */ + private static final Map DEPT_NAME_CACHE; + + // ===================== 静态初始化:只加载一次 ===================== + static { + // 从若依缓存获取所有部门(只查一次库,后面全走Redis) + List deptList = deptService.getChildDeptList(0L); + + // ID -> 名称(导出用) + DEPT_CACHE = deptList.stream() + .collect(Collectors.toMap(DeptDO::getId, DeptDO::getName)); + + // 名称 -> ID(导入用) + DEPT_NAME_CACHE = deptList.stream() + .collect(Collectors.toMap(DeptDO::getName, DeptDO::getId)); + + log.info("【若依部门Excel转换器】初始化缓存成功,共 {} 个部门", deptList.size()); + } + + @Override + public Class supportJavaTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + // ===================== 导入:Excel部门名称 → ID ===================== + @Override + public Object convertToJavaData(ReadCellData readCellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + String deptName = readCellData.getStringValue(); + + // 从缓存获取(0 查库) + Long deptId = DEPT_NAME_CACHE.get(deptName); + if (deptId == null) { + log.error("[convertToJavaData][部门名称({}) 不存在]", deptName); + return null; + } + + // 类型转换 + Class fieldClazz = contentProperty.getField().getType(); + return Convert.convert(fieldClazz, deptId); + } + + // ===================== 导出:ID → 部门名称 ===================== + @Override + public WriteCellData convertToExcelData(Object value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + if (value == null) { + return new WriteCellData<>(""); + } + + Long deptId = Convert.toLong(value); + // 从缓存获取名称(0 查库) + String deptName = DEPT_CACHE.get(deptId); + + if (deptName == null) { + log.error("[convertToExcelData][部门ID({}) 不存在]", deptId); + return new WriteCellData<>(""); + } + + return new WriteCellData<>(deptName); + } +} diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/framework/excel/core/DeptExcelColumnSelectFunction.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/framework/excel/core/DeptExcelColumnSelectFunction.java new file mode 100644 index 0000000..5269dda --- /dev/null +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/framework/excel/core/DeptExcelColumnSelectFunction.java @@ -0,0 +1,26 @@ +package com.zteits.urbanops.module.system.framework.excel.core; + +import com.zteits.urbanops.framework.excel.core.function.ExcelColumnSelectFunction; +import com.zteits.urbanops.module.system.util.dept.DeptCacheHelper; +import org.springframework.stereotype.Service; +import java.util.List; + +@Service +public class DeptExcelColumnSelectFunction implements ExcelColumnSelectFunction { + + public static final String NAME = "deptNameList"; + + @Override + public String getName() { + return NAME; + } + + /** + * 从缓存获取部门名称列表,作为Excel下拉选项 + */ + @Override + public List getOptions() { + return DeptCacheHelper.getNameList(); // 直接走缓存! + } + +} diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/framework/justauth/core/AuthRequestFactory.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/framework/justauth/core/AuthRequestFactory.java index a08969d..481e4b2 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/framework/justauth/core/AuthRequestFactory.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/framework/justauth/core/AuthRequestFactory.java @@ -63,7 +63,7 @@ public class AuthRequestFactory { * * @return Oauth列表 */ - @SuppressWarnings({"unchecked", "rawtypes"}) + @SuppressWarnings({ "unchecked", "rawtypes" }) public List oauthList() { // 默认列表 List defaultList = new ArrayList<>(properties.getType().keySet()); @@ -100,9 +100,10 @@ public class AuthRequestFactory { AuthRequest authRequest = getDefaultRequest(source); // 如果获取不到则尝试取自定义的 - if (authRequest == null) { - authRequest = getExtendRequest(properties.getExtend().getEnumClass(), source); - } + // if (authRequest == null) { + // authRequest = getExtendRequest(properties.getExtend().getEnumClass(), + // source); + // } if (authRequest == null) { throw new AuthException(AuthResponseStatus.UNSUPPORTED); @@ -118,7 +119,7 @@ public class AuthRequestFactory { * @param source {@link AuthSource} * @return {@link AuthRequest} */ - @SuppressWarnings({"unchecked", "rawtypes"}) + @SuppressWarnings({ "unchecked", "rawtypes" }) private AuthRequest getExtendRequest(Class clazz, String source) { String upperSource = source.toUpperCase(); try { @@ -151,7 +152,6 @@ public class AuthRequestFactory { return null; } - /** * 获取默认的 Request * @@ -159,134 +159,136 @@ public class AuthRequestFactory { * @return {@link AuthRequest} */ private AuthRequest getDefaultRequest(String source) { - AuthDefaultSource authDefaultSource; + AuthSource authDefaultSource; try { authDefaultSource = EnumUtil.fromString(AuthDefaultSource.class, source.toUpperCase()); } catch (IllegalArgumentException e) { // 无自定义匹配 - return null; + authDefaultSource = EnumUtil.fromString(CustomerAuthSource.class, source.toUpperCase()); } - AuthConfig config = properties.getType().get(authDefaultSource.name()); + AuthConfig config = properties.getType().get(authDefaultSource.getName()); // 找不到对应关系,直接返回空 if (config == null) { return null; } // 配置 http config - configureHttpConfig(authDefaultSource.name(), config, properties.getHttpConfig()); + configureHttpConfig(authDefaultSource.getName(), config, properties.getHttpConfig()); - switch (authDefaultSource) { - case GITHUB: + switch (authDefaultSource.getName()) { + case "GITHUB": return new AuthGithubRequest(config, authStateCache); - case WEIBO: + case "WEIBO": return new AuthWeiboRequest(config, authStateCache); - case GITEE: + case "GITEE": return new AuthGiteeRequest(config, authStateCache); - case DINGTALK: + case "DINGTALK": return new AuthDingTalkRequest(config, authStateCache); - case DINGTALK_V2: + case "DINGTALK_V2": return new AuthDingTalkV2Request(config, authStateCache); - case DINGTALK_ACCOUNT: + case "DINGTALK_ACCOUNT": return new AuthDingTalkAccountRequest(config, authStateCache); - case BAIDU: + case "BAIDU": return new AuthBaiduRequest(config, authStateCache); - case CSDN: + case "CSDN": return new AuthCsdnRequest(config, authStateCache); - case CODING: + case "CODING": return new AuthCodingRequest(config, authStateCache); - case OSCHINA: + case "OSCHINA": return new AuthOschinaRequest(config, authStateCache); - case ALIPAY: + case "ALIPAY": return new AuthAlipayRequest(config, authStateCache); - case QQ: + case "QQ": return new AuthQqRequest(config, authStateCache); - case WECHAT_OPEN: + case "WECHAT_OPEN": return new AuthWeChatOpenRequest(config, authStateCache); - case WECHAT_MP: + case "WECHAT_MP": return new AuthWeChatMpRequest(config, authStateCache); - case TAOBAO: + case "TAOBAO": return new AuthTaobaoRequest(config, authStateCache); - case GOOGLE: + case "GOOGLE": return new AuthGoogleRequest(config, authStateCache); - case FACEBOOK: + case "FACEBOOK": return new AuthFacebookRequest(config, authStateCache); - case DOUYIN: + case "DOUYIN": return new AuthDouyinRequest(config, authStateCache); - case LINKEDIN: + case "LINKEDIN": return new AuthLinkedinRequest(config, authStateCache); - case MICROSOFT: + case "MICROSOFT": return new AuthMicrosoftRequest(config, authStateCache); - case MICROSOFT_CN: + case "MICROSOFT_CN": return new AuthMicrosoftCnRequest(config, authStateCache); - case MI: + case "MI": return new AuthMiRequest(config, authStateCache); - case TOUTIAO: + case "TOUTIAO": return new AuthToutiaoRequest(config, authStateCache); - case TEAMBITION: + case "TEAMBITION": return new AuthTeambitionRequest(config, authStateCache); - case RENREN: + case "RENREN": return new AuthRenrenRequest(config, authStateCache); - case PINTEREST: + case "PINTEREST": return new AuthPinterestRequest(config, authStateCache); - case STACK_OVERFLOW: + case "STACK_OVERFLOW": return new AuthStackOverflowRequest(config, authStateCache); - case HUAWEI: + case "HUAWEI": return new AuthHuaweiRequest(config, authStateCache); - case HUAWEI_V3: + case "HUAWEI_V3": return new AuthHuaweiV3Request(config, authStateCache); - case WECHAT_ENTERPRISE: + case "WECHAT_ENTERPRISE": return new AuthWeChatEnterpriseQrcodeRequest(config, authStateCache); - case WECHAT_ENTERPRISE_V2: + case "WECHAT_ENTERPRISE_V2": return new AuthWeChatEnterpriseQrcodeV2Request(config, authStateCache); - case WECHAT_ENTERPRISE_QRCODE_THIRD: + case "WECHAT_ENTERPRISE_QRCODE_THIRD": return new AuthWeChatEnterpriseThirdQrcodeRequest(config, authStateCache); - case WECHAT_ENTERPRISE_WEB: + case "WECHAT_ENTERPRISE_WEB": return new AuthWeChatEnterpriseWebRequest(config, authStateCache); - case KUJIALE: + case "KUJIALE": return new AuthKujialeRequest(config, authStateCache); - case GITLAB: + case "GITLAB": return new AuthGitlabRequest(config, authStateCache); - case MEITUAN: + case "MEITUAN": return new AuthMeituanRequest(config, authStateCache); - case ELEME: + case "ELEME": return new AuthElemeRequest(config, authStateCache); - case TWITTER: + case "TWITTER": return new AuthTwitterRequest(config, authStateCache); - case FEISHU: + case "FEISHU": return new AuthFeishuRequest(config, authStateCache); - case JD: + case "JD": return new AuthJdRequest(config, authStateCache); - case ALIYUN: + case "ALIYUN": return new AuthAliyunRequest(config, authStateCache); - case XMLY: + case "XMLY": return new AuthXmlyRequest(config, authStateCache); - case AMAZON: + case "AMAZON": return new AuthAmazonRequest(config, authStateCache); - case SLACK: + case "SLACK": return new AuthSlackRequest(config, authStateCache); - case LINE: + case "LINE": return new AuthLineRequest(config, authStateCache); - case OKTA: + case "OKTA": return new AuthOktaRequest(config, authStateCache); - case PROGINN: - return new AuthProginnRequest(config,authStateCache); - case AFDIAN: - return new AuthAfDianRequest(config,authStateCache); - case APPLE: - return new AuthAppleRequest(config,authStateCache); - case FIGMA: - return new AuthFigmaRequest(config,authStateCache); - case WECHAT_MINI_PROGRAM: + case "PROGINN": + return new AuthProginnRequest(config, authStateCache); + case "AFDIAN": + return new AuthAfDianRequest(config, authStateCache); + case "APPLE": + return new AuthAppleRequest(config, authStateCache); + case "FIGMA": + return new AuthFigmaRequest(config, authStateCache); + case "WECHAT_MINI_PROGRAM": config.setIgnoreCheckRedirectUri(true); config.setIgnoreCheckState(true); return new AuthWechatMiniProgramRequest(config, authStateCache); - case QQ_MINI_PROGRAM: + case "QQ_MINI_PROGRAM": config.setIgnoreCheckRedirectUri(true); config.setIgnoreCheckState(true); return new AuthQQMiniProgramRequest(config, authStateCache); + case "UAA": + return new AuthUaaRequest(config, authStateCache); default: return null; } @@ -298,23 +300,26 @@ public class AuthRequestFactory { * @param authSource {@link AuthSource} * @param authConfig {@link AuthConfig} */ - private void configureHttpConfig(String authSource, AuthConfig authConfig, JustAuthProperties.JustAuthHttpConfig httpConfig) { + private void configureHttpConfig(String authSource, AuthConfig authConfig, + JustAuthProperties.JustAuthHttpConfig httpConfig) { if (null == httpConfig) { return; } - Map proxyConfigMap = httpConfig.getProxy(); - if (CollectionUtils.isEmpty(proxyConfigMap)) { - return; - } - JustAuthProperties.JustAuthProxyConfig proxyConfig = proxyConfigMap.get(authSource); - if (null == proxyConfig) { - return; + // 构建 HttpConfig,优先设置 timeout(独立于 proxy 配置) + HttpConfig.HttpConfigBuilder builder = HttpConfig.builder() + .timeout(httpConfig.getTimeout()); + + // 如果有代理配置,则设置代理 + Map proxyConfigMap = httpConfig.getProxy(); + if (!CollectionUtils.isEmpty(proxyConfigMap)) { + JustAuthProperties.JustAuthProxyConfig proxyConfig = proxyConfigMap.get(authSource); + if (null != proxyConfig) { + builder.proxy(new Proxy(Proxy.Type.valueOf(proxyConfig.getType()), + new InetSocketAddress(proxyConfig.getHostname(), proxyConfig.getPort()))); + } } - authConfig.setHttpConfig(HttpConfig.builder() - .timeout(httpConfig.getTimeout()) - .proxy(new Proxy(Proxy.Type.valueOf(proxyConfig.getType()), new InetSocketAddress(proxyConfig.getHostname(), proxyConfig.getPort()))) - .build()); + authConfig.setHttpConfig(builder.build()); } } diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/framework/justauth/core/AuthUaaRequest.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/framework/justauth/core/AuthUaaRequest.java new file mode 100644 index 0000000..b6a35af --- /dev/null +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/framework/justauth/core/AuthUaaRequest.java @@ -0,0 +1,104 @@ +package com.zteits.urbanops.module.system.framework.justauth.core; + +import com.alibaba.fastjson.JSONObject; +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.interfaces.DecodedJWT; +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.enums.AuthUserGender; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthToken; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.request.AuthDefaultRequest; +import org.springframework.core.io.ClassPathResource; + +import java.security.cert.Certificate; +import java.security.cert.CertificateFactory; +import java.security.interfaces.RSAPublicKey; + +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.module.system.enums.ErrorCodeConstants.AUTH_LOGIN_USER_DISABLED; + + +/** + * HRHB SSO 单点登录实现 + * + * @author gelinghu + */ +public class AuthUaaRequest extends AuthDefaultRequest { + + public AuthUaaRequest(AuthConfig config, AuthStateCache authStateCache) { + super(config, CustomerAuthSource.UAA, authStateCache); + } + + @Override + public AuthToken getAccessToken(AuthCallback authCallback) { + try { + // doPostAuthorizationCode 会使用 source 中配置的 accessToken URL + String response = this.doPostAuthorizationCode(authCallback.getCode()); + JSONObject accessTokenObject = JSONObject.parseObject(response); + this.checkResponse(accessTokenObject); + + return AuthToken.builder() + .accessToken(accessTokenObject.getString("access_token")) + .refreshToken(accessTokenObject.getString("refresh_token")) + .scope(accessTokenObject.getString("scope")) + .tokenType(accessTokenObject.getString("token_type")) + .expireIn(accessTokenObject.getIntValue("expires_in")) + .build(); + } catch (Exception e) { + // 记录详细的错误信息,便于排查问题 + throw new AuthException("获取访问令牌失败: " + e.getMessage(), e); + } + } + + @Override + public AuthUser getUserInfo(AuthToken authToken) { + CertificateFactory certificateFactory = null; + try { + certificateFactory = CertificateFactory.getInstance("X.509"); + // 读取cer公钥证书来配置解码器 + ClassPathResource resource = new ClassPathResource("pub.cer"); + Certificate certificate = certificateFactory.generateCertificate(resource.getInputStream()); + RSAPublicKey publicKey = (RSAPublicKey) certificate.getPublicKey(); + + Algorithm algorithm = Algorithm.RSA256(publicKey, null); + + JWTVerifier verifier = JWT.require(algorithm).acceptLeeway(60) + .build(); + // 解析 JWT + DecodedJWT decodedJWT = verifier.verify(authToken.getAccessToken()); + DecodedJWT jwt = JWT.decode(authToken.getAccessToken()); + String staffNo = jwt.getClaim("account").asString(); + return AuthUser.builder() + .rawUserInfo(null) + .uuid(staffNo) + .username(staffNo) + .avatar("") + .blog("") + .nickname(staffNo) + .company("") + .location("") + .email("") + .remark("") + .gender(AuthUserGender.UNKNOWN) + .token(authToken) + .source(this.source.toString()) + .build(); + } catch (Exception e) { + throw exception(AUTH_LOGIN_USER_DISABLED, "UAA登录失败"); + } + } + + /** + * 检查响应是否有错误 + */ + private void checkResponse(JSONObject object) { + if (object.containsKey("error")) { + throw new AuthException(object.getString("error_description")); + } + } +} \ No newline at end of file diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/framework/justauth/core/CustomerAuthSource.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/framework/justauth/core/CustomerAuthSource.java new file mode 100644 index 0000000..26a30c3 --- /dev/null +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/framework/justauth/core/CustomerAuthSource.java @@ -0,0 +1,40 @@ +package com.zteits.urbanops.module.system.framework.justauth.core; + +import me.zhyd.oauth.config.AuthSource; + +public enum CustomerAuthSource implements AuthSource { + + UAA { + @Override + public String authorize() { +// return "https://test.jichengshanshui.com.cn:28301/oauth2/authorize"; +// return "http://localhost:8080/oauth2/authorize"; + return "https://uaa.jichengshanshui.com.cn:28201/oauth2/authorize"; + } + + @Override + public String accessToken() { +// return "https://test.jichengshanshui.com.cn:28301/oauth2/token"; +// return "http://localhost:8080/oauth2/token"; + return "https://uaa.jichengshanshui.com.cn:28201/oauth2/token"; + } + + @Override + public String userInfo() { +// return "https://test.jichengshanshui.com.cn:28301/oauth2/userinfo"; +// return "http://localhost:8080/oauth2/userinfo"; + return "https://uaa.jichengshanshui.com.cn:28201/oauth2/userinfo"; + } + + @Override + public String getName() { + return "UAA"; + } + + + @Override + public Class getTargetClass() { + return CustomerAuthSource.class; + } + } +} diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/auth/AdminAuthServiceImpl.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/auth/AdminAuthServiceImpl.java index fc4ecd8..663d8b7 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/auth/AdminAuthServiceImpl.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/auth/AdminAuthServiceImpl.java @@ -129,7 +129,8 @@ public class AdminAuthServiceImpl implements AdminAuthService { } // 登录场景,验证是否存在 - if (userService.getUserByMobile(reqVO.getMobile()) == null) { + AdminUserDO userByMobile = userService.getUserByMobile(reqVO.getMobile()); + if (userByMobile == null || CommonStatusEnum.isDisable(userByMobile.getStatus())) { throw exception(AUTH_MOBILE_NOT_EXISTS); } // 发送验证码 @@ -175,16 +176,27 @@ public class AdminAuthServiceImpl implements AdminAuthService { // 使用 code 授权码,进行登录。然后,获得到绑定的用户编号 SocialUserRespDTO socialUser = socialUserService.getSocialUserByCode(UserTypeEnum.ADMIN.getValue(), reqVO.getType(), reqVO.getCode(), reqVO.getState()); - if (socialUser == null || socialUser.getUserId() == null) { + if (socialUser == null) { throw exception(AUTH_THIRD_LOGIN_NOT_BIND); } // 获得用户 - AdminUserDO user = userService.getUser(socialUser.getUserId()); + AdminUserDO user = null; + user = userService.getUserByUsername(socialUser.getOpenid()); + if (user == null) { + user = userService.getUserByMobile(socialUser.getOpenid()); + } + if (user == null) { throw exception(USER_NOT_EXISTS); } + if (socialUser.getUserId() == null) { + SocialUserBindReqDTO reqDTO = new SocialUserBindReqDTO(user.getId(), UserTypeEnum.ADMIN.getValue(), + reqVO.getType(), reqVO.getCode(), reqVO.getState()); + socialUserService.bindSocialUser(reqDTO); + } + // 创建 Token 令牌,记录登录日志 return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL); } diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptService.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptService.java index 0de4a35..0ea13d0 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptService.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptService.java @@ -65,6 +65,7 @@ public interface DeptService { * @return 部门信息数组 */ List getSubDeptList(); + List getSubDeptListAll(); /** * 筛选部门列表 @@ -151,4 +152,16 @@ public interface DeptService { * @return 部门树 */ List getDeptAndUserTree(); + + /** + * 查询所有部门信息 + * @return + */ + List getDeptAllList(); + /** + * 获取部门父级部门id(公司) + * @param deptId + * @return + */ + Long getParentDeptId(Long deptId); } diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptServiceImpl.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptServiceImpl.java index 0e02add..2e690ff 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptServiceImpl.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptServiceImpl.java @@ -51,6 +51,7 @@ public class DeptServiceImpl implements DeptService { @Resource private AdminUserMapper userMapper; + @Override @CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST, allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存 @@ -192,6 +193,7 @@ public class DeptServiceImpl implements DeptService { } @Override + @DataPermission(enable = false) public List getSubDeptList() { List list = deptMapper.selectList(DeptDO::getParentId, 100); Long companyId = SecurityFrameworkUtils.getCompanyId(); @@ -206,6 +208,12 @@ public class DeptServiceImpl implements DeptService { } @Override + @DataPermission(enable = false) + public List getSubDeptListAll() { + return deptMapper.selectList(DeptDO::getParentId, 100); + } + + @Override public List getDeptList(DeptListReqVO reqVO) { List list = deptMapper.selectList(reqVO); list.sort(Comparator.comparing(DeptDO::getSort)); @@ -310,7 +318,8 @@ public class DeptServiceImpl implements DeptService { for(AdminUserDO adminUserDO :userList){ UserDO userDO = new UserDO(); userDO.setUserId(adminUserDO.getId()); - userDO.setUsername(adminUserDO.getUsername()); + userDO.setUsername(adminUserDO.getNickname()); + userDO.setCompanyId(getParentDeptId(adminUserDO.getDeptId())); userDO.setDeptId(adminUserDO.getDeptId()); userDOList.add(userDO); } @@ -322,4 +331,68 @@ public class DeptServiceImpl implements DeptService { } return TreeUtils.getTreeList(deptListT); } + + @Override + public List getDeptAllList() { + QueryWrapper sql = new QueryWrapper<>(); + sql.lambda().eq(DeptDO::getDeleted, 0); + return deptMapper.selectList(sql); + } + + @Override + public Long getParentDeptId(Long deptId) { + if (deptId == null) { + return null; + } + + DeptDO dept = getDept(deptId); + if (dept == null) { + return null; + } + + // 顶级部门ID (parentId=0) + if (dept.getParentId().equals(0L)) { + return dept.getId(); + } + + // 直接是二级部门 (parentId=100) + if (dept.getParentId().equals(100L)) { + return dept.getId(); + } + + // 递归查找父部门链中parentId=100的部门 + Long result = findParentDeptWithParentId(dept.getParentId(), 100L); + // 如果找不到parentId=100的部门,返回当前部门的id作为默认值 + return result != null ? result : dept.getParentId(); + } + + /** + * 递归查找父部门链中parentId等于目标值的部门ID + * @param currentDeptId 当前部门ID + * @param targetParentId 目标parentId + * @return 匹配的部门ID,无则返回null + */ + private Long findParentDeptWithParentId(Long currentDeptId, Long targetParentId) { + if (currentDeptId == null) { + return null; + } + + DeptDO dept = getDept(currentDeptId); + if (dept == null) { + return null; + } + + // 找到目标父部门 + if (dept.getParentId().equals(targetParentId)) { + return dept.getId(); + } + + // 达到顶级部门,停止递归 + if (dept.getParentId().equals(0L)) { + return dept.getId(); // 改为返回顶级部门ID,而不是null + } + + // 继续向上查找 + return findParentDeptWithParentId(dept.getParentId(), targetParentId); + } } diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/oauth2/SsoProperies.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/oauth2/SsoProperies.java new file mode 100644 index 0000000..4179773 --- /dev/null +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/oauth2/SsoProperies.java @@ -0,0 +1,41 @@ +package com.zteits.urbanops.module.system.service.oauth2; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * Description:

+ *

+ * Author: gelinghu + * Date: 2025年05月14 15:28 + * @author gelinghu + */ + +@Data +@Configuration +@ConfigurationProperties(prefix = "sso.client") +public class SsoProperies { + + private String switchState; + + private String clientId; + + private String clientSecret; + + private String authorizeUrl; + + private String baseUrl; + + private String redirectUri; + + private String authorizationUri; + + private String tokenUri; + + private String jwtPublicKey; + + private String syncUserUri; +} + + diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/oauth2/SsoService.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/oauth2/SsoService.java new file mode 100644 index 0000000..4fe0104 --- /dev/null +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/oauth2/SsoService.java @@ -0,0 +1,50 @@ +package com.zteits.urbanops.module.system.service.oauth2; + +import com.smart.sdk.sso.client.Oauth2Client; +import com.smart.sdk.sso.client.SsoOauth2Client; +import com.smart.sdk.sso.domain.SsoUserSyncVo; +import com.zteits.urbanops.framework.common.enums.CommonStatusEnum; +import com.zteits.urbanops.module.system.dal.dataobject.user.AdminUserDO; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * Description:

+ *

+ * Author: gelinghu + * Date: 2025年5月17 17:33 + */ +@Component +@EnableConfigurationProperties(SsoProperies.class) +public class SsoService { + + private SsoProperies ssoProperies; + + private Oauth2Client client; + + public SsoService(SsoProperies ssoProperies) { + this.ssoProperies = ssoProperies; + client = new SsoOauth2Client(ssoProperies.getClientId(), ssoProperies.getClientSecret(), ssoProperies.getBaseUrl(), ssoProperies.getRedirectUri()); + } + + public Oauth2Client getClient() { + return client; + } + + public SsoProperies getSsoProperies() { + return ssoProperies; + } + + public void syncUser(AdminUserDO user) { + SsoUserSyncVo ssoUserSyncVo = new SsoUserSyncVo(); + ssoUserSyncVo.setStaffNo(user.getMobile()) + .setAccount(user.getUsername()) + .setName(user.getNickname()) + .setEmail(user.getEmail()) + .setState(CommonStatusEnum.ENABLE.getStatus().equals(user.getStatus()) ? 1 : 0); + getClient().syncUser(ssoUserSyncVo); + } + +} + + diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/PermissionService.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/PermissionService.java index 0b3e089..4362373 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/PermissionService.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/PermissionService.java @@ -3,6 +3,8 @@ package com.zteits.urbanops.module.system.service.permission; import com.zteits.urbanops.framework.common.biz.system.permission.dto.DeptDataPermissionRespDTO; import java.util.Collection; +import java.util.List; +import java.util.Map; import java.util.Set; import static java.util.Collections.singleton; @@ -26,6 +28,13 @@ public interface PermissionService { boolean hasAnyPermissions(Long userId, String... permissions); /** + * 获取多个用户的角色信息 + * @param userIdList + * @return + */ + public Map> getUserRoleIdListByUserIds(List userIdList); + + /** * 判断是否有角色,任一一个即可 * * @param roles 角色数组 diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/PermissionServiceImpl.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/PermissionServiceImpl.java index 21cdac4..0be2829 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/PermissionServiceImpl.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/PermissionServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.extra.spring.SpringUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.zteits.urbanops.framework.common.enums.CommonStatusEnum; import com.zteits.urbanops.framework.common.util.collection.CollectionUtils; import com.zteits.urbanops.framework.datapermission.core.annotation.DataPermission; @@ -32,6 +33,7 @@ import org.springframework.transaction.annotation.Transactional; import jakarta.annotation.Resource; import java.util.*; import java.util.function.Supplier; +import java.util.stream.Collectors; import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertSet; import static com.zteits.urbanops.framework.common.util.json.JsonUtils.toJsonString; @@ -60,6 +62,22 @@ public class PermissionServiceImpl implements PermissionService { private AdminUserService userService; @Override + public Map> getUserRoleIdListByUserIds(List userIdList) { + if (CollUtil.isEmpty(userIdList)) { + return Collections.emptyMap(); + } + // 查询用户-角色关联数据 + List userRoleDOList = userRoleMapper.selectList(Wrappers.lambdaQuery() + .in(UserRoleDO::getUserId, userIdList)); + // 分组封装为「用户ID-角色ID列表」 + return userRoleDOList.stream() + .collect(Collectors.groupingBy( + UserRoleDO::getUserId, + Collectors.mapping(UserRoleDO::getRoleId, Collectors.toList()) + )); + } + + @Override public boolean hasAnyPermissions(Long userId, String... permissions) { // 如果为空,说明已经有权限 if (ArrayUtil.isEmpty(permissions)) { diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/RoleService.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/RoleService.java index c37568d..fdd3056 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/RoleService.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/RoleService.java @@ -9,6 +9,7 @@ import jakarta.validation.Valid; import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -19,6 +20,13 @@ import java.util.Set; public interface RoleService { /** + * 从缓存中批量获取角色信息,返回「角色ID-角色DO」的映射 + * @param roleIdList 角色ID列表 + * @return Map 角色ID为key,RoleDO为value + */ + Map getRoleMapFromCache(List roleIdList); + + /** * 创建角色 * * @param createReqVO 创建角色信息 diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/RoleServiceImpl.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/RoleServiceImpl.java index ed00444..e7fd52b 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/RoleServiceImpl.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/RoleServiceImpl.java @@ -5,11 +5,13 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zteits.urbanops.framework.common.enums.CommonStatusEnum; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.common.util.collection.CollectionUtils; import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import com.zteits.urbanops.framework.datapermission.core.annotation.DataPermission; import com.zteits.urbanops.module.system.controller.admin.permission.vo.role.RolePageReqVO; import com.zteits.urbanops.module.system.controller.admin.permission.vo.role.RoleRespVO; import com.zteits.urbanops.module.system.controller.admin.permission.vo.role.RoleSaveReqVO; @@ -34,6 +36,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.util.*; +import java.util.stream.Collectors; import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertMap; @@ -58,6 +61,37 @@ public class RoleServiceImpl implements RoleService { @Resource private UserRoleMapper userRoleMapper; + /** + * 从缓存中批量获取角色信息,缓存未命中则查询数据库并缓存结果 + */ + @Override + //@Cacheable(value = "role", key = "#roleIdList.toString()", unless = "#result.isEmpty()") + // 缓存注解说明: + // value:缓存名称,区分不同模块缓存 + // key:缓存键,用角色ID列表拼接作为唯一键 + // unless:结果为空时不缓存,避免无效缓存 + @DataPermission(enable = false) + public Map getRoleMapFromCache(List roleIdList) { + // 1. 空值处理,避免无效查询 + if (CollUtil.isEmpty(roleIdList)) { + return Map.of(); // 返回空不可变Map,避免空指针 + } + + // 2. 批量查询数据库(缓存未命中时执行) + List roleDOList = roleMapper.selectList( + new LambdaQueryWrapper() + .in(RoleDO::getId, roleIdList) // 批量查询,仅一次数据库访问 + ); + + // 3. 转换为「角色ID-角色DO」的Map,方便后续取值 + return roleDOList.stream() + .collect(Collectors.toMap( + RoleDO::getId, // 以角色ID作为key + roleDO -> roleDO, // 以角色DO作为value + (existing, replacement) -> existing // 解决重复ID冲突(取已有值,实际不会出现) + )); + } + @Override @Transactional(rollbackFor = Exception.class) @LogRecord(type = SYSTEM_ROLE_TYPE, subType = SYSTEM_ROLE_CREATE_SUB_TYPE, bizNo = "{{#role.id}}", diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/user/AdminUserServiceImpl.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/user/AdminUserServiceImpl.java index a8395a8..3d93326 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/user/AdminUserServiceImpl.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/user/AdminUserServiceImpl.java @@ -27,6 +27,7 @@ import com.zteits.urbanops.module.system.dal.mysql.user.AdminUserMapper; import com.zteits.urbanops.module.system.service.dept.DeptService; import com.zteits.urbanops.module.system.service.dept.PostService; import com.zteits.urbanops.module.system.service.dict.DictDataService; +import com.zteits.urbanops.module.system.service.oauth2.SsoService; import com.zteits.urbanops.module.system.service.permission.PermissionService; import com.zteits.urbanops.module.system.service.tenant.TenantService; import com.google.common.annotations.VisibleForTesting; @@ -87,6 +88,10 @@ public class AdminUserServiceImpl implements AdminUserService { @Resource private DictDataService dictDataService; + @Resource + private SsoService ssoService; + + @Override @Transactional(rollbackFor = Exception.class) @LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_CREATE_SUB_TYPE, bizNo = "{{#user.id}}", @@ -115,6 +120,8 @@ public class AdminUserServiceImpl implements AdminUserService { // 3. 记录操作日志上下文 LogRecordContext.putVariable("user", user); + + ssoService.syncUser(user); return user.getId(); } @@ -232,6 +239,8 @@ public class AdminUserServiceImpl implements AdminUserService { updateObj.setId(id); updateObj.setStatus(status); userMapper.updateById(updateObj); + + ssoService.syncUser(updateObj); } @Override @@ -251,6 +260,8 @@ public class AdminUserServiceImpl implements AdminUserService { // 3. 记录操作日志上下文 LogRecordContext.putVariable("user", user); + + ssoService.syncUser(user); } @Override @@ -657,72 +668,59 @@ public class AdminUserServiceImpl implements AdminUserService { } private Long getParentDeptId(Long deptId) { + if (deptId == null) { + return null; + } + DeptDO dept = deptService.getDept(deptId); if (dept == null) { return null; } - //顶级部门ID - if(dept.getParentId().equals(0L)) { + + // 顶级部门ID (parentId=0) + if (dept.getParentId().equals(0L)) { return dept.getId(); } - //二级部门 - if(dept.getParentId().equals(100L)) { + + // 直接是二级部门 (parentId=100) + if (dept.getParentId().equals(100L)) { return dept.getId(); } - //一级以下查二级 - List allDeptList = deptService.getSubDeptAllList(); - if (CollectionUtil.isEmpty(allDeptList)) { - return null; - } - // 构建部门ID → 部门对象的Map(核心:快速根据ID查部门) - Map deptMap = allDeptList.stream() - // 第一个参数:Map 的 Key(取 deptId) - // 第二个参数:Map 的 Value(取 Dept 对象本身) - .collect(Collectors.toMap(DeptDO::getId, DeptDO -> DeptDO)); - - DeptDO findDept = findDeptByTargetParentIdLoop(dept.getParentId(), 100L, deptMap); - return findDept == null ? null : findDept.getId(); + + // 递归查找父部门链中parentId=100的部门 + Long result = findParentDeptWithParentId(dept.getParentId(), 100L); + // 如果找不到parentId=100的部门,返回当前部门的id作为默认值 + return result != null ? result : dept.getParentId(); } - + /** - * 循环向上追溯,查找父部门ID等于目标值的部门对象(避免栈溢出) - * @param startDeptId 起始部门ID(指定deptId) - * @param targetParentId 目标parentId(要匹配的父部门ID) - * @param deptIdMap 部门ID映射Map - * @return 匹配的部门对象(无则返回null) + * 递归查找父部门链中parentId等于目标值的部门ID + * @param currentDeptId 当前部门ID + * @param targetParentId 目标parentId + * @return 匹配的部门ID,无则返回null */ - public static DeptDO findDeptByTargetParentIdLoop(Long startDeptId, Long targetParentId, Map deptIdMap) { - // 1. 入参校验 - if (startDeptId == null || targetParentId == null || deptIdMap == null || targetParentId == 0) { + private Long findParentDeptWithParentId(Long currentDeptId, Long targetParentId) { + if (currentDeptId == null) { return null; } - - Long currentDeptId = startDeptId; - while (true) { - // 2. 获取当前部门对象 - DeptDO currentDept = deptIdMap.get(currentDeptId); - if (currentDept == null) { - break; - } - - // 3. 获取当前部门的父ID(父部门的deptId) - Long parentDeptId = currentDept.getParentId(); - // 终止条件:追溯到顶级部门(parentId=0) - if (parentDeptId == 0L) { - break; - } - - // 4. 校验是否匹配目标parentId - if (parentDeptId.equals(targetParentId)) { - return currentDept; // 匹配,返回对象 - } - - // 5. 未匹配,继续追溯父部门 - currentDeptId = currentDept.getParentId(); + + DeptDO dept = deptService.getDept(currentDeptId); + if (dept == null) { + return null; } - - // 遍历结束未匹配 - return null; + + // 找到目标父部门 + if (dept.getParentId().equals(targetParentId)) { + return dept.getId(); + } + + // 达到顶级部门,停止递归 + if (dept.getParentId().equals(0L)) { + return dept.getId(); // 改为返回顶级部门ID,而不是null + } + + // 继续向上查找 + return findParentDeptWithParentId(dept.getParentId(), targetParentId); } } diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/util/dept/DeptCacheHelper.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/util/dept/DeptCacheHelper.java new file mode 100644 index 0000000..04c3372 --- /dev/null +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/util/dept/DeptCacheHelper.java @@ -0,0 +1,81 @@ +package com.zteits.urbanops.module.system.util.dept; + +import cn.hutool.core.collection.CollUtil; +import com.zteits.urbanops.module.system.dal.dataobject.dept.DeptDO; +import com.zteits.urbanops.module.system.service.dept.DeptService; +import lombok.extern.slf4j.Slf4j; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 部门全局缓存工具 + * 给 Excel 导入导出、下拉框、转换器统一使用 + * 只加载一次,不重复查询 + */ +@Slf4j +public class DeptCacheHelper { + + private static List DEPT_LIST; + private static Map DEPT_ID_MAP; + private static Map DEPT_NAME_MAP; + private static List DEPT_NAME_LIST; + + /** + * 初始化部门缓存(在导入模板接口中主动调用) + */ + public static void init(DeptService deptService, Long rootDeptId) { + + //每次调用都使用传入的 deptId,每次可刷新 + if (DEPT_LIST != null) { + // 清空旧缓存 + DEPT_LIST = null; + DEPT_ID_MAP = null; + DEPT_NAME_MAP = null; + DEPT_NAME_LIST = null; + } + + try { + + // 1. 批量查询部门(只查一次) + DEPT_LIST = deptService.getLastDeptList(rootDeptId); + + if (CollUtil.isEmpty(DEPT_LIST)) { + log.warn("[DeptCacheHelper] 未查询到部门数据"); + return; + } + + // 3. 构建各种缓存 + DEPT_ID_MAP = DEPT_LIST.stream() + .collect(Collectors.toMap(DeptDO::getId, Function.identity())); + + DEPT_NAME_MAP = DEPT_LIST.stream() + .collect(Collectors.toMap(DeptDO::getName, Function.identity())); + + DEPT_NAME_LIST = DEPT_LIST.stream() + .map(DeptDO::getName) + .collect(Collectors.toList()); + + log.info("[DeptCacheHelper] 部门缓存初始化成功,共 {} 个部门", DEPT_LIST.size()); + } catch (Exception e) { + log.error("[DeptCacheHelper] 部门缓存初始化失败", e); + } + } + + // ===================== 提供给外部使用 ===================== + public static DeptDO getById(Long id) { + return DEPT_ID_MAP == null ? null : DEPT_ID_MAP.get(id); + } + + public static DeptDO getByName(String name) { + return DEPT_NAME_MAP == null ? null : DEPT_NAME_MAP.get(name); + } + + public static List getNameList() { + return DEPT_NAME_LIST == null ? Collections.emptyList() : DEPT_NAME_LIST; + } + + public static boolean isEmpty() { + return CollUtil.isEmpty(DEPT_LIST); + } +} diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/util/tree/UserDO.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/util/tree/UserDO.java index 6c4de34..eaf3837 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/util/tree/UserDO.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/util/tree/UserDO.java @@ -10,4 +10,6 @@ public class UserDO { private String username; private Long deptId; + + private Long companyId; } diff --git a/urbanops-module-system/src/test/java/com/zteits/urbanops/module/system/service/user/AdminUserServiceImplTest.java b/urbanops-module-system/src/test/java/com/zteits/urbanops/module/system/service/user/AdminUserServiceImplTest.java index e45c16e..9717b40 100644 --- a/urbanops-module-system/src/test/java/com/zteits/urbanops/module/system/service/user/AdminUserServiceImplTest.java +++ b/urbanops-module-system/src/test/java/com/zteits/urbanops/module/system/service/user/AdminUserServiceImplTest.java @@ -482,7 +482,7 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { public void testImportUserList_02() { // 准备参数 UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + //o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围 o.setEmail(randomEmail()); o.setMobile(randomMobile()); @@ -517,7 +517,7 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { userMapper.insert(dbUser); // 准备参数 UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + //o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围 o.setUsername(dbUser.getUsername()); o.setEmail(randomEmail()); @@ -549,7 +549,7 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { userMapper.insert(dbUser); // 准备参数 UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + //o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围 o.setUsername(dbUser.getUsername()); o.setEmail(randomEmail()); diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/api/constant/BpmCommonConstant.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/api/constant/BpmCommonConstant.java index 2f3c2ad..5c74ed4 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/api/constant/BpmCommonConstant.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/api/constant/BpmCommonConstant.java @@ -181,6 +181,8 @@ public class BpmCommonConstant { public static final String AI_DISPATCHER = "AI_dispatcher"; /*养护级别-字典key*/ public static final String CONSERVE_LEVEL = "conserve_level"; + + public static final String SANHAI_COMPANY = "sanhai_compamys"; //--------------------------------------------------------------------------------- /** diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/MainInfoController.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/MainInfoController.java index 23c2831..bf20f73 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/MainInfoController.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/MainInfoController.java @@ -1,11 +1,16 @@ package com.zteits.urbanops.module.workorder.controller.admin.maininfo; import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; +import com.zteits.urbanops.framework.common.biz.system.permission.PermissionCommonApi; +import com.zteits.urbanops.framework.common.biz.system.permission.dto.DeptDataPermissionRespDTO; import com.zteits.urbanops.framework.common.pojo.CommonResult; import com.zteits.urbanops.framework.common.pojo.PageParam; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import com.zteits.urbanops.framework.datapermission.core.rule.dept.DeptDataPermissionRule; import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; +import com.zteits.urbanops.framework.security.core.LoginUser; +import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; import com.zteits.urbanops.module.bpm.api.task.BpmTaskApi; import com.zteits.urbanops.module.bpm.api.task.dto.BpmUserSimpleReqDTO; import com.zteits.urbanops.module.system.api.user.AdminUserApi; @@ -39,6 +44,7 @@ import java.util.stream.Collectors; import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getBusiLine; +import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getLoginUserDeptId; @Tag(name = "管理后台 - 工单信息") @RestController @@ -58,6 +64,11 @@ public class MainInfoController { private AdminUserApi adminUserApi; @Resource private BpmTaskApi bpmTaskApi; + @Resource + private PermissionCommonApi permissionApi; + + protected static final String CONTEXT_KEY = DeptDataPermissionRule.class.getSimpleName(); + @PostMapping("/create") @Operation(summary = "创建工单信息") @@ -140,6 +151,13 @@ public class MainInfoController { public CommonResult> getMainInfoPage(@Valid MainInfoPageReqVO pageReqVO) { //登录人所属业务线 pageReqVO.setBusiLine(getBusiLine()); + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + if (loginUser == null) { + return null; + } + //获取登录人权限 + DeptDataPermissionRespDTO deptDataPermission = permissionApi.getDeptDataPermission(loginUser.getId()); + pageReqVO.setDeptIds(deptDataPermission.getDeptIds()); PageResult pageResult = mainInfoService.getMainInfoPage(pageReqVO); if (pageResult == null) { @@ -179,8 +197,21 @@ public class MainInfoController { Map bpmTaskRespVOS = bpmTaskApi.getLastTaskMapByProcessInstanceId(processInstanceIdList); - // 5. 转换并返回结果 - return success(MainInfoConvert.INSTANCE.buildMainInfoPage(pageResult, attachmentMap, bpmTaskRespVOS)); + // 5. 查询单位名称 + Map companyNameMap = pageResult.getList().stream() + .map(MainInfoDO::getCompanyId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toMap( + companyId -> companyId, + companyId -> { + DeptDO dept = deptService.getDept(companyId); + return dept != null ? dept.getName() : ""; + } + )); + + // 6. 转换并返回结果 + return success(MainInfoConvert.INSTANCE.buildMainInfoPage(pageResult, attachmentMap, bpmTaskRespVOS, companyNameMap)); } @GetMapping("/export-excel") diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/vo/MainInfoPageReqVO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/vo/MainInfoPageReqVO.java index 4ef8713..6db260e 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/vo/MainInfoPageReqVO.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/vo/MainInfoPageReqVO.java @@ -127,5 +127,7 @@ public class MainInfoPageReqVO extends PageParam { @Schema(description = "工单来源编码") private String woSourceId; + @Schema(description = "部门id") + private Set deptIds; -} \ No newline at end of file +} diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/materialdetail/vo/MaterialDetailRespVO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/materialdetail/vo/MaterialDetailRespVO.java index d5fe749..7ae1c79 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/materialdetail/vo/MaterialDetailRespVO.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/materialdetail/vo/MaterialDetailRespVO.java @@ -82,4 +82,8 @@ public class MaterialDetailRespVO { @Schema(description = "耗材名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "耗材名称") @ExcelProperty("耗材名称") private String materialName; + + @Schema(description = "规格", requiredMode = Schema.RequiredMode.REQUIRED, example = "规格") + @ExcelProperty("规格") + private String specifications; } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/materialdetail/vo/MaterialDetailSaveReqVO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/materialdetail/vo/MaterialDetailSaveReqVO.java index 6e4627b..118592d 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/materialdetail/vo/MaterialDetailSaveReqVO.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/materialdetail/vo/MaterialDetailSaveReqVO.java @@ -75,4 +75,11 @@ public class MaterialDetailSaveReqVO { @Schema(description = "耗材名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "耗材名称") @NotEmpty(message = "耗材名称不能为空") private String materialName; + + @Schema(description = "规格", requiredMode = Schema.RequiredMode.REQUIRED, example = "规格") + @NotEmpty(message = "规格不能为空") + private String specifications; + + @Schema(description = "库存ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "111") + private Long inventoryId; } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/eventinfo/AppEventInfoController.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/eventinfo/AppEventInfoController.java index 2b5a509..444660c 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/eventinfo/AppEventInfoController.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/eventinfo/AppEventInfoController.java @@ -61,13 +61,13 @@ public class AppEventInfoController { return CommonResult.error(BAD_REQUEST, "子系统编码不能为空"); } - SysMappingEnum sys = SysMappingEnum.getBySysCode(companyCode); + String sys = SysMappingEnum.getNameBySysCode(companyCode); EventInfoSaveReqVO vo = new EventInfoSaveReqVO(); String eventNo = workOrderApi.generateWONum(EVENT_INFO_PREFFIX_UNIVERSE); vo.setEventNo(eventNo); vo.setEventStatus(EventStatusEnum.PENDING.getCode()); - vo.setBusiLine(sys.name().toLowerCase()); + vo.setBusiLine(sys); vo.setLon(createReqVO.getUserConfrimLon()); vo.setLat(createReqVO.getUserConfrimLat()); vo.setConfrimImgs(createReqVO.getUserConfrimImgs()); diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderAIController.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderAIController.java index 27cc191..a4402d9 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderAIController.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderAIController.java @@ -234,6 +234,7 @@ public class AppGardenWorkOrderAIController { reStartReqVO.setReason(reqVO.getReason()); reStartReqVO.setId(reqVO.getTaskId()); reStartReqVO.setRoadId(reqVO.getRoadId()); + reStartReqVO.setBusiLine(reqVO.getBusiLine()); aiService.approveTask(reStartReqVO); log.info("当前操作:"+AIOperateTypeEnum.YL_INSPECTOR_START_RELAUNCH.getDesc()+"<--结束"); return success(true); diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderInspectorController.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderInspectorController.java index 2f6a565..6d2dcdd 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderInspectorController.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderInspectorController.java @@ -235,6 +235,7 @@ public class AppGardenWorkOrderInspectorController { reStartReqVO.setReason(reqVO.getReason()); reStartReqVO.setId(reqVO.getTaskId()); reStartReqVO.setRoadId(reqVO.getRoadId()); + reStartReqVO.setBusiLine(reqVO.getBusiLine()); inspectorService.approveTask(reStartReqVO); log.info("当前操作:"+InspectorOperateTypeEnum.YL_INSPECTOR_START_RELAUNCH.getDesc()+"<--结束"); return success(true); diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/task/AppGardenTaskInspectorApproveReqVO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/task/AppGardenTaskInspectorApproveReqVO.java index d8febb2..3c88e5a 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/task/AppGardenTaskInspectorApproveReqVO.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/task/AppGardenTaskInspectorApproveReqVO.java @@ -48,4 +48,7 @@ public class AppGardenTaskInspectorApproveReqVO { @Schema(description = "退回时的拍照图片") private List returnImgs; + @Schema(description = "业务线") + private String busiLine; + } \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/maininfo/MainInfoConvert.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/maininfo/MainInfoConvert.java index 4d282cc..55dd407 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/maininfo/MainInfoConvert.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/maininfo/MainInfoConvert.java @@ -25,7 +25,7 @@ public interface MainInfoConvert { MainInfoConvert INSTANCE = Mappers.getMapper(MainInfoConvert.class); - default PageResult buildMainInfoPage(PageResult pageResult, Map attachmentMap, Map bpmTaskRespVOS ) { + default PageResult buildMainInfoPage(PageResult pageResult, Map attachmentMap, Map bpmTaskRespVOS, Map companyNameMap) { List mainInfoVOList = CollectionUtils.convertList(pageResult.getList(), mainInfoDO -> { AdminMainInfoRespVO mainInfoVo = BeanUtils.toBean(mainInfoDO, AdminMainInfoRespVO.class); if (attachmentMap != null && !attachmentMap.isEmpty()) { @@ -48,6 +48,9 @@ public interface MainInfoConvert { } } } + if (companyNameMap != null && mainInfoDO.getCompanyId() != null) { + mainInfoVo.setCompanyName(companyNameMap.getOrDefault(mainInfoDO.getCompanyId(), "")); + } return mainInfoVo; }); return new PageResult<>(mainInfoVOList, pageResult.getTotal()); diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/materialdetail/MaterialDetailDO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/materialdetail/MaterialDetailDO.java index 0bc75df..f506b27 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/materialdetail/MaterialDetailDO.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/materialdetail/MaterialDetailDO.java @@ -92,4 +92,9 @@ public class MaterialDetailDO extends BaseDO { * 耗材名称 */ private String materialName; + + /*规格*/ + private String specifications; + + } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/mysql/eventinfo/EventInfoMapper.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/mysql/eventinfo/EventInfoMapper.java index d31131b..fa2e42e 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/mysql/eventinfo/EventInfoMapper.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/mysql/eventinfo/EventInfoMapper.java @@ -36,6 +36,7 @@ public interface EventInfoMapper extends BaseMapperX { .eqIfPresent(EventInfoDO::getEventStatus, reqVO.getEventStatus()) .likeIfPresent(EventInfoDO::getRemark, reqVO.getRemark()) .betweenIfPresent(EventInfoDO::getCreateTime, reqVO.getCreateTime()) + .ne(EventInfoDO::getBusiLine, "sz") .orderByDesc(EventInfoDO::getId)); } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/mysql/maininfo/MainInfoMapper.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/mysql/maininfo/MainInfoMapper.java index 01d8973..8e81494 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/mysql/maininfo/MainInfoMapper.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/mysql/maininfo/MainInfoMapper.java @@ -79,6 +79,7 @@ public interface MainInfoMapper extends BaseMapperX { .likeIfPresent(MainInfoDO::getRemark, reqVO.getRemark()) .likeIfPresent(MainInfoDO::getHandleResult, reqVO.getHandleResult()) .betweenIfPresent(MainInfoDO::getCreateTime, reqVO.getCreateTime()) + .inIfPresent(MainInfoDO::getDeptId, reqVO.getDeptIds()) .orderByDesc(MainInfoDO::getId); return selectPage(reqVO, queryWrapper); } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineTeamLeaderRoleCodeEnum.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineTeamLeaderRoleCodeEnum.java index e220d9b..abb71be 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineTeamLeaderRoleCodeEnum.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineTeamLeaderRoleCodeEnum.java @@ -25,6 +25,10 @@ public enum BusiLineTeamLeaderRoleCodeEnum { // 注意:枚举类必须用enum ROLECODE_WY("wy", "team_leader_wy"), /** 市政业务线-角色编码 */ ROLECODE_SZ("sz", "team_leader_sz"), + /** 秩序管理业务线-角色编码 */ + ROLECODE_ZX("zx", "team_leader_zxgl"), + /** 环境卫生业务线-角色编码 */ + ROLECODE_HJ("hj", "team_leader_hjws"), /** 园林业务线-角色编码 */ ROLECODE_YL("yl", "team_leader_yl"); // 最后一个常量必须以分号结尾 diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineWorkerRoleCodeEnum.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineWorkerRoleCodeEnum.java index 5f66670..721a6da 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineWorkerRoleCodeEnum.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineWorkerRoleCodeEnum.java @@ -25,6 +25,10 @@ public enum BusiLineWorkerRoleCodeEnum { ROLECODE_WORKER_WY("wy", "wy_worker"), /** 市政业务线-角色编码 */ ROLECODE_WORKER_SZ("sz", "sz_worker"), + /** 环境卫生业务线-角色编码 */ + ROLECODE_HJ("hj", "hjws_worker"), + /** 秩序管理业务线-角色编码 */ + ROLECODE_ZX("zx", "zxgl_worker"), /** 园林业务线-角色编码 */ ROLECODE_WORKER_YL("yl", "yl_worker"); // 最后一个常量必须以分号结尾 diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/ErrorCodeConstants.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/ErrorCodeConstants.java index c74dcee..86e3e6e 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/ErrorCodeConstants.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/ErrorCodeConstants.java @@ -57,5 +57,7 @@ public interface ErrorCodeConstants { ErrorCode APP_AI_USER_ROLE_ERROR = new ErrorCode(1-900-004-004, "该登录人不是 AI工单派发人员,无法发起流程!"); ErrorCode APP_WORK_AI_ROLE_ILLEGLE = new ErrorCode(1-900-004-005, "该登录人即是 大区经理 角色,又是 AI工单派发人员,无法发起流程!"); + + ErrorCode SANHAI_COMPANY_NOT_EXISTS = new ErrorCode(1-900-004-006, "三海道路归属部门的id,字典项不存在!"); } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/SysMappingEnum.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/SysMappingEnum.java index 2b7f0a5..1c58726 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/SysMappingEnum.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/SysMappingEnum.java @@ -40,4 +40,14 @@ public enum SysMappingEnum { } throw new IllegalArgumentException("未知的系统: " + sysCode); } + + public static String getNameBySysCode(String sysCode) { + for (SysMappingEnum node : values()) { + if (node.getSysCode().equals(sysCode) ) { + return node.name().toLowerCase(); + } + } + return sysCode.toLowerCase(); + } + } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmAIServiceImpl.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmAIServiceImpl.java index fe0c352..dcb3bde 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmAIServiceImpl.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmAIServiceImpl.java @@ -213,7 +213,9 @@ public class BpmAIServiceImpl implements BpmAIService{ .map(AdminUserRespDTO::getId) // 收集结果到List .collect(Collectors.toList()); - processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0)); + //processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0)); + //养护组张角色多人模式 + RoleListUtils.teamLeaderByRoleAssign(userList,processInstanceVariables); } String processInstanceId = processInstanceApi.createProcessInstance(userId, @@ -260,7 +262,9 @@ public class BpmAIServiceImpl implements BpmAIService{ .map(AdminUserRespDTO::getId) // 收集结果到List .collect(Collectors.toList()); - processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0));//养护组长分配 + //processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0));//养护组长分配 + //养护组张角色多人模式 + RoleListUtils.teamLeaderByRoleAssign(userList,processInstanceVariables); //流程变量重新赋值 runtimeService.setVariables(instanceId,processInstanceVariables); @@ -292,6 +296,36 @@ public class BpmAIServiceImpl implements BpmAIService{ variables.put(BPM_COMMON_PROD_ISNEED,true); variables.put(BPM_COMMON_PROD_ISREVOKE,true); variables.put(BPM_COMMON_PROD_ISVERIFY,true); + //重新发起判断 三海区域 + boolean isSanhai = isSanhaiByRoadId(reqVO.getRoadId()); + variables.put(BPM_COMMON_PROD_ISSANHAI,isSanhai); + if(!isSanhai){//非三海的到养护组长 + String instanceId = taskService.getTask(reqVO.getId()).getProcessInstanceId(); + ProcessInstance processInstance = processInstanceService.getProcessInstance(instanceId); + Map processInstanceVariables = processInstance.getProcessVariables(); + String busiLine = reqVO.getBusiLine(); + String roadId = reqVO.getRoadId(); + String roleCode = BusiLineTeamLeaderRoleCodeEnum.getByCode(busiLine).getRoleCode(); + + if(StringUtil.isEmpty(roleCode)){// 找不到 默认为园林组长的角色 + roleCode = BpmCommonConstant.TEAM_LEADER_YL; + } + List userList = workOrderExtMapper.getUserByRoadIdAndRoleCode(roadId,roleCode,busiLine); + if(org.springframework.util.ObjectUtils.isEmpty(userList)){ + throw exception(TEAM_LEADER_YL_NOT_EXISTS); + } + // 提取id到List + List idList = userList.stream() + // 映射:将AdminUserRespDTO对象转为其id属性 + .map(AdminUserRespDTO::getId) + // 收集结果到List + .collect(Collectors.toList()); + //processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0));//养护组长分配 + //养护组张角色多人模式 + RoleListUtils.teamLeaderByRoleAssign(userList,processInstanceVariables); + //流程变量重新赋值 + runtimeService.setVariables(instanceId,processInstanceVariables); + } } //TODO 重新发起需更新工单数据库 @@ -305,8 +339,19 @@ public class BpmAIServiceImpl implements BpmAIService{ @Override public boolean isSanhai(Long companyId) { + List dictData = dictDataCommonApi.getDictDataList(SANHAI_COMPANY); + if(null == dictData || dictData.size()==0){ + throw exception(SANHAI_COMPANY_NOT_EXISTS); + } List sanHaiRoadId = new ArrayList<>(); - sanHaiRoadId.add(115L); // TODO 目前写死 + for(DictDataRespDTO dto:dictData){ + try { + sanHaiRoadId.add(Long.parseLong(dto.getValue())); + }catch (Exception e){ + throw exception(SANHAI_COMPANY_NOT_EXISTS); + } + } + //sanHaiRoadId.add(115L); // 目前写死 ,上面改为从字典值获取258 //是否三海路段 boolean isSanhai = sanHaiRoadId.contains(companyId); return isSanhai; diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenServiceImpl.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenServiceImpl.java index 65c8060..e094401 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenServiceImpl.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenServiceImpl.java @@ -53,6 +53,7 @@ import com.zteits.urbanops.module.workorder.dto.AppGardenWorkOrderRespVO; import com.zteits.urbanops.module.workorder.enums.BusiLineTeamLeaderRoleCodeEnum; import com.zteits.urbanops.module.workorder.enums.BusiLineWorkerRoleCodeEnum; import com.zteits.urbanops.module.workorder.enums.EventSourceEnum; +import com.zteits.urbanops.module.workorder.util.RoleListUtils; import com.zteits.urbanops.module.workorder.util.TaskNodeUtils; import jakarta.annotation.Resource; import jodd.util.StringUtil; @@ -647,7 +648,10 @@ public class BpmGardenServiceImpl implements BpmGardenService{ .map(AdminUserRespDTO::getId) // 收集结果到List .collect(Collectors.toList()); - processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0)); + + //processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0)); + //养护组张角色多人模式 + RoleListUtils.teamLeaderByRoleAssign(userList,processInstanceVariables); String processInstanceId = processInstanceApi.createProcessInstance(userId, // new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(BpmCommonConstant.BPM_GARDEN_INSPECT_WO) new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(BpmCommonConstant.BPM_WORKORDER_COMMON_PROD) diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmInspectorServiceImpl.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmInspectorServiceImpl.java index 52a7bae..6ad467a 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmInspectorServiceImpl.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmInspectorServiceImpl.java @@ -205,7 +205,9 @@ public class BpmInspectorServiceImpl implements BpmInspectorService{ .map(AdminUserRespDTO::getId) // 收集结果到List .collect(Collectors.toList()); - processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0)); + //processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0)); + //养护组张角色多人模式 + RoleListUtils.teamLeaderByRoleAssign(userList,processInstanceVariables); } String processInstanceId = processInstanceApi.createProcessInstance(userId, @@ -252,7 +254,9 @@ public class BpmInspectorServiceImpl implements BpmInspectorService{ .map(AdminUserRespDTO::getId) // 收集结果到List .collect(Collectors.toList()); - processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0));//养护组长分配 + //processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0));//养护组长分配 + //养护组张角色多人模式 + RoleListUtils.teamLeaderByRoleAssign(userList,processInstanceVariables); //流程变量重新赋值 runtimeService.setVariables(instanceId,processInstanceVariables); @@ -284,9 +288,37 @@ public class BpmInspectorServiceImpl implements BpmInspectorService{ variables.put(BPM_COMMON_PROD_ISNEED,true); variables.put(BPM_COMMON_PROD_ISREVOKE,true); variables.put(BPM_COMMON_PROD_ISVERIFY,true); - } - //TODO 重新发起需更新工单数据库 + //重新发起判断 三海区域 + boolean isSanhai = isSanhaiByRoadId(reqVO.getRoadId()); + variables.put(BPM_COMMON_PROD_ISSANHAI,isSanhai); + if(!isSanhai){//非三海的到养护组长 + String instanceId = taskService.getTask(reqVO.getId()).getProcessInstanceId(); + ProcessInstance processInstance = processInstanceService.getProcessInstance(instanceId); + Map processInstanceVariables = processInstance.getProcessVariables(); + String busiLine = reqVO.getBusiLine(); + String roadId = reqVO.getRoadId(); + String roleCode = BusiLineTeamLeaderRoleCodeEnum.getByCode(busiLine).getRoleCode(); + if(StringUtil.isEmpty(roleCode)){// 找不到 默认为园林组长的角色 + roleCode = BpmCommonConstant.TEAM_LEADER_YL; + } + List userList = workOrderExtMapper.getUserByRoadIdAndRoleCode(roadId,roleCode,busiLine); + if(org.springframework.util.ObjectUtils.isEmpty(userList)){ + throw exception(TEAM_LEADER_YL_NOT_EXISTS); + } + // 提取id到List + List idList = userList.stream() + // 映射:将AdminUserRespDTO对象转为其id属性 + .map(AdminUserRespDTO::getId) + // 收集结果到List + .collect(Collectors.toList()); + //processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0));//养护组长分配 + //养护组张角色多人模式 + RoleListUtils.teamLeaderByRoleAssign(userList,processInstanceVariables); + //流程变量重新赋值 + runtimeService.setVariables(instanceId,processInstanceVariables); + } + } targetVO.setVariables(variables); //TODO 审批候选人需要赋值 Map> nextAssignees = new HashMap<>(); @@ -297,8 +329,19 @@ public class BpmInspectorServiceImpl implements BpmInspectorService{ @Override public boolean isSanhai(Long companyId) { + List dictData = dictDataCommonApi.getDictDataList(SANHAI_COMPANY); + if(null == dictData || dictData.size()==0){ + throw exception(SANHAI_COMPANY_NOT_EXISTS); + } List sanHaiRoadId = new ArrayList<>(); - sanHaiRoadId.add(115L); // TODO 目前写死 + for(DictDataRespDTO dto:dictData){ + try { + sanHaiRoadId.add(Long.parseLong(dto.getValue())); + }catch (Exception e){ + throw exception(SANHAI_COMPANY_NOT_EXISTS); + } + } + //sanHaiRoadId.add(115L); // 目前写死 ,上面改为从字典值获取258 //是否三海路段 boolean isSanhai = sanHaiRoadId.contains(companyId); return isSanhai; diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmRegionMgrServiceImpl.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmRegionMgrServiceImpl.java index 926c727..7c9d296 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmRegionMgrServiceImpl.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmRegionMgrServiceImpl.java @@ -187,7 +187,9 @@ public class BpmRegionMgrServiceImpl implements BpmRegionMgrService{ .map(AdminUserRespDTO::getId) // 收集结果到List .collect(Collectors.toList()); - processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0)); + //processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0)); + //养护组张角色多人模式 + RoleListUtils.teamLeaderByRoleAssign(userList,processInstanceVariables); String processInstanceId = processInstanceApi.createProcessInstance(userId, // new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(BpmCommonConstant.BPM_GARDEN_INSPECT_WO) new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(BpmCommonConstant.BPM_REGION_MGR_WO) diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmUniversalServiceImpl.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmUniversalServiceImpl.java index 1f5a0da..61e799c 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmUniversalServiceImpl.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmUniversalServiceImpl.java @@ -214,7 +214,9 @@ public class BpmUniversalServiceImpl implements BpmUniversalService{ .map(AdminUserRespDTO::getId) // 收集结果到List .collect(Collectors.toList()); - processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0));//养护组长分配 + //processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0));//养护组长分配 + //养护组张角色多人模式 + RoleListUtils.teamLeaderByRoleAssign(userList,processInstanceVariables); //流程变量重新赋值 runtimeService.setVariables(instanceId,processInstanceVariables); diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/materialdetail/MaterialDetailServiceImpl.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/materialdetail/MaterialDetailServiceImpl.java index 4e3a438..c5c49de 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/materialdetail/MaterialDetailServiceImpl.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/materialdetail/MaterialDetailServiceImpl.java @@ -133,12 +133,13 @@ public class MaterialDetailServiceImpl implements MaterialDetailService { // } // } //耗材出库 - for (MaterialDetailDO materialDetailDO : materialDetailList) { + for (MaterialDetailSaveReqVO materialDetailDO : createReqVO) { MaterialInventoryOutDto outDto = new MaterialInventoryOutDto(); outDto.setMaterialId(materialDetailDO.getMaterialId()); outDto.setMaterialName(materialDetailDO.getMaterialName()); - outDto.setOutInventoryNum(materialDetailDO.getUserCount()); + outDto.setOutInventoryNum(Long.valueOf(materialDetailDO.getUserCount())); outDto.setOutDate(LocalDateTime.now()); + outDto.setInventoryId(materialDetailDO.getInventoryId()); materialApi.createMaterialInventoryOut(outDto); } //保存耗材 diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/util/RoleListUtils.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/util/RoleListUtils.java index 742347c..d8e4b7d 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/util/RoleListUtils.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/util/RoleListUtils.java @@ -1,12 +1,16 @@ package com.zteits.urbanops.module.workorder.util; +import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; import com.zteits.urbanops.module.system.controller.admin.permission.vo.role.RoleRespVO; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import static com.zteits.urbanops.module.workorder.api.constant.BpmCommonConstant.BPM_COMMON_PROD_LEADERID; + /** * 类描述:判断角色包含关系工具类 * 创建人:yanhuiqing @@ -77,4 +81,13 @@ public class RoleListUtils { return containsCode1 && containsCode2; } + + public static void teamLeaderByRoleAssign(List userList, Map processInstanceVariables){ + //养护组长指派为多人 + String assigneeIdStr = userList.stream() + .map(AdminUserRespDTO::getId) // 取Long类型ID + .map(String::valueOf) // 转String + .collect(Collectors.joining(",")); // 拼接成1001,1002,1003 + processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, assigneeIdStr); + } } \ No newline at end of file diff --git a/urbanops-server/pom.xml b/urbanops-server/pom.xml index 206fb83..27dd08a 100644 --- a/urbanops-server/pom.xml +++ b/urbanops-server/pom.xml @@ -146,11 +146,22 @@ urbanops-spring-boot-starter-protection + + + org.bouncycastle + bcprov-jdk18on + 1.80 + + + org.bouncycastle + bcutil-jdk18on + 1.80 + - ${project.artifactId} + ${project.artifactId}-${maven.build.timestamp} diff --git a/urbanops-server/src/main/resources/application-dev.yaml b/urbanops-server/src/main/resources/application-dev.yaml index 0b4e707..cee80be 100644 --- a/urbanops-server/src/main/resources/application-dev.yaml +++ b/urbanops-server/src/main/resources/application-dev.yaml @@ -191,30 +191,28 @@ urbanops: justauth: enabled: true type: - DINGTALK: # 钉钉 - client-id: dingvrnreaje3yqvzhxg - client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI - ignore-check-redirect-uri: true - WECHAT_ENTERPRISE: # 企业微信 - client-id: wwd411c69a39ad2e54 - client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw - agent-id: 1000004 - ignore-check-redirect-uri: true - # noinspection SpringBootApplicationYaml - WECHAT_MINI_PROGRAM: # 微信小程序 - client-id: ${wx.miniapp.appid} - client-secret: ${wx.miniapp.secret} - ignore-check-redirect-uri: true - ignore-check-state: true # 微信小程序,不会使用到 state,所以不进行校验 - WECHAT_MP: # 微信公众号 - client-id: ${wx.mp.app-id} - client-secret: ${wx.mp.secret} + UAA: + client-id: schoms + client-secret: secret + redirect-uri: https://test.jichengshanshui.com.cn:28302/test/social-login?type=35 ignore-check-redirect-uri: true cache: type: REDIS prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE:: timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟 - + http-config: + timeout: 30000 # +sso: + client: + switchState: on + clientId: schoms + clientSecret: secret + # 前端授权地址(改为justauth,不再这儿配置) + authorizeUrl: + # sso 服务地址 + baseUrl: https://test.jichengshanshui.com.cn:28301 + # 登录成功后跳转地址 (改为justauth,不再这儿配置) + redirectUri: --- #################### iot相关配置 TODO 芋艿【IOT】:再瞅瞅 #################### pf4j: # pluginsDir: /tmp/ @@ -235,17 +233,7 @@ flow: - appid: wy secret: x3z7t6l2g2t2i4w3x5e2e0s5y9e6d1y3 url: https://pms.jichengshanshui.com.cn:9980/prod-api/task/third/report -sso: - client: - switchState: on - clientId: schoms - clientSecret: FVwUBd3ZCrt6mMrZ - # 前端授权地址 - authorizeUrl: https://giomp.jichengshanshui.com.cn:28205/authorize - # sso 服务地址 - baseUrl: https://uaa.jichengshanshui.com.cn:28201 - # 登录成功后跳转地址 - redirectUri: https://giomp.jichengshanshui.com.cn:28205/prod-api/admin-api/sso/callback + # 微信公众号配置 wechat: mp: @@ -263,7 +251,7 @@ wechat: tokenUrl: https://api.weixin.qq.com/cgi-bin/stable_token sendUrl: https://api.weixin.qq.com/cgi-bin/message/template/send siot: - roadUrl: https://iot.jichengshanshui.com.cn:28202/prod-api/fence/fenceInfo/getFenceRoadListByLocation + roadUrl: https://test.jichengshanshui.com.cn:28202/prod-api/fence/fenceInfo/getFenceRoadListByLocation # 高德地图配置 amap: diff --git a/urbanops-server/src/main/resources/application-prod.yaml b/urbanops-server/src/main/resources/application-prod.yaml index 885b46d..b76511d 100644 --- a/urbanops-server/src/main/resources/application-prod.yaml +++ b/urbanops-server/src/main/resources/application-prod.yaml @@ -228,29 +228,32 @@ global: justauth: enabled: true type: - DINGTALK: # 钉钉 - client-id: dingvrnreaje3yqvzhxg - client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI - ignore-check-redirect-uri: true - WECHAT_ENTERPRISE: # 企业微信 - client-id: wwd411c69a39ad2e54 - client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw - agent-id: 1000004 - ignore-check-redirect-uri: true - # noinspection SpringBootApplicationYaml - WECHAT_MINI_PROGRAM: # 微信小程序 - client-id: ${wx.miniapp.appid} - client-secret: ${wx.miniapp.secret} - ignore-check-redirect-uri: true - ignore-check-state: true # 微信小程序,不会使用到 state,所以不进行校验 - WECHAT_MP: # 微信公众号 - client-id: ${wx.mp.app-id} - client-secret: ${wx.mp.secret} + UAA: + client-id: schoms + client-secret: FVwUBd3ZCrt6mMrZ + redirect-uri: https://giomp.jichengshanshui.com.cn:4080/social-login?type=35 ignore-check-redirect-uri: true cache: type: REDIS prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE:: timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟 + http-config: + timeout: 30000 # +sso: + client: + switchState: on + clientId: schoms + clientSecret: FVwUBd3ZCrt6mMrZ + # 前端授权地址(改为justauth,不再这儿配置) + authorizeUrl: + # sso 服务地址 + baseUrl: https://uaa.jichengshanshui.com.cn:28201 + # 登录成功后跳转地址 (改为justauth,不再这儿配置) + redirectUri: + cache: + type: REDIS + prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE:: + timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟 --- #################### iot相关配置 TODO 芋艿【IOT】:再瞅瞅 #################### pf4j: @@ -272,17 +275,7 @@ flow: - appid: wy secret: x3z7t6l2g2t2i4w3x5e2e0s5y9e6d1y3 url: https://pms.jichengshanshui.com.cn:9980/prod-api/task/third/report -sso: - client: - switchState: on - clientId: schoms - clientSecret: FVwUBd3ZCrt6mMrZ - # 前端授权地址 - authorizeUrl: https://giomp.jichengshanshui.com.cn:28205/authorize - # sso 服务地址 - baseUrl: https://uaa.jichengshanshui.com.cn:28201 - # 登录成功后跳转地址 - redirectUri: https://giomp.jichengshanshui.com.cn:28205/prod-api/admin-api/sso/callback + # 微信公众号配置 wechat: mp: @@ -317,4 +310,4 @@ static: resource: server: enable: true - url: https://test.jichengshanshui.com.cn:4080/downloads/ + url: https://giomp.jichengshanshui.com.cn:4080/downloads/ diff --git a/urbanops-server/src/main/resources/application.yaml b/urbanops-server/src/main/resources/application.yaml index d67b2e4..e5f485b 100644 --- a/urbanops-server/src/main/resources/application.yaml +++ b/urbanops-server/src/main/resources/application.yaml @@ -5,6 +5,7 @@ spring: profiles: active: dev + main: allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。 @@ -271,6 +272,7 @@ urbanops: security: permit-all_urls: - /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,不需要登录 + - /admin-api/garden/device-user/** api-encrypt: enable: true # 是否开启 API 加密 algorithm: AES # 加密算法,支持 AES、RSA 等 @@ -328,7 +330,7 @@ urbanops: expire-times: 10m send-frequency: 1m send-maximum-quantity-per-day: 10 - begin-code: 9999 # 这里配置 9999 的原因是,测试方便。 + begin-code: 0000 # 这里配置 9999 的原因是,测试方便。 end-code: 9999 # 这里配置 9999 的原因是,测试方便。 trade: order: @@ -348,5 +350,8 @@ urbanops: iot: message-bus: type: redis # 消息总线的类型 + device: + host: https://iot.jichengshanshui.com.cn:28202/prod-api/link debug: false + diff --git a/urbanops-server/src/main/resources/pub.cer b/urbanops-server/src/main/resources/pub.cer new file mode 100644 index 0000000..5045fa8 --- /dev/null +++ b/urbanops-server/src/main/resources/pub.cer