|
|
|
@ -2,39 +2,39 @@ |
|
|
|
<div class="app-container"> |
|
|
|
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px" @submit.native.prevent="handleQuery"> |
|
|
|
|
|
|
|
<el-form-item label="订单号" prop="orderCode"> |
|
|
|
<el-input v-model="queryParams.orderCode" placeholder="请输入订单号" clearable size="small" @keyup.enter.native="handleQuery" /> |
|
|
|
<el-form-item :label="$t('device.query.orderCode')" prop="orderCode"> |
|
|
|
<el-input v-model="queryParams.orderCode" :placeholder="$t('device.placeholder.orderCode')" clearable size="small" @keyup.enter.native="handleQuery" /> |
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
<el-form-item label="型号" prop="model"> |
|
|
|
<el-input v-model="queryParams.model" placeholder="请输入型号" clearable size="small" @keyup.enter.native="handleQuery" /> |
|
|
|
<el-form-item :label="$t('device.query.model')" prop="model"> |
|
|
|
<el-input v-model="queryParams.model" :placeholder="$t('device.placeholder.model')" clearable size="small" @keyup.enter.native="handleQuery" /> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="序列号" prop="sn"> |
|
|
|
<el-input v-model="queryParams.sn" placeholder="请输入序列号" clearable size="small" @keyup.enter.native="handleQuery" /> |
|
|
|
<el-form-item :label="$t('device.query.sn')" prop="sn"> |
|
|
|
<el-input v-model="queryParams.sn" :placeholder="$t('device.placeholder.sn')" clearable size="small" @keyup.enter.native="handleQuery" /> |
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
<el-form-item label="名称" prop="alias"> |
|
|
|
<el-input v-model="queryParams.alias" placeholder="请输入名称" clearable size="small" @keyup.enter.native="handleQuery" /> |
|
|
|
<el-form-item :label="$t('device.query.alias')" prop="alias"> |
|
|
|
<el-input v-model="queryParams.alias" :placeholder="$t('device.placeholder.alias')" clearable size="small" @keyup.enter.native="handleQuery" /> |
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
<el-form-item label="地址" prop="lastAddress"> |
|
|
|
<el-input v-model="queryParams.lastAddress" placeholder="请输入地址" clearable size="small" @keyup.enter.native="handleQuery" /> |
|
|
|
<el-form-item :label="$t('device.query.lastAddress')" prop="lastAddress"> |
|
|
|
<el-input v-model="queryParams.lastAddress" :placeholder="$t('device.placeholder.lastAddress')" clearable size="small" @keyup.enter.native="handleQuery" /> |
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
<el-form-item label="设备备注" prop="remark"> |
|
|
|
<el-input v-model="queryParams.remark" placeholder="请输入设备备注" clearable size="small" @keyup.enter.native="handleQuery" /> |
|
|
|
<el-form-item :label="$t('device.query.remark')" prop="remark"> |
|
|
|
<el-input v-model="queryParams.remark" :placeholder="$t('device.placeholder.remark')" clearable size="small" @keyup.enter.native="handleQuery" /> |
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
<el-form-item label="是否启用" prop="activationStatus"> |
|
|
|
<el-select v-model="queryParams.activationStatus" placeholder="请选择启用状态" clearable size="small" @keyup.enter.native="handleQuery"> |
|
|
|
<el-option label="否" :value="0" /> |
|
|
|
<el-option label="是" :value="1" /> |
|
|
|
<el-form-item :label="$t('device.query.activationStatus')" prop="activationStatus"> |
|
|
|
<el-select v-model="queryParams.activationStatus" :placeholder="$t('device.placeholder.activationStatus')" clearable size="small" @keyup.enter.native="handleQuery"> |
|
|
|
<el-option :label="$t('device.status.disabled')" :value="0" /> |
|
|
|
<el-option :label="$t('device.status.enabled')" :value="1" /> |
|
|
|
</el-select> |
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
<el-form-item> |
|
|
|
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> |
|
|
|
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> |
|
|
|
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">{{ $t("common.search") }}</el-button> |
|
|
|
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">{{ $t("common.reset") }}</el-button> |
|
|
|
</el-form-item> |
|
|
|
</el-form> |
|
|
|
|
|
|
|
@ -52,19 +52,19 @@ |
|
|
|
</el-col> --> |
|
|
|
<!-- 新增:导入按钮 --> |
|
|
|
<el-col :span="1.5"> |
|
|
|
<el-button type="info" plain icon="el-icon-upload2" size="mini" @click="handleImport" v-hasPermi="['device:device:import']">导入</el-button> |
|
|
|
<el-button type="info" plain icon="el-icon-upload2" size="mini" @click="handleImport" v-hasPermi="['device:device:import']">{{ $t("device.button.import") }}</el-button> |
|
|
|
</el-col> |
|
|
|
<el-col :span="1.5"> |
|
|
|
<el-button type="primary" plain icon="el-icon-s-claim" size="mini" @click="handleClaimDevice" v-hasPermi="['device:device:claim:batch']">认领设备</el-button> |
|
|
|
<el-button type="primary" plain icon="el-icon-s-claim" size="mini" @click="handleClaimDevice" v-hasPermi="['device:device:claim:batch']">{{ $t("device.button.claim") }}</el-button> |
|
|
|
</el-col> |
|
|
|
<el-col :span="1.5"> |
|
|
|
<el-button type="success" plain icon="el-icon-circle-check" size="mini" :disabled="multiple" v-hasPermi="['device:device:activate:batch']" @click="handleBatchActivate">批量启用</el-button> |
|
|
|
<el-button type="success" plain icon="el-icon-circle-check" size="mini" :disabled="multiple" v-hasPermi="['device:device:activate:batch']" @click="handleBatchActivate">{{ $t("device.button.batchEnable") }}</el-button> |
|
|
|
</el-col> |
|
|
|
<el-col :span="1.5"> |
|
|
|
<el-button type="danger" plain icon="el-icon-circle-close" size="mini" :disabled="multiple" @click="handleBatchDisable">批量禁用</el-button> |
|
|
|
<el-button type="danger" plain icon="el-icon-circle-close" size="mini" :disabled="multiple" @click="handleBatchDisable">{{ $t("device.button.batchDisable") }}</el-button> |
|
|
|
</el-col> |
|
|
|
<el-col :span="1.5"> |
|
|
|
<el-button type="info" plain icon="el-icon-user" size="mini" :disabled="multiple" v-hasPermi="['device:device:activate:batch']" @click="handleAssignDevice">分配设备</el-button> |
|
|
|
<el-button type="info" plain icon="el-icon-user" size="mini" :disabled="multiple" v-hasPermi="['device:device:activate:batch']" @click="handleAssignDevice">{{ $t("device.button.assign") }}</el-button> |
|
|
|
</el-col> |
|
|
|
|
|
|
|
|
|
|
|
@ -93,7 +93,7 @@ |
|
|
|
> |
|
|
|
</el-col> --> |
|
|
|
<el-col :span="1.5"> |
|
|
|
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" v-hasPermi="['device:device:export']">导出</el-button> |
|
|
|
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" v-hasPermi="['device:device:export']">{{ $t("device.button.export") }}</el-button> |
|
|
|
</el-col> |
|
|
|
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> |
|
|
|
</el-row> |
|
|
|
@ -106,21 +106,21 @@ |
|
|
|
@sort-change="handleTableSortChange" |
|
|
|
> |
|
|
|
<el-table-column type="selection" width="55" align="center" /> |
|
|
|
<el-table-column label="订单号" align="center" prop="orderCode" /> |
|
|
|
<el-table-column :label="$t('device.table.orderCode')" align="center" prop="orderCode" /> |
|
|
|
|
|
|
|
<el-table-column label="设备状态" align="center" prop="activationStatus"> |
|
|
|
<el-table-column :label="$t('device.table.deviceStatus')" align="center" prop="activationStatus"> |
|
|
|
<template slot-scope="scope"> |
|
|
|
<el-tag :type="getActivationTagType(scope.row.activationStatus)" size="mini"> |
|
|
|
{{ getActivationStatusLabel(scope.row.activationStatus) }} |
|
|
|
</el-tag> |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
<el-table-column label="型号" align="center" prop="model" /> |
|
|
|
<el-table-column label="序列号" align="center" prop="sn" /> |
|
|
|
<el-table-column label="名称" align="center" prop="alias" /> |
|
|
|
<el-table-column label="地址" align="center" prop="lastAddress" min-width="220" /> |
|
|
|
<el-table-column :label="$t('device.table.model')" align="center" prop="model" /> |
|
|
|
<el-table-column :label="$t('device.table.sn')" align="center" prop="sn" /> |
|
|
|
<el-table-column :label="$t('device.table.alias')" align="center" prop="alias" /> |
|
|
|
<el-table-column :label="$t('device.table.lastAddress')" align="center" prop="lastAddress" min-width="220" /> |
|
|
|
<el-table-column |
|
|
|
label="更新时间" |
|
|
|
:label="$t('device.table.updateTime')" |
|
|
|
align="center" |
|
|
|
prop="lastLocationTime" |
|
|
|
min-width="115" |
|
|
|
@ -131,7 +131,7 @@ |
|
|
|
<span>{{ parseTime(scope.row.lastLocationTime, "{y}-{m}-{d} {h}:{i}:{s}") }}</span> |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
<el-table-column label="经纬度" align="center" > |
|
|
|
<el-table-column :label="$t('device.table.coordinates')" align="center" > |
|
|
|
<template slot-scope="scope"> |
|
|
|
<span>{{ formatCoordinates(scope.row.lastLat, scope.row.lastLng) }}</span> |
|
|
|
</template> |
|
|
|
@ -139,15 +139,15 @@ |
|
|
|
<el-table-column label="MAC " align="center" prop="mac" /> |
|
|
|
<!-- <el-table-column label="电量" align="center" prop="battery" /> --> |
|
|
|
|
|
|
|
<el-table-column label="备注" align="center" prop="remark" /> |
|
|
|
<el-table-column :label="$t('device.table.remark')" align="center" prop="remark" /> |
|
|
|
|
|
|
|
<!-- <el-table-column label="绑定企业id" align="center" prop="bindBusinessId" /> --> |
|
|
|
|
|
|
|
<el-table-column label="操作" align="center" width="220" class-name="small-padding fixed-width"> |
|
|
|
<el-table-column :label="$t('device.table.actions')" align="center" width="220" class-name="small-padding fixed-width"> |
|
|
|
<template slot-scope="scope"> |
|
|
|
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleEditInfo(scope.row)" v-hasPermi="['device:device:list']">修改</el-button> |
|
|
|
<el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)">详情</el-button> |
|
|
|
<el-button size="mini" type="text" icon="el-icon-location-outline" @click="handleTrajectory(scope.row)">轨迹</el-button> |
|
|
|
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleEditInfo(scope.row)" v-hasPermi="['device:device:list']">{{ $t("common.edit") }}</el-button> |
|
|
|
<el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)">{{ $t("device.button.detail") }}</el-button> |
|
|
|
<el-button size="mini" type="text" icon="el-icon-location-outline" @click="handleTrajectory(scope.row)">{{ $t("device.button.trajectory") }}</el-button> |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
<!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
|
|
|
@ -175,206 +175,206 @@ |
|
|
|
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" /> |
|
|
|
|
|
|
|
<!-- Excel导入弹窗:仅允许上传1个文件 + 手动输入订单号/备注 --> |
|
|
|
<el-dialog title="设备Excel导入" :visible.sync="importOpen" width="550px" append-to-body> |
|
|
|
<el-dialog :title="$t('device.dialog.import.title')" :visible.sync="importOpen" width="550px" append-to-body> |
|
|
|
<el-form ref="importForm" :model="importForm" :rules="importRules" label-width="90px" @submit.native.prevent> |
|
|
|
|
|
|
|
<!-- Excel文件上传:仅1个文件(修复核心) --> |
|
|
|
<el-form-item label="Excel文件"> |
|
|
|
<el-form-item :label="$t('device.dialog.import.fileLabel')"> |
|
|
|
<el-upload ref="upload" :limit="1" :on-exceed="handleExceed" accept=".xlsx, .xls" :auto-upload="false" :on-change="handleFileChange" :file-list="fileList" drag> |
|
|
|
<i class="el-icon-upload"></i> |
|
|
|
<div class="el-upload__text">将Excel文件拖到此处,或<em>点击上传</em></div> |
|
|
|
<div class="el-upload__text">{{ $t("device.dialog.import.dragText") }}<em>{{ $t("device.dialog.import.clickUpload") }}</em></div> |
|
|
|
<div class="el-upload__tip" slot="tip"> |
|
|
|
<el-icon size="12"> |
|
|
|
<warning /> |
|
|
|
</el-icon> |
|
|
|
<span>仅支持 .xlsx / .xls 格式文件,且只能上传1个文件</span> |
|
|
|
<span>{{ $t("device.dialog.import.tip") }}</span> |
|
|
|
</div> |
|
|
|
</el-upload> |
|
|
|
</el-form-item> |
|
|
|
</el-form> |
|
|
|
|
|
|
|
<div slot="footer" class="dialog-footer"> |
|
|
|
<el-button type="primary" @click="submitImport" :loading="importing">确 定</el-button> |
|
|
|
<el-button @click="cancelImport">取 消</el-button> |
|
|
|
<el-button type="primary" @click="submitImport" :loading="importing">{{ $t("common.confirm") }}</el-button> |
|
|
|
<el-button @click="cancelImport">{{ $t("common.cancel") }}</el-button> |
|
|
|
</div> |
|
|
|
</el-dialog> |
|
|
|
|
|
|
|
<el-dialog title="导入结果" :visible.sync="resultOpen" width="700px" append-to-body> |
|
|
|
<el-dialog :title="$t('device.dialog.importResult.title')" :visible.sync="resultOpen" width="700px" append-to-body> |
|
|
|
<div v-if="latestImportResult"> |
|
|
|
<el-alert :title="getImportStatusMessage(latestImportResult)" :type="getImportStatusType(latestImportResult.status)" :closable="false" show-icon /> |
|
|
|
|
|
|
|
<el-descriptions :column="2" border class="import-result-summary"> |
|
|
|
<el-descriptions-item label="状态"> |
|
|
|
<el-descriptions-item :label="$t('device.dialog.importResult.status')"> |
|
|
|
{{ getImportStatusLabel(latestImportResult.status) }} |
|
|
|
</el-descriptions-item> |
|
|
|
<el-descriptions-item label="总数"> |
|
|
|
<el-descriptions-item :label="$t('device.dialog.importResult.total')"> |
|
|
|
{{ latestImportResult.total }} |
|
|
|
</el-descriptions-item> |
|
|
|
<el-descriptions-item label="成功数"> |
|
|
|
<el-descriptions-item :label="$t('device.dialog.importResult.successCount')"> |
|
|
|
{{ latestImportResult.successCount }} |
|
|
|
</el-descriptions-item> |
|
|
|
<el-descriptions-item label="失败数"> |
|
|
|
<el-descriptions-item :label="$t('device.dialog.importResult.failCount')"> |
|
|
|
{{ latestImportResult.failCount }} |
|
|
|
</el-descriptions-item> |
|
|
|
<el-descriptions-item label="开始时间"> |
|
|
|
<el-descriptions-item :label="$t('device.dialog.importResult.startTime')"> |
|
|
|
{{ parseTime(latestImportResult.startTime) }} |
|
|
|
</el-descriptions-item> |
|
|
|
<el-descriptions-item label="结束时间"> |
|
|
|
<el-descriptions-item :label="$t('device.dialog.importResult.finishTime')"> |
|
|
|
{{ parseTime(latestImportResult.finishTime) }} |
|
|
|
</el-descriptions-item> |
|
|
|
</el-descriptions> |
|
|
|
|
|
|
|
<div v-if="latestImportResult.requestErrors && latestImportResult.requestErrors.length" class="import-result-block"> |
|
|
|
<div class="import-result-title">请求错误</div> |
|
|
|
<div class="import-result-title">{{ $t("device.dialog.importResult.requestErrors") }}</div> |
|
|
|
<div v-for="(item, index) in latestImportResult.requestErrors" :key="'request-error-' + index" class="import-result-text"> |
|
|
|
{{ index + 1 }}. {{ item }} |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<div v-if="latestImportResult.errors && latestImportResult.errors.length" class="import-result-block"> |
|
|
|
<div class="import-result-title">失败明细</div> |
|
|
|
<div class="import-result-title">{{ $t("device.dialog.importResult.failDetails") }}</div> |
|
|
|
<el-table :data="latestImportResult.errors" size="mini" border max-height="320"> |
|
|
|
<el-table-column label="行号" prop="rowIndex" width="100" align="center" /> |
|
|
|
<el-table-column label="错误信息" prop="message" min-width="460" /> |
|
|
|
<el-table-column :label="$t('device.dialog.importResult.rowIndex')" prop="rowIndex" width="100" align="center" /> |
|
|
|
<el-table-column :label="$t('device.dialog.importResult.errorMessage')" prop="message" min-width="460" /> |
|
|
|
</el-table> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<div slot="footer" class="dialog-footer"> |
|
|
|
<el-button type="primary" @click="resultOpen = false">关 闭</el-button> |
|
|
|
<el-button type="primary" @click="resultOpen = false">{{ $t("device.button.close") }}</el-button> |
|
|
|
</div> |
|
|
|
</el-dialog> |
|
|
|
<!-- 核心:必须挂载企业选择组件,且绑定正确的开关 --> |
|
|
|
<BusinessSelect :visible.sync="businessSelectVisible" @select="handleBusinessSelect" /> |
|
|
|
<BusinessSelect :visible.sync="searchBusinessSelectVisible" @select="handleSearchBusinessSelect" /> |
|
|
|
<DeviceClaimDialog :visible.sync="claimDeviceOpen" @success="handleClaimSuccess" /> |
|
|
|
<el-dialog title="分配设备" :visible.sync="assignDeviceOpen" width="1200px" append-to-body @close="handleAssignDialogClose"> |
|
|
|
<el-dialog :title="$t('device.dialog.assign.title')" :visible.sync="assignDeviceOpen" width="1200px" append-to-body @close="handleAssignDialogClose"> |
|
|
|
<UserSelector ref="userSelector" selection-mode @select="handleAssignUserSelect" /> |
|
|
|
<div slot="footer" class="dialog-footer"> |
|
|
|
<span class="assign-selected-user"> |
|
|
|
{{ `已选择员工:${selectedAssignUsers.length} 人` }} |
|
|
|
{{ $t("device.dialog.assign.selectedUsers", { count: selectedAssignUsers.length }) }} |
|
|
|
</span> |
|
|
|
<el-button @click="handleAssignDialogClose">取 消</el-button> |
|
|
|
<el-button @click="handleAssignDialogClose">{{ $t("common.cancel") }}</el-button> |
|
|
|
<el-button type="primary" :loading="assignLoading" @click="handleAssignSubmit"> |
|
|
|
确 定 |
|
|
|
{{ $t("common.confirm") }} |
|
|
|
</el-button> |
|
|
|
</div> |
|
|
|
</el-dialog> |
|
|
|
<el-dialog title="设备详情" :visible.sync="detailOpen" width="720px" append-to-body> |
|
|
|
<el-dialog :title="$t('device.dialog.detail.title')" :visible.sync="detailOpen" width="720px" append-to-body> |
|
|
|
<div v-loading="detailLoading"> |
|
|
|
<el-descriptions v-if="detailForm" :column="2" border> |
|
|
|
<el-descriptions-item label="ID">{{ detailForm.id || "-" }}</el-descriptions-item> |
|
|
|
<el-descriptions-item label="序列号">{{ detailForm.sn || "-" }}</el-descriptions-item> |
|
|
|
<el-descriptions-item label="MAC 地址">{{ detailForm.mac || "-" }}</el-descriptions-item> |
|
|
|
<el-descriptions-item label="型号">{{ detailForm.model || "-" }}</el-descriptions-item> |
|
|
|
<el-descriptions-item label="企业"> |
|
|
|
<el-descriptions-item :label="$t('device.table.sn')">{{ detailForm.sn || "-" }}</el-descriptions-item> |
|
|
|
<el-descriptions-item :label="$t('device.dialog.detail.macAddress')">{{ detailForm.mac || "-" }}</el-descriptions-item> |
|
|
|
<el-descriptions-item :label="$t('device.table.model')">{{ detailForm.model || "-" }}</el-descriptions-item> |
|
|
|
<el-descriptions-item :label="$t('device.dialog.detail.business')"> |
|
|
|
{{ detailForm.businessName || detailForm.merchantName || "-" }} |
|
|
|
</el-descriptions-item> |
|
|
|
|
|
|
|
<el-descriptions-item label="最后地址名称"> |
|
|
|
<el-descriptions-item :label="$t('device.dialog.detail.lastAddressName')"> |
|
|
|
{{ detailForm.lastAddress || "-" }} |
|
|
|
</el-descriptions-item> |
|
|
|
<el-descriptions-item label="分配员工"> |
|
|
|
<el-descriptions-item :label="$t('device.dialog.detail.assignedUsers')"> |
|
|
|
{{ formatAssignedUsers(detailForm.assignedUsers) }} |
|
|
|
</el-descriptions-item> |
|
|
|
<el-descriptions-item label="最后位置更新时间"> |
|
|
|
<el-descriptions-item :label="$t('device.dialog.detail.locateUpdateTime')"> |
|
|
|
{{ detailForm.locateUpdateTime ? parseTime(detailForm.locateUpdateTime, "{y}-{m}-{d} {h}:{i}:{s}") : "-" }} |
|
|
|
</el-descriptions-item> |
|
|
|
<el-descriptions-item label="最后经纬度"> |
|
|
|
<el-descriptions-item :label="$t('device.dialog.detail.lastCoordinates')"> |
|
|
|
{{ formatCoordinates(detailForm.lastLat, detailForm.lastLng) }} |
|
|
|
</el-descriptions-item> |
|
|
|
<el-descriptions-item label="电量">{{ detailForm.battery || "-" }}</el-descriptions-item> |
|
|
|
<el-descriptions-item label="最后上报时间"> |
|
|
|
<el-descriptions-item :label="$t('device.dialog.detail.battery')">{{ detailForm.battery || "-" }}</el-descriptions-item> |
|
|
|
<el-descriptions-item :label="$t('device.dialog.detail.lastReportedTime')"> |
|
|
|
{{ detailForm.lastReportedTime ? parseTime(detailForm.lastReportedTime, "{y}-{m}-{d} {h}:{i}:{s}") : "-" }} |
|
|
|
</el-descriptions-item> |
|
|
|
<el-descriptions-item label="最后位置时间"> |
|
|
|
<el-descriptions-item :label="$t('device.dialog.detail.lastLocationTime')"> |
|
|
|
{{ detailForm.lastLocationTime ? parseTime(detailForm.lastLocationTime, "{y}-{m}-{d} {h}:{i}:{s}") : "-" }} |
|
|
|
</el-descriptions-item> |
|
|
|
</el-descriptions> |
|
|
|
</div> |
|
|
|
<div slot="footer" class="dialog-footer"> |
|
|
|
<el-button type="primary" @click="detailOpen = false">关 闭</el-button> |
|
|
|
<el-button type="primary" @click="detailOpen = false">{{ $t("device.button.close") }}</el-button> |
|
|
|
</div> |
|
|
|
</el-dialog> |
|
|
|
<el-dialog title="修改设备信息" :visible.sync="editInfoOpen" width="520px" append-to-body @close="cancelEditInfo"> |
|
|
|
<el-dialog :title="$t('device.dialog.editInfo.title')" :visible.sync="editInfoOpen" width="520px" append-to-body @close="cancelEditInfo"> |
|
|
|
<el-form ref="editInfoForm" :model="editInfoForm" :rules="editInfoRules" label-width="100px"> |
|
|
|
<el-form-item label="序列号"> |
|
|
|
<el-form-item :label="$t('device.table.sn')"> |
|
|
|
<el-input :value="editInfoForm.sn || '-'" disabled /> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="名称" prop="alias"> |
|
|
|
<el-input v-model="editInfoForm.alias" placeholder="请输入名称" clearable maxlength="64" show-word-limit /> |
|
|
|
<el-form-item :label="$t('device.table.alias')" prop="alias"> |
|
|
|
<el-input v-model="editInfoForm.alias" :placeholder="$t('device.placeholder.alias')" clearable maxlength="64" show-word-limit /> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="设备备注" prop="remark"> |
|
|
|
<el-input v-model="editInfoForm.remark" type="textarea" :rows="4" placeholder="请输入设备备注" maxlength="255" show-word-limit /> |
|
|
|
<el-form-item :label="$t('device.query.remark')" prop="remark"> |
|
|
|
<el-input v-model="editInfoForm.remark" type="textarea" :rows="4" :placeholder="$t('device.placeholder.remark')" maxlength="255" show-word-limit /> |
|
|
|
</el-form-item> |
|
|
|
</el-form> |
|
|
|
<div slot="footer" class="dialog-footer"> |
|
|
|
<el-button @click="cancelEditInfo">取 消</el-button> |
|
|
|
<el-button type="primary" :loading="editInfoSubmitting" @click="submitEditInfo">确 定</el-button> |
|
|
|
<el-button @click="cancelEditInfo">{{ $t("common.cancel") }}</el-button> |
|
|
|
<el-button type="primary" :loading="editInfoSubmitting" @click="submitEditInfo">{{ $t("common.confirm") }}</el-button> |
|
|
|
</div> |
|
|
|
</el-dialog> |
|
|
|
<DeviceTrajectoryDialog :visible.sync="trajectoryOpen" :device="trajectoryDevice" /> |
|
|
|
<!-- 添加或修改系统设备主对话框 --> |
|
|
|
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> |
|
|
|
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> |
|
|
|
<el-form-item label="序列号" prop="sn"> |
|
|
|
<el-input v-model="form.sn" placeholder="请输入序列号" /> |
|
|
|
<el-form-item :label="$t('device.table.sn')" prop="sn"> |
|
|
|
<el-input v-model="form.sn" :placeholder="$t('device.placeholder.sn')" /> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="MAC 地址" prop="mac"> |
|
|
|
<el-input v-model="form.mac" placeholder="请输入MAC 地址" /> |
|
|
|
<el-form-item :label="$t('device.dialog.detail.macAddress')" prop="mac"> |
|
|
|
<el-input v-model="form.mac" :placeholder="$t('device.placeholder.macAddress')" /> |
|
|
|
</el-form-item> |
|
|
|
<!-- 新增:订单号表单项 --> |
|
|
|
<el-form-item label="订单号" prop="orderCode"> |
|
|
|
<el-input v-model="form.orderCode" placeholder="请输入订单号" /> |
|
|
|
<el-form-item :label="$t('device.table.orderCode')" prop="orderCode"> |
|
|
|
<el-input v-model="form.orderCode" :placeholder="$t('device.placeholder.orderCode')" /> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="私钥" prop="privateKey"> |
|
|
|
<el-input v-model="form.privateKey" placeholder="请输入私钥" /> |
|
|
|
<el-form-item :label="$t('device.form.privateKey')" prop="privateKey"> |
|
|
|
<el-input v-model="form.privateKey" :placeholder="$t('device.placeholder.privateKey')" /> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="所属批次" prop="batchNo"> |
|
|
|
<el-input v-model="form.batchNo" placeholder="请输入所属批次" /> |
|
|
|
<el-form-item :label="$t('device.form.batchNo')" prop="batchNo"> |
|
|
|
<el-input v-model="form.batchNo" :placeholder="$t('device.placeholder.batchNo')" /> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="设备的唯一哈希 ID" prop="hashid"> |
|
|
|
<el-input v-model="form.hashid" placeholder="请输入设备的唯一哈希 ID" /> |
|
|
|
<el-form-item :label="$t('device.form.hashId')" prop="hashid"> |
|
|
|
<el-input v-model="form.hashid" :placeholder="$t('device.placeholder.hashId')" /> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="型号" prop="model"> |
|
|
|
<el-input v-model="form.model" placeholder="请输入型号" /> |
|
|
|
<el-form-item :label="$t('device.table.model')" prop="model"> |
|
|
|
<el-input v-model="form.model" :placeholder="$t('device.placeholder.model')" /> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="绑定企业id" prop="bindBusinessId"> |
|
|
|
<el-input v-model="form.bindBusinessId" placeholder="请输入绑定企业id" /> |
|
|
|
<el-form-item :label="$t('device.form.bindBusinessId')" prop="bindBusinessId"> |
|
|
|
<el-input v-model="form.bindBusinessId" :placeholder="$t('device.placeholder.bindBusinessId')" /> |
|
|
|
</el-form-item> |
|
|
|
<!-- 新增:备注表单项 --> |
|
|
|
<el-form-item label="备注" prop="remark"> |
|
|
|
<el-input v-model="form.remark" placeholder="请输入备注" type="textarea" :rows="3" /> |
|
|
|
<el-form-item :label="$t('device.table.remark')" prop="remark"> |
|
|
|
<el-input v-model="form.remark" :placeholder="$t('device.placeholder.remarkSimple')" type="textarea" :rows="3" /> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="最后位置更新时间" prop="locateUpdateTime"> |
|
|
|
<el-date-picker clearable size="small" v-model="form.locateUpdateTime" type="date" value-format="yyyy-MM-dd" placeholder="选择最后位置更新时间"> |
|
|
|
<el-form-item :label="$t('device.form.locateUpdateTime')" prop="locateUpdateTime"> |
|
|
|
<el-date-picker clearable size="small" v-model="form.locateUpdateTime" type="date" value-format="yyyy-MM-dd" :placeholder="$t('device.placeholder.locateUpdateTime')"> |
|
|
|
</el-date-picker> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="最后纬度" prop="lastLat"> |
|
|
|
<el-input v-model="form.lastLat" placeholder="请输入最后纬度" /> |
|
|
|
<el-form-item :label="$t('device.form.lastLat')" prop="lastLat"> |
|
|
|
<el-input v-model="form.lastLat" :placeholder="$t('device.placeholder.lastLat')" /> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="最后经度" prop="lastLng"> |
|
|
|
<el-input v-model="form.lastLng" placeholder="请输入最后经度" /> |
|
|
|
<el-form-item :label="$t('device.form.lastLng')" prop="lastLng"> |
|
|
|
<el-input v-model="form.lastLng" :placeholder="$t('device.placeholder.lastLng')" /> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="电量" prop="battery"> |
|
|
|
<el-input v-model="form.battery" placeholder="请输入电量" /> |
|
|
|
<el-form-item :label="$t('device.dialog.detail.battery')" prop="battery"> |
|
|
|
<el-input v-model="form.battery" :placeholder="$t('device.placeholder.battery')" /> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="最后上报时间" prop="lastReportedTime"> |
|
|
|
<el-date-picker clearable size="small" v-model="form.lastReportedTime" type="date" value-format="yyyy-MM-dd" placeholder="选择最后上报时间"> |
|
|
|
<el-form-item :label="$t('device.dialog.detail.lastReportedTime')" prop="lastReportedTime"> |
|
|
|
<el-date-picker clearable size="small" v-model="form.lastReportedTime" type="date" value-format="yyyy-MM-dd" :placeholder="$t('device.placeholder.lastReportedTime')"> |
|
|
|
</el-date-picker> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="最后位置时间" prop="lastLocationTime"> |
|
|
|
<el-date-picker clearable size="small" v-model="form.lastLocationTime" type="date" value-format="yyyy-MM-dd" placeholder="选择最后位置时间"> |
|
|
|
<el-form-item :label="$t('device.dialog.detail.lastLocationTime')" prop="lastLocationTime"> |
|
|
|
<el-date-picker clearable size="small" v-model="form.lastLocationTime" type="date" value-format="yyyy-MM-dd" :placeholder="$t('device.placeholder.lastLocationTime')"> |
|
|
|
</el-date-picker> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="创建时间" prop="createTime"> |
|
|
|
<el-date-picker clearable size="small" v-model="form.createTime" type="date" value-format="yyyy-MM-dd" placeholder="选择创建时间"> |
|
|
|
<el-form-item :label="$t('common.createTime')" prop="createTime"> |
|
|
|
<el-date-picker clearable size="small" v-model="form.createTime" type="date" value-format="yyyy-MM-dd" :placeholder="$t('device.placeholder.createTime')"> |
|
|
|
</el-date-picker> |
|
|
|
</el-form-item> |
|
|
|
</el-form> |
|
|
|
<div slot="footer" class="dialog-footer"> |
|
|
|
<el-button type="primary" @click="submitForm">确 定</el-button> |
|
|
|
<el-button @click="cancel">取 消</el-button> |
|
|
|
<el-button type="primary" @click="submitForm">{{ $t("common.confirm") }}</el-button> |
|
|
|
<el-button @click="cancel">{{ $t("common.cancel") }}</el-button> |
|
|
|
</div> |
|
|
|
</el-dialog> |
|
|
|
</div> |
|
|
|
@ -466,11 +466,11 @@ export default { |
|
|
|
// 总条数 |
|
|
|
total: 0, |
|
|
|
activationStatusOptions: [{ |
|
|
|
label: "已启用", |
|
|
|
label: this.$t("device.status.enabled"), |
|
|
|
value: true |
|
|
|
}, |
|
|
|
{ |
|
|
|
label: "未启用", |
|
|
|
label: this.$t("device.status.disabled"), |
|
|
|
value: false |
|
|
|
}, |
|
|
|
], |
|
|
|
@ -501,12 +501,12 @@ export default { |
|
|
|
editInfoRules: { |
|
|
|
alias: [{ |
|
|
|
max: 64, |
|
|
|
message: "名称长度不能超过64个字符", |
|
|
|
message: this.$t("device.validation.aliasMax"), |
|
|
|
trigger: "blur" |
|
|
|
}], |
|
|
|
remark: [{ |
|
|
|
max: 255, |
|
|
|
message: "设备备注长度不能超过255个字符", |
|
|
|
message: this.$t("device.validation.remarkMax"), |
|
|
|
trigger: "blur" |
|
|
|
}], |
|
|
|
}, |
|
|
|
@ -535,7 +535,7 @@ export default { |
|
|
|
importRules: { |
|
|
|
file: [{ |
|
|
|
required: true, |
|
|
|
message: "请选择要上传的Excel文件", |
|
|
|
message: this.$t("device.validation.fileRequired"), |
|
|
|
trigger: "change" |
|
|
|
}], |
|
|
|
}, |
|
|
|
@ -555,42 +555,42 @@ export default { |
|
|
|
rules: { |
|
|
|
sn: [{ |
|
|
|
required: true, |
|
|
|
message: "序列号不能为空", |
|
|
|
message: this.$t("device.validation.snRequired"), |
|
|
|
trigger: "blur" |
|
|
|
}], |
|
|
|
mac: [{ |
|
|
|
required: true, |
|
|
|
message: "MAC 地址不能为空", |
|
|
|
message: this.$t("device.validation.macRequired"), |
|
|
|
trigger: "blur" |
|
|
|
}], |
|
|
|
orderCode: [ |
|
|
|
// 新增:订单号校验 |
|
|
|
{ |
|
|
|
required: true, |
|
|
|
message: "订单号不能为空", |
|
|
|
message: this.$t("device.validation.orderCodeRequired"), |
|
|
|
trigger: "blur" |
|
|
|
}, |
|
|
|
], |
|
|
|
privateKey: [{ |
|
|
|
required: true, |
|
|
|
message: "私钥不能为空", |
|
|
|
message: this.$t("device.validation.privateKeyRequired"), |
|
|
|
trigger: "blur" |
|
|
|
}], |
|
|
|
batchNo: [{ |
|
|
|
required: true, |
|
|
|
message: "所属批次不能为空", |
|
|
|
message: this.$t("device.validation.batchNoRequired"), |
|
|
|
trigger: "blur" |
|
|
|
}], |
|
|
|
hashid: [{ |
|
|
|
required: true, |
|
|
|
message: "设备的唯一哈希 ID不能为空", |
|
|
|
message: this.$t("device.validation.hashIdRequired"), |
|
|
|
trigger: "blur" |
|
|
|
}, ], |
|
|
|
remark: [ |
|
|
|
// 新增:备注非必填(可根据需求调整为必填) |
|
|
|
{ |
|
|
|
required: false, |
|
|
|
message: "备注不能为空", |
|
|
|
message: this.$t("device.validation.remarkRequired"), |
|
|
|
trigger: "blur" |
|
|
|
}, |
|
|
|
], |
|
|
|
@ -693,17 +693,25 @@ export default { |
|
|
|
this.multiple = !selection.length; |
|
|
|
}, |
|
|
|
getActivationStatusLabel(value) { |
|
|
|
return value === true || value === 1 || value === "1" ? "启用" : "禁用"; |
|
|
|
return value === true || value === 1 || value === "1" ? this.$t("device.status.enabled") : this.$t("device.status.disabled"); |
|
|
|
}, |
|
|
|
getActivationTagType(value) { |
|
|
|
return value === true || value === 1 || value === "1" ? "success" : "info"; |
|
|
|
}, |
|
|
|
formatCoordinateValue(value) { |
|
|
|
if (value === null || value === undefined || value === "") { |
|
|
|
if (value === null || value === undefined) { |
|
|
|
return "-"; |
|
|
|
} |
|
|
|
let strValue = String(value); |
|
|
|
const [integerPart, decimalPart] = strValue.split("."); |
|
|
|
const strValue = String(value).trim(); |
|
|
|
if (!strValue || strValue === "-") { |
|
|
|
return "-"; |
|
|
|
} |
|
|
|
const match = strValue.match(/^([+-]?\d+)(?:\.(\d+))?$/); |
|
|
|
if (!match) { |
|
|
|
return "-"; |
|
|
|
} |
|
|
|
const integerPart = match[1]; |
|
|
|
const decimalPart = match[2] || ""; |
|
|
|
const fixedDecimal = decimalPart.slice(0, 2).padEnd(2, "0"); |
|
|
|
|
|
|
|
return `${integerPart}.${fixedDecimal}`; |
|
|
|
@ -737,7 +745,7 @@ export default { |
|
|
|
/** 打开分配设备弹窗 */ |
|
|
|
handleAssignDevice() { |
|
|
|
if (!this.ids.length) { |
|
|
|
this.$message.warning("请先勾选需要分配的设备"); |
|
|
|
this.$message.warning(this.$t("device.message.selectDeviceForAssign")); |
|
|
|
return; |
|
|
|
} |
|
|
|
this.assignDeviceOpen = true; |
|
|
|
@ -764,11 +772,11 @@ export default { |
|
|
|
/** 提交分配设备 */ |
|
|
|
handleAssignSubmit() { |
|
|
|
if (!this.ids.length) { |
|
|
|
this.$message.warning("请先勾选需要分配的设备"); |
|
|
|
this.$message.warning(this.$t("device.message.selectDeviceForAssign")); |
|
|
|
return; |
|
|
|
} |
|
|
|
if (!this.selectedAssignUsers.length) { |
|
|
|
this.$message.warning("请选择员工账户"); |
|
|
|
this.$message.warning(this.$t("device.message.selectUserForAssign")); |
|
|
|
return; |
|
|
|
} |
|
|
|
const userIds = Array.from( |
|
|
|
@ -780,14 +788,17 @@ export default { |
|
|
|
); |
|
|
|
const deviceIds = Array.from(new Set(this.ids)); |
|
|
|
if (!userIds.length) { |
|
|
|
this.$message.warning("未获取到有效的员工账号"); |
|
|
|
this.$message.warning(this.$t("device.message.invalidUserSelection")); |
|
|
|
return; |
|
|
|
} |
|
|
|
this.$confirm( |
|
|
|
`确认将选中的 ${deviceIds.length} 台设备分配给 ${userIds.length} 名员工吗?`, |
|
|
|
"提示", { |
|
|
|
confirmButtonText: "确定", |
|
|
|
cancelButtonText: "取消", |
|
|
|
this.$t("device.message.confirmAssign", { |
|
|
|
deviceCount: deviceIds.length, |
|
|
|
userCount: userIds.length, |
|
|
|
}), |
|
|
|
this.$t("common.tips"), { |
|
|
|
confirmButtonText: this.$t("common.confirm"), |
|
|
|
cancelButtonText: this.$t("common.cancel"), |
|
|
|
type: "warning", |
|
|
|
} |
|
|
|
) |
|
|
|
@ -797,7 +808,7 @@ export default { |
|
|
|
userIds, |
|
|
|
deviceIds, |
|
|
|
}); |
|
|
|
this.$message.success("分配成功"); |
|
|
|
this.$message.success(this.$t("device.message.assignSuccess")); |
|
|
|
this.handleAssignDialogClose(); |
|
|
|
this.getList(); |
|
|
|
}) |
|
|
|
@ -809,19 +820,19 @@ export default { |
|
|
|
/** 批量启用设备 */ |
|
|
|
handleBatchActivate() { |
|
|
|
if (!this.ids.length) { |
|
|
|
this.$message.warning("请先勾选需要启用的设备"); |
|
|
|
this.$message.warning(this.$t("device.message.selectDeviceForEnable")); |
|
|
|
return; |
|
|
|
} |
|
|
|
this.$confirm(`确认启用选中的 ${this.ids.length} 台设备吗?`, "提示", { |
|
|
|
confirmButtonText: "确定", |
|
|
|
cancelButtonText: "取消", |
|
|
|
this.$confirm(this.$t("device.message.confirmBatchEnable", { count: this.ids.length }), this.$t("common.tips"), { |
|
|
|
confirmButtonText: this.$t("common.confirm"), |
|
|
|
cancelButtonText: this.$t("common.cancel"), |
|
|
|
type: "warning", |
|
|
|
}) |
|
|
|
.then(() => { |
|
|
|
return batchActivateDevice(this.ids); |
|
|
|
}) |
|
|
|
.then(() => { |
|
|
|
this.$message.success("批量启用成功"); |
|
|
|
this.$message.success(this.$t("device.message.batchEnableSuccess")); |
|
|
|
this.getList(); |
|
|
|
}) |
|
|
|
.catch(() => {}); |
|
|
|
@ -829,19 +840,19 @@ export default { |
|
|
|
/** 批量禁用设备 */ |
|
|
|
handleBatchDisable() { |
|
|
|
if (!this.ids.length) { |
|
|
|
this.$message.warning("请先勾选需要禁用的设备"); |
|
|
|
this.$message.warning(this.$t("device.message.selectDeviceForDisable")); |
|
|
|
return; |
|
|
|
} |
|
|
|
this.$confirm(`确认禁用选中的 ${this.ids.length} 台设备吗?`, "提示", { |
|
|
|
confirmButtonText: "确定", |
|
|
|
cancelButtonText: "取消", |
|
|
|
this.$confirm(this.$t("device.message.confirmBatchDisable", { count: this.ids.length }), this.$t("common.tips"), { |
|
|
|
confirmButtonText: this.$t("common.confirm"), |
|
|
|
cancelButtonText: this.$t("common.cancel"), |
|
|
|
type: "warning", |
|
|
|
}) |
|
|
|
.then(() => { |
|
|
|
return batchDisableDevice(this.ids); |
|
|
|
}) |
|
|
|
.then(() => { |
|
|
|
this.$message.success("批量禁用成功"); |
|
|
|
this.$message.success(this.$t("device.message.batchDisableSuccess")); |
|
|
|
this.getList(); |
|
|
|
}) |
|
|
|
.catch(() => {}); |
|
|
|
@ -883,7 +894,7 @@ export default { |
|
|
|
/** 修改名称和备注 */ |
|
|
|
handleEditInfo(row) { |
|
|
|
if (!row || !row.id) { |
|
|
|
this.$message.warning("未获取到设备信息"); |
|
|
|
this.$message.warning(this.$t("device.message.deviceInfoMissing")); |
|
|
|
return; |
|
|
|
} |
|
|
|
this.resetEditInfoForm(); |
|
|
|
@ -915,7 +926,7 @@ export default { |
|
|
|
remark: this.editInfoForm.remark, |
|
|
|
}) |
|
|
|
.then(() => { |
|
|
|
this.$message.success("修改成功"); |
|
|
|
this.$message.success(this.$t("device.message.updateSuccess")); |
|
|
|
this.editInfoOpen = false; |
|
|
|
this.getList(); |
|
|
|
}) |
|
|
|
@ -927,7 +938,7 @@ export default { |
|
|
|
/** 查看设备轨迹 */ |
|
|
|
handleTrajectory(row) { |
|
|
|
if (!row || !row.id) { |
|
|
|
this.$message.warning("未获取到设备信息"); |
|
|
|
this.$message.warning(this.$t("device.message.deviceInfoMissing")); |
|
|
|
return; |
|
|
|
} |
|
|
|
this.trajectoryDevice = { |
|
|
|
@ -948,7 +959,7 @@ export default { |
|
|
|
handleAdd() { |
|
|
|
this.reset(); |
|
|
|
this.open = true; |
|
|
|
this.title = "添加系统设备主"; |
|
|
|
this.title = this.$t("device.dialog.form.addTitle"); |
|
|
|
}, |
|
|
|
/** 修改按钮操作 */ |
|
|
|
handleUpdate(row) { |
|
|
|
@ -957,7 +968,7 @@ export default { |
|
|
|
getDevice(id).then((response) => { |
|
|
|
this.form = response.data; |
|
|
|
this.open = true; |
|
|
|
this.title = "修改系统设备主"; |
|
|
|
this.title = this.$t("device.dialog.form.editTitle"); |
|
|
|
}); |
|
|
|
}, |
|
|
|
/** 提交按钮 */ |
|
|
|
@ -966,13 +977,13 @@ export default { |
|
|
|
if (valid) { |
|
|
|
if (this.form.id != null) { |
|
|
|
updateDevice(this.form).then((response) => { |
|
|
|
this.$message.success("修改成功"); |
|
|
|
this.$message.success(this.$t("device.message.updateSuccess")); |
|
|
|
this.open = false; |
|
|
|
this.getList(); |
|
|
|
}); |
|
|
|
} else { |
|
|
|
addDevice(this.form).then((response) => { |
|
|
|
this.$message.success("新增成功"); |
|
|
|
this.$message.success(this.$t("device.message.addSuccess")); |
|
|
|
this.open = false; |
|
|
|
this.getList(); |
|
|
|
}); |
|
|
|
@ -983,9 +994,9 @@ export default { |
|
|
|
/** 删除按钮操作 */ |
|
|
|
handleDelete(row) { |
|
|
|
const ids = row.id || this.ids; |
|
|
|
this.$confirm('是否确认删除系统设备主编号为"' + ids + '"的数据项?', "警告", { |
|
|
|
confirmButtonText: "确定", |
|
|
|
cancelButtonText: "取消", |
|
|
|
this.$confirm(this.$t("device.message.confirmDelete", { ids }), this.$t("device.message.warning"), { |
|
|
|
confirmButtonText: this.$t("common.confirm"), |
|
|
|
cancelButtonText: this.$t("common.cancel"), |
|
|
|
type: "warning", |
|
|
|
}) |
|
|
|
.then(function () { |
|
|
|
@ -993,16 +1004,16 @@ export default { |
|
|
|
}) |
|
|
|
.then(() => { |
|
|
|
this.getList(); |
|
|
|
this.$message.success("删除成功"); |
|
|
|
this.$message.success(this.$t("device.message.deleteSuccess")); |
|
|
|
}) |
|
|
|
.catch(() => {}); |
|
|
|
}, |
|
|
|
/** 导出按钮操作 */ |
|
|
|
handleExport() { |
|
|
|
const queryParams = this.queryParams; |
|
|
|
this.$confirm("是否确认导出所有系统设备主数据项?", "警告", { |
|
|
|
confirmButtonText: "确定", |
|
|
|
cancelButtonText: "取消", |
|
|
|
this.$confirm(this.$t("device.message.confirmExport"), this.$t("device.message.warning"), { |
|
|
|
confirmButtonText: this.$t("common.confirm"), |
|
|
|
cancelButtonText: this.$t("common.cancel"), |
|
|
|
type: "warning", |
|
|
|
}) |
|
|
|
.then(function () { |
|
|
|
@ -1037,13 +1048,13 @@ export default { |
|
|
|
} |
|
|
|
}) |
|
|
|
.catch((err) => { |
|
|
|
this.$message.error("获取批次号失败:" + (err.message || "接口异常")); |
|
|
|
this.$message.error(this.$t("device.message.fetchBatchNoFailed") + (err.message || this.$t("device.message.apiException"))); |
|
|
|
}); |
|
|
|
}); |
|
|
|
}, |
|
|
|
/** 限制文件数量:超出1个时提示 */ |
|
|
|
handleExceed(files, fileList) { |
|
|
|
this.$message.warning(`最多只能上传1个Excel文件,当前已选择 ${fileList.length} 个`); |
|
|
|
this.$message.warning(this.$t("device.message.exceedFileLimit", { count: fileList.length })); |
|
|
|
}, |
|
|
|
|
|
|
|
/** 上传前校验文件格式 */ |
|
|
|
@ -1053,7 +1064,7 @@ export default { |
|
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" || |
|
|
|
file.type === "application/vnd.ms-excel"; |
|
|
|
if (!isExcel) { |
|
|
|
this.$message.error("只能上传 .xlsx 或 .xls 格式的Excel文件!"); |
|
|
|
this.$message.error(this.$t("device.message.invalidFileType")); |
|
|
|
return false; // 阻止上传 |
|
|
|
} |
|
|
|
return true; |
|
|
|
@ -1078,11 +1089,11 @@ export default { |
|
|
|
|
|
|
|
// 2. 强制校验文件数量(双重保障) |
|
|
|
if (!this.uploadFile || this.fileList.length === 0) { |
|
|
|
this.$message.warning("请选择要上传的Excel文件(仅支持1个文件)!"); |
|
|
|
this.$message.warning(this.$t("device.message.selectOneExcel")); |
|
|
|
return; |
|
|
|
} |
|
|
|
if (this.fileList.length > 1) { |
|
|
|
this.$message.warning("最多只能上传1个Excel文件,请删除多余文件!"); |
|
|
|
this.$message.warning(this.$t("device.message.removeExtraFiles")); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
@ -1104,10 +1115,10 @@ export default { |
|
|
|
if (this.latestImportResult.failCount > 0 || this.latestImportResult.requestErrors.length > 0) { |
|
|
|
this.$message.warning(this.getImportStatusMessage(this.latestImportResult)); |
|
|
|
} else { |
|
|
|
this.$message.success("导入成功!"); |
|
|
|
this.$message.success(this.$t("device.message.importSuccess")); |
|
|
|
} |
|
|
|
} catch (error) { |
|
|
|
this.$message.error("导入失败:" + (error.message || "服务器异常")); |
|
|
|
this.$message.error(this.$t("device.message.importFailed") + (error.message || this.$t("device.message.serverException"))); |
|
|
|
} finally { |
|
|
|
this.importing = false; |
|
|
|
} |
|
|
|
@ -1170,12 +1181,12 @@ export default { |
|
|
|
}, |
|
|
|
getImportStatusLabel(status) { |
|
|
|
const statusMap = { |
|
|
|
SUCCESS: "导入成功", |
|
|
|
PARTIAL_SUCCESS: "部分成功", |
|
|
|
FAILED: "导入失败", |
|
|
|
REQUEST_INVALID: "请求校验失败", |
|
|
|
SUCCESS: this.$t("device.importStatus.SUCCESS"), |
|
|
|
PARTIAL_SUCCESS: this.$t("device.importStatus.PARTIAL_SUCCESS"), |
|
|
|
FAILED: this.$t("device.importStatus.FAILED"), |
|
|
|
REQUEST_INVALID: this.$t("device.importStatus.REQUEST_INVALID"), |
|
|
|
}; |
|
|
|
return statusMap[status] || status || "未知状态"; |
|
|
|
return statusMap[status] || status || this.$t("device.importStatus.UNKNOWN"); |
|
|
|
}, |
|
|
|
getImportStatusType(status) { |
|
|
|
const typeMap = { |
|
|
|
@ -1188,7 +1199,11 @@ export default { |
|
|
|
}, |
|
|
|
getImportStatusMessage(result) { |
|
|
|
const statusLabel = this.getImportStatusLabel(result.status); |
|
|
|
return `${statusLabel},成功 ${result.successCount} 条,失败 ${result.failCount} 条`; |
|
|
|
return this.$t("device.message.importStatusSummary", { |
|
|
|
status: statusLabel, |
|
|
|
successCount: result.successCount, |
|
|
|
failCount: result.failCount, |
|
|
|
}); |
|
|
|
}, |
|
|
|
}, |
|
|
|
}; |
|
|
|
|