From 8edf0004e4bd8b758b0fc5940a8a83f0f7948f74 Mon Sep 17 00:00:00 2001
From: linwei <872216696@qq.com>
Date: Wed, 29 Jul 2026 16:31:26 +0800
Subject: [PATCH] feat(workorder): 添加事件处置记录和状态流转功能
---
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueDisposeRecordServiceImpl.java | 179 ++++++
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdClueEventService.java | 12
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueEventStatusFlowServiceImpl.java | 126 ++++
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventCountVO.java | 9
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/controller/GdClueEventController.java | 75 ++
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdClueEventEntity.java | 4
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueDisposeRecordMapper.java | 45 +
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdClueEventStatusFlowService.java | 59 ++
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueDisposeRecordVO.java | 126 ++++
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueEventStatusFlowMapper.xml | 61 ++
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdClueDisposeRecordEntity.java | 101 +++
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdClueDisposeRecordService.java | 56 ++
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventStatusFlowVO.java | 119 ++++
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueEventStatusFlowMapper.java | 45 +
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/enums/EventStatusEnum.java | 163 +++++
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueDisposeRecordMapper.xml | 64 ++
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/param/GdClueDisposeRecordAddParam.java | 96 +++
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventDetailVO.java | 56 ++
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueEventServiceImpl.java | 79 ++
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdClueEventStatusFlowEntity.java | 89 +++
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventVO.java | 4
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/param/GdClueEventStatusUpdateParam.java | 74 ++
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueEventMapper.xml | 10
23 files changed, 1,643 insertions(+), 9 deletions(-)
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/controller/GdClueEventController.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/controller/GdClueEventController.java
index 5bd2407..96a2085 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/controller/GdClueEventController.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/controller/GdClueEventController.java
@@ -33,12 +33,14 @@
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.sxkj.gd.workorder.entity.GdClueEventEntity;
+import org.sxkj.gd.workorder.param.GdClueDisposeRecordAddParam;
import org.sxkj.gd.workorder.param.GdClueEventRejectParam;
-import org.sxkj.gd.workorder.vo.GdClueEventCountVO;
-import org.sxkj.gd.workorder.vo.GdClueEventListVO;
-import org.sxkj.gd.workorder.vo.GdClueEventVO;
+import org.sxkj.gd.workorder.param.GdClueEventStatusUpdateParam;
+import org.sxkj.gd.workorder.vo.*;
import org.sxkj.gd.workorder.excel.GdClueEventExcel;
+import org.sxkj.gd.workorder.service.IGdClueDisposeRecordService;
import org.sxkj.gd.workorder.service.IGdClueEventService;
+import org.sxkj.gd.workorder.service.IGdClueEventStatusFlowService;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.excel.util.ExcelUtil;
@@ -62,6 +64,8 @@
public class GdClueEventController extends BladeController {
private final IGdClueEventService gdClueEventService;
+ private final IGdClueDisposeRecordService gdClueDisposeRecordService;
+ private final IGdClueEventStatusFlowService gdClueEventStatusFlowService;
/**
* 事件表(线索事件) 详情
@@ -170,6 +174,71 @@
return R.status(gdClueEventService.handleClueEvent(rejectParam));
}
+ /**
+ * 事件详情(包含处置记录和状态流转)
+ */
+ @GetMapping("/detailFull")
+ @ApiOperationSupport(order = 9)
+ @ApiOperation(value = "事件详情(包含处置记录和状态流转)", notes = "传入事件ID")
+ public R<GdClueEventDetailVO> detailFull(@ApiParam(value = "事件ID", required = true) @RequestParam Long id) {
+ // 1. 查询事件基本信息
+ GdClueEventVO eventInfo = gdClueEventService.getGdClueEventDetail(id);
+
+ // 2. 查询处置记录时间线
+ List<GdClueDisposeRecordVO> disposeRecords = gdClueDisposeRecordService.getDisposeRecordsByEventId(id);
+
+ // 3. 查询状态流转时间线
+ List<GdClueEventStatusFlowVO> statusFlows = gdClueEventStatusFlowService.getStatusFlowsByEventId(id);
+
+ // 4. 组装返回数据
+ GdClueEventDetailVO detailVO = new GdClueEventDetailVO();
+ detailVO.setEventInfo(eventInfo);
+ detailVO.setDisposeRecords(disposeRecords);
+ detailVO.setStatusFlows(statusFlows);
+
+ return R.data(detailVO);
+ }
+
+ /**
+ * 查询处置记录列表
+ */
+ @GetMapping("/disposeRecords")
+ @ApiOperationSupport(order = 10)
+ @ApiOperation(value = "查询处置记录列表", notes = "传入事件ID")
+ public R<List<GdClueDisposeRecordVO>> getDisposeRecords(@ApiParam(value = "事件ID", required = true) @RequestParam Long eventId) {
+ return R.data(gdClueDisposeRecordService.getDisposeRecordsByEventId(eventId));
+ }
+
+ /**
+ * 新增处置记录
+ */
+ @PostMapping("/addDisposeRecord")
+ @ApiOperationSupport(order = 11)
+ @ApiOperation(value = "新增处置记录", notes = "传入处置记录参数,可同步更新事件状态")
+ public R addDisposeRecord(@Valid @RequestBody GdClueDisposeRecordAddParam addParam) {
+ return R.status(gdClueDisposeRecordService.addDisposeRecord(addParam));
+ }
+
+ /**
+ * 查询状态流转记录列表
+ */
+ @GetMapping("/statusFlows")
+ @ApiOperationSupport(order = 12)
+ @ApiOperation(value = "查询状态流转记录列表", notes = "传入事件ID")
+ public R<List<GdClueEventStatusFlowVO>> getStatusFlows(@ApiParam(value = "事件ID", required = true) @RequestParam Long eventId) {
+ return R.data(gdClueEventStatusFlowService.getStatusFlowsByEventId(eventId));
+ }
+
+ /**
+ * 更新事件状态
+ */
+ @PostMapping("/updateStatus")
+ @ApiOperationSupport(order = 13)
+ @ApiOperation(value = "更新事件状态", notes = "传入事件ID和目标状态,必须符合状态流转矩阵")
+ public R updateStatus(@Valid @RequestBody GdClueEventStatusUpdateParam updateParam) {
+ return R.status(gdClueEventService.updateEventStatus(updateParam));
+ }
+
// /**
// * 导出数据
// */
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdClueDisposeRecordEntity.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdClueDisposeRecordEntity.java
new file mode 100644
index 0000000..363cbc5
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdClueDisposeRecordEntity.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.sxkj.gd.workorder.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 事件处置流水记录表 实体类
+ * <p>
+ * 记录事件的处置过程信息,包括核查记录和处置记录
+ * </p>
+ *
+ * @author system
+ * @since 2026-07-29
+ */
+@Data
+@TableName(value = "ja_gd_clue_dispose_record", autoResultMap = true)
+@ApiModel(value = "GdClueDisposeRecord对象", description = "事件处置流水记录表")
+@EqualsAndHashCode(callSuper = true)
+public class GdClueDisposeRecordEntity extends BaseEntity {
+
+ /**
+ * 关联事件ID(ja_gd_clue_event.id)
+ */
+ @ApiModelProperty(value = "关联事件ID")
+ private Long eventId;
+
+ /**
+ * 记录类型:0核查记录、1处置记录
+ */
+ @ApiModelProperty(value = "记录类型:0核查记录、1处置记录")
+ private Integer recordType;
+
+ /**
+ * 处置操作人
+ */
+ @ApiModelProperty(value = "处置操作人")
+ private Long disposeUser;
+
+ /**
+ * 处置操作部门
+ */
+ @ApiModelProperty(value = "处置操作部门")
+ private Long disposeDept;
+
+ /**
+ * 处置状态,与事件表event_status保持一致:0待确认、1处置中、2已退回、3已处置、4已完成
+ */
+ @ApiModelProperty(value = "处置状态:0待确认、1处置中、2已退回、3已处置、4已完成")
+ private Integer disposeStatus;
+
+ /**
+ * 处置文字说明
+ */
+ @ApiModelProperty(value = "处置文字说明")
+ private String disposeContent;
+
+ /**
+ * 现场附件图片URL数组,使用数组存储,不使用逗号拼接字符串
+ * <p>
+ * 数据库字段类型为text[],MyBatis-Plus使用TypeHandler进行转换
+ * </p>
+ */
+ @ApiModelProperty(value = "现场附件图片URL数组")
+ @com.baomidou.mybatisplus.annotation.TableField(typeHandler = JacksonTypeHandler.class)
+ private List<String> attachUrl;
+
+ /**
+ * 实际操作时间(界面展示时间)
+ */
+ @ApiModelProperty(value = "实际操作时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date operateTime;
+
+}
\ No newline at end of file
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdClueEventEntity.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdClueEventEntity.java
index 79c1493..ab3f4b9 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdClueEventEntity.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdClueEventEntity.java
@@ -70,9 +70,9 @@
@ApiModelProperty(value = "纬度")
private Double latitude;
/**
- * 状态:0未分发、1已分发、2已驳回、3已确认
+ * 状态:0待确认、1处置中、2已退回、3已处置、4已完成
*/
- @ApiModelProperty(value = "状态:0未分发、1已分发、2已驳回、3已确认")
+ @ApiModelProperty(value = "状态:0待确认、1处置中、2已退回、3已处置、4已完成")
private Integer eventStatus;
/**
* 区域编码
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdClueEventStatusFlowEntity.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdClueEventStatusFlowEntity.java
new file mode 100644
index 0000000..6421590
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdClueEventStatusFlowEntity.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.sxkj.gd.workorder.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 事件状态流转履历表 实体类
+ * <p>
+ * 记录事件状态的变更历史,仅用于审计,不允许删除和修改
+ * </p>
+ *
+ * @author system
+ * @since 2026-07-29
+ */
+@Data
+@TableName("ja_gd_clue_event_status_flow")
+@ApiModel(value = "GdClueEventStatusFlow对象", description = "事件状态流转履历表")
+@EqualsAndHashCode(callSuper = true)
+public class GdClueEventStatusFlowEntity extends BaseEntity {
+
+ /**
+ * 关联事件ID(ja_gd_clue_event.id)
+ */
+ @ApiModelProperty(value = "关联事件ID")
+ private Long eventId;
+
+ /**
+ * 变更前状态:0待确认、1处置中、2已退回、3已处置、4已完成
+ */
+ @ApiModelProperty(value = "变更前状态:0待确认、1处置中、2已退回、3已处置、4已完成")
+ private Integer oldStatus;
+
+ /**
+ * 变更后状态:0待确认、1处置中、2已退回、3已处置、4已完成
+ */
+ @ApiModelProperty(value = "变更后状态:0待确认、1处置中、2已退回、3已处置、4已完成")
+ private Integer newStatus;
+
+ /**
+ * 状态变更操作人
+ */
+ @ApiModelProperty(value = "状态变更操作人")
+ private Long operateUser;
+
+ /**
+ * 状态变更操作部门
+ */
+ @ApiModelProperty(value = "状态变更操作部门")
+ private Long operateDept;
+
+ /**
+ * 状态变更备注说明(分发、驳回、启动处置、完成处置等)
+ */
+ @ApiModelProperty(value = "状态变更备注说明")
+ private String operateContent;
+
+ /**
+ * 状态变更时间(界面展示时间)
+ */
+ @ApiModelProperty(value = "状态变更时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date operateTime;
+
+}
\ No newline at end of file
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/enums/EventStatusEnum.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/enums/EventStatusEnum.java
new file mode 100644
index 0000000..e3d496c
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/enums/EventStatusEnum.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.sxkj.gd.workorder.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * 事件状态枚举类
+ * <p>
+ * 定义事件状态的编码和名称,以及合法的状态流转矩阵
+ * </p>
+ *
+ * @author system
+ * @since 2026-07-29
+ */
+@Getter
+@AllArgsConstructor
+public enum EventStatusEnum {
+
+ /**
+ * 待确认
+ */
+ PENDING_CONFIRM(0, "待确认"),
+
+ /**
+ * 处置中
+ */
+ DISPOSING(1, "处置中"),
+
+ /**
+ * 已退回
+ */
+ RETURNED(2, "已退回"),
+
+ /**
+ * 已处置
+ */
+ DISPOSED(3, "已处置"),
+
+ /**
+ * 已完成
+ */
+ COMPLETED(4, "已完成");
+
+ /**
+ * 状态编码
+ */
+ private final Integer code;
+
+ /**
+ * 状态名称
+ */
+ private final String name;
+
+ /**
+ * 合法状态流转矩阵
+ * Key: 当前状态编码
+ * Value: 允许流转到的目标状态编码列表
+ */
+ private static final Map<Integer, List<Integer>> STATUS_FLOW_MATRIX = new HashMap<>();
+
+ static {
+ // 初始化状态流转矩阵
+ // 0-待确认 -> 1-处置中, 2-已退回
+ STATUS_FLOW_MATRIX.put(0, Arrays.asList(1, 2));
+ // 1-处置中 -> 2-已退回, 3-已处置
+ STATUS_FLOW_MATRIX.put(1, Arrays.asList(2, 3));
+ // 2-已退回 -> 0-待确认, 1-处置中
+ STATUS_FLOW_MATRIX.put(2, Arrays.asList(0, 1));
+ // 3-已处置 -> 2-已退回, 4-已完成
+ STATUS_FLOW_MATRIX.put(3, Arrays.asList(2, 4));
+ // 4-已完成 -> 终态,不允许流转
+ STATUS_FLOW_MATRIX.put(4, Arrays.asList());
+ }
+
+ /**
+ * 根据状态编码获取枚举对象
+ *
+ * @param code 状态编码
+ * @return 枚举对象,如果不存在则返回null
+ */
+ public static EventStatusEnum getByCode(Integer code) {
+ if (code == null) {
+ return null;
+ }
+ for (EventStatusEnum status : values()) {
+ if (status.getCode().equals(code)) {
+ return status;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 根据状态编码获取状态名称
+ *
+ * @param code 状态编码
+ * @return 状态名称,如果不存在则返回"未知状态"
+ */
+ public static String getNameByCode(Integer code) {
+ EventStatusEnum status = getByCode(code);
+ return status != null ? status.getName() : "未知状态";
+ }
+
+ /**
+ * 校验状态流转是否合法
+ *
+ * @param currentStatus 当前状态编码
+ * @param targetStatus 目标状态编码
+ * @return true-合法,false-非法
+ */
+ public static boolean isValidTransition(Integer currentStatus, Integer targetStatus) {
+ if (currentStatus == null || targetStatus == null) {
+ return false;
+ }
+ List<Integer> allowedStatuses = STATUS_FLOW_MATRIX.get(currentStatus);
+ return allowedStatuses != null && allowedStatuses.contains(targetStatus);
+ }
+
+ /**
+ * 获取指定状态允许流转的所有目标状态编码列表
+ *
+ * @param currentStatus 当前状态编码
+ * @return 允许流转的目标状态编码列表
+ */
+ public static List<Integer> getAllowedTransitions(Integer currentStatus) {
+ if (currentStatus == null) {
+ return Arrays.asList();
+ }
+ List<Integer> allowed = STATUS_FLOW_MATRIX.get(currentStatus);
+ return allowed != null ? allowed : Arrays.asList();
+ }
+
+ /**
+ * 校验状态编码是否有效
+ *
+ * @param code 状态编码
+ * @return true-有效,false-无效
+ */
+ public static boolean isValidCode(Integer code) {
+ return getByCode(code) != null;
+ }
+}
\ No newline at end of file
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueDisposeRecordMapper.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueDisposeRecordMapper.java
new file mode 100644
index 0000000..94b6026
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueDisposeRecordMapper.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.sxkj.gd.workorder.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.sxkj.gd.workorder.entity.GdClueDisposeRecordEntity;
+import org.sxkj.gd.workorder.vo.GdClueDisposeRecordVO;
+
+import java.util.List;
+
+/**
+ * 事件处置流水记录表 Mapper 接口
+ *
+ * @author system
+ * @since 2026-07-29
+ */
+public interface GdClueDisposeRecordMapper extends BaseMapper<GdClueDisposeRecordEntity> {
+
+ /**
+ * 根据事件ID查询处置记录列表
+ * <p>
+ * 按操作时间升序排列
+ * </p>
+ *
+ * @param eventId 事件ID
+ * @return 处置记录列表
+ */
+ List<GdClueDisposeRecordVO> selectDisposeRecordsByEventId(@Param("eventId") Long eventId);
+
+}
\ No newline at end of file
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueDisposeRecordMapper.xml b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueDisposeRecordMapper.xml
new file mode 100644
index 0000000..1f9549f
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueDisposeRecordMapper.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.sxkj.gd.workorder.mapper.GdClueDisposeRecordMapper">
+
+ <!-- 通用查询映射结果 -->
+ <resultMap id="disposeRecordResultMap" type="org.sxkj.gd.workorder.entity.GdClueDisposeRecordEntity">
+ <result column="id" property="id"/>
+ <result column="event_id" property="eventId"/>
+ <result column="record_type" property="recordType"/>
+ <result column="dispose_user" property="disposeUser"/>
+ <result column="dispose_dept" property="disposeDept"/>
+ <result column="dispose_status" property="disposeStatus"/>
+ <result column="dispose_content" property="disposeContent"/>
+ <result column="attach_url" property="attachUrl" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+ <result column="operate_time" property="operateTime"/>
+ <result column="create_user" property="createUser"/>
+ <result column="create_dept" property="createDept"/>
+ <result column="create_time" property="createTime"/>
+ <result column="update_user" property="updateUser"/>
+ <result column="update_time" property="updateTime"/>
+ <result column="status" property="status"/>
+ <result column="is_deleted" property="isDeleted"/>
+ </resultMap>
+
+ <!-- 处置记录VO结果映射 -->
+ <resultMap id="disposeRecordVoResultMap" type="org.sxkj.gd.workorder.vo.GdClueDisposeRecordVO">
+ <result column="id" property="id"/>
+ <result column="event_id" property="eventId"/>
+ <result column="record_type" property="recordType"/>
+ <result column="dispose_user" property="disposeUser"/>
+ <result column="dispose_user_name" property="disposeUserName"/>
+ <result column="dispose_dept" property="disposeDept"/>
+ <result column="dispose_dept_name" property="disposeDeptName"/>
+ <result column="dispose_status" property="disposeStatus"/>
+ <result column="dispose_content" property="disposeContent"/>
+ <result column="attach_url" property="attachUrl" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+ <result column="operate_time" property="operateTime"/>
+ <result column="create_time" property="createTime"/>
+ </resultMap>
+
+ <!-- 根据事件ID查询处置记录列表 -->
+ <select id="selectDisposeRecordsByEventId" resultMap="disposeRecordVoResultMap">
+ SELECT
+ r.id,
+ r.event_id,
+ r.record_type,
+ r.dispose_user,
+ r.dispose_dept,
+ r.dispose_status,
+ r.dispose_content,
+ r.attach_url,
+ r.operate_time,
+ r.create_time,
+ u.real_name AS dispose_user_name,
+ d.full_name AS dispose_dept_name
+ FROM jagzw_yw.ja_gd_clue_dispose_record r
+ LEFT JOIN blade_user u ON r.dispose_user = u.id AND u.is_deleted = 0
+ LEFT JOIN blade_dept d ON r.dispose_dept = d.id AND d.is_deleted = 0
+ WHERE r.event_id = #{eventId}
+ AND r.is_deleted = 0
+ ORDER BY r.operate_time ASC
+ </select>
+
+</mapper>
\ No newline at end of file
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueEventMapper.xml b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueEventMapper.xml
index a7f7c1a..632cdaf 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueEventMapper.xml
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueEventMapper.xml
@@ -65,6 +65,9 @@
<resultMap id="gdClueEventCountVoResultMap" type="org.sxkj.gd.workorder.vo.GdClueEventCountVO">
<result column="total_count" property="totalCount"/>
<result column="my_count" property="myCount"/>
+ <result column="returned_count" property="returnedCount"/>
+ <result column="disposed_count" property="disposedCount"/>
+ <result column="completed_count" property="completedCount"/>
</resultMap>
<sql id="gdClueEventDeptWhere">
@@ -164,10 +167,13 @@
<select id="selectGdClueEventCount" resultMap="gdClueEventCountVoResultMap">
select count(1) as total_count,
- COALESCE(sum(case when ce.dispose_user = #{userId} then 1 else 0 end), 0) as my_count
+ COALESCE(sum(case when ce.dispose_user = #{userId} then 1 else 0 end), 0) as my_count,
+ COALESCE(sum(case when ce.event_status = 2 then 1 else 0 end), 0) as returned_count,
+ COALESCE(sum(case when ce.event_status = 3 then 1 else 0 end), 0) as disposed_count,
+ COALESCE(sum(case when ce.event_status = 4 then 1 else 0 end), 0) as completed_count
from ja_gd_clue_event ce
<include refid="gdClueEventDeptWhere"/>
- and ce.event_status in (1, 3)
+ and ce.event_status in (0, 1, 2, 3, 4)
<if test="keyword != null and keyword != ''">
and ce.event_num like concat('%', #{keyword}, '%')
</if>
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueEventStatusFlowMapper.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueEventStatusFlowMapper.java
new file mode 100644
index 0000000..3795b6f
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueEventStatusFlowMapper.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.sxkj.gd.workorder.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.sxkj.gd.workorder.entity.GdClueEventStatusFlowEntity;
+import org.sxkj.gd.workorder.vo.GdClueEventStatusFlowVO;
+
+import java.util.List;
+
+/**
+ * 事件状态流转履历表 Mapper 接口
+ *
+ * @author system
+ * @since 2026-07-29
+ */
+public interface GdClueEventStatusFlowMapper extends BaseMapper<GdClueEventStatusFlowEntity> {
+
+ /**
+ * 根据事件ID查询状态流转记录列表
+ * <p>
+ * 按操作时间升序排列,用于时间线展示
+ * </p>
+ *
+ * @param eventId 事件ID
+ * @return 状态流转记录列表
+ */
+ List<GdClueEventStatusFlowVO> selectStatusFlowsByEventId(@Param("eventId") Long eventId);
+
+}
\ No newline at end of file
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueEventStatusFlowMapper.xml b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueEventStatusFlowMapper.xml
new file mode 100644
index 0000000..d1c043e
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdClueEventStatusFlowMapper.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.sxkj.gd.workorder.mapper.GdClueEventStatusFlowMapper">
+
+ <!-- 通用查询映射结果 -->
+ <resultMap id="statusFlowResultMap" type="org.sxkj.gd.workorder.entity.GdClueEventStatusFlowEntity">
+ <result column="id" property="id"/>
+ <result column="event_id" property="eventId"/>
+ <result column="old_status" property="oldStatus"/>
+ <result column="new_status" property="newStatus"/>
+ <result column="operate_user" property="operateUser"/>
+ <result column="operate_dept" property="operateDept"/>
+ <result column="operate_content" property="operateContent"/>
+ <result column="operate_time" property="operateTime"/>
+ <result column="create_user" property="createUser"/>
+ <result column="create_dept" property="createDept"/>
+ <result column="create_time" property="createTime"/>
+ <result column="update_user" property="updateUser"/>
+ <result column="update_time" property="updateTime"/>
+ <result column="status" property="status"/>
+ <result column="is_deleted" property="isDeleted"/>
+ </resultMap>
+
+ <!-- 状态流转VO结果映射 -->
+ <resultMap id="statusFlowVoResultMap" type="org.sxkj.gd.workorder.vo.GdClueEventStatusFlowVO">
+ <result column="id" property="id"/>
+ <result column="event_id" property="eventId"/>
+ <result column="old_status" property="oldStatus"/>
+ <result column="new_status" property="newStatus"/>
+ <result column="operate_user" property="operateUser"/>
+ <result column="operate_user_name" property="operateUserName"/>
+ <result column="operate_dept" property="operateDept"/>
+ <result column="operate_dept_name" property="operateDeptName"/>
+ <result column="operate_content" property="operateContent"/>
+ <result column="operate_time" property="operateTime"/>
+ <result column="create_time" property="createTime"/>
+ </resultMap>
+
+ <!-- 根据事件ID查询状态流转记录列表 -->
+ <select id="selectStatusFlowsByEventId" resultMap="statusFlowVoResultMap">
+ SELECT
+ f.id,
+ f.event_id,
+ f.old_status,
+ f.new_status,
+ f.operate_user,
+ f.operate_dept,
+ f.operate_content,
+ f.operate_time,
+ f.create_time,
+ u.real_name AS operate_user_name,
+ d.full_name AS operate_dept_name
+ FROM jagzw_yw.ja_gd_clue_event_status_flow f
+ LEFT JOIN blade_user u ON f.operate_user = u.id AND u.is_deleted = 0
+ LEFT JOIN blade_dept d ON f.operate_dept = d.id AND d.is_deleted = 0
+ WHERE f.event_id = #{eventId}
+ AND f.is_deleted = 0
+ ORDER BY f.operate_time ASC
+ </select>
+
+</mapper>
\ No newline at end of file
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/param/GdClueDisposeRecordAddParam.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/param/GdClueDisposeRecordAddParam.java
new file mode 100644
index 0000000..bf74dd0
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/param/GdClueDisposeRecordAddParam.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.sxkj.gd.workorder.param;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 事件处置记录新增参数
+ * <p>
+ * 用于新增处置记录,可同步触发事件状态变更
+ * </p>
+ *
+ * @author system
+ * @since 2026-07-29
+ */
+@Data
+@ApiModel(value = "GdClueDisposeRecordAddParam对象", description = "事件处置记录新增参数")
+public class GdClueDisposeRecordAddParam {
+
+ /**
+ * 关联事件ID(必填)
+ */
+ @NotNull(message = "事件ID不能为空")
+ @ApiModelProperty(value = "关联事件ID", required = true)
+ private Long eventId;
+
+ /**
+ * 记录类型:0核查记录、1处置记录(必填)
+ */
+ @NotNull(message = "记录类型不能为空")
+ @ApiModelProperty(value = "记录类型:0核查记录、1处置记录", required = true)
+ private Integer recordType;
+
+ /**
+ * 处置文字说明
+ */
+ @ApiModelProperty(value = "处置文字说明")
+ private String disposeContent;
+
+ /**
+ * 现场附件图片URL数组
+ */
+ @ApiModelProperty(value = "现场附件图片URL数组")
+ private List<String> attachUrl;
+
+ /**
+ * 实际操作时间(必填)
+ */
+ @NotNull(message = "操作时间不能为空")
+ @ApiModelProperty(value = "实际操作时间", required = true)
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date operateTime;
+
+ /**
+ * 是否同步更新事件状态
+ * <p>
+ * true: 提交处置内容时,自动将事件状态更新为处置中、已处置或已完成
+ * false: 仅新增处置记录,不更新事件状态
+ * </p>
+ */
+ @ApiModelProperty(value = "是否同步更新事件状态")
+ private Boolean updateEventStatus;
+
+ /**
+ * 目标事件状态(当updateEventStatus=true时必填)
+ * <p>
+ * 1: 处置中
+ * 3: 已处置
+ * 4: 已完成
+ * </p>
+ */
+ @ApiModelProperty(value = "目标事件状态(当updateEventStatus=true时必填)")
+ private Integer targetEventStatus;
+
+}
\ No newline at end of file
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/param/GdClueEventStatusUpdateParam.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/param/GdClueEventStatusUpdateParam.java
new file mode 100644
index 0000000..86ca9c2
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/param/GdClueEventStatusUpdateParam.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.sxkj.gd.workorder.param;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * 事件状态变更参数
+ * <p>
+ * 用于更新事件状态,必须符合状态流转矩阵规则
+ * </p>
+ *
+ * @author system
+ * @since 2026-07-29
+ */
+@Data
+@ApiModel(value = "GdClueEventStatusUpdateParam对象", description = "事件状态变更参数")
+public class GdClueEventStatusUpdateParam {
+
+ /**
+ * 事件ID(必填)
+ */
+ @NotNull(message = "事件ID不能为空")
+ @ApiModelProperty(value = "事件ID", required = true)
+ private Long eventId;
+
+ /**
+ * 目标状态(必填)
+ * <p>
+ * 0: 待确认
+ * 1: 处置中
+ * 2: 已退回
+ * 3: 已处置
+ * 4: 已完成
+ * </p>
+ */
+ @NotNull(message = "目标状态不能为空")
+ @ApiModelProperty(value = "目标状态:0待确认、1处置中、2已退回、3已处置、4已完成", required = true)
+ private Integer targetStatus;
+
+ /**
+ * 状态变更备注说明
+ */
+ @ApiModelProperty(value = "状态变更备注说明")
+ private String operateContent;
+
+ /**
+ * 操作时间(可选,不填则使用当前时间)
+ */
+ @ApiModelProperty(value = "操作时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date operateTime;
+
+}
\ No newline at end of file
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdClueDisposeRecordService.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdClueDisposeRecordService.java
new file mode 100644
index 0000000..f3f7b0a
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdClueDisposeRecordService.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.sxkj.gd.workorder.service;
+
+import org.sxkj.gd.workorder.entity.GdClueDisposeRecordEntity;
+import org.sxkj.gd.workorder.param.GdClueDisposeRecordAddParam;
+import org.sxkj.gd.workorder.vo.GdClueDisposeRecordVO;
+import org.springblade.core.mp.base.BaseService;
+
+import java.util.List;
+
+/**
+ * 事件处置流水记录表 服务类
+ *
+ * @author system
+ * @since 2026-07-29
+ */
+public interface IGdClueDisposeRecordService extends BaseService<GdClueDisposeRecordEntity> {
+
+ /**
+ * 根据事件ID查询处置记录列表
+ * <p>
+ * 按操作时间升序排列
+ * </p>
+ *
+ * @param eventId 事件ID
+ * @return 处置记录列表
+ */
+ List<GdClueDisposeRecordVO> getDisposeRecordsByEventId(Long eventId);
+
+ /**
+ * 新增处置记录
+ * <p>
+ * 支持同步更新事件状态
+ * </p>
+ *
+ * @param addParam 新增参数
+ * @return 是否成功
+ */
+ boolean addDisposeRecord(GdClueDisposeRecordAddParam addParam);
+
+}
\ No newline at end of file
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdClueEventService.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdClueEventService.java
index 6c32d08..bf37ae8 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdClueEventService.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdClueEventService.java
@@ -20,6 +20,7 @@
import org.sxkj.gd.workorder.entity.GdClueEventEntity;
import org.sxkj.gd.workorder.param.GdClueEventDistributeParam;
import org.sxkj.gd.workorder.param.GdClueEventRejectParam;
+import org.sxkj.gd.workorder.param.GdClueEventStatusUpdateParam;
import org.sxkj.gd.workorder.vo.GdClueEventCountVO;
import org.sxkj.gd.workorder.vo.GdClueEventListVO;
import org.sxkj.gd.workorder.vo.GdClueEventVO;
@@ -111,4 +112,15 @@
*/
boolean saveOrUpdateExternal(GdClueEventEntity gdClueEvent);
+ /**
+ * 更新事件状态
+ * <p>
+ * 必须符合状态流转矩阵规则,并插入状态流转记录
+ * </p>
+ *
+ * @param updateParam 状态更新参数
+ * @return 是否操作成功
+ */
+ boolean updateEventStatus(GdClueEventStatusUpdateParam updateParam);
+
}
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdClueEventStatusFlowService.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdClueEventStatusFlowService.java
new file mode 100644
index 0000000..2121695
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdClueEventStatusFlowService.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.sxkj.gd.workorder.service;
+
+import org.sxkj.gd.workorder.entity.GdClueEventStatusFlowEntity;
+import org.sxkj.gd.workorder.vo.GdClueEventStatusFlowVO;
+import org.springblade.core.mp.base.BaseService;
+
+import java.util.List;
+
+/**
+ * 事件状态流转履历表 服务类
+ *
+ * @author system
+ * @since 2026-07-29
+ */
+public interface IGdClueEventStatusFlowService extends BaseService<GdClueEventStatusFlowEntity> {
+
+ /**
+ * 根据事件ID查询状态流转记录列表
+ * <p>
+ * 按操作时间升序排列,用于时间线展示
+ * </p>
+ *
+ * @param eventId 事件ID
+ * @return 状态流转记录列表
+ */
+ List<GdClueEventStatusFlowVO> getStatusFlowsByEventId(Long eventId);
+
+ /**
+ * 插入状态流转记录
+ * <p>
+ * 仅用于内部调用,不允许外部修改
+ * </p>
+ *
+ * @param eventId 事件ID
+ * @param oldStatus 变更前状态
+ * @param newStatus 变更后状态
+ * @param operateContent 操作备注
+ * @param operateTime 操作时间
+ * @return 是否成功
+ */
+ boolean insertStatusFlow(Long eventId, Integer oldStatus, Integer newStatus, String operateContent, java.util.Date operateTime);
+
+}
\ No newline at end of file
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueDisposeRecordServiceImpl.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueDisposeRecordServiceImpl.java
new file mode 100644
index 0000000..674384d
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueDisposeRecordServiceImpl.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.sxkj.gd.workorder.service.impl;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.Func;
+import org.sxkj.gd.workorder.entity.GdClueDisposeRecordEntity;
+import org.sxkj.gd.workorder.entity.GdClueEventEntity;
+import org.sxkj.gd.workorder.enums.EventStatusEnum;
+import org.sxkj.gd.workorder.mapper.GdClueDisposeRecordMapper;
+import org.sxkj.gd.workorder.param.GdClueDisposeRecordAddParam;
+import org.sxkj.gd.workorder.service.IGdClueDisposeRecordService;
+import org.sxkj.gd.workorder.service.IGdClueEventService;
+import org.sxkj.gd.workorder.service.IGdClueEventStatusFlowService;
+import org.sxkj.gd.workorder.vo.GdClueDisposeRecordVO;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springblade.core.mp.base.BaseServiceImpl;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 事件处置流水记录表 服务实现类
+ *
+ * @author system
+ * @since 2026-07-29
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class GdClueDisposeRecordServiceImpl extends BaseServiceImpl<GdClueDisposeRecordMapper, GdClueDisposeRecordEntity> implements IGdClueDisposeRecordService {
+
+ private final IGdClueEventService gdClueEventService;
+ private final IGdClueEventStatusFlowService gdClueEventStatusFlowService;
+
+ /**
+ * 根据事件ID查询处置记录列表
+ * <p>
+ * 步骤:
+ * 1. 参数校验
+ * 2. 查询处置记录列表
+ * 3. 补充状态名称
+ * </p>
+ *
+ * @param eventId 事件ID
+ * @return 处置记录列表
+ */
+ @Override
+ public List<GdClueDisposeRecordVO> getDisposeRecordsByEventId(Long eventId) {
+ // 1. 参数校验
+ if (eventId == null) {
+ throw new RuntimeException("事件ID不能为空");
+ }
+
+ // 2. 查询处置记录列表
+ List<GdClueDisposeRecordVO> records = baseMapper.selectDisposeRecordsByEventId(eventId);
+
+ // 3. 补充状态名称和类型名称
+ if (Func.isNotEmpty(records)) {
+ records.forEach(record -> {
+ // 补充记录类型名称
+ if (record.getRecordType() != null) {
+ record.setRecordTypeName(record.getRecordType() == 0 ? "核查记录" : "处置记录");
+ }
+ // 补充处置状态名称
+ if (record.getDisposeStatus() != null) {
+ record.setDisposeStatusName(EventStatusEnum.getNameByCode(record.getDisposeStatus()));
+ }
+ });
+ }
+
+ return records;
+ }
+
+ /**
+ * 新增处置记录
+ * <p>
+ * 步骤:
+ * 1. 参数校验
+ * 2. 查询事件信息
+ * 3. 如果需要同步更新事件状态,则更新事件状态
+ * 4. 构建处置记录实体
+ * 5. 保存处置记录
+ * </p>
+ *
+ * @param addParam 新增参数
+ * @return 是否成功
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean addDisposeRecord(GdClueDisposeRecordAddParam addParam) {
+ // 1. 参数校验
+ if (addParam == null || addParam.getEventId() == null) {
+ throw new RuntimeException("参数不能为空");
+ }
+ if (addParam.getRecordType() == null) {
+ throw new RuntimeException("记录类型不能为空");
+ }
+ if (addParam.getOperateTime() == null) {
+ throw new RuntimeException("操作时间不能为空");
+ }
+
+ // 2. 查询事件信息
+ GdClueEventEntity eventEntity = gdClueEventService.getById(addParam.getEventId());
+ if (eventEntity == null || (eventEntity.getIsDeleted() != null && eventEntity.getIsDeleted() != 0)) {
+ throw new RuntimeException("事件不存在");
+ }
+
+ Integer oldStatus = eventEntity.getEventStatus();
+
+ // 3. 如果需要同步更新事件状态,则更新事件状态
+ if (addParam.getUpdateEventStatus() != null && addParam.getUpdateEventStatus()
+ && addParam.getTargetEventStatus() != null) {
+ // 校验目标状态合法性
+ if (!EventStatusEnum.isValidCode(addParam.getTargetEventStatus())) {
+ throw new RuntimeException("目标状态编码无效");
+ }
+
+ // 校验状态流转合法性
+ if (!EventStatusEnum.isValidTransition(oldStatus, addParam.getTargetEventStatus())) {
+ String oldStatusName = EventStatusEnum.getNameByCode(oldStatus);
+ String newStatusName = EventStatusEnum.getNameByCode(addParam.getTargetEventStatus());
+ throw new RuntimeException(String.format("状态流转非法:不允许从[%s]流转到[%s]", oldStatusName, newStatusName));
+ }
+
+ // 更新事件状态
+ eventEntity.setEventStatus(addParam.getTargetEventStatus());
+ eventEntity.setUpdateUser(AuthUtil.getUserId());
+ eventEntity.setUpdateTime(new Date());
+ if (!gdClueEventService.updateById(eventEntity)) {
+ throw new RuntimeException("更新事件状态失败");
+ }
+
+ // 插入状态流转记录
+ gdClueEventStatusFlowService.insertStatusFlow(
+ addParam.getEventId(),
+ oldStatus,
+ addParam.getTargetEventStatus(),
+ addParam.getDisposeContent(),
+ addParam.getOperateTime()
+ );
+ }
+
+ // 4. 构建处置记录实体
+ GdClueDisposeRecordEntity recordEntity = new GdClueDisposeRecordEntity();
+ recordEntity.setEventId(addParam.getEventId());
+ recordEntity.setRecordType(addParam.getRecordType());
+ recordEntity.setDisposeContent(addParam.getDisposeContent());
+ recordEntity.setAttachUrl(addParam.getAttachUrl());
+ recordEntity.setOperateTime(addParam.getOperateTime());
+ recordEntity.setDisposeStatus(eventEntity.getEventStatus());
+ recordEntity.setDisposeUser(AuthUtil.getUserId());
+ recordEntity.setDisposeDept(Long.valueOf(AuthUtil.getDeptId()));
+ recordEntity.setCreateUser(AuthUtil.getUserId());
+ recordEntity.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+ recordEntity.setCreateTime(new Date());
+
+ // 5. 保存处置记录
+ return save(recordEntity);
+ }
+
+}
\ No newline at end of file
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueEventServiceImpl.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueEventServiceImpl.java
index 5441dab..d2eb888 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueEventServiceImpl.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueEventServiceImpl.java
@@ -26,11 +26,14 @@
import org.sxkj.common.utils.OrderNumUtils;
import org.sxkj.gd.workorder.entity.GdClueEventEntity;
import org.sxkj.gd.workorder.entity.GdTaskResultEntity;
+import org.sxkj.gd.workorder.enums.EventStatusEnum;
import org.sxkj.gd.workorder.excel.GdClueEventExcel;
import org.sxkj.gd.workorder.mapper.GdClueEventMapper;
import org.sxkj.gd.workorder.param.GdClueEventDistributeParam;
import org.sxkj.gd.workorder.param.GdClueEventRejectParam;
+import org.sxkj.gd.workorder.param.GdClueEventStatusUpdateParam;
import org.sxkj.gd.workorder.service.IGdClueEventService;
+import org.sxkj.gd.workorder.service.IGdClueEventStatusFlowService;
import org.sxkj.gd.workorder.service.IGdTaskResultService;
import org.sxkj.gd.workorder.vo.GdClueEventCountVO;
import org.sxkj.gd.workorder.vo.GdClueEventListVO;
@@ -55,6 +58,7 @@
public class GdClueEventServiceImpl extends BaseServiceImpl<GdClueEventMapper, GdClueEventEntity> implements IGdClueEventService {
private final IGdTaskResultService gdTaskResultService;
+ private final IGdClueEventStatusFlowService gdClueEventStatusFlowService;
@Override
public IPage<GdClueEventVO> selectGdClueEventPage(IPage<GdClueEventVO> page, GdClueEventVO gdClueEvent) {
@@ -94,15 +98,25 @@
@Override
public GdClueEventCountVO getGdClueEventCount(String keyword) {
+ // 1. 获取当前用户部门ID和用户ID
Long deptId = Long.valueOf(AuthUtil.getDeptId());
Long userId = AuthUtil.getUserId();
+
+ // 2. 查询统计数据
GdClueEventCountVO countVO = baseMapper.selectGdClueEventCount(deptId, userId, keyword);
+
+ // 3. 处理空结果,返回默认值
if (countVO == null) {
GdClueEventCountVO empty = new GdClueEventCountVO();
empty.setTotalCount(0L);
empty.setMyCount(0L);
+ empty.setReturnedCount(0L);
+ empty.setDisposedCount(0L);
+ empty.setCompletedCount(0L);
return empty;
}
+
+ // 4. 返回统计结果
return countVO;
}
@@ -217,4 +231,69 @@
return saveOrUpdate(gdClueEvent);
}
+ /**
+ * 更新事件状态
+ * <p>
+ * 步骤:
+ * 1. 参数校验
+ * 2. 查询事件信息
+ * 3. 校验状态流转合法性
+ * 4. 更新事件状态
+ * 5. 插入状态流转记录
+ * </p>
+ *
+ * @param updateParam 状态更新参数
+ * @return 是否操作成功
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean updateEventStatus(GdClueEventStatusUpdateParam updateParam) {
+ // 1. 参数校验
+ if (updateParam == null || updateParam.getEventId() == null) {
+ throw new RuntimeException("参数不能为空");
+ }
+ if (updateParam.getTargetStatus() == null) {
+ throw new RuntimeException("目标状态不能为空");
+ }
+
+ // 2. 查询事件信息
+ GdClueEventEntity eventEntity = getById(updateParam.getEventId());
+ if (eventEntity == null || (eventEntity.getIsDeleted() != null && eventEntity.getIsDeleted() != 0)) {
+ throw new RuntimeException("事件不存在");
+ }
+
+ Integer oldStatus = eventEntity.getEventStatus();
+ Integer targetStatus = updateParam.getTargetStatus();
+
+ // 3. 校验状态流转合法性
+ if (!EventStatusEnum.isValidCode(targetStatus)) {
+ throw new RuntimeException("目标状态编码无效");
+ }
+
+ if (!EventStatusEnum.isValidTransition(oldStatus, targetStatus)) {
+ String oldStatusName = EventStatusEnum.getNameByCode(oldStatus);
+ String newStatusName = EventStatusEnum.getNameByCode(targetStatus);
+ throw new RuntimeException(String.format("状态流转非法:不允许从[%s]流转到[%s]", oldStatusName, newStatusName));
+ }
+
+ // 4. 更新事件状态
+ eventEntity.setEventStatus(targetStatus);
+ eventEntity.setUpdateUser(AuthUtil.getUserId());
+ eventEntity.setUpdateTime(new Date());
+ if (!updateById(eventEntity)) {
+ throw new RuntimeException("更新事件状态失败");
+ }
+
+ // 5. 插入状态流转记录
+ gdClueEventStatusFlowService.insertStatusFlow(
+ updateParam.getEventId(),
+ oldStatus,
+ targetStatus,
+ updateParam.getOperateContent(),
+ updateParam.getOperateTime() != null ? updateParam.getOperateTime() : new Date()
+ );
+
+ return true;
+ }
+
}
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueEventStatusFlowServiceImpl.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueEventStatusFlowServiceImpl.java
new file mode 100644
index 0000000..03e9432
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueEventStatusFlowServiceImpl.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.sxkj.gd.workorder.service.impl;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.sxkj.gd.workorder.entity.GdClueEventStatusFlowEntity;
+import org.sxkj.gd.workorder.enums.EventStatusEnum;
+import org.sxkj.gd.workorder.mapper.GdClueEventStatusFlowMapper;
+import org.sxkj.gd.workorder.service.IGdClueEventStatusFlowService;
+import org.sxkj.gd.workorder.vo.GdClueEventStatusFlowVO;
+import org.springframework.stereotype.Service;
+import org.springblade.core.mp.base.BaseServiceImpl;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 事件状态流转履历表 服务实现类
+ *
+ * @author system
+ * @since 2026-07-29
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class GdClueEventStatusFlowServiceImpl extends BaseServiceImpl<GdClueEventStatusFlowMapper, GdClueEventStatusFlowEntity> implements IGdClueEventStatusFlowService {
+
+ /**
+ * 根据事件ID查询状态流转记录列表
+ * <p>
+ * 步骤:
+ * 1. 参数校验
+ * 2. 查询状态流转记录列表
+ * 3. 补充状态名称
+ * </p>
+ *
+ * @param eventId 事件ID
+ * @return 状态流转记录列表
+ */
+ @Override
+ public List<GdClueEventStatusFlowVO> getStatusFlowsByEventId(Long eventId) {
+ // 1. 参数校验
+ if (eventId == null) {
+ throw new RuntimeException("事件ID不能为空");
+ }
+
+ // 2. 查询状态流转记录列表
+ List<GdClueEventStatusFlowVO> flows = baseMapper.selectStatusFlowsByEventId(eventId);
+
+ // 3. 补充状态名称
+ if (flows != null && !flows.isEmpty()) {
+ flows.forEach(flow -> {
+ // 补充变更前状态名称
+ if (flow.getOldStatus() != null) {
+ flow.setOldStatusName(EventStatusEnum.getNameByCode(flow.getOldStatus()));
+ }
+ // 补充变更后状态名称
+ if (flow.getNewStatus() != null) {
+ flow.setNewStatusName(EventStatusEnum.getNameByCode(flow.getNewStatus()));
+ }
+ });
+ }
+
+ return flows;
+ }
+
+ /**
+ * 插入状态流转记录
+ * <p>
+ * 步骤:
+ * 1. 参数校验
+ * 2. 构建状态流转记录实体
+ * 3. 保存状态流转记录
+ * </p>
+ *
+ * @param eventId 事件ID
+ * @param oldStatus 变更前状态
+ * @param newStatus 变更后状态
+ * @param operateContent 操作备注
+ * @param operateTime 操作时间
+ * @return 是否成功
+ */
+ @Override
+ public boolean insertStatusFlow(Long eventId, Integer oldStatus, Integer newStatus, String operateContent, Date operateTime) {
+ // 1. 参数校验
+ if (eventId == null) {
+ throw new RuntimeException("事件ID不能为空");
+ }
+ if (newStatus == null) {
+ throw new RuntimeException("目标状态不能为空");
+ }
+
+ // 2. 构建状态流转记录实体
+ GdClueEventStatusFlowEntity flowEntity = new GdClueEventStatusFlowEntity();
+ flowEntity.setEventId(eventId);
+ flowEntity.setOldStatus(oldStatus);
+ flowEntity.setNewStatus(newStatus);
+ flowEntity.setOperateContent(operateContent);
+ flowEntity.setOperateTime(operateTime != null ? operateTime : new Date());
+ flowEntity.setOperateUser(AuthUtil.getUserId());
+ flowEntity.setOperateDept(Long.valueOf(AuthUtil.getDeptId()));
+ flowEntity.setCreateUser(AuthUtil.getUserId());
+ flowEntity.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+ flowEntity.setCreateTime(new Date());
+
+ // 3. 保存状态流转记录
+ return save(flowEntity);
+ }
+
+}
\ No newline at end of file
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueDisposeRecordVO.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueDisposeRecordVO.java
new file mode 100644
index 0000000..47d36df
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueDisposeRecordVO.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.sxkj.gd.workorder.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 事件处置流水记录表 视图实体类
+ * <p>
+ * 用于展示事件处置记录信息,包括核查记录和处置记录
+ * </p>
+ *
+ * @author system
+ * @since 2026-07-29
+ */
+@Data
+@ApiModel(value = "GdClueDisposeRecordVO对象", description = "事件处置流水记录表")
+public class GdClueDisposeRecordVO {
+
+ /**
+ * 记录ID(主键)
+ */
+ @ApiModelProperty(value = "记录ID")
+ private Long id;
+
+ /**
+ * 关联事件ID
+ */
+ @ApiModelProperty(value = "关联事件ID")
+ private Long eventId;
+
+ /**
+ * 记录类型:0核查记录、1处置记录
+ */
+ @ApiModelProperty(value = "记录类型:0核查记录、1处置记录")
+ private Integer recordType;
+
+ /**
+ * 记录类型名称
+ */
+ @ApiModelProperty(value = "记录类型名称")
+ private String recordTypeName;
+
+ /**
+ * 处置操作人
+ */
+ @ApiModelProperty(value = "处置操作人")
+ private Long disposeUser;
+
+ /**
+ * 处置操作人姓名
+ */
+ @ApiModelProperty(value = "处置操作人姓名")
+ private String disposeUserName;
+
+ /**
+ * 处置操作部门
+ */
+ @ApiModelProperty(value = "处置操作部门")
+ private Long disposeDept;
+
+ /**
+ * 处置操作部门名称
+ */
+ @ApiModelProperty(value = "处置操作部门名称")
+ private String disposeDeptName;
+
+ /**
+ * 处置状态:0待确认、1处置中、2已退回、3已处置、4已完成
+ */
+ @ApiModelProperty(value = "处置状态")
+ private Integer disposeStatus;
+
+ /**
+ * 处置状态名称
+ */
+ @ApiModelProperty(value = "处置状态名称")
+ private String disposeStatusName;
+
+ /**
+ * 处置文字说明
+ */
+ @ApiModelProperty(value = "处置文字说明")
+ private String disposeContent;
+
+ /**
+ * 现场附件图片URL数组
+ */
+ @ApiModelProperty(value = "现场附件图片URL数组")
+ private List<String> attachUrl;
+
+ /**
+ * 实际操作时间
+ */
+ @ApiModelProperty(value = "实际操作时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date operateTime;
+
+ /**
+ * 记录创建时间
+ */
+ @ApiModelProperty(value = "记录创建时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date createTime;
+
+}
\ No newline at end of file
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventCountVO.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventCountVO.java
index c2a1027..8ac4cb2 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventCountVO.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventCountVO.java
@@ -36,4 +36,13 @@
@ApiModelProperty(value = "我的工单数量")
private Long myCount;
+
+ @ApiModelProperty(value = "已退回工单数量(状态2)")
+ private Long returnedCount;
+
+ @ApiModelProperty(value = "已处置工单数量(状态3)")
+ private Long disposedCount;
+
+ @ApiModelProperty(value = "已完成工单数量(状态4)")
+ private Long completedCount;
}
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventDetailVO.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventDetailVO.java
new file mode 100644
index 0000000..f3e8ef2
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventDetailVO.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.sxkj.gd.workorder.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 事件详情VO
+ * <p>
+ * 包含事件基本信息、处置记录时间线和状态流转时间线
+ * </p>
+ *
+ * @author system
+ * @since 2026-07-29
+ */
+@Data
+@ApiModel(value = "GdClueEventDetailVO对象", description = "事件详情VO")
+public class GdClueEventDetailVO {
+
+ /**
+ * 事件基本信息
+ */
+ @ApiModelProperty(value = "事件基本信息")
+ private GdClueEventVO eventInfo;
+
+ /**
+ * 处置记录时间线(按操作时间升序)
+ */
+ @ApiModelProperty(value = "处置记录时间线")
+ private List<GdClueDisposeRecordVO> disposeRecords;
+
+ /**
+ * 状态流转时间线(按操作时间升序)
+ */
+ @ApiModelProperty(value = "状态流转时间线")
+ private List<GdClueEventStatusFlowVO> statusFlows;
+
+}
\ No newline at end of file
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventStatusFlowVO.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventStatusFlowVO.java
new file mode 100644
index 0000000..78a44b2
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventStatusFlowVO.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.sxkj.gd.workorder.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 事件状态流转履历表 视图实体类
+ * <p>
+ * 用于展示事件状态变更历史,仅用于审计
+ * </p>
+ *
+ * @author system
+ * @since 2026-07-29
+ */
+@Data
+@ApiModel(value = "GdClueEventStatusFlowVO对象", description = "事件状态流转履历表")
+public class GdClueEventStatusFlowVO {
+
+ /**
+ * 流转记录ID(主键)
+ */
+ @ApiModelProperty(value = "流转记录ID")
+ private Long id;
+
+ /**
+ * 关联事件ID
+ */
+ @ApiModelProperty(value = "关联事件ID")
+ private Long eventId;
+
+ /**
+ * 变更前状态
+ */
+ @ApiModelProperty(value = "变更前状态")
+ private Integer oldStatus;
+
+ /**
+ * 变更前状态名称
+ */
+ @ApiModelProperty(value = "变更前状态名称")
+ private String oldStatusName;
+
+ /**
+ * 变更后状态
+ */
+ @ApiModelProperty(value = "变更后状态")
+ private Integer newStatus;
+
+ /**
+ * 变更后状态名称
+ */
+ @ApiModelProperty(value = "变更后状态名称")
+ private String newStatusName;
+
+ /**
+ * 状态变更操作人
+ */
+ @ApiModelProperty(value = "状态变更操作人")
+ private Long operateUser;
+
+ /**
+ * 状态变更操作人姓名
+ */
+ @ApiModelProperty(value = "状态变更操作人姓名")
+ private String operateUserName;
+
+ /**
+ * 状态变更操作部门
+ */
+ @ApiModelProperty(value = "状态变更操作部门")
+ private Long operateDept;
+
+ /**
+ * 状态变更操作部门名称
+ */
+ @ApiModelProperty(value = "状态变更操作部门名称")
+ private String operateDeptName;
+
+ /**
+ * 状态变更备注说明
+ */
+ @ApiModelProperty(value = "状态变更备注说明")
+ private String operateContent;
+
+ /**
+ * 状态变更时间
+ */
+ @ApiModelProperty(value = "状态变更时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date operateTime;
+
+ /**
+ * 记录创建时间
+ */
+ @ApiModelProperty(value = "记录创建时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date createTime;
+
+}
\ No newline at end of file
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventVO.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventVO.java
index 21bcfae..2d98d88 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventVO.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdClueEventVO.java
@@ -68,9 +68,9 @@
@ApiModelProperty(value = "纬度")
private Double latitude;
/**
- * 状态:0未分发、1已分发、2已驳回、3已确认
+ * 状态:0待确认、1处置中、2已退回、3已处置、4已完成
*/
- @ApiModelProperty(value = "状态:0未分发、1已分发、2已驳回、3已确认")
+ @ApiModelProperty(value = "状态:0待确认、1处置中、2已退回、3已处置、4已完成")
private Integer eventStatus;
/**
* 区域编码
--
Gitblit v1.9.3