diff --git a/backend/src/main/java/com/yfd/platform/data/controller/ApprovalChangeLogController.java b/backend/src/main/java/com/yfd/platform/data/controller/ApprovalChangeLogController.java
new file mode 100644
index 0000000..ad92308
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/controller/ApprovalChangeLogController.java
@@ -0,0 +1,76 @@
+package com.yfd.platform.data.controller;
+
+import com.yfd.platform.config.ResponseResult;
+import com.yfd.platform.data.domain.ApprovalChangeLog;
+import com.yfd.platform.data.service.IApprovalChangeLogService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ * 审批数据变更记录表 前端控制器
+ *
+ */
+@RestController
+@RequestMapping("/data/approvalChangeLog")
+@Tag(name = "变更记录")
+public class ApprovalChangeLogController {
+
+ @Resource
+ private IApprovalChangeLogService approvalChangeLogService;
+
+ @GetMapping("/list")
+ @Operation(summary = "查询变更记录列表")
+ public ResponseResult list() {
+ List list = approvalChangeLogService.list();
+ return ResponseResult.successData(list);
+ }
+
+ @GetMapping("/getByApprovalId")
+ @Operation(summary = "根据审批批次ID查询变更记录")
+ public ResponseResult getByApprovalId(@RequestParam String approvalId) {
+ List list = approvalChangeLogService.getByApprovalId(approvalId);
+ return ResponseResult.successData(list);
+ }
+
+ @GetMapping("/getByDataId")
+ @Operation(summary = "根据草稿数据ID查询变更记录")
+ public ResponseResult getByDataId(@RequestParam String dataId) {
+ List list = approvalChangeLogService.getByDataId(dataId);
+ return ResponseResult.successData(list);
+ }
+
+ @GetMapping("/getByBizType")
+ @Operation(summary = "根据业务类型查询")
+ public ResponseResult getByBizType(@RequestParam String bizType) {
+ List list = approvalChangeLogService.getByBizType(bizType);
+ return ResponseResult.successData(list);
+ }
+
+ @GetMapping("/getById")
+ @Operation(summary = "根据ID查询变更记录")
+ public ResponseResult getById(@RequestParam Long id) {
+ ApprovalChangeLog changeLog = approvalChangeLogService.getById(id);
+ return ResponseResult.successData(changeLog);
+ }
+
+ @PostMapping("/add")
+ @Operation(summary = "新增变更记录")
+ public ResponseResult add(@RequestBody ApprovalChangeLog changeLog) {
+ changeLog.setCreatedAt(new Date());
+ boolean result = approvalChangeLogService.save(changeLog);
+ return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败");
+ }
+
+ @PostMapping("/delete")
+ @Operation(summary = "删除变更记录")
+ public ResponseResult delete(@RequestParam Long id) {
+ boolean result = approvalChangeLogService.removeById(id);
+ return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败");
+ }
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/controller/ApprovalLogController.java b/backend/src/main/java/com/yfd/platform/data/controller/ApprovalLogController.java
new file mode 100644
index 0000000..d17534c
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/controller/ApprovalLogController.java
@@ -0,0 +1,69 @@
+package com.yfd.platform.data.controller;
+
+import com.yfd.platform.config.ResponseResult;
+import com.yfd.platform.data.domain.ApprovalLog;
+import com.yfd.platform.data.service.IApprovalLogService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ * 审批操作日志表 前端控制器
+ *
+ */
+@RestController
+@RequestMapping("/data/approvalLog")
+@Tag(name = "审批日志")
+public class ApprovalLogController {
+
+ @Resource
+ private IApprovalLogService approvalLogService;
+
+ @GetMapping("/list")
+ @Operation(summary = "查询审批日志列表")
+ public ResponseResult list() {
+ List list = approvalLogService.list();
+ return ResponseResult.successData(list);
+ }
+
+ @GetMapping("/getByApprovalId")
+ @Operation(summary = "根据审批批次ID查询日志")
+ public ResponseResult getByApprovalId(@RequestParam String approvalId) {
+ List list = approvalLogService.getByApprovalId(approvalId);
+ return ResponseResult.successData(list);
+ }
+
+ @GetMapping("/getByAction")
+ @Operation(summary = "根据操作类型查询")
+ public ResponseResult getByAction(@RequestParam String action) {
+ List list = approvalLogService.getByAction(action);
+ return ResponseResult.successData(list);
+ }
+
+ @GetMapping("/getById")
+ @Operation(summary = "根据ID查询日志")
+ public ResponseResult getById(@RequestParam Long id) {
+ ApprovalLog approvalLog = approvalLogService.getById(id);
+ return ResponseResult.successData(approvalLog);
+ }
+
+ @PostMapping("/add")
+ @Operation(summary = "新增日志")
+ public ResponseResult add(@RequestBody ApprovalLog approvalLog) {
+ approvalLog.setCreatedAt(new Date());
+ boolean result = approvalLogService.save(approvalLog);
+ return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败");
+ }
+
+ @PostMapping("/delete")
+ @Operation(summary = "删除日志")
+ public ResponseResult delete(@RequestParam Long id) {
+ boolean result = approvalLogService.removeById(id);
+ return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败");
+ }
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/controller/ApprovalMainController.java b/backend/src/main/java/com/yfd/platform/data/controller/ApprovalMainController.java
new file mode 100644
index 0000000..9ee0ee2
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/controller/ApprovalMainController.java
@@ -0,0 +1,101 @@
+package com.yfd.platform.data.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yfd.platform.config.ResponseResult;
+import com.yfd.platform.data.domain.ApprovalMain;
+import com.yfd.platform.data.service.IApprovalMainService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+
+/**
+ *
+ * 审批批次主表 前端控制器
+ *
+ */
+@RestController
+@RequestMapping("/data/approvalMain")
+@Tag(name = "审批管理")
+public class ApprovalMainController {
+
+ @Resource
+ private IApprovalMainService approvalMainService;
+
+ @GetMapping("/page")
+ @Operation(summary = "分页查询审批列表")
+ public ResponseResult queryPageList(
+ @RequestParam(defaultValue = "1") Integer current,
+ @RequestParam(defaultValue = "10") Integer size,
+ @RequestParam(required = false) String bizType,
+ @RequestParam(required = false) String status) {
+ Page page = new Page<>(current, size);
+ Page result = approvalMainService.queryPageList(page, bizType, status);
+ return ResponseResult.successData(result);
+ }
+
+ @GetMapping("/getById")
+ @Operation(summary = "根据ID查询审批")
+ public ResponseResult getById(@RequestParam Long id) {
+ ApprovalMain approvalMain = approvalMainService.getById(id);
+ return ResponseResult.successData(approvalMain);
+ }
+
+ @GetMapping("/getByApprovalNo")
+ @Operation(summary = "根据审批批次号查询")
+ public ResponseResult getByApprovalNo(@RequestParam String approvalNo) {
+ ApprovalMain approvalMain = approvalMainService.getByApprovalNo(approvalNo);
+ return ResponseResult.successData(approvalMain);
+ }
+
+ @PostMapping("/submit")
+ @Operation(summary = "提交审批")
+ public ResponseResult submitApproval(@RequestBody ApprovalMain approvalMain) {
+ boolean result = approvalMainService.submitApproval(approvalMain);
+ return result ? ResponseResult.success("提交成功") : ResponseResult.error("提交失败");
+ }
+
+ @PostMapping("/approve")
+ @Operation(summary = "审批通过")
+ public ResponseResult approve(@RequestParam String id,
+ @RequestParam String approverId,
+ @RequestParam(required = false) String comment) {
+ boolean result = approvalMainService.approve(id, approverId, comment);
+ return result ? ResponseResult.success("审批通过") : ResponseResult.error("审批失败");
+ }
+
+ @PostMapping("/reject")
+ @Operation(summary = "审批驳回")
+ public ResponseResult reject(@RequestParam String id,
+ @RequestParam String approverId,
+ @RequestParam(required = false) String comment) {
+ boolean result = approvalMainService.reject(id, approverId, comment);
+ return result ? ResponseResult.success("审批驳回") : ResponseResult.error("审批失败");
+ }
+
+ @PostMapping("/add")
+ @Operation(summary = "新增审批")
+ public ResponseResult add(@RequestBody ApprovalMain approvalMain) {
+ approvalMain.setCreatedAt(new Date());
+ approvalMain.setUpdatedAt(new Date());
+ boolean result = approvalMainService.save(approvalMain);
+ return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败");
+ }
+
+ @PostMapping("/update")
+ @Operation(summary = "修改审批")
+ public ResponseResult update(@RequestBody ApprovalMain approvalMain) {
+ approvalMain.setUpdatedAt(new Date());
+ boolean result = approvalMainService.updateById(approvalMain);
+ return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败");
+ }
+
+ @PostMapping("/delete")
+ @Operation(summary = "删除审批")
+ public ResponseResult delete(@RequestParam Long id) {
+ boolean result = approvalMainService.removeById(id);
+ return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败");
+ }
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java b/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java
new file mode 100644
index 0000000..ea55c4a
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java
@@ -0,0 +1,167 @@
+package com.yfd.platform.data.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yfd.platform.common.DataSourceLoadOptionsBase;
+import com.yfd.platform.common.DataSourceRequest;
+import com.yfd.platform.config.ResponseResult;
+import com.yfd.platform.data.domain.FishDraftData;
+import com.yfd.platform.data.service.IFishDraftDataService;
+import com.yfd.platform.utils.KendoUtil;
+import com.yfd.platform.utils.QgcQueryWrapperUtil;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ * 过鱼数据草稿表 前端控制器
+ *
+ */
+@RestController
+@RequestMapping("/data/fishDraft")
+@Tag(name = "过鱼数据")
+public class FishDraftDataController {
+
+ @Resource
+ private IFishDraftDataService fishDraftDataService;
+
+// @GetMapping("/page")
+// @Operation(summary = "分页查询过鱼数据")
+// public ResponseResult queryPageList(
+// @RequestParam(defaultValue = "1") Integer current,
+// @RequestParam(defaultValue = "10") Integer size,
+// @RequestParam(required = false) String stcd,
+// @RequestParam(required = false) String status,
+// @RequestParam(required = false) String ftp) {
+// Page page = new Page<>(current, size);
+// Page result = fishDraftDataService.queryPageList(page, stcd, status, ftp);
+// return ResponseResult.successData(result);
+// }
+
+ @PostMapping("/page")
+ @Operation(summary = "分页查询过鱼数据")
+ public ResponseResult queryPageList(@RequestBody DataSourceRequest dataSourceRequest) {
+ Page page = KendoUtil.getPage(dataSourceRequest);
+ DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest();
+ String stcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd");
+ String status = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "status");
+ String ftp = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "ftp");
+ Page result = fishDraftDataService.queryPageList(page, stcd, status, ftp);
+ return ResponseResult.successData(result);
+ }
+
+ @GetMapping("/list")
+ @Operation(summary = "查询过鱼数据列表")
+ public ResponseResult list() {
+ List list = fishDraftDataService.list();
+ return ResponseResult.successData(list);
+ }
+
+ @GetMapping("/getById")
+ @Operation(summary = "根据ID查询")
+ public ResponseResult getById(@RequestParam Long id) {
+ FishDraftData fishDraftData = fishDraftDataService.getById(id);
+ return ResponseResult.successData(fishDraftData);
+ }
+
+ @GetMapping("/getByApprovalId")
+ @Operation(summary = "根据审批批次ID查询")
+ public ResponseResult getByApprovalId(@RequestParam Long approvalId) {
+ List list = fishDraftDataService.getByApprovalId(approvalId);
+ return ResponseResult.successData(list);
+ }
+
+ @GetMapping("/getByStatus")
+ @Operation(summary = "根据状态查询")
+ public ResponseResult getByStatus(@RequestParam String status) {
+ List list = fishDraftDataService.getByStatus(status);
+ return ResponseResult.successData(list);
+ }
+
+ @GetMapping("/getByStcd")
+ @Operation(summary = "根据电站编码查询")
+ public ResponseResult getByStcd(@RequestParam String stcd) {
+ List list = fishDraftDataService.getByStcd(stcd);
+ return ResponseResult.successData(list);
+ }
+
+ @PostMapping("/saveDraft")
+ @Operation(summary = "保存草稿")
+ public ResponseResult saveDraft(@RequestBody FishDraftData fishDraftData) {
+ boolean result = fishDraftDataService.saveDraft(fishDraftData);
+ return result ? ResponseResult.success("保存成功") : ResponseResult.error("保存失败");
+ }
+
+ @PostMapping("/updateDraft")
+ @Operation(summary = "更新草稿")
+ public ResponseResult updateDraft(@RequestBody FishDraftData fishDraftData) {
+ boolean result = fishDraftDataService.updateDraft(fishDraftData);
+ return result ? ResponseResult.success("更新成功") : ResponseResult.error("更新失败");
+ }
+
+ @PostMapping("/removeDraft")
+ @Operation(summary = "删除草稿(软删除)")
+ public ResponseResult removeDraft(@RequestParam Long id,
+ @RequestParam String operatorId) {
+ boolean result = fishDraftDataService.removeDraft(id, operatorId);
+ return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败");
+ }
+
+ @PostMapping("/submitDraft")
+ @Operation(summary = "提交草稿")
+ public ResponseResult submitDraft(@RequestParam Long id,
+ @RequestParam String operatorId) {
+ boolean result = fishDraftDataService.submitDraft(id, operatorId);
+ return result ? ResponseResult.success("提交成功") : ResponseResult.error("提交失败");
+ }
+
+ @PostMapping("/submitDrafts")
+ @Operation(summary = "批量提交草稿")
+ public ResponseResult submitDrafts(@RequestBody List ids,
+ @RequestParam String operatorId) {
+ boolean result = fishDraftDataService.submitDrafts(ids, operatorId);
+ return result ? ResponseResult.success("提交成功") : ResponseResult.error("提交失败");
+ }
+
+ @PostMapping("/lockDraft")
+ @Operation(summary = "锁定草稿")
+ public ResponseResult lockDraft(@RequestParam Long id) {
+ boolean result = fishDraftDataService.lockDraft(id);
+ return result ? ResponseResult.success("锁定成功") : ResponseResult.error("锁定失败");
+ }
+
+ @PostMapping("/unlockDraft")
+ @Operation(summary = "解锁草稿")
+ public ResponseResult unlockDraft(@RequestParam Long id) {
+ boolean result = fishDraftDataService.unlockDraft(id);
+ return result ? ResponseResult.success("解锁成功") : ResponseResult.error("解锁失败");
+ }
+
+ @PostMapping("/add")
+ @Operation(summary = "新增过鱼数据")
+ public ResponseResult add(@RequestBody FishDraftData fishDraftData) {
+ fishDraftData.setCreatedAt(new Date());
+ fishDraftData.setUpdatedAt(new Date());
+ boolean result = fishDraftDataService.save(fishDraftData);
+ return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败");
+ }
+
+ @PostMapping("/update")
+ @Operation(summary = "修改过鱼数据")
+ public ResponseResult update(@RequestBody FishDraftData fishDraftData) {
+ fishDraftData.setUpdatedAt(new Date());
+ boolean result = fishDraftDataService.updateById(fishDraftData);
+ return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败");
+ }
+
+ @PostMapping("/delete")
+ @Operation(summary = "删除过鱼数据")
+ public ResponseResult delete(@RequestParam Long id) {
+ boolean result = fishDraftDataService.removeById(id);
+ return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败");
+ }
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/domain/ApprovalChangeLog.java b/backend/src/main/java/com/yfd/platform/data/domain/ApprovalChangeLog.java
new file mode 100644
index 0000000..b7e1af8
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/domain/ApprovalChangeLog.java
@@ -0,0 +1,69 @@
+package com.yfd.platform.data.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;
+
+/**
+ *
+ * 审批数据变更记录表
+ *
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("APPROVAL_CHANGE_LOG")
+public class ApprovalChangeLog implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ @TableId(type = IdType.ASSIGN_UUID)
+ private String id;
+
+ /**
+ * 审批批次ID
+ */
+ private String approvalId;
+
+ /**
+ * 草稿数据ID
+ */
+ private String dataId;
+
+ /**
+ * 业务类型(FISH)
+ */
+ private String bizType;
+
+ /**
+ * 操作类型(UPDATE修改 / DELETE删除)
+ */
+ private String operationType;
+
+ /**
+ * 变更内容JSON(before/after/changed_fields)
+ */
+ private String changeJson;
+
+ /**
+ * 操作人ID
+ */
+ private String operatorId;
+
+ /**
+ * 操作时间
+ */
+ private Date operateTime;
+
+ /**
+ * 创建时间
+ */
+ private Date createdAt;
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/domain/ApprovalLog.java b/backend/src/main/java/com/yfd/platform/data/domain/ApprovalLog.java
new file mode 100644
index 0000000..bb20c64
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/domain/ApprovalLog.java
@@ -0,0 +1,59 @@
+package com.yfd.platform.data.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;
+
+/**
+ *
+ * 审批操作日志表
+ *
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("APPROVAL_LOG")
+public class ApprovalLog implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ @TableId(type = IdType.ASSIGN_UUID)
+ private String id;
+
+ /**
+ * 审批批次ID
+ */
+ private String approvalId;
+
+ /**
+ * 操作类型(SUBMIT提交 / APPROVE通过 / REJECT驳回)
+ */
+ private String action;
+
+ /**
+ * 操作人ID
+ */
+ private String operatorId;
+
+ /**
+ * 操作时间
+ */
+ private Date operateTime;
+
+ /**
+ * 审批意见
+ */
+ private String commentInfo;
+
+ /**
+ * 创建时间
+ */
+ private Date createdAt;
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/domain/ApprovalMain.java b/backend/src/main/java/com/yfd/platform/data/domain/ApprovalMain.java
new file mode 100644
index 0000000..950200f
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/domain/ApprovalMain.java
@@ -0,0 +1,84 @@
+package com.yfd.platform.data.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;
+
+/**
+ *
+ * 审批批次主表
+ *
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("APPROVAL_MAIN")
+public class ApprovalMain implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ @TableId(type = IdType.ASSIGN_UUID)
+ private String id;
+
+ /**
+ * 审批批次号
+ */
+ private String approvalNo;
+
+ /**
+ * 业务类型(FISH过鱼数据)
+ */
+ private String bizType;
+
+ /**
+ * 本次提交数据条数
+ */
+ private Integer dataCount;
+
+ /**
+ * 提交人ID
+ */
+ private String applyUserId;
+
+ /**
+ * 提交时间
+ */
+ private Date applyTime;
+
+ /**
+ * 审批状态(PENDING待审批 / APPROVED已通过 / REJECTED已驳回)
+ */
+ private String status;
+
+ /**
+ * 审批人ID
+ */
+ private String approverId;
+
+ /**
+ * 审批完成时间
+ */
+ private Date approveTime;
+
+ /**
+ * 审批备注
+ */
+ private String remark;
+
+ /**
+ * 创建时间
+ */
+ private Date createdAt;
+
+ /**
+ * 更新时间
+ */
+ private Date updatedAt;
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java b/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java
new file mode 100644
index 0000000..f602b9f
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java
@@ -0,0 +1,166 @@
+package com.yfd.platform.data.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+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;
+
+/**
+ *
+ * 过鱼数据草稿表(用于导入、录入及审批流程)
+ *
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("FISH_DRAFT_DATA")
+public class FishDraftData implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ @TableId(type = IdType.ASSIGN_UUID)
+ private String id;
+
+ /**
+ * 过鱼设施编码
+ */
+ private String stcd;
+
+ /**
+ * 填报时间
+ */
+ private Date tm;
+
+ /**
+ * 鱼类
+ */
+ private String ftp;
+
+ /**
+ * 鱼类全长
+ */
+ private String fsz;
+
+ /**
+ * 过鱼数量
+ */
+ @TableField(value = "FCNT")
+ private Integer fcnt;
+
+ /**
+ * 平均体重
+ */
+ private String fwet;
+
+ /**
+ * 开始日期
+ */
+ private Date strdt;
+
+ /**
+ * 结束日期
+ */
+ private Date enddt;
+
+ /**
+ * 游向(上行/下行/上行折返/下行折返)
+ */
+ private String direction;
+
+ /**
+ * 年份
+ */
+ private Integer yr;
+
+ /**
+ * 主要月份
+ */
+ private Integer mouth;
+
+ /**
+ * 过鱼视频文件路径
+ */
+ private String vdpth;
+
+ /**
+ * 图片文件路径
+ */
+ private String picpth;
+
+ /**
+ * 是否鱼苗(0否 1是)
+ */
+ private Integer isfs;
+
+ /**
+ * 数据来源(MANUAL手工 / IMPORT导入 / AUTO自动)
+ */
+ private String sourceType;
+
+ /**
+ * 审批批次ID
+ */
+ private Long approvalId;
+
+ /**
+ * 状态(DRAFT未提交 / SUBMITTED已提交 / APPROVED已通过 / REJECTED已驳回)
+ */
+ private String status;
+
+ /**
+ * 锁定标识(1锁定不可编辑 0可编辑)
+ */
+ private Integer lockFlag;
+
+ /**
+ * 提交审批时间
+ */
+ private Date submitTime;
+
+ /**
+ * 审批完成时间
+ */
+ private Date approveTime;
+
+ /**
+ * 删除标记(0未删除 1已删除)
+ */
+ private Integer deletedFlag;
+
+ /**
+ * 删除人
+ */
+ private String deletedBy;
+
+ /**
+ * 删除时间
+ */
+ private Date deletedAt;
+
+ /**
+ * 创建时间
+ */
+ private Date createdAt;
+
+ /**
+ * 创建人
+ */
+ private String createdBy;
+
+ /**
+ * 更新时间
+ */
+ private Date updatedAt;
+
+ /**
+ * 更新人
+ */
+ private String updatedBy;
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/mapper/ApprovalChangeLogMapper.java b/backend/src/main/java/com/yfd/platform/data/mapper/ApprovalChangeLogMapper.java
new file mode 100644
index 0000000..4019a25
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/mapper/ApprovalChangeLogMapper.java
@@ -0,0 +1,40 @@
+package com.yfd.platform.data.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yfd.platform.data.domain.ApprovalChangeLog;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ *
+ * 审批数据变更记录表 Mapper 接口
+ *
+ */
+public interface ApprovalChangeLogMapper extends BaseMapper {
+
+ /**
+ * 根据审批批次ID查询变更记录
+ */
+ @Select("SELECT * FROM APPROVAL_CHANGE_LOG WHERE APPROVAL_ID = #{approvalId} ORDER BY OPERATE_TIME DESC")
+ List selectByApprovalId(@Param("approvalId") String approvalId);
+
+ /**
+ * 根据草稿数据ID查询变更记录
+ */
+ @Select("SELECT * FROM APPROVAL_CHANGE_LOG WHERE DATA_ID = #{dataId} ORDER BY OPERATE_TIME DESC")
+ List selectByDataId(@Param("dataId") String dataId);
+
+ /**
+ * 根据业务类型查询
+ */
+ @Select("SELECT * FROM APPROVAL_CHANGE_LOG WHERE BIZ_TYPE = #{bizType} ORDER BY OPERATE_TIME DESC")
+ List selectByBizType(@Param("bizType") String bizType);
+
+ /**
+ * 根据操作类型查询
+ */
+ @Select("SELECT * FROM APPROVAL_CHANGE_LOG WHERE OPERATION_TYPE = #{operationType} ORDER BY OPERATE_TIME DESC")
+ List selectByOperationType(@Param("operationType") String operationType);
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/mapper/ApprovalLogMapper.java b/backend/src/main/java/com/yfd/platform/data/mapper/ApprovalLogMapper.java
new file mode 100644
index 0000000..b522e06
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/mapper/ApprovalLogMapper.java
@@ -0,0 +1,34 @@
+package com.yfd.platform.data.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yfd.platform.data.domain.ApprovalLog;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ *
+ * 审批操作日志表 Mapper 接口
+ *
+ */
+public interface ApprovalLogMapper extends BaseMapper {
+
+ /**
+ * 根据审批批次ID查询日志列表
+ */
+ @Select("SELECT * FROM APPROVAL_LOG WHERE APPROVAL_ID = #{approvalId} ORDER BY OPERATE_TIME DESC")
+ List selectByApprovalId(@Param("approvalId") String approvalId);
+
+ /**
+ * 根据操作类型查询
+ */
+ @Select("SELECT * FROM APPROVAL_LOG WHERE ACTION = #{action} ORDER BY OPERATE_TIME DESC")
+ List selectByAction(@Param("action") String action);
+
+ /**
+ * 根据操作人查询
+ */
+ @Select("SELECT * FROM APPROVAL_LOG WHERE OPERATOR_ID = #{operatorId} ORDER BY OPERATE_TIME DESC")
+ List selectByOperatorId(@Param("operatorId") String operatorId);
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/mapper/ApprovalMainMapper.java b/backend/src/main/java/com/yfd/platform/data/mapper/ApprovalMainMapper.java
new file mode 100644
index 0000000..77fe3bd
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/mapper/ApprovalMainMapper.java
@@ -0,0 +1,40 @@
+package com.yfd.platform.data.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yfd.platform.data.domain.ApprovalMain;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ *
+ * 审批批次主表 Mapper 接口
+ *
+ */
+public interface ApprovalMainMapper extends BaseMapper {
+
+ /**
+ * 根据审批批次号查询
+ */
+ @Select("SELECT * FROM APPROVAL_MAIN WHERE APPROVAL_NO = #{approvalNo}")
+ ApprovalMain selectByApprovalNo(@Param("approvalNo") String approvalNo);
+
+ /**
+ * 根据业务类型查询审批列表
+ */
+ @Select("SELECT * FROM APPROVAL_MAIN WHERE BIZ_TYPE = #{bizType} ORDER BY CREATED_AT DESC")
+ List selectByBizType(@Param("bizType") String bizType);
+
+ /**
+ * 根据状态查询审批列表
+ */
+ @Select("SELECT * FROM APPROVAL_MAIN WHERE STATUS = #{status} ORDER BY CREATED_AT DESC")
+ List selectByStatus(@Param("status") String status);
+
+ /**
+ * 根据提交人查询
+ */
+ @Select("SELECT * FROM APPROVAL_MAIN WHERE APPLY_USER_ID = #{applyUserId} ORDER BY CREATED_AT DESC")
+ List selectByApplyUserId(@Param("applyUserId") String applyUserId);
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/mapper/FishDraftDataMapper.java b/backend/src/main/java/com/yfd/platform/data/mapper/FishDraftDataMapper.java
new file mode 100644
index 0000000..4acbbb2
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/mapper/FishDraftDataMapper.java
@@ -0,0 +1,52 @@
+package com.yfd.platform.data.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yfd.platform.data.domain.FishDraftData;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ *
+ * 过鱼数据草稿表 Mapper 接口
+ *
+ */
+public interface FishDraftDataMapper extends BaseMapper {
+
+ /**
+ * 根据审批批次ID查询草稿数据
+ */
+ @Select("SELECT * FROM FISH_DRAFT_DATA WHERE APPROVAL_ID = #{approvalId} ORDER BY TM DESC")
+ List selectByApprovalId(@Param("approvalId") Long approvalId);
+
+ /**
+ * 根据状态查询草稿数据
+ */
+ @Select("SELECT * FROM FISH_DRAFT_DATA WHERE STATUS = #{status} AND DELETED_FLAG = 0 ORDER BY TM DESC")
+ List selectByStatus(@Param("status") String status);
+
+ /**
+ * 根据电站编码查询草稿数据
+ */
+ @Select("SELECT * FROM FISH_DRAFT_DATA WHERE STCD = #{stcd} AND DELETED_FLAG = 0 ORDER BY TM DESC")
+ List selectByStcd(@Param("stcd") String stcd);
+
+ /**
+ * 根据鱼类名称查询
+ */
+ @Select("SELECT * FROM FISH_DRAFT_DATA WHERE FTP = #{ftp} AND DELETED_FLAG = 0 ORDER BY TM DESC")
+ List selectByFtp(@Param("ftp") String ftp);
+
+ /**
+ * 查询未删除的草稿数据
+ */
+ @Select("SELECT * FROM FISH_DRAFT_DATA WHERE DELETED_FLAG = 0 ORDER BY CREATED_AT DESC")
+ List selectAllNotDeleted();
+
+ /**
+ * 根据审批批次ID统计数量
+ */
+ @Select("SELECT COUNT(*) FROM FISH_DRAFT_DATA WHERE APPROVAL_ID = #{approvalId}")
+ int countByApprovalId(@Param("approvalId") Long approvalId);
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/service/IApprovalChangeLogService.java b/backend/src/main/java/com/yfd/platform/data/service/IApprovalChangeLogService.java
new file mode 100644
index 0000000..66e609f
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/service/IApprovalChangeLogService.java
@@ -0,0 +1,35 @@
+package com.yfd.platform.data.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yfd.platform.data.domain.ApprovalChangeLog;
+
+import java.util.List;
+
+/**
+ *
+ * 审批数据变更记录表 服务类
+ *
+ */
+public interface IApprovalChangeLogService extends IService {
+
+ /**
+ * 根据审批批次ID查询变更记录
+ */
+ List getByApprovalId(String approvalId);
+
+ /**
+ * 根据草稿数据ID查询变更记录
+ */
+ List getByDataId(String dataId);
+
+ /**
+ * 根据业务类型查询
+ */
+ List getByBizType(String bizType);
+
+ /**
+ * 记录变更
+ */
+ boolean logChange(String approvalId, String dataId, String bizType, String operationType,
+ String changeJson, String operatorId);
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/service/IApprovalLogService.java b/backend/src/main/java/com/yfd/platform/data/service/IApprovalLogService.java
new file mode 100644
index 0000000..8d01030
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/service/IApprovalLogService.java
@@ -0,0 +1,39 @@
+package com.yfd.platform.data.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yfd.platform.data.domain.ApprovalLog;
+
+import java.util.List;
+
+/**
+ *
+ * 审批操作日志表 服务类
+ *
+ */
+public interface IApprovalLogService extends IService {
+
+ /**
+ * 根据审批批次ID查询日志列表
+ */
+ List getByApprovalId(String approvalId);
+
+ /**
+ * 根据操作类型查询
+ */
+ List getByAction(String action);
+
+ /**
+ * 记录提交操作
+ */
+ boolean logSubmit(String approvalId, String operatorId, String comment);
+
+ /**
+ * 记录通过操作
+ */
+ boolean logApprove(String approvalId, String operatorId, String comment);
+
+ /**
+ * 记录驳回操作
+ */
+ boolean logReject(String approvalId, String operatorId, String comment);
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/service/IApprovalMainService.java b/backend/src/main/java/com/yfd/platform/data/service/IApprovalMainService.java
new file mode 100644
index 0000000..d20136b
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/service/IApprovalMainService.java
@@ -0,0 +1,48 @@
+package com.yfd.platform.data.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yfd.platform.data.domain.ApprovalMain;
+
+/**
+ *
+ * 审批批次主表 服务类
+ *
+ */
+public interface IApprovalMainService extends IService {
+
+ /**
+ * 分页查询审批列表
+ */
+ Page queryPageList(Page page, String bizType, String status);
+
+ /**
+ * 根据审批批次号查询
+ */
+ ApprovalMain getByApprovalNo(String approvalNo);
+
+ /**
+ * 根据业务类型查询
+ */
+ Page getByBizType(String bizType, Page page);
+
+ /**
+ * 根据状态查询
+ */
+ Page getByStatus(String status, Page page);
+
+ /**
+ * 提交审批
+ */
+ boolean submitApproval(ApprovalMain approvalMain);
+
+ /**
+ * 审批通过
+ */
+ boolean approve(String id, String approverId, String comment);
+
+ /**
+ * 审批驳回
+ */
+ boolean reject(String id, String approverId, String comment);
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/service/IFishDraftDataService.java b/backend/src/main/java/com/yfd/platform/data/service/IFishDraftDataService.java
new file mode 100644
index 0000000..00f4a47
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/service/IFishDraftDataService.java
@@ -0,0 +1,70 @@
+package com.yfd.platform.data.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yfd.platform.data.domain.FishDraftData;
+
+import java.util.List;
+
+/**
+ *
+ * 过鱼数据草稿表 服务类
+ *
+ */
+public interface IFishDraftDataService extends IService {
+
+ /**
+ * 分页查询草稿数据
+ */
+ Page queryPageList(Page page, String stcd, String status, String ftp);
+
+ /**
+ * 根据审批批次ID查询
+ */
+ List getByApprovalId(Long approvalId);
+
+ /**
+ * 根据状态查询
+ */
+ List getByStatus(String status);
+
+ /**
+ * 根据电站编码查询
+ */
+ List getByStcd(String stcd);
+
+ /**
+ * 保存草稿
+ */
+ boolean saveDraft(FishDraftData fishDraftData);
+
+ /**
+ * 更新草稿
+ */
+ boolean updateDraft(FishDraftData fishDraftData);
+
+ /**
+ * 删除草稿(软删除)
+ */
+ boolean removeDraft(Long id, String operatorId);
+
+ /**
+ * 提交草稿
+ */
+ boolean submitDraft(Long id, String operatorId);
+
+ /**
+ * 批量提交草稿
+ */
+ boolean submitDrafts(List ids, String operatorId);
+
+ /**
+ * 锁定草稿
+ */
+ boolean lockDraft(Long id);
+
+ /**
+ * 解锁草稿
+ */
+ boolean unlockDraft(Long id);
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalChangeLogServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalChangeLogServiceImpl.java
new file mode 100644
index 0000000..f1f730a
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalChangeLogServiceImpl.java
@@ -0,0 +1,53 @@
+package com.yfd.platform.data.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yfd.platform.data.domain.ApprovalChangeLog;
+import com.yfd.platform.data.mapper.ApprovalChangeLogMapper;
+import com.yfd.platform.data.service.IApprovalChangeLogService;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ * 审批数据变更记录表 服务实现类
+ *
+ */
+@Service
+public class ApprovalChangeLogServiceImpl extends ServiceImpl implements IApprovalChangeLogService {
+
+ @Resource
+ private ApprovalChangeLogMapper approvalChangeLogMapper;
+
+ @Override
+ public List getByApprovalId(String approvalId) {
+ return approvalChangeLogMapper.selectByApprovalId(approvalId);
+ }
+
+ @Override
+ public List getByDataId(String dataId) {
+ return approvalChangeLogMapper.selectByDataId(dataId);
+ }
+
+ @Override
+ public List getByBizType(String bizType) {
+ return approvalChangeLogMapper.selectByBizType(bizType);
+ }
+
+ @Override
+ public boolean logChange(String approvalId, String dataId, String bizType, String operationType,
+ String changeJson, String operatorId) {
+ ApprovalChangeLog changeLog = new ApprovalChangeLog();
+ changeLog.setApprovalId(approvalId);
+ changeLog.setDataId(dataId);
+ changeLog.setBizType(bizType);
+ changeLog.setOperationType(operationType);
+ changeLog.setChangeJson(changeJson);
+ changeLog.setOperatorId(operatorId);
+ changeLog.setOperateTime(new Date());
+ changeLog.setCreatedAt(new Date());
+ return this.save(changeLog);
+ }
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalLogServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalLogServiceImpl.java
new file mode 100644
index 0000000..d48ec47
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalLogServiceImpl.java
@@ -0,0 +1,69 @@
+package com.yfd.platform.data.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yfd.platform.data.domain.ApprovalLog;
+import com.yfd.platform.data.mapper.ApprovalLogMapper;
+import com.yfd.platform.data.service.IApprovalLogService;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ * 审批操作日志表 服务实现类
+ *
+ */
+@Service
+public class ApprovalLogServiceImpl extends ServiceImpl implements IApprovalLogService {
+
+ @Resource
+ private ApprovalLogMapper approvalLogMapper;
+
+ @Override
+ public List getByApprovalId(String approvalId) {
+ return approvalLogMapper.selectByApprovalId(approvalId);
+ }
+
+ @Override
+ public List getByAction(String action) {
+ return approvalLogMapper.selectByAction(action);
+ }
+
+ @Override
+ public boolean logSubmit(String approvalId, String operatorId, String comment) {
+ ApprovalLog log = new ApprovalLog();
+ log.setApprovalId(approvalId);
+ log.setAction("SUBMIT");
+ log.setOperatorId(operatorId);
+ log.setOperateTime(new Date());
+ log.setCommentInfo(comment);
+ log.setCreatedAt(new Date());
+ return this.save(log);
+ }
+
+ @Override
+ public boolean logApprove(String approvalId, String operatorId, String comment) {
+ ApprovalLog log = new ApprovalLog();
+ log.setApprovalId(approvalId);
+ log.setAction("APPROVE");
+ log.setOperatorId(operatorId);
+ log.setOperateTime(new Date());
+ log.setCommentInfo(comment);
+ log.setCreatedAt(new Date());
+ return this.save(log);
+ }
+
+ @Override
+ public boolean logReject(String approvalId, String operatorId, String comment) {
+ ApprovalLog log = new ApprovalLog();
+ log.setApprovalId(approvalId);
+ log.setAction("REJECT");
+ log.setOperatorId(operatorId);
+ log.setOperateTime(new Date());
+ log.setCommentInfo(comment);
+ log.setCreatedAt(new Date());
+ return this.save(log);
+ }
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalMainServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalMainServiceImpl.java
new file mode 100644
index 0000000..907ede4
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalMainServiceImpl.java
@@ -0,0 +1,109 @@
+package com.yfd.platform.data.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yfd.platform.data.domain.ApprovalLog;
+import com.yfd.platform.data.domain.ApprovalMain;
+import com.yfd.platform.data.mapper.ApprovalLogMapper;
+import com.yfd.platform.data.mapper.ApprovalMainMapper;
+import com.yfd.platform.data.service.IApprovalLogService;
+import com.yfd.platform.data.service.IApprovalMainService;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import java.util.Date;
+
+/**
+ *
+ * 审批批次主表 服务实现类
+ *
+ */
+@Service
+public class ApprovalMainServiceImpl extends ServiceImpl implements IApprovalMainService {
+
+ @Resource
+ private ApprovalMainMapper approvalMainMapper;
+
+ @Resource
+ private IApprovalLogService approvalLogService;
+
+ @Override
+ public Page queryPageList(Page page, String bizType, String status) {
+ return this.page(page, this.lambdaQuery()
+ .eq(StringUtils.hasText(bizType), ApprovalMain::getBizType, bizType)
+ .eq(StringUtils.hasText(status), ApprovalMain::getStatus, status)
+ .orderByDesc(ApprovalMain::getCreatedAt)
+ .getWrapper());
+ }
+
+ @Override
+ public ApprovalMain getByApprovalNo(String approvalNo) {
+ return approvalMainMapper.selectByApprovalNo(approvalNo);
+ }
+
+ @Override
+ public Page getByBizType(String bizType, Page page) {
+ return this.page(page, this.lambdaQuery()
+ .eq(ApprovalMain::getBizType, bizType)
+ .orderByDesc(ApprovalMain::getCreatedAt)
+ .getWrapper());
+ }
+
+ @Override
+ public Page getByStatus(String status, Page page) {
+ return this.page(page, this.lambdaQuery()
+ .eq(ApprovalMain::getStatus, status)
+ .orderByDesc(ApprovalMain::getCreatedAt)
+ .getWrapper());
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean submitApproval(ApprovalMain approvalMain) {
+ approvalMain.setStatus("SUBMITTED");
+ approvalMain.setApplyTime(new Date());
+ boolean result = this.save(approvalMain);
+ if (result) {
+ approvalLogService.logSubmit(approvalMain.getId(), approvalMain.getApplyUserId(), "提交审批");
+ }
+ return result;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean approve(String id, String approverId, String comment) {
+ ApprovalMain approvalMain = this.getById(id);
+ if (approvalMain == null) {
+ return false;
+ }
+ approvalMain.setStatus("APPROVED");
+ approvalMain.setApproverId(approverId);
+ approvalMain.setApproveTime(new Date());
+ approvalMain.setRemark(comment);
+ boolean result = this.updateById(approvalMain);
+ if (result) {
+ approvalLogService.logApprove(id, approverId, comment);
+ }
+ return result;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean reject(String id, String approverId, String comment) {
+ ApprovalMain approvalMain = this.getById(id);
+ if (approvalMain == null) {
+ return false;
+ }
+ approvalMain.setStatus("REJECTED");
+ approvalMain.setApproverId(approverId);
+ approvalMain.setApproveTime(new Date());
+ approvalMain.setRemark(comment);
+ boolean result = this.updateById(approvalMain);
+ if (result) {
+ approvalLogService.logReject(id, approverId, comment);
+ }
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/FishDraftDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/FishDraftDataServiceImpl.java
new file mode 100644
index 0000000..ac522ed
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/service/impl/FishDraftDataServiceImpl.java
@@ -0,0 +1,149 @@
+package com.yfd.platform.data.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yfd.platform.data.domain.FishDraftData;
+import com.yfd.platform.data.mapper.FishDraftDataMapper;
+import com.yfd.platform.data.service.IApprovalChangeLogService;
+import com.yfd.platform.data.service.IApprovalMainService;
+import com.yfd.platform.data.service.IFishDraftDataService;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ * 过鱼数据草稿表 服务实现类
+ *
+ */
+@Service
+public class FishDraftDataServiceImpl extends ServiceImpl implements IFishDraftDataService {
+
+ @Resource
+ private FishDraftDataMapper fishDraftDataMapper;
+
+ @Resource
+ private IApprovalMainService approvalMainService;
+
+ @Resource
+ private IApprovalChangeLogService approvalChangeLogService;
+
+ @Override
+ public Page queryPageList(Page page, String stcd, String status, String ftp) {
+ return this.page(page, this.lambdaQuery()
+ .eq(StringUtils.hasText(stcd), FishDraftData::getStcd, stcd)
+ .eq(StringUtils.hasText(status), FishDraftData::getStatus, status)
+ .like(StringUtils.hasText(ftp), FishDraftData::getFtp, ftp)
+ .eq(FishDraftData::getDeletedFlag, 0)
+ .orderByDesc(FishDraftData::getTm)
+ .getWrapper());
+ }
+
+ @Override
+ public List getByApprovalId(Long approvalId) {
+ return fishDraftDataMapper.selectByApprovalId(approvalId);
+ }
+
+ @Override
+ public List getByStatus(String status) {
+ return fishDraftDataMapper.selectByStatus(status);
+ }
+
+ @Override
+ public List getByStcd(String stcd) {
+ return fishDraftDataMapper.selectByStcd(stcd);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean saveDraft(FishDraftData fishDraftData) {
+ fishDraftData.setStatus("DRAFT");
+ fishDraftData.setDeletedFlag(0);
+ fishDraftData.setLockFlag(0);
+ fishDraftData.setCreatedAt(new Date());
+ fishDraftData.setUpdatedAt(new Date());
+ return this.save(fishDraftData);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean updateDraft(FishDraftData fishDraftData) {
+ FishDraftData existing = this.getById(fishDraftData.getId());
+ if (existing == null || existing.getLockFlag() == 1) {
+ return false;
+ }
+ fishDraftData.setStatus("DRAFT");
+ fishDraftData.setUpdatedAt(new Date());
+ return this.updateById(fishDraftData);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean removeDraft(Long id, String operatorId) {
+ FishDraftData fishDraftData = this.getById(id);
+ if (fishDraftData == null || fishDraftData.getLockFlag() == 1) {
+ return false;
+ }
+ fishDraftData.setDeletedFlag(1);
+ fishDraftData.setDeletedBy(operatorId);
+ fishDraftData.setDeletedAt(new Date());
+ fishDraftData.setUpdatedAt(new Date());
+ return this.updateById(fishDraftData);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean submitDraft(Long id, String operatorId) {
+ FishDraftData fishDraftData = this.getById(id);
+ if (fishDraftData == null || fishDraftData.getLockFlag() == 1) {
+ return false;
+ }
+ fishDraftData.setStatus("SUBMITTED");
+ fishDraftData.setSubmitTime(new Date());
+ fishDraftData.setUpdatedAt(new Date());
+ return this.updateById(fishDraftData);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean submitDrafts(List ids, String operatorId) {
+ for (Long id : ids) {
+ FishDraftData fishDraftData = this.getById(id);
+ if (fishDraftData != null && fishDraftData.getLockFlag() == 0) {
+ fishDraftData.setStatus("SUBMITTED");
+ fishDraftData.setSubmitTime(new Date());
+ fishDraftData.setUpdatedAt(new Date());
+ this.updateById(fishDraftData);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean lockDraft(Long id) {
+ FishDraftData fishDraftData = this.getById(id);
+ if (fishDraftData == null) {
+ return false;
+ }
+ fishDraftData.setLockFlag(1);
+ fishDraftData.setUpdatedAt(new Date());
+ return this.updateById(fishDraftData);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean unlockDraft(Long id) {
+ FishDraftData fishDraftData = this.getById(id);
+ if (fishDraftData == null) {
+ return false;
+ }
+ fishDraftData.setLockFlag(0);
+ fishDraftData.setUpdatedAt(new Date());
+ return this.updateById(fishDraftData);
+ }
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdHydrobaseServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/SdHydrobaseServiceImpl.java
index 5df755b..cafc2cf 100644
--- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdHydrobaseServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/env/service/impl/SdHydrobaseServiceImpl.java
@@ -21,7 +21,7 @@ public class SdHydrobaseServiceImpl extends ServiceImpl queryPageList(Page page, String basename, String pbaseid) {
return this.page(page, this.lambdaQuery()
.like(basename != null && !basename.isEmpty(), SdHydrobase::getBasename, basename)
- .eq(pbaseid != null && !pbaseid.isEmpty(), SdHydrobase::getPbaseid, pbaseid)
+ .eq(pbaseid != null && !pbaseid.isEmpty(), SdHydrobase::getBaseid, pbaseid)
.orderByAsc(SdHydrobase::getOrderIndex)
.getWrapper());
}
diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/TreeStructureServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/TreeStructureServiceImpl.java
index 66a3184..9ca2266 100644
--- a/backend/src/main/java/com/yfd/platform/env/service/impl/TreeStructureServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/env/service/impl/TreeStructureServiceImpl.java
@@ -64,16 +64,16 @@ public class TreeStructureServiceImpl implements ITreeStructureService {
rvcdEngMap.put(rvcdDic.getRvcd(), engList);
}
}
-
for (SdRvcdDic rvcdDic : rvcdList) {
Map rvcdNode = new LinkedHashMap<>();
- rvcdNode.put("type", "RVCD");
+ rvcdNode.put("type", "BASIN");
rvcdNode.put("code", rvcdDic.getRvcd());
rvcdNode.put("name", rvcdDic.getRvnm());
rvcdNode.put("path", rvcdDic.getPath());
rvcdNode.put("grd", rvcdDic.getGrd());
rvcdNode.put("lgtd", rvcdDic.getLgtd());
rvcdNode.put("lttd", rvcdDic.getLttd());
+ rvcdNode.put("parentId", "0");
List