feat:智能柜配置详情

This commit is contained in:
dzc committed 2025-04-09 12:40:38 +08:00
1 parent a7ffb58e75
commit fbea57b81f
7 files changed
+419 -40

No files matched your search

+40
View File
@@ -0,0 +1,40 @@
import request from "/@/utils/request"
export function pageJoin(query?: Object) {
return request({
url: "/hard/hard-door-manager/page-join",
method: "get",
params: query,
})
}
export function fetchList(query?: Object) {
return request({
url: "/hard/hard-door-manager/page",
method: "get",
params: query,
})
}
export function bind(obj?: Object) {
return request({
url: "/hard/hard-door-manager/bind",
method: "post",
data: obj,
})
}
export function getObj(id?: string) {
return request({
url: "/hard/hard-door-manager/" + id,
method: "get",
})
}
export function getByHardId(params: any) {
return request({
url: "/hard/hard-door-manager/get-by-hard-id",
method: "get",
params,
})
}
+3
View File
@@ -23,6 +23,9 @@
<el-form-item label="手机号" prop="phone">
<el-input v-model="state.queryForm.phone" placeholder="请输入手机号" clearable />
</el-form-item>
<el-form-item style="width: 250px" label="部门" prop="deptId">
<select-dept v-model="state.queryForm.deptId" clearable />
</el-form-item>
<el-form-item>
<el-button icon="Search" type="primary" @click="getDataList">查询</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
+11 -19
View File
@@ -144,23 +144,16 @@ import { ElLoading } from "element-plus"
const RefundRejectForm = defineAsyncComponent(() => import("./refund-reject.vue"))
// 定义查询字典
const {
hard_pay_type,
hard_order_type,
hard_order_status,
hard_after_sale_way,
hard_after_sale_type,
hard_sale_status,
hard_type,
} = useDict(
"hard_pay_type",
"hard_order_type",
"hard_order_status",
"hard_after_sale_way",
"hard_after_sale_type",
"hard_sale_status",
"hard_type",
)
const { hard_pay_type, hard_order_type, hard_order_status, hard_after_sale_way, hard_after_sale_type, hard_sale_status, hard_type } =
useDict(
"hard_pay_type",
"hard_order_type",
"hard_order_status",
"hard_after_sale_way",
"hard_after_sale_type",
"hard_sale_status",
"hard_type",
)
const { query } = useRoute()
const refundRejectRef = ref()
@@ -182,8 +175,7 @@ const state: BasicTableProps = reactive<BasicTableProps>({
})
// table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile, tableStyle } =
useTable(state)
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile, tableStyle } = useTable(state)
onMounted(async () => {
const type = query.type as unknown as any
+192
View File
@@ -0,0 +1,192 @@
<template>
<el-dialog :title="form.id ? '编辑' : '新增'" v-model="visible" :close-on-click-modal="false" draggable>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading">
<el-row :gutter="24">
<el-col :span="12" class="mb20">
<el-form-item label="设备编号" prop="hardId">
<el-input v-model="form.hardId" placeholder="请输入设备编号" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="设备 IMEI 号(15 位)" prop="imei">
<el-input v-model="form.imei" placeholder="请输入设备 IMEI 号(15 位)" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="货柜数量" prop="cabinetNum">
<el-input v-model="form.cabinetNum" placeholder="请输入货柜数量" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="每个货柜中摄像头数量" prop="cabinetCameraNum">
<el-input v-model="form.cabinetCameraNum" placeholder="请输入每个货柜中摄像头数量" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="每个货柜中称重单元数量" prop="cabinetWeightUnitNum">
<el-input v-model="form.cabinetWeightUnitNum" placeholder="请输入每个货柜中称重单元数量" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="1:通电;2:断电" prop="powerStatus">
<el-input v-model="form.powerStatus" placeholder="请输入1:通电;2:断电" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="在线状态。1:在线;2:离线" prop="netStatus">
<el-input v-model="form.netStatus" placeholder="请输入在线状态。1:在线;2:离线" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="售卖状态。1:在售;2:停售" prop="saleStatus">
<el-input v-model="form.saleStatus" placeholder="请输入售卖状态。1:在售;2:停售" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item
label="sim 信号强度。大于-95 表示信号强度好;-95 到-105 表示信号强度中等;小于-105 表示信号差;"
prop="signalIntensity"
>
<el-input
v-model="form.signalIntensity"
placeholder="请输入sim 信号强度。大于-95 表示信号强度好;-95 到-105 表示信号强度中等;小于-105 表示信号差;"
/>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item
label="信噪比,体现信道传输质量的参数。大于 15 表示质量好;15 到 0 表示质量中等;小于等于 0 表示质量差;"
prop="signalRatio"
>
<el-input
v-model="form.signalRatio"
placeholder="请输入信噪比,体现信道传输质量的参数。大于 15 表示质量好;15 到 0 表示质量中等;小于等于 0 表示质量差;"
/>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="sim 信号值更新时间。yyyy-MM-dd HH:mm:ss" prop="signalTime">
<el-input v-model="form.signalTime" placeholder="请输入sim 信号值更新时间。yyyy-MM-dd HH:mm:ss" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="货柜列表JSON" prop="cabinetList">
<el-input v-model="form.cabinetList" placeholder="请输入货柜列表JSON" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="上次重启时间" prop="restartTime">
<el-input v-model="form.restartTime" placeholder="请输入上次重启时间" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="onSubmit" :disabled="loading">确认</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup lang="ts" name="HardDoorManagerDialog">
import { useDict } from "/@/hooks/dict"
import { useMessage } from "/@/hooks/message"
import * as hardDoorManager from "/@/api/hard/hard-door-manager"
import { rule } from "/@/utils/validate"
const emit = defineEmits(["refresh"])
// 定义变量内容
const dataFormRef = ref()
const visible = ref(false)
const loading = ref(false)
// 定义字典
// 提交表单数据
const form = reactive({
id: "",
hardId: "",
imei: "",
cabinetNum: "",
cabinetCameraNum: "",
cabinetWeightUnitNum: "",
powerStatus: "",
netStatus: "",
saleStatus: "",
signalIntensity: "",
signalRatio: "",
signalTime: "",
cabinetList: "",
restartTime: "",
})
// 定义校验规则
const dataRules = ref({})
// 打开弹窗
const openDialog = (id: string) => {
visible.value = true
form.id = ""
// 重置表单数据
nextTick(() => {
dataFormRef.value?.resetFields()
})
// 获取hardDoorManager信息
if (id) {
form.id = id
gethardDoorManagerData(id)
}
}
// 提交
const onSubmit = async () => {
const valid = await dataFormRef.value.validate().catch(() => {})
if (!valid) return false
try {
loading.value = true
form.id ? await hardDoorManager.putObj(form) : await hardDoorManager.addObj(form)
useMessage().success(form.id ? "修改成功" : "添加成功")
visible.value = false
emit("refresh")
} catch (err: any) {
useMessage().error(err.msg)
} finally {
loading.value = false
}
}
// 初始化表单数据
const gethardDoorManagerData = (id: string) => {
// 获取数据
loading.value = true
hardDoorManager
.getObj(id)
.then((res: any) => {
Object.assign(form, res.data)
})
.finally(() => {
loading.value = false
})
}
// 暴露变量
defineExpose({
openDialog,
})
</script>
+161
View File
@@ -0,0 +1,161 @@
<template>
<div class="layout-padding">
<div v-loading="loading" class="layout-padding-auto layout-padding-view" style="overflow: scroll !important">
<el-descriptions :column="3" border title="智能柜设置">
<template #extra>
<el-tooltip class="item" effect="dark" :content="$t('queryTree.refresh')" placement="top">
<el-button circle icon="Refresh" @click="doRefresh" />
</el-tooltip>
</template>
<el-descriptions-item label="设备IMEI卡号">
<el-input v-model="doorSetting.imei" style="width: 100%" placeholder="请输入设备IMEI卡号" clearable />
</el-descriptions-item>
<el-descriptions-item label="设备编号"> {{ doorSetting.id }} </el-descriptions-item>
<el-descriptions-item label="操作">
<div class="flex justify-center items-center">
<el-button icon="Paperclip" type="primary" @click="doBind"> 绑定 </el-button>
</div>
</el-descriptions-item>
</el-descriptions>
<el-descriptions :column="3" border title="智能柜详情">
<el-descriptions-item label="货柜数量"> {{ doorSetting.cabinetNum }} </el-descriptions-item>
<el-descriptions-item label="摄像头数量"> {{ doorSetting.cabinetCameraNum }} </el-descriptions-item>
<el-descriptions-item label="称重单元数量"> {{ doorSetting.cabinetWeightUnitNum }} </el-descriptions-item>
<el-descriptions-item :span="3" label="智能柜" labelClassName="no-colon">
<el-table border>
<el-table-column label="货柜号" align="center" prop="cabinetNo" />
<el-table-column label="锁在线" align="center" prop="isLockOnline" />
<el-table-column label="是否开锁" align="center" prop="lockStatus" />
<el-table-column label="门状态" align="center" prop="lockStatus" />
<el-table-column label="货柜售卖状态" align="center" prop="lockStatus" />
</el-table>
</el-descriptions-item>
</el-descriptions>
<el-descriptions :column="3" border title="智能柜状态">
<el-descriptions-item label="通电状态"> {{ doorSetting.powerStatus }} </el-descriptions-item>
<el-descriptions-item label="设备是否在线"> {{ doorSetting.cabinetNum }} </el-descriptions-item>
<el-descriptions-item label="是否在售"> {{ doorSetting.cabinetNum }} </el-descriptions-item>
</el-descriptions>
<el-descriptions :column="3" border title="sim卡信号">
<el-descriptions-item label="sim卡信号强度"> {{ doorSetting.signalIntensity }} </el-descriptions-item>
<el-descriptions-item label="sim卡信号更新时间"> {{ doorSetting.signalTime }} </el-descriptions-item>
<el-descriptions-item label=""></el-descriptions-item>
</el-descriptions>
<el-descriptions :column="3" border title="信噪信息">
<el-descriptions-item label="信噪比"> {{ doorSetting.signalRatio }} </el-descriptions-item>
<el-descriptions-item label=""></el-descriptions-item>
<el-descriptions-item label=""></el-descriptions-item>
</el-descriptions>
<el-descriptions :column="3" border title="重启设置">
<el-descriptions-item label="最后重启时间"> {{ doorSetting.restartTime }} </el-descriptions-item>
<el-descriptions-item label=""> </el-descriptions-item>
<el-descriptions-item label="操作">
<div class="flex justify-center items-center">
<el-button icon="RefreshRight" type="primary" @click="doRestart"> 重启 </el-button>
</div>
</el-descriptions-item>
</el-descriptions>
</div>
</div>
</template>
<script setup lang="ts" name="systemHardDoorManager">
import { useMessage } from "/@/hooks/message"
import * as hardDoorManager from "/@/api/hard/hard-door-manager"
const { query } = useRoute()
const doorSetting = ref<any>({})
const loading = ref(false)
const state = reactive<any>({
queryForm: {},
})
onMounted(async () => {
await getDetail()
})
const getDetail = async () => {
const id = query.id as unknown as any
if (!id) return
state.queryForm.orderId = id
const { data: orderData } = await hardDoorManager.getByHardId({ hardId: id })
if (orderData) {
doorSetting.value = orderData
}
if (!doorSetting.value.hardId) {
doorSetting.value.hardId = id
}
}
// 绑定
const doBind = async () => {
const pa = { id: doorSetting.value.id, hardId: doorSetting.value.hardId, imei: doorSetting.value.imei }
loading.value = true
try {
await hardDoorManager.bind(pa)
useMessage().success("绑定成功")
} catch (e: any) {
useMessage().error(e.msg)
} finally {
loading.value = false
}
}
// 重启
const doRestart = async () => {
const pa = {}
}
// 刷新
const doRefresh = async () => {
try {
loading.value = true
await getDetail()
} finally {
loading.value = false
}
}
</script>
<style lang="scss" scoped>
:deep(.el-descriptions) {
&:not(:nth-child(1)) {
margin-top: 20px;
}
.el-descriptions__cell.is-bordered-label {
width: 150px;
}
.el-descriptions__cell.is-bordered-content {
width: 200px;
}
.el-descriptions__title {
display: flex;
align-items: center;
&::before {
display: inline-block;
width: 3px;
height: 20px;
margin-right: 10px;
background-color: #409eff;
content: "";
}
}
.el-descriptions-item__container {
margin: 0 10px;
.no-colon {
margin: 0;
&::after {
content: "";
}
}
}
}
</style>
+12 -4
View File
@@ -61,7 +61,7 @@
</template>
</el-table-column>
<el-table-column prop="hardGroupName" width="200" label="分类" />
<el-table-column prop="merchantName" width="100" label="商户" />
<el-table-column prop="merchantName" width="150" label="商户" />
<el-table-column prop="deptName" width="200" label="部门" />
<el-table-column prop="uniqueCode" width="200" label="设备唯一编号" />
<el-table-column prop="mainTopic" width="350" label="topic" />
@@ -84,9 +84,10 @@
<el-table-column prop="createTime" width="200" label="创建时间" />
<el-table-column v-auths="['hard_hardManager_edit', 'hard_hardManager_del']" label="操作" fixed="right" width="400">
<template #default="{ row }">
<el-button icon="edit-pen" text type="primary" v-auth="'hard_hardManager_edit'" @click="formDialogRef.openDialog(row.id)"
>编辑</el-button
>
<el-button icon="InfoFilled" text type="primary" v-auth="'hard_hardManager_edit'" @click="doInfo(row)"> 详情 </el-button>
<el-button icon="edit-pen" text type="primary" v-auth="'hard_hardManager_edit'" @click="formDialogRef.openDialog(row.id)">
编辑
</el-button>
<el-button icon="TrendCharts" link type="primary" v-auth="'hard_hardManager_edit'" @click="mqformDialogRef.openDialog(row.id)">
mq设置
</el-button>
@@ -113,6 +114,8 @@ import { useMessage, useMessageBox } from "/@/hooks/message"
import { useDict } from "/@/hooks/dict"
import { useUserInfo } from "/@/stores/userInfo"
const { push } = useRouter()
// 引入组件
const FormDialog = defineAsyncComponent(() => import("./form.vue"))
const FaceFormDialog = defineAsyncComponent(() => import("./face-form.vue"))
@@ -169,6 +172,11 @@ const selectionChangHandle = (objs: { id: string }[]) => {
multiple.value = !objs.length
}
// 硬件详情
const doInfo = (row: any) => {
push({ path: "/hard/hard-door-manager/index", query: { id: row.id } })
}
// 删除操作
const handleDelete = async (ids: string[]) => {
try {
-17
View File
@@ -357,23 +357,6 @@ const handleGetSelectNode = (curClickedNode: any, checkedTreeNodes: any, isDeepT
getDataList()
}
// const adminRefund = async (row: any) => {
// let loading: any = null
// try {
// await useMessage().delConfirm("是否同意退款?")
// loading = ElLoading.service({
// lock: true,
// text: "提交中",
// background: "rgba(0, 0, 0, 0.7)",
// })
// await hardInvoice.adminRefund({ id: row.id })
// useMessage().success("操作成功")
// getDataList()
// } finally {
// setTimeout(() => loading.close(), 500)
// }
// }
// 导出excel
const exportExcel = () => {
downBlobFile("/hard/hard-order/export", Object.assign(state.queryForm, { ids: selectObjs }), "订单记录.xlsx")