| | |
| | | font-family: Menlo, Monaco, Consolas, "Liberation Mono", monospace; |
| | | } |
| | | |
| | | .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; |
| | |
| | | active-color="#13ce66" |
| | | inactive-color="#c0c4cc"> |
| | | </el-switch> |
| | | <!-- 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]" |
| | |
| | | |
| | | <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/basDualCrnp/basDualCrnp.js?v=20260310" charset="utf-8"></script> |