From ce958810cabd72b5ee6bc4b9433633b0230bcfdd Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期一, 04 五月 2026 22:51:57 +0800
Subject: [PATCH] # WCS输送站点、堆垛机配置页面参数增加可视化配置V3.0.1.5

---
 src/main/webapp/views/basCrnp/basCrnp.html |  256 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 256 insertions(+), 0 deletions(-)

diff --git a/src/main/webapp/views/basCrnp/basCrnp.html b/src/main/webapp/views/basCrnp/basCrnp.html
index 26bcec0..7cf22f4 100644
--- a/src/main/webapp/views/basCrnp/basCrnp.html
+++ b/src/main/webapp/views/basCrnp/basCrnp.html
@@ -239,6 +239,143 @@
             text-overflow: ellipsis;
         }
 
+        .station-list-editor,
+        .int-array2d-editor,
+        .int-array-editor {
+            padding: 10px 12px;
+            border: 1px solid #dfe7f1;
+            border-radius: 10px;
+            background: #f8fbff;
+            max-height: 400px;
+            overflow-y: auto;
+        }
+
+        .station-list-editor-row {
+            padding: 10px;
+            border: 1px solid #e8eef5;
+            border-radius: 8px;
+            background: #fff;
+            margin-bottom: 8px;
+        }
+
+        .station-list-editor-row-head {
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            margin-bottom: 8px;
+            font-size: 12px;
+            font-weight: 700;
+            color: #66788f;
+        }
+
+        .station-fields-grid {
+            display: grid;
+            grid-template-columns: repeat(4, 1fr);
+            gap: 6px;
+        }
+
+        .station-fields-grid label {
+            display: block;
+            font-size: 11px;
+            color: #66788f;
+            margin-bottom: 2px;
+        }
+
+        .station-fields-grid .el-input__inner {
+            height: 28px;
+            font-size: 12px;
+        }
+
+        .nested-section {
+            margin-top: 8px;
+            padding: 8px;
+            border: 1px dashed #d0dbe8;
+            border-radius: 6px;
+            background: #f5f8fc;
+        }
+
+        .nested-section-head {
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            margin-bottom: 6px;
+            font-size: 12px;
+            font-weight: 700;
+            color: #66788f;
+        }
+
+        .json-editor-footer {
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            gap: 8px;
+            margin-top: 10px;
+        }
+
+        .json-preview {
+            min-width: 0;
+            color: #8a98ac;
+            font-size: 12px;
+            white-space: nowrap;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            font-family: Menlo, Monaco, Consolas, monospace;
+            max-width: 400px;
+        }
+
+        .int-array2d-group {
+            display: flex;
+            align-items: center;
+            gap: 8px;
+            margin-bottom: 8px;
+            flex-wrap: wrap;
+        }
+
+        .int-array2d-group-label {
+            font-size: 12px;
+            font-weight: 700;
+            color: #66788f;
+            min-width: 36px;
+        }
+
+        .int-array2d-values {
+            display: flex;
+            gap: 6px;
+            flex-wrap: wrap;
+            align-items: center;
+        }
+
+        .int-array2d-values .el-input {
+            width: 70px;
+        }
+
+        .int-array2d-values .el-input__inner {
+            height: 28px;
+            font-size: 12px;
+        }
+
+        .int-array-items {
+            display: flex;
+            gap: 8px;
+            flex-wrap: wrap;
+            align-items: center;
+        }
+
+        .int-array-item {
+            display: flex;
+            align-items: center;
+            gap: 4px;
+        }
+
+        .int-array-item .el-input {
+            width: 80px;
+        }
+
+        .int-array-item .el-input__inner {
+            height: 28px;
+            font-size: 12px;
+        }
+
         .pager-bar {
             padding: 0 16px 16px;
             display: flex;
@@ -713,6 +850,124 @@
                                 <span class="row-map-json-preview mono" :title="dialogForm.rowMap">{{ dialogForm.rowMap || '鏈厤缃椂浣跨敤搴撲綅鎺掑師鍊�' }}</span>
                             </div>
                         </div>
+                        <!-- StationObjModel 鏁扮粍缂栬緫鍣� -->
+                        <div
+                            v-else-if="stationEditorFields.indexOf(field.field) !== -1"
+                            class="station-list-editor">
+                            <div
+                                v-for="(station, sIdx) in jsonEditorRows[field.field] || []"
+                                :key="field.field + '-station-' + sIdx"
+                                class="station-list-editor-row">
+                                <div class="station-list-editor-row-head">
+                                    <span>绔欑偣 {{ sIdx + 1 }}</span>
+                                    <el-button type="text" style="color:#f56c6c;" @click="removeStationRow(field.field, sIdx)">鍒犻櫎</el-button>
+                                </div>
+                                <div class="station-fields-grid">
+                                    <div><label>璁惧鍙�</label><el-input v-model.trim="station.deviceNo" placeholder="濡� 1" @input="syncStationField(field.field)"></el-input></div>
+                                    <div><label>绔欑偣ID</label><el-input v-model.trim="station.stationId" placeholder="濡� 11" @input="syncStationField(field.field)"></el-input></div>
+                                    <div><label>鎺�</label><el-input v-model.trim="station.deviceRow" placeholder="鎺�" @input="syncStationField(field.field)"></el-input></div>
+                                    <div><label>鍒�</label><el-input v-model.trim="station.deviceBay" placeholder="鍒�" @input="syncStationField(field.field)"></el-input></div>
+                                    <div><label>灞�</label><el-input v-model.trim="station.deviceLev" placeholder="灞�" @input="syncStationField(field.field)"></el-input></div>
+                                    <div><label>绔欑偣灞�</label><el-input v-model.trim="station.stationLev" placeholder="绔欑偣灞�" @input="syncStationField(field.field)"></el-input></div>
+                                    <div><label>鏉$爜绱㈠紩</label><el-input v-model.trim="station.barcodeIdx" placeholder="鏉$爜绱㈠紩" @input="syncStationField(field.field)"></el-input></div>
+                                    <div><label>鍙屽伐浣嶅伐浣�</label><el-input v-model.trim="station.dualCrnExecuteStation" placeholder="鍙屽伐浣嶅伐浣�" @input="syncStationField(field.field)"></el-input></div>
+                                </div>
+                                <!-- 鏉$爜绔欑偣 -->
+                                <div class="nested-section">
+                                    <div class="nested-section-head">
+                                        <span>鏉$爜绔欑偣 {{ station.barcodeStation ? '(宸查厤缃�)' : '' }}</span>
+                                        <span>
+                                            <el-button v-if="!station.barcodeStation" type="text" size="mini" @click="addNestedStation(field.field, sIdx, 'barcodeStation')">娣诲姞</el-button>
+                                            <el-button v-if="station.barcodeStation" type="text" size="mini" @click="toggleNested(field.field, sIdx, 'barcodeStation')">{{ station._showBarcode ? '鏀惰捣' : '灞曞紑' }}</el-button>
+                                            <el-button v-if="station.barcodeStation" type="text" size="mini" style="color:#f56c6c;" @click="removeNestedStation(field.field, sIdx, 'barcodeStation')">绉婚櫎</el-button>
+                                        </span>
+                                    </div>
+                                    <div v-if="station.barcodeStation && station._showBarcode" class="station-fields-grid">
+                                        <div><label>璁惧鍙�</label><el-input v-model.trim="station.barcodeStation.deviceNo" @input="syncStationField(field.field)"></el-input></div>
+                                        <div><label>绔欑偣ID</label><el-input v-model.trim="station.barcodeStation.stationId" @input="syncStationField(field.field)"></el-input></div>
+                                        <div><label>鎺�</label><el-input v-model.trim="station.barcodeStation.deviceRow" @input="syncStationField(field.field)"></el-input></div>
+                                        <div><label>鍒�</label><el-input v-model.trim="station.barcodeStation.deviceBay" @input="syncStationField(field.field)"></el-input></div>
+                                        <div><label>灞�</label><el-input v-model.trim="station.barcodeStation.deviceLev" @input="syncStationField(field.field)"></el-input></div>
+                                        <div><label>绔欑偣灞�</label><el-input v-model.trim="station.barcodeStation.stationLev" @input="syncStationField(field.field)"></el-input></div>
+                                        <div><label>鏉$爜绱㈠紩</label><el-input v-model.trim="station.barcodeStation.barcodeIdx" @input="syncStationField(field.field)"></el-input></div>
+                                        <div><label>鍙屽伐浣嶅伐浣�</label><el-input v-model.trim="station.barcodeStation.dualCrnExecuteStation" @input="syncStationField(field.field)"></el-input></div>
+                                    </div>
+                                </div>
+                                <!-- 鍥炲簱绔欑偣 -->
+                                <div class="nested-section">
+                                    <div class="nested-section-head">
+                                        <span>鍥炲簱绔欑偣 {{ station.backStation ? '(宸查厤缃�)' : '' }}</span>
+                                        <span>
+                                            <el-button v-if="!station.backStation" type="text" size="mini" @click="addNestedStation(field.field, sIdx, 'backStation')">娣诲姞</el-button>
+                                            <el-button v-if="station.backStation" type="text" size="mini" @click="toggleNested(field.field, sIdx, 'backStation')">{{ station._showBack ? '鏀惰捣' : '灞曞紑' }}</el-button>
+                                            <el-button v-if="station.backStation" type="text" size="mini" style="color:#f56c6c;" @click="removeNestedStation(field.field, sIdx, 'backStation')">绉婚櫎</el-button>
+                                        </span>
+                                    </div>
+                                    <div v-if="station.backStation && station._showBack" class="station-fields-grid">
+                                        <div><label>璁惧鍙�</label><el-input v-model.trim="station.backStation.deviceNo" @input="syncStationField(field.field)"></el-input></div>
+                                        <div><label>绔欑偣ID</label><el-input v-model.trim="station.backStation.stationId" @input="syncStationField(field.field)"></el-input></div>
+                                        <div><label>鎺�</label><el-input v-model.trim="station.backStation.deviceRow" @input="syncStationField(field.field)"></el-input></div>
+                                        <div><label>鍒�</label><el-input v-model.trim="station.backStation.deviceBay" @input="syncStationField(field.field)"></el-input></div>
+                                        <div><label>灞�</label><el-input v-model.trim="station.backStation.deviceLev" @input="syncStationField(field.field)"></el-input></div>
+                                        <div><label>绔欑偣灞�</label><el-input v-model.trim="station.backStation.stationLev" @input="syncStationField(field.field)"></el-input></div>
+                                        <div><label>鏉$爜绱㈠紩</label><el-input v-model.trim="station.backStation.barcodeIdx" @input="syncStationField(field.field)"></el-input></div>
+                                        <div><label>鍙屽伐浣嶅伐浣�</label><el-input v-model.trim="station.backStation.dualCrnExecuteStation" @input="syncStationField(field.field)"></el-input></div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="json-editor-footer">
+                                <el-button size="mini" plain icon="el-icon-plus" @click="addStationRow(field.field)">鏂板绔欑偣</el-button>
+                                <span class="json-preview mono" :title="dialogForm[field.field]">{{ dialogForm[field.field] || '绌�' }}</span>
+                            </div>
+                        </div>
+                        <!-- 浜岀淮鏁存暟鏁扮粍缂栬緫鍣� -->
+                        <div
+                            v-else-if="intArray2dFields.indexOf(field.field) !== -1"
+                            class="int-array2d-editor">
+                            <div
+                                v-for="(group, gIdx) in jsonEditorRows[field.field] || []"
+                                :key="field.field + '-group-' + gIdx"
+                                class="int-array2d-group">
+                                <span class="int-array2d-group-label">缁� {{ gIdx + 1 }}</span>
+                                <div class="int-array2d-values">
+                                    <el-input
+                                        v-for="(val, vIdx) in group.values"
+                                        :key="field.field + '-g' + gIdx + '-v' + vIdx"
+                                        v-model.trim="group.values[vIdx]"
+                                        placeholder="鍊�"
+                                        @input="syncIntArray2DField(field.field)">
+                                    </el-input>
+                                    <el-button type="text" icon="el-icon-plus" @click="addIntArray2DValue(field.field, gIdx)"></el-button>
+                                </div>
+                                <el-button type="text" style="color:#f56c6c;" @click="removeIntArray2DGroup(field.field, gIdx)">鍒犻櫎缁�</el-button>
+                            </div>
+                            <div class="json-editor-footer">
+                                <el-button size="mini" plain icon="el-icon-plus" @click="addIntArray2DGroup(field.field)">鏂板缁�</el-button>
+                                <span class="json-preview mono" :title="dialogForm[field.field]">{{ dialogForm[field.field] || '绌�' }}</span>
+                            </div>
+                        </div>
+                        <!-- 鏁存暟鏁扮粍缂栬緫鍣� -->
+                        <div
+                            v-else-if="intArrayFields.indexOf(field.field) !== -1"
+                            class="int-array-editor">
+                            <div class="int-array-items">
+                                <div
+                                    v-for="(val, idx) in jsonEditorRows[field.field] || []"
+                                    :key="field.field + '-item-' + idx"
+                                    class="int-array-item">
+                                    <el-input
+                                        v-model.trim="jsonEditorRows[field.field][idx]"
+                                        placeholder="鍊�"
+                                        @input="syncIntArrayField(field.field)">
+                                    </el-input>
+                                    <el-button type="text" style="color:#f56c6c;" @click="removeIntArrayValue(field.field, idx)">鍒犻櫎</el-button>
+                                </div>
+                            </div>
+                            <div class="json-editor-footer">
+                                <el-button size="mini" plain icon="el-icon-plus" @click="addIntArrayValue(field.field)">鏂板</el-button>
+                                <span class="json-preview mono" :title="dialogForm[field.field]">{{ dialogForm[field.field] || '绌�' }}</span>
+                            </div>
+                        </div>
                         <el-input
                             v-else-if="field.textarea"
                             v-model.trim="dialogForm[field.field]"
@@ -738,6 +993,7 @@
 
 <script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
 <script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/jsonEditors.js" charset="utf-8"></script>
 <script type="text/javascript" src="../../static/vue/js/vue.min.js"></script>
 <script type="text/javascript" src="../../static/vue/element/element.js"></script>
 <script type="text/javascript" src="../../static/js/basCrnp/basCrnp.js?v=20260310" charset="utf-8"></script>

--
Gitblit v1.9.1