diff --git a/pom.xml b/pom.xml index 7373e0c..dae0146 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ tcctyn-cloud 1.0.0 - forest-fire + tcctyn-cloud 森林防火监测预警管理平台 @@ -38,6 +38,16 @@ 9.0.102 1.2.13 5.3.39 + 1.18.36 + 3.5.1 + 1.5.0 + 1.1.3 + 3.5.3.1 + 3.5.3.1 + 3.5.3.1 + 5.1.0 + 5.15.0 + 1.2.5 diff --git a/sql/iot.sql b/sql/iot.sql new file mode 100644 index 0000000..41ef815 --- /dev/null +++ b/sql/iot.sql @@ -0,0 +1,21 @@ +CREATE TABLE api_configs ( + id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', + name VARCHAR(64) NOT NULL COMMENT 'API名称', + url VARCHAR(255) NOT NULL COMMENT 'API URL地址', + api_key VARCHAR(255) DEFAULT NULL COMMENT 'API访问密钥', + api_secret VARCHAR(512) DEFAULT NULL COMMENT 'API安全密钥', + status TINYINT(1) UNSIGNED DEFAULT 0 COMMENT '状态(0-启用 1-停用)', + create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_time datetime COMMENT '更新时间', + create_by VARCHAR(64) DEFAULT NULL COMMENT '创建人', + update_by VARCHAR(64) DEFAULT NULL COMMENT '更新人', + is_deleted TINYINT(1) UNSIGNED DEFAULT 0 COMMENT '是否删除(0-未删除 1-已删除)', + remark VARCHAR(255) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (id), + UNIQUE KEY uk_name (name) COMMENT 'API名称唯一索引', + KEY idx_status (status) COMMENT '状态索引' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='API信息配置表'; + + +INSERT INTO api_configs (name, url, api_key, api_secret, status,create_by) +VALUES("海康平台API","https://116.53.205.228:14443/artemis","21887937","hwOzOEqxuPDz5frAnEXb",0,"admin"); \ No newline at end of file diff --git a/tcctyn-api/pom.xml b/tcctyn-api/pom.xml index 7c0a1aa..d23bc6c 100644 --- a/tcctyn-api/pom.xml +++ b/tcctyn-api/pom.xml @@ -10,6 +10,7 @@ tcctyn-api-system + tcctyn-api-iot tcctyn-api diff --git a/tcctyn-api/tcctyn-api-iot/pom.xml b/tcctyn-api/tcctyn-api-iot/pom.xml new file mode 100644 index 0000000..18f706f --- /dev/null +++ b/tcctyn-api/tcctyn-api-iot/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + com.tcctyn + tcctyn-api + 1.0.0 + + + tcctyn-api-iot + + + 11 + 11 + UTF-8 + + + + org.springframework.cloud + spring-cloud-openfeign-core + + + com.tcctyn + tcctyn-common-core + + + + \ No newline at end of file diff --git a/tcctyn-api/tcctyn-api-iot/src/main/java/com/tcctyn/iot/api/RemoteDeviceService.java b/tcctyn-api/tcctyn-api-iot/src/main/java/com/tcctyn/iot/api/RemoteDeviceService.java new file mode 100644 index 0000000..ca19be9 --- /dev/null +++ b/tcctyn-api/tcctyn-api-iot/src/main/java/com/tcctyn/iot/api/RemoteDeviceService.java @@ -0,0 +1,29 @@ +package com.tcctyn.iot.api; + +import com.tcctyn.common.core.constant.ServiceNameConstants; +import com.tcctyn.common.core.web.domain.R; +import com.tcctyn.common.core.web.domain.model.LoginUser; +import com.tcctyn.iot.api.factory.RemoteDeviceFallbackFactory; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +/** + * 用户服务 + * + * @author tcctyn + */ +@FeignClient(contextId = "remoteDeviceService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteDeviceFallbackFactory.class) +public interface RemoteDeviceService +{ + /** + * 通过id获取设备信息 + * + * @param username 用户名 + * @return 结果 + */ + @GetMapping("/device/info/{deviceNo}") + public R getDeviceInfoByDeviceNo(@PathVariable("deviceNo") String deviceNo); + + +} diff --git a/tcctyn-api/tcctyn-api-iot/src/main/java/com/tcctyn/iot/api/domain/DeviceConfig.java b/tcctyn-api/tcctyn-api-iot/src/main/java/com/tcctyn/iot/api/domain/DeviceConfig.java new file mode 100644 index 0000000..f2d8bc6 --- /dev/null +++ b/tcctyn-api/tcctyn-api-iot/src/main/java/com/tcctyn/iot/api/domain/DeviceConfig.java @@ -0,0 +1,58 @@ +package com.tcctyn.iot.api.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + *

+ * 设备配置表 + *

+ * + * @author 宋国强 + * @since 2025-04-14 + */ + +@Data +public class DeviceConfig { + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 设备编号 + */ + @NotBlank(message = "设备编号不能为空") + private String deviceNo; + + /** + * 用户账户 + */ + private String username; + + /** + * 密码 + */ + private String password; + + /** + * IP地址 + */ + private String ip; + + /** + * 端口号 + */ + private String port; + + /** + * 备注 + */ + private String remark; + +} diff --git a/tcctyn-api/tcctyn-api-iot/src/main/java/com/tcctyn/iot/api/domain/DeviceInfo.java b/tcctyn-api/tcctyn-api-iot/src/main/java/com/tcctyn/iot/api/domain/DeviceInfo.java new file mode 100644 index 0000000..7ca9b0c --- /dev/null +++ b/tcctyn-api/tcctyn-api-iot/src/main/java/com/tcctyn/iot/api/domain/DeviceInfo.java @@ -0,0 +1,161 @@ +package com.tcctyn.iot.api.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 设备信息表 + *

+ * + * @author 代超 + * @since 2024-10-09 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("device_info") +public class DeviceInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 设备编号 + */ + @NotBlank(message = "设备编号不能为空") + private String deviceNo; + + /** + * 设备名称 + */ + private String deviceName; + + /** + * 设备型号 + */ + private String deviceModel; + + /** + * 设备厂商 + */ + private String deviceManufacturer; + + /** + * 设备协议 + */ + private String deviceProtocol; + + /** + * 接入方式 + */ + private String accessMethod; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 设备状态:在线/离线 + */ + private String deviceStatus; + + /** + * 归属区域id,机场需要挂在地区下面 + */ + private Long regionId; + + /** + * 归属云台/卡口id + */ + private Long pointId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 机场id + */ + private Long airportId; + + /** + * 地址 + */ + private String address; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 高度 + */ + private String height; + + /** + * 设备启用状态:0-停用/1-启用 + */ + private Integer enableFlag; + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-api/tcctyn-api-iot/src/main/java/com/tcctyn/iot/api/factory/RemoteDeviceFallbackFactory.java b/tcctyn-api/tcctyn-api-iot/src/main/java/com/tcctyn/iot/api/factory/RemoteDeviceFallbackFactory.java new file mode 100644 index 0000000..df0e420 --- /dev/null +++ b/tcctyn-api/tcctyn-api-iot/src/main/java/com/tcctyn/iot/api/factory/RemoteDeviceFallbackFactory.java @@ -0,0 +1,35 @@ +package com.tcctyn.iot.api.factory; + +import com.tcctyn.common.core.web.domain.R; +import com.tcctyn.common.core.web.domain.model.LoginUser; +import com.tcctyn.iot.api.RemoteDeviceService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.cloud.openfeign.FallbackFactory; +import org.springframework.stereotype.Component; + +/** + * 用户服务降级处理 + * + * @author tcctyn + */ +@Component +public class RemoteDeviceFallbackFactory implements FallbackFactory +{ + private static final Logger log = LoggerFactory.getLogger(RemoteDeviceFallbackFactory.class); + + @Override + public RemoteDeviceService create(Throwable throwable) + { + log.error("物联网服务调用失败:{}", throwable.getMessage()); + return new RemoteDeviceService() + { + + + @Override + public R getDeviceInfoByDeviceNo(String deviceNo) { + return R.fail("获取设备信息失败:" + throwable.getMessage()); + } + }; + } +} diff --git a/tcctyn-api/tcctyn-api-iot/src/main/resources/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/tcctyn-api/tcctyn-api-iot/src/main/resources/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..b2ff48e --- /dev/null +++ b/tcctyn-api/tcctyn-api-iot/src/main/resources/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.tcctyn.iot.api.factory.RemoteDeviceFallbackFactory \ No newline at end of file diff --git a/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/RemoteFileService.java b/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/RemoteFileService.java index 02ec8ab..2cc9f73 100644 --- a/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/RemoteFileService.java +++ b/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/RemoteFileService.java @@ -6,7 +6,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.multipart.MultipartFile; import com.tcctyn.common.core.constant.ServiceNameConstants; -import com.tcctyn.common.core.domain.R; +import com.tcctyn.common.core.web.domain.R; import com.tcctyn.system.api.domain.SysFile; import com.tcctyn.system.api.factory.RemoteFileFallbackFactory; diff --git a/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/RemoteLogService.java b/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/RemoteLogService.java index afab869..8f0f1e0 100644 --- a/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/RemoteLogService.java +++ b/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/RemoteLogService.java @@ -6,7 +6,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import com.tcctyn.common.core.constant.SecurityConstants; import com.tcctyn.common.core.constant.ServiceNameConstants; -import com.tcctyn.common.core.domain.R; +import com.tcctyn.common.core.web.domain.R; import com.tcctyn.system.api.domain.SysLogininfor; import com.tcctyn.system.api.domain.SysOperLog; import com.tcctyn.system.api.factory.RemoteLogFallbackFactory; diff --git a/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/RemoteUserService.java b/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/RemoteUserService.java index 84c3757..382e074 100644 --- a/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/RemoteUserService.java +++ b/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/RemoteUserService.java @@ -1,18 +1,16 @@ package com.tcctyn.system.api; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; import com.tcctyn.common.core.constant.SecurityConstants; import com.tcctyn.common.core.constant.ServiceNameConstants; -import com.tcctyn.common.core.domain.R; +import com.tcctyn.common.core.web.domain.R; +import com.tcctyn.system.api.domain.SysDept; import com.tcctyn.system.api.domain.SysUser; import com.tcctyn.system.api.factory.RemoteUserFallbackFactory; import com.tcctyn.system.api.model.LoginUser; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.*; + +import java.util.List; /** * 用户服务 @@ -29,7 +27,7 @@ public interface RemoteUserService * @param source 请求来源 * @return 结果 */ - @GetMapping("/user/info/{username}") + @GetMapping("/system/user/info/{username}") public R getUserInfo(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); /** @@ -39,7 +37,7 @@ public interface RemoteUserService * @param source 请求来源 * @return 结果 */ - @PostMapping("/user/register") + @PostMapping("/system/user/register") public R registerUserInfo(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); /** @@ -49,6 +47,47 @@ public interface RemoteUserService * @param source 请求来源 * @return 结果 */ - @PutMapping("/user/recordlogin") + @PutMapping("/system/user/recordlogin") public R recordUserLogin(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 通过用户ID查询用户 + * + * @return 结果 + */ + @PostMapping("/system/user/selectUserById/{userId}") + public R selectUserById(@PathVariable("userId") Long userId); + + /** + * 通过条件查询查询用户列表 + * + * @param sysUser 用户信息 + * @return 结果 + */ + @PostMapping("/system/user/selectUserList") + public R> selectUserList(@RequestBody SysUser sysUser); + + /** + * 获取用户列表用于前端选择器 + * @param regionId 归属地区id + * @return + */ + @GetMapping("/system/user/userNames/{regionId}") + public R> selectUserByRegionIdList(@PathVariable("regionId") Long regionId) ; + /** + * 通过用户ID查询用户 + * + * @return 结果 + */ + @PostMapping("/system/dept/selectDeptById/{deptId}") + public R selectDeptById(@PathVariable("deptId") Long deptId); + + /** + * 通过条件查询查询用户列表 + * + * @return 结果 + */ + @PostMapping("/system/dept/selectDeptList") + public R> selectDeptList(@RequestBody SysDept sysDept); + } diff --git a/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/factory/RemoteFileFallbackFactory.java b/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/factory/RemoteFileFallbackFactory.java index b69dda6..ebab6d5 100644 --- a/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/factory/RemoteFileFallbackFactory.java +++ b/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/factory/RemoteFileFallbackFactory.java @@ -5,7 +5,7 @@ import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; -import com.tcctyn.common.core.domain.R; +import com.tcctyn.common.core.web.domain.R; import com.tcctyn.system.api.RemoteFileService; import com.tcctyn.system.api.domain.SysFile; diff --git a/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/factory/RemoteLogFallbackFactory.java b/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/factory/RemoteLogFallbackFactory.java index 3b5a286..94607c0 100644 --- a/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/factory/RemoteLogFallbackFactory.java +++ b/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/factory/RemoteLogFallbackFactory.java @@ -4,7 +4,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; -import com.tcctyn.common.core.domain.R; +import com.tcctyn.common.core.web.domain.R; import com.tcctyn.system.api.RemoteLogService; import com.tcctyn.system.api.domain.SysLogininfor; import com.tcctyn.system.api.domain.SysOperLog; diff --git a/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/factory/RemoteUserFallbackFactory.java b/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/factory/RemoteUserFallbackFactory.java index dbd0a61..49852ed 100644 --- a/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/factory/RemoteUserFallbackFactory.java +++ b/tcctyn-api/tcctyn-api-system/src/main/java/com/tcctyn/system/api/factory/RemoteUserFallbackFactory.java @@ -1,14 +1,17 @@ package com.tcctyn.system.api.factory; +import com.tcctyn.system.api.domain.SysDept; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; -import com.tcctyn.common.core.domain.R; +import com.tcctyn.common.core.web.domain.R; import com.tcctyn.system.api.RemoteUserService; import com.tcctyn.system.api.domain.SysUser; import com.tcctyn.system.api.model.LoginUser; +import java.util.List; + /** * 用户服务降级处理 * @@ -42,6 +45,31 @@ public class RemoteUserFallbackFactory implements FallbackFactory selectUserById(Long userId) { + return R.fail("获取用户信息失败:" + throwable.getMessage()); + } + + @Override + public R> selectUserList(SysUser sysUser) { + return R.fail("获取用户信息列表失败:" + throwable.getMessage()); + } + + @Override + public R> selectUserByRegionIdList(Long regionId) { + return R.fail("获取用户区域id失败:" + throwable.getMessage()); + } + + @Override + public R selectDeptById(Long deptId) { + return R.fail("获取部门信息失败:" + throwable.getMessage()); + } + + @Override + public R> selectDeptList(SysDept sysDept) { + return R.fail("获取部门信息列表失败:" + throwable.getMessage()); + } }; } } diff --git a/tcctyn-auth/src/main/java/com/tcctyn/auth/controller/TokenController.java b/tcctyn-auth/src/main/java/com/tcctyn/auth/controller/TokenController.java index 64b45ae..b6555ac 100644 --- a/tcctyn-auth/src/main/java/com/tcctyn/auth/controller/TokenController.java +++ b/tcctyn-auth/src/main/java/com/tcctyn/auth/controller/TokenController.java @@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.RestController; import com.tcctyn.auth.form.LoginBody; import com.tcctyn.auth.form.RegisterBody; import com.tcctyn.auth.service.SysLoginService; -import com.tcctyn.common.core.domain.R; +import com.tcctyn.common.core.web.domain.R; import com.tcctyn.common.core.utils.JwtUtils; import com.tcctyn.common.core.utils.StringUtils; import com.tcctyn.common.security.auth.AuthUtil; diff --git a/tcctyn-auth/src/main/java/com/tcctyn/auth/service/SysLoginService.java b/tcctyn-auth/src/main/java/com/tcctyn/auth/service/SysLoginService.java index b9d3ad5..d90551a 100644 --- a/tcctyn-auth/src/main/java/com/tcctyn/auth/service/SysLoginService.java +++ b/tcctyn-auth/src/main/java/com/tcctyn/auth/service/SysLoginService.java @@ -6,7 +6,7 @@ import com.tcctyn.common.core.constant.CacheConstants; import com.tcctyn.common.core.constant.Constants; import com.tcctyn.common.core.constant.SecurityConstants; import com.tcctyn.common.core.constant.UserConstants; -import com.tcctyn.common.core.domain.R; +import com.tcctyn.common.core.web.domain.R; import com.tcctyn.common.core.enums.UserStatus; import com.tcctyn.common.core.exception.ServiceException; import com.tcctyn.common.core.text.Convert; diff --git a/tcctyn-common/tcctyn-common-core/pom.xml b/tcctyn-common/tcctyn-common-core/pom.xml index b4016c2..4d7e396 100644 --- a/tcctyn-common/tcctyn-common-core/pom.xml +++ b/tcctyn-common/tcctyn-common-core/pom.xml @@ -107,6 +107,38 @@ javax.servlet-api + + org.projectlombok + lombok + + + com.baomidou + mybatis-plus-annotation + ${mybatis-plus-annotation.version} + compile + + + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + ${org.eclipse.paho.client.mqttv3.version} + + + org.springframework.data + spring-data-redis + + + + org.springframework.security + spring-security-core + + + + cn.hutool + hutool-all + ${hutool-all.version} + + diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/Anonymous.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/Anonymous.java new file mode 100644 index 0000000..a0b31a7 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/Anonymous.java @@ -0,0 +1,15 @@ +package com.tcctyn.common.core.annotation; + +import java.lang.annotation.*; + +/** + * 匿名访问不鉴权注解 + * + * @author tcctyn + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Anonymous +{ +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/DataScope.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/DataScope.java new file mode 100644 index 0000000..92fb450 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/DataScope.java @@ -0,0 +1,29 @@ +package com.tcctyn.common.core.annotation; + +import java.lang.annotation.*; + +/** + * 数据权限过滤注解 + * + * @author tcctyn + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataScope +{ + /** + * 部门表的别名 + */ + public String deptAlias() default ""; + + /** + * 用户表的别名 + */ + public String userAlias() default ""; + + /** + * 权限字符(用于多个角色匹配符合要求的权限)默认根据权限注解@ss获取,多个权限用逗号分隔开来 + */ + public String permission() default ""; +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/DataSource.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/DataSource.java new file mode 100644 index 0000000..63fabfd --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/DataSource.java @@ -0,0 +1,24 @@ +package com.tcctyn.common.core.annotation; + +import com.tcctyn.common.core.enums.DataSourceType; + +import java.lang.annotation.*; + +/** + * 自定义多数据源切换注解 + * + * 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准 + * + * @author tcctyn + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface DataSource +{ + /** + * 切换数据源名称 + */ + public DataSourceType value() default DataSourceType.MASTER; +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/Excel.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/Excel.java index 3759dea..de72540 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/Excel.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/Excel.java @@ -1,13 +1,14 @@ package com.tcctyn.common.core.annotation; +import com.tcctyn.common.core.utils.poi.ExcelHandlerAdapter; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.math.BigDecimal; -import org.apache.poi.ss.usermodel.HorizontalAlignment; -import org.apache.poi.ss.usermodel.IndexedColors; -import com.tcctyn.common.core.utils.poi.ExcelHandlerAdapter; /** * 自定义导出Excel数据注解 @@ -33,6 +34,11 @@ public @interface Excel */ public String dateFormat() default ""; + /** + * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) + */ + public String dictType() default ""; + /** * 读取内容转表达式 (如: 0=男,1=女,2=未知) */ @@ -78,16 +84,16 @@ public @interface Excel */ public String prompt() default ""; - /** - * 是否允许内容换行 - */ - public boolean wrapText() default false; - /** * 设置只能选择不能输入的列内容. */ public String[] combo() default {}; + /** + * 是否从字典读数据到combo,默认不读取,如读取需要设置dictType注解. + */ + public boolean comboReadDict() default false; + /** * 是否需要纵向合并单元格,应对需求:含有list集合单元格) */ @@ -109,7 +115,7 @@ public @interface Excel public boolean isStatistics() default false; /** - * 导出类型(0数字 1字符串) + * 导出类型(0数字 1字符串 2图片) */ public ColumnType cellType() default ColumnType.STRING; diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/Excels.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/Excels.java index 1e2fc4a..43b074f 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/Excels.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/Excels.java @@ -14,5 +14,5 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) public @interface Excels { - Excel[] value(); -} \ No newline at end of file + public Excel[] value(); +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/Log.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/Log.java new file mode 100644 index 0000000..c1493db --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/Log.java @@ -0,0 +1,48 @@ +package com.tcctyn.common.core.annotation; + +import com.tcctyn.common.core.enums.BusinessType; +import com.tcctyn.common.core.enums.OperatorType; + +import java.lang.annotation.*; + +/** + * 自定义操作日志记录注解 + * + * @author tcctyn + * + */ +@Target({ ElementType.PARAMETER, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Log +{ + /** + * 模块 + */ + public String title() default ""; + + /** + * 功能 + */ + public BusinessType businessType() default BusinessType.OTHER; + + /** + * 操作人类别 + */ + public OperatorType operatorType() default OperatorType.MANAGE; + + /** + * 是否保存请求的参数 + */ + public boolean isSaveRequestData() default true; + + /** + * 是否保存响应的参数 + */ + public boolean isSaveResponseData() default true; + + /** + * 排除指定的请求参数 + */ + public String[] excludeParamNames() default {}; +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/RateLimiter.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/RateLimiter.java new file mode 100644 index 0000000..ea3a15d --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/RateLimiter.java @@ -0,0 +1,37 @@ +package com.tcctyn.common.core.annotation; + +import com.tcctyn.common.core.constant.CacheConstants; +import com.tcctyn.common.core.enums.LimitType; + +import java.lang.annotation.*; + +/** + * 限流注解 + * + * @author tcctyn + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RateLimiter +{ + /** + * 限流key + */ + public String key() default CacheConstants.RATE_LIMIT_KEY; + + /** + * 限流时间,单位秒 + */ + public int time() default 60; + + /** + * 限流次数 + */ + public int count() default 100; + + /** + * 限流类型 + */ + public LimitType limitType() default LimitType.DEFAULT; +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/RepeatSubmit.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/RepeatSubmit.java new file mode 100644 index 0000000..0b14526 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/RepeatSubmit.java @@ -0,0 +1,26 @@ +package com.tcctyn.common.core.annotation; + +import java.lang.annotation.*; + +/** + * 自定义注解防止表单重复提交 + * + * @author tcctyn + * + */ +@Inherited +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RepeatSubmit +{ + /** + * 间隔时间(ms),小于此时间视为重复提交 + */ + public int interval() default 5000; + + /** + * 提示消息 + */ + public String message() default "不允许重复提交,请稍候再试"; +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/Sensitive.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/Sensitive.java new file mode 100644 index 0000000..973ac28 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/annotation/Sensitive.java @@ -0,0 +1,25 @@ +package com.tcctyn.common.core.annotation; + +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.tcctyn.common.core.config.serializer.SensitiveJsonSerializer; +import com.tcctyn.common.core.enums.DesensitizedType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 数据脱敏注解 + * + * @author tcctyn + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +@JacksonAnnotationsInside +@JsonSerialize(using = SensitiveJsonSerializer.class) +public @interface Sensitive +{ + DesensitizedType desensitizedType(); +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/config/TcctynConfig.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/config/TcctynConfig.java new file mode 100644 index 0000000..01d16f3 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/config/TcctynConfig.java @@ -0,0 +1,122 @@ +package com.tcctyn.common.core.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 读取项目相关配置 + * + * @author tcctyn + */ +@Component +@ConfigurationProperties(prefix = "tcctyn") +public class TcctynConfig +{ + /** 项目名称 */ + private String name; + + /** 版本 */ + private String version; + + /** 版权年份 */ + private String copyrightYear; + + /** 上传路径 */ + private static String profile; + + /** 获取地址开关 */ + private static boolean addressEnabled; + + /** 验证码类型 */ + private static String captchaType; + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + + public String getCopyrightYear() + { + return copyrightYear; + } + + public void setCopyrightYear(String copyrightYear) + { + this.copyrightYear = copyrightYear; + } + + public static String getProfile() + { + return profile; + } + + public void setProfile(String profile) + { + TcctynConfig.profile = profile; + } + + public static boolean isAddressEnabled() + { + return addressEnabled; + } + + public void setAddressEnabled(boolean addressEnabled) + { + TcctynConfig.addressEnabled = addressEnabled; + } + + public static String getCaptchaType() { + return captchaType; + } + + public void setCaptchaType(String captchaType) { + TcctynConfig.captchaType = captchaType; + } + + /** + * 获取导入上传路径 + */ + public static String getImportPath() + { + return getProfile() + "/import"; + } + + /** + * 获取头像上传路径 + */ + public static String getAvatarPath() + { + return getProfile() + "/avatar"; + } + + /** + * 获取下载路径 + */ + public static String getDownloadPath() + { + return getProfile() + "/download/"; + } + + /** + * 获取上传路径 + */ + public static String getUploadPath() + { + return getProfile() + "/upload"; + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/config/serializer/SensitiveJsonSerializer.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/config/serializer/SensitiveJsonSerializer.java new file mode 100644 index 0000000..272f5be --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/config/serializer/SensitiveJsonSerializer.java @@ -0,0 +1,68 @@ +package com.tcctyn.common.core.config.serializer; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.ContextualSerializer; +import com.tcctyn.common.core.annotation.Sensitive; +import com.tcctyn.common.core.web.domain.model.LoginUser; +import com.tcctyn.common.core.enums.DesensitizedType; +import com.tcctyn.common.core.utils.SecurityUtils; + +import java.io.IOException; +import java.util.Objects; + +/** + * 数据脱敏序列化过滤 + * + * @author tcctyn + */ +public class SensitiveJsonSerializer extends JsonSerializer implements ContextualSerializer +{ + private DesensitizedType desensitizedType; + + @Override + public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException + { + if (desensitization()) + { + gen.writeString(desensitizedType.desensitizer().apply(value)); + } + else + { + gen.writeString(value); + } + } + + @Override + public JsonSerializer createContextual(SerializerProvider prov, BeanProperty property) + throws JsonMappingException + { + Sensitive annotation = property.getAnnotation(Sensitive.class); + if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) + { + this.desensitizedType = annotation.desensitizedType(); + return this; + } + return prov.findValueSerializer(property.getType(), property); + } + + /** + * 是否需要脱敏处理 + */ + private boolean desensitization() + { + try + { + LoginUser securityUser = SecurityUtils.getLoginUser(); + // 管理员不脱敏 + return !securityUser.getUser().isAdmin(); + } + catch (Exception e) + { + return true; + } + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/CacheConstants.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/CacheConstants.java index 1267527..6577e25 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/CacheConstants.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/CacheConstants.java @@ -1,12 +1,47 @@ package com.tcctyn.common.core.constant; /** - * 缓存常量信息 + * 缓存的key 常量 * * @author tcctyn */ public class CacheConstants { + /** + * 登录用户 redis key + */ + public static final String LOGIN_TOKEN_KEY = "login_tokens:"; + + /** + * 验证码 redis key + */ + public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; + + /** + * 参数管理 cache key + */ + public static final String SYS_CONFIG_KEY = "sys_config:"; + + /** + * 字典管理 cache key + */ + public static final String SYS_DICT_KEY = "sys_dict:"; + + /** + * 防重提交 redis key + */ + public static final String REPEAT_SUBMIT_KEY = "repeat_submit:"; + + /** + * 限流 redis key + */ + public static final String RATE_LIMIT_KEY = "rate_limit:"; + + /** + * 登录账户密码错误次数 redis key + */ + public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; + /** * 缓存有效期,默认720(分钟) */ @@ -27,30 +62,6 @@ public class CacheConstants */ public final static long PASSWORD_LOCK_TIME = 10; - /** - * 权限缓存前缀 - */ - public final static String LOGIN_TOKEN_KEY = "login_tokens:"; - - /** - * 验证码 redis key - */ - public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; - - /** - * 参数管理 cache key - */ - public static final String SYS_CONFIG_KEY = "sys_config:"; - - /** - * 字典管理 cache key - */ - public static final String SYS_DICT_KEY = "sys_dict:"; - - /** - * 登录账户密码错误次数 redis key - */ - public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; /** * 登录IP黑名单 cache key diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/Constants.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/Constants.java index 534fe93..fa28abb 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/Constants.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/Constants.java @@ -1,8 +1,12 @@ package com.tcctyn.common.core.constant; +import io.jsonwebtoken.Claims; + +import java.util.Locale; + /** * 通用常量信息 - * + * * @author tcctyn */ public class Constants @@ -17,26 +21,16 @@ public class Constants */ public static final String GBK = "GBK"; + /** + * 系统语言 + */ + public static final Locale DEFAULT_LOCALE = Locale.SIMPLIFIED_CHINESE; + /** * www主域 */ public static final String WWW = "www."; - /** - * RMI 远程方法调用 - */ - public static final String LOOKUP_RMI = "rmi:"; - - /** - * LDAP 远程方法调用 - */ - public static final String LOOKUP_LDAP = "ldap:"; - - /** - * LDAPS 远程方法调用 - */ - public static final String LOOKUP_LDAPS = "ldaps:"; - /** * http请求 */ @@ -48,24 +42,14 @@ public class Constants public static final String HTTPS = "https://"; /** - * 成功标记 + * 通用成功标识 */ - public static final Integer SUCCESS = 200; + public static final String SUCCESS = "0"; /** - * 失败标记 + * 通用失败标识 */ - public static final Integer FAIL = 500; - - /** - * 登录成功状态 - */ - public static final String LOGIN_SUCCESS_STATUS = "0"; - - /** - * 登录失败状态 - */ - public static final String LOGIN_FAIL_STATUS = "1"; + public static final String FAIL = "1"; /** * 登录成功 @@ -88,35 +72,91 @@ public class Constants public static final String LOGIN_FAIL = "Error"; /** - * 当前记录起始索引 + * 所有权限标识 */ - public static final String PAGE_NUM = "pageNum"; + public static final String ALL_PERMISSION = "*:*:*"; /** - * 每页显示记录数 + * 管理员角色权限标识 */ - public static final String PAGE_SIZE = "pageSize"; + public static final String SUPER_ADMIN = "admin"; /** - * 排序列 + * 角色权限分隔符 */ - public static final String ORDER_BY_COLUMN = "orderByColumn"; + public static final String ROLE_DELIMETER = ","; /** - * 排序的方向 "desc" 或者 "asc". + * 权限标识分隔符 */ - public static final String IS_ASC = "isAsc"; + public static final String PERMISSION_DELIMETER = ","; + /** * 验证码有效期(分钟) */ public static final long CAPTCHA_EXPIRATION = 2; + /** + * 令牌 + */ + public static final String TOKEN = "token"; + + /** + * 令牌前缀 + */ + public static final String TOKEN_PREFIX = "Bearer "; + + /** + * 令牌前缀 + */ + public static final String LOGIN_USER_KEY = "login_user_key"; + + /** + * 用户ID + */ + public static final String JWT_USERID = "userid"; + + /** + * 用户名称 + */ + public static final String JWT_USERNAME = Claims.SUBJECT; + + /** + * 用户头像 + */ + public static final String JWT_AVATAR = "avatar"; + + /** + * 创建时间 + */ + public static final String JWT_CREATED = "created"; + + /** + * 用户权限 + */ + public static final String JWT_AUTHORITIES = "authorities"; + /** * 资源映射路径 前缀 */ public static final String RESOURCE_PREFIX = "/profile"; + /** + * RMI 远程方法调用 + */ + public static final String LOOKUP_RMI = "rmi:"; + + /** + * LDAP 远程方法调用 + */ + public static final String LOOKUP_LDAP = "ldap:"; + + /** + * LDAPS 远程方法调用 + */ + public static final String LOOKUP_LDAPS = "ldaps:"; + /** * 自动识别json对象白名单配置(仅允许解析的包名,范围越小越安全) */ @@ -125,11 +165,21 @@ public class Constants /** * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) */ - public static final String[] JOB_WHITELIST_STR = { "com.tcctyn.job.task" }; + public static final String[] JOB_WHITELIST_STR = { "com.tcctyn.quartz.task" }; + + /** + * 登录成功状态 + */ + public static final String LOGIN_SUCCESS_STATUS = "0"; + + /** + * 登录失败状态 + */ + public static final String LOGIN_FAIL_STATUS = "1"; /** * 定时任务违规的字符 */ public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", - "org.springframework", "org.apache", "com.tcctyn.common.core.utils.file" }; + "org.springframework", "org.apache", "com.tcctyn.common.utils.file", "com.tcctyn.common.config", "com.tcctyn.generator" }; } diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/GenConstants.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/GenConstants.java index 50e6f4f..8643cd0 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/GenConstants.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/GenConstants.java @@ -59,7 +59,7 @@ public class GenConstants public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" }; /** Tree基类字段 */ - public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors" }; + public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors", "children" }; /** 文本框 */ public static final String HTML_INPUT = "input"; diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/RegionConstants.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/RegionConstants.java new file mode 100644 index 0000000..3a1bda2 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/RegionConstants.java @@ -0,0 +1,9 @@ +package com.tcctyn.common.core.constant; + +/** + * 地区常量 + */ +public interface RegionConstants { + + String DIVISION_COMMA = ","; +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/UserConstants.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/UserConstants.java index 8e5940d..856704c 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/UserConstants.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/constant/UserConstants.java @@ -2,7 +2,7 @@ package com.tcctyn.common.core.constant; /** * 用户常量信息 - * + * * @author tcctyn */ public class UserConstants diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/BusinessStatus.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/BusinessStatus.java new file mode 100644 index 0000000..b25dcb9 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/BusinessStatus.java @@ -0,0 +1,20 @@ +package com.tcctyn.common.core.enums; + +/** + * 操作状态 + * + * @author tcctyn + * + */ +public enum BusinessStatus +{ + /** + * 成功 + */ + SUCCESS, + + /** + * 失败 + */ + FAIL, +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/BusinessType.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/BusinessType.java new file mode 100644 index 0000000..41b2446 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/BusinessType.java @@ -0,0 +1,59 @@ +package com.tcctyn.common.core.enums; + +/** + * 业务操作类型 + * + * @author tcctyn + */ +public enum BusinessType +{ + /** + * 其它 + */ + OTHER, + + /** + * 新增 + */ + INSERT, + + /** + * 修改 + */ + UPDATE, + + /** + * 删除 + */ + DELETE, + + /** + * 授权 + */ + GRANT, + + /** + * 导出 + */ + EXPORT, + + /** + * 导入 + */ + IMPORT, + + /** + * 强退 + */ + FORCE, + + /** + * 生成代码 + */ + GENCODE, + + /** + * 清空数据 + */ + CLEAN, +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/DataSourceType.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/DataSourceType.java new file mode 100644 index 0000000..23a5c13 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/DataSourceType.java @@ -0,0 +1,19 @@ +package com.tcctyn.common.core.enums; + +/** + * 数据源 + * + * @author tcctyn + */ +public enum DataSourceType +{ + /** + * 主库 + */ + MASTER, + + /** + * 从库 + */ + SLAVE +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/DesensitizedType.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/DesensitizedType.java new file mode 100644 index 0000000..5253532 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/DesensitizedType.java @@ -0,0 +1,60 @@ +package com.tcctyn.common.core.enums; + +import com.tcctyn.common.core.utils.DesensitizedUtil; + +import java.util.function.Function; + +/** + * 脱敏类型 + * + * @author tcctyn + */ +public enum DesensitizedType +{ + /** + * 姓名,第2位星号替换 + */ + USERNAME(s -> s.replaceAll("(\\S)\\S(\\S*)", "$1*$2")), + + /** + * 密码,全部字符都用*代替 + */ + PASSWORD(DesensitizedUtil::password), + + /** + * 身份证,中间10位星号替换 + */ + ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\d{4})", "$1** **** ****$2")), + + /** + * 手机号,中间4位星号替换 + */ + PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")), + + /** + * 电子邮箱,仅显示第一个字母和@后面的地址显示,其他星号替换 + */ + EMAIL(s -> s.replaceAll("(^.)[^@]*(@.*$)", "$1****$2")), + + /** + * 银行卡号,保留最后4位,其他星号替换 + */ + BANK_CARD(s -> s.replaceAll("\\d{15}(\\d{3})", "**** **** **** **** $1")), + + /** + * 车牌号码,包含普通车辆、新能源车辆 + */ + CAR_LICENSE(DesensitizedUtil::carLicense); + + private final Function desensitizer; + + DesensitizedType(Function desensitizer) + { + this.desensitizer = desensitizer; + } + + public Function desensitizer() + { + return desensitizer; + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/HttpMethod.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/HttpMethod.java new file mode 100644 index 0000000..94e07b7 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/HttpMethod.java @@ -0,0 +1,37 @@ +package com.tcctyn.common.core.enums; + +import org.springframework.lang.Nullable; + +import java.util.HashMap; +import java.util.Map; + +/** + * 请求方式 + * + * @author tcctyn + */ +public enum HttpMethod +{ + GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE; + + private static final Map mappings = new HashMap<>(16); + + static + { + for (HttpMethod httpMethod : values()) + { + mappings.put(httpMethod.name(), httpMethod); + } + } + + @Nullable + public static HttpMethod resolve(@Nullable String method) + { + return (method != null ? mappings.get(method) : null); + } + + public boolean matches(String method) + { + return (this == resolve(method)); + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/LimitType.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/LimitType.java new file mode 100644 index 0000000..488ee5d --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/LimitType.java @@ -0,0 +1,20 @@ +package com.tcctyn.common.core.enums; + +/** + * 限流类型 + * + * @author tcctyn + */ + +public enum LimitType +{ + /** + * 默认策略全局限流 + */ + DEFAULT, + + /** + * 根据请求者IP进行限流 + */ + IP +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/OperatorType.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/OperatorType.java new file mode 100644 index 0000000..20a873e --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/enums/OperatorType.java @@ -0,0 +1,24 @@ +package com.tcctyn.common.core.enums; + +/** + * 操作人类别 + * + * @author tcctyn + */ +public enum OperatorType +{ + /** + * 其它 + */ + OTHER, + + /** + * 后台用户 + */ + MANAGE, + + /** + * 手机端用户 + */ + MOBILE +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/base/BaseException.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/base/BaseException.java index ed87418..92520ab 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/base/BaseException.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/base/BaseException.java @@ -1,5 +1,8 @@ package com.tcctyn.common.core.exception.base; +import com.tcctyn.common.core.utils.MessageUtils; +import com.tcctyn.common.core.utils.StringUtils; + /** * 基础异常 * @@ -57,6 +60,21 @@ public class BaseException extends RuntimeException this(null, null, null, defaultMessage); } + @Override + public String getMessage() + { + String message = null; + if (!StringUtils.isEmpty(code)) + { + message = MessageUtils.message(code, args); + } + if (message == null) + { + message = defaultMessage; + } + return message; + } + public String getModule() { return module; diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/file/FileException.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/file/FileException.java index a8ae6d8..d693cb7 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/file/FileException.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/file/FileException.java @@ -11,9 +11,9 @@ public class FileException extends BaseException { private static final long serialVersionUID = 1L; - public FileException(String code, Object[] args, String msg) + public FileException(String code, Object[] args) { - super("file", code, args, msg); + super("file", code, args, null); } } diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/file/FileNameLengthLimitExceededException.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/file/FileNameLengthLimitExceededException.java index 65c6c4d..c98884a 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/file/FileNameLengthLimitExceededException.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/file/FileNameLengthLimitExceededException.java @@ -11,6 +11,6 @@ public class FileNameLengthLimitExceededException extends FileException public FileNameLengthLimitExceededException(int defaultFileNameLength) { - super("upload.filename.exceed.length", new Object[] { defaultFileNameLength }, "the filename is too long"); + super("upload.filename.exceed.length", new Object[] { defaultFileNameLength }); } } diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/file/FileSizeLimitExceededException.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/file/FileSizeLimitExceededException.java index 38906b2..74ee146 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/file/FileSizeLimitExceededException.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/file/FileSizeLimitExceededException.java @@ -11,6 +11,6 @@ public class FileSizeLimitExceededException extends FileException public FileSizeLimitExceededException(long defaultMaxSize) { - super("upload.exceed.maxSize", new Object[] { defaultMaxSize }, "the filesize is too large"); + super("upload.exceed.maxSize", new Object[] { defaultMaxSize }); } } diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/file/InvalidExtensionException.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/file/InvalidExtensionException.java index ec99534..a443751 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/file/InvalidExtensionException.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/file/InvalidExtensionException.java @@ -17,7 +17,7 @@ public class InvalidExtensionException extends FileUploadException public InvalidExtensionException(String[] allowedExtension, String extension, String filename) { - super("filename : [" + filename + "], extension : [" + extension + "], allowed extension : [" + Arrays.toString(allowedExtension) + "]"); + super("文件[" + filename + "]后缀[" + extension + "]不正确,请上传" + Arrays.toString(allowedExtension) + "格式"); this.allowedExtension = allowedExtension; this.extension = extension; this.filename = filename; @@ -67,7 +67,7 @@ public class InvalidExtensionException extends FileUploadException super(allowedExtension, extension, filename); } } - + public static class InvalidVideoExtensionException extends InvalidExtensionException { private static final long serialVersionUID = 1L; diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/user/BlackListException.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/user/BlackListException.java new file mode 100644 index 0000000..3e34167 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/user/BlackListException.java @@ -0,0 +1,16 @@ +package com.tcctyn.common.core.exception.user; + +/** + * 黑名单IP异常类 + * + * @author tcctyn + */ +public class BlackListException extends UserException +{ + private static final long serialVersionUID = 1L; + + public BlackListException() + { + super("login.blocked", null); + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/user/CaptchaException.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/user/CaptchaException.java new file mode 100644 index 0000000..59e9a69 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/user/CaptchaException.java @@ -0,0 +1,16 @@ +package com.tcctyn.common.core.exception.user; + +/** + * 验证码错误异常类 + * + * @author tcctyn + */ +public class CaptchaException extends UserException +{ + private static final long serialVersionUID = 1L; + + public CaptchaException() + { + super("user.jcaptcha.error", null); + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/user/UserNotExistsException.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/user/UserNotExistsException.java new file mode 100644 index 0000000..4583c7c --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/user/UserNotExistsException.java @@ -0,0 +1,16 @@ +package com.tcctyn.common.core.exception.user; + +/** + * 用户不存在异常类 + * + * @author tcctyn + */ +public class UserNotExistsException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserNotExistsException() + { + super("user.not.exists", null); + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/user/UserPasswordRetryLimitExceedException.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/user/UserPasswordRetryLimitExceedException.java new file mode 100644 index 0000000..1a879d7 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/exception/user/UserPasswordRetryLimitExceedException.java @@ -0,0 +1,16 @@ +package com.tcctyn.common.core.exception.user; + +/** + * 用户错误最大次数异常类 + * + * @author tcctyn + */ +public class UserPasswordRetryLimitExceedException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserPasswordRetryLimitExceedException(int retryLimitCount, int lockTime) + { + super("user.password.retry.limit.exceed", new Object[] { retryLimitCount, lockTime }); + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/filter/PropertyPreExcludeFilter.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/filter/PropertyPreExcludeFilter.java new file mode 100644 index 0000000..d2cf613 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/filter/PropertyPreExcludeFilter.java @@ -0,0 +1,24 @@ +package com.tcctyn.common.core.filter; + +import com.alibaba.fastjson2.filter.SimplePropertyPreFilter; + +/** + * 排除JSON敏感属性 + * + * @author tcctyn + */ +public class PropertyPreExcludeFilter extends SimplePropertyPreFilter +{ + public PropertyPreExcludeFilter() + { + } + + public PropertyPreExcludeFilter addExcludes(String... filters) + { + for (int i = 0; i < filters.length; i++) + { + this.getExcludes().add(filters[i]); + } + return this; + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/filter/RepeatableFilter.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/filter/RepeatableFilter.java new file mode 100644 index 0000000..8314c03 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/filter/RepeatableFilter.java @@ -0,0 +1,48 @@ +package com.tcctyn.common.core.filter; + +import com.tcctyn.common.core.utils.StringUtils; +import org.springframework.http.MediaType; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; + +/** + * Repeatable 过滤器 + * + * @author tcctyn + */ +public class RepeatableFilter implements Filter +{ + @Override + public void init(FilterConfig filterConfig) throws ServletException + { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + ServletRequest requestWrapper = null; + if (request instanceof HttpServletRequest + && StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) + { + requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response); + } + if (null == requestWrapper) + { + chain.doFilter(request, response); + } + else + { + chain.doFilter(requestWrapper, response); + } + } + + @Override + public void destroy() + { + + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/filter/RepeatedlyRequestWrapper.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/filter/RepeatedlyRequestWrapper.java new file mode 100644 index 0000000..162f2a1 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/filter/RepeatedlyRequestWrapper.java @@ -0,0 +1,77 @@ +package com.tcctyn.common.core.filter; + +import com.tcctyn.common.core.constant.Constants; +import com.tcctyn.common.core.utils.http.HttpHelper; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * 构建可重复读取inputStream的request + * + * @author tcctyn + */ +public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper +{ + private final byte[] body; + + public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException + { + super(request); + request.setCharacterEncoding(Constants.UTF8); + response.setCharacterEncoding(Constants.UTF8); + + body = HttpHelper.getBodyString(request).getBytes(Constants.UTF8); + } + + @Override + public BufferedReader getReader() throws IOException + { + return new BufferedReader(new InputStreamReader(getInputStream())); + } + + @Override + public ServletInputStream getInputStream() throws IOException + { + final ByteArrayInputStream bais = new ByteArrayInputStream(body); + return new ServletInputStream() + { + @Override + public int read() throws IOException + { + return bais.read(); + } + + @Override + public int available() throws IOException + { + return body.length; + } + + @Override + public boolean isFinished() + { + return false; + } + + @Override + public boolean isReady() + { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) + { + + } + }; + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/filter/XssFilter.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/filter/XssFilter.java new file mode 100644 index 0000000..a44b712 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/filter/XssFilter.java @@ -0,0 +1,71 @@ +package com.tcctyn.common.core.filter; + +import com.tcctyn.common.core.enums.HttpMethod; +import com.tcctyn.common.core.utils.StringUtils; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * 防止XSS攻击的过滤器 + * + * @author tcctyn + */ +public class XssFilter implements Filter +{ + /** + * 排除链接 + */ + public List excludes = new ArrayList<>(); + + @Override + public void init(FilterConfig filterConfig) throws ServletException + { + String tempExcludes = filterConfig.getInitParameter("excludes"); + if (StringUtils.isNotEmpty(tempExcludes)) + { + String[] urls = tempExcludes.split(","); + for (String url : urls) + { + excludes.add(url); + } + } + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse resp = (HttpServletResponse) response; + if (handleExcludeURL(req, resp)) + { + chain.doFilter(request, response); + return; + } + XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request); + chain.doFilter(xssRequest, response); + } + + private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) + { + String url = request.getServletPath(); + String method = request.getMethod(); + // GET DELETE 不过滤 + if (method == null || HttpMethod.GET.matches(method) || HttpMethod.DELETE.matches(method)) + { + return true; + } + return StringUtils.matches(url, excludes); + } + + @Override + public void destroy() + { + + } +} \ No newline at end of file diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/filter/XssHttpServletRequestWrapper.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/filter/XssHttpServletRequestWrapper.java new file mode 100644 index 0000000..fc59e3a --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/filter/XssHttpServletRequestWrapper.java @@ -0,0 +1,112 @@ +package com.tcctyn.common.core.filter; + +import com.tcctyn.common.core.utils.StringUtils; +import com.tcctyn.common.core.utils.html.EscapeUtil; +import org.apache.commons.io.IOUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.ByteArrayInputStream; +import java.io.IOException; + +/** + * XSS过滤处理 + * + * @author tcctyn + */ +public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper +{ + /** + * @param request + */ + public XssHttpServletRequestWrapper(HttpServletRequest request) + { + super(request); + } + + @Override + public String[] getParameterValues(String name) + { + String[] values = super.getParameterValues(name); + if (values != null) + { + int length = values.length; + String[] escapesValues = new String[length]; + for (int i = 0; i < length; i++) + { + // 防xss攻击和过滤前后空格 + escapesValues[i] = EscapeUtil.clean(values[i]).trim(); + } + return escapesValues; + } + return super.getParameterValues(name); + } + + @Override + public ServletInputStream getInputStream() throws IOException + { + // 非json类型,直接返回 + if (!isJsonRequest()) + { + return super.getInputStream(); + } + + // 为空,直接返回 + String json = IOUtils.toString(super.getInputStream(), "utf-8"); + if (StringUtils.isEmpty(json)) + { + return super.getInputStream(); + } + + // xss过滤 + json = EscapeUtil.clean(json).trim(); + byte[] jsonBytes = json.getBytes("utf-8"); + final ByteArrayInputStream bis = new ByteArrayInputStream(jsonBytes); + return new ServletInputStream() + { + @Override + public boolean isFinished() + { + return true; + } + + @Override + public boolean isReady() + { + return true; + } + + @Override + public int available() throws IOException + { + return jsonBytes.length; + } + + @Override + public void setReadListener(ReadListener readListener) + { + } + + @Override + public int read() throws IOException + { + return bis.read(); + } + }; + } + + /** + * 是否是Json请求 + * + * @param request + */ + public boolean isJsonRequest() + { + String header = super.getHeader(HttpHeaders.CONTENT_TYPE); + return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); + } +} \ No newline at end of file diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/redis/RedisCache.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/redis/RedisCache.java new file mode 100644 index 0000000..97e4b5f --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/redis/RedisCache.java @@ -0,0 +1,265 @@ +package com.tcctyn.common.core.redis; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.BoundSetOperations; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * spring redis 工具类 + * + * @author tcctyn + **/ +@SuppressWarnings(value = { "unchecked", "rawtypes" }) +@Component +public class RedisCache +{ + @Autowired + public RedisTemplate redisTemplate; + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + */ + public void setCacheObject(final String key, final T value) + { + redisTemplate.opsForValue().set(key, value); + } + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @param timeout 时间 + * @param timeUnit 时间颗粒度 + */ + public void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) + { + redisTemplate.opsForValue().set(key, value, timeout, timeUnit); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout) + { + return expire(key, timeout, TimeUnit.SECONDS); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @param unit 时间单位 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout, final TimeUnit unit) + { + return redisTemplate.expire(key, timeout, unit); + } + + /** + * 获取有效时间 + * + * @param key Redis键 + * @return 有效时间 + */ + public long getExpire(final String key) + { + return redisTemplate.getExpire(key); + } + + /** + * 判断 key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public Boolean hasKey(String key) + { + return redisTemplate.hasKey(key); + } + + /** + * 获得缓存的基本对象。 + * + * @param key 缓存键值 + * @return 缓存键值对应的数据 + */ + public T getCacheObject(final String key) + { + ValueOperations operation = redisTemplate.opsForValue(); + return operation.get(key); + } + + /** + * 删除单个对象 + * + * @param key + */ + public boolean deleteObject(final String key) + { + return redisTemplate.delete(key); + } + + /** + * 删除集合对象 + * + * @param collection 多个对象 + * @return + */ + public boolean deleteObject(final Collection collection) + { + return redisTemplate.delete(collection) > 0; + } + + /** + * 缓存List数据 + * + * @param key 缓存的键值 + * @param dataList 待缓存的List数据 + * @return 缓存的对象 + */ + public long setCacheList(final String key, final List dataList) + { + Long count = redisTemplate.opsForList().rightPushAll(key, dataList); + return count == null ? 0 : count; + } + + /** + * 获得缓存的list对象 + * + * @param key 缓存的键值 + * @return 缓存键值对应的数据 + */ + public List getCacheList(final String key) + { + return redisTemplate.opsForList().range(key, 0, -1); + } + + /** + * 缓存Set + * + * @param key 缓存键值 + * @param dataSet 缓存的数据 + * @return 缓存数据的对象 + */ + public BoundSetOperations setCacheSet(final String key, final Set dataSet) + { + BoundSetOperations setOperation = redisTemplate.boundSetOps(key); + Iterator it = dataSet.iterator(); + while (it.hasNext()) + { + setOperation.add(it.next()); + } + return setOperation; + } + + /** + * 获得缓存的set + * + * @param key + * @return + */ + public Set getCacheSet(final String key) + { + return redisTemplate.opsForSet().members(key); + } + + /** + * 缓存Map + * + * @param key + * @param dataMap + */ + public void setCacheMap(final String key, final Map dataMap) + { + if (dataMap != null) { + redisTemplate.opsForHash().putAll(key, dataMap); + } + } + + /** + * 获得缓存的Map + * + * @param key + * @return + */ + public Map getCacheMap(final String key) + { + return redisTemplate.opsForHash().entries(key); + } + + /** + * 往Hash中存入数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @param value 值 + */ + public void setCacheMapValue(final String key, final String hKey, final T value) + { + redisTemplate.opsForHash().put(key, hKey, value); + } + + /** + * 获取Hash中的数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return Hash中的对象 + */ + public T getCacheMapValue(final String key, final String hKey) + { + HashOperations opsForHash = redisTemplate.opsForHash(); + return opsForHash.get(key, hKey); + } + + /** + * 获取多个Hash中的数据 + * + * @param key Redis键 + * @param hKeys Hash键集合 + * @return Hash对象集合 + */ + public List getMultiCacheMapValue(final String key, final Collection hKeys) + { + return redisTemplate.opsForHash().multiGet(key, hKeys); + } + + /** + * 删除Hash中的某条数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return 是否成功 + */ + public boolean deleteCacheMapValue(final String key, final String hKey) + { + return redisTemplate.opsForHash().delete(key, hKey) > 0; + } + + /** + * 获得缓存的基本对象列表 + * + * @param pattern 字符串前缀 + * @return 对象列表 + */ + public Collection keys(final String pattern) + { + return redisTemplate.keys(pattern); + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/text/CharsetKit.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/text/CharsetKit.java index c193657..0c6c82f 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/text/CharsetKit.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/text/CharsetKit.java @@ -1,8 +1,9 @@ package com.tcctyn.common.core.text; +import com.tcctyn.common.core.utils.StringUtils; + import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import com.tcctyn.common.core.utils.StringUtils; /** * 字符集工具类 diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/text/Convert.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/text/Convert.java index 20a29bf..29dfcfa 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/text/Convert.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/text/Convert.java @@ -1,5 +1,8 @@ package com.tcctyn.common.core.text; +import com.tcctyn.common.core.utils.StringUtils; +import org.apache.commons.lang3.ArrayUtils; + import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; @@ -7,11 +10,10 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.text.NumberFormat; import java.util.Set; -import com.tcctyn.common.core.utils.StringUtils; /** * 类型转换器 - * + * * @author tcctyn */ public class Convert @@ -20,7 +22,7 @@ public class Convert * 转换为字符串
* 如果给定的值为null,或者转换失败,返回默认值
* 转换失败不会报错 - * + * * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 @@ -42,7 +44,7 @@ public class Convert * 转换为字符串
* 如果给定的值为null,或者转换失败,返回默认值null
* 转换失败不会报错 - * + * * @param value 被转换的值 * @return 结果 */ @@ -55,7 +57,7 @@ public class Convert * 转换为字符
* 如果给定的值为null,或者转换失败,返回默认值
* 转换失败不会报错 - * + * * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 @@ -79,7 +81,7 @@ public class Convert * 转换为字符
* 如果给定的值为null,或者转换失败,返回默认值null
* 转换失败不会报错 - * + * * @param value 被转换的值 * @return 结果 */ @@ -92,7 +94,7 @@ public class Convert * 转换为byte
* 如果给定的值为null,或者转换失败,返回默认值
* 转换失败不会报错 - * + * * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 @@ -130,7 +132,7 @@ public class Convert * 转换为byte
* 如果给定的值为null,或者转换失败,返回默认值null
* 转换失败不会报错 - * + * * @param value 被转换的值 * @return 结果 */ @@ -143,7 +145,7 @@ public class Convert * 转换为Short
* 如果给定的值为null,或者转换失败,返回默认值
* 转换失败不会报错 - * + * * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 @@ -181,7 +183,7 @@ public class Convert * 转换为Short
* 如果给定的值为null,或者转换失败,返回默认值null
* 转换失败不会报错 - * + * * @param value 被转换的值 * @return 结果 */ @@ -194,7 +196,7 @@ public class Convert * 转换为Number
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错 - * + * * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 @@ -228,7 +230,7 @@ public class Convert * 转换为Number
* 如果给定的值为空,或者转换失败,返回默认值null
* 转换失败不会报错 - * + * * @param value 被转换的值 * @return 结果 */ @@ -241,7 +243,7 @@ public class Convert * 转换为int
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错 - * + * * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 @@ -279,7 +281,7 @@ public class Convert * 转换为int
* 如果给定的值为null,或者转换失败,返回默认值null
* 转换失败不会报错 - * + * * @param value 被转换的值 * @return 结果 */ @@ -290,7 +292,7 @@ public class Convert /** * 转换为Integer数组
- * + * * @param str 被转换的值 * @return 结果 */ @@ -301,7 +303,7 @@ public class Convert /** * 转换为Long数组
- * + * * @param str 被转换的值 * @return 结果 */ @@ -312,9 +314,9 @@ public class Convert /** * 转换为Integer数组
- * + * * @param split 分隔符 - * @param str 被转换的值 + * @param split 被转换的值 * @return 结果 */ public static Integer[] toIntArray(String split, String str) @@ -335,7 +337,7 @@ public class Convert /** * 转换为Long数组
- * + * * @param split 分隔符 * @param str 被转换的值 * @return 结果 @@ -358,7 +360,7 @@ public class Convert /** * 转换为String数组
- * + * * @param str 被转换的值 * @return 结果 */ @@ -373,9 +375,9 @@ public class Convert /** * 转换为String数组
- * + * * @param split 分隔符 - * @param str 被转换的值 + * @param split 被转换的值 * @return 结果 */ public static String[] toStrArray(String split, String str) @@ -387,7 +389,7 @@ public class Convert * 转换为long
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错 - * + * * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 @@ -426,7 +428,7 @@ public class Convert * 转换为long
* 如果给定的值为null,或者转换失败,返回默认值null
* 转换失败不会报错 - * + * * @param value 被转换的值 * @return 结果 */ @@ -439,7 +441,7 @@ public class Convert * 转换为double
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错 - * + * * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 @@ -478,7 +480,7 @@ public class Convert * 转换为double
* 如果给定的值为空,或者转换失败,返回默认值null
* 转换失败不会报错 - * + * * @param value 被转换的值 * @return 结果 */ @@ -491,7 +493,7 @@ public class Convert * 转换为Float
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错 - * + * * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 @@ -529,7 +531,7 @@ public class Convert * 转换为Float
* 如果给定的值为空,或者转换失败,返回默认值null
* 转换失败不会报错 - * + * * @param value 被转换的值 * @return 结果 */ @@ -540,7 +542,7 @@ public class Convert /** * 转换为boolean
- * String支持的值为:true、false、yes、ok、no、1、0、是、否, 如果给定的值为空,或者转换失败,返回默认值
+ * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错 * * @param value 被转换的值 @@ -569,12 +571,10 @@ public class Convert case "yes": case "ok": case "1": - case "是": return true; case "false": case "no": case "0": - case "否": return false; default: return defaultValue; @@ -585,7 +585,7 @@ public class Convert * 转换为boolean
* 如果给定的值为空,或者转换失败,返回默认值null
* 转换失败不会报错 - * + * * @param value 被转换的值 * @return 结果 */ @@ -597,7 +597,7 @@ public class Convert /** * 转换为Enum对象
* 如果给定的值为空,或者转换失败,返回默认值
- * + * * @param clazz Enum的Class * @param value 值 * @param defaultValue 默认值 @@ -633,7 +633,7 @@ public class Convert /** * 转换为Enum对象
* 如果给定的值为空,或者转换失败,返回默认值null
- * + * * @param clazz Enum的Class * @param value 值 * @return Enum @@ -647,7 +647,7 @@ public class Convert * 转换为BigInteger
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错 - * + * * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 @@ -685,7 +685,7 @@ public class Convert * 转换为BigInteger
* 如果给定的值为空,或者转换失败,返回默认值null
* 转换失败不会报错 - * + * * @param value 被转换的值 * @return 结果 */ @@ -698,7 +698,7 @@ public class Convert * 转换为BigDecimal
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错 - * + * * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 @@ -744,7 +744,7 @@ public class Convert * 转换为BigDecimal
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错 - * + * * @param value 被转换的值 * @return 结果 */ @@ -756,7 +756,7 @@ public class Convert /** * 将对象转为字符串
* 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 - * + * * @param obj 对象 * @return 字符串 */ @@ -768,7 +768,7 @@ public class Convert /** * 将对象转为字符串
* 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 - * + * * @param obj 对象 * @param charsetName 字符集 * @return 字符串 @@ -781,7 +781,7 @@ public class Convert /** * 将对象转为字符串
* 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 - * + * * @param obj 对象 * @param charset 字符集 * @return 字符串 @@ -797,23 +797,14 @@ public class Convert { return (String) obj; } - else if (obj instanceof byte[] || obj instanceof Byte[]) + else if (obj instanceof byte[]) { - if (obj instanceof byte[]) - { - return str((byte[]) obj, charset); - } - else - { - Byte[] bytes = (Byte[]) obj; - int length = bytes.length; - byte[] dest = new byte[length]; - for (int i = 0; i < length; i++) - { - dest[i] = bytes[i]; - } - return str(dest, charset); - } + return str((byte[]) obj, charset); + } + else if (obj instanceof Byte[]) + { + byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj); + return str(bytes, charset); } else if (obj instanceof ByteBuffer) { @@ -824,7 +815,7 @@ public class Convert /** * 将byte数组转为字符串 - * + * * @param bytes byte数组 * @param charset 字符集 * @return 字符串 @@ -836,7 +827,7 @@ public class Convert /** * 解码字节码 - * + * * @param data 字符串 * @param charset 字符集,如果此字段为空,则解码的结果取决于平台 * @return 解码后的字符串 @@ -857,7 +848,7 @@ public class Convert /** * 将编码的byteBuffer数据转换为字符串 - * + * * @param data 数据 * @param charset 字符集,如果为空使用当前系统字符集 * @return 字符串 @@ -874,7 +865,7 @@ public class Convert /** * 将编码的byteBuffer数据转换为字符串 - * + * * @param data 数据 * @param charset 字符集,如果为空使用当前系统字符集 * @return 字符串 @@ -891,7 +882,7 @@ public class Convert // ----------------------------------------------------------------------- 全角半角转换 /** * 半角转全角 - * + * * @param input String. * @return 全角字符串. */ @@ -902,7 +893,7 @@ public class Convert /** * 半角转全角 - * + * * @param input String * @param notConvertSet 不替换的字符集合 * @return 全角字符串. @@ -933,7 +924,7 @@ public class Convert /** * 全角转半角 - * + * * @param input String. * @return 半角字符串 */ @@ -944,7 +935,7 @@ public class Convert /** * 替换全角为半角 - * + * * @param text 文本 * @param notConvertSet 不替换的字符集合 * @return 替换后的字符 @@ -969,12 +960,14 @@ public class Convert c[i] = (char) (c[i] - 65248); } } - return new String(c); + String returnString = new String(c); + + return returnString; } /** * 数字金额大写转换 先写个完整的然后将如零拾替换成零 - * + * * @param n 数字 * @return 中文大写数字 */ diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/AESUtil.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/AESUtil.java new file mode 100644 index 0000000..8fe1552 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/AESUtil.java @@ -0,0 +1,100 @@ +package com.tcctyn.common.core.utils; + +import javax.crypto.*; +import javax.crypto.spec.SecretKeySpec; +import java.io.UnsupportedEncodingException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; + +public class AESUtil { + // 加密密码,可以为任意字符串 + private static final String password_str = "中华名族的伟大复兴¥¥¥"; + + /** + * AES加密字符串 + * + * @param content 需要被加密的字符串 + * @return 密文 + */ + public static String encrypt(String content) { + try { + KeyGenerator kgen = KeyGenerator.getInstance("AES");// 创建AES的Key生产者 + kgen.init(128, new SecureRandom(password_str.getBytes()));// 利用用户密码作为随机数初始化出 + //加密没关系,SecureRandom是生成安全随机数序列,password.getBytes()是种子,只要种子相同,序列就一样,所以解密只要有password就行 + SecretKey secretKey = kgen.generateKey();// 根据用户密码,生成一个密钥 + byte[] enCodeFormat = secretKey.getEncoded();// 返回基本编码格式的密钥,如果此密钥不支持编码,则返回 + SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 转换为AES专用密钥 + Cipher cipher = Cipher.getInstance("AES");// 创建密码器 + byte[] byteContent = content.getBytes("utf-8"); + cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化为加密模式的密码器 + byte[] result = cipher.doFinal(byteContent);// 加密 + return ParseSystemUtil.parseByte2HexStr(result); //加密后的16进制 + } catch (NoSuchPaddingException e) { + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } catch (InvalidKeyException e) { + e.printStackTrace(); + } catch (IllegalBlockSizeException e) { + e.printStackTrace(); + } catch (BadPaddingException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 解密AES加密过的字符串 + * + * @param hexStr AES加密过过的内容 + * @return 明文 + */ + public static byte[] decrypt(String hexStr) { + try { + // 16进制转换为2进制 + byte[] content = ParseSystemUtil.parseHexStr2Byte(hexStr); + + KeyGenerator kgen = KeyGenerator.getInstance("AES");// 创建AES的Key生产者 + kgen.init(128, new SecureRandom(password_str.getBytes())); + SecretKey secretKey = kgen.generateKey();// 根据用户密码,生成一个密钥 + byte[] enCodeFormat = secretKey.getEncoded();// 返回基本编码格式的密钥 + SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 转换为AES专用密钥 + Cipher cipher = Cipher.getInstance("AES");// 创建密码器 + cipher.init(Cipher.DECRYPT_MODE, key);// 初始化为解密模式的密码器 + byte[] result = cipher.doFinal(content); //解密后的二进制 + return result; // 明文 + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (NoSuchPaddingException e) { + e.printStackTrace(); + } catch (InvalidKeyException e) { + e.printStackTrace(); + } catch (IllegalBlockSizeException e) { + e.printStackTrace(); + } catch (BadPaddingException e) { + e.printStackTrace(); + } + return null; + } + + public static void main(String[] args) throws Exception { + String content = "密码1993"; + String password = "中华名族的伟大复兴"; + System.out.println("需要加密的内容:" + content); + String encrypt = encrypt(content); + System.out.println(encrypt); +// System.out.println("加密后的2进制密文:" + new String(encrypt)); +// String hexStr = ParseSystemUtil.parseByte2HexStr(encrypt); +// System.out.println("加密后的16进制密文:" + hexStr); +// byte[] byte2 = ParseSystemUtil.parseHexStr2Byte(hexStr); +// System.out.println("加密后的2进制密文:" + new String(byte2)); + byte[] decrypt = decrypt(encrypt); + System.out.println("解密后的内容:" + new String(decrypt, "utf-8")); + } +} + + + diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/Arith.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/Arith.java new file mode 100644 index 0000000..7debc33 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/Arith.java @@ -0,0 +1,114 @@ +package com.tcctyn.common.core.utils; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * 精确的浮点数运算 + * + * @author tcctyn + */ +public class Arith +{ + + /** 默认除法运算精度 */ + private static final int DEF_DIV_SCALE = 10; + + /** 这个类不能实例化 */ + private Arith() + { + } + + /** + * 提供精确的加法运算。 + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static double add(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).doubleValue(); + } + + /** + * 提供精确的减法运算。 + * @param v1 被减数 + * @param v2 减数 + * @return 两个参数的差 + */ + public static double sub(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.subtract(b2).doubleValue(); + } + + /** + * 提供精确的乘法运算。 + * @param v1 被乘数 + * @param v2 乘数 + * @return 两个参数的积 + */ + public static double mul(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.multiply(b2).doubleValue(); + } + + /** + * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 + * 小数点以后10位,以后的数字四舍五入。 + * @param v1 被除数 + * @param v2 除数 + * @return 两个参数的商 + */ + public static double div(double v1, double v2) + { + return div(v1, v2, DEF_DIV_SCALE); + } + + /** + * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 + * 定精度,以后的数字四舍五入。 + * @param v1 被除数 + * @param v2 除数 + * @param scale 表示表示需要精确到小数点以后几位。 + * @return 两个参数的商 + */ + public static double div(double v1, double v2, int scale) + { + if (scale < 0) + { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + if (b1.compareTo(BigDecimal.ZERO) == 0) + { + return BigDecimal.ZERO.doubleValue(); + } + return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); + } + + /** + * 提供精确的小数位四舍五入处理。 + * @param v 需要四舍五入的数字 + * @param scale 小数点后保留几位 + * @return 四舍五入后的结果 + */ + public static double round(double v, int scale) + { + if (scale < 0) + { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b = new BigDecimal(Double.toString(v)); + BigDecimal one = BigDecimal.ONE; + return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue(); + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/DateUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/DateUtils.java index e3c79e3..f3fbbce 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/DateUtils.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/DateUtils.java @@ -1,29 +1,28 @@ package com.tcctyn.common.core.utils; +import org.apache.commons.lang3.time.DateFormatUtils; + import java.lang.management.ManagementFactory; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.ZoneId; -import java.time.ZonedDateTime; +import java.time.*; +import java.util.Calendar; import java.util.Date; -import org.apache.commons.lang3.time.DateFormatUtils; /** * 时间工具类 * * @author tcctyn */ -public class DateUtils extends org.apache.commons.lang3.time.DateUtils -{ +public class DateUtils extends org.apache.commons.lang3.time.DateUtils { public static String YYYY = "yyyy"; public static String YYYY_MM = "yyyy-MM"; public static String YYYY_MM_DD = "yyyy-MM-dd"; + public static final String YYYYMMDD = "yyyyMMdd"; + public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; @@ -38,8 +37,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils * * @return Date() 当前日期 */ - public static Date getNowDate() - { + public static Date getNowDate() { return new Date(); } @@ -48,44 +46,43 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils * * @return String */ - public static String getDate() - { + public static String getDate() { return dateTimeNow(YYYY_MM_DD); } - public static final String getTime() - { + /** + * 获取当前日期 + * + * @return String + */ + public static String getDate(String dateType) { + return dateTimeNow(dateType); + } + + public static final String getTime() { return dateTimeNow(YYYY_MM_DD_HH_MM_SS); } - public static final String dateTimeNow() - { + public static final String dateTimeNow() { return dateTimeNow(YYYYMMDDHHMMSS); } - public static final String dateTimeNow(final String format) - { + public static final String dateTimeNow(final String format) { return parseDateToStr(format, new Date()); } - public static final String dateTime(final Date date) - { + public static final String dateTime(final Date date) { return parseDateToStr(YYYY_MM_DD, date); } - public static final String parseDateToStr(final String format, final Date date) - { + public static final String parseDateToStr(final String format, final Date date) { return new SimpleDateFormat(format).format(date); } - public static final Date dateTime(final String format, final String ts) - { - try - { + public static final Date dateTime(final String format, final String ts) { + try { return new SimpleDateFormat(format).parse(ts); - } - catch (ParseException e) - { + } catch (ParseException e) { throw new RuntimeException(e); } } @@ -93,8 +90,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils /** * 日期路径 即年/月/日 如2018/08/08 */ - public static final String datePath() - { + public static final String datePath() { Date now = new Date(); return DateFormatUtils.format(now, "yyyy/MM/dd"); } @@ -102,8 +98,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils /** * 日期路径 即年/月/日 如20180808 */ - public static final String dateTime() - { + public static final String dateTime() { Date now = new Date(); return DateFormatUtils.format(now, "yyyyMMdd"); } @@ -111,18 +106,13 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils /** * 日期型字符串转化为日期 格式 */ - public static Date parseDate(Object str) - { - if (str == null) - { + public static Date parseDate(Object str) { + if (str == null) { return null; } - try - { + try { return parseDate(str.toString(), parsePatterns); - } - catch (ParseException e) - { + } catch (ParseException e) { return null; } } @@ -130,21 +120,26 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils /** * 获取服务器启动时间 */ - public static Date getServerStartDate() - { + public static Date getServerStartDate() { long time = ManagementFactory.getRuntimeMXBean().getStartTime(); return new Date(time); } + /** + * 计算相差天数 + */ + public static int differentDaysByMillisecond(Date date1, Date date2) { + return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); + } + /** * 计算时间差 * - * @param endDate 最后时间 + * @param endDate 最后时间 * @param startTime 开始时间 * @return 时间差(天/小时/分钟) */ - public static String timeDistance(Date endDate, Date startTime) - { + public static String timeDistance(Date endDate, Date startTime) { long nd = 1000 * 24 * 60 * 60; long nh = 1000 * 60 * 60; long nm = 1000 * 60; @@ -165,8 +160,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils /** * 增加 LocalDateTime ==> Date */ - public static Date toDate(LocalDateTime temporalAccessor) - { + public static Date toDate(LocalDateTime temporalAccessor) { ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); return Date.from(zdt.toInstant()); } @@ -174,10 +168,59 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils /** * 增加 LocalDate ==> Date */ - public static Date toDate(LocalDate temporalAccessor) - { + public static Date toDate(LocalDate temporalAccessor) { LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); return Date.from(zdt.toInstant()); } + + /** + * 获取当前周的周一日期 + * + * @param date 当前日期 + * @return 周一的日期 + */ + public static Date getThisWeekMonday(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + cal.setFirstDayOfWeek(Calendar.MONDAY); + cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); // 设置为周一 + return cal.getTime(); + } + + /** + * 获取当前周的周日日期 + * + * @param date 当前日期 + * @return 周日的日期 + */ + public static Date getThisWeekSunday(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + cal.setFirstDayOfWeek(Calendar.MONDAY); + cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); // 设置为周日 + return cal.getTime(); + } + + /** + * 获取星期 + * + * @param date 日期 + */ + public static int getWeek(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); + dayOfWeek -= 1; + if (dayOfWeek == 0) { + dayOfWeek = 7; + } + return dayOfWeek; + } + + public static void main(String[] args) { + String date = DateUtils.getDate(DateUtils.YYYYMMDD); + System.out.println(date); + + } } diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/DesensitizedUtil.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/DesensitizedUtil.java new file mode 100644 index 0000000..2c71208 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/DesensitizedUtil.java @@ -0,0 +1,49 @@ +package com.tcctyn.common.core.utils; + +/** + * 脱敏工具类 + * + * @author tcctyn + */ +public class DesensitizedUtil +{ + /** + * 密码的全部字符都用*代替,比如:****** + * + * @param password 密码 + * @return 脱敏后的密码 + */ + public static String password(String password) + { + if (StringUtils.isBlank(password)) + { + return StringUtils.EMPTY; + } + return StringUtils.repeat('*', password.length()); + } + + /** + * 车牌中间用*代替,如果是错误的车牌,不处理 + * + * @param carLicense 完整的车牌号 + * @return 脱敏后的车牌 + */ + public static String carLicense(String carLicense) + { + if (StringUtils.isBlank(carLicense)) + { + return StringUtils.EMPTY; + } + // 普通车牌 + if (carLicense.length() == 7) + { + carLicense = StringUtils.hide(carLicense, 3, 6); + } + else if (carLicense.length() == 8) + { + // 新能源车牌 + carLicense = StringUtils.hide(carLicense, 3, 7); + } + return carLicense; + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/DictUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/DictUtils.java new file mode 100644 index 0000000..4b2bd28 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/DictUtils.java @@ -0,0 +1,239 @@ +package com.tcctyn.common.core.utils; + +import com.alibaba.fastjson2.JSONArray; +import com.tcctyn.common.core.constant.CacheConstants; +import com.tcctyn.common.core.web.domain.entity.SysDictData; +import com.tcctyn.common.core.redis.RedisCache; + +import java.util.Collection; +import java.util.List; + +/** + * 字典工具类 + * + * @author tcctyn + */ +public class DictUtils +{ + /** + * 分隔符 + */ + public static final String SEPARATOR = ","; + + /** + * 设置字典缓存 + * + * @param key 参数键 + * @param dictDatas 字典数据列表 + */ + public static void setDictCache(String key, List dictDatas) + { + SpringUtils.getBean(RedisCache.class).setCacheObject(getCacheKey(key), dictDatas); + } + + /** + * 获取字典缓存 + * + * @param key 参数键 + * @return dictDatas 字典数据列表 + */ + public static List getDictCache(String key) + { + JSONArray arrayCache = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); + if (StringUtils.isNotNull(arrayCache)) + { + return arrayCache.toList(SysDictData.class); + } + return null; + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue) + { + if (StringUtils.isEmpty(dictValue)) + { + return StringUtils.EMPTY; + } + return getDictLabel(dictType, dictValue, SEPARATOR); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel) + { + if (StringUtils.isEmpty(dictLabel)) + { + return StringUtils.EMPTY; + } + return getDictValue(dictType, dictLabel, SEPARATOR); + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue, String separator) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + if (StringUtils.isNull(datas)) + { + return StringUtils.EMPTY; + } + if (StringUtils.containsAny(separator, dictValue)) + { + for (SysDictData dict : datas) + { + for (String value : dictValue.split(separator)) + { + if (value.equals(dict.getDictValue())) + { + propertyString.append(dict.getDictLabel()).append(separator); + break; + } + } + } + } + else + { + for (SysDictData dict : datas) + { + if (dictValue.equals(dict.getDictValue())) + { + return dict.getDictLabel(); + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @param separator 分隔符 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel, String separator) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + if (StringUtils.isNull(datas)) + { + return StringUtils.EMPTY; + } + if (StringUtils.containsAny(separator, dictLabel)) + { + for (SysDictData dict : datas) + { + for (String label : dictLabel.split(separator)) + { + if (label.equals(dict.getDictLabel())) + { + propertyString.append(dict.getDictValue()).append(separator); + break; + } + } + } + } + else + { + for (SysDictData dict : datas) + { + if (dictLabel.equals(dict.getDictLabel())) + { + return dict.getDictValue(); + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 根据字典类型获取字典所有值 + * + * @param dictType 字典类型 + * @return 字典值 + */ + public static String getDictValues(String dictType) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + if (StringUtils.isNull(datas)) + { + return StringUtils.EMPTY; + } + for (SysDictData dict : datas) + { + propertyString.append(dict.getDictValue()).append(SEPARATOR); + } + return StringUtils.stripEnd(propertyString.toString(), SEPARATOR); + } + + /** + * 根据字典类型获取字典所有标签 + * + * @param dictType 字典类型 + * @return 字典值 + */ + public static String getDictLabels(String dictType) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + if (StringUtils.isNull(datas)) + { + return StringUtils.EMPTY; + } + for (SysDictData dict : datas) + { + propertyString.append(dict.getDictLabel()).append(SEPARATOR); + } + return StringUtils.stripEnd(propertyString.toString(), SEPARATOR); + } + + /** + * 删除指定字典缓存 + * + * @param key 字典键 + */ + public static void removeDictCache(String key) + { + SpringUtils.getBean(RedisCache.class).deleteObject(getCacheKey(key)); + } + + /** + * 清空字典缓存 + */ + public static void clearDictCache() + { + Collection keys = SpringUtils.getBean(RedisCache.class).keys(CacheConstants.SYS_DICT_KEY + "*"); + SpringUtils.getBean(RedisCache.class).deleteObject(keys); + } + + /** + * 设置cache key + * + * @param configKey 参数键 + * @return 缓存键key + */ + public static String getCacheKey(String configKey) + { + return CacheConstants.SYS_DICT_KEY + configKey; + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/DistanceCalculationUtil.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/DistanceCalculationUtil.java new file mode 100644 index 0000000..cf2ef8a --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/DistanceCalculationUtil.java @@ -0,0 +1,32 @@ +package com.tcctyn.common.core.utils; + +/** + * 距离计算工具类 + */ + +public class DistanceCalculationUtil { + + // 地球半径(单位:千米) + private static final double EARTH_RADIUS_KM = 6371.0; + + public static double calculateDistance(String lon1, String lat1, String lon2, String lat2) { + // 将角度转换为弧度 + double lat1Rad = Math.toRadians(Double.valueOf(lat1)); + double lon1Rad = Math.toRadians(Double.valueOf(lon1)); + double lat2Rad = Math.toRadians(Double.valueOf(lat2)); + double lon2Rad = Math.toRadians(Double.valueOf(lon2)); + + // 计算纬度和经度的差值 + double deltaLat = lat2Rad - lat1Rad; + double deltaLon = lon2Rad - lon1Rad; + + // 应用Haversine公式 + double a = Math.pow(Math.sin(deltaLat / 2), 2) + + Math.cos(lat1Rad) * Math.cos(lat2Rad) + * Math.pow(Math.sin(deltaLon / 2), 2); + double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + + // 计算距离 + return EARTH_RADIUS_KM * c; + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ExceptionUtil.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ExceptionUtil.java index c900b32..56417be 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ExceptionUtil.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ExceptionUtil.java @@ -1,8 +1,9 @@ package com.tcctyn.common.core.utils; +import org.apache.commons.lang3.exception.ExceptionUtils; + import java.io.PrintWriter; import java.io.StringWriter; -import org.apache.commons.lang3.exception.ExceptionUtils; /** * 错误信息处理类。 diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/FFmpegExecutor.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/FFmpegExecutor.java new file mode 100644 index 0000000..7d672e3 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/FFmpegExecutor.java @@ -0,0 +1,171 @@ +package com.tcctyn.common.core.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.io.*; +import java.util.concurrent.TimeUnit; + +/** + * @author songguoqiang + * @date 2025年04月17日 22:42:13 + */ +@Component + +public class FFmpegExecutor { + + private Process ffmpegProcess; + private OutputStream ffmpegInput; + private static final Logger logger = LoggerFactory.getLogger(FFmpegExecutor.class); + + + public void start(String format, String outputUrl, String rtspUrl) throws IOException { + // 构建 FFmpeg 命令 + ProcessBuilder pb = new ProcessBuilder( + "ffmpeg", + "-i", rtspUrl, + "-c:v", "copy", + "-c:a", "aac", + "-ar", "44100", + "-f", format, + outputUrl + ); + + // 启动进程 + ffmpegProcess = pb.start(); + ffmpegInput = ffmpegProcess.getOutputStream(); + + // 异步读取输出日志 + new Thread(() -> { + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(ffmpegProcess.getInputStream()))) { + String line; + while ((line = reader.readLine()) != null) { + logger.info("[FFmpeg] {}", line); + } + } catch (IOException e) { + logger.error("Failed to read FFmpeg output: {}", e.getMessage()); + } + }).start(); + } + public void writeFrame(byte[] frameData) throws IOException { + ffmpegInput.write(frameData); + ffmpegInput.flush(); + } + + public void stop() { + if (ffmpegProcess != null) { + try { + // 1. 尝试优雅退出(发送 'q' 命令) + if (ffmpegInput != null) { + ffmpegInput.write("q\n".getBytes()); + ffmpegInput.flush(); + } + } catch (IOException e) { + logger.warn("Failed to send exit command: {}", e.getMessage()); + } + + // 2. 关闭输入流 + try { + if (ffmpegInput != null) { + ffmpegInput.close(); + } + } catch (IOException e) { + logger.error("Error closing input stream: {}", e.getMessage()); + } + + // 3. 销毁进程 + if (ffmpegProcess.isAlive()) { + ffmpegProcess.destroy(); + try { + if (!ffmpegProcess.waitFor(5, TimeUnit.SECONDS)) { + ffmpegProcess.destroyForcibly(); + logger.warn("FFmpeg process was forcibly terminated"); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + logger.error("Interrupted while waiting for termination: {}", e.getMessage()); + } + } + ffmpegProcess = null; // 清除引用 + } + } + + private void readProcessOutput(InputStream inputStream) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { + String line; + while ((line = reader.readLine()) != null) { + System.out.println(line); + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} + +//package com.tcctyn.common.utils; +// +//import com.tcctyn.common.annotation.Anonymous; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.io.OutputStream; +//import java.nio.ByteBuffer; +//import java.util.ArrayList; +//import java.util.List; +// +///** +// * @author Jason +// * @date 2025年03月26日 22:42:13 +// */ +//@Component +// +//public class FFmpegExecutor { +// +// private Process ffmpegProcess; +// private OutputStream ffmpegInput; +// public void start(String format, String outputUrl, byte[] sps, byte[] pps) throws IOException { +// List command = new ArrayList<>(); +// command.add("ffmpeg"); +// command.add("-y"); +// command.add("-f"); command.add("h264"); +// command.add("-i"); command.add("pipe:0"); +// command.add("-c:v"); command.add("copy"); // 直接拷贝视频流 +// command.add("-f"); command.add(format); +// command.add("-flvflags"); command.add("no_duration_filesize"); +// command.add("-movflags"); command.add("faststart"); +// command.add("-preset"); command.add("ultrafast"); +// command.add("-tune"); command.add("zerolatency"); +// command.add("-g"); command.add("50"); // GOP长度 +// command.add("-keyint_min"); command.add("25"); // 最小关键帧间隔 +// command.add("-x264-params"); command.add("scenecut=0:open_gop=0:min-keyint=25:keyint=50"); +// command.add(outputUrl); +// +// ProcessBuilder pb = new ProcessBuilder(command); +// pb.redirectErrorStream(true); +// ffmpegProcess = pb.start(); +// ffmpegInput = ffmpegProcess.getOutputStream(); +// +// // 写入extradata +// writeExtradata(sps, pps); +// } +// +// public void writeFrame(byte[] frameData) throws IOException { +// ffmpegInput.write(frameData); +// ffmpegInput.flush(); +// } +// +// public void stop() { +// try { +// if (ffmpegInput != null) { +// ffmpegInput.close(); +// } +// if (ffmpegProcess != null) { +// ffmpegProcess.destroyForcibly(); +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +//} \ No newline at end of file diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/LogUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/LogUtils.java new file mode 100644 index 0000000..8d00def --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/LogUtils.java @@ -0,0 +1,18 @@ +package com.tcctyn.common.core.utils; + +/** + * 处理并记录日志文件 + * + * @author tcctyn + */ +public class LogUtils +{ + public static String getBlock(Object msg) + { + if (msg == null) + { + msg = ""; + } + return "[" + msg.toString() + "]"; + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/MessageUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/MessageUtils.java new file mode 100644 index 0000000..80d5e67 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/MessageUtils.java @@ -0,0 +1,25 @@ +package com.tcctyn.common.core.utils; + +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; + +/** + * 获取i18n资源文件 + * + * @author tcctyn + */ +public class MessageUtils +{ + /** + * 根据消息键和参数 获取消息 委托给spring messageSource + * + * @param code 消息键 + * @param args 参数 + * @return 获取国际化翻译值 + */ + public static String message(String code, Object... args) + { + MessageSource messageSource = SpringUtils.getBean(MessageSource.class); + return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/PageUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/PageUtils.java index 88ee803..8234bbe 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/PageUtils.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/PageUtils.java @@ -1,9 +1,9 @@ package com.tcctyn.common.core.utils; import com.github.pagehelper.PageHelper; -import com.tcctyn.common.core.utils.sql.SqlUtil; import com.tcctyn.common.core.web.page.PageDomain; import com.tcctyn.common.core.web.page.TableSupport; +import com.tcctyn.common.core.utils.sql.SqlUtil; /** * 分页工具类 diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ParseSystemUtil.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ParseSystemUtil.java new file mode 100644 index 0000000..5d8e330 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ParseSystemUtil.java @@ -0,0 +1,40 @@ +package com.tcctyn.common.core.utils; + +/** + * 进制转换工具类 + * + */ +public class ParseSystemUtil { + + /**将二进制转换成16进制 + * @param buf + * @return + */ + public static String parseByte2HexStr(byte buf[]) { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < buf.length; i++) { + String hex = Integer.toHexString(buf[i] & 0xFF); + if (hex.length() == 1) { + hex = '0' + hex; + } + sb.append(hex.toUpperCase()); + } + return sb.toString(); + } + + /**将16进制转换为二进制 + * @param hexStr + * @return + */ + public static byte[] parseHexStr2Byte(String hexStr) { + if (hexStr.length() < 1) + return null; + byte[] result = new byte[hexStr.length()/2]; + for (int i = 0;i< hexStr.length()/2; i++) { + int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16); + int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16); + result[i] = (byte) (high * 16 + low); + } + return result; + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/SecurityUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/SecurityUtils.java new file mode 100644 index 0000000..90104b4 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/SecurityUtils.java @@ -0,0 +1,179 @@ +package com.tcctyn.common.core.utils; + +import com.tcctyn.common.core.constant.Constants; +import com.tcctyn.common.core.constant.HttpStatus; +import com.tcctyn.common.core.web.domain.entity.SysRole; +import com.tcctyn.common.core.web.domain.model.LoginUser; +import com.tcctyn.common.core.exception.ServiceException; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.util.PatternMatchUtils; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 安全服务工具类 + * + * @author tcctyn + */ +public class SecurityUtils +{ + + /** + * 用户ID + **/ + public static Long getUserId() + { + try + { + return getLoginUser().getUserId(); + } + catch (Exception e) + { + throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取部门ID + **/ + public static Long getDeptId() + { + try + { + return getLoginUser().getDeptId(); + } + catch (Exception e) + { + throw new ServiceException("获取部门ID异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取用户账户 + **/ + public static String getUsername() + { + try + { + return getLoginUser().getUsername(); + } + catch (Exception e) + { + throw new ServiceException("获取用户账户异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取用户 + **/ + public static LoginUser getLoginUser() + { + try + { + return (LoginUser) getAuthentication().getPrincipal(); + } + catch (Exception e) + { + throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取Authentication + */ + public static Authentication getAuthentication() + { + return SecurityContextHolder.getContext().getAuthentication(); + } + + /** + * 生成BCryptPasswordEncoder密码 + * + * @param password 密码 + * @return 加密字符串 + */ + public static String encryptPassword(String password) + { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + return passwordEncoder.encode(password); + } + + /** + * 判断密码是否相同 + * + * @param rawPassword 真实密码 + * @param encodedPassword 加密后字符 + * @return 结果 + */ + public static boolean matchesPassword(String rawPassword, String encodedPassword) + { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + return passwordEncoder.matches(rawPassword, encodedPassword); + } + + /** + * 是否为管理员 + * + * @param userId 用户ID + * @return 结果 + */ + public static boolean isAdmin(Long userId) + { + return userId != null && 1L == userId; + } + + /** + * 验证用户是否具备某权限 + * + * @param permission 权限字符串 + * @return 用户是否具备某权限 + */ + public static boolean hasPermi(String permission) + { + return hasPermi(getLoginUser().getPermissions(), permission); + } + + /** + * 判断是否包含权限 + * + * @param authorities 权限列表 + * @param permission 权限字符串 + * @return 用户是否具备某权限 + */ + public static boolean hasPermi(Collection authorities, String permission) + { + return authorities.stream().filter(StringUtils::hasText) + .anyMatch(x -> Constants.ALL_PERMISSION.equals(x) || PatternMatchUtils.simpleMatch(x, permission)); + } + + /** + * 验证用户是否拥有某个角色 + * + * @param role 角色标识 + * @return 用户是否具备某角色 + */ + public static boolean hasRole(String role) + { + List roleList = getLoginUser().getUser().getRoles(); + Collection roles = roleList.stream().map(SysRole::getRoleKey).collect(Collectors.toSet()); + return hasRole(roles, role); + } + + /** + * 判断是否包含角色 + * + * @param roles 角色列表 + * @param role 角色 + * @return 用户是否具备某角色权限 + */ + public static boolean hasRole(Collection roles, String role) + { + return roles.stream().filter(StringUtils::hasText) + .anyMatch(x -> Constants.SUPER_ADMIN.equals(x) || PatternMatchUtils.simpleMatch(x, role)); + } + +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/SemaphoreUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/SemaphoreUtils.java new file mode 100644 index 0000000..4b7e4ef --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/SemaphoreUtils.java @@ -0,0 +1,59 @@ +package com.tcctyn.common.core.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.Semaphore; + +/** + * 信号量相关处理 + * + * @author ruoyi + */ +public class SemaphoreUtils +{ + /** + * SemaphoreUtils 日志控制器 + */ + private static final Logger LOGGER = LoggerFactory.getLogger(SemaphoreUtils.class); + + /** + * 获取信号量 + * + * @param semaphore + * @return + */ + public static boolean tryAcquire(Semaphore semaphore) + { + boolean flag = false; + + try + { + flag = semaphore.tryAcquire(); + } + catch (Exception e) + { + LOGGER.error("获取信号量异常", e); + } + + return flag; + } + + /** + * 释放信号量 + * + * @param semaphore + */ + public static void release(Semaphore semaphore) + { + + try + { + semaphore.release(); + } + catch (Exception e) + { + LOGGER.error("释放信号量异常", e); + } + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ServletUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ServletUtils.java index e782b9d..f19ad70 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ServletUtils.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ServletUtils.java @@ -1,17 +1,9 @@ package com.tcctyn.common.core.utils; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; -import javax.servlet.ServletRequest; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; +import com.alibaba.fastjson2.JSON; +import com.tcctyn.common.core.constant.Constants; +import com.tcctyn.common.core.web.domain.R; +import com.tcctyn.common.core.text.Convert; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -21,15 +13,24 @@ import org.springframework.util.LinkedCaseInsensitiveMap; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; -import com.alibaba.fastjson2.JSON; -import com.tcctyn.common.core.constant.Constants; -import com.tcctyn.common.core.domain.R; -import com.tcctyn.common.core.text.Convert; import reactor.core.publisher.Mono; +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + /** * 客户端工具类 - * + * * @author tcctyn */ public class ServletUtils @@ -189,7 +190,7 @@ public class ServletUtils /** * 将字符串渲染到客户端 - * + * * @param response 渲染对象 * @param string 待渲染的字符串 */ @@ -210,7 +211,7 @@ public class ServletUtils /** * 是否是Ajax异步请求 - * + * * @param request */ public static boolean isAjaxRequest(HttpServletRequest request) @@ -239,7 +240,7 @@ public class ServletUtils /** * 内容编码 - * + * * @param str 内容 * @return 编码后的内容 */ @@ -257,7 +258,7 @@ public class ServletUtils /** * 内容解码 - * + * * @param str 内容 * @return 解码后的内容 */ diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/StringUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/StringUtils.java index 13719a4..cbd3a7c 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/StringUtils.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/StringUtils.java @@ -1,15 +1,16 @@ package com.tcctyn.common.core.utils; +import com.tcctyn.common.core.constant.Constants; +import com.tcctyn.common.core.text.StrFormatter; +import org.springframework.util.AntPathMatcher; + import java.util.Collection; import java.util.List; import java.util.Map; -import org.springframework.util.AntPathMatcher; -import com.tcctyn.common.core.constant.Constants; -import com.tcctyn.common.core.text.StrFormatter; /** * 字符串工具类 - * + * * @author tcctyn */ public class StringUtils extends org.apache.commons.lang3.StringUtils @@ -25,7 +26,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 获取参数不为空值 - * + * * @param value defaultValue 要判断的value * @return value 返回值 */ @@ -36,7 +37,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * * 判断一个Collection是否为空, 包含List,Set,Queue - * + * * @param coll 要判断的Collection * @return true:为空 false:非空 */ @@ -47,7 +48,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * * 判断一个Collection是否非空,包含List,Set,Queue - * + * * @param coll 要判断的Collection * @return true:非空 false:空 */ @@ -58,7 +59,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * * 判断一个对象数组是否为空 - * + * * @param objects 要判断的对象数组 ** @return true:为空 false:非空 */ @@ -69,7 +70,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * * 判断一个对象数组是否非空 - * + * * @param objects 要判断的对象数组 * @return true:非空 false:空 */ @@ -80,7 +81,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * * 判断一个Map是否为空 - * + * * @param map 要判断的Map * @return true:为空 false:非空 */ @@ -91,7 +92,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * * 判断一个Map是否为空 - * + * * @param map 要判断的Map * @return true:非空 false:空 */ @@ -102,7 +103,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * * 判断一个字符串是否为空串 - * + * * @param str String * @return true:为空 false:非空 */ @@ -113,7 +114,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * * 判断一个字符串是否为非空串 - * + * * @param str String * @return true:非空串 false:空串 */ @@ -124,7 +125,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * * 判断一个对象是否为空 - * + * * @param object Object * @return true:为空 false:非空 */ @@ -135,7 +136,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * * 判断一个对象是否非空 - * + * * @param object Object * @return true:非空 false:空 */ @@ -146,7 +147,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * * 判断一个对象是否是数组类型(Java基本型别的数组) - * + * * @param object 对象 * @return true:是数组 false:不是数组 */ @@ -208,7 +209,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 截取字符串 - * + * * @param str 字符串 * @param start 开始 * @return 结果 @@ -239,7 +240,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 截取字符串 - * + * * @param str 字符串 * @param start 开始 * @param end 结束 @@ -285,7 +286,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 在字符串中查找第一个出现的 `open` 和最后一个出现的 `close` 之间的子字符串 - * + * * @param str 要截取的字符串 * @param open 起始字符串 * @param close 结束字符串 @@ -311,7 +312,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 判断是否为空,并且不是空白字符 - * + * * @param str 要判断的value * @return 结果 */ @@ -341,7 +342,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
* 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
- * + * * @param template 文本模板,被替换的部分用 {} 表示 * @param params 参数值 * @return 格式化后的文本 @@ -357,7 +358,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 是否为http(s)://开头 - * + * * @param link 链接 * @return 结果 */ @@ -443,7 +444,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 是否包含字符串 - * + * * @param str 验证字符串 * @param strs 字符串组 * @return 包含返回true @@ -465,7 +466,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld - * + * * @param name 转换前的下划线大写方式命名的字符串 * @return 转换后的驼峰式命名的字符串 */ @@ -539,7 +540,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 - * + * * @param str 指定字符串 * @param strs 需要检查的字符串数组 * @return 是否匹配 @@ -561,11 +562,11 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils } /** - * 判断url是否与规则配置: - * ? 表示单个字符; - * * 表示一层路径内的任意字符串,不可跨层级; + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; * ** 表示任意层路径; - * + * * @param pattern 匹配规则 * @param url 需要匹配的url * @return @@ -584,7 +585,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 - * + * * @param num 数字对象 * @param size 字符串指定长度 * @return 返回数字的字符串格式,该字符串为指定长度。 @@ -596,7 +597,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 - * + * * @param s 原始字符串 * @param size 字符串指定长度 * @param c 用于补齐的字符 diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/Threads.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/Threads.java new file mode 100644 index 0000000..75f2b92 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/Threads.java @@ -0,0 +1,96 @@ +package com.tcctyn.common.core.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.*; + +/** + * 线程相关工具类. + * + * @author tcctyn + */ +public class Threads +{ + private static final Logger logger = LoggerFactory.getLogger(Threads.class); + + /** + * sleep等待,单位为毫秒 + */ + public static void sleep(long milliseconds) + { + try + { + Thread.sleep(milliseconds); + } + catch (InterruptedException e) + { + return; + } + } + + /** + * 停止线程池 + * 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务. + * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数. + * 如果仍然超時,則強制退出. + * 另对在shutdown时线程本身被调用中断做了处理. + */ + public static void shutdownAndAwaitTermination(ExecutorService pool) + { + if (pool != null && !pool.isShutdown()) + { + pool.shutdown(); + try + { + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + pool.shutdownNow(); + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + logger.info("Pool did not terminate"); + } + } + } + catch (InterruptedException ie) + { + pool.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + } + + /** + * 打印线程异常信息 + */ + public static void printException(Runnable r, Throwable t) + { + if (t == null && r instanceof Future) + { + try + { + Future future = (Future) r; + if (future.isDone()) + { + future.get(); + } + } + catch (CancellationException ce) + { + t = ce; + } + catch (ExecutionException ee) + { + t = ee.getCause(); + } + catch (InterruptedException ie) + { + Thread.currentThread().interrupt(); + } + } + if (t != null) + { + logger.error(t.getMessage(), t); + } + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/bean/BeanUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/bean/BeanUtils.java index 5e1b97b..68c3116 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/bean/BeanUtils.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/bean/BeanUtils.java @@ -1,53 +1,55 @@ package com.tcctyn.common.core.utils.bean; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import static cn.hutool.core.bean.BeanUtil.toBean; /** * Bean 工具类 - * + * * @author tcctyn */ -public class BeanUtils extends org.springframework.beans.BeanUtils -{ - /** Bean方法名中属性名开始的下标 */ +public class BeanUtils extends org.springframework.beans.BeanUtils { + /** + * Bean方法名中属性名开始的下标 + */ private static final int BEAN_METHOD_PROP_INDEX = 3; - /** * 匹配getter方法的正则表达式 */ + /** + * 匹配getter方法的正则表达式 + */ private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)"); - /** * 匹配setter方法的正则表达式 */ + /** + * 匹配setter方法的正则表达式 + */ private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)"); /** * Bean属性复制工具方法。 - * + * + * @param src 源对象 * @param dest 目标对象 - * @param src 源对象 */ - public static void copyBeanProp(Object dest, Object src) - { - try - { + public static void copyBeanProp(Object src, Object dest) { + try { copyProperties(src, dest); - } - catch (Exception e) - { + } catch (Exception e) { e.printStackTrace(); } } /** * 获取对象的setter方法。 - * + * * @param obj 对象 * @return 对象的setter方法列表 */ - public static List getSetterMethods(Object obj) - { + public static List getSetterMethods(Object obj) { // setter方法列表 List setterMethods = new ArrayList(); @@ -56,11 +58,9 @@ public class BeanUtils extends org.springframework.beans.BeanUtils // 查找setter方法 - for (Method method : methods) - { + for (Method method : methods) { Matcher m = SET_PATTERN.matcher(method.getName()); - if (m.matches() && (method.getParameterTypes().length == 1)) - { + if (m.matches() && (method.getParameterTypes().length == 1)) { setterMethods.add(method); } } @@ -70,23 +70,20 @@ public class BeanUtils extends org.springframework.beans.BeanUtils /** * 获取对象的getter方法。 - * + * * @param obj 对象 * @return 对象的getter方法列表 */ - public static List getGetterMethods(Object obj) - { + public static List getGetterMethods(Object obj) { // getter方法列表 List getterMethods = new ArrayList(); // 获取所有方法 Method[] methods = obj.getClass().getMethods(); // 查找getter方法 - for (Method method : methods) - { + for (Method method : methods) { Matcher m = GET_PATTERN.matcher(method.getName()); - if (m.matches() && (method.getParameterTypes().length == 0)) - { + if (m.matches() && (method.getParameterTypes().length == 0)) { getterMethods.add(method); } } @@ -97,14 +94,29 @@ public class BeanUtils extends org.springframework.beans.BeanUtils /** * 检查Bean方法名中的属性名是否相等。
* 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。 - * + * * @param m1 方法名1 * @param m2 方法名2 * @return 属性名一样返回true,否则返回false */ - public static boolean isMethodPropEquals(String m1, String m2) - { + public static boolean isMethodPropEquals(String m1, String m2) { return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX)); } + + /** + * List 对象复制工具方法。 + * + * @param sourceList + * @param destinationClass + * @return + */ + public static List copyList(Collection sourceList, Class destinationClass) { + if (sourceList == null || sourceList.isEmpty() || destinationClass == null) { + return Collections.emptyList(); + } + return sourceList.parallelStream() + .filter(Objects::nonNull) + .map(source -> toBean(source, destinationClass)).collect(Collectors.toList()); + } } diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/bean/BeanValidators.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/bean/BeanValidators.java index 9d67f77..f5bf375 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/bean/BeanValidators.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/bean/BeanValidators.java @@ -1,9 +1,9 @@ package com.tcctyn.common.core.utils.bean; -import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import javax.validation.Validator; +import java.util.Set; /** * bean对象属性验证 diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/FileTypeUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/FileTypeUtils.java index 24291b4..e77a6c3 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/FileTypeUtils.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/FileTypeUtils.java @@ -1,11 +1,12 @@ package com.tcctyn.common.core.utils.file; -import java.io.File; -import java.util.Objects; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.web.multipart.MultipartFile; +import java.io.File; +import java.util.Objects; + /** * 文件类型工具类 * @@ -17,7 +18,7 @@ public class FileTypeUtils * 获取文件类型 *

* 例如: tcctyn.txt, 返回: txt - * + * * @param file 文件名 * @return 后缀(不含".") */ @@ -50,7 +51,7 @@ public class FileTypeUtils /** * 获取文件名的后缀 - * + * * @param file 表单文件 * @return 后缀名 */ @@ -66,7 +67,7 @@ public class FileTypeUtils /** * 获取文件类型 - * + * * @param photoByte 文件字节码 * @return 后缀(不含".") */ diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/FileUploadUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/FileUploadUtils.java new file mode 100644 index 0000000..cc98007 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/FileUploadUtils.java @@ -0,0 +1,233 @@ +package com.tcctyn.common.core.utils.file; + +import com.tcctyn.common.core.config.TcctynConfig; +import com.tcctyn.common.core.constant.Constants; +import com.tcctyn.common.core.exception.file.FileNameLengthLimitExceededException; +import com.tcctyn.common.core.exception.file.FileSizeLimitExceededException; +import com.tcctyn.common.core.exception.file.InvalidExtensionException; +import com.tcctyn.common.core.utils.DateUtils; +import com.tcctyn.common.core.utils.StringUtils; +import com.tcctyn.common.core.utils.uuid.Seq; +import org.apache.commons.io.FilenameUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.Objects; + +/** + * 文件上传工具类 + * + * @author tcctyn + */ +public class FileUploadUtils +{ + /** + * 默认大小 50M + */ + public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024L; + + /** + * 默认的文件名最大长度 100 + */ + public static final int DEFAULT_FILE_NAME_LENGTH = 100; + + /** + * 默认上传的地址 + */ + private static String defaultBaseDir = TcctynConfig.getProfile(); + + public static void setDefaultBaseDir(String defaultBaseDir) + { + FileUploadUtils.defaultBaseDir = defaultBaseDir; + } + + public static String getDefaultBaseDir() + { + return defaultBaseDir; + } + + /** + * 以默认配置进行文件上传 + * + * @param file 上传的文件 + * @return 文件名称 + * @throws Exception + */ + public static final String upload(MultipartFile file) throws IOException + { + try + { + return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } + catch (Exception e) + { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 根据文件路径上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @return 文件名称 + * @throws IOException + */ + public static final String upload(String baseDir, MultipartFile file) throws IOException + { + try + { + return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } + catch (Exception e) + { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 文件上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @param allowedExtension 上传文件类型 + * @return 返回上传成功的文件名 + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws FileNameLengthLimitExceededException 文件名太长 + * @throws IOException 比如读写文件出错时 + * @throws InvalidExtensionException 文件校验异常 + */ + public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, + InvalidExtensionException + { + int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length(); + if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) + { + throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); + } + + assertAllowed(file, allowedExtension); + + String fileName = extractFilename(file); + + String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath(); + file.transferTo(Paths.get(absPath)); + return getPathFileName(baseDir, fileName); + } + + /** + * 编码文件名 + */ + public static final String extractFilename(MultipartFile file) + { + return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), + FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file)); + } + + public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException + { + File desc = new File(uploadDir + File.separator + fileName); + + if (!desc.exists()) + { + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + } + return desc; + } + + public static final String getPathFileName(String uploadDir, String fileName) throws IOException + { + int dirLastIndex = TcctynConfig.getProfile().length() + 1; + String currentDir = StringUtils.substring(uploadDir, dirLastIndex); + return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; + } + + /** + * 文件大小校验 + * + * @param file 上传的文件 + * @return + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws InvalidExtensionException + */ + public static final void assertAllowed(MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, InvalidExtensionException + { + long size = file.getSize(); + if (size > DEFAULT_MAX_SIZE) + { + throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); + } + + String fileName = file.getOriginalFilename(); + String extension = getExtension(file); + if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) + { + if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) + { + throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) + { + throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) + { + throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) + { + throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension, + fileName); + } + else + { + throw new InvalidExtensionException(allowedExtension, extension, fileName); + } + } + } + + /** + * 判断MIME类型是否是允许的MIME类型 + * + * @param extension + * @param allowedExtension + * @return + */ + public static final boolean isAllowedExtension(String extension, String[] allowedExtension) + { + for (String str : allowedExtension) + { + if (str.equalsIgnoreCase(extension)) + { + return true; + } + } + return false; + } + + /** + * 获取文件名的后缀 + * + * @param file 表单文件 + * @return 后缀名 + */ + public static final String getExtension(MultipartFile file) + { + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + if (StringUtils.isEmpty(extension)) + { + extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType())); + } + return extension; + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/FileUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/FileUtils.java index 6680230..f73ce16 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/FileUtils.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/FileUtils.java @@ -1,17 +1,18 @@ package com.tcctyn.common.core.utils.file; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; +import com.tcctyn.common.core.config.TcctynConfig; +import com.tcctyn.common.core.utils.DateUtils; +import com.tcctyn.common.core.utils.StringUtils; +import com.tcctyn.common.core.utils.uuid.IdUtils; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.ArrayUtils; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.ArrayUtils; -import com.tcctyn.common.core.utils.StringUtils; +import java.io.*; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; /** * 文件处理工具类 @@ -20,12 +21,6 @@ import com.tcctyn.common.core.utils.StringUtils; */ public class FileUtils { - /** 字符常量:斜杠 {@code '/'} */ - public static final char SLASH = '/'; - - /** 字符常量:反斜杠 {@code '\\'} */ - public static final char BACKSLASH = '\\'; - public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; /** @@ -59,31 +54,50 @@ public class FileUtils } finally { - if (os != null) - { - try - { - os.close(); - } - catch (IOException e1) - { - e1.printStackTrace(); - } - } - if (fis != null) - { - try - { - fis.close(); - } - catch (IOException e1) - { - e1.printStackTrace(); - } - } + IOUtils.close(os); + IOUtils.close(fis); } } + /** + * 写数据到文件中 + * + * @param data 数据 + * @return 目标文件 + * @throws IOException IO异常 + */ + public static String writeImportBytes(byte[] data) throws IOException + { + return writeBytes(data, TcctynConfig.getImportPath()); + } + + /** + * 写数据到文件中 + * + * @param data 数据 + * @param uploadDir 目标文件 + * @return 目标文件 + * @throws IOException IO异常 + */ + public static String writeBytes(byte[] data, String uploadDir) throws IOException + { + FileOutputStream fos = null; + String pathName = ""; + try + { + String extension = getFileExtendName(data); + pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension; + File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName); + fos = new FileOutputStream(file); + fos.write(data); + } + finally + { + IOUtils.close(fos); + } + return FileUploadUtils.getPathFileName(uploadDir, pathName); + } + /** * 删除文件 * @@ -126,8 +140,15 @@ public class FileUtils { return false; } - // 判断是否在允许下载的文件规则内 - return ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource)); + + // 检查允许下载的文件规则 + if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource))) + { + return true; + } + + // 不在允许下载的文件规则 + return false; } /** @@ -165,63 +186,11 @@ public class FileUtils return filename; } - /** - * 返回文件名 - * - * @param filePath 文件 - * @return 文件名 - */ - public static String getName(String filePath) - { - if (null == filePath) - { - return null; - } - int len = filePath.length(); - if (0 == len) - { - return filePath; - } - if (isFileSeparator(filePath.charAt(len - 1))) - { - // 以分隔符结尾的去掉结尾分隔符 - len--; - } - - int begin = 0; - char c; - for (int i = len - 1; i > -1; i--) - { - c = filePath.charAt(i); - if (isFileSeparator(c)) - { - // 查找最后一个路径分隔符(/或者\) - begin = i + 1; - break; - } - } - - return filePath.substring(begin, len); - } - - /** - * 是否为Windows或者Linux(Unix)文件分隔符
- * Windows平台下分隔符为\,Linux(Unix)为/ - * - * @param c 字符 - * @return 是否为Windows或者Linux(Unix)文件分隔符 - */ - public static boolean isFileSeparator(char c) - { - return SLASH == c || BACKSLASH == c; - } - /** * 下载文件名重新编码 * * @param response 响应对象 * @param realFileName 真实文件名 - * @return */ public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException { @@ -235,6 +204,7 @@ public class FileUtils .append("utf-8''") .append(percentEncodedFileName); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename"); response.setHeader("Content-disposition", contentDispositionValue.toString()); response.setHeader("download-filename", percentEncodedFileName); } @@ -250,4 +220,67 @@ public class FileUtils String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString()); return encode.replaceAll("\\+", "%20"); } + + /** + * 获取图像后缀 + * + * @param photoByte 图像数据 + * @return 后缀名 + */ + public static String getFileExtendName(byte[] photoByte) + { + String strFileExtendName = "jpg"; + if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) + { + strFileExtendName = "gif"; + } + else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) + { + strFileExtendName = "jpg"; + } + else if ((photoByte[0] == 66) && (photoByte[1] == 77)) + { + strFileExtendName = "bmp"; + } + else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) + { + strFileExtendName = "png"; + } + return strFileExtendName; + } + + /** + * 获取文件名称 /profile/upload/2022/04/16/tcctyn.png -- tcctyn.png + * + * @param fileName 路径名称 + * @return 没有文件路径的名称 + */ + public static String getName(String fileName) + { + if (fileName == null) + { + return null; + } + int lastUnixPos = fileName.lastIndexOf('/'); + int lastWindowsPos = fileName.lastIndexOf('\\'); + int index = Math.max(lastUnixPos, lastWindowsPos); + return fileName.substring(index + 1); + } + + /** + * 获取不带后缀文件名称 /profile/upload/2022/04/16/tcctyn.png -- tcctyn + * + * @param fileName 路径名称 + * @return 没有文件路径和后缀的名称 + */ + public static String getNameNotSuffix(String fileName) + { + if (fileName == null) + { + return null; + } + String baseName = FilenameUtils.getBaseName(fileName); + return baseName; + } } diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/ImageUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/ImageUtils.java index 3a76190..dd573e3 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/ImageUtils.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/ImageUtils.java @@ -1,13 +1,18 @@ package com.tcctyn.common.core.utils.file; +import com.tcctyn.common.core.config.TcctynConfig; +import com.tcctyn.common.core.constant.Constants; +import com.tcctyn.common.core.utils.StringUtils; +import org.apache.poi.util.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.ByteArrayInputStream; +import java.io.FileInputStream; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.Arrays; -import org.apache.poi.util.IOUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * 图片处理工具类 @@ -62,18 +67,28 @@ public class ImageUtils InputStream in = null; try { - // 网络地址 - URL urlObj = new URL(url); - URLConnection urlConnection = urlObj.openConnection(); - urlConnection.setConnectTimeout(30 * 1000); - urlConnection.setReadTimeout(60 * 1000); - urlConnection.setDoInput(true); - in = urlConnection.getInputStream(); + if (url.startsWith("http")) + { + // 网络地址 + URL urlObj = new URL(url); + URLConnection urlConnection = urlObj.openConnection(); + urlConnection.setConnectTimeout(30 * 1000); + urlConnection.setReadTimeout(60 * 1000); + urlConnection.setDoInput(true); + in = urlConnection.getInputStream(); + } + else + { + // 本机地址 + String localPath = TcctynConfig.getProfile(); + String downloadPath = localPath + StringUtils.substringAfter(url, Constants.RESOURCE_PREFIX); + in = new FileInputStream(downloadPath); + } return IOUtils.toByteArray(in); } catch (Exception e) { - log.error("访问文件异常 {}", e); + log.error("获取文件路径异常 {}", e); return null; } finally diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/MimeTypeUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/MimeTypeUtils.java index 1d8ee8b..2fbc30c 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/MimeTypeUtils.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/file/MimeTypeUtils.java @@ -16,7 +16,7 @@ public class MimeTypeUtils public static final String IMAGE_BMP = "image/bmp"; public static final String IMAGE_GIF = "image/gif"; - + public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" }; public static final String[] FLASH_EXTENSION = { "swf", "flv" }; diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/html/HTMLFilter.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/html/HTMLFilter.java index 8bc8cd9..b732b85 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/html/HTMLFilter.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/html/HTMLFilter.java @@ -1,10 +1,6 @@ package com.tcctyn.common.core.utils.html; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.regex.Matcher; diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/http/HttpHelper.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/http/HttpHelper.java new file mode 100644 index 0000000..52645a3 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/http/HttpHelper.java @@ -0,0 +1,56 @@ +package com.tcctyn.common.core.utils.http; + +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ServletRequest; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; + +/** + * 通用http工具封装 + * + * @author tcctyn + */ +public class HttpHelper +{ + private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class); + + public static String getBodyString(ServletRequest request) + { + StringBuilder sb = new StringBuilder(); + BufferedReader reader = null; + try (InputStream inputStream = request.getInputStream()) + { + reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + String line = ""; + while ((line = reader.readLine()) != null) + { + sb.append(line); + } + } + catch (IOException e) + { + LOGGER.warn("getBodyString出现问题!"); + } + finally + { + if (reader != null) + { + try + { + reader.close(); + } + catch (IOException e) + { + LOGGER.error(ExceptionUtils.getMessage(e)); + } + } + } + return sb.toString(); + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/http/HttpUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/http/HttpUtils.java new file mode 100644 index 0000000..be8a3e1 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/http/HttpUtils.java @@ -0,0 +1,266 @@ +package com.tcctyn.common.core.utils.http; + +import com.tcctyn.common.core.constant.Constants; +import com.tcctyn.common.core.utils.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.net.ssl.*; +import java.io.*; +import java.net.ConnectException; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; +import java.security.cert.X509Certificate; + +/** + * 通用http发送方法 + * + * @author tcctyn + */ +public class HttpUtils +{ + private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url) + { + return sendGet(url, StringUtils.EMPTY); + } + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url, String param) + { + return sendGet(url, param, Constants.UTF8); + } + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @param contentType 编码类型 + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url, String param, String contentType) + { + StringBuilder result = new StringBuilder(); + BufferedReader in = null; + try + { + String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url; + log.info("sendGet - {}", urlNameString); + URL realUrl = new URL(urlNameString); + URLConnection connection = realUrl.openConnection(); + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); + connection.connect(); + in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType)); + String line; + while ((line = in.readLine()) != null) + { + result.append(line); + } + log.info("recv - {}", result); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e); + } + finally + { + try + { + if (in != null) + { + in.close(); + } + } + catch (Exception ex) + { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + /** + * 向指定 URL 发送POST方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendPost(String url, String param) + { + PrintWriter out = null; + BufferedReader in = null; + StringBuilder result = new StringBuilder(); + try + { + log.info("sendPost - {}", url); + URL realUrl = new URL(url); + URLConnection conn = realUrl.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + out = new PrintWriter(conn.getOutputStream()); + out.print(param); + out.flush(); + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); + String line; + while ((line = in.readLine()) != null) + { + result.append(line); + } + log.info("recv - {}", result); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e); + } + finally + { + try + { + if (out != null) + { + out.close(); + } + if (in != null) + { + in.close(); + } + } + catch (IOException ex) + { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + public static String sendSSLPost(String url, String param) + { + StringBuilder result = new StringBuilder(); + String urlNameString = url + "?" + param; + try + { + log.info("sendSSLPost - {}", urlNameString); + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom()); + URL console = new URL(urlNameString); + HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + + conn.setSSLSocketFactory(sc.getSocketFactory()); + conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); + conn.connect(); + InputStream is = conn.getInputStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + String ret = ""; + while ((ret = br.readLine()) != null) + { + if (ret != null && !"".equals(ret.trim())) + { + result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); + } + } + log.info("recv - {}", result); + conn.disconnect(); + br.close(); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e); + } + return result.toString(); + } + + private static class TrustAnyTrustManager implements X509TrustManager + { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) + { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) + { + } + + @Override + public X509Certificate[] getAcceptedIssuers() + { + return new X509Certificate[] {}; + } + } + + private static class TrustAnyHostnameVerifier implements HostnameVerifier + { + @Override + public boolean verify(String hostname, SSLSession session) + { + return true; + } + } +} \ No newline at end of file diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ip/AddressUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ip/AddressUtils.java new file mode 100644 index 0000000..5b08036 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ip/AddressUtils.java @@ -0,0 +1,56 @@ +package com.tcctyn.common.core.utils.ip; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.tcctyn.common.core.config.TcctynConfig; +import com.tcctyn.common.core.constant.Constants; +import com.tcctyn.common.core.utils.StringUtils; +import com.tcctyn.common.core.utils.http.HttpUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 获取地址类 + * + * @author tcctyn + */ +public class AddressUtils +{ + private static final Logger log = LoggerFactory.getLogger(AddressUtils.class); + + // IP地址查询 + public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp"; + + // 未知地址 + public static final String UNKNOWN = "XX XX"; + + public static String getRealAddressByIP(String ip) + { + // 内网不查询 + if (IpUtils.internalIp(ip)) + { + return "内网IP"; + } + if (TcctynConfig.isAddressEnabled()) + { + try + { + String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", Constants.GBK); + if (StringUtils.isEmpty(rspStr)) + { + log.error("获取地理位置异常 {}", ip); + return UNKNOWN; + } + JSONObject obj = JSON.parseObject(rspStr); + String region = obj.getString("pro"); + String city = obj.getString("city"); + return String.format("%s %s", region, city); + } + catch (Exception e) + { + log.error("获取地理位置异常 {}", ip); + } + } + return UNKNOWN; + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ip/IpUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ip/IpUtils.java index 74a31ca..4fcfdfc 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ip/IpUtils.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/ip/IpUtils.java @@ -1,11 +1,12 @@ package com.tcctyn.common.core.utils.ip; -import java.net.InetAddress; -import java.net.UnknownHostException; -import javax.servlet.http.HttpServletRequest; import com.tcctyn.common.core.utils.ServletUtils; import com.tcctyn.common.core.utils.StringUtils; +import javax.servlet.http.HttpServletRequest; +import java.net.InetAddress; +import java.net.UnknownHostException; + /** * 获取IP方法 * diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/mqtt/JavaDemoMQTTV3.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/mqtt/JavaDemoMQTTV3.java new file mode 100644 index 0000000..7d313eb --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/mqtt/JavaDemoMQTTV3.java @@ -0,0 +1,51 @@ +package com.tcctyn.common.core.utils.mqtt; + +public class JavaDemoMQTTV3 { + + public static void main(String[] args) { + String broker = "tcp://47.109.202.121:1883"; + String clientId = "hqyjDemo"; + String topic = "topic/hqyj"; + int subQos = 1; + int pubQos = 1; + String msg = "Hello MQTT"; + + + +// try { +// MqttClient client = new MqttClient(broker, clientId); +// MqttConnectOptions options = new MqttConnectOptions(); +// client.connect(options); +// +// if (client.isConnected()) { +// client.setCallback(new MqttCallback() { +// public void messageArrived(String topic, MqttMessage message) throws Exception { +// System.out.println("topic: " + topic); +// System.out.println("qos: " + message.getQos()); +// System.out.println("message content: " + new String(message.getPayload())); +// } +// +// public void connectionLost(Throwable cause) { +// System.out.println("connectionLost: " + cause.getMessage()); +// } +// +// public void deliveryComplete(IMqttDeliveryToken token) { +// System.out.println("deliveryComplete: " + token.isComplete()); +// } +// }); +// +// client.subscribe(topic, subQos); +// +// MqttMessage message = new MqttMessage(msg.getBytes()); +// message.setQos(pubQos); +// client.publish(topic, message); +// } +// +// client.disconnect(); +// client.close(); +// +// } catch (MqttException e) { +// e.printStackTrace(); +// } + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/mqtt/MqttConfig.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/mqtt/MqttConfig.java new file mode 100644 index 0000000..14c6b4e --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/mqtt/MqttConfig.java @@ -0,0 +1,63 @@ +package com.tcctyn.common.core.utils.mqtt; + +import com.tcctyn.common.core.utils.StringUtils; +import lombok.Data; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties("spring.mqtt") +@Data +public class MqttConfig { + + @Autowired + private MqttPushClient mqttPushClient; + + /** + * 用户名 + */ + private String username; + /** + * 密码 + */ + private String password; + /** + * 连接地址 + */ + private String hostUrl; + /** + * 客户Id + */ + private String clientId; + /** + * 默认连接话题 + */ + private String defaultTopic; + /** + * 超时时间 + */ + private int timeout; + /** + * 保持连接数 + */ + private int keepalive; + /** + * mqtt功能使能 + */ + private boolean enabled; + + @Bean + public MqttPushClient getMqttPushClient() { + if(enabled == true){ + String mqtt_topic[] = StringUtils.split(defaultTopic, ","); + mqttPushClient.connect(hostUrl, clientId, username, password, timeout, keepalive);//连接 + for(int i=0; i @@ -77,6 +55,11 @@ public class ExcelUtil public static final String[] FORMULA_STR = { "=", "-", "+", "@" }; + /** + * 用于dictType属性数据存储,避免重复查缓存 + */ + public Map sysDictMap = new HashMap(); + /** * Excel sheet最大行数,默认65536 */ @@ -167,11 +150,6 @@ public class ExcelUtil */ public Class clazz; - /** - * 需要显示列属性 - */ - public String[] includeFields; - /** * 需要排除列属性 */ @@ -182,20 +160,11 @@ public class ExcelUtil this.clazz = clazz; } - /** - * 仅在Excel中显示列属性 - * - * @param fields 列属性名 示例[单个"name"/多个"id","name"] - */ - public void showColumn(String... fields) - { - this.includeFields = fields; - } - /** * 隐藏Excel中列属性 * * @param fields 列属性名 示例[单个"name"/多个"id","name"] + * @throws Exception */ public void hideColumn(String... fields) { @@ -225,6 +194,8 @@ public class ExcelUtil { if (StringUtils.isNotEmpty(title)) { + subMergedFirstRowNum++; + subMergedLastRowNum++; int titleLastCol = this.fields.size() - 1; if (isSubList()) { @@ -235,7 +206,7 @@ public class ExcelUtil Cell titleCell = titleRow.createCell(0); titleCell.setCellStyle(styles.get("title")); titleCell.setCellValue(title); - sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), 0, titleLastCol)); + sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), titleLastCol)); } } @@ -246,31 +217,23 @@ public class ExcelUtil { if (isSubList()) { + subMergedFirstRowNum++; + subMergedLastRowNum++; Row subRow = sheet.createRow(rownum); - int column = 0; - int subFieldSize = subFields != null ? subFields.size() : 0; + int excelNum = 0; for (Object[] objects : fields) { - Field field = (Field) objects[0]; Excel attr = (Excel) objects[1]; - if (Collection.class.isAssignableFrom(field.getType())) - { - Cell cell = subRow.createCell(column); - cell.setCellValue(attr.name()); - cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); - if (subFieldSize > 1) - { - CellRangeAddress cellAddress = new CellRangeAddress(rownum, rownum, column, column + subFieldSize - 1); - sheet.addMergedRegion(cellAddress); - } - column += subFieldSize; - } - else - { - Cell cell = subRow.createCell(column++); - cell.setCellValue(attr.name()); - cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); - } + Cell headCell1 = subRow.createCell(excelNum); + headCell1.setCellValue(attr.name()); + headCell1.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + excelNum++; + } + int headFirstRow = excelNum - 1; + int headLastRow = headFirstRow + subFields.size() - 1; + if (headLastRow > headFirstRow) + { + sheet.addMergedRegion(new CellRangeAddress(rownum, rownum, headFirstRow, headLastRow)); } rownum++; } @@ -283,23 +246,11 @@ public class ExcelUtil * @return 转换后集合 */ public List importExcel(InputStream is) - { - return importExcel(is, 0); - } - - /** - * 对excel表单默认第一个索引名转换成list - * - * @param is 输入流 - * @param titleNum 标题占用行数 - * @return 转换后集合 - */ - public List importExcel(InputStream is, int titleNum) { List list = null; try { - list = importExcel(StringUtils.EMPTY, is, titleNum); + list = importExcel(is, 0); } catch (Exception e) { @@ -313,6 +264,18 @@ public class ExcelUtil return list; } + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @param titleNum 标题占用行数 + * @return 转换后集合 + */ + public List importExcel(InputStream is, int titleNum) throws Exception + { + return importExcel(StringUtils.EMPTY, is, titleNum); + } + /** * 对excel表单指定表格索引名转换成list * @@ -332,7 +295,16 @@ public class ExcelUtil { throw new IOException("文件sheet不存在"); } - + boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); + Map pictures; + if (isXSSFWorkbook) + { + pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb); + } + else + { + pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb); + } // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1 int rows = sheet.getLastRowNum(); if (rows > 0) @@ -390,7 +362,7 @@ public class ExcelUtil if (String.class == fieldType) { String s = Convert.toStr(val); - if (s.matches("^\\d+\\.0$")) + if (StringUtils.endsWith(s, ".0")) { val = StringUtils.substringBefore(s, ".0"); } @@ -453,10 +425,32 @@ public class ExcelUtil { val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); } + else if (StringUtils.isNotEmpty(attr.dictType())) + { + if (!sysDictMap.containsKey(attr.dictType() + val)) + { + String dictValue = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator()); + sysDictMap.put(attr.dictType() + val, dictValue); + } + val = sysDictMap.get(attr.dictType() + val); + } else if (!attr.handler().equals(ExcelHandlerAdapter.class)) { val = dataFormatHandlerAdapter(val, attr, null); } + else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) + { + PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey()); + if (image == null) + { + val = ""; + } + else + { + byte[] data = image.getData(); + val = FileUtils.writeImportBytes(data); + } + } ReflectUtils.invokeSetter(entity, propertyName, val); } } @@ -468,7 +462,33 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public AjaxResult exportExcel(List list, String sheetName) + { + return exportExcel(list, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public AjaxResult exportExcel(List list, String sheetName, String title) + { + this.init(list, sheetName, title, Type.EXPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * * @param response 返回数据 * @param list 导出数据集合 * @param sheetName 工作表的名称 @@ -481,7 +501,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param response 返回数据 * @param list 导出数据集合 * @param sheetName 工作表的名称 @@ -498,7 +518,31 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public AjaxResult importTemplateExcel(String sheetName) + { + return importTemplateExcel(sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public AjaxResult importTemplateExcel(String sheetName, String title) + { + this.init(null, sheetName, title, Type.IMPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * * @param sheetName 工作表的名称 * @return 结果 */ @@ -509,7 +553,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param sheetName 工作表的名称 * @param title 标题 * @return 结果 @@ -544,6 +588,34 @@ public class ExcelUtil } } + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public AjaxResult exportExcel() + { + OutputStream out = null; + try + { + writeSheet(); + String filename = encodingFilename(sheetName); + out = new FileOutputStream(getAbsoluteFile(filename)); + wb.write(out); + return AjaxResult.success(filename); + } + catch (Exception e) + { + log.error("导出Excel异常{}", e.getMessage()); + throw new UtilException("导出Excel失败,请联系网站管理员!"); + } + finally + { + IOUtils.closeQuietly(wb); + IOUtils.closeQuietly(out); + } + } + /** * 创建写入数据到Sheet */ @@ -595,91 +667,64 @@ public class ExcelUtil { int startNo = index * sheetSize; int endNo = Math.min(startNo + sheetSize, list.size()); - int currentRowNum = rownum + 1; // 从标题行后开始 - + int rowNo = (1 + rownum) - startNo; for (int i = startNo; i < endNo; i++) { - row = sheet.createRow(currentRowNum); + rowNo = isSubList() ? (i > 1 ? rowNo + 1 : rowNo + i) : i + 1 + rownum - startNo; + row = sheet.createRow(rowNo); + // 得到导出对象. T vo = (T) list.get(i); + Collection subList = null; + if (isSubList()) + { + if (isSubListValue(vo)) + { + subList = getListCellValue(vo); + subMergedLastRowNum = subMergedLastRowNum + subList.size(); + } + else + { + subMergedFirstRowNum++; + subMergedLastRowNum++; + } + } int column = 0; - int maxSubListSize = getCurrentMaxSubListSize(vo); for (Object[] os : fields) { Field field = (Field) os[0]; Excel excel = (Excel) os[1]; - if (Collection.class.isAssignableFrom(field.getType())) + if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) { - try + boolean subFirst = false; + for (Object obj : subList) { - Collection subList = (Collection) getTargetValue(vo, field, excel); - if (subList != null && !subList.isEmpty()) + if (subFirst) { - int subIndex = 0; - for (Object subVo : subList) - { - Row subRow = sheet.getRow(currentRowNum + subIndex); - if (subRow == null) - { - subRow = sheet.createRow(currentRowNum + subIndex); - } - - int subColumn = column; - for (Field subField : subFields) - { - Excel subExcel = subField.getAnnotation(Excel.class); - addCell(subExcel, subRow, (T) subVo, subField, subColumn++); - } - subIndex++; - } - column += subFields.size(); + rowNo++; + row = sheet.createRow(rowNo); } + List subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); + int subIndex = 0; + for (Field subField : subFields) + { + if (subField.isAnnotationPresent(Excel.class)) + { + subField.setAccessible(true); + Excel attr = subField.getAnnotation(Excel.class); + this.addCell(attr, row, (T) obj, subField, column + subIndex); + } + subIndex++; + } + subFirst = true; } - catch (Exception e) - { - log.error("填充集合数据失败", e); - } + this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size(); } else { - // 创建单元格并设置值 - addCell(excel, row, vo, field, column); - if (maxSubListSize > 1 && excel.needMerge()) - { - sheet.addMergedRegion(new CellRangeAddress(currentRowNum, currentRowNum + maxSubListSize - 1, column, column)); - } - column++; - } - } - currentRowNum += maxSubListSize; - } - } - - /** - * 获取子列表最大数 - */ - private int getCurrentMaxSubListSize(T vo) - { - int maxSubListSize = 1; - for (Object[] os : fields) - { - Field field = (Field) os[0]; - if (Collection.class.isAssignableFrom(field.getType())) - { - try - { - Collection subList = (Collection) getTargetValue(vo, field, (Excel) os[1]); - if (subList != null && !subList.isEmpty()) - { - maxSubListSize = Math.max(maxSubListSize, subList.size()); - } - } - catch (Exception e) - { - log.error("获取集合大小失败", e); + this.addCell(excel, row, vo, field, column++); } } } - return maxSubListSize; } /** @@ -814,7 +859,7 @@ public class ExcelUtil */ public void annotationDataStyles(Map styles, Field field, Excel excel) { - String key = StringUtils.format("data_{}_{}_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor(), excel.cellType(), excel.wrapText()); + String key = StringUtils.format("data_{}_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor(), excel.cellType()); if (!styles.containsKey(key)) { CellStyle style = wb.createCellStyle(); @@ -830,7 +875,6 @@ public class ExcelUtil style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setFillForegroundColor(excel.backgroundColor().getIndex()); - style.setWrapText(excel.wrapText()); Font dataFont = wb.createFont(); dataFont.setFontName("Arial"); dataFont.setFontHeightInPoints((short) 10); @@ -859,7 +903,7 @@ public class ExcelUtil if (isSubList()) { // 填充默认样式,防止合并单元格样式失效 - sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType(), attr.wrapText()))); + sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType()))); if (attr.needMerge()) { sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column)); @@ -954,17 +998,28 @@ public class ExcelUtil // 设置列宽 sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); } - if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0) + if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0 || attr.comboReadDict()) { - if (attr.combo().length > 15 || StringUtils.join(attr.combo()).length() > 255) + String[] comboArray = attr.combo(); + if (attr.comboReadDict()) + { + if (!sysDictMap.containsKey("combo_" + attr.dictType())) + { + String labels = DictUtils.getDictLabels(attr.dictType()); + sysDictMap.put("combo_" + attr.dictType(), labels); + } + String val = sysDictMap.get("combo_" + attr.dictType()); + comboArray = StringUtils.split(val, DictUtils.SEPARATOR); + } + if (comboArray.length > 15 || StringUtils.join(comboArray).length() > 255) { // 如果下拉数大于15或字符串长度大于255,则使用一个新sheet存储,避免生成的模板下拉值获取不到 - setXSSFValidationWithHidden(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); + setXSSFValidationWithHidden(sheet, comboArray, attr.prompt(), 1, 100, column, column); } else { // 提示信息或只能选择不能输入的列内容. - setPromptOrValidation(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); + setPromptOrValidation(sheet, comboArray, attr.prompt(), 1, 100, column, column); } } } @@ -986,27 +1041,34 @@ public class ExcelUtil cell = row.createCell(column); if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge()) { - if (subMergedLastRowNum >= subMergedFirstRowNum) - { - sheet.addMergedRegion(new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column)); - } + CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column); + sheet.addMergedRegion(cellAddress); } - cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType(), attr.wrapText()))); + cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType()))); // 用于读取对象中的属性 Object value = getTargetValue(vo, field, attr); String dateFormat = attr.dateFormat(); String readConverterExp = attr.readConverterExp(); String separator = attr.separator(); + String dictType = attr.dictType(); if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) { - cell.getCellStyle().setDataFormat(this.wb.getCreationHelper().createDataFormat().getFormat(dateFormat)); cell.setCellValue(parseDateToStr(dateFormat, value)); } else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) { cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); } + else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) + { + if (!sysDictMap.containsKey(dictType + value)) + { + String lable = convertDictByExp(Convert.toStr(value), dictType, separator); + sysDictMap.put(dictType + value, lable); + } + cell.setCellValue(sysDictMap.get(dictType + value)); + } else if (value instanceof BigDecimal && -1 != attr.scale()) { cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).doubleValue()); @@ -1193,9 +1255,35 @@ public class ExcelUtil return StringUtils.stripEnd(propertyString.toString(), separator); } + /** + * 解析字典值 + * + * @param dictValue 字典值 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String convertDictByExp(String dictValue, String dictType, String separator) + { + return DictUtils.getDictLabel(dictType, dictValue, separator); + } + + /** + * 反向解析值字典值 + * + * @param dictLabel 字典标签 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典值 + */ + public static String reverseDictByExp(String dictLabel, String dictType, String separator) + { + return DictUtils.getDictValue(dictType, dictLabel, separator); + } + /** * 数据处理器 - * + * * @param value 数据值 * @param excel 数据注解 * @return @@ -1261,9 +1349,34 @@ public class ExcelUtil } } + /** + * 编码文件名 + */ + public String encodingFilename(String filename) + { + filename = UUID.randomUUID() + "_" + filename + ".xlsx"; + return filename; + } + + /** + * 获取下载路径 + * + * @param filename 文件名称 + */ + public String getAbsoluteFile(String filename) + { + String downloadPath = TcctynConfig.getDownloadPath() + filename; + File desc = new File(downloadPath); + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + return downloadPath; + } + /** * 获取bean中的属性值 - * + * * @param vo 实体对象 * @param field 字段 * @param excel 注解 @@ -1272,7 +1385,6 @@ public class ExcelUtil */ private Object getTargetValue(T vo, Field field, Excel excel) throws Exception { - field.setAccessible(true); Object o = field.get(vo); if (StringUtils.isNotEmpty(excel.targetAttr())) { @@ -1295,7 +1407,7 @@ public class ExcelUtil /** * 以类的属性的get方法方法形式获取值 - * + * * @param o * @param name * @return value @@ -1332,85 +1444,48 @@ public class ExcelUtil List tempFields = new ArrayList<>(); tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); - if (StringUtils.isNotEmpty(includeFields)) + for (Field field : tempFields) { - for (Field field : tempFields) + if (!ArrayUtils.contains(this.excludeFields, field.getName())) { - if (ArrayUtils.contains(this.includeFields, field.getName()) || field.isAnnotationPresent(Excels.class)) + // 单注解 + if (field.isAnnotationPresent(Excel.class)) { - addField(fields, field); + Excel attr = field.getAnnotation(Excel.class); + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) + { + field.setAccessible(true); + fields.add(new Object[] { field, attr }); + } + if (Collection.class.isAssignableFrom(field.getType())) + { + subMethod = getSubMethod(field.getName(), clazz); + ParameterizedType pt = (ParameterizedType) field.getGenericType(); + Class subClass = (Class) pt.getActualTypeArguments()[0]; + this.subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); + } } - } - } - else if (StringUtils.isNotEmpty(excludeFields)) - { - for (Field field : tempFields) - { - if (!ArrayUtils.contains(this.excludeFields, field.getName())) + + // 多注解 + if (field.isAnnotationPresent(Excels.class)) { - addField(fields, field); + Excels attrs = field.getAnnotation(Excels.class); + Excel[] excels = attrs.value(); + for (Excel attr : excels) + { + if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr()) + && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) + { + field.setAccessible(true); + fields.add(new Object[] { field, attr }); + } + } } } } - else - { - for (Field field : tempFields) - { - addField(fields, field); - } - } return fields; } - /** - * 添加字段信息 - */ - public void addField(List fields, Field field) - { - // 单注解 - if (field.isAnnotationPresent(Excel.class)) - { - Excel attr = field.getAnnotation(Excel.class); - if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) - { - fields.add(new Object[] { field, attr }); - } - if (Collection.class.isAssignableFrom(field.getType())) - { - subMethod = getSubMethod(field.getName(), clazz); - ParameterizedType pt = (ParameterizedType) field.getGenericType(); - Class subClass = (Class) pt.getActualTypeArguments()[0]; - this.subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); - } - } - - // 多注解 - if (field.isAnnotationPresent(Excels.class)) - { - Excels attrs = field.getAnnotation(Excels.class); - Excel[] excels = attrs.value(); - for (Excel attr : excels) - { - if (StringUtils.isNotEmpty(includeFields)) - { - if (ArrayUtils.contains(this.includeFields, field.getName() + "." + attr.targetAttr()) - && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) - { - fields.add(new Object[] { field, attr }); - } - } - else - { - if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr()) - && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) - { - fields.add(new Object[] { field, attr }); - } - } - } - } - } - /** * 根据注解获取最大行高 */ @@ -1536,6 +1611,71 @@ public class ExcelUtil return true; } + /** + * 获取Excel2003图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) + { + Map sheetIndexPicMap = new HashMap(); + List pictures = workbook.getAllPictures(); + if (!pictures.isEmpty()) + { + for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) + { + HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); + if (shape instanceof HSSFPicture) + { + HSSFPicture pic = (HSSFPicture) shape; + int pictureIndex = pic.getPictureIndex() - 1; + HSSFPictureData picData = pictures.get(pictureIndex); + String picIndex = anchor.getRow1() + "_" + anchor.getCol1(); + sheetIndexPicMap.put(picIndex, picData); + } + } + return sheetIndexPicMap; + } + else + { + return sheetIndexPicMap; + } + } + + /** + * 获取Excel2007图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) + { + Map sheetIndexPicMap = new HashMap(); + for (POIXMLDocumentPart dr : sheet.getRelations()) + { + if (dr instanceof XSSFDrawing) + { + XSSFDrawing drawing = (XSSFDrawing) dr; + List shapes = drawing.getShapes(); + for (XSSFShape shape : shapes) + { + if (shape instanceof XSSFPicture) + { + XSSFPicture pic = (XSSFPicture) shape; + XSSFClientAnchor anchor = pic.getPreferredSize(); + CTMarker ctMarker = anchor.getFrom(); + String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); + sheetIndexPicMap.put(picIndex, pic.getPictureData()); + } + } + } + } + return sheetIndexPicMap; + } + /** * 格式化不同类型的日期对象 * diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/reflect/ReflectUtils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/reflect/ReflectUtils.java index e700209..4026509 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/reflect/ReflectUtils.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/reflect/ReflectUtils.java @@ -1,19 +1,15 @@ package com.tcctyn.common.core.utils.reflect; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.Date; +import com.tcctyn.common.core.text.Convert; +import com.tcctyn.common.core.utils.DateUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.apache.poi.ss.usermodel.DateUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.tcctyn.common.core.text.Convert; -import com.tcctyn.common.core.utils.DateUtils; + +import java.lang.reflect.*; +import java.util.Date; /** * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/sign/Md5Utils.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/sign/Md5Utils.java new file mode 100644 index 0000000..3513115 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/sign/Md5Utils.java @@ -0,0 +1,68 @@ +package com.tcctyn.common.core.utils.sign; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; + +/** + * Md5加密方法 + * + * @author tcctyn + */ +public class Md5Utils +{ + private static final Logger log = LoggerFactory.getLogger(Md5Utils.class); + + private static byte[] md5(String s) + { + MessageDigest algorithm; + try + { + algorithm = MessageDigest.getInstance("MD5"); + algorithm.reset(); + algorithm.update(s.getBytes("UTF-8")); + byte[] messageDigest = algorithm.digest(); + return messageDigest; + } + catch (Exception e) + { + log.error("MD5 Error...", e); + } + return null; + } + + private static final String toHex(byte hash[]) + { + if (hash == null) + { + return null; + } + StringBuffer buf = new StringBuffer(hash.length * 2); + int i; + + for (i = 0; i < hash.length; i++) + { + if ((hash[i] & 0xff) < 0x10) + { + buf.append("0"); + } + buf.append(Long.toString(hash[i] & 0xff, 16)); + } + return buf.toString(); + } + + public static String hash(String s) + { + try + { + return new String(toHex(md5(s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); + } + catch (Exception e) + { + log.error("not supported charset...{}", e); + return s; + } + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/sql/SqlUtil.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/sql/SqlUtil.java index 4bd609c..15b7a8b 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/sql/SqlUtil.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/sql/SqlUtil.java @@ -13,7 +13,7 @@ public class SqlUtil /** * 定义常用的 sql关键字 */ - public static String SQL_REGEX = "\u000B|and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()"; + public static String SQL_REGEX = "and |extractvalue|updatexml|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |+|user()"; /** * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/uuid/Seq.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/uuid/Seq.java index d2c4ded..2dfff8e 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/uuid/Seq.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/uuid/Seq.java @@ -1,9 +1,10 @@ package com.tcctyn.common.core.utils.uuid; -import java.util.concurrent.atomic.AtomicInteger; import com.tcctyn.common.core.utils.DateUtils; import com.tcctyn.common.core.utils.StringUtils; +import java.util.concurrent.atomic.AtomicInteger; + /** * @author tcctyn 序列生成类 */ diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/uuid/UUID.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/uuid/UUID.java index 649e7ef..7fb0200 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/uuid/UUID.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/utils/uuid/UUID.java @@ -1,11 +1,12 @@ package com.tcctyn.common.core.utils.uuid; +import com.tcctyn.common.core.exception.UtilException; + import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; -import com.tcctyn.common.core.exception.UtilException; /** * 提供通用唯一识别码(universally unique identifier)(UUID)实现 @@ -66,7 +67,7 @@ public final class UUID implements java.io.Serializable, Comparable } /** - * 获取类型 4(伪随机生成的)UUID 的静态工厂。 + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 * * @return 随机生成的 {@code UUID} */ diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/controller/BaseController.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/controller/BaseController.java index e3c33a0..c47388e 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/controller/BaseController.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/controller/BaseController.java @@ -1,45 +1,44 @@ package com.tcctyn.common.core.web.controller; -import java.beans.PropertyEditorSupport; -import java.util.Date; -import java.util.List; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.tcctyn.common.core.constant.HttpStatus; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.domain.model.LoginUser; +import com.tcctyn.common.core.web.page.PageDomain; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.web.page.TableSupport; +import com.tcctyn.common.core.utils.DateUtils; +import com.tcctyn.common.core.utils.PageUtils; +import com.tcctyn.common.core.utils.SecurityUtils; +import com.tcctyn.common.core.utils.StringUtils; +import com.tcctyn.common.core.utils.sql.SqlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; -import com.github.pagehelper.PageHelper; -import com.github.pagehelper.PageInfo; -import com.tcctyn.common.core.constant.HttpStatus; -import com.tcctyn.common.core.utils.DateUtils; -import com.tcctyn.common.core.utils.PageUtils; -import com.tcctyn.common.core.utils.StringUtils; -import com.tcctyn.common.core.utils.sql.SqlUtil; -import com.tcctyn.common.core.web.domain.AjaxResult; -import com.tcctyn.common.core.web.page.PageDomain; -import com.tcctyn.common.core.web.page.TableDataInfo; -import com.tcctyn.common.core.web.page.TableSupport; + +import java.beans.PropertyEditorSupport; +import java.util.Date; +import java.util.List; /** * web层通用数据处理 - * + * * @author tcctyn */ -public class BaseController -{ +public class BaseController { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); /** * 将前台传递过来的日期格式的字符串,自动转化为Date类型 */ @InitBinder - public void initBinder(WebDataBinder binder) - { + public void initBinder(WebDataBinder binder) { // Date 类型转换 - binder.registerCustomEditor(Date.class, new PropertyEditorSupport() - { + binder.registerCustomEditor(Date.class, new PropertyEditorSupport() { @Override - public void setAsText(String text) - { + public void setAsText(String text) { setValue(DateUtils.parseDate(text)); } }); @@ -48,19 +47,16 @@ public class BaseController /** * 设置请求分页数据 */ - protected void startPage() - { + protected void startPage() { PageUtils.startPage(); } /** * 设置请求排序数据 */ - protected void startOrderBy() - { + protected void startOrderBy() { PageDomain pageDomain = TableSupport.buildPageRequest(); - if (StringUtils.isNotEmpty(pageDomain.getOrderBy())) - { + if (StringUtils.isNotEmpty(pageDomain.getOrderBy())) { String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); PageHelper.orderBy(orderBy); } @@ -69,92 +65,132 @@ public class BaseController /** * 清理分页的线程变量 */ - protected void clearPage() - { + protected void clearPage() { PageUtils.clearPage(); } /** * 响应请求分页数据 */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected TableDataInfo getDataTable(List list) - { + @SuppressWarnings({"rawtypes", "unchecked"}) + protected TableDataInfo getDataTable(List list) { TableDataInfo rspData = new TableDataInfo(); rspData.setCode(HttpStatus.SUCCESS); - rspData.setRows(list); rspData.setMsg("查询成功"); + rspData.setRows(list); rspData.setTotal(new PageInfo(list).getTotal()); return rspData; } + /** + * 涉及到DO转VO的使用下面这个方法 + * @Param dolist 数据库查询出来的list + * @Param volist 前台展示的list + */ + protected TableDataInfo getDataTable(List dolist, List voList) { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setMsg("查询成功"); + rspData.setRows(voList); + rspData.setTotal(new PageInfo(dolist).getTotal()); + return rspData; + } + + /** * 返回成功 */ - public AjaxResult success() - { + public AjaxResult success() { return AjaxResult.success(); } + /** + * 返回失败消息 + */ + public AjaxResult error() { + return AjaxResult.error(); + } + /** * 返回成功消息 */ - public AjaxResult success(String message) - { + public AjaxResult success(String message) { return AjaxResult.success(message); } /** * 返回成功消息 */ - public AjaxResult success(Object data) - { + public AjaxResult success(Object data) { return AjaxResult.success(data); } /** * 返回失败消息 */ - public AjaxResult error() - { - return AjaxResult.error(); - } - - /** - * 返回失败消息 - */ - public AjaxResult error(String message) - { + public AjaxResult error(String message) { return AjaxResult.error(message); } /** * 返回警告消息 */ - public AjaxResult warn(String message) - { + public AjaxResult warn(String message) { return AjaxResult.warn(message); } /** * 响应返回结果 - * + * * @param rows 影响行数 * @return 操作结果 */ - protected AjaxResult toAjax(int rows) - { + protected AjaxResult toAjax(int rows) { return rows > 0 ? AjaxResult.success() : AjaxResult.error(); } /** * 响应返回结果 - * + * * @param result 结果 * @return 操作结果 */ - protected AjaxResult toAjax(boolean result) - { + protected AjaxResult toAjax(boolean result) { return result ? success() : error(); } + + /** + * 页面跳转 + */ + public String redirect(String url) { + return StringUtils.format("redirect:{}", url); + } + + /** + * 获取用户缓存信息 + */ + public LoginUser getLoginUser() { + return SecurityUtils.getLoginUser(); + } + + /** + * 获取登录用户id + */ + public Long getUserId() { + return getLoginUser().getUserId(); + } + + /** + * 获取登录部门id + */ + public Long getDeptId() { + return getLoginUser().getDeptId(); + } + + /** + * 获取登录用户名 + */ + public String getUsername() { + return getLoginUser().getUsername(); + } } diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/AjaxResult.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/AjaxResult.java index 82e03f6..8354ea4 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/AjaxResult.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/AjaxResult.java @@ -1,9 +1,10 @@ package com.tcctyn.common.core.web.domain; +import com.tcctyn.common.core.constant.HttpStatus; +import com.tcctyn.common.core.utils.StringUtils; + import java.util.HashMap; import java.util.Objects; -import com.tcctyn.common.core.constant.HttpStatus; -import com.tcctyn.common.core.utils.StringUtils; /** * 操作消息提醒 @@ -203,9 +204,9 @@ public class AjaxResult extends HashMap /** * 方便链式调用 * - * @param key - * @param value - * @return + * @param key 键 + * @param value 值 + * @return 数据对象 */ @Override public AjaxResult put(String key, Object value) diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/BaseEntity.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/BaseEntity.java index f797f97..14ef07d 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/BaseEntity.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/BaseEntity.java @@ -1,12 +1,14 @@ package com.tcctyn.common.core.web.domain; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; + import java.io.Serializable; import java.util.Date; import java.util.HashMap; import java.util.Map; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; /** * Entity基类 @@ -19,6 +21,7 @@ public class BaseEntity implements Serializable /** 搜索值 */ @JsonIgnore + @TableField(exist = false) private String searchValue; /** 创建者 */ @@ -36,10 +39,12 @@ public class BaseEntity implements Serializable private Date updateTime; /** 备注 */ + @TableField(exist = false) private String remark; /** 请求参数 */ @JsonInclude(JsonInclude.Include.NON_EMPTY) + @TableField(exist = false) private Map params; public String getSearchValue() diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/domain/R.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/R.java similarity index 80% rename from tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/domain/R.java rename to tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/R.java index 8d2f934..3ebdc62 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/domain/R.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/R.java @@ -1,7 +1,8 @@ -package com.tcctyn.common.core.domain; +package com.tcctyn.common.core.web.domain; + +import com.tcctyn.common.core.constant.HttpStatus; import java.io.Serializable; -import com.tcctyn.common.core.constant.Constants; /** * 响应信息主体 @@ -13,10 +14,10 @@ public class R implements Serializable private static final long serialVersionUID = 1L; /** 成功 */ - public static final int SUCCESS = Constants.SUCCESS; + public static final int SUCCESS = HttpStatus.SUCCESS; /** 失败 */ - public static final int FAIL = Constants.FAIL; + public static final int FAIL = HttpStatus.ERROR; private int code; @@ -26,12 +27,12 @@ public class R implements Serializable public static R ok() { - return restResult(null, SUCCESS, null); + return restResult(null, SUCCESS, "操作成功"); } public static R ok(T data) { - return restResult(data, SUCCESS, null); + return restResult(data, SUCCESS, "操作成功"); } public static R ok(T data, String msg) @@ -41,7 +42,7 @@ public class R implements Serializable public static R fail() { - return restResult(null, FAIL, null); + return restResult(null, FAIL, "操作失败"); } public static R fail(String msg) @@ -51,7 +52,7 @@ public class R implements Serializable public static R fail(T data) { - return restResult(data, FAIL, null); + return restResult(data, FAIL, "操作失败"); } public static R fail(T data, String msg) diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/TreeSelect.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/TreeSelect.java new file mode 100644 index 0000000..a62163d --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/TreeSelect.java @@ -0,0 +1,85 @@ +package com.tcctyn.common.core.web.domain; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.tcctyn.common.core.web.domain.entity.RegionInfo; +import com.tcctyn.common.core.web.domain.entity.SysDept; +import com.tcctyn.common.core.web.domain.entity.SysMenu; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Treeselect树结构实体类 + * + * @author tcctyn + */ +public class TreeSelect implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 节点ID */ + private Long id; + + /** 节点名称 */ + private String label; + + /** 子节点 */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private List children; + + public TreeSelect() + { + + } + + public TreeSelect(SysDept dept) + { + this.id = dept.getDeptId(); + this.label = dept.getDeptName(); + this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + public TreeSelect(SysMenu menu) + { + this.id = menu.getMenuId(); + this.label = menu.getMenuName(); + this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + public TreeSelect(RegionInfo regionInfo){ + this.id = regionInfo.getId(); + this.label = regionInfo.getAreaName(); + this.children = regionInfo.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + public Long getId() + { + return id; + } + + public void setId(Long id) + { + this.id = id; + } + + public String getLabel() + { + return label; + } + + public void setLabel(String label) + { + this.label = label; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/RegionInfo.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/RegionInfo.java new file mode 100644 index 0000000..8cee7e7 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/RegionInfo.java @@ -0,0 +1,196 @@ +package com.tcctyn.common.core.web.domain.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + *

+ * 区域信息表 + *

+ * + * @author 代超 + * @since 2024-09-24 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("region_info") +public class RegionInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 父id + */ + @NotNull(message = "父级id不能为空") + private Long parentId; + + /** + * 全路径 父id为0的数据,默认传0 + */ + private String ancestors; + + /** + * 地区编号 + */ + @NotBlank(message = "地区编号不能为空") + private String areaNo; + + /** + * 地区名称 + */ + @NotBlank(message = "地区名称不能为空") + private String areaName; + + /** + * 地区类型:林区、林场、电子围栏、切片 + */ + @NotBlank(message = "地区类型不能为空") + private String areaType; + + /** + * 植被类型 + */ + private String vegetationType; + + /** + * 土质类型 + */ + private String soilType; + + /** + * 地区运营状态 + */ + private String operationStatus; + + /** + * 地区排序 + */ + private Integer sortNo; + + /** + * 归属行政区划 + */ + private String administrativeDivision; + + /** + * 详细地址 + */ + private String address; + + /** + * 地区负责单位 + */ + private String belongingUnit; + + /** + * 负责单位联系方式 + */ + private String unitTel; + + /** + * 地区简介 + */ + private String areaIntroduction; + + /** + * 地区图片,多张以英文逗号分隔 + */ + private String areaPicture; + + /** + * 边框颜色 + */ + private String borderColor; + + /** + * 边框宽度 + */ + private String borderWidth; + + /** + * 边框透明度 + */ + private String borderTransparency; + + /** + * 填充色 + */ + private String fillColor; + + /** + * 填充色透明度 + */ + private String fillColorTransparency; + + /** + * 边框样式 + */ + private String borderStyle; + + /** + * 地区面积(平方米) + */ + private String regionArea; + + /** + * 经纬度信息 + */ + private String coordinateInfo; + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + + /** + * 子节点列表 + */ + @TableField(exist = false) + private List children = new ArrayList<>(); + + @TableField(exist = false) + private boolean hasChildren; + +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysDept.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysDept.java new file mode 100644 index 0000000..4532ffb --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysDept.java @@ -0,0 +1,207 @@ +package com.tcctyn.common.core.web.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.tcctyn.common.core.web.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.ArrayList; +import java.util.List; + +/** + * 部门表 sys_dept + * + * @author tcctyn + */ +public class SysDept extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 部门ID */ + private Long deptId; + + /** 父部门ID */ + private Long parentId; + + /** 祖级列表 */ + private String ancestors; + + /** 部门名称 */ + private String deptName; + + /** 显示顺序 */ + private Integer orderNum; + + /** 负责人 */ + private String leader; + + /** 联系电话 */ + private String phone; + + /** 邮箱 */ + private String email; + + /** 部门状态:0正常,1停用 */ + private String status; + + /** 删除标志(0代表存在 2代表删除) */ + private String delFlag; + + /** 父部门名称 */ + @TableField(exist = false) + private String parentName; + + /** 子部门 */ + @TableField(exist = false) + private List children = new ArrayList(); + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + public Long getParentId() + { + return parentId; + } + + public void setParentId(Long parentId) + { + this.parentId = parentId; + } + + public String getAncestors() + { + return ancestors; + } + + public void setAncestors(String ancestors) + { + this.ancestors = ancestors; + } + + @NotBlank(message = "部门名称不能为空") + @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符") + public String getDeptName() + { + return deptName; + } + + public void setDeptName(String deptName) + { + this.deptName = deptName; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getOrderNum() + { + return orderNum; + } + + public void setOrderNum(Integer orderNum) + { + this.orderNum = orderNum; + } + + public String getLeader() + { + return leader; + } + + public void setLeader(String leader) + { + this.leader = leader; + } + + @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符") + public String getPhone() + { + return phone; + } + + public void setPhone(String phone) + { + this.phone = phone; + } + + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") + public String getEmail() + { + return email; + } + + public void setEmail(String email) + { + this.email = email; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getDelFlag() + { + return delFlag; + } + + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getParentName() + { + return parentName; + } + + public void setParentName(String parentName) + { + this.parentName = parentName; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("deptId", getDeptId()) + .append("parentId", getParentId()) + .append("ancestors", getAncestors()) + .append("deptName", getDeptName()) + .append("orderNum", getOrderNum()) + .append("leader", getLeader()) + .append("phone", getPhone()) + .append("email", getEmail()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysDictData.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysDictData.java new file mode 100644 index 0000000..df01627 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysDictData.java @@ -0,0 +1,177 @@ +package com.tcctyn.common.core.web.domain.entity; + +import com.tcctyn.common.core.annotation.Excel; +import com.tcctyn.common.core.annotation.Excel.ColumnType; +import com.tcctyn.common.core.constant.UserConstants; +import com.tcctyn.common.core.web.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +/** + * 字典数据表 sys_dict_data + * + * @author tcctyn + */ +public class SysDictData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 字典编码 */ + @Excel(name = "字典编码", cellType = ColumnType.NUMERIC) + private Long dictCode; + + /** 字典排序 */ + @Excel(name = "字典排序", cellType = ColumnType.NUMERIC) + private Long dictSort; + + /** 字典标签 */ + @Excel(name = "字典标签") + private String dictLabel; + + /** 字典键值 */ + @Excel(name = "字典键值") + private String dictValue; + + /** 字典类型 */ + @Excel(name = "字典类型") + private String dictType; + + /** 样式属性(其他样式扩展) */ + private String cssClass; + + /** 表格字典样式 */ + private String listClass; + + /** 是否默认(Y是 N否) */ + @Excel(name = "是否默认", readConverterExp = "Y=是,N=否") + private String isDefault; + + /** 状态(0正常 1停用) */ + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String status; + + public Long getDictCode() + { + return dictCode; + } + + public void setDictCode(Long dictCode) + { + this.dictCode = dictCode; + } + + public Long getDictSort() + { + return dictSort; + } + + public void setDictSort(Long dictSort) + { + this.dictSort = dictSort; + } + + @NotBlank(message = "字典标签不能为空") + @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符") + public String getDictLabel() + { + return dictLabel; + } + + public void setDictLabel(String dictLabel) + { + this.dictLabel = dictLabel; + } + + @NotBlank(message = "字典键值不能为空") + @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符") + public String getDictValue() + { + return dictValue; + } + + public void setDictValue(String dictValue) + { + this.dictValue = dictValue; + } + + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符") + public String getDictType() + { + return dictType; + } + + public void setDictType(String dictType) + { + this.dictType = dictType; + } + + @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符") + public String getCssClass() + { + return cssClass; + } + + public void setCssClass(String cssClass) + { + this.cssClass = cssClass; + } + + public String getListClass() + { + return listClass; + } + + public void setListClass(String listClass) + { + this.listClass = listClass; + } + + public boolean getDefault() + { + return UserConstants.YES.equals(this.isDefault); + } + + public String getIsDefault() + { + return isDefault; + } + + public void setIsDefault(String isDefault) + { + this.isDefault = isDefault; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("dictCode", getDictCode()) + .append("dictSort", getDictSort()) + .append("dictLabel", getDictLabel()) + .append("dictValue", getDictValue()) + .append("dictType", getDictType()) + .append("cssClass", getCssClass()) + .append("listClass", getListClass()) + .append("isDefault", getIsDefault()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysDictType.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysDictType.java new file mode 100644 index 0000000..b0bc07c --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysDictType.java @@ -0,0 +1,97 @@ +package com.tcctyn.common.core.web.domain.entity; + +import com.tcctyn.common.core.annotation.Excel; +import com.tcctyn.common.core.annotation.Excel.ColumnType; +import com.tcctyn.common.core.web.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +/** + * 字典类型表 sys_dict_type + * + * @author tcctyn + */ +public class SysDictType extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 字典主键 */ + @Excel(name = "字典主键", cellType = ColumnType.NUMERIC) + private Long dictId; + + /** 字典名称 */ + @Excel(name = "字典名称") + private String dictName; + + /** 字典类型 */ + @Excel(name = "字典类型") + private String dictType; + + /** 状态(0正常 1停用) */ + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String status; + + public Long getDictId() + { + return dictId; + } + + public void setDictId(Long dictId) + { + this.dictId = dictId; + } + + @NotBlank(message = "字典名称不能为空") + @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符") + public String getDictName() + { + return dictName; + } + + public void setDictName(String dictName) + { + this.dictName = dictName; + } + + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") + @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)") + public String getDictType() + { + return dictType; + } + + public void setDictType(String dictType) + { + this.dictType = dictType; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("dictId", getDictId()) + .append("dictName", getDictName()) + .append("dictType", getDictType()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysMenu.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysMenu.java new file mode 100644 index 0000000..fcd2ddb --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysMenu.java @@ -0,0 +1,275 @@ +package com.tcctyn.common.core.web.domain.entity; + +import com.tcctyn.common.core.web.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.ArrayList; +import java.util.List; + +/** + * 菜单权限表 sys_menu + * + * @author tcctyn + */ +public class SysMenu extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 菜单ID */ + private Long menuId; + + /** 菜单名称 */ + private String menuName; + + /** 父菜单名称 */ + private String parentName; + + /** 父菜单ID */ + private Long parentId; + + /** 显示顺序 */ + private Integer orderNum; + + /** 路由地址 */ + private String path; + + /** 组件路径 */ + private String component; + + /** 路由参数 */ + private String query; + + /** 路由名称,默认和路由地址相同的驼峰格式(注意:因为vue3版本的router会删除名称相同路由,为避免名字的冲突,特殊情况可以自定义) */ + private String routeName; + + /** 是否为外链(0是 1否) */ + private String isFrame; + + /** 是否缓存(0缓存 1不缓存) */ + private String isCache; + + /** 类型(M目录 C菜单 F按钮) */ + private String menuType; + + /** 显示状态(0显示 1隐藏) */ + private String visible; + + /** 菜单状态(0正常 1停用) */ + private String status; + + /** 权限字符串 */ + private String perms; + + /** 菜单图标 */ + private String icon; + + /** 子菜单 */ + private List children = new ArrayList(); + + public Long getMenuId() + { + return menuId; + } + + public void setMenuId(Long menuId) + { + this.menuId = menuId; + } + + @NotBlank(message = "菜单名称不能为空") + @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符") + public String getMenuName() + { + return menuName; + } + + public void setMenuName(String menuName) + { + this.menuName = menuName; + } + + public String getParentName() + { + return parentName; + } + + public void setParentName(String parentName) + { + this.parentName = parentName; + } + + public Long getParentId() + { + return parentId; + } + + public void setParentId(Long parentId) + { + this.parentId = parentId; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getOrderNum() + { + return orderNum; + } + + public void setOrderNum(Integer orderNum) + { + this.orderNum = orderNum; + } + + @Size(min = 0, max = 200, message = "路由地址不能超过200个字符") + public String getPath() + { + return path; + } + + public void setPath(String path) + { + this.path = path; + } + + @Size(min = 0, max = 200, message = "组件路径不能超过255个字符") + public String getComponent() + { + return component; + } + + public void setComponent(String component) + { + this.component = component; + } + + public String getQuery() + { + return query; + } + + public void setQuery(String query) + { + this.query = query; + } + + public String getRouteName() + { + return routeName; + } + + public void setRouteName(String routeName) + { + this.routeName = routeName; + } + + public String getIsFrame() + { + return isFrame; + } + + public void setIsFrame(String isFrame) + { + this.isFrame = isFrame; + } + + public String getIsCache() + { + return isCache; + } + + public void setIsCache(String isCache) + { + this.isCache = isCache; + } + + @NotBlank(message = "菜单类型不能为空") + public String getMenuType() + { + return menuType; + } + + public void setMenuType(String menuType) + { + this.menuType = menuType; + } + + public String getVisible() + { + return visible; + } + + public void setVisible(String visible) + { + this.visible = visible; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符") + public String getPerms() + { + return perms; + } + + public void setPerms(String perms) + { + this.perms = perms; + } + + public String getIcon() + { + return icon; + } + + public void setIcon(String icon) + { + this.icon = icon; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("menuId", getMenuId()) + .append("menuName", getMenuName()) + .append("parentId", getParentId()) + .append("orderNum", getOrderNum()) + .append("path", getPath()) + .append("component", getComponent()) + .append("query", getQuery()) + .append("routeName", getRouteName()) + .append("isFrame", getIsFrame()) + .append("IsCache", getIsCache()) + .append("menuType", getMenuType()) + .append("visible", getVisible()) + .append("status ", getStatus()) + .append("perms", getPerms()) + .append("icon", getIcon()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysRole.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysRole.java new file mode 100644 index 0000000..27c26df --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysRole.java @@ -0,0 +1,242 @@ +package com.tcctyn.common.core.web.domain.entity; + +import com.tcctyn.common.core.annotation.Excel; +import com.tcctyn.common.core.annotation.Excel.ColumnType; +import com.tcctyn.common.core.web.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.Set; + +/** + * 角色表 sys_role + * + * @author tcctyn + */ +public class SysRole extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 角色ID */ + @Excel(name = "角色序号", cellType = ColumnType.NUMERIC) + private Long roleId; + + /** 角色名称 */ + @Excel(name = "角色名称") + private String roleName; + + /** 角色权限 */ + @Excel(name = "角色权限") + private String roleKey; + + /** 角色排序 */ + @Excel(name = "角色排序") + private Integer roleSort; + + /** 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) */ + @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限") + private String dataScope; + + /** 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) */ + private boolean menuCheckStrictly; + + /** 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) */ + private boolean deptCheckStrictly; + + /** 角色状态(0正常 1停用) */ + @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** 删除标志(0代表存在 2代表删除) */ + private String delFlag; + + /** 用户是否存在此角色标识 默认不存在 */ + private boolean flag = false; + + /** 菜单组 */ + private Long[] menuIds; + + /** 部门组(数据权限) */ + private Long[] deptIds; + + /** 角色菜单权限 */ + private Set permissions; + + public SysRole() + { + + } + + public SysRole(Long roleId) + { + this.roleId = roleId; + } + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + public boolean isAdmin() + { + return isAdmin(this.roleId); + } + + public static boolean isAdmin(Long roleId) + { + return roleId != null && 1L == roleId; + } + + @NotBlank(message = "角色名称不能为空") + @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符") + public String getRoleName() + { + return roleName; + } + + public void setRoleName(String roleName) + { + this.roleName = roleName; + } + + @NotBlank(message = "权限字符不能为空") + @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符") + public String getRoleKey() + { + return roleKey; + } + + public void setRoleKey(String roleKey) + { + this.roleKey = roleKey; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getRoleSort() + { + return roleSort; + } + + public void setRoleSort(Integer roleSort) + { + this.roleSort = roleSort; + } + + public String getDataScope() + { + return dataScope; + } + + public void setDataScope(String dataScope) + { + this.dataScope = dataScope; + } + + public boolean isMenuCheckStrictly() + { + return menuCheckStrictly; + } + + public void setMenuCheckStrictly(boolean menuCheckStrictly) + { + this.menuCheckStrictly = menuCheckStrictly; + } + + public boolean isDeptCheckStrictly() + { + return deptCheckStrictly; + } + + public void setDeptCheckStrictly(boolean deptCheckStrictly) + { + this.deptCheckStrictly = deptCheckStrictly; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getDelFlag() + { + return delFlag; + } + + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public boolean isFlag() + { + return flag; + } + + public void setFlag(boolean flag) + { + this.flag = flag; + } + + public Long[] getMenuIds() + { + return menuIds; + } + + public void setMenuIds(Long[] menuIds) + { + this.menuIds = menuIds; + } + + public Long[] getDeptIds() + { + return deptIds; + } + + public void setDeptIds(Long[] deptIds) + { + this.deptIds = deptIds; + } + + public Set getPermissions() + { + return permissions; + } + + public void setPermissions(Set permissions) + { + this.permissions = permissions; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("roleName", getRoleName()) + .append("roleKey", getRoleKey()) + .append("roleSort", getRoleSort()) + .append("dataScope", getDataScope()) + .append("menuCheckStrictly", isMenuCheckStrictly()) + .append("deptCheckStrictly", isDeptCheckStrictly()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysUser.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysUser.java new file mode 100644 index 0000000..ba85652 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/entity/SysUser.java @@ -0,0 +1,389 @@ +package com.tcctyn.common.core.web.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.tcctyn.common.core.annotation.Excel; +import com.tcctyn.common.core.annotation.Excel.ColumnType; +import com.tcctyn.common.core.annotation.Excel.Type; +import com.tcctyn.common.core.annotation.Excels; +import com.tcctyn.common.core.web.domain.BaseEntity; +import com.tcctyn.common.core.xss.Xss; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.util.Date; +import java.util.List; + +/** + * 用户对象 sys_user + * + * @author tcctyn + */ +public class SysUser extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 用户ID */ + @Excel(name = "用户序号", type = Type.EXPORT, cellType = ColumnType.NUMERIC, prompt = "用户编号") + private Long userId; + + /** 部门ID */ + @Excel(name = "部门编号", type = Type.IMPORT) + private Long deptId; + + /** 归属区域id */ + private Long regionId; + + /** 林区id */ + private Long forestId; + + /** 林场id */ + private Long farmId; + + /** 电子围栏id */ + private Long fenceId; + + /** 用户账号 */ + @Excel(name = "登录名称") + private String userName; + + /** 用户昵称 */ + @Excel(name = "用户名称") + private String nickName; + + /** 用户邮箱 */ + @Excel(name = "用户邮箱") + private String email; + + /** 手机号码 */ + @Excel(name = "手机号码", cellType = ColumnType.TEXT) + private String phonenumber; + + /** 用户性别 */ + @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知") + private String sex; + + /** 用户头像 */ + private String avatar; + + /** 密码 */ + private String password; + + /** 帐号状态(0正常 1停用) */ + @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** 删除标志(0代表存在 2代表删除) */ + private String delFlag; + + /** 最后登录IP */ + @Excel(name = "最后登录IP", type = Type.EXPORT) + private String loginIp; + + /** 最后登录时间 */ + @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) + private Date loginDate; + + /** 部门对象 */ + @Excels({ + @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT), + @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT) + }) + @TableField(exist = false) + private SysDept dept; + + @TableField(exist = false) + /** 归属林区 */ + private RegionInfo region; + + @TableField(exist = false) + /** 角色对象 */ + private List roles; + + @TableField(exist = false) + /** 角色组 */ + private Long[] roleIds; + + @TableField(exist = false) + /** 岗位组 */ + private Long[] postIds; + + @TableField(exist = false) + /** 角色ID */ + private Long roleId; + + public SysUser() + { + + } + + public SysUser(Long userId) + { + this.userId = userId; + } + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public boolean isAdmin() + { + return isAdmin(this.userId); + } + + public static boolean isAdmin(Long userId) + { + return userId != null && 1L == userId; + } + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + @Xss(message = "用户昵称不能包含脚本字符") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") + public String getNickName() + { + return nickName; + } + + public void setNickName(String nickName) + { + this.nickName = nickName; + } + + @Xss(message = "用户账号不能包含脚本字符") + @NotBlank(message = "用户账号不能为空") + @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符") + public String getUserName() + { + return userName; + } + + public void setUserName(String userName) + { + this.userName = userName; + } + + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") + public String getEmail() + { + return email; + } + + public void setEmail(String email) + { + this.email = email; + } + + @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符") + public String getPhonenumber() + { + return phonenumber; + } + + public void setPhonenumber(String phonenumber) + { + this.phonenumber = phonenumber; + } + + public String getSex() + { + return sex; + } + + public void setSex(String sex) + { + this.sex = sex; + } + + public String getAvatar() + { + return avatar; + } + + public void setAvatar(String avatar) + { + this.avatar = avatar; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getDelFlag() + { + return delFlag; + } + + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getLoginIp() + { + return loginIp; + } + + public void setLoginIp(String loginIp) + { + this.loginIp = loginIp; + } + + public Date getLoginDate() + { + return loginDate; + } + + public void setLoginDate(Date loginDate) + { + this.loginDate = loginDate; + } + + public SysDept getDept() + { + return dept; + } + + public void setDept(SysDept dept) + { + this.dept = dept; + } + + public List getRoles() + { + return roles; + } + + public void setRoles(List roles) + { + this.roles = roles; + } + + public Long[] getRoleIds() + { + return roleIds; + } + + public void setRoleIds(Long[] roleIds) + { + this.roleIds = roleIds; + } + + public Long[] getPostIds() + { + return postIds; + } + + public void setPostIds(Long[] postIds) + { + this.postIds = postIds; + } + + public Long getRoleId() + { + return roleId; + } + + public void setFenceId(Long fenceId) { + this.fenceId = fenceId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + public Long getForestId() { + return forestId; + } + + public void setForestId(Long forestId) { + this.forestId = forestId; + } + + public Long getRegionId() { + return regionId; + } + + public void setRegionId(Long regionId) { + this.regionId = regionId; + } + + public Long getFarmId() { + return farmId; + } + + public void setFarmId(Long farmId) { + this.farmId = farmId; + } + + public Long getFenceId() { + return fenceId; + } + + public RegionInfo getRegion() { + return region; + } + + public void setRegion(RegionInfo region) { + this.region = region; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("deptId", getDeptId()) + .append("userName", getUserName()) + .append("nickName", getNickName()) + .append("email", getEmail()) + .append("phonenumber", getPhonenumber()) + .append("sex", getSex()) + .append("avatar", getAvatar()) + .append("password", getPassword()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("loginIp", getLoginIp()) + .append("loginDate", getLoginDate()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("dept", getDept()) + .toString(); + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/model/DictDataVO.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/model/DictDataVO.java new file mode 100644 index 0000000..d7d994e --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/model/DictDataVO.java @@ -0,0 +1,36 @@ +package com.tcctyn.common.core.web.domain.model; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 数据字典展示实体类 + */ +@Data +public class DictDataVO implements Serializable { + + private static final long serialVersionUID = -9073442421377041774L; + + public DictDataVO(Long dictSort, String dictLabel, String dictValue) { + this.dictSort = dictSort; + this.dictLabel = dictLabel; + this.dictValue = dictValue; + } + + /** + * 字典排序 + */ + private Long dictSort; + + /** + * 字典标签 + */ + private String dictLabel; + + /** + * 字典键值 + */ + private String dictValue; + +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/model/LoginBody.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/model/LoginBody.java new file mode 100644 index 0000000..4a79a94 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/model/LoginBody.java @@ -0,0 +1,69 @@ +package com.tcctyn.common.core.web.domain.model; + +/** + * 用户登录对象 + * + * @author tcctyn + */ +public class LoginBody +{ + /** + * 用户名 + */ + private String username; + + /** + * 用户密码 + */ + private String password; + + /** + * 验证码 + */ + private String code; + + /** + * 唯一标识 + */ + private String uuid; + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getCode() + { + return code; + } + + public void setCode(String code) + { + this.code = code; + } + + public String getUuid() + { + return uuid; + } + + public void setUuid(String uuid) + { + this.uuid = uuid; + } +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/model/LoginUser.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/model/LoginUser.java new file mode 100644 index 0000000..9feaaab --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/model/LoginUser.java @@ -0,0 +1,268 @@ +package com.tcctyn.common.core.web.domain.model; + +import com.alibaba.fastjson2.annotation.JSONField; +import com.tcctyn.common.core.web.domain.entity.SysUser; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.Collection; +import java.util.Set; + +/** + * 登录用户身份权限 + * + * @author tcctyn + */ +public class LoginUser implements UserDetails +{ + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户唯一标识 + */ + private String token; + + /** + * 登录时间 + */ + private Long loginTime; + + /** + * 过期时间 + */ + private Long expireTime; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 权限列表 + */ + private Set permissions; + + /** + * 用户信息 + */ + private SysUser user; + + public LoginUser() + { + } + + public LoginUser(SysUser user, Set permissions) + { + this.user = user; + this.permissions = permissions; + } + + public LoginUser(Long userId, Long deptId, SysUser user, Set permissions) + { + this.userId = userId; + this.deptId = deptId; + this.user = user; + this.permissions = permissions; + } + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + public String getToken() + { + return token; + } + + public void setToken(String token) + { + this.token = token; + } + + @JSONField(serialize = false) + @Override + public String getPassword() + { + return user.getPassword(); + } + + @Override + public String getUsername() + { + return user.getUserName(); + } + + /** + * 账户是否未过期,过期无法验证 + */ + @JSONField(serialize = false) + @Override + public boolean isAccountNonExpired() + { + return true; + } + + /** + * 指定用户是否解锁,锁定的用户无法进行身份验证 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isAccountNonLocked() + { + return true; + } + + /** + * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isCredentialsNonExpired() + { + return true; + } + + /** + * 是否可用 ,禁用的用户不能身份验证 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isEnabled() + { + return true; + } + + public Long getLoginTime() + { + return loginTime; + } + + public void setLoginTime(Long loginTime) + { + this.loginTime = loginTime; + } + + public String getIpaddr() + { + return ipaddr; + } + + public void setIpaddr(String ipaddr) + { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() + { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) + { + this.loginLocation = loginLocation; + } + + public String getBrowser() + { + return browser; + } + + public void setBrowser(String browser) + { + this.browser = browser; + } + + public String getOs() + { + return os; + } + + public void setOs(String os) + { + this.os = os; + } + + public Long getExpireTime() + { + return expireTime; + } + + public void setExpireTime(Long expireTime) + { + this.expireTime = expireTime; + } + + public Set getPermissions() + { + return permissions; + } + + public void setPermissions(Set permissions) + { + this.permissions = permissions; + } + + public SysUser getUser() + { + return user; + } + + public void setUser(SysUser user) + { + this.user = user; + } + + @Override + public Collection getAuthorities() + { + return null; + } + +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/model/RegisterBody.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/model/RegisterBody.java new file mode 100644 index 0000000..23fe135 --- /dev/null +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/domain/model/RegisterBody.java @@ -0,0 +1,11 @@ +package com.tcctyn.common.core.web.domain.model; + +/** + * 用户注册对象 + * + * @author tcctyn + */ +public class RegisterBody extends LoginBody +{ + +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/page/TableDataInfo.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/page/TableDataInfo.java index a118618..0279c0d 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/page/TableDataInfo.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/web/page/TableDataInfo.java @@ -37,7 +37,7 @@ public class TableDataInfo implements Serializable * @param list 列表数据 * @param total 总记录数 */ - public TableDataInfo(List list, long total) + public TableDataInfo(List list, int total) { this.rows = list; this.total = total; @@ -82,4 +82,4 @@ public class TableDataInfo implements Serializable { this.msg = msg; } -} \ No newline at end of file +} diff --git a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/xss/XssValidator.java b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/xss/XssValidator.java index 72c42d2..2dc7ca0 100644 --- a/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/xss/XssValidator.java +++ b/tcctyn-common/tcctyn-common-core/src/main/java/com/tcctyn/common/core/xss/XssValidator.java @@ -1,10 +1,11 @@ package com.tcctyn.common.core.xss; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import com.tcctyn.common.core.utils.StringUtils; + import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; -import com.tcctyn.common.core.utils.StringUtils; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * 自定义xss校验注解实现 diff --git a/tcctyn-modules/pom.xml b/tcctyn-modules/pom.xml index 55037f6..8ed4a4c 100644 --- a/tcctyn-modules/pom.xml +++ b/tcctyn-modules/pom.xml @@ -11,6 +11,7 @@ tcctyn-system tcctyn-gen + tcctyn-iot tcctyn-modules diff --git a/tcctyn-modules/tcctyn-iot/pom.xml b/tcctyn-modules/tcctyn-iot/pom.xml new file mode 100644 index 0000000..4bef560 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/pom.xml @@ -0,0 +1,124 @@ + + + 4.0.0 + + com.tcctyn + tcctyn-modules + 1.0.0 + + tcctyn-iot + + + tcctyn-iot物联网模块 + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + org.apache.velocity + velocity-engine-core + + + + + com.mysql + mysql-connector-j + + + + + com.tcctyn + tcctyn-common-datasource + + + + + com.tcctyn + tcctyn-common-datascope + + + + + + com.tcctyn + tcctyn-common-log + + + + + com.tcctyn + tcctyn-common-swagger + + + + com.tcctyn + tcctyn-common-core + + + + + com.hikvision.ga + artemis-http-client + ${artemis-http-client.version} + + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus-boot-starter.version} + + + + com.github.yulichang + mybatis-plus-join-boot-starter + ${mybatis-plus-join-boot-starter.version} + + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + \ No newline at end of file diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/TcctynIotApplication.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/TcctynIotApplication.java new file mode 100644 index 0000000..f2d773a --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/TcctynIotApplication.java @@ -0,0 +1,20 @@ +package com.tcctyn.iot; + +import com.tcctyn.common.security.annotation.EnableCustomConfig; +import com.tcctyn.common.security.annotation.EnableRyFeignClients; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@EnableCustomConfig +@EnableRyFeignClients +@SpringBootApplication +@ComponentScan(basePackages = {"com.tcctyn.iot.**", "com.tcctyn.common.**"}) +public class TcctynIotApplication { + + public static void main(String[] args) + { + SpringApplication.run(TcctynIotApplication.class, args); + System.out.println("(♥◠‿◠)ノ゙ 物联网模块启动成功 ლ(´ڡ`ლ)゙"); + } +} \ No newline at end of file diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/FireWarningMQTTBO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/FireWarningMQTTBO.java new file mode 100644 index 0000000..aecd8a4 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/FireWarningMQTTBO.java @@ -0,0 +1,134 @@ +package com.tcctyn.iot.forestfire.BO; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class FireWarningMQTTBO implements Serializable { + + private static final long serialVersionUID = 184298993802545138L; + + /** 火情预警id */ + private Long id; + + /** + * 发现火情设备编号 + */ + private String deviceNo; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 地址 + */ + private String address; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 高度 + */ + private String height; + + /** + * 所属区域id + */ + private Long regionId; + + /** + * 火情标题 + */ + private String fireTitle; + + /** + * 火情级别 + */ + private String fireLevel; + + /** + * 起火原因 + */ + private String fireCause; + + /** + * 处置状态:未处理、已研判、已上报、已归档 + */ + private String disposalStatus; + + /** + * 火情图片 + */ + private String firePicture; + + /** + * 火情预警数据来源 + */ + private String dataSource; + + /** + * 备注信息 + */ + private String remark; + + /** + * 记录创建时间,默认用服务器时间 + */ + private Date createdTime; + + /** + * 归属点位id + */ + private Long pointId; + + /** + * 归属点位编号 + */ + private String pointNo; + + /** + * 归属点位名称 + */ + private String pointName; + + /** + * 归属点位地址 + */ + private String pointAddress; + + /** + * 归属点位经度 + */ + private String pointLongitude; + + /** + * 归属点位纬度 + */ + private String pointLatitude; + + /** + * 归属点位高度 + */ + private String pointHeight; + + /** + * 归属点位类型 + */ + private String pointType; + + /** 归属区域名称 */ + private String regionName; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/FireWarningMisjudgeBO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/FireWarningMisjudgeBO.java new file mode 100644 index 0000000..13396cd --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/FireWarningMisjudgeBO.java @@ -0,0 +1,35 @@ +package com.tcctyn.iot.forestfire.BO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 火情预警信息误判后消息推送 + */ + +@Data +public class FireWarningMisjudgeBO implements Serializable { + + private static final long serialVersionUID = -1954870764499170410L; + + /** + * 火情预警id + */ + private Long id; + + /** + * 火情预警处理状态 + */ + private String disposalStatus; + + /** + * 误判标识 + */ + private Integer misjudgeFlag; + + /** + * 处理消息 + */ + private String disposalMsg; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/PointInfoBO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/PointInfoBO.java new file mode 100644 index 0000000..19f0697 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/PointInfoBO.java @@ -0,0 +1,83 @@ +package com.tcctyn.iot.forestfire.BO; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 打卡点、巡护点业务对象 + */ +@Data +public class PointInfoBO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 点位记录id + */ + private Long id; + + /** + * 归属地区id 可能是林区、林场、电子围栏、巡护路径id + */ + private Long belongingRegionId; + + @JsonIgnore + /** + * 林区id + */ + private Long forestId; + /** + * 林场id + */ + @JsonIgnore + private Long farmId; + + /** + * 电子围栏id + */ + @JsonIgnore + private Long fenceId; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 高度 + */ + private String height; + + /** + * 点位类型:云台、卡口、打卡点、巡护点 + */ + private String pointType; + + /** + * 点位顺序 + */ + private Integer sortNo; + + /** + * 打卡半径,单位:米 + */ + private String checkInRadius; + + /** + * 是否打卡 + */ + private boolean checkInFlag; + + /** + * 打卡时间 + */ + private Date checkInTime; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/PositionBO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/PositionBO.java new file mode 100644 index 0000000..4c02260 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/PositionBO.java @@ -0,0 +1,28 @@ +package com.tcctyn.iot.forestfire.BO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 位置信息BO + */ +@Data +public class PositionBO implements Serializable { + + private static final long serialVersionUID = 5127358619357602320L; + + public PositionBO(String longitude, String latitude, String height) { + } + + /** 经度 */ + private String longitude; + + /** 纬度 */ + private String latitude; + + /** 高度 */ + private String height; + + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/ScopeSimulationBO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/ScopeSimulationBO.java new file mode 100644 index 0000000..bf1eb0b --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/ScopeSimulationBO.java @@ -0,0 +1,36 @@ +package com.tcctyn.iot.forestfire.BO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 卫星热点数据模拟,地图取点范围BO + */ +@Data +public class ScopeSimulationBO implements Serializable { + + private static final long serialVersionUID = -4916623718291474020L; + + public ScopeSimulationBO() {} + + public ScopeSimulationBO(double minLongitude, double maxLongitude, double minLatitude, double maxLatitude) { + this.minLongitude = minLongitude; + this.maxLongitude = maxLongitude; + this.minLatitude = minLatitude; + this.maxLatitude = maxLatitude; + } + + /** 最小经度 */ + private double minLongitude; + + /** 最大经度 */ + private double maxLongitude; + + /** 最小纬度 */ + private double minLatitude; + + /** 最大纬度 */ + private double maxLatitude; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/SysUserBO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/SysUserBO.java new file mode 100644 index 0000000..ec2a15d --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/BO/SysUserBO.java @@ -0,0 +1,45 @@ +package com.tcctyn.iot.forestfire.BO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 用户信息业务对象 + */ +@Data +public class SysUserBO implements Serializable { + + private static final long serialVersionUID = 6464645141599651914L; + + /** + * 用户id + */ + private Long userId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 用户邮箱 + */ + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别 + */ + private String sex; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/AggregationStatisticsVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/AggregationStatisticsVO.java new file mode 100644 index 0000000..5c006f6 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/AggregationStatisticsVO.java @@ -0,0 +1,39 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * APP 端聚合统计接口返回值 + */ +@Data +public class AggregationStatisticsVO implements Serializable { + + private static final long serialVersionUID = -7851077263822626129L; + + /** + * 未处理的火情预警数 + */ + private Long unhandledFireWarningNum = 0L; + + /** + * 未处理的火情上报数 + */ + private Long unhandledFireReportNum = 0L; + + /** + * 我未接受的任务数 + */ + private Long unacceptedTaskNum = 0L; + + /** + * 未审批的记录数 + */ + private Long unapprovedNum = 0L; + + /** + * 林区下未接受的任务数 + */ + private Long unacceptedTaskNumByRegion = 0L; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/AirportVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/AirportVO.java new file mode 100644 index 0000000..467ad8b --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/AirportVO.java @@ -0,0 +1,100 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 查询火情风险点附近最近的机场VO + */ +@Data +public class AirportVO implements Serializable { + + private static final long serialVersionUID = -1759830973473090526L; + + /** + * 主键id + */ + private Long id; + + /** + * 设备编号 + */ + private String deviceNo; + + /** + * 设备名称 + */ + private String deviceName; + + /** + * 设备型号 + */ + private String deviceModel; + + /** + * 设备厂商 + */ + private String deviceManufacturer; + + /** + * 设备协议 + */ + private String deviceProtocol; + + /** + * 接入方式 + */ + private String accessMethod; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 设备状态:在线/离线 + */ + private String deviceStatus; + + /** + * 归属区域id,机场需要挂在地区下面 + */ + private Long regionId; + + /** + * 地址 + */ + private String address; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 高度 + */ + private String height; + + /** + * 设备启用状态:0-停用/1-启用 + */ + private Integer enableFlag; + + /** + * 归属地区名称 + */ + private String regionName; + + + /** 机场下的无人机列表 */ + private List droneList; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ApprovalRecordVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ApprovalRecordVO.java new file mode 100644 index 0000000..b34d418 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ApprovalRecordVO.java @@ -0,0 +1,78 @@ +package com.tcctyn.iot.forestfire.VO; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 审批记录返回给前端VO + */ +@Data +public class ApprovalRecordVO implements Serializable { + + private static final long serialVersionUID = -2678024258066273556L; + + /** + * 主键id + */ + private Long id; + + /** + * 业务类型 + */ + private String businessType; + + /** + * 业务数据id + */ + private Long businessDataId; + + /** + * 业务数据内容 + */ + private Object businessContent; + + /** + * 审批标识,0-未审批,1-已审批 + */ + private Integer approvalFlag; + + /** + * 审批状态,0-驳回,1-通过 + */ + private Integer approvalStatus; + + /** + * 驳回说明 + */ + private String rejectionStatement; + + /** + * 审核人id + */ + private Long reviewerId; + + /** + * 审核时间 + */ + private Date reviewTime; + + /** + * 备注信息 + */ + private String remark; + + /** + * 记录创建时间,默认用服务器时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createdTime; + + /** + * 审批人姓名 + */ + private String reviewerName; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/CameraVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/CameraVO.java new file mode 100644 index 0000000..2765c6f --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/CameraVO.java @@ -0,0 +1,59 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 摄像头设备VO + */ +@Data +public class CameraVO implements Serializable { + + private static final long serialVersionUID = 4975876865936973836L; + + /** + * 主键id + */ + private Long id; + + /** + * 设备编号 + */ + private String deviceNo; + + /** + * 设备名称 + */ + private String deviceName; + + /** + * 设备型号 + */ + private String deviceModel; + + /** + * 设备厂商 + */ + private String deviceManufacturer; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 设备在线/离线状态 + */ + private String deviceStatus; + + /** + * 归属区域id + */ + private Long regionId; + + /** + * 归属区域名称 + */ + private String regionName; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/CarouselImageConfigVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/CarouselImageConfigVO.java new file mode 100644 index 0000000..8445a69 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/CarouselImageConfigVO.java @@ -0,0 +1,47 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 轮播图VO + */ +@Data +public class CarouselImageConfigVO implements Serializable { + + private static final long serialVersionUID = -5616770476661134447L; + + /** + * 主键id + */ + private Long id; + + /** + * 图片主题 + */ + private String imageTheme; + + /** + * 图片 + */ + private String image; + + /** + * 序号 + */ + private Integer sortNo; + + /** + * 是否启用:0-停用,1-启用 + */ + private Integer enableFlag; + + /** + * 创建时间 + */ + private Date createdTime; + + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/CheckInRecordVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/CheckInRecordVO.java new file mode 100644 index 0000000..d66bb1f --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/CheckInRecordVO.java @@ -0,0 +1,95 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 打卡记录VO + */ +@Data +public class CheckInRecordVO implements Serializable { + + private static final long serialVersionUID = 8171630821682560531L; + + /** + * 主键id + */ + private Long id; + + /** + * 排班id + */ + private Long scheduleId; + + /** + * 点位id + */ + private Long pointId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 巡护路径id + */ + private Long pathId; + + /** + * 用户id + */ + private Long userId; + + /** + * 打卡时间 + */ + private Date checkInTime; + + /** + * 打卡地点 + */ + private String location; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 高度 + */ + private String height; + + /** + * 备注信息 + */ + private String remark; + + /** + * 打卡拍照 + */ + private String checkPicture; + + /** + * 护林员姓名 + */ + private String userName; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceAndPointInfoVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceAndPointInfoVO.java new file mode 100644 index 0000000..9d4ba75 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceAndPointInfoVO.java @@ -0,0 +1,85 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 设备信息及归属点位信息 + */ +@Data +public class DeviceAndPointInfoVO implements Serializable { + + private static final long serialVersionUID = 7032345348538117946L; + + //设备信息 + + /** + * 主键id + */ + private Long id; + + /** + * 设备编号 + */ + private String deviceNo; + + /** + * 设备型号 + */ + private String deviceModel; + + /** + * 设备厂商 + */ + private String deviceManufacturer; + + /** + * 设备类型 + */ + private String deviceType; + + //点位信息 + + /** + * 归属云台/卡口id + */ + private Long pointId; + + /** + * 点位编号 + */ + private String pointNo; + + /** + * 点位名称 + */ + private String pointName; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 点位类型:云台、卡口、打卡点、巡护点 + */ + private String pointType; + + /** + * 点位描述信息 + */ + private String pointDescription; + + /** + * 点位图片,多张以英文逗号分隔 + */ + private String pointPicture; + + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceChanelsVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceChanelsVO.java new file mode 100644 index 0000000..9b6ca41 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceChanelsVO.java @@ -0,0 +1,59 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.util.Date; + +/** + * 设备通道返回给前端的VO + */ +@Data +public class DeviceChanelsVO { + + //private static final long serialVersionUID = L; + + /** + * 主键id + */ + private Long id; + + /** + * 设备编号 + */ + private String deviceNo; + + /** + * 通道号 + */ + private String chanelNo; + + /** + * 名称 + */ + private String name; + + /** + * 流地址 + */ + private String streamUrl; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 创建时间,默认用服务器时间 + */ + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 修改时间,默认用服务器时间 + */ + private Date updatedTime; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceConfigVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceConfigVO.java new file mode 100644 index 0000000..3ce6541 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceConfigVO.java @@ -0,0 +1,46 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + + +/** + * 设备配置返回给前端的VO + */ +@Data +public class DeviceConfigVO { + + /** + * 主键id + */ + private Long id; + + /** + * 设备编号 + */ + private String deviceNo; + + /** + * 用户账户 + */ + private String username; + + /** + * 密码 + */ + private String password; + + /** + * IP地址 + */ + private String ip; + + /** + * 端口号 + */ + private String port; + + /** + * 备注 + */ + private String remark; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceInfoSimpleVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceInfoSimpleVO.java new file mode 100644 index 0000000..ed41573 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceInfoSimpleVO.java @@ -0,0 +1,91 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 简单的设备信息 + * 云台、卡口下的设备信息 + */ +@Data +public class DeviceInfoSimpleVO implements Serializable { + + private static final long serialVersionUID = -5550394669879020905L; + + /** + * 主键id + */ + private Long id; + + /** + * 设备编号 + */ + private String deviceNo; + + /** + * 设备名称 + */ + private String deviceName; + + /** + * 设备型号 + */ + private String deviceModel; + + /** + * 设备厂商 + */ + private String deviceManufacturer; + + /** + * 设备协议 + */ + private String deviceProtocol; + + /** + * 接入方式 + */ + private String accessMethod; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 设备状态:在线/离线 + */ + private String deviceStatus; + + /** + * 归属区域id,机场需要挂在地区下面 + */ + private Long regionId; + + /** + * 归属云台/卡口id + */ + private Long pointId; + + /** + * 设备启用状态:0-停用/1-启用 + */ + private Integer enableFlag; + + /** + * 备注信息 + */ + private String remark; + + /** + * 归属地区名称 + */ + private String regionName; + + /** + * 归属点位名称 + */ + private String pointName; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceInfoVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceInfoVO.java new file mode 100644 index 0000000..182ad21 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceInfoVO.java @@ -0,0 +1,179 @@ +package com.tcctyn.iot.forestfire.VO; + +import com.tcctyn.iot.forestfire.domain.DeviceConfig; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 设备信息返回给前端的VO + */ +@Data +public class DeviceInfoVO implements Serializable { + + private static final long serialVersionUID = 3428836874966786844L; + + /** + * 主键id + */ + private Long id; + + /** + * 设备编号 + */ + private String deviceNo; + + /** + * 设备名称 + */ + private String deviceName; + + /** + * 设备型号 + */ + private String deviceModel; + + /** + * 设备厂商 + */ + private String deviceManufacturer; + + /** + * 设备协议 + */ + private String deviceProtocol; + + /** + * 接入方式 + */ + private String accessMethod; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 设备状态:在线/离线 + */ + private String deviceStatus; + + /** + * 归属区域id,机场需要挂在地区下面 + */ + private Long regionId; + + /** + * 归属云台/卡口id + */ + private Long pointId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 机场id + */ + private Long airportId; + + /** + * 地址 + */ + private String address; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 高度 + */ + private String height; + + /** + * 设备启用状态:0-停用/1-启用 + */ + private Integer enableFlag; + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + private Date updatedTime; + + //以下是包装给前端的名称字段 + /** + * 归属地区名称 + */ + private String regionName; + + /** + * 归属点位名称 + */ + private String pointName; + + /** + * 归属机场名称 + */ + private String airportName; + + /** + * 归属名称:统一点位名称与机场名称,方便前端列表页面展示 + */ + private String pointOrAirportName; + + /** + * 设备配置信息表 + */ + private DeviceConfig deviceConfig; + + /** + * 设备通道信息表 + */ + private List deviceChanelsVOList; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceOwnerVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceOwnerVO.java new file mode 100644 index 0000000..d9a39d9 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceOwnerVO.java @@ -0,0 +1,35 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 设备归属VO + */ +@Data +public class DeviceOwnerVO implements Serializable { + + private static final long serialVersionUID = 8007964042205003964L; + + public DeviceOwnerVO() { + } + + public DeviceOwnerVO(Long id, String name) { + this.id = id; + this.name = name; + } + + + /** + * id + */ + private Long id; + + + /** + * 名称 + */ + private String name; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceStatisticsByPointVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceStatisticsByPointVO.java new file mode 100644 index 0000000..958ab70 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceStatisticsByPointVO.java @@ -0,0 +1,39 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 统计云台、卡口下的设备数量 + */ +@Data +public class DeviceStatisticsByPointVO implements Serializable { + + private static final long serialVersionUID = -6173268737974058330L; + + /** + * 设备总数 + */ + private Integer totalNum; + + /** + * 云台设备数量 + */ + private Integer ptzNum; + + /** + * 卡口设备数量 + */ + private Integer bayonetNum; + + /** + * 总的在线设备 + */ + private Integer onlineNum; + + /** + * 总的设备在线率 + */ + private String onlineRate; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceStatisticsByStatusVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceStatisticsByStatusVO.java new file mode 100644 index 0000000..b8fc337 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceStatisticsByStatusVO.java @@ -0,0 +1,34 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 设备列表上方的统计信息 + */ +@Data +public class DeviceStatisticsByStatusVO implements Serializable { + + private static final long serialVersionUID = 8173577365152550543L; + + /** + * 设备总数量 + */ + private Integer totalNum; + + /** + * 在线设备数量 + */ + private Integer onlineNum; + + /** + * 离线设备数量 + */ + private Integer offlineNum; + + /** + * 未启用的设备数量 + */ + private Integer disableNum; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceStatisticsSubVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceStatisticsSubVO.java new file mode 100644 index 0000000..6e8bf6d --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceStatisticsSubVO.java @@ -0,0 +1,39 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 大屏设备统计子类 + */ +@Data +public class DeviceStatisticsSubVO implements Serializable { + + private static final long serialVersionUID = -8015476506632502263L; + + /** + * 设备类型 + */ + private String type; + + /** + * 在线数量 + */ + private Integer onlineNum; + + /** + * 离线数量 + */ + private Integer offlineNum; + + /** + * 总数量 + */ + private Integer totalNum; + + /** + * 在线率 + */ + private String onlineRate; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceStatisticsVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceStatisticsVO.java new file mode 100644 index 0000000..5d7ee83 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceStatisticsVO.java @@ -0,0 +1,30 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 大屏设备信息统计VO + */ +@Data +public class DeviceStatisticsVO implements Serializable { + + private static final long serialVersionUID = -4514149323953101569L; + + /** + * 设备总数量 + */ + private Integer total; + + /** + * 总的在线率 + */ + private String overallOnlineRate; + + /** + * 子对象列表 + */ + private List subList; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceUnderPointVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceUnderPointVO.java new file mode 100644 index 0000000..778e907 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DeviceUnderPointVO.java @@ -0,0 +1,29 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 资源点下的设备统计信息 + */ +@Data +public class DeviceUnderPointVO implements Serializable { + + private static final long serialVersionUID = -3210088644519804874L; + + /** + * 设备总数 + */ + private Integer totalNum = 0; + + /** + * 在线设备数 + */ + private Integer onlineNum = 0; + + /** + * 离线设备数 + */ + private Integer offlineNum = 0; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DroneTaskPlanVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DroneTaskPlanVO.java new file mode 100644 index 0000000..49c56e3 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DroneTaskPlanVO.java @@ -0,0 +1,80 @@ +package com.tcctyn.iot.forestfire.VO; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 无人机任务返回给前端的VO + */ +@Data +public class DroneTaskPlanVO implements Serializable { + + private static final long serialVersionUID = -4331918313693391285L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 无人机编号 + */ + private String droneNo; + + /** + * 任务区域 + */ + private Long regionId; + + /** + * 任务名称 + */ + private String taskName; + + /** + * 任务类型:周期性任务、单次性任务 + */ + private String taskType; + + /** + * 单次任务标识:0-非单次任务;1-单次任务 + */ + private Integer singleTaskFlag; + + /** + * 执行周期:每多少天执行一次 + */ + private String executionCycle; + + /** + * 任务状态:未执行、执行中、已完成 + */ + private String taskStatus; + + /** + * 开始时间 + */ + private Date startTime; + + /** + * 结束时间 + */ + private Date endTime; + + /** + * 任务航线:可以暂时存放经纬度信息,给前端提供模拟的航线 + */ + private String taskRoute; + + //下面是VO展示的字段 + + /** + * 任务区域名称 + */ + private String regionName; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DroneVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DroneVO.java new file mode 100644 index 0000000..97eea95 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/DroneVO.java @@ -0,0 +1,89 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 机场下的无人机列表 + */ +@Data +public class DroneVO implements Serializable { + + private static final long serialVersionUID = 628168140318152935L; + + /** + * 主键id + */ + private Long id; + + /** + * 设备编号 + */ + private String deviceNo; + + /** + * 设备名称 + */ + private String deviceName; + + /** + * 设备型号 + */ + private String deviceModel; + + /** + * 设备厂商 + */ + private String deviceManufacturer; + + /** + * 设备协议 + */ + private String deviceProtocol; + + /** + * 接入方式 + */ + private String accessMethod; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 设备状态:在线/离线 + */ + private String deviceStatus; + + /** + * 归属区域id,机场需要挂在地区下面 + */ + private Long regionId; + + /** + * 机场id + */ + private Long airportId; + + /** + * 设备启用状态:0-停用/1-启用 + */ + private Integer enableFlag; + + /** + * 备注信息 + */ + private String remark; + + /** + * 归属地区名称 + */ + private String regionName; + + /** + * 归属机场名称 + */ + private String airportName; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireReportStatisticsVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireReportStatisticsVO.java new file mode 100644 index 0000000..07476c1 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireReportStatisticsVO.java @@ -0,0 +1,39 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 历史火情统计信息VO + */ +@Data +public class FireReportStatisticsVO implements Serializable { + + private static final long serialVersionUID = -5474081569984902993L; + + /** + * 总的火灾数量 + */ + private Integer totalNum; + + /** + * 一般火灾数量 + */ + private Integer generalFireNum; + + /** + * 较大火灾 + */ + private Integer majorFireNum; + + /** + * 重大火灾 + */ + private Integer seriousFireNum; + + /** + * 特别重大火灾 + */ + private Integer especiallySeriousFireNum; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireReportVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireReportVO.java new file mode 100644 index 0000000..23ba51a --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireReportVO.java @@ -0,0 +1,200 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 火情上报VO + */ +@Data +public class FireReportVO implements Serializable { + + private static final long serialVersionUID = 7460119250284631833L; + + /** + * 主键id + */ + private Long id; + + /** + * 火情标题 + */ + private String fireTitle; + + /** + * 上报方式:卫星上报、无人机上报、人工上报、监测点(云台/卡口)上报 + */ + private String reportMethod; + + /** + * 来源火情预警id + */ + private Long fireWarningId; + + /** + * 上报设备编号 + */ + private String deviceNo; + + /** + * 上报设备类型 + */ + private String deviceType; + + /** + * 上报人员id + */ + private Long reporterId; + + /** + * 地址 + */ + + private String address; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 高度 + */ + private String height; + + /** + * 归属区域id + */ + private Long regionId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 火险等级,有别于火情预警等级 + */ + private String fireHazardLevel; + + /** + * 起火原因 + */ + private String fireCause; + + /** + * 失火面积 + */ + private String fireArea; + + /** + * 预计损失金额 + */ + private String amountLoss; + + /** + * 火情图片 + */ + private String firePicture; + + /** + * 火情描述 + */ + private String fireDescription; + + /** + * 处置状态:未处理、已处理 + */ + private Integer disposalStatus; + + /** + * 处置说明 + */ + private String disposalInstruction; + + /** + * 扑救情况 + */ + private String firefightingSituation; + + /** + * 灾后情况说明 + */ + private String disasterSituation; + + /** + * 扑救单位 + */ + private String firefightingUnit; + + /** + * 主要负责人 + */ + private String personInCharge; + + /** + * 归档状态 + */ + private Integer archiveStatus; + + /** + * 归档时间 + */ + private Date archiveTime; + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + private Date updatedTime; + + // 以下为给前端展示的字段 + + /** 上报人姓名 */ + private String reporterName; + + /** 地区名称 */ + private String regionName; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireWarningCountByLevelVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireWarningCountByLevelVO.java new file mode 100644 index 0000000..3357ff1 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireWarningCountByLevelVO.java @@ -0,0 +1,24 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 根据火情等级进行统计 + */ +@Data +public class FireWarningCountByLevelVO implements Serializable { + + private static final long serialVersionUID = 8301796932960031829L; + + /** + * 火情等级 + */ + private String fireLevel; + + /** + * 数量 + */ + private Integer number; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireWarningCountByStatusVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireWarningCountByStatusVO.java new file mode 100644 index 0000000..739fa7c --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireWarningCountByStatusVO.java @@ -0,0 +1,26 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class FireWarningCountByStatusVO implements Serializable { + + private static final long serialVersionUID = 97763231488523638L; + + + /** + * 已处理数量 + */ + private Integer unhandledNum; + + /** 已上报数量 */ + private Integer reportedNum; + + /** 已研判数量 */ + private Integer analyzedNum; + + /** 已归档数量 */ + private Integer archivedNum; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireWarningInfoVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireWarningInfoVO.java new file mode 100644 index 0000000..138601d --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireWarningInfoVO.java @@ -0,0 +1,145 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 火情信息VO + */ +@Data +public class FireWarningInfoVO implements Serializable { + + private static final long serialVersionUID = 8848812242542233067L; + + /** + * 主键id + */ + private Long id; + + /** + * 发现火情设备编号 + */ + private String deviceNo; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 地址 + */ + private String address; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 高度 + */ + private String height; + + /** + * 所属区域id + */ + private Long regionId; + + /** + * 区域名称 + */ + private String regionName; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 火情标题 + */ + private String fireTitle; + + /** + * 火情级别 + */ + private String fireLevel; + + /** + * 起火原因 + */ + private String fireCause; + + /** + * 处置状态:未处理、已研判、已上报、已归档 + */ + private String disposalStatus; + + /** + * 研判结果说明 + */ + private String analyzeInstruction; + + /** + * 处置人 + */ + private Long disposalBy; + + /** + * 处置人姓名 + */ + private String disposalByName; + + /** + * 处置时间 + */ + private Date disposalTime; + + /** + * 失火面积 + */ + private String fireArea; + + /** + * 损失金额 + */ + private String amountDamage; + + /** + * 火情图片 + */ + private String firePicture; + + /** + * 火情预警数据来源 + */ + private String dataSource; + + /** + * 备注信息 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createdTime; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireWarningStatisticsByDataSourceVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireWarningStatisticsByDataSourceVO.java new file mode 100644 index 0000000..e07be41 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireWarningStatisticsByDataSourceVO.java @@ -0,0 +1,29 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 火情预警信息来源统计 + */ +@Data +public class FireWarningStatisticsByDataSourceVO implements Serializable { + + private static final long serialVersionUID = -2324434962571875389L; + + /** + * 卫星热点 + */ + private Integer satelliteHotspotNum; + + /** + * 视频监控 + */ + private Integer videoMonitorNum; + + /** + * 巡护上报 + */ + private Integer patrolReportNum; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireWarningSurroundingVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireWarningSurroundingVO.java new file mode 100644 index 0000000..6f2728f --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/FireWarningSurroundingVO.java @@ -0,0 +1,42 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 火情预警周边分析VO + */ + +@Data +public class FireWarningSurroundingVO implements Serializable { + + private static final long serialVersionUID = -1610177596913751767L; + + /** + * 负责单位,可以是人,也可以是企业 + */ + private String belongingUnit; + + /** + * 负责单位联系电话 + */ + private String unitTel; + + /** + * 护林员信息 + */ + private List personVOList; + + /** + * 仓库信息 + */ + private List wareHouseVOList; + + /** + * 水源地信息 + */ + private List waterSourceVOList; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ForesterStatisticsVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ForesterStatisticsVO.java new file mode 100644 index 0000000..9165c1a --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ForesterStatisticsVO.java @@ -0,0 +1,22 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +/** + * 大屏页面护林员统计数据 + */ +@Data +public class ForesterStatisticsVO { + + // 当日值班人数 + private Integer todayDutyNum; + + // 当日打卡数 + private Integer todayCheckNum; + + // 当日总共打卡数 + private Integer totalCheckNum; + + // 临时任务数 + private Integer tempTaskNum; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/HkStoreCapturePicturesVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/HkStoreCapturePicturesVO.java new file mode 100644 index 0000000..4d4f6e4 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/HkStoreCapturePicturesVO.java @@ -0,0 +1,90 @@ +package com.tcctyn.iot.forestfire.VO; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 海康_硬件抓拍图片元数据表 + * @author 13768238378 + * @TableName hk_store_capture_pictures + */ + +@Data +public class HkStoreCapturePicturesVO implements Serializable { + /** + * 主键ID + */ +// @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * MinIO存储桶名称(符合MinIO命名规范) + */ + private String bucket; + + /** + * MinIO对象唯一路径(如: images/user/2023/10/photo.jpg) + */ + private String objectKey; + + /** + * 原始文件名 + */ + private String originalName; + + /** + * 上传用户ID + */ + private Long userId; + + /** + * 文件大小(字节) + */ + private Long fileSize; + + /** + * 文件MIME类型(如image/jpeg) + */ + private String fileType; + + /** + * 文件MD5哈希(用于去重校验) + */ + private String md5; + + /** + * 是否公开(0-私有,1-公开) + */ + private Integer isPublic; + + /** + * 软删除标记(0-未删除,1-已删除) + */ + private Integer isDeleted; + + /** + * 上传时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createdAt; + + /** + * 更新时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updatedAt; + /** + * 设备id + */ + private String deviceId; + /** + * 访问路径 + */ + private String accessPath; + + private static final long serialVersionUID = 1L; + +} \ No newline at end of file diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/InventoryVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/InventoryVO.java new file mode 100644 index 0000000..b3260bf --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/InventoryVO.java @@ -0,0 +1,87 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 库存记录 + */ +@Data +public class InventoryVO { + /** + * 库存id + */ + private Long inventoryId; + + /** + * 仓库id + */ + private Long warehouseId; + + /** + * 物资id + */ + private Long materialId; + + /** + * 用户id + */ + private Long userId; + + /** + * 入库/出库 + */ + private Integer inventoryType; + + /** + * 物资名称 + */ + private String materialName; + + /** + * 规格 + */ + private String unit; + + /** + * 数量 + */ + private BigDecimal quantity; + + /** + * 物资类型 + */ + private Integer materialType; + + /** + * 备注 + */ + private String description; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 仓库名 + */ + private String warehouseName; + + /** + * 用户名 + */ + private String userName; + + /** + * 仓库林场id + */ + private Long regionId; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/KeyAreaInfoVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/KeyAreaInfoVO.java new file mode 100644 index 0000000..4c63048 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/KeyAreaInfoVO.java @@ -0,0 +1,64 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class KeyAreaInfoVO implements Serializable { + + private static final long serialVersionUID = -5540262582633590948L; + + /** + * 主键id + */ + private Long id; + + /** + * 归属区域id + */ + private Long regionId; + + /** + * 开始时间,以天为单位 + */ + private Date startTime; + + /** + * 结束时间,以天为单位 + */ + private Date endTime; + + /** + * 重点区域类型,数据字典 + */ + private String keyAreaType; + + /** + * 区域坐标信息 + */ + private String coordinateInfo; + + /** + * 区域说明 + */ + private String regionDescription; + + /** + * 区域图片 + */ + private String picture; + + /** + * 记录创建时间,默认用服务器时间 + */ + private Date createdTime; + + //以下是给前端显示用的字段 + + /** + * 归属区域名称 + */ + private String regionName; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/LeaveRecordVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/LeaveRecordVO.java new file mode 100644 index 0000000..f68ba97 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/LeaveRecordVO.java @@ -0,0 +1,126 @@ +package com.tcctyn.iot.forestfire.VO; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 请假记录返给前端VO + */ +@Data +public class LeaveRecordVO implements Serializable { + + private static final long serialVersionUID = -1916751239764842177L; + + /** + * 主键id + */ + private Long id; + + /** + * 请假人id + */ + private Long userId; + + /** + * 请假人部门id + */ + private Long deptId; + + /** + * 请假类型 + */ + private String leaveType; + + /** + * 开始时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date startTime; + + /** + * 结束时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date endTime; + + /** + * 请假时长,单位小时 + */ + private String leaveDuration; + + /** + * 请假说明 + */ + private String leaveInstruction; + + /** + * 图片 + */ + private String picture; + + /** + * 撤销标识:0-未撤销,1-已撤销 + */ + private Integer revokeFlag; + + /** + * 撤销时间 + */ + private Date revokeTime; + + /** + * 审批标识:0-未审批,1-已审批 + */ + private Integer approvalFlag; + + /** + * 审批状态:0-驳回,1-通过 + */ + private Integer approvalStatus; + + /** + * 驳回说明 + */ + private String rejectionStatement; + + /** + * 审核人id + */ + private Long reviewerId; + + /** + * 审核时间 + */ + private Date reviewTime; + + /** + * 备注信息 + */ + private String remark; + + /** + * 记录创建时间,默认用服务器时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createdTime; + + //以下是VO 做的映射字段 + + /** + * 请假人姓名 + */ + private String userName; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 审批人姓名 + */ + private String reviewerName; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/MaterialStatisticsVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/MaterialStatisticsVO.java new file mode 100644 index 0000000..796a9e8 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/MaterialStatisticsVO.java @@ -0,0 +1,19 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +/** + * 物资统计 + */ +@Data +public class MaterialStatisticsVO { + + private Long warehouseId; + + // 物资类型 + private Integer materialType; + + // 物资数量 + private Integer materialNum; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/MaterialVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/MaterialVO.java new file mode 100644 index 0000000..1be6f02 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/MaterialVO.java @@ -0,0 +1,87 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.util.Date; + +/** + * 物资信息 + */ +@Data +public class MaterialVO { + + /** + * 物资ID + */ + private Long materialId; + + /** + * 仓库id + */ + private Long warehouseId; + + /** + * 编号 + */ + private String serialNumber; + + /** + * 物资名称 + */ + private String materialName; + + /** + * 型号 + */ + private String model; + + /** + * 单位 + */ + private String unit; + + /** + * 库存 + */ + private String stock; + + /** + * 物资类型 + */ + private Integer materialType; + + /** + * 照片 + */ + private String photo; + + /** + * 描述 + */ + private String description; + + /** + * 删除标志 + */ + private Integer delFlag; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 仓库名称 + */ + private String warehouseName; + + /** + * 仓库林场id + */ + private Long regionId; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/NoticeInfoVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/NoticeInfoVO.java new file mode 100644 index 0000000..0707fea --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/NoticeInfoVO.java @@ -0,0 +1,57 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 通知公告VO + */ +@Data +public class NoticeInfoVO implements Serializable { + + private static final long serialVersionUID = -4931397249912148775L; + + + /** + * 主键id + */ + private Long id; + + /** + * 类型:通知、公告 + */ + private String type; + + /** + * 标题 + */ + private String title; + + /** + * 内容 + */ + private String content; + + /** + * 文件 + */ + private String file; + + /** + * 序号 + */ + private Integer sortNo; + + /** + * 是否启用:0-停用,1-启用 + */ + private Integer enableFlag; + + /** + * 记录创建时间,默认用服务器时间 + */ + private Date createdTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/PatrolPathVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/PatrolPathVO.java new file mode 100644 index 0000000..a5f6281 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/PatrolPathVO.java @@ -0,0 +1,70 @@ +package com.tcctyn.iot.forestfire.VO; + +import com.tcctyn.iot.forestfire.BO.PointInfoBO; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 巡护路径前端展示对象 + */ +@Data +public class PatrolPathVO implements Serializable { + + private static final long serialVersionUID = -549172295504736627L; + + /** + * 主键id + */ + private Long id; + + /** + * 路径编号 + */ +// @NotBlank(message = "路径编号不能为空") + private String pathNo; + + /** + * 路径名称 + */ + private String pathName; + + /** + * 归属区域id,取林区、林场、电子围栏中的最下级id + */ + private Long BelongingRegionId; + + /** + * 归属区域名称,由林区、林场、电子围栏名称拼起来展示 + */ + private String belongingRegionName; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 路径简介 + */ + private String pathIntroduction; + + /** + * 路径坐标信息 + */ + private List pointList; + + + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/PointAndDeviceInfoVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/PointAndDeviceInfoVO.java new file mode 100644 index 0000000..8054603 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/PointAndDeviceInfoVO.java @@ -0,0 +1,120 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 查询云台、卡口及云台、卡口下的设备信息 + */ +@Data +public class PointAndDeviceInfoVO implements Serializable { + + private static final long serialVersionUID = 2725406706265029262L; + + /** + * 主键id + */ + private Long id; + + /** + * 点位编号 + */ + private String pointNo; + + /** + * 点位名称 + */ + private String pointName; + + /** + * 行政区划 + */ + private String administrativeDivision; + + /** + * 归属地区id + */ + private Long belongingRegionId; + + /** + * 归属地区名称 + */ + private String belongingRegionName; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 详细地址 + */ + private String address; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 高度 + */ + private String height; + + /** + * 点位类型:云台、卡口、打卡点、巡护点 + */ + private String pointType; + + /** + * 点位顺序 + */ + private Integer sortNo; + + /** + * 打卡半径,单位:米 + */ + private String checkInRadius; + + /** + * 点位描述信息 + */ + private String pointDescription; + + /** + * 点位图片,多张以英文逗号分隔 + */ + private String pointPicture; + + /** + * 备注信息 + */ + private String remark; + + /** + * 云台、卡口下的设备 + */ + private List deviceInfoList; + + /** + * 启用状态:0-停用/1-启用 + */ + private Integer enableFlag; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/PointInfoVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/PointInfoVO.java new file mode 100644 index 0000000..e91948e --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/PointInfoVO.java @@ -0,0 +1,119 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 点位信息VO + */ +@Data +public class PointInfoVO implements Serializable { + + private static final long serialVersionUID = -549172295504736627L; + + /** + * 主键id + */ + private Long id; + + /** + * 点位编号 + */ + private String pointNo; + + /** + * 点位名称 + */ + private String pointName; + + /** + * 行政区划 + */ + private String administrativeDivision; + + /** + * 归属地区id + */ + private Long belongingRegionId; + + /** + * 归属地区名称 + */ + private String belongingRegionName; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 详细地址 + */ + private String address; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 高度 + */ + private String height; + + /** + * 点位类型:云台、卡口、打卡点、巡护点 + */ + private String pointType; + + /** + * 点位顺序 + */ + private Integer sortNo; + + /** + * 打卡半径,单位:米 + */ + private String checkInRadius; + + /** + * 点位描述信息 + */ + private String pointDescription; + + /** + * 设备启用状态:0-停用/1-启用 + */ + private Integer enableFlag;//sgq2025.3.20 + + /** + * 点位图片,多张以英文逗号分隔 + */ + private String pointPicture; + + /** + * 备注信息 + */ + private String remark; + + /** + * 点位下的设备信息统计:设备总数量、在线设备数、离线设备数 + */ + private DeviceUnderPointVO deviceUnderPointVO; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/PointStatisticsByPointTypeVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/PointStatisticsByPointTypeVO.java new file mode 100644 index 0000000..d2a035d --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/PointStatisticsByPointTypeVO.java @@ -0,0 +1,35 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 资源点分类统计VO + * 水源地、云台、卡口 + */ +@Data +public class PointStatisticsByPointTypeVO implements Serializable { + + private static final long serialVersionUID = -5379278903366385082L; + + /** + * 资源点总数 + */ + private Integer totalNum; + + /** + * 水源地数量 + */ + private Integer waterSourceNum; + + /** + * 云台数量 + */ + private Integer ptzNum; + + /** + * 卡口 + */ + private Integer bayonetNum; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/RangerInfoVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/RangerInfoVO.java new file mode 100644 index 0000000..0e936b4 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/RangerInfoVO.java @@ -0,0 +1,55 @@ +package com.tcctyn.iot.forestfire.VO; + +import com.tcctyn.iot.forestfire.BO.PointInfoBO; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * RangersInfoVO + * 大屏查询人员信息按钮 + */ +@Data +public class RangerInfoVO implements Serializable { + + private static final long serialVersionUID = 7787371089658488280L; + + /** 人员id */ + private Long userId; + + /** 人员姓名,此处的用户名用的是用户表中的nick_name */ + private String userName; + + /** 人员手机号码 */ + private String phonenumber; + + /** 当前经度 */ + private String currentLongitude; + + /** 当前纬度 */ + private String currentLatitude; + + /** 当前高度 */ + private String currentHeight; + + /** 默认经度 */ + private String defaultLongitude; + + /** 默认纬度 */ + private String defaultLatitude; + + /** 默认高度 */ + private String defaultHeight; + + /** 巡护路径id */ + private Long pathId; + + /** 巡护路径名称 */ + private String pathName; + + /** + * 巡护点信息集合 + */ + private List pointInfoList; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/RangerStatisticsVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/RangerStatisticsVO.java new file mode 100644 index 0000000..eb2fe6b --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/RangerStatisticsVO.java @@ -0,0 +1,34 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 护林员及巡护点统计信息 + */ +@Data +public class RangerStatisticsVO implements Serializable { + + private static final long serialVersionUID = 7250371270471160395L; + + /** + * 排班人员数量 + */ + private Integer schedulingNum = 0; + + /** + * 打卡人员数量 + */ + private Integer checkInNum = 0; + + /** + * 当日排班下的所有巡护点位数量,根据巡护路径进行统计 + */ + private Integer patrolPointNum = 0; + + /** + * 已打卡点位数量 + */ + private Integer checkInPointNum = 0; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/RoadInfoVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/RoadInfoVO.java new file mode 100644 index 0000000..e252056 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/RoadInfoVO.java @@ -0,0 +1,90 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +@Data +public class RoadInfoVO { + private static final long serialVersionUID = 7787371089658488280L; + + /** + * 主键id + */ + private Long id; + + /** + * 详细地址 + */ + private String address; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 高度 + */ + private String height; + + /** + * 特征类型:陡坡、急转弯等 + */ + private String featureType; + + /** + * 排序 + */ + private Integer sortNo; + + /** + * 特征值 + */ + private String featureValue; + + /** + * 归属地区id + */ + private Long belongingRegionId; + + /** + * 归属地区名称 + */ + private String belongingRegionName; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 宽度 + */ + private String width; + + /** + * 点位图片,多张以英文逗号分隔 + */ + private String roadPicture; + + /** + * 备注信息 + */ + private String remark; + + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/RoadVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/RoadVO.java new file mode 100644 index 0000000..2600cef --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/RoadVO.java @@ -0,0 +1,76 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.util.List; + +@Data +public class RoadVO { + private static final long serialVersionUID = 7787371089658488280L; + + /** + * 主键id + */ + private Long id; + + /** + * 道路编号 + */ + private String roadNo; + + /** + * 道路名称 + */ + private String roadName; + + /** + * 道路类型 + */ + private String roadType; + + /** + * 长度 + */ + private String length; + + /** + * 宽度 + */ + private String width; + + /** + * 归属地区id + */ + private Long belongingRegionId; + + /** + * 归属地区名称 + */ + private String belongingRegionName; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 备注信息 + */ + private String remark; + + /** + * 道路特征信息 + */ + private List roadInfoList; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ScheduleDetail.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ScheduleDetail.java new file mode 100644 index 0000000..0d37a9f --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ScheduleDetail.java @@ -0,0 +1,27 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +@Data +public class ScheduleDetail { + + private Long scheduleId; + + private Long userId; + + private String userName; + + private Long shiftId; + + private String shiftName; + + private Long pathId; + + private String pathName; + + private Integer dayOfWeek; + + private String dateOfWeek; + + private String userIds; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ScheduleDetailInfoVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ScheduleDetailInfoVO.java new file mode 100644 index 0000000..636303e --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ScheduleDetailInfoVO.java @@ -0,0 +1,48 @@ +package com.tcctyn.iot.forestfire.VO; + +import com.tcctyn.iot.forestfire.BO.PointInfoBO; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +public class ScheduleDetailInfoVO implements Serializable { + + private static final long serialVersionUID = -8695050741531564485L; + /** + * 排班id + */ + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 用户名称 + */ + private String userName; + + /** + * 路线ID + */ + private Long pathId; + + /** + * 路径名称 + */ + private String pathName; + + /** + * 日期 + */ + private Date dateOfWeek; + + /** + * 路径下的点位信息 + */ + private List pointInfoBOList; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/SchedulePlanVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/SchedulePlanVO.java new file mode 100644 index 0000000..b8dbe00 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/SchedulePlanVO.java @@ -0,0 +1,71 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.util.Date; + +/** + * 排班计划视图 + */ +@Data +public class SchedulePlanVO { + + private Long planId; + + private Long belongingRegionId; + + /** + * 林区ID + */ + private Long forestId; + + /** + * 林场ID + */ + private Long farmId; + + /** + * 电子围栏ID + */ + private Long fenceId; + + /** + * 区域名称 + */ + private String regionName; + + /** + * 计划名称 + */ + private String planName; + + /** + * 生效时期 + */ + private String period; + + /** + * 开始日期 + */ + private Date startDate; + + /** + * 结束日期 + */ + private Date endDate; + + /** + * 描述信息 + */ + private String description; + + /** + * 生成标志 + */ + private Integer genFlag; + + /** + * 状态 + */ + private Integer status; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ScheduleTemplateVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ScheduleTemplateVO.java new file mode 100644 index 0000000..5593177 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ScheduleTemplateVO.java @@ -0,0 +1,58 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +/** + * 排班模板视图 + */ +@Data +public class ScheduleTemplateVO { + private Long templateId; + + private Long planId; + + /** + * 巡护路径id + */ + private Long pathId; + + /** + * 巡护路径名称 + */ + private String pathName; + + /** + * 周一 + */ + private String monUsers; + + /** + * 周二 + */ + private String tueUsers; + + /** + * 周三 + */ + private String wedUsers; + + /** + * 周四 + */ + private String thurUsers; + + /** + * 周五 + */ + private String friUsers; + + /** + * 周六 + */ + private String satUsers; + + /** + * 周日 + */ + private String sunUsers; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ScheduleVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ScheduleVO.java new file mode 100644 index 0000000..1561bc5 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/ScheduleVO.java @@ -0,0 +1,65 @@ +package com.tcctyn.iot.forestfire.VO; + +import com.tcctyn.iot.forestfire.BO.PointInfoBO; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * 排班信息 + */ +@Data +public class ScheduleVO { + + private Long scheduleId; + + //计划id + private Long planId; + + //计划名称 + private String planName; + + private Long userId; + + private String userName; + + private Long shiftId; + + private String shiftName; + + //路线id + private Long pathId; + + //路线名称 + private String pathName; + + //星期几 + private Integer dayOfWeek; + + //日期 + private Date dateOfWeek; + + //状态 + private Integer status; + + //是否调班 + private Integer swapFlag; + + private String description; + + //今日打卡次数 + private Integer checkTimes; + + //今日总共需要打卡次数 + private Integer totalTimes; + + /** + * 巡护进度 + */ + private String patrolRate; + + /** 巡护路径下的点位信息 */ + private List pointInfoBOList; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/SchedulesMonthVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/SchedulesMonthVO.java new file mode 100644 index 0000000..7128773 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/SchedulesMonthVO.java @@ -0,0 +1,49 @@ +package com.tcctyn.iot.forestfire.VO; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * APP端按月查询排班统计信息 + */ +@Data +public class SchedulesMonthVO implements Serializable { + + private static final long serialVersionUID = 916206382963862542L; + + /** + * 排班id + */ + private Long scheduleId; + + /** + * 用户id + */ + private Long userId; + + /** + * 日期 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date dateOfWeek; + + /** + * 有效打卡次数 + */ + private Integer checkTimes; + + /** + * 应打卡次数 + */ + private Integer totalTimes; + + /** + * 巡护进度(打卡率) + */ + private String patrolRate; + + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/SurroundingPersonVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/SurroundingPersonVO.java new file mode 100644 index 0000000..48cde49 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/SurroundingPersonVO.java @@ -0,0 +1,38 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 周边的人员信息 + */ + +@Data +public class SurroundingPersonVO implements Serializable { + + private static final long serialVersionUID = -1167425127266968144L; + + /** + * 人员id + */ + private Long userId; + + /** + * 人员姓名 + */ + private String userName; + + /** 手机号码 */ + private String phonenumber; + + /** + * 经度 + */ + private String latitude; + + /** + * 纬度 + */ + private String longitude; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/SurroundingWareHouseVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/SurroundingWareHouseVO.java new file mode 100644 index 0000000..a75cdd5 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/SurroundingWareHouseVO.java @@ -0,0 +1,35 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 周边仓库信息 + */ + +@Data +public class SurroundingWareHouseVO implements Serializable { + + private static final long serialVersionUID = 757447018163710380L; + + /** + * 仓库id + */ + private Long wareHouseId; + + /** + * 仓库名称 + */ + private String wareHouseName; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/SurroundingWaterSourceVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/SurroundingWaterSourceVO.java new file mode 100644 index 0000000..d7cf959 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/SurroundingWaterSourceVO.java @@ -0,0 +1,35 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 周边的水源地信息 + */ + +@Data +public class SurroundingWaterSourceVO implements Serializable { + + private static final long serialVersionUID = 1529035326670890953L; + + /** + * 水源地id + */ + private Long waterSourceId; + + /** + * 水源地名称 + */ + private String waterSourceName; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/TemporaryTaskVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/TemporaryTaskVO.java new file mode 100644 index 0000000..da83e68 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/TemporaryTaskVO.java @@ -0,0 +1,153 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 临时任务VO + */ +@Data +public class TemporaryTaskVO implements Serializable { + + private static final long serialVersionUID = -3353366940206999822L; + + /** + * 主键id + */ + private Long id; + + /** + * 任务名称 + */ + private String taskName; + + /** + * 任务类型,火情勘测、物资运输、火情救援、其他,数据字典 + */ + private String taskType; + + /** + * 任务紧急度:一般、重要、紧急, 枚举 + */ + private String taskUrgency; + + /** + * 归属区域id + */ + private Long regionId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 任务人 + */ + private Long taskPersonId; + + /** + * 任务下发人id + */ + private Long issuerId; + + /** + * 任务下发时间 + */ + private Date issueTime; + + /** + * 任务内容 + */ + private String taskContent; + + /** + * 任务状态,未接受,执行中,已完成 + */ + private String taskStatus; + + /** + * 任务接受人 + */ + private Long taskRecipientId; + + /** + * 任务接受时间 + */ + private Date acceptTime; + + /** + * 任务完成时间 + */ + private Date completeTime; + + /** + * 任务归档情况:1-已归档,0-未归档 + */ + private Integer archiveStatus; + + /** + * 任务归档时间 + */ + private Date archiveTime; + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + private Date updatedTime; + + //以下字段是VO给前端的字段 + + /** + * 归属区域名称 + */ + private String regionName; + + /** + * 任务人姓名 + */ + private String taskPersonName; + + /** + * 任务接受人姓名 + */ + private String taskRecipientName; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/UserScheduleStatusVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/UserScheduleStatusVO.java new file mode 100644 index 0000000..961b063 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/UserScheduleStatusVO.java @@ -0,0 +1,23 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +/** + * 用户值班状态 + */ +@Data +public class UserScheduleStatusVO { + + private Long userId; + + private Long regionId; + + private String userName; + + private String nickName; + + private Long scheduleId; + + private Integer scheduleStatus; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/WarehouseSelectVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/WarehouseSelectVO.java new file mode 100644 index 0000000..f823373 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/WarehouseSelectVO.java @@ -0,0 +1,26 @@ +package com.tcctyn.iot.forestfire.VO; + + +import lombok.Data; + +/** + * 前端选择器仓库信息 + */ +@Data +public class WarehouseSelectVO { + + private Long warehouseId; + + private String warehouseName; + + // 经度 + private String longitude; + + // 纬度 + private String latitude; + + /** + * 高度 + */ + private String height; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/WarehouseVO.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/WarehouseVO.java new file mode 100644 index 0000000..e040e32 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/VO/WarehouseVO.java @@ -0,0 +1,102 @@ +package com.tcctyn.iot.forestfire.VO; + +import lombok.Data; + +import java.util.Date; + +/** + * 仓库信息 + */ +@Data +public class WarehouseVO { + + /** + * 仓库ID + */ + private Long warehouseId; + + /** + * 归属区域ID + */ + private Long regionId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 仓库名称 + */ + private String warehouseName; + + /** + * 仓库类型 + */ + private Integer warehouseType; + + /** + * 纬度 + */ + private String latitude; + + /** + * 经度 + */ + private String longitude; + + /** + * 高度 + */ + private String height; + + /** + * 地址 + */ + private String address; + + /** + * 所属地区 + */ + private String region; + + /** + * 照片 + */ + private String photo; + + /** + * 备注 + */ + private String remark; + + /** + * 删除标志 + */ + private Integer delFlag; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 所属林区林场名称 + */ + private String regionName; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/AggregationController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/AggregationController.java new file mode 100644 index 0000000..87c2261 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/AggregationController.java @@ -0,0 +1,39 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.iot.forestfire.VO.AggregationStatisticsVO; +import com.tcctyn.iot.forestfire.searcher.aggregation.AggregationStatisticsSearcher; +import com.tcctyn.iot.forestfire.service.IAggregationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 聚合类的接口统一放到这里 + */ + +@RestController +@RequestMapping("/aggregation") +public class AggregationController extends BaseController { + + @Autowired + private IAggregationService iAggregationService; + + /** + * APP端用户登录后的聚合统计接口: + * 1、未处理的火情预警数量 + * 2、未处理的火情上报数量 + * 3、我的任务模块 未接受的任务数量 + * 4、未审批的记录数 + * 5、林区任务 未接受的任务数量 + */ + @GetMapping("/statistics") + public AjaxResult statistics(AggregationStatisticsSearcher searcher) { + Long userId = super.getUserId(); + AggregationStatisticsVO vo = iAggregationService.statistics(searcher, userId); + return AjaxResult.success(vo); + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/ApprovalRecordController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/ApprovalRecordController.java new file mode 100644 index 0000000..bccef6c --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/ApprovalRecordController.java @@ -0,0 +1,121 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.ApprovalRecordVO; +import com.tcctyn.iot.forestfire.domain.ApprovalRecord; +import com.tcctyn.iot.forestfire.searcher.approvalrecord.ApprovalRecordRejectRequest; +import com.tcctyn.iot.forestfire.service.IApprovalRecordService; +import com.tcctyn.iot.forestfire.service.ICommonService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + *

+ * 审批记录表 前端控制器 + *

+ * + * @author daichao + * @since 2024-12-09 + */ + + +@RestController +@RequestMapping("/approvalRecord") +public class ApprovalRecordController extends BaseController { + + + @Autowired + private IApprovalRecordService iApprovalRecordService; + + @Autowired + private ICommonService commonService; + + @GetMapping(value = "/list") + public AjaxResult list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer size) { + if (current == null) { + current = 1; + } + if (size == null) { + size = 10; + } + Page pageList = iApprovalRecordService.list(current, size); + return AjaxResult.success(pageList); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + ApprovalRecord approvalRecord = iApprovalRecordService.getById(id); + ApprovalRecordVO approvalRecordVO = new ApprovalRecordVO(); + BeanUtils.copyBeanProp(approvalRecord, approvalRecordVO); + Map userIdToNameMap = commonService.userMapIdToName(approvalRecordVO.getReviewerId()); + approvalRecordVO.setReviewerName(Optional.ofNullable(userIdToNameMap.get(approvalRecordVO.getReviewerId())).orElse("")); + return AjaxResult.success(approvalRecordVO); + } + + @PostMapping(value = "/create") + public AjaxResult create(@RequestBody ApprovalRecord params) { + Integer result = iApprovalRecordService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iApprovalRecordService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@RequestBody ApprovalRecord params) { + Integer result = iApprovalRecordService.update(params); + return AjaxResult.success(result); + } + + /** + * 审批记录分页查询 + * + * @param approvalRecord + * @return + */ + @GetMapping(value = "/selectList") + public TableDataInfo selectList(ApprovalRecord approvalRecord) { + startPage(); + List list = iApprovalRecordService.selectList(approvalRecord); + List voList = BeanUtils.copyList(list, ApprovalRecordVO.class); + //映射给前端需要的审批人姓名 + Map userIdToNameMap = commonService.userMapIdToName(null); + voList.forEach(item -> item.setReviewerName(Optional.ofNullable(userIdToNameMap.get(item.getReviewerId())).orElse(""))); + return getDataTable(list, voList); + } + + /** + * 审批通过接口 + * + * @param id + * @return + */ + @PostMapping(value = "/approved/{id}") + public AjaxResult approved(@PathVariable("id") Long id) { +// Long userId = 1L; + Long userId = super.getUserId(); + Integer result = iApprovalRecordService.approved(id, userId); + return AjaxResult.success(result); + } + + @PostMapping(value = "/reject") + public AjaxResult reject(@Validated @RequestBody ApprovalRecordRejectRequest request) { +// Long userId = 1L; + Long userId = super.getUserId(); + Integer result = iApprovalRecordService.reject(request, userId); + return AjaxResult.success(result); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/CarouselImageConfigController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/CarouselImageConfigController.java new file mode 100644 index 0000000..a95c7e8 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/CarouselImageConfigController.java @@ -0,0 +1,110 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.CarouselImageConfigVO; +import com.tcctyn.iot.forestfire.domain.CarouselImageConfig; +import com.tcctyn.iot.forestfire.searcher.carouselimageconfig.CarouselImageEnableFlagRequest; +import com.tcctyn.iot.forestfire.service.ICarouselImageConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + *

+ * 轮播图配置表 前端控制器 + *

+ * + * @author daichao + * @since 2024-12-17 + */ + +@RestController +@RequestMapping("/carouselImageConfig") +public class CarouselImageConfigController extends BaseController { + + + @Autowired + private ICarouselImageConfigService iCarouselImageConfigService; + + @GetMapping(value = "/list") + public AjaxResult list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer size) { + if (current == null) { + current = 1; + } + if (size == null) { + size = 10; + } + Page pageList = iCarouselImageConfigService.list(current, size); + return AjaxResult.success(pageList); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + CarouselImageConfig carouselImageConfig = iCarouselImageConfigService.getById(id); + CarouselImageConfigVO carouselImageConfigVO = new CarouselImageConfigVO(); + BeanUtils.copyBeanProp(carouselImageConfig, carouselImageConfigVO); + return AjaxResult.success(carouselImageConfigVO); + } + + @PostMapping(value = "/create") + public AjaxResult create(@Validated @RequestBody CarouselImageConfig params) { + Integer result = iCarouselImageConfigService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iCarouselImageConfigService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@Validated @RequestBody CarouselImageConfig params) { + Integer result = iCarouselImageConfigService.update(params); + return AjaxResult.success(result); + } + + /** + * 分页列表查询 + * + * @param carouselImageConfig + * @return + */ + @GetMapping(value = "/selectList") + public TableDataInfo selectList(CarouselImageConfig carouselImageConfig) { + startPage(); + List carouselImageConfigList = iCarouselImageConfigService.selectList(carouselImageConfig); + List voList = BeanUtils.copyList(carouselImageConfigList, CarouselImageConfigVO.class); + return getDataTable(carouselImageConfigList, voList); + } + + /** + * 轮播图启用/禁用接口 + */ + @PostMapping(value = "/updateEnableFlag") + public AjaxResult updateEnableFlag(@Validated @RequestBody CarouselImageEnableFlagRequest request) { + CarouselImageConfig carouselImageConfig = new CarouselImageConfig(); + BeanUtils.copyBeanProp(request, carouselImageConfig); + Integer result = iCarouselImageConfigService.update(carouselImageConfig); + return AjaxResult.success(result); + } + + /** + * APP端给到前端所有启用状态下的轮播图 + */ + @GetMapping(value = "/selectEnabled") + public AjaxResult selectEnabled() { + CarouselImageConfig carouselImageConfig = new CarouselImageConfig(); + carouselImageConfig.setEnableFlag(1); + List carouselImageConfigList = iCarouselImageConfigService.selectList(carouselImageConfig); + List voList = BeanUtils.copyList(carouselImageConfigList, CarouselImageConfigVO.class); + return AjaxResult.success(voList); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/CheckInRecordController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/CheckInRecordController.java new file mode 100644 index 0000000..024603e --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/CheckInRecordController.java @@ -0,0 +1,78 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.CheckInRecordVO; +import com.tcctyn.iot.forestfire.domain.CheckInRecord; +import com.tcctyn.iot.forestfire.service.ICheckInRecordService; +import com.tcctyn.iot.forestfire.service.ICommonService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + *

+ * 打卡记录表 前端控制器 + *

+ * + * @author liuzh + * @since 2024-10-12 + */ + +@RestController +@RequestMapping("/checkInRecord") +public class CheckInRecordController extends BaseController { + + + @Autowired + private ICheckInRecordService iCheckInRecordService; + + @Autowired + private ICommonService commonService; + + @GetMapping(value = "/list") + public TableDataInfo list(CheckInRecord checkInRecord) { + startPage(); + List list = iCheckInRecordService.list(checkInRecord); + return getDataTable(list); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + CheckInRecord checkInRecord = iCheckInRecordService.getById(id); + return AjaxResult.success(checkInRecord); + } + + /** + * APP端打卡,生成打卡记录 + */ + @PostMapping(value = "/create") + public AjaxResult create(@Validated @RequestBody CheckInRecord checkInRecord) { +// Long userId = 102L; + Long userId = super.getUserId(); + Integer result = iCheckInRecordService.create(checkInRecord, userId); + return AjaxResult.success(result); + } + + /** + * PC端查看最近十条打卡上报记录 + */ + @GetMapping(value = "/selectLast10Items") + public AjaxResult selectLast10Items() { + List list = iCheckInRecordService.selectLast10Items(); + //组装护林员姓名 + List voList = BeanUtils.copyList(list, CheckInRecordVO.class); + Map userIdToNameMap = commonService.userMapIdToName(null); + voList.forEach(item -> item.setUserName(Optional.ofNullable(userIdToNameMap.get(item.getUserId())).orElse(""))); + return AjaxResult.success(voList); + } + + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/DeviceChanelsController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/DeviceChanelsController.java new file mode 100644 index 0000000..50c61e6 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/DeviceChanelsController.java @@ -0,0 +1,81 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.iot.forestfire.VO.DeviceChanelsVO; +import com.tcctyn.iot.forestfire.domain.DeviceChanels; +import com.tcctyn.iot.forestfire.service.IDeviceChanelsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +@RestController +@RequestMapping("/deviceChanels") +public class DeviceChanelsController extends BaseController { + + @Autowired + private IDeviceChanelsService deviceChanelsService; + @GetMapping("/getById") + public AjaxResult getById(@RequestParam Long id) { + DeviceChanelsVO deviceChanelsVO = deviceChanelsService.getById(id); + return AjaxResult.success(deviceChanelsVO); + } + + @PostMapping("/create") + public AjaxResult create(@RequestBody DeviceChanels deviceChanels) { + Integer result = deviceChanelsService.create(deviceChanels); + return AjaxResult.success(result); + } + + @DeleteMapping("/delete") + public AjaxResult delete(@RequestParam Long id) { + Integer result = deviceChanelsService.delete(id); + return AjaxResult.success(result); + } + + @PutMapping("/update") + public AjaxResult update(@RequestBody DeviceChanels deviceChanels) { + Integer result = deviceChanelsService.update(deviceChanels); + return AjaxResult.success(result); + } + + /** + * 根据设备编号查询设备通道信息 + */ + @GetMapping("/selectByDeviceNo") + public AjaxResult selectByDeviceNo(@RequestParam String deviceNo) { + List vo = deviceChanelsService.selectByDeviceNo(deviceNo); + return AjaxResult.success(vo); + } + + /** + * 根据设备编号和通道号查询设备通道信息 + */ + @GetMapping("/getStreamUrl") + public AjaxResult getStreamUrl(@RequestParam String deviceNo, @RequestParam String chanelNo) { + DeviceChanelsVO vo = deviceChanelsService.getStreamUrl(deviceNo, chanelNo); + String result = vo.getStreamUrl(); + return AjaxResult.success(result); + } + + /** + * 预览 + */ + @GetMapping("/startPreview") + public AjaxResult startPreview(@RequestParam String deviceNo, @RequestParam String chanelNo) { + DeviceChanelsVO vo = deviceChanelsService.startPreview(deviceNo, chanelNo); + String result = vo.getStreamUrl(); + return AjaxResult.success(result); + } + + /** + * 停止预览 + */ + @GetMapping("/stopPreview") + public AjaxResult stopPreview(@RequestParam String deviceNo, @RequestParam String chanelNo) { + String vo = deviceChanelsService.stopPreview(deviceNo, chanelNo); + return AjaxResult.success(vo); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/DeviceConfigController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/DeviceConfigController.java new file mode 100644 index 0000000..7b7aeb7 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/DeviceConfigController.java @@ -0,0 +1,48 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.iot.forestfire.domain.DeviceConfig; +import com.tcctyn.iot.forestfire.service.IDeviceConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + + +@RestController +@RequestMapping("/deviceConfig") +public class DeviceConfigController extends BaseController { + + @Autowired + private IDeviceConfigService deviceConfigService; + + @GetMapping("/getById") + public AjaxResult getById(@RequestParam Long id) { + DeviceConfig deviceConfig = deviceConfigService.getById(id); + return AjaxResult.success(deviceConfig); + } + + @PostMapping("/create") + public AjaxResult create(@RequestBody DeviceConfig deviceConfig) { + Integer result = deviceConfigService.create(deviceConfig); + return AjaxResult.success(result); + } + + @PostMapping("/delete") + public AjaxResult delete(@RequestParam Long id) { + Integer result = deviceConfigService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping("/update") + public AjaxResult update(@RequestBody DeviceConfig deviceConfig) { + Integer result = deviceConfigService.update(deviceConfig); + return AjaxResult.success(result); + } + + @GetMapping("/selectByDeviceNo") + public AjaxResult selectByDeviceNo(@RequestParam String deviceNo) { + DeviceConfig deviceConfig = deviceConfigService.selectByDeviceNo(deviceNo); + return AjaxResult.success(deviceConfig); + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/DeviceInfoController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/DeviceInfoController.java new file mode 100644 index 0000000..bd463c8 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/DeviceInfoController.java @@ -0,0 +1,244 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.*; +import com.tcctyn.iot.forestfire.domain.DeviceInfo; +import com.tcctyn.iot.forestfire.searcher.BaseIdListSearcher; +import com.tcctyn.iot.forestfire.searcher.BaseRegionSearcher; +import com.tcctyn.iot.forestfire.searcher.deviceinfo.DeviceOwnershipSearcher; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.iot.forestfire.service.IDeviceChanelsService; +import com.tcctyn.iot.forestfire.service.IDeviceConfigService; +import com.tcctyn.iot.forestfire.service.IDeviceInfoService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 设备信息表 前端控制器 + *

+ * + * @author 代超 + * @since 2024-10-09 + */ + +@RestController +@RequestMapping("/deviceInfo") +public class DeviceInfoController extends BaseController { + + + @Autowired + private IDeviceInfoService iDeviceInfoService; + + @Autowired + private ICommonService commonService; + + @Autowired + private IDeviceConfigService deviceConfigService; + + @Autowired + private IDeviceChanelsService deviceChanelsService; + + @GetMapping(value = "/list") + public AjaxResult list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer size) { + if (current == null) { + current = 1; + } + if (size == null) { + size = 10; + } + Page pageList = iDeviceInfoService.list(current, size); + return AjaxResult.success(pageList); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + DeviceInfoVO vo = iDeviceInfoService.getById(id); + vo.setDeviceConfig(deviceConfigService.selectByDeviceNo(vo.getDeviceNo())); + return AjaxResult.success(vo); + } + + @PostMapping(value = "/create") + public AjaxResult create(@Validated @RequestBody DeviceInfo params) { + Integer result = iDeviceInfoService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iDeviceInfoService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@Validated @RequestBody DeviceInfo params) { + Integer result = iDeviceInfoService.update(params); + return AjaxResult.success(result); + } + + /** + * 分页查询 + * + * @param deviceInfo + * @return + */ + @GetMapping(value = "/selectList") + public TableDataInfo selectList(@RequestBody DeviceInfo deviceInfo) { + startPage(); + List list = iDeviceInfoService.selectList(deviceInfo); + //处理给前端的regionName,pointName,airportName; + List voList = BeanUtils.copyList(list, DeviceInfoVO.class); + Map regionIdAndNameMap = commonService.regionMapIdToName(null); + Map pointIdAndNameMap = commonService.pointMapIdToName(null); + Map airportIdAndNameMap = commonService.airportMapIdToName(null); + for (DeviceInfoVO deviceInfoVO : voList) { + String forestName = regionIdAndNameMap.get(deviceInfoVO.getForestId()) == null ? "" : regionIdAndNameMap.get(deviceInfoVO.getForestId()); + String farmName = regionIdAndNameMap.get(deviceInfoVO.getFarmId()) == null ? "" : regionIdAndNameMap.get(deviceInfoVO.getFarmId()); + String fenceName = regionIdAndNameMap.get(deviceInfoVO.getFenceId()) == null ? "" : regionIdAndNameMap.get(deviceInfoVO.getFenceId()); + deviceInfoVO.setRegionName(forestName + (StringUtils.isEmpty(farmName) ? "" : "/" + farmName) + (StringUtils.isEmpty(fenceName) ? "" : "/" + fenceName)); + + deviceInfoVO.setPointName(pointIdAndNameMap.get(deviceInfoVO.getPointId()) == null ? "" : pointIdAndNameMap.get(deviceInfoVO.getPointId())); + deviceInfoVO.setAirportName(airportIdAndNameMap.get(deviceInfoVO.getAirportId()) == null ? "" : airportIdAndNameMap.get(deviceInfoVO.getAirportId())); + deviceInfoVO.setPointOrAirportName(StringUtils.isEmpty(deviceInfoVO.getPointName()) ? deviceInfoVO.getAirportName() : deviceInfoVO.getPointName()); + + //如果设备配置信息表中无该设备,则在config返回空 + deviceInfoVO.setDeviceConfig(deviceConfigService.selectByDeviceNo(deviceInfoVO.getDeviceNo())); + + //添加推流地址 + if (deviceInfoVO.getDeviceNo() != null) { + List deviceChanelsVOList = deviceChanelsService.selectByDeviceNo(deviceInfoVO.getDeviceNo()); + deviceInfoVO.setDeviceChanelsVOList(deviceChanelsVOList); + } + } + + return getDataTable(list, voList); + } + + /** + * 根据设备编号查询设备信息及归属点位信息 + * 点位信息包括:经纬度,点位类型 + */ + @GetMapping(value = "/selectByDeviceNo/{deviceNo}") + public AjaxResult selectByDeviceNo(@PathVariable("deviceNo") String deviceNo) { + DeviceAndPointInfoVO vo = iDeviceInfoService.selectByDeviceNo(deviceNo); + return AjaxResult.success(vo); + } + + /** + * 大屏页面设备统计信息列表 + */ + + @GetMapping(value = "/deviceStatistics") + public AjaxResult deviceStatistics(@RequestBody DeviceInfo deviceInfo) { + DeviceStatisticsVO vo = iDeviceInfoService.deviceStatistics(deviceInfo); + return AjaxResult.success(vo); + } + + /** + * 设备快捷修改启用/停用状态接口 + */ + @PostMapping(value = "/updateEnableFlag") + public AjaxResult updateEnableFlag(@RequestBody DeviceInfo params) { + Integer result = iDeviceInfoService.updateEnableFlag(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/deleteBatch") + public AjaxResult deleteBatch(@RequestBody BaseIdListSearcher searcher) { + Integer result = iDeviceInfoService.deleteBatch(searcher.getIdList()); + return AjaxResult.success(result); + } + + /** + * 提供给前端的查询设备归属接口 + * + * @param searcher + * @return + */ + @PostMapping(value = "/queryOwnership") + public AjaxResult queryOwnership(@RequestBody DeviceOwnershipSearcher searcher) { + List voList = iDeviceInfoService.queryOwnership(searcher); + return AjaxResult.success(voList); + } + + /** + * 设备列表设备统计接口 + * + * @return + */ + @PostMapping(value = "/statisticsByStatus") + public AjaxResult statisticsByStatus() { + DeviceStatisticsByStatusVO vo = iDeviceInfoService.statisticsByStatus(); + return AjaxResult.success(vo); + } + + /** + * 查询云台/卡口下的设备列表 + */ + @GetMapping(value = "/listByPointId/{pointId}") + public AjaxResult listByPointId(@PathVariable("pointId") Long pointId) { + DeviceInfo deviceInfo = new DeviceInfo(); + deviceInfo.setPointId(pointId); + List list = iDeviceInfoService.selectList(deviceInfo); + return AjaxResult.success(list); + } + + /** + * 大屏页面3 视频监控模块,云台、卡口下的设备统计:设备总数、云台设备数量、卡口设备数量、设备在线率 + */ + @PostMapping(value = "/deviceStatisticsByPoint") + public AjaxResult deviceStatisticsByPoint(@RequestBody(required = false) BaseRegionSearcher searcher) { + DeviceStatisticsByPointVO vo = iDeviceInfoService.deviceStatisticsByPoint(searcher); + return AjaxResult.success(vo); + } + + /** + * 大屏页面1,查询机场信息按钮,在页面上可以展示机场的位置、图标、名称 + */ + @GetMapping(value = "/selectAirport") + public AjaxResult selectAirport(BaseRegionSearcher searcher) { + List airportVOList = iDeviceInfoService.selectAirport(searcher); + return AjaxResult.success(airportVOList); + } + + /** + * 根据机场id查询机场下的无人机信息 + * + * @param airportId + * @return + */ + @Deprecated + @GetMapping(value = "/selectDroneByAirportId/{airportId}") + public AjaxResult selectDroneByAirportId(@PathVariable("airportId") Long airportId) { + List deviceInfoList = iDeviceInfoService.selectDroneByAirportId(airportId); + List voList = BeanUtils.copyList(deviceInfoList, DeviceInfoVO.class); + Map regionIdAndNameMap = commonService.regionMapIdToName(null); + Map airportIdAndNameMap = commonService.airportMapIdToName(null); + voList.forEach(deviceInfoVO -> { + deviceInfoVO.setRegionName(regionIdAndNameMap.get(deviceInfoVO.getRegionId()) == null ? "" : regionIdAndNameMap.get(deviceInfoVO.getRegionId())); + deviceInfoVO.setAirportName(airportIdAndNameMap.get(deviceInfoVO.getAirportId()) == null ? "" : airportIdAndNameMap.get(deviceInfoVO.getAirportId())); + }); + return AjaxResult.success(voList); + } + + /** + * 查询摄像头类型的设备列表,暂时不分页,后面有需求再做分页处理 + */ + @GetMapping(value = "/selectCamera") + public AjaxResult selectCamera(BaseRegionSearcher searcher) { + List cameraVOList = iDeviceInfoService.selectCamera(searcher); + return AjaxResult.success(cameraVOList); + } + + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/DroneTaskPlanController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/DroneTaskPlanController.java new file mode 100644 index 0000000..43a4632 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/DroneTaskPlanController.java @@ -0,0 +1,109 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.DroneTaskPlanVO; +import com.tcctyn.iot.forestfire.domain.DroneTaskPlan; +import com.tcctyn.iot.forestfire.enums.DroneTaskStatusEnum; +import com.tcctyn.iot.forestfire.searcher.drone.DroneSearcher; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.iot.forestfire.service.IDroneTaskPlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 无人机任务计划表 前端控制器 + *

+ * + * @author 代超 + * @since 2024-11-07 + */ + +@RestController +@RequestMapping("/droneTaskPlan") +public class DroneTaskPlanController extends BaseController { + + + @Autowired + private IDroneTaskPlanService iDroneTaskPlanService; + + @Autowired + private ICommonService commonService; + + @GetMapping(value = "/list") + public AjaxResult list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer size) { + if (current == null) { + current = 1; + } + if (size == null) { + size = 10; + } + Page pageList = iDroneTaskPlanService.list(current, size); + return AjaxResult.success(pageList); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + DroneTaskPlan droneTaskPlan = iDroneTaskPlanService.getById(id); + return AjaxResult.success(droneTaskPlan); + } + + @PostMapping(value = "/create") + public AjaxResult create(@RequestBody DroneTaskPlan params) { + Integer result = iDroneTaskPlanService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iDroneTaskPlanService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@RequestBody DroneTaskPlan params) { + Integer result = iDroneTaskPlanService.update(params); + return AjaxResult.success(result); + } + + /** + * 大屏页面查询无人机的不同状态的任务列表 + * + * @param searcher + * @return + */ + @PostMapping(value = "/selectByStatus") + public AjaxResult selectByStatus(@RequestBody DroneSearcher searcher) { + List droneTaskPlanList = iDroneTaskPlanService.selectByStatus(searcher); + List voList = BeanUtils.copyList(droneTaskPlanList, DroneTaskPlanVO.class); + Map regionIdToNameMap = commonService.regionMapIdToName(null); + voList.forEach(droneTaskPlanVO -> { + droneTaskPlanVO.setRegionName(regionIdToNameMap.get(droneTaskPlanVO.getRegionId()) == null ? "" : regionIdToNameMap.get(droneTaskPlanVO.getRegionId())); + }); + return AjaxResult.success(voList); + } + + /** + * 分页查询无人机的历史执飞记录 + */ + @GetMapping(value = "/listHistory") + public TableDataInfo listHistory(DroneTaskPlan droneTaskPlan) { + droneTaskPlan.setTaskStatus(DroneTaskStatusEnum.COMPLETED.name()); + startPage(); + List droneTaskPlanList = iDroneTaskPlanService.seletList(droneTaskPlan); + List voList = BeanUtils.copyList(droneTaskPlanList, DroneTaskPlanVO.class); + Map regionIdToNameMap = commonService.regionMapIdToName(null); + voList.forEach(droneTaskPlanVO -> { + droneTaskPlanVO.setRegionName(regionIdToNameMap.get(droneTaskPlanVO.getRegionId()) == null ? "" : regionIdToNameMap.get(droneTaskPlanVO.getRegionId())); + }); + return getDataTable(droneTaskPlanList, voList); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/EnumController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/EnumController.java new file mode 100644 index 0000000..56bc2b9 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/EnumController.java @@ -0,0 +1,64 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.iot.forestfire.enums.*; +import com.tcctyn.iot.forestfire.searcher.EnumSearcher; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 枚举类的公共接口 + */ +@RestController +@RequestMapping("/enum") +public class EnumController extends BaseController { + + + private final static Map> type2EnumName2DescMap = new LinkedHashMap<>(); + + /** + * 前端需要的枚举信息需要在此处初始化 + */ + static { + type2EnumName2DescMap.put("AreaTypeEnum", AreaTypeEnum.getName2DescMap()); + type2EnumName2DescMap.put("PointTypeEnum", PointTypeEnum.getName2DescMap()); + type2EnumName2DescMap.put("FireWarningDisposalStatusEnum", FireWarningDisposalStatusEnum.getName2DescMap()); + type2EnumName2DescMap.put("DeviceStatusEnum", DeviceStatusEnum.getName2DescMap()); + type2EnumName2DescMap.put("DataSourceEnum", DataSourceEnum.getName2DescMap()); + type2EnumName2DescMap.put("TaskUrgencyEnum", TaskUrgencyEnum.getName2DescMap()); + type2EnumName2DescMap.put("TaskStatusEnum", TaskStatusEnum.getName2DescMap()); + type2EnumName2DescMap.put("ReportMethodEnum", ReportMethodEnum.getName2DescMap()); + type2EnumName2DescMap.put("FireHazardLevelEnum", FireHazardLevelEnum.getName2DescMap()); + type2EnumName2DescMap.put("DroneTaskStatusEnum", DroneTaskStatusEnum.getName2DescMap()); + type2EnumName2DescMap.put("ApprovalBusinessTypeEnum", ApprovalBusinessTypeEnum.getName2DescMap()); + } + + @Tag(name = "按需查询枚举接口",description = "按需查询枚举接口") + @PostMapping(value = "queryEnum") + public AjaxResult queryEnum(@RequestBody EnumSearcher enumSearcher) { + //对枚举值进行校验 + if (CollectionUtils.isEmpty(enumSearcher.getEnumNameList())) { + return error("查询列表为空,请检查!"); + } + for (String enumName : enumSearcher.getEnumNameList()) { + if (!type2EnumName2DescMap.containsKey(enumName)) { + return error("枚举类型参数非法"); + } + } + + final Map> resultMap = new LinkedHashMap<>(enumSearcher.getEnumNameList().size()); + for (String enumType : enumSearcher.getEnumNameList()) { + resultMap.put(enumType, type2EnumName2DescMap.get(enumType)); + } + + return AjaxResult.success(resultMap); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/FireReportController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/FireReportController.java new file mode 100644 index 0000000..20c4fa4 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/FireReportController.java @@ -0,0 +1,133 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.FireReportStatisticsVO; +import com.tcctyn.iot.forestfire.VO.FireReportVO; +import com.tcctyn.iot.forestfire.domain.FireReport; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.iot.forestfire.service.IFireReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + *

+ * 火情上报表 前端控制器 + *

+ * + * @author 代超 + * @since 2024-11-01 + */ + +@RestController +@RequestMapping("/fireReport") +public class FireReportController extends BaseController { + + + @Autowired + private IFireReportService iFireReportService; + + @Autowired + private ICommonService commonService; + + @GetMapping(value = "/list") + public AjaxResult list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer size) { + if (current == null) { + current = 1; + } + if (size == null) { + size = 10; + } + Page pageList = iFireReportService.list(current, size); + return AjaxResult.success(pageList); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + FireReport fireReport = iFireReportService.getById(id); + FireReportVO fireReportVO = new FireReportVO(); + if (Objects.nonNull(fireReport)) { + BeanUtils.copyBeanProp(fireReport, fireReportVO); + } else { + return AjaxResult.success(null); + } + //给前端地区名称与处理人姓名 + Map regionIdAndNameMap = commonService.regionMapIdToName(fireReportVO.getRegionId()); + Map userIdAndNameMap = commonService.userMapIdToName(fireReportVO.getReporterId()); + fireReportVO.setRegionName(regionIdAndNameMap.get(fireReportVO.getRegionId())); + fireReportVO.setReporterName(userIdAndNameMap.get(fireReportVO.getReporterId())); + return AjaxResult.success(fireReportVO); + } + + @PostMapping(value = "/create") + public AjaxResult create(@Validated @RequestBody FireReport params) { + //火情上报人 +// params.setReporterId(getUserId()); + Integer result = iFireReportService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iFireReportService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@RequestBody FireReport params) { + Integer result = iFireReportService.update(params); + return AjaxResult.success(result); + } + + /** + * 火情上报列表分页查询 + */ + @GetMapping(value = "/selectList") + public TableDataInfo selectList(FireReport fireReport) { + startPage(); + List fireReportList = iFireReportService.selectList(fireReport); + List voList = BeanUtils.copyList(fireReportList, FireReportVO.class); + //给前端地区名称与处理人姓名 + Map regionIdAndNameMap = commonService.regionMapIdToName(null); + Map userIdAndNameMap = commonService.userMapIdToName(null); + voList.forEach(vo -> { + vo.setRegionName(regionIdAndNameMap.get(vo.getRegionId())); + vo.setReporterName(userIdAndNameMap.get(vo.getReporterId())); + }); + + return getDataTable(fireReportList, voList); + } + + @PostMapping(value = "/archive") + public AjaxResult archive(@RequestBody FireReport fireReport) { + Integer result = iFireReportService.archive(fireReport); + return AjaxResult.success(result); + } + + @PostMapping(value = "/fireReportStatistics") + public AjaxResult fireReportStatistics() { + FireReportStatisticsVO vo = iFireReportService.fireReportStatistics(); + return AjaxResult.success(vo); + } + + /** + * 火情处理 + * + * @param fireReport + * @return + */ + @PostMapping(value = "/disposal") + public AjaxResult disposal(@RequestBody FireReport fireReport) { + Integer result = iFireReportService.disposal(fireReport); + return AjaxResult.success(result); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/FireWarningInfoController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/FireWarningInfoController.java new file mode 100644 index 0000000..d9ba719 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/FireWarningInfoController.java @@ -0,0 +1,258 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.*; +import com.tcctyn.iot.forestfire.domain.FireWarningInfo; +import com.tcctyn.iot.forestfire.searcher.BaseIdListSearcher; +import com.tcctyn.iot.forestfire.searcher.BaseTimeSearcher; +import com.tcctyn.iot.forestfire.searcher.firewarning.FireWarningAnalyzeSearcher; +import com.tcctyn.iot.forestfire.searcher.firewarning.FireWarningConditionSearcher; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.iot.forestfire.service.IFireWarningInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + *

+ * 火情预警信息表 前端控制器 + *

+ * + * @author 代超 + * @since 2024-10-08 + */ + +@RestController +@RequestMapping("/fireWarningInfo") +public class FireWarningInfoController extends BaseController { + + + @Autowired + private IFireWarningInfoService iFireWarningInfoService; + + @Autowired + private ICommonService commonService; + + @GetMapping(value = "/list") + public AjaxResult list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer size) { + if (current == null) { + current = 1; + } + if (size == null) { + size = 10; + } + Page pageList = iFireWarningInfoService.list(current, size); + return AjaxResult.success(pageList); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + FireWarningInfo fireWarningInfo = iFireWarningInfoService.getById(id); + FireWarningInfoVO fireWarningInfoVO = new FireWarningInfoVO(); + if (Objects.nonNull(fireWarningInfo)) { + BeanUtils.copyBeanProp(fireWarningInfo, fireWarningInfoVO); + } else { + return AjaxResult.success(null); + } + //给前端地区名称与处理人名称 + Map regionIdAndNameMap = commonService.regionMapIdToName(null); + Map userIdAndNameMap = commonService.userMapIdToName(null); + fireWarningInfoVO.setRegionName(regionIdAndNameMap.get(fireWarningInfoVO.getRegionId())); + fireWarningInfoVO.setDisposalByName(userIdAndNameMap.get(fireWarningInfoVO.getDisposalBy())); + return AjaxResult.success(fireWarningInfoVO); + } + + @PostMapping(value = "/create") + public AjaxResult create(@Validated @RequestBody FireWarningInfo params) { + Integer result = iFireWarningInfoService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iFireWarningInfoService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@RequestBody FireWarningInfo params) { + Integer result = iFireWarningInfoService.update(params); + return AjaxResult.success(result); + } + + /** + * 火情预警信息分页查询 + * + * @param fireWarningInfo + * @return + */ + @GetMapping(value = "/selectList") + public TableDataInfo selectList(FireWarningInfo fireWarningInfo) { + startPage(); + List fireWarningInfoList = iFireWarningInfoService.selectList(fireWarningInfo); + List voList = BeanUtils.copyList(fireWarningInfoList, FireWarningInfoVO.class); + //给前端地区名称与处理人姓名 + Map regionIdAndNameMap = commonService.regionMapIdToName(null); + Map userIdAndNameMap = commonService.userMapIdToName(null); + voList.forEach(vo -> { + vo.setRegionName(regionIdAndNameMap.get(vo.getRegionId())); + vo.setDisposalByName(userIdAndNameMap.get(vo.getDisposalBy())); + }); + + return getDataTable(fireWarningInfoList, voList); + } + + /** + * 根据处置状态统计数量 + * + * @return + */ + @PostMapping(value = "/countByDisposalStatus") + public AjaxResult countByDisposalStatus(@RequestBody(required = false) FireWarningConditionSearcher searcher) { + FireWarningCountByStatusVO vo = iFireWarningInfoService.countByDisposalStatus(searcher); + return AjaxResult.success(vo); + } + + /** + * 根据火情等级统计数量 + * + * @return + */ + @PostMapping(value = "/countByFireLevel") + public AjaxResult countByFireLevel(@RequestBody(required = false) FireWarningConditionSearcher searcher) { + List voList = iFireWarningInfoService.countByFireLevel(searcher); + return AjaxResult.success(voList); + } + + /** + * 根据条件查询火情信息,可以选择性带时间条件 + * + * @return + */ + @PostMapping(value = "/selectByCondition") + public AjaxResult selectByCondition(@RequestBody(required = false) FireWarningConditionSearcher searcher) { + List voList = iFireWarningInfoService.selectByCondition(searcher); + return AjaxResult.success(voList); + } + + /** + * 查询最近的十条火情预警信息,以时间倒序,将未处理的火情信息置顶 + * + * @return + */ + @PostMapping(value = "/selectLimit") + public AjaxResult selectLimit(@RequestBody(required = false) FireWarningConditionSearcher searcher) { + List voList = iFireWarningInfoService.selectLimit(searcher); + return AjaxResult.success(voList); + } + + /** + * 大屏页面二,按照火情数据来源进行分组统计 + */ + @PostMapping(value = "/statisticsByDataSource") + public AjaxResult statisticsByDataSource(@RequestBody(required = false) BaseTimeSearcher searcher) { + FireWarningStatisticsByDataSourceVO vo = iFireWarningInfoService.statisticsByDataSource(searcher); + return AjaxResult.success(vo); + } + + /** + * 火情预警归档 + * + * @param id + * @return + */ + @PostMapping(value = "/archive/{id}") + public AjaxResult archive(@PathVariable("id") Long id) { + Integer result = iFireWarningInfoService.archive(id); + return AjaxResult.success(result); + } + + /** + * 火情预警批量归档 + * + * @param searcher + * @return + */ + @PostMapping(value = "/archiveBatch") + public AjaxResult archiveBatch(@RequestBody BaseIdListSearcher searcher) { + Integer result = iFireWarningInfoService.archiveBatch(searcher); + return AjaxResult.success(result); + } + + /** + * APP端火情预警查询已处理的火情预警列表(分页) + * + * @param fireWarningInfo + * @return + */ + @GetMapping(value = "/selectDisposedList") + public TableDataInfo selectDisposedList(FireWarningInfo fireWarningInfo) { + startPage(); + List fireWarningInfoList = iFireWarningInfoService.selectDisposedList(fireWarningInfo); + List voList = BeanUtils.copyList(fireWarningInfoList, FireWarningInfoVO.class); + //给前端地区名称与处理人姓名 + Map regionIdAndNameMap = commonService.regionMapIdToName(null); + Map userIdAndNameMap = commonService.userMapIdToName(null); + voList.forEach(vo -> { + vo.setRegionName(regionIdAndNameMap.get(vo.getRegionId())); + vo.setDisposalByName(userIdAndNameMap.get(vo.getDisposalBy())); + }); + return getDataTable(fireWarningInfoList, voList); + } + + /** + * 火情预警研判接口 + * + * @param searcher + * @return + */ + @PostMapping(value = "/analyze") + public AjaxResult analyze(@Validated @RequestBody FireWarningAnalyzeSearcher searcher) { + Long userId = super.getUserId(); + Integer result = iFireWarningInfoService.analyze(searcher, userId); + return AjaxResult.success(result); + } + + /** + * 提供一个模拟火情预警的接口 + * 模拟云台发现火情预警,然后大屏页面上,预警系统跟监控系统可以进行联动 + * TODO 待后续接入硬件设备后,可删除 + * 暂时使用呼马山云台1 ,设备编号为 BC1733545 + */ + @PostMapping(value = "/simulate") + public AjaxResult simulate() { + iFireWarningInfoService.simulate(); + return AjaxResult.success("模拟成功"); + } + + /** + * 火情预警周边查询接口 + * 查询火情预警附近3公里内的 护林员、水源地、仓库 + * 查询范围做成可以灵活配置的,默认为3公里 + * 前端传火情预警id + */ + @PostMapping(value = "/surroundingSearch/{id}") + public AjaxResult surroundingSearch(@PathVariable("id") Long id) { + FireWarningSurroundingVO vo = iFireWarningInfoService.surroundingSearch(id); + return AjaxResult.success(vo); + } + + /** + * 临时接口,后续看需求进行调整或者删除 + * 火情预警误判接口 + */ + @PostMapping(value = "/misjudge/{id}") + public AjaxResult misjudge(@PathVariable("id") Long id) { + Integer result = iFireWarningInfoService.misjudge(id); + return AjaxResult.success(result); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/HkStoreController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/HkStoreController.java new file mode 100644 index 0000000..16aacba --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/HkStoreController.java @@ -0,0 +1,35 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.iot.forestfire.VO.HkStoreCapturePicturesVO; +import com.tcctyn.iot.forestfire.searcher.hk.HkStoreListSearcher; +import com.tcctyn.iot.forestfire.service.IHkStoreCapturePicturesService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + + +@RestController +@RequestMapping("/hk-store") +@Tag(name = "海康存储桶-接口管理", description = "海康存储桶-接口管理") +public class HkStoreController extends BaseController { + + @Autowired + private IHkStoreCapturePicturesService hkStoreCapturePicturesService; + + @PostMapping("/getListHkStoreCapturePictures") + @Operation(summary = "获取图片和视频列表", description = "获取图片和视频列表") + public TableDataInfo getListHkStoreCapturePictures(@RequestBody HkStoreListSearcher hkStoreListSearcher) { + startPage(); + List voList = hkStoreCapturePicturesService.getListHkStoreCapturePicturesList(hkStoreListSearcher); + return getDataTable(voList); + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/InventoryController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/InventoryController.java new file mode 100644 index 0000000..c162042 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/InventoryController.java @@ -0,0 +1,82 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.InventoryVO; +import com.tcctyn.iot.forestfire.domain.Inventory; +import com.tcctyn.iot.forestfire.domain.Warehouse; +import com.tcctyn.iot.forestfire.searcher.material.InventorySearcher; +import com.tcctyn.iot.forestfire.service.IInventoryService; +import com.tcctyn.iot.forestfire.service.IWarehouseService; +import com.tcctyn.system.api.RemoteUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + *

+ * 物资库存 前端控制器 + *

+ * + * @author liuzh + * @since 2024-10-29 + */ + +@RestController +@RequestMapping("/inventory") +public class InventoryController extends BaseController { + + + @Autowired + private IInventoryService iInventoryService; + + @Autowired + private IWarehouseService warehouseService; + + @Resource + private RemoteUserService remoteUserService; + + @GetMapping(value = "/list") + public TableDataInfo list(InventorySearcher inventorySearcher) { + startPage(); + List doList = iInventoryService.list(inventorySearcher); + List voList = BeanUtils.copyList(doList, InventoryVO.class); + voList.forEach(vo -> { + Warehouse warehouse = warehouseService.getById(vo.getWarehouseId()); + vo.setRegionId(warehouse.getRegionId()); + vo.setWarehouseName(warehouse.getWarehouseName()); + vo.setUserName(remoteUserService.selectUserById(vo.getUserId()).getData().getNickName()); + }); + + return getDataTable(doList, voList); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + Inventory inventory = iInventoryService.getById(id); + return AjaxResult.success(inventory); + } + + @PostMapping(value = "/create") + public AjaxResult create(@RequestBody Inventory params) { + Integer result = iInventoryService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iInventoryService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@RequestBody Inventory params) { + Integer result = iInventoryService.update(params); + return AjaxResult.success(result); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/KeyAreaInfoController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/KeyAreaInfoController.java new file mode 100644 index 0000000..60b0b3c --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/KeyAreaInfoController.java @@ -0,0 +1,114 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.KeyAreaInfoVO; +import com.tcctyn.iot.forestfire.domain.KeyAreaInfo; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.iot.forestfire.service.IKeyAreaInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + *

+ * 重点监控区域配置表 前端控制器 + *

+ * + * @author daichao + * @since 2024-12-17 + */ + +@RestController +@RequestMapping("/keyAreaInfo") +public class KeyAreaInfoController extends BaseController { + + + @Autowired + private IKeyAreaInfoService iKeyAreaInfoService; + + @Autowired + private ICommonService commonService; + + @GetMapping(value = "/list") + public AjaxResult list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer size) { + if (current == null) { + current = 1; + } + if (size == null) { + size = 10; + } + Page pageList = iKeyAreaInfoService.list(current, size); + return AjaxResult.success(pageList); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + KeyAreaInfo keyAreaInfo = iKeyAreaInfoService.getById(id); + KeyAreaInfoVO keyAreaInfoVO = new KeyAreaInfoVO(); + BeanUtils.copyBeanProp(keyAreaInfo, keyAreaInfoVO); + Map regionIdToNameMap = commonService.regionMapIdToName(keyAreaInfoVO.getRegionId()); + keyAreaInfoVO.setRegionName(regionIdToNameMap.get(keyAreaInfoVO.getRegionId())); + return AjaxResult.success(keyAreaInfoVO); + } + + @PostMapping(value = "/create") + public AjaxResult create(@Validated @RequestBody KeyAreaInfo params) { + Integer result = iKeyAreaInfoService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iKeyAreaInfoService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@RequestBody KeyAreaInfo params) { + Integer result = iKeyAreaInfoService.update(params); + return AjaxResult.success(result); + } + + /** + * 分页列表查询 + */ + @GetMapping(value = "/selectList") + public TableDataInfo selectList(KeyAreaInfo keyAreaInfo) { + startPage(); + List keyAreaInfoList = iKeyAreaInfoService.selectList(keyAreaInfo); + List voList = BeanUtils.copyList(keyAreaInfoList, KeyAreaInfoVO.class); + Map regionIdToNameMap = commonService.regionMapIdToName(null); + voList.forEach(keyAreaInfoVO -> { + keyAreaInfoVO.setRegionName(Optional.ofNullable(regionIdToNameMap.get(keyAreaInfoVO.getRegionId())).orElse("")); + }); + return getDataTable(keyAreaInfoList, voList); + } + + /** + * 大屏页面给到前端的所有重点区域 + */ + @GetMapping(value = "/selectAll") + public AjaxResult selectAll() { + KeyAreaInfo keyAreaInfo = new KeyAreaInfo(); + List keyAreaInfoList = iKeyAreaInfoService.selectList(keyAreaInfo); + List voList = BeanUtils.copyList(keyAreaInfoList, KeyAreaInfoVO.class); + Map regionIdToNameMap = commonService.regionMapIdToName(null); + voList.forEach(keyAreaInfoVO -> { + keyAreaInfoVO.setRegionName(Optional.ofNullable(regionIdToNameMap.get(keyAreaInfoVO.getRegionId())).orElse("")); + }); + // 如果存在时间范围,需要判断是否在时间范围内 + if (keyAreaInfo.getStartTime() != null && keyAreaInfo.getEndTime() != null) { + voList.removeIf(item -> item.getStartTime().getTime() > System.currentTimeMillis() || item.getEndTime().getTime() < System.currentTimeMillis()); + } + return AjaxResult.success(voList); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/LeaveRecordController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/LeaveRecordController.java new file mode 100644 index 0000000..94f1579 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/LeaveRecordController.java @@ -0,0 +1,124 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.LeaveRecordVO; +import com.tcctyn.iot.forestfire.domain.LeaveRecord; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.iot.forestfire.service.ILeaveRecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + *

+ * 请假记录表 前端控制器 + *

+ * + * @author daichao + * @since 2024-12-09 + */ + +@RestController +@RequestMapping("/leaveRecord") +public class LeaveRecordController extends BaseController { + + + @Autowired + private ILeaveRecordService iLeaveRecordService; + + @Autowired + private ICommonService commonService; + + @GetMapping(value = "/list") + public AjaxResult list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer size) { + if (current == null) { + current = 1; + } + if (size == null) { + size = 10; + } + Page pageList = iLeaveRecordService.list(current, size); + return AjaxResult.success(pageList); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + LeaveRecord leaveRecord = iLeaveRecordService.getById(id); + LeaveRecordVO leaveRecordVO = new LeaveRecordVO(); + BeanUtils.copyBeanProp(leaveRecord, leaveRecordVO); + Map userIdToNameMap = commonService.userMapIdToName(null); + Map deptIdToNameMap = commonService.deptMapIdToName(leaveRecordVO.getDeptId()); + leaveRecordVO.setUserName(Optional.ofNullable(userIdToNameMap.get(leaveRecordVO.getUserId())).orElse("")); + leaveRecordVO.setDeptName(Optional.ofNullable(deptIdToNameMap.get(leaveRecordVO.getDeptId())).orElse("")); + leaveRecordVO.setReviewerName(Optional.ofNullable(userIdToNameMap.get(leaveRecordVO.getReviewerId())).orElse("")); + return AjaxResult.success(leaveRecordVO); + } + + @PostMapping(value = "/create") + public AjaxResult create(@Validated @RequestBody LeaveRecord params) { + //TODO 登录用户的userId 跟deptId 是可以拿到的,前端无需传 +// Long userId = 100L; +// Long deptId = 100L; + Long userId = super.getUserId(); + Long deptId = super.getDeptId(); + params.setUserId(userId); + params.setDeptId(deptId); + Integer result = iLeaveRecordService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iLeaveRecordService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@RequestBody LeaveRecord params) { + Integer result = iLeaveRecordService.update(params); + return AjaxResult.success(result); + } + + /** + * 请假记录分页查询接口 + */ + @GetMapping(value = "/selectList") + public TableDataInfo selectList(LeaveRecord leaveRecord) { +// Long userId = 100L; + Long userId = super.getUserId(); + leaveRecord.setUserId(userId); + startPage(); + List list = iLeaveRecordService.selectList(leaveRecord); + List voList = BeanUtils.copyList(list, LeaveRecordVO.class); + //此处需要映射给前端请假人姓名,部门名称,审批人姓名 + Map userIdToNameMap = commonService.userMapIdToName(null); + Map deptIdToNameMap = commonService.deptMapIdToName(null); + voList.forEach(item -> { + item.setUserName(Optional.ofNullable(userIdToNameMap.get(item.getUserId())).orElse("")); + item.setDeptName(Optional.ofNullable(deptIdToNameMap.get(item.getDeptId())).orElse("")); + item.setReviewerName(Optional.ofNullable(userIdToNameMap.get(item.getReviewerId())).orElse("")); + }); + return getDataTable(list, voList); + } + + /** + * 请假记录撤销接口 + * + * @param id + * @return + */ + @PostMapping(value = "/revoke/{id}") + public AjaxResult revoke(@PathVariable("id") Long id) { + Integer result = iLeaveRecordService.revoke(id); + return AjaxResult.success(result); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/MaterialController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/MaterialController.java new file mode 100644 index 0000000..47a7d6b --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/MaterialController.java @@ -0,0 +1,106 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.MaterialStatisticsVO; +import com.tcctyn.iot.forestfire.VO.MaterialVO; +import com.tcctyn.iot.forestfire.domain.Material; +import com.tcctyn.iot.forestfire.domain.Warehouse; +import com.tcctyn.iot.forestfire.mapper.WarehouseMapper; +import com.tcctyn.iot.forestfire.searcher.material.MaterialAllocateSearcher; +import com.tcctyn.iot.forestfire.searcher.material.MaterialSearcher; +import com.tcctyn.iot.forestfire.service.IMaterialService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + *

+ * 物资信息 前端控制器 + *

+ * + * @author liuzh + * @since 2024-10-09 + */ + +@RestController +@RequestMapping("/material") +public class MaterialController extends BaseController { + + @Autowired + private IMaterialService iMaterialService; + + @Resource + private WarehouseMapper warehouseMapper; + + @GetMapping(value = "/list") + public TableDataInfo list(MaterialSearcher materialSearcher) { + startPage(); + List doList = iMaterialService.list(materialSearcher); + List voList = BeanUtils.copyList(doList, MaterialVO.class); + voList.forEach(vo -> { + Warehouse warehouse = warehouseMapper.selectById(vo.getWarehouseId()); + vo.setWarehouseName(warehouse.getWarehouseName()); + vo.setRegionId(warehouse.getRegionId()); + }); + return getDataTable(doList,voList); + } + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + Material material = iMaterialService.getById(id); + return AjaxResult.success(material); + } + + @PostMapping(value = "/create") + public AjaxResult create(@Validated @RequestBody Material params) { + return iMaterialService.create(params); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iMaterialService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@RequestBody Material params) { + Integer result = iMaterialService.update(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/inbound") + public AjaxResult inbound(@Validated @RequestBody MaterialAllocateSearcher params) { + Integer result = iMaterialService.inbound(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/outbound") + public AjaxResult outbound(@RequestBody MaterialAllocateSearcher params) { + Integer result = iMaterialService.outbound(params); + if (result == -1){ + return AjaxResult.warn("请检查库存"); + } + return AjaxResult.success(result); + } + + @PostMapping(value = "/allocate") + public AjaxResult allocate(@RequestBody MaterialAllocateSearcher params) { + Integer result = iMaterialService.allocate(params); + if (result == -1){ + return AjaxResult.warn("请检查库存"); + } + return AjaxResult.success(result); + } + + @GetMapping(value = "/statistics/{warehouseId}") + public AjaxResult getStatisticsByWarehouse(@PathVariable("warehouseId") Long warehouseId) { + List result = iMaterialService.getStatisticsByWarehouse(warehouseId); + return AjaxResult.success(result); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/NoticeInfoController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/NoticeInfoController.java new file mode 100644 index 0000000..2b0b70f --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/NoticeInfoController.java @@ -0,0 +1,107 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.NoticeInfoVO; +import com.tcctyn.iot.forestfire.domain.NoticeInfo; +import com.tcctyn.iot.forestfire.searcher.noticeinfo.NoticeEnableFlagRequest; +import com.tcctyn.iot.forestfire.service.INoticeInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + *

+ * 通知公告信息表 前端控制器 + *

+ * + * @author daichao + * @since 2024-12-17 + */ + +@RestController +@RequestMapping("/noticeInfo") +public class NoticeInfoController extends BaseController { + + + @Autowired + private INoticeInfoService iNoticeInfoService; + + @GetMapping(value = "/list") + public AjaxResult list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer size) { + if (current == null) { + current = 1; + } + if (size == null) { + size = 10; + } + Page pageList = iNoticeInfoService.list(current, size); + return AjaxResult.success(pageList); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + NoticeInfo noticeInfo = iNoticeInfoService.getById(id); + NoticeInfoVO noticeInfoVO = new NoticeInfoVO(); + BeanUtils.copyBeanProp(noticeInfo, noticeInfoVO); + return AjaxResult.success(noticeInfoVO); + } + + @PostMapping(value = "/create") + public AjaxResult create(@RequestBody NoticeInfo params) { + Integer result = iNoticeInfoService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iNoticeInfoService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@Validated @RequestBody NoticeInfo params) { + Integer result = iNoticeInfoService.update(params); + return AjaxResult.success(result); + } + + /** + * 分页列表查询 + */ + @GetMapping(value = "/selectList") + public TableDataInfo selectList(NoticeInfo noticeInfo) { + startPage(); + List noticeInfoList = iNoticeInfoService.selectList(noticeInfo); + List voList = BeanUtils.copyList(noticeInfoList, NoticeInfoVO.class); + return getDataTable(noticeInfoList, voList); + } + + /** + * APP端获取需要展示的通知公告列表 + */ + @GetMapping(value = "/selectEnabled") + public AjaxResult selectEnabled() { + NoticeInfo noticeInfo = new NoticeInfo(); + noticeInfo.setEnableFlag(1); + List noticeInfoList = iNoticeInfoService.selectList(noticeInfo); + List voList = BeanUtils.copyList(noticeInfoList, NoticeInfoVO.class); + return AjaxResult.success(voList); + } + + /** + * 通知公告启用/禁用接口 + */ + @PostMapping(value = "/updateEnableFlag") + public AjaxResult updateEnableFlag(@Validated @RequestBody NoticeEnableFlagRequest request) { + NoticeInfo noticeInfo = new NoticeInfo(); + BeanUtils.copyBeanProp(request, noticeInfo); + Integer result = iNoticeInfoService.update(noticeInfo); + return AjaxResult.success(result); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/PatrolPathController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/PatrolPathController.java new file mode 100644 index 0000000..1bc48d3 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/PatrolPathController.java @@ -0,0 +1,122 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.PatrolPathVO; +import com.tcctyn.iot.forestfire.domain.PatrolPath; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.iot.forestfire.service.IPatrolPathService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 巡护路径表 前端控制器 + *

+ * + * @author 代超 + * @since 2024-09-24 + */ + +@RestController +@RequestMapping("/patrolPath") +public class PatrolPathController extends BaseController { + + + @Autowired + private IPatrolPathService iPatrolPathService; + + @Autowired + private ICommonService commonService; + + @GetMapping(value = "/list") + public AjaxResult list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer size) { + if (current == null) { + current = 1; + } + if (size == null) { + size = 10; + } + Page pageList = iPatrolPathService.list(current, size); + return AjaxResult.success(pageList); + } + + + @GetMapping(value = "get/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + PatrolPathVO patrolPathVO = iPatrolPathService.getById(id); + return AjaxResult.success(patrolPathVO); + } + + @PostMapping(value = "/create") + public AjaxResult create(@Validated @RequestBody PatrolPath params) { +// params.setCreatedBy(getUsername()); + Integer result = iPatrolPathService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iPatrolPathService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@Validated @RequestBody PatrolPath params) { +// params.setUpdatedBy(getUsername()); + Integer result = iPatrolPathService.update(params); + return AjaxResult.success(result); + } + + /** + * 巡护路径分页查询 + */ + @GetMapping(value = "/selectList") + public TableDataInfo selectList(PatrolPath patrolPath) { + startPage(); + List list = iPatrolPathService.selectList(patrolPath); + //考虑到分页的实现,DO->VO 这步放在controller层实现 + Map regionIdToNameMap = commonService.regionMapIdToName(null); + List voList = BeanUtils.copyList(list, PatrolPathVO.class); + voList.forEach(patrolPathVO -> { + String forestName = regionIdToNameMap.get(patrolPathVO.getForestId()) == null ? "" : regionIdToNameMap.get(patrolPathVO.getForestId()); + String farmName = regionIdToNameMap.get(patrolPathVO.getFarmId()) == null ? "" : regionIdToNameMap.get(patrolPathVO.getFarmId()); + String fenceName = regionIdToNameMap.get(patrolPathVO.getFenceId()) == null ? "" : regionIdToNameMap.get(patrolPathVO.getFenceId()); + patrolPathVO.setBelongingRegionName(forestName + (StringUtils.isEmpty(farmName) ? "" : "/" + farmName) + (StringUtils.isEmpty(fenceName) ? "" : "/" + fenceName)); + }); + return getDataTable(list,voList); + } + + /** + * 根据林场id查询巡护路径 + * + * @param regionId + * @return + */ + @GetMapping(value = "selectByRegionId/{regionId}") + public AjaxResult selectByRegionId(@PathVariable("regionId") Long regionId) { + List patrolPathList = iPatrolPathService.selectByRegionId(regionId); + return AjaxResult.success(patrolPathList); + } + + /** + * 大屏页面巡护路径图标接口, + * 根据林场、林区、电子围栏查询当下的所有巡护路径 + * + * @param patrolPath + * @return + */ + @GetMapping(value = "queryByRegion") + public AjaxResult queryByRegion(PatrolPath patrolPath) { + List list = iPatrolPathService.queryByRegion(patrolPath); + return AjaxResult.success(list); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/PointInfoController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/PointInfoController.java new file mode 100644 index 0000000..34d6675 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/PointInfoController.java @@ -0,0 +1,191 @@ +package com.tcctyn.iot.forestfire.controller; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.DeviceUnderPointVO; +import com.tcctyn.iot.forestfire.VO.PointAndDeviceInfoVO; +import com.tcctyn.iot.forestfire.VO.PointInfoVO; +import com.tcctyn.iot.forestfire.VO.PointStatisticsByPointTypeVO; +import com.tcctyn.iot.forestfire.domain.DeviceInfo; +import com.tcctyn.iot.forestfire.domain.PointInfo; +import com.tcctyn.iot.forestfire.enums.DeviceStatusEnum; +import com.tcctyn.iot.forestfire.searcher.BaseIdListSearcher; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.iot.forestfire.service.IDeviceInfoService; +import com.tcctyn.iot.forestfire.service.IPointInfoService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + *

+ * 点位信息表 前端控制器 + *

+ * + * @author 代超 + * @since 2024-09-24 + */ + +@RestController +@RequestMapping("/pointInfo") +public class PointInfoController extends BaseController { + + + @Autowired + private IPointInfoService iPointInfoService; + + @Autowired + private ICommonService commonService; + + @Autowired + private IDeviceInfoService deviceInfoService; + + @GetMapping(value = "/list") + public AjaxResult list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer size) { + if (current == null) { + current = 1; + } + if (size == null) { + size = 10; + } + Page pageList = iPointInfoService.list(current, size); + return AjaxResult.success(pageList); + } + + + @GetMapping(value = "/get/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + PointInfoVO vo = iPointInfoService.getById(id); + return AjaxResult.success(vo); + } + + @PostMapping(value = "/create") + public AjaxResult create(@Validated @RequestBody PointInfo params) { +// params.setCreatedBy(getUsername()); + Integer result = iPointInfoService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iPointInfoService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@Validated @RequestBody PointInfo params) { +// params.setUpdatedBy(getUsername()); + Integer result = iPointInfoService.update(params); + return AjaxResult.success(result); + } + + /** + * 设备快捷修改启用/停用状态接口 + * + * @param params + * @return + */ + @PostMapping(value = "/updateEnableFlag") + public AjaxResult updateEnableFlag(@RequestBody PointInfo params) { + Integer result = iPointInfoService.updateEnableFlag(params); + return AjaxResult.success(result); + }//sgq2025.3.20 + + /** + * 条件查询,不分页,可用于查询云台、卡口 + * + * @param pointInfo + * @return + */ + @GetMapping(value = "/selectAll") + public AjaxResult selectAll(PointInfo pointInfo) { + List list = iPointInfoService.selectAll(pointInfo); + return AjaxResult.success(list); + } + + /** + * 点位批量删除接口 + * + * @param searcher + * @return + */ + @PostMapping(value = "/deleteBatch") + public AjaxResult deleteBatch(@RequestBody BaseIdListSearcher searcher) { + Integer result = iPointInfoService.deleteBatch(searcher.getIdList()); + return AjaxResult.success(result); + } + + /** + * 资源点分页查询 + * + * @param pointInfo + * @return + */ + @GetMapping(value = "/selectList") + public TableDataInfo selectList(PointInfo pointInfo) { + startPage(); + List list = iPointInfoService.selectList(pointInfo); + //处理归属地名称 + List voList = BeanUtils.copyList(list, PointInfoVO.class); + Map regionIdToNameMap = commonService.regionMapIdToName(null); + + //需要加上点位下的设备信息:设备总数、在线设备数、离线设备数;在分页的基础上去关联统计设备信息,减少查询的数据量 + List pointIdList = voList.stream().map(PointInfoVO::getId).collect(Collectors.toList()); + Map pointAndDeviceCountMap = new HashMap<>(); + if (!CollectionUtils.isEmpty(pointIdList)) { + List deviceInfoList = deviceInfoService.selectListByPointList(pointIdList); + Map> pointIdAndDeviceInfoListMap = deviceInfoList.stream().collect(Collectors.groupingBy(DeviceInfo::getPointId)); + pointIdAndDeviceInfoListMap.forEach((key, value) -> { + DeviceUnderPointVO deviceUnderPointVO = new DeviceUnderPointVO(); + deviceUnderPointVO.setTotalNum(value.size()); + deviceUnderPointVO.setOnlineNum(value.stream().filter(item -> DeviceStatusEnum.ON.name().equals(item.getDeviceStatus())).collect(Collectors.toList()).size()); + deviceUnderPointVO.setOfflineNum(deviceUnderPointVO.getTotalNum() - deviceUnderPointVO.getOnlineNum()); + pointAndDeviceCountMap.put(key, deviceUnderPointVO); + }); + } + voList.forEach(pointInfoVO -> { + String forestName = regionIdToNameMap.get(pointInfoVO.getForestId()) == null ? "" : regionIdToNameMap.get(pointInfoVO.getForestId()); + String farmName = regionIdToNameMap.get(pointInfoVO.getFarmId()) == null ? "" : regionIdToNameMap.get(pointInfoVO.getFarmId()); + String fenceName = regionIdToNameMap.get(pointInfoVO.getFenceId()) == null ? "" : regionIdToNameMap.get(pointInfoVO.getFenceId()); + pointInfoVO.setBelongingRegionName(forestName + (StringUtils.isEmpty(farmName) ? "" : "/" + farmName) + (StringUtils.isEmpty(fenceName) ? "" : "/" + fenceName)); + pointInfoVO.setDeviceUnderPointVO(pointAndDeviceCountMap.get(pointInfoVO.getId()) == null ? new DeviceUnderPointVO() : pointAndDeviceCountMap.get(pointInfoVO.getId())); + }); + return getDataTable(list, voList); + } + + /** + * 大屏页面查询监测点信息 + * 查询云台卡口信息,将点位类型写死为 云台、卡口 + * + * @param pointInfo + * @return + */ + @GetMapping(value = "/queryMonitoringPoint") + public AjaxResult queryMonitoringPoint(PointInfo pointInfo) { + List list = iPointInfoService.queryMonitoringPoint(pointInfo); + return AjaxResult.success(list); + } + + /** + * 资源点分类统计接口 + * + * @param + * @return + */ + @PostMapping(value = "/statisticsByPointType") + public AjaxResult statisticsByPointType() { + PointStatisticsByPointTypeVO vo = iPointInfoService.statisticsByPointType(); + return AjaxResult.success(vo); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/RegionInfoController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/RegionInfoController.java new file mode 100644 index 0000000..f38cc58 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/RegionInfoController.java @@ -0,0 +1,132 @@ +package com.tcctyn.iot.forestfire.controller; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.domain.entity.RegionInfo; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.iot.forestfire.service.IRegionInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + *

+ * 区域信息表 前端控制器 + *

+ * + * @author 代超 + * @since 2024-09-24 + */ + + +@RestController +@RequestMapping("/regionInfo") +public class RegionInfoController extends BaseController { + + + @Autowired + private IRegionInfoService iRegionInfoService; + + @GetMapping(value = "/list") + public AjaxResult list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer size) { + if (current == null) { + current = 1; + } + if (size == null) { + size = 10; + } + Page pageList = iRegionInfoService.list(current, size); + return AjaxResult.success(pageList); + } + + + @GetMapping(value = "/get/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + RegionInfo regionInfo = iRegionInfoService.getById(id); + return AjaxResult.success(regionInfo); + } + + @PostMapping(value = "/create") + public AjaxResult create(@Validated @RequestBody RegionInfo params) { +// params.setCreatedBy(getUsername()); + Integer result = iRegionInfoService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iRegionInfoService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@Validated @RequestBody RegionInfo params) { +// params.setUpdatedBy(getUsername()); + Integer result = iRegionInfoService.update(params); + return AjaxResult.success(result); + } + + /** + * 林区分页查询 + * + * @param regionInfo + * @return + */ + @GetMapping(value = "/selectList") + public TableDataInfo selectList(RegionInfo regionInfo) { + startPage(); + List list = iRegionInfoService.selectList(regionInfo); + return getDataTable(list); + } + + /** + * 根据父级id查询子级区域信息 + * + * @param parentId + * @return + */ + @GetMapping(value = "/selectAllByParentId/{parentId}") + public AjaxResult selectAllByParentId(@PathVariable("parentId") Long parentId) { + List list = iRegionInfoService.selectAllByParentId(parentId); + return AjaxResult.success(list); + } + + /** + * 查询完整的区域树信息 + * + * @param + * @return + */ + @GetMapping(value = "/selectAll/{level}") + public TableDataInfo selectAll(@PathVariable("level") Integer level) { + List list = iRegionInfoService.selectAll(level); + return getDataTable(list); + } + + /** + * 根据地区类型查询区域信息 + * + * @param areaType + * @return + */ + @GetMapping(value = "/selectAllByAreaType/{areaType}") + public AjaxResult selectAllByAreaType(@PathVariable("areaType") String areaType) { + List list = iRegionInfoService.selectAllByAreaType(areaType); + return AjaxResult.success(list); + } + + /** + * 查询树形区域信息 + * + * @param + * @return + */ + @GetMapping(value = "/regionTree") + public AjaxResult regionTree(RegionInfo regionInfo) { + return success(iRegionInfoService.selectRegionTree(regionInfo)); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/RoadController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/RoadController.java new file mode 100644 index 0000000..52cecdf --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/RoadController.java @@ -0,0 +1,105 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.iot.forestfire.domain.Road; +import com.tcctyn.iot.forestfire.domain.RoadInfo; +import com.tcctyn.iot.forestfire.searcher.road.RoadSearcher; +import com.tcctyn.iot.forestfire.service.IRoadInfoService; +import com.tcctyn.iot.forestfire.service.IRoadService; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + *

+ * 林间道路信息表 前端控制器 + *

+ * + * @author jason + * @since 2025-03-11 + */ + +@RestController +@RequestMapping("/road") +public class RoadController extends BaseController { + + + @Autowired + private IRoadService iRoadService; + + @Autowired + private IRoadInfoService iRoadInfoService; + + @GetMapping(value = "/list") + public AjaxResult list(RoadSearcher roadSearcher) { + if (roadSearcher.getPageNo() == null) { + roadSearcher.setPageNo(1); + } + if (roadSearcher.getPageSize() == null) { + roadSearcher.setPageSize(10); + } + Page pageList = iRoadService.selectPageList(roadSearcher); + if(ObjectUtils.isNotEmpty(pageList.getRecords())){ + List records = pageList.getRecords(); + + // 遍历 records 并修改每个 Road 对象 + for (Road road : records) { + // 对 Road 对象进行修改操作 + List infoList=iRoadInfoService.list(new QueryWrapper().eq("road_id", road.getId())); + road.setRoadInfoList(infoList); + + } + // 将修改后的 records 设置回 Page 对象 + pageList.setRecords(records); + + } + return AjaxResult.success(pageList); + } + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") String id) { + Road road=iRoadService.getById(id); + if (road==null) { + return AjaxResult.warn("暂无数据"); + } + List roadInfoList=iRoadInfoService.list(new QueryWrapper().eq("road_id", id)); + road.setRoadInfoList(roadInfoList); + return AjaxResult.success(road); + } + + @PostMapping(value = "/create") + public AjaxResult create(@RequestBody Road vo) { + Integer result = iRoadService.create(vo); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") String id) { + Road road=iRoadService.getById(id); + if (road==null) { + return AjaxResult.error("数据不存在"); + } + if(ObjectUtils.isNotEmpty(road.getRoadInfoList())){ + for(RoadInfo roadInfo:road.getRoadInfoList()){ + iRoadInfoService.removeById(roadInfo.getId()); + } + } + boolean isDel= iRoadService.removeById(id); + if(isDel){ + return AjaxResult.success("删除成功"); + }else{ + return AjaxResult.success("删除失败"); + } + } + + @PostMapping(value = "/update") + public AjaxResult update(@RequestBody Road params) { + Integer result = iRoadService.update(params); + return AjaxResult.success(result); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/RoadInfoController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/RoadInfoController.java new file mode 100644 index 0000000..d9ebe12 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/RoadInfoController.java @@ -0,0 +1,78 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.iot.forestfire.domain.RoadInfo; +import com.tcctyn.iot.forestfire.service.IRoadInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 林间道路详细信息表 前端控制器 + *

+ * + * @author jason + * @since 2025-03-11 + */ + +@RestController +@RequestMapping("/roadInfo") +public class RoadInfoController extends BaseController { + + + @Autowired + private IRoadInfoService iRoadInfoService; + + @GetMapping(value = "/list") + public AjaxResult list(@RequestParam(required = false) Integer pageNo, @RequestParam(required = false) Integer pageSize) { + if (pageNo == null) { + pageNo = 1; + } + if (pageSize == null) { + pageSize = 10; + } + Page pageData = iRoadInfoService.page(new Page<>(pageSize, pageSize)); + return AjaxResult.success(pageData); + } + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") String id) { + RoadInfo roadInfo=iRoadInfoService.getById(id); + if (roadInfo==null) { + return AjaxResult.warn("暂无数据"); + } + return AjaxResult.success(iRoadInfoService.getById(id)); + } + + @PostMapping(value = "/create") + public AjaxResult create(@RequestBody RoadInfo roadInfo) { + Integer result = iRoadInfoService.create(roadInfo); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") String id) { + RoadInfo roadInfo=iRoadInfoService.getById(id); + if (roadInfo==null) { + return AjaxResult.error("数据不存在"); + } + boolean remove=iRoadInfoService.removeById(id); + if(remove){ + return AjaxResult.success("删除成功"); + }else{ + return AjaxResult.error("删除失败"); + } + } + + @PostMapping(value = "/update") + public AjaxResult delete(@RequestBody RoadInfo params) { + boolean update= iRoadInfoService.updateById(params); + if(update) { + return AjaxResult.success("更新成功"); + }else{ + return AjaxResult.error("更新失败"); + } + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/SatelliteDataSimulationController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/SatelliteDataSimulationController.java new file mode 100644 index 0000000..8df4bf3 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/SatelliteDataSimulationController.java @@ -0,0 +1,97 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.iot.forestfire.VO.AirportVO; +import com.tcctyn.iot.forestfire.domain.SatelliteDataSimulation; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.iot.forestfire.service.ISatelliteDataSimulationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + *

+ * 卫星数据模拟表 前端控制器 + *

+ * + * @author 代超 + * @since 2024-11-05 + */ + +@RestController +@RequestMapping("/satelliteDataSimulation") +public class SatelliteDataSimulationController extends BaseController { + + + @Autowired + private ISatelliteDataSimulationService iSatelliteDataSimulationService; + + @Autowired + private ICommonService commonService; + + @GetMapping(value = "/list") + public AjaxResult list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer size) { + if (current == null) { + current = 1; + } + if (size == null) { + size = 10; + } + Page pageList = iSatelliteDataSimulationService.list(current, size); + return AjaxResult.success(pageList); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + SatelliteDataSimulation satelliteDataSimulation = iSatelliteDataSimulationService.getById(id); + return AjaxResult.success(satelliteDataSimulation); + } + + @PostMapping(value = "/create") + public AjaxResult create(@RequestBody SatelliteDataSimulation params) { + Integer result = iSatelliteDataSimulationService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iSatelliteDataSimulationService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@RequestBody SatelliteDataSimulation params) { + Integer result = iSatelliteDataSimulationService.update(params); + return AjaxResult.success(result); + } + + /** + * 查询最近一批十五分钟内的数据 + * + * @param + * @return + */ + @GetMapping(value = "/selectRecentlyData") + public AjaxResult selectRecentlyData(@RequestParam Date currentTime) { + List list = iSatelliteDataSimulationService.selectRecentlyData(currentTime); + return AjaxResult.success(list); + } + + /** + * 对某个高风险地区进行降风险处理, + * 需要返回给前端最近的机场的坐标,方便前端模拟无人机起飞的效果 + */ + @PostMapping(value = "/reduceRisk/{id}") + public AjaxResult reduceRisk(@PathVariable("id") Long id) { + AirportVO vo = iSatelliteDataSimulationService.reduceRisk(id); + Map regionIdAndNameMap = commonService.regionMapIdToName(null); + vo.setRegionName(regionIdAndNameMap.get(vo.getRegionId())); + return AjaxResult.success(vo); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/SchedulePlanController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/SchedulePlanController.java new file mode 100644 index 0000000..c3b7466 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/SchedulePlanController.java @@ -0,0 +1,104 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.SchedulePlanVO; +import com.tcctyn.iot.forestfire.domain.SchedulePlan; +import com.tcctyn.iot.forestfire.service.IRegionInfoService; +import com.tcctyn.iot.forestfire.service.ISchedulePlanService; +import com.tcctyn.iot.forestfire.service.IScheduleTemplateService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +/** + *

+ * 排班计划 前端控制器 + *

+ * + * @author liuzh + * @since 2024-10-16 + */ + +@RestController +@RequestMapping("/schedulePlan") +public class SchedulePlanController extends BaseController { + + @Autowired + private ISchedulePlanService iSchedulePlanService; + + @Autowired + private IScheduleTemplateService iScheduleTemplateService; + + @Autowired + private IRegionInfoService regionInfoService; + + @GetMapping(value = "/list") + public TableDataInfo list(SchedulePlan schedulePlan) { + startPage(); + List doList = iSchedulePlanService.list(schedulePlan); + List voList = new ArrayList<>(); + doList.forEach(schedulePlan1 -> { + SchedulePlanVO schedulePlanVo = new SchedulePlanVO(); + //如果 forestId, farmId, fenceId 有值,就查对应的区域名称并拼接到 regionName 中 + String regionName = ""; + if (schedulePlan1.getForestId() != null) { + regionName += regionInfoService.getById(schedulePlan1.getForestId()).getAreaName() + ","; + } + if (schedulePlan1.getFarmId() != null) { + regionName += regionInfoService.getById(schedulePlan1.getFarmId()).getAreaName() + ","; + } + if (schedulePlan1.getFenceId() != null) { + regionName += regionInfoService.getById(schedulePlan1.getFenceId()).getAreaName(); + } + BeanUtils.copyBeanProp(schedulePlan1, schedulePlanVo); + schedulePlanVo.setRegionName(regionName);; + voList.add(schedulePlanVo); + }); + + return getDataTable(doList, voList); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + SchedulePlan schedulePlan = iSchedulePlanService.getById(id); + return AjaxResult.success(schedulePlan); + } + + @PostMapping(value = "/create") + public AjaxResult create(@RequestBody SchedulePlan params) { +// params.setCreatedBy(getUsername()); + Integer result = iSchedulePlanService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iSchedulePlanService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@RequestBody SchedulePlan params) { +// params.setUpdatedBy(getUsername()); + Integer result = iSchedulePlanService.update(params); + return AjaxResult.success(result); + } + + /** + * 根据模板生成排班信息 + * @param params + * @return + */ + @PostMapping(value = "/generate") + public AjaxResult generate(@RequestBody SchedulePlan params) { + + Integer result = iSchedulePlanService.generate(params); + return AjaxResult.success(result); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/ScheduleTemplateController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/ScheduleTemplateController.java new file mode 100644 index 0000000..b5022d3 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/ScheduleTemplateController.java @@ -0,0 +1,67 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.iot.forestfire.VO.ScheduleTemplateVO; +import com.tcctyn.iot.forestfire.domain.ScheduleTemplate; +import com.tcctyn.iot.forestfire.service.IScheduleTemplateService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + *

+ * 排班模板 前端控制器 + *

+ * + * @author liuzh + * @since 2024-10-16 + */ + +@RestController +@RequestMapping("/scheduleTemplate") +public class ScheduleTemplateController extends BaseController { + + + @Autowired + private IScheduleTemplateService iScheduleTemplateService; + + @GetMapping(value = "/list") + public AjaxResult list(@Validated ScheduleTemplate scheduleTemplate) { + List list = iScheduleTemplateService.list(scheduleTemplate); + return AjaxResult.success(list); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + ScheduleTemplate scheduleTemplate = iScheduleTemplateService.getById(id); + return AjaxResult.success(scheduleTemplate); + } + + @PostMapping(value = "/create") + public AjaxResult create(@RequestBody ScheduleTemplate params) { + Integer result = iScheduleTemplateService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iScheduleTemplateService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@RequestBody ScheduleTemplate params) { + Integer result = iScheduleTemplateService.update(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/createBatch") + public AjaxResult createBatch(@RequestBody List params) { + boolean result = iScheduleTemplateService.createBatch(params); + return AjaxResult.success(result); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/SchedulesController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/SchedulesController.java new file mode 100644 index 0000000..7a84db1 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/SchedulesController.java @@ -0,0 +1,278 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.DateUtils; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.*; +import com.tcctyn.iot.forestfire.domain.CheckInRecord; +import com.tcctyn.iot.forestfire.domain.PointInfo; +import com.tcctyn.iot.forestfire.domain.Schedules; +import com.tcctyn.iot.forestfire.mapper.PointInfoMapper; +import com.tcctyn.iot.forestfire.searcher.schedules.ScheduleSwapSearcher; +import com.tcctyn.iot.forestfire.searcher.schedules.SchedulesSearcher; +import com.tcctyn.iot.forestfire.service.*; +import com.tcctyn.system.api.RemoteUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.time.YearMonth; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + *

+ * 排班表 前端控制器 + *

+ * + * @author liuzh + * @since 2024-09-24 + */ + +@RestController +@RequestMapping("/schedules") +public class SchedulesController extends BaseController { + + @Autowired + private ISchedulesService iSchedulesService; + + @Autowired + private IPatrolPathService patrolPathService; + + @Resource + private RemoteUserService remoteUserService; + + @Autowired + private ICheckInRecordService checkInRecordService; + + @Resource + private PointInfoMapper pointInfoMapper; + + @Autowired + private ISchedulePlanService schedulePlanService; + + @Autowired + private ICommonService commonService; + + /** + * 获取周排班信息 + * + * @param schedules + * @return + */ + @GetMapping(value = "/list") + public AjaxResult list(Schedules schedules) { + AjaxResult ajax = AjaxResult.success(); + //如果日期为空,则设置为当前日期 + if (schedules.getDateOfWeek() == null) { + schedules.setDateOfWeek(new Date()); + } + List weeklist = iSchedulesService.weekList(schedules); +// startPage(); + List> list = iSchedulesService.list(weeklist, schedules); + ajax.put("rows", list); + List dateList = new ArrayList<>(7); + Date currentMonday = DateUtils.getThisWeekMonday(schedules.getDateOfWeek()); + for (int i = 0; i < 7; i++) { + dateList.add(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, DateUtils.addDays(currentMonday, i))); + } + ajax.put("dateList", dateList); + return ajax; + } + + /** + * 生成下周的排班信息 + * + * @return + */ + /*@PostMapping(value = "/generate") + public AjaxResult generate() { + if (iSchedulesService.generate()) { + return AjaxResult.success(); + } else { + return AjaxResult.warn("生成失败"); + } + }*/ + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + Schedules schedules = iSchedulesService.getById(id); + return AjaxResult.success(schedules); + } + + @PostMapping(value = "/create") + public AjaxResult create(@RequestBody Schedules params) { + Integer result = iSchedulesService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iSchedulesService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@RequestBody Schedules params) { + Integer result = iSchedulesService.update(params); + return AjaxResult.success(result); + } + + /** + * 批量操作 + * + * @param + * @return + */ + /*@PostMapping(value = "/batch") + public AjaxResult createBatch(@RequestBody ScheduleDetail scheduleDetail) { + if (scheduleDetail.getDateOfWeek().isEmpty()) { + return AjaxResult.warn("日期不能为空"); + + } + Integer result = iSchedulesService.createBatch(scheduleDetail); + return AjaxResult.success(result); + }*/ + + /** + * 查询列表 + */ + @GetMapping(value = "/selectList") + public TableDataInfo selectList(Schedules schedules, + @RequestParam(required = false) Date startDate, + @RequestParam(required = false) Date endDate, + @RequestParam(required = false) String userName) { + startPage(); + List doList = iSchedulesService.selectList(schedules, startDate, endDate, userName); + List voList = new ArrayList<>(); + for (Schedules doItem : doList) { + ScheduleVO voItem = new ScheduleVO(); + BeanUtils.copyProperties(doItem, voItem); + voItem.setUserName(remoteUserService.selectUserById(doItem.getUserId()).getData().getNickName()); + voItem.setPathName(commonService.pathMapIdToName(doItem.getPathId()).get(doItem.getPathId())); + //增加今日打卡总共需要打卡次数 + List pointInfoList = pointInfoMapper.selectList(new QueryWrapper().eq("belonging_region_id", doItem.getPathId()).eq("point_type", "CHECK_IN_POINT")); + voItem.setTotalTimes(pointInfoList.size()); + //增加今日打卡次数 + List currentCheckInRecord = checkInRecordService.getByUserId(doItem.getUserId(), doItem.getDateOfWeek()); + if (!currentCheckInRecord.isEmpty()) { + voItem.setCheckTimes(currentCheckInRecord.size()); + } else { + voItem.setCheckTimes(0); + } + + voList.add(voItem); + } + return getDataTable(doList, voList); + } + + + /** + * 单个用户调班 + * + * @param params + * @return + */ + @PostMapping(value = "/swap") + public AjaxResult swap(@RequestBody ScheduleSwapSearcher params) { + Integer result = iSchedulesService.swapSchedule(params); + return AjaxResult.success(result); + } + + /** + * 大屏页面按钮,展示当日的人员巡护信息及打卡信息 + * 需要暂时当日值班人员的巡护路径、最新打卡点位置信息、无打卡信息的人员位置信息默认用路径的第一个点位经纬度作为人员的当前位置 + */ + @PostMapping(value = "/queryRangerInfo") + public AjaxResult queryRangerInfo(@RequestBody(required = false) SchedulesSearcher params) { + List voList = iSchedulesService.queryRangerInfo(params); + return AjaxResult.success(voList); + } + + /** + * 大屏页面巡护统计,获取当日排班人员数量,当日打卡人员数量,需要distinct + * 统计排班路径下的所有 应打卡点数量, 当日已打卡点数量 + */ + @PostMapping(value = "/queryRangerStatistics") + public AjaxResult queryRangerStatistics(@RequestBody(required = false) SchedulesSearcher params) { + RangerStatisticsVO vo = iSchedulesService.queryRangerStatistics(params); + return AjaxResult.success(vo); + } + + /** + * 查询当天的排班信息,返回排班信息列表,及人员信息列表,不分页 + * 大屏页面 + * + * @param params + * @return + */ + @PostMapping(value = "/queryScheduleByCondition") + public AjaxResult queryScheduleByCondition(@RequestBody(required = false) SchedulesSearcher params) { + List voList = iSchedulesService.queryScheduleByCondition(params); + return AjaxResult.success(voList); + } + + /** + * 排班记录详情,带上巡护路径下面的点位信息,标识出已打卡的点位、未打卡的点位 + * 大屏页面 + */ + @GetMapping(value = "/queryScheduleDetail/{scheduleId}") + public AjaxResult queryScheduleDetail(@PathVariable("scheduleId") Long scheduleId) { + ScheduleDetailInfoVO vo = iSchedulesService.queryScheduleDetail(scheduleId); + return AjaxResult.success(vo); + } + + /** + * 当日护林员信息统计:当日值班人数,打卡数量,临时任务数量 + * 大屏页面 + * + * @param regionId + * @return + */ + @GetMapping(value = "/queryForesterStatistics") + public AjaxResult queryForesterStatistics(@RequestParam(required = false) Long regionId) { + ForesterStatisticsVO statisticsVO = iSchedulesService.queryForesterStatistics(regionId); + return AjaxResult.success(statisticsVO); + } + + /** + * 获取用户当日值班状态 + * + * @param regionId + * @param queryDate + * @return + */ + @GetMapping(value = "/getUserScheduleStatus") + public AjaxResult queryScheduleDetail(@RequestParam(required = false) Long regionId, @RequestParam(required = false) Date queryDate) { + List userScheduleStatusList = iSchedulesService.getUserScheduleStatus(regionId, queryDate); + return AjaxResult.success(userScheduleStatusList); + } + + /** + * 获取用户当日值班信息 + */ + @GetMapping(value = "/getUserSchedule") + public AjaxResult getUserSchedule(@RequestParam(required = false) Date date) { +// Long userId = 102L; + Long userId = super.getUserId(); + ScheduleVO vo = iSchedulesService.getUserSchedule(userId, date); + return AjaxResult.success(vo); + } + + /** + * 查询月排班及打卡情况 + * 默认查当前月的,如果前端输入了月份,则查指定月份"yyyy-MM" + */ + @GetMapping(value = "/queryMonthSchedule") + public AjaxResult queryMonthSchedule(@RequestParam(required = false) YearMonth month) { +// Long userId = 102L; + Long userId = super.getUserId(); + List voList = iSchedulesService.queryMonthSchedule(userId, month); + return AjaxResult.success(voList); + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/ShiftController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/ShiftController.java new file mode 100644 index 0000000..17f26cf --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/ShiftController.java @@ -0,0 +1,82 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.iot.forestfire.domain.Shift; +import com.tcctyn.iot.forestfire.service.IShiftService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + *

+ * 班次表 前端控制器 + *

+ * + * @author liuzh + * @since 2024-09-24 + */ + +@RestController +@RequestMapping("/shift") +public class ShiftController extends BaseController { + @Autowired + private IShiftService iShiftService; + + @GetMapping(value = "/list") + public AjaxResult list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer size) { + if (current == null) { + current = 1; + } + if (size == null) { + size = 10; + } + Page pageList = iShiftService.list(current,size); + return AjaxResult.success(pageList); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + Shift shift = iShiftService.getById(id); + return AjaxResult.success(shift); + } + + @PostMapping(value = "/create") + public AjaxResult create(@Validated @RequestBody Shift params) { + Integer result = iShiftService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iShiftService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@RequestBody Shift params) { + Integer result = iShiftService.update(params); + return AjaxResult.success(result); + } + + @GetMapping(value = "/selectList") + public TableDataInfo selectList(Shift shift) { + startPage(); + List list = iShiftService.selectShiftList(shift); + return getDataTable(list); + } + + /** + * 获取全部班次信息 + * @return + */ + @GetMapping(value = "/allShift") + public AjaxResult allShift(){ + return AjaxResult.success(iShiftService.allShift()); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/TemporaryTaskController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/TemporaryTaskController.java new file mode 100644 index 0000000..305467e --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/TemporaryTaskController.java @@ -0,0 +1,236 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.TemporaryTaskVO; +import com.tcctyn.iot.forestfire.domain.TemporaryTask; +import com.tcctyn.iot.forestfire.searcher.BaseIdListSearcher; +import com.tcctyn.iot.forestfire.searcher.temporarytask.TemporaryTaskStatusSearcher; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.iot.forestfire.service.ITemporaryTaskService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + *

+ * 临时任务表 前端控制器 + *

+ * + * @author 代超 + * @since 2024-11-01 + */ + +@RestController +@RequestMapping("/temporaryTask") +public class TemporaryTaskController extends BaseController { + + + @Autowired + private ITemporaryTaskService iTemporaryTaskService; + + @Autowired + private ICommonService commonService; + + @GetMapping(value = "/list") + public AjaxResult list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer size) { + if (current == null) { + current = 1; + } + if (size == null) { + size = 10; + } + Page pageList = iTemporaryTaskService.list(current, size); + return AjaxResult.success(pageList); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + TemporaryTask temporaryTask = iTemporaryTaskService.getById(id); + //做regionName 、 任务人姓名、任务接收人姓名的映射 + TemporaryTaskVO temporaryTaskVO = new TemporaryTaskVO(); + BeanUtils.copyBeanProp(temporaryTask, temporaryTaskVO); + Map regionIdToNameMap = commonService.regionMapIdToName(temporaryTask.getRegionId()); + Map userIdToNameMap = commonService.userMapIdToName(null); + temporaryTaskVO.setRegionName(Optional.ofNullable(regionIdToNameMap.get(temporaryTask.getRegionId())).orElse("")); + temporaryTaskVO.setTaskPersonName(Optional.ofNullable(userIdToNameMap.get(temporaryTask.getTaskPersonId())).orElse("")); + temporaryTaskVO.setTaskRecipientName(Optional.ofNullable(userIdToNameMap.get(temporaryTask.getTaskRecipientId())).orElse("")); + return AjaxResult.success(temporaryTaskVO); + } + + @PostMapping(value = "/create") + public AjaxResult create(@Validated @RequestBody TemporaryTask params) { + Long userId = super.getUserId(); + params.setIssuerId(userId); + Integer result = iTemporaryTaskService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iTemporaryTaskService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@RequestBody TemporaryTask params) { + Integer result = iTemporaryTaskService.update(params); + return AjaxResult.success(result); + } + + /** + * 临时任务归档 + * + * @param id + * @return + */ + @PostMapping(value = "/archive/{id}") + public AjaxResult archive(@PathVariable("id") Long id) { + Integer result = iTemporaryTaskService.archive(id); + return AjaxResult.success(result); + } + + /** + * 临时任务批量归档 + */ + @PostMapping(value = "/archiveBatch") + public AjaxResult archiveBatch(@RequestBody BaseIdListSearcher searcher) { + Integer result = iTemporaryTaskService.archiveBatch(searcher); + return AjaxResult.success(result); + } + + /** + * 临时任务分页查询 + * + * @param temporaryTask + * @return + */ + @GetMapping(value = "/selectList") + public TableDataInfo selectList(TemporaryTask temporaryTask) { + startPage(); + List taskList = iTemporaryTaskService.selectList(temporaryTask); + List voList = BeanUtils.copyList(taskList, TemporaryTaskVO.class); + Map userIdToNameMap = commonService.userMapIdToName(null); + Map regionIdToNameMap = commonService.regionMapIdToName(null); + voList.forEach(item -> { + item.setRegionName(Optional.ofNullable(regionIdToNameMap.get(item.getRegionId())).orElse("")); + item.setTaskPersonName(Optional.ofNullable(userIdToNameMap.get(item.getTaskPersonId())).orElse("")); + item.setTaskRecipientName(Optional.ofNullable(userIdToNameMap.get(item.getTaskRecipientId())).orElse("")); + }); + return getDataTable(taskList, voList); + } + + @GetMapping(value = "/selectOneDayList") + public AjaxResult selectOneDayList(TemporaryTask temporaryTask) { + List voList = iTemporaryTaskService.selectOneDayList(temporaryTask); + return AjaxResult.success(voList); + } + + + /** + * 查询未完成、进行中的临时任务(分页) + * + * @param temporaryTask + * @return + */ + @GetMapping(value = "/selectUncompletedList") + public TableDataInfo selectUncompletedList(TemporaryTask temporaryTask) { + startPage(); + List taskList = iTemporaryTaskService.selectUncompletedList(temporaryTask); + List voList = BeanUtils.copyList(taskList, TemporaryTaskVO.class); + Map userIdToNameMap = commonService.userMapIdToName(null); + Map regionIdToNameMap = commonService.regionMapIdToName(null); + voList.forEach(item -> { + item.setRegionName(Optional.ofNullable(regionIdToNameMap.get(item.getRegionId())).orElse("")); + item.setTaskPersonName(Optional.ofNullable(userIdToNameMap.get(item.getTaskPersonId())).orElse("")); + item.setTaskRecipientName(Optional.ofNullable(userIdToNameMap.get(item.getTaskRecipientId())).orElse("")); + }); + return getDataTable(taskList, voList); + } + + /** + * 任务接受与完成接口,通过状态字段来判断,任务状态分为未接受、执行中、已完成 + * + * @param searcher + * @return + */ + @PostMapping(value = "/updateTaskStatus") + public AjaxResult updateTaskStatus(@RequestBody TemporaryTaskStatusSearcher searcher) { +// Long userId = 102L; + Long userId = super.getUserId(); + Integer result = iTemporaryTaskService.updateTaskStatus(searcher, userId); + return AjaxResult.success(result); + } + + /** + * 个人未接受临时任务列表分页查询 + */ + @GetMapping(value = "/selectPersonalNotAcceptedTaskList") + public TableDataInfo selectPersonalNotAcceptedTaskList(TemporaryTask temporaryTask) { +// Long userId = 100L; + Long userId = super.getUserId(); + temporaryTask.setTaskPersonId(userId); + startPage(); + List taskList = iTemporaryTaskService.selectList(temporaryTask); + List voList = BeanUtils.copyList(taskList, TemporaryTaskVO.class); + Map userIdToNameMap = commonService.userMapIdToName(null); + Map regionIdToNameMap = commonService.regionMapIdToName(null); + voList.forEach(item -> { + item.setRegionName(Optional.ofNullable(regionIdToNameMap.get(item.getRegionId())).orElse("")); + item.setTaskPersonName(Optional.ofNullable(userIdToNameMap.get(item.getTaskPersonId())).orElse("")); + item.setTaskRecipientName(Optional.ofNullable(userIdToNameMap.get(item.getTaskRecipientId())).orElse("")); + }); + return getDataTable(voList); + } + + /** + * 个人进行中、已完成临时任务列表分页查询 + * 个人已经接受了的任务 + */ + @GetMapping(value = "/selectPersonalAcceptedTaskList") + public TableDataInfo selectPersonalAcceptedTaskList(TemporaryTask temporaryTask) { +// Long userId = 100L; + Long userId = super.getUserId(); + temporaryTask.setTaskRecipientId(userId); + startPage(); + List taskList = iTemporaryTaskService.selectList(temporaryTask); + List voList = BeanUtils.copyList(taskList, TemporaryTaskVO.class); + Map userIdToNameMap = commonService.userMapIdToName(null); + Map regionIdToNameMap = commonService.regionMapIdToName(null); + voList.forEach(item -> { + item.setRegionName(Optional.ofNullable(regionIdToNameMap.get(item.getRegionId())).orElse("")); + item.setTaskPersonName(Optional.ofNullable(userIdToNameMap.get(item.getTaskPersonId())).orElse("")); + item.setTaskRecipientName(Optional.ofNullable(userIdToNameMap.get(item.getTaskRecipientId())).orElse("")); + }); + return getDataTable(voList); + } + + /** + * APP 端任务下发,根据下发人分页查询任务列表 + */ + @GetMapping(value = "/selectIssuedTaskList") + public TableDataInfo selectIssuedTaskList(TemporaryTask temporaryTask) { +// Long userId = 1L; + Long userId = super.getUserId(); + temporaryTask.setIssuerId(userId); + startPage(); + List taskList = iTemporaryTaskService.selectList(temporaryTask); + List voList = BeanUtils.copyList(taskList, TemporaryTaskVO.class); + Map userIdToNameMap = commonService.userMapIdToName(null); + Map regionIdToNameMap = commonService.regionMapIdToName(null); + voList.forEach(item -> { + item.setRegionName(Optional.ofNullable(regionIdToNameMap.get(item.getRegionId())).orElse("")); + item.setTaskPersonName(Optional.ofNullable(userIdToNameMap.get(item.getTaskPersonId())).orElse("")); + item.setTaskRecipientName(Optional.ofNullable(userIdToNameMap.get(item.getTaskRecipientId())).orElse("")); + }); + return getDataTable(voList); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/VoiceTemplateConfigController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/VoiceTemplateConfigController.java new file mode 100644 index 0000000..c455a8c --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/VoiceTemplateConfigController.java @@ -0,0 +1,65 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.iot.forestfire.domain.VoiceTemplateConfig; +import com.tcctyn.iot.forestfire.service.IVoiceTemplateConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 语音播报模板表 前端控制器 + *

+ * TODO 后续再开发,目前语音预警消息已经够用了,后面看看真实需求再处理 + * + * @author daichao + * @since 2024-12-17 + */ + +@RestController +@RequestMapping("/voiceTemplateConfig") +public class VoiceTemplateConfigController extends BaseController { + + + @Autowired + private IVoiceTemplateConfigService iVoiceTemplateConfigService; + + @GetMapping(value = "/list") + public AjaxResult list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer size) { + if (current == null) { + current = 1; + } + if (size == null) { + size = 10; + } + Page pageList = iVoiceTemplateConfigService.list(current,size); + return AjaxResult.success(pageList); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + VoiceTemplateConfig voiceTemplateConfig = iVoiceTemplateConfigService.getById(id); + return AjaxResult.success(voiceTemplateConfig); + } + + @PostMapping(value = "/create") + public AjaxResult create(@RequestBody VoiceTemplateConfig params) { + Integer result = iVoiceTemplateConfigService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iVoiceTemplateConfigService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@RequestBody VoiceTemplateConfig params) { + Integer result = iVoiceTemplateConfigService.update(params); + return AjaxResult.success(result); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/WarehouseController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/WarehouseController.java new file mode 100644 index 0000000..d445133 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/controller/WarehouseController.java @@ -0,0 +1,106 @@ +package com.tcctyn.iot.forestfire.controller; + +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.web.page.TableDataInfo; +import com.tcctyn.common.core.utils.StringUtils; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.WarehouseSelectVO; +import com.tcctyn.iot.forestfire.VO.WarehouseVO; +import com.tcctyn.iot.forestfire.domain.Warehouse; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.iot.forestfire.service.IWarehouseService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + *

+ * 仓库信息 前端控制器 + *

+ * + * @author liuzh + * @since 2024-10-09 + */ + +@RestController +@RequestMapping("/warehouse") +public class WarehouseController extends BaseController { + + + @Autowired + private IWarehouseService iWarehouseService; + + @Autowired + private ICommonService commonService; + + @GetMapping(value = "/list") + public TableDataInfo list(Warehouse warehouse) { + startPage(); + List doList = iWarehouseService.list(warehouse); + List voList = BeanUtils.copyList(doList, WarehouseVO.class); + Map regionIdToNameMap = commonService.regionMapIdToName(null); + voList.forEach(warehouseVO -> { + String forestName = regionIdToNameMap.get(warehouseVO.getForestId()) == null ? "" : regionIdToNameMap.get(warehouseVO.getForestId()); + String farmName = regionIdToNameMap.get(warehouseVO.getFarmId()) == null ? "" : regionIdToNameMap.get(warehouseVO.getFarmId()); + String fenceName = regionIdToNameMap.get(warehouseVO.getFenceId()) == null ? "" : regionIdToNameMap.get(warehouseVO.getFenceId()); + + warehouseVO.setRegionName(forestName + (StringUtils.isEmpty(farmName) ? "" : "/" + farmName) + (StringUtils.isEmpty(fenceName) ? "" : "/" + fenceName)); + }); + return getDataTable(doList, voList); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getById(@PathVariable("id") Long id) { + Warehouse warehouse = iWarehouseService.getById(id); + return AjaxResult.success(warehouse); + } + + @PostMapping(value = "/create") + public AjaxResult create(@RequestBody Warehouse params) { +// params.setCreatedBy(getUsername()); + Integer result = iWarehouseService.create(params); + return AjaxResult.success(result); + } + + @PostMapping(value = "/delete/{id}") + public AjaxResult delete(@PathVariable("id") Long id) { + Integer result = iWarehouseService.delete(id); + return AjaxResult.success(result); + } + + @PostMapping(value = "/update") + public AjaxResult update(@RequestBody Warehouse params) { +// params.setUpdatedBy(getUsername()); + Integer result = iWarehouseService.update(params); + return AjaxResult.success(result); + } + + @GetMapping(value = "/select/{regionId}") + public AjaxResult selectWarehouse(@PathVariable("regionId") Long regionId) { + List result = iWarehouseService.selectWarehouse(regionId); + return AjaxResult.success(result); + } + + /** + * 根据前端传入的查询条件查询所有的仓库信息 + * + * @param warehouse + * @return + */ + @GetMapping(value = "/selectAll") + public AjaxResult selectAll(Warehouse warehouse) { + List list = iWarehouseService.selectAll(warehouse); + //DO 转 VO + List voList = BeanUtils.copyList(list, WarehouseVO.class); + Map regionIdToNameMap = commonService.regionMapIdToName(null); + voList.forEach(warehouseVO -> { + warehouseVO.setRegionName(Optional.ofNullable(regionIdToNameMap.get(warehouseVO.getRegionId())).orElse("")); + }); + return AjaxResult.success(voList); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/ApprovalRecord.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/ApprovalRecord.java new file mode 100644 index 0000000..f87afa3 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/ApprovalRecord.java @@ -0,0 +1,106 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.tcctyn.iot.handler.JsonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 审批记录表 + *

+ * + * @author daichao + * @since 2024-12-09 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("approval_record") +public class ApprovalRecord implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 业务类型 + */ + private String businessType; + + /** + * 业务数据id + */ + private Long businessDataId; + + /** + * 业务数据内容 + */ + @TableField(typeHandler = JsonTypeHandler.class) + private Object businessContent; + + /** + * 审批标识,0-未审批,1-已审批 + */ + private Integer approvalFlag; + + /** + * 审批状态,0-驳回,1-通过 + */ + private Integer approvalStatus; + + /** + * 驳回说明 + */ + private String rejectionStatement; + + /** + * 审核人id + */ + private Long reviewerId; + + /** + * 审核时间 + */ + private Date reviewTime; + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/CarouselImageConfig.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/CarouselImageConfig.java new file mode 100644 index 0000000..acb4718 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/CarouselImageConfig.java @@ -0,0 +1,87 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 轮播图配置表 + *

+ * + * @author daichao + * @since 2024-12-17 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("carousel_image_config") +public class CarouselImageConfig implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 图片主题 + */ + @NotBlank(message = "请填写图片主题") + private String imageTheme; + + /** + * 图片 + */ + @NotBlank(message = "图片不能为空") + private String image; + + /** + * 序号 + */ + private Integer sortNo; + + /** + * 是否启用:0-停用,1-启用 + */ + private Integer enableFlag; + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/CheckInRecord.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/CheckInRecord.java new file mode 100644 index 0000000..fca0bba --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/CheckInRecord.java @@ -0,0 +1,114 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 打卡记录表 + *

+ * + * @author liuzh + * @since 2024-10-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("check_in_record") +public class CheckInRecord implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 排班id + */ + private Long scheduleId; + + /** + * 点位id + */ + @NotNull(message = "打卡点位id不能为空") + private Long pointId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 巡护路径id + */ + private Long pathId; + + /** + * 用户id + */ + private Long userId; + + /** + * 打卡时间 + */ + private Date checkInTime; + + /** + * 打卡地点 + */ + @NotBlank(message = "当前打卡位置不能为空") + private String location; + + /** + * 经度 + */ + @NotBlank(message = "经度不能为空") + private String longitude; + + /** + * 纬度 + */ + @NotBlank(message = "纬度不能为空") + private String latitude; + + /** + * 高度 + */ + private String height; + + /** + * 备注信息 + */ + private String remark; + + /** + * 有效打卡标识 1-有效,0-无效 + */ + private Integer effectiveFlag; + + /** + * 打卡拍照 + */ + private String checkPicture; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/DeviceChanels.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/DeviceChanels.java new file mode 100644 index 0000000..bc8d639 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/DeviceChanels.java @@ -0,0 +1,74 @@ +package com.tcctyn.iot.forestfire.domain; + + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.Date; + +/** + *

+ * 设备通道表 + *

+ * + * @author 宋国强 + * @since 2025-04-09 + */ + +@Data +public class DeviceChanels { + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 设备编号 + */ + @NotBlank(message = "设备编号不能为空") + private String deviceNo; + + /** + * 通道号 + */ + private String chanelNo; + + /** + * 名称 + */ + private String name; + + /** + * 流地址 + */ + private String streamUrl; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 创建时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 修改时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/DeviceConfig.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/DeviceConfig.java new file mode 100644 index 0000000..22df8e2 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/DeviceConfig.java @@ -0,0 +1,58 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + *

+ * 设备配置表 + *

+ * + * @author 宋国强 + * @since 2025-04-14 + */ + +@Data +public class DeviceConfig { + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 设备编号 + */ + @NotBlank(message = "设备编号不能为空") + private String deviceNo; + + /** + * 用户账户 + */ + private String username; + + /** + * 密码 + */ + private String password; + + /** + * IP地址 + */ + private String ip; + + /** + * 端口号 + */ + private String port; + + /** + * 备注 + */ + private String remark; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/DeviceInfo.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/DeviceInfo.java new file mode 100644 index 0000000..e086240 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/DeviceInfo.java @@ -0,0 +1,161 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 设备信息表 + *

+ * + * @author 代超 + * @since 2024-10-09 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("device_info") +public class DeviceInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 设备编号 + */ + @NotBlank(message = "设备编号不能为空") + private String deviceNo; + + /** + * 设备名称 + */ + private String deviceName; + + /** + * 设备型号 + */ + private String deviceModel; + + /** + * 设备厂商 + */ + private String deviceManufacturer; + + /** + * 设备协议 + */ + private String deviceProtocol; + + /** + * 接入方式 + */ + private String accessMethod; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 设备状态:在线/离线 + */ + private String deviceStatus; + + /** + * 归属区域id,机场需要挂在地区下面 + */ + private Long regionId; + + /** + * 归属云台/卡口id + */ + private Long pointId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 机场id + */ + private Long airportId; + + /** + * 地址 + */ + private String address; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 高度 + */ + private String height; + + /** + * 设备启用状态:0-停用/1-启用 + */ + private Integer enableFlag; + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/DroneTaskPlan.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/DroneTaskPlan.java new file mode 100644 index 0000000..1b6e1bf --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/DroneTaskPlan.java @@ -0,0 +1,83 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 无人机任务计划表 + *

+ * + * @author 代超 + * @since 2024-11-07 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("drone_task_plan") +public class DroneTaskPlan implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 无人机编号 + */ + private String droneNo; + + /** + * 任务区域 + */ + private Long regionId; + + /** + * 任务名称 + */ + private String taskName; + + /** + * 任务类型:周期性任务、单次性任务 + */ + private String taskType; + + /** + * 单次任务标识:0-非单次任务;1-单次任务 + */ + private Integer singleTaskFlag; + + /** + * 执行周期:每多少天执行多少次 + */ + private String executionCycle; + + /** + * 任务状态:未执行、执行中、已完成 + */ + private String taskStatus; + + /** + * 开始时间 + */ + private Date startTime; + + /** + * 结束时间 + */ + private Date endTime; + + /** + * 任务航线:可以暂时存放经纬度信息,给前端提供模拟的航线 + */ + private String taskRoute; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/FireReport.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/FireReport.java new file mode 100644 index 0000000..2705bc7 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/FireReport.java @@ -0,0 +1,209 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 火情上报表 + *

+ * + * @author 代超 + * @since 2024-11-01 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("fire_report") +public class FireReport implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 火情标题 + */ + @NotBlank(message = "请填写火情上报标题") + private String fireTitle; + + /** + * 上报方式:卫星上报、无人机上报、人工上报、监测点(云台/卡口)上报 + */ + private String reportMethod; + + /** + * 来源火情预警id + */ + private Long fireWarningId; + + /** + * 上报设备编号 + */ + private String deviceNo; + + /** + * 上报设备类型 + */ + private String deviceType; + + /** + * 上报人员id + */ + private Long reporterId; + + /** + * 地址 + */ + @NotBlank(message = "请填写火情地址") + private String address; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 高度 + */ + private String height; + + /** + * 归属区域id + */ + @NotNull(message = "请选择所属区域") + private Long regionId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 火险等级,有别于火情预警等级 + */ + private String fireHazardLevel; + + /** + * 起火原因 + */ + private String fireCause; + + /** + * 失火面积 + */ + private String fireArea; + + /** + * 预计损失金额 + */ + private String amountLoss; + + /** + * 火情图片 + */ + private String firePicture; + + /** + * 火情描述 + */ + private String fireDescription; + + /** + * 处置状态:未处理、已处理 + */ + private Integer disposalStatus; + + /** + * 处置说明 + */ + private String disposalInstruction; + + /** + * 扑救情况 + */ + private String firefightingSituation; + + /** + * 灾后情况说明 + */ + private String disasterSituation; + + /** + * 扑救单位 + */ + private String firefightingUnit; + + /** + * 主要负责人 + */ + private String personInCharge; + + /** + * 归档状态 + */ + private Integer archiveStatus; + + /** + * 归档时间 + */ + private Date archiveTime; + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/FireWarningInfo.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/FireWarningInfo.java new file mode 100644 index 0000000..3e8662c --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/FireWarningInfo.java @@ -0,0 +1,177 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 火情预警信息表 + *

+ * + * @author 代超 + * @since 2024-10-08 + */ +@Data +@TableName("fire_warning_info") +public class FireWarningInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 发现火情设备编号 + */ + private String deviceNo; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 地址 + */ + @NotBlank(message = "请输入火情地址") + private String address; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 高度 + */ + private String height; + + /** + * 所属区域id + */ + @NotNull(message = "请选择所属区域") + private Long regionId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 火情标题 + */ + @NotBlank(message = "请输入火情标题") + private String fireTitle; + + /** + * 火情级别 + */ + private String fireLevel; + + /** + * 起火原因 + */ + private String fireCause; + + /** + * 处置状态:未处理、已研判、已上报、已归档 + */ + private String disposalStatus; + + /** + * 研判结果说明 + */ + private String analyzeInstruction; + + /** + * 处置人 + */ + private Long disposalBy; + + /** + * 处置时间 + */ + private Date disposalTime; + + /** + * 失火面积 + */ + private String fireArea; + + /** + * 损失金额 + */ + private String amountDamage; + + /** + * 火情图片 + */ + private String firePicture; + + /** + * 火情预警数据来源 + */ + private String dataSource; + + /** + * 备注信息 + */ + private String remark; + + /** + * 误判标识,0-非误判,1-误判,默认是0 + */ + private Integer misjudgeFlag; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/HkStoreCapturePictures.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/HkStoreCapturePictures.java new file mode 100644 index 0000000..cba34d9 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/HkStoreCapturePictures.java @@ -0,0 +1,91 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 海康_硬件抓拍图片元数据表 + * @author 13768238378 + * @TableName hk_store_capture_pictures + */ + +//@TableName("hk_store_capture_pictures") +@Data +public class HkStoreCapturePictures implements Serializable { + /** + * 主键ID + */ +// @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * MinIO存储桶名称(符合MinIO命名规范) + */ + private String bucket; + + /** + * MinIO对象唯一路径(如: images/user/2023/10/photo.jpg) + */ + private String objectKey; + + /** + * 原始文件名 + */ + private String originalName; + + /** + * 上传用户ID + */ + private Long userId; + + /** + * 文件大小(字节) + */ + private Long fileSize; + + /** + * 文件MIME类型(如image/jpeg) + */ + private String fileType; + + /** + * 文件MD5哈希(用于去重校验) + */ + private String md5; + + /** + * 是否公开(0-私有,1-公开) + */ + private Integer isPublic; + + /** + * 软删除标记(0-未删除,1-已删除) + */ + private Integer isDeleted; + + /** + * 上传时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createdAt; + + /** + * 更新时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updatedAt; + /** + * 设备id + */ + private String deviceId; + /** + * 访问路径 + */ + private String accessPath; + + private static final long serialVersionUID = 1L; + +} \ No newline at end of file diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Inventory.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Inventory.java new file mode 100644 index 0000000..c23012e --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Inventory.java @@ -0,0 +1,104 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +/** + *

+ * 物资库存 + *

+ * + * @author liuzh + * @since 2024-10-29 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("inventory") +public class Inventory implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 库存id + */ + @TableId(value = "inventory_id", type = IdType.AUTO) + private Long inventoryId; + + /** + * 仓库id + */ + private Long warehouseId; + + /** + * 物资id + */ + private Long materialId; + + /** + * 用户id + */ + private Long userId; + + /** + * 入库/出库 + */ + private Integer inventoryType; + + /** + * 物资名称 + */ + private String materialName; + + /** + * 规格 + */ + private String unit; + + /** + * 数量 + */ + private BigDecimal quantity; + + /** + * 物资类型 + */ + private Integer materialType; + + /** + * 备注 + */ + private String description; + + /** + * 删除标志 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建者 + */ + private String createdBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 更新者 + */ + private String updatedBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/KeyAreaInfo.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/KeyAreaInfo.java new file mode 100644 index 0000000..814b0b9 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/KeyAreaInfo.java @@ -0,0 +1,121 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 重点监控区域配置表 + *

+ * + * @author daichao + * @since 2024-12-17 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("key_area_info") +public class KeyAreaInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 归属区域id + */ + @NotNull(message = "请选择归属区域") + private Long regionId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 开始时间,以天为单位 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date startTime; + + /** + * 结束时间,以天为单位 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date endTime; + + /** + * 重点区域类型,数据字典 + */ + @NotBlank(message = "请选择重点区域类型") + private String keyAreaType; + + /** + * 区域坐标信息 + */ + private String coordinateInfo; + + /** + * 区域说明 + */ + private String regionDescription; + + /** + * 区域图片 + */ + private String picture; + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/LeaveRecord.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/LeaveRecord.java new file mode 100644 index 0000000..6101d37 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/LeaveRecord.java @@ -0,0 +1,147 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; +/** + *

+ * 请假记录表 + *

+ * + * @author daichao + * @since 2024-12-09 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("leave_record") +public class LeaveRecord implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 请假人id + */ + private Long userId; + + /** + * 请假人部门id + */ + private Long deptId; + + /** + * 请假类型 + */ + @NotBlank(message = "请选择请假类型") + private String leaveType; + + /** + * 开始时间 + */ + @NotNull(message = "请选择开始时间") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date startTime; + + /** + * 结束时间 + */ + @NotNull(message = "请选择结束时间") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date endTime; + + /** + * 请假时长,单位天 + */ + private String leaveDuration; + + /** + * 请假说明 + */ + @NotBlank(message = "请输入请假说明") + private String leaveInstruction; + + /** + * 图片 + */ + private String picture; + + /** + * 撤销标识:0-未撤销,1-已撤销 + */ + private Integer revokeFlag; + + /** + * 撤销时间 + */ + private Date revokeTime; + + /** + * 审批标识:0-未审批,1-已审批 + */ + private Integer approvalFlag; + + /** + * 审批状态:0-驳回,1-通过 + */ + private Integer approvalStatus; + + /** + * 驳回说明 + */ + private String rejectionStatement; + + /** + * 审核人id + */ + private Long reviewerId; + + /** + * 审核时间 + */ + private Date reviewTime; + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Material.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Material.java new file mode 100644 index 0000000..e6becbd --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Material.java @@ -0,0 +1,110 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + *

+ * 物资信息 + *

+ * + * @author liuzh + * @since 2024-10-09 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("material") +public class Material implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 物资ID + */ + @TableId(value = "material_id", type = IdType.AUTO) + private Long materialId; + + /** + * 仓库id + */ + @NotNull(message = "仓库不能为空") + private Long warehouseId; + + /** + * 编号 + */ + private String serialNumber; + + /** + * 物资名称 + */ + @NotBlank(message = "物资名称不能为空") + private String materialName; + + /** + * 型号 + */ + private String model; + + /** + * 单位 + */ + private String unit; + + /** + * 库存 + */ + private BigDecimal stock; + + /** + * 物资类型 + */ + @NotNull(message = "物资类型不能为空") + private Integer materialType; + + /** + * 照片 + */ + private String photo; + + /** + * 描述 + */ + private String description; + + /** + * 删除标志 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建者 + */ + private String createdBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 更新者 + */ + private String updatedBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/NoticeInfo.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/NoticeInfo.java new file mode 100644 index 0000000..4b28072 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/NoticeInfo.java @@ -0,0 +1,98 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 通知公告信息表 + *

+ * + * @author daichao + * @since 2024-12-17 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("notice_info") +public class NoticeInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 类型:通知、公告 + */ + @NotBlank(message = "请选择通知类型") + private String type; + + /** + * 标题 + */ + @NotBlank(message = "请填写标题") + private String title; + + /** + * 内容 + */ + @NotBlank(message = "请填写内容") + private String content; + + /** + * 文件 + */ + private String file; + + /** + * 序号 + */ + private Integer sortNo; + + /** + * 是否启用:0-停用,1-启用 + */ + private Integer enableFlag; + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/PatrolPath.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/PatrolPath.java new file mode 100644 index 0000000..bdb0d44 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/PatrolPath.java @@ -0,0 +1,113 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.tcctyn.iot.forestfire.BO.PointInfoBO; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + *

+ * 巡护路径表 + *

+ * + * @author 代超 + * @since 2024-09-24 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("patrol_path") +public class PatrolPath implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 路径编号 + */ +// @NotBlank(message = "路径编号不能为空") + private String pathNo; + + /** + * 路径名称 + */ + @NotBlank(message = "路径名称不能为空") + private String pathName; + + /** + * 归属区域id,取林区、林场、电子围栏中的最下级id + */ + @NotNull(message = "归属区域id不能为空") + private Long BelongingRegionId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 路径简介 + */ + private String pathIntroduction; + + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + + /** + * 路径坐标信息 + */ + @TableField(exist = false) + private List pointList; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/PointInfo.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/PointInfo.java new file mode 100644 index 0000000..279a97d --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/PointInfo.java @@ -0,0 +1,160 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + *

+ * 点位信息表 + *

+ * + * @author 代超 + * @since 2024-09-24 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("point_info") +public class PointInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 点位编号 + */ + private String pointNo; + + /** + * 点位名称 + */ + @NotBlank(message = "资源点名称不能为空") + private String pointName; + + /** + * 行政区划 + */ + private String administrativeDivision; + + /** + * 归属地区id / 归属路径id + */ + @NotNull(message = "请选择资源点归属林区/林场") + private Long belongingRegionId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 详细地址 + */ + private String address; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 高度 + */ + private String height; + + /** + * 点位类型:云台、卡口、打卡点、巡护点 + */ + private String pointType; + + /** + * 点位顺序 + */ + private Integer sortNo; + + /** + * 打卡半径,单位:米 + */ + private String checkInRadius; + + /** + * 点位描述信息 + */ + private String pointDescription; + + /** + * 设备启用状态:0-停用/1-启用 + */ + private Integer enableFlag;//sgq2025.3.20 + + /** + * 点位图片,多张以英文逗号分隔 + */ + private String pointPicture; + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + + /** + * 点位类型列表,考虑到云台、卡口需要放到一起,作为前端传参 + */ + @TableField(exist = false) + private List pointTypeList; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Road.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Road.java new file mode 100644 index 0000000..b45a5e4 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Road.java @@ -0,0 +1,121 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + *

+ * 林间道路信息表 + *

+ * + * @author jason + * @since 2025-03-11 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("road") +public class Road implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 道路编号 + */ + private String roadNo; + + /** + * 道路名称 + */ + private String roadName; + + /** + * 道路类型 + */ + private String roadType; + + /** + * 长度 + */ + private String length; + + /** + * 宽度 + */ + private String width; + + /** + * 坐标集合 + */ + private String coordinates; + /** + * 归属区域id:取林区、林场、电子围栏的最下级id + */ + private Long belongingRegionId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + + + /** + * 道路详细信息 + */ + @TableField(exist = false) + private List roadInfoList; + + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/RoadInfo.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/RoadInfo.java new file mode 100644 index 0000000..be294a1 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/RoadInfo.java @@ -0,0 +1,108 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; +/** + *

+ * 林间道路详细信息表 + *

+ * + * @author jason + * @since 2025-03-11 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("road_info") +public class RoadInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 道路id + */ + private Long roadId; + + /** + * 详细地址 + */ + private String address; + + /** + * 坐标集合 + */ + private String coordinates; + + /** + * 特征类型:陡坡、急转弯等 + */ + private String featureType; + + /** + * 排序 + */ + private Integer sortNo; + + /** + * 坡度值 + */ + private String slope; + + /** + * 弯度值 + */ + private String camber; + + /** + * 宽度 + */ + private String width; + + /** + * 道路图片,多张以英文逗号分隔 + */ + private String roadPicture; + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + private Date updatedTime; + + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/SatelliteDataSimulation.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/SatelliteDataSimulation.java new file mode 100644 index 0000000..a7c5e10 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/SatelliteDataSimulation.java @@ -0,0 +1,112 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 卫星数据模拟表 + *

+ * + * @author 代超 + * @since 2024-11-04 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("satellite_data_simulation") +public class SatelliteDataSimulation implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 终端编号 + */ + private String terminalNo; + + /** + * 数据上星时间 + */ + private Date uploadTime; + + /** + * 序号 + */ + private String serialNumber; + + /** + * 数据采集时间 + */ + private Date collectTime; + + /** + * 温度 + */ + private String temperature; + + /** + * 湿度 + */ + private String humidity; + + /** + * 大气压力 + */ + private String pressure; + + /** + * 风速 + */ + private String windSpeed; + + /** + * 风向 + */ + private String windDirection; + + /** + * 雨量 + */ + private String rainfall; + + /** + * 甲烷浓度 + */ + private String methaneConcentration; + + /** + * 经度 + */ + private String longitude; + + /** + * 纬度 + */ + private String latitude; + + /** + * 区域范围编码 + */ + private Integer regionScopeNo; + + + /** 风险等级:0-正常,1-低风险,2-中风险,3-高风险 */ + private Integer riskLevel; + + /** + * 降风险标识:0-未降风险,1-已降风险 + */ + private Integer riskReduceFlag; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/SchedulePlan.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/SchedulePlan.java new file mode 100644 index 0000000..9dd803b --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/SchedulePlan.java @@ -0,0 +1,113 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; +/** + *

+ * 排班计划 + *

+ * + * @author liuzh + * @since 2024-10-16 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("schedule_plan") +public class SchedulePlan implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 计划ID + */ + @TableId(value = "plan_id", type = IdType.AUTO) + private Long planId; + + /** + * 归属区域ID + */ + private Long belongingRegionId; + + /** + * 林区ID + */ + private Long forestId; + + /** + * 林场ID + */ + private Long farmId; + + /** + * 电子围栏ID + */ + private Long fenceId; + + /** + * 计划名称 + */ + private String planName; + + /** + * 生效时期 + */ + private String period; + + /** + * 开始日期 + */ + private Date startDate; + + /** + * 结束日期 + */ + private Date endDate; + + /** + * 描述信息 + */ + private String description; + + /** + * 生成标志 + */ + private Integer genFlag; + + /** + * 状态 + */ + private Integer status; + + /** + * 删除标志 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建者 + */ + private String createdBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 更新者 + */ + private String updatedBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/ScheduleSwap.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/ScheduleSwap.java new file mode 100644 index 0000000..08eeb94 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/ScheduleSwap.java @@ -0,0 +1,88 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; +/** + *

+ * 调班记录 + *

+ * + * @author liuzh + * @since 2024-10-19 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("schedule_swap") +public class ScheduleSwap implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 调班ID + */ + @TableId(value = "swap_id", type = IdType.AUTO) + private Long swapId; + + /** + * 排班ID + */ + private Long scheduleId; + + /** + * 路线ID + */ + private Long pathId; + + /** + * 调整日期 + */ + private Date swapDate; + + /** + * 调整前 + */ + private Long beforeUser; + + /** + * 调整后 + */ + private Long afterUser; + + /** + * 描述信息 + */ + private String description; + + /** + * 删除标志 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建者 + */ + private String createdBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 更新者 + */ + private String updatedBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/ScheduleTemplate.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/ScheduleTemplate.java new file mode 100644 index 0000000..51bf750 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/ScheduleTemplate.java @@ -0,0 +1,126 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 排班模板 + *

+ * + * @author liuzh + * @since 2024-10-16 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("schedule_template") +public class ScheduleTemplate implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 模板ID + */ + @TableId(value = "template_id", type = IdType.AUTO) + private Long templateId; + + /** + * 计划ID + */ + @NotNull(message = "计划ID不能为空") + private Long planId; + + /** + * 归属区域ID + */ + private Long belongingRegionId; + + /** + * 林区ID + */ + private Long forestId; + + /** + * 林场ID + */ + private Long farmId; + + /** + * 电子围栏ID + */ + private Long fenceId; + + /** + * 路线ID + */ + private Long pathId; + + /** + * 周一 + */ + private String monUsers; + + /** + * 周二 + */ + private String tueUsers; + + /** + * 周三 + */ + private String wedUsers; + + /** + * 周四 + */ + private String thurUsers; + + /** + * 周五 + */ + private String friUsers; + + /** + * 周六 + */ + private String satUsers; + + /** + * 周日 + */ + private String sunUsers; + + /** + * 删除标志 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建者 + */ + private String createdBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 更新者 + */ + private String updatedBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Schedules.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Schedules.java new file mode 100644 index 0000000..bcf8194 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Schedules.java @@ -0,0 +1,139 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 排班表 + *

+ * + * @author liuzh + * @since 2024-09-24 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("schedules") +public class Schedules implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 排班ID + */ + @TableId(value = "schedule_id", type = IdType.AUTO) + private Long scheduleId; + + /** + * 计划ID + */ + private Long planId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 班次ID + */ + private Long shiftId; + + /** + * 路线ID + */ + private Long pathId; + + /** + * 归属区域ID + */ + private Long belongingRegionId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 星期 + */ + private Integer dayOfWeek; + + /** + * 日期 + */ + private Date dateOfWeek; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private Integer delFlag; + + /** + * 是否调班 + */ + private Integer swapFlag; + + /** + * 执行状态 + */ + private Integer status; + + /** + * 描述信息 + */ + private String description; + + /** + * 有效打卡次数 + */ + private Integer checkTimes; + + /** + * 应打卡次数 + */ + private Integer totalTimes; + + /** + * 巡护进度(打卡率) + */ + private String patrolRate; + + /** + * 创建者 + */ + private String createdBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 更新者 + */ + private String updatedBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Shift.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Shift.java new file mode 100644 index 0000000..dfefc9a --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Shift.java @@ -0,0 +1,56 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.Date; +/** + *

+ * 班次表 + *

+ * + * @author liuzh + * @since 2024-09-24 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("shift") +public class Shift implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 班次ID + */ + @TableId(value = "shift_id", type = IdType.AUTO) + private Long shiftId; + + /** + * 班次 + */ + @Size(min = 0, max = 5, message = "班次长度不能超过5个字符") + private String shiftName; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private Integer delFlag; + + /** + * 开始时间 + */ + private Date startTime; + + /** + * 结束时间 + */ + private Date endTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/TemporaryTask.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/TemporaryTask.java new file mode 100644 index 0000000..03b3b11 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/TemporaryTask.java @@ -0,0 +1,157 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 临时任务表 + *

+ * + * @author 代超 + * @since 2024-11-01 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("temporary_task") +public class TemporaryTask implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 任务名称 + */ + @NotBlank(message = "请填写任务名称") + private String taskName; + + /** + * 任务类型,火情勘测、物资运输、火情救援、其他,数据字典 + */ + @NotBlank(message = "请选择任务类型") + private String taskType; + + /** + * 任务紧急度:一般、重要、紧急, 枚举 + */ + @NotBlank(message = "请选择任务紧急度") + private String taskUrgency; + + /** + * 归属区域id + */ + @NotNull(message = "所属区域不能为空") + private Long regionId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 任务人 + */ + private Long taskPersonId; + + /** + * 任务下发人id + */ + private Long issuerId; + + /** + * 任务下发时间 + */ + private Date issueTime; + + /** + * 任务内容 + */ + @NotBlank(message = "请填写任务内容") + private String taskContent; + + /** + * 任务状态,未接受,执行中,已完成 + */ + private String taskStatus; + + /** + * 任务接受人 + */ + private Long taskRecipientId; + + + /** + * 任务接受时间 + */ + private Date acceptTime; + + /** + * 任务完成时间 + */ + private Date completeTime; + + /** + * 任务归档情况:1-已归档,0-未归档 + */ + private Integer archiveStatus; + + /** + * 任务归档时间 + */ + private Date archiveTime; + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/VoiceTemplateConfig.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/VoiceTemplateConfig.java new file mode 100644 index 0000000..889538e --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/VoiceTemplateConfig.java @@ -0,0 +1,85 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; +/** + *

+ * 语音播报模板表 + *

+ * + * @author daichao + * @since 2024-12-17 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("voice_template_config") +public class VoiceTemplateConfig implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + private Integer id; + + /** + * 语音用途 + */ + private String purpose; + + /** + * 语音内容 + */ + private String content; + + /** + * 音频文件 + */ + private String audioFile; + + /** + * 是否启用,1-启用,0-停用 + */ + private Integer enableFlag; + + /** + * 备注信息 + */ + private String remark; + + /** + * 该条记录是否被删除,1-已删除,0-未删除 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建人员姓名 + */ + private String createdBy; + + /** + * 记录创建时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 修改人员姓名 + */ + private String updatedBy; + + /** + * 记录修改时间,默认用服务器时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Warehouse.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Warehouse.java new file mode 100644 index 0000000..bcbf057 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/domain/Warehouse.java @@ -0,0 +1,123 @@ +package com.tcctyn.iot.forestfire.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; +/** + *

+ * 仓库信息 + *

+ * + * @author liuzh + * @since 2024-10-09 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("warehouse") +public class Warehouse implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 仓库ID + */ + @TableId(value = "warehouse_id", type = IdType.AUTO) + private Long warehouseId; + + /** + * 归属区域ID + */ + private Long regionId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + + /** + * 仓库名称 + */ + private String warehouseName; + + /** + * 仓库类型 + */ + private Integer warehouseType; + + /** + * 纬度 + */ + private String latitude; + + /** + * 经度 + */ + private String longitude; + + /** + * 高度 + */ + private String height; + + /** + * 地址 + */ + private String address; + + /** + * 所属地区 + */ + private String region; + + /** + * 照片 + */ + private String photo; + + /** + * 备注 + */ + private String remark; + + /** + * 删除标志 + */ + @TableLogic + private Integer delFlag; + + /** + * 创建者 + */ + private String createdBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + /** + * 更新者 + */ + private String updatedBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/ApprovalBusinessTypeEnum.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/ApprovalBusinessTypeEnum.java new file mode 100644 index 0000000..f613325 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/ApprovalBusinessTypeEnum.java @@ -0,0 +1,66 @@ +package com.tcctyn.iot.forestfire.enums; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 需要审批的业务类型;暂时只有请假这个需要审批,后续有需要审批的再做补充 + */ +public enum ApprovalBusinessTypeEnum { + + /** + * 请假 + */ + LEAVE("请假"), + + ; + + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + /** + * 描述 + */ + private String desc; + + ApprovalBusinessTypeEnum(String desc) { + this.desc = desc; + } + + /** + * 根据枚举名称获取枚举 + * + * @param enumName + * @return + */ + public static ApprovalBusinessTypeEnum getByEnumName(final String enumName) { + for (ApprovalBusinessTypeEnum element : values()) { + if (element.name().equals(enumName)) { + return element; + } + } + return LEAVE; + } + + /** + * 获取枚举名称和desc所有的映射 + * + * @return + */ + public static Map getName2DescMap() { + + final Map name2TitleMap = new LinkedHashMap<>(); + + for (ApprovalBusinessTypeEnum element : values()) { + name2TitleMap.put(element.name(), element.desc); + } + + return name2TitleMap; + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/AreaTypeEnum.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/AreaTypeEnum.java new file mode 100644 index 0000000..44ef252 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/AreaTypeEnum.java @@ -0,0 +1,79 @@ +package com.tcctyn.iot.forestfire.enums; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 地区分类枚举 + */ +public enum AreaTypeEnum { + + /** + * 林区 + */ + FOREST_DISTRICT("林区"), + + /** + * 林场 + */ + FOREST_FARM("林场"), + + /** + * 电子围栏 + */ + ELECTRONIC_FENCE("电子围栏"), + + /** + * 切片 + */ + SECTION("切片"); + + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + /** + * 描述 + */ + private String desc; + + AreaTypeEnum(String desc) { + this.desc = desc; + } + + /** + * 根据枚举名称获取枚举 + * + * @param enumName + * @return + */ + public static AreaTypeEnum getByEnumName(final String enumName) { + for (AreaTypeEnum element : values()) { + if (element.name().equals(enumName)) { + return element; + } + } + return FOREST_DISTRICT; + } + + /** + * 获取枚举名称和desc所有的映射 + * + * @return + */ + public static Map getName2DescMap() { + + final Map name2TitleMap = new LinkedHashMap<>(); + + for (AreaTypeEnum element : values()) { + name2TitleMap.put(element.name(), element.desc); + } + + return name2TitleMap; + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/DataSourceEnum.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/DataSourceEnum.java new file mode 100644 index 0000000..4b48886 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/DataSourceEnum.java @@ -0,0 +1,74 @@ +package com.tcctyn.iot.forestfire.enums; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 火情预警信息数据来源枚举 + */ +public enum DataSourceEnum { + + /** + * 卫星热点 + */ + SATELLITE_HOTSPOT("卫星热点"), + + /** + * 视频监控 + */ + VIDEO_MONITOR("视频监控"), + + /** + * 巡护上报 + */ + PATROL_REPORT("巡护上报"), + ; + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + /** + * 描述 + */ + private String desc; + + DataSourceEnum(String desc) { + this.desc = desc; + } + + /** + * 根据枚举名称获取枚举 + * + * @param enumName + * @return + */ + public static DataSourceEnum getByEnumName(final String enumName) { + for (DataSourceEnum element : values()) { + if (element.name().equals(enumName)) { + return element; + } + } + return PATROL_REPORT; + } + + /** + * 获取枚举名称和desc所有的映射 + * + * @return + */ + public static Map getName2DescMap() { + + final Map name2TitleMap = new LinkedHashMap<>(); + + for (DataSourceEnum element : values()) { + name2TitleMap.put(element.name(), element.desc); + } + + return name2TitleMap; + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/DeviceStatusEnum.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/DeviceStatusEnum.java new file mode 100644 index 0000000..199aa8a --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/DeviceStatusEnum.java @@ -0,0 +1,69 @@ +package com.tcctyn.iot.forestfire.enums; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 设备状态枚举 在线/离线 + */ +public enum DeviceStatusEnum { + + /** + * 在线 + */ + ON("在线"), + + /** + * 离线 + */ + OFF("离线"), + ; + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + /** + * 描述 + */ + private String desc; + + DeviceStatusEnum(String desc) { + this.desc = desc; + } + + /** + * 根据枚举名称获取枚举 + * + * @param enumName + * @return + */ + public static DeviceStatusEnum getByEnumName(final String enumName) { + for (DeviceStatusEnum element : values()) { + if (element.name().equals(enumName)) { + return element; + } + } + return ON; + } + + /** + * 获取枚举名称和desc所有的映射 + * + * @return + */ + public static Map getName2DescMap() { + + final Map name2TitleMap = new LinkedHashMap<>(); + + for (DeviceStatusEnum element : values()) { + name2TitleMap.put(element.name(), element.desc); + } + + return name2TitleMap; + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/DeviceTypeEnum.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/DeviceTypeEnum.java new file mode 100644 index 0000000..08044ff --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/DeviceTypeEnum.java @@ -0,0 +1,100 @@ +package com.tcctyn.iot.forestfire.enums; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 设备类型枚举, 用于判断设备类型 + * 暂时与数据字典中的设备类型保持一致,方便做业务上的判断 + * 提供数据字典是方便用户做非业务的设备类型添加 + */ +public enum DeviceTypeEnum { + /** + * 摄像头 + */ + CAMERA("摄像头"), + + /** + * 无人机 + */ + DRONE("无人机"), + + /** + * 机场 + */ + AIRPORT("机场"), + + /** + * 气象监测仪 + */ + METEOROLOGIC("气象监测仪"), + + /** + * 红外设备 + */ + INFRARED("红外设备"), + + /** + * 水泵 + */ + PUMP("水泵"), + + /** + * 云台摄像头 + */ + CLOUDTERRACE("云台摄像头"), + + /** + * 卡口摄像头 + */ + BAYONET("卡口摄像头") + ; + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + /** + * 描述 + */ + private String desc; + + DeviceTypeEnum(String desc) { + this.desc = desc; + } + + /** + * 根据枚举名称获取枚举 + * + * @param enumName + * @return + */ + public static DeviceTypeEnum getByEnumName(final String enumName) { + for (DeviceTypeEnum element : values()) { + if (element.name().equals(enumName)) { + return element; + } + } + return CAMERA; + } + + /** + * 获取枚举名称和desc所有的映射 + * + * @return + */ + public static Map getName2DescMap() { + + final Map name2TitleMap = new LinkedHashMap<>(); + + for (DeviceTypeEnum element : values()) { + name2TitleMap.put(element.name(), element.desc); + } + + return name2TitleMap; + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/DroneTaskStatusEnum.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/DroneTaskStatusEnum.java new file mode 100644 index 0000000..d195a56 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/DroneTaskStatusEnum.java @@ -0,0 +1,74 @@ +package com.tcctyn.iot.forestfire.enums; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 无人机的任务执行状态 + */ +public enum DroneTaskStatusEnum { + /** + * 未执行 + */ + UNEXECUTED("未执行"), + + /** + * 执行中 + */ + IN_PROGRESS("执行中"), + + /** + * 已完成 + */ + COMPLETED("已完成"), + + ; + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + /** + * 描述 + */ + private String desc; + + DroneTaskStatusEnum(String desc) { + this.desc = desc; + } + + /** + * 根据枚举名称获取枚举 + * + * @param enumName + * @return + */ + public static DroneTaskStatusEnum getByEnumName(final String enumName) { + for (DroneTaskStatusEnum element : values()) { + if (element.name().equals(enumName)) { + return element; + } + } + return UNEXECUTED; + } + + /** + * 获取枚举名称和desc所有的映射 + * + * @return + */ + public static Map getName2DescMap() { + + final Map name2TitleMap = new LinkedHashMap<>(); + + for (DroneTaskStatusEnum element : values()) { + name2TitleMap.put(element.name(), element.desc); + } + + return name2TitleMap; + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/FireHazardLevelEnum.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/FireHazardLevelEnum.java new file mode 100644 index 0000000..83403a6 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/FireHazardLevelEnum.java @@ -0,0 +1,83 @@ +package com.tcctyn.iot.forestfire.enums; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 火险等级: + */ +public enum FireHazardLevelEnum { + + + /** + * 一般火灾 + */ + GENERAL_FIRE("一般火灾"), + + /** + * 较大火灾 + */ + MAJOR_FIRE("较大火灾"), + + + /** + * 重大火灾 + */ + SERIOUS_FIRE("重大火灾"), + + + /** + * 特别重大火灾 + */ + ESPECIALLY_SERIOUS_FIRE("特别重大火灾"), + + ; + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + /** + * 描述 + */ + private String desc; + + FireHazardLevelEnum(String desc) { + this.desc = desc; + } + + /** + * 根据枚举名称获取枚举 + * + * @param enumName + * @return + */ + public static FireHazardLevelEnum getByEnumName(final String enumName) { + for (FireHazardLevelEnum element : values()) { + if (element.name().equals(enumName)) { + return element; + } + } + return GENERAL_FIRE; + } + + /** + * 获取枚举名称和desc所有的映射 + * + * @return + */ + public static Map getName2DescMap() { + + final Map name2TitleMap = new LinkedHashMap<>(); + + for (FireHazardLevelEnum element : values()) { + name2TitleMap.put(element.name(), element.desc); + } + + return name2TitleMap; + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/FireWarningDisposalStatusEnum.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/FireWarningDisposalStatusEnum.java new file mode 100644 index 0000000..6081467 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/FireWarningDisposalStatusEnum.java @@ -0,0 +1,81 @@ +package com.tcctyn.iot.forestfire.enums; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 火情预警信息处理状态枚举: + * 2024-12-02 调整为未处理、已研判、已上报、已归档 + */ +public enum FireWarningDisposalStatusEnum { + + + /** + * 未处理 + */ + UNHANDLED("未处理"), + + /** + * 已研判 + */ + ANALYZED("已研判"), + + /** + * 已上报 + */ + REPORTED("已上报"), + + /** + * 已归档 + */ + ARCHIVED("已归档"); + + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + /** + * 描述 + */ + private String desc; + + FireWarningDisposalStatusEnum(String desc) { + this.desc = desc; + } + + /** + * 根据枚举名称获取枚举 + * + * @param enumName + * @return + */ + public static FireWarningDisposalStatusEnum getByEnumName(final String enumName) { + for (FireWarningDisposalStatusEnum element : values()) { + if (element.name().equals(enumName)) { + return element; + } + } + return UNHANDLED; + } + + /** + * 获取枚举名称和desc所有的映射 + * + * @return + */ + public static Map getName2DescMap() { + + final Map name2TitleMap = new LinkedHashMap<>(); + + for (FireWarningDisposalStatusEnum element : values()) { + name2TitleMap.put(element.name(), element.desc); + } + + return name2TitleMap; + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/PointTypeEnum.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/PointTypeEnum.java new file mode 100644 index 0000000..392f6dc --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/PointTypeEnum.java @@ -0,0 +1,88 @@ +package com.tcctyn.iot.forestfire.enums; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 巡护点位类型枚举 + */ + +public enum PointTypeEnum { + + /** + * 云台 + */ + PTZ("云台"), + + /** + * 卡口 + */ + BAYONET("卡口"), + + + /** + * 打卡点 + */ + CHECK_IN_POINT("打卡点"), + + + /** + * 巡护点 + */ + PATROL_POINT("巡护点"), + + /** + * 水源地 + */ + WATER_SOURCE("水源地"), + ; + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + /** + * 描述 + */ + private String desc; + + PointTypeEnum(String desc) { + this.desc = desc; + } + + /** + * 根据枚举名称获取枚举 + * + * @param enumName + * @return + */ + public static PointTypeEnum getByEnumName(final String enumName) { + for (PointTypeEnum element : values()) { + if (element.name().equals(enumName)) { + return element; + } + } + return CHECK_IN_POINT; + } + + /** + * 获取枚举名称和desc所有的映射 + * + * @return + */ + public static Map getName2DescMap() { + + final Map name2TitleMap = new LinkedHashMap<>(); + + for (PointTypeEnum element : values()) { + name2TitleMap.put(element.name(), element.desc); + } + + return name2TitleMap; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/ReportMethodEnum.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/ReportMethodEnum.java new file mode 100644 index 0000000..7c35af5 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/ReportMethodEnum.java @@ -0,0 +1,82 @@ +package com.tcctyn.iot.forestfire.enums; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 火情上报方式:1、卫星上报、2、无人机上报、3、人工上报、4、监测点上报(云台/卡口) + */ +public enum ReportMethodEnum { + + /** + * 卫星上报 + */ + SATELLITE_REPORTING("卫星上报"), + + /** + * 无人机上报 + */ + DRONE_REPORTING("无人机上报"), + + + /** + * 人工上报 + */ + MANUAL_REPORTING("人工上报"), + + + /** + * 监测点上报 + */ + MONITORING_POINT_REPORTING("监测点上报"), + + ; + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + /** + * 描述 + */ + private String desc; + + ReportMethodEnum(String desc) { + this.desc = desc; + } + + /** + * 根据枚举名称获取枚举 + * + * @param enumName + * @return + */ + public static ReportMethodEnum getByEnumName(final String enumName) { + for (ReportMethodEnum element : values()) { + if (element.name().equals(enumName)) { + return element; + } + } + return MANUAL_REPORTING; + } + + /** + * 获取枚举名称和desc所有的映射 + * + * @return + */ + public static Map getName2DescMap() { + + final Map name2TitleMap = new LinkedHashMap<>(); + + for (ReportMethodEnum element : values()) { + name2TitleMap.put(element.name(), element.desc); + } + + return name2TitleMap; + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/TaskStatusEnum.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/TaskStatusEnum.java new file mode 100644 index 0000000..200c7ee --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/TaskStatusEnum.java @@ -0,0 +1,75 @@ +package com.tcctyn.iot.forestfire.enums; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 任务状态枚举:未接受、执行中、已完成 + */ +public enum TaskStatusEnum { + + /** + * 未接受 + */ + NOT_ACCEPTED("未接受"), + + /** + * 执行中 + */ + IN_PROGRESS("执行中"), + + /** + * 已完成 + */ + COMPLETED("已完成"), + + ; + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + /** + * 描述 + */ + private String desc; + + TaskStatusEnum(String desc) { + this.desc = desc; + } + + /** + * 根据枚举名称获取枚举 + * + * @param enumName + * @return + */ + public static TaskStatusEnum getByEnumName(final String enumName) { + for (TaskStatusEnum element : values()) { + if (element.name().equals(enumName)) { + return element; + } + } + return NOT_ACCEPTED; + } + + /** + * 获取枚举名称和desc所有的映射 + * + * @return + */ + public static Map getName2DescMap() { + + final Map name2TitleMap = new LinkedHashMap<>(); + + for (TaskStatusEnum element : values()) { + name2TitleMap.put(element.name(), element.desc); + } + + return name2TitleMap; + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/TaskUrgencyEnum.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/TaskUrgencyEnum.java new file mode 100644 index 0000000..034f18e --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/enums/TaskUrgencyEnum.java @@ -0,0 +1,75 @@ +package com.tcctyn.iot.forestfire.enums; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 任务紧急度枚举 + */ +public enum TaskUrgencyEnum { + + /** + * 一般 + */ + COMMON("一般任务"), + + /** + * 重要 + */ + IMPORTANT("重要任务"), + + /** + * 紧急 + */ + URGENT("紧急任务"), + + ; + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + /** + * 描述 + */ + private String desc; + + TaskUrgencyEnum(String desc) { + this.desc = desc; + } + + /** + * 根据枚举名称获取枚举 + * + * @param enumName + * @return + */ + public static TaskUrgencyEnum getByEnumName(final String enumName) { + for (TaskUrgencyEnum element : values()) { + if (element.name().equals(enumName)) { + return element; + } + } + return COMMON; + } + + /** + * 获取枚举名称和desc所有的映射 + * + * @return + */ + public static Map getName2DescMap() { + + final Map name2TitleMap = new LinkedHashMap<>(); + + for (TaskUrgencyEnum element : values()) { + name2TitleMap.put(element.name(), element.desc); + } + + return name2TitleMap; + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/ApprovalRecordMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/ApprovalRecordMapper.java new file mode 100644 index 0000000..a6e2d78 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/ApprovalRecordMapper.java @@ -0,0 +1,17 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.ApprovalRecord; + + +/** + *

+ * 审批记录表 Mapper 接口 + *

+ * + * @author daichao + * @since 2024-12-09 + */ +public interface ApprovalRecordMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/CarouselImageConfigMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/CarouselImageConfigMapper.java new file mode 100644 index 0000000..15cfd5b --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/CarouselImageConfigMapper.java @@ -0,0 +1,17 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.CarouselImageConfig; + + +/** + *

+ * 轮播图配置表 Mapper 接口 + *

+ * + * @author daichao + * @since 2024-12-17 + */ +public interface CarouselImageConfigMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/CheckInRecordMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/CheckInRecordMapper.java new file mode 100644 index 0000000..454eef2 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/CheckInRecordMapper.java @@ -0,0 +1,16 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.CheckInRecord; + +/** + *

+ * 打卡记录表 Mapper 接口 + *

+ * + * @author liuzh + * @since 2024-10-12 + */ +public interface CheckInRecordMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/DeviceChanelsMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/DeviceChanelsMapper.java new file mode 100644 index 0000000..9151a64 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/DeviceChanelsMapper.java @@ -0,0 +1,39 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.VO.DeviceChanelsVO; +import com.tcctyn.iot.forestfire.domain.DeviceChanels; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 设备通道表 Mapper 接口 + *

+ * + * @author 宋国强 + * @since 2025-04-09 + */ +public interface DeviceChanelsMapper extends BaseMapper { + + /** + *

+ * 根据设备编号查询该设备下所有通道信息 + *

+ * + * @param deviceNo 设备编号 + * @return 设备通道信息列表 + */ + List selectByDeviceNo(@Param("deviceNo") String deviceNo); + + /** + *

+ * 根据设备编号和通道号获取流地址 + *

+ * + * @return 流地址 + */ + DeviceChanelsVO getStreamUrl(@Param("deviceNo") String deviceNo, @Param("chanelNo") String chanelNo); +} + diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/DeviceConfigMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..f7aefe1 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/DeviceConfigMapper.java @@ -0,0 +1,28 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.DeviceConfig; +import org.apache.ibatis.annotations.Param; + + +/** + *

+ * 设备配置表 Mapper 接口 + *

+ * + * @author 宋国强 + * @since 2025-04-14 + */ +@SuppressWarnings("all") +public interface DeviceConfigMapper extends BaseMapper { + /** + *

+ * 根据设备编号查询该设备下所有信息 + *

+ * + * @param deviceNo 设备编号 + * @return 设备配置信息列表 + */ + DeviceConfig selectByDeviceNo(@Param("deviceNo") String deviceNo); + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/DeviceInfoMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/DeviceInfoMapper.java new file mode 100644 index 0000000..5d1acd1 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/DeviceInfoMapper.java @@ -0,0 +1,32 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.VO.DeviceAndPointInfoVO; +import com.tcctyn.iot.forestfire.VO.DeviceStatisticsByStatusVO; +import com.tcctyn.iot.forestfire.domain.DeviceInfo; +import org.apache.ibatis.annotations.Param; + + +/** + *

+ * 设备信息表 Mapper 接口 + *

+ * + * @author 代超 + * @since 2024-10-09 + */ +public interface DeviceInfoMapper extends BaseMapper { + + /** + * 根据设备编号查询设备信息及归属点位信息 + * @param deviceNo + * @return + */ + DeviceAndPointInfoVO selectByDeviceNo(@Param("deviceNo") String deviceNo); + + /** + * 设备列表设备信息统计 + * @return + */ + DeviceStatisticsByStatusVO statisticsByStatus(); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/DroneTaskPlanMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/DroneTaskPlanMapper.java new file mode 100644 index 0000000..38d2f3b --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/DroneTaskPlanMapper.java @@ -0,0 +1,17 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.DroneTaskPlan; + + +/** + *

+ * 无人机任务计划表 Mapper 接口 + *

+ * + * @author 代超 + * @since 2024-11-07 + */ +public interface DroneTaskPlanMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/FireReportMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/FireReportMapper.java new file mode 100644 index 0000000..bb85815 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/FireReportMapper.java @@ -0,0 +1,23 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.VO.FireReportStatisticsVO; +import com.tcctyn.iot.forestfire.domain.FireReport; + + +/** + *

+ * 火情上报表 Mapper 接口 + *

+ * + * @author 代超 + * @since 2024-11-01 + */ +public interface FireReportMapper extends BaseMapper { + + /** + * 历史火情统计 + * @return + */ + FireReportStatisticsVO fireReportStatistics(); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/FireWarningInfoMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/FireWarningInfoMapper.java new file mode 100644 index 0000000..8e701dd --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/FireWarningInfoMapper.java @@ -0,0 +1,56 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.VO.FireWarningCountByLevelVO; +import com.tcctyn.iot.forestfire.VO.FireWarningCountByStatusVO; +import com.tcctyn.iot.forestfire.VO.FireWarningStatisticsByDataSourceVO; +import com.tcctyn.iot.forestfire.domain.FireWarningInfo; +import com.tcctyn.iot.forestfire.searcher.BaseTimeSearcher; +import com.tcctyn.iot.forestfire.searcher.firewarning.FireWarningConditionSearcher; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + + +/** + *

+ * 火情预警信息表 Mapper 接口 + *

+ * + * @author 代超 + * @since 2024-10-08 + */ +public interface FireWarningInfoMapper extends BaseMapper { + + /** + * 按照处理状态进行统计 + * + * @param searcher + * @return + */ + FireWarningCountByStatusVO countByDisposalStatus(FireWarningConditionSearcher searcher); + + /** + * 按照火情等级进行统计 + * + * @param searcher + * @return + */ + List countByFireLevel(FireWarningConditionSearcher searcher); + + /** + * 火情预警按照数据来源进行统计 + * + * @param searcher + * @return + */ + FireWarningStatisticsByDataSourceVO statisticsByDataSource(BaseTimeSearcher searcher); + + /** + * 火情预警批量归档 + * + * @param idList + * @return + */ + Integer archiveBatch(@Param("idList") List idList); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/HkStoreCapturePicturesMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/HkStoreCapturePicturesMapper.java new file mode 100644 index 0000000..5be7dfc --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/HkStoreCapturePicturesMapper.java @@ -0,0 +1,24 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.searcher.hk.HkStoreListSearcher; +import com.tcctyn.iot.forestfire.VO.HkStoreCapturePicturesVO; +import com.tcctyn.iot.forestfire.domain.HkStoreCapturePictures; + +import java.util.List; + +/** +* @author 13768238378 +* @description 针对表【hk_store_capture_pictures(海康_硬件抓拍图片元数据表)】的数据库操作Mapper +* @createDate 2025-04-10 11:17:50 +* @Entity generator.domain.HkStoreCapturePictures +*/ +//@Mapper +public interface HkStoreCapturePicturesMapper extends BaseMapper { + + List getListHkStoreCapturePicturesList(HkStoreListSearcher hkStoreListSearcher); +} + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/InventoryMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/InventoryMapper.java new file mode 100644 index 0000000..93a837a --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/InventoryMapper.java @@ -0,0 +1,16 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.Inventory; + +/** + *

+ * 物资库存 Mapper 接口 + *

+ * + * @author liuzh + * @since 2024-10-29 + */ +public interface InventoryMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/KeyAreaInfoMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/KeyAreaInfoMapper.java new file mode 100644 index 0000000..2d9134b --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/KeyAreaInfoMapper.java @@ -0,0 +1,16 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.KeyAreaInfo; + +/** + *

+ * 重点监控区域配置表 Mapper 接口 + *

+ * + * @author daichao + * @since 2024-12-17 + */ +public interface KeyAreaInfoMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/LeaveRecordMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/LeaveRecordMapper.java new file mode 100644 index 0000000..5621998 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/LeaveRecordMapper.java @@ -0,0 +1,17 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.LeaveRecord; + + +/** + *

+ * 请假记录表 Mapper 接口 + *

+ * + * @author daichao + * @since 2024-12-09 + */ +public interface LeaveRecordMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/MaterialMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/MaterialMapper.java new file mode 100644 index 0000000..665c0f8 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/MaterialMapper.java @@ -0,0 +1,16 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.Material; + +/** + *

+ * 物资信息 Mapper 接口 + *

+ * + * @author liuzh + * @since 2024-10-09 + */ +public interface MaterialMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/NoticeInfoMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/NoticeInfoMapper.java new file mode 100644 index 0000000..a187b69 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/NoticeInfoMapper.java @@ -0,0 +1,17 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.NoticeInfo; + + +/** + *

+ * 通知公告信息表 Mapper 接口 + *

+ * + * @author daichao + * @since 2024-12-17 + */ +public interface NoticeInfoMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/PatrolPathMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/PatrolPathMapper.java new file mode 100644 index 0000000..1a669e4 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/PatrolPathMapper.java @@ -0,0 +1,17 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.PatrolPath; + + +/** + *

+ * 巡护路径表 Mapper 接口 + *

+ * + * @author 代超 + * @since 2024-09-24 + */ +public interface PatrolPathMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/PointInfoMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/PointInfoMapper.java new file mode 100644 index 0000000..6ed56a2 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/PointInfoMapper.java @@ -0,0 +1,49 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.VO.PointStatisticsByPointTypeVO; +import com.tcctyn.iot.forestfire.domain.PointInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + + +/** + *

+ * 点位信息表 Mapper 接口 + *

+ * + * @author 代超 + * @since 2024-09-24 + */ +public interface PointInfoMapper extends BaseMapper { + + /** + * 批量插入 注入器方法注入 + * + * @param pointList + * @return + */ + Integer insertBatchSomeColumn(List pointList); + + /** + * 巡护路径下的点位信息批量修改 + * + * @param updateList + * @return + */ + Integer updateBatch(@Param("updateList") List updateList); + + /** + * 资源点分类统计 + * @return + */ + PointStatisticsByPointTypeVO statisticsByPointType(); + + /** + * 根据设备编号关联查询归属点位信息 + * @param deviceNo + * @return + */ + PointInfo selectByDeviceNo(@Param("deviceNo") String deviceNo); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/RegionInfoMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/RegionInfoMapper.java new file mode 100644 index 0000000..fce69e5 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/RegionInfoMapper.java @@ -0,0 +1,17 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.common.core.web.domain.entity.RegionInfo; + + +/** + *

+ * 区域信息表 Mapper 接口 + *

+ * + * @author 代超 + * @since 2024-09-24 + */ +public interface RegionInfoMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/RoadInfoMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/RoadInfoMapper.java new file mode 100644 index 0000000..53a4c02 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/RoadInfoMapper.java @@ -0,0 +1,16 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.RoadInfo; + +/** + *

+ * 林间道路详细信息表 Mapper 接口 + *

+ * + * @author jason + * @since 2025-03-11 + */ +public interface RoadInfoMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/RoadMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/RoadMapper.java new file mode 100644 index 0000000..caabe7d --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/RoadMapper.java @@ -0,0 +1,16 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.Road; + +/** + *

+ * 林间道路信息表 Mapper 接口 + *

+ * + * @author jason + * @since 2025-03-11 + */ +public interface RoadMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/SatelliteDataSimulationMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/SatelliteDataSimulationMapper.java new file mode 100644 index 0000000..8666732 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/SatelliteDataSimulationMapper.java @@ -0,0 +1,44 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.SatelliteDataSimulation; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + + +/** + *

+ * 卫星数据模拟表 Mapper 接口 + *

+ * + * @author 代超 + * @since 2024-11-04 + */ +public interface SatelliteDataSimulationMapper extends BaseMapper { + + /** + * 批量插入 + * + * @param addList + * @return + */ + Integer insertBatchSomeColumn(List addList); + + /** + * 查询最近十五分钟内的数据 + * + * @param currentTime + * @return + */ + List selectRecentlyData(@Param("currentTime") Date currentTime); + + /** + * 对指定区域进行降风险处理 + * + * @param id + * @return + */ + Integer reduceRisk(@Param("id") Long id); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/SchedulePlanMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/SchedulePlanMapper.java new file mode 100644 index 0000000..143a1e1 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/SchedulePlanMapper.java @@ -0,0 +1,16 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.SchedulePlan; + +/** + *

+ * 排班计划 Mapper 接口 + *

+ * + * @author liuzh + * @since 2024-10-16 + */ +public interface SchedulePlanMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/ScheduleSwapMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/ScheduleSwapMapper.java new file mode 100644 index 0000000..c2c8ce6 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/ScheduleSwapMapper.java @@ -0,0 +1,16 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.ScheduleSwap; + +/** + *

+ * 调班记录 Mapper 接口 + *

+ * + * @author liuzh + * @since 2024-10-19 + */ +public interface ScheduleSwapMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/ScheduleTemplateMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/ScheduleTemplateMapper.java new file mode 100644 index 0000000..6bb260c --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/ScheduleTemplateMapper.java @@ -0,0 +1,16 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.ScheduleTemplate; + +/** + *

+ * 排班模板 Mapper 接口 + *

+ * + * @author liuzh + * @since 2024-10-16 + */ +public interface ScheduleTemplateMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/SchedulesMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/SchedulesMapper.java new file mode 100644 index 0000000..fecd964 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/SchedulesMapper.java @@ -0,0 +1,16 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import com.tcctyn.iot.forestfire.domain.Schedules; + +/** + *

+ * 排班表 Mapper 接口 + *

+ * + * @author liuzh + * @since 2024-09-24 + */ +public interface SchedulesMapper extends MPJBaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/ShiftMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/ShiftMapper.java new file mode 100644 index 0000000..61f9900 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/ShiftMapper.java @@ -0,0 +1,16 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.Shift; + +/** + *

+ * 班次表 Mapper 接口 + *

+ * + * @author liuzh + * @since 2024-09-24 + */ +public interface ShiftMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/TemporaryTaskMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/TemporaryTaskMapper.java new file mode 100644 index 0000000..2b333c7 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/TemporaryTaskMapper.java @@ -0,0 +1,27 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.TemporaryTask; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + + +/** + *

+ * 临时任务表 Mapper 接口 + *

+ * + * @author 代超 + * @since 2024-11-01 + */ +public interface TemporaryTaskMapper extends BaseMapper { + + /** + * 临时任务批量归档 + * + * @param idList + * @return + */ + Integer archiveBatch(@Param("idList") List idList); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/VoiceTemplateConfigMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/VoiceTemplateConfigMapper.java new file mode 100644 index 0000000..1e98961 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/VoiceTemplateConfigMapper.java @@ -0,0 +1,17 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.VoiceTemplateConfig; + + +/** + *

+ * 语音播报模板表 Mapper 接口 + *

+ * + * @author daichao + * @since 2024-12-17 + */ +public interface VoiceTemplateConfigMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/WarehouseMapper.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/WarehouseMapper.java new file mode 100644 index 0000000..947acf0 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/mapper/WarehouseMapper.java @@ -0,0 +1,16 @@ +package com.tcctyn.iot.forestfire.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tcctyn.iot.forestfire.domain.Warehouse; + +/** + *

+ * 仓库信息 Mapper 接口 + *

+ * + * @author liuzh + * @since 2024-10-09 + */ +public interface WarehouseMapper extends BaseMapper { + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/BaseIdListSearcher.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/BaseIdListSearcher.java new file mode 100644 index 0000000..daf1aa7 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/BaseIdListSearcher.java @@ -0,0 +1,13 @@ +package com.tcctyn.iot.forestfire.searcher; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class BaseIdListSearcher implements Serializable { + + private static final long serialVersionUID = -2468369060844303846L; + private List idList; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/BaseRegionSearcher.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/BaseRegionSearcher.java new file mode 100644 index 0000000..1f700ad --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/BaseRegionSearcher.java @@ -0,0 +1,33 @@ +package com.tcctyn.iot.forestfire.searcher; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 林区、林场、电子围栏 查询条件基类 + */ +@Data +public class BaseRegionSearcher implements Serializable { + + private static final long serialVersionUID = 3372073567315537561L; + /** + * 归属区域id + */ + private Long belongingRegionId; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/BaseTimeSearcher.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/BaseTimeSearcher.java new file mode 100644 index 0000000..ed8c3aa --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/BaseTimeSearcher.java @@ -0,0 +1,22 @@ +package com.tcctyn.iot.forestfire.searcher; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 通用时间查询条件基类 + */ +@Data +public class BaseTimeSearcher implements Serializable { + + private static final long serialVersionUID = 8499749356132673578L; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/EnumSearcher.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/EnumSearcher.java new file mode 100644 index 0000000..bc00412 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/EnumSearcher.java @@ -0,0 +1,20 @@ +package com.tcctyn.iot.forestfire.searcher; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 枚举查询请求体 + */ +@Data +public class EnumSearcher implements Serializable { + + private static final long serialVersionUID = 6983898739859658288L; + + /** + * 枚举名称列表 + */ + private List enumNameList; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/aggregation/AggregationStatisticsSearcher.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/aggregation/AggregationStatisticsSearcher.java new file mode 100644 index 0000000..28837a0 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/aggregation/AggregationStatisticsSearcher.java @@ -0,0 +1,19 @@ +package com.tcctyn.iot.forestfire.searcher.aggregation; + +import lombok.Data; + +import java.io.Serializable; + +/** + * APP端用户登录聚合统计请求参数 + */ +@Data +public class AggregationStatisticsSearcher implements Serializable { + + private static final long serialVersionUID = 4785478626359208900L; + + /** + * 归属区域id + */ + private Long regionId; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/approvalrecord/ApprovalRecordRejectRequest.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/approvalrecord/ApprovalRecordRejectRequest.java new file mode 100644 index 0000000..188932c --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/approvalrecord/ApprovalRecordRejectRequest.java @@ -0,0 +1,26 @@ +package com.tcctyn.iot.forestfire.searcher.approvalrecord; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +public class ApprovalRecordRejectRequest implements Serializable { + + private static final long serialVersionUID = -2343165064038208726L; + + /** + * 审批记录id + */ + @NotNull(message = "请选择审批记录") + private Long id; + + /** + * 驳回说明 + */ + @NotBlank(message = "请填写驳回说明") + private String rejectionStatement; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/carouselimageconfig/CarouselImageEnableFlagRequest.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/carouselimageconfig/CarouselImageEnableFlagRequest.java new file mode 100644 index 0000000..2624a42 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/carouselimageconfig/CarouselImageEnableFlagRequest.java @@ -0,0 +1,24 @@ +package com.tcctyn.iot.forestfire.searcher.carouselimageconfig; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +public class CarouselImageEnableFlagRequest implements Serializable { + + private static final long serialVersionUID = -8452177654260865365L; + + /** + * 主键id + */ + @NotNull(message = "主键id不能为空") + private Long id; + + /** + * 启用/停用标识,0-停用,1-启用;前端取反 + */ + @NotNull(message = "启用/停用标识不能为空") + private Integer enableFlag; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/deviceinfo/DeviceOwnershipSearcher.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/deviceinfo/DeviceOwnershipSearcher.java new file mode 100644 index 0000000..9f1e951 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/deviceinfo/DeviceOwnershipSearcher.java @@ -0,0 +1,34 @@ +package com.tcctyn.iot.forestfire.searcher.deviceinfo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 查询设备归属请求体 + */ +@Data +public class DeviceOwnershipSearcher implements Serializable { + + private static final long serialVersionUID = -4260683959079318663L; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/drone/DroneSearcher.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/drone/DroneSearcher.java new file mode 100644 index 0000000..d195379 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/drone/DroneSearcher.java @@ -0,0 +1,25 @@ +package com.tcctyn.iot.forestfire.searcher.drone; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 无人机大屏页面数据根据不同的任务状态获取 + */ +@Data +public class DroneSearcher implements Serializable { + + private static final long serialVersionUID = 2308212336685255578L; + + /** 无人机任务状态:未执行、执行中、已完成 ,参看枚举 DroneTaskStatusEnum */ + private String taskStatus; + + /** 开始时间 */ + private Date startTime; + + /** 结束时间 */ + private Date endTime; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/firewarning/FireWarningAnalyzeSearcher.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/firewarning/FireWarningAnalyzeSearcher.java new file mode 100644 index 0000000..7082cb8 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/firewarning/FireWarningAnalyzeSearcher.java @@ -0,0 +1,26 @@ +package com.tcctyn.iot.forestfire.searcher.firewarning; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 火情预警研判请求参数 + */ +@Data +public class FireWarningAnalyzeSearcher implements Serializable { + + private static final long serialVersionUID = -8161270838284189389L; + + /** 火情预警id */ + @NotNull(message = "请选择要研判的火情预警") + private Long id; + + /** + * 研判结果说明 + */ + @NotBlank(message = "请输入研判结果说明") + private String analyzeInstruction; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/firewarning/FireWarningConditionSearcher.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/firewarning/FireWarningConditionSearcher.java new file mode 100644 index 0000000..98679b3 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/firewarning/FireWarningConditionSearcher.java @@ -0,0 +1,30 @@ +package com.tcctyn.iot.forestfire.searcher.firewarning; + +import com.tcctyn.iot.forestfire.searcher.BaseTimeSearcher; +import lombok.Data; + +import java.io.Serializable; + +/** + * 做成通用的查询条件类,查询满足条件的所有火情信息 + */ +@Data +public class FireWarningConditionSearcher extends BaseTimeSearcher implements Serializable { + + private static final long serialVersionUID = -5986077051405242147L; + + /** 处置状态 */ + private String disposalStatus; + + /** 火情等级 */ + private String fireLevel; + + /** 林区id */ + private Long forestId; + + /** 林场id */ + private Long farmId; + + /** 电子围栏id */ + private Long fenceId; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/hk/HkStoreListSearcher.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/hk/HkStoreListSearcher.java new file mode 100644 index 0000000..1670e21 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/hk/HkStoreListSearcher.java @@ -0,0 +1,89 @@ +package com.tcctyn.iot.forestfire.searcher.hk; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +@Data +public class HkStoreListSearcher { + /** + * 主键ID + */ + private Long id; + + /** + * MinIO存储桶名称(符合MinIO命名规范) + */ + private String bucket; + + /** + * MinIO对象唯一路径(如: images/user/2023/10/photo.jpg) + */ + private String objectKey; + + /** + * 原始文件名 + */ + private String originalName; + + /** + * 上传用户ID + */ + private Long userId; + + /** + * 文件大小(字节) + */ + private Long fileSize; + + /** + * 文件MIME类型(如image/jpeg) + */ + private String fileType; + + /** + * 文件MD5哈希(用于去重校验) + */ + private String md5; + + /** + * 是否公开(0-私有,1-公开) + */ + private Integer isPublic; + + /** + * 软删除标记(0-未删除,1-已删除) + */ + private Integer isDeleted; + + /** + * 上传时间 + */ + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createdAt; + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startCreatedAt; + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endCreatedAt; + + /** + * 更新时间 + */ + private Date updatedAt; + + /** + * 设备id + */ + private String deviceId; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/material/InventorySearcher.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/material/InventorySearcher.java new file mode 100644 index 0000000..eb88665 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/material/InventorySearcher.java @@ -0,0 +1,18 @@ +package com.tcctyn.iot.forestfire.searcher.material; + +import com.tcctyn.iot.forestfire.searcher.BaseTimeSearcher; +import lombok.Data; + +/** + * 库存记录查询条件 + */ +@Data +public class InventorySearcher extends BaseTimeSearcher { + + // 仓库所属林场id + private Long regionId; + + // 仓库id + private Long warehouseId; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/material/MaterialAllocateSearcher.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/material/MaterialAllocateSearcher.java new file mode 100644 index 0000000..4127d9e --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/material/MaterialAllocateSearcher.java @@ -0,0 +1,33 @@ +package com.tcctyn.iot.forestfire.searcher.material; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 物资出入库请求参数 + */ +@Data +public class MaterialAllocateSearcher { + + // 物资ID + @NotNull(message = "物资不能为空") + private Long materialId; + + // 仓库ID + private Long warehouseId; + + // 数量 + private BigDecimal quantity; + + // 操作用户ID + private Long userId; + + // 说明 + private String description; + + // 目标仓库ID + private Long targetWarehouseId; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/material/MaterialSearcher.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/material/MaterialSearcher.java new file mode 100644 index 0000000..e535720 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/material/MaterialSearcher.java @@ -0,0 +1,17 @@ +package com.tcctyn.iot.forestfire.searcher.material; + + +import lombok.Data; + +/** + * 物资信息查询条件 + */ +@Data +public class MaterialSearcher { + + // 仓库所属林场id + private Long regionId; + + // 仓库id + private Long warehouseId; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/noticeinfo/NoticeEnableFlagRequest.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/noticeinfo/NoticeEnableFlagRequest.java new file mode 100644 index 0000000..f335cf2 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/noticeinfo/NoticeEnableFlagRequest.java @@ -0,0 +1,25 @@ +package com.tcctyn.iot.forestfire.searcher.noticeinfo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 通知公告启用/停用请求参数 + */ +@Data +public class NoticeEnableFlagRequest implements Serializable { + + private static final long serialVersionUID = 5244375072095276711L; + + /** + * 对象id + */ + private Long id; + + /** + * 启用/停用标识,0-停用,1-启用 + */ + private Integer enableFlag; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/road/RoadSearcher.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/road/RoadSearcher.java new file mode 100644 index 0000000..4c38b70 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/road/RoadSearcher.java @@ -0,0 +1,22 @@ +package com.tcctyn.iot.forestfire.searcher.road; + +import com.tcctyn.iot.forestfire.searcher.BaseRegionSearcher; +import lombok.Data; + +/** + * @author Jason + * @date 2025年03月20日 15:06:02 + */ +@Data +public class RoadSearcher extends BaseRegionSearcher { + private Integer pageNo; + + private Integer pageSize; + + private String roadNo; + + private String roadName; + + + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/schedules/ScheduleSwapSearcher.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/schedules/ScheduleSwapSearcher.java new file mode 100644 index 0000000..9c7f86b --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/schedules/ScheduleSwapSearcher.java @@ -0,0 +1,29 @@ +package com.tcctyn.iot.forestfire.searcher.schedules; + +import com.tcctyn.iot.forestfire.searcher.BaseTimeSearcher; +import lombok.Data; + +import java.util.Date; + +/** + * 调班申请查询条件 + */ +@Data +public class ScheduleSwapSearcher extends BaseTimeSearcher { + + //申请人id + private Long applicantId; + + //替换人id + private Long replacerId; + + //调班日期 + private Date swapDate; + + //还班日期 + private Date backDate; + + //调班原因 + private String reason; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/schedules/SchedulesSearcher.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/schedules/SchedulesSearcher.java new file mode 100644 index 0000000..b1eca80 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/schedules/SchedulesSearcher.java @@ -0,0 +1,32 @@ +package com.tcctyn.iot.forestfire.searcher.schedules; + +import com.tcctyn.iot.forestfire.searcher.BaseTimeSearcher; +import lombok.Data; + +import java.io.Serializable; + +/** + * 用户排班查询请求体 + * 目前服务于大屏页面查询护林员信息的接口 + */ +@Data +public class SchedulesSearcher extends BaseTimeSearcher implements Serializable { + + private static final long serialVersionUID = 6585373568023610091L; + + /** + * 林区id + */ + private Long forestId; + + /** + * 林场id + */ + private Long farmId; + + /** + * 电子围栏id + */ + private Long fenceId; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/temporarytask/TemporaryTaskStatusSearcher.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/temporarytask/TemporaryTaskStatusSearcher.java new file mode 100644 index 0000000..c721cd7 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/searcher/temporarytask/TemporaryTaskStatusSearcher.java @@ -0,0 +1,22 @@ +package com.tcctyn.iot.forestfire.searcher.temporarytask; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 临时任务状态接受与完成状态修改请求参数 + */ +@Data +public class TemporaryTaskStatusSearcher implements Serializable { + + /** + * 任务id + */ + private Long id; + + /** + * 任务状态 : 未接受、执行中、已完成 + */ + private String taskStatus; +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IAggregationService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IAggregationService.java new file mode 100644 index 0000000..515ae20 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IAggregationService.java @@ -0,0 +1,18 @@ +package com.tcctyn.iot.forestfire.service; + +import com.tcctyn.iot.forestfire.VO.AggregationStatisticsVO; +import com.tcctyn.iot.forestfire.searcher.aggregation.AggregationStatisticsSearcher; + +/** + * 聚合服务 + */ +public interface IAggregationService { + + /** + * APP端用户登录聚合统计 + * @param searcher + * @param userId + * @return + */ + AggregationStatisticsVO statistics(AggregationStatisticsSearcher searcher, Long userId); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IApprovalRecordService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IApprovalRecordService.java new file mode 100644 index 0000000..02b4bb3 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IApprovalRecordService.java @@ -0,0 +1,96 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.iot.forestfire.domain.ApprovalRecord; +import com.tcctyn.iot.forestfire.searcher.approvalrecord.ApprovalRecordRejectRequest; + +import java.util.List; + + +/** + *

+ * 审批记录表 服务类 + *

+ * + * @author daichao + * @since 2024-12-09 + */ +public interface IApprovalRecordService { + + /** + *

+ * 分页列表查询 + *

+ * + * @param pageNo + * @param pageSize + * @return + */ + Page list(Integer pageNo, Integer pageSize); + + /** + *

+ * 详情接口 + *

+ * + * @param id + * @return + */ + ApprovalRecord getById(Long id); + + /** + *

+ * 新增接口 + *

+ * + * @param approvalRecord + * @return + */ + Integer create(ApprovalRecord approvalRecord); + + + /** + *

+ * 删除接口 + *

+ * + * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * + * @param approvalRecord + * @return + */ + Integer update(ApprovalRecord approvalRecord); + + /** + * 审批记录列表查询 + * + * @param approvalRecord + * @return + */ + List selectList(ApprovalRecord approvalRecord); + + /** + * 审批通过接口 + * + * @param id + * @param userId + * @return + */ + Integer approved(Long id, Long userId); + + /** + * 驳回接口 + * @param request + * @param userId + * @return + */ + Integer reject(ApprovalRecordRejectRequest request, Long userId); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ICarouselImageConfigService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ICarouselImageConfigService.java new file mode 100644 index 0000000..23f4944 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ICarouselImageConfigService.java @@ -0,0 +1,73 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.iot.forestfire.domain.CarouselImageConfig; + +import java.util.List; + + +/** + *

+ * 轮播图配置表 服务类 + *

+ * + * @author daichao + * @since 2024-12-17 + */ +public interface ICarouselImageConfigService { + + /** + *

+ * 分页列表查询 + *

+ * @param pageNo + * @param pageSize + * @return + */ + Page list(Integer pageNo, Integer pageSize); + + /** + *

+ * 详情接口 + *

+ * @param id + * @return + */ + CarouselImageConfig getById(Long id); + + /** + *

+ * 新增接口 + *

+ * @param carouselImageConfig + * @return + */ + Integer create(CarouselImageConfig carouselImageConfig); + + + /** + *

+ * 删除接口 + *

+ * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * @param carouselImageConfig + * @return + */ + Integer update(CarouselImageConfig carouselImageConfig); + + /** + * 列表查询 + * @param carouselImageConfig + * @return + */ + List selectList(CarouselImageConfig carouselImageConfig); + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ICheckInRecordService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ICheckInRecordService.java new file mode 100644 index 0000000..5b71b7f --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ICheckInRecordService.java @@ -0,0 +1,83 @@ +package com.tcctyn.iot.forestfire.service; + +import com.tcctyn.iot.forestfire.domain.CheckInRecord; + +import java.util.Date; +import java.util.List; + +/** + *

+ * 打卡记录表 服务类 + *

+ * + * @author liuzh + * @since 2024-10-12 + */ +public interface ICheckInRecordService { + + /** + *

+ * 分页列表查询 + *

+ * + * @return + */ + List list(CheckInRecord checkInRecord); + + /** + *

+ * 详情接口 + *

+ * + * @param id + * @return + */ + CheckInRecord getById(Long id); + + /** + *

+ * 新增接口 + *

+ * + * @param checkInRecord + * @param userId + * @return + */ + Integer create(CheckInRecord checkInRecord, Long userId); + + + /** + *

+ * 删除接口 + *

+ * + * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * + * @param checkInRecord + * @return + */ + Integer update(CheckInRecord checkInRecord); + + /** + * 查询用户某一天的打卡记录 + * + * @param userId,checkInTime + * @return + */ + List getByUserId(Long userId, Date checkInTime); + + /** + * 查询最近的10条打卡记录 + * + * @return + */ + List selectLast10Items(); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ICommonService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ICommonService.java new file mode 100644 index 0000000..88a26a6 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ICommonService.java @@ -0,0 +1,61 @@ +package com.tcctyn.iot.forestfire.service; + +import com.tcctyn.iot.forestfire.BO.SysUserBO; + +import java.util.Map; + +/** + * 放一些通用的接口,方便其他服务调用 + */ +public interface ICommonService { + + /** + * 查询所有的地区及地区名称,方便做映射替换给到前端 + * 支持单个与批量的查询 + * 当regionId为null时,查询所有 + */ + Map regionMapIdToName(Long regionId); + + /** + * 查询所有的用户名,方便做映射替换给到前端 + * 已经约定,用户的真实姓名存在nick_name 字段中 + * 支持单个与批量的查询 + */ + Map userMapIdToName(Long usrId); + + /** + * 查询所有的巡护路径,做id跟name的映射 + * 支持单个与批量的查询 + * 当pathId为null时,查询所有 + */ + Map pathMapIdToName(Long pathId); + + /** + * 查询所有的云台、卡口、水源地归属点位,做id跟name的映射 + * 支持单个与批量的查询 + * 当pointId为null时,查询所有 + * + * @return + */ + Map pointMapIdToName(Long pointId); + + /** + * 查询所有的机场,做机场id跟name的映射 + * 支持单个与批量的查询 + * 当airportId为null时,查询所有 + */ + Map airportMapIdToName(Long airportId); + + /** + * 查询所有的部门,做部门id跟name的映射 + * 支持单个与批量的查询 + * 当deptId为null时,查询所有 + */ + Map deptMapIdToName(Long deptId); + + /** + * 查询用户信息 + * 需要的时候可以快捷获取用户信息 + */ + Map userMapIdToBO(Long userId); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IDeviceChanelsService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IDeviceChanelsService.java new file mode 100644 index 0000000..7ba2240 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IDeviceChanelsService.java @@ -0,0 +1,97 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.tcctyn.iot.forestfire.VO.DeviceChanelsVO; +import com.tcctyn.iot.forestfire.domain.DeviceChanels; + +import java.util.List; + + +/** + *

+ * 设备通道表 服务类 + *

+ * + * @author 宋国强 + * @since 2025-04-09 + */ +public interface IDeviceChanelsService extends IService { + + /** + *

+ * 详情接口 + *

+ * + * @param id + * @return + */ + DeviceChanelsVO getById(Long id); + + /** + *

+ * 新增接口 + *

+ * + * @param deviceChanels + * @return + */ + Integer create(DeviceChanels deviceChanels); + + /** + *

+ * 删除接口 + *

+ * + * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 修改接口 + *

+ * + * @param deviceChanels + * @return + */ + Integer update(DeviceChanels deviceChanels); + + /** + *

+ * 根据设备编号查询该设备下所有通道信息 + *

+ * + * @param deviceNo 设备编号 + * @return 设备通道信息列表 + */ + List selectByDeviceNo(String deviceNo); + + /** + *

+ * 根据设备编号和通道号获取流地址 + *

+ * + * @return 流地址 + */ + DeviceChanelsVO getStreamUrl(String deviceNo, String chanelNo); + + /** + *

+ * 根据设备编号和通道号开启预览 + *

+ * + * @return 流地址 + */ + DeviceChanelsVO startPreview(String deviceNo, String chanelNo); + + /** + *

+ * 根据设备编号和通道号关闭预览 + *

+ */ + String stopPreview(String deviceNo, String chanelNo); + + +} + \ No newline at end of file diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IDeviceConfigService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IDeviceConfigService.java new file mode 100644 index 0000000..20c5411 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IDeviceConfigService.java @@ -0,0 +1,64 @@ +package com.tcctyn.iot.forestfire.service; + +import com.tcctyn.iot.forestfire.domain.DeviceConfig; + +/** + *

+ * 设备配置表 服务类 + *

+ * + * @author 宋国强 + * @since 2025-04-14 + */ +public interface IDeviceConfigService { + /** + *

+ * 详情接口 + *

+ * + * @param id + * @return + */ + DeviceConfig getById(Long id); + + /** + *

+ * 创建接口 + *

+ * + * @param deviceConfig + * @return + */ + Integer create(DeviceConfig deviceConfig); + + /** + *

+ * 更新接口 + *

+ * + * @param deviceConfig + * @return + */ + Integer update(DeviceConfig deviceConfig); + + /** + *

+ * 删除接口 + *

+ * + * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 查询接口 + *

+ * + * @param deviceNo + * @return + */ + DeviceConfig selectByDeviceNo(String deviceNo); + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IDeviceInfoService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IDeviceInfoService.java new file mode 100644 index 0000000..695a0e5 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IDeviceInfoService.java @@ -0,0 +1,165 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.iot.forestfire.VO.*; +import com.tcctyn.iot.forestfire.domain.DeviceInfo; +import com.tcctyn.iot.forestfire.searcher.BaseRegionSearcher; +import com.tcctyn.iot.forestfire.searcher.deviceinfo.DeviceOwnershipSearcher; + +import java.util.List; + +/** + *

+ * 设备信息表 服务类 + *

+ * + * @author 代超 + * @since 2024-10-09 + */ +public interface IDeviceInfoService { + + /** + *

+ * 分页列表查询 + *

+ * + * @param pageNo + * @param pageSize + * @return + */ + Page list(Integer pageNo, Integer pageSize); + + /** + *

+ * 详情接口 + *

+ * + * @param id + * @return + */ + DeviceInfoVO getById(Long id); + + /** + *

+ * 新增接口 + *

+ * + * @param deviceInfo + * @return + */ + Integer create(DeviceInfo deviceInfo); + + + /** + *

+ * 删除接口 + *

+ * + * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * + * @param deviceInfo + * @return + */ + Integer update(DeviceInfo deviceInfo); + + /** + * 列表查询 + * + * @param deviceInfo + * @return + */ + List selectList(DeviceInfo deviceInfo); + + /** + * 根据设备编号查询设备信息 + * + * @param deviceNo + * @return + */ + DeviceAndPointInfoVO selectByDeviceNo(String deviceNo); + + /** + * 大屏设备信息统计 + * + * @return + */ + DeviceStatisticsVO deviceStatistics(DeviceInfo deviceInfo); + + /** + * 设备快捷修改启用/停用状态接口 + * + * @param deviceInfo + * @return + */ + Integer updateEnableFlag(DeviceInfo deviceInfo); + + /** + * 设备批量删除接口 + * + * @param idList + * @return + */ + Integer deleteBatch(List idList); + + /** + * 根据前端传的设备类型,查询不同的设备归属信息 + * + * @param searcher + * @return + */ + List queryOwnership(DeviceOwnershipSearcher searcher); + + /** + * 设备列表设备统计接口 + * + * @return + */ + DeviceStatisticsByStatusVO statisticsByStatus(); + + /** + * 云台、卡口下的设备统计:设备总数、云台设备数量、卡口设备数量、设备在线率 + * + * @param searcher + * @return + */ + DeviceStatisticsByPointVO deviceStatisticsByPoint(BaseRegionSearcher searcher); + + /** + * 大屏页面查询机场信息,前端按钮展示机场信息 + * + * @param searcher + * @return + */ + List selectAirport(BaseRegionSearcher searcher); + + /** + * 根据机场id查询机场下的无人机信息 + * + * @param airportId + * @return + */ + List selectDroneByAirportId(Long airportId); + + /** + * 根据点位信息查询点位下的设备信息,传入List + * + * @param pointIdList + * @return + */ + List selectListByPointList(List pointIdList); + + /** + * 查询摄像头类型的设备列表 + * @param searcher + * @return + */ + List selectCamera(BaseRegionSearcher searcher); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IDroneTaskPlanService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IDroneTaskPlanService.java new file mode 100644 index 0000000..d2e76e1 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IDroneTaskPlanService.java @@ -0,0 +1,80 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.iot.forestfire.domain.DroneTaskPlan; +import com.tcctyn.iot.forestfire.searcher.drone.DroneSearcher; + +import java.util.List; + + +/** + *

+ * 无人机任务计划表 服务类 + *

+ * + * @author 代超 + * @since 2024-11-07 + */ +public interface IDroneTaskPlanService { + + /** + *

+ * 分页列表查询 + *

+ * @param pageNo + * @param pageSize + * @return + */ + Page list(Integer pageNo, Integer pageSize); + + /** + *

+ * 详情接口 + *

+ * @param id + * @return + */ + DroneTaskPlan getById(Long id); + + /** + *

+ * 新增接口 + *

+ * @param droneTaskPlan + * @return + */ + Integer create(DroneTaskPlan droneTaskPlan); + + + /** + *

+ * 删除接口 + *

+ * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * @param droneTaskPlan + * @return + */ + Integer update(DroneTaskPlan droneTaskPlan); + + /** + * 根据任务状态查询无人机的执飞任务 + * @param searcher + * @return + */ + List selectByStatus(DroneSearcher searcher); + + /** + * 无人机历史任务分页查询 + * @param droneTaskPlan + * @return + */ + List seletList(DroneTaskPlan droneTaskPlan); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IFireReportService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IFireReportService.java new file mode 100644 index 0000000..598ae20 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IFireReportService.java @@ -0,0 +1,99 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.iot.forestfire.VO.FireReportStatisticsVO; +import com.tcctyn.iot.forestfire.domain.FireReport; + +import java.util.List; + + +/** + *

+ * 火情上报表 服务类 + *

+ * + * @author 代超 + * @since 2024-11-01 + */ +public interface IFireReportService { + + /** + *

+ * 分页列表查询 + *

+ * + * @param pageNo + * @param pageSize + * @return + */ + Page list(Integer pageNo, Integer pageSize); + + /** + *

+ * 详情接口 + *

+ * + * @param id + * @return + */ + FireReport getById(Long id); + + /** + *

+ * 新增接口 + *

+ * + * @param fireReport + * @return + */ + Integer create(FireReport fireReport); + + + /** + *

+ * 删除接口 + *

+ * + * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * + * @param fireReport + * @return + */ + Integer update(FireReport fireReport); + + /** + * 火情上报列表分页查询 + * + * @param fireReport + * @return + */ + List selectList(FireReport fireReport); + + /** + * 火情上报归档 + * @param fireReport + * @return + */ + Integer archive(FireReport fireReport); + + /** + * 历史火情上报统计 + * @return + */ + FireReportStatisticsVO fireReportStatistics(); + + /** + * 火情上报处理 + * @param fireReport + * @return + */ + Integer disposal(FireReport fireReport); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IFireWarningInfoService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IFireWarningInfoService.java new file mode 100644 index 0000000..4a55dbe --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IFireWarningInfoService.java @@ -0,0 +1,173 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.iot.forestfire.VO.*; +import com.tcctyn.iot.forestfire.VO.*; +import com.tcctyn.iot.forestfire.domain.FireWarningInfo; +import com.tcctyn.iot.forestfire.searcher.BaseIdListSearcher; +import com.tcctyn.iot.forestfire.searcher.BaseTimeSearcher; +import com.tcctyn.iot.forestfire.searcher.firewarning.FireWarningAnalyzeSearcher; +import com.tcctyn.iot.forestfire.searcher.firewarning.FireWarningConditionSearcher; + +import java.util.List; + + +/** + *

+ * 火情预警信息表 服务类 + *

+ * + * @author 代超 + * @since 2024-10-08 + */ +public interface IFireWarningInfoService { + + /** + *

+ * 分页列表查询 + *

+ * + * @param pageNo + * @param pageSize + * @return + */ + Page list(Integer pageNo, Integer pageSize); + + /** + *

+ * 详情接口 + *

+ * + * @param id + * @return + */ + FireWarningInfo getById(Long id); + + /** + *

+ * 新增接口 + *

+ * + * @param fireWarningInfo + * @return + */ + Integer create(FireWarningInfo fireWarningInfo); + + + /** + *

+ * 删除接口 + *

+ * + * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * + * @param fireWarningInfo + * @return + */ + Integer update(FireWarningInfo fireWarningInfo); + + /** + * 火情预警信息分页查询 + * + * @param fireWarningInfo + * @return + */ + List selectList(FireWarningInfo fireWarningInfo); + + /** + * 根据处理状态进行统计 + * + * @param searcher + * @return + */ + FireWarningCountByStatusVO countByDisposalStatus(FireWarningConditionSearcher searcher); + + /** + * 查询满足条件的所有火情信息 + * + * @param searcher + * @return + */ + List selectByCondition(FireWarningConditionSearcher searcher); + + /** + * 根据火情等级进行统计 + * + * @return + */ + List countByFireLevel(FireWarningConditionSearcher searcher); + + /** + * 查询最近的十条火情信息 + * + * @return + */ + List selectLimit(FireWarningConditionSearcher searcher); + + /** + * @param searcher + * @return + */ + + FireWarningStatisticsByDataSourceVO statisticsByDataSource(BaseTimeSearcher searcher); + + /** + * 火情预警归档 + * + * @param id + * @return + */ + Integer archive(Long id); + + /** + * 火情预警批量归档 + * + * @param searcher + * @return + */ + Integer archiveBatch(BaseIdListSearcher searcher); + + /** + * APP端查询已处理的火情信息(分页) + * + * @param fireWarningInfo + * @return + */ + List selectDisposedList(FireWarningInfo fireWarningInfo); + + /** + * 火情预警信息研判 + * + * @param searcher + * @param userId + * @return + */ + Integer analyze(FireWarningAnalyzeSearcher searcher, Long userId); + + /** + * 模拟云台发现火情预警信息,云台为呼马山云台1,设备编号为 BC1733545 + */ + void simulate(); + + /** + * 火情预警信息周边搜索 + * @param id + * @return + */ + FireWarningSurroundingVO surroundingSearch(Long id); + + /** + * 火情预警信息误判接口 + * @param id + * @return + */ + Integer misjudge(Long id); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IHkStoreCapturePicturesService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IHkStoreCapturePicturesService.java new file mode 100644 index 0000000..d380890 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IHkStoreCapturePicturesService.java @@ -0,0 +1,18 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.tcctyn.iot.forestfire.searcher.hk.HkStoreListSearcher; +import com.tcctyn.iot.forestfire.VO.HkStoreCapturePicturesVO; +import com.tcctyn.iot.forestfire.domain.HkStoreCapturePictures; + +import java.util.List; + +/** +* @author 13768238378 +* @description 针对表【hk_store_capture_pictures(海康_硬件抓拍图片元数据表)】的数据库操作Service +* @createDate 2025-04-10 11:17:50 +*/ +public interface IHkStoreCapturePicturesService extends IService { + + List getListHkStoreCapturePicturesList(HkStoreListSearcher hkStoreListSearcher); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IInventoryService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IInventoryService.java new file mode 100644 index 0000000..1534909 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IInventoryService.java @@ -0,0 +1,63 @@ +package com.tcctyn.iot.forestfire.service; + +import com.tcctyn.iot.forestfire.domain.Inventory; +import com.tcctyn.iot.forestfire.searcher.material.InventorySearcher; + +import java.util.List; + +/** + *

+ * 物资库存 服务类 + *

+ * + * @author liuzh + * @since 2024-10-29 + */ +public interface IInventoryService{ + + /** + *

+ * 分页列表查询 + *

+ * @param inventorySearcher + * @return + */ + List list(InventorySearcher inventorySearcher); + + /** + *

+ * 详情接口 + *

+ * @param id + * @return + */ + Inventory getById(Long id); + + /** + *

+ * 新增接口 + *

+ * @param inventory + * @return + */ + Integer create(Inventory inventory); + + + /** + *

+ * 删除接口 + *

+ * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * @param inventory + * @return + */ + Integer update(Inventory inventory); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IKeyAreaInfoService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IKeyAreaInfoService.java new file mode 100644 index 0000000..8c1f8dc --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IKeyAreaInfoService.java @@ -0,0 +1,72 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.iot.forestfire.domain.KeyAreaInfo; + +import java.util.List; + + +/** + *

+ * 重点监控区域配置表 服务类 + *

+ * + * @author daichao + * @since 2024-12-17 + */ +public interface IKeyAreaInfoService { + + /** + *

+ * 分页列表查询 + *

+ * @param pageNo + * @param pageSize + * @return + */ + Page list(Integer pageNo, Integer pageSize); + + /** + *

+ * 详情接口 + *

+ * @param id + * @return + */ + KeyAreaInfo getById(Long id); + + /** + *

+ * 新增接口 + *

+ * @param keyAreaInfo + * @return + */ + Integer create(KeyAreaInfo keyAreaInfo); + + + /** + *

+ * 删除接口 + *

+ * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * @param keyAreaInfo + * @return + */ + Integer update(KeyAreaInfo keyAreaInfo); + + /** + * 列表查询 + * @param keyAreaInfo + * @return + */ + List selectList(KeyAreaInfo keyAreaInfo); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ILeaveRecordService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ILeaveRecordService.java new file mode 100644 index 0000000..1dcf975 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ILeaveRecordService.java @@ -0,0 +1,86 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.iot.forestfire.domain.LeaveRecord; + +import java.util.List; + + +/** + *

+ * 请假记录表 服务类 + *

+ * + * @author daichao + * @since 2024-12-09 + */ +public interface ILeaveRecordService { + + /** + *

+ * 分页列表查询 + *

+ * + * @param pageNo + * @param pageSize + * @return + */ + Page list(Integer pageNo, Integer pageSize); + + /** + *

+ * 详情接口 + *

+ * + * @param id + * @return + */ + LeaveRecord getById(Long id); + + /** + *

+ * 新增接口 + *

+ * + * @param leaveRecord + * @return + */ + Integer create(LeaveRecord leaveRecord); + + + /** + *

+ * 删除接口 + *

+ * + * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * + * @param leaveRecord + * @return + */ + Integer update(LeaveRecord leaveRecord); + + /** + * 请假记录列表查询 + * + * @param leaveRecord + * @return + */ + List selectList(LeaveRecord leaveRecord); + + /** + * 请假记录撤销接口 + * + * @param id + * @return + */ + Integer revoke(Long id); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IMaterialService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IMaterialService.java new file mode 100644 index 0000000..e37bbec --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IMaterialService.java @@ -0,0 +1,88 @@ +package com.tcctyn.iot.forestfire.service; + +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.iot.forestfire.VO.MaterialStatisticsVO; +import com.tcctyn.iot.forestfire.domain.Material; +import com.tcctyn.iot.forestfire.searcher.material.MaterialAllocateSearcher; +import com.tcctyn.iot.forestfire.searcher.material.MaterialSearcher; + +import java.util.List; + +/** + *

+ * 物资信息 服务类 + *

+ * + * @author liuzh + * @since 2024-10-09 + */ +public interface IMaterialService { + + /** + *

+ * 分页列表查询 + *

+ * @param materialSearcher + * @return + */ + List list(MaterialSearcher materialSearcher); + + /** + *

+ * 详情接口 + *

+ * @param id + * @return + */ + Material getById(Long id); + + /** + *

+ * 新增接口 + *

+ * @param material + * @return + */ + AjaxResult create(Material material); + + + /** + *

+ * 删除接口 + *

+ * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * @param material + * @return + */ + Integer update(Material material); + + /** + * 物资入库 + */ + Integer inbound(MaterialAllocateSearcher materialAllocateSearcher); + + /** + * 物资出库 + */ + Integer outbound(MaterialAllocateSearcher materialAllocateSearcher); + + /** + * 物资调拨 + * @param materialAllocateSearcher + * @return + */ + Integer allocate(MaterialAllocateSearcher materialAllocateSearcher); + + /** + * 根据仓库id统计物资 + */ + List getStatisticsByWarehouse(Long warehouseId); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/INoticeInfoService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/INoticeInfoService.java new file mode 100644 index 0000000..774af18 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/INoticeInfoService.java @@ -0,0 +1,72 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.iot.forestfire.domain.NoticeInfo; + +import java.util.List; + + +/** + *

+ * 通知公告信息表 服务类 + *

+ * + * @author daichao + * @since 2024-12-17 + */ +public interface INoticeInfoService { + + /** + *

+ * 分页列表查询 + *

+ * @param pageNo + * @param pageSize + * @return + */ + Page list(Integer pageNo, Integer pageSize); + + /** + *

+ * 详情接口 + *

+ * @param id + * @return + */ + NoticeInfo getById(Long id); + + /** + *

+ * 新增接口 + *

+ * @param noticeInfo + * @return + */ + Integer create(NoticeInfo noticeInfo); + + + /** + *

+ * 删除接口 + *

+ * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * @param noticeInfo + * @return + */ + Integer update(NoticeInfo noticeInfo); + + /** + * 列表查询 + * @param noticeInfo + * @return + */ + List selectList(NoticeInfo noticeInfo); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IPatrolPathService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IPatrolPathService.java new file mode 100644 index 0000000..5e06dba --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IPatrolPathService.java @@ -0,0 +1,87 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.iot.forestfire.VO.PatrolPathVO; +import com.tcctyn.iot.forestfire.domain.PatrolPath; + +import java.util.List; + + +/** + *

+ * 巡护路径表 服务类 + *

+ * + * @author 代超 + * @since 2024-09-24 + */ +public interface IPatrolPathService { + + /** + *

+ * 分页列表查询 + *

+ * @param pageNo + * @param pageSize + * @return + */ + Page list(Integer pageNo, Integer pageSize); + + /** + *

+ * 详情接口 + *

+ * @param id + * @return + */ + PatrolPathVO getById(Long id); + + /** + *

+ * 新增接口 + *

+ * @param patrolPath + * @return + */ + Integer create(PatrolPath patrolPath); + + + /** + *

+ * 删除接口 + *

+ * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * @param patrolPath + * @return + */ + Integer update(PatrolPath patrolPath); + + /** + * 分页列表查询--自己封装的分页插件 + * @param patrolPath + * @return + */ + List selectList(PatrolPath patrolPath); + + /** + * 根据林场id查询巡护路径 + * @param regionId + * @return + */ + List selectByRegionId(Long regionId); + + /** + * 大屏页面根据地区查询巡护路径 + * @param patrolPath + * @return + */ + List queryByRegion(PatrolPath patrolPath); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IPointInfoService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IPointInfoService.java new file mode 100644 index 0000000..c3a3732 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IPointInfoService.java @@ -0,0 +1,119 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.iot.forestfire.VO.PointAndDeviceInfoVO; +import com.tcctyn.iot.forestfire.VO.PointInfoVO; +import com.tcctyn.iot.forestfire.VO.PointStatisticsByPointTypeVO; +import com.tcctyn.iot.forestfire.domain.PointInfo; + +import java.util.List; + + +/** + *

+ * 点位信息表 服务类 + *

+ * + * @author 代超 + * @since 2024-09-24 + */ +public interface IPointInfoService { + + /** + *

+ * 分页列表查询 + *

+ * + * @param pageNo + * @param pageSize + * @return + */ + Page list(Integer pageNo, Integer pageSize); + + /** + *

+ * 详情接口 + *

+ * + * @param id + * @return + */ + PointInfoVO getById(Long id); + + /** + *

+ * 新增接口 + *

+ * + * @param pointInfo + * @return + */ + Integer create(PointInfo pointInfo); + + + /** + *

+ * 删除接口 + *

+ * + * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * + * @param pointInfo + * @return + */ + Integer update(PointInfo pointInfo); + + /** + * 点位查询接口(不分页) + * + * @param pointInfo + * @return + */ + List selectAll(PointInfo pointInfo); + + /** + * 批量删除接口 + * + * @param idList + * @return + */ + Integer deleteBatch(List idList); + + /** + * 列表查询接口 + * + * @param pointInfo + * @return + */ + List selectList(PointInfo pointInfo); + + /** + * 设备快捷修改启用/停用状态接口 + * + * @param pointInfo + * @return + */ + Integer updateEnableFlag(PointInfo pointInfo);//sgq2025.3.20 + + /** + * 大屏页面查询监测点信息:云台、卡口 + * + * @param pointInfo + * @return + */ + List queryMonitoringPoint(PointInfo pointInfo); + + /** + * 资源点分类统计 + * @return + */ + PointStatisticsByPointTypeVO statisticsByPointType(); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IRegionInfoService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IRegionInfoService.java new file mode 100644 index 0000000..88f9187 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IRegionInfoService.java @@ -0,0 +1,136 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.common.core.web.domain.TreeSelect; +import com.tcctyn.common.core.web.domain.entity.RegionInfo; + +import java.util.List; + + +/** + *

+ * 区域信息表 服务类 + *

+ * + * @author 代超 + * @since 2024-09-24 + */ +public interface IRegionInfoService { + + /** + *

+ * 分页列表查询 + *

+ * + * @param pageNo + * @param pageSize + * @return + */ + Page list(Integer pageNo, Integer pageSize); + + /** + *

+ * 详情接口 + *

+ * + * @param id + * @return + */ + RegionInfo getById(Long id); + + /** + *

+ * 新增接口 + *

+ * + * @param regionInfo + * @return + */ + Integer create(RegionInfo regionInfo); + + + /** + *

+ * 删除接口 + *

+ * + * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * + * @param regionInfo + * @return + */ + Integer update(RegionInfo regionInfo); + + /** + * 林区分页查询接口 + * + * @param regionInfo + * @return + */ + List selectList(RegionInfo regionInfo); + + /** + * 根据父级id查询全部地区 + * + * @param parentId + * @return + */ + List selectAllByParentId(Long parentId); + + /** + * 查询全部的地区树结构信息 + * + * @return + */ + List selectAll(Integer level); + + /** + * 根据地区类型查询全部 + * + * @param areaType + * @return + */ + List selectAllByAreaType(String areaType); + + /** + * 查询地区树结构信息 + * + * @param regionInfo + * @return + */ + List selectRegionTree(RegionInfo regionInfo); + + + /** + * 查询所有的地区信息 + * + * @param regionInfo + * @return + */ + public List selectRegionList(RegionInfo regionInfo); + + /** + * 构建区域下拉树结构 + * + * @param regionInfoList 区域列表 + * @return 下拉树结构列表 + */ + public List buildRegionTreeSelect(List regionInfoList); + + + /** + * 构建前端所需要树结构 + * + * @param regionInfoList 区域列表 + * @return 树结构列表 + */ + public List buildRegionTree(List regionInfoList); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IRoadInfoService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IRoadInfoService.java new file mode 100644 index 0000000..fb76426 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IRoadInfoService.java @@ -0,0 +1,21 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.tcctyn.iot.forestfire.domain.RoadInfo; + +/** + *

+ * 林间道路详细信息表 服务类 + *

+ * + * @author jason + * @since 2025-03-11 + */ +public interface IRoadInfoService extends IService { + /** + * 新增 + * @param roadInfo + * @return + */ + Integer create(RoadInfo roadInfo); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IRoadService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IRoadService.java new file mode 100644 index 0000000..ba4f77d --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IRoadService.java @@ -0,0 +1,38 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.tcctyn.iot.forestfire.domain.Road; +import com.tcctyn.iot.forestfire.searcher.road.RoadSearcher; + +/** + *

+ * 林间道路信息表 服务类 + *

+ * + * @author jason + * @since 2025-03-11 + */ +public interface IRoadService extends IService { + + /** + * 新增 + * @param road + * @return + */ + Integer create(Road road); + + /** + * 更新 + * @param road + * @return + */ + Integer update(Road road); + + /** + * 查询分页数据 + * @param roadSearcher + * @return + */ + Page selectPageList(RoadSearcher roadSearcher); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ISatelliteDataSimulationService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ISatelliteDataSimulationService.java new file mode 100644 index 0000000..f17a50d --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ISatelliteDataSimulationService.java @@ -0,0 +1,82 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.iot.forestfire.VO.AirportVO; +import com.tcctyn.iot.forestfire.domain.SatelliteDataSimulation; + +import java.util.Date; +import java.util.List; + + +/** + *

+ * 卫星数据模拟表 服务类 + *

+ * + * @author 代超 + * @since 2024-11-05 + */ +public interface ISatelliteDataSimulationService { + + /** + *

+ * 分页列表查询 + *

+ * @param pageNo + * @param pageSize + * @return + */ + Page list(Integer pageNo, Integer pageSize); + + /** + *

+ * 详情接口 + *

+ * @param id + * @return + */ + SatelliteDataSimulation getById(Long id); + + /** + *

+ * 新增接口 + *

+ * @param satelliteDataSimulation + * @return + */ + Integer create(SatelliteDataSimulation satelliteDataSimulation); + + + /** + *

+ * 删除接口 + *

+ * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * @param satelliteDataSimulation + * @return + */ + Integer update(SatelliteDataSimulation satelliteDataSimulation); + + /** + * 查询最近一批十五分钟内的卫星数据 + * @param currentTime + * @return + */ + List selectRecentlyData(Date currentTime); + + /** + * 对指定区域降风险处理 + * 返回给前端火情点最近的机场的坐标信息 + * @param id + * @return + */ + AirportVO reduceRisk(Long id); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ISchedulePlanService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ISchedulePlanService.java new file mode 100644 index 0000000..1bf0261 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ISchedulePlanService.java @@ -0,0 +1,69 @@ +package com.tcctyn.iot.forestfire.service; + +import com.tcctyn.iot.forestfire.domain.SchedulePlan; + +import java.util.List; + +/** + *

+ * 排班计划 服务类 + *

+ * + * @author liuzh + * @since 2024-10-16 + */ +public interface ISchedulePlanService{ + + /** + *

+ * 分页列表查询 + *

+ * @param schedulePlan + * @return + */ + List list(SchedulePlan schedulePlan); + + /** + *

+ * 详情接口 + *

+ * @param id + * @return + */ + SchedulePlan getById(Long id); + + /** + *

+ * 新增接口 + *

+ * @param schedulePlan + * @return + */ + Integer create(SchedulePlan schedulePlan); + + + /** + *

+ * 删除接口 + *

+ * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * @param schedulePlan + * @return + */ + Integer update(SchedulePlan schedulePlan); + + /** + * 生成排班信息 + * @param schedulePlan + * @return + */ + Integer generate(SchedulePlan schedulePlan); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IScheduleSwapService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IScheduleSwapService.java new file mode 100644 index 0000000..7c0645d --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IScheduleSwapService.java @@ -0,0 +1,62 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.iot.forestfire.domain.ScheduleSwap; + +/** + *

+ * 调班记录 服务类 + *

+ * + * @author liuzh + * @since 2024-10-19 + */ +public interface IScheduleSwapService{ + + /** + *

+ * 分页列表查询 + *

+ * @param pageNo + * @param pageSize + * @return + */ + Page list(Integer pageNo, Integer pageSize); + + /** + *

+ * 详情接口 + *

+ * @param id + * @return + */ + ScheduleSwap getById(Long id); + + /** + *

+ * 新增接口 + *

+ * @param scheduleSwap + * @return + */ + Integer create(ScheduleSwap scheduleSwap); + + + /** + *

+ * 删除接口 + *

+ * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * @param scheduleSwap + * @return + */ + Integer update(ScheduleSwap scheduleSwap); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IScheduleTemplateService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IScheduleTemplateService.java new file mode 100644 index 0000000..aa25065 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IScheduleTemplateService.java @@ -0,0 +1,75 @@ +package com.tcctyn.iot.forestfire.service; + +import com.tcctyn.iot.forestfire.VO.ScheduleTemplateVO; +import com.tcctyn.iot.forestfire.domain.ScheduleTemplate; + +import java.util.List; + +/** + *

+ * 排班模板 服务类 + *

+ * + * @author liuzh + * @since 2024-10-16 + */ +public interface IScheduleTemplateService{ + + /** + *

+ * 列表查询 + *

+ * @param scheduleTemplate + * @return + */ + List list(ScheduleTemplate scheduleTemplate); + + /** + *

+ * 详情接口 + *

+ * @param id + * @return + */ + ScheduleTemplate getById(Long id); + + /** + *

+ * 新增接口 + *

+ * @param scheduleTemplate + * @return + */ + Integer create(ScheduleTemplate scheduleTemplate); + + + /** + *

+ * 删除接口 + *

+ * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * @param scheduleTemplate + * @return + */ + Integer update(ScheduleTemplate scheduleTemplate); + + /** + * 根据计划id获取模板 + * @param planId + * @return + */ + List getByPlanId(Long planId); + + /** + * 批量新增 + */ + boolean createBatch(List scheduleTemplateList); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ISchedulesService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ISchedulesService.java new file mode 100644 index 0000000..b4db921 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ISchedulesService.java @@ -0,0 +1,168 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.tcctyn.iot.forestfire.VO.*; +import com.tcctyn.iot.forestfire.VO.*; +import com.tcctyn.iot.forestfire.domain.Schedules; +import com.tcctyn.iot.forestfire.searcher.schedules.ScheduleSwapSearcher; +import com.tcctyn.iot.forestfire.searcher.schedules.SchedulesSearcher; + +import java.time.YearMonth; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + *

+ * 排班表 服务类 + *

+ * + * @author liuzh + * @since 2024-09-24 + */ +public interface ISchedulesService extends IService { + + /** + *

+ * 查询一周的排班信息 + *

+ * @param schedules + * @return + */ + List weekList(Schedules schedules); + + /** + *

+ * 从周排班信息中提取出每条路线的排班信息 + *

+ * @param weeklist + * @return + */ + List> list(List weeklist, Schedules schedules); + + /** + * 生成排班信息 + * @return + */ + boolean generate(); + + /** + *

+ * 详情接口 + *

+ * @param id + * @return + */ + Schedules getById(Long id); + + /** + *

+ * 新增接口 + *

+ * @param schedules + * @return + */ + Integer create(Schedules schedules); + + + /** + *

+ * 删除接口 + *

+ * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * @param schedules + * @return + */ + Integer update(Schedules schedules); + + /** + * 批量操作 + * @param scheduleDetail + * @return + */ + Integer createBatch(ScheduleDetail scheduleDetail); + + /** + * 大屏页面根据林区、林场查询护林员信息 + * @param params + * @return + */ + List queryRangerInfo(SchedulesSearcher params); + + /** + * 分页查询列表 + * @param schedules + * @return + */ + List selectList(Schedules schedules, Date startDate, Date endDate, String userName); + + /** + * 调整排班 + * + * @param scheduleSwapSearcher + * @return + */ + Integer swapSchedule(ScheduleSwapSearcher scheduleSwapSearcher); + + /** + * 统计护林员以及巡护点位信息 + * + * @param params + * @return + */ + RangerStatisticsVO queryRangerStatistics(SchedulesSearcher params); + + /** + * 大屏页面,查询当日排班信息 + * @param params + * @return + */ + List queryScheduleByCondition(SchedulesSearcher params); + + /** + * 大屏页面根据 scheduleId查询详情 + * @param scheduleId + * @return + */ + ScheduleDetailInfoVO queryScheduleDetail(Long scheduleId); + + /** + * 大屏页面根据林区查询护林员统计信息 + * @param regionId + * @return + */ + ForesterStatisticsVO queryForesterStatistics(Long regionId); + + /** + * 大屏页面根据林区查询护林员值班状态 + * @param regionId + * @param queryDate + * @return + */ + List getUserScheduleStatus(Long regionId,Date queryDate); + + /** + * APP端用户登录后获取排班信息 + * @param userId + * @param date + * @return + */ + ScheduleVO getUserSchedule(Long userId,Date date); + + /** + * APP端查询某人某月的排班打卡情况 + * @param userId + * @param month + * @return + */ + List queryMonthSchedule(Long userId, YearMonth month); + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IShiftService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IShiftService.java new file mode 100644 index 0000000..9f9ec28 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IShiftService.java @@ -0,0 +1,76 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.tcctyn.iot.forestfire.domain.Shift; + +import java.util.List; + +/** + *

+ * 班次表 服务类 + *

+ * + * @author liuzh + * @since 2024-09-24 + */ +public interface IShiftService extends IService { + + /** + *

+ * 分页列表查询 + *

+ * @param pageNo + * @param pageSize + * @return + */ + Page list(Integer pageNo, Integer pageSize); + + /** + *

+ * 详情接口 + *

+ * @param id + * @return + */ + Shift getById(Long id); + + /** + *

+ * 新增接口 + *

+ * @param shift + * @return + */ + Integer create(Shift shift); + + + /** + *

+ * 删除接口 + *

+ * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * @param shift + * @return + */ + Integer update(Shift shift); + + /** + *

+ * 查询列表 + *

+ * @param shift + * @return + */ + List selectShiftList(Shift shift); + + List allShift(); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ITemporaryTaskService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ITemporaryTaskService.java new file mode 100644 index 0000000..69a78c2 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/ITemporaryTaskService.java @@ -0,0 +1,122 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.iot.forestfire.VO.TemporaryTaskVO; +import com.tcctyn.iot.forestfire.domain.TemporaryTask; +import com.tcctyn.iot.forestfire.searcher.BaseIdListSearcher; +import com.tcctyn.iot.forestfire.searcher.temporarytask.TemporaryTaskStatusSearcher; + +import java.util.List; + + +/** + *

+ * 临时任务表 服务类 + *

+ * + * @author 代超 + * @since 2024-11-01 + */ +public interface ITemporaryTaskService { + + /** + *

+ * 分页列表查询 + *

+ * + * @param pageNo + * @param pageSize + * @return + */ + Page list(Integer pageNo, Integer pageSize); + + /** + *

+ * 详情接口 + *

+ * + * @param id + * @return + */ + TemporaryTask getById(Long id); + + /** + *

+ * 新增接口 + *

+ * + * @param temporaryTask + * @return + */ + Integer create(TemporaryTask temporaryTask); + + + /** + *

+ * 删除接口 + *

+ * + * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * + * @param temporaryTask + * @return + */ + Integer update(TemporaryTask temporaryTask); + + /** + * 临时任务归档 + * + * @param id + * @return + */ + Integer archive(Long id); + + /** + * 临时任务批量归档 + * + * @param searcher + * @return + */ + Integer archiveBatch(BaseIdListSearcher searcher); + + /** + * 临时任务分页列表查询 + * + * @param temporaryTask + * @return + */ + List selectList(TemporaryTask temporaryTask); + + /** + * 查一天的临时任务列表 + * + * @param temporaryTask + * @return + */ + List selectOneDayList(TemporaryTask temporaryTask); + + /** + * 查询未完成、进行中的临时任务(分页) + * + * @param temporaryTask + * @return + */ + List selectUncompletedList(TemporaryTask temporaryTask); + + /** + * 任务接受与完成接口 + * + * @param searcher + * @param userId + * @return + */ + Integer updateTaskStatus(TemporaryTaskStatusSearcher searcher,Long userId); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IVoiceTemplateConfigService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IVoiceTemplateConfigService.java new file mode 100644 index 0000000..e367296 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IVoiceTemplateConfigService.java @@ -0,0 +1,63 @@ +package com.tcctyn.iot.forestfire.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tcctyn.iot.forestfire.domain.VoiceTemplateConfig; + + +/** + *

+ * 语音播报模板表 服务类 + *

+ * + * @author daichao + * @since 2024-12-17 + */ +public interface IVoiceTemplateConfigService { + + /** + *

+ * 分页列表查询 + *

+ * @param pageNo + * @param pageSize + * @return + */ + Page list(Integer pageNo, Integer pageSize); + + /** + *

+ * 详情接口 + *

+ * @param id + * @return + */ + VoiceTemplateConfig getById(Long id); + + /** + *

+ * 新增接口 + *

+ * @param voiceTemplateConfig + * @return + */ + Integer create(VoiceTemplateConfig voiceTemplateConfig); + + + /** + *

+ * 删除接口 + *

+ * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * @param voiceTemplateConfig + * @return + */ + Integer update(VoiceTemplateConfig voiceTemplateConfig); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IWarehouseService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IWarehouseService.java new file mode 100644 index 0000000..8172cde --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/IWarehouseService.java @@ -0,0 +1,75 @@ +package com.tcctyn.iot.forestfire.service; + +import com.tcctyn.iot.forestfire.VO.WarehouseSelectVO; +import com.tcctyn.iot.forestfire.domain.Warehouse; + +import java.util.List; + +/** + *

+ * 仓库信息 服务类 + *

+ * + * @author liuzh + * @since 2024-10-09 + */ +public interface IWarehouseService { + + /** + *

+ * 分页列表查询 + *

+ * @param warehouse + * @return + */ + List list(Warehouse warehouse); + + /** + *

+ * 详情接口 + *

+ * @param id + * @return + */ + Warehouse getById(Long id); + + /** + *

+ * 新增接口 + *

+ * @param warehouse + * @return + */ + Integer create(Warehouse warehouse); + + + /** + *

+ * 删除接口 + *

+ * @param id + * @return + */ + Integer delete(Long id); + + /** + *

+ * 更新接口 + *

+ * @param warehouse + * @return + */ + Integer update(Warehouse warehouse); + + /** + * 查询仓库列表用于前端选择器 + */ + List selectWarehouse(Long regionId); + + /** + * 根据查询条件查询所有的仓库信息 + * @param warehouse + * @return + */ + List selectAll(Warehouse warehouse); +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/AggregationServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/AggregationServiceImpl.java new file mode 100644 index 0000000..5adef40 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/AggregationServiceImpl.java @@ -0,0 +1,80 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tcctyn.iot.forestfire.VO.AggregationStatisticsVO; +import com.tcctyn.iot.forestfire.domain.ApprovalRecord; +import com.tcctyn.iot.forestfire.domain.FireReport; +import com.tcctyn.iot.forestfire.domain.FireWarningInfo; +import com.tcctyn.iot.forestfire.domain.TemporaryTask; +import com.tcctyn.iot.forestfire.enums.FireWarningDisposalStatusEnum; +import com.tcctyn.iot.forestfire.enums.TaskStatusEnum; +import com.tcctyn.iot.forestfire.mapper.ApprovalRecordMapper; +import com.tcctyn.iot.forestfire.mapper.FireReportMapper; +import com.tcctyn.iot.forestfire.mapper.FireWarningInfoMapper; +import com.tcctyn.iot.forestfire.mapper.TemporaryTaskMapper; +import com.tcctyn.iot.forestfire.searcher.aggregation.AggregationStatisticsSearcher; +import com.tcctyn.iot.forestfire.service.IAggregationService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Objects; + +/** + * 聚合服务实现类 + */ +@Service +public class AggregationServiceImpl implements IAggregationService { + + @Resource + private FireWarningInfoMapper fireWarningInfoMapper; + + @Resource + private FireReportMapper fireReportMapper; + + @Resource + private TemporaryTaskMapper temporaryTaskMapper; + + @Resource + private ApprovalRecordMapper approvalRecordMapper; + + @Override + public AggregationStatisticsVO statistics(AggregationStatisticsSearcher searcher, Long userId) { + + //未处理的火情预警数 + Long unhandledFireWarningNum = fireWarningInfoMapper.selectCount(new QueryWrapper().lambda() + .eq(Objects.nonNull(searcher.getRegionId()), FireWarningInfo::getRegionId, searcher.getRegionId()) + .eq(FireWarningInfo::getDisposalStatus, FireWarningDisposalStatusEnum.UNHANDLED.name()) + ); + + //未处理的火情上报数 + Long unhandledFireReportNum = fireReportMapper.selectCount(new QueryWrapper().lambda() + .eq(Objects.nonNull(searcher.getRegionId()), FireReport::getRegionId, searcher.getRegionId()) + .eq(FireReport::getDisposalStatus, 0) + ); + + //我未接受的任务数 + Long unacceptedTaskNum = temporaryTaskMapper.selectCount(new QueryWrapper().lambda() + .eq(Objects.nonNull(userId), TemporaryTask::getTaskPersonId, userId) + .eq(TemporaryTask::getTaskStatus, TaskStatusEnum.NOT_ACCEPTED.name()) + ); + + //未处理的审批任务数 + Long unapprovedNum = approvalRecordMapper.selectCount(new QueryWrapper().lambda() + .eq(ApprovalRecord::getApprovalFlag, 0) + ); + + //林区下未接受的任务数 + Long unacceptedTaskNumByRegion = temporaryTaskMapper.selectCount(new QueryWrapper().lambda() + .eq(Objects.nonNull(searcher.getRegionId()), TemporaryTask::getRegionId, searcher.getRegionId()) + .eq(TemporaryTask::getTaskStatus, TaskStatusEnum.NOT_ACCEPTED.name()) + ); + AggregationStatisticsVO vo = new AggregationStatisticsVO(); + vo.setUnhandledFireWarningNum(unhandledFireWarningNum); + vo.setUnhandledFireReportNum(unhandledFireReportNum); + vo.setUnacceptedTaskNum(unacceptedTaskNum); + vo.setUnapprovedNum(unapprovedNum); + vo.setUnacceptedTaskNumByRegion(unacceptedTaskNumByRegion); + return vo; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/ApprovalRecordServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/ApprovalRecordServiceImpl.java new file mode 100644 index 0000000..b7271a3 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/ApprovalRecordServiceImpl.java @@ -0,0 +1,130 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.iot.forestfire.domain.ApprovalRecord; +import com.tcctyn.iot.forestfire.domain.LeaveRecord; +import com.tcctyn.iot.forestfire.mapper.ApprovalRecordMapper; +import com.tcctyn.iot.forestfire.mapper.LeaveRecordMapper; +import com.tcctyn.iot.forestfire.searcher.approvalrecord.ApprovalRecordRejectRequest; +import com.tcctyn.iot.forestfire.service.IApprovalRecordService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +/** + *

+ * 审批记录表 服务实现类 + *

+ * + * @author daichao + * @since 2024-12-09 + */ +@Service +public class ApprovalRecordServiceImpl extends ServiceImpl implements IApprovalRecordService { + + + @Resource + private ApprovalRecordMapper approvalRecordMapper; + + @Resource + private LeaveRecordMapper leaveRecordMapper; + + @Override + public Page list(Integer pageNo, Integer pageSize) { + return approvalRecordMapper.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<>()); + } + + @Override + public ApprovalRecord getById(Long id) { + ApprovalRecord approvalRecord = approvalRecordMapper.selectById(id); + return approvalRecord; + } + + @Override + public Integer create(ApprovalRecord approvalRecord) { + return approvalRecordMapper.insert(approvalRecord); + } + + @Override + public Integer delete(Long id) { + return approvalRecordMapper.deleteById(id); + } + + @Override + public Integer update(ApprovalRecord approvalRecord) { + return approvalRecordMapper.updateById(approvalRecord); + } + + @Override + public List selectList(ApprovalRecord approvalRecord) { + List approvalRecordList = approvalRecordMapper.selectList(new QueryWrapper().lambda() + .eq(StringUtils.isNotBlank(approvalRecord.getBusinessType()), ApprovalRecord::getBusinessType, approvalRecord.getBusinessType()) + .orderByAsc(ApprovalRecord::getApprovalFlag) + .orderByDesc(ApprovalRecord::getCreatedTime) + ); + return approvalRecordList; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public Integer approved(Long id, Long userId) { + ApprovalRecord approvalRecord = approvalRecordMapper.selectById(id); + ApprovalRecord updateDO = new ApprovalRecord(); + updateDO.setId(id); + updateDO.setApprovalFlag(1); + updateDO.setApprovalStatus(1); + updateDO.setReviewerId(userId); + updateDO.setReviewTime(new Date()); + Integer result = approvalRecordMapper.updateById(updateDO); + //审批通过后需要同步更新请假记录信息 ,需要判断业务类型,对不同的业务表数据做同步处理 + switch (approvalRecord.getBusinessType()) { + case "LEAVE": + LeaveRecord leaveRecord = new LeaveRecord(); + leaveRecord.setId(approvalRecord.getBusinessDataId()); + leaveRecord.setApprovalFlag(1); + leaveRecord.setApprovalStatus(1); + leaveRecord.setReviewerId(userId); + leaveRecord.setReviewTime(new Date()); + leaveRecordMapper.updateById(leaveRecord); + break; + default: + break; + } + return result; + } + + @Override + public Integer reject(ApprovalRecordRejectRequest request, Long userId) { + ApprovalRecord approvalRecord = approvalRecordMapper.selectById(request.getId()); + ApprovalRecord updateDO = new ApprovalRecord(); + updateDO.setId(request.getId()); + updateDO.setApprovalFlag(1); + updateDO.setApprovalStatus(0); + updateDO.setRejectionStatement(request.getRejectionStatement()); + updateDO.setReviewerId(userId); + updateDO.setReviewTime(new Date()); + Integer result = approvalRecordMapper.updateById(updateDO); + switch (approvalRecord.getBusinessType()) { + case "LEAVE": + LeaveRecord leaveRecord = new LeaveRecord(); + leaveRecord.setId(approvalRecord.getBusinessDataId()); + leaveRecord.setApprovalFlag(1); + leaveRecord.setApprovalStatus(0); + leaveRecord.setRejectionStatement(request.getRejectionStatement()); + leaveRecord.setReviewerId(userId); + leaveRecord.setReviewTime(new Date()); + leaveRecordMapper.updateById(leaveRecord); + break; + default: + break; + } + return result; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/CarouselImageConfigServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/CarouselImageConfigServiceImpl.java new file mode 100644 index 0000000..ce2d830 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/CarouselImageConfigServiceImpl.java @@ -0,0 +1,69 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.iot.forestfire.domain.CarouselImageConfig; +import com.tcctyn.iot.forestfire.mapper.CarouselImageConfigMapper; +import com.tcctyn.iot.forestfire.service.ICarouselImageConfigService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 轮播图配置表 服务实现类 + *

+ * + * @author daichao + * @since 2024-12-17 + */ +@Service +public class CarouselImageConfigServiceImpl extends ServiceImpl implements ICarouselImageConfigService { + + + @Resource + private CarouselImageConfigMapper carouselImageConfigMapper; + + @Override + public Page list(Integer pageNo, Integer pageSize) { + return carouselImageConfigMapper.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<>()); + } + + @Override + public CarouselImageConfig getById(Long id) { + CarouselImageConfig carouselImageConfig = carouselImageConfigMapper.selectById(id); + return carouselImageConfig; + } + + @Override + public Integer create(CarouselImageConfig carouselImageConfig) { + return carouselImageConfigMapper.insert(carouselImageConfig); + } + + @Override + public Integer delete(Long id) { + return carouselImageConfigMapper.deleteById(id); + } + + @Override + public Integer update(CarouselImageConfig carouselImageConfig) { + return carouselImageConfigMapper.updateById(carouselImageConfig); + } + + @Override + public List selectList(CarouselImageConfig carouselImageConfig) { + List carouselImageConfigList = carouselImageConfigMapper.selectList(new QueryWrapper().lambda() + .like(StringUtils.isNotBlank(carouselImageConfig.getImageTheme()), CarouselImageConfig::getImageTheme, carouselImageConfig.getImageTheme()) + .eq(Objects.nonNull(carouselImageConfig.getEnableFlag()), CarouselImageConfig::getEnableFlag, carouselImageConfig.getEnableFlag()) + .orderByAsc(CarouselImageConfig::getSortNo) + .orderByDesc(CarouselImageConfig::getEnableFlag) + .orderByDesc(CarouselImageConfig::getCreatedTime) + ); + return carouselImageConfigList; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/CheckInRecordServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/CheckInRecordServiceImpl.java new file mode 100644 index 0000000..b055d6d --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/CheckInRecordServiceImpl.java @@ -0,0 +1,142 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.exception.ServiceException; +import com.tcctyn.common.core.utils.DateUtils; +import com.tcctyn.iot.forestfire.domain.CheckInRecord; +import com.tcctyn.iot.forestfire.domain.PointInfo; +import com.tcctyn.iot.forestfire.domain.Schedules; +import com.tcctyn.iot.forestfire.enums.PointTypeEnum; +import com.tcctyn.iot.forestfire.mapper.CheckInRecordMapper; +import com.tcctyn.iot.forestfire.mapper.PointInfoMapper; +import com.tcctyn.iot.forestfire.mapper.SchedulesMapper; +import com.tcctyn.iot.forestfire.service.ICheckInRecordService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 打卡记录表 服务实现类 + *

+ * + * @author liuzh + * @since 2024-10-12 + */ +@Service +public class CheckInRecordServiceImpl extends ServiceImpl implements ICheckInRecordService { + + + @Resource + private CheckInRecordMapper checkInRecordMapper; + + @Resource + private SchedulesMapper schedulesMapper; + + @Resource + private PointInfoMapper pointInfoMapper; + + @Override + public List list(CheckInRecord checkInRecord) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.setEntity(checkInRecord); + return checkInRecordMapper.selectList(queryWrapper.lambda() + .eq(CheckInRecord::getEffectiveFlag, 1) + ); + } + + @Override + public CheckInRecord getById(Long id) { + CheckInRecord checkInRecord = checkInRecordMapper.selectById(id); + return checkInRecord; + } + + @Override + public Integer create(CheckInRecord checkInRecord, Long userId) { + String today = DateUtils.getDate(); + Schedules schedules = schedulesMapper.selectOne(new QueryWrapper().lambda() + .eq(Schedules::getUserId, userId) + .eq(Schedules::getDateOfWeek, today) + ); + if (Objects.isNull(schedules)) { + throw new ServiceException("没有查到排班信息!请核查"); + } + //在更新打卡前,需要查询是否该排班、该点位已经有有效打卡记录,如果有,则需要置为失效打卡记录;然后再插入新的打卡记录; + //一个班次,一个打卡点,一个人只能有一条有效打卡记录(可能存在多个人巡一条路径的情况) + CheckInRecord existCheckInRecord = checkInRecordMapper.selectOne(new QueryWrapper().lambda() + .eq(CheckInRecord::getScheduleId, schedules.getScheduleId()) + .eq(CheckInRecord::getPointId, checkInRecord.getPointId()) + .eq(CheckInRecord::getUserId, userId) + .eq(CheckInRecord::getEffectiveFlag, 1) + ); + if (Objects.nonNull(existCheckInRecord)) { + existCheckInRecord.setEffectiveFlag(0); + checkInRecordMapper.updateById(existCheckInRecord); + } else { + schedules.setCheckTimes(schedules.getCheckTimes() + 1); + } + //插入新的打卡记录 + checkInRecord.setScheduleId(schedules.getScheduleId()); + checkInRecord.setForestId(schedules.getForestId()); + checkInRecord.setFarmId(schedules.getFarmId()); + checkInRecord.setFenceId(schedules.getFenceId()); + checkInRecord.setPathId(schedules.getPathId()); + checkInRecord.setUserId(userId); + checkInRecord.setCheckInTime(new Date()); + + //插入新的打卡记录后,需要更新排班表中的打卡次数,应打卡次数、巡护进度 + List pointInfoList = pointInfoMapper.selectList(new QueryWrapper().lambda() + .eq(PointInfo::getPointType, PointTypeEnum.CHECK_IN_POINT.name()) + .eq(PointInfo::getBelongingRegionId, schedules.getPathId()) + ); + Integer totalTimes = pointInfoList.size(); + Schedules schedulesUpdate = new Schedules(); + schedulesUpdate.setScheduleId(schedules.getScheduleId()); + schedulesUpdate.setTotalTimes(totalTimes); + schedulesUpdate.setCheckTimes(schedules.getCheckTimes()); + String patrolRate = "0%"; + if (totalTimes > 0) { + patrolRate = String.format("%.2f", (schedulesUpdate.getCheckTimes() * 100.0 / schedulesUpdate.getTotalTimes())) + "%"; + } + schedulesUpdate.setPatrolRate(patrolRate); + schedulesMapper.updateById(schedulesUpdate); + return checkInRecordMapper.insert(checkInRecord); + } + + @Override + public Integer delete(Long id) { + return checkInRecordMapper.deleteById(id); + } + + @Override + public Integer update(CheckInRecord checkInRecord) { + return checkInRecordMapper.updateById(checkInRecord); + } + + @Override + public List getByUserId(Long userId, Date checkDate) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_id", userId); + queryWrapper.eq("effective_flag", 1); + //指定日期转换为字符串 + queryWrapper.apply("date_format(check_in_time,'%Y%m%d')=" + "'" + DateUtils.parseDateToStr("yyyyMMdd", checkDate) + "'"); + + return checkInRecordMapper.selectList(queryWrapper); + } + + @Override + public List selectLast10Items() { + List checkInRecordList = checkInRecordMapper.selectList(new QueryWrapper().lambda() + .eq(CheckInRecord::getEffectiveFlag, 1) + .orderByDesc(CheckInRecord::getCheckInTime) + .last("limit 10") + ); + return checkInRecordList; + } + + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/CommonServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/CommonServiceImpl.java new file mode 100644 index 0000000..7fa13e1 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/CommonServiceImpl.java @@ -0,0 +1,202 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tcctyn.common.core.web.domain.R; +import com.tcctyn.common.core.web.domain.entity.RegionInfo; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.BO.SysUserBO; +import com.tcctyn.iot.forestfire.domain.DeviceInfo; +import com.tcctyn.iot.forestfire.domain.PatrolPath; +import com.tcctyn.iot.forestfire.domain.PointInfo; +import com.tcctyn.iot.forestfire.enums.DeviceTypeEnum; +import com.tcctyn.iot.forestfire.enums.PointTypeEnum; +import com.tcctyn.iot.forestfire.mapper.DeviceInfoMapper; +import com.tcctyn.iot.forestfire.mapper.PatrolPathMapper; +import com.tcctyn.iot.forestfire.mapper.PointInfoMapper; +import com.tcctyn.iot.forestfire.mapper.RegionInfoMapper; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.system.api.RemoteUserService; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 通用接口实现类 + */ +@Service +public class CommonServiceImpl implements ICommonService { + + @Resource + private RegionInfoMapper regionInfoMapper; + + @Resource + private RemoteUserService remoteUserService; + + @Resource + private PatrolPathMapper patrolPathMapper; + + @Resource + private PointInfoMapper pointInfoMapper; + + @Resource + private DeviceInfoMapper deviceInfoMapper; + + + @Override + public Map regionMapIdToName(Long regionId) { + Map regionIdAndNameMap = new HashMap<>(); + if (Objects.nonNull(regionId)) { + RegionInfo regionInfo = regionInfoMapper.selectById(regionId); + if (Objects.nonNull(regionInfo)) { + regionIdAndNameMap.put(regionInfo.getId(), regionInfo.getAreaName()); + } + } else { + List regionInfoList = regionInfoMapper.selectList(new QueryWrapper<>()); + if (!CollectionUtils.isEmpty(regionInfoList)) { + for (RegionInfo regionInfo : regionInfoList) { + regionIdAndNameMap.put(regionInfo.getId(), regionInfo.getAreaName()); + } + } + } + return regionIdAndNameMap; + } + + @Override + public Map userMapIdToName(Long userId) { + Map userIdAndNameMap = new HashMap<>(); + if (Objects.nonNull(userId)) { + R data = remoteUserService.selectUserById(userId); + com.tcctyn.system.api.domain.SysUser sysUser = data.getData(); + if (Objects.nonNull(sysUser)) { + userIdAndNameMap.put(sysUser.getUserId(), sysUser.getNickName()); + } + } else { + + com.tcctyn.system.api.domain.SysUser sysUser = new com.tcctyn.system.api.domain.SysUser(); + sysUser.setDelFlag("0"); + R> listR = remoteUserService.selectUserList(sysUser); + List sysUserList = listR.getData(); + if (!CollectionUtils.isEmpty(sysUserList)) { + for (com.tcctyn.system.api.domain.SysUser user : sysUserList) { + user.setUserName(user.getNickName()); + } + } + } + return userIdAndNameMap; + } + + @Override + public Map pathMapIdToName(Long pathId) { + Map pathIdAndNameMap = new HashMap<>(); + if (Objects.nonNull(pathId)) { + PatrolPath patrolPath = patrolPathMapper.selectById(pathId); + if (Objects.nonNull(patrolPath)) { + pathIdAndNameMap.put(patrolPath.getId(), patrolPath.getPathName()); + } + } else { + List patrolPathList = patrolPathMapper.selectList(new QueryWrapper<>()); + if (!CollectionUtils.isEmpty(patrolPathList)) { + for (PatrolPath patrolPath : patrolPathList) { + pathIdAndNameMap.put(patrolPath.getId(), patrolPath.getPathName()); + } + } + } + return pathIdAndNameMap; + } + + @Override + public Map pointMapIdToName(Long pointId) { + + Map pointIdAndNameMap = new HashMap<>(); + if (Objects.nonNull(pointId)) { + PointInfo pointInfo = pointInfoMapper.selectById(pointId); + if (Objects.nonNull(pointInfo)) { + pointIdAndNameMap.put(pointInfo.getId(), pointInfo.getPointName()); + } + } else { + List pointInfoList = pointInfoMapper.selectList(new QueryWrapper().lambda() + .in(PointInfo::getPointType, Arrays.asList(PointTypeEnum.PTZ.name(), PointTypeEnum.BAYONET.name(), PointTypeEnum.WATER_SOURCE.name())) + ); + if (!CollectionUtils.isEmpty(pointInfoList)) { + for (PointInfo pointInfo : pointInfoList) { + pointIdAndNameMap.put(pointInfo.getId(), pointInfo.getPointName()); + } + } + } + return pointIdAndNameMap; + } + + @Override + public Map airportMapIdToName(Long airportId) { + Map airportIdAndNameMap = new HashMap<>(); + if (Objects.nonNull(airportId)) { + DeviceInfo deviceInfo = deviceInfoMapper.selectById(airportId); + if (Objects.nonNull(deviceInfo)) { + airportIdAndNameMap.put(deviceInfo.getId(), deviceInfo.getDeviceName()); + } + } else { + List deviceInfoList = deviceInfoMapper.selectList(new QueryWrapper().lambda() + .eq(DeviceInfo::getDeviceType, DeviceTypeEnum.AIRPORT.name()) + ); + if (!CollectionUtils.isEmpty(deviceInfoList)) { + for (DeviceInfo deviceInfo : deviceInfoList) { + airportIdAndNameMap.put(deviceInfo.getId(), deviceInfo.getDeviceName()); + } + } + } + return airportIdAndNameMap; + } + + @Override + public Map deptMapIdToName(Long deptId) { + Map deptMapIdToNameMap = new HashMap<>(); + if (Objects.nonNull(deptId)) { + R data = remoteUserService.selectDeptById(deptId); + com.tcctyn.system.api.domain.SysDept sysDept = data.getData(); + if (Objects.nonNull(sysDept)) { + deptMapIdToNameMap.put(sysDept.getDeptId(), sysDept.getDeptName()); + } + } else { + com.tcctyn.system.api.domain.SysDept sysDept1 = new com.tcctyn.system.api.domain.SysDept(); + sysDept1.setDelFlag("0"); + R> listR = remoteUserService.selectDeptList(sysDept1); + List sysDeptList = listR.getData(); + if(!CollectionUtils.isEmpty(sysDeptList)){ + for (com.tcctyn.system.api.domain.SysDept sysDept : sysDeptList) { + deptMapIdToNameMap.put(sysDept.getDeptId(), sysDept.getDeptName()); + } + } + } + return deptMapIdToNameMap; + } + + @Override + public Map userMapIdToBO(Long userId) { + Map userIdAndBOMap = new HashMap<>(); + if (Objects.nonNull(userId)) { + R data = remoteUserService.selectUserById(userId); + com.tcctyn.system.api.domain.SysUser sysUser = data.getData(); + if (Objects.nonNull(sysUser)) { + SysUserBO sysUserBO = new SysUserBO(); + BeanUtils.copyBeanProp(sysUser, sysUserBO); + userIdAndBOMap.put(sysUser.getUserId(), sysUserBO); + } + } else { + com.tcctyn.system.api.domain.SysUser sysUser1 = new com.tcctyn.system.api.domain.SysUser(); + sysUser1.setDelFlag("0"); + R> listR = remoteUserService.selectUserList(sysUser1); + List sysUserList = listR.getData(); + if (!CollectionUtils.isEmpty(sysUserList)) { + for (com.tcctyn.system.api.domain.SysUser sysUser : sysUserList) { + SysUserBO sysUserBO = new SysUserBO(); + BeanUtils.copyBeanProp(sysUser, sysUserBO); + userIdAndBOMap.put(sysUser.getUserId(), sysUserBO); + } + } + } + return userIdAndBOMap; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/DeviceChanelsServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/DeviceChanelsServiceImpl.java new file mode 100644 index 0000000..4b5d56b --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/DeviceChanelsServiceImpl.java @@ -0,0 +1,198 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.exception.ServiceException; +import com.tcctyn.common.core.utils.FFmpegExecutor; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.DeviceChanelsVO; +import com.tcctyn.iot.forestfire.domain.DeviceChanels; +import com.tcctyn.iot.forestfire.domain.DeviceConfig; +import com.tcctyn.iot.forestfire.mapper.DeviceChanelsMapper; +import com.tcctyn.iot.forestfire.mapper.DeviceConfigMapper; +import com.tcctyn.iot.forestfire.service.IDeviceChanelsService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.IOException; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +/** + *

+ * 设备通道表 服务实现类 + *

+ * + * @author 宋国强 + * @since 2025-04-09 + */ +@Service +public class DeviceChanelsServiceImpl extends ServiceImpl implements IDeviceChanelsService { + + @Resource + private DeviceChanelsMapper deviceChanelsMapper; + + @Autowired + private StringRedisTemplate redisTemplate; + + @Autowired + private DeviceConfigMapper deviceConfigMapper; + + @Autowired + private static final Logger logger = LoggerFactory.getLogger(DeviceChanelsServiceImpl.class); + + // 存储不同设备通道的 FFmpeg 执行器 + private final ConcurrentHashMap ffmpegExecutorMap = new ConcurrentHashMap<>(); + @Autowired + private DeviceConfigServicelmpl deviceConfigServicelmpl; + + @Override + public DeviceChanelsVO getById(Long id) { + DeviceChanels deviceChanels = deviceChanelsMapper.selectById(id); + if (deviceChanels == null) { + throw new ServiceException("设备通道不存在"); + } + DeviceChanelsVO deviceChanelsVO = new DeviceChanelsVO(); + BeanUtils.copyProperties(deviceChanels, deviceChanelsVO); + return deviceChanelsVO; + } + + @Override + public Integer create(DeviceChanels deviceChanels) { + int result = deviceChanelsMapper.insert(deviceChanels); + if (result <= 0) { + throw new ServiceException("创建设备通道失败"); + } + return result; + } + + @Override + public Integer delete(Long id) { + int result = deviceChanelsMapper.deleteById(id); + if (result <= 0) { + throw new ServiceException("删除设备通道失败"); + } + return result; + } + + @Override + public Integer update(DeviceChanels deviceChanels) { + int result = deviceChanelsMapper.updateById(deviceChanels); + if (result <= 0) { + throw new ServiceException("更新设备通道失败"); + } + return result; + } + + @Override + public List selectByDeviceNo(String deviceNo) { + List list = deviceChanelsMapper.selectByDeviceNo(deviceNo); + if (list == null){ + throw new ServiceException("设备通道不存在"); + } + return list; + } + + @Override + public DeviceChanelsVO getStreamUrl(String deviceNo, String chanelNo) { + DeviceChanelsVO vo= deviceChanelsMapper.getStreamUrl(deviceNo, chanelNo); + return vo; + } + + + @Override + public DeviceChanelsVO startPreview(String deviceNo, String chanelNo) { + logger.info("startPreview called with deviceNo: {}, chanelNo: {}", deviceNo, chanelNo); + //如果配置异常不存在抛出异常 + DeviceConfig test = deviceConfigServicelmpl.selectByDeviceNo(deviceNo); + if (test.getUsername() == null) { + throw new ServiceException("设备配置异常"); + } + if (test.getPassword() == null) { + throw new ServiceException("设备配置异常"); + } + if (test.getIp() == null) { + throw new ServiceException("设备配置异常"); + } + if (test.getPort() == null) { + throw new ServiceException("设备配置异常"); + } + + String redisKey = "preview:" + deviceNo + ":" + chanelNo; + + // 获取 RTMP 地址和 RTSP 流地址 + String rtmpUrl = "rtmp://47.109.202.121:8188/live/" + deviceNo + chanelNo; + DeviceConfig deviceConfig = deviceConfigServicelmpl.selectByDeviceNo(deviceNo); + String rtspUrl = String.format("rtsp://%s:%s@%s:%s/Streaming/Channels/%s", + deviceConfig.getUsername(), + deviceConfig.getPassword(), + deviceConfig.getIp(), + deviceConfig.getPort(), + chanelNo); +// String rtspUrl = "D:\\work\\test1.mp4"; + // 原子递增用户计数 + Long userCount = redisTemplate.opsForValue().increment(redisKey); + if (userCount == null) { + userCount = 1L; + redisTemplate.opsForValue().set(redisKey, userCount.toString()); + } + + // 查询设备通道信息 + DeviceChanelsVO deviceChanels = deviceChanelsMapper.getStreamUrl(deviceNo, chanelNo); + if (deviceChanels == null) { + logger.error("Device channel not found"); + throw new ServiceException("设备通道不存在"); + } + + // 返回对象 + DeviceChanelsVO vo = new DeviceChanelsVO(); + BeanUtils.copyProperties(deviceChanels, vo); + + // 首次使用时启动 FFmpeg + if (userCount <= 1) { + String executorKey = deviceNo + ":" + chanelNo; + FFmpegExecutor executor = new FFmpegExecutor(); + ffmpegExecutorMap.put(executorKey, executor); + + try { + logger.info("Starting FFmpeg for {}", executorKey); + executor.start("flv", rtmpUrl, rtspUrl); + } catch (IOException e) { + ffmpegExecutorMap.remove(executorKey); // 启动失败时清理 + redisTemplate.delete(redisKey); // 重置 Redis 计数 + throw new ServiceException("开启预览失败"); + } + } + + return vo; + } + + @Override + public String stopPreview(String deviceNo, String chanelNo) { + logger.info("stopPreview called with deviceNo: {}, chanelNo: {}", deviceNo, chanelNo); + String redisKey = "preview:" + deviceNo + ":" + chanelNo; + + // 原子递减用户计数 + Long userCount = redisTemplate.opsForValue().decrement(redisKey); + if (userCount == null || userCount < 0) { + userCount = 0L; + redisTemplate.opsForValue().set(redisKey, userCount.toString()); + } + + // 无用户使用时停止 FFmpeg + if (userCount == 0) { + String executorKey = deviceNo + ":" + chanelNo; + FFmpegExecutor executor = ffmpegExecutorMap.remove(executorKey); + if (executor != null) { + logger.info("Stopping FFmpeg for {}", executorKey); + executor.stop(); + } + redisTemplate.delete(redisKey); // 清理 Redis 键 + } + + return userCount == 0 ? "==ALL stop==" : "==stop=="; + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/DeviceConfigServicelmpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/DeviceConfigServicelmpl.java new file mode 100644 index 0000000..3e267fe --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/DeviceConfigServicelmpl.java @@ -0,0 +1,83 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.exception.ServiceException; +import com.tcctyn.iot.forestfire.domain.DeviceConfig; +import com.tcctyn.iot.forestfire.mapper.DeviceConfigMapper; +import com.tcctyn.iot.forestfire.service.IDeviceConfigService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +/** + *

+ * 设备配置表 服务实现类 + *

+ * + * @author 宋国强 + * @since 2025-04-14 + */ +@Service +public class DeviceConfigServicelmpl extends ServiceImpl implements IDeviceConfigService { + + @Resource + private DeviceConfigMapper deviceConfigMapper; + + @Autowired + private static final Logger logger = LoggerFactory.getLogger(DeviceChanelsServiceImpl.class); + @Override + public DeviceConfig getById(Long id) { + DeviceConfig deviceConfig = deviceConfigMapper.selectById(id); + if (deviceConfig == null) { + throw new ServiceException("设备配置不存在"); + } + return deviceConfig; + } + + @Override + public Integer create(DeviceConfig deviceConfig) { + //如果已经存在相同编号的设备,返回已经有此设备了 + DeviceConfig existingDeviceConfig = deviceConfigMapper.selectByDeviceNo(deviceConfig.getDeviceNo()); + if (existingDeviceConfig != null) { + throw new ServiceException("设备配置已存在"); + } + + int result = deviceConfigMapper.insert(deviceConfig); + if (result <= 0) { + throw new ServiceException("创建设备配置失败"); + } + return result; + } + + @Override + public Integer delete(Long id) { + int result = deviceConfigMapper.deleteById(id); + if (result <= 0) { + throw new ServiceException("删除设备配置失败"); + } + return result; + } + + @Override + public Integer update(DeviceConfig deviceConfig) { + int result = deviceConfigMapper.updateById(deviceConfig); + if (result <= 0) { + throw new ServiceException("更新设备配置失败"); + } + return result; + } + + @Override + public DeviceConfig selectByDeviceNo(String deviceNo) { + + DeviceConfig deviceConfig = deviceConfigMapper.selectByDeviceNo(deviceNo); + if (deviceConfig == null) { + //给前端提示没有对应的设备配置 + throw new ServiceException("设备配置不存在"); + } + return deviceConfig; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/DeviceInfoServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/DeviceInfoServiceImpl.java new file mode 100644 index 0000000..c66b8e7 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/DeviceInfoServiceImpl.java @@ -0,0 +1,528 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.exception.ServiceException; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.*; +import com.tcctyn.iot.forestfire.domain.DeviceChanels; +import com.tcctyn.iot.forestfire.domain.DeviceInfo; +import com.tcctyn.iot.forestfire.domain.PointInfo; +import com.tcctyn.iot.forestfire.enums.DeviceStatusEnum; +import com.tcctyn.iot.forestfire.enums.DeviceTypeEnum; +import com.tcctyn.iot.forestfire.enums.PointTypeEnum; +import com.tcctyn.iot.forestfire.mapper.DeviceInfoMapper; +import com.tcctyn.iot.forestfire.mapper.PointInfoMapper; +import com.tcctyn.iot.forestfire.searcher.BaseRegionSearcher; +import com.tcctyn.iot.forestfire.searcher.deviceinfo.DeviceOwnershipSearcher; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.iot.forestfire.service.IDeviceChanelsService; +import com.tcctyn.iot.forestfire.service.IDeviceInfoService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +import static com.tcctyn.common.core.utils.DateUtils.getNowDate; +import static com.tcctyn.common.core.utils.SecurityUtils.getUsername; + +/** + *

+ * 设备信息表 服务实现类 + *

+ * + * @author 代超 + * @since 2024-10-09 + */ +@Service +public class DeviceInfoServiceImpl extends ServiceImpl implements IDeviceInfoService { + + + @Resource + private DeviceInfoMapper deviceInfoMapper; + + @Resource + private PointInfoMapper pointInfoMapper; + + @Autowired + private ICommonService commonService; + + @Autowired + private IDeviceChanelsService deviceChanelsService; + + @Override + public Page list(Integer pageNo, Integer pageSize) { + return deviceInfoMapper.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<>()); + } + + @Override + public DeviceInfoVO getById(Long id) { + DeviceInfo deviceInfo = deviceInfoMapper.selectById(id); + //处理regionName、pointName、airportName + DeviceInfoVO deviceInfoVO = new DeviceInfoVO(); + BeanUtils.copyProperties(deviceInfo, deviceInfoVO); + Map regionIdToNameMap = commonService.regionMapIdToName(deviceInfoVO.getRegionId()); + deviceInfoVO.setRegionName(regionIdToNameMap.get(deviceInfoVO.getRegionId())); + if (Objects.nonNull(deviceInfoVO.getPointId())) { + deviceInfoVO.setPointName(commonService.pointMapIdToName(deviceInfoVO.getPointId()).get(deviceInfoVO.getPointId())); + } + //如果是无人机,需要返回机场名称 + if (Objects.nonNull(deviceInfoVO.getAirportId())) { + DeviceInfo airportInfo = deviceInfoMapper.selectOne(new QueryWrapper().lambda().eq(DeviceInfo::getId, deviceInfoVO.getAirportId())); + deviceInfoVO.setAirportName(airportInfo.getDeviceName()); + } + return deviceInfoVO; + } + + @Override + public Integer create(DeviceInfo deviceInfo) { + //校验设备编号的唯一性 + List deviceInfoList = deviceInfoMapper.selectList(new QueryWrapper().eq("device_no", deviceInfo.getDeviceNo())); + if (!CollectionUtils.isEmpty(deviceInfoList)) { + throw new ServiceException("设备编号已存在"); + } + //如果是云台或者卡口,自动添加通道信息 + if (DeviceTypeEnum.CLOUDTERRACE.name().equals(deviceInfo.getDeviceType()) || DeviceTypeEnum.BAYONET.name().equals(deviceInfo.getDeviceType())) { + // 自动创建关联通道 + int[] suffixes = {101, 102, 201, 202}; // 定义需要循环的通道后缀 + for (int suffix : suffixes) { + DeviceChanels deviceChannel = new DeviceChanels(); + deviceChannel.setDeviceNo(deviceInfo.getDeviceNo()); + deviceChannel.setName("自动增加通道"); + // 使用循环变量动态生成streamUrl + // 后续需更改 + deviceChannel.setStreamUrl("http://47.109.202.121:11080/live" + deviceInfo.getDeviceNo() + "/" + suffix + ".flv"); + deviceChannel.setCreatedBy(getUsername()); + deviceChannel.setCreatedTime(getNowDate()); + deviceChanelsService.create(deviceChannel); + } + } + + // 如果是机场,需要选择机场位置,带上经纬度信息 + if (DeviceTypeEnum.AIRPORT.name().equals(deviceInfo.getDeviceType())) { + if (Objects.isNull(deviceInfo.getRegionId())) { + throw new ServiceException("请选择机场所在林区/林场"); + } + if (Objects.isNull(deviceInfo.getAddress())) { + throw new ServiceException("请选择机场地址"); + } + if (Objects.isNull(deviceInfo.getLongitude())) { + throw new ServiceException("请输入机场经度"); + } + if (Objects.isNull(deviceInfo.getLatitude())) { + throw new ServiceException("请输入机场纬度"); + } + } + if (DeviceTypeEnum.DRONE.name().equals(deviceInfo.getDeviceType())) { + if (Objects.isNull(deviceInfo.getAirportId())) { + throw new ServiceException("请选择机场"); + } + //绑定机场信息,无人机默认挂在机场所在的区域 + DeviceInfo airportInfo = deviceInfoMapper.selectById(deviceInfo.getAirportId()); + if (Objects.nonNull(airportInfo)) { + deviceInfo.setRegionId(airportInfo.getRegionId()); + deviceInfo.setForestId(airportInfo.getForestId()); + deviceInfo.setFarmId(airportInfo.getFarmId()); + deviceInfo.setFenceId(airportInfo.getFenceId()); + } + } + // 添加设备的时候需要将 林区、林场、电子围栏的id 冗余到数据库表中,方便后续的查询 + PointInfo pointInfo = pointInfoMapper.selectById(deviceInfo.getPointId()); + if (Objects.nonNull(pointInfo)) { + deviceInfo.setForestId(pointInfo.getForestId()); + deviceInfo.setFarmId(pointInfo.getFarmId()); + deviceInfo.setFenceId(pointInfo.getFenceId()); + } + return deviceInfoMapper.insert(deviceInfo); + } + + @Override + public Integer delete(Long id) { + //TODO 如果删除的设备是机场,那么需要删除机场下面的所有无人机 + return deviceInfoMapper.deleteById(id); + } + + @Override + public Integer update(DeviceInfo deviceInfo) { + //校验设备编号的唯一性 + List deviceInfoList = deviceInfoMapper.selectList(new QueryWrapper() + .eq("device_no", deviceInfo.getDeviceNo()) + .ne("id", deviceInfo.getId()) + ); + if (!CollectionUtils.isEmpty(deviceInfoList)) { + throw new ServiceException("设备编号已存在"); + } + // 如果是机场,需要选择机场位置,带上经纬度信息 + if (DeviceTypeEnum.AIRPORT.name().equals(deviceInfo.getDeviceType())) { + if (Objects.isNull(deviceInfo.getRegionId())) { + throw new ServiceException("请选择机场所在林区/林场"); + } + if (Objects.isNull(deviceInfo.getAddress())) { + throw new ServiceException("请选择机场地址"); + } + if (Objects.isNull(deviceInfo.getLongitude())) { + throw new ServiceException("请输入机场经度"); + } + if (Objects.isNull(deviceInfo.getLatitude())) { + throw new ServiceException("请输入机场纬度"); + } + } + if (DeviceTypeEnum.DRONE.name().equals(deviceInfo.getDeviceType())) { + if (Objects.isNull(deviceInfo.getAirportId())) { + throw new ServiceException("请选择机场"); + } + //绑定机场信息,无人机默认挂在机场所在的区域 + DeviceInfo airportInfo = deviceInfoMapper.selectById(deviceInfo.getAirportId()); + if (Objects.nonNull(airportInfo)) { + deviceInfo.setRegionId(airportInfo.getRegionId()); + deviceInfo.setForestId(airportInfo.getForestId()); + deviceInfo.setFarmId(airportInfo.getFarmId()); + deviceInfo.setFenceId(airportInfo.getFenceId()); + } + } + + // 添加设备的时候需要将 林区、林场、电子围栏的id 冗余到数据库表中,方便后续的查询 + PointInfo pointInfo = pointInfoMapper.selectById(deviceInfo.getPointId()); + if (Objects.nonNull(pointInfo)) { + deviceInfo.setForestId(pointInfo.getForestId()); + deviceInfo.setFarmId(pointInfo.getFarmId()); + deviceInfo.setFenceId(pointInfo.getFenceId()); + } + return deviceInfoMapper.updateById(deviceInfo); + } + + @Override + public List selectList(DeviceInfo deviceInfo) { + // 设备分页查询这里可以根据林区、林场、电子围栏id进行过滤 + List deviceInfoList = deviceInfoMapper.selectList(new QueryWrapper() + .lambda() + .like(StringUtils.isNotBlank(deviceInfo.getDeviceNo()), DeviceInfo::getDeviceNo, deviceInfo.getDeviceNo()) + .eq(StringUtils.isNotBlank(deviceInfo.getDeviceType()), DeviceInfo::getDeviceType, deviceInfo.getDeviceType()) + .eq(StringUtils.isNotBlank(deviceInfo.getDeviceManufacturer()), DeviceInfo::getDeviceManufacturer, deviceInfo.getDeviceManufacturer()) + .eq(Objects.nonNull(deviceInfo.getPointId()), DeviceInfo::getPointId, deviceInfo.getPointId()) + .eq(Objects.nonNull(deviceInfo.getForestId()), DeviceInfo::getForestId, deviceInfo.getForestId()) + .eq(Objects.nonNull(deviceInfo.getFarmId()), DeviceInfo::getFarmId, deviceInfo.getFarmId()) + .eq(Objects.nonNull(deviceInfo.getFenceId()), DeviceInfo::getFenceId, deviceInfo.getFenceId()) + .eq(Objects.nonNull(deviceInfo.getEnableFlag()), DeviceInfo::getEnableFlag, deviceInfo.getEnableFlag()) + .eq(Objects.nonNull(deviceInfo.getDeviceStatus()), DeviceInfo::getDeviceStatus, deviceInfo.getDeviceStatus()) + .orderByDesc(DeviceInfo::getCreatedTime) + ); + return deviceInfoList; + } + + @Override + public DeviceAndPointInfoVO selectByDeviceNo(String deviceNo) { + DeviceAndPointInfoVO vo = deviceInfoMapper.selectByDeviceNo(deviceNo); + return vo; + } + + @Override + public DeviceStatisticsVO deviceStatistics(DeviceInfo deviceInfo) { + // 1、查询设备数量;2、查询云台、卡口数量 + List deviceInfoList = deviceInfoMapper.selectList(new QueryWrapper() + .lambda() + .eq(Objects.nonNull(deviceInfo.getForestId()), DeviceInfo::getForestId, deviceInfo.getForestId()) + .eq(Objects.nonNull(deviceInfo.getFarmId()), DeviceInfo::getFarmId, deviceInfo.getFarmId()) + .eq(Objects.nonNull(deviceInfo.getFenceId()), DeviceInfo::getFenceId, deviceInfo.getFenceId()) + ); + //查询云台与卡口数量 + List pointInfoList = pointInfoMapper.selectList(new QueryWrapper() + .lambda() + .eq(Objects.nonNull(deviceInfo.getForestId()), PointInfo::getForestId, deviceInfo.getForestId()) + .eq(Objects.nonNull(deviceInfo.getFarmId()), PointInfo::getFarmId, deviceInfo.getFarmId()) + .eq(Objects.nonNull(deviceInfo.getFenceId()), PointInfo::getFenceId, deviceInfo.getFenceId()) + .and(wrapper -> wrapper.eq(PointInfo::getPointType, PointTypeEnum.PTZ.name()) + .or().eq(PointInfo::getPointType, PointTypeEnum.BAYONET.name()) + )); + Map> pointMap = pointInfoList.stream().collect(Collectors.groupingBy(PointInfo::getPointType)); + List ptzIdList = new ArrayList<>(); + List bayonetIdList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(pointMap)) { + //获取云台数量 + List ptzPointList = pointMap.get(PointTypeEnum.PTZ.name()) == null ? new ArrayList<>() : pointMap.get(PointTypeEnum.PTZ.name()); + //获取卡口数量 + List bayonetPointList = pointMap.get(PointTypeEnum.BAYONET.name()) == null ? new ArrayList<>() : pointMap.get(PointTypeEnum.BAYONET.name()); + + ptzIdList = ptzPointList.stream().map(PointInfo::getId).collect(Collectors.toList()); + bayonetIdList = bayonetPointList.stream().map(PointInfo::getId).collect(Collectors.toList()); + } + //云台设备数量 + Integer ptzOnlineNum = 0; + Integer ptzOfflineNum = 0; + Integer ptzTotalNum = 0; + + //卡口设备数量 + Integer bayonetOnlineNum = 0; + Integer bayonetOfflineNum = 0; + Integer bayonetTotalNum = 0; + + //无人机数量 + Integer droneTotalNum = 0; + Integer droneOnlineNum = 0; + Integer droneOfflineNum = 0; + + //其他设备数量 + Integer otherOnlineNum = 0; + Integer otherOfflineNum = 0; + Integer otherTotalNum = 0; + + for (DeviceInfo device : deviceInfoList) { + if (ptzIdList.contains(device.getPointId())) { + //云台设备 + if (DeviceStatusEnum.ON.name().equals(device.getDeviceStatus())) { + ptzOnlineNum++; + } else { + ptzOfflineNum++; + } + } else if (bayonetIdList.contains(device.getPointId())) { + //卡口设备 + if (DeviceStatusEnum.ON.name().equals(device.getDeviceStatus())) { + bayonetOnlineNum++; + } else { + bayonetOfflineNum++; + } + } else if (DeviceTypeEnum.DRONE.name().equals(device.getDeviceType())) { + // 无人机设备 + droneTotalNum++; + if (DeviceStatusEnum.ON.name().equals(device.getDeviceStatus())) { + droneOnlineNum++; + } else { + droneOfflineNum++; + } + + } else { + //其他设备 + if (DeviceStatusEnum.ON.name().equals(device.getDeviceStatus())) { + otherOnlineNum++; + } else { + otherOfflineNum++; + } + } + } + //无人机在线率 + String droneOnlineRate = droneTotalNum == 0 ? "0%" : String.format("%.2f%%", droneOnlineNum * 1.0 / droneTotalNum * 100); + + ptzTotalNum = ptzOnlineNum + ptzOfflineNum; + bayonetTotalNum = bayonetOnlineNum + bayonetOfflineNum; + otherTotalNum = otherOnlineNum + otherOfflineNum; + + DeviceStatisticsVO vo = new DeviceStatisticsVO(); + List subList = new ArrayList<>(); + //无人机数据 + DeviceStatisticsSubVO droneVO = new DeviceStatisticsSubVO(); + droneVO.setType("drone"); + droneVO.setOnlineNum(droneOnlineNum); + droneVO.setOfflineNum(droneOfflineNum); + droneVO.setTotalNum(droneTotalNum); + droneVO.setOnlineRate(droneOnlineRate); + subList.add(droneVO); + //云台数据 + DeviceStatisticsSubVO ptzVO = new DeviceStatisticsSubVO(); + ptzVO.setType("ptz"); + ptzVO.setOnlineNum(ptzOnlineNum); + ptzVO.setOfflineNum(ptzOfflineNum); + ptzVO.setTotalNum(ptzTotalNum); + ptzVO.setOnlineRate(String.format("%.2f%%", ptzTotalNum == 0 ? 0 : ptzVO.getOnlineNum() * 1.0 / ptzTotalNum * 100)); + subList.add(ptzVO); + //卡口数据 + DeviceStatisticsSubVO bayonetVO = new DeviceStatisticsSubVO(); + bayonetVO.setType("bayonet"); + bayonetVO.setOnlineNum(bayonetOnlineNum); + bayonetVO.setOfflineNum(bayonetOfflineNum); + bayonetVO.setTotalNum(bayonetTotalNum); + bayonetVO.setOnlineRate(String.format("%.2f%%", bayonetTotalNum == 0 ? 0 : bayonetVO.getOnlineNum() * 1.0 / bayonetTotalNum * 100)); + subList.add(bayonetVO); + //其他设备数据 + DeviceStatisticsSubVO otherVO = new DeviceStatisticsSubVO(); + otherVO.setType("other"); + otherVO.setOnlineNum(otherOnlineNum); + otherVO.setOfflineNum(otherOfflineNum); + otherVO.setTotalNum(otherTotalNum); + otherVO.setOnlineRate(String.format("%.2f%%", otherTotalNum == 0 ? 0 : otherVO.getOnlineNum() * 1.0 / otherTotalNum * 100)); + subList.add(otherVO); + + vo.setSubList(subList); + vo.setTotal(droneTotalNum + ptzTotalNum + bayonetTotalNum + otherTotalNum); + vo.setOverallOnlineRate(String.format("%.2f%%", vo.getTotal() == 0 ? 0 : (droneOnlineNum + ptzOnlineNum + bayonetOnlineNum + otherOnlineNum) * 1.0 / vo.getTotal() * 100)); + return vo; + } + + @Override + public Integer updateEnableFlag(DeviceInfo deviceInfo) { + Integer result = deviceInfoMapper.updateById(deviceInfo); + return result; + } + + @Override + public Integer deleteBatch(List idList) { + //TODO 如果删除的设备是机场,那么需要删除机场下面的所有无人机 + return deviceInfoMapper.deleteBatchIds(idList); + } + + @Override + public List queryOwnership(DeviceOwnershipSearcher searcher) { + String deviceType = searcher.getDeviceType(); + //无人机对应机场 + if (DeviceTypeEnum.DRONE.name().equals(deviceType)) { + List airportList = deviceInfoMapper.selectList(new QueryWrapper().lambda() + .eq(DeviceInfo::getDeviceType, DeviceTypeEnum.AIRPORT.name()) + .eq(Objects.nonNull(searcher.getForestId()), DeviceInfo::getForestId, searcher.getForestId()) + .eq(Objects.nonNull(searcher.getFarmId()), DeviceInfo::getFarmId, searcher.getFarmId()) + .eq(Objects.nonNull(searcher.getFenceId()), DeviceInfo::getFenceId, searcher.getFenceId()) + ); + return airportList.stream().map(airport -> new DeviceOwnerVO(airport.getId(), airport.getDeviceName())).collect(Collectors.toList()); + } + + //水泵对应水源地 + if (DeviceTypeEnum.PUMP.name().equals(deviceType)) { + List waterSourceList = pointInfoMapper.selectList(new QueryWrapper().lambda() + .eq(PointInfo::getPointType, PointTypeEnum.WATER_SOURCE.name()) + .eq(Objects.nonNull(searcher.getForestId()), PointInfo::getForestId, searcher.getForestId()) + .eq(Objects.nonNull(searcher.getFarmId()), PointInfo::getFarmId, searcher.getFarmId()) + .eq(Objects.nonNull(searcher.getFenceId()), PointInfo::getFenceId, searcher.getFenceId()) + ); + return waterSourceList.stream().map(waterSource -> new DeviceOwnerVO(waterSource.getId(), waterSource.getPointName())).collect(Collectors.toList()); + } + + //摄像头、红外设备、气象监测仪对应云台、卡口 + if (DeviceTypeEnum.CAMERA.name().equals(deviceType) || DeviceTypeEnum.INFRARED.name().equals(deviceType) || DeviceTypeEnum.METEOROLOGIC.name().equals(deviceType)) { + List ptzAndBayonetList = pointInfoMapper.selectList(new QueryWrapper().lambda() + .in(PointInfo::getPointType, Arrays.asList(PointTypeEnum.BAYONET.name(), PointTypeEnum.PTZ.name())) + .eq(Objects.nonNull(searcher.getForestId()), PointInfo::getForestId, searcher.getForestId()) + .eq(Objects.nonNull(searcher.getFarmId()), PointInfo::getFarmId, searcher.getFarmId()) + .eq(Objects.nonNull(searcher.getFenceId()), PointInfo::getFenceId, searcher.getFenceId()) + .orderByAsc(PointInfo::getPointType) + ); + return ptzAndBayonetList.stream().map(ptzAndBayonet -> new DeviceOwnerVO(ptzAndBayonet.getId(), ptzAndBayonet.getPointName())).collect(Collectors.toList()); + } + return Collections.emptyList(); + } + + @Override + public DeviceStatisticsByStatusVO statisticsByStatus() { + DeviceStatisticsByStatusVO vo = deviceInfoMapper.statisticsByStatus(); + return vo; + } + + @Override + public DeviceStatisticsByPointVO deviceStatisticsByPoint(BaseRegionSearcher searcher) { + //实现思路,先查询出林区、林场、电子围栏下的云台、卡口数量;分成云台、卡口;再分别查询云台、卡口下的设备数量, + List pointInfoList = pointInfoMapper.selectList(new QueryWrapper().lambda() + .in(PointInfo::getPointType, Arrays.asList(PointTypeEnum.BAYONET.name(), PointTypeEnum.PTZ.name())) + .eq(Objects.nonNull(searcher.getForestId()), PointInfo::getForestId, searcher.getForestId()) + .eq(Objects.nonNull(searcher.getFarmId()), PointInfo::getFarmId, searcher.getFarmId()) + .eq(Objects.nonNull(searcher.getFenceId()), PointInfo::getFenceId, searcher.getFenceId()) + ); + Integer totalNum = 0; + Integer onlineNum = 0; + Integer ptzNum = 0; + Integer bayonetNum = 0; + String onlineRate = "0.00%"; + if (!CollectionUtils.isEmpty(pointInfoList)) { + List pointIdList = pointInfoList.stream().map(PointInfo::getId).collect(Collectors.toList()); + Map pointIdAndTypeMap = pointInfoList.stream().collect(Collectors.toMap(PointInfo::getId, PointInfo::getPointType)); + //查询云台、卡口下的设备数量 + List deviceInfoList = deviceInfoMapper.selectList(new QueryWrapper().lambda() + .in(DeviceInfo::getPointId, pointIdList) + .eq(DeviceInfo::getEnableFlag, 1) + ); + if (!CollectionUtils.isEmpty(deviceInfoList)) { + for (DeviceInfo deviceInfo : deviceInfoList) { + if (DeviceStatusEnum.ON.name().equals(deviceInfo.getDeviceStatus())) { + onlineNum++; + } + if (PointTypeEnum.BAYONET.name().equals(pointIdAndTypeMap.get(deviceInfo.getPointId()))) { + bayonetNum++; + } + if (PointTypeEnum.PTZ.name().equals(pointIdAndTypeMap.get(deviceInfo.getPointId()))) { + ptzNum++; + } + } + } + } + totalNum = ptzNum + bayonetNum; + onlineRate = String.format("%.2f%s", onlineNum == 0 ? 0 : onlineNum * 1.0 / totalNum * 100, "%"); + + DeviceStatisticsByPointVO deviceStatisticsByPointVO = new DeviceStatisticsByPointVO(); + deviceStatisticsByPointVO.setTotalNum(totalNum); + deviceStatisticsByPointVO.setOnlineNum(onlineNum); + deviceStatisticsByPointVO.setOnlineRate(onlineRate); + deviceStatisticsByPointVO.setBayonetNum(bayonetNum); + deviceStatisticsByPointVO.setPtzNum(ptzNum); + return deviceStatisticsByPointVO; + } + + @Override + public List selectAirport(BaseRegionSearcher searcher) { + List deviceInfoList = deviceInfoMapper.selectList(new QueryWrapper().lambda() + .eq(Objects.nonNull(searcher.getForestId()), DeviceInfo::getForestId, searcher.getForestId()) + .eq(Objects.nonNull(searcher.getFarmId()), DeviceInfo::getFarmId, searcher.getFarmId()) + .eq(Objects.nonNull(searcher.getFenceId()), DeviceInfo::getFenceId, searcher.getFenceId()) + .eq(DeviceInfo::getDeviceType, DeviceTypeEnum.AIRPORT.name()) + ); + List airportVOList = BeanUtils.copyList(deviceInfoList, AirportVO.class); + Map regionIdAndNameMap = commonService.regionMapIdToName(null); + Map airportIdAndNameMap = airportVOList.stream().collect(Collectors.toMap(AirportVO::getId, AirportVO::getDeviceName)); + if (!CollectionUtils.isEmpty(airportVOList)) { + List airportIdList = airportVOList.stream().map(AirportVO::getId).collect(Collectors.toList()); + // 将机场下的无人机列表挂出来 + List droneList = deviceInfoMapper.selectList(new QueryWrapper().lambda() + .eq(DeviceInfo::getDeviceType, DeviceTypeEnum.DRONE.name()) + .in(DeviceInfo::getAirportId, airportIdList) + ); + List droneVOList = BeanUtils.copyList(droneList, DroneVO.class); + droneVOList.forEach(droneVO -> { + droneVO.setAirportName(airportIdAndNameMap.get(droneVO.getAirportId()) == null ? "" : airportIdAndNameMap.get(droneVO.getAirportId())); + droneVO.setRegionName(regionIdAndNameMap.get(droneVO.getRegionId()) == null ? "" : regionIdAndNameMap.get(droneVO.getRegionId())); + }); + Map> airportAndDroneMap = droneVOList.stream().collect(Collectors.groupingBy(DroneVO::getAirportId)); + + airportVOList.forEach(airportVO -> { + airportVO.setRegionName(regionIdAndNameMap.get(airportVO.getRegionId()) == null ? "" : regionIdAndNameMap.get(airportVO.getRegionId())); + airportVO.setDroneList(airportAndDroneMap.get(airportVO.getId()) == null ? new ArrayList<>() : airportAndDroneMap.get(airportVO.getId())); + }); + } + + + return airportVOList; + } + + @Override + public List selectDroneByAirportId(Long airportId) { + List deviceInfoList = deviceInfoMapper.selectList(new QueryWrapper().lambda() + .eq(DeviceInfo::getAirportId, airportId) + .eq(DeviceInfo::getDeviceType, DeviceTypeEnum.DRONE.name()) + ); + return deviceInfoList; + } + + @Override + public List selectListByPointList(List pointIdList) { + List deviceInfoList = deviceInfoMapper.selectList(new QueryWrapper().lambda() + .in(DeviceInfo::getPointId, pointIdList) + ); + return deviceInfoList; + } + + @Override + public List selectCamera(BaseRegionSearcher searcher) { + List deviceInfoList = deviceInfoMapper.selectList(new QueryWrapper().lambda() + .eq(Objects.nonNull(searcher.getForestId()), DeviceInfo::getForestId, searcher.getForestId()) + .eq(Objects.nonNull(searcher.getFarmId()), DeviceInfo::getFarmId, searcher.getFarmId()) + .eq(Objects.nonNull(searcher.getFenceId()), DeviceInfo::getFenceId, searcher.getFenceId()) + .eq(DeviceInfo::getDeviceType, DeviceTypeEnum.CAMERA.name()) + .eq(DeviceInfo::getEnableFlag, 1) + .orderByDesc(DeviceInfo::getCreatedTime) + ); + List cameraVOList = BeanUtils.copyList(deviceInfoList, CameraVO.class); + Map regionIdAndNameMap = commonService.regionMapIdToName(null); + cameraVOList.forEach(cameraVO -> cameraVO.setRegionName(Optional.ofNullable(regionIdAndNameMap.get(cameraVO.getRegionId())).orElse(""))); + return cameraVOList; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/DroneTaskPlanServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/DroneTaskPlanServiceImpl.java new file mode 100644 index 0000000..2d0bd61 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/DroneTaskPlanServiceImpl.java @@ -0,0 +1,72 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.iot.forestfire.domain.DroneTaskPlan; +import com.tcctyn.iot.forestfire.mapper.DroneTaskPlanMapper; +import com.tcctyn.iot.forestfire.searcher.drone.DroneSearcher; +import com.tcctyn.iot.forestfire.service.IDroneTaskPlanService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + *

+ * 无人机任务计划表 服务实现类 + *

+ * + * @author 代超 + * @since 2024-11-07 + */ +@Service +public class DroneTaskPlanServiceImpl extends ServiceImpl implements IDroneTaskPlanService { + + + @Resource + private DroneTaskPlanMapper droneTaskPlanMapper; + + @Override + public Page list(Integer pageNo, Integer pageSize) { + return droneTaskPlanMapper.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<>()); + } + + @Override + public DroneTaskPlan getById(Long id) { + DroneTaskPlan droneTaskPlan = droneTaskPlanMapper.selectById(id); + return droneTaskPlan; + } + + @Override + public Integer create(DroneTaskPlan droneTaskPlan) { + return droneTaskPlanMapper.insert(droneTaskPlan); + } + + @Override + public Integer delete(Long id) { + return droneTaskPlanMapper.deleteById(id); + } + + @Override + public Integer update(DroneTaskPlan droneTaskPlan) { + return droneTaskPlanMapper.updateById(droneTaskPlan); + } + + @Override + public List selectByStatus(DroneSearcher searcher) { + List droneTaskPlanList = droneTaskPlanMapper.selectList(new QueryWrapper().lambda() + .eq(DroneTaskPlan::getTaskStatus, searcher.getTaskStatus()) + .between(searcher.getStartTime() != null && searcher.getEndTime() != null, DroneTaskPlan::getEndTime, searcher.getStartTime(), searcher.getEndTime()) + ); + return droneTaskPlanList; + } + + @Override + public List seletList(DroneTaskPlan droneTaskPlan) { + return droneTaskPlanMapper.selectList(new QueryWrapper().lambda() + .eq(DroneTaskPlan::getTaskStatus, droneTaskPlan.getTaskStatus()) + ); + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/FireReportServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/FireReportServiceImpl.java new file mode 100644 index 0000000..283abb8 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/FireReportServiceImpl.java @@ -0,0 +1,157 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.constant.RegionConstants; +import com.tcctyn.common.core.web.domain.entity.RegionInfo; +import com.tcctyn.common.core.exception.ServiceException; +import com.tcctyn.common.core.utils.StringUtils; +import com.tcctyn.iot.forestfire.VO.FireReportStatisticsVO; +import com.tcctyn.iot.forestfire.domain.FireReport; +import com.tcctyn.iot.forestfire.domain.FireWarningInfo; +import com.tcctyn.iot.forestfire.enums.FireWarningDisposalStatusEnum; +import com.tcctyn.iot.forestfire.enums.ReportMethodEnum; +import com.tcctyn.iot.forestfire.mapper.FireReportMapper; +import com.tcctyn.iot.forestfire.mapper.FireWarningInfoMapper; +import com.tcctyn.iot.forestfire.mapper.RegionInfoMapper; +import com.tcctyn.iot.forestfire.service.IFireReportService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 火情上报表 服务实现类 + *

+ * + * @author 代超 + * @since 2024-11-01 + */ +@Service +public class FireReportServiceImpl extends ServiceImpl implements IFireReportService { + + + @Resource + private FireReportMapper fireReportMapper; + + @Resource + private RegionInfoMapper regionInfoMapper; + + @Resource + private FireWarningInfoMapper fireWarningInfoMapper; + + @Override + public Page list(Integer pageNo, Integer pageSize) { + return fireReportMapper.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<>()); + } + + @Override + public FireReport getById(Long id) { + FireReport fireReport = fireReportMapper.selectById(id); + return fireReport; + } + + @Override + public Integer create(FireReport fireReport) { + //后台上报的,默认设置为人工上报 + fireReport.setReportMethod(ReportMethodEnum.MANUAL_REPORTING.name()); + Long regionId = fireReport.getRegionId(); + if (Objects.nonNull(regionId)) { + RegionInfo regionInfo = regionInfoMapper.selectById(regionId); + String ancestors = regionInfo.getAncestors(); + String[] ancestorsArr = ancestors.split(RegionConstants.DIVISION_COMMA); + switch (ancestorsArr.length) { + case 1: + fireReport.setForestId(regionId); + break; + case 2: + fireReport.setForestId(Long.valueOf(ancestorsArr[1])); + fireReport.setFarmId(regionId); + break; + case 3: + fireReport.setForestId(Long.valueOf(ancestorsArr[1])); + fireReport.setFarmId(Long.valueOf(ancestorsArr[2])); + fireReport.setFenceId(regionId); + break; + case 4: + fireReport.setForestId(Long.valueOf(ancestorsArr[1])); + fireReport.setFarmId(Long.valueOf(ancestorsArr[2])); + fireReport.setFenceId(Long.valueOf(ancestorsArr[3])); + break; + } + } + //如果火情预警id不为空,需要将该火情预警的处置状态调整为已上报 + if (Objects.nonNull(fireReport.getFireWarningId())) { + FireWarningInfo fireWarningInfo = new FireWarningInfo(); + fireWarningInfo.setId(fireReport.getFireWarningId()); + fireWarningInfo.setDisposalStatus(FireWarningDisposalStatusEnum.REPORTED.name()); + fireWarningInfo.setDisposalTime(new Date()); + fireWarningInfo.setDisposalBy(fireReport.getReporterId()); + fireWarningInfoMapper.updateById(fireWarningInfo); + } + return fireReportMapper.insert(fireReport); + } + + @Override + public Integer delete(Long id) { + return fireReportMapper.deleteById(id); + } + + @Override + public Integer update(FireReport fireReport) { + return fireReportMapper.updateById(fireReport); + } + + @Override + public List selectList(FireReport fireReport) { + return fireReportMapper.selectList(new QueryWrapper().lambda() + .like(StringUtils.isNotEmpty(fireReport.getFireTitle()), FireReport::getFireTitle, fireReport.getFireTitle()) + .eq(Objects.nonNull(fireReport.getRegionId()), FireReport::getRegionId, fireReport.getRegionId()) + .eq(StringUtils.isNotEmpty(fireReport.getFireHazardLevel()), FireReport::getFireHazardLevel, fireReport.getFireHazardLevel()) + .eq(Objects.nonNull(fireReport.getDisposalStatus()), FireReport::getDisposalStatus, fireReport.getDisposalStatus()) + .eq(StringUtils.isNotEmpty(fireReport.getReportMethod()), FireReport::getReportMethod, fireReport.getReportMethod()) + .eq(Objects.nonNull(fireReport.getArchiveStatus()), FireReport::getArchiveStatus, fireReport.getArchiveStatus()) + .orderByDesc(FireReport::getCreatedTime) + ); + } + + @Override + public Integer archive(FireReport fireReport) { + if (StringUtils.isEmpty(fireReport.getFirefightingSituation())) { + throw new ServiceException("请填写扑救情况"); + } + if (StringUtils.isEmpty(fireReport.getDisasterSituation())) { + throw new ServiceException("请填写灾后情况说明"); + } + if (StringUtils.isEmpty(fireReport.getFirefightingUnit())) { + throw new ServiceException("请填写扑救单位"); + } + if (StringUtils.isEmpty(fireReport.getPersonInCharge())) { + throw new ServiceException("请填写主要负责人"); + } + //火情上报归档 + fireReport.setArchiveStatus(1); + fireReport.setArchiveTime(new Date()); + return fireReportMapper.updateById(fireReport); + } + + @Override + public FireReportStatisticsVO fireReportStatistics() { + FireReportStatisticsVO vo = fireReportMapper.fireReportStatistics(); + return vo; + } + + @Override + public Integer disposal(FireReport fireReport) { + if (StringUtils.isEmpty(fireReport.getDisposalInstruction())) { + throw new ServiceException("请填写处置说明"); + } + fireReport.setDisposalStatus(1); + return fireReportMapper.updateById(fireReport); + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/FireWarningInfoServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/FireWarningInfoServiceImpl.java new file mode 100644 index 0000000..77c748d --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/FireWarningInfoServiceImpl.java @@ -0,0 +1,402 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.constant.RegionConstants; +import com.tcctyn.common.core.web.domain.entity.RegionInfo; +import com.tcctyn.common.core.exception.ServiceException; +import com.tcctyn.common.core.utils.DateUtils; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.common.core.utils.DistanceCalculationUtil; +import com.tcctyn.common.core.utils.mqtt.MqttPushClient; +import com.tcctyn.iot.forestfire.BO.FireWarningMQTTBO; +import com.tcctyn.iot.forestfire.BO.FireWarningMisjudgeBO; +import com.tcctyn.iot.forestfire.VO.*; +import com.tcctyn.iot.forestfire.domain.FireWarningInfo; +import com.tcctyn.iot.forestfire.domain.PointInfo; +import com.tcctyn.iot.forestfire.domain.Warehouse; +import com.tcctyn.iot.forestfire.enums.DataSourceEnum; +import com.tcctyn.iot.forestfire.enums.FireWarningDisposalStatusEnum; +import com.tcctyn.iot.forestfire.enums.PointTypeEnum; +import com.tcctyn.iot.forestfire.mapper.FireWarningInfoMapper; +import com.tcctyn.iot.forestfire.mapper.PointInfoMapper; +import com.tcctyn.iot.forestfire.mapper.RegionInfoMapper; +import com.tcctyn.iot.forestfire.mapper.WarehouseMapper; +import com.tcctyn.iot.forestfire.searcher.BaseIdListSearcher; +import com.tcctyn.iot.forestfire.searcher.BaseTimeSearcher; +import com.tcctyn.iot.forestfire.searcher.firewarning.FireWarningAnalyzeSearcher; +import com.tcctyn.iot.forestfire.searcher.firewarning.FireWarningConditionSearcher; +import com.tcctyn.iot.forestfire.searcher.schedules.SchedulesSearcher; +import com.tcctyn.iot.forestfire.service.IFireWarningInfoService; +import com.tcctyn.iot.forestfire.service.ISchedulesService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.*; + +/** + *

+ * 火情预警信息表 服务实现类 + *

+ * + * @author 代超 + * @since 2024-10-08 + */ +@Service +public class FireWarningInfoServiceImpl extends ServiceImpl implements IFireWarningInfoService { + + + @Resource + private FireWarningInfoMapper fireWarningInfoMapper; + + @Autowired + private CommonServiceImpl commonService; + + @Resource + private RegionInfoMapper regionInfoMapper; + + @Autowired + private MqttPushClient mqttPushClient; + + @Autowired + private PointInfoMapper pointInfoMapper; + + @Autowired + private ISchedulesService iSchedulesService; + + @Autowired + private WarehouseMapper warehouseMapper; + + @Override + public Page list(Integer pageNo, Integer pageSize) { + return fireWarningInfoMapper.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<>()); + } + + @Override + public FireWarningInfo getById(Long id) { + FireWarningInfo fireWarningInfo = fireWarningInfoMapper.selectById(id); + return fireWarningInfo; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public Integer create(FireWarningInfo fireWarningInfo) { + //管理后台新增的、后面APP端上报的,数据来源默认为巡护上报 + fireWarningInfo.setDataSource(DataSourceEnum.PATROL_REPORT.name()); + Long regionId = fireWarningInfo.getRegionId(); + if (Objects.nonNull(regionId)) { + RegionInfo regionInfo = regionInfoMapper.selectById(regionId); + String ancestors = regionInfo.getAncestors(); + String[] ancestorsArr = ancestors.split(RegionConstants.DIVISION_COMMA); + switch (ancestorsArr.length) { + case 1: + fireWarningInfo.setForestId(regionId); + break; + case 2: + fireWarningInfo.setForestId(Long.valueOf(ancestorsArr[1])); + fireWarningInfo.setFarmId(regionId); + break; + case 3: + fireWarningInfo.setForestId(Long.valueOf(ancestorsArr[1])); + fireWarningInfo.setFarmId(Long.valueOf(ancestorsArr[2])); + fireWarningInfo.setFenceId(regionId); + break; + case 4: + fireWarningInfo.setForestId(Long.valueOf(ancestorsArr[1])); + fireWarningInfo.setFarmId(Long.valueOf(ancestorsArr[2])); + fireWarningInfo.setFenceId(Long.valueOf(ancestorsArr[3])); + break; + } + } + Integer result = fireWarningInfoMapper.insert(fireWarningInfo); + //新增火情预警后,需要推送消息 + mqttPushClient.publish(1, true, "fireWarning", fireWarningInfo.getFireTitle()); + + return result; + } + + @Override + public Integer delete(Long id) { + return fireWarningInfoMapper.deleteById(id); + } + + @Override + public Integer update(FireWarningInfo fireWarningInfo) { + return fireWarningInfoMapper.updateById(fireWarningInfo); + } + + @Override + public List selectList(FireWarningInfo fireWarningInfo) { + return fireWarningInfoMapper.selectList(new QueryWrapper().lambda() + .like(StringUtils.isNotBlank(fireWarningInfo.getFireTitle()), FireWarningInfo::getFireTitle, fireWarningInfo.getFireTitle()) + .eq(StringUtils.isNotBlank(fireWarningInfo.getFireLevel()), FireWarningInfo::getFireLevel, fireWarningInfo.getFireLevel()) + .eq(StringUtils.isNotBlank(fireWarningInfo.getDisposalStatus()), FireWarningInfo::getDisposalStatus, fireWarningInfo.getDisposalStatus()) + .eq(Objects.nonNull(fireWarningInfo.getRegionId()), FireWarningInfo::getRegionId, fireWarningInfo.getRegionId()) + .orderByDesc(FireWarningInfo::getCreatedTime) + ); + } + + @Override + public FireWarningCountByStatusVO countByDisposalStatus(FireWarningConditionSearcher searcher) { + FireWarningCountByStatusVO vo = fireWarningInfoMapper.countByDisposalStatus(searcher); + return vo; + } + + @Override + public List selectByCondition(FireWarningConditionSearcher searcher) { + List fireWarningInfoList = fireWarningInfoMapper.selectList(new QueryWrapper() + .eq(StringUtils.isNotBlank(searcher.getDisposalStatus()), "disposal_status", searcher.getDisposalStatus()) + .eq(StringUtils.isNotBlank(searcher.getFireLevel()), "fire_level", searcher.getFireLevel()) + .eq(Objects.nonNull(searcher.getForestId()), "forest_id", searcher.getForestId()) + .eq(Objects.nonNull(searcher.getFarmId()), "farm_id", searcher.getFarmId()) + .between(searcher.getStartTime() != null && searcher.getEndTime() != null, "created_time", searcher.getStartTime(), searcher.getEndTime()) + ); + List voList = BeanUtils.copyList(fireWarningInfoList, FireWarningInfoVO.class); + //给前端地区名称与处理人姓名 + Map regionIdAndNameMap = commonService.regionMapIdToName(null); + Map userIdAndNameMap = commonService.userMapIdToName(null); + voList.forEach(vo -> { + String forestName = regionIdAndNameMap.get(vo.getForestId()) == null ? "" : regionIdAndNameMap.get(vo.getForestId()); + String farmName = regionIdAndNameMap.get(vo.getFarmId()) == null ? "" : regionIdAndNameMap.get(vo.getFarmId()); + String fenceName = regionIdAndNameMap.get(vo.getFenceId()) == null ? "" : regionIdAndNameMap.get(vo.getFenceId()); + vo.setRegionName(forestName + (StringUtils.isEmpty(farmName) ? "" : "/" + farmName) + (StringUtils.isEmpty(fenceName) ? "" : "/" + fenceName)); + vo.setDisposalByName(userIdAndNameMap.get(vo.getDisposalBy())); + }); + return voList; + } + + @Override + public List countByFireLevel(FireWarningConditionSearcher searcher) { + List voList = fireWarningInfoMapper.countByFireLevel(searcher); + return voList; + } + + @Override + public List selectLimit(FireWarningConditionSearcher searcher) { + //将未处理的置顶,然后按照时间倒序排列,选取十条数据 + List fireWarningInfoList = fireWarningInfoMapper.selectList(new QueryWrapper() + .lambda().eq(Objects.nonNull(searcher.getForestId()), FireWarningInfo::getForestId, searcher.getForestId()) + .eq(Objects.nonNull(searcher.getFarmId()), FireWarningInfo::getFarmId, searcher.getFarmId()) + .eq(Objects.nonNull(searcher.getFenceId()), FireWarningInfo::getFenceId, searcher.getFenceId()) + .orderByDesc(FireWarningInfo::getDisposalStatus) + .orderByDesc(FireWarningInfo::getCreatedTime) + .last("limit 10")); + + List voList = BeanUtils.copyList(fireWarningInfoList, FireWarningInfoVO.class); + //给前端地区名称与处理人姓名 + Map regionIdAndNameMap = commonService.regionMapIdToName(null); + Map userIdAndNameMap = commonService.userMapIdToName(null); + voList.forEach(vo -> { + String forestName = regionIdAndNameMap.get(vo.getForestId()) == null ? "" : regionIdAndNameMap.get(vo.getForestId()); + String farmName = regionIdAndNameMap.get(vo.getFarmId()) == null ? "" : regionIdAndNameMap.get(vo.getFarmId()); + String fenceName = regionIdAndNameMap.get(vo.getFenceId()) == null ? "" : regionIdAndNameMap.get(vo.getFenceId()); + vo.setRegionName(forestName + (StringUtils.isEmpty(farmName) ? "" : "/" + farmName) + (StringUtils.isEmpty(fenceName) ? "" : "/" + fenceName)); + vo.setDisposalByName(userIdAndNameMap.get(vo.getDisposalBy())); + }); + return voList; + } + + @Override + public FireWarningStatisticsByDataSourceVO statisticsByDataSource(BaseTimeSearcher searcher) { + FireWarningStatisticsByDataSourceVO vo = fireWarningInfoMapper.statisticsByDataSource(searcher); + return vo; + } + + @Override + public Integer archive(Long id) { + FireWarningInfo fireWarningInfo = getById(id); + //火情预警处理过之后才能归档:已研判、已上报后才能归档 + if (FireWarningDisposalStatusEnum.UNHANDLED.name().equals(fireWarningInfo.getDisposalStatus())) { + throw new ServiceException("火情预警研判或者上报后才能进行归档"); + } + fireWarningInfo.setDisposalStatus(FireWarningDisposalStatusEnum.ARCHIVED.name()); + return fireWarningInfoMapper.updateById(fireWarningInfo); + } + + @Override + public Integer archiveBatch(BaseIdListSearcher searcher) { + List fireWarningInfoList = fireWarningInfoMapper.selectList(new QueryWrapper() + .lambda().in(FireWarningInfo::getId, searcher.getIdList()) + .eq(FireWarningInfo::getDisposalStatus, FireWarningDisposalStatusEnum.UNHANDLED.name())); + if (CollectionUtils.isNotEmpty(fireWarningInfoList)) { + throw new ServiceException("尚有未处理的火情,请检查后再归档"); + } + return fireWarningInfoMapper.archiveBatch(searcher.getIdList()); + } + + @Override + public List selectDisposedList(FireWarningInfo fireWarningInfo) { + List fireWarningInfoList = fireWarningInfoMapper.selectList(new QueryWrapper().lambda() + .ne(FireWarningInfo::getDisposalStatus, FireWarningDisposalStatusEnum.UNHANDLED.name()) + .like(StringUtils.isNotBlank(fireWarningInfo.getFireTitle()), FireWarningInfo::getFireTitle, fireWarningInfo.getFireTitle()) + .eq(Objects.nonNull(fireWarningInfo.getRegionId()), FireWarningInfo::getRegionId, fireWarningInfo.getRegionId()) + .orderByDesc(FireWarningInfo::getCreatedTime) + ); + return fireWarningInfoList; + } + + @Override + public Integer analyze(FireWarningAnalyzeSearcher searcher, Long userId) { + FireWarningInfo fireWarningInfo = new FireWarningInfo(); + BeanUtils.copyBeanProp(searcher, fireWarningInfo); + fireWarningInfo.setDisposalStatus(FireWarningDisposalStatusEnum.ANALYZED.name()); + fireWarningInfo.setDisposalBy(userId); + fireWarningInfo.setDisposalTime(new Date()); + return fireWarningInfoMapper.updateById(fireWarningInfo); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void simulate() { + FireWarningInfo fireWarningInfo = new FireWarningInfo(); + fireWarningInfo.setDeviceNo("BC1733545"); + fireWarningInfo.setDeviceType("CAMERA"); + fireWarningInfo.setAddress("呼马山林场"); + fireWarningInfo.setLongitude("102.77356"); + fireWarningInfo.setLatitude("25.06268"); + fireWarningInfo.setHeight("100"); + fireWarningInfo.setRegionId(17L); + fireWarningInfo.setForestId(10L); + fireWarningInfo.setFarmId(17L); + fireWarningInfo.setFireTitle("呼马山云台01发现疑似火情"); + fireWarningInfo.setFireLevel("3"); + fireWarningInfo.setFireCause("疑似有人弃置未灭烟头,已产生较大烟雾"); + fireWarningInfo.setDisposalStatus(FireWarningDisposalStatusEnum.UNHANDLED.name()); + fireWarningInfo.setDataSource(DataSourceEnum.VIDEO_MONITOR.name()); + fireWarningInfo.setRemark("模拟呼马山云台发现"); + fireWarningInfo.setCreatedTime(new Date()); + fireWarningInfoMapper.insert(fireWarningInfo); + + FireWarningMQTTBO fireWarningMQTTBO = new FireWarningMQTTBO(); + BeanUtils.copyBeanProp(fireWarningInfo, fireWarningMQTTBO); + //查询云台信息 + PointInfo pointInfo = pointInfoMapper.selectByDeviceNo(fireWarningInfo.getDeviceNo()); + fireWarningMQTTBO.setPointId(pointInfo.getId()); + fireWarningMQTTBO.setPointNo(pointInfo.getPointNo()); + fireWarningMQTTBO.setPointName(pointInfo.getPointName()); + fireWarningMQTTBO.setPointAddress(pointInfo.getAddress()); + fireWarningMQTTBO.setPointLongitude(pointInfo.getLongitude()); + fireWarningMQTTBO.setPointLatitude(pointInfo.getLatitude()); + fireWarningMQTTBO.setPointHeight(pointInfo.getHeight()); + fireWarningMQTTBO.setPointType(pointInfo.getPointType()); + Map regionMapIdToName = commonService.regionMapIdToName(fireWarningInfo.getRegionId()); + fireWarningMQTTBO.setRegionName(regionMapIdToName.get(fireWarningInfo.getRegionId())); + + // 产生火情预警后,需要给前端推送火情预警信息 + mqttPushClient.publish(1, false, "fireWarning", JSON.toJSONString(fireWarningMQTTBO)); + + } + + @Override + public FireWarningSurroundingVO surroundingSearch(Long id) { + //火情预警周边搜索,默认搜索3公里半径范围内的 护林员、仓库、水源地 + //先实现,后续接口慢再进行优化 + FireWarningInfo fireWarningInfo = fireWarningInfoMapper.selectById(id); + //火情所在经纬度 + String longitude = fireWarningInfo.getLongitude(); + String latitude = fireWarningInfo.getLatitude(); + + //查询火情所属区域信息 + RegionInfo regionInfo = regionInfoMapper.selectById(fireWarningInfo.getRegionId()); + String belongingUnit = regionInfo.getBelongingUnit(); + String unitTel = regionInfo.getUnitTel(); + List personVOList = new ArrayList<>(); + List wareHouseVOList = new ArrayList<>(); + List waterSourceVOList = new ArrayList<>(); + + //人员的位置信息,存在当前位置用当前位置,否则用默认位置 ,查询当天的人员位置 + SchedulesSearcher schedulesSearcher = new SchedulesSearcher(); + schedulesSearcher.setStartTime(DateUtils.toDate(LocalDate.now().atStartOfDay())); + schedulesSearcher.setEndTime(DateUtils.toDate(LocalDate.now().atTime(LocalTime.MAX))); + List rangerInfoVOList = iSchedulesService.queryRangerInfo(schedulesSearcher); + if (!CollectionUtils.isEmpty(rangerInfoVOList)) { + for (RangerInfoVO rangerInfoVO : rangerInfoVOList) { + String lon2 = rangerInfoVO.getCurrentLongitude() == null ? rangerInfoVO.getDefaultLongitude() : rangerInfoVO.getCurrentLongitude(); + String lat2 = rangerInfoVO.getCurrentLatitude() == null ? rangerInfoVO.getDefaultLatitude() : rangerInfoVO.getCurrentLatitude(); + double distance = DistanceCalculationUtil.calculateDistance(longitude, latitude, lon2, lat2); + if (Double.compare(distance, 2.0d) == -1) { + SurroundingPersonVO surroundingPersonVO = new SurroundingPersonVO(); + surroundingPersonVO.setUserId(rangerInfoVO.getUserId()); + surroundingPersonVO.setUserName(rangerInfoVO.getUserName()); + surroundingPersonVO.setPhonenumber(rangerInfoVO.getPhonenumber()); + surroundingPersonVO.setLongitude(lon2); + surroundingPersonVO.setLatitude(lat2); + personVOList.add(surroundingPersonVO); + } + } + } + + //查询仓库列表,筛选仓库 + List warehouseList = warehouseMapper.selectList(new QueryWrapper().lambda()); + if (!CollectionUtils.isEmpty(warehouseList)) { + for (Warehouse warehouse : warehouseList) { + if (Double.compare(DistanceCalculationUtil.calculateDistance(longitude, latitude, warehouse.getLongitude(), warehouse.getLatitude()), 2.0d) == -1) { + SurroundingWareHouseVO surroundingWareHouseVO = new SurroundingWareHouseVO(); + surroundingWareHouseVO.setWareHouseId(warehouse.getWarehouseId()); + surroundingWareHouseVO.setWareHouseName(warehouse.getWarehouseName()); + surroundingWareHouseVO.setLongitude(warehouse.getLongitude()); + surroundingWareHouseVO.setLatitude(warehouse.getLatitude()); + wareHouseVOList.add(surroundingWareHouseVO); + } + } + } + + //查询水源地列表,筛选水源地 + List waterSourceList = pointInfoMapper.selectList(new QueryWrapper().lambda() + .eq(PointInfo::getPointType, PointTypeEnum.WATER_SOURCE.name())); + if (!CollectionUtils.isEmpty(waterSourceList)) { + for (PointInfo waterSource : waterSourceList) { + if (Double.compare(DistanceCalculationUtil.calculateDistance(longitude, latitude, waterSource.getLongitude(), waterSource.getLatitude()), 2.0d) == -1) { + SurroundingWaterSourceVO surroundingWaterSourceVO = new SurroundingWaterSourceVO(); + surroundingWaterSourceVO.setWaterSourceId(waterSource.getId()); + surroundingWaterSourceVO.setWaterSourceName(waterSource.getPointName()); + surroundingWaterSourceVO.setLongitude(waterSource.getLongitude()); + surroundingWaterSourceVO.setLatitude(waterSource.getLatitude()); + waterSourceVOList.add(surroundingWaterSourceVO); + } + } + } + FireWarningSurroundingVO vo = new FireWarningSurroundingVO(); + vo.setBelongingUnit(belongingUnit); + vo.setUnitTel(unitTel); + vo.setPersonVOList(personVOList); + vo.setWareHouseVOList(wareHouseVOList); + vo.setWaterSourceVOList(waterSourceVOList); + return vo; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public Integer misjudge(Long id) { + FireWarningInfo fireWarningInfo = fireWarningInfoMapper.selectById(id); + String disposalStatus = fireWarningInfo.getDisposalStatus(); + if (!FireWarningDisposalStatusEnum.UNHANDLED.name().equals(disposalStatus)) { + throw new ServiceException("该火情预警信息已经处理,请检查"); + } + FireWarningInfo updateFireWarningInfo = new FireWarningInfo(); + updateFireWarningInfo.setId(id); + updateFireWarningInfo.setMisjudgeFlag(1); + updateFireWarningInfo.setDisposalStatus(FireWarningDisposalStatusEnum.ANALYZED.name()); + Integer result = fireWarningInfoMapper.updateById(updateFireWarningInfo); + + + //推送已研判消息 + FireWarningMisjudgeBO misjudgeBO = new FireWarningMisjudgeBO(); + misjudgeBO.setId(id); + misjudgeBO.setDisposalStatus(FireWarningDisposalStatusEnum.ANALYZED.name()); + misjudgeBO.setMisjudgeFlag(1); + misjudgeBO.setDisposalMsg("该火情预警信息已确认为误报消息,已作处理"); + mqttPushClient.publish(1, false, "fireWarning", JSON.toJSONString(misjudgeBO)); + + return result; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/HkStoreCapturePicturesServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/HkStoreCapturePicturesServiceImpl.java new file mode 100644 index 0000000..24cee1c --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/HkStoreCapturePicturesServiceImpl.java @@ -0,0 +1,33 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.iot.forestfire.searcher.hk.HkStoreListSearcher; +import com.tcctyn.iot.forestfire.VO.HkStoreCapturePicturesVO; +import com.tcctyn.iot.forestfire.domain.HkStoreCapturePictures; +import com.tcctyn.iot.forestfire.mapper.HkStoreCapturePicturesMapper; +import com.tcctyn.iot.forestfire.service.IHkStoreCapturePicturesService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author 13768238378 + * @description 针对表【hk_store_capture_pictures(海康_硬件抓拍图片元数据表)】的数据库操作Service实现 + * @createDate 2025-04-10 11:17:50 + */ +@Service +public class HkStoreCapturePicturesServiceImpl extends ServiceImpl + implements IHkStoreCapturePicturesService { + @Autowired + private HkStoreCapturePicturesMapper hkStoreCapturePicturesMapper; + + @Override + public List getListHkStoreCapturePicturesList(HkStoreListSearcher hkStoreListSearcher) { + return hkStoreCapturePicturesMapper.getListHkStoreCapturePicturesList(hkStoreListSearcher); + } +} + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/InventoryServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/InventoryServiceImpl.java new file mode 100644 index 0000000..fc19bea --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/InventoryServiceImpl.java @@ -0,0 +1,83 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.iot.forestfire.domain.Inventory; +import com.tcctyn.iot.forestfire.domain.Warehouse; +import com.tcctyn.iot.forestfire.mapper.InventoryMapper; +import com.tcctyn.iot.forestfire.mapper.WarehouseMapper; +import com.tcctyn.iot.forestfire.searcher.material.InventorySearcher; +import com.tcctyn.iot.forestfire.service.IInventoryService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** +*

+* 物资库存 服务实现类 +*

+* +* @author liuzh +* @since 2024-10-29 +*/ +@Service +public class InventoryServiceImpl extends ServiceImpl implements IInventoryService { + + + @Resource + private InventoryMapper inventoryMapper; + + @Resource + private WarehouseMapper warehouseMapper; + + @Override + public List list(InventorySearcher inventorySearcher) { + // 如果林场id和仓库id都传了,则查询该仓库的库存 + if (Objects.nonNull(inventorySearcher.getRegionId()) && Objects.nonNull(inventorySearcher.getWarehouseId())) { + return inventoryMapper.selectList(new QueryWrapper().lambda() + .eq(Inventory::getWarehouseId, inventorySearcher.getWarehouseId()) + .orderByDesc(Inventory::getCreatedTime)); + } + // 如果只传了林场id,则查询该林场所有仓库的库存 + if (Objects.isNull(inventorySearcher.getWarehouseId()) && Objects.nonNull(inventorySearcher.getRegionId())){ + List warehouseList = warehouseMapper.selectList(new QueryWrapper().eq("region_id", inventorySearcher.getRegionId())); + // 从 warehouseList 中获取仓库ID + List warehouseIdList = warehouseList.stream().map(Warehouse::getWarehouseId).distinct().collect(Collectors.toList()); + return inventoryMapper.selectList(new QueryWrapper().lambda() + .in(Inventory::getWarehouseId, warehouseIdList) + .orderByDesc(Inventory::getCreatedTime)); + } + + if (Objects.nonNull(inventorySearcher.getWarehouseId())) { + return new ArrayList(); + } + + return inventoryMapper.selectList(new QueryWrapper().orderByDesc("created_time")); + } + + @Override + public Inventory getById(Long id) { + Inventory inventory = inventoryMapper.selectById(id); + return inventory; + } + + @Override + public Integer create(Inventory inventory) { + return inventoryMapper.insert(inventory); + } + + @Override + public Integer delete(Long id) { + return inventoryMapper.deleteById(id); + } + + @Override + public Integer update(Inventory inventory) { + return inventoryMapper.updateById(inventory); + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/KeyAreaInfoServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/KeyAreaInfoServiceImpl.java new file mode 100644 index 0000000..ab79308 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/KeyAreaInfoServiceImpl.java @@ -0,0 +1,127 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.constant.RegionConstants; + +import com.tcctyn.common.core.web.domain.entity.RegionInfo; +import com.tcctyn.iot.forestfire.domain.KeyAreaInfo; +import com.tcctyn.iot.forestfire.mapper.KeyAreaInfoMapper; +import com.tcctyn.iot.forestfire.mapper.RegionInfoMapper; +import com.tcctyn.iot.forestfire.service.IKeyAreaInfoService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 重点监控区域配置表 服务实现类 + *

+ * + * @author daichao + * @since 2024-12-17 + */ +@Service +public class KeyAreaInfoServiceImpl extends ServiceImpl implements IKeyAreaInfoService { + + + @Resource + private KeyAreaInfoMapper keyAreaInfoMapper; + + @Resource + private RegionInfoMapper regionInfoMapper; + + @Override + public Page list(Integer pageNo, Integer pageSize) { + return keyAreaInfoMapper.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<>()); + } + + @Override + public KeyAreaInfo getById(Long id) { + KeyAreaInfo keyAreaInfo = keyAreaInfoMapper.selectById(id); + return keyAreaInfo; + } + + @Override + public Integer create(KeyAreaInfo keyAreaInfo) { + //根据归属区域id来查询全路径id , 然后拆分为 forest_id、farm_id、fence_id + Long regionId = keyAreaInfo.getRegionId(); + if (Objects.nonNull(regionId)) { + RegionInfo regionInfo = regionInfoMapper.selectById(regionId); + String ancestors = regionInfo.getAncestors(); + String[] ancestorsArr = ancestors.split(RegionConstants.DIVISION_COMMA); + switch (ancestorsArr.length) { + case 1: + keyAreaInfo.setForestId(regionId); + break; + case 2: + keyAreaInfo.setForestId(Long.valueOf(ancestorsArr[1])); + keyAreaInfo.setFarmId(regionId); + break; + case 3: + keyAreaInfo.setForestId(Long.valueOf(ancestorsArr[1])); + keyAreaInfo.setFarmId(Long.valueOf(ancestorsArr[2])); + keyAreaInfo.setFenceId(regionId); + break; + case 4: + keyAreaInfo.setForestId(Long.valueOf(ancestorsArr[1])); + keyAreaInfo.setFarmId(Long.valueOf(ancestorsArr[2])); + keyAreaInfo.setFenceId(Long.valueOf(ancestorsArr[3])); + break; + } + } + return keyAreaInfoMapper.insert(keyAreaInfo); + } + + @Override + public Integer delete(Long id) { + return keyAreaInfoMapper.deleteById(id); + } + + @Override + public Integer update(KeyAreaInfo keyAreaInfo) { + //如果修改归属区域的话,需要同步修改forest_id、farm_id、fence_id + KeyAreaInfo originalKeyAreaInfo = keyAreaInfoMapper.selectById(keyAreaInfo.getId()); + if (!Objects.equals(originalKeyAreaInfo.getRegionId(), keyAreaInfo.getRegionId())) { + Long regionId = keyAreaInfo.getRegionId(); + RegionInfo regionInfo = regionInfoMapper.selectById(regionId); + String ancestors = regionInfo.getAncestors(); + String[] ancestorsArr = ancestors.split(RegionConstants.DIVISION_COMMA); + switch (ancestorsArr.length) { + case 1: + keyAreaInfo.setForestId(regionId); + break; + case 2: + keyAreaInfo.setForestId(Long.valueOf(ancestorsArr[1])); + keyAreaInfo.setFarmId(regionId); + break; + case 3: + keyAreaInfo.setForestId(Long.valueOf(ancestorsArr[1])); + keyAreaInfo.setFarmId(Long.valueOf(ancestorsArr[2])); + keyAreaInfo.setFenceId(regionId); + break; + case 4: + keyAreaInfo.setForestId(Long.valueOf(ancestorsArr[1])); + keyAreaInfo.setFarmId(Long.valueOf(ancestorsArr[2])); + keyAreaInfo.setFenceId(Long.valueOf(ancestorsArr[3])); + break; + } + } + return keyAreaInfoMapper.updateById(keyAreaInfo); + } + + @Override + public List selectList(KeyAreaInfo keyAreaInfo) { + List keyAreaInfoList = keyAreaInfoMapper.selectList(new QueryWrapper().lambda() + .eq(Objects.nonNull(keyAreaInfo.getRegionId()), KeyAreaInfo::getRegionId, keyAreaInfo.getRegionId()) + .eq(StringUtils.isNotBlank(keyAreaInfo.getKeyAreaType()), KeyAreaInfo::getKeyAreaType, keyAreaInfo.getKeyAreaType()) + .orderByDesc(KeyAreaInfo::getCreatedTime) + ); + return keyAreaInfoList; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/LeaveRecordServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/LeaveRecordServiceImpl.java new file mode 100644 index 0000000..02a8ea1 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/LeaveRecordServiceImpl.java @@ -0,0 +1,124 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.exception.ServiceException; +import com.tcctyn.iot.forestfire.domain.ApprovalRecord; +import com.tcctyn.iot.forestfire.domain.LeaveRecord; +import com.tcctyn.iot.forestfire.enums.ApprovalBusinessTypeEnum; +import com.tcctyn.iot.forestfire.mapper.ApprovalRecordMapper; +import com.tcctyn.iot.forestfire.mapper.LeaveRecordMapper; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.iot.forestfire.service.ILeaveRecordService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + *

+ * 请假记录表 服务实现类 + *

+ * + * @author daichao + * @since 2024-12-09 + */ +@Service +public class LeaveRecordServiceImpl extends ServiceImpl implements ILeaveRecordService { + + + @Resource + private LeaveRecordMapper leaveRecordMapper; + + @Resource + private ApprovalRecordMapper approvalRecordMapper; + + @Autowired + private ICommonService commonService; + + @Override + public Page list(Integer pageNo, Integer pageSize) { + return leaveRecordMapper.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<>()); + } + + @Override + public LeaveRecord getById(Long id) { + LeaveRecord leaveRecord = leaveRecordMapper.selectById(id); + return leaveRecord; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public Integer create(LeaveRecord leaveRecord) { + Integer result = leaveRecordMapper.insert(leaveRecord); + Long id = leaveRecord.getId(); + //此处需要获取到插入的业务数据id + //新增请假数据后,需要同步写入到审批记录表 + ApprovalRecord approvalRecord = new ApprovalRecord(); + approvalRecord.setBusinessType(ApprovalBusinessTypeEnum.LEAVE.name()); + approvalRecord.setBusinessDataId(id); + //业务数据内容需要保存userName 跟 deptName, 方便前端进行展示 TODO 这里后续可以优化下,从用户登录信息中取name + Map userIdToNameMap = commonService.userMapIdToName(leaveRecord.getUserId()); + Map deptIdToNameMap = commonService.deptMapIdToName(leaveRecord.getDeptId()); + JSONObject businessContent = new JSONObject(); + businessContent.put("userId", leaveRecord.getUserId()); + businessContent.put("deptId", leaveRecord.getDeptId()); + businessContent.put("userName", userIdToNameMap.get(leaveRecord.getUserId())); + businessContent.put("deptName", deptIdToNameMap.get(leaveRecord.getDeptId())); + businessContent.put("leaveType", leaveRecord.getLeaveType()); + businessContent.put("startTime", leaveRecord.getStartTime()); + businessContent.put("endTime", leaveRecord.getEndTime()); + businessContent.put("leaveDuration", leaveRecord.getLeaveDuration()); + businessContent.put("leaveInstruction", leaveRecord.getLeaveInstruction()); + businessContent.put("picture", leaveRecord.getPicture()); + approvalRecord.setBusinessContent(businessContent); + approvalRecordMapper.insert(approvalRecord); + return result; + } + + @Override + public Integer delete(Long id) { + return leaveRecordMapper.deleteById(id); + } + + @Override + public Integer update(LeaveRecord leaveRecord) { + return leaveRecordMapper.updateById(leaveRecord); + } + + @Override + public List selectList(LeaveRecord leaveRecord) { + List leaveRecordList = leaveRecordMapper.selectList(new QueryWrapper<>(leaveRecord).lambda() + .eq(StringUtils.isNotBlank(leaveRecord.getLeaveType()), LeaveRecord::getLeaveType, leaveRecord.getLeaveType()) + .eq(LeaveRecord::getUserId, leaveRecord.getUserId()) + .orderByAsc(LeaveRecord::getApprovalFlag) + .orderByDesc(LeaveRecord::getCreatedTime) + ); + return leaveRecordList; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public Integer revoke(Long id) { + LeaveRecord leaveRecord = leaveRecordMapper.selectById(id); + if (1 == leaveRecord.getApprovalFlag()) { + throw new ServiceException("已审批,不能撤销"); + } + leaveRecord.setRevokeFlag(1); + leaveRecord.setRevokeTime(new Date()); + Integer result = leaveRecordMapper.updateById(leaveRecord); + //撤销后,需要同步更新到审批记录,删除该条业务数据的审批记录 + approvalRecordMapper.delete(new QueryWrapper().lambda() + .eq(ApprovalRecord::getBusinessDataId, id) + ); + return result; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/MaterialServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/MaterialServiceImpl.java new file mode 100644 index 0000000..820f3ef --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/MaterialServiceImpl.java @@ -0,0 +1,244 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.MaterialStatisticsVO; +import com.tcctyn.iot.forestfire.domain.Inventory; +import com.tcctyn.iot.forestfire.domain.Material; +import com.tcctyn.iot.forestfire.domain.Warehouse; +import com.tcctyn.iot.forestfire.mapper.InventoryMapper; +import com.tcctyn.iot.forestfire.mapper.MaterialMapper; +import com.tcctyn.iot.forestfire.mapper.WarehouseMapper; +import com.tcctyn.iot.forestfire.searcher.material.MaterialAllocateSearcher; +import com.tcctyn.iot.forestfire.searcher.material.MaterialSearcher; +import com.tcctyn.iot.forestfire.service.IMaterialService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + *

+ * 物资信息 服务实现类 + *

+ * + * @author liuzh + * @since 2024-10-09 + */ +@Service +public class MaterialServiceImpl extends ServiceImpl implements IMaterialService { + + + @Resource + private MaterialMapper materialMapper; + + @Resource + private InventoryMapper inventoryMapper; + + @Resource + private WarehouseMapper warehouseMapper; + + @Override + public List list(MaterialSearcher materialSearcher) { + // 如果林场id和仓库id都传了,则查询该仓库的物资 + if (Objects.nonNull(materialSearcher.getRegionId()) && Objects.nonNull(materialSearcher.getWarehouseId())) { + return materialMapper.selectList(new QueryWrapper().lambda() + .eq(Material::getWarehouseId, materialSearcher.getWarehouseId()) + .orderByDesc(Material::getCreatedTime)); + } + // 如果只传了林场id,则查询该林场全部仓库的物资 + if (Objects.isNull(materialSearcher.getWarehouseId()) && Objects.nonNull(materialSearcher.getRegionId())) { + List warehouseList = warehouseMapper.selectList(new QueryWrapper().eq("region_id", materialSearcher.getRegionId())); + if (warehouseList.isEmpty()) { + return new ArrayList(); + } + // 从 warehouseList 中获取仓库ID + List warehouseIdList = warehouseList.stream().map(Warehouse::getWarehouseId).distinct().collect(Collectors.toList()); + + return materialMapper.selectList(new QueryWrapper().lambda() + .in(Material::getWarehouseId, warehouseIdList) + .orderByDesc(Material::getCreatedTime)); + } + // 如果没有林场id,但是有仓库id + if (Objects.nonNull(materialSearcher.getWarehouseId())) { + return materialMapper.selectList(new QueryWrapper().lambda() + .eq(Material::getWarehouseId, materialSearcher.getWarehouseId()) + .orderByDesc(Material::getCreatedTime)); + } + + return materialMapper.selectList(new QueryWrapper().orderByDesc("created_time")); + } + + @Override + public Material getById(Long id) { + Material material = materialMapper.selectById(id); + return material; + } + + @Override + public AjaxResult create(Material material) { + // 校验物资是否已存在 + Material materialBySerialNumber = materialMapper.selectOne(new QueryWrapper().lambda() + .eq(Material::getMaterialName, material.getMaterialName()) + .eq(Material::getMaterialType, material.getMaterialType()) + .eq(Material::getModel, material.getModel()) + .eq(Material::getWarehouseId, material.getWarehouseId()) + ); + if (materialBySerialNumber != null) { + return AjaxResult.error("物资已存在"); + } + + return materialMapper.insert(material) > 0 ? AjaxResult.success("添加成功") : AjaxResult.error("添加失败"); + } + + @Override + public Integer delete(Long id) { + return materialMapper.deleteById(id); + } + + @Override + public Integer update(Material material) { + return materialMapper.updateById(material); + } + + /** + * 入库 + * + * @param materialAllocateSearcher + * @return + */ + @Override + public Integer inbound(MaterialAllocateSearcher materialAllocateSearcher) { + // 入库时选择好仓库,类型和对应物资 + Material originalMaterial = materialMapper.selectById(materialAllocateSearcher.getMaterialId()); + // 更新对应物资的库存数量 + originalMaterial.setStock(originalMaterial.getStock().add(materialAllocateSearcher.getQuantity())); + int result = materialMapper.updateById(originalMaterial); + if (result > 0) { + // 增加库存记录 + Inventory inventory = new Inventory(); + inventory.setMaterialId(materialAllocateSearcher.getMaterialId()); + inventory.setWarehouseId(originalMaterial.getWarehouseId()); + inventory.setUserId(materialAllocateSearcher.getUserId()); + inventory.setInventoryType(1); + inventory.setMaterialName(originalMaterial.getMaterialName()); + inventory.setUnit(originalMaterial.getUnit()); + inventory.setQuantity(materialAllocateSearcher.getQuantity()); + inventory.setMaterialType(originalMaterial.getMaterialType()); + inventory.setDescription(materialAllocateSearcher.getDescription()); + inventoryMapper.insert(inventory); + } + + return result; + } + + /** + * 出库 + * + * @param materialAllocateSearcher + * @return + */ + @Override + public Integer outbound(MaterialAllocateSearcher materialAllocateSearcher) { + // 领用出库 + Material originalMaterial = materialMapper.selectById(materialAllocateSearcher.getMaterialId()); + if (originalMaterial.getStock().compareTo(materialAllocateSearcher.getQuantity()) < 0) { + return -1; + } + // 更新对应物资的库存数量 + originalMaterial.setStock(originalMaterial.getStock().subtract(materialAllocateSearcher.getQuantity())); + int result = materialMapper.updateById(originalMaterial); + + if (result > 0) { + // 增加库存记录 + Inventory inventory = new Inventory(); + inventory.setMaterialId(materialAllocateSearcher.getMaterialId()); + inventory.setWarehouseId(originalMaterial.getWarehouseId()); + inventory.setUserId(materialAllocateSearcher.getUserId()); + inventory.setInventoryType(2); + inventory.setMaterialName(originalMaterial.getMaterialName()); + inventory.setUnit(originalMaterial.getUnit()); + inventory.setQuantity(materialAllocateSearcher.getQuantity()); + inventory.setMaterialType(originalMaterial.getMaterialType()); + inventory.setDescription(materialAllocateSearcher.getDescription()); + inventoryMapper.insert(inventory); + } + + return result; + } + + @Override + public Integer allocate(MaterialAllocateSearcher materialAllocateSearcher) { + Material sourceMaterial = materialMapper.selectById(materialAllocateSearcher.getMaterialId()); + if (sourceMaterial.getStock().compareTo(materialAllocateSearcher.getQuantity()) < 0) { + return -1; + } + Material targetMaterial = new Material(); + BeanUtils.copyBeanProp(sourceMaterial, targetMaterial); + + // 如果目标仓库已有该物资,则更新库存数量,否则新增 + Material targetWarehouseMaterial = materialMapper.selectOne(new QueryWrapper().lambda() + .eq(Material::getMaterialName, targetMaterial.getMaterialName()) + .eq(Material::getMaterialType, targetMaterial.getMaterialType()) + .eq(Material::getModel, targetMaterial.getModel()) + .eq(Material::getWarehouseId, materialAllocateSearcher.getTargetWarehouseId()) + ); + int result = 0; + if (targetWarehouseMaterial != null) { + targetWarehouseMaterial.setStock(targetWarehouseMaterial.getStock().add(materialAllocateSearcher.getQuantity())); + result += materialMapper.updateById(targetWarehouseMaterial); + } else { + targetMaterial.setMaterialId(null); + targetMaterial.setWarehouseId(materialAllocateSearcher.getTargetWarehouseId()); + targetMaterial.setStock(materialAllocateSearcher.getQuantity()); + result += materialMapper.insert(targetMaterial); + } + if (result > 0) { + // 更新源仓库物资库存数量 + sourceMaterial.setStock(sourceMaterial.getStock().subtract(materialAllocateSearcher.getQuantity())); + result += materialMapper.updateById(sourceMaterial); + // 增加库存记录 + Inventory inventoryOut = new Inventory(); + inventoryOut.setWarehouseId(sourceMaterial.getWarehouseId()); + inventoryOut.setMaterialId(sourceMaterial.getMaterialId()); + inventoryOut.setUserId(materialAllocateSearcher.getUserId()); + inventoryOut.setInventoryType(2); + inventoryOut.setMaterialName(sourceMaterial.getMaterialName()); + inventoryOut.setUnit(sourceMaterial.getUnit()); + inventoryOut.setQuantity(materialAllocateSearcher.getQuantity()); + inventoryOut.setMaterialType(sourceMaterial.getMaterialType()); + inventoryOut.setDescription(materialAllocateSearcher.getDescription()); + Inventory inventoryIn = new Inventory(); + BeanUtils.copyBeanProp(inventoryOut, inventoryIn); + inventoryIn.setWarehouseId(materialAllocateSearcher.getTargetWarehouseId()); + inventoryIn.setInventoryType(1); + inventoryMapper.insert(inventoryOut); + inventoryMapper.insert(inventoryIn); + } + + return result; + } + + @Override + public List getStatisticsByWarehouse(Long warehouseId) { + List voList = new ArrayList<>(); + if (warehouseId != null) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("warehouse_id as 'warehouseId'", "material_type as 'materialType'", "count(material_id) as 'materialNum'") + .eq("warehouse_id", warehouseId) + .groupBy("warehouse_id", "material_type"); + + List> list = this.listMaps(queryWrapper); + voList = BeanUtils.copyList(list, MaterialStatisticsVO.class); + } + + return voList; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/NoticeInfoServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/NoticeInfoServiceImpl.java new file mode 100644 index 0000000..bcee103 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/NoticeInfoServiceImpl.java @@ -0,0 +1,70 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.iot.forestfire.domain.NoticeInfo; +import com.tcctyn.iot.forestfire.mapper.NoticeInfoMapper; +import com.tcctyn.iot.forestfire.service.INoticeInfoService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 通知公告信息表 服务实现类 + *

+ * + * @author daichao + * @since 2024-12-17 + */ +@Service +public class NoticeInfoServiceImpl extends ServiceImpl implements INoticeInfoService { + + + @Resource + private NoticeInfoMapper noticeInfoMapper; + + @Override + public Page list(Integer pageNo, Integer pageSize) { + return noticeInfoMapper.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<>()); + } + + @Override + public NoticeInfo getById(Long id) { + NoticeInfo noticeInfo = noticeInfoMapper.selectById(id); + return noticeInfo; + } + + @Override + public Integer create(NoticeInfo noticeInfo) { + return noticeInfoMapper.insert(noticeInfo); + } + + @Override + public Integer delete(Long id) { + return noticeInfoMapper.deleteById(id); + } + + @Override + public Integer update(NoticeInfo noticeInfo) { + return noticeInfoMapper.updateById(noticeInfo); + } + + @Override + public List selectList(NoticeInfo noticeInfo) { + List noticeInfoList = noticeInfoMapper.selectList(new QueryWrapper().lambda() + .eq(StringUtils.isNotBlank(noticeInfo.getType()), NoticeInfo::getType, noticeInfo.getType()) + .like(StringUtils.isNotBlank(noticeInfo.getTitle()), NoticeInfo::getTitle, noticeInfo.getTitle()) + .eq(Objects.nonNull(noticeInfo.getEnableFlag()), NoticeInfo::getEnableFlag, noticeInfo.getEnableFlag()) + .orderByAsc(NoticeInfo::getSortNo) + .orderByDesc(NoticeInfo::getEnableFlag) + .orderByDesc(NoticeInfo::getCreatedTime) + ); + return noticeInfoList; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/PatrolPathServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/PatrolPathServiceImpl.java new file mode 100644 index 0000000..fdb7c59 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/PatrolPathServiceImpl.java @@ -0,0 +1,313 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.constant.RegionConstants; +import com.tcctyn.common.core.web.domain.entity.RegionInfo; +import com.tcctyn.common.core.exception.ServiceException; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.BO.PointInfoBO; +import com.tcctyn.iot.forestfire.VO.PatrolPathVO; +import com.tcctyn.iot.forestfire.domain.PatrolPath; +import com.tcctyn.iot.forestfire.domain.PointInfo; +import com.tcctyn.iot.forestfire.mapper.PatrolPathMapper; +import com.tcctyn.iot.forestfire.mapper.PointInfoMapper; +import com.tcctyn.iot.forestfire.mapper.RegionInfoMapper; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.iot.forestfire.service.IPatrolPathService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + *

+ * 巡护路径表 服务实现类 + *

+ * + * @author 代超 + * @since 2024-09-24 + */ +@Service +public class PatrolPathServiceImpl extends ServiceImpl implements IPatrolPathService { + + + @Resource + private PatrolPathMapper patrolPathMapper; + + @Resource + private PointInfoMapper pointInfoMapper; + + @Autowired + private ICommonService commonService; + + @Resource + private RegionInfoMapper regionInfoMapper; + + @Override + public Page list(Integer pageNo, Integer pageSize) { + return patrolPathMapper.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<>()); + } + + @Override + public PatrolPathVO getById(Long id) { + PatrolPath patrolPath = patrolPathMapper.selectById(id); + //需要查询路径下的点位信息 + List pointInfoList = pointInfoMapper.selectList(new QueryWrapper().eq("belonging_region_id", id)); + + List boList = BeanUtils.copyList(pointInfoList, PointInfoBO.class); + patrolPath.setPointList(boList); + + PatrolPathVO patrolPathVO = new PatrolPathVO(); + BeanUtils.copyBeanProp(patrolPath, patrolPathVO); + //组转路径归属名称 + Map regionIdToNameMap = commonService.regionMapIdToName(null); + String forestName = regionIdToNameMap.get(patrolPathVO.getForestId()) == null ? "" : regionIdToNameMap.get(patrolPathVO.getForestId()); + String farmName = regionIdToNameMap.get(patrolPathVO.getFarmId()) == null ? "" : regionIdToNameMap.get(patrolPathVO.getFarmId()); + String fenceName = regionIdToNameMap.get(patrolPathVO.getFenceId()) == null ? "" : regionIdToNameMap.get(patrolPathVO.getFenceId()); + patrolPathVO.setBelongingRegionName(forestName + (StringUtils.isEmpty(farmName) ? "" : "/" + farmName) + (StringUtils.isEmpty(fenceName) ? "" : "/" + fenceName)); + return patrolPathVO; + } + + @Override + public Integer create(PatrolPath patrolPath) { + // 巡护路径编号 校验 --2024-10-14 ,路径编号这个字段暂时不做校验,后期看实际需求再处理 +// List patrolPaths = patrolPathMapper.selectList(new QueryWrapper().eq("path_no", patrolPath.getPathNo())); +// if (!patrolPaths.isEmpty()) { +// throw new ServiceException("路径编号已存在"); +// } + + // 巡护路径名称 校验 + List patrolPaths2 = patrolPathMapper.selectList(new QueryWrapper().eq("path_name", patrolPath.getPathName())); + if (!patrolPaths2.isEmpty()) { + throw new ServiceException("路径名称已存在"); + } + //根据全路径的长度来 + + //根据归属区域id来查询全路径id , 然后拆分为 forest_id、farm_id、fence_id + Long regionId = patrolPath.getBelongingRegionId(); + if (Objects.nonNull(regionId)) { + RegionInfo regionInfo = regionInfoMapper.selectById(regionId); + String ancestors = regionInfo.getAncestors(); + String[] ancestorsArr = ancestors.split(RegionConstants.DIVISION_COMMA); + switch (ancestorsArr.length) { + case 1: + patrolPath.setForestId(regionId); + break; + case 2: + patrolPath.setForestId(Long.valueOf(ancestorsArr[1])); + patrolPath.setFarmId(regionId); + break; + case 3: + patrolPath.setForestId(Long.valueOf(ancestorsArr[1])); + patrolPath.setFarmId(Long.valueOf(ancestorsArr[2])); + patrolPath.setFenceId(regionId); + break; + case 4: + patrolPath.setForestId(Long.valueOf(ancestorsArr[1])); + patrolPath.setFarmId(Long.valueOf(ancestorsArr[2])); + patrolPath.setFenceId(Long.valueOf(ancestorsArr[3])); + break; + } + } + + Integer result = patrolPathMapper.insert(patrolPath); + Long patrolPathId = patrolPath.getId(); + // 批量处理点位数据 + if (!patrolPath.getPointList().isEmpty()) { + //对点位数据做批量插入 + List pointBOList = patrolPath.getPointList(); + List pointInfoList = new ArrayList<>(); + pointBOList.forEach(bo -> { + PointInfo pointInfo = new PointInfo(); + pointInfo.setBelongingRegionId(patrolPathId); + pointInfo.setForestId(patrolPath.getForestId()); + pointInfo.setFarmId(patrolPath.getFarmId()); + pointInfo.setFenceId(patrolPath.getFenceId()); + pointInfo.setLongitude(bo.getLongitude()); + pointInfo.setLatitude(bo.getLatitude()); + pointInfo.setHeight(bo.getHeight()); + pointInfo.setPointType(bo.getPointType()); + pointInfo.setSortNo(bo.getSortNo()); + pointInfo.setCheckInRadius(bo.getCheckInRadius()); + pointInfo.setDelFlag(0); + pointInfoList.add(pointInfo); + }); + //BO 需要转换为 DO 才能插入 + pointInfoMapper.insertBatchSomeColumn(pointInfoList); + } + + return result; + } + + @Override + public Integer delete(Long id) { + Integer result = patrolPathMapper.deleteById(id); + //删除巡护路径时,需要将关联的点位信息删除 + pointInfoMapper.delete(new QueryWrapper().eq("belonging_region_id", id)); + return result; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public Integer update(PatrolPath patrolPath) { + // 巡护路径编号 校验 +// List patrolPaths = patrolPathMapper.selectList(new QueryWrapper().eq("path_no", patrolPath.getPathNo()).ne("id", patrolPath.getId())); +// if (!patrolPaths.isEmpty()) { +// throw new ServiceException("路径编号已存在"); +// } + + // 巡护路径名称 校验 + List patrolPaths2 = patrolPathMapper.selectList(new QueryWrapper().eq("path_name", patrolPath.getPathName()).ne("id", patrolPath.getId())); + if (!patrolPaths2.isEmpty()) { + throw new ServiceException("路径名称已存在"); + } + + //如果巡护路径修改涉及到归属区域的修改,需要调整相应的forest_id、farm_id、fence_id + PatrolPath originalPatrolPath = patrolPathMapper.selectById(patrolPath.getId()); + if (!Objects.equals(originalPatrolPath.getBelongingRegionId(), patrolPath.getBelongingRegionId())) { + Long regionId = patrolPath.getBelongingRegionId(); + RegionInfo regionInfo = regionInfoMapper.selectById(regionId); + String ancestors = regionInfo.getAncestors(); + String[] ancestorsArr = ancestors.split(RegionConstants.DIVISION_COMMA); + switch (ancestorsArr.length) { + case 1: + patrolPath.setForestId(regionId); + break; + case 2: + patrolPath.setForestId(Long.valueOf(ancestorsArr[1])); + patrolPath.setFarmId(regionId); + break; + case 3: + patrolPath.setForestId(Long.valueOf(ancestorsArr[1])); + patrolPath.setFarmId(Long.valueOf(ancestorsArr[2])); + patrolPath.setFenceId(regionId); + break; + case 4: + patrolPath.setForestId(Long.valueOf(ancestorsArr[1])); + patrolPath.setFarmId(Long.valueOf(ancestorsArr[2])); + patrolPath.setFenceId(Long.valueOf(ancestorsArr[3])); + break; + } + } + + List pointInfoList = pointInfoMapper.selectList(new QueryWrapper().eq("belonging_region_id", patrolPath.getId())); + List originalPointIdList; + List existsPointIdList = new ArrayList<>(); + if (!pointInfoList.isEmpty()) { + originalPointIdList = pointInfoList.stream().map(PointInfo::getId).collect(Collectors.toList()); + } else { + originalPointIdList = new ArrayList<>(); + } + + //对点位信息做更新、新增区分 + if (!patrolPath.getPointList().isEmpty()) { + //对点位数据做批量插入 + List pointBOList = patrolPath.getPointList(); + //新增数据集合 + List addList = new ArrayList<>(); + //更新数据集合 + List updateList = new ArrayList<>(); + //删除数据集合 需要将原先不包含的点位信息删除 + List deleteList = new ArrayList<>(); + + for (PointInfoBO bo : pointBOList) { + PointInfo pointInfo = new PointInfo(); + + if (Objects.isNull(bo.getId())) { + pointInfo.setBelongingRegionId(patrolPath.getId()); + pointInfo.setForestId(patrolPath.getForestId()); + pointInfo.setFarmId(patrolPath.getFarmId()); + pointInfo.setFenceId(patrolPath.getFenceId()); + pointInfo.setLongitude(bo.getLongitude()); + pointInfo.setLatitude(bo.getLatitude()); + pointInfo.setHeight(bo.getHeight()); + pointInfo.setPointType(bo.getPointType()); + pointInfo.setSortNo(bo.getSortNo()); + pointInfo.setCheckInRadius(bo.getCheckInRadius()); + pointInfo.setDelFlag(0); + addList.add(pointInfo); + } else { + pointInfo.setId(bo.getId()); + pointInfo.setLongitude(bo.getLongitude()); + pointInfo.setLatitude(bo.getLatitude()); + pointInfo.setHeight(bo.getHeight()); + pointInfo.setPointType(bo.getPointType()); + pointInfo.setSortNo(bo.getSortNo()); + pointInfo.setCheckInRadius(bo.getCheckInRadius()); + updateList.add(pointInfo); + } + existsPointIdList.add(bo.getId()); + } + if (!addList.isEmpty()) { + pointInfoMapper.insertBatchSomeColumn(addList); + } + if (!updateList.isEmpty()) { + pointInfoMapper.updateBatch(updateList); + } + //过滤出不在现在集合中的点位id + deleteList = originalPointIdList.stream().filter(pointId -> !existsPointIdList.contains(pointId)).collect(Collectors.toList()); + if (!deleteList.isEmpty()) { + pointInfoMapper.deleteBatchIds(deleteList); + } + } + Integer result = patrolPathMapper.updateById(patrolPath); + return result; + } + + @Override + public List selectList(PatrolPath patrolPath) { + List patrolPathList = patrolPathMapper.selectList(new QueryWrapper() + .like(StringUtils.isNotBlank(patrolPath.getPathName()), "path_name", patrolPath.getPathName()) + .eq(Objects.nonNull(patrolPath.getBelongingRegionId()), "belonging_region_id", patrolPath.getBelongingRegionId()) + .eq(Objects.nonNull(patrolPath.getForestId()), "forest_id", patrolPath.getForestId()) + .eq(Objects.nonNull(patrolPath.getFarmId()), "farm_id", patrolPath.getFarmId()) + .eq(Objects.nonNull(patrolPath.getFenceId()), "fence_id", patrolPath.getFenceId()) + .orderByAsc("created_time")); + return patrolPathList; + } + + @Override + public List selectByRegionId(Long regionId) { + return patrolPathMapper.selectList(new QueryWrapper().eq("belonging_region_id", regionId)); + } + + @Override + public List queryByRegion(PatrolPath patrolPath) { + List patrolPathList = patrolPathMapper.selectList(new QueryWrapper().lambda() + .eq(Objects.nonNull(patrolPath.getForestId()), PatrolPath::getForestId, patrolPath.getForestId()) + .eq(Objects.nonNull(patrolPath.getFarmId()), PatrolPath::getFarmId, patrolPath.getFarmId()) + .eq(Objects.nonNull(patrolPath.getFenceId()), PatrolPath::getFenceId, patrolPath.getFenceId()) + ); + List patrolPathIdList = patrolPathList.stream().map(PatrolPath::getId).collect(Collectors.toList()); + //查询路径下面的点位信息 + List pointInfoList = pointInfoMapper.selectList(new QueryWrapper().lambda().in(!CollectionUtils.isEmpty(patrolPathIdList), PointInfo::getBelongingRegionId, patrolPathIdList)); + if (!pointInfoList.isEmpty()) { + Map> pointInfoMap = pointInfoList.stream().collect(Collectors.groupingBy(PointInfo::getBelongingRegionId)); + for (PatrolPath item : patrolPathList) { + item.setPointList(BeanUtils.copyList(pointInfoMap.get(item.getId()), PointInfoBO.class)); + } + } + //DO -> VO + Map regionIdToNameMap = commonService.regionMapIdToName(null); + List voList = BeanUtils.copyList(patrolPathList, PatrolPathVO.class); + voList.forEach(patrolPathVO -> { + String forestName = regionIdToNameMap.get(patrolPathVO.getForestId()) == null ? "" : regionIdToNameMap.get(patrolPathVO.getForestId()); + String farmName = regionIdToNameMap.get(patrolPathVO.getFarmId()) == null ? "" : regionIdToNameMap.get(patrolPathVO.getFarmId()); + String fenceName = regionIdToNameMap.get(patrolPathVO.getFenceId()) == null ? "" : regionIdToNameMap.get(patrolPathVO.getFenceId()); + patrolPathVO.setBelongingRegionName(forestName + (StringUtils.isEmpty(farmName) ? "" : "/" + farmName) + (StringUtils.isEmpty(fenceName) ? "" : "/" + fenceName)); + }); + + return voList; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/PointInfoServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/PointInfoServiceImpl.java new file mode 100644 index 0000000..6b05118 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/PointInfoServiceImpl.java @@ -0,0 +1,247 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.constant.RegionConstants; +import com.tcctyn.common.core.web.domain.entity.RegionInfo; +import com.tcctyn.common.core.exception.ServiceException; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.DeviceInfoSimpleVO; +import com.tcctyn.iot.forestfire.VO.PointAndDeviceInfoVO; +import com.tcctyn.iot.forestfire.VO.PointInfoVO; +import com.tcctyn.iot.forestfire.VO.PointStatisticsByPointTypeVO; +import com.tcctyn.iot.forestfire.domain.DeviceInfo; +import com.tcctyn.iot.forestfire.domain.PointInfo; +import com.tcctyn.iot.forestfire.enums.PointTypeEnum; +import com.tcctyn.iot.forestfire.mapper.DeviceInfoMapper; +import com.tcctyn.iot.forestfire.mapper.PointInfoMapper; +import com.tcctyn.iot.forestfire.mapper.RegionInfoMapper; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.iot.forestfire.service.IPointInfoService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + *

+ * 点位信息表 服务实现类 + *

+ * + * @author 代超 + * @since 2024-09-24 + */ +@Service +public class PointInfoServiceImpl extends ServiceImpl implements IPointInfoService { + + + @Resource + private PointInfoMapper pointInfoMapper; + + @Autowired + private ICommonService commonService; + + @Resource + private RegionInfoMapper regionInfoMapper; + + @Resource + private DeviceInfoMapper deviceInfoMapper; + + @Override + public Page list(Integer pageNo, Integer pageSize) { + return pointInfoMapper.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<>()); + } + + @Override + public PointInfoVO getById(Long id) { + PointInfo pointInfo = pointInfoMapper.selectById(id); + PointInfoVO pointInfoVO = new PointInfoVO(); + BeanUtils.copyProperties(pointInfo, pointInfoVO); + //拼接归属区域名称: + Map regionIdToNameMap = commonService.regionMapIdToName(null); + String forestName = regionIdToNameMap.get(pointInfoVO.getForestId()) == null ? "" : regionIdToNameMap.get(pointInfoVO.getForestId()); + String farmName = regionIdToNameMap.get(pointInfoVO.getFarmId()) == null ? "" : regionIdToNameMap.get(pointInfoVO.getFarmId()); + String fenceName = regionIdToNameMap.get(pointInfoVO.getFenceId()) == null ? "" : regionIdToNameMap.get(pointInfoVO.getFenceId()); + pointInfoVO.setBelongingRegionName(forestName + (StringUtils.isEmpty(farmName) ? "" : "/" + farmName) + (StringUtils.isEmpty(fenceName) ? "" : "/" + fenceName)); + return pointInfoVO; + } + + @Override + public Integer create(PointInfo pointInfo) { + //编号暂时不做校验 +// List pointInfoList1 = pointInfoMapper.selectList(new QueryWrapper().eq("point_no", pointInfo.getPointNo())); +// if (!pointInfoList1.isEmpty()) { +// throw new ServiceException(PointTypeEnum.getByEnumName(pointInfo.getPointType()).getDesc() + "编号已存在"); +// } + List pointInfoList2 = pointInfoMapper.selectList(new QueryWrapper().eq("point_name", pointInfo.getPointName())); + if (!pointInfoList2.isEmpty()) { + throw new ServiceException(PointTypeEnum.getByEnumName(pointInfo.getPointType()).getDesc() + "名称已存在"); + } + + Long regionId = pointInfo.getBelongingRegionId(); + if (Objects.nonNull(regionId)) { + RegionInfo regionInfo = regionInfoMapper.selectById(regionId); + String ancestors = regionInfo.getAncestors(); + String[] ancestorsArr = ancestors.split(RegionConstants.DIVISION_COMMA); + switch (ancestorsArr.length) { + case 1: + pointInfo.setForestId(regionId); + break; + case 2: + pointInfo.setForestId(Long.valueOf(ancestorsArr[1])); + pointInfo.setFarmId(regionId); + break; + case 3: + pointInfo.setForestId(Long.valueOf(ancestorsArr[1])); + pointInfo.setFarmId(Long.valueOf(ancestorsArr[2])); + pointInfo.setFenceId(regionId); + break; + case 4: + pointInfo.setForestId(Long.valueOf(ancestorsArr[1])); + pointInfo.setFarmId(Long.valueOf(ancestorsArr[2])); + pointInfo.setFenceId(Long.valueOf(ancestorsArr[3])); + break; + } + } + + return pointInfoMapper.insert(pointInfo); + } + + @Override + public Integer delete(Long id) { + //TODO 删除点位信息时,需要提醒用户该点位信息下是否有设备,如果有设备,则不允许删除 + return pointInfoMapper.deleteById(id); + } + + @Override + public Integer update(PointInfo pointInfo) { + +// List pointInfoList1 = pointInfoMapper.selectList(new QueryWrapper().eq("point_no", pointInfo.getPointNo()).ne("id", pointInfo.getId())); +// if (!pointInfoList1.isEmpty()) { +// throw new ServiceException(PointTypeEnum.getByEnumName(pointInfo.getPointType()).getDesc() + "编号已存在"); +// } + List pointInfoList2 = pointInfoMapper.selectList(new QueryWrapper().eq("point_name", pointInfo.getPointName()).ne("id", pointInfo.getId())); + if (!pointInfoList2.isEmpty()) { + throw new ServiceException(PointTypeEnum.getByEnumName(pointInfo.getPointType()).getDesc() + "名称已存在"); + } + + PointInfo originalPointInfo = pointInfoMapper.selectById(pointInfo.getId()); + if (!Objects.equals(originalPointInfo.getBelongingRegionId(), pointInfo.getBelongingRegionId())) { + Long regionId = pointInfo.getBelongingRegionId(); + RegionInfo regionInfo = regionInfoMapper.selectById(regionId); + String ancestors = regionInfo.getAncestors(); + String[] ancestorsArr = ancestors.split(RegionConstants.DIVISION_COMMA); + switch (ancestorsArr.length) { + case 1: + pointInfo.setForestId(regionId); + break; + case 2: + pointInfo.setForestId(Long.valueOf(ancestorsArr[1])); + pointInfo.setFarmId(regionId); + break; + case 3: + pointInfo.setForestId(Long.valueOf(ancestorsArr[1])); + pointInfo.setFarmId(Long.valueOf(ancestorsArr[2])); + pointInfo.setFenceId(regionId); + break; + case 4: + pointInfo.setForestId(Long.valueOf(ancestorsArr[1])); + pointInfo.setFarmId(Long.valueOf(ancestorsArr[2])); + pointInfo.setFenceId(Long.valueOf(ancestorsArr[3])); + break; + } + } + + return pointInfoMapper.updateById(pointInfo); + } + + @Override + public List selectAll(PointInfo pointInfo) { + //接口调整,可灵活的的根据不同的参数来查询,方便查询云台、卡口、机场 + return pointInfoMapper.selectList(new QueryWrapper() + .like(StringUtils.isNotBlank(pointInfo.getPointNo()), "point_no", pointInfo.getPointNo()) + .like(StringUtils.isNotBlank(pointInfo.getPointName()), "point_name", pointInfo.getPointName()) + .eq(StringUtils.isNotBlank(pointInfo.getPointType()), "point_type", pointInfo.getPointType()) + .eq(Objects.nonNull(pointInfo.getForestId()), "forest_id", pointInfo.getForestId()) + .eq(Objects.nonNull(pointInfo.getFarmId()), "farm_id", pointInfo.getFarmId()) + .eq(Objects.nonNull(pointInfo.getFenceId()), "fence_id", pointInfo.getFenceId()) + .in(!CollectionUtils.isEmpty(pointInfo.getPointTypeList()), "point_type", pointInfo.getPointTypeList()) + ); + } + + @Override + public Integer deleteBatch(List idList) { + return pointInfoMapper.deleteBatchIds(idList); + } + + @Override + public List selectList(PointInfo pointInfo) { + // 此处pointType 是必填的 + List pointInfoList = pointInfoMapper.selectList(new QueryWrapper().lambda() + .eq(StringUtils.isNotBlank(pointInfo.getPointType()), PointInfo::getPointType, pointInfo.getPointType()) + .in(StringUtils.isBlank(pointInfo.getPointType()), PointInfo::getPointType, Arrays.asList(PointTypeEnum.PTZ.name(), PointTypeEnum.BAYONET.name(), PointTypeEnum.WATER_SOURCE.name())) + .eq(Objects.nonNull(pointInfo.getBelongingRegionId()), PointInfo::getBelongingRegionId, pointInfo.getBelongingRegionId()) + .eq(Objects.nonNull(pointInfo.getForestId()), PointInfo::getForestId, pointInfo.getForestId()) + .eq(Objects.nonNull(pointInfo.getFarmId()), PointInfo::getFarmId, pointInfo.getFarmId()) + .eq(Objects.nonNull(pointInfo.getFenceId()), PointInfo::getFenceId, pointInfo.getFenceId()) + .like(StringUtils.isNotBlank(pointInfo.getAdministrativeDivision()), PointInfo::getAdministrativeDivision, pointInfo.getAdministrativeDivision()) + .like(StringUtils.isNotBlank(pointInfo.getPointName()), PointInfo::getPointName, pointInfo.getPointName()) + .orderByDesc(PointInfo::getCreatedTime) + ); + return pointInfoList; + } + + @Override + public List queryMonitoringPoint(PointInfo pointInfo) { + List pointInfoList = pointInfoMapper.selectList(new QueryWrapper().lambda() + .eq(StringUtils.isNotBlank(pointInfo.getPointType()), PointInfo::getPointType, pointInfo.getPointType()) + .in(StringUtils.isBlank(pointInfo.getPointType()), PointInfo::getPointType, Arrays.asList(PointTypeEnum.PTZ.name(), PointTypeEnum.BAYONET.name())) + .eq(Objects.nonNull(pointInfo.getForestId()), PointInfo::getForestId, pointInfo.getForestId()) + .eq(Objects.nonNull(pointInfo.getFarmId()), PointInfo::getFarmId, pointInfo.getFarmId()) + .eq(Objects.nonNull(pointInfo.getFenceId()), PointInfo::getFenceId, pointInfo.getFenceId()) + ); + //DO -> VO , 将所属区域名称设置进去 + Map regionIdToNameMap = commonService.regionMapIdToName(null); + List voList = BeanUtils.copyList(pointInfoList, PointAndDeviceInfoVO.class); + List pointIdList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(voList)) { + pointIdList = voList.stream().map(PointAndDeviceInfoVO::getId).collect(Collectors.toList()); + //需要将设备信息挂在云台、卡口下面 + List deviceInfoList = deviceInfoMapper.selectList(new QueryWrapper().lambda() + .in(DeviceInfo::getPointId, pointIdList) + .eq(DeviceInfo::getEnableFlag, 1) + ); + List simpleVOList = BeanUtils.copyList(deviceInfoList, DeviceInfoSimpleVO.class); + Map> deviceInfoMap = simpleVOList.stream().collect(Collectors.groupingBy(DeviceInfoSimpleVO::getPointId)); + voList.forEach(pointInfoVO -> { + String forestName = regionIdToNameMap.get(pointInfoVO.getForestId()) == null ? "" : regionIdToNameMap.get(pointInfoVO.getForestId()); + String farmName = regionIdToNameMap.get(pointInfoVO.getFarmId()) == null ? "" : regionIdToNameMap.get(pointInfoVO.getFarmId()); + String fenceName = regionIdToNameMap.get(pointInfoVO.getFenceId()) == null ? "" : regionIdToNameMap.get(pointInfoVO.getFenceId()); + pointInfoVO.setBelongingRegionName(forestName + (StringUtils.isEmpty(farmName) ? "" : "/" + farmName) + (StringUtils.isEmpty(fenceName) ? "" : "/" + fenceName)); + pointInfoVO.setDeviceInfoList(deviceInfoMap.get(pointInfoVO.getId()) == null ? new ArrayList<>() : deviceInfoMap.get(pointInfoVO.getId())); + }); + } + return voList; + } +/** + * 设备快捷修改启用/停用状态接口 + */ + @Override + public Integer updateEnableFlag(PointInfo pointInfo) { + Integer result = pointInfoMapper.updateById(pointInfo); + return result; + }//sgq2025.3.20 + + @Override + public PointStatisticsByPointTypeVO statisticsByPointType() { + PointStatisticsByPointTypeVO vo = pointInfoMapper.statisticsByPointType(); + vo.setTotalNum(vo.getPtzNum() + vo.getBayonetNum() + vo.getWaterSourceNum()); + return vo; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/RegionInfoServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/RegionInfoServiceImpl.java new file mode 100644 index 0000000..f41172c --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/RegionInfoServiceImpl.java @@ -0,0 +1,249 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.constant.RegionConstants; +import com.tcctyn.common.core.web.domain.TreeSelect; +import com.tcctyn.common.core.web.domain.entity.RegionInfo; +import com.tcctyn.common.core.exception.ServiceException; +import com.tcctyn.common.core.utils.SpringUtils; +import com.tcctyn.iot.forestfire.enums.AreaTypeEnum; +import com.tcctyn.iot.forestfire.mapper.RegionInfoMapper; +import com.tcctyn.iot.forestfire.service.IRegionInfoService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + *

+ * 区域信息表 服务实现类 + *

+ * + * @author 代超 + * @since 2024-09-24 + */ +@Service +public class RegionInfoServiceImpl extends ServiceImpl implements IRegionInfoService { + + + @Resource + private RegionInfoMapper regionInfoMapper; + + @Override + public Page list(Integer pageNo, Integer pageSize) { + return regionInfoMapper.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<>()); + } + + @Override + public RegionInfo getById(Long id) { + RegionInfo regionInfo = regionInfoMapper.selectById(id); + return regionInfo; + } + + @Override + public Integer create(RegionInfo regionInfo) { + // 需要对地区编号、地区名称做校验 + List regionInfoList1 = regionInfoMapper.selectList(new QueryWrapper().eq("area_no", regionInfo.getAreaNo())); + if (!regionInfoList1.isEmpty()) { + throw new ServiceException(AreaTypeEnum.getByEnumName(regionInfo.getAreaType()).getDesc() + "编号已存在"); + } + + List regionInfoList2 = regionInfoMapper.selectList(new QueryWrapper().eq("area_name", regionInfo.getAreaName())); + if (!regionInfoList2.isEmpty()) { + throw new ServiceException(AreaTypeEnum.getByEnumName(regionInfo.getAreaType()).getDesc() + "名称已存在"); + } + if (regionInfo.getParentId() == 0) { + regionInfo.setAncestors("0"); + } else { + regionInfo.setAncestors(regionInfoMapper.selectById(regionInfo.getParentId()).getAncestors() + RegionConstants.DIVISION_COMMA + regionInfo.getParentId()); + } + + return regionInfoMapper.insert(regionInfo); + } + + @Override + public Integer delete(Long id) { + return regionInfoMapper.deleteById(id); + } + + @Override + public Integer update(RegionInfo regionInfo) { + // 需要对地区编号、地区名称做校验 + List regionInfoList1 = regionInfoMapper.selectList(new QueryWrapper().eq("area_no", regionInfo.getAreaNo()).ne("id", regionInfo.getId())); + if (!regionInfoList1.isEmpty()) { + throw new ServiceException(AreaTypeEnum.getByEnumName(regionInfo.getAreaType()).getDesc() + "编号已存在"); + } + + List regionInfoList2 = regionInfoMapper.selectList(new QueryWrapper().eq("area_name", regionInfo.getAreaName()).ne("id", regionInfo.getId())); + if (!regionInfoList2.isEmpty()) { + throw new ServiceException(AreaTypeEnum.getByEnumName(regionInfo.getAreaType()).getDesc() + "名称已存在"); + } + if (regionInfo.getParentId() == 0) { + regionInfo.setAncestors("0"); + } else { + //如果存在跨级的调整时,以父级的全路径为准 + regionInfo.setAncestors(regionInfoMapper.selectById(regionInfo.getParentId()).getAncestors() + RegionConstants.DIVISION_COMMA + regionInfo.getParentId()); + } + return regionInfoMapper.updateById(regionInfo); + } + + @Override + public List selectList(RegionInfo regionInfo) { + //只对父级id为 0 的林区做分页查询 查询条件:区域名称、区域编号、运营状态、行政区划 + List regionInfoList = regionInfoMapper.selectList(new QueryWrapper().eq("parent_id", 0) + .like(StringUtils.isNotBlank(regionInfo.getAreaNo()), "area_no", regionInfo.getAreaNo()) + .like(StringUtils.isNotBlank(regionInfo.getAreaName()), "area_name", regionInfo.getAreaName()) + .like(StringUtils.isNotBlank(regionInfo.getAdministrativeDivision()), "administrative_division", regionInfo.getAdministrativeDivision()) + .eq(StringUtils.isNotBlank(regionInfo.getOperationStatus()), "operation_status", regionInfo.getOperationStatus()) + ); + //判断当前节点下是否有子节点,有子节点给hasChildren置为true + Map hasChildrenMap = new HashMap<>(); + List parentIdList = regionInfoList.stream().map(RegionInfo::getId).collect(Collectors.toList()); + if (!parentIdList.isEmpty()) { + List childrenList = regionInfoMapper.selectList(new QueryWrapper().lambda().in(RegionInfo::getParentId, parentIdList)); + if (!childrenList.isEmpty()) { + for (RegionInfo child : childrenList) { + hasChildrenMap.put(child.getParentId(), child.isHasChildren()); + } + } + } + for (RegionInfo item : regionInfoList) { + item.setHasChildren(Objects.isNull(hasChildrenMap.get(item.getId())) ? false : true); + } + return regionInfoList; + + } + + @Override + public List selectAllByParentId(Long parentId) { + List regionInfoList = regionInfoMapper.selectList(new QueryWrapper().eq("parent_id", parentId)); + Map hasChildrenMap = new HashMap<>(); + List parentIdList = regionInfoList.stream().map(RegionInfo::getId).collect(Collectors.toList()); + if (!parentIdList.isEmpty()) { + List childrenList = regionInfoMapper.selectList(new QueryWrapper().lambda().in(RegionInfo::getParentId, parentIdList)); + if (!childrenList.isEmpty()) { + for (RegionInfo child : childrenList) { + hasChildrenMap.put(child.getParentId(), child.isHasChildren()); + } + } + } + for (RegionInfo item : regionInfoList) { + item.setHasChildren(Objects.isNull(hasChildrenMap.get(item.getId())) ? false : true); + } + return regionInfoList; + } + + @Override + public List selectAll(Integer level) { + //实现思路:将所有的数据全部查出来,通过程序来进行递归组装,形成区域信息树 + List regionInfoList = regionInfoMapper.selectList(new QueryWrapper()); + //从父节点为0开始查询父子级 + List rootList = getChildren(regionInfoList, 0L, level); + return rootList; + } + + @Override + public List selectAllByAreaType(String areaType) { + return regionInfoMapper.selectList(new QueryWrapper().eq("area_type", areaType)); + } + + @Override + public List selectRegionTree(RegionInfo regionInfo) { + List regionInfoList = SpringUtils.getAopProxy(this).selectRegionList(regionInfo); + return buildRegionTreeSelect(regionInfoList); + } + + @Override + public List selectRegionList(RegionInfo regionInfo) { + return regionInfoMapper.selectList(new QueryWrapper().orderByAsc("parent_id")); + } + + @Override + public List buildRegionTreeSelect(List regionInfoList) { + List regionTrees = buildRegionTree(regionInfoList); + return regionTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + @Override + public List buildRegionTree(List regionInfoList) { + List returnList = new ArrayList(); + List tempList = regionInfoList.stream().map(RegionInfo::getId).collect(Collectors.toList()); + for (RegionInfo regionInfo : regionInfoList) { + // 如果是顶级节点, 遍历该父节点的所有子节点 + if (!tempList.contains(regionInfo.getParentId())) { + recursionFn(regionInfoList, regionInfo); + returnList.add(regionInfo); + } + } + if (returnList.isEmpty()) { + returnList = regionInfoList; + } + return returnList; + } + + /** + * 递归列表 + */ + private void recursionFn(List list, RegionInfo t) { + // 得到子节点列表 + List childList = getChildList(list, t); + t.setChildren(childList); + for (RegionInfo tChild : childList) { + if (hasChild(list, tChild)) { + recursionFn(list, tChild); + } + } + } + + /** + * 得到子节点列表 + */ + private List getChildList(List list, RegionInfo t) { + List tlist = new ArrayList<>(); + Iterator it = list.iterator(); + while (it.hasNext()) { + RegionInfo n = (RegionInfo) it.next(); + if (com.tcctyn.common.core.utils.StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getId().longValue()) { + tlist.add(n); + } + } + return tlist; + } + + /** + * 判断是否有子节点 + */ + private boolean hasChild(List list, RegionInfo t) { + return getChildList(list, t).size() > 0; + } + + + /** + * 递归遍历根节点集合,组装子节点 + * 可以选择层级,没有层级时用null值,有层级需要传入相应的层级即可;层级至少为1层 + * + * @param regionInfoList + * @param parentId + * @return + */ + private List getChildren(List regionInfoList, Long parentId, Integer level) { + List parentList = regionInfoList.stream().filter(regionInfo1 -> regionInfo1.getParentId().equals(parentId)).collect(Collectors.toList()); + if (level == 0) { + for (RegionInfo regionInfo : parentList) { + regionInfo.setChildren(getChildren(regionInfoList, regionInfo.getId(), level)); + } + } else { + if (level > 1) { + for (RegionInfo regionInfo : parentList) { + regionInfo.setChildren(getChildren(regionInfoList, regionInfo.getId(), level - 1)); + } + } + } + return parentList; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/RoadInfoServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/RoadInfoServiceImpl.java new file mode 100644 index 0000000..216080d --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/RoadInfoServiceImpl.java @@ -0,0 +1,34 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.iot.forestfire.domain.RoadInfo; +import com.tcctyn.iot.forestfire.mapper.RoadInfoMapper; +import com.tcctyn.iot.forestfire.mapper.RoadMapper; +import com.tcctyn.iot.forestfire.service.IRoadInfoService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + *

+ * 林间道路详细信息表 服务实现类 + *

+ * + * @author jason + * @since 2025-03-11 + */ +@Service +public class RoadInfoServiceImpl extends ServiceImpl implements IRoadInfoService { + + @Resource + private RoadMapper roadMapper; + + @Resource + private RoadInfoMapper roadInfoMapper; + + + @Override + public Integer create(RoadInfo roadInfo) { + return roadInfoMapper.insert(roadInfo); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/RoadServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/RoadServiceImpl.java new file mode 100644 index 0000000..0e377a8 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/RoadServiceImpl.java @@ -0,0 +1,209 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.constant.RegionConstants; +import com.tcctyn.common.core.web.domain.entity.RegionInfo; +import com.tcctyn.common.core.web.domain.model.LoginUser; +import com.tcctyn.common.core.exception.ServiceException; +import com.tcctyn.common.core.utils.StringUtils; +import com.tcctyn.iot.forestfire.domain.Road; +import com.tcctyn.iot.forestfire.domain.RoadInfo; +import com.tcctyn.iot.forestfire.mapper.RegionInfoMapper; +import com.tcctyn.iot.forestfire.mapper.RoadInfoMapper; +import com.tcctyn.iot.forestfire.mapper.RoadMapper; +import com.tcctyn.iot.forestfire.searcher.road.RoadSearcher; +import com.tcctyn.iot.forestfire.service.IRoadInfoService; +import com.tcctyn.iot.forestfire.service.IRoadService; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import static com.tcctyn.common.core.utils.SecurityUtils.getLoginUser; + +/** + *

+ * 林间道路信息表 服务实现类 + *

+ * + * @author jason + * @since 2025-03-11 + */ +@Service +public class RoadServiceImpl extends ServiceImpl implements IRoadService { + @Resource + private RoadMapper roadMapper; + + @Resource + private RegionInfoMapper regionInfoMapper; + @Resource + private RoadInfoMapper roadInfoMapper; + + @Resource + private IRoadInfoService roadInfoService; + + @Override + public Integer create(Road road) { + List rList = roadMapper.selectList(new QueryWrapper().eq("road_name", road.getRoadName())); + if (!rList.isEmpty()) { + throw new ServiceException("道路名称已存在"); + } + + Long regionId = road.getBelongingRegionId(); + if (Objects.nonNull(regionId)) { + RegionInfo regionInfo = regionInfoMapper.selectById(regionId); + String ancestors = regionInfo.getAncestors(); + String[] ancestorsArr = ancestors.split(RegionConstants.DIVISION_COMMA); + switch (ancestorsArr.length) { + case 1: + road.setForestId(regionId); + break; + case 2: + road.setForestId(Long.valueOf(ancestorsArr[1])); + road.setFarmId(regionId); + break; + case 3: + road.setForestId(Long.valueOf(ancestorsArr[1])); + road.setFarmId(Long.valueOf(ancestorsArr[2])); + road.setFenceId(regionId); + break; + case 4: + road.setForestId(Long.valueOf(ancestorsArr[1])); + road.setFarmId(Long.valueOf(ancestorsArr[2])); + road.setFenceId(Long.valueOf(ancestorsArr[3])); + break; + } + } + LoginUser loginUser = getLoginUser(); + road.setCreatedBy(loginUser.getUsername()); + Integer result = roadMapper.insert(road); + + // 批量处理特征点数据 + if (ObjectUtils.isNotEmpty(road.getRoadInfoList())) { + //道路特征数据 + List infoList = road.getRoadInfoList(); + List roadInfoList = new ArrayList<>(); + infoList.forEach(info -> { + RoadInfo roadInfo = new RoadInfo(); + roadInfo.setRoadId(road.getId()); + roadInfo.setAddress(info.getAddress()); + roadInfo.setCoordinates(info.getCoordinates()); + roadInfo.setSortNo(info.getSortNo()); + roadInfo.setDelFlag(0); + roadInfo.setSlope(info.getSlope()); + roadInfo.setCamber(info.getCamber()); + roadInfo.setWidth(info.getWidth()); + roadInfo.setRoadPicture(info.getRoadPicture()); + roadInfo.setRemark(info.getRemark()); + roadInfo.setFeatureType(info.getFeatureType()); + roadInfoList.add(roadInfo); + }); + roadInfoService.saveOrUpdateBatch(roadInfoList); + } + + + return result; + } + + @Override + public Integer update(Road road) { + List rList = roadMapper.selectList(new QueryWrapper().eq("road_name", road.getRoadName()).ne("id", road.getId())); + if (!rList.isEmpty()) { + throw new ServiceException("道路名称已存在"); + } + + Road roadV = roadMapper.selectById(road.getId()); + if(roadV==null){ + throw new ServiceException("数据不存在"); + } + if (!Objects.equals(roadV.getBelongingRegionId(), road.getBelongingRegionId())) { + Long regionId = road.getBelongingRegionId(); + RegionInfo regionInfo = regionInfoMapper.selectById(regionId); + String ancestors = regionInfo.getAncestors(); + String[] ancestorsArr = ancestors.split(RegionConstants.DIVISION_COMMA); + switch (ancestorsArr.length) { + case 1: + road.setForestId(regionId); + break; + case 2: + road.setForestId(Long.valueOf(ancestorsArr[1])); + road.setFarmId(regionId); + break; + case 3: + road.setForestId(Long.valueOf(ancestorsArr[1])); + road.setFarmId(Long.valueOf(ancestorsArr[2])); + road.setFenceId(regionId); + break; + case 4: + road.setForestId(Long.valueOf(ancestorsArr[1])); + road.setFarmId(Long.valueOf(ancestorsArr[2])); + road.setFenceId(Long.valueOf(ancestorsArr[3])); + break; + } + } + + if (!road.getRoadInfoList().isEmpty()) { + List infoList = road.getRoadInfoList(); + + //新增和修改的数组 + List upList = new ArrayList<>(); + + for (RoadInfo ri : infoList) { + RoadInfo info = new RoadInfo(); + if (Objects.isNull(ri.getId())) { + info.setRoadId(road.getId()); + info.setAddress(ri.getAddress()); + info.setCoordinates(ri.getCoordinates()); + info.setWidth(ri.getWidth()); + info.setFeatureType(ri.getFeatureType()); + info.setSlope(ri.getSlope()); + info.setCamber(ri.getCamber()); + info.setRoadPicture(ri.getRoadPicture()); + info.setRemark(ri.getRemark()); + info.setSortNo(ri.getSortNo()); + info.setDelFlag(0); + LoginUser loginUser = getLoginUser(); + info.setCreatedBy(loginUser.getUsername()); + upList.add(info); + } else { + LoginUser loginUser = getLoginUser(); + ri.setUpdatedBy(loginUser.getUsername()); + upList.add(ri); + } + } + roadInfoService.saveOrUpdateBatch(upList); + } + Integer result = roadMapper.updateById(road); + return result; + } + + @Override + public Page selectPageList(RoadSearcher roadSearcher) { + QueryWrapper wrapper = new QueryWrapper().eq("del_flag", 0); + // 动态添加条件 + if (StringUtils.isNotEmpty(roadSearcher.getRoadNo())) { + wrapper.like("road_no", roadSearcher.getRoadNo()); + } + if (StringUtils.isNotEmpty(roadSearcher.getRoadName())) { + wrapper.like("road_name", roadSearcher.getRoadName()); + } + if (roadSearcher.getBelongingRegionId() != null) { + wrapper.eq("belonging_region_id", roadSearcher.getBelongingRegionId()); + } + if (roadSearcher.getForestId() != null) { + wrapper.eq("forest_id", roadSearcher.getForestId()); + } + if (roadSearcher.getFarmId() != null) { + wrapper.eq("farm_id", roadSearcher.getFarmId()); + } + if (roadSearcher.getFenceId() != null) { + wrapper.eq("fence_id", roadSearcher.getFenceId()); + } + return roadMapper.selectPage(new Page<>(roadSearcher.getPageNo(), roadSearcher.getPageSize()), wrapper); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/SatelliteDataSimulationServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/SatelliteDataSimulationServiceImpl.java new file mode 100644 index 0000000..c49562f --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/SatelliteDataSimulationServiceImpl.java @@ -0,0 +1,132 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.AirportVO; +import com.tcctyn.iot.forestfire.domain.DeviceInfo; +import com.tcctyn.iot.forestfire.domain.SatelliteDataSimulation; +import com.tcctyn.iot.forestfire.enums.DeviceTypeEnum; +import com.tcctyn.iot.forestfire.mapper.DeviceInfoMapper; +import com.tcctyn.iot.forestfire.mapper.SatelliteDataSimulationMapper; +import com.tcctyn.iot.forestfire.service.ISatelliteDataSimulationService; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +/** + *

+ * 卫星数据模拟表 服务实现类 + *

+ * + * @author 代超 + * @since 2024-11-05 + */ +@Service +public class SatelliteDataSimulationServiceImpl extends ServiceImpl implements ISatelliteDataSimulationService { + + + @Resource + private SatelliteDataSimulationMapper satelliteDataSimulationMapper; + + @Resource + private DeviceInfoMapper deviceInfoMapper; + + @Override + public Page list(Integer pageNo, Integer pageSize) { + return satelliteDataSimulationMapper.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<>()); + } + + @Override + public SatelliteDataSimulation getById(Long id) { + SatelliteDataSimulation satelliteDataSimulation = satelliteDataSimulationMapper.selectById(id); + return satelliteDataSimulation; + } + + @Override + public Integer create(SatelliteDataSimulation satelliteDataSimulation) { + return satelliteDataSimulationMapper.insert(satelliteDataSimulation); + } + + @Override + public Integer delete(Long id) { + return satelliteDataSimulationMapper.deleteById(id); + } + + @Override + public Integer update(SatelliteDataSimulation satelliteDataSimulation) { + return satelliteDataSimulationMapper.updateById(satelliteDataSimulation); + } + + @Override + public List selectRecentlyData(Date currentTime) { + List list = satelliteDataSimulationMapper.selectRecentlyData(currentTime); + return list; + } + + @Override + public AirportVO reduceRisk(Long id) { + SatelliteDataSimulation satelliteDataSimulation = satelliteDataSimulationMapper.selectById(id); + Double longitude = Double.valueOf(satelliteDataSimulation.getLongitude()); + Double latitude = Double.valueOf(satelliteDataSimulation.getLatitude()); + //查询所有的机场 + List airportList = deviceInfoMapper.selectList(new QueryWrapper().lambda() + .eq(DeviceInfo::getDeviceType, DeviceTypeEnum.AIRPORT.name()) + ); + List voList = BeanUtils.copyList(airportList, AirportVO.class); + AirportVO nearestAirport = null; + //找出距离最近的机场 + if (!CollectionUtils.isEmpty(voList)) { + nearestAirport = findNearestAirport(longitude, latitude, voList); + } + satelliteDataSimulationMapper.reduceRisk(id); + return nearestAirport; + } + + /** + * 获取两点之间的距离 + * 两点之间的距离,单位为公里 + * + * @param lon1 第一个点经度 + * @param lat1 第一个点纬度 + * @param lon2 第二个点经度 + * @param lat2 第二个点纬度 + * @return + */ + public double haversine(double lon1, double lat1, double lon2, double lat2) { + //地区半径km + final double EARTH_RADIUS = 6371; + double dLat = Math.toRadians(lat2 - lat1); + double dLon = Math.toRadians(lon2 - lon1); + + lat1 = Math.toRadians(lat1); + lat2 = Math.toRadians(lat2); + + double a = Math.pow(Math.sin(dLat / 2), 2) + + Math.pow(Math.sin(dLon / 2), 2) * Math.cos(lat1) * Math.cos(lat2); + double c = 2 * Math.asin(Math.sqrt(a)); + + return EARTH_RADIUS * c; + } + + /** + * 给出火情经纬度与机场对象List,计算并返回距离最近的机场 + */ + public AirportVO findNearestAirport(Double longitude, Double latitude, List airportList) { + AirportVO result = null; + double minDistance = Double.MAX_VALUE; + for (AirportVO airport : airportList) { + double distance = haversine(longitude, latitude, Double.valueOf(airport.getLongitude()), Double.valueOf(airport.getLatitude())); + if (distance < minDistance) { + minDistance = distance; + result = airport; + } + } + return result; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/SchedulePlanServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/SchedulePlanServiceImpl.java new file mode 100644 index 0000000..e815c7d --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/SchedulePlanServiceImpl.java @@ -0,0 +1,273 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.web.domain.entity.RegionInfo; +import com.tcctyn.common.core.utils.DateUtils; +import com.tcctyn.iot.forestfire.domain.SchedulePlan; +import com.tcctyn.iot.forestfire.domain.ScheduleTemplate; +import com.tcctyn.iot.forestfire.domain.Schedules; +import com.tcctyn.iot.forestfire.mapper.SchedulePlanMapper; +import com.tcctyn.iot.forestfire.service.IRegionInfoService; +import com.tcctyn.iot.forestfire.service.ISchedulePlanService; +import com.tcctyn.iot.forestfire.service.IScheduleTemplateService; +import com.tcctyn.iot.forestfire.service.ISchedulesService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** +*

+* 排班计划 服务实现类 +*

+* +* @author liuzh +* @since 2024-10-16 +*/ +@Service +public class SchedulePlanServiceImpl extends ServiceImpl implements ISchedulePlanService { + + @Resource + private SchedulePlanMapper schedulePlanMapper; + + @Resource + private ISchedulesService schedulesService; + + @Resource + private IScheduleTemplateService scheduleTemplateService; + + @Resource + private IRegionInfoService regionInfoService; + + @Override + public List list(SchedulePlan schedulePlan) { + List schedulePlanList = schedulePlanMapper.selectList(new QueryWrapper().setEntity(schedulePlan)); + return schedulePlanList; + } + + @Override + public SchedulePlan getById(Long id) { + SchedulePlan schedulePlan = schedulePlanMapper.selectById(id); + return schedulePlan; + } + + @Override + public Integer create(SchedulePlan schedulePlan) { + //根据 belongingRegionId 查询出所属区域信息 + RegionInfo regionInfo = regionInfoService.getById(schedulePlan.getBelongingRegionId()); + String[] splitAncestors = regionInfo.getAncestors().split(","); + if(splitAncestors.length == 2){ + schedulePlan.setForestId(Long.valueOf(splitAncestors[1])); + schedulePlan.setFarmId(regionInfo.getId()); + } else if (splitAncestors.length == 3) { + schedulePlan.setForestId(Long.valueOf(splitAncestors[1])); + schedulePlan.setFarmId(Long.valueOf(splitAncestors[2])); + schedulePlan.setFenceId(regionInfo.getId()); + } else { + schedulePlan.setForestId(regionInfo.getId()); + } + return schedulePlanMapper.insert(schedulePlan); + } + + @Override + public Integer delete(Long id) { + return schedulePlanMapper.deleteById(id); + } + + @Override + public Integer update(SchedulePlan schedulePlan) { + //检查belongRegionId是否被修改 + if (!schedulePlan.getBelongingRegionId().equals(schedulePlanMapper.selectById(schedulePlan.getPlanId()).getBelongingRegionId())){ + //belongingRegionId被修改,需要更新表中的 forestId, farmId, fenceId + RegionInfo regionInfo = regionInfoService.getById(schedulePlan.getBelongingRegionId()); + String[] splitAncestors = regionInfo.getAncestors().split(","); + if(splitAncestors.length == 2){ + schedulePlan.setForestId(Long.valueOf(splitAncestors[1])); + schedulePlan.setFarmId(regionInfo.getId()); + } else if (splitAncestors.length == 3) { + schedulePlan.setForestId(Long.valueOf(splitAncestors[1])); + schedulePlan.setFarmId(Long.valueOf(splitAncestors[2])); + schedulePlan.setFenceId(regionInfo.getId()); + } else { + schedulePlan.setForestId(regionInfo.getId()); + } + } + return schedulePlanMapper.updateById(schedulePlan); + } + + /** + * 生成排班信息 + * @param schedulePlan + * @return + */ + @Override + public Integer generate(SchedulePlan schedulePlan) { + int result = 0; + Date startDate = schedulePlan.getStartDate(); + Date endDate = schedulePlan.getEndDate(); + //如果传入开始日期在当前日期之前,用当前日期替换 + if (schedulePlan.getStartDate().before(DateUtils.getNowDate())){ + startDate = DateUtils.getNowDate(); + } + + List scheduleTemplates = scheduleTemplateService.getByPlanId(schedulePlan.getPlanId()); + if (scheduleTemplates.size() == 0){ + return 0; + } + //遍历scheduleTemplates,添加排班信息 + for (ScheduleTemplate scheduleTemplate : scheduleTemplates){ + //从开始日期到结束日期循环添加排班信息 + List newList = new ArrayList<>(); + for (Date date = startDate; date.before(DateUtils.addDays(endDate, 1)); date = DateUtils.addDays(date,1)){ + //获取当前日期对应的星期几 + int dayOfWeek = DateUtils.getWeek(date); + switch (dayOfWeek) { + case 1: + //周一 + //判断用户ID列表是否为空 + if(!scheduleTemplate.getMonUsers().isEmpty()){ + for (String userId : scheduleTemplate.getMonUsers().split(",")) { + Schedules schedules = new Schedules(); + schedules.setPlanId(scheduleTemplate.getPlanId()); + schedules.setUserId(Long.valueOf(userId)); + schedules.setBelongingRegionId(scheduleTemplate.getBelongingRegionId()); + schedules.setForestId(scheduleTemplate.getForestId()); + schedules.setFarmId(scheduleTemplate.getFarmId()); + schedules.setFenceId(scheduleTemplate.getFenceId()); + schedules.setPathId(scheduleTemplate.getPathId()); + schedules.setDayOfWeek(1); + schedules.setDateOfWeek(date); + newList.add(schedules); + } + } + break; + case 2: + //周二 + if (!scheduleTemplate.getTueUsers().isEmpty()){ + for (String userId : scheduleTemplate.getTueUsers().split(",")) { + Schedules schedules = new Schedules(); + schedules.setPlanId(scheduleTemplate.getPlanId()); + schedules.setUserId(Long.valueOf(userId)); + schedules.setBelongingRegionId(scheduleTemplate.getBelongingRegionId()); + schedules.setForestId(scheduleTemplate.getForestId()); + schedules.setFarmId(scheduleTemplate.getFarmId()); + schedules.setFenceId(scheduleTemplate.getFenceId()); + schedules.setPathId(scheduleTemplate.getPathId()); + schedules.setDayOfWeek(2); + schedules.setDateOfWeek(date); + newList.add(schedules); + } + } + break; + case 3: + //周三 + if (!scheduleTemplate.getWedUsers().isEmpty()){ + for (String userId : scheduleTemplate.getWedUsers().split(",")) { + Schedules schedules = new Schedules(); + schedules.setPlanId(scheduleTemplate.getPlanId()); + schedules.setUserId(Long.valueOf(userId)); + schedules.setBelongingRegionId(scheduleTemplate.getBelongingRegionId()); + schedules.setForestId(scheduleTemplate.getForestId()); + schedules.setFarmId(scheduleTemplate.getFarmId()); + schedules.setFenceId(scheduleTemplate.getFenceId()); + schedules.setPathId(scheduleTemplate.getPathId()); + schedules.setDayOfWeek(3); + schedules.setDateOfWeek(date); + newList.add(schedules); + } + } + break; + case 4: + //周四 + if (!scheduleTemplate.getThurUsers().isEmpty()){ + for (String userId : scheduleTemplate.getThurUsers().split(",")) { + Schedules schedules = new Schedules(); + schedules.setPlanId(scheduleTemplate.getPlanId()); + schedules.setUserId(Long.valueOf(userId)); + schedules.setBelongingRegionId(scheduleTemplate.getBelongingRegionId()); + schedules.setForestId(scheduleTemplate.getForestId()); + schedules.setFarmId(scheduleTemplate.getFarmId()); + schedules.setFenceId(scheduleTemplate.getFenceId()); + schedules.setPathId(scheduleTemplate.getPathId()); + schedules.setDayOfWeek(4); + schedules.setDateOfWeek(date); + newList.add(schedules); + } + } + break; + case 5: + //周五 + if (!scheduleTemplate.getFriUsers().isEmpty()){ + for (String userId : scheduleTemplate.getFriUsers().split(",")) { + Schedules schedules = new Schedules(); + schedules.setPlanId(scheduleTemplate.getPlanId()); + schedules.setUserId(Long.valueOf(userId)); + schedules.setBelongingRegionId(scheduleTemplate.getBelongingRegionId()); + schedules.setForestId(scheduleTemplate.getForestId()); + schedules.setFarmId(scheduleTemplate.getFarmId()); + schedules.setFenceId(scheduleTemplate.getFenceId()); + schedules.setPathId(scheduleTemplate.getPathId()); + schedules.setDayOfWeek(5); + schedules.setDateOfWeek(date); + newList.add(schedules); + } + } + break; + case 6: + //周六 + if (!scheduleTemplate.getSatUsers().isEmpty()){ + for (String userId : scheduleTemplate.getSatUsers().split(",")) { + Schedules schedules = new Schedules(); + schedules.setPlanId(scheduleTemplate.getPlanId()); + schedules.setUserId(Long.valueOf(userId)); + schedules.setBelongingRegionId(scheduleTemplate.getBelongingRegionId()); + schedules.setForestId(scheduleTemplate.getForestId()); + schedules.setFarmId(scheduleTemplate.getFarmId()); + schedules.setFenceId(scheduleTemplate.getFenceId()); + schedules.setPathId(scheduleTemplate.getPathId()); + schedules.setDayOfWeek(6); + schedules.setDateOfWeek(date); + newList.add(schedules); + } + } + break; + case 7: + //周日 + if (!scheduleTemplate.getSunUsers().isEmpty()){ + for (String userId : scheduleTemplate.getSunUsers().split(",")) { + Schedules schedules = new Schedules(); + schedules.setPlanId(scheduleTemplate.getPlanId()); + schedules.setUserId(Long.valueOf(userId)); + schedules.setBelongingRegionId(scheduleTemplate.getBelongingRegionId()); + schedules.setForestId(scheduleTemplate.getForestId()); + schedules.setFarmId(scheduleTemplate.getFarmId()); + schedules.setFenceId(scheduleTemplate.getFenceId()); + schedules.setPathId(scheduleTemplate.getPathId()); + schedules.setDayOfWeek(7); + schedules.setDateOfWeek(date); + newList.add(schedules); + } + } + break; + default: + break; + } + } + //批量保存排班信息 + schedulesService.saveBatch(newList); + result += newList.size(); + + } + if (result > 0) { + //更新 gen_flag + schedulePlanMapper.update(null, new UpdateWrapper().eq("plan_id", schedulePlan.getPlanId()).set("gen_flag", 1)); + } + return result; + + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/ScheduleSwapServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/ScheduleSwapServiceImpl.java new file mode 100644 index 0000000..4919b57 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/ScheduleSwapServiceImpl.java @@ -0,0 +1,54 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.iot.forestfire.domain.ScheduleSwap; +import com.tcctyn.iot.forestfire.mapper.ScheduleSwapMapper; +import com.tcctyn.iot.forestfire.service.IScheduleSwapService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** +*

+* 调班记录 服务实现类 +*

+* +* @author liuzh +* @since 2024-10-19 +*/ +@Service +public class ScheduleSwapServiceImpl extends ServiceImpl implements IScheduleSwapService { + + + @Resource + private ScheduleSwapMapper scheduleSwapMapper; + + @Override + public Page list(Integer pageNo, Integer pageSize) { + return scheduleSwapMapper.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<>()); + } + + @Override + public ScheduleSwap getById(Long id) { + ScheduleSwap scheduleSwap = scheduleSwapMapper.selectById(id); + return scheduleSwap; + } + + @Override + public Integer create(ScheduleSwap scheduleSwap) { + return scheduleSwapMapper.insert(scheduleSwap); + } + + @Override + public Integer delete(Long id) { + return scheduleSwapMapper.deleteById(id); + } + + @Override + public Integer update(ScheduleSwap scheduleSwap) { + return scheduleSwapMapper.updateById(scheduleSwap); + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/ScheduleTaskService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/ScheduleTaskService.java new file mode 100644 index 0000000..4da07da --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/ScheduleTaskService.java @@ -0,0 +1,253 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.tcctyn.iot.forestfire.BO.ScopeSimulationBO; +import com.tcctyn.iot.forestfire.domain.SatelliteDataSimulation; +import com.tcctyn.iot.forestfire.mapper.SatelliteDataSimulationMapper; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 临时方案: + * 暂时采用定时任务模拟生成卫星监测数据 + */ +@Service +public class ScheduleTaskService { + + @Resource + private SatelliteDataSimulationMapper satelliteDataSimulationMapper; + + /** + * 生成卫星数据,每15分钟生成一波数据 + * 有四个林场,每个林场模拟五个范围,每个范围每十五分钟生成一波数据 + * 模拟数据:温度、湿度、甲烷浓度、经度、纬度 + */ + @Scheduled(fixedDelay = 900000) + public void generateSatelliteData() { + + //当前时间 + Date currentDate = new Date(); + + //温度范围 + double minTemp = 20.0; + double maxTemp = 100.0; + + //安全温度范围 + double minSafeTemp = 20.0; + double maxSafeTemp = 35.0; + + //湿度范围(%制) + double minHumidity = 20.0; + double maxHumidity = 100.0; + + //安全湿度范围(%制) + double minSafeHumidity = 30.0; + double maxSafeHumidity = 60.0; + + //甲烷浓度范围(%制) + double minMethaneConcentration = 0.0; + double maxMethaneConcentration = 30.0; + + //安全甲烷浓度范围(%制) + double minSafeMethaneConcentration = 0.0; + double maxSafeMethaneConcentration = 1.25; + + //大气压力安全范围 + double minPressure = 80.0; + double maxPressure = 82.0; + + //风速范围 + double minWindSpeed = 0.0; + double maxWindSpeed = 2.0; + + //风向范围 + double minWindDirection = 0; + double maxWindDirection = 360; + + //降雨范围 + double minRainfall = 0.0; + double maxRainfall = 5.0; + + List addList = new ArrayList<>(20); + + //给定二十个经纬度范围,四个林场,每个林场取五个范围 + List boList = new ArrayList<>(20); + //天文台 + boList.add(new ScopeSimulationBO(102.78853, 102.79227, 25.0327, 25.0353)); + boList.add(new ScopeSimulationBO(102.79767, 102.80179, 25.03406, 25.03693)); + boList.add(new ScopeSimulationBO(102.79368, 102.79742, 25.0318, 25.03371)); + boList.add(new ScopeSimulationBO(102.79578, 102.7993, 25.02714, 25.0297)); + boList.add(new ScopeSimulationBO(102.79021, 102.79463, 25.02437, 25.02749)); + //矣六 + boList.add(new ScopeSimulationBO(102.79739, 102.8016, 24.94421, 24.94763)); + boList.add(new ScopeSimulationBO(102.80657, 102.81104, 24.94242, 24.94717)); + boList.add(new ScopeSimulationBO(102.81193, 102.81639, 24.94813, 24.95199)); + boList.add(new ScopeSimulationBO(102.81059, 102.81561, 24.95413, 24.95778)); + boList.add(new ScopeSimulationBO(102.81856, 102.82139, 24.95463, 24.95938)); + + //呼马山 + boList.add(new ScopeSimulationBO(102.76823, 102.77098, 25.05649, 25.05906)); + boList.add(new ScopeSimulationBO(102.77189, 102.77589, 25.05466, 25.05754)); + boList.add(new ScopeSimulationBO(102.77138, 102.77428, 25.05756, 25.05999)); + boList.add(new ScopeSimulationBO(102.77415, 102.77646, 25.06004, 25.06205)); + boList.add(new ScopeSimulationBO(102.77282, 102.77599, 25.06264, 25.06388)); + + //茶高山 + boList.add(new ScopeSimulationBO(102.81115, 102.81832, 24.97494, 24.97836)); + boList.add(new ScopeSimulationBO(102.81192, 102.81943, 24.97039, 24.97416)); + boList.add(new ScopeSimulationBO(102.81377, 102.82115, 24.96595, 24.96918)); + boList.add(new ScopeSimulationBO(102.81479, 102.82183, 24.9636, 24.96598)); + boList.add(new ScopeSimulationBO(102.81377, 102.81862, 24.9593, 24.96195)); + + //如果此前的该区域已经做过降风险 + List satelliteDataSimulations = satelliteDataSimulationMapper.selectRecentlyData(currentDate); + List riskReducedScopeNoList = satelliteDataSimulations.stream().filter(item -> item.getRiskReduceFlag() == 1) + .map(item -> item.getRegionScopeNo()).collect(Collectors.toList()); + + + //循环生成20条数据 + for (int i = 0; i < boList.size(); i++) { + SatelliteDataSimulation satelliteDataSimulation = new SatelliteDataSimulation(); + satelliteDataSimulation.setTerminalNo("11889"); + satelliteDataSimulation.setUploadTime(currentDate); + satelliteDataSimulation.setSerialNumber(String.valueOf(i)); + satelliteDataSimulation.setCollectTime(currentDate); + + String temperature = generateRandomTemperature(minTemp, maxTemp); + String humidity = generateRandomHumidity(minHumidity, maxHumidity); + String methaneConcentration = generateRandomMethaneConcentration(minMethaneConcentration, maxMethaneConcentration); + Integer regionScopeNo = i + 1; + if (!CollectionUtils.isEmpty(riskReducedScopeNoList) && riskReducedScopeNoList.contains(regionScopeNo)) { + temperature = generateRandomTemperature(minSafeTemp, maxSafeTemp); + humidity = generateRandomHumidity(minSafeHumidity, maxSafeHumidity); + methaneConcentration = generateRandomMethaneConcentration(minSafeMethaneConcentration, maxSafeMethaneConcentration); + } + satelliteDataSimulation.setTemperature(temperature); + satelliteDataSimulation.setHumidity(humidity); + satelliteDataSimulation.setPressure(generateRandomPressure(minPressure, maxPressure)); + satelliteDataSimulation.setWindSpeed(generateRandomWindSpeed(minWindSpeed, maxWindSpeed)); + satelliteDataSimulation.setWindDirection(generateRandomWindDirection(minWindDirection, maxWindDirection)); + satelliteDataSimulation.setRainfall(generateRandomRainfall(minRainfall, maxRainfall)); + satelliteDataSimulation.setMethaneConcentration(methaneConcentration); + satelliteDataSimulation.setLongitude(generateRandomLongitude(boList.get(i).getMinLongitude(), boList.get(i).getMaxLongitude())); + satelliteDataSimulation.setLatitude(generateRandomLatitude(boList.get(i).getMinLatitude(), boList.get(i).getMaxLatitude())); + satelliteDataSimulation.setRegionScopeNo(regionScopeNo); + satelliteDataSimulation.setRiskLevel(calculateRiskLevel(Double.parseDouble(temperature), Double.parseDouble(humidity), Double.parseDouble(methaneConcentration))); + satelliteDataSimulation.setRiskReduceFlag(0); + addList.add(satelliteDataSimulation); + } + satelliteDataSimulationMapper.insertBatchSomeColumn(addList); + } + + /** + * 生成随机温度 + */ + public String generateRandomTemperature(double minTemp, double maxTemp) { + double randomTemp = minTemp + (maxTemp - minTemp) * Math.random(); + return String.format("%.2f", randomTemp); + } + + /** + * 生成随机湿度 + */ + public String generateRandomHumidity(double minHumidity, double maxHumidity) { + double randomHumidity = minHumidity + (maxHumidity - minHumidity) * Math.random(); + return String.format("%.2f", randomHumidity); + } + + /** + * 生成随机甲烷浓度 + */ + public String generateRandomMethaneConcentration(double minMethaneConcentration, double maxMethaneConcentration) { + double randomMethaneConcentration = minMethaneConcentration + (maxMethaneConcentration - minMethaneConcentration) * Math.random(); + return String.format("%.2f", randomMethaneConcentration); + } + + /** + * 生成随机经度 + */ + public String generateRandomLongitude(double minLongitude, double maxLongitude) { + double randomLongitude = minLongitude + (maxLongitude - minLongitude) * Math.random(); + return String.format("%.5f", randomLongitude); + } + + /** + * 生成随机纬度 + */ + public String generateRandomLatitude(double minLatitude, double maxLatitude) { + double randomLatitude = minLatitude + (maxLatitude - minLatitude) * Math.random(); + return String.format("%.5f", randomLatitude); + } + + /** + * 生成随机大气压力 + */ + public String generateRandomPressure(double minPressure, double maxPressure) { + double randomPressure = minPressure + (maxPressure - minPressure) * Math.random(); + return String.format("%.2f", randomPressure); + } + + /** + * 生成随机风速 + */ + public String generateRandomWindSpeed(double minWindSpeed, double maxWindSpeed) { + double randomWindSpeed = minWindSpeed + (maxWindSpeed - minWindSpeed) * Math.random(); + return String.format("%.2f", randomWindSpeed); + } + + /** + * 生成随机风向 + */ + public String generateRandomWindDirection(double minWindDirection, double maxWindDirection) { + double randomWindDirection = minWindDirection + (maxWindDirection - minWindDirection) * Math.random(); + return String.format("%.0f", randomWindDirection); + } + + /** + * 生成随机雨量 + */ + public String generateRandomRainfall(double minRainfall, double maxRainfall) { + double randomRainfall = minRainfall + (maxRainfall - minRainfall) * Math.random(); + return String.format("%.2f", randomRainfall); + } + + /** + * 计算风险值 (此处计算公式并不严谨,需要注意) + * + * @param temperature + * @param methaneLevel + * @param humidity + * @return + */ + public Integer calculateRiskLevel(double temperature, double humidity, double methaneLevel) { + if (temperature < 30 || humidity > 70) { + return 0; + } + if (temperature >= 30 && temperature <= 45) { + if (humidity < 30 || (methaneLevel > 0.1 && methaneLevel <= 1.25)) { + return 2; + } + if (humidity >= 30 && humidity <= 60 || (methaneLevel > 0.1 && methaneLevel <= 1.25)) { + return 1; + } + } + if (temperature > 45 && temperature < 75) { + if (humidity < 30 || (methaneLevel > 0.1 && methaneLevel <= 1.25)) { + return 3; + } + if (humidity >= 30 && humidity <= 60 || (methaneLevel > 0.1 && methaneLevel <= 1.25)) { + return 2; + } + } + if (temperature >= 75 || humidity < 20 || methaneLevel > 5) { + return 3; + } + return 0; + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/ScheduleTemplateServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/ScheduleTemplateServiceImpl.java new file mode 100644 index 0000000..d0a77b5 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/ScheduleTemplateServiceImpl.java @@ -0,0 +1,117 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.VO.ScheduleTemplateVO; +import com.tcctyn.iot.forestfire.domain.PatrolPath; +import com.tcctyn.iot.forestfire.domain.ScheduleTemplate; +import com.tcctyn.iot.forestfire.mapper.ScheduleTemplateMapper; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.iot.forestfire.service.IPatrolPathService; +import com.tcctyn.iot.forestfire.service.IScheduleTemplateService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** +*

+* 排班模板 服务实现类 +*

+* +* @author liuzh +* @since 2024-10-16 +*/ +@Service +public class ScheduleTemplateServiceImpl extends ServiceImpl implements IScheduleTemplateService { + + + @Resource + private ScheduleTemplateMapper scheduleTemplateMapper; + + @Resource + private IPatrolPathService patrolPathService; + + @Resource + private ICommonService commonService; + + @Override + public List list(ScheduleTemplate scheduleTemplate) { + List templateList = scheduleTemplateMapper.selectList(new QueryWrapper().eq("plan_id",scheduleTemplate.getPlanId())); + + if(templateList.size() > 0){ + List templateVOList = new ArrayList<>(); + templateList.forEach(template -> { + //查询路线id对应的路线名称 + ScheduleTemplateVO scheduleTemplateVO = new ScheduleTemplateVO(); + BeanUtils.copyBeanProp(template,scheduleTemplateVO); + scheduleTemplateVO.setPathName(patrolPathService.getById(template.getPathId()).getPathName()); + templateVOList.add(scheduleTemplateVO); + }); + + return templateVOList; + }else { + //如果排班计划下还没有模板信息,则返回路线列表 + //根据 belongingRegionId 查询路线 + List patrolPathList = patrolPathService.selectByRegionId(scheduleTemplate.getBelongingRegionId()); + List templateVOList = new ArrayList<>(); + patrolPathList.forEach(path -> { + ScheduleTemplateVO scheduleTemplateVO = new ScheduleTemplateVO(); + scheduleTemplateVO.setPlanId(scheduleTemplate.getPlanId()); + scheduleTemplateVO.setPathId(path.getId()); + scheduleTemplateVO.setPathName(path.getPathName()); + templateVOList.add(scheduleTemplateVO); + }); + return templateVOList; + } + } + + @Override + public ScheduleTemplate getById(Long id) { + ScheduleTemplate scheduleTemplate = scheduleTemplateMapper.selectById(id); + return scheduleTemplate; + } + + @Override + public Integer create(ScheduleTemplate scheduleTemplate) { + return scheduleTemplateMapper.insert(scheduleTemplate); + } + + @Override + public Integer delete(Long id) { + return scheduleTemplateMapper.deleteById(id); + } + + @Override + public Integer update(ScheduleTemplate scheduleTemplate) { + return scheduleTemplateMapper.updateById(scheduleTemplate); + } + + /** + * 根据排班计划id获取排班模板 + * @param planId + * @return + */ + @Override + public List getByPlanId(Long planId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("plan_id",planId); + List list = scheduleTemplateMapper.selectList(queryWrapper); + + return list; + } + + /** + * 批量创建 + * @param scheduleTemplateList + * @return + */ + @Override + public boolean createBatch(List scheduleTemplateList) { + + return this.saveOrUpdateBatch(scheduleTemplateList); + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/SchedulesServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/SchedulesServiceImpl.java new file mode 100644 index 0000000..89f9f92 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/SchedulesServiceImpl.java @@ -0,0 +1,608 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.tcctyn.common.core.exception.ServiceException; +import com.tcctyn.common.core.utils.DateUtils; +import com.tcctyn.common.core.utils.StringUtils; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.iot.forestfire.BO.PointInfoBO; +import com.tcctyn.iot.forestfire.BO.PositionBO; +import com.tcctyn.iot.forestfire.BO.SysUserBO; +import com.tcctyn.iot.forestfire.VO.*; +import com.tcctyn.iot.forestfire.domain.*; +import com.tcctyn.iot.forestfire.enums.PointTypeEnum; +import com.tcctyn.iot.forestfire.mapper.*; +import com.tcctyn.iot.forestfire.searcher.schedules.ScheduleSwapSearcher; +import com.tcctyn.iot.forestfire.searcher.schedules.SchedulesSearcher; +import com.tcctyn.iot.forestfire.service.ICommonService; +import com.tcctyn.iot.forestfire.service.IScheduleSwapService; +import com.tcctyn.iot.forestfire.service.ISchedulesService; +import com.tcctyn.system.api.RemoteUserService; +import com.tcctyn.system.api.domain.SysUser; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.time.YearMonth; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + *

+ * 排班表 服务实现类 + *

+ * + * @author liuzh + * @since 2024-09-24 + */ + +@Service +public class SchedulesServiceImpl extends ServiceImpl implements ISchedulesService { + + @Resource + private SchedulesMapper schedulesMapper; + + @Resource + private ICommonService commonService; + + @Resource + private CheckInRecordMapper checkInRecordMapper; + + @Resource + private PointInfoMapper pointInfoMapper; + + @Resource + private PatrolPathMapper patrolPathMapper; + + @Resource + private IScheduleSwapService scheduleSwapService; + + @Resource + private TemporaryTaskMapper temporaryTaskMapper; + + @Resource + private RemoteUserService remoteUserService; + + /** + * 查询一周的排班信息 + * + * @param schedules + * @return + */ + public List weekList(Schedules schedules) { + //根据传入日期查一周的排班信息,查询条件增加林场id + MPJLambdaWrapper mpjLambdaWrapper = JoinWrappers.lambda(Schedules.class) + .select(Schedules::getScheduleId, Schedules::getUserId, Schedules::getShiftId, Schedules::getPathId, Schedules::getDayOfWeek, Schedules::getDateOfWeek) + .select(SysUser::getUserName) + .select(Shift::getShiftName) + .select(PatrolPath::getPathName) + .leftJoin(SysUser.class, SysUser::getUserId, Schedules::getUserId) + .leftJoin(Shift.class, Shift::getShiftId, Schedules::getShiftId) + .leftJoin(PatrolPath.class, PatrolPath::getId, Schedules::getPathId) + .between(Schedules::getDateOfWeek, DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.getThisWeekMonday(schedules.getDateOfWeek())), DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.getThisWeekSunday(schedules.getDateOfWeek()))) + .eqIfExists(Schedules::getUserId, schedules.getUserId()) + .eqIfExists(PatrolPath::getBelongingRegionId, schedules.getForestId()); + //关联查询用户信息、班次、路线 + List weeklist = schedulesMapper.selectJoinList(ScheduleDetail.class, mpjLambdaWrapper); + return weeklist; + } + + /** + * 从周排班信息中提取出每个用户的排班信息 + * + * @param weeklist + * @return + */ + @Override + public List> list(List weeklist, Schedules schedules) { + //weeklist按userName分组 +// Map> groupByUserName = weeklist.stream().collect(Collectors.groupingBy(SceduleDetail::getUserName)); + //weeklist按路线id分组 + Map> groupByPathId = weeklist.stream().collect(Collectors.groupingBy(ScheduleDetail::getPathId)); + List> resultList = new ArrayList<>(); + for (Map.Entry> entry : groupByPathId.entrySet()) { + TreeMap oneMap = new TreeMap<>(); + oneMap.put("pathId", entry.getKey()); + //获取传入日期所在周的周一 + Date currentMonday = DateUtils.getThisWeekMonday(schedules.getDateOfWeek()); + //从周一开始将这周的日期转为字符串并作为key存入 + oneMap.put(DateUtils.parseDateToStr("yyyy-MM-dd", currentMonday), ""); + for (int i = 1; i <= 6; i++) { + oneMap.put(DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.addDays(currentMonday, i)), ""); + } + //获取分组后的数据 + List oneList = entry.getValue(); + for (ScheduleDetail s : oneList) { + oneMap.put("pathName", s.getPathName()); + //用户id拼接 + if (!oneMap.get(s.getDateOfWeek()).toString().isEmpty()) { + oneMap.put(s.getDateOfWeek(), oneMap.get(s.getDateOfWeek()) + "," + s.getUserId()); + } else { + oneMap.put(s.getDateOfWeek(), String.valueOf(s.getUserId())); + } + } + resultList.add(oneMap); + } + return resultList; + } + + /** + * 生成下周的排班信息 + * + * @return + */ + @Override + public boolean generate() { + String nextWeek = DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.addDays(new Date(), 7)); + //判断下周是否已存在排班信息 + if (schedulesMapper.selectCount(new QueryWrapper().eq("date_of_week", nextWeek)) > 0) { + return false; + } + //查询本周所有排班信息 + List weekList = schedulesMapper.selectList(new QueryWrapper().between("date_of_week", DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.getThisWeekMonday(new Date())), DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.getThisWeekSunday(new Date())))); + //创建一个list保存新的排班信息 + List newList = new ArrayList<>(); + //weekList中每一条记录的日期增加7天 + for (Schedules schedules : weekList) { + Schedules newSchedules = new Schedules(); + newSchedules.setUserId(schedules.getUserId()); + newSchedules.setShiftId(schedules.getShiftId()); + newSchedules.setPathId(schedules.getPathId()); + newSchedules.setDayOfWeek(schedules.getDayOfWeek()); + newSchedules.setDateOfWeek(DateUtils.addDays(schedules.getDateOfWeek(), 7)); + newList.add(newSchedules); + } + + return this.saveBatch(newList); + + } + + @Override + public Schedules getById(Long id) { + Schedules schedules = schedulesMapper.selectById(id); + return schedules; + } + + @Override + public Integer create(Schedules schedules) { + return schedulesMapper.insert(schedules); + } + + @Override + public Integer delete(Long id) { + return schedulesMapper.deleteById(id); + } + + @Override + public Integer update(Schedules schedules) { + return schedulesMapper.updateById(schedules); + } + + /** + * 批量创建或更新排班信息 + * + * @param scheduleDetail + * @return + */ + @Override + public Integer createBatch(ScheduleDetail scheduleDetail) { + int result = 0; + //传入的userIds拆分,并转换成Long类型的list + List newUserIds = Arrays.stream(scheduleDetail.getUserIds().split(",")).map(Long::parseLong).collect(Collectors.toList()); + //根据传入路线id和日期查询用户排班列表 + List schedulesList = schedulesMapper.selectList(new QueryWrapper().eq("path_id", scheduleDetail.getPathId()).eq("date_of_week", scheduleDetail.getDateOfWeek())); + + //如果schedulesList为空,则直接插入 + if (schedulesList.isEmpty()) { + for (Long userId : newUserIds) { + Schedules newSchedules = new Schedules(); + newSchedules.setUserId(userId); + newSchedules.setPathId(scheduleDetail.getPathId()); + newSchedules.setDateOfWeek(DateUtils.parseDate(scheduleDetail.getDateOfWeek())); + result += schedulesMapper.insert(newSchedules); + } + return result; + } else { + //从查询结果中获取已排班用户id + List oldUserIds = schedulesList.stream().map(Schedules::getUserId).collect(Collectors.toList()); + //用户id取交集: 如果没有交集,则删除旧的,插入新的 + List intersection = newUserIds.stream().filter(oldUserIds::contains).collect(Collectors.toList()); + if (intersection.isEmpty()) { + schedulesMapper.delete(new QueryWrapper().eq("path_id", scheduleDetail.getPathId()).eq("date_of_week", scheduleDetail.getDateOfWeek())); + for (Long userId : newUserIds) { + Schedules newSchedules = new Schedules(); + newSchedules.setUserId(userId); + newSchedules.setPathId(scheduleDetail.getPathId()); + newSchedules.setDateOfWeek(DateUtils.parseDate(scheduleDetail.getDateOfWeek())); + result += schedulesMapper.insert(newSchedules); + } + } else { + //有交集的情况,取两个集合中不同的用户id,能查到的删除,不能查到的插入 + List differenceIds = new ArrayList<>(); + differenceIds.addAll(newUserIds); + differenceIds.addAll(oldUserIds); + differenceIds.removeAll(intersection); + + for (Long userId : differenceIds) { + if (schedulesMapper.selectCount(new QueryWrapper().eq("user_id", userId).eq("path_id", scheduleDetail.getPathId()).eq("date_of_week", scheduleDetail.getDateOfWeek())) > 0) { + schedulesMapper.delete(new QueryWrapper().eq("user_id", userId).eq("path_id", scheduleDetail.getPathId()).eq("date_of_week", scheduleDetail.getDateOfWeek())); + } else { + Schedules newSchedules = new Schedules(); + newSchedules.setUserId(userId); + newSchedules.setPathId(scheduleDetail.getPathId()); + newSchedules.setDateOfWeek(DateUtils.parseDate(scheduleDetail.getDateOfWeek())); + result += schedulesMapper.insert(newSchedules); + } + } + } + } + + return result; + } + + @Override + public List selectList(Schedules schedules, Date startDate, Date endDate, String userName) { + MPJLambdaWrapper queryWrapper = JoinWrappers.lambda(Schedules.class) + .select(Schedules::getScheduleId, Schedules::getUserId, Schedules::getShiftId, Schedules::getPathId, Schedules::getDayOfWeek, Schedules::getDateOfWeek) + .leftJoin(SysUser.class, SysUser::getUserId, Schedules::getUserId) + .between(Objects.nonNull(startDate) && Objects.nonNull(endDate), Schedules::getDateOfWeek, startDate, endDate); + + if (StringUtils.isNotBlank(userName)) { + queryWrapper.like(SysUser::getUserName, userName); + } + + return schedulesMapper.selectJoinList(Schedules.class, queryWrapper); + } + + + + @Override + public Integer swapSchedule(ScheduleSwapSearcher scheduleSwapSearcher) { + //查询申请人的排班信息 + Schedules swapSchedule1 = schedulesMapper.selectOne(new QueryWrapper().eq("user_id", scheduleSwapSearcher.getApplicantId()).eq("date_of_week", scheduleSwapSearcher.getSwapDate())); + //查询被替换者的排班信息 + Schedules swapSchedule2 = schedulesMapper.selectOne(new QueryWrapper().eq("user_id", scheduleSwapSearcher.getReplacerId()).eq("date_of_week", scheduleSwapSearcher.getBackDate())); + + swapSchedule1.setUserId(scheduleSwapSearcher.getReplacerId()); + swapSchedule1.setSwapFlag(1); + int result1 = schedulesMapper.updateById(swapSchedule1); + if (result1 > 0) { + ScheduleSwap scheduleSwap = new ScheduleSwap(); + scheduleSwap.setScheduleId(swapSchedule1.getScheduleId()); + scheduleSwap.setPathId(swapSchedule1.getPathId()); + scheduleSwap.setBeforeUser(scheduleSwapSearcher.getApplicantId()); + scheduleSwap.setAfterUser(scheduleSwapSearcher.getReplacerId()); + scheduleSwap.setDescription(scheduleSwapSearcher.getReason()); + scheduleSwapService.create(scheduleSwap); + } + + swapSchedule2.setUserId(scheduleSwapSearcher.getApplicantId()); + swapSchedule2.setSwapFlag(1); + int result2 = schedulesMapper.updateById(swapSchedule2); + if (result2 > 0) { + ScheduleSwap scheduleSwap = new ScheduleSwap(); + scheduleSwap.setScheduleId(swapSchedule2.getScheduleId()); + scheduleSwap.setPathId(swapSchedule2.getPathId()); + scheduleSwap.setBeforeUser(scheduleSwapSearcher.getReplacerId()); + scheduleSwap.setAfterUser(scheduleSwapSearcher.getApplicantId()); + scheduleSwap.setDescription(scheduleSwapSearcher.getReason()); + scheduleSwapService.create(scheduleSwap); + } + + return result1 + result2; + } + + + @Override + public List queryRangerInfo(SchedulesSearcher params) { + List schedulesList = schedulesMapper.selectList(new QueryWrapper().lambda() + .eq(Objects.nonNull(params.getForestId()), Schedules::getForestId, params.getForestId()) + .eq(Objects.nonNull(params.getFarmId()), Schedules::getFarmId, params.getFarmId()) + .eq(Objects.nonNull(params.getFenceId()), Schedules::getFenceId, params.getFenceId()) + .between(Objects.nonNull(params.getStartTime()) && Objects.nonNull(params.getEndTime()), Schedules::getDateOfWeek, params.getStartTime(), params.getEndTime())); + List pathIdList = schedulesList.stream().map(Schedules::getPathId).distinct().collect(Collectors.toList()); + + Map userIdAndBOMap = commonService.userMapIdToBO(null); + //查询当日路径下的打卡记录 + List checkInRecordList = checkInRecordMapper.selectList(new QueryWrapper().lambda() + .in(!CollectionUtils.isEmpty(pathIdList), CheckInRecord::getPathId, pathIdList) + .between(Objects.nonNull(params.getStartTime()) && Objects.nonNull(params.getEndTime()), CheckInRecord::getCheckInTime, params.getStartTime(), params.getEndTime()) + .eq(CheckInRecord::getEffectiveFlag, 1) + .orderByAsc(CheckInRecord::getCheckInTime)); + Map pathIdAndPositionMap = new HashMap<>(checkInRecordList.size()); + + // 上面倒序排,查到的位置信息保留的是最近的一个,组装当前位置信息 + for (CheckInRecord checkInRecord : checkInRecordList) { + PositionBO positionBO = new PositionBO(checkInRecord.getLongitude(), checkInRecord.getLatitude(), checkInRecord.getHeight()); + pathIdAndPositionMap.put(checkInRecord.getPathId(), positionBO); + } + + // 巡护路径下的所有点位信息 ,查询巡护点与打卡点 + List pointInfoList = pointInfoMapper.selectList(new QueryWrapper().lambda() + .in(!CollectionUtils.isEmpty(pathIdList), PointInfo::getBelongingRegionId, pathIdList).and(p -> { + p.eq(PointInfo::getPointType, PointTypeEnum.CHECK_IN_POINT.name()).or().eq(PointInfo::getPointType, PointTypeEnum.PATROL_POINT.name()); + }) + ); + Map defaultPositionMap = pointInfoList.stream().filter(pointInfo -> Objects.equals(1, pointInfo.getSortNo())).collect(Collectors.toMap(PointInfo::getBelongingRegionId, pointInfo -> pointInfo)); + + // 按路径id分组 + Map> pathIdAndPointInfoList = pointInfoList.stream().collect(Collectors.groupingBy(PointInfo::getBelongingRegionId)); + + // 查询巡护路径,获取路径名称信息 + List pathInfoList = patrolPathMapper.selectList(new QueryWrapper().lambda().in(!CollectionUtils.isEmpty(pathIdList), PatrolPath::getId, pathIdList)); + Map pathIdAndNameMap = pathInfoList.stream().collect(Collectors.toMap(PatrolPath::getId, PatrolPath::getPathName)); + + + //返回数据组装 + List rangerInfoVOList = new ArrayList<>(); + for (Schedules schedules : schedulesList) { + RangerInfoVO rangerInfoVO = new RangerInfoVO(); + rangerInfoVO.setUserId(schedules.getUserId()); + rangerInfoVO.setUserName(userIdAndBOMap.get(schedules.getUserId()).getNickName()); + rangerInfoVO.setPhonenumber(userIdAndBOMap.get(schedules.getUserId()).getPhonenumber()); + + // 当前位置 ,需要对Map做判空处理 + rangerInfoVO.setCurrentLongitude(pathIdAndPositionMap.get(schedules.getPathId()) == null ? null : pathIdAndPositionMap.get(schedules.getPathId()).getLongitude()); + rangerInfoVO.setCurrentLatitude(pathIdAndPositionMap.get(schedules.getPathId()) == null ? null : pathIdAndPositionMap.get(schedules.getPathId()).getLatitude()); + rangerInfoVO.setCurrentHeight(pathIdAndPositionMap.get(schedules.getPathId()) == null ? null : pathIdAndPositionMap.get(schedules.getPathId()).getHeight()); + + // 默认位置 + rangerInfoVO.setDefaultLongitude(defaultPositionMap.get(schedules.getPathId()) == null ? null : defaultPositionMap.get(schedules.getPathId()).getLongitude()); + rangerInfoVO.setDefaultLatitude(defaultPositionMap.get(schedules.getPathId()) == null ? null : defaultPositionMap.get(schedules.getPathId()).getLatitude()); + rangerInfoVO.setDefaultHeight(defaultPositionMap.get(schedules.getPathId()) == null ? null : defaultPositionMap.get(schedules.getPathId()).getHeight()); + + + //路径id、路径名称 + rangerInfoVO.setPathId(schedules.getPathId()); + rangerInfoVO.setPathName(pathIdAndNameMap.get(schedules.getPathId())); + rangerInfoVO.setPointInfoList(BeanUtils.copyList(pathIdAndPointInfoList.get(schedules.getPathId()), PointInfoBO.class)); + + //路径下的点位信息 + rangerInfoVOList.add(rangerInfoVO); + } + + return rangerInfoVOList; + } + + @Override + public RangerStatisticsVO queryRangerStatistics(SchedulesSearcher params) { + //查询当天的排班信息,统计人员及巡护路径 + List schedulesList = schedulesMapper.selectList(new QueryWrapper().lambda() + .eq(Objects.nonNull(params.getForestId()), Schedules::getForestId, params.getForestId()) + .eq(Objects.nonNull(params.getFarmId()), Schedules::getFarmId, params.getFarmId()) + .eq(Objects.nonNull(params.getFenceId()), Schedules::getFenceId, params.getFenceId()) + .between(Objects.nonNull(params.getStartTime()) && Objects.nonNull(params.getEndTime()), Schedules::getDateOfWeek, params.getStartTime(), params.getEndTime()) + ); + List userIdList = new ArrayList<>(); + List pathIdList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(schedulesList)) { + //统计护林员人数 跟 护林路径 + userIdList = schedulesList.stream().map(Schedules::getUserId).distinct().collect(Collectors.toList()); + pathIdList = schedulesList.stream().map(Schedules::getPathId).distinct().collect(Collectors.toList()); + } + //统计当日排班下的所有路径的巡护点位 + List pointInfoList = pointInfoMapper.selectList(new QueryWrapper().lambda() + .in(!CollectionUtils.isEmpty(pathIdList), PointInfo::getBelongingRegionId, pathIdList) + .and(p -> { + p.eq(PointInfo::getPointType, PointTypeEnum.CHECK_IN_POINT.name()).or().eq(PointInfo::getPointType, PointTypeEnum.PATROL_POINT.name()); + }) + ); + // 统计当日打卡人数 + List checkInRecordList = checkInRecordMapper.selectList(new QueryWrapper().lambda() + .eq(Objects.nonNull(params.getForestId()), CheckInRecord::getForestId, params.getForestId()) + .eq(Objects.nonNull(params.getFarmId()), CheckInRecord::getFarmId, params.getFarmId()) + .eq(Objects.nonNull(params.getFenceId()), CheckInRecord::getFenceId, params.getFenceId()) + .eq(CheckInRecord::getEffectiveFlag, 1) + .between(Objects.nonNull(params.getStartTime()) && Objects.nonNull(params.getEndTime()), CheckInRecord::getCheckInTime, params.getStartTime(), params.getEndTime()) + ); + List checkInUserIdList = new ArrayList<>(); + List checkInPointIdList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(checkInRecordList)) { + checkInUserIdList = checkInRecordList.stream().map(CheckInRecord::getUserId).distinct().collect(Collectors.toList()); + checkInPointIdList = checkInRecordList.stream().map(CheckInRecord::getPointId).distinct().collect(Collectors.toList()); + } + + RangerStatisticsVO rangerStatisticsVO = new RangerStatisticsVO(); + rangerStatisticsVO.setSchedulingNum(userIdList.size()); + rangerStatisticsVO.setCheckInNum(checkInUserIdList.size()); + rangerStatisticsVO.setPatrolPointNum(pointInfoList.size()); + rangerStatisticsVO.setCheckInPointNum(checkInPointIdList.size()); + return rangerStatisticsVO; + } + + @Override + public List queryScheduleByCondition(SchedulesSearcher params) { + List schedulesList = schedulesMapper.selectList(new QueryWrapper() + .lambda().eq(Objects.nonNull(params.getForestId()), Schedules::getForestId, params.getForestId()) + .eq(Objects.nonNull(params.getFarmId()), Schedules::getFarmId, params.getFarmId()) + .eq(Objects.nonNull(params.getFenceId()), Schedules::getFenceId, params.getFenceId()) + .between(Objects.nonNull(params.getStartTime()) && Objects.nonNull(params.getEndTime()), Schedules::getDateOfWeek, params.getStartTime(), params.getEndTime()) + ); + Map pathIdAndNameMap = commonService.pathMapIdToName(null); + Map userIdAndNameMap = commonService.userMapIdToName(null); + List voList = BeanUtils.copyList(schedulesList, ScheduleVO.class); + voList.forEach(scheduleVO -> { + scheduleVO.setPathName(pathIdAndNameMap.get(scheduleVO.getPathId())); + scheduleVO.setUserName(userIdAndNameMap.get(scheduleVO.getUserId())); + }); + return voList; + } + + @Override + public ScheduleDetailInfoVO queryScheduleDetail(Long scheduleId) { + Schedules schedules = schedulesMapper.selectById(scheduleId); + //查询路径下的所有点位信息 + List pointInfoList = pointInfoMapper.selectList(new QueryWrapper() + .lambda().eq(PointInfo::getBelongingRegionId, schedules.getPathId()) + .and(p -> { + p.eq(PointInfo::getPointType, PointTypeEnum.CHECK_IN_POINT.name()).or().eq(PointInfo::getPointType, PointTypeEnum.PATROL_POINT.name()); + }) + ); + //查询路径下的已打卡点 + List checkInRecordList = checkInRecordMapper.selectList(new QueryWrapper() + .lambda().eq(CheckInRecord::getScheduleId, scheduleId) + .eq(CheckInRecord::getEffectiveFlag, 1) + ); + + // 获得已打卡的点位 + List checkedPointList = new ArrayList<>(); + Map pointIdAndCheckInTimeMap = new HashMap<>(checkInRecordList.size()); + if (!CollectionUtils.isEmpty(checkInRecordList)) { + checkedPointList = checkInRecordList.stream().map(CheckInRecord::getPointId).distinct().collect(Collectors.toList()); + pointIdAndCheckInTimeMap = checkInRecordList.stream().collect(Collectors.toMap(CheckInRecord::getPointId, CheckInRecord::getCheckInTime)); + } + List pointInfoBOList = BeanUtils.copyList(pointInfoList, PointInfoBO.class); + for (PointInfoBO pointInfoBO : pointInfoBOList) { + if (checkedPointList.contains(pointInfoBO.getId())) { + pointInfoBO.setCheckInFlag(true); + pointInfoBO.setCheckInTime(pointIdAndCheckInTimeMap.get(pointInfoBO.getId())); + } + } + ScheduleDetailInfoVO vo = new ScheduleDetailInfoVO(); + BeanUtils.copyProperties(schedules, vo); + vo.setPointInfoBOList(pointInfoBOList); + return vo; + } + + @Override + public ForesterStatisticsVO queryForesterStatistics(Long regionId) { + ForesterStatisticsVO foresterStatisticsVO = new ForesterStatisticsVO(); + + // 查询当日值班人数 + List schedulesList = schedulesMapper.selectList(new QueryWrapper() + .lambda().eq(Objects.nonNull(regionId), Schedules::getBelongingRegionId, regionId) + .eq(Schedules::getDateOfWeek, new Date()) + ); + if (CollectionUtils.isEmpty(schedulesList)) { + foresterStatisticsVO.setTodayDutyNum(0); + foresterStatisticsVO.setTodayCheckNum(0); + foresterStatisticsVO.setTotalCheckNum(0); + foresterStatisticsVO.setTempTaskNum(0); + return foresterStatisticsVO; + } + // 获取当日值班用户id列表 + List userIdList = schedulesList.stream().map(Schedules::getUserId).distinct().collect(Collectors.toList()); + foresterStatisticsVO.setTodayDutyNum(userIdList.size()); + // 获取当日值班路线id列表 + List pathIdList = schedulesList.stream().map(Schedules::getPathId).distinct().collect(Collectors.toList()); + + // 查询当日值班用户已打卡数量 + List checkInRecordList = checkInRecordMapper.selectList(new QueryWrapper() + .lambda().in(CheckInRecord::getUserId, userIdList) + .eq(CheckInRecord::getEffectiveFlag, 1) + .apply("date_format(check_in_time,'%Y%m%d')=" + "'" + DateUtils.dateTime() + "'") + ); + foresterStatisticsVO.setTodayCheckNum(checkInRecordList.size()); + // 查询当日总共需要打卡数量 + List pointInfoList = pointInfoMapper.selectList(new QueryWrapper() + .lambda().in(PointInfo::getBelongingRegionId, pathIdList) + .eq(PointInfo::getPointType, PointTypeEnum.CHECK_IN_POINT.name()) + ); + foresterStatisticsVO.setTotalCheckNum(pointInfoList.size()); + // 查询当日临时任务数量 + List temporaryTaskList = temporaryTaskMapper.selectList(new QueryWrapper() + .lambda().in(TemporaryTask::getTaskPersonId, userIdList) + .apply("date_format(issue_time,'%Y%m%d')=" + "'" + DateUtils.dateTime() + "'") + ); + foresterStatisticsVO.setTempTaskNum(temporaryTaskList.size()); + return foresterStatisticsVO; + } + + @Override + public List getUserScheduleStatus(Long regionId, Date queryDate) { + List userList = remoteUserService.selectUserByRegionIdList(regionId).getData(); + List userIds = userList.stream().map(SysUser::getUserId).collect(Collectors.toList()); + if (queryDate == null) { + queryDate = new Date(); + } + List voList = BeanUtils.copyList(userList, UserScheduleStatusVO.class); + List schedulesList = schedulesMapper.selectList(new QueryWrapper() + .lambda().in(Schedules::getUserId, userIds) + .eq(Schedules::getDateOfWeek, queryDate) + ); + if (!CollectionUtils.isEmpty(schedulesList)) { + Map schedulesMap = schedulesList.stream().collect(Collectors.toMap(Schedules::getUserId, Function.identity())); + for (UserScheduleStatusVO vo : voList) { + Schedules schedules = schedulesMap.get(vo.getUserId()); + if (schedules != null) { + vo.setScheduleId(schedules.getScheduleId()); + vo.setScheduleStatus(schedules.getStatus()); + } else { + vo.setScheduleStatus(0); + } + } + } + return voList; + } + + @Override + public ScheduleVO getUserSchedule(Long userId, Date date) { + //根据用户id获取当日排班 + //当天时间 yyyy-MM-dd,前端没有传时间的话,默认查询当天的,传了时间查询传的那天的 + String today = DateUtils.getDate(); + if (date != null) { + today = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, date); + } + Schedules schedules = schedulesMapper.selectOne(new QueryWrapper().lambda() + .eq(Schedules::getUserId, userId) + .eq(Schedules::getDateOfWeek, today) + ); + if (Objects.isNull(schedules)) { + throw new ServiceException("没有查到排班信息!"); + } + //查询已打卡记录 + List checkInRecordList = checkInRecordMapper.selectList(new QueryWrapper().lambda() + .eq(CheckInRecord::getUserId, userId) + .eq(CheckInRecord::getScheduleId, schedules.getScheduleId()) + .eq(CheckInRecord::getEffectiveFlag, 1) + ); + List pointInfoList = pointInfoMapper.selectList(new QueryWrapper() + .lambda().eq(PointInfo::getBelongingRegionId, schedules.getPathId()) + .and(p -> { + p.eq(PointInfo::getPointType, PointTypeEnum.CHECK_IN_POINT.name()).or().eq(PointInfo::getPointType, PointTypeEnum.PATROL_POINT.name()); + }) + ); + // 获得已打卡的点位 + List checkedPointList = new ArrayList<>(); + Map pointIdAndCheckInTimeMap = new HashMap<>(checkInRecordList.size()); + if (!CollectionUtils.isEmpty(checkInRecordList)) { + checkedPointList = checkInRecordList.stream().map(CheckInRecord::getPointId).distinct().collect(Collectors.toList()); + pointIdAndCheckInTimeMap = checkInRecordList.stream().collect(Collectors.toMap(CheckInRecord::getPointId, CheckInRecord::getCheckInTime)); + } + List pointInfoBOList = BeanUtils.copyList(pointInfoList, PointInfoBO.class); + for (PointInfoBO pointInfoBO : pointInfoBOList) { + if (checkedPointList.contains(pointInfoBO.getId())) { + pointInfoBO.setCheckInFlag(true); + pointInfoBO.setCheckInTime(pointIdAndCheckInTimeMap.get(pointInfoBO.getId())); + } + } + //DO->VO + ScheduleVO scheduleVO = new ScheduleVO(); + BeanUtils.copyProperties(schedules, scheduleVO); + Map longStringMap = commonService.pathMapIdToName(scheduleVO.getPathId()); + Map userIdAndNameMap = commonService.userMapIdToName(scheduleVO.getUserId()); + scheduleVO.setPathName(longStringMap.get(scheduleVO.getPathId())); + scheduleVO.setUserName(userIdAndNameMap.get(scheduleVO.getUserId())); + scheduleVO.setPointInfoBOList(pointInfoBOList); + return scheduleVO; + } + + @Override + public List queryMonthSchedule(Long userId, YearMonth month) { + if (Objects.isNull(month)) { + month = YearMonth.now(); + } + List schedulesList = schedulesMapper.selectList(new QueryWrapper().lambda() + .eq(Schedules::getUserId, userId) + .between(Schedules::getDateOfWeek, month.atDay(1), month.atEndOfMonth()) + ); + List voList = BeanUtils.copyList(schedulesList, SchedulesMonthVO.class); + return voList; + } + +} + diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/ShiftServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/ShiftServiceImpl.java new file mode 100644 index 0000000..5024b7c --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/ShiftServiceImpl.java @@ -0,0 +1,71 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.iot.forestfire.domain.Shift; +import com.tcctyn.iot.forestfire.mapper.ShiftMapper; +import com.tcctyn.iot.forestfire.service.IShiftService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** +*

+* 班次表 服务实现类 +*

+* +* @author liuzh +* @since 2024-09-24 +*/ +@Service +public class ShiftServiceImpl extends ServiceImpl implements IShiftService { + + + @Resource + private ShiftMapper shiftMapper; + + @Override + public Page list(Integer pageNo, Integer pageSize) { + return shiftMapper.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<>()); + } + + @Override + public Shift getById(Long id) { + Shift shift = shiftMapper.selectById(id); + return shift; + } + + @Override + public Integer create(Shift shift) { + return shiftMapper.insert(shift); + } + + @Override + public Integer delete(Long id) { + return shiftMapper.deleteById(id); + } + + @Override + public Integer update(Shift shift) { + return shiftMapper.updateById(shift); + } + + @Override + public List selectShiftList(Shift shift) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.setEntity(shift); + return shiftMapper.selectList(queryWrapper); + } + + /** + * 查询所有班次信息(用于前端选择器) + * @return + */ + @Override + public List allShift() { + return shiftMapper.selectList(new QueryWrapper<>()); + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/TemporaryTaskServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/TemporaryTaskServiceImpl.java new file mode 100644 index 0000000..911c1e3 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/TemporaryTaskServiceImpl.java @@ -0,0 +1,195 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.constant.RegionConstants; + +import com.tcctyn.common.core.web.domain.entity.RegionInfo; +import com.tcctyn.common.core.exception.ServiceException; +import com.tcctyn.common.core.utils.bean.BeanUtils; +import com.tcctyn.common.core.utils.DateUtils; +import com.tcctyn.iot.forestfire.VO.TemporaryTaskVO; +import com.tcctyn.iot.forestfire.domain.TemporaryTask; +import com.tcctyn.iot.forestfire.enums.TaskStatusEnum; +import com.tcctyn.iot.forestfire.mapper.RegionInfoMapper; +import com.tcctyn.iot.forestfire.mapper.TemporaryTaskMapper; +import com.tcctyn.iot.forestfire.searcher.BaseIdListSearcher; +import com.tcctyn.iot.forestfire.searcher.temporarytask.TemporaryTaskStatusSearcher; +import com.tcctyn.iot.forestfire.service.ITemporaryTaskService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 临时任务表 服务实现类 + *

+ * + * @author 代超 + * @since 2024-11-01 + */ +@Service +public class TemporaryTaskServiceImpl extends ServiceImpl implements ITemporaryTaskService { + + + @Resource + private TemporaryTaskMapper temporaryTaskMapper; + + @Resource + private RegionInfoMapper regionInfoMapper; + + @Override + public Page list(Integer pageNo, Integer pageSize) { + return temporaryTaskMapper.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<>()); + } + + @Override + public TemporaryTask getById(Long id) { + TemporaryTask temporaryTask = temporaryTaskMapper.selectById(id); + return temporaryTask; + } + + @Override + public Integer create(TemporaryTask temporaryTask) { + //新增任务时冗余forest_id,farm_id,fence_id + Long regionId = temporaryTask.getRegionId(); + if (Objects.nonNull(regionId)) { + RegionInfo regionInfo = regionInfoMapper.selectById(regionId); + String ancestors = regionInfo.getAncestors(); + String[] ancestorsArr = ancestors.split(RegionConstants.DIVISION_COMMA); + switch (ancestorsArr.length) { + case 1: + temporaryTask.setForestId(regionId); + break; + case 2: + temporaryTask.setForestId(Long.valueOf(ancestorsArr[1])); + temporaryTask.setFarmId(regionId); + break; + case 3: + temporaryTask.setForestId(Long.valueOf(ancestorsArr[1])); + temporaryTask.setFarmId(Long.valueOf(ancestorsArr[2])); + temporaryTask.setFenceId(regionId); + break; + case 4: + temporaryTask.setForestId(Long.valueOf(ancestorsArr[1])); + temporaryTask.setFarmId(Long.valueOf(ancestorsArr[2])); + temporaryTask.setFenceId(Long.valueOf(ancestorsArr[3])); + break; + } + } + temporaryTask.setIssueTime(new Date()); + return temporaryTaskMapper.insert(temporaryTask); + } + + @Override + public Integer delete(Long id) { + TemporaryTask temporaryTask = getById(id); + //只有未受理的任务才可以删除 + if (!TaskStatusEnum.NOT_ACCEPTED.name().equals(temporaryTask.getTaskStatus())) { + throw new ServiceException("任务已被受理,请勿删除!"); + } + return temporaryTaskMapper.deleteById(id); + } + + @Override + public Integer update(TemporaryTask temporaryTask) { + return temporaryTaskMapper.updateById(temporaryTask); + } + + @Override + public Integer archive(Long id) { + TemporaryTask temporaryTask = getById(id); + //任务完成后才可以进行归档 + if (!TaskStatusEnum.COMPLETED.name().equals(temporaryTask.getTaskStatus())) { + throw new ServiceException("任务完成后才能进行归档"); + } + temporaryTask.setArchiveStatus(1); + temporaryTask.setArchiveTime(new Date()); + return temporaryTaskMapper.updateById(temporaryTask); + } + + @Override + public Integer archiveBatch(BaseIdListSearcher searcher) { + List taskList = temporaryTaskMapper.selectList(new QueryWrapper().lambda() + .ne(TemporaryTask::getTaskStatus, TaskStatusEnum.COMPLETED.name()) + .in(TemporaryTask::getId, searcher.getIdList()) + ); + if (!CollectionUtils.isEmpty(taskList)) { + throw new ServiceException("存在未完成任务,请检查"); + } + return temporaryTaskMapper.archiveBatch(searcher.getIdList()); + } + + @Override + public List selectList(TemporaryTask temporaryTask) { + //筛选条件:任务名称、任务类型、任务状态、任务紧急度,按照创建时间进行倒序排序 + List taskList = temporaryTaskMapper.selectList(new QueryWrapper().lambda() + .like(StringUtils.isNotBlank(temporaryTask.getTaskName()), TemporaryTask::getTaskName, temporaryTask.getTaskName()) + .eq(StringUtils.isNotBlank(temporaryTask.getTaskType()), TemporaryTask::getTaskType, temporaryTask.getTaskType()) + .eq(StringUtils.isNotBlank(temporaryTask.getTaskStatus()), TemporaryTask::getTaskStatus, temporaryTask.getTaskStatus()) + .eq(StringUtils.isNotBlank(temporaryTask.getTaskUrgency()), TemporaryTask::getTaskUrgency, temporaryTask.getTaskUrgency()) + .eq(Objects.nonNull(temporaryTask.getTaskPersonId()), TemporaryTask::getTaskPersonId, temporaryTask.getTaskPersonId()) + .eq(Objects.nonNull(temporaryTask.getIssuerId()), TemporaryTask::getIssuerId, temporaryTask.getIssuerId()) + .eq(Objects.nonNull(temporaryTask.getTaskRecipientId()), TemporaryTask::getTaskRecipientId, temporaryTask.getTaskRecipientId()) + .eq(Objects.nonNull(temporaryTask.getRegionId()), TemporaryTask::getRegionId, temporaryTask.getRegionId()) + .orderByDesc(TemporaryTask::getCreatedTime) + ); + return taskList; + } + + @Override + public List selectOneDayList(TemporaryTask temporaryTask) { + if (Objects.isNull(temporaryTask.getIssueTime())) { + temporaryTask.setIssueTime(new Date()); + } + List taskList = temporaryTaskMapper.selectList(new QueryWrapper().lambda() + .eq(Objects.nonNull(temporaryTask.getRegionId()), TemporaryTask::getRegionId, temporaryTask.getRegionId()) + .apply("date_format(issue_time,'%Y%m%d')=" + "'" + DateUtils.parseDateToStr("yyyyMMdd", temporaryTask.getIssueTime()) + "'") + .orderByDesc(TemporaryTask::getCreatedTime)); + + List voList = BeanUtils.copyList(taskList, TemporaryTaskVO.class); + return voList; + } + + @Override + public List selectUncompletedList(TemporaryTask temporaryTask) { + List taskList = temporaryTaskMapper.selectList(new QueryWrapper().lambda() + .like(StringUtils.isNotBlank(temporaryTask.getTaskName()), TemporaryTask::getTaskName, temporaryTask.getTaskName()) + .eq(Objects.nonNull(temporaryTask.getRegionId()), TemporaryTask::getRegionId, temporaryTask.getRegionId()) + .ne(TemporaryTask::getTaskStatus, TaskStatusEnum.COMPLETED.name()) + .orderByDesc(TemporaryTask::getCreatedTime) + ); + return taskList; + } + + @Override + public Integer updateTaskStatus(TemporaryTaskStatusSearcher searcher, Long userId) { + TemporaryTask temporaryTask = getById(searcher.getId()); + if (Objects.nonNull(temporaryTask)) { + if (TaskStatusEnum.NOT_ACCEPTED.name().equals(searcher.getTaskStatus()) && TaskStatusEnum.NOT_ACCEPTED.name().equals(temporaryTask.getTaskStatus())) { + TemporaryTask acceptTask = new TemporaryTask(); + acceptTask.setId(searcher.getId()); + acceptTask.setTaskStatus(TaskStatusEnum.IN_PROGRESS.name()); + acceptTask.setTaskRecipientId(userId); + acceptTask.setAcceptTime(new Date()); + return temporaryTaskMapper.updateById(acceptTask); + } else if (TaskStatusEnum.IN_PROGRESS.name().equals(searcher.getTaskStatus()) && TaskStatusEnum.IN_PROGRESS.name().equals(temporaryTask.getTaskStatus())) { + TemporaryTask completeTask = new TemporaryTask(); + completeTask.setId(searcher.getId()); + completeTask.setTaskStatus(TaskStatusEnum.COMPLETED.name()); + completeTask.setCompleteTime(new Date()); + return temporaryTaskMapper.updateById(completeTask); + } else { + throw new ServiceException("任务状态异常,请检查"); + } + } + return 0; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/VoiceTemplateConfigServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/VoiceTemplateConfigServiceImpl.java new file mode 100644 index 0000000..fa23444 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/VoiceTemplateConfigServiceImpl.java @@ -0,0 +1,54 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.iot.forestfire.domain.VoiceTemplateConfig; +import com.tcctyn.iot.forestfire.mapper.VoiceTemplateConfigMapper; +import com.tcctyn.iot.forestfire.service.IVoiceTemplateConfigService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** +*

+* 语音播报模板表 服务实现类 +*

+* +* @author daichao +* @since 2024-12-17 +*/ +@Service +public class VoiceTemplateConfigServiceImpl extends ServiceImpl implements IVoiceTemplateConfigService { + + + @Resource + private VoiceTemplateConfigMapper voiceTemplateConfigMapper; + + @Override + public Page list(Integer pageNo, Integer pageSize) { + return voiceTemplateConfigMapper.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<>()); + } + + @Override + public VoiceTemplateConfig getById(Long id) { + VoiceTemplateConfig voiceTemplateConfig = voiceTemplateConfigMapper.selectById(id); + return voiceTemplateConfig; + } + + @Override + public Integer create(VoiceTemplateConfig voiceTemplateConfig) { + return voiceTemplateConfigMapper.insert(voiceTemplateConfig); + } + + @Override + public Integer delete(Long id) { + return voiceTemplateConfigMapper.deleteById(id); + } + + @Override + public Integer update(VoiceTemplateConfig voiceTemplateConfig) { + return voiceTemplateConfigMapper.updateById(voiceTemplateConfig); + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/WarehouseServiceImpl.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/WarehouseServiceImpl.java new file mode 100644 index 0000000..627a07a --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/service/impl/WarehouseServiceImpl.java @@ -0,0 +1,145 @@ +package com.tcctyn.iot.forestfire.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tcctyn.common.core.constant.RegionConstants; + +import com.tcctyn.common.core.web.domain.entity.RegionInfo; +import com.tcctyn.iot.forestfire.VO.WarehouseSelectVO; +import com.tcctyn.iot.forestfire.domain.Warehouse; +import com.tcctyn.iot.forestfire.mapper.RegionInfoMapper; +import com.tcctyn.iot.forestfire.mapper.WarehouseMapper; +import com.tcctyn.iot.forestfire.service.IWarehouseService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 仓库信息 服务实现类 + *

+ * + * @author liuzh + * @since 2024-10-09 + */ +@Service +public class WarehouseServiceImpl extends ServiceImpl implements IWarehouseService { + + + @Resource + private WarehouseMapper warehouseMapper; + + @Resource + private RegionInfoMapper regionInfoMapper; + + @Override + public List list(Warehouse warehouse) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.setEntity(warehouse); + return warehouseMapper.selectList(queryWrapper); + } + + @Override + public Warehouse getById(Long id) { + Warehouse warehouse = warehouseMapper.selectById(id); + return warehouse; + } + + @Override + public Integer create(Warehouse warehouse) { + Long regionId = warehouse.getRegionId(); + if (Objects.nonNull(regionId)) { + RegionInfo regionInfo = regionInfoMapper.selectById(regionId); + String ancestors = regionInfo.getAncestors(); + String[] ancestorsArr = ancestors.split(RegionConstants.DIVISION_COMMA); + switch (ancestorsArr.length) { + case 1: + warehouse.setForestId(regionId); + break; + case 2: + warehouse.setForestId(Long.valueOf(ancestorsArr[1])); + warehouse.setFarmId(regionId); + break; + case 3: + warehouse.setForestId(Long.valueOf(ancestorsArr[1])); + warehouse.setFarmId(Long.valueOf(ancestorsArr[2])); + warehouse.setFenceId(regionId); + break; + case 4: + warehouse.setForestId(Long.valueOf(ancestorsArr[1])); + warehouse.setFarmId(Long.valueOf(ancestorsArr[2])); + warehouse.setFenceId(Long.valueOf(ancestorsArr[3])); + break; + } + } + return warehouseMapper.insert(warehouse); + } + + @Override + public Integer delete(Long id) { + return warehouseMapper.deleteById(id); + } + + @Override + public Integer update(Warehouse warehouse) { + //如果修改了 regionId,则需要更新 warehouse 表中的 forestId, farmId, fenceId + Warehouse originalWarehouse = warehouseMapper.selectById(warehouse.getWarehouseId()); + if (!Objects.equals(originalWarehouse.getRegionId(), warehouse.getRegionId())) { + Long regionId = warehouse.getRegionId(); + RegionInfo regionInfo = regionInfoMapper.selectById(regionId); + String ancestors = regionInfo.getAncestors(); + String[] ancestorsArr = ancestors.split(RegionConstants.DIVISION_COMMA); + switch (ancestorsArr.length) { + case 1: + warehouse.setForestId(regionId); + break; + case 2: + warehouse.setForestId(Long.valueOf(ancestorsArr[1])); + warehouse.setFarmId(regionId); + break; + case 3: + warehouse.setForestId(Long.valueOf(ancestorsArr[1])); + warehouse.setFarmId(Long.valueOf(ancestorsArr[2])); + warehouse.setFenceId(regionId); + break; + case 4: + warehouse.setForestId(Long.valueOf(ancestorsArr[1])); + warehouse.setFarmId(Long.valueOf(ancestorsArr[2])); + warehouse.setFenceId(Long.valueOf(ancestorsArr[3])); + break; + } + } + return warehouseMapper.updateById(warehouse); + } + + @Override + public List selectWarehouse(Long regionId) { + List warehouseList = warehouseMapper.selectList(new QueryWrapper().eq("region_id", regionId)); + List warehouseSelectVOList = new ArrayList<>(); + for (Warehouse warehouse : warehouseList) { + WarehouseSelectVO warehouseSelectVO = new WarehouseSelectVO(); + warehouseSelectVO.setWarehouseId(warehouse.getWarehouseId()); + warehouseSelectVO.setWarehouseName(warehouse.getWarehouseName()); + warehouseSelectVO.setLongitude(warehouse.getLongitude()); + warehouseSelectVO.setLatitude(warehouse.getLatitude()); + warehouseSelectVOList.add(warehouseSelectVO); + } + + return warehouseSelectVOList; + + } + + @Override + public List selectAll(Warehouse warehouse) { + //暂时先支持林区、林场、电子围栏查询,后续有需要可以再加查询条件 + List warehouseList = warehouseMapper.selectList(new QueryWrapper().lambda() + .eq(Objects.nonNull(warehouse.getForestId()), Warehouse::getForestId, warehouse.getForestId()) + .eq(Objects.nonNull(warehouse.getFarmId()), Warehouse::getFarmId, warehouse.getFarmId()) + .eq(Objects.nonNull(warehouse.getFenceId()), Warehouse::getFenceId, warehouse.getFenceId()) + ); + return warehouseList; + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/webscoket/WebSocketServer.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/webscoket/WebSocketServer.java new file mode 100644 index 0000000..8112ecd --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/webscoket/WebSocketServer.java @@ -0,0 +1,114 @@ +package com.tcctyn.iot.forestfire.webscoket; + +import com.tcctyn.common.core.utils.SemaphoreUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.websocket.*; +import javax.websocket.server.ServerEndpoint; +import java.util.concurrent.Semaphore; + +/** + * websocket 消息处理 + * + * @author ruoyi + */ +@Component +@ServerEndpoint("/websocket/message") +public class WebSocketServer +{ + /** + * WebSocketServer 日志控制器 + */ + private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketServer.class); + + /** + * 默认最多允许同时在线人数100 + */ + public static int socketMaxOnlineCount = 100; + + private static Semaphore socketSemaphore = new Semaphore(socketMaxOnlineCount); + + /** + * 连接建立成功调用的方法 + */ + @OnOpen + public void onOpen(Session session) throws Exception + { + boolean semaphoreFlag = false; + // 尝试获取信号量 + semaphoreFlag = SemaphoreUtils.tryAcquire(socketSemaphore); + if (!semaphoreFlag) + { + // 未获取到信号量 + LOGGER.error("\n 当前在线人数超过限制数- {}", socketMaxOnlineCount); + WebSocketUsers.sendMessageToUserByText(session, "当前在线人数超过限制数:" + socketMaxOnlineCount); + session.close(); + } + else + { + // 添加用户 + WebSocketUsers.put(session.getId(), session); + LOGGER.info("\n 建立连接 - {}", session); + LOGGER.info("\n 当前人数 - {}", WebSocketUsers.getUsers().size()); + WebSocketUsers.sendMessageToUserByText(session, " 连接成功"); + } + } + + /** + * 连接关闭时处理 + */ + @OnClose + public void onClose(Session session) + { + LOGGER.info("\n 关闭连接 - {}", session); + // 移除用户 + boolean removeFlag = WebSocketUsers.remove(session.getId()); + if (!removeFlag) + { + // 获取到信号量则需释放 + SemaphoreUtils.release(socketSemaphore); + } + } + + /** + * 抛出异常时处理 + */ + @OnError + public void onError(Session session, Throwable exception) throws Exception + { + if (session.isOpen()) + { + // 关闭连接 + session.close(); + } + String sessionId = session.getId(); + LOGGER.info("\n 连接异常 - {}", sessionId); + LOGGER.info("\n 异常信息 - {}", exception); + // 移出用户 + WebSocketUsers.remove(sessionId); + // 获取到信号量则需释放 + SemaphoreUtils.release(socketSemaphore); + } + + /** + * 服务器接收到客户端消息时调用的方法 + */ + @OnMessage + public void onMessage(String message, Session session) + { + String msg = message.replace("你", "我").replace("吗", ""); + WebSocketUsers.sendMessageToUserByText(session, msg); + } + + /** + * 已经连接的用户群发消息 + * @param message + */ + public static void sendOneMessage(String message) + { + WebSocketUsers.sendMessageToUsersByText(message); + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/webscoket/WebSocketUsers.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/webscoket/WebSocketUsers.java new file mode 100644 index 0000000..cb31128 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/forestfire/webscoket/WebSocketUsers.java @@ -0,0 +1,142 @@ +package com.tcctyn.iot.forestfire.webscoket; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.websocket.Session; +import java.io.IOException; +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * websocket 客户端用户集 + * + * @author ruoyi + */ +public class WebSocketUsers +{ + /** + * WebSocketUsers 日志控制器 + */ + private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketUsers.class); + + /** + * 用户集 + */ + private static Map USERS = new ConcurrentHashMap(); + + /** + * 存储用户 + * + * @param key 唯一键 + * @param session 用户信息 + */ + public static void put(String key, Session session) + { + USERS.put(key, session); + } + + /** + * 移除用户 + * + * @param session 用户信息 + * + * @return 移除结果 + */ + public static boolean remove(Session session) + { + String key = null; + boolean flag = USERS.containsValue(session); + if (flag) + { + Set> entries = USERS.entrySet(); + for (Map.Entry entry : entries) + { + Session value = entry.getValue(); + if (value.equals(session)) + { + key = entry.getKey(); + break; + } + } + } + else + { + return true; + } + return remove(key); + } + + /** + * 移出用户 + * + * @param key 键 + */ + public static boolean remove(String key) + { + LOGGER.info("\n 正在移出用户 - {}", key); + Session remove = USERS.remove(key); + if (remove != null) + { + boolean containsValue = USERS.containsValue(remove); + LOGGER.info("\n 移出结果 - {}", containsValue ? "失败" : "成功"); + return containsValue; + } + else + { + return true; + } + } + + /** + * 获取在线用户列表 + * + * @return 返回用户集合 + */ + public static Map getUsers() + { + return USERS; + } + + /** + * 群发消息文本消息 + * + * @param message 消息内容 + */ + public static void sendMessageToUsersByText(String message) + { + Collection values = USERS.values(); + for (Session value : values) + { + sendMessageToUserByText(value, message); + } + } + + /** + * 发送文本消息 + * + * @param userName 自己的用户名 + * @param message 消息内容 + */ + public static void sendMessageToUserByText(Session session, String message) + { + if (session != null) + { + try + { + session.getBasicRemote().sendText(message); + } + catch (IOException e) + { + LOGGER.error("\n[发送消息异常]", e); + } + } + else + { + LOGGER.info("\n[你已离线]"); + } + } +} + diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/handler/JsonTypeHandler.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/handler/JsonTypeHandler.java new file mode 100644 index 0000000..a3b0707 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/handler/JsonTypeHandler.java @@ -0,0 +1,22 @@ +package com.tcctyn.iot.handler; + +import com.alibaba.fastjson2.JSON; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; +import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; + +@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedTypes(Object.class) +public class JsonTypeHandler extends AbstractJsonTypeHandler { + + @Override + protected Object parse(String json) { + return JSON.parse(json); + } + + @Override + protected String toJson(Object obj) { + return JSON.toJSONString(obj); + } +} \ No newline at end of file diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/TestApi.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/TestApi.java new file mode 100644 index 0000000..2a03bfd --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/TestApi.java @@ -0,0 +1,94 @@ +package com.tcctyn.iot.hkapi; + +import com.alibaba.fastjson.JSON; +import com.hikvision.artemis.sdk.ArtemisHttpUtil; +import com.hikvision.artemis.sdk.config.ArtemisConfig; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * @author Jason + * @date 2025年05月22日 15:13:09 + */ +public class TestApi { + + private static final String ARTEMIS_PATH = "/artemis"; + + /** + * 调用POST请求类型接口,这里以获取组织列表为例 + * 接口实际url:https://ip:port/artemis/api/resource/v1/org/orgList + * + * @return + */ + public static String callPostApiGetOrgList() throws Exception { + /** + * https://ip:port/artemis/api/resource/v1/org/orgList + * 通过查阅AI Cloud开放平台文档或网关门户的文档可以看到获取组织列表的接口定义,该接口为POST请求的Rest接口, 入参为JSON字符串,接口协议为https。 + * ArtemisHttpUtil工具类提供了doPostStringArtemis调用POST请求的方法,入参可传JSON字符串, 请阅读开发指南了解方法入参,没有的参数可传null + */ + ArtemisConfig config = new ArtemisConfig(); + config.setHost("116.53.205.228:14443"); // 代理API网关nginx服务器ip端口 + config.setAppKey("21887937"); // 秘钥appkey + config.setAppSecret("hwOzOEqxuPDz5frAnEXb");// 秘钥appSecret + + final String getCamsApi = ARTEMIS_PATH + "/api/resource/v1/org/orgList"; + Map paramMap = new HashMap();// post请求Form表单参数 + paramMap.put("pageNo", "1"); + paramMap.put("pageSize", "2"); + String body = JSON.toJSON(paramMap).toString(); + Map path = new HashMap(2) { + { + put("https://", getCamsApi); + } + }; + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + return ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", headers); + + + } + + + public static String calculateSignature(String appKey, String appSecret, String method, String path, + String query, String body, String timestamp) { + try { + // 1. 构建待签名字符串 + String content = method + "\n" + + "application/json\n" + // Accept + "application/json\n" + // Content-Type + "\n" + // Date (可为空) + "x-ca-key:" + appKey + "\n" + + "x-ca-nonce:" + UUID.randomUUID().toString() + "\n" + + "x-ca-timestamp:" + timestamp + "\n" + + path; + + if (query != null && !query.isEmpty()) { + content += "?" + query; + } + + content += "\n" + body; + + // 2. 计算HMAC-SHA256签名 + Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); + SecretKeySpec secret_key = new SecretKeySpec(appSecret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); + sha256_HMAC.init(secret_key); + byte[] hash = sha256_HMAC.doFinal(content.getBytes(StandardCharsets.UTF_8)); + + return Base64.getEncoder().encodeToString(hash); + } catch (Exception e) { + throw new RuntimeException("计算签名失败", e); + } + } + + public static void main(String[] args) throws Exception { +// callPostApiGetOrgList(); + TestApi testApi = new TestApi(); + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/VO/CamerasBody.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/VO/CamerasBody.java new file mode 100644 index 0000000..f3c7c46 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/VO/CamerasBody.java @@ -0,0 +1,49 @@ +package com.tcctyn.iot.hkapi.VO; + +import lombok.Data; + +/** + * 监控点资源 + */ +@Data +public class CamerasBody { + // 监控点唯一标识 + private String altitude; //海拔 + private String cameraIndexCode; //监控点唯一标识 + private String cameraName; //监控点名称 + private String cameraType; //监控点类型,参考附录A.4 + private String cameraTypeName; //监控点类型说明 + private String capabilitySet; //设备能力集,参考附录A.22 + private String capabilitySetName; //能力集说明 + private String intelligentSet; //智能分析能力集,扩展字段,暂不使用 + private String intelligentSetName; //智能分析能力集说明,扩展字段,暂不使用 + private String channelNo; //通道编号 + private String channelType; //通道类型,附录A.5 + private String channelTypeName; //通道类型说明 + private String createTime; //创建时间,采用ISO8601标准,如2018-07-26T21:30:08+08:00 表示北京时间2018年7月26日21时30分08秒 + private String encodeDevIndexCode; //所属编码设备唯一标识 + private String encodeDevResourceType; //所属设备类型,扩展字段,暂不使用 + private String encodeDevResourceTypeName; //所属设备类型说明,扩展字段,暂不使用 + private String gbIndexCode; //监控点国标编号,即外码编号externalIndexCode + private String installLocation; //安装位置,详见附录附录A.81 安装位置 + private String keyBoardCode; //键盘控制码 + private String latitude; //纬度 + private String longitude; //经度 + private String pixel; //摄像机像素(1-普通像素,2-130万高清,3-200万高清,4-300万高清),扩展字段,暂不使用 + private String ptz; //云镜类型(1-全方位云台(带转动和变焦),2-只有变焦,不带转动,3-只有转动,不带变焦,4-无云台,无变焦),扩展字段,暂不使用 + private String ptzName; //云镜类型说明,扩展字段,暂不使用 + private String ptzController; //云台控制(1-DVR,2-模拟矩阵,3-MU4000,4-NC600),扩展字段,暂不使用 + private String ptzControllerName; //云台控制说明,扩展字段,暂不使用 + private String recordLocation; //录像存储位置 + private String recordLocationName; //录像存储位置说明 + private String regionIndexCode; //所属区域唯一标识 + private String status; //在线状态(0-未知,1-在线,2-离线),扩展字段,暂不使用 + private String statusName; //状态说明 + private String transType; //传输协议,参考附录A.40 + private String transTypeName; //传输协议类型说明 + private String treatyType; //接入协议,参考附录A.6 + private String treatyTypeName; //接入协议类型说明 + private String viewshed; //可视域相关(JSON格式),扩展字段,暂不使用 + private String updateTime; //更新时间 + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/VO/PreviewURLsParam.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/VO/PreviewURLsParam.java new file mode 100644 index 0000000..1326310 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/VO/PreviewURLsParam.java @@ -0,0 +1,50 @@ +package com.tcctyn.iot.hkapi.VO; + +import lombok.Data; + +@Data +public class PreviewURLsParam { + /** + * 监控点唯一标识,分页获取监控点资源接口获取返回参数cameraIndexCode + */ + private String cameraIndexCode; + /** + * 码流类型,0:主码流 + * 1:子码流 + * 2:第三码流 + * 参数不填,默认为主码流 + */ + private int streamType = 0; + /** + * 取流协议(应用层协议), + * “hik”:HIK私有协议,使用视频SDK进行播放时,传入此类型; + * “rtsp”:RTSP协议; + * “rtmp”:RTMP协议(RTMP协议只支持海康SDK协议、EHOME协议、ONVIF协议接入的设备;只支持H264视频编码和AAC音频编码); + * “hls”:HLS协议(HLS协议只支持海康SDK协议、EHOME协议、ONVIF协议接入的设备;只支持H264视频编码和AAC音频编码); + * “ws”:Websocket协议(一般用于H5视频播放器取流播放)。 + * 参数不填,默认为HIK协议 + */ + private String protocol = "hls"; + + /** + * 传输协议(传输层协议),0:UDP + * 1:TCP + * 默认是TCP + * 注:GB28181 2011及以前版本只支持UDP传输 + */ + private int transmode = 1; + + /** + * 标识扩展内容,格式:key=value, + * 调用方根据其播放控件支持的解码格式选择相应的封装类型; + * 多个扩展时,以“&”隔开; + * 支持的内容详见附录F%20expand扩展内容说明 + */ + private String expand = "transcode=0"; + + /** + * 输出码流转封装格式,“ps”:PS封装格式、“rtp”:RTP封装协议。当protocol=rtsp时生效,且不传值时默认为RTP封装协议。 + */ + private String streamform = "ps"; + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/controller/HkVideoController.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/controller/HkVideoController.java new file mode 100644 index 0000000..db247c9 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/controller/HkVideoController.java @@ -0,0 +1,41 @@ +package com.tcctyn.iot.hkapi.controller; + +import com.tcctyn.common.core.web.controller.BaseController; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.iot.hkapi.VO.PreviewURLsParam; +import com.tcctyn.iot.hkapi.service.IHkVideoService; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/hk/video") +public class HkVideoController extends BaseController { + + + @Autowired + private IHkVideoService hkVideoService; + + /** + * 分页获取监控点资源 + */ + @Async + @GetMapping("/getResourceCameras") + @Operation(summary = "分页获取监控点资源", description = "分页获取监控点资源") + public AjaxResult getResourceCameras() + { + return hkVideoService.getResourceCameras(); + } + + /** + * 获取监控点预览取流URLv2 + */ + @Async + @PostMapping("/getVideoCamerasPreviewURLs") + @Operation(summary = "获取监控点预览取流URLv2", description = "获取监控点预览取流URLv2") + public AjaxResult getVideoCamerasPreviewURLs(@RequestBody PreviewURLsParam previewURLsParam) + { + return hkVideoService.getVideoCamerasPreviewURLs(previewURLsParam); + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/enums/ResourceCodeEnums.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/enums/ResourceCodeEnums.java new file mode 100644 index 0000000..199f160 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/enums/ResourceCodeEnums.java @@ -0,0 +1,100 @@ +package com.tcctyn.iot.hkapi.enums; + +import org.apache.commons.lang3.EnumUtils; + +import java.lang.reflect.Method; +import java.util.List; + +/** + * 附录E.other.1 资源目录错误码 + */ +public enum ResourceCodeEnums { + code_0x00072001(0x00072001, "参数错误:必填参数为空"), + code_0x00072002(0x00072002, "参数错误:参数范围不正确"), + code_0x00072003(0x00072003, "参数错误:参数格式不正确"), + code_0x00072004(0x00072004, "参数错误:未指定分页大小或者分页过大导致返回报文过长"), + code_0x00052101(0x00052101, "服务错误:服务性能已达上限"), + code_0x00052102(0x00052102, "服务错误:服务异常"), + code_0x00052103(0x00052103, "服务错误:服务响应超时"), + code_0x00052104(0x00052104, "服务错误:服务不可用"), + code_0x00072201(0x00072201, "资源异常:资源访问未授权"), + code_0x00072202(0x00072202, "资源异常:资源不存在"), + code_0x00072203(0x00072203, "资源异常:License数量受限"), + code_0x00072204(0x00072204, "资源异常:License未提供该功能"), + code_0x00052301(0x00052301, "其他错误:其他未知错误"), + code_0x14c00002(0x14c00002, "该用户不存在"), + code_0x14c00003(0x14c00003, "区域查询条件sonOrgIndexCodes 不合法"), + code_0x14c00004(0x14c00004, "资源查询条件containSubRegion、exactCondition 不合法"), + code_0x14c00005(0x14c00005, "资源类型resourceType、权限码authCodes错误;"), + code_0x14c00015(0x14c00015, "当前入参非系统唯一标识"), + code_0x14c00016(0x14c00016, "Token校验失败"), + code_0x14c00017(0x14c00017, "SecuSID已过期"), + code_0x14c00018(0x14c00018, "密钥交换失败"), + code_0x14c00019(0x14c00019, "加密数据失败"), + code_0x14c00020(0x14c00020, "解密数据失败"), + code_0x14c02301(0x14c02301, "批量操作时部分成功、部分失败"), + code_0x14c02302(0x14c02302, "管理相关权限校验失败"), + code_0x14c02303(0x14c02303, "资源不存在"), + code_0x14c02304(0x14c02304, "请求超时"); + + + private int code; + private String message; + + ResourceCodeEnums(int code, String message) { + this.code = code; + this.message = message; + } + + public Integer code() { + return code; + } + + public String message() { + return message; + } + + /** + * 判断某个枚举是否包某个code值 + * + * @param code 需要判断的值 + * @return 包含返回true,否则返回false + */ + public static boolean isInclude(int code) { + List enumList = EnumUtils.getEnumList(ResourceCodeEnums.class); + for (Object en : enumList) { + Class enClass = en.getClass(); + try { + Method method = enClass.getMethod("getCode"); // 需要与枚举类方法对应 + Object invoke = method.invoke(en, (Object) null); + if (Integer.parseInt(invoke.toString()) == code) { + return true; + } + } catch (Exception e) { + System.out.println("枚举执行getCode方法失败"); + } + } + return false; + } + + public static Integer getCode(Integer code) { + ResourceCodeEnums[] imageFormatTypes = values(); + for (ResourceCodeEnums imageFormatType : imageFormatTypes) { + if (imageFormatType.code().equals(code)) { + return imageFormatType.code(); + } + } + return null; + } + + public static String getValue(Integer code) { + ResourceCodeEnums[] imageFormatTypes = values(); + for (ResourceCodeEnums imageFormatType : imageFormatTypes) { + if (imageFormatType.code().equals(code)) { + return imageFormatType.message(); + } + } + return null; + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/service/IHkVideoService.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/service/IHkVideoService.java new file mode 100644 index 0000000..71cbd6e --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/service/IHkVideoService.java @@ -0,0 +1,93 @@ +package com.tcctyn.iot.hkapi.service; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.tcctyn.common.core.utils.StringUtils; +import com.tcctyn.common.core.web.domain.AjaxResult; +import com.tcctyn.iot.forestfire.domain.DeviceInfo; +import com.tcctyn.iot.forestfire.service.impl.DeviceInfoServiceImpl; +import com.tcctyn.iot.hkapi.VO.CamerasBody; +import com.tcctyn.iot.hkapi.VO.PreviewURLsParam; +import com.tcctyn.iot.hkapi.utils.HkApi; +import com.tcctyn.iot.hkapi.utils.HkArtemisUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * 海康视频业务类 + */ +@Service +public class IHkVideoService { + + @Autowired + private HkArtemisUtil hkArtemisUtil; + + @Autowired + private DeviceInfoServiceImpl deviceInfoService; + + public AjaxResult getResourceCameras() { + try { + + HashMap paramMap = new HashMap<>(); + // TODO 测试 + paramMap.put("pageNo", 1); + paramMap.put("pageSize", 10); + + // 获取分页参数 +// PageDomain pageDomain = TableSupport.buildPageRequest(); +// if (pageDomain.getPageNum() == null || pageDomain.getPageSize() == 0) { +// paramMap.put("pageNo", 1); +// paramMap.put("pageSize", 10); +// } else { +// paramMap.put("pageNo", pageDomain.getPageNum()); +// paramMap.put("pageSize", pageDomain.getPageSize()); +// } + + // 调用海康摄像头资源接口 + String result = hkArtemisUtil.callPostApiGetOrgList(HkApi.API_RESOURCE_V1_CAMERAS, paramMap); + // 看是否关连设备表 + JSONObject jsonObject = JSON.parseObject(result); + List camerasBodyList = (List) jsonObject.get("data"); + List deviceInfoList = new ArrayList<>(); + if (StringUtils.isNotEmpty(camerasBodyList)) { + for (CamerasBody camerasBody : camerasBodyList) { + DeviceInfo deviceInfo = new DeviceInfo(); +// deviceInfo.setDeviceNo(camerasBody.getDeviceSerial()); + deviceInfoList.add(deviceInfo); + } + } + // 保存 + deviceInfoService.saveOrUpdateBatch(deviceInfoList); + return AjaxResult.success(result); + } catch (Exception e) { + e.printStackTrace(); + return AjaxResult.error("分页获取监控点资源失败"); + } + } + + public AjaxResult getVideoCamerasPreviewURLs(PreviewURLsParam previewURLsParam) { + try { + // 请求参数 + HashMap paramMap = new HashMap<>();// post请求Form表单参数 + paramMap.put("cameraIndexCode", previewURLsParam.getCameraIndexCode()); + paramMap.put("streamType", previewURLsParam.getStreamType()); + paramMap.put("protocol", previewURLsParam.getProtocol()); + paramMap.put("transmode", previewURLsParam.getTransmode()); + paramMap.put("expand", previewURLsParam.getExpand()); + paramMap.put("streamform", previewURLsParam.getStreamform()); + + // 调用海康摄像头资源接口 + String result = hkArtemisUtil.callPostApiGetOrgList(HkApi.API_VIDEO_V2_CAMERAS_PREVIEWURLS, paramMap); + return AjaxResult.success(result); + + } catch (Exception e) { + e.printStackTrace(); + return AjaxResult.error("获取监控点预览取流URLv2失败"); + } + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/utils/HkApi.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/utils/HkApi.java new file mode 100644 index 0000000..9912c4e --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/utils/HkApi.java @@ -0,0 +1,18 @@ +package com.tcctyn.iot.hkapi.utils; + +public class HkApi { + //分页获取监控点资源 + public static final String API_RESOURCE_V1_CAMERAS = "/api/resource/v1/cameras"; + //获取监控点预览取流URLv2 + public static final String API_VIDEO_V2_CAMERAS_PREVIEWURLS = "/api/video/v2/cameras/previewURLs"; + + public static void main(String[] args) { + String url = "/api/video/v2/cameras/previewURLs"; + String replace = url.replace("/", "_"); + replace.replaceFirst("_", "1"); + String upperCase = replace.toUpperCase(); + System.out.println(upperCase); + + } + +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/utils/HkArtemisUtil.java b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/utils/HkArtemisUtil.java new file mode 100644 index 0000000..8fc2026 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/java/com/tcctyn/iot/hkapi/utils/HkArtemisUtil.java @@ -0,0 +1,78 @@ +package com.tcctyn.iot.hkapi.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.hikvision.artemis.sdk.ArtemisHttpUtil; +import com.hikvision.artemis.sdk.config.ArtemisConfig; +import com.tcctyn.iot.hkapi.enums.ResourceCodeEnums; +import lombok.Data; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Log4j2 +@Data +@Component +public class HkArtemisUtil { + @Value("${artemis.path}") + private String ARTEMIS_PATH; + @Value("${artemis.host}") + private String ARTEMIS_HOST; + @Value("${artemis.app-key}") + private String ARTEMIS_APP_KEY; + @Value("${artemis.app-secret}") + private String ARTEMIS_APP_SECRET; + + private String success_code = "0"; + + /** + * 调用POST请求类型接口,这里以获取组织列表为例 + * 接口实际url:https://ip:port/artemis/api/resource/v1/org/orgList + *

+ * api 海康平台接口地址 + * paramMap post请求Form表单参数 + * + * @return 返回string类型得字符串(里面是json数据) + */ + public String callPostApiGetOrgList(String api, HashMap paramMap) { + try { + + /** + * https://ip:port/artemis/api/resource/v1/org/orgList + * 通过查阅AI Cloud开放平台文档或网关门户的文档可以看到获取组织列表的接口定义,该接口为POST请求的Rest接口, 入参为JSON字符串,接口协议为https。 + * ArtemisHttpUtil工具类提供了doPostStringArtemis调用POST请求的方法,入参可传JSON字符串, 请阅读开发指南了解方法入参,没有的参数可传null + */ + ArtemisConfig config = new ArtemisConfig(); + config.setHost(ARTEMIS_HOST); // 代理API网关nginx服务器ip端口 + config.setAppKey(ARTEMIS_APP_KEY); // 秘钥appkey + config.setAppSecret(ARTEMIS_APP_SECRET);// 秘钥appSecret + + String getCamsApi = ARTEMIS_PATH + api; + + // 请求参数 + String body = JSON.toJSON(paramMap).toString(); + Map path = new HashMap(2) { + { + put("https://", getCamsApi); + } + }; + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + + String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", headers); + log.info("调用接口返回结果:{}", result); + JSONObject resultObj = JSON.parseObject(result); + if (!success_code.equals(resultObj.get("code"))) { + throw new Exception("调用失败,错误码为:" + resultObj.getString("code") + ";错误信息:" + ResourceCodeEnums.getValue((Integer) resultObj.get("code"))); + } + return result; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + + } +} diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/application.yml b/tcctyn-modules/tcctyn-iot/src/main/resources/application.yml new file mode 100644 index 0000000..f0665b9 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/application.yml @@ -0,0 +1,51 @@ +# Tomcat +server: + port: 9004 + +spring: + application: + name: ${artifactId} + cloud: + nacos: + username: @nacos.username@ + password: @nacos.password@ + # 服务发现配置 + discovery: + server-addr: 47.109.202.121:8858 + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-@profiles.active@.${spring.cloud.nacos.config.file-extension} + config: + import: + # - optional:nacos:application-@profiles.active@.yml + - optional:nacos:${spring.application.name}-@profiles.active@.yml + + + +# 海康运营管理中心接口配置 +artemis: + path: /artemis + host: 116.53.205.228:14443 + app-key: 21887937 + app-secret: hwOzOEqxuPDz5frAnEXb + +# 测试使用,为了系统安全,通常生产环境不建议开启swagger。 +springdoc: + swagger-ui: + path: /swagger-ui.html + disable-swagger-default-url: true + # 关键修复配置 ↓ + url: /v3/api-docs # 改用YAML格式 + config-url: /v3/api-docs/swagger-config + api-docs: + path: /v3/api-docs + enabled: true + # 必须配置扫描 ↓ + paths-to-match: /** + packages-to-scan: com.tcctyn.iot.hk.controller + cache: + disabled: true # 开发时禁用缓存 \ No newline at end of file diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/banner.txt b/tcctyn-modules/tcctyn-iot/src/main/resources/banner.txt new file mode 100644 index 0000000..ad83e3e --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/banner.txt @@ -0,0 +1,11 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + + _ _ _ _ + | | | | (_) | | + | |_ ___ ___ | |_ _ _ _ __ _ ___ | |_ + | __| / __| / __| | __| | | | | | '_ \ | | / _ \ | __| + | |_ | (__ | (__ | |_ | |_| | | | | | | | | (_) | | |_ + \__| \___| \___| \__| \__, | |_| |_| |_| \___/ \__| + __/ | + |___/ \ No newline at end of file diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/ApprovalRecordMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/ApprovalRecordMapper.xml new file mode 100644 index 0000000..67443e8 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/ApprovalRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/CarouselImageConfigMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/CarouselImageConfigMapper.xml new file mode 100644 index 0000000..459e80d --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/CarouselImageConfigMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/CheckInRecordMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/CheckInRecordMapper.xml new file mode 100644 index 0000000..f76cd9f --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/CheckInRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/DeviceChanelsMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/DeviceChanelsMapper.xml new file mode 100644 index 0000000..77a9f08 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/DeviceChanelsMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/DeviceConfigMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/DeviceConfigMapper.xml new file mode 100644 index 0000000..5d6ba65 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/DeviceConfigMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/DeviceInfoMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/DeviceInfoMapper.xml new file mode 100644 index 0000000..8fa5eb4 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/DeviceInfoMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/DroneTaskPlanMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/DroneTaskPlanMapper.xml new file mode 100644 index 0000000..0c92763 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/DroneTaskPlanMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/FireReportMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/FireReportMapper.xml new file mode 100644 index 0000000..8c9a172 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/FireReportMapper.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/FireWarningInfoMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/FireWarningInfoMapper.xml new file mode 100644 index 0000000..a816ced --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/FireWarningInfoMapper.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + UPDATE fire_warning_info + SET disposal_status = 'ARCHIVED' + WHERE id IN + + #{item} + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/HkStoreCapturePicturesMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/HkStoreCapturePicturesMapper.xml new file mode 100644 index 0000000..0d0219c --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/HkStoreCapturePicturesMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + id + ,bucket,object_key, + original_name,user_id,file_size, + file_type,md5,is_public, + is_deleted,created_at,updated_at,device_id,access_path + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/InventoryMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/InventoryMapper.xml new file mode 100644 index 0000000..870fc41 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/InventoryMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/KeyAreaInfoMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/KeyAreaInfoMapper.xml new file mode 100644 index 0000000..ea52f88 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/KeyAreaInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/LeaveRecordMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/LeaveRecordMapper.xml new file mode 100644 index 0000000..25a302d --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/LeaveRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/MaterialMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/MaterialMapper.xml new file mode 100644 index 0000000..a2a91f3 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/MaterialMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/NoticeInfoMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/NoticeInfoMapper.xml new file mode 100644 index 0000000..9738f59 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/NoticeInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/PatrolPathMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/PatrolPathMapper.xml new file mode 100644 index 0000000..a8a288a --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/PatrolPathMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/PointInfoMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/PointInfoMapper.xml new file mode 100644 index 0000000..9d6d50d --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/PointInfoMapper.xml @@ -0,0 +1,45 @@ + + + + + + + update point_info + + longitude = #{item.longitude}, + latitude = #{item.latitude}, + point_type = #{item.pointType}, + sort_no = #{item.sortNo}, + check_in_radius = #{item.checkInRadius} + + where id = #{item.id} + + + + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/RegionInfoMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/RegionInfoMapper.xml new file mode 100644 index 0000000..9732567 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/RegionInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/RoadInfoMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/RoadInfoMapper.xml new file mode 100644 index 0000000..549b11d --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/RoadInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/RoadMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/RoadMapper.xml new file mode 100644 index 0000000..93c76d8 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/RoadMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/SatelliteDataSimulationMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/SatelliteDataSimulationMapper.xml new file mode 100644 index 0000000..e7a01a3 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/SatelliteDataSimulationMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + UPDATE satellite_data_simulation + SET risk_reduce_flag = 1 + WHERE id = #{id} + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/SchedulePlanMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/SchedulePlanMapper.xml new file mode 100644 index 0000000..b329a7a --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/SchedulePlanMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/ScheduleSwapMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/ScheduleSwapMapper.xml new file mode 100644 index 0000000..6a42b54 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/ScheduleSwapMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/ScheduleTemplateMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/ScheduleTemplateMapper.xml new file mode 100644 index 0000000..7c5782a --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/ScheduleTemplateMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/SchedulesMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/SchedulesMapper.xml new file mode 100644 index 0000000..d38e088 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/SchedulesMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/ShiftMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/ShiftMapper.xml new file mode 100644 index 0000000..b7e73a4 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/ShiftMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/TemporaryTaskMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/TemporaryTaskMapper.xml new file mode 100644 index 0000000..d01603f --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/TemporaryTaskMapper.xml @@ -0,0 +1,11 @@ + + + + + + update temporary_task set archive_status = 1 where id in + + #{id} + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/VoiceTemplateConfigMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/VoiceTemplateConfigMapper.xml new file mode 100644 index 0000000..7691c81 --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/VoiceTemplateConfigMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/WarehouseMapper.xml b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/WarehouseMapper.xml new file mode 100644 index 0000000..0eab7bc --- /dev/null +++ b/tcctyn-modules/tcctyn-iot/src/main/resources/mapper/foresrfire/WarehouseMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/TcctynSystemApplication.java b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/TcctynSystemApplication.java index bfb063b..2f30963 100644 --- a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/TcctynSystemApplication.java +++ b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/TcctynSystemApplication.java @@ -4,7 +4,6 @@ import com.tcctyn.common.security.annotation.EnableCustomConfig; import com.tcctyn.common.security.annotation.EnableRyFeignClients; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * 系统模块 diff --git a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysDeptController.java b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysDeptController.java index ad6861b..e5a94b1 100644 --- a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysDeptController.java +++ b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysDeptController.java @@ -1,17 +1,5 @@ package com.tcctyn.system.controller; -import java.util.List; -import org.apache.commons.lang3.ArrayUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; import com.tcctyn.common.core.constant.UserConstants; import com.tcctyn.common.core.utils.StringUtils; import com.tcctyn.common.core.web.controller.BaseController; @@ -22,6 +10,12 @@ import com.tcctyn.common.security.annotation.RequiresPermissions; import com.tcctyn.common.security.utils.SecurityUtils; import com.tcctyn.system.api.domain.SysDept; import com.tcctyn.system.service.ISysDeptService; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; /** * 部门信息 @@ -130,4 +124,24 @@ public class SysDeptController extends BaseController deptService.checkDeptDataScope(deptId); return toAjax(deptService.deleteDeptById(deptId)); } + + + + /** + * 根据条件查询用户列表 + */ + @PostMapping("/selectDeptList") + public List selectUserList(SysDept sysDept) { + return deptService.selectDeptList(sysDept); + } + + + /** + * 根据条件查询用户列表 + */ + @PostMapping("/selectDeptById/{deptId}") + public SysDept selectDeptById(@PathVariable("deptId") Long deptId) { + return deptService.selectDeptById(deptId); + } + } diff --git a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysFileController.java b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysFileController.java index 4b01a76..321531f 100644 --- a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysFileController.java +++ b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysFileController.java @@ -1,6 +1,6 @@ package com.tcctyn.system.controller; -import com.tcctyn.common.core.domain.R; +import com.tcctyn.common.core.web.domain.R; import com.tcctyn.common.core.utils.file.FileUtils; import com.tcctyn.system.api.domain.SysFile; import com.tcctyn.system.service.ISysFileService; diff --git a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysProfileController.java b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysProfileController.java index 6fb7508..b3ddc5b 100644 --- a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysProfileController.java +++ b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysProfileController.java @@ -1,17 +1,6 @@ package com.tcctyn.system.controller; -import java.util.Arrays; -import java.util.Map; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; -import com.tcctyn.common.core.domain.R; +import com.tcctyn.common.core.web.domain.R; import com.tcctyn.common.core.utils.StringUtils; import com.tcctyn.common.core.utils.file.FileTypeUtils; import com.tcctyn.common.core.utils.file.MimeTypeUtils; @@ -26,6 +15,13 @@ import com.tcctyn.system.api.domain.SysFile; import com.tcctyn.system.api.domain.SysUser; import com.tcctyn.system.api.model.LoginUser; import com.tcctyn.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Arrays; +import java.util.Map; /** * 个人信息 业务处理 @@ -37,6 +33,7 @@ import com.tcctyn.system.service.ISysUserService; public class SysProfileController extends BaseController { @Autowired + @Lazy private ISysUserService userService; @Autowired diff --git a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysRoleController.java b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysRoleController.java index 6f38dc4..892487e 100644 --- a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysRoleController.java +++ b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysRoleController.java @@ -1,17 +1,5 @@ package com.tcctyn.system.controller; -import java.util.List; -import javax.servlet.http.HttpServletResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; import com.tcctyn.common.core.utils.poi.ExcelUtil; import com.tcctyn.common.core.web.controller.BaseController; import com.tcctyn.common.core.web.domain.AjaxResult; @@ -27,6 +15,12 @@ import com.tcctyn.system.domain.SysUserRole; import com.tcctyn.system.service.ISysDeptService; import com.tcctyn.system.service.ISysRoleService; import com.tcctyn.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; /** * 角色信息 diff --git a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysUserController.java b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysUserController.java index 63ca8d9..9fdbf82 100644 --- a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysUserController.java +++ b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/controller/SysUserController.java @@ -1,23 +1,6 @@ package com.tcctyn.system.controller; -import java.io.IOException; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.ArrayUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; -import com.tcctyn.common.core.domain.R; +import com.tcctyn.common.core.web.domain.R; import com.tcctyn.common.core.utils.StringUtils; import com.tcctyn.common.core.utils.poi.ExcelUtil; import com.tcctyn.common.core.web.controller.BaseController; @@ -33,12 +16,18 @@ import com.tcctyn.system.api.domain.SysDept; import com.tcctyn.system.api.domain.SysRole; import com.tcctyn.system.api.domain.SysUser; import com.tcctyn.system.api.model.LoginUser; -import com.tcctyn.system.service.ISysConfigService; -import com.tcctyn.system.service.ISysDeptService; -import com.tcctyn.system.service.ISysPermissionService; -import com.tcctyn.system.service.ISysPostService; -import com.tcctyn.system.service.ISysRoleService; -import com.tcctyn.system.service.ISysUserService; +import com.tcctyn.system.service.*; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * 用户信息 @@ -348,4 +337,32 @@ public class SysUserController extends BaseController { return success(deptService.selectDeptTreeList(dept)); } + + /** + * 根据条件查询用户列表 + */ + @PostMapping("/selectUserList") + public List selectUserList(SysUser user) { + return userService.selectUserList(user); + } + + + /** + * 根据条件查询用户列表 + */ + @PostMapping("/selectUserById/{userId}") + public SysUser selectUserById(@PathVariable("userId") Long userId) { + return userService.selectUserById(userId); + } + + /** + * 获取用户列表用于前端选择器 + * @param regionId 归属地区id + * @return + */ + @GetMapping("/userNames/{regionId}") + public List getOrdinaryUser(@PathVariable("regionId") Long regionId) { + return userService.getOrdinaryUser(regionId); + } + } diff --git a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/mapper/SysUserMapper.java b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/mapper/SysUserMapper.java index 3df2fa0..979c926 100644 --- a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/mapper/SysUserMapper.java +++ b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/mapper/SysUserMapper.java @@ -1,8 +1,9 @@ package com.tcctyn.system.mapper; -import java.util.List; -import org.apache.ibatis.annotations.Param; import com.tcctyn.system.api.domain.SysUser; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 用户表 数据层 @@ -124,4 +125,10 @@ public interface SysUserMapper * @return 结果 */ public SysUser checkEmailUnique(String email); + + /** + * 获取用户信息用于前端选择 + * @return + */ + public List selectOrdinaryUser(Long regionId); } diff --git a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/service/ISysUserService.java b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/service/ISysUserService.java index 275cc15..d5231d3 100644 --- a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/service/ISysUserService.java +++ b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/service/ISysUserService.java @@ -1,8 +1,9 @@ package com.tcctyn.system.service; -import java.util.List; import com.tcctyn.system.api.domain.SysUser; +import java.util.List; + /** * 用户 业务层 * @@ -203,4 +204,6 @@ public interface ISysUserService * @return 结果 */ public String importUser(List userList, Boolean isUpdateSupport, String operName); + + List getOrdinaryUser(Long regionId); } diff --git a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/service/impl/SysUserServiceImpl.java b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/service/impl/SysUserServiceImpl.java index 0b0b683..2d87f15 100644 --- a/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/service/impl/SysUserServiceImpl.java +++ b/tcctyn-modules/tcctyn-system/src/main/java/com/tcctyn/system/service/impl/SysUserServiceImpl.java @@ -1,15 +1,5 @@ package com.tcctyn.system.service.impl; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; -import javax.validation.Validator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; import com.tcctyn.common.core.constant.UserConstants; import com.tcctyn.common.core.exception.ServiceException; import com.tcctyn.common.core.utils.SpringUtils; @@ -22,14 +12,21 @@ import com.tcctyn.system.api.domain.SysUser; import com.tcctyn.system.domain.SysPost; import com.tcctyn.system.domain.SysUserPost; import com.tcctyn.system.domain.SysUserRole; -import com.tcctyn.system.mapper.SysPostMapper; -import com.tcctyn.system.mapper.SysRoleMapper; -import com.tcctyn.system.mapper.SysUserMapper; -import com.tcctyn.system.mapper.SysUserPostMapper; -import com.tcctyn.system.mapper.SysUserRoleMapper; +import com.tcctyn.system.mapper.*; import com.tcctyn.system.service.ISysConfigService; import com.tcctyn.system.service.ISysDeptService; import com.tcctyn.system.service.ISysUserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.validation.Validator; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; /** * 用户 业务层处理 @@ -37,7 +34,7 @@ import com.tcctyn.system.service.ISysUserService; * @author tcctyn */ @Service -public class SysUserServiceImpl implements ISysUserService +public abstract class SysUserServiceImpl implements ISysUserService { private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class); @@ -547,5 +544,13 @@ public class SysUserServiceImpl implements ISysUserService } return successMsg.toString(); } - + /** + * 获取用户信息用于前端选择器 + * + * @return + */ + @Override + public List getOrdinaryUser(Long regionId) { + return userMapper.selectOrdinaryUser(regionId); + } } diff --git a/tcctyn-modules/tcctyn-system/src/main/resources/mapper/system/SysUserMapper.xml b/tcctyn-modules/tcctyn-system/src/main/resources/mapper/system/SysUserMapper.xml index 067895f..5de7a41 100644 --- a/tcctyn-modules/tcctyn-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/tcctyn-modules/tcctyn-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -216,5 +216,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{userId} + + + \ No newline at end of file