|
|
@@ -411,22 +411,7 @@
|
|
|
<path class="chartPathP" :d="chartPaths.p" stroke="url(#gradP)" />
|
|
|
<path class="chartPathK" :d="chartPaths.k" stroke="url(#gradK)" />
|
|
|
|
|
|
- <!-- 数据点 -->
|
|
|
- <circle v-for="(pt, idx) in chartPoints.n" :key="`n-${idx}`"
|
|
|
- class="chartDotN"
|
|
|
- cx="0" cy="0" r="3"
|
|
|
- :transform="`translate(${pt.x}, ${pt.y})`"
|
|
|
- />
|
|
|
- <circle v-for="(pt, idx) in chartPoints.p" :key="`p-${idx}`"
|
|
|
- class="chartDotP"
|
|
|
- cx="0" cy="0" r="3"
|
|
|
- :transform="`translate(${pt.x}, ${pt.y})`"
|
|
|
- />
|
|
|
- <circle v-for="(pt, idx) in chartPoints.k" :key="`k-${idx}`"
|
|
|
- class="chartDotK"
|
|
|
- cx="0" cy="0" r="3"
|
|
|
- :transform="`translate(${pt.x}, ${pt.y})`"
|
|
|
- />
|
|
|
+<!-- 数据点已取消显示 -->
|
|
|
</svg>
|
|
|
</view>
|
|
|
|
|
|
@@ -1178,7 +1163,7 @@ const loadDeviceList = (currentFieldId) => {
|
|
|
// #ifdef H5
|
|
|
// H5 环境:分别保存 wss_flv 和 hls
|
|
|
const rawWsFlv = res.data.data.wss_flv
|
|
|
- const rawHls = res.data.data.hls
|
|
|
+ const rawHls = res.data.data.https_hls
|
|
|
|
|
|
// 非 iOS H5:走 wss_flv + Jessibuca,保留 URL 替换逻辑
|
|
|
if (!isH5IOS.value && rawWsFlv) {
|
|
|
@@ -1258,8 +1243,8 @@ const loadData = async (batchId) => {
|
|
|
}
|
|
|
loadDeviceList(res.data.data.fieldId) // 根据地块ID查询设备信息
|
|
|
|
|
|
- const beginCollectTime = formatDateTime(traceInfo.value.startPlantingTime);
|
|
|
- const endCollectTime = formatDateTime(traceInfo.value.packageDate);
|
|
|
+ const beginCollectTime = formatDateTime(traceInfo.value.startPlantingTime);// 开始使用播种时间作为起始时间
|
|
|
+ const endCollectTime = formatDateTime(traceInfo.value.produceDate); // 结尾使用成熟采收时间
|
|
|
const paramsMap = {
|
|
|
beginCollectTime:beginCollectTime,
|
|
|
endCollectTime:endCollectTime,
|
|
|
@@ -2264,6 +2249,11 @@ const chartData = computed(() => {
|
|
|
const valuesN = chart.values.n || []
|
|
|
const valuesP = chart.values.p || []
|
|
|
const valuesK = chart.values.k || []
|
|
|
+ const labels = chart.labels || []
|
|
|
+
|
|
|
+ // 使用 labels 长度作为基准(X轴标签数量)
|
|
|
+ // 如果 labels 为空,使用 values 长度
|
|
|
+ const baseLength = labels.length > 0 ? labels.length : valuesN.length
|
|
|
|
|
|
// 收集所有有效数值,计算全局范围
|
|
|
const allValues = [...valuesN, ...valuesP, ...valuesK]
|
|
|
@@ -2308,15 +2298,49 @@ const chartData = computed(() => {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
- // 计算点坐标(带平滑)
|
|
|
+ // 计算点坐标(基于 baseLength,即 labels 长度)
|
|
|
const calcPoints = (data) => {
|
|
|
if (!data.length) return []
|
|
|
- const smoothed = smoothValues(data.filter(v => typeof v === 'number' && !Number.isNaN(v)))
|
|
|
- return smoothed.map((val, idx, arr) => ({
|
|
|
- x: calcX(idx, arr.length),
|
|
|
- y: calcY(val),
|
|
|
- value: val
|
|
|
- }))
|
|
|
+ const dataLen = data.length
|
|
|
+
|
|
|
+ // 如果数据长度等于 baseLength,直接使用原始数据
|
|
|
+ if (dataLen === baseLength) {
|
|
|
+ return data.map((val, idx) => ({
|
|
|
+ x: calcX(idx, baseLength),
|
|
|
+ y: calcY(val),
|
|
|
+ value: val
|
|
|
+ }))
|
|
|
+ }
|
|
|
+
|
|
|
+ // 数据长度与 baseLength 不同时,进行线性插值
|
|
|
+ const points = []
|
|
|
+ for (let idx = 0; idx < baseLength; idx++) {
|
|
|
+ // 将当前索引映射到数据数组中的位置
|
|
|
+ const ratio = idx / (baseLength - 1) // 0 到 1 的比例
|
|
|
+ const dataPos = ratio * (dataLen - 1)
|
|
|
+
|
|
|
+ const lowerIdx = Math.floor(dataPos)
|
|
|
+ const upperIdx = Math.ceil(dataPos)
|
|
|
+
|
|
|
+ let val
|
|
|
+ if (lowerIdx === upperIdx) {
|
|
|
+ // 正好落在某个数据点上
|
|
|
+ val = data[lowerIdx]
|
|
|
+ } else {
|
|
|
+ // 在两个数据点之间,进行线性插值
|
|
|
+ const t = dataPos - lowerIdx
|
|
|
+ const lowerVal = data[lowerIdx]
|
|
|
+ const upperVal = data[upperIdx]
|
|
|
+ val = lowerVal + t * (upperVal - lowerVal)
|
|
|
+ }
|
|
|
+
|
|
|
+ points.push({
|
|
|
+ x: calcX(idx, baseLength),
|
|
|
+ y: calcY(val),
|
|
|
+ value: val
|
|
|
+ })
|
|
|
+ }
|
|
|
+ return points
|
|
|
}
|
|
|
|
|
|
// 生成平滑曲线路径(使用优化的张力系数)
|
|
|
@@ -3402,16 +3426,22 @@ function previewDoc(kind, index) {
|
|
|
/* 数据点样式(小而柔和) */
|
|
|
.chartDotN {
|
|
|
fill: rgba(47, 125, 85, 0.85);
|
|
|
+ transition: opacity 0.2s ease;
|
|
|
}
|
|
|
|
|
|
.chartDotP {
|
|
|
fill: rgba(180, 140, 70, 0.85);
|
|
|
+ transition: opacity 0.2s ease;
|
|
|
}
|
|
|
|
|
|
.chartDotK {
|
|
|
fill: rgba(84, 130, 110, 0.85);
|
|
|
+ transition: opacity 0.2s ease;
|
|
|
}
|
|
|
|
|
|
+/* 选中指示线样式 */
|
|
|
+/* 已移除 - 不再需要 */
|
|
|
+
|
|
|
.chartLabels {
|
|
|
position: absolute;
|
|
|
bottom: 0;
|