lisy 4 dienas atpakaļ
vecāks
revīzija
78efa33d13

+ 50 - 47
src/plant/port/port-create/index.vue

@@ -454,11 +454,13 @@
                             </view>
                         </up-form-item>
                         <up-form-item :borderBottom="false" label="具体位置" prop="landLayers" id="landLayerspppp">
-                            <Go_button @click="openLaboratory" title="请选择具体位置" style="flex: 1" />
-                            <view class="w-100% p-rtv" v-for="(it, indexs) in form?.landLayers" :key="indexs" style="border: 1px solid #afddbb">
-                                <view class="c-#333 f-s-34 f-w-5">{{ it?.landName }}</view>
-                                <view class="c-#666 f-s-24">{{ stringifyCheckedList(it?.checkedList, Number(it?.capacityAmount || 0)) }}</view>
-                                <view class="c-#F81242 h-20 w-20" style="position: absolute; right: 4rpx; top: 4rpx" @click="deleteLayer(indexs)">x</view>
+                            <view class="d-flex flex-cln flex1">
+                                <view class="p-rtv pd-24 b-radius" v-for="(it, indexs) in form?.landLayers" :key="indexs" style="border: 1px solid #afddbb">
+                                    <view class="c-#333 f-s-34 f-w-5">{{ it?.landName }}</view>
+                                    <view class="c-#666 f-s-24">{{ stringifyCheckedList(it?.checkedList, Number(it?.capacityAmount || 0)) }}</view>
+                                    <view class="c-#F81242 h-20 w-20" style="position: absolute; right: 4rpx; top: 4rpx" @click="deleteLayer(indexs)">x</view>
+                                </view>
+                                <Go_button @click="openLaboratory" title="请选择具体位置" class="w-100%" />
                             </view>
                         </up-form-item>
                     </view>
@@ -886,59 +888,60 @@ const handleAnimalIdCancel = () => {
     editIndex.value = -1;
     showAnimalIdDialog.value = false;
 };
-const stringifyCheckedList = (list: any[], capacityAmount: number) => {
-    if (!list || list.length === 0) {
+type CheckedPosition = {
+    x: number;
+    y: number;
+};
+
+const stringifyCheckedList = (list: CheckedPosition[], perLayerCount: number) => {
+    if (!Array.isArray(list) || !list.length) {
+        return '';
+    }
+    const capacity = Number(perLayerCount || 0);
+    if (!capacity) {
         return '';
     }
-    type ParsedItem = {
-        layer: number;
-        capacity: number;
-        value: string;
-    };
-    const parsed = list
-        .map((value) => {
-            const [layerText, capacityText] = String(value).split('-');
-            const layer = Number(layerText);
-            const capacity = Number(capacityText);
-            if (!layer || !capacity) {
-                return null;
-            }
-            return {
-                layer,
-                capacity,
-                value: `${layer}-${capacity}`,
-            };
-        })
-        .filter((item): item is ParsedItem => item !== null)
-        .sort((left, right) => {
-            if (left.layer !== right.layer) {
-                return left.layer - right.layer;
-            }
-            return left.capacity - right.capacity;
-        });
 
-    if (!parsed.length) {
+    const serialMap = new Map<number, CheckedPosition>();
+    list.forEach((item) => {
+        const serial = (item.x - 1) * capacity + item.y;
+        if (serial > 0 && !serialMap.has(serial)) {
+            serialMap.set(serial, item);
+        }
+    });
+
+    const serials = Array.from(serialMap.keys()).sort((a, b) => a - b);
+    if (!serials.length) {
         return '';
     }
 
     const segments: string[] = [];
-    let startIndex = 0;
+    let startSerial = serials[0];
+    let endSerial = serials[0];
+
+    const pushSegment = (start: number, end: number) => {
+        const startItem = serialMap.get(start)!;
+        const endItem = serialMap.get(end)!;
+        if (start === end) {
+            segments.push(`${startItem.x}-${startItem.y}`);
+        } else {
+            segments.push(`${startItem.x}-${startItem.y}至${endItem.x}-${endItem.y}`);
+        }
+    };
 
-    for (let index = 1; index <= parsed.length; index++) {
-        const previous = parsed[index - 1]!;
-        const current = parsed[index];
-        const isSameLayerContinuous = !!current && current.layer === previous.layer && current.capacity === previous.capacity + 1;
-        const isCrossLayerContinuous = !!current && current.layer === previous.layer + 1 && previous.capacity === capacityAmount && current.capacity === 1;
-        const isContinuous = isSameLayerContinuous || isCrossLayerContinuous;
-        if (isContinuous) {
-            continue;
+    for (let index = 1; index < serials.length; index++) {
+        const current = serials[index];
+        if (current === endSerial + 1) {
+            endSerial = current;
+        } else {
+            pushSegment(startSerial, endSerial);
+            startSerial = current;
+            endSerial = current;
         }
-        const start = parsed[startIndex]!;
-        segments.push(start.value === previous.value ? start.value : `${start.value}至${previous.value}`);
-        startIndex = index;
     }
+    pushSegment(startSerial, endSerial);
 
-    return `${segments.join(',')}共${parsed.length}个位置`;
+    return `${segments.join(',')}共${serials.length}个位置`;
 };
 // 扫一扫添加个体标识
 const handleScanAdd = () => {

+ 5 - 3
src/tools/select-cultivation-location/index.vue

@@ -259,9 +259,11 @@ onLoad(() => {
     try {
         const instanceproxy: any = getCurrentInstance()?.proxy;
         const eventChannel = instanceproxy?.getOpenerEventChannel();
-        eventChannel?.on('selectCultivationLocation', (data: any[]) => {
-            if (Array.isArray(data)) {
-                data.forEach((item) => {
+        eventChannel?.on('selectCultivationLocation', (data: any) => {
+            if (data) {
+                const { list = [], baseId } = data;
+                form.value.baseId = baseId;
+                list.forEach((item: any) => {
                     checkeds.value[item.id] = {
                         id: item.id,
                         landName: item.landName,