fix: 优化自动过鱼数据接口

This commit is contained in:
tangwei 2026-07-22 14:25:39 +08:00
parent aa8013fdb4
commit a167b41404
4 changed files with 126 additions and 7 deletions

View File

@ -117,4 +117,9 @@ public class SdFpssrlRAiRequest {
* 备注
*/
private String remark;
/**
* 附件ID多个以逗号分隔通过上传图片接口获取
*/
private String fid;
}

View File

@ -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;
/**
* <p>
* 过鱼设施自动数据表 Mapper 接口
@ -11,4 +13,10 @@ import org.apache.ibatis.annotations.Mapper;
*/
@Mapper
public interface SdFpssrlRMapper extends BaseMapper<SdFpssrlR> {
/**
* 批量合并过鱼自动数据基于 STCD + TM + FTP 唯一
* 存在则更新不存在则新增
*/
int mergeFishRecords(List<SdFpssrlR> list);
}

View File

@ -131,14 +131,40 @@ public class SdFpssrlRServiceImpl extends ServiceImpl<SdFpssrlRMapper, SdFpssrlR
@Override
@Transactional(rollbackFor = Exception.class)
public List<SdFpssrlR> processAiReportBatch(List<SdFpssrlRAiRequest> requests) {
List<SdFpssrlR> results = new ArrayList<>();
List<SdFpssrlR> entities = new ArrayList<>();
Date now = new Date();
for (SdFpssrlRAiRequest req : requests) {
SdFpssrlR entity = processAiReport(req);
if (entity != null) {
results.add(entity);
}
}
this.saveBatch(results);
return results;
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);
}
baseMapper.mergeFishRecords(entities);
return entities;
}
}

View File

@ -0,0 +1,80 @@
<?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="com.yfd.platform.qgc_base.mapper.SdFpssrlRMapper">
<!-- 批量合并过鱼自动数据(基于 STCD + TM + FTP 唯一) -->
<insert id="mergeFishRecords" parameterType="java.util.List">
MERGE INTO SD_FPSSRL_R T
USING (
<foreach collection="list" item="obj" index="index" separator="UNION ALL">
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
</foreach>
) 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
)
</insert>
</mapper>