| | |
| | | <template> |
| | | <div class="title">设å¤åå§å</div> |
| | | <div> |
| | | <div class="container"> |
| | | <label>AGV设å¤åç§°</label> |
| | | <el-select placeholder="è¯·éæ©ç©æç¶æ" v-model="DeviceName"> |
| | | <el-option label="(åºåº)æ¯è½¦ï¼RGV110" value="RGV110" /> |
| | | <el-option label="(åºåº)æ¯è½¦ï¼RGV112" value="RGV112" /> |
| | | <el-option label="(åºåº)å车ï¼RGV111" value="RGV111" /> |
| | | <el-option label="(åºåº)å车ï¼RGV116" value="RGV116" /> |
| | | <el-option label="(åºåº)æ¯è½¦ï¼RGV114" value="RGV114" /> |
| | | <el-option label="(åºåº)æ¯è½¦ï¼RGV115" value="RGV115" /> |
| | | <el-option label="(åºåº)RGV118" value="RGV118" /> |
| | | <el-option label="æ¯è½¦ï¼RGV109" value="RGV109" /> |
| | | <el-option label="æ¯è½¦ï¼RGV108" value="RGV108" /> |
| | | <el-option label="æ¯è½¦ï¼RGV105" value="RGV105" /> |
| | | <el-option label="æ¯è½¦ï¼RGV103" value="RGV103" /> |
| | | |
| | | <el-option label="å车ï¼RGV104" value="RGV104" /> |
| | | <el-option label="å车ï¼RGV107" value="RGV107" /> |
| | | </el-select> |
| | | <div class="rgv-monitor"> |
| | | <div class="monitor-header"> |
| | | <div class="title">设å¤ç¶æçæ§</div> |
| | | <div class="control-panel"> |
| | | <!-- çæ§ç±»å忢 --> |
| | | <div class="monitor-type-switch"> |
| | | <el-button-group> |
| | | <el-button |
| | | :type="currentMonitorType === 'inbound' ? 'primary' : ''" |
| | | @click="switchMonitorType('inbound')" |
| | | > |
| | | å
¥åºçæ§ |
| | | </el-button> |
| | | <el-button |
| | | :type="currentMonitorType === 'outbound' ? 'primary' : ''" |
| | | @click="switchMonitorType('outbound')" |
| | | > |
| | | åºåºçæ§ |
| | | </el-button> |
| | | <el-button |
| | | :type="currentMonitorType === 'safetydoor' ? 'primary' : ''" |
| | | @click="switchMonitorType('safetydoor')" |
| | | > |
| | | å®å
¨é¨çæ§ |
| | | </el-button> |
| | | </el-button-group> |
| | | </div> |
| | | |
| | | <!-- ä¸é®æä½æé®ï¼å®å
¨é¨çæ§æ¶ä¸æ¾ç¤ºï¼ --> |
| | | <div class="one-click-operations" v-if="currentMonitorType !== 'safetydoor'"> |
| | | <el-button-group> |
| | | <el-button |
| | | type="primary" |
| | | @click="handleOneClickOperation('init')" |
| | | :loading="oneClickLoading.init" |
| | | > |
| | | ä¸é®åå§å |
| | | </el-button> |
| | | <el-button |
| | | type="warning" |
| | | @click="handleOneClickOperation('reset')" |
| | | :loading="oneClickLoading.reset" |
| | | > |
| | | ä¸é®å¤ä½ |
| | | </el-button> |
| | | <el-button |
| | | type="success" |
| | | @click="handleOneClickOperation('start')" |
| | | :loading="oneClickLoading.start" |
| | | > |
| | | ä¸é®å¯å¨ |
| | | </el-button> |
| | | <el-button |
| | | type="danger" |
| | | @click="handleOneClickOperation('stop')" |
| | | :loading="oneClickLoading.stop" |
| | | > |
| | | ä¸é®æå |
| | | </el-button> |
| | | </el-button-group> |
| | | </div> |
| | | |
| | | <el-button |
| | | :type="isMonitoring ? 'danger' : 'primary'" |
| | | @click="toggleMonitoring" |
| | | > |
| | | {{ isMonitoring ? 'åæ¢çæ§' : 'å¯å¨çæ§' }} |
| | | </el-button> |
| | | <el-button type="warning" @click="refreshData">å·æ°æ°æ®</el-button> |
| | | </div> |
| | | </div> |
| | | |
| | | |
| | | |
| | | <el-button type="danger" v-on:click="submit" plain style="margin-left: 50px">åå§å</el-button> |
| | | |
| | | |
| | | </div> |
| | | |
| | | <div> |
| | | <label>RGVåå
¥å个模å</label> |
| | | |
| | | <div class="container"> |
| | | <label>åå
¥çç±»å</label> |
| | | <el-select placeholder="è¯·éæ©ç©æç¶æ" v-model="DBType"> |
| | | <el-option label="工使¨¡å¼ï¼0æå¨ã1èªå¨ï¼" value="1" /> |
| | | <el-option label="å¤ä½æä½ï¼0ä¸å¤ä½ã1å¤ä½ï¼" value="2" /> |
| | | <el-option label="ä»»å¡ç¡®è®¤å®æï¼0ä¸ç¡®å®ï¼1ç¡®å®ï¼" value="3" /> |
| | | <el-option label="ä»»å¡ç±»å(4æ¸
é¤)" value="4" /> |
| | | </el-select> |
| | | </div> |
| | | <div class="container"> |
| | | <label>åå
¥åæ°</label> |
| | | <el-input type="text" v-model="WriteRGVvalue"></el-input> |
| | | <!-- çæ§ç¶ææ¾ç¤º --> |
| | | <div class="monitor-status"> |
| | | <el-alert |
| | | :title="getMonitorStatusTitle()" |
| | | :type="isMonitoring ? 'success' : 'info'" |
| | | :closable="false" |
| | | show-icon |
| | | /> |
| | | </div> |
| | | |
| | | <el-button type="danger" v-on:click="submitRGVw" plain style="margin-left: 50px">åå
¥</el-button> |
| | | </div> |
| | | <div class="devices-container"> |
| | | <!-- å¨ææ¸²æè®¾å¤ --> |
| | | <div |
| | | class="device-card" |
| | | v-for="(deviceData, deviceKey) in currentDeviceData" |
| | | :key="deviceKey" |
| | | > |
| | | <div class="device-header"> |
| | | <h3>{{ getDeviceDisplayName(deviceKey) }}</h3> |
| | | <div class="status-indicator" :class="getStatusClass(deviceData)"></div> |
| | | </div> |
| | | <div class="device-content"> |
| | | <template v-if="deviceData && Object.keys(deviceData).length > 0"> |
| | | <!-- RGVè®¾å¤æ¾ç¤º --> |
| | | <template v-if="currentMonitorType !== 'safetydoor'"> |
| | | <!-- åå§åç¶ææ¾ç¤º --> |
| | | <div |
| | | class="data-row" |
| | | v-if="deviceData['åå§åæªå®ææ å¿ä½'] !== undefined" |
| | | > |
| | | <span class="label">åå§åç¶æ:</span> |
| | | <span class="value" :class="deviceData['åå§åæªå®ææ å¿ä½'] === 1 ? 'fault-text' : ''"> |
| | | {{ deviceData['åå§åæªå®ææ å¿ä½'] === 0 ? '已宿' : 'æªå®æ' }} |
| | | </span> |
| | | </div> |
| | | |
| | | <div |
| | | class="data-row" |
| | | v-for="(value, key) in deviceData" |
| | | :key="key" |
| | | v-if="key !== 'åå§åæªå®ææ å¿ä½'" |
| | | > |
| | | <span class="label">{{ getFieldDisplayName(key) }}:</span> |
| | | <span class="value" :class="getValueClass(key, value, deviceKey)"> |
| | | {{ getFormattedValue(key, value, deviceKey) }} |
| | | <!-- 为ä¸åä¿¡å·åä¸éä¿¡å·æ·»å æç¤ºç¯ --> |
| | | <span v-if="key === 'ä¸åä¿¡å·å°ä½'" class="signal-indicator" :class="getSignalClass(value)"></span> |
| | | <span v-if="key === 'ä¸éä¿¡å·å°ä½'" class="signal-indicator" :class="getSignalClass(value)"></span> |
| | | </span> |
| | | </div> |
| | | </template> |
| | | |
| | | <!-- å®å
¨é¨è®¾å¤æ¾ç¤º --> |
| | | <template v-else> |
| | | <div |
| | | class="data-row" |
| | | v-for="(value, key) in deviceData" |
| | | :key="key" |
| | | > |
| | | <span class="label">{{ getFieldDisplayName(key) }}:</span> |
| | | <span class="value" :class="getSafetyDoorValueClass(key, value)"> |
| | | {{ getSafetyDoorFormattedValue(key, value) }} |
| | | <!-- å®å
¨é¨ç¶ææç¤ºç¯ --> |
| | | <span v-if="key === 'å®å
¨é¨æç¤ºç¯ç¶æ'" class="safety-light" :class="getSafetyLightClass(value)"></span> |
| | | <span v-if="key === 'å®å
¨é¨æ¥åç¶æ'" class="emergency-stop" :class="getEmergencyStopClass(value)"></span> |
| | | </span> |
| | | </div> |
| | | </template> |
| | | </template> |
| | | <div v-else class="no-data"> |
| | | è®¾å¤æªè¿æ¥æææ æ°æ® |
| | | </div> |
| | | |
| | | <div style="margin-top: 30px;"> |
| | | <el-button type="danger" v-on:click="InReset" plain style="margin-left: 50px">ä¸é®å¤ä½ï¼å
¥åºç«¯ï¼</el-button> |
| | | <el-button type="danger" v-on:click="OutReset" plain style="margin-left: 50px">ä¸é®å¤ä½ï¼åºåºç«¯ï¼</el-button> |
| | | <!-- æä½æé®åºåï¼å®å
¨é¨çæ§æ¶ä¸æ¾ç¤ºï¼ --> |
| | | <div class="operation-buttons" v-if="currentMonitorType !== 'safetydoor'"> |
| | | <!-- å车æä½æé® --> |
| | | <template v-if="getDeviceType(deviceKey) === 'child'"> |
| | | <el-button |
| | | type="primary" |
| | | size="small" |
| | | @click="handleOperation(deviceKey, 'cs')" |
| | | :loading="loadingStates[deviceKey]?.cs" |
| | | :disabled="deviceData && deviceData['åå§åæªå®ææ å¿ä½'] === 0" |
| | | > |
| | | {{ getInitializationButtonText(deviceData) }} |
| | | </el-button> |
| | | <el-button |
| | | :type="getModeButtonType(deviceData)" |
| | | size="small" |
| | | @click="handleModeToggle(deviceKey)" |
| | | :loading="loadingStates[deviceKey]?.modeToggle" |
| | | > |
| | | {{ getCurrentModeText(deviceData) }} |
| | | </el-button> |
| | | <el-button |
| | | type="warning" |
| | | size="small" |
| | | @click="handleOperation(deviceKey, 'fw')" |
| | | :loading="loadingStates[deviceKey]?.fw" |
| | | > |
| | | å¤ä½ |
| | | </el-button> |
| | | </template> |
| | | |
| | | <el-button type="danger" v-on:click="Outtouchstart" plain style="margin-left: 50px">ä¸é®å¯å¨(åºåºç«¯)</el-button> |
| | | <el-button type="danger" v-on:click="Outbuttonpause" plain style="margin-left: 50px">ä¸é®æåï¼åºåºç«¯ï¼</el-button> |
| | | </div> |
| | | <!-- æ¯è½¦æä½æé® --> |
| | | <template v-else-if="getDeviceType(deviceKey) === 'mother'"> |
| | | <el-button |
| | | type="primary" |
| | | size="small" |
| | | @click="handleOperation(deviceKey, 'cs')" |
| | | :loading="loadingStates[deviceKey]?.cs" |
| | | :disabled="deviceData && deviceData['åå§åæªå®ææ å¿ä½'] === 0" |
| | | > |
| | | {{ getInitializationButtonText(deviceData) }} |
| | | </el-button> |
| | | <el-button |
| | | :type="getModeButtonType(deviceData)" |
| | | size="small" |
| | | @click="handleModeToggle(deviceKey)" |
| | | :loading="loadingStates[deviceKey]?.modeToggle" |
| | | > |
| | | {{ getCurrentModeText(deviceData) }} |
| | | </el-button> |
| | | <el-button |
| | | type="warning" |
| | | size="small" |
| | | @click="handleOperation(deviceKey, 'fw')" |
| | | :loading="loadingStates[deviceKey]?.fw" |
| | | > |
| | | å¤ä½ |
| | | </el-button> |
| | | </template> |
| | | |
| | | <div style="margin-top: 30px;"> |
| | | <label style="height: 30PX;">æå¨çæRGVå»çç®æ å°å</label> |
| | | <div class="container"> |
| | | <label>AGV设å¤åç§°</label> |
| | | <el-select placeholder="è¯·éæ©ç©æç¶æ" v-model="DeviceName2"> |
| | | <el-option label="æ¯è½¦ï¼RGV110" value="RGV110" /> |
| | | <el-option label="æ¯è½¦ï¼RGV112" value="RGV112" /> |
| | | <el-option label="å车ï¼RGV111" value="RGV111" /> |
| | | <el-option label="å车ï¼RGV116" value="RGV116" /> |
| | | <el-option label="æ¯è½¦ï¼RGV114" value="RGV114" /> |
| | | <el-option label="æ¯è½¦ï¼RGV115" value="RGV115" /> |
| | | <el-option label="æ¯è½¦ï¼RGV109" value="RGV109" /> |
| | | <el-option label="æ¯è½¦ï¼RGV108" value="RGV108" /> |
| | | <el-option label="æ¯è½¦ï¼RGV105" value="RGV105" /> |
| | | <el-option label="æ¯è½¦ï¼RGV103" value="RGV103" /> |
| | | <!-- åæè½¦æä½æé® --> |
| | | <template v-else-if="getDeviceType(deviceKey) === 'material'"> |
| | | <el-button |
| | | type="primary" |
| | | size="small" |
| | | @click="handleOperation(deviceKey, 'cs')" |
| | | :loading="loadingStates[deviceKey]?.cs" |
| | | :disabled="deviceData && deviceData['åå§åæªå®ææ å¿ä½'] === 0" |
| | | > |
| | | {{ getInitializationButtonText(deviceData) }} |
| | | </el-button> |
| | | <el-button |
| | | :type="getModeButtonType(deviceData)" |
| | | size="small" |
| | | @click="handleModeToggle(deviceKey)" |
| | | :loading="loadingStates[deviceKey]?.modeToggle" |
| | | > |
| | | {{ getCurrentModeText(deviceData) }} |
| | | </el-button> |
| | | <el-button |
| | | type="warning" |
| | | size="small" |
| | | @click="handleOperation(deviceKey, 'fw')" |
| | | :loading="loadingStates[deviceKey]?.fw" |
| | | > |
| | | å¤ä½ |
| | | </el-button> |
| | | <!-- é·è¾¾å¼å
³æé® --> |
| | | <el-button |
| | | :type="getRadarButtonType(deviceData)" |
| | | size="small" |
| | | @click="handleRadarToggle(deviceKey)" |
| | | :loading="loadingStates[deviceKey]?.radarToggle" |
| | | :disabled="!isManualMode(deviceData)" |
| | | > |
| | | {{ getRadarButtonText(deviceData) }} |
| | | </el-button> |
| | | |
| | | <!-- å
¥åºç»§ç»ä»»å¡æé®ï¼ä»
对RGV101æ¾ç¤ºï¼ --> |
| | | <el-button |
| | | v-if="deviceKey === 'rgV101'" |
| | | type="success" |
| | | size="small" |
| | | @click="handleInNormal(deviceKey)" |
| | | :loading="loadingStates[deviceKey]?.inNormal" |
| | | > |
| | | å
¥åºç»§ç»ä»»å¡ |
| | | </el-button> |
| | | |
| | | <!-- å
¥åºå¼å¸¸æé¤æé®ï¼ä»
对RGV101æ¾ç¤ºï¼ --> |
| | | <el-button |
| | | v-if="deviceKey === 'rgV101'" |
| | | type="danger" |
| | | size="small" |
| | | @click="handleInAbnormal(deviceKey)" |
| | | :loading="loadingStates[deviceKey]?.inAbnormal" |
| | | > |
| | | å
¥åºå¼å¸¸æé¤ |
| | | </el-button> |
| | | </template> |
| | | </div> |
| | | |
| | | <el-option label="å车ï¼RGV104" value="RGV104" /> |
| | | <el-option label="å车ï¼RGV107" value="RGV107" /> |
| | | </el-select> |
| | | </div> |
| | | <div class="container"> |
| | | <label>ç®æ å°å</label> |
| | | <el-input type="text" v-model="WritergvAddres"></el-input> |
| | | <!-- å°åæä½åºåï¼å®å
¨é¨çæ§æ¶ä¸æ¾ç¤ºï¼ --> |
| | | <div class="address-operation" v-if="currentMonitorType !== 'safetydoor'"> |
| | | <div class="address-title">å°åæä½</div> |
| | | <div class="address-input-group"> |
| | | <el-select |
| | | v-model="addressValues[deviceKey]" |
| | | placeholder="éæ©ç®æ å°å" |
| | | size="small" |
| | | style="width: 200px; margin-right: 10px;" |
| | | > |
| | | <el-option |
| | | v-for="address in getDeviceAddresses(deviceKey)" |
| | | :key="address.value" |
| | | :label="address.label" |
| | | :value="address.value" |
| | | /> |
| | | </el-select> |
| | | <el-button |
| | | type="info" |
| | | size="small" |
| | | @click="handleAddressOperation(deviceKey)" |
| | | :loading="loadingStates[deviceKey]?.dz" |
| | | :disabled="!addressValues[deviceKey]" |
| | | > |
| | | åå¾å°å |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <el-button type="danger" v-on:click="submit2" plain style="margin-left: 50px">确认ä¸åç§»å¨ä»»å¡</el-button> |
| | | |
| | | </div> |
| | | |
| | | <div> |
| | | <div class="container"> |
| | | <label>AGV设å¤åç§°</label> |
| | | <el-select placeholder="è¯·éæ©ç©æç¶æ" v-model="DeviceName3"> |
| | | <el-option label="(åºåº)æ¯è½¦ï¼RGV110" value="RGV110" /> |
| | | <el-option label="(åºåº)æ¯è½¦ï¼RGV112" value="RGV112" /> |
| | | <el-option label="(åºåº)å车ï¼RGV111" value="RGV111" /> |
| | | <el-option label="(åºåº)å车ï¼RGV116" value="RGV116" /> |
| | | <el-option label="(åºåº)æ¯è½¦ï¼RGV114" value="RGV114" /> |
| | | <el-option label="(åºåº)æ¯è½¦ï¼RGV115" value="RGV115" /> |
| | | <el-option label="(åºåº)RGV118" value="RGV118" /> |
| | | <el-option label="æ¯è½¦ï¼RGV109" value="RGV109" /> |
| | | <el-option label="æ¯è½¦ï¼RGV108" value="RGV108" /> |
| | | <el-option label="æ¯è½¦ï¼RGV105" value="RGV105" /> |
| | | <el-option label="æ¯è½¦ï¼RGV103" value="RGV103" /> |
| | | |
| | | <el-option label="å车ï¼RGV104" value="RGV104" /> |
| | | <el-option label="å车ï¼RGV107" value="RGV107" /> |
| | | </el-select> |
| | | <!-- å
¨å±æä½é¢æ¿ï¼å®å
¨é¨çæ§æ¶ä¸æ¾ç¤ºï¼ --> |
| | | <div class="operation-panel" v-if="currentMonitorType !== 'safetydoor'"> |
| | | <!-- <el-button type="primary" @click="showOperationDialog = true">é«çº§æä½</el-button> --> |
| | | </div> |
| | | <label>æ¥è¦ä¿¡æ¯ï¼ {{ baojlabel }}</label> |
| | | <el-button type="danger" v-on:click="ReadAlarm" plain style="margin-left: 50px">è¯»åæ¥è¦ä¿¡æ¯</el-button> |
| | | |
| | | <!-- æä½å¯¹è¯æ¡ --> |
| | | <el-dialog v-model="showOperationDialog" title="设å¤é«çº§æä½" width="600px"> |
| | | <div>设å¤åå§åãåå
¥åæ°çé«çº§æä½çé¢</div> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import VolBox from "@/components/basic/VolBox.vue"; |
| | | export default { |
| | | components: { |
| | | "vol-box": VolBox, |
| | | }, |
| | | name: 'RgvMonitor', |
| | | data() { |
| | | return { |
| | | //åå§åRGV |
| | | DeviceName: "", |
| | | DBType: "", |
| | | WriteRGVvalue: "", |
| | | |
| | | //æå¨ä¸årgvç®æ å°åï¼è¿è¡ç§»å¨rgv |
| | | DeviceName2: "", |
| | | WritergvAddres: "", |
| | | |
| | | //æ¥è¦ä¿¡æ¯è·å |
| | | DeviceName3: "", |
| | | baojlabel:"" |
| | | |
| | | }; |
| | | currentMonitorType: 'inbound', // 'inbound' æ 'outbound' æ 'safetydoor' |
| | | isMonitoring: false, |
| | | showOperationDialog: false, |
| | | pollingTimer: null, |
| | | loadingStates: {}, |
| | | addressValues: {}, |
| | | |
| | | // ä¸é®æä½å è½½ç¶æ |
| | | oneClickLoading: { |
| | | init: false, |
| | | reset: false, |
| | | start: false, |
| | | stop: false |
| | | }, |
| | | |
| | | // è®¾å¤æ°æ® |
| | | inboundDeviceData: { |
| | | rgV101: null, |
| | | rgV103: null, |
| | | rgV104: null, |
| | | rgV105: null, |
| | | rgV107: null, |
| | | rgV108: null, |
| | | rgV109: null, |
| | | // rgV202: null |
| | | }, |
| | | outboundDeviceData: { |
| | | rgV116: null, |
| | | rgV115: null, |
| | | rgV111: null, |
| | | rgV112: null, |
| | | rgV110: null, |
| | | rgV114: null, |
| | | rgV118: null |
| | | }, |
| | | safetyDoorDeviceData: { |
| | | aqm001: null, |
| | | aqm002: null, |
| | | aqm003: null |
| | | }, |
| | | |
| | | // åæ®µæ¾ç¤ºåç§°æ å° |
| | | fieldDisplayNames: { |
| | | '工使¨¡å¼': '工使¨¡å¼', |
| | | 'å½åä½ç½®': 'å½åä½ç½®', |
| | | 'æè´§ç¶æ': 'æè´§ç¶æ', |
| | | 'ç®æ å°å': 'ç®æ å°å', |
| | | 'ä»»å¡ç¶æ': 'ä»»å¡ç¶æ', |
| | | 'rgVä»»å¡ç¼å·': 'ä»»å¡ç¼å·', |
| | | 'æ
é代ç ': 'æ
é代ç ', |
| | | 'ä¸åä¿¡å·å°ä½': 'ä¸åä¿¡å·', |
| | | 'ä¸éä¿¡å·å°ä½': 'ä¸éä¿¡å·', |
| | | 'åå§åæªå®ææ å¿ä½': 'åå§åç¶æ', |
| | | 'é·è¾¾ç¶æ': 'é·è¾¾ç¶æ', |
| | | 'è´§åç¶æ': 'è´§åç¶æ', |
| | | // å®å
¨é¨å段 |
| | | 'å®å
¨é¨æç¤ºç¯ç¶æ': 'æç¤ºç¯ç¶æ', |
| | | 'å®å
¨é¨è¯·æ±å¼é¨': '请æ±å¼é¨', |
| | | 'å®å
¨é¨æçµç¶æ': 'æçµç¶æ', |
| | | 'å®å
¨é¨æ¥åç¶æ': 'æ¥åç¶æ', |
| | | 'å®å
¨é¨éç¶æ': 'é¨éç¶æ', |
| | | 'å®å
¨é¨å¤ä½ç¶æ': 'å¤ä½ç¶æ', |
| | | 'æ¥è¦ä¿¡æ¯': 'æ¥è¦ä¿¡æ¯', |
| | | 'å¼é¨ä¿¡æ¯': 'å¼é¨ä¿¡æ¯' |
| | | }, |
| | | |
| | | // è®¾å¤æ¾ç¤ºåç§°æ å° |
| | | deviceDisplayNames: { |
| | | // å
¥åºè®¾å¤ |
| | | 'rgV101': 'RGV101 - åæå
¥åºè½¦', |
| | | 'rgV103': 'RGV103 - æ¯è½¦', |
| | | 'rgV104': 'RGV104 - å车', |
| | | 'rgV105': 'RGV105 - æ¯è½¦', |
| | | 'rgV107': 'RGV107 - å车', |
| | | 'rgV108': 'RGV108 - æ¯è½¦', |
| | | 'rgV109': 'RGV109 - æ¯è½¦', |
| | | // åºåºè®¾å¤ |
| | | 'rgV110': 'RGV110 - æ¯è½¦', |
| | | 'rgV111': 'RGV111 - å车', |
| | | 'rgV112': 'RGV112 - æ¯è½¦', |
| | | 'rgV114': 'RGV114 - æ¯è½¦', |
| | | 'rgV115': 'RGV115 - æ¯è½¦', |
| | | 'rgV116': 'RGV116 - å车', |
| | | 'rgV118': 'RGV118 - åæåºåºè½¦', |
| | | // å®å
¨é¨è®¾å¤ |
| | | 'aqm001': 'AQM001 - 1#å®å
¨é¨', |
| | | 'aqm002': 'AQM002 - 2#å®å
¨é¨', |
| | | 'aqm003': 'AQM003 - 3#å®å
¨é¨' |
| | | }, |
| | | |
| | | // æä½ç±»åæ å° |
| | | operationTypes: { |
| | | 'cs': 'åå§å', |
| | | 'sd': '忢尿卿¨¡å¼', |
| | | 'zd': '忢å°èªå¨æ¨¡å¼', |
| | | 'dz': 'åå¾å°å', |
| | | 'kld': 'å¼é·è¾¾', |
| | | 'gld': 'å
³é·è¾¾', |
| | | 'fw': 'å¤ä½', |
| | | }, |
| | | |
| | | // æ¥è¦ä»£ç æ å° |
| | | motherCarAlarmCodes: { |
| | | 0: 'æ æ¥è¦', |
| | | 1: 'RGVå°è½¦æ¥å被æä¸', |
| | | 2: 'åè¿é使¥è¦', |
| | | 3: 'åéé使¥è¦', |
| | | 4: 'PLC模åæ
é', |
| | | 5: 'PLCæ©å±æ¨¡åæ
é', |
| | | 6: 'RGVé¿æ¶é´ç©ºè½¬æ
é', |
| | | 7: 'ç®çå°ä¸çäºå®é
ä½ç½®æ
é', |
| | | 8: '䏿»æ§é讯æ
é', |
| | | 9: 'è¡èµ°åé¢å¨æ
é', |
| | | 10: 'åè´§æ¶èªèº«æè´§ç©æ¥è¦', |
| | | 11: 'æ¾è´§æ¶èªèº«æ è´§ç©æ¥è¦', |
| | | 12: '忢æ¶ä½ç½®è¿å²æ¥è¦' |
| | | }, |
| | | |
| | | childCarAlarmCodes: { |
| | | 0: 'æ æ¥è¦', |
| | | 1: 'RGVå°è½¦æ¥å被æä¸', |
| | | 2: 'åè¿é使¥è¦', |
| | | 3: 'åéé使¥è¦', |
| | | 4: 'PLC模åæ
é', |
| | | 5: 'PLCæ©å±æ¨¡åæ
é', |
| | | 6: 'æ«ç å®ä½æ
é', |
| | | 7: 'RGVé¿æ¶é´ç©ºè½¬æ
é', |
| | | 8: 'ç®çå°ä¸çäºå®é
ä½ç½®æ
é', |
| | | 9: '䏿»æ§é讯æ
é', |
| | | 10: 'è¡èµ°åé¢å¨æ
é', |
| | | 11: 'æ¶²ååå
è¿è½½ä¿æ¤æ
é', |
| | | 12: 'æ¶²åä¸åè¶
æ¶æ¥è¦', |
| | | 13: 'æ¶²åä¸éè¶
æ¶æ¥è¦', |
| | | 14: 'åè´§æ¶èªèº«æè´§ç©æ¥è¦', |
| | | 15: 'æ¾è´§æ¶èªèº«æ è´§ç©æ¥è¦', |
| | | 16: 'åè´§æ£æµä¸å°è´§ç©æ¥è¦' |
| | | }, |
| | | |
| | | materialCarAlarmCodes: { |
| | | 0: 'æ æ¥è¦', |
| | | 1: 'RGVå°è½¦æ¥å被æä¸', |
| | | 2: 'æ£è½¬é·è¾¾æ¥è¦', |
| | | 3: 'å转é·è¾¾æ¥è¦', |
| | | 4: 'åè¿é使¥è¦', |
| | | 5: 'åéé使¥è¦', |
| | | 6: 'é¢ç', |
| | | 7: 'PLC模åæ
é', |
| | | 8: 'PLCæ©å±æ¨¡åæ
é', |
| | | 9: 'ç§°éæ¨¡åæ
é', |
| | | 10: 'æ«ç å®ä½æ
é', |
| | | 11: 'RGVé¿æ¶é´ç©ºè½¬æ
é', |
| | | 12: 'ç®çå°ä¸çäºå®é
ä½ç½®æ
é', |
| | | 13: '䏿»æ§é讯æ
é', |
| | | 14: 'åé·è¾¾å±è½è¦å', |
| | | 15: 'åé·è¾¾å±è½è¦å', |
| | | 16: 'è¡èµ°åé¢å¨æ
é', |
| | | 17: '伸缩ååé¢å¨æ
é', |
| | | 18: 'æ¶²ååå
è¿è½½ä¿æ¤æ
é', |
| | | 19: 'æ¶²åä¸åè¶
æ¶æ¥è¦', |
| | | 20: 'æ¶²åä¸éè¶
æ¶æ¥è¦', |
| | | 21: '伸缩å伸åºè¶
æ¶æ¥è¦', |
| | | 22: '伸缩å缩åè¶
æ¶æ¥è¦', |
| | | 23: 'å¤å½¢æ£æµæ¥è¦', |
| | | 24: 'ç§°éè¶
鿥è¦', |
| | | 25: 'è´§åä¼¸åºæéé使¥è¦', |
| | | 26: 'è´§å缩åæéé使¥è¦', |
| | | 27: 'åè´§æ¶èªèº«æè´§ç©æ¥è¦', |
| | | 28: 'æ¾è´§æ¶èªèº«æ è´§ç©æ¥è¦', |
| | | 29: 'è´§åæªåå°åå§ä½æ¥è¦', |
| | | 30: '触åä»
ç§»å¨å½ä»¤æ¶è´§åä¸å¨åå§ä½æ¥è¦', |
| | | 31: 'è´§åå°è¾¾åå§ä½ä½ä¸ä½ä¼ æå¨æªæ£æµå°æ¥è¦' |
| | | }, |
| | | |
| | | // å®å
¨é¨æç¤ºç¯ç¶ææ å° |
| | | safetyDoorLightCodes: { |
| | | 0: 'æ è¾åº', |
| | | 1: '红ç¯å¸¸äº®+è鸣', |
| | | 2: '绿ç¯å¸¸äº®', |
| | | 3: 'é»ç¯éªç(2HZ)', |
| | | 4: 'é»ç¯å¸¸äº®' |
| | | }, |
| | | |
| | | // 设å¤ç±»ååç±» |
| | | deviceTypes: { |
| | | // å
¥åºè®¾å¤ |
| | | motherCars: ['rgV103', 'rgV105', 'rgV108', 'rgV109'], |
| | | childCars: ['rgV104', 'rgV107'], |
| | | materialCars: ['rgV101'], |
| | | // åºåºè®¾å¤ |
| | | outboundMotherCars: ['rgV110', 'rgV112', 'rgV114', 'rgV115'], |
| | | outboundChildCars: ['rgV111', 'rgV116'], |
| | | outboundMaterialCars: ['rgV118'], |
| | | // å®å
¨é¨è®¾å¤ |
| | | safetyDoors: ['aqm001', 'aqm002', 'aqm003'] |
| | | }, |
| | | |
| | | // 设å¤å°åæ å° |
| | | deviceAddresses: { |
| | | // å
¥åºè®¾å¤å°å |
| | | 'rgV101': [ |
| | | { value: '1001', label: '1001 - åæå
¥åºä½' }, |
| | | { value: '1002', label: '1002 - åæåºåºä½' }, |
| | | { value: '1021', label: '1021 - ä¸è½¬ä½' } |
| | | ], |
| | | 'rgV103': [ |
| | | { value: '1031', label: '1031 - æ¯è½¦å车ä½1' }, |
| | | { value: '1032', label: '1032 - æ¯è½¦å车ä½2' } |
| | | ], |
| | | 'rgV104': [ |
| | | { value: '3', label: 'åé ç¹1' }, |
| | | { value: '5', label: 'åé ç¹2' }, |
| | | ], |
| | | 'rgV105': [ |
| | | { value: '1051', label: '1051 - æ¯è½¦å车ä½1' }, |
| | | { value: '1052', label: '1052 - æ¯è½¦å车ä½2' } |
| | | ], |
| | | 'rgV107': [ |
| | | { value: '3', label: 'åé ç¹1' }, |
| | | { value: '5', label: 'åé ç¹2' }, |
| | | ], |
| | | 'rgV108': [ |
| | | { value: '1081', label: '1081 - æ¯è½¦å车ä½1' }, |
| | | { value: '1082', label: '1082 - æ¯è½¦å车ä½2' } |
| | | ], |
| | | 'rgV109': [ |
| | | { value: '1091', label: '1091 - æ¯è½¦å车ä½1' }, |
| | | { value: '1092', label: '1092 - æ¯è½¦å车ä½2' } |
| | | ], |
| | | // 'rgV202': [ |
| | | // { value: '2001', label: '2001 - å·¥ä½1' }, |
| | | // { value: '2002', label: '2002 - å·¥ä½2' }, |
| | | // { value: '2003', label: '2003 - å·¥ä½3' }, |
| | | // { value: '2004', label: '2004 - å·¥ä½4' }, |
| | | // { value: '2005', label: '2005 - å·¥ä½5' }, |
| | | // { value: '2006', label: '2006 - å·¥ä½6' }, |
| | | // { value: '2007', label: '2007 - å·¥ä½7' }, |
| | | // { value: '2008', label: '2008 - å·¥ä½8' }, |
| | | // { value: '2009', label: '2009 - å·¥ä½9' } |
| | | // ], |
| | | // åºåºè®¾å¤å°å |
| | | 'rgV110': [ |
| | | { value: '1101', label: '1101 - æ¯è½¦å车ä½1' }, |
| | | { value: '1102', label: '1102 - æ¯è½¦å车ä½2' } |
| | | ], |
| | | 'rgV111': [ |
| | | { value: '3', label: 'åé ç¹1' }, |
| | | { value: '5', label: 'åé ç¹2' }, |
| | | ], |
| | | 'rgV112': [ |
| | | { value: '1121', label: '1121 - æ¯è½¦å车ä½1' }, |
| | | { value: '1122', label: '1122 - æ¯è½¦å车ä½2' } |
| | | ], |
| | | 'rgV114': [ |
| | | { value: '1141', label: '1141 - æ¯è½¦å车ä½1' }, |
| | | { value: '1142', label: '1142 - æ¯è½¦å车ä½2' } |
| | | ], |
| | | 'rgV115': [ |
| | | { value: '1151', label: '1151 - æ¯è½¦å车ä½1' }, |
| | | { value: '1152', label: '1152 - æ¯è½¦å车ä½2' } |
| | | ], |
| | | 'rgV116': [ |
| | | { value: '3', label: 'åé ç¹1' }, |
| | | { value: '5', label: 'åé ç¹2' }, |
| | | ], |
| | | 'rgV118': [ |
| | | { value: '2016', label: '2016 - åæå¤çä½1' }, |
| | | { value: '2017', label: '2017 - åæå¤çä½2' }, |
| | | { value: '2018', label: '2018 - åæå¤çä½3' }, |
| | | { value: '2019', label: '2019 - åæå¤çä½4' } |
| | | ] |
| | | }, |
| | | |
| | | // ç¹æ®å段ç弿 ¼å¼å |
| | | valueFormatters: { |
| | | '工使¨¡å¼': (value) => { |
| | | const modes = { 0: 'æå¨æ¨¡å¼', 1: 'èªå¨æ¨¡å¼' } |
| | | return modes[value] || `æªç¥æ¨¡å¼(${value})` |
| | | }, |
| | | 'æè´§ç¶æ': (value) => value === 0 ? 'æ è´§' : 'æè´§', |
| | | 'ä»»å¡ç¶æ': (value) => { |
| | | const statusMap = { 0: '空é²', 1: 'æ§è¡ä¸', 2: '宿' } |
| | | return statusMap[value] || `æªç¥ç¶æ(${value})` |
| | | }, |
| | | 'æ
é代ç ': (value, deviceKey) => { |
| | | return this.getAlarmText(value, deviceKey) |
| | | }, |
| | | 'ä¸åä¿¡å·å°ä½': (value) => value === 0 ? 'æªå°ä½' : 'å·²å°ä½', |
| | | 'ä¸éä¿¡å·å°ä½': (value) => value === 0 ? 'æªå°ä½' : 'å·²å°ä½', |
| | | 'åå§åæªå®ææ å¿ä½': (value) => value === 0 ? '已宿' : 'æªå®æ', |
| | | 'é·è¾¾ç¶æ': (value) => value === 0 ? 'å
³é' : 'å¼å¯', |
| | | 'è´§åç¶æ': (value) => value === 0 ? '缩å' : '伸åº' |
| | | }, |
| | | |
| | | // å®å
¨é¨åæ®µå¼æ ¼å¼å |
| | | safetyDoorValueFormatters: { |
| | | 'å®å
¨é¨æç¤ºç¯ç¶æ': (value) => { |
| | | return this.safetyDoorLightCodes[value] || `æªç¥ç¶æ(${value})` |
| | | }, |
| | | 'å®å
¨é¨è¯·æ±å¼é¨': (value) => value === 0 ? 'æ£å¸¸' : '请æ±å¼é¨', |
| | | 'å®å
¨é¨æçµç¶æ': (value) => value === 0 ? 'æçµ' : 'ä¸çµ', |
| | | 'å®å
¨é¨æ¥åç¶æ': (value) => value === 0 ? 'æ¥å' : 'æ£å¸¸', |
| | | 'å®å
¨é¨éç¶æ': (value) => value === 0 ? 'å¼é¨' : 'å
³é¨', |
| | | 'å®å
¨é¨å¤ä½ç¶æ': (value) => value === 0 ? 'æ£å¸¸' : 'å¤ä½ä¸', |
| | | 'æ¥è¦ä¿¡æ¯': (value) => value === 0 ? 'æ£å¸¸' : 'æ¥è¦', |
| | | 'å¼é¨ä¿¡æ¯': (value) => value === 0 ? 'å
³é¨' : 'å¼é¨' |
| | | } |
| | | } |
| | | }, |
| | | computed: { |
| | | // å½åæ¾ç¤ºçè®¾å¤æ°æ® |
| | | currentDeviceData() { |
| | | switch (this.currentMonitorType) { |
| | | case 'inbound': |
| | | return this.inboundDeviceData |
| | | case 'outbound': |
| | | return this.outboundDeviceData |
| | | case 'safetydoor': |
| | | return this.safetyDoorDeviceData |
| | | default: |
| | | return this.inboundDeviceData |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | |
| | | submit() { |
| | | var param = { |
| | | DelKeys: [this.DeviceName, this.DBType, this.WriteRGVvalue], |
| | | Extra: true |
| | | // å
¥åºç»§ç»ä»»å¡ |
| | | async handleInNormal(deviceKey) { |
| | | this.setLoadingState(deviceKey, 'inNormal', true); |
| | | |
| | | try { |
| | | const response = await this.http.post("api/RgvOperation/WriteInNormal", {}, "æ°æ®å¤çä¸..."); |
| | | |
| | | if (response.status) { |
| | | this.$message.success('å
¥åºç»§ç»ä»»å¡æå'); |
| | | this.refreshData(); |
| | | } else { |
| | | this.$message.error(response.message || 'å
¥åºç»§ç»ä»»å¡å¤±è´¥'); |
| | | } |
| | | } catch (error) { |
| | | this.$message.error('å
¥åºç»§ç»ä»»å¡è¯·æ±å¤±è´¥: ' + error.message); |
| | | } finally { |
| | | this.setLoadingState(deviceKey, 'inNormal', false); |
| | | } |
| | | this.http |
| | | .post("api/RgvOperation/WriteInitialization", param, "æ°æ®å¤çä¸...") |
| | | .then((x) => { |
| | | if (x.status) { |
| | | this.$Message.success('æå.'); |
| | | this.$parent.refresh(); |
| | | } else { |
| | | return this.$Message.error(x.message); |
| | | } |
| | | }); |
| | | }, |
| | | submitRGVw() { |
| | | var param = { |
| | | DelKeys: [this.DeviceName, this.DBType, this.WriteRGVvalue], |
| | | Extra: true |
| | | } |
| | | this.http |
| | | .post("api/RgvOperation/WriteRGVmokuai", param, "æ°æ®å¤çä¸...") |
| | | .then((x) => { |
| | | if (x.status) { |
| | | this.$Message.success('æå.'); |
| | | this.$parent.refresh(); |
| | | } else { |
| | | return this.$Message.error(x.message); |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | submit2() { |
| | | var param = { |
| | | DelKeys: [this.DeviceName2, this.WritergvAddres], |
| | | Extra: true |
| | | // å
¥åºå¼å¸¸æé¤ |
| | | async handleInAbnormal(deviceKey) { |
| | | this.setLoadingState(deviceKey, 'inAbnormal', true); |
| | | |
| | | try { |
| | | const response = await this.http.post("api/RgvOperation/WriteInAbnormal", {}, "æ°æ®å¤çä¸..."); |
| | | |
| | | if (response.status) { |
| | | this.$message.success('å
¥åºå¼å¸¸æé¤æå'); |
| | | this.refreshData(); |
| | | } else { |
| | | this.$message.error(response.message || 'å
¥åºå¼å¸¸æé¤å¤±è´¥'); |
| | | } |
| | | } catch (error) { |
| | | this.$message.error('å
¥åºå¼å¸¸æé¤è¯·æ±å¤±è´¥: ' + error.message); |
| | | } finally { |
| | | this.setLoadingState(deviceKey, 'inAbnormal', false); |
| | | } |
| | | this.http |
| | | .post("api/RgvOperation/ManualmovementRGV", param, "æ°æ®å¤çä¸...") |
| | | .then((x) => { |
| | | if (x.status) { |
| | | this.$Message.success('æå.'); |
| | | this.$parent.refresh(); |
| | | } else { |
| | | return this.$Message.error(x.message); |
| | | } |
| | | }); |
| | | }, |
| | | ReadAlarm() { |
| | | var param = { |
| | | DelKeys: [this.DeviceName3], |
| | | Extra: true |
| | | } |
| | | this.http |
| | | .post("api/RgvOperation/ReadAlarminformation", param, "æ°æ®å¤çä¸...") |
| | | .then((x) => { |
| | | if (x.status) { |
| | | this.baojlabel=x.data; |
| | | } else { |
| | | return this.$Message.error(x.message); |
| | | } |
| | | }); |
| | | }, |
| | | Outtouchstart() { |
| | | var param = { |
| | | DelKeys: [], |
| | | Extra: true |
| | | } |
| | | this.http |
| | | .post("api/RgvOperation/WriteOuttouchstart", {}, "æ°æ®å¤çä¸...") |
| | | .then((x) => { |
| | | if (x.status) { |
| | | this.$Message.success('æå.'); |
| | | this.$parent.refresh(); |
| | | } else { |
| | | return this.$Message.error(x.message); |
| | | } |
| | | }); |
| | | }, |
| | | Outbuttonpause() { |
| | | var param = { |
| | | DelKeys: [], |
| | | Extra: true |
| | | } |
| | | this.http |
| | | .post("api/RgvOperation/WriteOutbuttonpause", {}, "æ°æ®å¤çä¸...") |
| | | .then((x) => { |
| | | if (x.status) { |
| | | this.$Message.success('æå.'); |
| | | this.$parent.refresh(); |
| | | } else { |
| | | return this.$Message.error(x.message); |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | InReset() { |
| | | var param = { |
| | | DelKeys: [], |
| | | Extra: true |
| | | // è·åçæ§ç¶ææ é¢ |
| | | getMonitorStatusTitle() { |
| | | const typeNames = { |
| | | 'inbound': 'å
¥åº', |
| | | 'outbound': 'åºåº', |
| | | 'safetydoor': 'å®å
¨é¨' |
| | | } |
| | | this.http |
| | | .post("api/RgvOperation/WriteInReset", {}, "æ°æ®å¤çä¸...") |
| | | .then((x) => { |
| | | if (x.status) { |
| | | this.$Message.success('æå.'); |
| | | this.$parent.refresh(); |
| | | } else { |
| | | return this.$Message.error(x.message); |
| | | } |
| | | }); |
| | | const status = this.isMonitoring ? 'è¿è¡ä¸' : '已忢' |
| | | return `${typeNames[this.currentMonitorType]}çæ§ç¶æ: ${status}` |
| | | }, |
| | | OutReset() { |
| | | var param = { |
| | | DelKeys: [], |
| | | Extra: true |
| | | |
| | | // å®å
¨é¨åæ®µå¼æ ¼å¼å |
| | | getSafetyDoorFormattedValue(fieldKey, value) { |
| | | const formatter = this.safetyDoorValueFormatters[fieldKey] |
| | | return formatter ? formatter(value) : value |
| | | }, |
| | | |
| | | // å®å
¨é¨åæ®µå¼æ ·å¼ |
| | | getSafetyDoorValueClass(fieldKey, value) { |
| | | if (fieldKey === 'å®å
¨é¨æ¥åç¶æ' && value === 0) { |
| | | return 'fault-text' |
| | | } |
| | | this.http |
| | | .post("api/RgvOperation/WriteOutReset", {}, "æ°æ®å¤çä¸...") |
| | | .then((x) => { |
| | | if (x.status) { |
| | | this.$Message.success('æå.'); |
| | | this.$parent.refresh(); |
| | | } else { |
| | | return this.$Message.error(x.message); |
| | | if (fieldKey === 'å®å
¨é¨æçµç¶æ' && value === 0) { |
| | | return 'fault-text' |
| | | } |
| | | if (fieldKey === 'æ¥è¦ä¿¡æ¯' && value === 1) { |
| | | return 'fault-text' |
| | | } |
| | | return '' |
| | | }, |
| | | |
| | | // å®å
¨é¨æç¤ºç¯æ ·å¼ |
| | | getSafetyLightClass(value) { |
| | | const classMap = { |
| | | 0: 'light-off', |
| | | 1: 'light-red', |
| | | 2: 'light-green', |
| | | 3: 'light-yellow-blink', |
| | | 4: 'light-yellow' |
| | | } |
| | | return classMap[value] || 'light-off' |
| | | }, |
| | | |
| | | // æ¥åç¶ææ ·å¼ |
| | | getEmergencyStopClass(value) { |
| | | return value === 0 ? 'emergency-stop-active' : 'emergency-stop-normal' |
| | | }, |
| | | |
| | | // ä¸é®æä½å¤ç |
| | | async handleOneClickOperation(operationType) { |
| | | // æ ¹æ®å½åçæ§ç±»åè®¾ç½®åæ° |
| | | const monitorType = this.currentMonitorType === 'inbound' ? 'Inbound' : 'Outbound' |
| | | |
| | | this.oneClickLoading[operationType] = true |
| | | |
| | | try { |
| | | const operationNames = { |
| | | init: 'ä¸é®åå§å', |
| | | reset: 'ä¸é®å¤ä½', |
| | | start: 'ä¸é®å¯å¨', |
| | | stop: 'ä¸é®æå' |
| | | } |
| | | |
| | | const response = await this.http.post('api/Rgvoperainform/OneClickOperation', { |
| | | operationType: operationType, |
| | | monitorType: monitorType |
| | | }, `${operationNames[operationType]}ä¸...`) |
| | | |
| | | if (response.status) { |
| | | this.$message.success(`${operationNames[operationType]} ${monitorType}ç«¯è®¾å¤æå`) |
| | | this.refreshData() |
| | | } else { |
| | | this.$message.error(response.message || `${operationNames[operationType]}失败`) |
| | | } |
| | | } catch (error) { |
| | | this.$message.error(`${operationNames[operationType]}请æ±å¤±è´¥: ` + error.message) |
| | | } finally { |
| | | this.oneClickLoading[operationType] = false |
| | | } |
| | | }, |
| | | |
| | | // è·ååå§åæé®æ¾ç¤ºææ¬ |
| | | getInitializationButtonText(deviceData) { |
| | | if (!deviceData) return 'åå§å' |
| | | return deviceData['åå§åæªå®ææ å¿ä½'] === 0 ? 'å·²åå§å' : 'åå§å' |
| | | }, |
| | | |
| | | // åæ¢çæ§ç±»å |
| | | switchMonitorType(type) { |
| | | if (this.currentMonitorType !== type) { |
| | | // 忢å½åçæ§ |
| | | if (this.isMonitoring) { |
| | | this.stopMonitoring() |
| | | } |
| | | this.currentMonitorType = type |
| | | // 妿ä¹åæ¯çæ§ç¶æï¼èªå¨å¯å¨æ°ç±»åççæ§ |
| | | if (this.isMonitoring) { |
| | | this.startMonitoring() |
| | | } |
| | | } |
| | | }, |
| | | |
| | | // è·åä¿¡å·æç¤ºç¯ç±»å |
| | | getSignalClass(value) { |
| | | return value === 1 ? 'signal-active' : 'signal-inactive' |
| | | }, |
| | | |
| | | // çæ§æ§å¶æ¹æ³ |
| | | async toggleMonitoring() { |
| | | if (this.isMonitoring) { |
| | | this.stopMonitoring() |
| | | } else { |
| | | await this.startMonitoring() |
| | | } |
| | | }, |
| | | |
| | | async startMonitoring() { |
| | | try { |
| | | const param = { |
| | | off: 1, |
| | | monitorType: this.currentMonitorType |
| | | } |
| | | |
| | | const response = await this.http.post('api/Rgvoperainform/GetDeviceStatusDto', param) |
| | | |
| | | if (response.status) { |
| | | this.isMonitoring = true |
| | | // æ ¹æ®çæ§ç±»åæ´æ°å¯¹åºçè®¾å¤æ°æ® |
| | | switch (this.currentMonitorType) { |
| | | case 'inbound': |
| | | this.inboundDeviceData = response.data |
| | | break |
| | | case 'outbound': |
| | | this.outboundDeviceData = response.data |
| | | break |
| | | case 'safetydoor': |
| | | this.safetyDoorDeviceData = response.data |
| | | break |
| | | } |
| | | }); |
| | | this.startPolling() |
| | | this.$message.success(`${this.getMonitorStatusTitle()}å·²å¯å¨`) |
| | | } else { |
| | | this.$message.error(response.message || `å¯å¨${this.currentMonitorType}çæ§å¤±è´¥`) |
| | | } |
| | | } catch (error) { |
| | | this.$message.error('请æ±å¤±è´¥: ' + error.message) |
| | | } |
| | | }, |
| | | |
| | | stopMonitoring() { |
| | | this.isMonitoring = false |
| | | if (this.pollingTimer) { |
| | | clearTimeout(this.pollingTimer) |
| | | this.pollingTimer = null |
| | | } |
| | | |
| | | this.http.post('api/Rgvoperainform/GetDeviceStatusDto', { |
| | | off: 0, |
| | | monitorType: this.currentMonitorType |
| | | }) |
| | | |
| | | this.$message.info(`${this.getMonitorStatusTitle()}已忢`) |
| | | }, |
| | | |
| | | startPolling() { |
| | | this.pollingTimer = setTimeout(() => { |
| | | if (this.isMonitoring) { |
| | | this.refreshData() |
| | | this.startPolling() |
| | | } |
| | | }, 2000) |
| | | }, |
| | | |
| | | async refreshData() { |
| | | if (!this.isMonitoring) return |
| | | |
| | | try { |
| | | const response = await this.http.post('api/Rgvoperainform/GetDeviceStatusDto', { |
| | | off: 1, |
| | | monitorType: this.currentMonitorType |
| | | }) |
| | | if (response.status) { |
| | | // æ ¹æ®çæ§ç±»åæ´æ°å¯¹åºçè®¾å¤æ°æ® |
| | | switch (this.currentMonitorType) { |
| | | case 'inbound': |
| | | this.inboundDeviceData = response.data |
| | | break |
| | | case 'outbound': |
| | | this.outboundDeviceData = response.data |
| | | break |
| | | case 'safetydoor': |
| | | this.safetyDoorDeviceData = response.data |
| | | break |
| | | } |
| | | } |
| | | } catch (error) { |
| | | console.error('å·æ°æ°æ®å¤±è´¥:', error) |
| | | } |
| | | }, |
| | | |
| | | // å
¶ä»åææ¹æ³ä¿æä¸å |
| | | getStatusClass(device) { |
| | | if (!device || Object.keys(device).length === 0) return 'offline' |
| | | |
| | | // å®å
¨é¨ç¶æå¤æ |
| | | if (this.currentMonitorType === 'safetydoor') { |
| | | if (device['å®å
¨é¨æ¥åç¶æ'] === 0) return 'fault' |
| | | if (device['å®å
¨é¨æçµç¶æ'] === 0) return 'offline' |
| | | if (device['æ¥è¦ä¿¡æ¯'] === 1) return 'fault' |
| | | return 'normal' |
| | | } |
| | | |
| | | // RGV设å¤ç¶æå¤æ |
| | | if (device['æ
é代ç '] !== 0) return 'fault' |
| | | if (device['ä»»å¡ç¶æ'] === 1) return 'running' |
| | | if (device['工使¨¡å¼'] === 0) return 'manual' |
| | | return 'normal' |
| | | }, |
| | | |
| | | getDeviceDisplayName(deviceKey) { |
| | | return this.deviceDisplayNames[deviceKey] || deviceKey.toUpperCase() |
| | | }, |
| | | |
| | | getFieldDisplayName(fieldKey) { |
| | | return this.fieldDisplayNames[fieldKey] || fieldKey |
| | | }, |
| | | |
| | | getFormattedValue(fieldKey, value, deviceKey) { |
| | | const formatter = this.valueFormatters[fieldKey] |
| | | return formatter ? formatter(value, deviceKey) : value |
| | | }, |
| | | |
| | | getValueClass(fieldKey, value, deviceKey) { |
| | | if (fieldKey === 'æ
é代ç ' && value !== 0) { |
| | | return 'fault-text' |
| | | } |
| | | return '' |
| | | }, |
| | | |
| | | // è·å设å¤ç±»å |
| | | getDeviceType(deviceKey) { |
| | | if (this.deviceTypes.motherCars.includes(deviceKey) || |
| | | this.deviceTypes.outboundMotherCars.includes(deviceKey)) { |
| | | return 'mother' |
| | | } else if (this.deviceTypes.childCars.includes(deviceKey) || |
| | | this.deviceTypes.outboundChildCars.includes(deviceKey)) { |
| | | return 'child' |
| | | } else if (this.deviceTypes.materialCars.includes(deviceKey) || |
| | | this.deviceTypes.outboundMaterialCars.includes(deviceKey)) { |
| | | return 'material' |
| | | } else if (this.deviceTypes.safetyDoors.includes(deviceKey)) { |
| | | return 'safetydoor' |
| | | } |
| | | return 'unknown' |
| | | }, |
| | | |
| | | // è·å设å¤å¯ç¨çç®æ å°å |
| | | getDeviceAddresses(deviceKey) { |
| | | return this.deviceAddresses[deviceKey] || [] |
| | | }, |
| | | |
| | | // è·åæ¥è¦ææ¬ |
| | | getAlarmText(alarmCode, deviceKey) { |
| | | if (alarmCode === 0) return 'æ æ¥è¦' |
| | | |
| | | const deviceType = this.getDeviceType(deviceKey) |
| | | let alarmMap = {} |
| | | |
| | | switch (deviceType) { |
| | | case 'mother': |
| | | alarmMap = this.motherCarAlarmCodes |
| | | break |
| | | case 'child': |
| | | alarmMap = this.childCarAlarmCodes |
| | | break |
| | | case 'material': |
| | | alarmMap = this.materialCarAlarmCodes |
| | | break |
| | | default: |
| | | alarmMap = this.motherCarAlarmCodes |
| | | } |
| | | |
| | | return alarmMap[alarmCode] || `æªè¿æ¥(${alarmCode})` |
| | | }, |
| | | |
| | | // è·åå½åæ¨¡å¼æ¾ç¤ºææ¬ |
| | | getCurrentModeText(deviceData) { |
| | | if (!deviceData || !deviceData['工使¨¡å¼']) return 'ç¹å»åæ¢èªå¨' |
| | | return deviceData['工使¨¡å¼'] === 1 ? 'ç¹å»åæ¢æå¨' : 'ç¹å»åæ¢èªå¨' |
| | | }, |
| | | |
| | | // è·åæ¨¡å¼æé®ç±»åï¼é¢è²ï¼ |
| | | getModeButtonType(deviceData) { |
| | | if (!deviceData || !deviceData['工使¨¡å¼']) return 'success' |
| | | return deviceData['工使¨¡å¼'] === 1 ? 'warning' : 'success' |
| | | }, |
| | | |
| | | // 夿æ¯å¦ä¸ºæå¨æ¨¡å¼ |
| | | isManualMode(deviceData) { |
| | | return deviceData && deviceData['工使¨¡å¼'] === 0 |
| | | }, |
| | | |
| | | // è·åé·è¾¾æé®ææ¬ |
| | | getRadarButtonText(deviceData) { |
| | | if (!deviceData) return 'å¼å¯é·è¾¾' |
| | | return deviceData['é·è¾¾ç¶æ'] === 1 ? 'å
³éé·è¾¾' : 'å¼å¯é·è¾¾' |
| | | }, |
| | | |
| | | // è·åé·è¾¾æé®ç±»å |
| | | getRadarButtonType(deviceData) { |
| | | if (!deviceData) return 'info' |
| | | return deviceData['é·è¾¾ç¶æ'] === 1 ? 'warning' : 'info' |
| | | }, |
| | | |
| | | // 设置å è½½ç¶æ |
| | | setLoadingState(deviceKey, operationType, loading) { |
| | | if (!this.loadingStates[deviceKey]) { |
| | | this.loadingStates[deviceKey] = {} |
| | | } |
| | | this.loadingStates[deviceKey][operationType] = loading |
| | | this.loadingStates = { ...this.loadingStates } |
| | | }, |
| | | |
| | | // æå¨/èªå¨æ¨¡å¼åæ¢ |
| | | async handleModeToggle(deviceKey) { |
| | | this.setLoadingState(deviceKey, 'modeToggle', true) |
| | | |
| | | try { |
| | | const deviceData = this.currentDeviceData[deviceKey] |
| | | const currentMode = deviceData?.['工使¨¡å¼'] || 0 |
| | | |
| | | const operationType = currentMode === 0 ? 'zd' : 'sd' |
| | | |
| | | const response = await this.http.post('api/Rgvoperainform/DeviceOperation', { |
| | | DelKeys: [deviceKey, operationType], |
| | | Extra: true |
| | | }, `${this.operationTypes[operationType]}ä¸...`) |
| | | |
| | | if (response.status) { |
| | | this.$message.success(`${this.getDeviceDisplayName(deviceKey)} ${this.operationTypes[operationType]}æå`) |
| | | this.refreshData() |
| | | } else { |
| | | this.$message.error(response.message || `${this.operationTypes[operationType]}失败`) |
| | | } |
| | | } catch (error) { |
| | | this.$message.error(`模å¼åæ¢è¯·æ±å¤±è´¥: ` + error.message) |
| | | } finally { |
| | | this.setLoadingState(deviceKey, 'modeToggle', false) |
| | | } |
| | | }, |
| | | |
| | | // é·è¾¾å¼å
³åæ¢ |
| | | async handleRadarToggle(deviceKey) { |
| | | this.setLoadingState(deviceKey, 'radarToggle', true) |
| | | |
| | | try { |
| | | const deviceData = this.currentDeviceData[deviceKey] |
| | | const currentRadarState = deviceData?.['é·è¾¾ç¶æ'] || 0 |
| | | |
| | | const operationType = currentRadarState === 0 ? 'kld' : 'gld' |
| | | |
| | | const response = await this.http.post('api/Rgvoperainform/DeviceOperation', { |
| | | DelKeys: [deviceKey, operationType], |
| | | Extra: true |
| | | }, `${this.operationTypes[operationType]}ä¸...`) |
| | | |
| | | if (response.status) { |
| | | this.$message.success(`${this.getDeviceDisplayName(deviceKey)} ${this.operationTypes[operationType]}æå`) |
| | | this.refreshData() |
| | | } else { |
| | | this.$message.error(response.message || `${this.operationTypes[operationType]}失败`) |
| | | } |
| | | } catch (error) { |
| | | this.$message.error(`é·è¾¾æä½è¯·æ±å¤±è´¥: ` + error.message) |
| | | } finally { |
| | | this.setLoadingState(deviceKey, 'radarToggle', false) |
| | | } |
| | | }, |
| | | |
| | | // å°åæä½ |
| | | async handleAddressOperation(deviceKey) { |
| | | const address = this.addressValues[deviceKey] |
| | | if (!address) { |
| | | this.$message.warning('è¯·éæ©ç®æ å°å') |
| | | return |
| | | } |
| | | |
| | | this.setLoadingState(deviceKey, 'dz', true) |
| | | |
| | | try { |
| | | const response = await this.http.post('api/Rgvoperainform/DeviceOperation', { |
| | | DelKeys: [deviceKey, 'dz', address], |
| | | Extra: true |
| | | }, 'åå¾å°åä¸...') |
| | | |
| | | if (response.status) { |
| | | this.$message.success(`${this.getDeviceDisplayName(deviceKey)} åå¾å°å ${address} æå`) |
| | | this.refreshData() |
| | | } else { |
| | | this.$message.error(response.message || 'åå¾å°å失败') |
| | | } |
| | | } catch (error) { |
| | | this.$message.error('åå¾å°å请æ±å¤±è´¥: ' + error.message) |
| | | } finally { |
| | | this.setLoadingState(deviceKey, 'dz', false) |
| | | } |
| | | }, |
| | | |
| | | // ç»ä¸æä½å¤ç彿° |
| | | async handleOperation(deviceKey, operationType) { |
| | | this.setLoadingState(deviceKey, operationType, true) |
| | | |
| | | try { |
| | | const response = await this.http.post('api/Rgvoperainform/DeviceOperation', { |
| | | DelKeys: [deviceKey, operationType], |
| | | Extra: true |
| | | }, `${this.operationTypes[operationType]}ä¸...`) |
| | | |
| | | if (response.status) { |
| | | const operationName = this.operationTypes[operationType] |
| | | this.$message.success(`${this.getDeviceDisplayName(deviceKey)} ${operationName}æä½æå`) |
| | | |
| | | // 妿æ¯åå§åæä½ï¼æ·»å é¢å¤æç¤º |
| | | if (operationType === 'cs') { |
| | | this.$notify({ |
| | | title: 'åå§åæå', |
| | | message: `${this.getDeviceDisplayName(deviceKey)} 设å¤åå§å宿`, |
| | | type: 'success', |
| | | duration: 3000 |
| | | }) |
| | | } |
| | | |
| | | this.refreshData() |
| | | } else { |
| | | this.$message.error(response.message || `${this.operationTypes[operationType]}æä½å¤±è´¥`) |
| | | } |
| | | } catch (error) { |
| | | this.$message.error(`${this.operationTypes[operationType]}请æ±å¤±è´¥: ` + error.message) |
| | | } finally { |
| | | this.setLoadingState(deviceKey, operationType, false) |
| | | } |
| | | } |
| | | }, |
| | | |
| | | }; |
| | | beforeUnmount() { |
| | | this.stopMonitoring() |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .container { |
| | | /* åæçæ ·å¼ä¿æä¸åï¼æ·»å å®å
¨é¨ç¸å
³æ ·å¼ */ |
| | | |
| | | /* å®å
¨é¨æç¤ºç¯æ ·å¼ */ |
| | | .safety-light { |
| | | width: 12px; |
| | | height: 12px; |
| | | border-radius: 50%; |
| | | display: inline-block; |
| | | margin-left: 8px; |
| | | border: 1px solid #ccc; |
| | | } |
| | | |
| | | .safety-light.light-off { |
| | | background-color: #909399; |
| | | } |
| | | |
| | | .safety-light.light-red { |
| | | background-color: #F56C6C; |
| | | box-shadow: 0 0 6px #F56C6C; |
| | | animation: blink 1s infinite; |
| | | } |
| | | |
| | | .safety-light.light-green { |
| | | background-color: #67C23A; |
| | | box-shadow: 0 0 6px #67C23A; |
| | | } |
| | | |
| | | .safety-light.light-yellow { |
| | | background-color: #E6A23C; |
| | | box-shadow: 0 0 6px #E6A23C; |
| | | } |
| | | |
| | | .safety-light.light-yellow-blink { |
| | | background-color: #E6A23C; |
| | | box-shadow: 0 0 6px #E6A23C; |
| | | animation: blink 0.5s infinite; |
| | | } |
| | | |
| | | /* æ¥åç¶ææç¤º */ |
| | | .emergency-stop { |
| | | width: 8px; |
| | | height: 8px; |
| | | border-radius: 50%; |
| | | display: inline-block; |
| | | margin-left: 8px; |
| | | } |
| | | |
| | | .emergency-stop.emergency-stop-normal { |
| | | background-color: #67C23A; |
| | | box-shadow: 0 0 4px #67C23A; |
| | | } |
| | | |
| | | .emergency-stop.emergency-stop-active { |
| | | background-color: #F56C6C; |
| | | box-shadow: 0 0 4px #F56C6C; |
| | | animation: blink 0.8s infinite; |
| | | } |
| | | |
| | | /* çæ§ç±»ååæ¢æ ·å¼ */ |
| | | .monitor-type-switch { |
| | | margin-right: 20px; |
| | | } |
| | | |
| | | .one-click-operations { |
| | | margin-right: 20px; |
| | | } |
| | | |
| | | .control-panel { |
| | | display: flex; |
| | | gap: 10px; |
| | | align-items: center; |
| | | } |
| | | |
| | | /* ä¿¡å·æç¤ºç¯æ ·å¼ */ |
| | | .signal-indicator { |
| | | width: 8px; |
| | | height: 8px; |
| | | border-radius: 50%; |
| | | display: inline-block; |
| | | margin-left: 8px; |
| | | } |
| | | |
| | | .signal-indicator.signal-active { |
| | | background-color: #67C23A; |
| | | box-shadow: 0 0 4px #67C23A; |
| | | } |
| | | |
| | | .signal-indicator.signal-inactive { |
| | | background-color: #DCDFE6; |
| | | border: 1px solid #C0C4CC; |
| | | } |
| | | |
| | | /* ä¿®æ¹valueæ ·å¼ä»¥å®¹çº³æç¤ºç¯ */ |
| | | .value { |
| | | color: #303133; |
| | | font-weight: 500; |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 8px; |
| | | } |
| | | |
| | | /* å
¶ä»åææ ·å¼ä¿æä¸å */ |
| | | .rgv-monitor { |
| | | padding: 20px; |
| | | background-color: #f5f7fa; |
| | | min-height: 100vh; |
| | | } |
| | | |
| | | .monitor-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | width: 20%; |
| | | margin-top: 10px; |
| | | margin-left: 10px; |
| | | align-items: center; |
| | | margin-bottom: 20px; |
| | | padding: 0 10px; |
| | | } |
| | | |
| | | .title { |
| | | font-size: 28px; |
| | | color: orange; |
| | | font-size: 24px; |
| | | font-weight: bold; |
| | | color: #409EFF; |
| | | } |
| | | |
| | | .monitor-status { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .devices-container { |
| | | display: grid; |
| | | grid-template-columns: repeat(auto-fill, minmax(400px, 1fr)); |
| | | gap: 20px; |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .device-card { |
| | | background: white; |
| | | border-radius: 8px; |
| | | box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); |
| | | overflow: hidden; |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | .device-card:hover { |
| | | transform: translateY(-2px); |
| | | box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.15); |
| | | } |
| | | |
| | | .device-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | padding: 15px 20px; |
| | | background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
| | | color: white; |
| | | } |
| | | |
| | | .device-header h3 { |
| | | margin: 0; |
| | | font-size: 16px; |
| | | } |
| | | |
| | | .status-indicator { |
| | | width: 12px; |
| | | height: 12px; |
| | | border-radius: 50%; |
| | | } |
| | | |
| | | .status-indicator.normal { |
| | | background-color: #67C23A; |
| | | box-shadow: 0 0 8px #67C23A; |
| | | } |
| | | |
| | | .status-indicator.running { |
| | | background-color: #409EFF; |
| | | box-shadow: 0 0 8px #409EFF; |
| | | animation: pulse 1.5s infinite; |
| | | } |
| | | |
| | | .status-indicator.fault { |
| | | background-color: #F56C6C; |
| | | box-shadow: 0 0 8px #F56C6C; |
| | | animation: blink 1s infinite; |
| | | } |
| | | |
| | | .status-indicator.manual { |
| | | background-color: #E6A23C; |
| | | box-shadow: 0 0 8px #E6A23C; |
| | | animation: pulse 1.5s infinite; |
| | | } |
| | | |
| | | .status-indicator.offline { |
| | | background-color: #909399; |
| | | } |
| | | |
| | | .device-content { |
| | | padding: 20px; |
| | | } |
| | | |
| | | .data-row { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | padding: 8px 0; |
| | | border-bottom: 1px solid #ebeef5; |
| | | } |
| | | |
| | | .data-row:last-child { |
| | | border-bottom: none; |
| | | } |
| | | |
| | | .label { |
| | | font-weight: 500; |
| | | color: #606266; |
| | | } |
| | | |
| | | .fault-text { |
| | | color: #F56C6C; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | .no-data { |
| | | text-align: center; |
| | | color: #909399; |
| | | padding: 40px 0; |
| | | font-style: italic; |
| | | } |
| | | |
| | | .operation-buttons { |
| | | margin-top: 15px; |
| | | padding-top: 15px; |
| | | border-top: 1px dashed #ebeef5; |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 8px; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .address-operation { |
| | | margin-top: 15px; |
| | | padding-top: 15px; |
| | | border-top: 1px dashed #ebeef5; |
| | | } |
| | | |
| | | .address-title { |
| | | font-weight: 500; |
| | | color: #606266; |
| | | margin-bottom: 10px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .address-input-group { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | gap: 10px; |
| | | } |
| | | |
| | | .operation-panel { |
| | | text-align: center; |
| | | padding: 20px; |
| | | } |
| | | |
| | | @keyframes pulse { |
| | | 0% { opacity: 1; } |
| | | 50% { opacity: 0.5; } |
| | | 100% { opacity: 1; } |
| | | } |
| | | |
| | | @keyframes blink { |
| | | 0%, 50% { opacity: 1; } |
| | | 51%, 100% { opacity: 0.3; } |
| | | } |
| | | |
| | | /* ååºå¼è®¾è®¡ */ |
| | | @media (max-width: 768px) { |
| | | .devices-container { |
| | | grid-template-columns: 1fr; |
| | | } |
| | | |
| | | .monitor-header { |
| | | flex-direction: column; |
| | | gap: 15px; |
| | | align-items: flex-start; |
| | | } |
| | | |
| | | .control-panel { |
| | | flex-direction: column; |
| | | align-items: flex-start; |
| | | width: 100%; |
| | | } |
| | | |
| | | .monitor-type-switch, |
| | | .one-click-operations { |
| | | margin-right: 0; |
| | | margin-bottom: 10px; |
| | | width: 100%; |
| | | } |
| | | |
| | | .monitor-type-switch .el-button-group, |
| | | .one-click-operations .el-button-group { |
| | | width: 100%; |
| | | } |
| | | |
| | | .monitor-type-switch .el-button, |
| | | .one-click-operations .el-button { |
| | | flex: 1; |
| | | } |
| | | |
| | | .operation-buttons { |
| | | flex-direction: column; |
| | | align-items: stretch; |
| | | } |
| | | |
| | | .operation-buttons .el-button { |
| | | width: 100%; |
| | | } |
| | | |
| | | .address-input-group { |
| | | flex-direction: column; |
| | | align-items: stretch; |
| | | } |
| | | |
| | | .address-input-group .el-select, |
| | | .address-input-group .el-button { |
| | | width: 100%; |
| | | } |
| | | } |
| | | </style> |