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 + ) + + +