diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssrlRAiRequest.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssrlRAiRequest.java
index 37b9c3e4..7b844d05 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssrlRAiRequest.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssrlRAiRequest.java
@@ -117,4 +117,9 @@ public class SdFpssrlRAiRequest {
* 备注
*/
private String remark;
+
+ /**
+ * 附件ID(多个以逗号分隔),通过上传图片接口获取
+ */
+ private String fid;
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdFpssrlRMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdFpssrlRMapper.java
index 6998c983..1fce31a6 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdFpssrlRMapper.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdFpssrlRMapper.java
@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yfd.platform.qgc_base.domain.SdFpssrlR;
import org.apache.ibatis.annotations.Mapper;
+import java.util.List;
+
/**
*
* 过鱼设施自动数据表 Mapper 接口
@@ -11,4 +13,10 @@ import org.apache.ibatis.annotations.Mapper;
*/
@Mapper
public interface SdFpssrlRMapper extends BaseMapper {
+
+ /**
+ * 批量合并过鱼自动数据(基于 STCD + TM + FTP 唯一)
+ * 存在则更新,不存在则新增
+ */
+ int mergeFishRecords(List list);
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssrlRServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssrlRServiceImpl.java
index 4e431a88..2b658fb2 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssrlRServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssrlRServiceImpl.java
@@ -131,14 +131,40 @@ public class SdFpssrlRServiceImpl extends ServiceImpl processAiReportBatch(List requests) {
- List results = new ArrayList<>();
+ List entities = new ArrayList<>();
+ Date now = new Date();
for (SdFpssrlRAiRequest req : requests) {
- SdFpssrlR entity = processAiReport(req);
- if (entity != null) {
- results.add(entity);
- }
+ SdFpssrlR entity = new SdFpssrlR();
+ entity.setStcd(req.getStcd());
+ entity.setTm(req.getTm());
+ entity.setFtp(req.getFtp());
+ entity.setFcnt(req.getFcnt() != null ? req.getFcnt() : 1);
+ entity.setFsz(req.getFsz());
+ entity.setLength(req.getLength());
+ entity.setWidth(req.getWidth());
+ entity.setFishspeed(req.getFishspeed());
+ entity.setDirection(req.getDirection());
+ entity.setFishposition(req.getFishposition());
+ entity.setFirstImgUrl(req.getFirstImgUrl());
+ entity.setSecondImgUrl(req.getSecondImgUrl());
+ entity.setVideoUrl(req.getVideoUrl());
+ entity.setTemperature(req.getTemperature());
+ entity.setWaterlevel(req.getWaterlevel());
+ entity.setSpeed(req.getSpeed());
+ entity.setQ(req.getQ());
+ entity.setDox(req.getDox());
+ entity.setTu(req.getTu());
+ entity.setChannelno(StrUtil.isNotBlank(req.getChannelno()) ? req.getChannelno() : "主通道");
+ entity.setFid(req.getFid());
+ entity.setRemark(req.getRemark());
+ entity.setRecordUser("AI_SYSTEM");
+ entity.setRecordTime(now);
+ entity.setModifyUser("AI_SYSTEM");
+ entity.setModifyTime(now);
+ entity.setIsDeleted(0);
+ entities.add(entity);
}
- this.saveBatch(results);
- return results;
+ baseMapper.mergeFishRecords(entities);
+ return entities;
}
}
diff --git a/backend/src/main/resources/mapper/qgc_base/SdFpssrlRMapper.xml b/backend/src/main/resources/mapper/qgc_base/SdFpssrlRMapper.xml
new file mode 100644
index 00000000..f029bced
--- /dev/null
+++ b/backend/src/main/resources/mapper/qgc_base/SdFpssrlRMapper.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+ MERGE INTO SD_FPSSRL_R T
+ USING (
+
+ SELECT
+ #{obj.stcd, jdbcType=VARCHAR} AS STCD,
+ #{obj.tm, jdbcType=TIMESTAMP} AS TM,
+ #{obj.ftp, jdbcType=VARCHAR} AS FTP,
+ #{obj.fcnt, jdbcType=INTEGER} AS FCNT,
+ #{obj.fsz, jdbcType=VARCHAR} AS FSZ,
+ #{obj.length, jdbcType=DECIMAL} AS LENGTH,
+ #{obj.width, jdbcType=DECIMAL} AS WIDTH,
+ #{obj.fishspeed, jdbcType=VARCHAR} AS FISHSPEED,
+ #{obj.direction, jdbcType=INTEGER} AS DIRECTION,
+ #{obj.fishposition, jdbcType=DECIMAL} AS FISHPOSITION,
+ #{obj.firstImgUrl, jdbcType=VARCHAR} AS FIRSTIMGURL,
+ #{obj.secondImgUrl, jdbcType=VARCHAR} AS SECONDIMGURL,
+ #{obj.videoUrl, jdbcType=VARCHAR} AS VIDEOURL,
+ #{obj.temperature, jdbcType=DECIMAL} AS TEMPERATURE,
+ #{obj.waterlevel, jdbcType=DECIMAL} AS WATERLEVEL,
+ #{obj.speed, jdbcType=DECIMAL} AS SPEED,
+ #{obj.q, jdbcType=DECIMAL} AS Q,
+ #{obj.dox, jdbcType=DECIMAL} AS DOX,
+ #{obj.tu, jdbcType=INTEGER} AS TU,
+ #{obj.channelno, jdbcType=VARCHAR} AS CHANNELNO,
+ #{obj.fid, jdbcType=VARCHAR} AS FID,
+ #{obj.remark, jdbcType=VARCHAR} AS REMARK,
+ #{obj.recordUser, jdbcType=VARCHAR} AS RECORD_USER,
+ #{obj.modifyUser, jdbcType=VARCHAR} AS MODIFY_USER
+ FROM DUAL
+
+ ) S
+ ON (T.STCD = S.STCD AND T.TM = S.TM AND T.FTP = S.FTP AND T.IS_DELETED = 0)
+ WHEN MATCHED THEN
+ UPDATE SET
+ T.FCNT = S.FCNT,
+ T.FSZ = S.FSZ,
+ T.LENGTH = S.LENGTH,
+ T.WIDTH = S.WIDTH,
+ T.FISHSPEED = S.FISHSPEED,
+ T.DIRECTION = S.DIRECTION,
+ T.FISHPOSITION = S.FISHPOSITION,
+ T.FIRSTIMGURL = S.FIRSTIMGURL,
+ T.SECONDIMGURL = S.SECONDIMGURL,
+ T.VIDEOURL = S.VIDEOURL,
+ T.TEMPERATURE = S.TEMPERATURE,
+ T.WATERLEVEL = S.WATERLEVEL,
+ T.SPEED = S.SPEED,
+ T.Q = S.Q,
+ T.DOX = S.DOX,
+ T.TU = S.TU,
+ T.CHANNELNO = S.CHANNELNO,
+ T.FID = S.FID,
+ T.REMARK = S.REMARK,
+ T.MODIFY_USER = S.MODIFY_USER,
+ T.MODIFY_TIME = SYSDATE
+ WHEN NOT MATCHED THEN
+ INSERT (
+ ID, STCD, TM, FTP, FCNT, FSZ, LENGTH, WIDTH, FISHSPEED,
+ DIRECTION, FISHPOSITION, FIRSTIMGURL, SECONDIMGURL, VIDEOURL,
+ TEMPERATURE, WATERLEVEL, SPEED, Q, DOX, TU, CHANNELNO,
+ FID, REMARK, RECORD_USER, RECORD_TIME, MODIFY_USER, MODIFY_TIME,
+ IS_DELETED
+ ) VALUES (
+ SYS_GUID(),
+ S.STCD, S.TM, S.FTP, S.FCNT, S.FSZ, S.LENGTH, S.WIDTH, S.FISHSPEED,
+ S.DIRECTION, S.FISHPOSITION, S.FIRSTIMGURL, S.SECONDIMGURL, S.VIDEOURL,
+ S.TEMPERATURE, S.WATERLEVEL, S.SPEED, S.Q, S.DOX, S.TU, S.CHANNELNO,
+ S.FID, S.REMARK, S.RECORD_USER, SYSDATE, S.MODIFY_USER, SYSDATE,
+ 0
+ )
+
+
+