feat: 注塑OEE报表功能增强与旧设备估算逻辑优化(TASK-xxx)

变更内容:
1.  优化接口注释与入参说明,补充设备利用率相关字段
2.  新增sumRtAndDay通用统计方法,支持跨表合并计算开机/产量数据
3.  重构旧设备开机数估算逻辑,调整浮动区间为70%-90%并优化去重规则
4.  重写累加器增量计算SQL,修复基线数据与同时间去重问题
5.  补充VO类新增班次、运行时长、标准周期等扩展字段
master
zch 1 month ago
parent 7b5802fee8
commit 570f6d91ed

@ -25,7 +25,11 @@ public class InjectionOeeAnalysisVo extends BaseEntity implements Serializable {
@JsonProperty("DEVICE_NAME")
private String DEVICE_NAME;
/** 可用率 (A) */
/** 统计班次类型ALL / DAY / NIGHT */
@JsonProperty("SHIFT_TYPE")
private String SHIFT_TYPE;
/** 设备利用率 A */
@JsonProperty("AVAILABILITY")
private Double AVAILABILITY;
@ -41,7 +45,7 @@ public class InjectionOeeAnalysisVo extends BaseEntity implements Serializable {
@JsonProperty("QUALITY")
private Double QUALITY;
/** OEE */
/** 完整 OEE = A * P * Q当前利用率页不把 A 直接当成 OEE */
@JsonProperty("OEE")
private Double OEE;
@ -57,6 +61,10 @@ public class InjectionOeeAnalysisVo extends BaseEntity implements Serializable {
@JsonProperty("ACTUAL_RUN_SECONDS")
private Long ACTUAL_RUN_SECONDS;
/** 实际运行时间(分钟) */
@JsonProperty("RUN_TIME_MINUTES")
private Double RUN_TIME_MINUTES;
/** 实际开模次数 (实际产出数量增量) */
@JsonProperty("SHOTS")
private Long SHOTS;
@ -81,10 +89,18 @@ public class InjectionOeeAnalysisVo extends BaseEntity implements Serializable {
@JsonProperty("STANDARD_CYCLE")
private Double STANDARD_CYCLE;
/** 标准周期 (秒),按方案约定返回字段名 */
@JsonProperty("STANDARD_CYCLE_SECONDS")
private Double STANDARD_CYCLE_SECONDS;
/** 标准周期来源 */
@JsonProperty("CYCLE_SOURCE")
private String CYCLE_SOURCE;
/** 标准周期来源,按方案约定返回字段名 */
@JsonProperty("STANDARD_CYCLE_SOURCE")
private String STANDARD_CYCLE_SOURCE;
/** 质量分析范围 */
@JsonProperty("QUALITY_SCOPE")
private String QUALITY_SCOPE;
@ -105,179 +121,16 @@ public class InjectionOeeAnalysisVo extends BaseEntity implements Serializable {
@JsonProperty("SHIFT_NAME")
private String SHIFT_NAME;
public String getDEVICE_CODE() {
return DEVICE_CODE;
}
/** 本日利用率 */
@JsonProperty("TODAY_AVAILABILITY")
private Double TODAY_AVAILABILITY;
public void setDEVICE_CODE(String DEVICE_CODE) {
this.DEVICE_CODE = DEVICE_CODE;
}
/** 周利用率 */
@JsonProperty("WEEK_AVAILABILITY")
private Double WEEK_AVAILABILITY;
public String getDEVICE_NAME() {
return DEVICE_NAME;
}
/** 总利用率 */
@JsonProperty("TOTAL_AVAILABILITY")
private Double TOTAL_AVAILABILITY;
public void setDEVICE_NAME(String DEVICE_NAME) {
this.DEVICE_NAME = DEVICE_NAME;
}
public Double getAVAILABILITY() {
return AVAILABILITY;
}
public void setAVAILABILITY(Double AVAILABILITY) {
this.AVAILABILITY = AVAILABILITY;
}
public Double getPERFORMANCE() {
return PERFORMANCE;
}
public void setPERFORMANCE(Double PERFORMANCE) {
this.PERFORMANCE = PERFORMANCE;
}
public Double getDIAGNOSTIC_PERFORMANCE() {
return DIAGNOSTIC_PERFORMANCE;
}
public void setDIAGNOSTIC_PERFORMANCE(Double DIAGNOSTIC_PERFORMANCE) {
this.DIAGNOSTIC_PERFORMANCE = DIAGNOSTIC_PERFORMANCE;
}
public Double getQUALITY() {
return QUALITY;
}
public void setQUALITY(Double QUALITY) {
this.QUALITY = QUALITY;
}
public Double getOEE() {
return OEE;
}
public void setOEE(Double OEE) {
this.OEE = OEE;
}
public Long getPLANNED_TIME_MINUTES() {
return PLANNED_TIME_MINUTES;
}
public void setPLANNED_TIME_MINUTES(Long PLANNED_TIME_MINUTES) {
this.PLANNED_TIME_MINUTES = PLANNED_TIME_MINUTES;
}
public Long getDOWNTIME_MINUTES() {
return DOWNTIME_MINUTES;
}
public void setDOWNTIME_MINUTES(Long DOWNTIME_MINUTES) {
this.DOWNTIME_MINUTES = DOWNTIME_MINUTES;
}
public Long getACTUAL_RUN_SECONDS() {
return ACTUAL_RUN_SECONDS;
}
public void setACTUAL_RUN_SECONDS(Long ACTUAL_RUN_SECONDS) {
this.ACTUAL_RUN_SECONDS = ACTUAL_RUN_SECONDS;
}
public Long getSHOTS() {
return SHOTS;
}
public void setSHOTS(Long SHOTS) {
this.SHOTS = SHOTS;
}
public Long getCAVITIES() {
return CAVITIES;
}
public void setCAVITIES(Long CAVITIES) {
this.CAVITIES = CAVITIES;
}
public Double getOUTPUT_QTY() {
return OUTPUT_QTY;
}
public void setOUTPUT_QTY(Double OUTPUT_QTY) {
this.OUTPUT_QTY = OUTPUT_QTY;
}
public Double getGOOD_QTY() {
return GOOD_QTY;
}
public void setGOOD_QTY(Double GOOD_QTY) {
this.GOOD_QTY = GOOD_QTY;
}
public Double getBAD_QTY() {
return BAD_QTY;
}
public void setBAD_QTY(Double BAD_QTY) {
this.BAD_QTY = BAD_QTY;
}
public Double getSTANDARD_CYCLE() {
return STANDARD_CYCLE;
}
public void setSTANDARD_CYCLE(Double STANDARD_CYCLE) {
this.STANDARD_CYCLE = STANDARD_CYCLE;
}
public String getCYCLE_SOURCE() {
return CYCLE_SOURCE;
}
public void setCYCLE_SOURCE(String CYCLE_SOURCE) {
this.CYCLE_SOURCE = CYCLE_SOURCE;
}
public String getQUALITY_SCOPE() {
return QUALITY_SCOPE;
}
public void setQUALITY_SCOPE(String QUALITY_SCOPE) {
this.QUALITY_SCOPE = QUALITY_SCOPE;
}
public Boolean getQUALITY_DEVICE_PRECISE() {
return QUALITY_DEVICE_PRECISE;
}
public void setQUALITY_DEVICE_PRECISE(Boolean QUALITY_DEVICE_PRECISE) {
this.QUALITY_DEVICE_PRECISE = QUALITY_DEVICE_PRECISE;
}
public String getDOWNGRADE_REASON() {
return DOWNGRADE_REASON;
}
public void setDOWNGRADE_REASON(String DOWNGRADE_REASON) {
this.DOWNGRADE_REASON = DOWNGRADE_REASON;
}
public String getSHIFT_DATE() {
return SHIFT_DATE;
}
public void setSHIFT_DATE(String SHIFT_DATE) {
this.SHIFT_DATE = SHIFT_DATE;
}
public String getSHIFT_NAME() {
return SHIFT_NAME;
}
public void setSHIFT_NAME(String SHIFT_NAME) {
this.SHIFT_NAME = SHIFT_NAME;
}
}

@ -28,17 +28,21 @@ public interface InjectionOeeMapper {
/**
* reset
*
* @param deviceCode
* @param paramName
* @param beginTime
* @param endTime
* @param tableSuffixes
* @param deviceCode
* @param paramName
* @param beginTime
* @param endTime
* @param autoBaselineBeginTime 线
* @param oldBaselineBeginTime OLD 线
* @param tableSuffixes
* @return
*/
BigDecimal selectCounterDeltaByWindow(@Param("deviceCode") String deviceCode,
@Param("paramName") String paramName,
@Param("beginTime") Date beginTime,
@Param("endTime") Date endTime,
@Param("autoBaselineBeginTime") Date autoBaselineBeginTime,
@Param("oldBaselineBeginTime") Date oldBaselineBeginTime,
@Param("tableSuffixes") List<String> tableSuffixes);
/**
@ -76,4 +80,18 @@ public interface InjectionOeeMapper {
*/
Map<String, Object> selectQualitySummary(@Param("beginTime") Date beginTime,
@Param("endTime") Date endTime);
/**
* "RT+DAY 合并求和"
*
* @param deviceCode
* @param paramName
* @param beginDate
* @param endDate
* @return
*/
Long sumRtAndDay(@Param("deviceCode") String deviceCode,
@Param("paramName") String paramName,
@Param("beginDate") Date beginDate,
@Param("endDate") Date endDate);
}

@ -12,12 +12,12 @@ import java.util.List;
public interface IInjectionOeeService {
/**
* OEE
* OEE
*
* @param deviceCode
* @param beginTimeStr (: YYYY-MM-DD)
* @param endTimeStr (: YYYY-MM-DD)
* @param shiftType (ALL-, DAY-, NIGHT-)
* @param shiftType (ALL-, DAY-, NIGHT-)
* @return OEE
*/
List<InjectionOeeAnalysisVo> getInjectionOeeAnalysis(String deviceCode, String beginTimeStr, String endTimeStr, String shiftType);

@ -28,9 +28,10 @@ public class Board4ServiceImpl implements IBoard4Service {
private static final int OPENING_COUNT_AUTO_BASELINE_LOOKBACK_HOURS = 2;
private static final int OPENING_COUNT_OLD_BASELINE_LOOKBACK_HOURS = 24;
private static final String OLD_DEVICE_CODE_PREFIX = "OLD-";
private static final int OLD_DEVICE_ESTIMATE_FLOAT_BUCKETS = 17;
private static final int OLD_DEVICE_ESTIMATE_FLOAT_CENTER = 8;
private static final double OLD_DEVICE_ESTIMATE_FLOAT_STEP = 0.01D;
private static final double OLD_DEVICE_ESTIMATE_MIN_RATE = 0.70D;
private static final double OLD_DEVICE_ESTIMATE_MAX_RATE = 0.90D;
private static final double OLD_DEVICE_ESTIMATE_RATE_STEP = 0.01D;
private static final int OLD_DEVICE_ESTIMATE_RATE_BUCKETS = 21;
@Autowired
private Board4Mapper board4Mapper;
@ -291,16 +292,13 @@ public class Board4ServiceImpl implements IBoard4Service {
/**
* 使OLD
* 使OLD
*/
private void fillMissingOldDeviceOpeningCountByReference(List<Board4DeviceOpeningCountVo> list) {
if (list == null || list.isEmpty()) {
return;
}
List<Long> referenceCounts = buildOpeningCountReferenceValues(list, false);
if (referenceCounts.isEmpty()) {
referenceCounts = buildOpeningCountReferenceValues(list, true);
}
List<Long> referenceCounts = buildOpeningCountReferenceValues(list);
if (referenceCounts.isEmpty()) {
return;
}
@ -335,12 +333,12 @@ public class Board4ServiceImpl implements IBoard4Service {
}
/**
* OLD
* OLD
*/
private List<Long> buildOpeningCountReferenceValues(List<Board4DeviceOpeningCountVo> list, boolean includeOldDevice) {
private List<Long> buildOpeningCountReferenceValues(List<Board4DeviceOpeningCountVo> list) {
List<Long> referenceCounts = new ArrayList<>();
for (Board4DeviceOpeningCountVo item : list) {
if (!includeOldDevice && isOldDevice(item)) {
if (isOldDevice(item)) {
continue;
}
if (item.getOpeningCount() == null || item.getOpeningCount().longValue() <= 0L) {
@ -352,7 +350,7 @@ public class Board4ServiceImpl implements IBoard4Service {
}
/**
* OLD
* /70%-90%OLD
*/
private Long buildOldDeviceEstimateOpeningCount(Board4DeviceOpeningCountVo item,
double averageOpeningCount,
@ -360,39 +358,67 @@ public class Board4ServiceImpl implements IBoard4Service {
int missingOldDeviceIndex,
List<Long> usedEstimatedCounts) {
double baseOpeningCount = (averageOpeningCount + medianOpeningCount) / 2D;
// 为什么这样做:看板会频繁刷新,不能用随机数;用设备编码/名称生成稳定浮动,避免同一设备数值跳动。
long minEstimateOpeningCount = Math.max(1L, Math.round(baseOpeningCount * OLD_DEVICE_ESTIMATE_MIN_RATE));
long maxEstimateOpeningCount = Math.max(minEstimateOpeningCount,
Math.round(baseOpeningCount * OLD_DEVICE_ESTIMATE_MAX_RATE));
// 为什么这样做:看板会频繁刷新,不能用随机数;用设备编码/名称生成70%-90%之间的稳定比例,避免同一设备数值跳动。
String seedText = String.valueOf(item.getDeviceCode()) + "|" + String.valueOf(item.getDeviceName());
long hashSeed = Math.abs((long) seedText.hashCode());
double floatRate = ((hashSeed % OLD_DEVICE_ESTIMATE_FLOAT_BUCKETS) - OLD_DEVICE_ESTIMATE_FLOAT_CENTER)
* OLD_DEVICE_ESTIMATE_FLOAT_STEP;
long estimateOpeningCount = Math.max(1L, Math.round(baseOpeningCount * (1D + floatRate)));
return avoidDuplicateOldDeviceEstimate(estimateOpeningCount, baseOpeningCount, missingOldDeviceIndex,
usedEstimatedCounts);
double estimateRate = OLD_DEVICE_ESTIMATE_MIN_RATE
+ (hashSeed % OLD_DEVICE_ESTIMATE_RATE_BUCKETS) * OLD_DEVICE_ESTIMATE_RATE_STEP;
long estimateOpeningCount = Math.round(baseOpeningCount * estimateRate);
estimateOpeningCount = clampEstimateOpeningCount(estimateOpeningCount,
minEstimateOpeningCount, maxEstimateOpeningCount);
return avoidDuplicateOldDeviceEstimate(estimateOpeningCount, minEstimateOpeningCount,
maxEstimateOpeningCount, missingOldDeviceIndex, usedEstimatedCounts);
}
/**
* OLD
* 70%-90%OLD
*/
private Long avoidDuplicateOldDeviceEstimate(long estimateOpeningCount,
double baseOpeningCount,
long minEstimateOpeningCount,
long maxEstimateOpeningCount,
int missingOldDeviceIndex,
List<Long> usedEstimatedCounts) {
if (!usedEstimatedCounts.contains(estimateOpeningCount)) {
return estimateOpeningCount;
}
long maxOffset = Math.max(2L, Math.round(baseOpeningCount * 0.08D));
long maxOffset = Math.max(0L, maxEstimateOpeningCount - minEstimateOpeningCount);
long direction = missingOldDeviceIndex % 2 == 0 ? 1L : -1L;
for (long offset = 1L; offset <= maxOffset; offset++) {
long candidate = Math.max(1L, estimateOpeningCount + direction * offset);
long candidate = clampEstimateOpeningCount(estimateOpeningCount + direction * offset,
minEstimateOpeningCount, maxEstimateOpeningCount);
if (!usedEstimatedCounts.contains(candidate)) {
return candidate;
}
candidate = Math.max(1L, estimateOpeningCount - direction * offset);
candidate = clampEstimateOpeningCount(estimateOpeningCount - direction * offset,
minEstimateOpeningCount, maxEstimateOpeningCount);
if (!usedEstimatedCounts.contains(candidate)) {
return candidate;
}
}
return Math.max(1L, estimateOpeningCount + missingOldDeviceIndex + 1L);
// 为什么这样做当基准值太小导致70%-90%整数区间容量不足时,优先保证旧设备之间不重复,数值仍贴近目标区间。
long expandedCandidate = maxEstimateOpeningCount + missingOldDeviceIndex + 1L;
while (usedEstimatedCounts.contains(expandedCandidate)) {
expandedCandidate++;
}
return expandedCandidate;
}
/**
*
*/
private long clampEstimateOpeningCount(long estimateOpeningCount,
long minEstimateOpeningCount,
long maxEstimateOpeningCount) {
if (estimateOpeningCount < minEstimateOpeningCount) {
return minEstimateOpeningCount;
}
if (estimateOpeningCount > maxEstimateOpeningCount) {
return maxEstimateOpeningCount;
}
return estimateOpeningCount;
}
/**

@ -19,100 +19,101 @@
ORDER BY DEVICE_CODE
</select>
<!-- 2. 计算累加器参数增量,支持 reset 检测和基准数据加载 -->
<!-- 2. 计算累加器参数增量,支持 reset 检测、基准数据加载和同时间去重 -->
<select id="selectCounterDeltaByWindow" resultType="java.math.BigDecimal">
WITH combined_data AS (
<!-- A. 窗口内的数据 -->
WITH source_param AS (
<choose>
<when test="tableSuffixes != null and tableSuffixes.size() > 0">
<foreach item="suffix" collection="tableSuffixes" separator=" UNION ALL ">
SELECT v.PARAM_VALUE, v.COLLECT_TIME
SELECT v.DEVICE_CODE AS device_code,
v.COLLECT_TIME AS collect_time,
TO_NUMBER(TRIM(v.PARAM_VALUE)) AS param_value
FROM BASE_DEVICE_PARAM_VAL_${suffix} v
WHERE v.DEVICE_CODE = #{deviceCode}
AND v.DEVICE_CODE NOT LIKE 'OLD-%'
AND v.PARAM_NAME = #{paramName}
AND v.COLLECT_TIME &gt;= #{beginTime}
AND v.COLLECT_TIME &gt;= #{autoBaselineBeginTime}
AND v.COLLECT_TIME &lt; #{endTime}
<!-- 为什么先校验再转数字PARAM_VALUE 是字符串,直接 TO_NUMBER 会因脏数据导致整页报表失败。 -->
AND REGEXP_LIKE(TRIM(v.PARAM_VALUE), '^[+-]?[0-9]+([.][0-9]+)?$')
</foreach>
UNION ALL
SELECT v.PARAM_VALUE, v.COLLECT_TIME
SELECT v.DEVICE_CODE AS device_code,
v.COLLECT_TIME AS collect_time,
TO_NUMBER(TRIM(v.PARAM_VALUE)) AS param_value
FROM BASE_DEVICE_PARAM_VAL v
WHERE v.DEVICE_CODE = #{deviceCode}
AND v.DEVICE_CODE LIKE 'OLD-%'
AND v.PARAM_NAME = #{paramName}
AND v.COLLECT_TIME &gt;= #{beginTime}
AND v.COLLECT_TIME &gt;= #{oldBaselineBeginTime}
AND v.COLLECT_TIME &lt; #{endTime}
AND REGEXP_LIKE(TRIM(v.PARAM_VALUE), '^[+-]?[0-9]+([.][0-9]+)?$')
</when>
<otherwise>
SELECT v.PARAM_VALUE, v.COLLECT_TIME
SELECT v.DEVICE_CODE AS device_code,
v.COLLECT_TIME AS collect_time,
TO_NUMBER(TRIM(v.PARAM_VALUE)) AS param_value
FROM BASE_DEVICE_PARAM_VAL v
WHERE v.DEVICE_CODE = #{deviceCode}
AND v.DEVICE_CODE LIKE 'OLD-%'
AND v.PARAM_NAME = #{paramName}
AND v.COLLECT_TIME &gt;= #{beginTime}
AND v.COLLECT_TIME &gt;= #{oldBaselineBeginTime}
AND v.COLLECT_TIME &lt; #{endTime}
AND REGEXP_LIKE(TRIM(v.PARAM_VALUE), '^[+-]?[0-9]+([.][0-9]+)?$')
</otherwise>
</choose>
UNION ALL
<!-- B. 窗口前最近的一条基准数据(用于获取窗口起点附近的基线值) -->
SELECT PARAM_VALUE, COLLECT_TIME
),
normalized_param AS (
SELECT p.device_code,
p.collect_time,
MAX(p.param_value) AS param_value
FROM source_param p
GROUP BY p.device_code, p.collect_time
),
baseline_param AS (
SELECT device_code, collect_time, param_value
FROM (
SELECT PARAM_VALUE, COLLECT_TIME,
ROW_NUMBER() OVER (ORDER BY COLLECT_TIME DESC) as rn
FROM (
<choose>
<when test="tableSuffixes != null and tableSuffixes.size() > 0">
<foreach item="suffix" collection="tableSuffixes" separator=" UNION ALL ">
SELECT v.PARAM_VALUE, v.COLLECT_TIME
FROM BASE_DEVICE_PARAM_VAL_${suffix} v
WHERE v.DEVICE_CODE = #{deviceCode}
AND v.PARAM_NAME = #{paramName}
AND v.COLLECT_TIME &lt; #{beginTime}
AND REGEXP_LIKE(TRIM(v.PARAM_VALUE), '^[+-]?[0-9]+([.][0-9]+)?$')
</foreach>
UNION ALL
SELECT v.PARAM_VALUE, v.COLLECT_TIME
FROM BASE_DEVICE_PARAM_VAL v
WHERE v.DEVICE_CODE = #{deviceCode}
AND v.PARAM_NAME = #{paramName}
AND v.COLLECT_TIME &lt; #{beginTime}
AND REGEXP_LIKE(TRIM(v.PARAM_VALUE), '^[+-]?[0-9]+([.][0-9]+)?$')
</when>
<otherwise>
SELECT v.PARAM_VALUE, v.COLLECT_TIME
FROM BASE_DEVICE_PARAM_VAL v
WHERE v.DEVICE_CODE = #{deviceCode}
AND v.PARAM_NAME = #{paramName}
AND v.COLLECT_TIME &lt; #{beginTime}
AND REGEXP_LIKE(TRIM(v.PARAM_VALUE), '^[+-]?[0-9]+([.][0-9]+)?$')
</otherwise>
</choose>
)
) WHERE rn = 1
SELECT p.device_code,
p.collect_time,
p.param_value,
ROW_NUMBER() OVER (
PARTITION BY p.device_code
ORDER BY p.collect_time DESC
) AS rn
FROM normalized_param p
WHERE p.collect_time &lt; #{beginTime}
)
WHERE rn = 1
),
ordered_data AS (
SELECT
TO_NUMBER(TRIM(PARAM_VALUE)) as val,
COLLECT_TIME,
LAG(TO_NUMBER(TRIM(PARAM_VALUE))) OVER (ORDER BY COLLECT_TIME) as prev_val
FROM combined_data
window_param AS (
SELECT p.device_code, p.collect_time, p.param_value
FROM normalized_param p
WHERE p.collect_time &gt;= #{beginTime}
AND p.collect_time &lt; #{endTime}
UNION ALL
SELECT p.device_code, p.collect_time, p.param_value
FROM baseline_param p
),
deltas AS (
SELECT
COLLECT_TIME,
val,
prev_val,
CASE
WHEN prev_val IS NULL THEN 0
WHEN val &gt;= prev_val THEN val - prev_val
ELSE val
END as delta
FROM ordered_data
ordered_param AS (
SELECT p.device_code,
p.collect_time,
p.param_value,
LAG(p.param_value) OVER (
PARTITION BY p.device_code
ORDER BY p.collect_time
) AS previous_param_value
FROM window_param p
)
SELECT NVL(SUM(delta), 0)
FROM deltas
WHERE COLLECT_TIME &gt;= #{beginTime}
AND COLLECT_TIME &lt; #{endTime}
SELECT NVL(SUM(
CASE
WHEN p.collect_time &lt; #{beginTime} THEN 0
WHEN p.previous_param_value IS NULL THEN 0
WHEN p.param_value &gt; p.previous_param_value THEN p.param_value - p.previous_param_value
WHEN p.param_value &lt; p.previous_param_value THEN p.param_value
ELSE 0
END
), 0) AS counter_delta
FROM ordered_param p
</select>
<!-- 3. 获取截止时间前最新的模腔数参数值 -->
@ -132,6 +133,7 @@
SELECT v.PARAM_VALUE, v.COLLECT_TIME
FROM BASE_DEVICE_PARAM_VAL v
WHERE v.DEVICE_CODE = #{deviceCode}
AND v.DEVICE_CODE LIKE 'OLD-%'
AND v.PARAM_NAME IN ('system.sv_iCavities', '机台状态-模腔数')
AND v.COLLECT_TIME &lt;= #{endTime}
AND REGEXP_LIKE(TRIM(v.PARAM_VALUE), '^[+-]?[0-9]+([.][0-9]+)?$')
@ -140,6 +142,7 @@
SELECT v.PARAM_VALUE, v.COLLECT_TIME
FROM BASE_DEVICE_PARAM_VAL v
WHERE v.DEVICE_CODE = #{deviceCode}
AND v.DEVICE_CODE LIKE 'OLD-%'
AND v.PARAM_NAME IN ('system.sv_iCavities', '机台状态-模腔数')
AND v.COLLECT_TIME &lt;= #{endTime}
AND REGEXP_LIKE(TRIM(v.PARAM_VALUE), '^[+-]?[0-9]+([.][0-9]+)?$')
@ -172,6 +175,7 @@
SELECT v.PARAM_VALUE, v.COLLECT_TIME
FROM BASE_DEVICE_PARAM_VAL v
WHERE v.DEVICE_CODE = #{deviceCode}
AND v.DEVICE_CODE LIKE 'OLD-%'
AND v.PARAM_NAME = '机床实时参数-周期时间'
AND v.COLLECT_TIME &gt;= #{beginTime}
AND v.COLLECT_TIME &lt; #{endTime}
@ -181,6 +185,7 @@
SELECT v.PARAM_VALUE, v.COLLECT_TIME
FROM BASE_DEVICE_PARAM_VAL v
WHERE v.DEVICE_CODE = #{deviceCode}
AND v.DEVICE_CODE LIKE 'OLD-%'
AND v.PARAM_NAME = '机床实时参数-周期时间'
AND v.COLLECT_TIME &gt;= #{beginTime}
AND v.COLLECT_TIME &lt; #{endTime}
@ -212,4 +217,22 @@
FROM bar_defect
</select>
<!-- 6. 泛化版 "RT+DAY 合并求和" -->
<select id="sumRtAndDay" resultType="java.lang.Long">
SELECT NVL(SUM(v), 0) FROM (
SELECT DAILY_PROD AS v
FROM DEVICE_DAILY_PRODUCTION
WHERE DEVICE_CODE = #{deviceCode}
AND PARAM_NAME = #{paramName}
AND PROD_DATE BETWEEN TRUNC(#{beginDate}) AND LEAST(TRUNC(#{endDate}), TRUNC(SYSDATE) - 1)
UNION ALL
SELECT CURRENT_TOTAL AS v
FROM RT_DAILY_PROD_STATE
WHERE DEVICE_CODE = #{deviceCode}
AND PARAM_NAME = #{paramName}
AND PROD_DATE = TRUNC(SYSDATE)
AND TRUNC(SYSDATE) BETWEEN TRUNC(#{beginDate}) AND TRUNC(#{endDate})
)
</select>
</mapper>

Loading…
Cancel
Save