feat: 塔吊功能新增

This commit is contained in:
kun 2023-08-25 17:54:53 +08:00
parent 0cdfbe6e25
commit 33d6b67250
32 changed files with 4292 additions and 464 deletions

View File

@ -538,3 +538,45 @@ export const locationSubmitReform = (params: FormData) => {
export const locationSubmitAll = (params: FormData) => {
return http.post(BASEURL + `/ent/acceptInspectRecord/apply`, params);
};
// 塔吊在线监管
// 设备管理列表
export const towerCraneEquipAll = (params: any) => {
return http.post(BASEURL + `/ent/towerCrane/list`, params);
};
// 设备管理分页列表
export const towerCraneEquipPage = (params: any) => {
return http.post(BASEURL + `/ent/towerCrane/page`, params);
};
// 设备管理新增
export const towerCraneEquipAdd = (params: any) => {
return http.post(BASEURL + `/ent/towerCrane/add`, params);
};
// 设备管理编辑
export const towerCraneEquipEdit = (params: any) => {
return http.post(BASEURL + `/ent/towerCrane/edit`, params);
};
// 设备管理删除
export const towerCraneEquipDel = (params: any) => {
return http.post(BASEURL + `/ent/towerCrane/delete`, params);
};
// 获取运行数据
export const operationData = (params: any) => {
return http.post(BASEURL + `/ent/towerCraneCurrentData/getOperation`, params);
};
// 报警数据分页列表
export const towerCraneAlarmPage = (params: any) => {
return http.post(BASEURL + `/ent/towerCraneAlarm/page`, params);
};
// 实时数据分页列表
export const towerCraneDataPage = (params: any) => {
return http.post(BASEURL + `/ent/towerCraneCurrentData/page`, params);
};
// 工作循环数据分页列表
export const towerCraneWorkCyclePage = (params: any) => {
return http.post(BASEURL + `/ent/towerCraneWorkCycle/page`, params);
};

View File

@ -587,3 +587,31 @@ export const locationOptionAudit = (params: any) => {
export const locationAllOptionAudit = (params: any) => {
return http.post(BASEURL + `/gov/acceptInspectRecord/examine`, params);
};
// 塔吊在线监管
// 设备管理列表
export const towerCraneEquipAll = (params: any) => {
return http.post(BASEURL + `/gov/towerCrane/list`, params);
};
// 获取运行数据
export const operationData = (params: any) => {
return http.post(BASEURL + `/gov/towerCraneCurrentData/getOperation`, params);
};
// 分页列表查询实时数据项目信息
export const getRealTimepPojectPage = (params: any) => {
return http.post(BASEURL + `/gov/towerCrane/projectPage`, params);
};
// 分页列表查询实时数据工程信息
export const getRealTimeEngineeringPage = (params: any) => {
return http.post(BASEURL + `/gov/towerCrane/engineeringPage`, params);
};
// 报警数据分页列表
export const towerCraneAlarmPage = (params: any) => {
return http.post(BASEURL + `/gov/towerCraneAlarm/page`, params);
};
// 实时数据分页列表
export const towerCraneDataPage = (params: any) => {
return http.post(BASEURL + `/gov/towerCraneCurrentData/page`, params);
};

View File

@ -575,3 +575,45 @@ export const locationSubmitReform = (params: FormData) => {
export const locationSubmitAll = (params: FormData) => {
return http.post(BASEURL + `/project/acceptInspectRecord/apply`, params);
};
// 塔吊在线监管
// 设备管理列表
export const towerCraneEquipAll = (params: any) => {
return http.post(BASEURL + `/project/towerCrane/list`, params);
};
// 设备管理分页列表
export const towerCraneEquipPage = (params: any) => {
return http.post(BASEURL + `/project/towerCrane/page`, params);
};
// 设备管理新增
export const towerCraneEquipAdd = (params: any) => {
return http.post(BASEURL + `/project/towerCrane/add`, params);
};
// 设备管理编辑
export const towerCraneEquipEdit = (params: any) => {
return http.post(BASEURL + `/project/towerCrane/edit`, params);
};
// 设备管理删除
export const towerCraneEquipDel = (params: any) => {
return http.post(BASEURL + `/project/towerCrane/delete`, params);
};
// 获取运行数据
export const operationData = (params: any) => {
return http.post(BASEURL + `/project/towerCraneCurrentData/getOperation`, params);
};
// 报警数据分页列表
export const towerCraneAlarmPage = (params: any) => {
return http.post(BASEURL + `/project/towerCraneAlarm/page`, params);
};
// 实时数据分页列表
export const towerCraneDataPage = (params: any) => {
return http.post(BASEURL + `/project/towerCraneCurrentData/page`, params);
};
// 工作循环数据分页列表
export const towerCraneWorkCyclePage = (params: any) => {
return http.post(BASEURL + `/project/towerCraneWorkCycle/page`, params);
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 473 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 595 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,40 @@
.date-select {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
}
.basic-form {
.face-img {
width: 100%;
align-self: flex-start;
:deep(.face-uploader .el-upload) {
border: 1px dashed #d9d9d9 !important;
border-radius: 6px !important;
cursor: pointer !important;
position: relative !important;
overflow: hidden !important;
}
.face-uploader .el-upload:hover {
border-color: #409eff !important;
}
:deep(.el-icon) {
font-size: 28px;
color: #8c939d;
width: 53px;
height: 53px;
line-height: 53px;
text-align: center;
}
.face-avatar {
width: 53px;
height: 53px;
display: block;
}
}
}
:deep() {
.tabs-option {
display: none;
}
}

View File

@ -0,0 +1,786 @@
<template>
<div class="table-box">
<ProTable
ref="proTable"
title="设备管理"
:columns="columns"
:requestApi="getTableList"
:dataCallback="dataCallback"
:tool-button="false"
:pagination="true"
background
:isShowSearch="false"
:initParam="initParam"
:onReset="true"
>
<template #formButton="scope">
<el-button class="addButtonStyle" @click="handleAddItem">新增</el-button>
</template>
<template #operation="{ row }">
<el-button type="primary" link @click="handleLookItem(row)">
<img src="@/assets/images/tableIcon/look.png" alt="" class="configureIcon" />
<span>查看</span>
</el-button>
<el-button type="primary" link @click="handleEditItem(row)">
<img src="@/assets/images/tableIcon/updateIcon.png" alt="" class="configureIcon" />
<span>编辑</span>
</el-button>
<el-button type="danger" link :icon="Delete" @click="handleDeleteItem(row)">删除</el-button>
</template>
<template #state="{ row }">
<span :class="row.state === 1 ? '' : 'redText'">{{ row.state == 1 ? "启用" : "禁用" }}</span>
</template>
</ProTable>
<el-dialog :title="title" show-close v-model="newUnitDialog" style="min-width: 1200px">
<el-form ref="formRef" :model="formData" label-width="180px" :rules="rules" class="basic-form" size="default">
<!-- <el-form ref="formDataRef" :model="formData" label-width="150px" class="basic-form"> -->
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="设备名称:" prop="devName">
<el-input v-model="formData.devName" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="安装日期:" prop="installTime">
<el-date-picker
:disabled="title == '查看设备'"
style="width: 100%"
v-model="formData.installTime"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="date"
placeholder="请选择"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="黑匣子信息:" prop="blackBox">
<el-input v-model="formData.blackBox" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="结构类型:" prop="structureType">
<el-select
v-model="formData.structureType"
:disabled="title == '查看设备'"
placeholder="请选择"
style="width: 100%"
>
<el-option v-for="item in typeList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="设备使用状态:" prop="useState">
<el-select v-model="formData.useState" :disabled="title == '查看设备'" placeholder="请选择" style="width: 100%">
<el-option v-for="item in stateList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设备图片:" prop="installImage">
<div class="face-img">
<el-upload
class="face-uploader"
:action="`${baseUrl}` + '/xmgl/file/upload'"
:show-file-list="false"
:on-success="(response, uploadFile) => handleAvatarSuccess(response, uploadFile)"
accept="image/jpg, image/jpeg, image/png"
>
<img v-if="formData.installImage" :src="formData.installImage" class="face-avatar" />
<el-icon v-else><plus /></el-icon>
</el-upload>
</div>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="是否外地设备:" prop="isForeignDev">
<el-radio-group placeholder="请选择" v-model="formData.isForeignDev">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否全新设备:" prop="isNewDev">
<el-radio-group placeholder="请选择" v-model="formData.isNewDev">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="规格型号:" prop="model">
<el-input v-model="formData.model" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="许可证发证机关:" prop="licensingAuthority">
<el-input v-model="formData.licensingAuthority" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="出厂(合格证):" prop="factoryCertificate">
<el-input v-model="formData.factoryCertificate" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工作幅度(m):" prop="workingRange">
<el-input v-model.number="formData.workingRange" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="最大额定起重量(kg):" prop="maxLiftingCapacity">
<el-input v-model.number="formData.maxLiftingCapacity" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="独立起升高度(m):" prop="independentLiftingHeight">
<el-input v-model.number="formData.independentLiftingHeight" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="购置日期:" prop="acquisitionDate">
<el-date-picker
:disabled="title == '查看设备'"
style="width: 100%"
v-model="formData.acquisitionDate"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="date"
placeholder="请选择时间"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="编号有效期:" prop="numberValidityPeriod">
<el-date-picker
:disabled="title == '查看设备'"
style="width: 100%"
v-model="formData.numberValidityPeriod"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="date"
placeholder="请选择时间"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="设备原值:" prop="originalValue">
<el-input v-model.number="formData.originalValue" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设备改造次数:" prop="renovations">
<el-input v-model.number="formData.renovations" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="发票编码:" prop="invoiceCode">
<el-input v-model="formData.invoiceCode" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="购买合同编码:" prop="contractCode">
<el-input v-model="formData.contractCode" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="生产厂家:" prop="manufacturer">
<el-input v-model="formData.manufacturer" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="出厂日期:" prop="productionDate">
<el-date-picker
:disabled="title == '查看设备'"
style="width: 100%"
v-model="formData.productionDate"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="date"
placeholder="请选择时间"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="制造许可证编号:" prop="manufacturerLicense">
<el-input v-model="formData.manufacturerLicense" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否为原购产品:" prop="isOriginalProduct">
<el-radio-group placeholder="请选择" v-model="formData.isOriginalProduct">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="设备用途:" prop="useTo">
<el-input v-model="formData.useTo" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="前臂长:" prop="forearmLength">
<el-input v-model.number="formData.forearmLength" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="后臂长:" prop="posteriorArmLength">
<el-input v-model.number="formData.posteriorArmLength" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="塔身高度:" prop="towerHeight">
<el-input v-model.number="formData.towerHeight" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="前臂永久性标识:" prop="forearmFlag">
<el-input v-model="formData.forearmFlag" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="后臂永久性标识:" prop="rearArmFlag">
<el-input v-model="formData.rearArmFlag" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="塔帽永久性标识:" prop="towerCapFlag">
<el-input v-model="formData.towerCapFlag" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="上转台永久性标识:" prop="upwardTurntableFlag">
<el-input v-model="formData.upwardTurntableFlag" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="下转台永久性标识:" prop="lowerTurntableFlag">
<el-input v-model="formData.lowerTurntableFlag" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="标准节点永久性标识:" prop="mastSectionFlag">
<el-input v-model="formData.mastSectionFlag" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<footer class="footer flx-center" v-if="title != '查看设备'">
<el-button class="cancelButtonStyle" @click="newUnitDialog = false">取消</el-button>
<el-button type="primary" @click="submitForm(formData)">保存</el-button>
</footer>
</el-form>
</el-dialog>
<!-- 侧边栏选择 -->
<engineeringEngDrawer v-model="engVisable" ref="engDrawer" :engList="engList">
<template #default="{ data }">
<span style="margin-left: 10px" @click="onUpdate(data)">{{ data.engineeringName }}</span>
</template>
</engineeringEngDrawer>
<allEngineering @click="engVisable = true" />
</div>
</template>
<script setup lang="tsx" name="ProjectSupervisionRecord">
import { ref, reactive, nextTick, onMounted } from "vue";
import { ElMessage, FormInstance } from "element-plus";
import type { UploadProps } from "element-plus";
import { useRouter } from "vue-router";
import { ColumnProps } from "@/components/ProTable/interface";
import { useHandleData } from "@/hooks/useHandleData";
import ProTable from "@/components/ProTable/index.vue";
import { jxj_User } from "@/api/types";
import { getRelevanceList } from "@/api/modules/common";
import engineeringEngDrawer from "@/components/engineeringEngDrawer/index.vue";
import allEngineering from "@/components/allEngineering/index.vue";
import { towerCraneEquipAdd, towerCraneEquipEdit, towerCraneEquipDel, towerCraneEquipPage } from "@/api/modules/enterpriseApi";
import { GlobalStore } from "@/stores";
import { Delete } from "@element-plus/icons-vue";
const baseUrl = import.meta.env.VITE_API_URL;
const typeList = ref([
{ label: "尖头塔", value: 1 },
{ label: "平头塔", value: 2 },
{ label: "动臂塔", value: 3 }
]);
const stateList = ref([
{ label: "设备进场", value: 1 },
{ label: "设备安装", value: 2 },
{ label: "设备验收", value: 3 },
{ label: "设备使用", value: 4 },
{ label: "设备拆除", value: 5 },
{ label: "设备退场", value: 6 }
]);
const engList = ref([]);
const engVisable = ref(false);
const searchSn = ref("");
const changeType = ref(1);
const datas = reactive([]);
const formRef = ref<FormInstance>();
const router = useRouter();
const store = GlobalStore();
const drawerVisible = ref(false);
const title = ref("");
const newUnitDialog = ref(false);
// ProTable()
const initParam = reactive({
engineeringSn: ""
});
const formData = ref({
devName: "",
installTime: "",
blackBox: "",
structureType: "",
useState: "",
installImage: "",
isForeignDev: 0,
isNewDev: 0,
model: "",
licensingAuthority: "",
factoryCertificate: "",
workingRange: "",
maxLiftingCapacity: "",
independentLiftingHeight: "",
acquisitionDate: "",
numberValidityPeriod: "",
originalValue: "",
renovations: "",
invoiceCode: "",
contractCode: "",
manufacturer: "",
productionDate: "",
manufacturerLicense: "",
isOriginalProduct: 0,
useTo: "",
forearmLength: "",
posteriorArmLength: "",
towerHeight: "",
forearmFlag: "",
rearArmFlag: "",
towerCapFlag: "",
upwardTurntableFlag: "",
lowerTurntableFlag: "",
mastSectionFlag: ""
});
// ProTable 便
const proTable = ref();
const getId = ref<number | undefined>(undefined);
//
const columns: ColumnProps[] = [
{ type: "index", label: "序号", width: 80 },
{
prop: "devName",
label: "设备名称",
search: { el: "input" }
},
{
prop: "installTime",
label: "安装时间",
search: {
el: "date-picker",
props: {
type: "daterange",
format: "YYYY-MM-DD",
valueFormat: "YYYY-MM-DD"
// defaultTime: defaultTime2
}
}
},
{ prop: "blackBox", label: "黑匣子信息" },
{ prop: "operation", label: "操作", fixed: "right", width: 260 }
];
const rules = ref({
devName: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
installTime: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
blackBox: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
structureType: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
installImage: [
{
required: true,
message: "请上传",
trigger: "change"
}
],
isForeignDev: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
isNewDev: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
model: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
factoryCertificate: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
workingRange: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
maxLiftingCapacity: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
independentLiftingHeight: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
acquisitionDate: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
numberValidityPeriod: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
originalValue: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
renovations: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
invoiceCode: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
manufacturer: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
productionDate: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
manufacturerLicense: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
isOriginalProduct: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
useTo: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
forearmLength: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
posteriorArmLength: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
towerHeight: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
forearmFlag: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
rearArmFlag: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
towerCapFlag: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
upwardTurntableFlag: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
lowerTurntableFlag: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
mastSectionFlag: [
{
required: true,
message: "请输入",
trigger: "blur"
}
]
});
//
const handleAvatarSuccess: UploadProps["onSuccess"] = (response, uploadFile) => {
console.log(response.result.url);
console.log(response, uploadFile);
formData.value.installImage = response.result.url;
formRef.value?.validateField("image");
};
//
const handleDeleteItem = async (params: jxj_User.ResUserList) => {
await useHandleData(towerCraneEquipDel, { id: params.id }, `删除【${params.devName}`);
proTable.value.getTableList();
};
// dataCallback list && total && pageNum && pageSize
// hooks/useTable.ts
const dataCallback = (data: any) => {
// console.log(data);
return {
list: data.records,
total: Number(data.total),
pageNo: Number(data.current),
pageSize: Number(data.size)
};
};
const transfrom = (arr: Array<any>) => {
const result: any[] | ConcatArray<{ authorityId: any; roleId: number | undefined; type: any }> = [];
return arr
.map(item => {
if (arr.children && Array.isArray(arr.children)) {
result.concat(transfrom(arr.children));
}
return {
authorityId: item.name,
roleId: getId.value,
type: item.type
};
})
.concat(result);
};
// params
// ProTable :requestApi="getUserList"
const getTableList = (params: any) => {
let newParams = JSON.parse(JSON.stringify(params));
if (newParams.installTime) {
newParams.installTime_begin = newParams.installTime[0];
newParams.installTime_end = newParams.installTime[1];
delete newParams.installTime;
}
if (searchSn.value) {
newParams.engineeringSn = searchSn.value;
} else {
return { result: { current: "1", pages: "1", records: [], size: "10", total: "0" } };
}
return towerCraneEquipPage(newParams);
};
//
const handleAddItem = () => {
formRef.value?.resetFields();
title.value = "新增设备";
newUnitDialog.value = true;
};
//
const handleLookItem = (row: any) => {
formRef.value?.resetFields();
title.value = "查看设备";
console.log(row);
formData.value = reactive({ ...row });
changeType.value = formData.value.businessLicenseLifespan ? 1 : 2;
newUnitDialog.value = true;
};
//
const handleEditItem = (row: any) => {
formRef.value?.clearValidate();
title.value = "编辑设备";
console.log(row);
formData.value = reactive({ ...row });
changeType.value = formData.value.businessLicenseLifespan ? 1 : 2;
newUnitDialog.value = true;
};
// TODO:
const submitForm = async (data: any) => {
const formEl = formRef.value;
if (!formEl) return;
await formEl.validate((valid, fields) => {
if (valid) {
if (changeType.value == 2) {
delete data.businessLicenseLifespan;
}
data.engineeringSn = searchSn.value;
saveItem(data);
} else {
console.log("error submit!", fields);
}
});
};
const saveItem = async (form: any) => {
if (form.id) {
// console.log(form.dictCode);
const res = await towerCraneEquipEdit(form);
proTable.value.getTableList();
ElMessage.success("编辑成功");
newUnitDialog.value = false;
} else {
const res = await towerCraneEquipAdd(form);
proTable.value.getTableList();
ElMessage.success("新增成功");
newUnitDialog.value = false;
}
};
const getengineering = async () => {
// let newParams = JSON.parse(JSON.stringify(params));
const res = await getRelevanceList();
engList.value = res.result;
if (res.result && res.result.length > 0) {
searchSn.value = res.result[0].engineeringSn;
}
proTable.value.getTableList();
console.log(res);
};
//
const onUpdate = async row => {
searchSn.value = row.engineeringSn;
proTable.value.getTableList();
ElMessage.success("页面已更新");
};
onMounted(() => {
getengineering();
});
</script>
<style scoped lang="scss">
@import "./index.scss";
</style>

View File

@ -0,0 +1,16 @@
@mixin flex {
display: flex;
align-items: center;
}
.table-data {
@include flex;
> span {
display: inline-block;
width: 50%;
}
}
:deep() {
.tabs-option {
display: none;
}
}

View File

@ -0,0 +1,233 @@
<template>
<div class="table-box">
<ProTable
ref="proTable"
title="报警数据"
:columns="columns"
:requestApi="getTableList"
:dataCallback="dataCallback"
:tool-button="false"
:pagination="true"
background
:isShowSearch="false"
:initParam="initParam"
:onReset="true"
>
<template #equipInfo="{ row }">
<span>设备名称: {{ row.devName }}</span>
<br />
<span>设备编号: {{ row.devNumber }}</span>
<br />
<span>司机姓名: {{ row.driverName }}</span>
<br />
<span>司机身份证号: {{ row.driverIdCard }}</span>
<br />
<span>特种作业号: {{ row.certification }}</span>
</template>
<template #alarmInfo="{ row }">
<div class="table-data">
<span
>环境防撞报警:
<span :style="{ color: row.environmentAlarm == 0 ? '#333' : '#E70000' }">{{
row.environmentAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>高度上限位报警:
<span :style="{ color: row.heightUpperAlarm == 0 ? '#333' : '#E70000' }">{{
row.heightUpperAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>高度下限位报警:
<span :style="{ color: row.heightLowerAlarm == 0 ? '#333' : '#E70000' }">{{
row.heightLowerAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>幅度外限位报警:
<span :style="{ color: row.maxRangeAlarm == 0 ? '#333' : '#E70000' }">{{
row.maxRangeAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>幅度内限位报警:
<span :style="{ color: row.minRangeAlarm == 0 ? '#333' : '#E70000' }">{{
row.minRangeAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>力矩报警:
<span :style="{ color: row.forceAlarm == 0 ? '#333' : '#E70000' }">{{
row.forceAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>多机防撞报警:
<span :style="{ color: row.multiAntiCollisionAlarm == 0 ? '#333' : '#E70000' }">{{
row.multiAntiCollisionAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>逆时针回转限位报警:
<span :style="{ color: row.negAngleAlarm == 0 ? '#333' : '#E70000' }">{{
row.negAngleAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>倾角报警:
<span :style="{ color: row.obliquityAlarm == 0 ? '#333' : '#E70000' }">{{
row.obliquityAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>塔机竖向高度报警:
<span :style="{ color: row.standardHighAlarm == 0 ? '#333' : '#E70000' }">{{
row.standardHighAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span>升降机报警时间: {{ row.createTime }}</span>
</div>
</template>
</ProTable>
<!-- 侧边栏选择 -->
<engineeringEngDrawer v-model="engVisable" ref="engDrawer" :engList="engList">
<template #default="{ data }">
<span style="margin-left: 10px" @click="onUpdate(data)">{{ data.engineeringName }}</span>
</template>
</engineeringEngDrawer>
<allEngineering @click="engVisable = true" />
</div>
</template>
<script setup lang="tsx" name="ProjectSupervisionRecord">
import { ref, reactive, onMounted } from "vue";
import { ElMessage } from "element-plus";
import { ColumnProps } from "@/components/ProTable/interface";
import ProTable from "@/components/ProTable/index.vue";
import { getRelevanceList } from "@/api/modules/common";
import engineeringEngDrawer from "@/components/engineeringEngDrawer/index.vue";
import allEngineering from "@/components/allEngineering/index.vue";
import { towerCraneAlarmPage } from "@/api/modules/enterpriseApi";
const engList = ref([]);
const engVisable = ref(false);
const searchSn = ref("");
// ProTable()
const initParam = reactive({
solveFlag: 1,
engineeringSn: ""
});
// ProTable 便
const proTable = ref();
const getId = ref<number | undefined>(undefined);
//
const columns: ColumnProps[] = [
{ type: "index", label: "序号", width: 200 },
{
prop: "devName",
label: "设备名称",
isShow: false,
search: { el: "input" }
},
{
prop: "type",
label: "报警类型",
isShow: false,
search: { el: "select" },
enum: [
{ label: "报警", value: 1 },
{ label: "预警", value: 2 }
]
},
{
prop: "createTime",
label: "报警时间",
isShow: false,
search: {
el: "date-picker",
props: {
type: "daterange",
format: "YYYY-MM-DD",
valueFormat: "YYYY-MM-DD"
// defaultTime: defaultTime2
}
}
},
{
prop: "equipInfo",
label: "设备信息",
align: "left"
},
// prop
{ prop: "alarmInfo", label: "报警信息", align: "left", width: 800 }
];
// dataCallback list && total && pageNum && pageSize
// hooks/useTable.ts
const dataCallback = (data: any) => {
// console.log(data);
return {
list: data.records,
total: Number(data.total),
pageNo: Number(data.current),
pageSize: Number(data.size)
};
};
// params
// ProTable :requestApi="getUserList"
const getTableList = (params: any) => {
let newParams = JSON.parse(JSON.stringify(params));
if (newParams.createTime) {
newParams.createTime_begin = newParams.createTime[0];
newParams.createTime_end = newParams.createTime[1];
delete newParams.createTime;
}
if (searchSn.value) {
newParams.engineeringSn = searchSn.value;
} else {
return { result: { current: "1", pages: "1", records: [], size: "10", total: "0" } };
}
return towerCraneAlarmPage(newParams);
};
const getengineering = async () => {
// let newParams = JSON.parse(JSON.stringify(params));
const res = await getRelevanceList();
engList.value = res.result;
if (res.result && res.result.length > 0) {
searchSn.value = res.result[0].engineeringSn;
}
proTable.value.getTableList();
console.log(res);
};
//
const onUpdate = async row => {
searchSn.value = row.engineeringSn;
proTable.value.getTableList();
ElMessage.success("页面已更新");
};
onMounted(() => {
getengineering();
});
</script>
<style scoped lang="scss">
@import "./index.scss";
</style>

View File

@ -0,0 +1,16 @@
@mixin flex {
display: flex;
align-items: center;
}
.table-data {
@include flex;
> span {
display: inline-block;
width: 50%;
}
}
:deep() {
.tabs-option {
display: none;
}
}

View File

@ -0,0 +1,491 @@
<template>
<div class="table-box">
<ProTable
ref="proTable"
title="报警数据"
:columns="columns"
:requestApi="getTableList"
:dataCallback="dataCallback"
:tool-button="false"
:pagination="true"
background
:isShowSearch="false"
:initParam="initParam"
:onReset="true"
>
<template #equipInfo="{ row }">
<span>设备名称: {{ row.devName }}</span>
<br />
<span>设备编号: {{ row.devNumber }}</span>
<br />
<span>司机姓名: {{ row.driverName }}</span>
<br />
<span>司机身份证号: {{ row.driverIdCard }}</span>
<br />
<span>角度: {{ row.angle ? row.angle : 0 }}°</span>
<br />
<span>高度: {{ row.height ? row.height : 0 }}m</span>
<br />
<span>载重比: {{ row.loadRatio ? row.loadRatio : 0 }}%</span>
<br />
<span>载重: {{ row.loading ? row.loading : 0 }}kg</span>
<br />
<span>倾角: {{ row.obliquity ? row.obliquity : 0 }}°</span>
<br />
<span>倾角X: {{ row.obliquityX ? row.obliquityX : 0 }}°</span>
<br />
<span>倾角Y: {{ row.obliquityY ? row.obliquityY : 0 }}°</span>
<br />
<span>幅度: {{ row.ranger ? row.ranger : 0 }}m</span>
<br />
<span>倍率: {{ row.multiple ? row.multiple : 0 }}</span>
<br />
<span>数据接受时间: {{ row.createTime ? row.createTime : "" }}</span>
<br />
<span>力矩: {{ row.torque ? row.torque : 0 }}kg.m</span>
<br />
<span>力矩比: {{ row.torqueRatio ? row.torqueRatio : 0 }}%</span>
<br />
<span>风速: {{ row.windSpeed ? row.windSpeed : 0 }}m/s</span>
<br />
<span
>回转状态:
{{
row.rotationState == 0 ? "停止回转" : row.rotationState == 1 ? "向右回转" : row.rotationState == 2 ? "向左回转" : ""
}}</span
>
<br />
<span
>起升状态:
{{
row.liftingState == 0 ? "停止升降" : row.liftingState == 1 ? "向下落勾" : row.liftingState == 2 ? "向上起勾" : ""
}}</span
>
<br />
<span
>变幅状态:
{{
row.rangerState == 0 ? "停止变幅" : row.rangerState == 1 ? "向外变幅" : row.rangerState == 2 ? "向内变幅" : ""
}}</span
>
</template>
<template #alarmInfo="{ row }">
<div class="table-data">
<span
>禁入区报警:
<span :style="{ color: row.forbidEntryAlarm == 0 ? '#333' : '#E70000' }">{{
row.forbidEntryAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>禁入区左转报警:
<span :style="{ color: row.forbidEntryLeftAlarm == 0 ? '#333' : '#E70000' }">{{
row.forbidEntryLeftAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>禁入区右转报警:
<span :style="{ color: row.forbidEntryRightAlarm == 0 ? '#333' : '#E70000' }">{{
row.forbidEntryRightAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>A类禁吊区域报警:
<span :style="{ color: row.forbidSuspendAlarmA == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendAlarmA == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>A类禁吊区左转报警:
<span :style="{ color: row.forbidSuspendLeftAlarmA == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendLeftAlarmA == 0 ? "正常" : "报警"
}}</span></span
>
<span
>A类禁吊区右转报警:
<span :style="{ color: row.forbidSuspendRightAlarmA == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendRightAlarmA == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>A类禁吊区向外变幅报警:
<span :style="{ color: row.forbidSuspendOutAlarmA == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendOutAlarmA == 0 ? "正常" : "报警"
}}</span></span
>
<span
>B类禁吊区域报警:
<span :style="{ color: row.forbidSuspendAlarmB == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendAlarmB == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>B类禁吊区左转报警:
<span :style="{ color: row.forbidSuspendLeftAlarmB == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendLeftAlarmB == 0 ? "正常" : "报警"
}}</span></span
>
<span
>B类禁吊区右转报警:
<span :style="{ color: row.forbidSuspendRightAlarmB == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendRightAlarmB == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>B类禁吊区向外变幅报警:
<span :style="{ color: row.forbidSuspendOutAlarmB == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendOutAlarmB == 0 ? "正常" : "报警"
}}</span></span
>
<span
>B类禁吊区向内变幅报警:
<span :style="{ color: row.forbidSuspendBackAlarmB == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendBackAlarmB == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>高度上限位报警:
<span :style="{ color: row.heightUpperAlarm == 0 ? '#333' : '#E70000' }">{{
row.heightUpperAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>高度下限位报警:
<span :style="{ color: row.heightLowerAlarm == 0 ? '#333' : '#E70000' }">{{
row.heightLowerAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>幅度外限位报警:
<span :style="{ color: row.maxRangeAlarm == 0 ? '#333' : '#E70000' }">{{
row.maxRangeAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>幅度内限位报警:
<span :style="{ color: row.minRangeAlarm == 0 ? '#333' : '#E70000' }">{{
row.minRangeAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>力矩报警:
<span :style="{ color: row.forceAlarm == 0 ? '#333' : '#E70000' }">{{
row.forceAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>多机防撞报警:
<span :style="{ color: row.multiAntiCollisionAlarm == 0 ? '#333' : '#E70000' }">{{
row.multiAntiCollisionAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>多机防撞向内变幅报警:
<span :style="{ color: row.multiAntiCollisionBackAlarm == 0 ? '#333' : '#E70000' }">{{
row.multiAntiCollisionBackAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>多机防撞左转报警:
<span :style="{ color: row.multiAntiCollisionLeftAlarm == 0 ? '#333' : '#E70000' }">{{
row.multiAntiCollisionLeftAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>多机防撞向外变幅报警:
<span :style="{ color: row.multiAntiCollisionOutAlarm == 0 ? '#333' : '#E70000' }">{{
row.multiAntiCollisionOutAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>多机防撞右转报警:
<span :style="{ color: row.multiAntiCollisionRightAlarm == 0 ? '#333' : '#E70000' }">{{
row.multiAntiCollisionRightAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>逆时针回转限位报警:
<span :style="{ color: row.negAngleAlarm == 0 ? '#333' : '#E70000' }">{{
row.negAngleAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>倾角报警:
<span :style="{ color: row.obliquityAlarm == 0 ? '#333' : '#E70000' }">{{
row.obliquityAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>倾角X报警:
<span :style="{ color: row.obliquityXAlarm == 0 ? '#333' : '#E70000' }">{{
row.obliquityXAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>倾角Y报警:
<span :style="{ color: row.obliquityYAlarm == 0 ? '#333' : '#E70000' }">{{
row.obliquityYAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>顺时针回转限位报警:
<span :style="{ color: row.posAngleAlarm == 0 ? '#333' : '#E70000' }">{{
row.posAngleAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>风速报警:
<span :style="{ color: row.windSpeedAlarm == 0 ? '#333' : '#E70000' }">{{
row.windSpeedAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
</template>
<template #faultInfo="{ row }">
<div class="table-data">
<span
>角度传感器故障:
<span :style="{ color: row.angleError == 0 ? '#333' : '#E70000' }">{{
row.angleError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>GPS故障:
<span :style="{ color: row.gpsError == 0 ? '#333' : '#E70000' }">{{
row.gpsError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>高度传感器故障:
<span :style="{ color: row.heightError == 0 ? '#333' : '#E70000' }">{{
row.heightError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>身份识别模块故障:
<span :style="{ color: row.identificationError == 0 ? '#333' : '#E70000' }">{{
row.identificationError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>有无任何外设故障:
<span :style="{ color: row.peripheralError == 0 ? '#333' : '#E70000' }">{{
row.peripheralError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>倾角传感器故障:
<span :style="{ color: row.obliquityError == 0 ? '#333' : '#E70000' }">{{
row.obliquityError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>幅度传感器故障:
<span :style="{ color: row.rangeError == 0 ? '#333' : '#E70000' }">{{
row.rangeError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>载重传感器故障:
<span :style="{ color: row.weightError == 0 ? '#333' : '#E70000' }">{{
row.weightError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>风速传感器故障:
<span :style="{ color: row.windSpeedError == 0 ? '#333' : '#E70000' }">{{
row.windSpeedError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
</template>
</ProTable>
<!-- 侧边栏选择 -->
<engineeringEngDrawer v-model="engVisable" ref="engDrawer" :engList="engList">
<template #default="{ data }">
<span style="margin-left: 10px" @click="onUpdate(data)">{{ data.engineeringName }}</span>
</template>
</engineeringEngDrawer>
<allEngineering @click="engVisable = true" />
</div>
</template>
<script setup lang="tsx" name="ProjectSupervisionRecord">
import { ref, reactive, onMounted } from "vue";
import { ElMessage } from "element-plus";
import { ColumnProps } from "@/components/ProTable/interface";
import ProTable from "@/components/ProTable/index.vue";
import { getRelevanceList } from "@/api/modules/common";
import engineeringEngDrawer from "@/components/engineeringEngDrawer/index.vue";
import allEngineering from "@/components/allEngineering/index.vue";
import { towerCraneDataPage } from "@/api/modules/enterpriseApi";
const engList = ref([]);
const engVisable = ref(false);
const searchSn = ref("");
// ProTable()
const initParam = reactive({
solveFlag: 1,
engineeringSn: ""
});
// ProTable 便
const proTable = ref();
//
const columns: ColumnProps[] = [
{ type: "index", label: "序号", width: 200 },
{
prop: "devName",
label: "设备名称",
isShow: false,
search: { el: "input" }
},
{
prop: "type",
label: "报警类型",
isShow: false,
search: { el: "select" },
enum: [
{ label: "报警", value: 1 },
{ label: "预警", value: 2 }
]
},
{
prop: "createTime",
label: "数据接受时间",
isShow: false,
search: {
el: "date-picker",
props: {
type: "daterange",
format: "YYYY-MM-DD",
valueFormat: "YYYY-MM-DD"
// defaultTime: defaultTime2
}
}
},
{
prop: "equipInfo",
label: "设备信息",
align: "left",
width: 400
},
// prop
{ prop: "alarmInfo", label: "报警信息", align: "left", width: 800 },
{ prop: "faultInfo", label: "故障信息", align: "left" }
];
// dataCallback list && total && pageNum && pageSize
// hooks/useTable.ts
const dataCallback = (data: any) => {
// console.log(data);
return {
list: data.records,
total: Number(data.total),
pageNo: Number(data.current),
pageSize: Number(data.size)
};
};
// params
// ProTable :requestApi="getUserList"
const getTableList = (params: any) => {
let newParams = JSON.parse(JSON.stringify(params));
if (newParams.createTime) {
newParams.createTime_begin = newParams.createTime[0];
newParams.createTime_end = newParams.createTime[1];
delete newParams.createTime;
}
if (searchSn.value) {
newParams.engineeringSn = searchSn.value;
} else {
return { result: { current: "1", pages: "1", records: [], size: "10", total: "0" } };
}
return towerCraneDataPage(newParams);
};
const getengineering = async () => {
// let newParams = JSON.parse(JSON.stringify(params));
const res = await getRelevanceList();
engList.value = res.result;
if (res.result && res.result.length > 0) {
searchSn.value = res.result[0].engineeringSn;
}
proTable.value.getTableList();
console.log(res);
};
//
const onUpdate = async row => {
searchSn.value = row.engineeringSn;
proTable.value.getTableList();
ElMessage.success("页面已更新");
};
onMounted(() => {
getengineering();
});
</script>
<style scoped lang="scss">
@import "./index.scss";
</style>

View File

@ -0,0 +1,16 @@
@mixin flex {
display: flex;
align-items: center;
}
.table-data {
@include flex;
> span {
display: inline-block;
width: 50%;
}
}
:deep() {
.tabs-option {
display: none;
}
}

View File

@ -0,0 +1,315 @@
<template>
<div class="table-box">
<ProTable
ref="proTable"
title="报警数据"
:columns="columns"
:requestApi="getTableList"
:dataCallback="dataCallback"
:tool-button="false"
:pagination="true"
background
:isShowSearch="false"
:initParam="initParam"
:onReset="true"
>
<template #equipDriverInfo="{ row }">
<span>设备名称: {{ row.devName }}</span>
<br />
<span>设备编号: {{ row.devNumber }}</span>
<br />
<span>司机姓名: {{ row.driverName }}</span>
<br />
<span>司机身份证号: {{ row.driverIdCard }}</span>
</template>
<template #workCycleInfo="{ row }">
<div class="table-data">
<span>工作循环开始时间: {{ row.startTime }}</span>
<span>工作循环结束时间: {{ row.endTime }}</span>
</div>
<br />
<div class="table-data">
<span>工作循环持续时长: {{ row.duration ? row.duration : 0 }}s</span>
<span>工作循环最大载重: {{ row.maxLoad ? row.maxLoad : 0 }}kg</span>
</div>
<br />
<div class="table-data">
<span>工作循环最大角度: {{ row.maxAngle ? row.maxAngle : 0 }}°</span>
<span>工作循环最小角度: {{ row.minAngle ? row.minAngle : 0 }}°</span>
</div>
<br />
<div class="table-data">
<span>工作循环最大高度: {{ row.maxHeight ? row.maxHeight : 0 }}m</span>
<span>工作循环最小高度: {{ row.minHeight ? row.minHeight : 0 }}m</span>
</div>
<br />
<div class="table-data">
<span>工作循环最大幅度: {{ row.maxRange ? row.maxRange : 0 }}m</span>
<span>工作循环最小幅度: {{ row.minRange ? row.minRange : 0 }}m</span>
</div>
<br />
<div class="table-data">
<span>工作循环开始高度: {{ row.startHeight ? row.startHeight : 0 }}m</span>
<span>工作循环结束高度: {{ row.endHeight ? row.endHeight : 0 }}m</span>
</div>
<br />
<div class="table-data">
<span>工作循环开始幅度: {{ row.startRange ? row.startRange : 0 }}m</span>
<span>工作循环结束幅度: {{ row.endRange ? row.endRange : 0 }}m</span>
</div>
<br />
<div class="table-data">
<span>工作循环开始角度: {{ row.startAngle ? row.startAngle : 0 }}°</span>
<span>工作循环结束角度: {{ row.endAngle ? row.endAngle : 0 }}°</span>
</div>
<br />
<div class="table-data">
<span>工作循环最大载重比: {{ row.maxLoadRatio ? row.maxLoadRatio : 0 }}%</span>
<span>工作循环最大风速: {{ row.maxWindSpeed ? row.maxWindSpeed : 0 }}m/s</span>
</div>
<br />
<div class="table-data">
<span>工作循环中最大力矩: {{ row.maxForce ? row.maxForce : 0 }}kg·m</span>
<span>工作循环最大力矩百分比: {{ row.maxForceRatio ? row.maxForceRatio : 0 }}%</span>
</div>
<br />
<div class="table-data">
<span>工作循环最大力矩时的幅度: {{ row.maxForceRatioRange ? row.maxForceRatioRange : 0 }}m</span>
<span>工作循环倍率: {{ row.multiple ? row.multiple : 0 }}%</span>
</div>
</template>
<template #alarmInfo="{ row }">
<div class="table-data">
<span
>防碰撞报警:
<span :style="{ color: row.antiCollisionAlarm == 0 ? '#333' : '#E70000' }">{{
row.antiCollisionAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>高度上限位报警:
<span :style="{ color: row.heightUpperAlarm == 0 ? '#333' : '#E70000' }">{{
row.heightUpperAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>高度下限位报警:
<span :style="{ color: row.heightLowerAlarm == 0 ? '#333' : '#E70000' }">{{
row.heightLowerAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>幅度外限位报警:
<span :style="{ color: row.maxRangeAlarm == 0 ? '#333' : '#E70000' }">{{
row.maxRangeAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>幅度内限位报警:
<span :style="{ color: row.minRangeAlarm == 0 ? '#333' : '#E70000' }">{{
row.minRangeAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>力矩报警:
<span :style="{ color: row.forceAlarm == 0 ? '#333' : '#E70000' }">{{
row.forceAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>多机防撞报警:
<span :style="{ color: row.multiAntiCollisionAlarm == 0 ? '#333' : '#E70000' }">{{
row.multiAntiCollisionAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>逆时针回转限位报警:
<span :style="{ color: row.negAngleAlarm == 0 ? '#333' : '#E70000' }">{{
row.negAngleAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>倾角报警:
<span :style="{ color: row.obliquityAlarm == 0 ? '#333' : '#E70000' }">{{
row.obliquityAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>顺时针回转限位报警:
<span :style="{ color: row.posAngleAlarm == 0 ? '#333' : '#E70000' }">{{
row.posAngleAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>风速报警:
<span :style="{ color: row.windSpeedAlarm == 0 ? '#333' : '#E70000' }">{{
row.windSpeedAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>工作循环中是否出现环境防碰撞报警:
<span :style="{ color: row.workEnvironmentAlarm == 0 ? '#333' : '#E70000' }">{{
row.workEnvironmentAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>工作循环中是否出现力矩预警:
<span :style="{ color: row.workForceAlarm == 0 ? '#333' : '#E70000' }">{{
row.workForceAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
</template>
</ProTable>
<!-- 侧边栏选择 -->
<engineeringEngDrawer v-model="engVisable" ref="engDrawer" :engList="engList">
<template #default="{ data }">
<span style="margin-left: 10px" @click="onUpdate(data)">{{ data.engineeringName }}</span>
</template>
</engineeringEngDrawer>
<allEngineering @click="engVisable = true" />
</div>
</template>
<script setup lang="tsx" name="ProjectSupervisionRecord">
import { ref, reactive, onMounted } from "vue";
import { ElMessage } from "element-plus";
import { ColumnProps } from "@/components/ProTable/interface";
import ProTable from "@/components/ProTable/index.vue";
import { getRelevanceList } from "@/api/modules/common";
import engineeringEngDrawer from "@/components/engineeringEngDrawer/index.vue";
import allEngineering from "@/components/allEngineering/index.vue";
import { towerCraneWorkCyclePage } from "@/api/modules/enterpriseApi";
const engList = ref([]);
const engVisable = ref(false);
const searchSn = ref("");
// ProTable()
const initParam = reactive({
solveFlag: 1,
engineeringSn: ""
});
// ProTable 便
const proTable = ref();
//
const columns: ColumnProps[] = [
{ type: "index", label: "序号", width: 200 },
{
prop: "devName",
label: "设备名称",
isShow: false,
search: { el: "input" }
},
{
prop: "createTime",
label: "工作循环时间",
isShow: false,
search: {
el: "date-picker",
props: {
type: "daterange",
format: "YYYY-MM-DD",
valueFormat: "YYYY-MM-DD"
// defaultTime: defaultTime2
}
}
},
{
prop: "equipDriverInfo",
label: "设备司机信息",
align: "left",
width: 400
},
// prop
{ prop: "workCycleInfo", label: "工作循环信息", align: "left", width: 600 },
{ prop: "alarmInfo", label: "工作循环报警信息", align: "left", width: 600 }
];
// dataCallback list && total && pageNum && pageSize
// hooks/useTable.ts
const dataCallback = (data: any) => {
// console.log(data);
return {
list: data.records,
total: Number(data.total),
pageNo: Number(data.current),
pageSize: Number(data.size)
};
};
// params
// ProTable :requestApi="getUserList"
const getTableList = (params: any) => {
let newParams = JSON.parse(JSON.stringify(params));
if (newParams.createTime) {
newParams.startTime_begin = newParams.createTime[0];
newParams.endTime_end = newParams.createTime[1];
delete newParams.createTime;
}
if (searchSn.value) {
newParams.engineeringSn = searchSn.value;
} else {
return { result: { current: "1", pages: "1", records: [], size: "10", total: "0" } };
}
return towerCraneWorkCyclePage(newParams);
};
const getengineering = async () => {
// let newParams = JSON.parse(JSON.stringify(params));
const res = await getRelevanceList();
engList.value = res.result;
if (res.result && res.result.length > 0) {
searchSn.value = res.result[0].engineeringSn;
}
proTable.value.getTableList();
console.log(res);
};
//
const onUpdate = async row => {
searchSn.value = row.engineeringSn;
proTable.value.getTableList();
ElMessage.success("页面已更新");
};
onMounted(() => {
getengineering();
});
</script>
<style scoped lang="scss">
@import "./index.scss";
</style>

View File

@ -0,0 +1,276 @@
@mixin boxStyle {
border-radius: 8px;
background: #ffffff;
}
@mixin flex {
display: flex;
align-items: center;
}
.operate-box {
width: 100%;
height: 100%;
@include flex;
.monitor-data {
@include boxStyle;
flex: 1;
height: 100%;
min-height: 600px;
.monitor-title {
margin-top: 15px;
margin-left: 36px;
@include flex;
span:first-child {
font-size: 30px;
font-family: Source Han Sans CN-Bold, Source Han Sans CN;
font-weight: bold;
color: #333333;
margin-right: 20px;
}
span:last-child {
font-size: 22px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
}
}
.monitor-content {
display: flex;
height: calc(100% - 265px);
margin-top: 36px;
margin-left: 36px;
.monitor-tool {
position: relative;
span {
font-size: 18px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #000000;
}
.property-one {
position: absolute;
top: 0;
left: 0;
}
.property-two {
position: absolute;
top: 0;
right: 0;
}
.property-three {
position: absolute;
top: 180px;
left: 0;
}
.other-info {
position: absolute;
top: 240px;
right: 0px;
display: flex;
flex-direction: column;
> span {
margin-bottom: 20px;
}
}
img {
width: 688px;
height: 100%;
}
}
.monitor-aspect {
margin-left: 86px;
display: flex;
flex-wrap: wrap;
align-content: flex-start;
&-item {
width: 184px;
height: 100px;
background: #ffffff;
border-radius: 4px;
border: 1px solid #ebebeb;
@include flex;
flex-direction: column;
justify-content: center;
margin-right: 26px;
margin-bottom: 30px;
> div:first-child {
@include flex;
margin-bottom: 12px;
span {
font-size: 18px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #333333;
margin-right: 7px;
}
img {
width: 20px;
height: 20px;
}
}
> div:last-child {
@include flex;
span {
font-size: 18px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #00378f;
}
}
}
}
}
.monitor-equip {
margin-top: 31px;
margin-left: 36px;
margin-bottom: 16px;
@include flex;
.monitor-state:not(:last-child) {
margin-right: 26px;
}
.monitor-state {
@include flex;
flex-direction: column;
align-items: center;
cursor: pointer;
> div {
position: relative;
img {
width: 184px;
height: 100px;
}
span {
width: 32px;
height: 15px;
font-size: 10px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #ffffff;
text-align: center;
position: absolute;
top: 0;
right: 0;
}
}
> span {
font-size: 16px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #000000;
}
}
.active-class {
box-shadow: 0px 4px 8px 0px rgba(48, 62, 100, 0.2);
}
}
}
.no-data {
@include boxStyle;
flex: 1;
height: 100%;
min-height: 600px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
color: #999;
}
.history-data {
@include boxStyle;
width: 300px;
height: 100%;
margin-left: 20px;
:deep() {
.leftMenu {
height: 100%;
}
.content {
height: calc(100% - 100px);
}
}
.search-wrapper {
@include flex;
height: 50px;
padding: 0 10px;
background-color: #ffffff;
border-bottom: 1px solid #e5e5e5;
}
.alarm-list {
height: calc(100% - 50px);
min-height: 83%;
overflow-y: scroll;
&-item {
display: flex;
flex-direction: column;
border-bottom: 1px solid #e5e5e5;
padding: 12px;
> div {
span {
font-size: 12px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #333333;
}
}
> div:not(:last-child) {
margin-bottom: 8px;
}
}
}
.info-list {
height: calc(100% - 50px);
min-height: 83%;
overflow-y: scroll;
&-item {
display: flex;
flex-direction: column;
border-bottom: 1px solid #e5e5e5;
padding: 12px;
> div:nth-child(1) {
font-size: 16px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #333333;
margin-bottom: 10px;
}
&-aspect {
display: flex;
align-items: center;
justify-content: space-between;
&-item {
margin-bottom: 8px;
span {
font-size: 12px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
}
> span:nth-child(1) {
display: inline-block;
width: 36px;
height: 18px;
color: #606266;
margin-right: 20px;
text-align: left;
}
> span:nth-child(2) {
display: inline-block;
width: 42px;
height: 18px;
color: #333333;
}
}
}
> div:last-child {
font-size: 10px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: rgba(102, 102, 102, 0.8);
margin-top: 5px;
}
}
}
}
}
:deep() {
.tabs-option {
display: none;
}
}

View File

@ -0,0 +1,379 @@
<template>
<div class="operate-box">
<div class="monitor-data" v-if="equipList.length > 0">
<div class="monitor-title">
<span>{{ equipInfo.devName }}</span>
<span :style="{ color: equipInfo.online == 1 ? '#0f64da' : '#C3C3C3' }">{{
equipInfo.online == 1 ? "在线" : "离线"
}}</span>
</div>
<div class="monitor-content">
<div class="monitor-tool">
<img src="@/assets/images/onlineSupervision/towerImg.png" alt="" />
<span class="property-one">尾臂长: {{ equipInfo.posteriorArmLength ? equipInfo.posteriorArmLength : 0 }}m</span>
<span class="property-two">臂长: {{ equipInfo.forearmLength ? equipInfo.forearmLength : 0 }}m</span>
<span class="property-three">塔身高: {{ equipInfo.towerHeight ? equipInfo.towerHeight : 0 }}m</span>
<div class="other-info">
<span>设备编号: {{ equipInfo.devNumber ? equipInfo.devNumber : "" }}</span>
<span>安装日期: {{ equipInfo.installTime ? equipInfo.installTime : "" }}</span>
<!-- <span>终端编号: TD2374693</span> -->
<span>更新时间: {{ equipInfo.realTime ? equipInfo.realTime : "" }}</span>
</div>
</div>
<div class="monitor-aspect">
<div class="monitor-aspect-item" v-for="(item, index) in aspectList" :key="index">
<div>
<span>{{ item.name }}</span>
<img :src="item.img" alt="" srcset="" />
</div>
<div>
<span>{{ equipInfo[item.prop] ? equipInfo[item.prop] : 0 }}</span>
<span>{{ item.unit }}</span>
</div>
</div>
</div>
</div>
<div class="monitor-equip">
<div
:class="equipActive == index ? 'active-class' : ''"
class="monitor-state"
v-for="(item, index) in equipList"
:key="index"
@click="getEquipInfo(item)"
>
<div>
<img :src="item.installImage" alt="" />
<span :style="{ backgroundColor: item.online == 1 ? '#008bff' : '#C3C3C3' }">{{
item.online == 1 ? "在线" : "离线"
}}</span>
</div>
<span>{{ item.devName }}</span>
</div>
</div>
</div>
<div class="no-data" v-else>
<img src="@/assets/images/notData.png" alt="notData" />
<div>暂无数据</div>
</div>
<div class="history-data">
<LeftMenuPlus
v-model="active"
:tabs="['历史报警', '历史监测信息']"
:pageable="pages"
class="LeftMenu"
@change-page="onCurChange"
>
<template #default>
<div class="search-wrapper">
<el-date-picker
style="margin-right: 5px"
v-model="searchForm.timeRange"
type="daterange"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
<el-button class="search-btn" type="primary" @click="search">查询</el-button>
</div>
<div class="alarm-list" v-if="active == 0">
<div class="alarm-list-item" v-for="(item, index) in alarmList" :key="index">
<div>
<span>设备名称: </span>
<span>{{ item.devName }}</span>
</div>
<div>
<span>设备编号: </span>
<span style="color: #0f64da">{{ item.devNumber }}</span>
</div>
<div>
<span>报警项目: </span>
<span>{{ alarmTransform(item) }}</span>
</div>
<div>
<span>报警时间: </span>
<span>{{ item.createTime }}</span>
</div>
</div>
</div>
<div class="info-list" v-if="active == 1">
<div class="info-list-item" v-for="(item, index) in monitorList" :key="index">
<div>{{ item.devName }}</div>
<div class="info-list-item-aspect">
<div class="info-list-item-aspect-item">
<span>角度</span>
<span>{{ item.angle ? item.angle : 0 }}°</span>
</div>
<div class="info-list-item-aspect-item">
<span>倾角</span>
<span>{{ item.obliquity ? item.obliquity : 0 }}°</span>
</div>
</div>
<div class="info-list-item-aspect">
<div class="info-list-item-aspect-item">
<span>高度</span>
<span>{{ item.height ? item.height : 0 }}m</span>
</div>
<div class="info-list-item-aspect-item">
<span>倾角X</span>
<span>{{ item.obliquityX ? item.obliquityX : 0 }}°</span>
</div>
</div>
<div class="info-list-item-aspect">
<div class="info-list-item-aspect-item">
<span>载重比</span>
<span>{{ item.loadRatio ? item.loadRatio : 0 }}%</span>
</div>
<div class="info-list-item-aspect-item">
<span>倾角Y</span>
<span>{{ item.obliquityY ? item.obliquityY : 0 }}°</span>
</div>
</div>
<div class="info-list-item-aspect">
<div class="info-list-item-aspect-item">
<span>载重</span>
<span>{{ item.loading ? item.loading : 0 }}kg</span>
</div>
<div class="info-list-item-aspect-item">
<span>幅度</span>
<span>{{ item.ranger ? item.ranger : 0 }}m</span>
</div>
</div>
<div>监测时间: {{ item.createTime ? item.createTime : "" }}</div>
</div>
</div>
</template>
</LeftMenuPlus>
</div>
<!-- 侧边栏选择 -->
<engineeringEngDrawer v-model="engVisable" ref="engDrawer" :engList="engList">
<template #default="{ data }">
<span style="margin-left: 10px" @click="onUpdate(data)">{{ data.engineeringName }}</span>
</template>
</engineeringEngDrawer>
<allEngineering @click="engVisable = true" />
</div>
</template>
<script setup lang="tsx" name="ProjectSupervisionRecord">
import { ref, onMounted, watch } from "vue";
import { ElMessage } from "element-plus";
import { getRelevanceList } from "@/api/modules/common";
import engineeringEngDrawer from "@/components/engineeringEngDrawer/index.vue";
import allEngineering from "@/components/allEngineering/index.vue";
import { towerCraneEquipAll, operationData, towerCraneAlarmPage, towerCraneDataPage } from "@/api/modules/enterpriseApi";
import LeftMenuPlus from "@/components/LeftMenuPlus/LeftMenu.vue";
const equipActive = ref(0);
const monitorList = ref([]);
const alarmList = ref([]);
const equipList = ref([]);
const equipInfo = ref({});
const searchForm = ref({
timeRange: []
});
const active = ref(0);
const pages = ref({
pageNo: 1,
pageSize: 6,
total: 0
});
const aspectList = ref([
{
name: "力矩",
value: 10,
unit: "N·M",
img: new URL("@/assets/images/onlineSupervision/力矩.png", import.meta.url).href,
prop: "torque"
},
{
name: "载重",
value: 10,
unit: "T",
img: new URL("@/assets/images/onlineSupervision/载重.png", import.meta.url).href,
prop: "loading"
},
{
name: "风速",
value: 10,
unit: "m/s",
img: new URL("@/assets/images/onlineSupervision/风速.png", import.meta.url).href,
prop: "windSpeed"
},
{
name: "高度",
value: 10,
unit: "m",
img: new URL("@/assets/images/onlineSupervision/高度.png", import.meta.url).href,
prop: "height"
},
{
name: "回转角度",
value: 10,
unit: "°",
img: new URL("@/assets/images/onlineSupervision/回转角度.png", import.meta.url).href,
prop: "angle"
},
{
name: "塔身倾角",
value: 10,
unit: "°",
img: new URL("@/assets/images/onlineSupervision/塔身倾角.png", import.meta.url).href,
prop: "obliquity"
},
{
name: "幅度",
value: 10,
unit: "m",
img: new URL("@/assets/images/onlineSupervision/幅度.png", import.meta.url).href,
prop: "ranger"
}
]);
const engList = ref([]);
const engVisable = ref(false);
const searchSn = ref("");
// ProTable 便
const proTable = ref();
//
const alarmTransform = (obj: any) => {
let str = "";
if (obj["environmentAlarm"] == 1) str += "环境防碰撞报警,";
if (obj["forceAlarm"] == 1) str += "力矩报警,";
if (obj["heightLowerAlarm"] == 1) str += "高度下限位报警,";
if (obj["heightUpperAlarm"] == 1) str += "高度上限位报警,";
if (obj["maxRangeAlarm"] == 1) str += "幅度外限位报警,";
if (obj["minRangeAlarm"] == 1) str += "幅度内限位报警,";
if (obj["multiAntiCollisionAlarm"] == 1) str += "多机防撞报警,";
if (obj["negAngleAlarm"] == 1) str += "逆时针回转限位报警,";
if (obj["obliquityAlarm"] == 1) str += "倾角报警,";
if (obj["posAngleAlarm"] == 1) str += "顺时针回转限位报警,";
if (obj["standardHighAlarm"] == 1) str += "塔机间竖向高度报警,";
if (obj["windSpeedAlarm"] == 1) str += "风速报警";
return str;
};
//
const getMonitorList = async () => {
let requestData = {
pageNo: pages.value.pageNo,
pageSize: pages.value.pageSize
} as any;
requestData.engineeringSn = searchSn.value;
if (searchForm.value.timeRange && searchForm.value.timeRange.length > 0) {
requestData.createTime_begin = searchForm.value.timeRange[0];
requestData.createTime_end = searchForm.value.timeRange[1];
}
const res = await towerCraneDataPage(requestData);
console.log(res);
if (res && res.result && res.result.records.length > 0) {
monitorList.value = res.result.records;
pages.value.total = +res.result.total;
} else {
monitorList.value = [];
pages.value.total = 0;
}
};
//
const getAlarmList = async () => {
let requestData = {
pageNo: pages.value.pageNo,
pageSize: pages.value.pageSize
} as any;
requestData.engineeringSn = searchSn.value;
if (searchForm.value.timeRange && searchForm.value.timeRange.length > 0) {
requestData.createTime_begin = searchForm.value.timeRange[0];
requestData.createTime_end = searchForm.value.timeRange[1];
}
const res = await towerCraneAlarmPage(requestData);
console.log(res);
if (res && res.result && res.result.records.length > 0) {
alarmList.value = res.result.records;
pages.value.total = +res.result.total;
} else {
alarmList.value = [];
pages.value.total = 0;
}
};
//
const getEquipList = async () => {
let requestData = {} as any;
requestData.engineeringSn = searchSn.value;
const res = await towerCraneEquipAll(requestData);
console.log(res);
if (res && res.result && res.result.length > 0) {
equipList.value = res.result;
getEquipInfo(res.result[0]);
} else {
equipList.value = [];
}
};
//
const getEquipInfo = async (obj: any) => {
let requestData = {
id: obj.id
};
const res = await operationData(requestData);
console.log(res);
if (res && res.result) {
equipInfo.value = { ...obj, ...res.result };
} else {
equipInfo.value = { ...obj };
}
};
//
const search = () => {
console.log(666);
if (active.value === 0) {
getAlarmList();
} else {
getMonitorList();
}
};
//
const onCurChange = async (params: number) => {
console.log(params);
pages.value.pageNo = params;
if (active.value === 0) {
getAlarmList();
} else {
getMonitorList();
}
};
const getengineering = async () => {
// let newParams = JSON.parse(JSON.stringify(params));
const res = await getRelevanceList();
engList.value = res.result;
if (res.result && res.result.length > 0) {
searchSn.value = res.result[0].engineeringSn;
}
getEquipList();
console.log(res);
};
//
const onUpdate = async row => {
searchSn.value = row.engineeringSn;
getEquipList();
if (active.value === 0) {
getAlarmList();
} else {
getMonitorList();
}
ElMessage.success("页面已更新");
};
watch(
() => active.value,
n => {
searchForm.value.timeRange = [];
if (n === 0) {
getAlarmList();
} else {
getMonitorList();
}
}
);
onMounted(async () => {
await getengineering();
});
</script>
<style scoped lang="scss">
@import "./index.scss";
</style>

View File

@ -40,6 +40,8 @@
}
img {
margin: 0 4px;
width: 12px;
height: 12px;
}
}
.bottom_item {
@ -175,6 +177,9 @@
margin-left: 36px;
margin-bottom: 16px;
@include flex;
.monitor-state:not(:last-child) {
margin-right: 26px;
}
.monitor-state {
@include flex;
flex-direction: column;
@ -206,13 +211,34 @@
color: #000000;
}
}
.active-class {
box-shadow: 0px 4px 8px 0px rgba(48, 62, 100, 0.2);
}
}
}
.no-data {
@include boxStyle;
flex: 1;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
color: #999;
}
.history-data {
@include boxStyle;
width: 300px;
height: 100%;
margin-left: 20px;
:deep() {
.leftMenu {
height: 100%;
}
.content {
height: calc(100% - 100px);
}
}
.search-wrapper {
@include flex;
height: 50px;
@ -221,6 +247,9 @@
border-bottom: 1px solid #e5e5e5;
}
.alarm-list {
height: calc(100% - 50px);
min-height: 83%;
overflow-y: scroll;
&-item {
display: flex;
flex-direction: column;
@ -240,6 +269,9 @@
}
}
.info-list {
height: calc(100% - 50px);
min-height: 83%;
overflow-y: scroll;
&-item {
display: flex;
flex-direction: column;

View File

@ -17,8 +17,8 @@
<span class="projectName">{{ data.projectName || data.engineeringName }}</span>
<div class="leftMenu_item flx-justify-between">
<div class="flx-justify-between">
<img src="@/assets/images/AIwaring/视频.png" alt="" />
<span class="middleSize">接入视频路{{ data.deviceNum }}</span>
<img src="@/assets/images/AIwaring/塔吊.png" alt="" />
<span class="middleSize">接入塔吊总{{ data.deviceNum ? data.deviceNum : 0 }}</span>
</div>
<div>
<img src="@/assets/images/AIwaring/报警.png" alt="" />
@ -44,22 +44,24 @@
</template>
</LeftMenu>
</div>
<div class="monitor-data">
<div class="monitor-data" v-if="equipList.length > 0">
<div class="monitor-title">
<span>十字门小学</span>
<span>在线</span>
<span>{{ equipInfo.devName }}</span>
<span :style="{ color: equipInfo.online == 1 ? '#0f64da' : '#C3C3C3' }">{{
equipInfo.online == 1 ? "在线" : "离线"
}}</span>
</div>
<div class="monitor-content">
<div class="monitor-tool">
<img src="@/assets/images/onlineSupervision/towerImg.png" alt="" />
<span class="property-one">尾臂长: 1.4m</span>
<span class="property-two">臂长: 5m</span>
<span class="property-three">塔身高: 7m</span>
<span class="property-one">尾臂长: {{ equipInfo.posteriorArmLength ? equipInfo.posteriorArmLength : 0 }}m</span>
<span class="property-two">臂长: {{ equipInfo.forearmLength ? equipInfo.forearmLength : 0 }}m</span>
<span class="property-three">塔身高: {{ equipInfo.towerHeight ? equipInfo.towerHeight : 0 }}m</span>
<div class="other-info">
<span>备案编号: TD2374693</span>
<span>安装日期: 2022-12-01</span>
<span>终端编号: TD2374693</span>
<span>更新时间: 2023-05-23</span>
<span>设备编号: {{ equipInfo.devNumber ? equipInfo.devNumber : "" }}</span>
<span>安装日期: {{ equipInfo.installTime ? equipInfo.installTime : "" }}</span>
<!-- <span>终端编号: TD2374693</span> -->
<span>更新时间: {{ equipInfo.realTime ? equipInfo.realTime : "" }}</span>
</div>
</div>
<div class="monitor-aspect">
@ -69,22 +71,34 @@
<img :src="item.img" alt="" srcset="" />
</div>
<div>
<span>{{ item.value }}</span>
<span>{{ equipInfo[item.prop] ? equipInfo[item.prop] : 0 }}</span>
<span>{{ item.unit }}</span>
</div>
</div>
</div>
</div>
<div class="monitor-equip">
<div class="monitor-state">
<div
:class="equipActive == index ? 'active-class' : ''"
class="monitor-state"
v-for="(item, index) in equipList"
:key="index"
@click="getEquipInfo(item)"
>
<div>
<img src="@/assets/images/login_left.png" alt="" />
<span>在线</span>
<img :src="item.installImage" alt="" />
<span :style="{ backgroundColor: item.online == 1 ? '#008bff' : '#C3C3C3' }">{{
item.online == 1 ? "在线" : "离线"
}}</span>
</div>
<span>1号塔吊</span>
<span>{{ item.devName }}</span>
</div>
</div>
</div>
<div class="no-data" v-else>
<img src="@/assets/images/notData.png" alt="notData" />
<div>暂无数据</div>
</div>
<div class="history-data">
<LeftMenuPlus
v-model="active"
@ -99,6 +113,8 @@
style="margin-right: 5px"
v-model="searchForm.timeRange"
type="daterange"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
@ -106,83 +122,74 @@
<el-button class="search-btn" type="primary" @click="search">查询</el-button>
</div>
<div class="alarm-list" v-if="active == 0">
<div class="alarm-list-item">
<div class="alarm-list-item" v-for="(item, index) in alarmList" :key="index">
<div>
<span>设备名称: </span>
<span>2号塔吊</span>
<span>{{ item.devName }}</span>
</div>
<div>
<span>终端编号: </span>
<span style="color: #0f64da">DEYE20071702</span>
<span>设备编号: </span>
<span style="color: #0f64da">{{ item.devNumber }}</span>
</div>
<div>
<span>报警项目: </span>
<span>幅度限位报警</span>
<span>{{ alarmTransform(item) }}</span>
</div>
<div>
<span>报警时间: </span>
<span>2022-12-23</span>
<span>{{ item.createTime }}</span>
</div>
</div>
</div>
<div class="info-list" v-if="active == 1">
<div class="info-list-item">
<div>2号塔吊</div>
<div class="info-list-item" v-for="(item, index) in monitorList" :key="index">
<div>{{ item.devName }}</div>
<div class="info-list-item-aspect">
<div class="info-list-item-aspect-item">
<span>角度</span>
<span>190.0°</span>
<span>{{ item.angle ? item.angle : 0 }}°</span>
</div>
<div class="info-list-item-aspect-item">
<span>倾角</span>
<span>120.0°</span>
<span>{{ item.obliquity ? item.obliquity : 0 }}°</span>
</div>
</div>
<div class="info-list-item-aspect">
<div class="info-list-item-aspect-item">
<span>高度</span>
<span>96.35m</span>
<span>{{ item.height ? item.height : 0 }}m</span>
</div>
<div class="info-list-item-aspect-item">
<span>倾角X</span>
<span>120.0°</span>
<span>{{ item.obliquityX ? item.obliquityX : 0 }}°</span>
</div>
</div>
<div class="info-list-item-aspect">
<div class="info-list-item-aspect-item">
<span>载重比</span>
<span>1.57%</span>
<span>{{ item.loadRatio ? item.loadRatio : 0 }}%</span>
</div>
<div class="info-list-item-aspect-item">
<span>倾角Y</span>
<span>120.0°</span>
<span>{{ item.obliquityY ? item.obliquityY : 0 }}°</span>
</div>
</div>
<div class="info-list-item-aspect">
<div class="info-list-item-aspect-item">
<span>载重</span>
<span>70.0kg</span>
<span>{{ item.loading ? item.loading : 0 }}kg</span>
</div>
<div class="info-list-item-aspect-item">
<span>幅度</span>
<span>51.67m</span>
<span>{{ item.ranger ? item.ranger : 0 }}m</span>
</div>
</div>
<div>监测时间: 2023-05-23</div>
<div>监测时间: {{ item.createTime ? item.createTime : "" }}</div>
</div>
</div>
</template>
</LeftMenuPlus>
</div>
<!-- 侧边栏选择 -->
<engineeringEngDrawer v-model="engVisable" :active="activeValue" ref="engDrawer" :engList="engList" @select="tabsSelect">
<template #default="{ data }">
<span style="margin-left: 10px" @click="onUpdate(data)">{{
activeValue == "eng" ? data.engineeringName : data.projectName
}}</span>
</template>
</engineeringEngDrawer>
<allEngineering @click="engVisable = true" />
</div>
</div>
</template>
@ -191,14 +198,26 @@
import { ref, onMounted, watch } from "vue";
import { ElMessage } from "element-plus";
import { getRelevanceList } from "@/api/modules/common";
import engineeringEngDrawer from "@/components/engineeringEngDrawer/index.vue";
import allEngineering from "@/components/allEngineering/index.vue";
import { getEngineeringName } from "@/api/modules/project";
import LeftMenuPlus from "@/components/LeftMenuPlus/LeftMenu.vue";
import layoutTop from "@/components/layoutTop/index.vue";
import LeftMenu from "@/components/LeftMenu/LeftMenu.vue";
import {
getRealTimepPojectPage,
getRealTimeEngineeringPage,
towerCraneAlarmPage,
towerCraneDataPage,
towerCraneEquipAll,
operationData
} from "@/api/modules/goverment";
const monitorList = ref([]);
const alarmList = ref([]);
const equipList = ref([]);
const equipInfo = ref({});
const records = ref([]);
const alarmActive = ref(0);
const leftMenuSearchForm = ref({
name: ""
});
const searchForm = ref({
timeRange: []
});
@ -219,144 +238,248 @@ const aspectList = ref([
value: 10,
unit: "N·M",
img: new URL("@/assets/images/onlineSupervision/力矩.png", import.meta.url).href,
prop: "inServiceWorker"
prop: "torque"
},
{
name: "载重",
value: 10,
unit: "T",
img: new URL("@/assets/images/onlineSupervision/载重.png", import.meta.url).href,
prop: "workerAttendanceTotal"
prop: "loading"
},
{
name: "风速",
value: 10,
unit: "m/s",
img: new URL("@/assets/images/onlineSupervision/风速.png", import.meta.url).href,
prop: "workerAttendanceTotal"
prop: "windSpeed"
},
{
name: "高度",
value: 10,
unit: "m",
img: new URL("@/assets/images/onlineSupervision/高度.png", import.meta.url).href,
prop: "workerAttendanceTotal"
prop: "height"
},
{
name: "回转角度",
value: 10,
unit: "°",
img: new URL("@/assets/images/onlineSupervision/回转角度.png", import.meta.url).href,
prop: "workerAttendanceTotal"
prop: "angle"
},
{
name: "塔身倾角",
value: 10,
unit: "°",
img: new URL("@/assets/images/onlineSupervision/塔身倾角.png", import.meta.url).href,
prop: "workerAttendanceTotal"
prop: "obliquity"
},
{
name: "幅度",
value: 10,
unit: "m",
img: new URL("@/assets/images/onlineSupervision/幅度.png", import.meta.url).href,
prop: "workerAttendanceTotal"
prop: "ranger"
}
]);
const activeValue = ref("eng");
const engList = ref([]);
const engVisable = ref(false);
const searchSn = ref("");
// ProTable 便
const proTable = ref();
// showicon
//
const alarmTransform = (obj: any) => {
let str = "";
if (obj["environmentAlarm"] == 1) str += "环境防碰撞报警,";
if (obj["forceAlarm"] == 1) str += "力矩报警,";
if (obj["heightLowerAlarm"] == 1) str += "高度下限位报警,";
if (obj["heightUpperAlarm"] == 1) str += "高度上限位报警,";
if (obj["maxRangeAlarm"] == 1) str += "幅度外限位报警,";
if (obj["minRangeAlarm"] == 1) str += "幅度内限位报警,";
if (obj["multiAntiCollisionAlarm"] == 1) str += "多机防撞报警,";
if (obj["negAngleAlarm"] == 1) str += "逆时针回转限位报警,";
if (obj["obliquityAlarm"] == 1) str += "倾角报警,";
if (obj["posAngleAlarm"] == 1) str += "顺时针回转限位报警,";
if (obj["standardHighAlarm"] == 1) str += "塔机间竖向高度报警,";
if (obj["windSpeedAlarm"] == 1) str += "风速报警";
return str;
};
//
const getEquipList = async () => {
let requestData = {} as any;
if (alarmActive.value == 0) {
requestData.projectSn = searchSn.value;
} else {
requestData.engineeringSn = searchSn.value;
}
const res = await towerCraneEquipAll(requestData);
console.log(res);
if (res && res.result && res.result.length > 0) {
equipList.value = res.result;
getEquipInfo(res.result[0]);
} else {
equipInfo.value = {};
equipList.value = [];
}
};
//
const getEquipInfo = async (obj: any) => {
let requestData = {
id: obj.id
};
const res = await operationData(requestData);
console.log(res);
if (res && res.result) {
equipInfo.value = { ...obj, ...res.result };
} else {
equipInfo.value = { ...obj };
}
};
//
const getMonitorList = async () => {
let requestData = {
pageNo: pages.value.pageNo,
pageSize: pages.value.pageSize
} as any;
if (alarmActive.value == 0) {
requestData.projectSn = searchSn.value;
} else {
requestData.engineeringSn = searchSn.value;
}
if (searchForm.value.timeRange && searchForm.value.timeRange.length > 0) {
requestData.createTime_begin = searchForm.value.timeRange[0];
requestData.createTime_end = searchForm.value.timeRange[1];
}
const res = await towerCraneDataPage(requestData);
console.log(res);
if (res && res.result && res.result.records.length > 0) {
monitorList.value = res.result.records;
pages.value.total = +res.result.total;
} else {
monitorList.value = [];
pages.value.total = 0;
}
};
//
const getAlarmList = async () => {
let requestData = {
pageNo: pages.value.pageNo,
pageSize: pages.value.pageSize
} as any;
if (alarmActive.value == 0) {
requestData.projectSn = searchSn.value;
} else {
requestData.engineeringSn = searchSn.value;
}
if (searchForm.value.timeRange && searchForm.value.timeRange.length > 0) {
requestData.createTime_begin = searchForm.value.timeRange[0];
requestData.createTime_end = searchForm.value.timeRange[1];
}
const res = await towerCraneAlarmPage(requestData);
console.log(res);
if (res && res.result && res.result.records.length > 0) {
alarmList.value = res.result.records;
pages.value.total = +res.result.total;
} else {
alarmList.value = [];
pages.value.total = 0;
}
};
function parse(val) {
return val.trim() ? JSON.parse(val) : {};
}
// div
const onSearch = async (params: any) => {
//
// const curr = monitorList.value.find(item =>
// active.value === 0 ? item.projectSn === params.projectSn : item.engineeringSn === params.engineeringSn
// );
// //
// monitorList.value = monitorList.value.map(item => (item === curr ? { ...curr, showGif: true } : { ...item, showGif: false }));
// params.longitude !== "" && params.longitude !== null
// ? map.value?.setCenter([params.longitude, +params.latitude])
// : map.value?.setCenter([116.481181, 39.90923]);
console.log(params);
active.value === 0 ? (searchSn.value = params.projectSn) : (searchSn.value = params.engineeringSn);
getEquipList();
if (active.value === 0) {
getAlarmList();
} else {
getMonitorList();
}
};
//
// leftMenu
const onSearchInput = async (params: string) => {
// if (active.value === 0) {
// const { result } = await getAIprojectPage({ projectName: params, ...pages.value });
// records.value = result.records;
// } else {
// const { result } = await getAIengineeringPage({ engineeringName: params, ...pages.value });
// records.value = result.records;
// }
leftMenuSearchForm.value.name = params;
if (active.value === 0) {
getProPage();
} else {
getEngPage();
}
};
// leftMenu
const onCurChange = async (params: number) => {
alarmPages.value.pageSize = params;
if (active.value === 0) {
getProPage();
} else {
getEngPage();
}
};
//
const search = () => {
console.log(666);
};
//
const onCurChange = async (params: number) => {
console.log(params);
// if (active.value === 0) {
// pages.value.total = +result.total;
// } else {
// pages.value.total = +result.total;
// }
};
// tab
const tabsSelect = val => {
activeValue.value = val;
if (val == "eng") {
getengineering();
} else if (val == "project") {
getProject();
if (active.value === 0) {
getAlarmList();
} else {
getMonitorList();
}
};
//
const getProject = async () => {
const res = await getEngineeringName();
engList.value = [res.result];
if (res.result) {
searchSn.value = res.result.projectSn;
}
// proTable.value.getTableList();
console.log(res);
//
const getProPage = async () => {
let requestData = {
...pages.value,
projectName: leftMenuSearchForm.value.name
};
const { result } = await getRealTimepPojectPage(requestData);
records.value = result.records;
pages.value.total = Number(result.total);
};
const getengineering = async () => {
// let newParams = JSON.parse(JSON.stringify(params));
const res = await getRelevanceList();
engList.value = res.result;
if (res.result && res.result.length > 0) {
searchSn.value = res.result[0].engineeringSn;
}
// proTable.value.getTableList();
console.log(res);
};
//
const onUpdate = async row => {
if (activeValue.value == "eng") {
searchSn.value = row.engineeringSn;
} else if (activeValue.value == "project") {
searchSn.value = row.projectSn;
}
// proTable.value.getTableList();
ElMessage.success("页面已更新");
//
const getEngPage = async () => {
let requestData = {
...pages.value,
engineeringName: leftMenuSearchForm.value.name
};
const { result } = await getRealTimeEngineeringPage(requestData);
records.value = result.records;
pages.value.total = +result.total;
};
watch(
() => active.value,
() => {
n => {
searchForm.value.timeRange = [];
if (n === 0) {
getAlarmList();
} else {
getMonitorList();
}
}
);
onMounted(() => {
getengineering();
watch(
() => alarmActive.value,
async (value: number) => {
pages.value.pageNo = 1;
pages.value.total = 0;
leftMenuSearchForm.value.name = "";
if (value === 0) {
await getProPage();
onSearch(records.value[0]);
} else {
await getEngPage();
onSearch(records.value[0]);
}
},
{
deep: true
}
);
onMounted(async () => {
await getProPage();
onSearch(records.value[0]);
searchSn.value = (records.value as any)[0].projectSn;
});
</script>
<style scoped lang="scss">

View File

@ -4,3 +4,32 @@
align-items: center;
justify-content: space-between;
}
.basic-form {
.face-img {
width: 100%;
align-self: flex-start;
:deep(.face-uploader .el-upload) {
border: 1px dashed #d9d9d9 !important;
border-radius: 6px !important;
cursor: pointer !important;
position: relative !important;
overflow: hidden !important;
}
.face-uploader .el-upload:hover {
border-color: #409eff !important;
}
:deep(.el-icon) {
font-size: 28px;
color: #8c939d;
width: 53px;
height: 53px;
line-height: 53px;
text-align: center;
}
.face-avatar {
width: 53px;
height: 53px;
display: block;
}
}
}

View File

@ -36,34 +36,38 @@
<!-- <el-form ref="formDataRef" :model="formData" label-width="150px" class="basic-form"> -->
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="设备名称:" prop="type">
<el-input v-model="formData.type" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="设备名称:" prop="devName">
<el-input v-model="formData.devName" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="安装日期:" prop="companyName">
<el-form-item label="安装日期:" prop="installTime">
<el-date-picker
:disabled="title == '查看参建单位'"
:disabled="title == '查看设备'"
style="width: 100%"
v-model="formData.registrationDate"
v-model="formData.installTime"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="datetime"
placeholder="请选择时间"
:disabledDate="disabledDate"
type="date"
placeholder="请选择"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="黑匣子信息:" prop="creditCode">
<el-input v-model="formData.creditCode" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="黑匣子信息:" prop="blackBox">
<el-input v-model="formData.blackBox" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设备类型:" prop="address">
<el-select v-model="formData.address" placeholder="请选择" style="width: 100%">
<el-form-item label="结构类型:" prop="structureType">
<el-select
v-model="formData.structureType"
:disabled="title == '查看设备'"
placeholder="请选择"
style="width: 100%"
>
<el-option v-for="item in typeList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</el-form-item>
@ -72,199 +76,231 @@
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="设备使用状态:" prop="registrationDate">
<el-select v-model="formData.address" placeholder="请选择" style="width: 100%">
<el-option v-for="item in typeList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
<el-form-item label="设备使用状态:" prop="useState">
<el-select v-model="formData.useState" :disabled="title == '查看设备'" placeholder="请选择" style="width: 100%">
<el-option v-for="item in stateList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="编号性质:" prop="registrationDate">
<el-select v-model="formData.address" placeholder="请选择" style="width: 100%">
<el-option v-for="item in typeList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
<el-form-item label="设备图片:" prop="installImage">
<div class="face-img">
<el-upload
class="face-uploader"
:action="`${baseUrl}` + '/xmgl/file/upload'"
:show-file-list="false"
:on-success="(response, uploadFile) => handleAvatarSuccess(response, uploadFile)"
accept="image/jpg, image/jpeg, image/png"
>
<img v-if="formData.installImage" :src="formData.installImage" class="face-avatar" />
<el-icon v-else><plus /></el-icon>
</el-upload>
</div>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="是否外地设备:" prop="leadName">
<el-radio-group placeholder="请选择" v-model="formData.leadName">
<el-form-item label="是否外地设备:" prop="isForeignDev">
<el-radio-group placeholder="请选择" v-model="formData.isForeignDev">
<el-radio :label="1"></el-radio>
<el-radio :label="2"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否全新设备:" prop="leadTel">
<el-radio-group placeholder="请选择" v-model="formData.leadName">
<el-form-item label="是否全新设备:" prop="isNewDev">
<el-radio-group placeholder="请选择" v-model="formData.isNewDev">
<el-radio :label="1"></el-radio>
<el-radio :label="2"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="规格型号:" prop="salaryManager">
<el-input v-model.number="formData.salaryManager" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="规格型号:" prop="model">
<el-input v-model="formData.model" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="许可证发证机关:" prop="salaryManagerCard">
<el-input v-model.number="formData.salaryManagerCard" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="许可证发证机关:" prop="licensingAuthority">
<el-input v-model="formData.licensingAuthority" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="出厂(合格证):" prop="salaryManagerTel">
<el-input v-model.number="formData.salaryManagerTel" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="出厂(合格证):" prop="factoryCertificate">
<el-input v-model="formData.factoryCertificate" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工作幅度(m ):" prop="legalPerson">
<el-input v-model.number="formData.legalPerson" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="工作幅度(m):" prop="workingRange">
<el-input v-model.number="formData.workingRange" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="最大额定起重量(kg):" prop="legalPersonCard">
<el-input v-model.number="formData.legalPersonCard" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="最大额定起重量(kg):" prop="maxLiftingCapacity">
<el-input v-model.number="formData.maxLiftingCapacity" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="独立起升高度(m):" prop="legalPersonTel">
<el-input v-model.number="formData.legalPersonTel" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="独立起升高度(m):" prop="independentLiftingHeight">
<el-input v-model.number="formData.independentLiftingHeight" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="购置日期:" prop="registeredCapital">
<el-form-item label="购置日期:" prop="acquisitionDate">
<el-date-picker
:disabled="title == '查看参建单位'"
:disabled="title == '查看设备'"
style="width: 100%"
v-model="formData.registeredCapital"
v-model="formData.acquisitionDate"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="datetime"
type="date"
placeholder="请选择时间"
:disabledDate="disabledDate"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="编号有效期:" prop="email">
<el-form-item label="编号有效期:" prop="numberValidityPeriod">
<el-date-picker
:disabled="title == '查看参建单位'"
:disabled="title == '查看设备'"
style="width: 100%"
v-model="formData.email"
v-model="formData.numberValidityPeriod"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="datetime"
type="date"
placeholder="请选择时间"
:disabledDate="disabledDate"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="设备原值:" prop="entryTime">
<el-input v-model.number="formData.entryTime" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="设备原值:" prop="originalValue">
<el-input v-model.number="formData.originalValue" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设备改造次数:" prop="entryTime">
<el-input v-model.number="formData.entryTime" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="设备改造次数:" prop="renovations">
<el-input v-model.number="formData.renovations" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="发票编码:" prop="entryTime">
<el-input v-model.number="formData.entryTime" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="发票编码:" prop="invoiceCode">
<el-input v-model="formData.invoiceCode" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="购买合同编码:" prop="entryTime">
<el-input v-model.number="formData.entryTime" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="购买合同编码:" prop="contractCode">
<el-input v-model="formData.contractCode" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="生产厂家:" prop="entryTime">
<el-input v-model.number="formData.entryTime" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="生产厂家:" prop="manufacturer">
<el-input v-model="formData.manufacturer" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="出厂日期:" prop="entryTime">
<el-input v-model.number="formData.entryTime" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="出厂日期:" prop="productionDate">
<el-date-picker
:disabled="title == '查看设备'"
style="width: 100%"
v-model="formData.productionDate"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="date"
placeholder="请选择时间"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="制造许可证编号:" prop="entryTime">
<el-input v-model.number="formData.entryTime" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="制造许可证编号:" prop="manufacturerLicense">
<el-input v-model="formData.manufacturerLicense" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否为原购产品:" prop="leadTel">
<el-radio-group placeholder="请选择" v-model="formData.leadName">
<el-form-item label="是否为原购产品:" prop="isOriginalProduct">
<el-radio-group placeholder="请选择" v-model="formData.isOriginalProduct">
<el-radio :label="1"></el-radio>
<el-radio :label="2"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="设备用途:" prop="entryTime">
<el-input v-model.number="formData.entryTime" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="设备用途:" prop="useTo">
<el-input v-model="formData.useTo" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="前臂永久性标识:" prop="entryTime">
<el-input v-model.number="formData.entryTime" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="前臂长:" prop="forearmLength">
<el-input v-model.number="formData.forearmLength" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="后臂永久性标识:" prop="entryTime">
<el-input v-model.number="formData.entryTime" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="后臂长:" prop="posteriorArmLength">
<el-input v-model.number="formData.posteriorArmLength" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="塔帽永久性标识:" prop="entryTime">
<el-input v-model.number="formData.entryTime" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="塔身高度:" prop="towerHeight">
<el-input v-model.number="formData.towerHeight" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="上转台永久性标识:" prop="entryTime">
<el-input v-model.number="formData.entryTime" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="前臂永久性标识:" prop="forearmFlag">
<el-input v-model="formData.forearmFlag" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="下转台永久性标识:" prop="entryTime">
<el-input v-model.number="formData.entryTime" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="后臂永久性标识:" prop="rearArmFlag">
<el-input v-model="formData.rearArmFlag" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="标准节点永久性标识:" prop="entryTime">
<el-input v-model.number="formData.entryTime" placeholder="请输入" :disabled="title == '查看参建单位'" />
<el-form-item label="塔帽永久性标识:" prop="towerCapFlag">
<el-input v-model="formData.towerCapFlag" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="上转台永久性标识:" prop="upwardTurntableFlag">
<el-input v-model="formData.upwardTurntableFlag" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<footer class="footer flx-center" v-if="title == '新增参建单位'">
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="下转台永久性标识:" prop="lowerTurntableFlag">
<el-input v-model="formData.lowerTurntableFlag" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="标准节点永久性标识:" prop="mastSectionFlag">
<el-input v-model="formData.mastSectionFlag" placeholder="请输入" :disabled="title == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<footer class="footer flx-center" v-if="title != '查看设备'">
<el-button class="cancelButtonStyle" @click="newUnitDialog = false">取消</el-button>
<el-button type="primary" @click="submitForm(formData)">保存</el-button>
</footer>
@ -285,6 +321,7 @@
<script setup lang="tsx" name="ProjectSupervisionRecord">
import { ref, reactive, nextTick, onMounted } from "vue";
import { ElMessage, ElMessageBox, ElTree, FormInstance } from "element-plus";
import type { UploadProps } from "element-plus";
import { useRouter } from "vue-router";
import { ColumnProps } from "@/components/ProTable/interface";
import { useHandleData } from "@/hooks/useHandleData";
@ -293,10 +330,29 @@ import { jxj_User } from "@/api/types";
import { getRelevanceList } from "@/api/modules/common";
import engineeringEngDrawer from "@/components/engineeringEngDrawer/index.vue";
import allEngineering from "@/components/allEngineering/index.vue";
import { addBuildUnit, getBuildUnitList, getEngineeringName } from "@/api/modules/project";
import {
towerCraneEquipAdd,
towerCraneEquipEdit,
towerCraneEquipDel,
towerCraneEquipPage,
getEngineeringName
} from "@/api/modules/project";
import { GlobalStore } from "@/stores";
import { Delete } from "@element-plus/icons-vue";
const typeList = ref([{ label: "高级设备", value: 1 }]);
const baseUrl = import.meta.env.VITE_API_URL;
const typeList = ref([
{ label: "尖头塔", value: 1 },
{ label: "平头塔", value: 2 },
{ label: "动臂塔", value: 3 }
]);
const stateList = ref([
{ label: "设备进场", value: 1 },
{ label: "设备安装", value: 2 },
{ label: "设备验收", value: 3 },
{ label: "设备使用", value: 4 },
{ label: "设备拆除", value: 5 },
{ label: "设备退场", value: 6 }
]);
const activeValue = ref("eng");
const engList = ref([]);
const engVisable = ref(false);
@ -311,27 +367,43 @@ const title = ref("");
const newUnitDialog = ref(false);
// ProTable()
const initParam = reactive({
solveFlag: 1,
engineeringSn: ""
});
const formData = ref({
type: "",
companyName: "",
creditCode: "",
address: "",
registrationDate: "",
leadName: "",
leadTel: "",
salaryManager: "",
salaryManagerCard: "",
salaryManagerTel: "",
legalPerson: "",
legalPersonCard: "",
legalPersonTel: "",
registeredCapital: "",
email: "",
entryTime: "",
businessLicenseLifespan: ""
devName: "",
installTime: "",
blackBox: "",
structureType: "",
useState: "",
installImage: "",
isForeignDev: 0,
isNewDev: 0,
model: "",
licensingAuthority: "",
factoryCertificate: "",
workingRange: "",
maxLiftingCapacity: "",
independentLiftingHeight: "",
acquisitionDate: "",
numberValidityPeriod: "",
originalValue: "",
renovations: "",
invoiceCode: "",
contractCode: "",
manufacturer: "",
productionDate: "",
manufacturerLicense: "",
isOriginalProduct: 0,
useTo: "",
forearmLength: "",
posteriorArmLength: "",
towerHeight: "",
forearmFlag: "",
rearArmFlag: "",
towerCapFlag: "",
upwardTurntableFlag: "",
lowerTurntableFlag: "",
mastSectionFlag: ""
});
// ProTable 便
const proTable = ref();
@ -342,120 +414,263 @@ const getId = ref<number | undefined>(undefined);
const columns: ColumnProps[] = [
{ type: "index", label: "序号", width: 80 },
{
prop: "companyName",
label: "单位名称",
prop: "devName",
label: "设备名称",
search: { el: "input" }
},
// prop
{ prop: "type", label: "参建单位类型", search: { el: "input" } },
{ prop: "address", label: "所属区域" },
{ prop: "address", label: "地址" },
{ prop: "leadName", label: "联系人" },
{ prop: "leadTel", label: "联系电话" },
{
prop: "installTime",
label: "安装时间",
search: {
el: "date-picker",
props: {
type: "daterange",
format: "YYYY-MM-DD",
valueFormat: "YYYY-MM-DD"
// defaultTime: defaultTime2
}
}
},
{ prop: "blackBox", label: "黑匣子信息" },
{ prop: "operation", label: "操作", fixed: "right", width: 260 }
];
const rules = ref({
type: [
devName: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
companyName: [
installTime: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
creditCode: [
{
required: true,
message: "请输入",
trigger: "blur"
},
{
pattern: /^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/,
message: "格式错误",
trigger: "blur"
}
],
address: [
blackBox: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
registrationDate: [
structureType: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
leadTel: [
installImage: [
{
pattern: /^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/,
message: "请输入合法手机号",
required: true,
message: "请上传",
trigger: "change"
}
],
salaryManagerTel: [
isForeignDev: [
{
pattern: /^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/,
message: "请输入合法手机号",
required: true,
message: "请选择",
trigger: "change"
}
],
legalPersonTel: [
isNewDev: [
{
pattern: /^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/,
message: "请输入合法手机号",
required: true,
message: "请选择",
trigger: "change"
}
],
registeredCapital: [
model: [
{
pattern: /^[0-9\.]+$/,
message: "请输入整数或小数",
required: true,
message: "请输入",
trigger: "blur"
}
],
email: [
factoryCertificate: [
{
type: "email",
message: "请输入正确的电子邮箱",
required: true,
message: "请输入",
trigger: "blur"
}
],
workingRange: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
maxLiftingCapacity: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
independentLiftingHeight: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
acquisitionDate: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
salaryManagerCard: [
numberValidityPeriod: [
{
pattern: /^[1-9]\d{5}(19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i,
message: "请输入正确的身份证号码",
required: true,
message: "请选择",
trigger: "change"
}
],
legalPersonCard: [
originalValue: [
{
pattern: /^[1-9]\d{5}(19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i,
message: "请输入正确的身份证号码",
required: true,
message: "请输入",
trigger: "blur"
}
],
renovations: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
invoiceCode: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
manufacturer: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
productionDate: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
manufacturerLicense: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
isOriginalProduct: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
useTo: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
forearmLength: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
posteriorArmLength: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
towerHeight: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
forearmFlag: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
rearArmFlag: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
towerCapFlag: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
upwardTurntableFlag: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
lowerTurntableFlag: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
mastSectionFlag: [
{
required: true,
message: "请输入",
trigger: "blur"
}
]
});
//
const handleAvatarSuccess: UploadProps["onSuccess"] = (response, uploadFile) => {
console.log(response.result.url);
console.log(response, uploadFile);
formData.value.installImage = response.result.url;
formRef.value?.validateField("image");
};
//
const handleDeleteItem = async (params: jxj_User.ResUserList) => {
// await useHandleData(deleteAImap, { aiMonitorId: params.aiMonitorId }, `${params.name}`);
await useHandleData(towerCraneEquipDel, { id: params.id }, `删除【${params.devName}`);
proTable.value.getTableList();
};
//
const disabledDate = time => {
let current = new Date().getTime();
return time > current;
};
// dataCallback list && total && pageNum && pageSize
// hooks/useTable.ts
const dataCallback = (data: any) => {
@ -489,10 +704,10 @@ const transfrom = (arr: Array<any>) => {
// ProTable :requestApi="getUserList"
const getTableList = (params: any) => {
let newParams = JSON.parse(JSON.stringify(params));
if (newParams.createTime) {
newParams.createTime_begin = newParams.createTime[0];
newParams.createTime_end = newParams.createTime[1];
delete newParams.createTime;
if (newParams.installTime) {
newParams.installTime_begin = newParams.installTime[0];
newParams.installTime_end = newParams.installTime[1];
delete newParams.installTime;
}
if (searchSn.value) {
if (activeValue.value == "eng") {
@ -503,39 +718,18 @@ const getTableList = (params: any) => {
} else {
return { result: { current: "1", pages: "1", records: [], size: "10", total: "0" } };
}
return getBuildUnitList(newParams);
return towerCraneEquipPage(newParams);
};
//
const handleAddItem = () => {
formRef.value?.clearValidate();
title.value = "新增参建单位";
formData.value = reactive({
type: "",
companyName: "",
creditCode: "",
address: "",
registrationDate: "",
leadName: "",
leadTel: "",
salaryManager: "",
salaryManagerCard: "",
salaryManagerTel: "",
legalPerson: "",
legalPersonCard: "",
legalPersonTel: "",
registeredCapital: "",
email: "",
entryTime: "",
businessLicenseLifespan: ""
});
formRef.value?.resetFields();
title.value = "新增设备";
newUnitDialog.value = true;
};
//
const handleLookItem = (row: any) => {
formRef.value?.clearValidate();
title.value = "查看参建单位";
formRef.value?.resetFields();
title.value = "查看设备";
console.log(row);
formData.value = reactive({ ...row });
changeType.value = formData.value.businessLicenseLifespan ? 1 : 2;
@ -544,7 +738,7 @@ const handleLookItem = (row: any) => {
//
const handleEditItem = (row: any) => {
formRef.value?.clearValidate();
title.value = "查看参建单位";
title.value = "编辑设备";
console.log(row);
formData.value = reactive({ ...row });
changeType.value = formData.value.businessLicenseLifespan ? 1 : 2;
@ -571,18 +765,18 @@ const submitForm = async (data: any) => {
});
};
const saveItem = async (form: any) => {
// if (form.roleId) {
// // console.log(form.dictCode);
// const res = await editRole(form);
// proTable.value.getTableList();
// ElMessage.success("");
// } else {
// }
const res = await addBuildUnit(form);
ElMessage.success("新增成功");
proTable.value.getTableList();
newUnitDialog.value = false;
if (form.id) {
// console.log(form.dictCode);
const res = await towerCraneEquipEdit(form);
proTable.value.getTableList();
ElMessage.success("编辑成功");
newUnitDialog.value = false;
} else {
const res = await towerCraneEquipAdd(form);
proTable.value.getTableList();
ElMessage.success("新增成功");
newUnitDialog.value = false;
}
};
// tab

View File

@ -1,6 +1,11 @@
.date-select {
width: 100%;
@mixin flex {
display: flex;
align-items: center;
justify-content: space-between;
}
.table-data {
@include flex;
> span {
display: inline-block;
width: 50%;
}
}

View File

@ -13,18 +13,96 @@
:initParam="initParam"
:onReset="true"
>
<template #type="{ row }">
<span>sss</span>
<template #equipInfo="{ row }">
<span>设备名称: {{ row.devName }}</span>
<br />
<span>sss</span>
<span>设备编号: {{ row.devNumber }}</span>
<br />
<span>sss</span>
<span>司机姓名: {{ row.driverName }}</span>
<br />
<span>sss</span>
<span>司机身份证号: {{ row.driverIdCard }}</span>
<br />
<span>sss</span>
<span>特种作业号: {{ row.certification }}</span>
</template>
<template #alarmInfo="{ row }">
<div class="table-data">
<span
>环境防撞报警:
<span :style="{ color: row.environmentAlarm == 0 ? '#333' : '#E70000' }">{{
row.environmentAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>高度上限位报警:
<span :style="{ color: row.heightUpperAlarm == 0 ? '#333' : '#E70000' }">{{
row.heightUpperAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<span>sss</span>
<div class="table-data">
<span
>高度下限位报警:
<span :style="{ color: row.heightLowerAlarm == 0 ? '#333' : '#E70000' }">{{
row.heightLowerAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>幅度外限位报警:
<span :style="{ color: row.maxRangeAlarm == 0 ? '#333' : '#E70000' }">{{
row.maxRangeAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>幅度内限位报警:
<span :style="{ color: row.minRangeAlarm == 0 ? '#333' : '#E70000' }">{{
row.minRangeAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>力矩报警:
<span :style="{ color: row.forceAlarm == 0 ? '#333' : '#E70000' }">{{
row.forceAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>多机防撞报警:
<span :style="{ color: row.multiAntiCollisionAlarm == 0 ? '#333' : '#E70000' }">{{
row.multiAntiCollisionAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>逆时针回转限位报警:
<span :style="{ color: row.negAngleAlarm == 0 ? '#333' : '#E70000' }">{{
row.negAngleAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>倾角报警:
<span :style="{ color: row.obliquityAlarm == 0 ? '#333' : '#E70000' }">{{
row.obliquityAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>塔机竖向高度报警:
<span :style="{ color: row.standardHighAlarm == 0 ? '#333' : '#E70000' }">{{
row.standardHighAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span>升降机报警时间: {{ row.createTime }}</span>
</div>
</template>
</ProTable>
<!-- 侧边栏选择 -->
@ -47,7 +125,7 @@ import ProTable from "@/components/ProTable/index.vue";
import { getRelevanceList } from "@/api/modules/common";
import engineeringEngDrawer from "@/components/engineeringEngDrawer/index.vue";
import allEngineering from "@/components/allEngineering/index.vue";
import { addBuildUnit, getBuildUnitList, getEngineeringName } from "@/api/modules/project";
import { addBuildUnit, getBuildUnitList, getEngineeringName, towerCraneAlarmPage } from "@/api/modules/project";
const activeValue = ref("eng");
const engList = ref([]);
@ -65,26 +143,26 @@ const getId = ref<number | undefined>(undefined);
//
const columns: ColumnProps[] = [
{ type: "index", label: "序号", width: 80 },
{ type: "index", label: "序号", width: 200 },
{
prop: "companyName",
prop: "devName",
label: "设备名称",
isShow: false,
search: { el: "select" },
enum: [
{ label: "1", value: 1 },
{ label: "2", value: 2 }
]
},
{
prop: "companyName",
label: "报警类型",
isShow: false,
search: { el: "input" }
},
{
prop: "companyName",
label: "安装时间",
prop: "type",
label: "报警类型",
isShow: false,
search: { el: "select" },
enum: [
{ label: "报警", value: 1 },
{ label: "预警", value: 2 }
]
},
{
prop: "createTime",
label: "报警时间",
isShow: false,
search: {
el: "date-picker",
@ -98,11 +176,12 @@ const columns: ColumnProps[] = [
}
},
{
prop: "companyName",
label: "设备信息"
prop: "equipInfo",
label: "设备信息",
align: "left"
},
// prop
{ prop: "type", label: "报警信息" }
{ prop: "alarmInfo", label: "报警信息", align: "left", width: 800 }
];
// dataCallback list && total && pageNum && pageSize
// hooks/useTable.ts
@ -134,7 +213,7 @@ const getTableList = (params: any) => {
} else {
return { result: { current: "1", pages: "1", records: [], size: "10", total: "0" } };
}
return getBuildUnitList(newParams);
return towerCraneAlarmPage(newParams);
};
// tab

View File

@ -1,6 +1,11 @@
.date-select {
width: 100%;
@mixin flex {
display: flex;
align-items: center;
justify-content: space-between;
}
.table-data {
@include flex;
> span {
display: inline-block;
width: 50%;
}
}

View File

@ -13,18 +13,355 @@
:initParam="initParam"
:onReset="true"
>
<template #type="{ row }">
<span>sss</span>
<template #equipInfo="{ row }">
<span>设备名称: {{ row.devName }}</span>
<br />
<span>sss</span>
<span>设备编号: {{ row.devNumber }}</span>
<br />
<span>sss</span>
<span>司机姓名: {{ row.driverName }}</span>
<br />
<span>sss</span>
<span>司机身份证号: {{ row.driverIdCard }}</span>
<br />
<span>sss</span>
<span>角度: {{ row.angle ? row.angle : 0 }}°</span>
<br />
<span>高度: {{ row.height ? row.height : 0 }}m</span>
<br />
<span>载重比: {{ row.loadRatio ? row.loadRatio : 0 }}%</span>
<br />
<span>载重: {{ row.loading ? row.loading : 0 }}kg</span>
<br />
<span>倾角: {{ row.obliquity ? row.obliquity : 0 }}°</span>
<br />
<span>倾角X: {{ row.obliquityX ? row.obliquityX : 0 }}°</span>
<br />
<span>倾角Y: {{ row.obliquityY ? row.obliquityY : 0 }}°</span>
<br />
<span>幅度: {{ row.ranger ? row.ranger : 0 }}m</span>
<br />
<span>倍率: {{ row.multiple ? row.multiple : 0 }}</span>
<br />
<span>数据接受时间: {{ row.createTime ? row.createTime : "" }}</span>
<br />
<span>力矩: {{ row.torque ? row.torque : 0 }}kg.m</span>
<br />
<span>力矩比: {{ row.torqueRatio ? row.torqueRatio : 0 }}%</span>
<br />
<span>风速: {{ row.windSpeed ? row.windSpeed : 0 }}m/s</span>
<br />
<span
>回转状态:
{{
row.rotationState == 0 ? "停止回转" : row.rotationState == 1 ? "向右回转" : row.rotationState == 2 ? "向左回转" : ""
}}</span
>
<br />
<span
>起升状态:
{{
row.liftingState == 0 ? "停止升降" : row.liftingState == 1 ? "向下落勾" : row.liftingState == 2 ? "向上起勾" : ""
}}</span
>
<br />
<span
>变幅状态:
{{
row.rangerState == 0 ? "停止变幅" : row.rangerState == 1 ? "向外变幅" : row.rangerState == 2 ? "向内变幅" : ""
}}</span
>
</template>
<template #alarmInfo="{ row }">
<div class="table-data">
<span
>禁入区报警:
<span :style="{ color: row.forbidEntryAlarm == 0 ? '#333' : '#E70000' }">{{
row.forbidEntryAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>禁入区左转报警:
<span :style="{ color: row.forbidEntryLeftAlarm == 0 ? '#333' : '#E70000' }">{{
row.forbidEntryLeftAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>禁入区右转报警:
<span :style="{ color: row.forbidEntryRightAlarm == 0 ? '#333' : '#E70000' }">{{
row.forbidEntryRightAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>A类禁吊区域报警:
<span :style="{ color: row.forbidSuspendAlarmA == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendAlarmA == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>A类禁吊区左转报警:
<span :style="{ color: row.forbidSuspendLeftAlarmA == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendLeftAlarmA == 0 ? "正常" : "报警"
}}</span></span
>
<span
>A类禁吊区右转报警:
<span :style="{ color: row.forbidSuspendRightAlarmA == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendRightAlarmA == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>A类禁吊区向外变幅报警:
<span :style="{ color: row.forbidSuspendOutAlarmA == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendOutAlarmA == 0 ? "正常" : "报警"
}}</span></span
>
<span
>B类禁吊区域报警:
<span :style="{ color: row.forbidSuspendAlarmB == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendAlarmB == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>B类禁吊区左转报警:
<span :style="{ color: row.forbidSuspendLeftAlarmB == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendLeftAlarmB == 0 ? "正常" : "报警"
}}</span></span
>
<span
>B类禁吊区右转报警:
<span :style="{ color: row.forbidSuspendRightAlarmB == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendRightAlarmB == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>B类禁吊区向外变幅报警:
<span :style="{ color: row.forbidSuspendOutAlarmB == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendOutAlarmB == 0 ? "正常" : "报警"
}}</span></span
>
<span
>B类禁吊区向内变幅报警:
<span :style="{ color: row.forbidSuspendBackAlarmB == 0 ? '#333' : '#E70000' }">{{
row.forbidSuspendBackAlarmB == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>高度上限位报警:
<span :style="{ color: row.heightUpperAlarm == 0 ? '#333' : '#E70000' }">{{
row.heightUpperAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>高度下限位报警:
<span :style="{ color: row.heightLowerAlarm == 0 ? '#333' : '#E70000' }">{{
row.heightLowerAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>幅度外限位报警:
<span :style="{ color: row.maxRangeAlarm == 0 ? '#333' : '#E70000' }">{{
row.maxRangeAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>幅度内限位报警:
<span :style="{ color: row.minRangeAlarm == 0 ? '#333' : '#E70000' }">{{
row.minRangeAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>力矩报警:
<span :style="{ color: row.forceAlarm == 0 ? '#333' : '#E70000' }">{{
row.forceAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>多机防撞报警:
<span :style="{ color: row.multiAntiCollisionAlarm == 0 ? '#333' : '#E70000' }">{{
row.multiAntiCollisionAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>多机防撞向内变幅报警:
<span :style="{ color: row.multiAntiCollisionBackAlarm == 0 ? '#333' : '#E70000' }">{{
row.multiAntiCollisionBackAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>多机防撞左转报警:
<span :style="{ color: row.multiAntiCollisionLeftAlarm == 0 ? '#333' : '#E70000' }">{{
row.multiAntiCollisionLeftAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>多机防撞向外变幅报警:
<span :style="{ color: row.multiAntiCollisionOutAlarm == 0 ? '#333' : '#E70000' }">{{
row.multiAntiCollisionOutAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>多机防撞右转报警:
<span :style="{ color: row.multiAntiCollisionRightAlarm == 0 ? '#333' : '#E70000' }">{{
row.multiAntiCollisionRightAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>逆时针回转限位报警:
<span :style="{ color: row.negAngleAlarm == 0 ? '#333' : '#E70000' }">{{
row.negAngleAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>倾角报警:
<span :style="{ color: row.obliquityAlarm == 0 ? '#333' : '#E70000' }">{{
row.obliquityAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>倾角X报警:
<span :style="{ color: row.obliquityXAlarm == 0 ? '#333' : '#E70000' }">{{
row.obliquityXAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>倾角Y报警:
<span :style="{ color: row.obliquityYAlarm == 0 ? '#333' : '#E70000' }">{{
row.obliquityYAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>顺时针回转限位报警:
<span :style="{ color: row.posAngleAlarm == 0 ? '#333' : '#E70000' }">{{
row.posAngleAlarm == 0 ? "正常" : "报警"
}}</span></span
>
<span
>风速报警:
<span :style="{ color: row.windSpeedAlarm == 0 ? '#333' : '#E70000' }">{{
row.windSpeedAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
</template>
<template #faultInfo="{ row }">
<div class="table-data">
<span
>角度传感器故障:
<span :style="{ color: row.angleError == 0 ? '#333' : '#E70000' }">{{
row.angleError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>GPS故障:
<span :style="{ color: row.gpsError == 0 ? '#333' : '#E70000' }">{{
row.gpsError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>高度传感器故障:
<span :style="{ color: row.heightError == 0 ? '#333' : '#E70000' }">{{
row.heightError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>身份识别模块故障:
<span :style="{ color: row.identificationError == 0 ? '#333' : '#E70000' }">{{
row.identificationError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>有无任何外设故障:
<span :style="{ color: row.peripheralError == 0 ? '#333' : '#E70000' }">{{
row.peripheralError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>倾角传感器故障:
<span :style="{ color: row.obliquityError == 0 ? '#333' : '#E70000' }">{{
row.obliquityError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>幅度传感器故障:
<span :style="{ color: row.rangeError == 0 ? '#333' : '#E70000' }">{{
row.rangeError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>载重传感器故障:
<span :style="{ color: row.weightError == 0 ? '#333' : '#E70000' }">{{
row.weightError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>风速传感器故障:
<span :style="{ color: row.windSpeedError == 0 ? '#333' : '#E70000' }">{{
row.windSpeedError == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<span>sss</span>
</template>
</ProTable>
<!-- 侧边栏选择 -->
@ -47,7 +384,7 @@ import ProTable from "@/components/ProTable/index.vue";
import { getRelevanceList } from "@/api/modules/common";
import engineeringEngDrawer from "@/components/engineeringEngDrawer/index.vue";
import allEngineering from "@/components/allEngineering/index.vue";
import { addBuildUnit, getBuildUnitList, getEngineeringName } from "@/api/modules/project";
import { getEngineeringName, towerCraneDataPage } from "@/api/modules/project";
const activeValue = ref("eng");
const engList = ref([]);
@ -61,34 +398,31 @@ const initParam = reactive({
// ProTable 便
const proTable = ref();
const getId = ref<number | undefined>(undefined);
//
const columns: ColumnProps[] = [
{ type: "index", label: "序号", width: 80 },
{ type: "index", label: "序号", width: 200 },
{
prop: "companyName",
prop: "devName",
label: "设备名称",
isShow: false,
search: { el: "select" },
enum: [
{ label: "1", value: 1 },
{ label: "2", value: 2 }
]
},
{
prop: "companyName",
label: "报警类型",
isShow: false,
search: { el: "input" }
},
{
prop: "companyName",
label: "安装时间",
prop: "type",
label: "报警类型",
isShow: false,
search: { el: "select" },
enum: [
{ label: "报警", value: 1 },
{ label: "预警", value: 2 }
]
},
{
prop: "createTime",
label: "数据接受时间",
isShow: false,
search: {
el: "date-picker",
props: {
type: "daterange",
format: "YYYY-MM-DD",
@ -98,11 +432,14 @@ const columns: ColumnProps[] = [
}
},
{
prop: "companyName",
label: "设备信息"
prop: "equipInfo",
label: "设备信息",
align: "left",
width: 400
},
// prop
{ prop: "type", label: "报警信息" }
{ prop: "alarmInfo", label: "报警信息", align: "left", width: 800 },
{ prop: "faultInfo", label: "故障信息", align: "left" }
];
// dataCallback list && total && pageNum && pageSize
// hooks/useTable.ts
@ -134,7 +471,7 @@ const getTableList = (params: any) => {
} else {
return { result: { current: "1", pages: "1", records: [], size: "10", total: "0" } };
}
return getBuildUnitList(newParams);
return towerCraneDataPage(newParams);
};
// tab

View File

@ -1,6 +1,11 @@
.date-select {
width: 100%;
@mixin flex {
display: flex;
align-items: center;
justify-content: space-between;
}
.table-data {
@include flex;
> span {
display: inline-block;
width: 50%;
}
}

View File

@ -13,18 +13,189 @@
:initParam="initParam"
:onReset="true"
>
<template #type="{ row }">
<span>sss</span>
<template #equipDriverInfo="{ row }">
<span>设备名称: {{ row.devName }}</span>
<br />
<span>sss</span>
<span>设备编号: {{ row.devNumber }}</span>
<br />
<span>sss</span>
<span>司机姓名: {{ row.driverName }}</span>
<br />
<span>sss</span>
<span>司机身份证号: {{ row.driverIdCard }}</span>
</template>
<template #workCycleInfo="{ row }">
<div class="table-data">
<span>工作循环开始时间: {{ row.startTime }}</span>
<span>工作循环结束时间: {{ row.endTime }}</span>
</div>
<br />
<span>sss</span>
<div class="table-data">
<span>工作循环持续时长: {{ row.duration ? row.duration : 0 }}s</span>
<span>工作循环最大载重: {{ row.maxLoad ? row.maxLoad : 0 }}kg</span>
</div>
<br />
<div class="table-data">
<span>工作循环最大角度: {{ row.maxAngle ? row.maxAngle : 0 }}°</span>
<span>工作循环最小角度: {{ row.minAngle ? row.minAngle : 0 }}°</span>
</div>
<br />
<div class="table-data">
<span>工作循环最大高度: {{ row.maxHeight ? row.maxHeight : 0 }}m</span>
<span>工作循环最小高度: {{ row.minHeight ? row.minHeight : 0 }}m</span>
</div>
<br />
<div class="table-data">
<span>工作循环最大幅度: {{ row.maxRange ? row.maxRange : 0 }}m</span>
<span>工作循环最小幅度: {{ row.minRange ? row.minRange : 0 }}m</span>
</div>
<br />
<div class="table-data">
<span>工作循环开始高度: {{ row.startHeight ? row.startHeight : 0 }}m</span>
<span>工作循环结束高度: {{ row.endHeight ? row.endHeight : 0 }}m</span>
</div>
<br />
<div class="table-data">
<span>工作循环开始幅度: {{ row.startRange ? row.startRange : 0 }}m</span>
<span>工作循环结束幅度: {{ row.endRange ? row.endRange : 0 }}m</span>
</div>
<br />
<div class="table-data">
<span>工作循环开始角度: {{ row.startAngle ? row.startAngle : 0 }}°</span>
<span>工作循环结束角度: {{ row.endAngle ? row.endAngle : 0 }}°</span>
</div>
<br />
<div class="table-data">
<span>工作循环最大载重比: {{ row.maxLoadRatio ? row.maxLoadRatio : 0 }}%</span>
<span>工作循环最大风速: {{ row.maxWindSpeed ? row.maxWindSpeed : 0 }}m/s</span>
</div>
<br />
<div class="table-data">
<span>工作循环中最大力矩: {{ row.maxForce ? row.maxForce : 0 }}kg·m</span>
<span>工作循环最大力矩百分比: {{ row.maxForceRatio ? row.maxForceRatio : 0 }}%</span>
</div>
<br />
<div class="table-data">
<span>工作循环最大力矩时的幅度: {{ row.maxForceRatioRange ? row.maxForceRatioRange : 0 }}m</span>
<span>工作循环倍率: {{ row.multiple ? row.multiple : 0 }}%</span>
</div>
</template>
<template #alarmInfo="{ row }">
<div class="table-data">
<span
>防碰撞报警:
<span :style="{ color: row.antiCollisionAlarm == 0 ? '#333' : '#E70000' }">{{
row.antiCollisionAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>高度上限位报警:
<span :style="{ color: row.heightUpperAlarm == 0 ? '#333' : '#E70000' }">{{
row.heightUpperAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>高度下限位报警:
<span :style="{ color: row.heightLowerAlarm == 0 ? '#333' : '#E70000' }">{{
row.heightLowerAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>幅度外限位报警:
<span :style="{ color: row.maxRangeAlarm == 0 ? '#333' : '#E70000' }">{{
row.maxRangeAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>幅度内限位报警:
<span :style="{ color: row.minRangeAlarm == 0 ? '#333' : '#E70000' }">{{
row.minRangeAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>力矩报警:
<span :style="{ color: row.forceAlarm == 0 ? '#333' : '#E70000' }">{{
row.forceAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>多机防撞报警:
<span :style="{ color: row.multiAntiCollisionAlarm == 0 ? '#333' : '#E70000' }">{{
row.multiAntiCollisionAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>逆时针回转限位报警:
<span :style="{ color: row.negAngleAlarm == 0 ? '#333' : '#E70000' }">{{
row.negAngleAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>倾角报警:
<span :style="{ color: row.obliquityAlarm == 0 ? '#333' : '#E70000' }">{{
row.obliquityAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>顺时针回转限位报警:
<span :style="{ color: row.posAngleAlarm == 0 ? '#333' : '#E70000' }">{{
row.posAngleAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>风速报警:
<span :style="{ color: row.windSpeedAlarm == 0 ? '#333' : '#E70000' }">{{
row.windSpeedAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>工作循环中是否出现环境防碰撞报警:
<span :style="{ color: row.workEnvironmentAlarm == 0 ? '#333' : '#E70000' }">{{
row.workEnvironmentAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<div class="table-data">
<span
>工作循环中是否出现力矩预警:
<span :style="{ color: row.workForceAlarm == 0 ? '#333' : '#E70000' }">{{
row.workForceAlarm == 0 ? "正常" : "报警"
}}</span></span
>
</div>
<br />
<span>sss</span>
</template>
</ProTable>
<!-- 侧边栏选择 -->
@ -47,7 +218,7 @@ import ProTable from "@/components/ProTable/index.vue";
import { getRelevanceList } from "@/api/modules/common";
import engineeringEngDrawer from "@/components/engineeringEngDrawer/index.vue";
import allEngineering from "@/components/allEngineering/index.vue";
import { addBuildUnit, getBuildUnitList, getEngineeringName } from "@/api/modules/project";
import { getEngineeringName, towerCraneWorkCyclePage } from "@/api/modules/project";
const activeValue = ref("eng");
const engList = ref([]);
@ -61,34 +232,21 @@ const initParam = reactive({
// ProTable 便
const proTable = ref();
const getId = ref<number | undefined>(undefined);
//
const columns: ColumnProps[] = [
{ type: "index", label: "序号", width: 80 },
{ type: "index", label: "序号", width: 200 },
{
prop: "companyName",
prop: "devName",
label: "设备名称",
isShow: false,
search: { el: "select" },
enum: [
{ label: "1", value: 1 },
{ label: "2", value: 2 }
]
},
{
prop: "companyName",
label: "报警类型",
isShow: false,
search: { el: "input" }
},
{
prop: "companyName",
label: "安装时间",
prop: "createTime",
label: "工作循环时间",
isShow: false,
search: {
el: "date-picker",
props: {
type: "daterange",
format: "YYYY-MM-DD",
@ -98,11 +256,14 @@ const columns: ColumnProps[] = [
}
},
{
prop: "companyName",
label: "设备信息"
prop: "equipDriverInfo",
label: "设备司机信息",
align: "left",
width: 400
},
// prop
{ prop: "type", label: "报警信息" }
{ prop: "workCycleInfo", label: "工作循环信息", align: "left", width: 600 },
{ prop: "alarmInfo", label: "工作循环报警信息", align: "left", width: 600 }
];
// dataCallback list && total && pageNum && pageSize
// hooks/useTable.ts
@ -121,8 +282,8 @@ const dataCallback = (data: any) => {
const getTableList = (params: any) => {
let newParams = JSON.parse(JSON.stringify(params));
if (newParams.createTime) {
newParams.createTime_begin = newParams.createTime[0];
newParams.createTime_end = newParams.createTime[1];
newParams.startTime_begin = newParams.createTime[0];
newParams.endTime_end = newParams.createTime[1];
delete newParams.createTime;
}
if (searchSn.value) {
@ -134,7 +295,7 @@ const getTableList = (params: any) => {
} else {
return { result: { current: "1", pages: "1", records: [], size: "10", total: "0" } };
}
return getBuildUnitList(newParams);
return towerCraneWorkCyclePage(newParams);
};
// tab

View File

@ -14,9 +14,11 @@
@include boxStyle;
flex: 1;
height: 100%;
min-height: 600px;
.monitor-title {
margin-top: 15px;
margin-left: 36px;
@include flex;
span:first-child {
font-size: 30px;
font-family: Source Han Sans CN-Bold, Source Han Sans CN;
@ -28,7 +30,6 @@
font-size: 22px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #0f64da;
}
}
.monitor-content {
@ -122,10 +123,14 @@
margin-left: 36px;
margin-bottom: 16px;
@include flex;
.monitor-state:not(:last-child) {
margin-right: 26px;
}
.monitor-state {
@include flex;
flex-direction: column;
align-items: center;
cursor: pointer;
> div {
position: relative;
img {
@ -135,7 +140,6 @@
span {
width: 32px;
height: 15px;
background: #008bff;
font-size: 10px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
@ -153,13 +157,35 @@
color: #000000;
}
}
.active-class {
box-shadow: 0px 4px 8px 0px rgba(48, 62, 100, 0.2);
}
}
}
.no-data {
@include boxStyle;
flex: 1;
height: 100%;
min-height: 600px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
color: #999;
}
.history-data {
@include boxStyle;
width: 300px;
height: 100%;
margin-left: 20px;
:deep() {
.leftMenu {
height: 100%;
}
.content {
height: calc(100% - 100px);
}
}
.search-wrapper {
@include flex;
height: 50px;
@ -168,6 +194,9 @@
border-bottom: 1px solid #e5e5e5;
}
.alarm-list {
height: calc(100% - 50px);
min-height: 83%;
overflow-y: scroll;
&-item {
display: flex;
flex-direction: column;
@ -187,6 +216,9 @@
}
}
.info-list {
height: calc(100% - 50px);
min-height: 83%;
overflow-y: scroll;
&-item {
display: flex;
flex-direction: column;

View File

@ -1,21 +1,23 @@
<template>
<div class="operate-box">
<div class="monitor-data">
<div class="monitor-data" v-if="equipList.length > 0">
<div class="monitor-title">
<span>十字门小学</span>
<span>在线</span>
<span>{{ equipInfo.devName }}</span>
<span :style="{ color: equipInfo.online == 1 ? '#0f64da' : '#C3C3C3' }">{{
equipInfo.online == 1 ? "在线" : "离线"
}}</span>
</div>
<div class="monitor-content">
<div class="monitor-tool">
<img src="@/assets/images/onlineSupervision/towerImg.png" alt="" />
<span class="property-one">尾臂长: 1.4m</span>
<span class="property-two">臂长: 5m</span>
<span class="property-three">塔身高: 7m</span>
<span class="property-one">尾臂长: {{ equipInfo.posteriorArmLength ? equipInfo.posteriorArmLength : 0 }}m</span>
<span class="property-two">臂长: {{ equipInfo.forearmLength ? equipInfo.forearmLength : 0 }}m</span>
<span class="property-three">塔身高: {{ equipInfo.towerHeight ? equipInfo.towerHeight : 0 }}m</span>
<div class="other-info">
<span>备案编号: TD2374693</span>
<span>安装日期: 2022-12-01</span>
<span>终端编号: TD2374693</span>
<span>更新时间: 2023-05-23</span>
<span>设备编号: {{ equipInfo.devNumber ? equipInfo.devNumber : "" }}</span>
<span>安装日期: {{ equipInfo.installTime ? equipInfo.installTime : "" }}</span>
<!-- <span>终端编号: TD2374693</span> -->
<span>更新时间: {{ equipInfo.realTime ? equipInfo.realTime : "" }}</span>
</div>
</div>
<div class="monitor-aspect">
@ -25,22 +27,34 @@
<img :src="item.img" alt="" srcset="" />
</div>
<div>
<span>{{ item.value }}</span>
<span>{{ equipInfo[item.prop] ? equipInfo[item.prop] : 0 }}</span>
<span>{{ item.unit }}</span>
</div>
</div>
</div>
</div>
<div class="monitor-equip">
<div class="monitor-state">
<div
:class="equipActive == index ? 'active-class' : ''"
class="monitor-state"
v-for="(item, index) in equipList"
:key="index"
@click="getEquipInfo(item)"
>
<div>
<img src="@/assets/images/login_left.png" alt="" />
<span>在线</span>
<img :src="item.installImage" alt="" />
<span :style="{ backgroundColor: item.online == 1 ? '#008bff' : '#C3C3C3' }">{{
item.online == 1 ? "在线" : "离线"
}}</span>
</div>
<span>1号塔吊</span>
<span>{{ item.devName }}</span>
</div>
</div>
</div>
<div class="no-data" v-else>
<img src="@/assets/images/notData.png" alt="notData" />
<div>暂无数据</div>
</div>
<div class="history-data">
<LeftMenuPlus
v-model="active"
@ -55,6 +69,8 @@
style="margin-right: 5px"
v-model="searchForm.timeRange"
type="daterange"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
@ -62,69 +78,69 @@
<el-button class="search-btn" type="primary" @click="search">查询</el-button>
</div>
<div class="alarm-list" v-if="active == 0">
<div class="alarm-list-item">
<div class="alarm-list-item" v-for="(item, index) in alarmList" :key="index">
<div>
<span>设备名称: </span>
<span>2号塔吊</span>
<span>{{ item.devName }}</span>
</div>
<div>
<span>终端编号: </span>
<span style="color: #0f64da">DEYE20071702</span>
<span>设备编号: </span>
<span style="color: #0f64da">{{ item.devNumber }}</span>
</div>
<div>
<span>报警项目: </span>
<span>幅度限位报警</span>
<span>{{ alarmTransform(item) }}</span>
</div>
<div>
<span>报警时间: </span>
<span>2022-12-23</span>
<span>{{ item.createTime }}</span>
</div>
</div>
</div>
<div class="info-list" v-if="active == 1">
<div class="info-list-item">
<div>2号塔吊</div>
<div class="info-list-item" v-for="(item, index) in monitorList" :key="index">
<div>{{ item.devName }}</div>
<div class="info-list-item-aspect">
<div class="info-list-item-aspect-item">
<span>角度</span>
<span>190.0°</span>
<span>{{ item.angle ? item.angle : 0 }}°</span>
</div>
<div class="info-list-item-aspect-item">
<span>倾角</span>
<span>120.0°</span>
<span>{{ item.obliquity ? item.obliquity : 0 }}°</span>
</div>
</div>
<div class="info-list-item-aspect">
<div class="info-list-item-aspect-item">
<span>高度</span>
<span>96.35m</span>
<span>{{ item.height ? item.height : 0 }}m</span>
</div>
<div class="info-list-item-aspect-item">
<span>倾角X</span>
<span>120.0°</span>
<span>{{ item.obliquityX ? item.obliquityX : 0 }}°</span>
</div>
</div>
<div class="info-list-item-aspect">
<div class="info-list-item-aspect-item">
<span>载重比</span>
<span>1.57%</span>
<span>{{ item.loadRatio ? item.loadRatio : 0 }}%</span>
</div>
<div class="info-list-item-aspect-item">
<span>倾角Y</span>
<span>120.0°</span>
<span>{{ item.obliquityY ? item.obliquityY : 0 }}°</span>
</div>
</div>
<div class="info-list-item-aspect">
<div class="info-list-item-aspect-item">
<span>载重</span>
<span>70.0kg</span>
<span>{{ item.loading ? item.loading : 0 }}kg</span>
</div>
<div class="info-list-item-aspect-item">
<span>幅度</span>
<span>51.67m</span>
<span>{{ item.ranger ? item.ranger : 0 }}m</span>
</div>
</div>
<div>监测时间: 2023-05-23</div>
<div>监测时间: {{ item.createTime ? item.createTime : "" }}</div>
</div>
</div>
</template>
@ -148,8 +164,19 @@ import { ElMessage } from "element-plus";
import { getRelevanceList } from "@/api/modules/common";
import engineeringEngDrawer from "@/components/engineeringEngDrawer/index.vue";
import allEngineering from "@/components/allEngineering/index.vue";
import { getEngineeringName } from "@/api/modules/project";
import {
getEngineeringName,
towerCraneEquipAll,
operationData,
towerCraneAlarmPage,
towerCraneDataPage
} from "@/api/modules/project";
import LeftMenuPlus from "@/components/LeftMenuPlus/LeftMenu.vue";
const equipActive = ref(0);
const monitorList = ref([]);
const alarmList = ref([]);
const equipList = ref([]);
const equipInfo = ref({});
const searchForm = ref({
timeRange: []
});
@ -165,49 +192,49 @@ const aspectList = ref([
value: 10,
unit: "N·M",
img: new URL("@/assets/images/onlineSupervision/力矩.png", import.meta.url).href,
prop: "inServiceWorker"
prop: "torque"
},
{
name: "载重",
value: 10,
unit: "T",
img: new URL("@/assets/images/onlineSupervision/载重.png", import.meta.url).href,
prop: "workerAttendanceTotal"
prop: "loading"
},
{
name: "风速",
value: 10,
unit: "m/s",
img: new URL("@/assets/images/onlineSupervision/风速.png", import.meta.url).href,
prop: "workerAttendanceTotal"
prop: "windSpeed"
},
{
name: "高度",
value: 10,
unit: "m",
img: new URL("@/assets/images/onlineSupervision/高度.png", import.meta.url).href,
prop: "workerAttendanceTotal"
prop: "height"
},
{
name: "回转角度",
value: 10,
unit: "°",
img: new URL("@/assets/images/onlineSupervision/回转角度.png", import.meta.url).href,
prop: "workerAttendanceTotal"
prop: "angle"
},
{
name: "塔身倾角",
value: 10,
unit: "°",
img: new URL("@/assets/images/onlineSupervision/塔身倾角.png", import.meta.url).href,
prop: "workerAttendanceTotal"
prop: "obliquity"
},
{
name: "幅度",
value: 10,
unit: "m",
img: new URL("@/assets/images/onlineSupervision/幅度.png", import.meta.url).href,
prop: "workerAttendanceTotal"
prop: "ranger"
}
]);
const activeValue = ref("eng");
@ -216,18 +243,121 @@ const engVisable = ref(false);
const searchSn = ref("");
// ProTable 便
const proTable = ref();
//
const alarmTransform = (obj: any) => {
let str = "";
if (obj["environmentAlarm"] == 1) str += "环境防碰撞报警,";
if (obj["forceAlarm"] == 1) str += "力矩报警,";
if (obj["heightLowerAlarm"] == 1) str += "高度下限位报警,";
if (obj["heightUpperAlarm"] == 1) str += "高度上限位报警,";
if (obj["maxRangeAlarm"] == 1) str += "幅度外限位报警,";
if (obj["minRangeAlarm"] == 1) str += "幅度内限位报警,";
if (obj["multiAntiCollisionAlarm"] == 1) str += "多机防撞报警,";
if (obj["negAngleAlarm"] == 1) str += "逆时针回转限位报警,";
if (obj["obliquityAlarm"] == 1) str += "倾角报警,";
if (obj["posAngleAlarm"] == 1) str += "顺时针回转限位报警,";
if (obj["standardHighAlarm"] == 1) str += "塔机间竖向高度报警,";
if (obj["windSpeedAlarm"] == 1) str += "风速报警";
return str;
};
//
const getMonitorList = async () => {
let requestData = {
pageNo: pages.value.pageNo,
pageSize: pages.value.pageSize
} as any;
if (activeValue.value == "eng") {
requestData.engineeringSn = searchSn.value;
} else if (activeValue.value == "project") {
requestData.projectSn = searchSn.value;
}
if (searchForm.value.timeRange && searchForm.value.timeRange.length > 0) {
requestData.createTime_begin = searchForm.value.timeRange[0];
requestData.createTime_end = searchForm.value.timeRange[1];
}
const res = await towerCraneDataPage(requestData);
console.log(res);
if (res && res.result && res.result.records.length > 0) {
monitorList.value = res.result.records;
pages.value.total = +res.result.total;
} else {
monitorList.value = [];
pages.value.total = 0;
}
};
//
const getAlarmList = async () => {
let requestData = {
pageNo: pages.value.pageNo,
pageSize: pages.value.pageSize
} as any;
if (activeValue.value == "eng") {
requestData.engineeringSn = searchSn.value;
} else if (activeValue.value == "project") {
requestData.projectSn = searchSn.value;
}
if (searchForm.value.timeRange && searchForm.value.timeRange.length > 0) {
requestData.createTime_begin = searchForm.value.timeRange[0];
requestData.createTime_end = searchForm.value.timeRange[1];
}
const res = await towerCraneAlarmPage(requestData);
console.log(res);
if (res && res.result && res.result.records.length > 0) {
alarmList.value = res.result.records;
pages.value.total = +res.result.total;
} else {
alarmList.value = [];
pages.value.total = 0;
}
};
//
const getEquipList = async () => {
let requestData = {} as any;
if (activeValue.value == "eng") {
requestData.engineeringSn = searchSn.value;
} else if (activeValue.value == "project") {
requestData.projectSn = searchSn.value;
}
const res = await towerCraneEquipAll(requestData);
console.log(res);
if (res && res.result && res.result.length > 0) {
equipList.value = res.result;
getEquipInfo(res.result[0]);
} else {
equipList.value = [];
}
};
//
const getEquipInfo = async (obj: any) => {
let requestData = {
id: obj.id
};
const res = await operationData(requestData);
console.log(res);
if (res && res.result) {
equipInfo.value = { ...obj, ...res.result };
} else {
equipInfo.value = { ...obj };
}
};
//
const search = () => {
console.log(666);
if (active.value === 0) {
getAlarmList();
} else {
getMonitorList();
}
};
//
const onCurChange = async (params: number) => {
console.log(params);
// if (active.value === 0) {
// pages.value.total = +result.total;
// } else {
// pages.value.total = +result.total;
// }
pages.value.pageNo = params;
if (active.value === 0) {
getAlarmList();
} else {
getMonitorList();
}
};
// tab
const tabsSelect = val => {
@ -237,6 +367,11 @@ const tabsSelect = val => {
} else if (val == "project") {
getProject();
}
if (active.value === 0) {
getAlarmList();
} else {
getMonitorList();
}
};
//
const getProject = async () => {
@ -245,7 +380,7 @@ const getProject = async () => {
if (res.result) {
searchSn.value = res.result.projectSn;
}
// proTable.value.getTableList();
getEquipList();
console.log(res);
};
const getengineering = async () => {
@ -255,7 +390,7 @@ const getengineering = async () => {
if (res.result && res.result.length > 0) {
searchSn.value = res.result[0].engineeringSn;
}
// proTable.value.getTableList();
getEquipList();
console.log(res);
};
//
@ -265,17 +400,28 @@ const onUpdate = async row => {
} else if (activeValue.value == "project") {
searchSn.value = row.projectSn;
}
// proTable.value.getTableList();
getEquipList();
if (active.value === 0) {
getAlarmList();
} else {
getMonitorList();
}
ElMessage.success("页面已更新");
};
watch(
() => active.value,
() => {
n => {
searchForm.value.timeRange = [];
if (n === 0) {
getAlarmList();
} else {
getMonitorList();
}
searchForm.value.timeRange = [];
}
);
onMounted(() => {
getengineering();
onMounted(async () => {
await getengineering();
});
</script>
<style scoped lang="scss">

View File

@ -85,7 +85,7 @@
<script setup lang="tsx" name="ProjectSupervisionRecord">
import { ref, reactive, onMounted } from "vue";
import { ElMessage, ElMessageBox, ElTree } from "element-plus";
import type { FormRules, FormInstance, UploadInstance } from "element-plus";
import type { FormRules, FormInstance, UploadProps } from "element-plus";
import { useRouter } from "vue-router";
import { ColumnProps } from "@/components/ProTable/interface";
import { useHandleData } from "@/hooks/useHandleData";