From 0809aa554fc906e73a383c34f88bb4153bb69b00 Mon Sep 17 00:00:00 2001 From: liriming <1343021927@qq.com> Date: 星期二, 14 一月 2025 14:24:08 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/impl/InfluxDBServiceImpl.java | 46 +++++++++++ iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/MmPredictItemDao.xml | 26 ++++++ iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDoubleDataReqVO.java | 20 +++++ iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java | 4 + iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java | 7 + iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java | 39 +++++++++ iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/InfluxDBService.java | 3 iailab-module-model/iailab-module-model-biz/src/main/resources/logback-spring.xml | 8 +- iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/config/InfluxDBInstance.java | 6 + iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictItemDao.java | 2 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictItemService.java | 2 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictItemServiceImpl.java | 11 ++ iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/pojo/InfluxModelResultByOutPutIdsPOJO.java | 23 +++++ 13 files changed, 192 insertions(+), 5 deletions(-) diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java index 729c468..7a70e0a 100644 --- a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java @@ -97,6 +97,10 @@ @Operation(summary = "获取预警信息和调度建议分页列表") PageResult<StAlarmAndSuggestRespVO> getAlarmAndSuggestPage(@RequestBody StAlarmAndSuggestPageReqVO reqVO); + @PostMapping(PREFIX + "/predict-data/doubleValue") + @Operation(summary = "获取多个预测项Double类型数据") + Map<String, Map<String, Double>> getPreDoubleData(PreDoubleDataReqVO reqVO); + /*@PostMapping(PREFIX + "/predict-data/last-value") @Operation(summary = "获取最后预测值") Double getPredictLastValue();*/ diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDoubleDataReqVO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDoubleDataReqVO.java new file mode 100644 index 0000000..f6a0f6c --- /dev/null +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDoubleDataReqVO.java @@ -0,0 +1,20 @@ +package com.iailab.module.model.api.mcs.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @description: + * @author: dzd + * @date: 2025/1/13 13:59 + **/ +@Data +public class PreDoubleDataReqVO implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "预测编号") + private List<String> itemNos; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java index f78609f..3dade90 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java @@ -12,13 +12,19 @@ import com.iailab.module.data.common.ApiDataQueryDTO; import com.iailab.module.model.api.mcs.McsApi; import com.iailab.module.model.api.mcs.dto.*; +import com.iailab.module.model.common.enums.DataTypeEnum; import com.iailab.module.model.enums.CommonConstant; import com.iailab.module.model.common.enums.PreLineTypeEnum; +import com.iailab.module.model.influxdb.pojo.InfluxModelResultByOutPutIdsPOJO; +import com.iailab.module.model.influxdb.service.InfluxDBService; +import com.iailab.module.model.influxdb.vo.InfluxModelResultVO; import com.iailab.module.model.mcs.pre.entity.DmModuleEntity; import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity; import com.iailab.module.model.mcs.pre.entity.MmPredictAlarmMessageEntity; import com.iailab.module.model.mcs.pre.service.*; +import com.iailab.module.model.mcs.pre.vo.MmItemOutputRespVO; import com.iailab.module.model.mcs.pre.vo.MmPredictAlarmMessageSaveReqVO; +import com.iailab.module.model.mcs.pre.vo.MmPredictItemRespVO; import com.iailab.module.model.mcs.sche.entity.StScheduleSuggestEntity; import com.iailab.module.model.mcs.sche.service.StScheduleSchemeService; import com.iailab.module.model.mcs.sche.service.StScheduleSuggestService; @@ -35,7 +41,9 @@ import java.math.BigDecimal; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @author PanZhibao @@ -88,6 +96,9 @@ @Autowired private ChartParamService chartParamService; + + @Autowired + private InfluxDBService influxDBService; private int HOUR_MINS = 60; @@ -581,6 +592,34 @@ return stScheduleSchemeService.getAlarmAndSuggestPage(reqVO); } + @Override + public Map<String, Map<String, Double>> getPreDoubleData(PreDoubleDataReqVO reqVO) { + List<MmPredictItemRespVO> doubleItemOutPuts = mmPredictItemService.getDoubleOutPutsByItemNos(reqVO.getItemNos()); + + //<itemNo,<resultStr,double>> + Map<String, Map<String, Double>> result = new HashMap<>(reqVO.getItemNos().size()); + + for (MmPredictItemRespVO mmPredictItemRespVO : doubleItemOutPuts) { + List<String> outPutIds = mmPredictItemRespVO.getOutPuts().stream().map(MmItemOutputRespVO::getId).collect(Collectors.toList()); + InfluxModelResultByOutPutIdsPOJO pojo = new InfluxModelResultByOutPutIdsPOJO(); + pojo.setOutPutIds(outPutIds); + pojo.setType(DataTypeEnum.FLOAT.getCode()); + Map<String, List<InfluxModelResultVO>> outPutIdDoubles = influxDBService.queryModelResultsByOutPutIds(pojo, mmPredictItemRespVO.getLastTime(), mmPredictItemRespVO.getLastTime()); + Map<String, Double> outPutIdDouble = new HashMap<>(outPutIds.size()); + for (MmItemOutputRespVO outPut : mmPredictItemRespVO.getOutPuts()) { + String outPutId = outPut.getId(); + if (outPutIdDoubles.containsKey(outPutId)) { + List<InfluxModelResultVO> influxModelResultVOS = outPutIdDoubles.get(outPutId); + if (!CollectionUtils.isEmpty(influxModelResultVOS)) { + outPutIdDouble.put(outPut.getResultstr(),Double.valueOf(influxModelResultVOS.get(0).getValue().toString())); + } + } + } + result.put(mmPredictItemRespVO.getItemno(),outPutIdDouble); + } + return result; + } + private Date[] calResultTime(ItemVO predictItem, Date startTimeReq, Date endTimeReq, int lengthLeft, int lengthRight) { Date[] result = new Date[3]; Date predictTime = predictItem.getLastTime(); diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java index b97d09c..d10dec7 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java @@ -163,4 +163,11 @@ List<ChartParamDTO> chartParamList = mcsApi.getChartParamList(chartCode); return CommonResult.success(chartParamList); } + + @PostMapping("/predict-data/doubleValue") + @Operation(summary = "获取多个预测项Double类型数据") + public CommonResult<Map<String, Map<String,Double>>> getPreDoubleData(@RequestBody PreDoubleDataReqVO reqVO) { + Map<String, Map<String,Double>> map = mcsApi.getPreDoubleData(reqVO); + return CommonResult.success(map); + } } \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/config/InfluxDBInstance.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/config/InfluxDBInstance.java index f2d2075..e2dbb92 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/config/InfluxDBInstance.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/config/InfluxDBInstance.java @@ -4,6 +4,7 @@ import com.influxdb.client.InfluxDBClient; import com.influxdb.client.InfluxDBClientFactory; import com.influxdb.client.domain.Bucket; +import com.influxdb.client.domain.BucketRetentionRules; import com.influxdb.client.domain.Organization; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,6 +41,8 @@ private Logger logger = LoggerFactory.getLogger(getClass()); private InfluxDBClient client; + // bucket过期时间 + private Integer everySeconds = 3600 * 24 * 10; public InfluxDBClient getClient() { try { @@ -60,7 +63,8 @@ Bucket bucketByName = client.getBucketsApi().findBucketByName(bucketName); if (null == bucketByName) { Organization organization = client.getOrganizationsApi().findOrganizations().stream().filter(e -> e.getName().equals(org)).findFirst().orElseThrow(() -> new RuntimeException("influxdb:org不存在,org:" + org)); - client.getBucketsApi().createBucket(bucketName,organization); + // 创建Bucket,并设置过期时间 + client.getBucketsApi().createBucket(bucketName,new BucketRetentionRules().everySeconds(everySeconds),organization); }else { isExistBucket.add(bucketName); } diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/pojo/InfluxModelResultByOutPutIdsPOJO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/pojo/InfluxModelResultByOutPutIdsPOJO.java new file mode 100644 index 0000000..13accb1 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/pojo/InfluxModelResultByOutPutIdsPOJO.java @@ -0,0 +1,23 @@ +package com.iailab.module.model.influxdb.pojo; + +import lombok.Data; + +import java.io.Serializable; +import java.time.Instant; +import java.util.List; + +/** + * @description: + * @author: dzd + * @date: 2025/1/13 14:39 + **/ +@Data +public class InfluxModelResultByOutPutIdsPOJO implements Serializable { + private static final long serialVersionUID = 1L; + + private List<String> outPutIds; + + private Instant timestamp; + + private String type; +} diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/InfluxDBService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/InfluxDBService.java index 45667bd..532b170 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/InfluxDBService.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/InfluxDBService.java @@ -1,10 +1,12 @@ package com.iailab.module.model.influxdb.service; +import com.iailab.module.model.influxdb.pojo.InfluxModelResultByOutPutIdsPOJO; import com.iailab.module.model.influxdb.pojo.InfluxModelResultPOJO; import com.iailab.module.model.influxdb.vo.InfluxModelResultVO; import java.util.Date; import java.util.List; +import java.util.Map; /** * InfluxDB操作类 @@ -14,4 +16,5 @@ void asyncWriteModelResults(List<InfluxModelResultPOJO> pointValues); List<InfluxModelResultVO> queryModelResults(InfluxModelResultPOJO pojo, Date startTime, Date endTime); + Map<String,List<InfluxModelResultVO>> queryModelResultsByOutPutIds(InfluxModelResultByOutPutIdsPOJO pojo, Date startTime, Date endTime); } diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/impl/InfluxDBServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/impl/InfluxDBServiceImpl.java index 3e93489..7dd2fc5 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/impl/InfluxDBServiceImpl.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/impl/InfluxDBServiceImpl.java @@ -2,6 +2,7 @@ import com.iailab.module.model.influxdb.common.config.InfluxDBInstance; import com.iailab.module.model.influxdb.common.utils.MeasurementUtils; +import com.iailab.module.model.influxdb.pojo.InfluxModelResultByOutPutIdsPOJO; import com.iailab.module.model.influxdb.pojo.InfluxModelResultPOJO; import com.iailab.module.model.influxdb.service.InfluxDBService; import com.iailab.module.model.influxdb.vo.InfluxModelResultVO; @@ -17,6 +18,7 @@ import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * InfluxDB操作类 @@ -80,4 +82,48 @@ } return dataList; } + + @Override + public Map<String, List<InfluxModelResultVO>> queryModelResultsByOutPutIds(InfluxModelResultByOutPutIdsPOJO pojo, Date startTime, Date endTime) { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.MILLISECOND, 0); + String start = startTime.toInstant().toString(); + + if (startTime.getTime() == endTime.getTime()) { + // 如果相等,则engTime加1毫秒,否则influxdb报错(因为influxdb的range函数是左闭右开区间,所以将engTime加一毫秒,才可以查到startTime时间点的数据) + endTime.setTime(endTime.getTime() + 1); + } + String stop = endTime.toInstant().toString(); + + String measurement = MeasurementUtils.getMeasurement(pojo.getType()); + // 拼接OutPutIds + String outPutIdsFilter = pojo.getOutPutIds().stream().map(id -> "r[\"outPutId\"] == \"" + id + "\"").collect(Collectors.joining(" or ")); + StringBuilder sb = new StringBuilder(); + sb.append("from(bucket:\"" + influxDBInstance.getBucket() + "\") "); + sb.append("|> range(start: ").append(start).append(", stop: ").append(stop).append(") "); + sb.append("|> filter(fn: (r) => r[\"_measurement\"] == \"" + measurement + "\")"); + sb.append("|> filter(fn: (r) => r[\"_field\"] == \"value\")"); + sb.append("|> filter(fn: (r) => " + outPutIdsFilter + ")"); + sb.append("|> sort(columns: [\"_time\"]) "); + sb.append("|> yield(name: \"mean\")"); + log.info("influxdbSql===============" + sb); + List<FluxTable> tables = queryApi.query(sb.toString(), influxDBInstance.org); + + Map<String, List<InfluxModelResultVO>> result = new HashMap<>(pojo.getOutPutIds().size()); + for (FluxTable table : tables) { + List<FluxRecord> records = table.getRecords(); + for (FluxRecord record : records) { + String outPutId = record.getValueByKey("outPutId").toString(); + if (result.containsKey(outPutId)) { + result.get(outPutId).add( new InfluxModelResultVO(record.getValueByKey("_value"),record.getTime())); + } else { + List<InfluxModelResultVO> dataList = new ArrayList<>(); + InfluxModelResultVO vo = new InfluxModelResultVO(record.getValueByKey("_value"),record.getTime()); + dataList.add(vo); + result.put(outPutId,dataList); + } + } + } + return result; + } } \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictItemDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictItemDao.java index 8786e02..b07c54c 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictItemDao.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictItemDao.java @@ -35,4 +35,6 @@ default IPage<MmPredictItemRespVO> selectPage(MmPredictItemPageReqVO reqVO) { return getPageList(getPage(reqVO), reqVO); } + + List<MmPredictItemRespVO> getDoubleOutPutsByItemNos(Map<String, Object> params); } diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictItemService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictItemService.java index 72dc043..8cb78be 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictItemService.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictItemService.java @@ -45,4 +45,6 @@ List<MmPredictItemRespVO> list(Map<String, Object> params); MmPredictItemEntity getById(String id); + + List<MmPredictItemRespVO> getDoubleOutPutsByItemNos(List<String> itemNos); } diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictItemServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictItemServiceImpl.java index 0bd305c..268b8a0 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictItemServiceImpl.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictItemServiceImpl.java @@ -78,6 +78,17 @@ return mmPredictItemDao.selectById(id); } + @Override + public List<MmPredictItemRespVO> getDoubleOutPutsByItemNos(List<String> itemNos) { + if (CollectionUtils.isEmpty(itemNos)) { + return new ArrayList<>(); + } + Map<String, Object> params = new HashMap(1); + params.put("itemNos", itemNos); + List<MmPredictItemRespVO> list = mmPredictItemDao.getDoubleOutPutsByItemNos(params); + return list; + } + @DSTransactional(rollbackFor = Exception.class) @Override public void add(MmPredictItemDTO mmPredictItemDto) { diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/logback-spring.xml b/iailab-module-model/iailab-module-model-biz/src/main/resources/logback-spring.xml index 7c90fd0..9c48330 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/resources/logback-spring.xml +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/logback-spring.xml @@ -31,7 +31,7 @@ <!-- 启动服务时,是否清理历史日志,一般不建议清理 --> <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart> <!-- 日志文件,到达多少容量,进行滚动 --> - <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-100MB}</maxFileSize> + <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-50MB}</maxFileSize> <!-- 日志文件的总大小,0 表示不限制 --> <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap> <!-- 日志文件的保留天数 --> @@ -57,15 +57,15 @@ </appender> <!-- 本地环境 --> - <springProfile name="local"> - <root level="INFO"> + <springProfile name="dev"> + <root level="DEBUG"> <appender-ref ref="STDOUT"/> <appender-ref ref="GRPC"/> <!-- 本地环境下,如果不想接入 SkyWalking 日志服务,可以注释掉本行 --> <appender-ref ref="ASYNC"/> <!-- 本地环境下,如果不想打印日志,可以注释掉本行 --> </root> </springProfile> <!-- 其它环境 --> - <springProfile name="dev,test,stage,prod,default"> + <springProfile name="test,stage,prod,default"> <root level="INFO"> <appender-ref ref="STDOUT"/> <appender-ref ref="ASYNC"/> diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/MmPredictItemDao.xml b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/MmPredictItemDao.xml index 58885d1..940250c 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/MmPredictItemDao.xml +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/MmPredictItemDao.xml @@ -88,10 +88,12 @@ <result property="itemorder" column="ITEMORDER"/> <result property="status" column="STATUS"/> <result property="categoryid" column="CATEGORYID"/> + <result property="lastTime" column="last_time"/> <collection property="outPuts" ofType="com.iailab.module.model.mcs.pre.vo.MmItemOutputRespVO"> <result property="id" column="out_put_id"/> <result property="outputorder" column="out_put_order"/> <result property="resultName" column="result_name"/> + <result property="resultstr" column="result_str"/> </collection> </resultMap> @@ -191,6 +193,30 @@ FROM t_mm_predict_merge_item t1 WHERE t1.itemid = #{ITEMID} </select> + <select id="getDoubleOutPutsByItemNos" resultMap="MmPredictItemRespVO" parameterType="map"> + SELECT + TMPI.ID, + TMPI.ITEMNO, + TMPI.ITEMNAME, + TMPI.ITEMTYPEID, + TMPI.predictlength, + TMPI.GRANULARITY, + TMPI.ISFUSE, + TMPI.WORKCHECKED, + TMPI.STATUS, + TMIO.id out_put_id, + TMIO.outputorder out_put_order, + TMIO.resultstr result_str, + TMIO.result_name, + TMIS.last_time + FROM T_MM_PREDICT_ITEM TMPI + LEFT JOIN t_mm_item_output TMIO ON TMIO.itemid = TMPI.ID AND TMIO.result_type = 3 + LEFT JOIN t_mm_item_status TMIS ON TMIS.item_id = TMPI.ID + WHERE TMPI.itemno in + <foreach collection="itemNos" item="item" open="(" close=")" separator=","> + #{item} + </foreach> + </select> </mapper> \ No newline at end of file -- Gitblit v1.9.3