From 20b0ce2db27b64a60de60aee05dedd448099e330 Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期一, 08 七月 2024 10:12:16 +0800 Subject: [PATCH] xiugai --- src/views/riskWarningSys/warningBigScreen/indexs/components/msg.vue | 422 ++ src/views/riskWarningSys/warningBigScreen/indexs/components/dan.vue | 398 + src/views/riskWarningSys/warningBigScreen/components/message.vue | 56 src/views/riskWarningSys/warningBigScreen/indexs/index.vue | 107 src/views/newSpecialWorkSystem/workTicket/wdsq/components/detailLog.vue | 6 src/views/newSpecialWorkSystem/workTicket/wdsq/components/fireDialog.vue | 182 src/views/newSpecialWorkSystem/workTicket/wdsq/components/hoistDialog.vue | 92 src/views/specialWorkSystem/specialIndex/components/videoDetail.vue | 2 src/views/system/spi/component/spiDialog.vue | 153 + src/views/riskWarningSys/warningBigScreen/index.vue | 52 src/views/riskWarningSys/warningBigScreen/components/risk.vue | 355 - src/views/riskWarningSys/warningBigScreen/indexs/components/risk.vue | 384 + src/views/riskWarningSys/warningBigScreen/components/danger.vue | 43 src/views/newSpecialWorkSystem/workTicket/zysq/components/broken.vue | 46 src/views/riskWarningSys/warningBigScreen/components/training.vue | 327 - src/views/newSpecialWorkSystem/workTicket/wdsq/components/heightDialog.vue | 92 src/views/newSpecialWorkSystem/workTicket/wdsq/components/plateDialog.vue | 74 src/views/newSpecialWorkSystem/workTicket/zysq/components/plate.vue | 42 src/views/riskWarningSys/warningBigScreen/components/accident.vue | 41 src/views/system/spi/index.vue | 227 + src/views/newSpecialWorkSystem/workTicket/zysq/components/power.vue | 61 src/views/riskWarningSys/warningBigScreen/components/educate.vue | 52 src/views/specialWorkSystem/specialIndex/components/workRecord.vue | 18 src/views/riskWarningSys/warningBigScreen/components/profession.vue | 67 src/views/newSpecialWorkSystem/workTicket/zysq/components/ground.vue | 60 src/views/newSpecialWorkSystem/workTicket/wdsq/components/brokenDialog.vue | 78 src/views/riskWarningSys/warningBigScreen/components/SPI.vue | 263 - src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue | 146 src/views/newHome/index.vue | 24 src/views/riskWarningSys/warningBigScreen/indexs/components/edu.vue | 384 + src/views/riskWarningSys/warningBigScreen/indexs/components/spi.vue | 349 + src/views/riskWarningSys/warningBigScreen/indexs/components/acc.vue | 442 + src/views/specialWorkSystem/specialIndex/index.vue | 34 src/views/newSpecialWorkSystem/workTicket/wdsq/components/groundDialog.vue | 92 src/views/newSpecialWorkSystem/workTicket/zysq/components/hoist.vue | 60 src/views/riskWarningSys/warningBigScreen/indexs/components/train.vue | 350 + src/views/intellectInspect/inspectTaskManage/inspectTask/index.vue | 1126 +++--- src/views/riskWarningSys/warningBigScreen/components/monitor.vue | 52 src/views/riskWarningSys/warningBigScreen/indexs/components/sto.vue | 385 + src/views/newSpecialWorkSystem/workTicket/wdsq/index.vue | 84 src/views/newSpecialWorkSystem/workTicket/sqjl/index.vue | 70 src/views/newSpecialWorkSystem/workTicket/zysq/components/height.vue | 60 src/api/riskWarning/index.ts | 105 src/views/newSpecialWorkSystem/workTicket/wdsq/components/spaceDialog.vue | 75 src/views/newSpecialWorkSystem/workTicket/wdsq/components/powerDialog.vue | 73 src/views/riskWarningSys/warningBigScreen/components/stock.vue | 684 --- src/views/newSpecialWorkSystem/workTicket/zysq/components/space.vue | 42 src/views/intellectInspect/inspectBasic/inspectTarget/index.vue | 10 src/views/riskWarningSys/warningBigScreen/indexs/components/mon.vue | 372 + src/views/riskWarningSys/warningBigScreen/indexs/components/pro.vue | 357 + 50 files changed, 5,338 insertions(+), 3,738 deletions(-) diff --git a/src/api/riskWarning/index.ts b/src/api/riskWarning/index.ts index 1910bb2..480ab30 100644 --- a/src/api/riskWarning/index.ts +++ b/src/api/riskWarning/index.ts @@ -12,9 +12,9 @@ }, //获取任意部门事故统计指定月度区间报表 - getRiskByTimeDep: (data: {depId:number,beginYear:string,beginMonth:string,endYear: string,endMonth:string}) => { + getRiskByTimeDep: (data: {year:string,month: string}) => { return request({ - url: import.meta.env.VITE_API_URL + `/riskCtrl/risk/report/multipleMonth/incident/department?depId=${data.depId}&beginYear=${data.beginYear}&beginMonth=${data.beginMonth}&endYear=${data.endYear}&endMonth=${data.endMonth}`, + url: import.meta.env.VITE_API_URL + `/riskCtrl/spi/report/accident/count?year=${data.year}&month=${data.month}`, method: 'get', }); }, @@ -41,6 +41,107 @@ url: import.meta.env.VITE_API_URL + `/riskCtrl/risk/report/multipleMonth/prevent/subDepartments?depId=${data.depId}&beginYear=${data.beginYear}&beginMonth=${data.beginMonth}&endYear=${data.endYear}&endMonth=${data.endMonth}`, method: 'get', }); + }, + + // 人员专业度分析 + getUserCount: () => { + return request({ + url: import.meta.env.VITE_API_URL + `/riskCtrl/spi/report/user/count`, + method: 'get', + }); + }, + + // 教育培训分析 + getTrainInfo: () => { + return request({ + url: import.meta.env.VITE_API_URL + `/riskCtrl/spi/report/last/train/info`, + method: 'get', + }); + }, + + // 应急物资储备 + getEmergencySupplies: () => { + return request({ + url: import.meta.env.VITE_API_URL + `/riskCtrl/spi/report/emergency/supplies`, + method: 'get', + }); + }, + + // 智能巡检超期未巡检 + getSafeCheckTask: () => { + return request({ + url: import.meta.env.VITE_API_URL + `/riskCtrl/spi/report/safe/check/task`, + method: 'get', + }); + }, + + // 隐患趋势 + getDpLine: () => { + return request({ + url: import.meta.env.VITE_API_URL + `/riskCtrl/spi/report/dp/line`, + method: 'get', + }); + }, + + // 隐患等级 + getDpGrade: (params: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/riskCtrl/spi/report/dp/grade`, + method: 'post', + data: params + }); + }, + + // spi分页 + getSpiPage: (params: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/spi/list/Page`, + method: 'post', + data: params + }); + }, + + // spi新增 + addSpi: (params: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/spi/add`, + method: 'post', + data: params + }); + }, + + // spi修改 + modSpi: (params: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/spi/mod`, + method: 'post', + data: params + }); + }, + + // spi删除 + delSpi: (id: number | null) => { + return request({ + url: import.meta.env.VITE_API_URL + `/spi/del/${id}`, + method: 'delete' + }); + }, + + // spi总记录 + getAllReport: () => { + return request({ + url: import.meta.env.VITE_API_URL + `/riskCtrl/spi/report/all`, + method: 'get', + }); + }, + + // spi总记录 + getReportDetails: (id: number | null) => { + return request({ + url: import.meta.env.VITE_API_URL + `/riskCtrl/spi/report/get/${id}`, + method: 'get', + }); } + }; } diff --git a/src/views/intellectInspect/inspectBasic/inspectTarget/index.vue b/src/views/intellectInspect/inspectBasic/inspectTarget/index.vue index 4308c50..53bf876 100644 --- a/src/views/intellectInspect/inspectBasic/inspectTarget/index.vue +++ b/src/views/intellectInspect/inspectBasic/inspectTarget/index.vue @@ -65,12 +65,12 @@ interface TableDataState { inspectTargetData: { data: Array<TableData>; - total: number; - loading: boolean; + total: number + loading: boolean params: { - pageIndex: number; - pageSize: number; - quotaName: string; + pageIndex: number + pageSize: number + quotaName: string }; }; quotaTypeList: []; diff --git a/src/views/intellectInspect/inspectTaskManage/inspectTask/index.vue b/src/views/intellectInspect/inspectTaskManage/inspectTask/index.vue index bb6a6fd..7edabe1 100644 --- a/src/views/intellectInspect/inspectTaskManage/inspectTask/index.vue +++ b/src/views/intellectInspect/inspectTaskManage/inspectTask/index.vue @@ -1,129 +1,129 @@ <template> - <div class="home-container"> - <div style="height: 100%;display: flex;flex-direction: column;align-items: stretch;"> - <el-row class="homeCard"> - <div class="basic-line"> - <span>任务类型:</span> - <el-select v-model="tableData.params.workType" clearable filterable class="input-box" placeholder="任务类型"> - <el-option v-for="item in workTypeList" :key="item.id" :label="item.name" :value="item.id"></el-option> - </el-select> - </div> - <div class="basic-line"> - <span>部门:</span> - <el-cascader class="input-box" :options="departmentList" :props="{ emitPath: false, checkStrictly: true, value: 'depId', label: 'depName' }" - placeholder="请选择部门" clearable v-model="tableData.params.execDepId" - @change="changeGroup" - > </el-cascader> - </div> - <div class="basic-line"> - <span>执行班组:</span> - <el-select v-model="tableData.params.execClassgroupId" clearable filterable class="input-box" placeholder="执行班组"> - <el-option v-for="item in classGroupList" :key="item.id" :label="item.groupName" :value="item.id"></el-option> - </el-select> - </div> - <div style="padding-bottom: 10px"> - <el-button type="primary" @click="getInspectionTask">查询</el-button> - <el-button plain @click="reset">重置</el-button> - </div> - </el-row> - <div class="homeCard"> - <div class="main-card"> - <el-row class="cardTop"> - <el-col :span="12" class="mainCardBtn"> - <el-button type="primary" :icon="Plus" size="default" @click="openInspectTaskDialog('新增', {})">新增</el-button> - <el-button type="primary" :icon="Upload" size="default" @click="openUploadDialog('任务')">导入</el-button> - <!-- <el-button type="danger" :icon="Delete" size="default" plain>删除</el-button>--> - </el-col> - <el-button type="primary" :icon="Refresh" size="default" /> - </el-row> - <el-table ref="multipleTableRef" :data="tableData.inspectTaskData" style="width: 100%" height="calc(100% - 100px)" :header-cell-style="{ background: '#fafafa' }" @selection-change="handleSelectionChange"> -<!-- <el-table-column type="selection" width="55" />--> - <el-table-column property="unitName" label="任务名称" /> - <el-table-column property="workType" label="任务类型"> - <template #default="scope"> + <div class="home-container"> + <div style="height: 100%;display: flex;flex-direction: column;align-items: stretch;"> + <el-row class="homeCard"> + <div class="basic-line"> + <span>任务类型:</span> + <el-select v-model="tableData.params.workType" clearable filterable class="input-box" placeholder="任务类型"> + <el-option v-for="item in workTypeList" :key="item.id" :label="item.name" :value="item.id"></el-option> + </el-select> + </div> + <div class="basic-line"> + <span>部门:</span> + <el-cascader class="input-box" :options="departmentList" :props="{ emitPath: false, checkStrictly: true, value: 'depId', label: 'depName' }" + placeholder="请选择部门" clearable v-model="tableData.params.execDepId" + @change="changeGroup" + > </el-cascader> + </div> + <div class="basic-line"> + <span>执行班组:</span> + <el-select v-model="tableData.params.execClassgroupId" clearable filterable class="input-box" placeholder="执行班组"> + <el-option v-for="item in classGroupList" :key="item.id" :label="item.groupName" :value="item.id"></el-option> + </el-select> + </div> + <div style="padding-bottom: 10px"> + <el-button type="primary" @click="getInspectionTask">查询</el-button> + <el-button plain @click="reset">重置</el-button> + </div> + </el-row> + <div class="homeCard"> + <div class="main-card"> + <el-row class="cardTop"> + <el-col :span="12" class="mainCardBtn"> + <el-button type="primary" :icon="Plus" size="default" @click="openInspectTaskDialog('新增', {})">新增</el-button> + <el-button type="primary" :icon="Upload" size="default" @click="openUploadDialog('任务')">导入</el-button> + <!-- <el-button type="danger" :icon="Delete" size="default" plain>删除</el-button>--> + </el-col> + <el-button type="primary" :icon="Refresh" size="default" /> + </el-row> + <el-table ref="multipleTableRef" :data="tableData.inspectTaskData" style="width: 100%" height="calc(100% - 100px)" :header-cell-style="{ background: '#fafafa' }" @selection-change="handleSelectionChange"> + <!-- <el-table-column type="selection" width="55" />--> + <el-table-column property="unitName" label="任务名称" /> + <el-table-column property="workType" label="任务类型"> + <template #default="scope"> <span> {{ parseNumber(scope.row.workType, '任务类型') }} </span> - </template> - </el-table-column> - <el-table-column property="execClassgroupId" label="巡检班组"> - <template #default="scope"> + </template> + </el-table-column> + <el-table-column property="execClassgroupId" label="巡检班组"> + <template #default="scope"> <span> {{ parseNumber(scope.row.execClassgroupId, '巡检班组') }} </span> - </template> - </el-table-column> - <el-table-column property="frequency" label="检查频次"> - <template #default="scope"> + </template> + </el-table-column> + <el-table-column property="frequency" label="检查频次"> + <template #default="scope"> <span> {{ scope.row.checkCycle }} </span> - <span> + <span> {{ scope.row.checkCycleUnit }} </span> - </template> - </el-table-column> - <!-- <el-table-column prop="validTime" label="有效时间" show-overflow-tooltip>--> - <!-- <template #default="scope">--> - <!-- <span>--> - <!-- {{ scope.row.validTime }}--> - <!-- </span>--> - <!-- <span>--> - <!-- {{ parseNumber(scope.row.validTimeUnit, '检查频次') }}--> - <!-- </span>--> - <!-- </template>--> - <!-- </el-table-column>--> - <!-- <el-table-column prop="validTime" label="提醒时间" show-overflow-tooltip>--> - <!-- <template #default="scope">--> - <!-- <span>--> - <!-- {{ scope.row.noticeTime }}--> - <!-- </span>--> - <!-- <span>--> - <!-- {{ parseNumber(scope.row.noticeTimeUnit, '检查频次') }}--> - <!-- </span>--> - <!-- </template>--> - <!-- </el-table-column>--> - <el-table-column property="firstStartTime" label="任务开始时间" /> - <el-table-column prop="createUserName" label="创建人" show-overflow-tooltip></el-table-column> - <el-table-column prop="gmtCreate" label="创建时间" show-overflow-tooltip></el-table-column> - <el-table-column prop="lastEditUserName" label="最后修改人" show-overflow-tooltip></el-table-column> - <el-table-column prop="gmtModitify" label="最后修改时间" show-overflow-tooltip></el-table-column> - <el-table-column property="taskUnitStatus" label="状态" width="60"> - <template #default="scope"> - <div> - <div v-if="scope.row.taskUnitStatus === 1"> - <el-tag :type="''"> - {{ '开启' }} - </el-tag> - </div> - <div v-if="scope.row.taskUnitStatus === 2"> - <el-tag :type="'danger'"> - {{ '关闭' }} - </el-tag> - </div> - </div> - </template> - </el-table-column> - <el-table-column fixed="right" label="操作" align="center" width="300"> - <template #default="scope"> - <el-button link type="primary" size="small" :icon="View" @click="openInspectTaskDialog('查看', scope.row)">查看</el-button> - <el-button link type="primary" size="small" :icon="Edit" @click="openInspectTaskDialog('修改', scope.row)">修改</el-button> - <el-button link type="danger" size="small" :icon="Delete" v-if="scope.row.taskUnitStatus === 2" @click="deleteInspectTask(scope.row)">删除</el-button> - <div @click="changeStatus(scope.row)"> - <el-switch v-model="scope.row.taskUnitStatus" inline-prompt active-text="开" inactive-text="关" :active-value="1" :inactive-value="2" style="margin: 0 10px" /> - </div> - </template> - </el-table-column> - </el-table> - <div class="pageBtn"> - <el-pagination @size-change="onHandleSizeChange" @current-change="onHandleCurrentChange" :pager-count="5" :page-sizes="[10, 20, 30]" v-model:current-page="tableData.params.pageIndex" background v-model:page-size="tableData.params.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="tableData.total" class="page-position"> </el-pagination> - </div> + </template> + </el-table-column> + <!-- <el-table-column prop="validTime" label="有效时间" show-overflow-tooltip>--> + <!-- <template #default="scope">--> + <!-- <span>--> + <!-- {{ scope.row.validTime }}--> + <!-- </span>--> + <!-- <span>--> + <!-- {{ parseNumber(scope.row.validTimeUnit, '检查频次') }}--> + <!-- </span>--> + <!-- </template>--> + <!-- </el-table-column>--> + <!-- <el-table-column prop="validTime" label="提醒时间" show-overflow-tooltip>--> + <!-- <template #default="scope">--> + <!-- <span>--> + <!-- {{ scope.row.noticeTime }}--> + <!-- </span>--> + <!-- <span>--> + <!-- {{ parseNumber(scope.row.noticeTimeUnit, '检查频次') }}--> + <!-- </span>--> + <!-- </template>--> + <!-- </el-table-column>--> + <el-table-column property="firstStartTime" label="任务开始时间" /> + <el-table-column prop="createUserName" label="创建人" show-overflow-tooltip></el-table-column> + <el-table-column prop="gmtCreate" label="创建时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="lastEditUserName" label="最后修改人" show-overflow-tooltip></el-table-column> + <el-table-column prop="gmtModitify" label="最后修改时间" show-overflow-tooltip></el-table-column> + <el-table-column property="taskUnitStatus" label="状态" width="60"> + <template #default="scope"> + <div> + <div v-if="scope.row.taskUnitStatus === 1"> + <el-tag :type="''"> + {{ '开启' }} + </el-tag> + </div> + <div v-if="scope.row.taskUnitStatus === 2"> + <el-tag :type="'danger'"> + {{ '关闭' }} + </el-tag> + </div> </div> - </div> + </template> + </el-table-column> + <el-table-column fixed="right" label="操作" align="center" width="300"> + <template #default="scope"> + <el-button link type="primary" size="small" :icon="View" @click="openInspectTaskDialog('查看', scope.row)">查看</el-button> + <el-button link type="primary" size="small" :icon="Edit" @click="openInspectTaskDialog('修改', scope.row)">修改</el-button> + <el-button link type="danger" size="small" :icon="Delete" v-if="scope.row.taskUnitStatus === 2" @click="deleteInspectTask(scope.row)">删除</el-button> + <div @click="changeStatus(scope.row)"> + <el-switch v-model="scope.row.taskUnitStatus" inline-prompt active-text="开" inactive-text="关" :active-value="1" :inactive-value="2" style="margin: 0 10px" /> + </div> + </template> + </el-table-column> + </el-table> + <div class="pageBtn"> + <el-pagination @size-change="onHandleSizeChange" @current-change="onHandleCurrentChange" :pager-count="5" :page-sizes="[10, 20, 30]" v-model:current-page="tableData.params.pageIndex" background v-model:page-size="tableData.params.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="tableData.total" class="page-position"> </el-pagination> + </div> </div> - <inspect-task-dialog ref="inspectTaskDialogRef" @refreshInspectTask="getInspectionTask"></inspect-task-dialog> - <upload-dialog ref="uploadRef" @refresh="getInspectionTask"></upload-dialog> + </div> </div> + <inspect-task-dialog ref="inspectTaskDialogRef" @refreshInspectTask="getInspectionTask"></inspect-task-dialog> + <upload-dialog ref="uploadRef" @refresh="getInspectionTask"></upload-dialog> + </div> </template> <script lang="ts"> @@ -139,514 +139,514 @@ import { facilityAreaApi } from '/@/api/intellectInspectSystem/facilityAreaManage'; import { RFIDApi } from '/@/api/intellectInspectSystem/RFID'; let global: any = { - homeChartOne: null, - homeChartTwo: null, - homeCharThree: null, - dispose: [null, '', undefined] + homeChartOne: null, + homeChartTwo: null, + homeCharThree: null, + dispose: [null, '', undefined] }; interface stateType { - tableData: { - inspectTaskData: []; - total: number; - loading: boolean; - params: { - pageIndex: number | null; - pageSize: number | null; - execDepId: number | null; - unitName: string | null; - workType: number | null; - createUserId: number | null; - execClassgroupId: number | null; - checkCycle: number | null; - checkCycleUnit: number | null; - }; + tableData: { + inspectTaskData: []; + total: number; + loading: boolean; + params: { + pageIndex: number | null; + pageSize: number | null; + execDepId: number | null; + unitName: string | null; + workType: number | null; + createUserId: number | null; + execClassgroupId: number | null; + checkCycle: number | null; + checkCycleUnit: number | null; }; - workTypeList: Array<type>; - quotaList: []; - departmentList: []; - classGroupList: Array<classGroup>; - inspectPointAllList: []; - regionNameList: []; - RFIDList: []; - timeType: Array<type>; + }; + workTypeList: Array<type>; + quotaList: []; + departmentList: []; + classGroupList: Array<classGroup>; + inspectPointAllList: []; + regionNameList: []; + RFIDList: []; + timeType: Array<type>; } interface type { - id: number; - name: string; + id: number; + name: string; } interface classGroup { - id: number; - groupName: string; + id: number; + groupName: string; } export default { - name: 'index', - components: { inspectTaskDialog, uploadDialog }, - setup() { - const inspectTaskDialogRef = ref(); - const uploadRef = ref() - const state = reactive<stateType>({ - tableData: { - inspectTaskData: [], - total: 0, - loading: false, - params: { - pageIndex: 1, - pageSize: 10, - unitName: null, - execDepId: null, - workType: null, - createUserId: null, - execClassgroupId: null, - checkCycle: null, - checkCycleUnit: null - } - }, - workTypeList: [ - { id: 1, name: '周期任务' }, - { id: 2, name: '单次任务' } - ], - quotaList: [], - departmentList: [], - classGroupList: [], - inspectPointAllList: [], - regionNameList: [], - RFIDList: [], - timeType: [ - { id: 1, name: '分' }, - { id: 2, name: '小时' }, - { id: 3, name: '日' }, - { id: 4, name: '月' }, - { id: 5, name: '年' } - ], - }); - - //获取巡检任务数据 - const getInspectionTask = async () => { - let res = await inspectTaskApi().getInspectTaskList(state.tableData.params); - if (res.data.code === '200') { - state.tableData.inspectTaskData = res.data.data.records; - state.tableData.total = res.data.data.total; - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - //获取部门 - const getDepartmentData = async () => { - let res = await departmentApi().getDepartmentList(); - if (res.data.code === '200') { - state.departmentList = res.data.data; - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - //获取部门 - // const getQuotaList = async () => { - // let res = await inspectTaskApi().getQuotaList(); - // if (res.data.code === '200') { - // state.quotaList = res.data.data; - // } else { - // ElMessage({ - // type: 'warning', - // message: res.data.msg - // }); - // } - // }; - //获取部门 - const getQuotaList = async () => { - let res = await inspectTaskApi().getAllQuotaList(); - if (res.data.code === '200') { - state.quotaList = res.data.data; - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); + name: 'index', + components: { inspectTaskDialog, uploadDialog }, + setup() { + const inspectTaskDialogRef = ref(); + const uploadRef = ref() + const state = reactive<stateType>({ + tableData: { + inspectTaskData: [], + total: 0, + loading: false, + params: { + pageIndex: 1, + pageSize: 10, + unitName: null, + execDepId: null, + workType: null, + createUserId: null, + execClassgroupId: null, + checkCycle: null, + checkCycleUnit: null } - }; + }, + workTypeList: [ + { id: 1, name: '周期任务' }, + { id: 2, name: '单次任务' } + ], + quotaList: [], + departmentList: [], + classGroupList: [], + inspectPointAllList: [], + regionNameList: [], + RFIDList: [], + timeType: [ + { id: 1, name: '分' }, + { id: 2, name: '小时' }, + { id: 3, name: '日' }, + { id: 4, name: '月' }, + { id: 5, name: '年' } + ], + }); - //获取巡检点 - const getInspectTaskPoint = async () => { - let res = await inspectPointApi().getInspectPointAll(); - if (res.data.code === '200') { - state.inspectPointAllList = res.data.data; - } else { + //获取巡检任务数据 + const getInspectionTask = async () => { + let res = await inspectTaskApi().getInspectTaskList(state.tableData.params); + if (res.data.code === '200') { + state.tableData.inspectTaskData = res.data.data.records; + state.tableData.total = res.data.data.total; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + //获取部门 + const getDepartmentData = async () => { + let res = await departmentApi().getDepartmentList(); + if (res.data.code === '200') { + state.departmentList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + //获取部门 + // const getQuotaList = async () => { + // let res = await inspectTaskApi().getQuotaList(); + // if (res.data.code === '200') { + // state.quotaList = res.data.data; + // } else { + // ElMessage({ + // type: 'warning', + // message: res.data.msg + // }); + // } + // }; + //获取部门 + const getQuotaList = async () => { + let res = await inspectTaskApi().getAllQuotaList(); + if (res.data.code === '200') { + state.quotaList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + //获取巡检点 + const getInspectTaskPoint = async () => { + let res = await inspectPointApi().getInspectPointAll(); + if (res.data.code === '200') { + state.inspectPointAllList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + //获取所有设施区域名称 + const initFacilityAreaType = async () => { + let res = await facilityAreaApi().getAllFacilityAreaList(); + if (res.data.code === '200') { + state.regionNameList = JSON.parse(JSON.stringify(res.data.data)); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + //获取所有RFID名称 + const initRFIDList = async () => { + let res = await RFIDApi().getAllRFIDList(); + if (res.data.code === '200') { + state.RFIDList = JSON.parse(JSON.stringify(res.data.data)); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + //获取班组 + const getClassGroupData = async () => { + let res = await teamManageApi().getRecord({ depIp: null, groupName: null, containGroupMemberEnable: null }); + if (res.data.code === '200') { + state.classGroupList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + const changeGroup = async () => { + if(state.tableData.params.execDepId === null) { + state.classGroupList = [] + }else{ + let res = await departmentApi().getByDepId({depId:state.tableData.params.execDepId}) + if(res.data.code === '200'){ + state.classGroupList = res.data.data + }else{ + + } + } + }; + + const changeStatus = async (value: { taskUnitStatus: number; id: number }) => { + if (value.taskUnitStatus === 2) { + ElMessageBox.confirm(`此操作将关闭该巡检任务”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + let res = await inspectTaskApi().openOrCloseInspectTask({ id: value.id, taskUnitStatus: 2 }); + if (res.data.code === '200') { + await getInspectionTask(); ElMessage({ - type: 'warning', - message: res.data.msg + type: 'success', + duration: 2000, + message: '关闭成功' }); - } - }; - - //获取所有设施区域名称 - const initFacilityAreaType = async () => { - let res = await facilityAreaApi().getAllFacilityAreaList(); - if (res.data.code === '200') { - state.regionNameList = JSON.parse(JSON.stringify(res.data.data)); - } else { + } else { ElMessage({ - type: 'warning', - message: res.data.msg + type: 'warning', + message: res.data.msg }); - } - }; - - //获取所有RFID名称 - const initRFIDList = async () => { - let res = await RFIDApi().getAllRFIDList(); - if (res.data.code === '200') { - state.RFIDList = JSON.parse(JSON.stringify(res.data.data)); - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - //获取班组 - const getClassGroupData = async () => { - let res = await teamManageApi().getRecord({ depIp: null, groupName: null, containGroupMemberEnable: null }); - if (res.data.code === '200') { - state.classGroupList = res.data.data; - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - const changeGroup = async () => { - if(state.tableData.params.execDepId === null) { - state.classGroupList = [] - }else{ - let res = await departmentApi().getByDepId({depId:state.tableData.params.execDepId}) - if(res.data.code === '200'){ - state.classGroupList = res.data.data - }else{ - - } - } - }; - - const changeStatus = async (value: { taskUnitStatus: number; id: number }) => { - if (value.taskUnitStatus === 2) { - ElMessageBox.confirm(`此操作将关闭该巡检任务”,是否继续?`, '提示', { - confirmButtonText: '确认', - cancelButtonText: '取消', - type: 'warning' - }) - .then(async () => { - let res = await inspectTaskApi().openOrCloseInspectTask({ id: value.id, taskUnitStatus: 2 }); - if (res.data.code === '200') { - await getInspectionTask(); - ElMessage({ - type: 'success', - duration: 2000, - message: '关闭成功' - }); - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }) - .catch((error) => {}); - } else { - ElMessageBox.confirm(`此操作将开启该巡检任务”,是否继续?`, '提示', { - confirmButtonText: '确认', - cancelButtonText: '取消', - type: 'warning' - }) - .then(async () => { - let res = await inspectTaskApi().openOrCloseInspectTask({ id: value.id, taskUnitStatus: 1 }); - if (res.data.code === '200') { - await getInspectionTask(); - ElMessage({ - type: 'success', - duration: 2000, - message: '开启成功' - }); - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }) - .catch((error) => {}); - } - await getInspectionTask(); - }; - - // 删除 - const deleteInspectTask = (row: any) => { - ElMessageBox.confirm(`此操作将永久删除该任务:“${row.unitName}”,是否继续?`, '提示', { - confirmButtonText: '确认', - cancelButtonText: '取消', - type: 'warning' + } }) - .then(async () => { - let res = await inspectTaskApi().deleteInspectTask({ id: row.id }); - if (res.data.code === '200') { - ElMessage({ - type: 'success', - duration: 2000, - message: '删除成功' - }); - await getInspectionTask(); - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }) - .catch(() => {}); - }; + .catch((error) => {}); + } else { + ElMessageBox.confirm(`此操作将开启该巡检任务”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + let res = await inspectTaskApi().openOrCloseInspectTask({ id: value.id, taskUnitStatus: 1 }); + if (res.data.code === '200') { + await getInspectionTask(); + ElMessage({ + type: 'success', + duration: 2000, + message: '开启成功' + }); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }) + .catch((error) => {}); + } + await getInspectionTask(); + }; - const openInspectTaskDialog = (type: string, value: {}) => { - inspectTaskDialogRef.value.showInspectTaskDialog(type, value, state.workTypeList, state.departmentList, state.timeType, state.classGroupList, state.quotaList, state.inspectPointAllList, state.regionNameList, state.RFIDList); - }; - - const parseNumber = (value: number, type: string) => { - if (type === '任务类型') { - return state.workTypeList.find((item) => item.id === value)?.name; - } else if (type === '检查频次') { - return state.timeType.find((item) => item.id == value)?.name; + // 删除 + const deleteInspectTask = (row: any) => { + ElMessageBox.confirm(`此操作将永久删除该任务:“${row.unitName}”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + let res = await inspectTaskApi().deleteInspectTask({ id: row.id }); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + duration: 2000, + message: '删除成功' + }); + await getInspectionTask(); } else { - return state.classGroupList.find((item) => item.id == value)?.groupName; + ElMessage({ + type: 'warning', + message: res.data.msg + }); } - }; + }) + .catch(() => {}); + }; - const openUploadDialog = (type: string)=>{ - uploadRef.value.open(type) - } + const openInspectTaskDialog = (type: string, value: {}) => { + inspectTaskDialogRef.value.showInspectTaskDialog(type, value, state.workTypeList, state.departmentList, state.timeType, state.classGroupList, state.quotaList, state.inspectPointAllList, state.regionNameList, state.RFIDList); + }; - // 分页改变 - const onHandleSizeChange = (val: number) => { - state.tableData.params.pageSize = val; - getInspectionTask(); - }; - // 分页改变 - const onHandleCurrentChange = (val: number) => { - state.tableData.params.pageIndex = val; - getInspectionTask(); - }; + const parseNumber = (value: number, type: string) => { + if (type === '任务类型') { + return state.workTypeList.find((item) => item.id === value)?.name; + } else if (type === '检查频次') { + return state.timeType.find((item) => item.id == value)?.name; + } else { + return state.classGroupList.find((item) => item.id == value)?.groupName; + } + }; - const reset = () => { - state.tableData.params = { - pageIndex: 1, - pageSize: 10, - unitName: null, - execDepId: null, - workType: null, - createUserId: null, - execClassgroupId: null, - checkCycle: null, - checkCycleUnit: null - }; - }; - - // 页面加载时 - onMounted(() => { - getInspectionTask(); - getQuotaList(); - getDepartmentData(); - getClassGroupData(); - getInspectTaskPoint(); - initFacilityAreaType(); - initRFIDList(); - }); - - return { - View, - Edit, - Delete, - Refresh, - Plus, - Upload, - reset, - openUploadDialog, - changeStatus, - changeGroup, - parseNumber, - deleteInspectTask, - getInspectionTask, - onHandleSizeChange, - onHandleCurrentChange, - inspectTaskDialogRef, - uploadRef, - openInspectTaskDialog, - ...toRefs(state) - }; + const openUploadDialog = (type: string)=>{ + uploadRef.value.open(type) } + + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.tableData.params.pageSize = val; + getInspectionTask(); + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.tableData.params.pageIndex = val; + getInspectionTask(); + }; + + const reset = () => { + state.tableData.params = { + pageIndex: 1, + pageSize: 10, + unitName: null, + execDepId: null, + workType: null, + createUserId: null, + execClassgroupId: null, + checkCycle: null, + checkCycleUnit: null + }; + }; + + // 页面加载时 + onMounted(() => { + getInspectionTask(); + getQuotaList(); + getDepartmentData(); + getClassGroupData(); + getInspectTaskPoint(); + initFacilityAreaType(); + initRFIDList(); + }); + + return { + View, + Edit, + Delete, + Refresh, + Plus, + Upload, + reset, + openUploadDialog, + changeStatus, + changeGroup, + parseNumber, + deleteInspectTask, + getInspectionTask, + onHandleSizeChange, + onHandleCurrentChange, + inspectTaskDialogRef, + uploadRef, + openInspectTaskDialog, + ...toRefs(state) + }; + } }; </script> <style scoped lang="scss"> $homeNavLengh: 8; .home-container { - height: calc(100vh - 144px); + height: calc(100vh - 144px); + box-sizing: border-box; + overflow: hidden; + position: relative; + .homeCard { + width: 100%; + padding: 20px; box-sizing: border-box; - overflow: hidden; - position: relative; - .homeCard { - width: 100%; - padding: 20px; - box-sizing: border-box; - background: #fff; - border-radius: 4px; - flex: 0 auto; + background: #fff; + border-radius: 4px; + flex: 0 auto; - .main-card { - width: 100%; - height: 100%; - .cardTop { - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: 20px; - .mainCardBtn { - margin: 0; - } - } - .pageBtn { - position: absolute; - width: 100%; - z-index: 99; - bottom: 0; - right: 0; - height: 60px; - border-radius: 0 0 4px 4px; - padding-right: 20px; - background: #fff; - display: flex; - align-items: center; - justify-content: right; - - .demo-pagination-block + .demo-pagination-block { - margin-top: 10px; - } - .demo-pagination-block .demonstration { - margin-bottom: 16px; - } - } - } - &:last-of-type { - flex: 1; - } - } - .el-row { + .main-card { + width: 100%; + height: 100%; + .cardTop { display: flex; align-items: center; + justify-content: space-between; margin-bottom: 20px; - &:last-child { - margin-bottom: 0; + .mainCardBtn { + margin: 0; } - .grid-content { - align-items: center; - min-height: 36px; - } + } + .pageBtn { + position: absolute; + width: 100%; + z-index: 99; + bottom: 0; + right: 0; + height: 60px; + border-radius: 0 0 4px 4px; + padding-right: 20px; + background: #fff; + display: flex; + align-items: center; + justify-content: right; - .topInfo { - display: flex; - align-items: center; - font-size: 16px; - font-weight: bold; - - & > div { - white-space: nowrap; - margin-right: 20px; - } + .demo-pagination-block + .demo-pagination-block { + margin-top: 10px; } - } -} -.stepItem { - width: 100%; - display: flex; - align-items: flex-start; - margin-bottom: 30px; - margin-left: 30px; - padding-bottom: 30px; - border-left: 2px solid #ccc; - &:first-of-type { - margin-top: 30px; + .demo-pagination-block .demonstration { + margin-bottom: 16px; + } + } } &:last-of-type { - margin-bottom: 0; - border-left: none; + flex: 1; } - .stepNum { - width: 30px; - height: 30px; - border-radius: 15px; - box-sizing: border-box; - color: #333; - border: 1px solid #999; - line-height: 28px; - text-align: center; - margin-right: 10px; - margin-left: -16px; - margin-top: -30px; + } + .el-row { + display: flex; + align-items: center; + margin-bottom: 20px; + &:last-child { + margin-bottom: 0; } - .stepCard { - width: 100%; - margin-top: -30px; + .grid-content { + align-items: center; + min-height: 36px; + } - .box-card { - width: 100%; - &:deep(.el-card__header) { - padding: 10px 15px; - } - .card-header { - width: 100%; - display: flex; - justify-content: space-between; - align-items: center; - & > div:first-of-type { - margin-right: 80px; - font-size: 18px; - font-weight: bold; - } - } + .topInfo { + display: flex; + align-items: center; + font-size: 16px; + font-weight: bold; + + & > div { + white-space: nowrap; + margin-right: 20px; + } + } + } +} +.stepItem { + width: 100%; + display: flex; + align-items: flex-start; + margin-bottom: 30px; + margin-left: 30px; + padding-bottom: 30px; + border-left: 2px solid #ccc; + &:first-of-type { + margin-top: 30px; + } + &:last-of-type { + margin-bottom: 0; + border-left: none; + } + .stepNum { + width: 30px; + height: 30px; + border-radius: 15px; + box-sizing: border-box; + color: #333; + border: 1px solid #999; + line-height: 28px; + text-align: center; + margin-right: 10px; + margin-left: -16px; + margin-top: -30px; + } + .stepCard { + width: 100%; + margin-top: -30px; + + .box-card { + width: 100%; + &:deep(.el-card__header) { + padding: 10px 15px; + } + .card-header { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + & > div:first-of-type { + margin-right: 80px; + font-size: 18px; + font-weight: bold; } + } } - &:hover .card-header { - color: #0098f5; - } - &:hover .stepNum { - border: 2px solid #0098f5; - color: #0098f5; - } + } + &:hover .card-header { + color: #0098f5; + } + &:hover .stepNum { + border: 2px solid #0098f5; + color: #0098f5; + } } .el-input { - width: 100% !important; + width: 100% !important; } :deep(.el-date-editor) { - width: 100%; + width: 100%; } .el-select { - width: 100%; + width: 100%; } :deep(.el-textarea.is-disabled .el-textarea__inner) { - background-color: var(--el-card-bg-color); - color: var(--el-input-text-color, var(--el-text-color-regular)); + background-color: var(--el-card-bg-color); + color: var(--el-input-text-color, var(--el-text-color-regular)); } :deep(.el-input.is-disabled .el-input__inner) { - color: var(--el-input-text-color, var(--el-text-color-regular)); + color: var(--el-input-text-color, var(--el-text-color-regular)); } :deep(.el-input.is-disabled .el-input__wrapper) { - background-color: var(--el-card-bg-color); + background-color: var(--el-card-bg-color); } </style> diff --git a/src/views/newHome/index.vue b/src/views/newHome/index.vue index e610d3e..e2d09ca 100644 --- a/src/views/newHome/index.vue +++ b/src/views/newHome/index.vue @@ -146,8 +146,10 @@ <div class="toplayer"> <img class="iconImg" src="../../assets/newMenu/icon9.png" /> <div> - <div class="itemTit">智能安全危险化学品全生命周期管控系统</div> - <div class="enTit">Intelligent Security Hazardous Chemicals Life Cycle Safety Management System </div> +<!-- <div class="itemTit">智能安全危险化学品全生命周期管控系统</div>--> +<!-- <div class="enTit">Intelligent Security Hazardous Chemicals Life Cycle Safety Management System</div>--> + <div class="itemTit">安全教育考试系统</div> + <div class="enTit">Safety Education Examination System</div> </div> </div> <img class="bgImg" src="../../assets/newMenu/card-10.png" /> @@ -358,22 +360,27 @@ }); }; // 去风险大屏 - const toRiskPlatform = () => { + const toRiskPlatform = async() => { // router.push({ // name: "warningScreen" // }); + const routePath = '/warningScreen'; + const resolvedRoute = router.resolve(routePath); + const fullPath = resolvedRoute.href + window.open(fullPath, '_blank'); + // window.open(fullPath, '_blank'); - window.open('http://39.104.85.193:8585/'); + // window.open('http://39.104.85.193:8585/'); }; const toDoublePrevent = () => { - window.open('http://124.88.37.66:6801'); + window.open('http://117.190.40.54:6801/login'); }; const toSmartFactory = () =>{ - window.open('http://10.211.134.139:5522/#/login'); + window.open('http://117.190.40.54:5522/#/login'); } const toManLocation = () =>{ - window.open('http://124.88.37.66:8081/location_system_5.4.9/login/login.html?company=GUOTAI&version=5.4.9'); + window.open('http://117.190.40.54:8081/location_system_5.4.9/login/login.html?company=GUOTAI&version=5.4.9'); } const throttle = (renderMenu: any, delay: number) => { let flag = true; @@ -424,7 +431,8 @@ }; const renderToNew = () => { - window.open('http://222.92.213.22:18001/smartlab/', '_blank'); + // window.open('http://222.92.213.22:18001/smartlab/', '_blank'); + window.open('http://106.15.95.149:8005/nanoweb/foreground/', '_blank'); }; // //点击进入特殊作业 // const toSpecialWorkSys = () => { diff --git a/src/views/newSpecialWorkSystem/workTicket/sqjl/index.vue b/src/views/newSpecialWorkSystem/workTicket/sqjl/index.vue index 20a5ac3..f8fdcc8 100644 --- a/src/views/newSpecialWorkSystem/workTicket/sqjl/index.vue +++ b/src/views/newSpecialWorkSystem/workTicket/sqjl/index.vue @@ -34,6 +34,13 @@ /> </el-select> </div> + <div class="basic-line" style="display:flex;white-space:nowrap;line-height: 40px"> + <span>作业票编号:</span> + <el-input + v-model="searPara.workPermitNo" + placeholder="请输入作业票编号" + /> + </div> <div style="margin-left: 20px"> <el-button type="primary" @click="searchRecord">查询</el-button> <el-button plain @click="clearSearch">重置</el-button> @@ -59,7 +66,12 @@ <el-table-column property="applyDepName" label="作业所在车间" align="center"/> <el-table-column property="workContent" label="作业内容" align="center"/> <el-table-column property="workTypeDesc" label="作业类型" align="center"/> - <el-table-column property="workDepName" label="作业单位" align="center"/> + <el-table-column label="作业单位" align="center"> + <template #default="scope"> + <span v-if="scope.row.workDepList && scope.row.workDepList.length>0">{{scope.row.workDepList.map(i=>i.workDepName).join(',')}}</span> + <span v-else>{{scope.row.workDepName }}</span> + </template> + </el-table-column> <el-table-column property="headList" label="负责人及电话" align="center"> <template #default="scope"> {{scope.row.headList.map(i=>{return i.userName + '(' + i.phone+ ')' }).join(',')}} @@ -328,6 +340,7 @@ searPara:{ startTime: '', endTime: '', + workPermitNo: '', workType: null, headUserName: '', secondDepId: null @@ -365,48 +378,72 @@ ], statusList: [ { - value: -1, - label: '废止' - }, - { value: 0, - label: '风险研判中' + label: '风险研判' }, { value: 1, - label: '票证办理中' + label: '票证办理' }, { value: 2, - label: '安全措施确认中' + label: '气体分析' }, { value: 3, - label: '培训交底中' + label: '安全措施确认,培训交底' }, { value: 4, - label: '气体分析中' + label: '安全措施确认' }, { value: 5, - label: '作业开始' + label: '培训交底' }, { value: 6, - label: '作业监护' + label: '部门审批' }, { value: 7, - label: '作业结束' + label: '作业票填报结束' }, { value: 8, - label: '作业验收' + label: '作业气体分析不合格' }, { value: 9, - label: '安全措施确认,培训交底中' + label: '审批未通过' + }, + { + value: 10, + label: '开始' + }, + { + value: 11, + label: '监护' + }, + { + value: 12, + label: '结束' + }, + { + value: 13, + label: '待验收' + }, + { + value: 14, + label: '验收完成' + }, + { + value: 15, + label: '取消' + }, + { + value: 16, + label: '废止作业票' } ], timeRange: [] @@ -504,6 +541,7 @@ // 关键词查询记录 const searchRecord = async () => { + state.pageIndex1 = 1 getListByPage(); }; // 重置搜索 @@ -512,10 +550,12 @@ state.searPara = { startTime: '', endTime: '', + workPermitNo: '', workType: null, headUserName: '', secondDepId: null }; + state.pageIndex1 = 1 getListByPage(); }; diff --git a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/brokenDialog.vue b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/brokenDialog.vue index aa9da97..3d640aa 100644 --- a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/brokenDialog.vue +++ b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/brokenDialog.vue @@ -12,13 +12,21 @@ </el-row> <el-row> <el-col :span="12"> - <el-form-item label="作业单位" prop="workDepId"> - <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="lists.departList" :show-all-levels="false"/> + <el-form-item label="作业单位" prop="workDepIds"> + <el-cascader style="width: 100%" v-model="form.workDepIds" :props="depProps" @change="getWorkerList" :options="lists.departList" :show-all-levels="false"/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="涉及相关单位(部门)" prop="workDetail.involvedDepIds"> - <el-cascader style="width: 100%" v-model="form.workDetail.involvedDepIds" :props="depProps2" :options="lists.departList" :show-all-levels="false"/> + <el-form-item label="作业人" prop="operatorUids"> + <el-select v-model="form.operatorUids" filterable multiple clearable> + <el-option + v-for="item in zyList" + :key="item.uid" + :label="item.realName" + :value="item.uid" + /> + </el-select> + <!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -84,16 +92,8 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" filterable multiple clearable> - <el-option - v-for="item in lists.spList.opList" - :key="item.uid" - :label="item.realName" - :value="item.uid" - /> - </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> + <el-form-item label="涉及相关单位(部门)" prop="workDetail.involvedDepIds"> + <el-cascader style="width: 100%" v-model="form.workDetail.involvedDepIds" :props="depProps2" :options="lists.departList" :show-all-levels="false"/> </el-form-item> </el-col> </el-row> @@ -376,6 +376,7 @@ depProps:{}, depProps2:{}, safetyMeasureBasicList: [], + zyList: [] fileList: Array<file>, uploadUrl: string, dialogVisible: Boolean, @@ -398,6 +399,7 @@ showDialog: false, equipmentDialog: false, safetyMeasureBasicList: [], + zyList: [], form: { id: null, workType: 5, @@ -410,7 +412,7 @@ headUids: [], analystUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -440,6 +442,7 @@ expandTrigger: 'hover', label: 'depName', value: 'depId', + multiple: true, checkStrictly: true, emitPath: false }, @@ -464,7 +467,7 @@ workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workDepIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], analystUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], @@ -485,16 +488,26 @@ const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { - getBasicData() + }); const openWorkSelect = ()=>{ workSelectRef.value.openDialog(state.form.involveOtherWork) } - + const getWorkerList = ()=>{ + const filteredList = props.lists.spList.opList.filter(i => state.form.workDepIds.includes(i.depId)); + if(filteredList && filteredList.length>0){ + state.zyList = filteredList + }else{ + state.zyList = props.lists.spList.opList + } + } const getSelected = ()=>{ state.form.involveOtherWork = workSelectRef.value.selected } const openDialog = (row)=>{ + clearFile() + state.zyList = props.lists.spList.opList + getBasicData() Object.keys(state.form).forEach(key => { if (row.hasOwnProperty(key)) { state.form[key] = JSON.parse(JSON.stringify(row))[key]; @@ -525,6 +538,12 @@ } }) state.form.workDetail.bcPath = row.workDetail.bcPath.split(',').map(item => item.match(/specialWork9step\/(.*?)\?/)[1]) + if(row.workDepList && row.workDepList.length>0){ + state.form.workDepIds = row.workDepList.map(i=>i.workDepId) + }else{ + state.form.workDepIds.push(row.workDepId) + } + getWorkerList() state.showDialog = true } @@ -541,7 +560,7 @@ headUids: [], analystUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -595,16 +614,16 @@ const res = await workApplyApi().getFormData(5) if (res.data.code === '200') { state.safetyMeasureBasicList = JSON.parse(JSON.stringify(res.data.data.safetyMeasureBasicList)) - if(res.data.data.approvalDepBasicList && res.data.data.approvalDepBasicList.length>0){ - state.form.approvalDepBasicList = res.data.data.approvalDepBasicList.map(({id,content})=>({ - content, - approvalDepBasicId: id, - approvalUids: [], - approvalType: null - })) - }else{ - state.form.approvalDepBasicList = [] - } + // if(res.data.data.approvalDepBasicList && res.data.data.approvalDepBasicList.length>0){ + // state.form.approvalDepBasicList = res.data.data.approvalDepBasicList.map(({id,content})=>({ + // content, + // approvalDepBasicId: id, + // approvalUids: [], + // approvalType: null + // })) + // }else{ + // state.form.approvalDepBasicList = [] + // } } else { ElMessage({ type: 'warning', @@ -822,6 +841,7 @@ return { renderMenu, getBasicData, + getWorkerList, getStartEndIds, getSafetyIds, isFirstRow, diff --git a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/detailLog.vue b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/detailLog.vue index 132292e..a8915c1 100644 --- a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/detailLog.vue +++ b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/detailLog.vue @@ -119,12 +119,14 @@ <div class="d-tit">作业地址</div><div class="d-cont">{{details.workLocation}}</div> </div> <div class="d-row"> - <div class="d-tit">作业单位</div><div class="d-cont">{{details.workDepName}}</div> + <div class="d-tit">作业单位</div> + <div class="d-cont" v-if="details.workDepList && details.workDepList.length>0">{{details.workDepList.map(i=>i.workDepName).join(',')}}</div> + <div class="d-cont" v-else>{{details.workDepName}}</div> </div> <div class="d-row"> <div class="d-tit">作业人</div><div class="d-cont">{{details.operatorList.map(i=>{return i.userName + '(' + i.phone+ ')' }).join('、')}}</div> </div> - <div class="d-row"> + <div class="d-row" v-if="details.involveOtherWork && details.involveOtherWork !== ''"> <div class="d-tit">关联其他作业</div><div class="d-cont">{{details.involveOtherWork}}</div> </div> diff --git a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/fireDialog.vue b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/fireDialog.vue index fdf1be0..d984ea7 100644 --- a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/fireDialog.vue +++ b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/fireDialog.vue @@ -46,33 +46,21 @@ </el-row> <el-row> <el-col :span="12"> - <el-form-item label="动火方式" prop="workDetail.workMethod"> - <el-input - v-model="form.workDetail.workMethod" - :autosize="{ minRows: 1 }" - type="textarea" - placeholder="请输入动火方式" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" filterable multiple clearable> + <el-form-item label="动火方式" prop="workDetail.methodList"> +<!-- <el-input--> +<!-- v-model="form.workDetail.workMethod"--> +<!-- :autosize="{ minRows: 1 }"--> +<!-- type="textarea"--> +<!-- placeholder="请输入动火方式"--> +<!-- />--> + <el-select v-model="form.workDetail.methodList" filterable multiple clearable> <el-option - v-for="item in lists.spList.opList" - :key="item.uid" - :label="item.realName" - :value="item.uid" + v-for="item in fireWorkList" + :key="item.id" + :label="item.name" + :value="item.name" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业单位" prop="workDepId"> - <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="lists.departList" :show-all-levels="false"/> </el-form-item> </el-col> <el-col :span="12"> @@ -85,7 +73,39 @@ :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + </el-form-item> + </el-col> + </el-row> + <el-row v-if="form.workDetail.methodList.find(i=>i == '其他')"> + <el-col :span="12"> + <el-form-item label="其他方式" prop="workDetail.other"> + <el-input + v-model="form.workDetail.other" + :autosize="{ minRows: 1 }" + type="textarea" + placeholder="请输入其他动火方式" + /> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="作业单位" prop="workDepIds"> + <el-cascader style="width: 100%" v-model="form.workDepIds" :props="depProps" @change="getWorkerList" :options="lists.departList" :show-all-levels="false"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="作业人" prop="operatorUids"> + <el-select v-model="form.operatorUids" filterable multiple clearable> + <el-option + v-for="item in zyList" + :key="item.uid" + :label="item.realName" + :value="item.uid" + /> + </el-select> + <!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -347,9 +367,11 @@ interface stateType { form: Object, workLevelList: Array<any>, + fireWorkList: Array<any>, equipmentDialog: boolean, tabLoading: boolean showDialog: boolean + zyList: [] props1:{} depProps:{} safetyMeasureBasicList: [] @@ -366,6 +388,7 @@ showDialog: false, equipmentDialog: false, safetyMeasureBasicList: [], + zyList: [], form: { id: null, workType: 1, @@ -378,7 +401,7 @@ headUids: [], analystUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -390,7 +413,9 @@ startOrEndUids: [], cameraIds: [], workDetail: { - workMethod: '' + workMethod: '', + methodList: [], + other: '' }, remark: '' }, @@ -408,6 +433,52 @@ value: 3 } ], + fireWorkList: [ + { + name: "电焊", + id: 1 + }, + { + name: "气割", + id: 2 + }, + { + name: "切割", + id: 3 + }, + { + name: "打磨", + id: 4 + }, + { + name: "钻孔", + id: 5 + }, + { + name: "喷灯", + id: 6 + }, + { + name: "烘烤", + id: 7 + }, + { + name: "喷砂", + id: 8 + }, + { + name: "破碎地面", + id: 9 + }, + { + name: "清洗机", + id: 10 + }, + { + name: "其他", + id: 11 + } + ], props1:{ expandTrigger: 'hover', label: 'depName', @@ -418,6 +489,7 @@ expandTrigger: 'hover', label: 'depName', value: 'depId', + multiple: true, checkStrictly: true, emitPath: false } @@ -429,7 +501,7 @@ workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workDepIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], analystUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], @@ -441,20 +513,31 @@ acceptUid: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], lastApprover: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], startOrEndUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.workMethod": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] + "workDetail.methodList": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + "workDetail.other": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] }); const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { - getBasicData() + // getBasicData() }) onUpdated(()=>{ console.log('false loading') }) - + const getWorkerList = ()=>{ + const filteredList = props.lists.spList.opList.filter(i => state.form.workDepIds.includes(i.depId)); + if(filteredList && filteredList.length>0){ + state.zyList = filteredList + }else{ + state.zyList = props.lists.spList.opList + } + } const openDialog = (row)=>{ + clearFile() + state.zyList = props.lists.spList.opList + getBasicData() Object.keys(state.form).forEach(key => { if (row.hasOwnProperty(key)) { state.form[key] = JSON.parse(JSON.stringify(row))[key] @@ -469,15 +552,28 @@ state.form.cameraIds = row.workApprovalDeviceList.map(i=>i.deviceId) state.form.safetyMeasureUids = row.safetyMeasureList.map(i=>i.userId) state.form.approvalDepBasicList = row.approvalDepList.map((item)=>({ - content: item.content, - approvalDepBasicId: item.approvalDepBasicId, - approvalUids: item.approvalPersonList.filter(j=>j.type == 5).map(i=>i.userId), - approvalType: item.approvalType + content: item.content, + approvalDepBasicId: item.approvalDepBasicId, + approvalUids: item.approvalPersonList.filter(j=>j.type == 5).map(i=>i.userId), + approvalType: item.approvalType })) + console.log(state.form.approvalDepBasicList,777) state.form.acceptUid = row.acceptUser.userId state.form.startOrEndUids = row.startOrEndList.map(i=>i.userId) state.form.lastApprover = row.lastApprover.userId - console.log(state.form,'form') + state.form.workDetail.methodList = state.form.workDetail.workMethod.split(',') + if(row.workDepList && row.workDepList.length>0){ + state.form.workDepIds = row.workDepList.map(i=>i.workDepId) + }else{ + state.form.workDepIds.push(row.workDepId) + } + for(let i in state.form.workDetail.methodList){ + if(!state.fireWorkList.find(item=>item.name == state.form.workDetail.methodList[i])){ + state.form.workDetail.other = state.form.workDetail.methodList[i] + state.form.workDetail.methodList[i] = '其他' + } + } + getWorkerList() state.showDialog = true } @@ -494,7 +590,7 @@ headUids: [], analystUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -506,7 +602,9 @@ startOrEndUids: [], cameraIds: [], workDetail: { - workMethod: '' + workMethod: '', + methodList: [], + other: '' }, remark: '' } @@ -628,6 +726,13 @@ // } state.form.riskIdentification = state.form.riskIdentification.join(',') const {...data} = state.form + data.workDetail.methodList = data.workDetail.methodList.map(item=>{ + if(item == '其他'){ + item = data.workDetail.other + } + return item + }) + data.workDetail.workMethod = data.workDetail.methodList.join(',') data.operatorUids = transform2Arr(data.operatorUids) data.headUids = transform2Arr(data.headUids) // data.analystUids = transformArr(data.analystUids) @@ -697,6 +802,7 @@ renderMenu, getBasicData, getStartEndIds, + getWorkerList, getSafetyIds, isFirstRow, submitForm, diff --git a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/groundDialog.vue b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/groundDialog.vue index cfc65e5..6d8e8a3 100644 --- a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/groundDialog.vue +++ b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/groundDialog.vue @@ -22,26 +22,6 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" multiple clearable> - <el-option - v-for="item in lists.spList.opList" - :key="item.uid" - :label="item.realName" - :value="item.uid" - /> - </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业单位" prop="workDepId"> - <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="lists.departList" :show-all-levels="false"/> - </el-form-item> - </el-col> - <el-col :span="12"> <el-form-item label="作业负责人" prop="headUids"> <el-select v-model="form.headUids" multiple filterable @change="getStartEndIds" clearable> <el-option @@ -51,7 +31,27 @@ :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="作业单位" prop="workDepIds"> + <el-cascader style="width: 100%" v-model="form.workDepIds" :props="depProps" @change="getWorkerList" :options="lists.departList" :show-all-levels="false"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="作业人" prop="operatorUids"> + <el-select v-model="form.operatorUids" multiple clearable> + <el-option + v-for="item in zyList" + :key="item.uid" + :label="item.realName" + :value="item.uid" + /> + </el-select> + <!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -360,6 +360,7 @@ props1:{}, depProps:{}, safetyMeasureBasicList: [], + zyList: [] fileList: Array<file>, uploadUrl: string, dialogVisible: Boolean, @@ -382,6 +383,7 @@ showDialog: false, equipmentDialog: false, safetyMeasureBasicList: [], + zyList: [], form: { id: null, workType: 4, @@ -393,7 +395,7 @@ operatorUids: [], headUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -421,6 +423,7 @@ expandTrigger: 'hover', label: 'depName', value: 'depId', + multiple: true, checkStrictly: true, emitPath: false }, @@ -437,7 +440,7 @@ workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workDepIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], riskIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], @@ -455,17 +458,27 @@ const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { - getBasicData() + // getBasicData() }); const openWorkSelect = ()=>{ workSelectRef.value.openDialog(state.form.involveOtherWork) } - + const getWorkerList = ()=>{ + const filteredList = props.lists.spList.opList.filter(i => state.form.workDepIds.includes(i.depId)); + if(filteredList && filteredList.length>0){ + state.zyList = filteredList + }else{ + state.zyList = props.lists.spList.opList + } + } const getSelected = ()=>{ state.form.involveOtherWork = workSelectRef.value.selected } const openDialog = (row)=>{ + clearFile() + state.zyList = props.lists.spList.opList + getBasicData() Object.keys(state.form).forEach(key => { if (row.hasOwnProperty(key)) { state.form[key] = JSON.parse(JSON.stringify(row))[key]; @@ -495,6 +508,12 @@ } }) state.form.workDetail.gbPath = row.workDetail.gbPath.split(',').map(item => item.match(/specialWork9step\/(.*?)\?/)[1]) + if(row.workDepList && row.workDepList.length>0){ + state.form.workDepIds = row.workDepList.map(i=>i.workDepId) + }else{ + state.form.workDepIds.push(row.workDepId) + } + getWorkerList() state.showDialog = true } @@ -510,7 +529,7 @@ operatorUids: [], headUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -562,16 +581,16 @@ const res = await workApplyApi().getFormData(4) if (res.data.code === '200') { state.safetyMeasureBasicList = JSON.parse(JSON.stringify(res.data.data.safetyMeasureBasicList)) - if(res.data.data.approvalDepBasicList && res.data.data.approvalDepBasicList.length>0){ - state.form.approvalDepBasicList = res.data.data.approvalDepBasicList.map(({id,content})=>({ - content, - approvalDepBasicId: id, - approvalUids: [], - approvalType: null - })) - }else{ - state.form.approvalDepBasicList = [] - } + // if(res.data.data.approvalDepBasicList && res.data.data.approvalDepBasicList.length>0){ + // state.form.approvalDepBasicList = res.data.data.approvalDepBasicList.map(({id,content})=>({ + // content, + // approvalDepBasicId: id, + // approvalUids: [], + // approvalType: null + // })) + // }else{ + // state.form.approvalDepBasicList = [] + // } } else { ElMessage({ type: 'warning', @@ -829,6 +848,7 @@ return { renderMenu, getBasicData, + getWorkerList, getStartEndIds, getSafetyIds, isFirstRow, diff --git a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/heightDialog.vue b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/heightDialog.vue index 40edfb2..d587381 100644 --- a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/heightDialog.vue +++ b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/heightDialog.vue @@ -55,26 +55,6 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" filterable multiple clearable> - <el-option - v-for="item in lists.spList.opList" - :key="item.uid" - :label="item.realName" - :value="item.uid" - /> - </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业单位" prop="workDepId"> - <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="lists.departList" :show-all-levels="false"/> - </el-form-item> - </el-col> - <el-col :span="12"> <el-form-item label="作业负责人" prop="headUids"> <el-select v-model="form.headUids" filterable multiple @change="getStartEndIds" clearable> <el-option @@ -84,7 +64,27 @@ :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="作业单位" prop="workDepIds"> + <el-cascader style="width: 100%" v-model="form.workDepIds" :props="depProps" @change="getWorkerList" :options="lists.departList" :show-all-levels="false"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="作业人" prop="operatorUids"> + <el-select v-model="form.operatorUids" filterable multiple clearable> + <el-option + v-for="item in zyList" + :key="item.uid" + :label="item.realName" + :value="item.uid" + /> + </el-select> + <!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -303,6 +303,7 @@ props1:{}, depProps:{}, safetyMeasureBasicList: [] + zyList: [] tabLoading: boolean } export default defineComponent({ @@ -317,6 +318,7 @@ showDialog: false, equipmentDialog: false, safetyMeasureBasicList: [], + zyList: [], form: { id: null, workType: 6, @@ -328,7 +330,7 @@ operatorUids: [], headUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -372,6 +374,7 @@ expandTrigger: 'hover', label: 'depName', value: 'depId', + multiple: true, checkStrictly: true, emitPath: false } @@ -383,7 +386,7 @@ workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workDepIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], riskIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], @@ -399,16 +402,26 @@ const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { - getBasicData() + // getBasicData() }); const openWorkSelect = ()=>{ workSelectRef.value.openDialog(state.form.involveOtherWork) } - + const getWorkerList = ()=>{ + const filteredList = props.lists.spList.opList.filter(i => state.form.workDepIds.includes(i.depId)); + if(filteredList && filteredList.length>0){ + state.zyList = filteredList + }else{ + state.zyList = props.lists.spList.opList + } + } const getSelected = ()=>{ state.form.involveOtherWork = workSelectRef.value.selected } const openDialog = (row)=>{ + clearFile() + state.zyList = props.lists.spList.opList + getBasicData() Object.keys(state.form).forEach(key => { if (row.hasOwnProperty(key)) { state.form[key] = JSON.parse(JSON.stringify(row))[key]; @@ -431,6 +444,12 @@ state.form.acceptUid = row.acceptUser.userId state.form.startOrEndUids = row.startOrEndList.map(i=>i.userId) state.form.lastApprover = row.lastApprover.userId + if(row.workDepList && row.workDepList.length>0){ + state.form.workDepIds = row.workDepList.map(i=>i.workDepId) + }else{ + state.form.workDepIds.push(row.workDepId) + } + getWorkerList() state.showDialog = true } @@ -446,7 +465,7 @@ operatorUids: [], headUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -496,16 +515,16 @@ const res = await workApplyApi().getFormData(6) if (res.data.code === '200') { state.safetyMeasureBasicList = JSON.parse(JSON.stringify(res.data.data.safetyMeasureBasicList)) - if(res.data.data.approvalDepBasicList && res.data.data.approvalDepBasicList.length>0){ - state.form.approvalDepBasicList = res.data.data.approvalDepBasicList.map(({id,content})=>({ - content, - approvalDepBasicId: id, - approvalUids: [], - approvalType: null - })) - }else{ - state.form.approvalDepBasicList = [] - } + // if(res.data.data.approvalDepBasicList && res.data.data.approvalDepBasicList.length>0){ + // state.form.approvalDepBasicList = res.data.data.approvalDepBasicList.map(({id,content})=>({ + // content, + // approvalDepBasicId: id, + // approvalUids: [], + // approvalType: null + // })) + // }else{ + // state.form.approvalDepBasicList = [] + // } } else { ElMessage({ type: 'warning', @@ -657,6 +676,7 @@ return { renderMenu, getBasicData, + getWorkerList, getStartEndIds, getSafetyIds, isFirstRow, diff --git a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/hoistDialog.vue b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/hoistDialog.vue index dab9391..d98c55a 100644 --- a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/hoistDialog.vue +++ b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/hoistDialog.vue @@ -65,26 +65,6 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" filterable multiple clearable> - <el-option - v-for="item in lists.spList.opList" - :key="item.uid" - :label="item.realName" - :value="item.uid" - /> - </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业单位" prop="workDepId"> - <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="lists.departList" :show-all-levels="false"/> - </el-form-item> - </el-col> - <el-col :span="12"> <el-form-item label="作业负责人" prop="headUids"> <el-select v-model="form.headUids" multiple filterable @change="getStartEndIds" clearable> <el-option @@ -94,7 +74,27 @@ :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="作业单位" prop="workDepIds"> + <el-cascader style="width: 100%" v-model="form.workDepIds" :props="depProps" @change="getWorkerList" :options="lists.departList" :show-all-levels="false"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="作业人" prop="operatorUids"> + <el-select v-model="form.operatorUids" filterable multiple clearable> + <el-option + v-for="item in zyList" + :key="item.uid" + :label="item.realName" + :value="item.uid" + /> + </el-select> + <!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -367,6 +367,7 @@ showDialog: boolean props1:{} depProps:{} + zyList: [] safetyMeasureBasicList: [] tabLoading: boolean } @@ -382,6 +383,7 @@ showDialog: false, equipmentDialog: false, safetyMeasureBasicList: [], + zyList: [], form: { id: null, workType: 3, @@ -394,7 +396,7 @@ headUids: [], analystUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -436,6 +438,7 @@ expandTrigger: 'hover', label: 'depName', value: 'depId', + multiple: true, checkStrictly: true, emitPath: false } @@ -447,7 +450,7 @@ workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workDepIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], analystUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], @@ -466,16 +469,26 @@ const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { - getBasicData() + // getBasicData() }); const openWorkSelect = ()=>{ workSelectRef.value.openDialog(state.form.involveOtherWork) } - + const getWorkerList = ()=>{ + const filteredList = props.lists.spList.opList.filter(i => state.form.workDepIds.includes(i.depId)); + if(filteredList && filteredList.length>0){ + state.zyList = filteredList + }else{ + state.zyList = props.lists.spList.opList + } + } const getSelected = ()=>{ state.form.involveOtherWork = workSelectRef.value.selected } const openDialog = (row)=>{ + clearFile() + state.zyList = props.lists.spList.opList + getBasicData() Object.keys(state.form).forEach(key => { if (row.hasOwnProperty(key)) { state.form[key] = JSON.parse(JSON.stringify(row))[key]; @@ -499,6 +512,12 @@ state.form.acceptUid = row.acceptUser.userId state.form.startOrEndUids = row.startOrEndList.map(i=>i.userId) state.form.lastApprover = row.lastApprover.userId + if(row.workDepList && row.workDepList.length>0){ + state.form.workDepIds = row.workDepList.map(i=>i.workDepId) + }else{ + state.form.workDepIds.push(row.workDepId) + } + getWorkerList() state.showDialog = true } @@ -515,7 +534,7 @@ headUids: [], analystUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -567,16 +586,16 @@ const res = await workApplyApi().getFormData(3) if (res.data.code === '200') { state.safetyMeasureBasicList = JSON.parse(JSON.stringify(res.data.data.safetyMeasureBasicList)) - if(res.data.data.approvalDepBasicList && res.data.data.approvalDepBasicList.length>0){ - state.form.approvalDepBasicList = res.data.data.approvalDepBasicList.map(({id,content})=>({ - content, - approvalDepBasicId: id, - approvalUids: [], - approvalType: null - })) - }else{ - state.form.approvalDepBasicList = [] - } + // if(res.data.data.approvalDepBasicList && res.data.data.approvalDepBasicList.length>0){ + // state.form.approvalDepBasicList = res.data.data.approvalDepBasicList.map(({id,content})=>({ + // content, + // approvalDepBasicId: id, + // approvalUids: [], + // approvalType: null + // })) + // }else{ + // state.form.approvalDepBasicList = [] + // } } else { ElMessage({ type: 'warning', @@ -711,6 +730,7 @@ return { renderMenu, getBasicData, + getWorkerList, getStartEndIds, getSafetyIds, isFirstRow, diff --git a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/plateDialog.vue b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/plateDialog.vue index 6be01e2..3567cec 100644 --- a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/plateDialog.vue +++ b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/plateDialog.vue @@ -144,16 +144,16 @@ </el-row> <el-row> <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" filterable multiple clearable> + <el-form-item label="作业负责人" prop="headUids"> + <el-select v-model="form.headUids" multiple filterable @change="getStartEndIds" clearable> <el-option - v-for="item in lists.spList.opList" + v-for="item in lists.workerList" :key="item.uid" - :label="item.realName" + :label="item.username" :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> <el-col :span="12" class="valueSelect"> @@ -175,21 +175,21 @@ </el-row> <el-row> <el-col :span="12"> - <el-form-item label="作业单位" prop="workDepId"> - <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="lists.departList" :show-all-levels="false"/> + <el-form-item label="作业单位" prop="workDepIds"> + <el-cascader style="width: 100%" v-model="form.workDepIds" :props="depProps" @change="getWorkerList" :options="lists.departList" :show-all-levels="false"/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="作业负责人" prop="headUids"> - <el-select v-model="form.headUids" multiple filterable @change="getStartEndIds" clearable> + <el-form-item label="作业人" prop="operatorUids"> + <el-select v-model="form.operatorUids" filterable multiple clearable> <el-option - v-for="item in lists.workerList" + v-for="item in zyList" :key="item.uid" - :label="item.username" + :label="item.realName" :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -413,6 +413,7 @@ props1:{}, depProps:{}, safetyMeasureBasicList: [], + zyList: [] fileList: Array<file>, uploadUrl: string, imgLimit: number, @@ -433,6 +434,7 @@ showDialog: false, equipmentDialog: false, safetyMeasureBasicList: [], + zyList: [], form: { id: null, workType: 8, @@ -444,7 +446,7 @@ operatorUids: [], headUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -490,6 +492,7 @@ expandTrigger: 'hover', label: 'depName', value: 'depId', + multiple: true, checkStrictly: true, emitPath: false }, @@ -504,7 +507,7 @@ workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workDepIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], riskIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], @@ -530,17 +533,27 @@ const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { - getBasicData() + // getBasicData() }); const openWorkSelect = ()=>{ workSelectRef.value.openDialog(state.form.involveOtherWork) } - + const getWorkerList = ()=>{ + const filteredList = props.lists.spList.opList.filter(i => state.form.workDepIds.includes(i.depId)); + if(filteredList && filteredList.length>0){ + state.zyList = filteredList + }else{ + state.zyList = props.lists.spList.opList + } + } const getSelected = ()=>{ state.form.involveOtherWork = workSelectRef.value.selected } const openDialog = (row)=>{ + clearFile() + state.zyList = props.lists.spList.opList + getBasicData() Object.keys(state.form).forEach(key => { if (row.hasOwnProperty(key)) { state.form[key] = JSON.parse(JSON.stringify(row))[key]; @@ -570,6 +583,12 @@ } }) state.form.workDetail.bpLocationMapPath = row.workDetail.bpLocationMapPath.split(',').map(item => item.match(/specialWork9step\/(.*?)\?/)[1]) + if(row.workDepList && row.workDepList.length>0){ + state.form.workDepIds = row.workDepList.map(i=>i.workDepId) + }else{ + state.form.workDepIds.push(row.workDepId) + } + getWorkerList() state.showDialog = true } @@ -585,7 +604,7 @@ operatorUids: [], headUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -645,16 +664,16 @@ const res = await workApplyApi().getFormData(8) if (res.data.code === '200') { state.safetyMeasureBasicList = JSON.parse(JSON.stringify(res.data.data.safetyMeasureBasicList)) - if(res.data.data.approvalDepBasicList && res.data.data.approvalDepBasicList.length>0){ - state.form.approvalDepBasicList = res.data.data.approvalDepBasicList.map(({id,content})=>({ - content, - approvalDepBasicId: id, - approvalUids: [], - approvalType: null - })) - }else{ - state.form.approvalDepBasicList = [] - } + // if(res.data.data.approvalDepBasicList && res.data.data.approvalDepBasicList.length>0){ + // state.form.approvalDepBasicList = res.data.data.approvalDepBasicList.map(({id,content})=>({ + // content, + // approvalDepBasicId: id, + // approvalUids: [], + // approvalType: null + // })) + // }else{ + // state.form.approvalDepBasicList = [] + // } } else { ElMessage({ type: 'warning', @@ -877,6 +896,7 @@ return { renderMenu, getBasicData, + getWorkerList, getStartEndIds, getSafetyIds, isFirstRow, diff --git a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/powerDialog.vue b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/powerDialog.vue index f05b607..03b1c55 100644 --- a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/powerDialog.vue +++ b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/powerDialog.vue @@ -79,36 +79,36 @@ </el-row> <el-row> <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" filterable multiple clearable> + <el-form-item label="作业负责人" prop="headUids"> + <el-select v-model="form.headUids" multiple filterable @change="getStartEndIds" clearable> <el-option - v-for="item in lists.spList.opList" + v-for="item in lists.workerList" :key="item.uid" - :label="item.realName" + :label="item.username" :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> - <el-form-item label="作业单位" prop="workDepId"> - <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="lists.departList" :show-all-levels="false"/> + <el-form-item label="作业单位" prop="workDepIds"> + <el-cascader style="width: 100%" v-model="form.workDepIds" :props="depProps" @change="getWorkerList" :options="lists.departList" :show-all-levels="false"/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="作业负责人" prop="headUids"> - <el-select v-model="form.headUids" multiple filterable @change="getStartEndIds" clearable> + <el-form-item label="作业人" prop="operatorUids"> + <el-select v-model="form.operatorUids" filterable multiple clearable> <el-option - v-for="item in lists.workerList" + v-for="item in zyList" :key="item.uid" - :label="item.username" + :label="item.realName" :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -382,6 +382,7 @@ props1:{}, depProps:{}, safetyMeasureBasicList: [] + zyList: [] tabLoading: boolean } export default defineComponent({ @@ -396,6 +397,7 @@ equipmentDialog: false, showDialog: false, safetyMeasureBasicList: [], + zyList: [], form: { id: null, workType: 7, @@ -408,7 +410,7 @@ headUids: [], analystUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -437,6 +439,7 @@ expandTrigger: 'hover', label: 'depName', value: 'depId', + multiple: true, checkStrictly: true, emitPath: false } @@ -448,7 +451,7 @@ workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workDepIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], analystUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], @@ -468,15 +471,26 @@ const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { - getBasicData() + // getBasicData() }); const openWorkSelect = ()=>{ workSelectRef.value.openDialog(state.form.involveOtherWork) + } + const getWorkerList = ()=>{ + const filteredList = props.lists.spList.opList.filter(i => state.form.workDepIds.includes(i.depId)); + if(filteredList && filteredList.length>0){ + state.zyList = filteredList + }else{ + state.zyList = props.lists.spList.opList + } } const getSelected = ()=>{ state.form.involveOtherWork = workSelectRef.value.selected } const openDialog = (row)=>{ + clearFile() + state.zyList = props.lists.spList.opList + getBasicData() Object.keys(state.form).forEach(key => { if (row.hasOwnProperty(key)) { state.form[key] = JSON.parse(JSON.stringify(row))[key]; @@ -500,6 +514,12 @@ state.form.acceptUid = row.acceptUser.userId state.form.startOrEndUids = row.startOrEndList.map(i=>i.userId) state.form.lastApprover = row.lastApprover.userId + if(row.workDepList && row.workDepList.length>0){ + state.form.workDepIds = row.workDepList.map(i=>i.workDepId) + }else{ + state.form.workDepIds.push(row.workDepId) + } + getWorkerList() state.showDialog = true } @@ -516,7 +536,7 @@ headUids: [], analystUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -569,16 +589,16 @@ const res = await workApplyApi().getFormData(7) if (res.data.code === '200') { state.safetyMeasureBasicList = JSON.parse(JSON.stringify(res.data.data.safetyMeasureBasicList)) - if(res.data.data.approvalDepBasicList && res.data.data.approvalDepBasicList.length>0){ - state.form.approvalDepBasicList = res.data.data.approvalDepBasicList.map(({id,content})=>({ - content, - approvalDepBasicId: id, - approvalUids: [], - approvalType: null - })) - }else{ - state.form.approvalDepBasicList = [] - } + // if(res.data.data.approvalDepBasicList && res.data.data.approvalDepBasicList.length>0){ + // state.form.approvalDepBasicList = res.data.data.approvalDepBasicList.map(({id,content})=>({ + // content, + // approvalDepBasicId: id, + // approvalUids: [], + // approvalType: null + // })) + // }else{ + // state.form.approvalDepBasicList = [] + // } } else { ElMessage({ type: 'warning', @@ -703,6 +723,7 @@ return { renderMenu, getBasicData, + getWorkerList, getStartEndIds, getSafetyIds, isFirstRow, diff --git a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/spaceDialog.vue b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/spaceDialog.vue index cd7a065..4b37e9d 100644 --- a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/spaceDialog.vue +++ b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/spaceDialog.vue @@ -44,16 +44,16 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" filterable multiple clearable> + <el-form-item label="作业负责人" prop="headUids"> + <el-select v-model="form.headUids" multiple filterable @change="getStartEndIds" clearable> <el-option - v-for="item in lists.spList.opList" + v-for="item in lists.workerList" :key="item.uid" - :label="item.realName" + :label="item.username" :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -71,21 +71,21 @@ </el-row> <el-row> <el-col :span="12"> - <el-form-item label="作业单位" prop="workDepId"> - <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="lists.departList" :show-all-levels="false"/> + <el-form-item label="作业单位" prop="workDepIds"> + <el-cascader style="width: 100%" v-model="form.workDepIds" :props="depProps" @change="getWorkerList" :options="lists.departList" :show-all-levels="false"/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="作业负责人" prop="headUids"> - <el-select v-model="form.headUids" multiple filterable @change="getStartEndIds" clearable> + <el-form-item label="作业人" prop="operatorUids"> + <el-select v-model="form.operatorUids" filterable multiple clearable> <el-option - v-for="item in lists.workerList" + v-for="item in zyList" :key="item.uid" - :label="item.username" + :label="item.realName" :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -321,6 +321,7 @@ props1:{}, depProps:{}, safetyMeasureBasicList: [] + zyList: [] tabLoading: boolean } export default defineComponent({ @@ -335,6 +336,7 @@ showDialog: false, equipmentDialog: false, safetyMeasureBasicList: [], + zyList: [], form: { id: null, workType: 2, @@ -347,7 +349,7 @@ headUids: [], analystUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -374,6 +376,7 @@ expandTrigger: 'hover', label: 'depName', value: 'depId', + multiple: true, checkStrictly: true, emitPath: false } @@ -385,7 +388,7 @@ workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workDepIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], analystUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], @@ -403,18 +406,28 @@ const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { - getBasicData() + // getBasicData() }); const openWorkSelect = ()=>{ workSelectRef.value.openDialog(state.form.involveOtherWork) } - + const getWorkerList = ()=>{ + const filteredList = props.lists.spList.opList.filter(i => state.form.workDepIds.includes(i.depId)); + if(filteredList && filteredList.length>0){ + state.zyList = filteredList + }else{ + state.zyList = props.lists.spList.opList + } + } const getSelected = ()=>{ state.form.involveOtherWork = workSelectRef.value.selected } const openDialog = (row)=>{ + clearFile() + state.zyList = props.lists.spList.opList + getBasicData() Object.keys(state.form).forEach(key => { if (row.hasOwnProperty(key)) { state.form[key] = JSON.parse(JSON.stringify(row))[key]; @@ -434,9 +447,16 @@ approvalUids: item.approvalPersonList.filter(j=>j.type == 5).map(i=>i.userId), approvalType: item.approvalType })) + console.log(state.form.approvalDepBasicList,777) state.form.acceptUid = row.acceptUser.userId state.form.startOrEndUids = row.startOrEndList.map(i=>i.userId) state.form.lastApprover = row.lastApprover.userId + if(row.workDepList && row.workDepList.length>0){ + state.form.workDepIds = row.workDepList.map(i=>i.workDepId) + }else{ + state.form.workDepIds.push(row.workDepId) + } + getWorkerList() state.showDialog = true } @@ -453,7 +473,7 @@ headUids: [], analystUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -504,16 +524,16 @@ const res = await workApplyApi().getFormData(2) if (res.data.code === '200') { state.safetyMeasureBasicList = JSON.parse(JSON.stringify(res.data.data.safetyMeasureBasicList)) - if(res.data.data.approvalDepBasicList && res.data.data.approvalDepBasicList.length>0){ - state.form.approvalDepBasicList = res.data.data.approvalDepBasicList.map(({id,content})=>({ - content, - approvalDepBasicId: id, - approvalUids: [], - approvalType: null - })) - }else{ - state.form.approvalDepBasicList = [] - } + // if(res.data.data.approvalDepBasicList && res.data.data.approvalDepBasicList.length>0){ + // state.form.approvalDepBasicList = res.data.data.approvalDepBasicList.map(({id,content})=>({ + // content, + // approvalDepBasicId: id, + // approvalUids: [], + // approvalType: null + // })) + // }else{ + // state.form.approvalDepBasicList = [] + // } } else { ElMessage({ type: 'warning', @@ -621,6 +641,7 @@ return { renderMenu, getBasicData, + getWorkerList, getStartEndIds, getSafetyIds, isFirstRow, diff --git a/src/views/newSpecialWorkSystem/workTicket/wdsq/index.vue b/src/views/newSpecialWorkSystem/workTicket/wdsq/index.vue index 7cfecd0..4aa3e83 100644 --- a/src/views/newSpecialWorkSystem/workTicket/wdsq/index.vue +++ b/src/views/newSpecialWorkSystem/workTicket/wdsq/index.vue @@ -34,6 +34,13 @@ /> </el-select> </div> + <div class="basic-line" style="display:flex;white-space:nowrap;line-height: 40px"> + <span>作业票编号:</span> + <el-input + v-model="searPara.workPermitNo" + placeholder="请输入作业票编号" + /> + </div> <div style="margin-left: 20px"> <el-button type="primary" @click="searchRecord">查询</el-button> <el-button plain @click="clearSearch">重置</el-button> @@ -49,11 +56,21 @@ <el-button type="primary" :icon="Refresh" size="default" @click="reLoadData()" /> </el-row> <el-table ref="multipleTableRef" :data="applyData" style="width: 100%" height="calc(100% - 100px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column property="workPermitNo" label="作业编号" align="center"> + <template #default="scope"> + {{scope.row.workPermitNo?scope.row.workPermitNo:'—'}} + </template> + </el-table-column> <el-table-column property="seDepName" label="事业部" align="center"/> <el-table-column property="applyDepName" label="作业所在车间" align="center"/> <el-table-column property="workContent" label="作业内容" align="center"/> <el-table-column property="workTypeDesc" label="作业类型" align="center"/> - <el-table-column property="workDepName" label="作业单位" align="center"/> + <el-table-column label="作业单位" align="center"> + <template #default="scope"> + <span v-if="scope.row.workDepList && scope.row.workDepList.length>0">{{scope.row.workDepList.map(i=>i.workDepName).join(',')}}</span> + <span v-else>{{scope.row.workDepName }}</span> + </template> + </el-table-column> <el-table-column property="headList" label="负责人及电话" align="center"> <template #default="scope"> {{scope.row.headList.map(i=>{return i.userName + '(' + i.phone+ ')' }).join(',')}} @@ -89,16 +106,16 @@ <el-table-column label="风险研判" align="center"> <template #default="scope"> <el-button v-if="scope.row.status == 0" link type="primary" size="small" @click="openReport('上传', scope.row)">上传研判报告</el-button> - <el-tag type="danger" v-else-if="scope.row.status == -1">已废止</el-tag> + <el-tag type="danger" v-else-if="scope.row.status == 16">已废止</el-tag> <el-button v-else link type="primary" size="small" @click="openReport('查看', scope.row)">查看研判报告</el-button> </template> </el-table-column> <el-table-column fixed="right" label="操作" align="center" width="150"> <template #default="scope"> - <span v-if="scope.row.status == -1">已废止</span> - <el-button v-if="scope.row.status == 0 || scope.row.status == 1" link type="danger" size="small" :icon="Delete" @click="abortRecordBtn(scope.row)">作废</el-button> - <el-button v-if="scope.row.status !== -1" link type="primary" size="small" :icon="View" @click="viewRecord(scope.row)">查看</el-button> - <el-button link type="primary" size="small" v-throttle :icon="Edit" @click="openEdit(scope.row)">修改</el-button> + <span v-if="scope.row.status == 16">已废止</span> + <el-button v-if="scope.row.status == 0 || scope.row.status == 1" link type="danger" size="small" :icon="Delete" @click="abortRecordBtn(scope.row)">取消</el-button> + <el-button link type="primary" size="small" :icon="View" @click="viewRecord(scope.row)">查看</el-button> + <el-button v-if="scope.row.status !== 16" link type="primary" size="small" v-throttle :icon="Edit" @click="openEdit(scope.row)">修改</el-button> <el-button link type="success" v-throttle v-if="scope.row.status == 0 || scope.row.status == 1" size="small" :icon="Download" @click="checkTicket(scope.row)">正式办票</el-button> <!-- <el-button :disabled="scope.row.status == 7 ? false : true" link type="primary" size="small" :icon="Download" @click="downLoadBtn(scope.row)">导出作业票</el-button>--> </template> @@ -230,6 +247,7 @@ searPara:{ startTime: '', endTime: '', + workPermitNo: '', workType: null, headUserName: '', secondDepId: null @@ -277,48 +295,72 @@ ], statusList: [ { - value: -1, - label: '废止' - }, - { value: 0, - label: '风险研判中' + label: '风险研判' }, { value: 1, - label: '票证办理中' + label: '票证办理' }, { value: 2, - label: '安全措施确认中' + label: '气体分析' }, { value: 3, - label: '培训交底中' + label: '安全措施确认,培训交底' }, { value: 4, - label: '气体分析中' + label: '安全措施确认' }, { value: 5, - label: '作业开始' + label: '培训交底' }, { value: 6, - label: '作业监护' + label: '部门审批' }, { value: 7, - label: '作业结束' + label: '作业票填报结束' }, { value: 8, - label: '作业验收' + label: '作业气体分析不合格' }, { value: 9, - label: '安全措施确认,培训交底中' + label: '审批未通过' + }, + { + value: 10, + label: '开始' + }, + { + value: 11, + label: '监护' + }, + { + value: 12, + label: '结束' + }, + { + value: 13, + label: '待验收' + }, + { + value: 14, + label: '验收完成' + }, + { + value: 15, + label: '取消' + }, + { + value: 16, + label: '废止作业票' } ] }); @@ -551,10 +593,12 @@ state.searPara = { startTime: '', endTime: '', + workPermitNo: '', workType: null, headUserName: '', secondDepId: null }; + state.pageIndex1 = 1 getListByPage(); }; diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/broken.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/broken.vue index f1f264d..65d59ab 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/broken.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/broken.vue @@ -11,13 +11,21 @@ </el-row> <el-row> <el-col :span="12"> - <el-form-item label="作业单位" prop="workDepId"> - <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="lists.departList" :show-all-levels="false"/> + <el-form-item label="作业单位" prop="workDepIds"> + <el-cascader style="width: 100%" v-model="form.workDepIds" :props="depProps" @change="getWorkerList" :options="lists.departList" :show-all-levels="false"/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="涉及相关单位(部门)" prop="workDetail.involvedDepIds"> - <el-cascader style="width: 100%" v-model="form.workDetail.involvedDepIds" :props="depProps2" :options="lists.departList" :show-all-levels="false"/> + <el-form-item label="作业人" prop="operatorUids"> + <el-select v-model="form.operatorUids" filterable multiple clearable> + <el-option + v-for="item in zyList" + :key="item.uid" + :label="item.realName" + :value="item.uid" + /> + </el-select> + <!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -83,16 +91,8 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" filterable multiple clearable> - <el-option - v-for="item in lists.spList.opList" - :key="item.uid" - :label="item.realName" - :value="item.uid" - /> - </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> + <el-form-item label="涉及相关单位(部门)" prop="workDetail.involvedDepIds"> + <el-cascader style="width: 100%" v-model="form.workDetail.involvedDepIds" :props="depProps2" :options="lists.departList" :show-all-levels="false"/> </el-form-item> </el-col> </el-row> @@ -369,6 +369,7 @@ interface stateType { form: Object, equipmentDialog: boolean, + zyList: [] props1:{}, depProps:{}, depProps2:{}, @@ -398,6 +399,7 @@ tabLoading: false, equipmentDialog: false, safetyMeasureBasicList: [], + zyList: [], form: { workType: 5, workLevel: 0, @@ -410,7 +412,7 @@ headUids: [], analystUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -438,6 +440,7 @@ expandTrigger: 'hover', label: 'depName', value: 'depId', + multiple: true, checkStrictly: true, emitPath: false }, @@ -582,7 +585,7 @@ workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workDepIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], analystUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], @@ -603,12 +606,20 @@ const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { + state.zyList = props.lists.spList.opList getBasicData() }); const openWorkSelect = ()=>{ workSelectRef.value.openDialog(state.form.involveOtherWork) } - + const getWorkerList = (val)=>{ + const filteredList = props.lists.spList.opList.filter(i => state.form.workDepIds.includes(i.depId)); + if(filteredList && filteredList.length>0){ + state.zyList = filteredList + }else{ + state.zyList = props.lists.spList.opList + } + } const getSelected = ()=>{ state.form.involveOtherWork = workSelectRef.value.selected } @@ -907,6 +918,7 @@ return { renderMenu, getBasicData, + getWorkerList, getStartEndIds, getSafetyIds, isFirstRow, diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue index 6f9bb00..e715770 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue @@ -45,33 +45,15 @@ </el-row> <el-row> <el-col :span="12"> - <el-form-item label="动火方式" prop="workDetail.workMethod"> - <el-input - v-model="form.workDetail.workMethod" - :autosize="{ minRows: 1 }" - type="textarea" - placeholder="请输入动火方式" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" filterable multiple clearable> + <el-form-item label="动火方式" prop="workDetail.methodList"> + <el-select v-model="form.workDetail.methodList" filterable multiple clearable> <el-option - v-for="item in lists.spList.opList" - :key="item.uid" - :label="item.realName" - :value="item.uid" + v-for="item in fireWorkList" + :key="item.id" + :label="item.name" + :value="item.name" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业单位" prop="workDepId"> - <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="lists.departList" :show-all-levels="false"/> </el-form-item> </el-col> <el-col :span="12"> @@ -84,7 +66,39 @@ :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + </el-form-item> + </el-col> + </el-row> + <el-row v-if="form.workDetail.methodList.find(i=>i == '其他')"> + <el-col :span="12"> + <el-form-item label="其他方式" prop="workDetail.other"> + <el-input + v-model="form.workDetail.other" + :autosize="{ minRows: 1 }" + type="textarea" + placeholder="请输入其他动火方式" + /> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="作业单位" prop="workDepIds"> + <el-cascader style="width: 100%" v-model="form.workDepIds" :props="depProps" @change="getWorkerList" :options="lists.departList" :show-all-levels="false"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="作业人" prop="operatorUids"> + <el-select v-model="form.operatorUids" filterable multiple clearable> + <el-option + v-for="item in zyList" + :key="item.uid" + :label="item.realName" + :value="item.uid" + /> + </el-select> + <!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -345,6 +359,8 @@ interface stateType { form: Object, workLevelList: Array<any>, + fireWorkList: Array<any>, + zyList: Array<any>, equipmentDialog: boolean, tabLoading: boolean props1:{} @@ -366,6 +382,7 @@ tabLoading: false, equipmentDialog: false, safetyMeasureBasicList: [], + zyList: [], form: { workType: 1, workLevel: null, @@ -378,7 +395,7 @@ headUids: [], analystUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -390,8 +407,11 @@ startOrEndUids: [], cameraIds: [], workDetail: { - workMethod: '' - } + workMethod: '', + methodList: [], + other: '' + }, + remark: '' }, workLevelList: [ { @@ -407,6 +427,52 @@ value: 3 } ], + fireWorkList: [ + { + name: "电焊", + id: 1 + }, + { + name: "气割", + id: 2 + }, + { + name: "切割", + id: 3 + }, + { + name: "打磨", + id: 4 + }, + { + name: "钻孔", + id: 5 + }, + { + name: "喷灯", + id: 6 + }, + { + name: "烘烤", + id: 7 + }, + { + name: "喷砂", + id: 8 + }, + { + name: "破碎地面", + id: 9 + }, + { + name: "清洗机", + id: 10 + }, + { + name: "其他", + id: 11 + } + ], casProps: { expandTrigger: 'hover', value: 'uid', @@ -536,6 +602,7 @@ expandTrigger: 'hover', label: 'depName', value: 'depId', + multiple: true, checkStrictly: true, emitPath: false } @@ -547,7 +614,7 @@ workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workDepIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], analystUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], @@ -559,18 +626,29 @@ acceptUid: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], lastApprover: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], startOrEndUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.workMethod": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] + "workDetail.methodList": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + "workDetail.other": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] }); const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { + state.zyList = props.lists.spList.opList getBasicData() }) onUpdated(()=>{ console.log('false loading') }) + + const getWorkerList = (val)=>{ + const filteredList = props.lists.spList.opList.filter(i => state.form.workDepIds.includes(i.depId)); + if(filteredList && filteredList.length>0){ + state.zyList = filteredList + }else{ + state.zyList = props.lists.spList.opList + } + } const openWorkSelect = ()=>{ workSelectRef.value.openDialog(state.form.involveOtherWork) @@ -709,6 +787,13 @@ // } state.form.riskIdentification = state.form.riskIdentification.join(',') const {depIdList,...data} = state.form + data.workDetail.methodList = data.workDetail.methodList.map(item=>{ + if(item == '其他'){ + item = data.workDetail.other + } + return item + }) + data.workDetail.workMethod = data.workDetail.methodList.join(',') data.operatorUids = transform2Arr(data.operatorUids) data.headUids = transform2Arr(data.headUids) // data.analystUids = transformArr(data.analystUids) @@ -778,6 +863,7 @@ }; return { renderMenu, + getWorkerList, getBasicData, getStartEndIds, getSafetyIds, diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/ground.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/ground.vue index 8ae195e..0f5a025 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/ground.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/ground.vue @@ -21,26 +21,6 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" multiple clearable> - <el-option - v-for="item in lists.spList.opList" - :key="item.uid" - :label="item.realName" - :value="item.uid" - /> - </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业单位" prop="workDepId"> - <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="lists.departList" :show-all-levels="false"/> - </el-form-item> - </el-col> - <el-col :span="12"> <el-form-item label="作业负责人" prop="headUids"> <el-select v-model="form.headUids" multiple filterable @change="getStartEndIds" clearable> <el-option @@ -50,7 +30,27 @@ :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="作业单位" prop="workDepIds"> + <el-cascader style="width: 100%" v-model="form.workDepIds" :props="depProps" @change="getWorkerList" :options="lists.departList" :show-all-levels="false"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="作业人" prop="operatorUids"> + <el-select v-model="form.operatorUids" multiple clearable> + <el-option + v-for="item in zyList" + :key="item.uid" + :label="item.realName" + :value="item.uid" + /> + </el-select> + <!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -354,6 +354,7 @@ interface stateType { form: Object, equipmentDialog: boolean, + zyList: [] props1:{}, depProps:{}, casProps:{} @@ -382,6 +383,7 @@ tabLoading: false, equipmentDialog: false, safetyMeasureBasicList: [], + zyList: [], form: { workType: 4, workLevel: 0, @@ -393,7 +395,7 @@ operatorUids: [], headUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -419,6 +421,7 @@ expandTrigger: 'hover', label: 'depName', value: 'depId', + multiple: true, checkStrictly: true, emitPath: false }, @@ -555,7 +558,7 @@ workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workDepIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], riskIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], @@ -573,10 +576,20 @@ const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { + state.zyList = props.lists.spList.opList getBasicData() }); const openWorkSelect = ()=>{ workSelectRef.value.openDialog(state.form.involveOtherWork) + } + + const getWorkerList = (val)=>{ + const filteredList = props.lists.spList.opList.filter(i => state.form.workDepIds.includes(i.depId)); + if(filteredList && filteredList.length>0){ + state.zyList = filteredList + }else{ + state.zyList = props.lists.spList.opList + } } const getSelected = ()=>{ @@ -877,6 +890,7 @@ return { renderMenu, getBasicData, + getWorkerList, getStartEndIds, getSafetyIds, isFirstRow, diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/height.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/height.vue index 4b51329..49be4fd 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/height.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/height.vue @@ -54,26 +54,6 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" filterable multiple clearable> - <el-option - v-for="item in lists.spList.opList" - :key="item.uid" - :label="item.realName" - :value="item.uid" - /> - </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业单位" prop="workDepId"> - <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="lists.departList" :show-all-levels="false"/> - </el-form-item> - </el-col> - <el-col :span="12"> <el-form-item label="作业负责人" prop="headUids"> <el-select v-model="form.headUids" filterable multiple @change="getStartEndIds" clearable> <el-option @@ -83,7 +63,27 @@ :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="作业单位" prop="workDepIds"> + <el-cascader style="width: 100%" v-model="form.workDepIds" :props="depProps" @change="getWorkerList" :options="lists.departList" :show-all-levels="false"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="作业人" prop="operatorUids"> + <el-select v-model="form.operatorUids" filterable multiple clearable> + <el-option + v-for="item in zyList" + :key="item.uid" + :label="item.realName" + :value="item.uid" + /> + </el-select> + <!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -297,6 +297,7 @@ form: Object, workLevelList: Array<any>, equipmentDialog: boolean, + zyList: [] props1:{}, depProps:{}, casProps:{} @@ -317,6 +318,7 @@ tabLoading: false, equipmentDialog: false, safetyMeasureBasicList: [], + zyList: [], form: { workType: 6, workLevel: null, @@ -328,7 +330,7 @@ operatorUids: [], headUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -490,6 +492,7 @@ expandTrigger: 'hover', label: 'depName', value: 'depId', + multiple: true, checkStrictly: true, emitPath: false } @@ -501,7 +504,7 @@ workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workDepIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], riskIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], @@ -517,10 +520,20 @@ const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { + state.zyList = props.lists.spList.opList getBasicData() }); const openWorkSelect = ()=>{ workSelectRef.value.openDialog(state.form.involveOtherWork) + } + + const getWorkerList = (val)=>{ + const filteredList = props.lists.spList.opList.filter(i => state.form.workDepIds.includes(i.depId)); + if(filteredList && filteredList.length>0){ + state.zyList = filteredList + }else{ + state.zyList = props.lists.spList.opList + } } const getSelected = ()=>{ @@ -726,6 +739,7 @@ return { renderMenu, getBasicData, + getWorkerList, getStartEndIds, getSafetyIds, isFirstRow, diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/hoist.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/hoist.vue index 595a6ed..306cecb 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/hoist.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/hoist.vue @@ -64,26 +64,6 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" filterable multiple clearable> - <el-option - v-for="item in lists.spList.opList" - :key="item.uid" - :label="item.realName" - :value="item.uid" - /> - </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业单位" prop="workDepId"> - <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="lists.departList" :show-all-levels="false"/> - </el-form-item> - </el-col> - <el-col :span="12"> <el-form-item label="作业负责人" prop="headUids"> <el-select v-model="form.headUids" multiple filterable @change="getStartEndIds" clearable> <el-option @@ -93,7 +73,27 @@ :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="作业单位" prop="workDepIds"> + <el-cascader style="width: 100%" v-model="form.workDepIds" :props="depProps" @change="getWorkerList" :options="lists.departList" :show-all-levels="false"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="作业人" prop="operatorUids"> + <el-select v-model="form.operatorUids" filterable multiple clearable> + <el-option + v-for="item in zyList" + :key="item.uid" + :label="item.realName" + :value="item.uid" + /> + </el-select> + <!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -362,6 +362,7 @@ form: Object, workLevelList: Array<any>, equipmentDialog: boolean, + zyList: [] props1:{}, depProps:{}, casProps:{} @@ -382,6 +383,7 @@ tabLoading: false, equipmentDialog: false, safetyMeasureBasicList: [], + zyList: [], form: { workType: 3, workLevel: null, @@ -394,7 +396,7 @@ headUids: [], analystUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -434,6 +436,7 @@ expandTrigger: 'hover', label: 'depName', value: 'depId', + multiple: true, checkStrictly: true, emitPath: false }, @@ -565,7 +568,7 @@ workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workDepIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], analystUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], @@ -584,10 +587,20 @@ const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { + state.zyList = props.lists.spList.opList getBasicData() }); const openWorkSelect = ()=>{ workSelectRef.value.openDialog(state.form.involveOtherWork) + } + + const getWorkerList = (val)=>{ + const filteredList = props.lists.spList.opList.filter(i => state.form.workDepIds.includes(i.depId)); + if(filteredList && filteredList.length>0){ + state.zyList = filteredList + }else{ + state.zyList = props.lists.spList.opList + } } const getSelected = ()=>{ @@ -795,6 +808,7 @@ return { renderMenu, getBasicData, + getWorkerList, getStartEndIds, getSafetyIds, isFirstRow, diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/plate.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/plate.vue index add6ecd..df77756 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/plate.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/plate.vue @@ -143,16 +143,16 @@ </el-row> <el-row> <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" filterable multiple clearable> + <el-form-item label="作业负责人" prop="headUids"> + <el-select v-model="form.headUids" multiple filterable @change="getStartEndIds" clearable> <el-option - v-for="item in lists.spList.opList" + v-for="item in lists.workerList" :key="item.uid" - :label="item.realName" + :label="item.username" :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> <el-col :span="12" class="valueSelect"> @@ -174,21 +174,21 @@ </el-row> <el-row> <el-col :span="12"> - <el-form-item label="作业单位" prop="workDepId"> - <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="lists.departList" :show-all-levels="false"/> + <el-form-item label="作业单位" prop="workDepIds"> + <el-cascader style="width: 100%" v-model="form.workDepIds" :props="depProps" @change="getWorkerList" :options="lists.departList" :show-all-levels="false"/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="作业负责人" prop="headUids"> - <el-select v-model="form.headUids" multiple filterable @change="getStartEndIds" clearable> + <el-form-item label="作业人" prop="operatorUids"> + <el-select v-model="form.operatorUids" filterable multiple clearable> <el-option - v-for="item in lists.workerList" + v-for="item in zyList" :key="item.uid" - :label="item.username" + :label="item.realName" :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -407,6 +407,7 @@ form: Object, workLevelList: Array<any>, equipmentDialog: boolean, + zyList: [] props1:{}, depProps:{}, casProps:{} @@ -435,6 +436,7 @@ tabLoading: false, equipmentDialog: false, safetyMeasureBasicList: [], + zyList: [], form: { workType: 8, workLevel: null, @@ -446,7 +448,7 @@ operatorUids: [], headUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -490,6 +492,7 @@ expandTrigger: 'hover', label: 'depName', value: 'depId', + multiple: true, checkStrictly: true, emitPath: false }, @@ -626,7 +629,7 @@ workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workDepIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], riskIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], @@ -652,12 +655,20 @@ const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { + state.zyList = props.lists.spList.opList getBasicData() }); const openWorkSelect = ()=>{ workSelectRef.value.openDialog(state.form.involveOtherWork) } - + const getWorkerList = (val)=>{ + const filteredList = props.lists.spList.opList.filter(i => state.form.workDepIds.includes(i.depId)); + if(filteredList && filteredList.length>0){ + state.zyList = filteredList + }else{ + state.zyList = props.lists.spList.opList + } + } const getSelected = ()=>{ state.form.involveOtherWork = workSelectRef.value.selected } @@ -957,6 +968,7 @@ return { renderMenu, getBasicData, + getWorkerList, getStartEndIds, getSafetyIds, isFirstRow, diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/power.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/power.vue index f1e4594..e5d46c7 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/power.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/power.vue @@ -76,27 +76,7 @@ </el-form-item> </el-col> </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" filterable multiple clearable> - <el-option - v-for="item in lists.spList.opList" - :key="item.uid" - :label="item.realName" - :value="item.uid" - /> - </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业单位" prop="workDepId"> - <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="lists.departList" :show-all-levels="false"/> - </el-form-item> - </el-col> + <el-row> <el-col :span="12"> <el-form-item label="作业负责人" prop="headUids"> <el-select v-model="form.headUids" multiple filterable @change="getStartEndIds" clearable> @@ -107,7 +87,27 @@ :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="作业单位" prop="workDepIds"> + <el-cascader style="width: 100%" v-model="form.workDepIds" :props="depProps" @change="getWorkerList" :options="lists.departList" :show-all-levels="false"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="作业人" prop="operatorUids"> + <el-select v-model="form.operatorUids" filterable multiple clearable> + <el-option + v-for="item in zyList" + :key="item.uid" + :label="item.realName" + :value="item.uid" + /> + </el-select> + <!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -376,6 +376,7 @@ interface stateType { form: Object, equipmentDialog: boolean, + zyList: [] props1:{}, depProps:{}, casProps:{} @@ -396,6 +397,7 @@ tabLoading: false, equipmentDialog: false, safetyMeasureBasicList: [], + zyList: [], form: { workType: 7, workLevel: 0, @@ -408,7 +410,7 @@ headUids: [], analystUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -435,6 +437,7 @@ expandTrigger: 'hover', label: 'depName', value: 'depId', + multiple: true, checkStrictly: true, emitPath: false }, @@ -566,7 +569,7 @@ workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workDepIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], analystUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], @@ -586,10 +589,19 @@ const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { + state.zyList = props.lists.spList.opList getBasicData() }); const openWorkSelect = ()=>{ workSelectRef.value.openDialog(state.form.involveOtherWork) + } + const getWorkerList = (val)=>{ + const filteredList = props.lists.spList.opList.filter(i => state.form.workDepIds.includes(i.depId)); + if(filteredList && filteredList.length>0){ + state.zyList = filteredList + }else{ + state.zyList = props.lists.spList.opList + } } const getSelected = ()=>{ state.form.involveOtherWork = workSelectRef.value.selected @@ -798,6 +810,7 @@ return { renderMenu, getBasicData, + getWorkerList, getStartEndIds, getSafetyIds, isFirstRow, diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/space.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/space.vue index 8acd0fc..ffb5bd8 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/space.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/space.vue @@ -43,16 +43,16 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" filterable multiple clearable> + <el-form-item label="作业负责人" prop="headUids"> + <el-select v-model="form.headUids" multiple filterable @change="getStartEndIds" clearable> <el-option - v-for="item in lists.spList.opList" + v-for="item in lists.workerList" :key="item.uid" - :label="item.realName" + :label="item.username" :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -70,21 +70,21 @@ </el-row> <el-row> <el-col :span="12"> - <el-form-item label="作业单位" prop="workDepId"> - <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="lists.departList" :show-all-levels="false"/> + <el-form-item label="作业单位" prop="workDepIds"> + <el-cascader style="width: 100%" v-model="form.workDepIds" :props="depProps" @change="getWorkerList" :options="lists.departList" :show-all-levels="false"/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="作业负责人" prop="headUids"> - <el-select v-model="form.headUids" multiple filterable @change="getStartEndIds" clearable> + <el-form-item label="作业人" prop="operatorUids"> + <el-select v-model="form.operatorUids" filterable multiple clearable> <el-option - v-for="item in lists.workerList" + v-for="item in zyList" :key="item.uid" - :label="item.username" + :label="item.realName" :value="item.uid" /> </el-select> -<!-- <el-cascader style="width: 100%" v-model="form.headUids" :options="lists.workerList" :props="casProps" @change="getStartEndIds" filterable :show-all-levels="false"/>--> + <!-- <el-cascader style="width: 100%" v-model="form.operatorUids" :options="lists.spList.opList" :props="cas2Props" @change="singleSelect($event,'作业人')" filterable :show-all-levels="false"/>--> </el-form-item> </el-col> </el-row> @@ -315,6 +315,7 @@ interface stateType { form: Object, equipmentDialog: boolean, + zyList: [] props1:{}, depProps:{}, casProps:{} @@ -335,6 +336,7 @@ tabLoading: false, equipmentDialog: false, safetyMeasureBasicList: [], + zyList: [], form: { workType: 2, workLevel: 0, @@ -347,7 +349,7 @@ headUids: [], analystUids: [], guardianUids: [], - workDepId: null, + workDepIds: [], workContent: '', workLocation: '', riskIdentification: [], @@ -372,6 +374,7 @@ expandTrigger: 'hover', label: 'depName', value: 'depId', + multiple: true, checkStrictly: true, emitPath: false }, @@ -503,7 +506,7 @@ workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workDepIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], analystUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], @@ -521,13 +524,21 @@ const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { + state.zyList = props.lists.spList.opList getBasicData() }); const openWorkSelect = ()=>{ workSelectRef.value.openDialog(state.form.involveOtherWork) } - + const getWorkerList = (val)=>{ + const filteredList = props.lists.spList.opList.filter(i => state.form.workDepIds.includes(i.depId)); + if(filteredList && filteredList.length>0){ + state.zyList = filteredList + }else{ + state.zyList = props.lists.spList.opList + } + } const getSelected = ()=>{ state.form.involveOtherWork = workSelectRef.value.selected } @@ -734,6 +745,7 @@ return { renderMenu, getBasicData, + getWorkerList, getStartEndIds, getSafetyIds, isFirstRow, diff --git a/src/views/riskWarningSys/warningBigScreen/components/SPI.vue b/src/views/riskWarningSys/warningBigScreen/components/SPI.vue index 392db13..32f95af 100644 --- a/src/views/riskWarningSys/warningBigScreen/components/SPI.vue +++ b/src/views/riskWarningSys/warningBigScreen/components/SPI.vue @@ -35,7 +35,7 @@ size: Number, theme: Boolean }, - setup(props) { + setup(props,context) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); const screenThemes = useScreenTheme() @@ -50,220 +50,68 @@ // 获取spi数据 const getSpiData = async () => { - let res = await riskWarningApi().getSpiData(screenTheme.value.depId); - if (res.data.code === '200') { - state.spiData = JSON.parse(JSON.stringify(res.data.data)) - state.monthList = Array.from(state.spiData, ({ month }) => month + '月'); - state.valueList = Array.from(state.spiData, ({ spiVal }) => spiVal); - state.year = res.data.data[0].year - initSpi() - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } + let res = await riskWarningApi().getSpiPage({ + pageIndex: 1, + pageSize: 12 + }) + if (res.data.code === '200') { + state.spiData = res.data.data; + initSpi(state.spiData.reverse()) + context.emit('getData',state.spiData.reverse()) + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } }; type EChartsOption = echarts.EChartsOption // 隐患整改情况 - const initSpi =()=>{ + const initSpi =(data)=>{ let dom = document.getElementById(spi.value); let myChart = echarts.init(dom); let option: EChartsOption; - option = { - legend: { - data: ['注意线', '警告线', '危险线', 'SPI预警指数值'], - top: '2%', - right: '6%', - textStyle:{ - color: '#999', - fontSize: fontSize(14) - } - }, - color: ['rgba(216,55,55)','rgba(235,194,80)','rgba(147,208,81)'], - tooltip: { - trigger: 'axis' - }, - grid: { - left: '8%', - right: '8%', - bottom: '5%', - }, - xAxis: [ - { - type: 'category', - boundaryGap: false, - data: state.monthList, - axisLine:{ - show: true, - lineStyle:{ - color: '#999' - } - }, - splitLine:{ - show: true, - lineStyle:{ - type: 'dashed', - color: '#999' - } - }, - axisLabel:{ - color: '#999', - } - } - ], - yAxis: [ - { - type: 'value', - axisLine:{ - show: true, - lineStyle:{ - type: 'dotted' - } - }, - axisLabel:{ - color: '#ccc' - }, - splitLine:{ - show: true, - lineStyle:{ - type: 'dashed', - color: 'rgba(255,255,255,.4)' - } - } - } - ], - series: [ - // { - // name: '危险线', - // data: [1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000], - // type: 'line', - // lineStyle:{ - // width: 0 - // }, - // areaStyle: { - // color: { - // x: 0, - // y: 0, - // x2: 0, - // y2: 1, - // colorStops: [ - // { - // offset: 0.1, - // color: "rgba(216,55,55)", // 线处的颜色 - // }, - // { - // offset: 0.9, - // color: "rgba(216,55,55,.1)", // 坐标轴处的颜色 - // }, - // ], - // } - // }, - // showSymbol: false, - // // stack: 'Total', - // smooth: true - // }, - // { - // name: '警告线', - // data: [750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750], - // type: 'line', - // lineStyle:{ - // width: 0 - // }, - // areaStyle: { - // color: { - // x: 0, - // y: 0, - // x2: 0, - // y2: 1, - // colorStops: [ - // { - // offset: 0.1, - // color: "rgba(235,194,80)", // 线处的颜色 - // }, - // { - // offset: 0.9, - // color: "rgba(235,194,80,.1)", // 坐标轴处的颜色 - // }, - // ], - // } - // }, - // showSymbol: false, - // // stack: 'Total', - // smooth: true - // }, - // { - // name: '注意线', - // data: [500, 500, 500, 500, 500, 500, 500,500, 500, 500, 500, 500], - // type: 'line', - // lineStyle:{ - // width: 0 - // }, - // areaStyle: { - // color: { - // x: 0, - // y: 0, - // x2: 0, - // y2: 1, - // colorStops: [ - // { - // offset: 0.1, - // color: "rgba(147,208,81)", // 线处的颜色 - // }, - // { - // offset: 0.9, - // color: "rgba(147,208,81,.2)", // 坐标轴处的颜色 - // }, - // ] - // }, - // }, - // showSymbol: false, - // // stack: 'Total', - // smooth: true - // }, - { - name: 'SPI预警指数值', - data: state.valueList, - type: 'line', - triggerLineEvent: true, - label:{ - show: true, - color: '#23E5E5', - fontSize: fontSize(12) - }, - lineStyle:{ - width: 2, - color: '#23E5E5' - }, - areaStyle: { - color: { - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [ - { - offset: 0.1, - color: "rgba(147,208,81)", // 线处的颜色 - }, - { - offset: 0.9, - color: "rgba(147,208,81,.2)", // 坐标轴处的颜色 - }, - ], - } - }, - itemStyle:{ - color: '#23E5E5', - borderColor: '#fff', - borderWidth: 4 - }, - smooth: true - } - ] - }; + option = { + tooltip: { + trigger: 'axis', + axisPointer: { + // Use axis to trigger tooltip + type: 'shadow' // 'shadow' as default; can also be 'line' or 'shadow' + } + }, + color: ['#91cc75','#ee6666'], + grid: [ + { + top: '5%', + right: '2%', + bottom: '10%' + } + ], + xAxis: { + type: 'category', + data: data.map(i=>i.time), + axisLabel: { + color: '#fff' + } + }, + yAxis: { + type: 'value', + splitLine:{ + lineStyle: { + color: 'rgba(255,255,255,.2)' + } + } + }, + series: [ + { + name: 'spi数值', + type: 'line', + data: data.map(i=>i.value?i.value:0) + } + ] + } option && myChart.setOption(option); window.addEventListener("resize",function (){ @@ -284,7 +132,6 @@ // 页面载入时执行方法 onMounted(() => { getSpiData(); - initSpi(); }); return { diff --git a/src/views/riskWarningSys/warningBigScreen/components/accident.vue b/src/views/riskWarningSys/warningBigScreen/components/accident.vue index 30f8621..ce83fb9 100644 --- a/src/views/riskWarningSys/warningBigScreen/components/accident.vue +++ b/src/views/riskWarningSys/warningBigScreen/components/accident.vue @@ -44,7 +44,7 @@ size: Number, theme: Boolean }, - setup(props) { + setup(props,context) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); const screenThemes = useScreenTheme() @@ -139,27 +139,18 @@ state.timeValue[1] = Number(temp[1]) } const getDataByYearId = async () => { - getTime() const data = { - depId: screenTheme.value.depId || 1, - beginYear: state.timeValue[0], - beginMonth: state.timeValue[1], - endYear: state.timeValue[0], - endMonth: state.timeValue[1] + year: state.timeValue[0], + month: state.timeValue[1], } if(state.timeValue[1] == 0){ - data.beginMonth = 1 - data.endMonth = 12 + data.month = '' } let res = await riskWarningApi().getRiskByTimeDep(data); if (res.data.code === '200') { - state.accData = res.data.data[0].detail - const oneList = res.data.data[0].detail[0].count - const twoList = res.data.data[0].detail[1].count - const threeList = res.data.data[0].detail[2].count - const fourList = res.data.data[0].detail[3].count - const fiveList = res.data.data[0].detail[4].count - initAccidentByMonth(oneList,twoList,threeList,fourList,fiveList) + state.accData = res.data.data + initAccidentByMonth(state.accData) + context.emit('getData',state.accData) } else { ElMessage({ type: 'warning', @@ -170,7 +161,7 @@ type EChartsOption = echarts.EChartsOption // 隐患整改情况 - const initAccidentByMonth =(one:number,two:number,three:number,four:number,five:number)=>{ + const initAccidentByMonth =(data)=>{ let dom = document.getElementById(accidentMonth.value); let myChart = echarts.init(dom); @@ -219,13 +210,12 @@ fontWeight: 'bold' } }, - data: [ - { value: one, name: '特别重大事故' }, - { value: two, name: '重大事故' }, - { value: three, name: '较大事故' }, - { value: four, name: '一般事故' }, - { value: five, name: '未遂事故' } - ], + data: data.map(i=>{ + return { + name: i.accidentGrade, + value: i.count + } + }), center: ['50%','60%'] } ] @@ -257,7 +247,7 @@ }else{ state.selector = 'select-light' } - getDataByYearId() + // getDataByYearId() }) const changeTime = (value)=>{ @@ -272,7 +262,6 @@ getTime(); makeList(); getDataByYearId(); - // initAccidentByYear(); }); onUnmounted(() =>{ diff --git a/src/views/riskWarningSys/warningBigScreen/components/danger.vue b/src/views/riskWarningSys/warningBigScreen/components/danger.vue index 0f140b4..8986aab 100644 --- a/src/views/riskWarningSys/warningBigScreen/components/danger.vue +++ b/src/views/riskWarningSys/warningBigScreen/components/danger.vue @@ -54,7 +54,7 @@ size: Number, theme: Boolean }, - setup(props) { + setup(props,context) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); const screenThemes = useScreenTheme() @@ -151,29 +151,22 @@ const changeTime = (value)=>{ state.timeValue[0] = value[0] state.timeValue[1] = value[1] + getDataByYearId() } const getDataByYearId = async () => { - getTime() const data = { - depId: screenTheme.value.depId || 1, - beginYear: state.timeValue[0], - beginMonth: state.timeValue[1], - endYear: state.timeValue[0], - endMonth: state.timeValue[1] + year: state.timeValue[0], + month: state.timeValue[1], } if(state.timeValue[1] == 0){ - data.beginMonth = 1 - data.endMonth = 12 + data.month = '' } - let res = await riskWarningApi().getSelfPreventByTimeDep(data); + let res = await riskWarningApi().getDpGrade(data); if (res.data.code === '200') { state.dangerData = res.data.data - const danger = [ - {value: state.dangerData[0].detail.lightRiskCount,name: '一般隐患'}, - {value: state.dangerData[0].detail.heavyRiskCount,name: '重大隐患'} - ] - initdangerByMonth(danger) + initdangerByMonth(state.dangerData) + context.emit('getData',state.dangerData) } else { ElMessage({ type: 'warning', @@ -184,7 +177,7 @@ type EChartsOption = echarts.EChartsOption // 隐患整改情况 - const initdangerByMonth =(danger)=>{ + const initdangerByMonth =(data)=>{ let dom = document.getElementById(dangerMonth.value); let myChart = echarts.init(dom); @@ -194,7 +187,6 @@ tooltip: { trigger: 'item' }, - color: ['#FAC858','#EE6666'], legend: { top: '8%', left: 'center', @@ -231,7 +223,20 @@ fontWeight: 'bold' } }, - data: danger, + data: [ + { + name: 'A级', + value: data.a + }, + { + name: 'B级', + value: data.b + }, + { + name: 'C级', + value: data.c + } + ], center: ['50%','55%'] } ] @@ -263,7 +268,7 @@ }else{ state.selector = 'select-light' } - getDataByYearId() + // getDataByYearId() }) // 页面载入时执行方法 diff --git a/src/views/riskWarningSys/warningBigScreen/components/educate.vue b/src/views/riskWarningSys/warningBigScreen/components/educate.vue index f327d7e..34e1d19 100644 --- a/src/views/riskWarningSys/warningBigScreen/components/educate.vue +++ b/src/views/riskWarningSys/warningBigScreen/components/educate.vue @@ -18,9 +18,11 @@ import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; import * as echarts from 'echarts'; import '/@/theme/bigScreen.css' + import {riskWarningApi} from "/@/api/riskWarning"; interface stateType { + educateData: [] } export default defineComponent({ name: 'educate', @@ -28,16 +30,32 @@ props:{ size: Number }, - setup(props) { + setup(props,context) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); const educate = ref("eChartEdu" + Date.now() + Math.random()) const state = reactive<stateType>({ - + educateData: [] }) + + const getTrainInfo = async () => { + let res = await riskWarningApi().getTrainInfo(); + if (res.data.code === '200') { + state.educateData = res.data.data + initEducate(state.educateData) + context.emit('getData',state.educateData) + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + + type EChartsOption = echarts.EChartsOption // 隐患整改情况 - const initEducate =()=>{ + const initEducate =(data)=>{ let dom = document.getElementById(educate.value); let myChart = echarts.init(dom); @@ -46,7 +64,6 @@ option = { color: ['#67F9D8', '#FFE434', '#56A3F1', '#FF917C'], legend: { - top: '8%', left: 'center', itemWidth: fontSize(10), itemHeight: fontSize(8), @@ -57,12 +74,11 @@ }, radar: [ { - indicator: [ - { name: '设计培训次数' }, - { name: '培训时间(小时)' }, - { name: '完成比例(%)' } - ], - center: ['50%', '60%'], + indicator: data.map(i=>{ + const {name} = i + return {name} + }), + center: ['50%', '50%'], radius: fontSize(65), startAngle: 90, splitNumber: 4, @@ -70,8 +86,8 @@ axisName: { formatter: '{value}', color: '#428BD4', - fontSize: fontSize(10), - width: 20, + fontSize: fontSize(9), + width: 10, overflow: 'break' }, splitArea: { @@ -103,15 +119,7 @@ }, data: [ { - value: [100, 8, 0.4, -80, 2000], - name: '企业汇总' - }, - { - value: [60, 5, 0.3, -100, 1500], - name: '事业部A', - areaStyle: { - color: 'rgba(255, 228, 52, 0.6)' - } + value: data.map(i=>i.count), } ] }, @@ -130,7 +138,7 @@ // 页面载入时执行方法 onMounted(() => { - initEducate(); + getTrainInfo() }); return { diff --git a/src/views/riskWarningSys/warningBigScreen/components/message.vue b/src/views/riskWarningSys/warningBigScreen/components/message.vue index 5bcbabc..f15d59f 100644 --- a/src/views/riskWarningSys/warningBigScreen/components/message.vue +++ b/src/views/riskWarningSys/warningBigScreen/components/message.vue @@ -20,8 +20,10 @@ import * as echarts from 'echarts'; import '/@/theme/bigScreen.css' import {useScreenTheme} from "/@/stores/screenTheme" + import {riskWarningApi} from "/@/api/riskWarning"; interface stateType { + reportData: [] config: object } export default defineComponent({ @@ -31,7 +33,7 @@ size: Number, theme: Boolean }, - setup(props) { + setup(props,context) { const screenThemes = useScreenTheme() const { screenTheme } = storeToRefs(screenThemes); const userInfo = useUserInfo() @@ -39,45 +41,54 @@ const router = useRouter(); const pro = ref("eChartPro" + Date.now() + Math.random()) const state = reactive<stateType>({ + reportData: [], config:{ - header: ['消息列表', '同比'], - data: [ - ['一月预警消息SPI报告', '<span style="color:#4CF475;">↑ 94%</span>'], - ['二月预警消息SPI报告', '<span style="color:#4CF475;">↑ 94%</span>'], - ['三月预警消息SPI报告', '<span style="color:#4CF475;">↑ 94%</span>'], - ['四月预警消息SPI报告', '<span style="color:red;">↓ 43%</span>'], - ['五月预警消息SPI报告', '<span style="color:#4CF475;">↑ 94%</span>'], - ['六月预警消息SPI报告', '<span style="color:#4CF475;">↑ 94%</span>'], - ['七月预警消息SPI报告', '<span style="color:#4CF475;">↑ 94%</span>'], - ['八月预警消息SPI报告', '<span style="color:red;">↓ 65%</span>'], - ['九月预警消息SPI报告', '<span style="color:#4CF475;">↑ 94%</span>'], - ['十月预警消息SPI报告', '<span style="color:#4CF475;">↑ 94%</span>'], - ['十一月预警消息SPI报告', '<span style="color:#4CF475;">↑ 94%</span>'], - ['十二月预警消息SPI报告', '<span style="color:#4CF475;">↑ 94%</span>'] - ], - index: true, - columnWidth: [60], - align: ['center','center','center'], + header: ['消息列表','同比'], + data: [], + align: ['left'], headerBGC: '#0049af', oddRowBGC: 'none', + index: true, + columnWidth: [55,250], evenRowBGC: 'rgba(57,122,206,.1)', indexHeader: '序号', rowNum: fontSize(5) } }) + const getReport = async () => { + let res = await riskWarningApi().getAllReport(); + if (res.data.code === '200') { + state.reportData = res.data.data + state.config.data = state.reportData.map(i=> { + if(i.yoy >= 0){ + return [i.spiName,'<span style="color:#11feee">' + i.yoy + '%</span>'] + }else{ + return [i.spiName,'<span style="color:red">' + i.yoy + '%</span>'] + } + + }) + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + const mouseoverHandler = (e: any) => { } const clickHandler = (e: any) => { - console.log(e.row,'row') router.push({ - path: 'msgDetail', + path: 'screenPage', query: { - row: e.row + num: 8, + rowIndex: e.rowIndex } }) + context.emit('getData',e.rowIndex) } function fontSize(val){ @@ -110,6 +121,7 @@ // 页面载入时执行方法 onMounted(() => { + getReport() getTheme() }); diff --git a/src/views/riskWarningSys/warningBigScreen/components/monitor.vue b/src/views/riskWarningSys/warningBigScreen/components/monitor.vue index a979428..56a06ac 100644 --- a/src/views/riskWarningSys/warningBigScreen/components/monitor.vue +++ b/src/views/riskWarningSys/warningBigScreen/components/monitor.vue @@ -1,8 +1,9 @@ <template> <div class="charts-cont"> - <div class="monitor" :id="monitor"> - <div> - <img src="../../../../assets/warningScreen/video.png"> + <div class="monitor"> + <div style="width: 100%;height: 100%"> +<!-- <img src="../../../../assets/warningScreen/video.png">--> + <iframe class="video" style="width: 100%;height: 100%" :src="'http://36.108.169.10:8088/808gps/open/player/video.html?lang=zh&devIdno=' + videoUrl + '&&account=gtxh&password=000000'"></iframe> </div> </div> </div> @@ -20,31 +21,58 @@ import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; import * as echarts from 'echarts'; import '/@/theme/bigScreen.css' + import {videoApi} from "/@/api/systemManage/video"; interface stateType { + videoList: [], + listQuery: {} + videoUrl: string } export default defineComponent({ name: 'monitor', components: {}, - props:['allData'], - setup() { + props: [''], + setup(props,context) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); - const monitor = ref("eChartMon" + Date.now() + Math.random()) const state = reactive<stateType>({ - + videoList: [], + listQuery: { + bizDepId: null, + name: '', + shortName: '', + pageIndex: 1, + pageSize: 999 + }, + videoUrl: '' }) + onMounted(() => { + getVideoTableData() + }) - // 页面载入时执行方法 - onMounted(() => { - }); - + const getVideoTableData = async () => { + let res = await videoApi().getVideoList(state.listQuery); + if (res.data.code === '200') { + state.videoList = res.data.data + state.videoUrl = state.videoList[0].deviceNo + context.emit('getData',state.videoList) + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + const changeVideo = (no)=>{ + state.videoUrl = no + } return { - monitor, Search, + getVideoTableData, + changeVideo, ...toRefs(state) }; }, diff --git a/src/views/riskWarningSys/warningBigScreen/components/profession.vue b/src/views/riskWarningSys/warningBigScreen/components/profession.vue index 215c675..fcd1347 100644 --- a/src/views/riskWarningSys/warningBigScreen/components/profession.vue +++ b/src/views/riskWarningSys/warningBigScreen/components/profession.vue @@ -10,18 +10,18 @@ <script lang="ts"> import {toRefs, reactive, defineComponent, ref, defineAsyncComponent, onMounted} from 'vue'; import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; import {useUserInfo} from "/@/stores/userInfo"; import { Session } from '/@/utils/storage'; import { Search } from '@element-plus/icons-vue' import { ElMessage } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; import * as echarts from 'echarts'; import '/@/theme/bigScreen.css' + import {riskWarningApi} from "/@/api/riskWarning"; interface stateType { + proData: [] } export default defineComponent({ name: 'profession', @@ -29,40 +29,34 @@ props:{ size: Number }, - setup(props) { + setup(props,context) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); const pro = ref("eChartPro" + Date.now() + Math.random()) const state = reactive<stateType>({ - config:{ - data: [ - { - name: '持证人员', - value: 55 - }, - { - name: '非持证人员', - value: 120 - } - ], - radius: '65%', - activeRadius: '60%', - color: ['#FAC858','#EE6666'], - lineWidth: fontSize(25), - digitalFlopStyle: { - fontSize: 16, - fill: '#999' - } - } - }) + proData: [] + }) + + const getUserCount = async () => { + let res = await riskWarningApi().getUserCount(); + if (res.data.code === '200') { + state.proData = res.data.data + initPro(state.proData) + context.emit('getData',state.proData) + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + type EChartsOption = echarts.EChartsOption // 隐患整改情况 - const initPro =()=>{ + const initPro =(data)=>{ let dom = document.getElementById(pro.value); let myChart = echarts.init(dom); - let option: EChartsOption; - option = { tooltip: { trigger: 'item' @@ -77,17 +71,17 @@ }, series: [ { - name: 'Access From', + name: '人员专业度分布', type: 'pie', radius: ['45%', '70%'], avoidLabelOverlap: false, itemStyle: { - borderRadius: 4 + borderRadius: 2 }, label: { show: true, position: 'outer', - fontSize: fontSize(12), + fontSize: fontSize(8), color: '#999', textBorderWidth: 0, width: 30, @@ -105,10 +99,13 @@ fontWeight: 'bold' } }, - data: [ - { value: 1048, name: '持证人员' }, - { value: 735, name: '非持证人员' } - ], + data: data.map(i=>{ + const obj = { + name: i.name, + value: i.count + } + return obj + }), center: ['50%','55%'] } ] @@ -126,7 +123,7 @@ // 页面载入时执行方法 onMounted(() => { - initPro() + getUserCount() }); return { diff --git a/src/views/riskWarningSys/warningBigScreen/components/risk.vue b/src/views/riskWarningSys/warningBigScreen/components/risk.vue index 61b9ec3..53c9327 100644 --- a/src/views/riskWarningSys/warningBigScreen/components/risk.vue +++ b/src/views/riskWarningSys/warningBigScreen/components/risk.vue @@ -1,15 +1,15 @@ <template> <div class="charts-cont"> - <div :class="selector"> - <el-cascader - class="timeSe" - :teleported="false" - v-model="timeValue" - :options="optionList" - :props="riskProps" - @change="changeTime" - /> - </div> +<!-- <div :class="selector">--> +<!-- <el-cascader--> +<!-- class="timeSe"--> +<!-- :teleported="false"--> +<!-- v-model="timeValue"--> +<!-- :options="optionList"--> +<!-- :props="riskProps"--> +<!-- @change="changeTime"--> +<!-- />--> +<!-- </div>--> <div class="risk" :id="risk1"></div> <!-- <div v-show="curValue===false" class="risk" :id="risk2"></div>--> </div> @@ -55,7 +55,7 @@ theme: Boolean, dep: Array }, - setup(props) { + setup(props,context) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); const screenThemes = useScreenTheme() @@ -147,19 +147,6 @@ state.optionList.push(newObj) } } - // const swi = setInterval(()=>{ - // state.curValue = !state.curValue - // if(state.curValue == true){ - // nextTick(()=>{ - // initRisk1() - // }) - // }else{ - // nextTick(()=>{ - // initRisk2() - // }) - // } - // - // },5000) // 获取部门列表 const getAllDepartment = async () => { let res = await teamManageApi().getAllDepartment(); @@ -184,51 +171,13 @@ } } }; - // const recursion = (value: any) => { - // for (let i of value) { - // if (i.children.length !== 0) { - // state.departmentRecursionList.push(i); - // recursion(i.children); - // } else { - // state.departmentRecursionList.push(i); - // } - // } - // }; + const getDataByYearId = async () => { - getTime() - const data = { - depId: screenTheme.value.depId || 1, - beginYear: state.timeValue[0], - beginMonth: state.timeValue[1], - endYear: state.timeValue[0], - endMonth: state.timeValue[1] - } - if(state.timeValue[1] == 0){ - data.beginMonth = 1 - data.endMonth = 12 - } - let res = await riskWarningApi().getPreventByTimeDep(data); + let res = await riskWarningApi().getDpLine(); if (res.data.code === '200') { state.riskData = res.data.data - const depList = [] - const deathList = [] - const hardList = [] - const lightList = [] - for(let index in state.riskData){ - state.riskData[index].depId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.riskData[index].depId))?.depName; - depList.push(state.riskData[index].depId) - deathList.push(state.riskData[index].detail.deathCount) - hardList.push(state.riskData[index].detail.heavyInjureCount) - lightList.push(state.riskData[index].detail.lightInjureCount) - } - // state.departmentList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.operationDepId))?.depName; - if(depList.length == 0){ - depList.push('该部门不包含子部门数据') - deathList.push(0) - hardList.push(0) - lightList.push(0) - } - initRisk1(depList,deathList,hardList,lightList) + initRisk1(state.riskData) + context.emit('getData',state.riskData) } else { ElMessage({ type: 'warning', @@ -246,12 +195,10 @@ type EChartsOption = echarts.EChartsOption // 隐患整改情况 - const initRisk1 =(depList,deathList,hardList,lightList)=>{ + const initRisk1 =(data)=>{ let dom = document.getElementById(risk1.value); let myChart = echarts.init(dom); - let option: EChartsOption; - option = { tooltip: { trigger: 'axis', @@ -260,245 +207,47 @@ type: 'shadow' // 'shadow' as default; can also be 'line' or 'shadow' } }, - // dataZoom: { - // type: 'slider', - // show: true, - // textStyle: { - // color: '#fff' - // }, - // realtime: true, - // top: 20, - // left: 10, - // height: 12, - // width: 80, - // start: 0, - // end: 100, - // orient: 'horizontal' - // }, - dataZoom: [ - //滑动条 + color: ['#91cc75','#ee6666'], + grid: [ { - xAxisIndex: 0, //这里是从X轴的0刻度开始 - show: false, //是否显示滑动条,不影响使用 - type: "slider", // 这个 dataZoom 组件是 slider 型 dataZoom 组件 - startValue: 0, // 从头开始。 - endValue: 6, // 一次性展示几个。 - }, - ], - legend: { - top: '0', - left: 'center', - itemWidth: fontSize(10), - itemHeight: fontSize(8), - textStyle:{ - color: 'auto', - fontSize: fontSize(12) - } - }, - grid: { - left: '2%', - right: '4%', - bottom: '0', - containLabel: true - }, - xAxis: { - type: 'category', - data: depList, - axisLine:{ - show: true, - lineStyle:{ - color: '#999' - } - }, - axisLabel:{ - color: '#999', - fontSize: fontSize(9) - } - }, - yAxis: { - type: 'value', - axisLine:{ - show: true, - lineStyle:{ - type: 'dotted' - } - }, - axisLabel:{ - color: '#999' - }, - splitLine:{ - show: false - } - }, - series: [ - { - name: '可能造成死亡的', - type: 'bar', - stack: 'total', - label: { - show: false - }, - emphasis: { - focus: 'series' - }, - data: deathList, - barCategoryGap: '50%' - }, - { - name: '可能造成重伤的', - type: 'bar', - stack: 'total', - label: { - show: false - }, - emphasis: { - focus: 'series' - }, - data: hardList, - barCategoryGap: '50%' - }, - { - name: '可能造成轻伤的', - type: 'bar', - stack: 'total', - label: { - show: false - }, - emphasis: { - focus: 'series' - }, - data: lightList, - barCategoryGap: '50%' - } - ] - }; - // option && myChart.setOption(option); - if (option && typeof option === 'object') { - myChart.setOption(option); - state.myVar = setInterval(function(){ - if (option.dataZoom[0].endValue == depList.length ) { - option.dataZoom[0].endValue = 4; - option.dataZoom[0].startValue = 0; - } else { - option.dataZoom[0].endValue = option.dataZoom[0].endValue + 1; - option.dataZoom[0].startValue = option.dataZoom[0].startValue + 1; + top: '5%', + right: '2%', + bottom: '10%' } - myChart.setOption(option); - }, 6000) - } + ], + xAxis: { + type: 'category', + data: data.map(i=>i.time), + axisLabel: { + color: '#fff' + } + }, + yAxis: { + type: 'value', + splitLine:{ + lineStyle: { + color: 'rgba(255,255,255,.2)' + } + } + }, + series: [ + { + name: '一般隐患', + type: 'line', + data: data.map(i=>i.generalDanger?i.generalDanger:0) + }, + { + name: '重大隐患', + type: 'line', + data: data.map(i=>i.majorDanger?i.majorDanger:0) + }, + ] + }; + option && myChart.setOption(option); window.addEventListener("resize",function (){ myChart.resize(); - }); - // echarts.init(document.getElementById(risk2.value)).dispose() + }) } - - // const initRisk2 =()=>{ - // let dom = document.getElementById(risk2.value); - // let myChart = echarts.init(dom); - // - // let option: EChartsOption; - // - // option = { - // tooltip: { - // trigger: 'axis', - // axisPointer: { - // // Use axis to trigger tooltip - // type: 'shadow' // 'shadow' as default; can also be 'line' or 'shadow' - // } - // }, - // legend: { - // top: '1%', - // left: 'center', - // itemWidth: fontSize(10), - // itemHeight: fontSize(8), - // textStyle:{ - // color: 'auto', - // fontSize: fontSize(12) - // } - // }, - // grid: { - // left: '2%', - // right: '4%', - // bottom: '0', - // containLabel: true - // }, - // xAxis: { - // type: 'category', - // data: ['F部门', 'G部门', 'H部门', 'I部门', 'J部门', 'K部门'], - // axisLine:{ - // show: true, - // lineStyle:{ - // color: '#999' - // } - // }, - // axisLabel:{ - // color: '#999' - // } - // }, - // yAxis: { - // type: 'value', - // axisLine:{ - // show: true, - // lineStyle:{ - // type: 'dotted' - // } - // }, - // axisLabel:{ - // color: '#999' - // }, - // splitLine:{ - // show: false - // } - // }, - // series: [ - // { - // name: '可能造成死亡的', - // type: 'bar', - // stack: 'total', - // label: { - // show: false - // }, - // emphasis: { - // focus: 'series' - // }, - // data: [320, 301, 334, 390, 330, 320], - // barCategoryGap: '50%' - // }, - // { - // name: '可能造成重伤的', - // type: 'bar', - // stack: 'total', - // label: { - // show: false - // }, - // emphasis: { - // focus: 'series' - // }, - // data: [90, 230, 210, 132, 101, 134], - // barCategoryGap: '50%' - // }, - // { - // name: '可能造成轻伤的', - // type: 'bar', - // stack: 'total', - // label: { - // show: false - // }, - // emphasis: { - // focus: 'series' - // }, - // data: [290, 330, 310, 191, 234, 290], - // barCategoryGap: '50%' - // } - // ] - // }; - // - // option && myChart.setOption(option); - // window.addEventListener("resize",function (){ - // myChart.resize(); - // }); - // echarts.init(document.getElementById(risk1.value)).dispose() - // } const getTheme =()=>{ if(screenTheme.value.isDark){ diff --git a/src/views/riskWarningSys/warningBigScreen/components/stock.vue b/src/views/riskWarningSys/warningBigScreen/components/stock.vue index 1feb3db..70f8696 100644 --- a/src/views/riskWarningSys/warningBigScreen/components/stock.vue +++ b/src/views/riskWarningSys/warningBigScreen/components/stock.vue @@ -1,9 +1,6 @@ <template> <div class="charts-cont"> - <div v-show="curValue===true" class="stock" :id="stock1"> - - </div> - <div v-show="curValue===false" class="stock" :id="stock2"></div> + <div class="stock" :id="stock1"></div> </div> </template> @@ -19,9 +16,11 @@ import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; import * as echarts from 'echarts'; import '/@/theme/bigScreen.css' + import {riskWarningApi} from "/@/api/riskWarning"; interface stateType { - curValue: boolean + stockData: [] + changeCharts: any } export default defineComponent({ name: 'stock', @@ -29,595 +28,127 @@ props:{ size: Number }, - setup(props) { + setup(props,context) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); const stock1 = ref("eChartStock1" + Date.now() + Math.random()) - const stock2 = ref("eChartStock2" + Date.now() + Math.random()) const state = reactive<stateType>({ - curValue: true + stockData: [], + changeCharts: null }) - const swit = setInterval(()=>{ - state.curValue = !state.curValue - if(state.curValue == true){ - nextTick(()=>{ - initStock1() - }) - }else{ - nextTick(()=>{ - initStock2() - }) - } - },5000) + const getSupplies = async () => { + let res = await riskWarningApi().getEmergencySupplies(); + if (res.data.code === '200') { + state.stockData = res.data.data + const chartData = state.stockData.reduce((acc, curr, index) => { + if (index % 4 === 0) acc.push([]); + acc[acc.length - 1].push(curr); + return acc; + }, []) + const maxNum = Math.max(...state.stockData.map(i=>i.count)) + let curIndex = 0 + const renderCharts = () => { + const data = chartData[curIndex] + initStock(data,maxNum) + curIndex = (curIndex + 1) % chartData.length + } + renderCharts() + state.changeCharts = setInterval(renderCharts,5000) + context.emit('getData',state.stockData) + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + + type EChartsOption = echarts.EChartsOption // 隐患整改情况 - const initStock1 =()=>{ + const initStock =(data,maxNum)=>{ let dom = document.getElementById(stock1.value); let myChart = echarts.init(dom); let option: EChartsOption; option = { - series: [ - { - name: '消防耗材', - type: 'pie', - radius: [fontSize(40), fontSize(50)], - data: [ - { value: 2103, name: '消防耗材'}, - { value: 2310, name: '消防耗材未使用'} - ], - label: { - show: true, - position: 'center', - formatter: '{total|{a}}' + '\n\r' + '{active|2103}', - rich: { - total:{ - fontSize: fontSize(12), - color:'#999', - lineHeight: fontSize(16) - }, - active: { - fontSize: fontSize(16), - color:'#999', - }, - } - }, - color: [ - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#2D74C0" // 0% 处的颜色 - }, { - offset: 1, color: "#21D9DC" // 100% 处的颜色 - }] - }, - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#333" // 0% 处的颜色 - }, { - offset: 1, color: "#333" // 100% 处的颜色 - }] - } - ], - center: ['20%','25%'] - }, - { - name: '安全帽', - type: 'pie', - radius: [fontSize(40), fontSize(50)], - data: [ - { value: 23509, name: '安全帽'}, - { value: 34312, name: '安全帽未使用'} - ], - label: { - show: true, - position: 'center', - formatter: '{total|{a}}' + '\n\r' + '{active|23509}', - rich: { - total:{ - fontSize: fontSize(12), - color:'#999', - lineHeight: fontSize(16) - }, - active: { - fontSize: fontSize(16), - color:'#999', - }, - } - }, - color: [ - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#0DAA2E" // 0% 处的颜色 - }, { - offset: 1, color: "#4CF475" // 100% 处的颜色 - }] - }, - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#333" // 0% 处的颜色 - }, { - offset: 1, color: "#333" // 100% 处的颜色 - }] - } - ], - center: ['50%','25%'] - }, - { - name: '防护服', - type: 'pie', - radius: [fontSize(40), fontSize(50)], - data: [ - { value: 12830, name: '防护服'}, - { value: 22140, name: '防护服未使用'} - ], - label: { - show: true, - position: 'center', - formatter: '{total|{a}}' + '\n\r' + '{active|12830}', - rich: { - total:{ - fontSize: fontSize(12), - color:'#999', - lineHeight: fontSize(16) - }, - active: { - fontSize: fontSize(16), - color:'#999', - }, - } - }, - color: [ - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#E8B21D" // 0% 处的颜色 - }, { - offset: 1, color: "#E5DC44" // 100% 处的颜色 - }], - global: false // 缺省为 false - }, - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#333" // 0% 处的颜色 - }, { - offset: 1, color: "#333" // 100% 处的颜色 - }], - global: false // 缺省为 false - } - ], - center: ['80%','25%'] - }, - { - name: '劳保鞋', - type: 'pie', - radius: [fontSize(40), fontSize(50)], - data: [ - { value: 5492, name: '劳保鞋'}, - { value: 10842, name: '劳保鞋未使用'} - ], - label: { - show: true, - position: 'center', - formatter: '{total|{a}}' + '\n\r' + '{active|5492}', - rich: { - total:{ - fontSize: fontSize(12), - color:'#999', - lineHeight: fontSize(16) - }, - active: { - fontSize: fontSize(16), - color:'#999', - }, - } - }, - color: [ - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#D65146" // 0% 处的颜色 - }, { - offset: 1, color: "#F58C28" // 100% 处的颜色 - }] - }, - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#333" // 0% 处的颜色 - }, { - offset: 1, color: "#333" // 100% 处的颜色 - }] - } - ], - center: ['33.33%','75%'] - }, - { - name: '动火护具', - type: 'pie', - radius: [fontSize(40), fontSize(50)], - data: [ - { value: 44043, name: '动火护具'}, - { value: 68102, name: '动火护具未使用' } - ], - label: { - show: true, - position: 'center', - formatter: '{total|{a}}' + '\n\r' + '{active|44043}', - rich: { - total:{ - fontSize: fontSize(12), - color:'#999', - lineHeight: fontSize(16) - }, - active: { - fontSize: fontSize(16), - color:'#999', - }, - } - }, - color: [ - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#4449D1" // 0% 处的颜色 - }, { - offset: 1, color: "#A86DE5" // 100% 处的颜色 - }] - }, - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#333" // 0% 处的颜色 - }, { - offset: 1, color: "#333" // 100% 处的颜色 - }] - } - ], - center: ['66.66%','75%'] - } - ], + series: data.map((item,index)=>{ + const centerList = [ + ['30%','25%'],['70%','25%'],['30%','75%'],['70%','75%'] + ] + const i = { + type: 'gauge', + radius: '40%', + startAngle: 90, + endAngle: -270, + pointer: { + show: false + }, + progress: { + show: true, + overlap: false, + roundCap: true, + clip: false, + itemStyle: { + borderWidth: 0, + borderColor: '#464646' + }, + }, + axisLine: { + lineStyle: { + width: fontSize(10), + color: [[1,'#666']] + }, + show: true + }, + splitLine: { + show: false, + distance: 0, + length: 10 + }, + axisTick: { + show: false + }, + axisLabel: { + show: false, + distance: 50 + }, + data: [ + { + value: item.count, + name: item.name, + title: { + offsetCenter: ['0%', '-25%'], + color: '#fff' + }, + }, + ], + center: centerList[index], + // max: maxNum, + title: { + fontSize: fontSize(11), + }, + detail: { + width: 50, + height: fontSize(20), + fontSize: fontSize(24), + color: 'inherit', + borderColor: 'inherit', + borderRadius: 20, + borderWidth: 0, + formatter: '{value}' + } + } + return i + }) }; option && myChart.setOption(option); window.addEventListener("resize",function (){ myChart.resize(); }); - echarts.init(document.getElementById(stock2.value)).dispose() - } - - const initStock2 =()=>{ - let dom = document.getElementById(stock2.value); - let myChart = echarts.init(dom); - - let option: EChartsOption; - - option = { - series: [ - { - name: '急救包', - type: 'pie', - radius: [fontSize(40), fontSize(50)], - data: [ - { value: 8603, name: '急救包'}, - { value: 12032, name: '急救包未使用'} - ], - label: { - show: true, - position: 'center', - formatter: '{total|{a}}' + '\n\r' + '{active|8603}', - rich: { - total:{ - fontSize: fontSize(12), - color:'#999', - lineHeight: fontSize(16) - }, - active: { - fontSize: fontSize(16), - color:'#999', - }, - } - }, - color: [ - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#2D74C0" // 0% 处的颜色 - }, { - offset: 1, color: "#21D9DC" // 100% 处的颜色 - }], - global: false // 缺省为 false - }, - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#333" // 0% 处的颜色 - }, { - offset: 1, color: "#333" // 100% 处的颜色 - }], - global: false // 缺省为 false - } - ], - center: ['20%','25%'] - }, - { - name: '人员培训资料', - type: 'pie', - radius: [fontSize(40), fontSize(50)], - data: [ - { value: 8960, name: '人员培训资料'}, - { value: 9890, name: '人员培训资料未使用'} - ], - label: { - show: true, - position: 'center', - formatter: '{total|{a}}' + '\n\r' + '{active|8960}', - rich: { - total:{ - fontSize: fontSize(12), - color:'#999', - lineHeight: fontSize(16) - }, - active: { - fontSize: fontSize(16), - color:'#999', - }, - } - }, - color: [ - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#0DAA2E" // 0% 处的颜色 - }, { - offset: 1, color: "#4CF475" // 100% 处的颜色 - }], - global: false // 缺省为 false - }, - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#333" // 0% 处的颜色 - }, { - offset: 1, color: "#333" // 100% 处的颜色 - }], - global: false // 缺省为 false - } - ], - center: ['50%','25%'] - }, - { - name: '安全护具', - type: 'pie', - radius: [fontSize(40), fontSize(50)], - data: [ - { value: 12302, name: '安全护具'}, - { value: 20130, name: '安全护具未使用'} - ], - label: { - show: true, - position: 'center', - formatter: '{total|{a}}' + '\n\r' + '{active|12302}', - rich: { - total:{ - fontSize: fontSize(12), - color:'#999', - lineHeight: fontSize(16) - }, - active: { - fontSize: fontSize(16), - color:'#999', - }, - } - }, - color: [ - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#E8B21D" // 0% 处的颜色 - }, { - offset: 1, color: "#E5DC44" // 100% 处的颜色 - }], - global: false // 缺省为 false - }, - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#333" // 0% 处的颜色 - }, { - offset: 1, color: "#333" // 100% 处的颜色 - }], - global: false // 缺省为 false - } - ], - center: ['80%','25%'] - }, - { - name: '高空护具', - type: 'pie', - radius: [fontSize(40), fontSize(50)], - data: [ - { value: 42948, name: '高空护具'}, - { value: 89342, name: '高空护具未使用'} - ], - label: { - show: true, - position: 'center', - formatter: '{total|{a}}' + '\n\r' + '{active|42948}', - rich: { - total:{ - fontSize: fontSize(12), - color:'#999', - lineHeight: fontSize(16) - }, - active: { - fontSize: fontSize(16), - color:'#999', - }, - } - }, - color: [ - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#D65146" // 0% 处的颜色 - }, { - offset: 1, color: "#F58C28" // 100% 处的颜色 - }], - global: false // 缺省为 false - }, - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#333" // 0% 处的颜色 - }, { - offset: 1, color: "#333" // 100% 处的颜色 - }], - global: false // 缺省为 false - } - ], - center: ['33.33%','75%'] - }, - { - name: '防尘护具', - type: 'pie', - radius: [fontSize(40), fontSize(50)], - data: [ - { value: 1220, name: '防尘护具'}, - { value: 5034, name: '防尘护具未使用' } - ], - label: { - show: true, - position: 'center', - formatter: '{total|{a}}' + '\n\r' + '{active|1220}', - rich: { - total:{ - fontSize: fontSize(12), - color:'#999', - lineHeight: fontSize(16) - }, - active: { - fontSize: fontSize(16), - color:'#999', - }, - } - }, - color: [ - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#4449D1" // 0% 处的颜色 - }, { - offset: 1, color: "#A86DE5" // 100% 处的颜色 - }], - global: false // 缺省为 false - }, - { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: "#333" // 0% 处的颜色 - }, { - offset: 1, color: "#333" // 100% 处的颜色 - }], - global: false // 缺省为 false - } - ], - center: ['66.66%','75%'] - } - ], - }; - - option && myChart.setOption(option); - window.addEventListener("resize",function (){ - myChart.resize(); - }); - echarts.init(document.getElementById(stock1.value)).dispose() } function fontSize(val){ @@ -627,14 +158,13 @@ // 页面载入时执行方法 onMounted(() => { - initStock1(); + getSupplies() }); onBeforeUnmount(() =>{ - clearInterval(swit) + clearInterval(state.changeCharts) }) return { stock1, - stock2, Search, fontSize, ...toRefs(state) diff --git a/src/views/riskWarningSys/warningBigScreen/components/training.vue b/src/views/riskWarningSys/warningBigScreen/components/training.vue index 2410257..4fba1c7 100644 --- a/src/views/riskWarningSys/warningBigScreen/components/training.vue +++ b/src/views/riskWarningSys/warningBigScreen/components/training.vue @@ -1,10 +1,6 @@ <template> <div class="charts-cont"> - <span v-if="lastDays == -1" :class="tip">该部门本年未进行应急演练</span> - <span v-else :class="tip">距本年度上次演练结束{{lastDays}}天</span> - <div v-show="curTab === 1" class="train" :id="train1"></div> - <div v-show="curTab === 2" class="train" :id="train2"></div> - <div v-show="curTab === 3" class="train" :id="train3"></div> + <div class="train" :id="train1"></div> </div> </template> @@ -34,12 +30,8 @@ import '/@/theme/bigScreen.css' interface stateType { - curTab: number, - timeValue: Array<any>, traData: Array<any>, - monthData: Array<any>, - lastDays: number | null, - tip: string, + changeChart: any } export default defineComponent({ name: 'accident', @@ -48,78 +40,35 @@ size: Number, theme: Boolean }, - setup(props) { + setup(props,context) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); const screenThemes = useScreenTheme() const { screenTheme } = storeToRefs(screenThemes); const train1 = ref("eChartTrain1" + Date.now() + Math.random()) - const train2 = ref("eChartTrain2" + Date.now() + Math.random()) - const train3 = ref("eChartTrain3" + Date.now() + Math.random()) const state = reactive<stateType>({ - curTab: 1, - timeValue: [], traData: [], - monthData: [], - lastDays: null, - tip: 'tip-dark' + changeChart: null }) - const timeForm = { - hour12: false, - year: 'numeric', - month: 'numeric', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - second: '2-digit' - }; const getDataById = async () => { - getTime() - const data = { - depId: screenTheme.value.depId || 1, - beginYear: state.timeValue[0], - beginMonth: 1, - endYear: state.timeValue[0], - endMonth: state.timeValue[1] - } - let res = await riskWarningApi().getEmergencyByDep(data); + let res = await riskWarningApi().getSafeCheckTask(); if (res.data.code === '200') { state.traData = res.data.data - const result = [] - let lastTime = '' - for(let index in state.traData){ - if(state.traData[index].detail && state.traData[index].detail.length>0){ - let total = state.traData[index].detail.reduce((pre,cur)=>{ - return pre+cur.practiceCount - },0) - result.push(total) - state.traData[index].totalCount = total - }else{ - result.push(0) - } - for(let i in state.traData[index].detail){ - if(state.traData[index].detail[i].lastPracticeTime != null){ - lastTime = state.traData[index].detail[i].lastPracticeTime - } - } + const chartData = state.traData.reduce((acc, curr, index) => { + if (index % 4 === 0) acc.push([]); + acc[acc.length - 1].push(curr); + return acc; + }, []) + let curIndex = 0 + const renderCharts = () => { + const data = chartData[curIndex] + initTrain1(data) + curIndex = (curIndex + 1) % chartData.length } - if(!lastTime){ - state.lastDays = -1 - }else{ - const date = new Date(lastTime) - const nTime = Date.now() - date.getTime() - state.lastDays = Math.floor(nTime / 86400000) - } - const arrNum = Math.ceil(result.length/4, 10); - let index = 0; // 定义初始索引 - let resIndex = 0; // 用来保存每次拆分的长度 - while(index< arrNum){ - state.monthData[index]= result.slice(resIndex,4+resIndex); - resIndex += 4; - index++; - } - initTrain1() + renderCharts() + state.changeChart = setInterval(renderCharts,5000) + context.emit('getData',state.traData) } else { ElMessage({ type: 'warning', @@ -127,43 +76,14 @@ }); } } - const getTime = () =>{ - const curTime = new Date().toLocaleString('zh', timeForm).replace(/\//g, '-'); - const temp = curTime.split('-') - state.timeValue[0] = temp[0] - state.timeValue[1] = Number(temp[1]) - } const getTheme =()=>{ - if(screenTheme.value.isDark){ - state.tip = 'tip-dark' - }else{ - state.tip = 'tip-light' - } - } - const changeTab = setInterval(()=>{ - if(state.curTab<3){ - state.curTab = state.curTab + 1 - if(state.curTab == 2){ - nextTick(()=>{ - initTrain2() - }) - }else{ - nextTick(()=>{ - initTrain3() - }) - } - }else{ - state.curTab = 1 - nextTick(()=>{ - initTrain1() - }) - } - },5000) + } + type EChartsOption = echarts.EChartsOption // 隐患整改情况 - const initTrain1 =()=>{ + const initTrain1 =(data)=>{ let dom = document.getElementById(train1.value); let myChart = echarts.init(dom); let option: EChartsOption; @@ -200,7 +120,7 @@ }, yAxis: { type: 'category', - data: ['一月', '二月', '三月', '四月'], + data: data.map(i=>i.year+ '.' + i.month), axisLine:{ show: true, lineStyle:{ @@ -208,14 +128,14 @@ } }, axisLabel:{ - color: '#999' + color: '#fff' } }, series: [ { name: '2011', type: 'bar', - data: state.monthData[0], + data: data.map(i=>i.count), itemStyle:{ color: { x: 0, @@ -250,193 +170,6 @@ window.addEventListener("resize",function (){ myChart.resize(); }); - echarts.init(document.getElementById(train2.value)).dispose() - echarts.init(document.getElementById(train3.value)).dispose() - } - - const initTrain2 =()=>{ - let dom = document.getElementById(train2.value); - let myChart = echarts.init(dom); - let option: EChartsOption; - - option = { - tooltip: { - trigger: 'axis', - axisPointer: { - type: 'shadow' - } - }, - grid: { - top: '1%', - left: '2%', - right: '2%', - bottom: '2%', - containLabel: true - }, - xAxis: { - type: 'value', - boundaryGap: [0, 0.01], - axisLine:{ - show: true, - lineStyle:{ - type: 'dotted' - } - }, - axisLabel:{ - color: '#999' - }, - splitLine:{ - show: false - } - }, - yAxis: { - type: 'category', - data: ['五月', '六月','七月', '八月'], - axisLine:{ - show: true, - lineStyle:{ - color: '#999' - } - }, - axisLabel:{ - color: '#999' - } - }, - series: [ - { - name: '2011', - type: 'bar', - // data: [18203, 23489, 29034, 104970, 131744, 630230, 18203, 23489, 29034, 104970, 131744, 630230] - data: state.monthData[1], - barCategoryGap: '50%', - itemStyle:{ - color: { - x: 0, - y: 0, - x2: 1, - y2: 0, - colorStops: [ - { - offset: 0.1, - color: "#2D74C0", // 线处的颜色 - }, - { - offset: 0.9, - color: "#21D9DC", // 坐标轴处的颜色 - }, - ] - }, - borderRadius: [0,99,99,0] - }, - label:{ - show: true, - position: 'outside', - color: '#999', - fontSize: fontSize(11) - } - } - ] - }; - - option && myChart.setOption(option); - window.addEventListener("resize",function (){ - myChart.resize(); - }); - echarts.init(document.getElementById(train1.value)).dispose() - echarts.init(document.getElementById(train3.value)).dispose() - } - - const initTrain3 =()=>{ - let dom = document.getElementById(train3.value); - let myChart = echarts.init(dom); - let option: EChartsOption; - - option = { - tooltip: { - trigger: 'axis', - axisPointer: { - type: 'shadow' - } - }, - grid: { - top: '1%', - left: '2%', - right: '2%', - bottom: '2%', - containLabel: true - }, - xAxis: { - type: 'value', - boundaryGap: [0, 0.01], - axisLine:{ - show: true, - lineStyle:{ - type: 'dotted' - } - }, - axisLabel:{ - color: '#999' - }, - splitLine:{ - show: false - } - }, - yAxis: { - type: 'category', - // data: ['一月', '二月', '三月', '四月', '五月', '六月','七月', '八月', '九月', '十月', '十一月', '十二月'], - data: ['九月', '十月', '十一月', '十二月'], - axisLine:{ - show: true, - lineStyle:{ - color: '#999' - } - }, - axisLabel:{ - color: '#999' - } - }, - series: [ - { - name: '2011', - type: 'bar', - // data: [18203, 23489, 29034, 104970, 131744, 630230, 18203, 23489, 29034, 104970, 131744, 630230] - data: state.monthData[2], - barCategoryGap: '50%', - itemStyle:{ - color: { - x: 0, - y: 0, - x2: 1, - y2: 0, - colorStops: [ - { - offset: 0.1, - color: "#2D74C0", // 线处的颜色 - }, - { - offset: 0.9, - color: "#21D9DC", // 坐标轴处的颜色 - }, - ] - }, - borderRadius: [0,99,99,0] - }, - label:{ - show: true, - position: 'outside', - color: '#999', - fontSize: fontSize(11) - } - } - ] - }; - - option && myChart.setOption(option); - window.addEventListener("resize",function (){ - myChart.resize(); - }); - echarts.init(document.getElementById(train1.value)).dispose() - echarts.init(document.getElementById(train2.value)).dispose() } function fontSize(val){ @@ -446,27 +179,19 @@ watchEffect(() => { - if(props.theme){ - state.tip = 'tip-dark' - }else{ - state.tip = 'tip-light' - } - getDataById() + // getDataById() }) // 页面载入时执行方法 onMounted(() => { - getTime(); getTheme(); getDataById() }); onBeforeUnmount(() =>{ - clearInterval(changeTab) + clearInterval(state.changeChart) }) return { train1, - train2, - train3, Search, fontSize, ...toRefs(state) diff --git a/src/views/riskWarningSys/warningBigScreen/index.vue b/src/views/riskWarningSys/warningBigScreen/index.vue index 15c75bc..ffcb8aa 100644 --- a/src/views/riskWarningSys/warningBigScreen/index.vue +++ b/src/views/riskWarningSys/warningBigScreen/index.vue @@ -30,10 +30,10 @@ <!-- <img src="themeStyle.skinIcon" class="qiehuan" @click="changeTheme" />--> <span class="datetime">{{currentTime}}</span> <div class="btns"> - <div class="themeBtn" @click="changeTheme()"> - <img v-if="screenTheme.isDark" src="../../../assets/warningScreen/skin.png"/> - <img v-else src="../../../assets/warningScreen/skin-light.png"/> - </div> +<!-- <div class="themeBtn" @click="changeTheme()">--> +<!-- <img v-if="screenTheme.isDark" src="../../../assets/warningScreen/skin.png"/>--> +<!-- <img v-else src="../../../assets/warningScreen/skin-light.png"/>--> +<!-- </div>--> <div class="fullBtn" @click="onScreenfullClick"> <div class="toFull"> <i class="iconfont" :title="isScreenfull ? $t('message.user.title6') : $t('message.user.title5')" :class="!isScreenfull ? 'icon-fullscreen' : 'icon-tuichuquanping'"></i> @@ -64,7 +64,7 @@ <div class="left-mid"> <dv-border-box-13 :backgroundColor="boxBg" :color="boxColor" class="box-bg"></dv-border-box-13> <div class="part-tit"> - <span>| 应急演练次数</span> + <span>| 智能巡检超期未巡检任务</span> <!-- <img @click="jumpPage(2)" src="../../../assets/warningScreen/small-full.png">--> <Switch style="width: 1.2rem;height: 1.2rem;cursor: pointer" @click="jumpPage(2)"/> </div> @@ -75,7 +75,7 @@ <div class="left-bottom"> <dv-border-box-13 :backgroundColor="boxBg" :color="boxColor" class="box-bg"></dv-border-box-13> <div class="part-tit"> - <span>| 隐患等级数量分布</span> + <span>| 隐患趋势</span> <Switch style="width: 1.2rem;height: 1.2rem;cursor: pointer" @click="jumpPage(3)"/> </div> <div class="chart-box"> @@ -88,15 +88,15 @@ <dv-border-box-11 title="SPI数据分析" :backgroundColor="boxBg" :color="boxBigColor" class="box-bg"></dv-border-box-11> <div class="part-tit" style="position: absolute;top: 10%;padding: 0 4%;align-items: flex-start;z-index: 10001"> <div class="spiChart"> - <el-cascader - class="spiSe" - :teleported="false" - v-model="depValue" - :options="departList" - :props="depProps" - :show-all-levels="false" - @change="depChange" - /> +<!-- <el-cascader--> +<!-- class="spiSe"--> +<!-- :teleported="false"--> +<!-- v-model="depValue"--> +<!-- :options="departList"--> +<!-- :props="depProps"--> +<!-- :show-all-levels="false"--> +<!-- @change="depChange"--> +<!-- />--> </div> <Switch style="width: 1.2rem;height: 1.2rem;cursor: pointer" @click="jumpPage(4)"/> </div> @@ -160,7 +160,7 @@ <Switch style="width: 1.2rem;height: 1.2rem;cursor: pointer" @click="jumpPage(9)"/> </div> <div class="chart-box"> - <monitor></monitor> + <monitor :size="1" ref="monRef" :theme="screenTheme.isDark"></monitor> </div> </div> <div class="right-bottom"> @@ -201,6 +201,8 @@ import {useScreenTheme} from "/@/stores/screenTheme" import {storeToRefs} from "pinia"; import {teamManageApi} from "/@/api/systemManage/basicDateManage/personShiftManage/teamManage"; + import {NextLoading} from "/@/utils/loading"; + import {videoApi} from "/@/api/systemManage/video"; // 定义接口来定义对象的类型 interface stateType { @@ -248,7 +250,7 @@ isScreenfull: false, currentTime: '', dialogShow: 'hide', - dialogHide: 'showup', + dialogHide: 'hide', depProps: { expandTrigger: 'hover', checkStrictly: true, @@ -259,8 +261,10 @@ departList: [], timer: null }); + const monRef = ref() // 页面载入时执行方法 onMounted(() => { + NextLoading.done(); state.depValue = screenTheme.value.depId getTime(); getAllDepartment(); @@ -344,7 +348,7 @@ }else{ state.dialogShow = 'hide' } - }; + } const closeInfo = ()=>{ state.dialogHide = 'hide' @@ -361,7 +365,10 @@ // 返回上一页 const goBack = () => { - window.history.go(-1); + // window.history.go(-1); + router.push({ + path: 'newMenu' + }); }; onBeforeUnmount(() =>{ @@ -385,6 +392,7 @@ router, props, screenTheme, + monRef, openDialog, closeInfo, changeTheme, @@ -403,10 +411,14 @@ .hide{ display: none; } - + #container{ + width: 100%; + height: 100%; + } .showup{ display: block; } + .dark { width: 100%; height: 100%; diff --git a/src/views/riskWarningSys/warningBigScreen/indexs/components/acc.vue b/src/views/riskWarningSys/warningBigScreen/indexs/components/acc.vue index c350ec4..490f6e1 100644 --- a/src/views/riskWarningSys/warningBigScreen/indexs/components/acc.vue +++ b/src/views/riskWarningSys/warningBigScreen/indexs/components/acc.vue @@ -1,52 +1,31 @@ <template> - <div id="descCont" class="dark-desc"> - <div class="des-tit"> - <div>2022年度事故等级分布与影响一览</div> - <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> - </div> - <div class="des-main"> - <div v-if="descContent[0]"> - <h4>特别重大事故共计:{{descContent[0].count}}起</h4> - <p> - 死亡人数:{{descContent[0].causeDeathCount}}人; - 重伤人数:{{descContent[0].causeHeavyInjureCount}}人; - 轻伤人数:{{descContent[0].causeLightInjureCount}}人; - 直接经济损失:{{descContent[0].loss}}元</p> - </div> - <div v-if="descContent[1]"> - <h4>重大事故共计:{{descContent[1].count}}起</h4> - <p> - 死亡人数:{{descContent[1].causeDeathCount}}人; - 重伤人数:{{descContent[1].causeHeavyInjureCount}}人; - 轻伤人数:{{descContent[1].causeLightInjureCount}}人; - 直接经济损失:{{descContent[1].loss}}万元</p> - </div> - <div v-if="descContent[2]"> - <h4>较大事故共计:{{descContent[2].count}}起</h4> - <p> - 死亡人数:{{descContent[2].causeDeathCount}}人; - 重伤人数:{{descContent[2].causeHeavyInjureCount}}人; - 轻伤人数:{{descContent[2].causeLightInjureCount}}人; - 直接经济损失:{{descContent[2].loss}}元</p> - </div> - <div v-if="descContent[3]"> - <h4>一般事故共计:{{descContent[3].count}}起</h4> - <p> - 死亡人数:{{descContent[3].causeDeathCount}}人; - 重伤人数:{{descContent[3].causeHeavyInjureCount}}人; - 轻伤人数:{{descContent[3].causeLightInjureCount}}人; - 直接经济损失:{{descContent[3].loss}}元</p> - </div> - <div v-if="descContent[4]"> - <h4>未遂事故共计:{{descContent[4].count}}起</h4> - <p> - 死亡人数:{{descContent[4].causeDeathCount}}人; - 重伤人数:{{descContent[4].causeHeavyInjureCount}}人; - 轻伤人数:{{descContent[4].causeLightInjureCount}}人; - 直接经济损失:{{descContent[4].loss}}元</p> - </div> - </div> + <div> + <div class="tit"> + <div class="title">事故等级分布</div> </div> + <div class="chart-cont"> + <div class="chart"> + <accident :size="2.5" ref="accRef" @getData="getData"></accident> + </div> + <div class="chart-right"> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;" /> + <div class="charts-des"> + <div id="descCont" class="dark-desc"> + <div class="des-tit"> + <div>事故等级分布一览</div> + <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + </div> + <div class="des-main"> + <div v-for="(item,index) in descContent" :key="index"> + <h4>{{item.accidentGrade}}:{{item.count}}起</h4> + </div> + </div> + </div> + </div> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;"/> + </div> + </div> +</div> </template> <script lang="ts"> import screenfull from 'screenfull'; @@ -75,7 +54,9 @@ export default defineComponent({ name: 'accDesc', - components: {}, + components: { + accident: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/accident.vue')) + }, props:{ content: Object || null }, @@ -86,28 +67,33 @@ descContent: [], lineColor: ['#11FEEE'], }); - const getDataByYearId = async () => { - const data = { - depId: screenTheme.value.depId || 1, - beginYear: state.timeValue[0], - beginMonth: state.timeValue[1], - endYear: state.timeValue[0], - endMonth: state.timeValue[1] - } - if(state.timeValue[1] == '0'){ - data.beginMonth = '1' - data.endMonth = '12' - } - let res = await riskWarningApi().getRiskByTimeDep(data); - if (res.data.code === '200') { + // const getDataByYearId = async () => { + // const data = { + // depId: screenTheme.value.depId || 1, + // beginYear: state.timeValue[0], + // beginMonth: state.timeValue[1], + // endYear: state.timeValue[0], + // endMonth: state.timeValue[1] + // } + // if(state.timeValue[1] == '0'){ + // data.beginMonth = '1' + // data.endMonth = '12' + // } + // let res = await riskWarningApi().getRiskByTimeDep(data); + // if (res.data.code === '200') { + // + // } else { + // ElMessage({ + // type: 'warning', + // message: res.data.msg + // }); + // } + // } - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } + const getData = (data:Array)=>{ + state.descContent = data } + const getTheme =()=>{ if(screenTheme.value.isDark){ window.document.getElementById('descCont').setAttribute( "class", 'dark-desc' ); @@ -118,17 +104,18 @@ } } - watchEffect(() => { - if(props.content && props.content.accData && props.content.accData[0] && props.content.accData[1] && props.content.accData[2] && props.content.accData[3] && props.content.accData[4]){ - state.descContent = props.content.accData - } - }) + // watchEffect(() => { + // if(props.content && props.content.accData && props.content.accData[0] && props.content.accData[1] && props.content.accData[2] && props.content.accData[3] && props.content.accData[4]){ + // state.descContent = props.content.accData + // } + // }) // 页面载入时执行方法 onMounted(() => { getTheme(); }); return { + getData, ...toRefs(state) }; } @@ -136,98 +123,257 @@ </script> <style scoped lang="scss"> - .dark-desc{ +.dark-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: url('../../../../../assets/warningScreen/body-bg.jpg'); + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: rgb(17, 254, 238); + cursor: pointer; + } + .tit{ width: 100%; - height: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t.png") no-repeat center; + background-size: 100% 100%; - .des-tit{ + + .title{ width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #11FEEE; - } - } - .des-main{ - width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; - color: #11FEEE; - - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } - - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; - - span{ - margin-right: 10px; - } - &:first-of-type{ - margin-bottom: 10px; - } - } - - &>p{ - font-size: 1rem; - margin-top: 10px; - } - } + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; + color: #11feee; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; } } - .light-desc{ - width: 100%; - height: 100%; - .des-tit{ - width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #333; + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; + + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; } } - .des-main{ + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r.png") no-repeat center; + background-size: 100% 100%; + + .dark-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #11FEEE; + } + } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #11FEEE; + + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + &:first-of-type{ + margin-bottom: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 10px; + } + } + } + } + } + } + + } +} +.light-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: #F0F0F0; + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: #333; + cursor: pointer; + } + .tit{ + width: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t-light.png") no-repeat center; + background-size: 100% 100%; + + + .title{ width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; color: #333; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; + } + } - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l-light.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; + } + } + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; - span{ - margin-right: 10px; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r-light.png") no-repeat center; + background-size: 100% 100%; + + .light-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #333; + } } - &:first-of-type{ - margin-bottom: 10px; - } - } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #333; - &>p{ - font-size: 1rem; - margin-top: 10px; + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + &:first-of-type{ + margin-bottom: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 10px; + } + } + } } } } + } +} </style> \ No newline at end of file diff --git a/src/views/riskWarningSys/warningBigScreen/indexs/components/dan.vue b/src/views/riskWarningSys/warningBigScreen/indexs/components/dan.vue index 15e93f2..6c9d5f1 100644 --- a/src/views/riskWarningSys/warningBigScreen/indexs/components/dan.vue +++ b/src/views/riskWarningSys/warningBigScreen/indexs/components/dan.vue @@ -1,56 +1,45 @@ <template> - <div id="descCont" class="dark-desc"> - <div class="des-tit"> - <div>隐患等级分布与隐患整改率</div> - <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + <div> + <div class="tit"> + <div class="title">隐患等级</div> + </div> + <div class="chart-cont"> + <div class="chart"> + <danger :size="2.5" @getData="getData"></danger> </div> - <div class="des-main"> - <div> - <h4 v-if="descContent.detail && descContent.detail.heavyRiskCount"> - 重大隐患数量:{{descContent.detail.heavyRiskCount}} - </h4> - <h4 v-else> - 重大隐患数量:0 - </h4> + <div class="chart-right"> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;" /> + <div class="charts-des"> + <div id="descCont" class="dark-desc"> + <div class="des-tit"> + <div>隐患等级分布与整改</div> + <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + </div> + <div class="des-main"> + <div> + <h4> + A级:{{descContent.a}} + </h4> + <h4> + B级:{{descContent.b}} + </h4> + <h4> + C级:{{descContent.c}} + </h4> + <h4> + 已完成整改数:{{descContent.rectifyFinish}} + </h4> + <h4> + 未完成整改数:{{descContent.rectifyNotFinish}} + </h4> + </div> + </div> + </div> </div> - <div> - <h4 v-if="descContent.detail && descContent.detail.heavyRiskCount && descContent.detail.heavyRiskFinishCount"> - 已完成整改:{{descContent.detail.heavyRiskCount == 0 ? 0 + '%' : Math.round(descContent.detail.heavyRiskFinishCount / descContent.detail.heavyRiskCount * 10000) / 100.00 + '%'}} - </h4> - <h4 v-else> - 已完成整改:0% - </h4> - </div> -<!-- <div>--> -<!-- <h4>整改中:8%;</h4>--> -<!-- </div>--> -<!-- <div>--> -<!-- <h4>暂未整改:3%;</h4>--> -<!-- </div>--> - <div> - <h4 v-if="descContent.detail && descContent.detail.lightRiskCount"> - 一般隐患数量:{{descContent.detail.lightRiskCount}} - </h4> - <h4 v-else> - 一般隐患数量:0 - </h4> - </div> - <div> - <h4 v-if="descContent.detail && descContent.detail.lightRiskCount && descContent.detail.lightRiskFinishCount"> - 已完成整改:{{descContent.detail.lightRiskCount == 0 ? 0 + '%' : Math.round(descContent.detail.lightRiskFinishCount / descContent.detail.lightRiskCount * 10000) / 100.00 + '%'}} - </h4> - <h4 v-else> - 已完成整改:0% - </h4> - </div> -<!-- <div>--> -<!-- <h4>整改中:19%;</h4>--> -<!-- </div>--> -<!-- <div>--> -<!-- <h4>暂未整改:6%;</h4>--> -<!-- </div>--> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;"/> </div> </div> + </div> </template> <script lang="ts"> import screenfull from 'screenfull'; @@ -76,7 +65,9 @@ } export default defineComponent({ name: 'danDesc', - components: {}, + components: { + danger: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/danger.vue')), + }, props:{ content: Object || null }, @@ -106,11 +97,15 @@ } }) + const getData = (data:Object)=>{ + state.descContent = data + } // 页面载入时执行方法 onMounted(() => { getTheme(); }); return { + getData, ...toRefs(state) }; } @@ -118,98 +113,253 @@ </script> <style scoped lang="scss"> - .dark-desc{ +.dark-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: url('../../../../../assets/warningScreen/body-bg.jpg'); + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: rgb(17, 254, 238); + cursor: pointer; + } + .tit{ width: 100%; - height: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t.png") no-repeat center; + background-size: 100% 100%; - .des-tit{ + + .title{ width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #11FEEE; - } - } - .des-main{ - width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; - color: #11FEEE; - - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } - - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; - - span{ - margin-right: 10px; - } - &:first-of-type{ - margin-bottom: 10px; - } - } - - &>p{ - font-size: 1rem; - margin-top: 10px; - } - } + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; + color: #11feee; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; } } - .light-desc{ - width: 100%; - height: 100%; - .des-tit{ - width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #333; + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; + + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; } } - .des-main{ + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r.png") no-repeat center; + background-size: 100% 100%; + + .dark-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #11FEEE; + } + } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #11FEEE; + + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + margin-bottom: 10px; + + span{ + margin-right: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 10px; + } + } + } + } + } + } + + } +} +.light-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: #F0F0F0; + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: #333; + cursor: pointer; + } + .tit{ + width: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t-light.png") no-repeat center; + background-size: 100% 100%; + + + .title{ width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; color: #333; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; + } + } - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l-light.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; + } + } + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; - span{ - margin-right: 10px; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r-light.png") no-repeat center; + background-size: 100% 100%; + + .light-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #333; + } } - &:first-of-type{ - margin-bottom: 10px; - } - } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #333; - &>p{ - font-size: 1rem; - margin-top: 10px; + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + margin-bottom: 10px; + + span{ + margin-right: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 10px; + } + } + } } } } + } +} </style> \ No newline at end of file diff --git a/src/views/riskWarningSys/warningBigScreen/indexs/components/edu.vue b/src/views/riskWarningSys/warningBigScreen/indexs/components/edu.vue index 7106a5c..6aaa6cf 100644 --- a/src/views/riskWarningSys/warningBigScreen/indexs/components/edu.vue +++ b/src/views/riskWarningSys/warningBigScreen/indexs/components/edu.vue @@ -1,51 +1,31 @@ <template> - <div id="descCont" class="dark-desc"> - <div class="des-tit"> - <div>教育培训情况汇总</div> - <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + <div> + <div class="tit"> + <div class="title">教育培训分析</div> + </div> + <div class="chart-cont"> + <div class="chart"> + <educate :size="2.5" @getData="getData"></educate> </div> - <div class="des-main"> - <div> - <h4>公司总计:</h4> + <div class="chart-right"> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;" /> + <div class="charts-des"> + <div id="descCont" class="dark-desc"> + <div class="des-tit"> + <div>教育培训情况汇总</div> + <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + </div> + <div class="des-main"> + <div v-for="(item,index) in descContent" :key="index"> + <h4>{{item.name}}:{{item.count}}%</h4> + </div> + </div> + </div> </div> - <div> - <h4>企业总设计培训次数:50次</h4> - </div> - <div> - <h4>企业总设计培训时间:100小时</h4> - </div> - <div> - <h4>企业总完成培训次数:50次</h4> - </div> - <div> - <h4>企业总完成培训时间:100小时</h4> - </div> - <div> - <h4>企业总完成比例:100%</h4> - </div> - <div> - <h4>部门级完成度最低部门前三:</h4> - </div> - <div> - <h4>有机化工事业部</h4> - </div> - <div> - <h4>设计培训次数:--次</h4> - </div> - <div> - <h4>设计培训时间:--小时</h4> - </div> - <div> - <h4>完成培训次数:--次</h4> - </div> - <div> - <h4>完成培训时间:--小时</h4> - </div> - <div> - <h4>完成比例:--%</h4> - </div> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;"/> </div> </div> + </div> </template> <script lang="ts"> import screenfull from 'screenfull'; @@ -71,7 +51,9 @@ } export default defineComponent({ name: 'eduDesc', - components: {}, + components: { + educate: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/educate.vue')), + }, props:{ content: Object || null }, @@ -101,11 +83,16 @@ // } }) + const getData = (data:Array)=>{ + state.descContent = data + } + // 页面载入时执行方法 onMounted(() => { getTheme(); }); return { + getData, ...toRefs(state) }; } @@ -113,98 +100,257 @@ </script> <style scoped lang="scss"> - .dark-desc{ +.dark-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: url('../../../../../assets/warningScreen/body-bg.jpg'); + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: rgb(17, 254, 238); + cursor: pointer; + } + .tit{ width: 100%; - height: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t.png") no-repeat center; + background-size: 100% 100%; - .des-tit{ + + .title{ width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #11FEEE; - } - } - .des-main{ - width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; - color: #11FEEE; - - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } - - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; - - span{ - margin-right: 10px; - } - &:first-of-type{ - margin-bottom: 10px; - } - } - - &>p{ - font-size: 1rem; - margin-top: 10px; - } - } + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; + color: #11feee; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; } } - .light-desc{ - width: 100%; - height: 100%; - .des-tit{ - width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #333; + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; + + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; } } - .des-main{ + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r.png") no-repeat center; + background-size: 100% 100%; + + .dark-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #11FEEE; + } + } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #11FEEE; + + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + &:first-of-type{ + margin-bottom: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 10px; + } + } + } + } + } + } + + } +} +.light-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: #F0F0F0; + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: #333; + cursor: pointer; + } + .tit{ + width: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t-light.png") no-repeat center; + background-size: 100% 100%; + + + .title{ width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; color: #333; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; + } + } - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l-light.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; + } + } + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; - span{ - margin-right: 10px; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r-light.png") no-repeat center; + background-size: 100% 100%; + + .light-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #333; + } } - &:first-of-type{ - margin-bottom: 10px; - } - } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #333; - &>p{ - font-size: 1rem; - margin-top: 10px; + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + &:first-of-type{ + margin-bottom: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 10px; + } + } + } } } } + } +} </style> \ No newline at end of file diff --git a/src/views/riskWarningSys/warningBigScreen/indexs/components/mon.vue b/src/views/riskWarningSys/warningBigScreen/indexs/components/mon.vue index d459b10..a2461b2 100644 --- a/src/views/riskWarningSys/warningBigScreen/indexs/components/mon.vue +++ b/src/views/riskWarningSys/warningBigScreen/indexs/components/mon.vue @@ -1,16 +1,39 @@ <template> - <div id="descCont" class="dark-desc"> - <div class="des-tit"> - <div>监控列表</div> - <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + <div> + <div class="tit"> + <div class="title">特殊作业实时监控</div> + </div> + <div class="chart-cont"> + <div class="chart"> + <monitor :size="2.5" ref="monRef" @getData="getData"></monitor> </div> - <div class="des-main"> - <div> - <h4>请选择所要查看的监控:</h4> - <p>监控系统待接入...</p> + <div class="chart-right"> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;" /> + <div class="charts-des"> + <div id="descCont" class="dark-desc"> + <div class="des-tit"> + <div>监控列表</div> + <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + </div> + <div class="des-main"> + <div> + <h4>请选择所要查看的监控:</h4> + <div class="videoList" v-if="descContent && descContent.length>0"> + <div style="cursor: pointer;padding: 10px" v-for="(item,index) in descContent" :key="index" @click="openVideo(item,index)" :class="index == activeIndex?'active':''"> + {{item.name}} + </div> + </div> + <div v-else> + 监控系统待接入... + </div> + </div> + </div> + </div> </div> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;"/> </div> </div> + </div> </template> <script lang="ts"> import screenfull from 'screenfull'; @@ -32,21 +55,24 @@ // 定义接口来定义对象的类型 interface stateType { descContent: Object; + activeIndex: number lineColor: Array<string>; } export default defineComponent({ name: 'monDesc', - components: {}, + components: { + monitor: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/monitor.vue')), + }, props:{ content: Object || null }, setup(props) { const screenThemes = useScreenTheme() const { screenTheme } = storeToRefs(screenThemes); + const monRef = ref() const state = reactive<stateType>({ - descContent: { - - }, + descContent: {}, + activeIndex: 0, lineColor: ['#11FEEE'], }); @@ -65,12 +91,23 @@ // state.descContent = props.content // } }) + const openVideo=(item,index)=>{ + state.activeIndex = index + monRef.value.changeVideo(item.deviceNo) + } + const getData = (data:Array)=>{ + state.descContent = data + } // 页面载入时执行方法 onMounted(() => { getTheme(); + }); return { + monRef, + getData, + openVideo, ...toRefs(state) }; } @@ -78,98 +115,259 @@ </script> <style scoped lang="scss"> - .dark-desc{ +.dark-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: url('../../../../../assets/warningScreen/body-bg.jpg'); + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: rgb(17, 254, 238); + cursor: pointer; + } + .tit{ width: 100%; - height: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t.png") no-repeat center; + background-size: 100% 100%; - .des-tit{ + + .title{ width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #11FEEE; - } - } - .des-main{ - width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; - color: #11FEEE; - - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } - - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; - - span{ - margin-right: 10px; - } - &:first-of-type{ - margin-bottom: 10px; - } - } - - &>p{ - font-size: 1rem; - margin-top: 10px; - } - } + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; + color: #11feee; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; } } - .light-desc{ - width: 100%; - height: 100%; - .des-tit{ - width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #333; + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; + + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; } } - .des-main{ + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r.png") no-repeat center; + background-size: 100% 100%; + + .dark-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #11FEEE; + } + } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #11FEEE; + + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + &:first-of-type{ + margin-bottom: 10px; + } + } + &>p{ + font-size: 1rem; + margin-top: 10px; + } + .active{ + background: rgba(255,255,255,.2); + } + } + } + } + } + } + + } +} +.light-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: #F0F0F0; + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: #333; + cursor: pointer; + } + .tit{ + width: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t-light.png") no-repeat center; + background-size: 100% 100%; + + + .title{ width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; color: #333; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; + } + } - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l-light.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; + } + } + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; - span{ - margin-right: 10px; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r-light.png") no-repeat center; + background-size: 100% 100%; + + .light-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #333; + } } - &:first-of-type{ - margin-bottom: 10px; - } - } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #333; - &>p{ - font-size: 1rem; - margin-top: 10px; + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + &:first-of-type{ + margin-bottom: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 10px; + } + } + } } } } + } +} </style> \ No newline at end of file diff --git a/src/views/riskWarningSys/warningBigScreen/indexs/components/msg.vue b/src/views/riskWarningSys/warningBigScreen/indexs/components/msg.vue index b955f19..9321430 100644 --- a/src/views/riskWarningSys/warningBigScreen/indexs/components/msg.vue +++ b/src/views/riskWarningSys/warningBigScreen/indexs/components/msg.vue @@ -1,24 +1,41 @@ <template> - <div id="descCont" class="dark-desc"> - <div class="des-tit"> - <div>预警消息SPI报告-2022年8月</div> - <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + <div> + <div class="tit"> + <div class="title">预警消息报告</div> + </div> + <div class="chart-cont"> + <div class="chart"> + <message :size="2" @getData=showDetails></message> </div> - <div class="des-main"> - <div> - <h4>2022年8月整体SPI指数317.65,处于安全范围以内。</h4> - <p>8月份spi中教育培训比例不足和一般风险新增较多,对SPI总值影响较大,请注意调整相关因素环节的处理措施。</p> + <div class="chart-right"> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;" /> + <div class="charts-des"> + <div id="descCont" class="dark-desc"> + <div class="des-tit"> + <div>{{descContent.spiName}}</div> + <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + </div> + <div class="des-main"> + <div> + <div style="margin-bottom: 10px">生成时间:{{creatTime}}1日 00:00:03</div> + <h4>{{descContent.reportTime}}新疆国泰新华化工有限公司安全风险指数基础数据情况如下</h4> + <p>1、本月共计上报事故{{descContent.accidentTotal}}起,其中一级事故{{descContent.accidentOne}}起,二级事故{{descContent.accidentTwo}}起,三级事故{{descContent.accidentThree}}起,四级事故{{descContent.accidentFour}}起。</p> + <p>2、智能巡检本月总任务数{{descContent.checkTotal}}个,其中{{descContent.checkOverdue }}个超期未巡检,超期未巡检率{{descContent.checkOverRate}}%,上报异常{{descContent.checkException}}个。</p> + <p>3、本月隐患上报数量{{descContent.hdTotal}}个,其中A级隐患{{descContent.hdA}}个,B级隐患{{descContent.hdB}}个,C级隐患{{descContent.hdC}}个,已经完成整改验收{{descContent.hdRf}}个,暂未完成整改{{descContent.hdRnf}}个。</p> + <p>4、截至{{descContent.lastTime}}系统人员用户共计{{descContent.userCount}}个,其中证书绑定(持证人员){{descContent.userCertCount}}个,系统人员总体持证比{{(descContent.userCertCount / descContent.userCount * 100).toFixed(2)}}%。</p> + <p>5、最近一次教育培训上报情况为:课程数量{{descContent.courseNum}},课件数量{{descContent.coursewareNum}},试题数量{{descContent.questionsNum}}。考试参与率{{descContent.examJoinRate}}%,考试合格率{{descContent.examPassRate}}%,缺考总数{{descContent.missExam}},待补课数{{descContent.repairNum}},人均学时{{descContent.studyAverage}},学时达标率{{descContent.studyQualifyRate}}%,培训人数{{descContent.trainPerson}},培训参与率{{descContent.trainJoinRate}}%。</p> + <p>6、截至{{descContent.lastTime}}应急物资储备情况为:</p> + <div style="margin-top: 10px;margin-left: 20px" v-for="(item,index) in descContent.emergencySuppliesList"> + ({{index+1}}) 编号:{{item.number}},物资名称:{{item.name}},负责部分:{{item.departmentName?item.departmentName: '暂无'}},物资分类:{{item.classificationName}},存放位置:{{item.place}},存放数量:{{item.count}} + </div> + </div> + </div> </div> - <div> - <h4>次月预警消息</h4> - <p>未来一个月该地区气候干燥,降水量少,高温天气仍将持续,应注意防范消防风险,注意重点消防区域的消防设置设备的可用性检查</p> </div> - <div> - <h4>本月SPI基础数据构成:</h4> - <p>...</p> - </div> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;"/> </div> </div> + </div> </template> <script lang="ts"> import screenfull from 'screenfull'; @@ -36,15 +53,21 @@ import '/@/theme/bigScreen.css' import {useScreenTheme} from "/@/stores/screenTheme" import {storeToRefs} from "pinia"; + import {riskWarningApi} from "/@/api/riskWarning"; + import {ElMessage} from "element-plus/es"; // 定义接口来定义对象的类型 interface stateType { - descContent: Object; - lineColor: Array<string>; + descContent: Object + lineColor: Array<string> + reportData: [] + creatTime: string | null } export default defineComponent({ name: 'msgDesc', - components: {}, + components: { + message: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/message.vue')), + }, props:{ content: Object || null }, @@ -52,11 +75,11 @@ const screenThemes = useScreenTheme() const { screenTheme } = storeToRefs(screenThemes); const state = reactive<stateType>({ - descContent: { - - }, + descContent: {}, lineColor: ['#11FEEE'], - }); + reportData: [], + creatTime: '' + }) const getTheme =()=>{ if(screenTheme.value.isDark){ @@ -73,12 +96,58 @@ // state.descContent = props.content // } }) + // const getData = (index)=>{ + // state.descContent = data + // } + + const showDetails = (index)=>{ + riskWarningApi().getAllReport().then((res)=>{ + if (res.data.code === '200') { + state.reportData = res.data.data + riskWarningApi().getReportDetails(state.reportData[index].id).then((re)=>{ + if (re.data.code === '200') { + state.descContent = re.data.data + state.creatTime = getNextMonth(state.descContent.reportTime) + }else{ + ElMessage({ + type: 'warning', + message: re.data.msg + }) + } + }) + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + }) + } + + const getNextMonth=(dateString:string)=>{ + // 提取年份和月份 + const year = parseInt(dateString.slice(0, 4)); + const month = parseInt(dateString.slice(5, 7)); + // 计算下一个月的年份和月份 + let nextYear = year; + let nextMonth = month + 1; + if (nextMonth === 13) { + nextYear++; + nextMonth = 1; // 如果下一个月是13月,则重置为1月 + } + // 格式化下一个月的日期字符串 + const formattedNextMonth = `${nextYear}年${nextMonth.toString().padStart(2, '0')}月`; + return formattedNextMonth; + } // 页面载入时执行方法 onMounted(() => { getTheme(); }); return { + // getData, + getNextMonth, + showDetails, ...toRefs(state) }; } @@ -86,98 +155,257 @@ </script> <style scoped lang="scss"> - .dark-desc{ +.dark-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: url('../../../../../assets/warningScreen/body-bg.jpg'); + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: rgb(17, 254, 238); + cursor: pointer; + } + .tit{ width: 100%; - height: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t.png") no-repeat center; + background-size: 100% 100%; - .des-tit{ + + .title{ width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #11FEEE; - } - } - .des-main{ - width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; - color: #11FEEE; - - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } - - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; - - span{ - margin-right: 10px; - } - &:first-of-type{ - margin-bottom: 10px; - } - } - - &>p{ - font-size: 1rem; - margin-top: 10px; - } - } + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; + color: #11feee; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; } } - .light-desc{ - width: 100%; - height: 100%; - .des-tit{ - width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #333; + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; + + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; } } - .des-main{ + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r.png") no-repeat center; + background-size: 100% 100%; + + .dark-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #11FEEE; + } + } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #11FEEE; + + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + &:first-of-type{ + margin-bottom: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 20px; + } + } + } + } + } + } + + } +} +.light-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: #F0F0F0; + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: #333; + cursor: pointer; + } + .tit{ + width: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t-light.png") no-repeat center; + background-size: 100% 100%; + + + .title{ width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; color: #333; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; + } + } - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l-light.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; + } + } + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; - span{ - margin-right: 10px; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r-light.png") no-repeat center; + background-size: 100% 100%; + + .light-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #333; + } } - &:first-of-type{ - margin-bottom: 10px; - } - } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #333; - &>p{ - font-size: 1rem; - margin-top: 10px; + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + &:first-of-type{ + margin-bottom: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 20px; + } + } + } } } } + } +} </style> \ No newline at end of file diff --git a/src/views/riskWarningSys/warningBigScreen/indexs/components/pro.vue b/src/views/riskWarningSys/warningBigScreen/indexs/components/pro.vue index e78d145..7405c69 100644 --- a/src/views/riskWarningSys/warningBigScreen/indexs/components/pro.vue +++ b/src/views/riskWarningSys/warningBigScreen/indexs/components/pro.vue @@ -1,24 +1,31 @@ <template> - <div id="descCont" class="dark-desc"> - <div class="des-tit"> - <div>人员持证上岗情况</div> - <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + <div> + <div class="tit"> + <div class="title">人员专业度分布</div> + </div> + <div class="chart-cont"> + <div class="chart"> + <profession :size="2.5" @getData="getData"></profession> </div> - <div class="des-main"> - <div> - <h4>该岗位工种持证人员:1048人</h4> + <div class="chart-right"> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;" /> + <div class="charts-des"> + <div id="descCont" class="dark-desc"> + <div class="des-tit"> + <div>人员专业度情况</div> + <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + </div> + <div class="des-main"> + <div v-for="(item,index) in descContent" :key="index"> + <h4>{{ item.name }}:{{item.count}} 人</h4> + </div> + </div> + </div> </div> - <div> - <h4>该岗位工种未持证人员:735人</h4> - </div> - <div> - <h4>关键岗位必要持证无证上岗:1人</h4> - </div> - <div> - <p>提醒:本年度存在有1人在管家必要持证岗位未持证上岗情况,该情况已经上报监管系统,请注意控制该风险因素。</p> - </div> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;"/> </div> </div> + </div> </template> <script lang="ts"> import screenfull from 'screenfull'; @@ -44,7 +51,9 @@ } export default defineComponent({ name: 'proDesc', - components: {}, + components: { + profession: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/profession.vue')), + }, props:{ content: Object || null }, @@ -73,12 +82,15 @@ // state.descContent = props.content // } }) - + const getData = (data:Array)=>{ + state.descContent = data + } // 页面载入时执行方法 onMounted(() => { getTheme(); }); return { + getData, ...toRefs(state) }; } @@ -86,98 +98,257 @@ </script> <style scoped lang="scss"> - .dark-desc{ +.dark-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: url('../../../../../assets/warningScreen/body-bg.jpg'); + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: rgb(17, 254, 238); + cursor: pointer; + } + .tit{ width: 100%; - height: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t.png") no-repeat center; + background-size: 100% 100%; - .des-tit{ + + .title{ width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #11FEEE; - } - } - .des-main{ - width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; - color: #11FEEE; - - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } - - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; - - span{ - margin-right: 10px; - } - &:first-of-type{ - margin-bottom: 10px; - } - } - - &>p{ - font-size: 1rem; - margin-top: 10px; - } - } + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; + color: #11feee; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; } } - .light-desc{ - width: 100%; - height: 100%; - .des-tit{ - width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #333; + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; + + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; } } - .des-main{ + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r.png") no-repeat center; + background-size: 100% 100%; + + .dark-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #11FEEE; + } + } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #11FEEE; + + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + &:first-of-type{ + margin-bottom: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 10px; + } + } + } + } + } + } + + } +} +.light-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: #F0F0F0; + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: #333; + cursor: pointer; + } + .tit{ + width: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t-light.png") no-repeat center; + background-size: 100% 100%; + + + .title{ width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; color: #333; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; + } + } - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l-light.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; + } + } + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; - span{ - margin-right: 10px; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r-light.png") no-repeat center; + background-size: 100% 100%; + + .light-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #333; + } } - &:first-of-type{ - margin-bottom: 10px; - } - } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #333; - &>p{ - font-size: 1rem; - margin-top: 10px; + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + &:first-of-type{ + margin-bottom: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 10px; + } + } + } } } } + } +} </style> \ No newline at end of file diff --git a/src/views/riskWarningSys/warningBigScreen/indexs/components/risk.vue b/src/views/riskWarningSys/warningBigScreen/indexs/components/risk.vue index 3faf4a3..8202fcc 100644 --- a/src/views/riskWarningSys/warningBigScreen/indexs/components/risk.vue +++ b/src/views/riskWarningSys/warningBigScreen/indexs/components/risk.vue @@ -1,41 +1,48 @@ <template> - <div id="descCont" class="dark-desc"> - <div class="des-tit"> - <div>隐患影响等级分布详情</div> - <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + <div> + <div class="tit"> + <div class="title">隐患趋势</div> + </div> + <div class="chart-cont"> + <div class="chart"> + <risk :size="2.5" @getData="getData"></risk> </div> - <div class="des-main"> - <div v-for="(item,index) in descContent.riskData" :key="index"> - <div> - <h4>{{item.depId}}共上报隐患总数:{{item.detail.riskTotalCount }} 个</h4> + <div class="chart-right"> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;" /> + <div class="charts-des"> + <div id="descCont" class="dark-desc"> + <div class="des-tit"> + <div>隐患趋势详情</div> + <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> </div> - <div> - <h4>其中:</h4> - </div> - <div> - <h4>一般隐患数量:{{ item.detail.lightRiskCount }} 个</h4> - </div> - <div> - <h4>重大隐患数量:{{ item.detail.heavyRiskCount }} 个</h4> - </div> - <div> - <h4>可能造成死亡的:{{ item.detail.deathCount }} 个</h4> - </div> - <div> - <h4>可能造成重伤的:{{ item.detail.heavyInjureCount}} 个</h4> - </div> - <div> - <h4>可能造成轻伤的:{{ item.detail.lightInjureCount }} 个</h4> - </div> - <div> - <h4>一般隐患整改数量:{{ item.detail.lightRiskFinishCount }} 个</h4> - </div> - <div> - <h4>重大隐患整改数量:{{ item.detail.heavyRiskFinishCount }} 个</h4> + <div class="des-main"> + <div v-for="(item,index) in descContent" :key="index"> + <div> + <h2>{{item.time}} 共上报隐患总数:{{item.count }}</h2> + </div> + <div> + <h3>其中:</h3> + </div> + <div> + <h4>一般隐患:{{ item.generalDanger }}</h4> + </div> + <div> + <h4>重大隐患:{{ item.majorDanger }}</h4> + </div> + <div> + <h4>已完成整改:{{ item.rectifyFinish }}</h4> + </div> + <div> + <h4>未完成整改:{{ item.rectifyNotFinish }}</h4> + </div> + </div> </div> </div> + </div> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;"/> </div> </div> + </div> </template> <script lang="ts"> import screenfull from 'screenfull'; @@ -61,7 +68,9 @@ } export default defineComponent({ name: 'riskDesc', - components: {}, + components: { + risk: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/risk.vue')), + }, props:{ content: Object || null }, @@ -89,14 +98,16 @@ if(props.content){ state.descContent = props.content } - console.log(state.descContent,'risk') }) - + const getData = (data:Array)=>{ + state.descContent = data + } // 页面载入时执行方法 onMounted(() => { getTheme(); }); return { + getData, ...toRefs(state) }; } @@ -104,98 +115,253 @@ </script> <style scoped lang="scss"> - .dark-desc{ +.dark-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: url('../../../../../assets/warningScreen/body-bg.jpg'); + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: rgb(17, 254, 238); + cursor: pointer; + } + .tit{ width: 100%; - height: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t.png") no-repeat center; + background-size: 100% 100%; - .des-tit{ + + .title{ width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #11FEEE; - } - } - .des-main{ - width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; - color: #11FEEE; - - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } - - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; - - span{ - margin-right: 10px; - } - &:first-of-type{ - margin-bottom: 10px; - } - } - - &>p{ - font-size: 1rem; - margin-top: 10px; - } - } + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; + color: #11feee; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; } } - .light-desc{ - width: 100%; - height: 100%; - .des-tit{ - width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #333; + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; + + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; } } - .des-main{ + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r.png") no-repeat center; + background-size: 100% 100%; + + .dark-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #11FEEE; + } + } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #11FEEE; + + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>div{ + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 10px; + } + } + } + } + } + } + + } +} +.light-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: #F0F0F0; + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: #333; + cursor: pointer; + } + .tit{ + width: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t-light.png") no-repeat center; + background-size: 100% 100%; + + + .title{ width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; color: #333; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; + } + } - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l-light.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; + } + } + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; - span{ - margin-right: 10px; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r-light.png") no-repeat center; + background-size: 100% 100%; + + .light-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #333; + } } - &:first-of-type{ - margin-bottom: 10px; - } - } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #333; - &>p{ - font-size: 1rem; - margin-top: 10px; + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + &:first-of-type{ + margin-bottom: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 10px; + } + } + } } } } + } +} </style> \ No newline at end of file diff --git a/src/views/riskWarningSys/warningBigScreen/indexs/components/spi.vue b/src/views/riskWarningSys/warningBigScreen/indexs/components/spi.vue index fd1c076..e6db35d 100644 --- a/src/views/riskWarningSys/warningBigScreen/indexs/components/spi.vue +++ b/src/views/riskWarningSys/warningBigScreen/indexs/components/spi.vue @@ -1,15 +1,31 @@ <template> - <div id="descCont" class="dark-desc"> - <div class="des-tit"> - <div>{{descContent.year}}年度事企业SPI趋势</div> - <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + <div> + <div class="tit"> + <div class="title">SPI数据分析</div> + </div> + <div class="chart-cont"> + <div class="chart"> + <spi :size="2" @getData="getData"></spi> </div> - <div class="des-main"> - <div v-for="(item,index) in descContent.spiData" :key="index"> - <h4>{{item.month}}月份,安全生产预警指数值:{{item.spiVal}}<span v-if="index < descContent.spiData.length">;</span></h4> + <div class="chart-right"> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;" /> + <div class="charts-des"> + <div id="descCont" class="dark-desc"> + <div class="des-tit"> + <div>近12月SPI趋势</div> + <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + </div> + <div class="des-main"> + <div v-for="(item,index) in descContent" :key="index"> + <h4>{{item.time}},SPI数值:{{item.value}}</h4> + </div> + </div> + </div> </div> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;"/> </div> </div> + </div> </template> <script lang="ts"> import screenfull from 'screenfull'; @@ -35,7 +51,9 @@ } export default defineComponent({ name: 'spiDesc', - components: {}, + components: { + spi: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/SPI.vue')) + }, props:{ content: Object || null }, @@ -63,11 +81,17 @@ } }) + const getData = (data:Array)=>{ + state.descContent = data + console.log(state.descContent,'d') + } + // 页面载入时执行方法 onMounted(() => { getTheme(); }); return { + getData, ...toRefs(state) }; } @@ -75,98 +99,257 @@ </script> <style scoped lang="scss"> - .dark-desc{ +.dark-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: url('../../../../../assets/warningScreen/body-bg.jpg'); + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: rgb(17, 254, 238); + cursor: pointer; + } + .tit{ width: 100%; - height: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t.png") no-repeat center; + background-size: 100% 100%; - .des-tit{ + + .title{ width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #11FEEE; - } - } - .des-main{ - width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; - color: #11FEEE; - - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } - - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; - - span{ - margin-right: 10px; - } - &:first-of-type{ - margin-bottom: 10px; - } - } - - &>p{ - font-size: 1rem; - margin-top: 10px; - } - } + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; + color: #11feee; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; } } - .light-desc{ - width: 100%; - height: 100%; - .des-tit{ - width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #333; + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; + + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; } } - .des-main{ + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r.png") no-repeat center; + background-size: 100% 100%; + + .dark-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #11FEEE; + } + } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #11FEEE; + + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + &:first-of-type{ + margin-bottom: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 10px; + } + } + } + } + } + } + + } +} +.light-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: #F0F0F0; + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: #333; + cursor: pointer; + } + .tit{ + width: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t-light.png") no-repeat center; + background-size: 100% 100%; + + + .title{ width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; color: #333; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; + } + } - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l-light.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; + } + } + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; - span{ - margin-right: 10px; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r-light.png") no-repeat center; + background-size: 100% 100%; + + .light-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #333; + } } - &:first-of-type{ - margin-bottom: 10px; - } - } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #333; - &>p{ - font-size: 1rem; - margin-top: 10px; + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + &:first-of-type{ + margin-bottom: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 10px; + } + } + } } } } + } +} </style> \ No newline at end of file diff --git a/src/views/riskWarningSys/warningBigScreen/indexs/components/sto.vue b/src/views/riskWarningSys/warningBigScreen/indexs/components/sto.vue index 4d77655..6140c06 100644 --- a/src/views/riskWarningSys/warningBigScreen/indexs/components/sto.vue +++ b/src/views/riskWarningSys/warningBigScreen/indexs/components/sto.vue @@ -1,52 +1,31 @@ <template> - <div id="descCont" class="dark-desc"> - <div class="des-tit"> - <div>当前应急物资储备情况(总)</div> - <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + <div> + <div class="tit"> + <div class="title">应急演练次数</div> + </div> + <div class="chart-cont"> + <div class="chart"> + <stock :size="2" @getData="getData"></stock> </div> - <div class="des-main"> - <div> - <h4>消防耗材:</h4> + <div class="chart-right"> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;" /> + <div class="charts-des"> + <div id="descCont" class="dark-desc"> + <div class="des-tit"> + <div>应急物资储备情况(总)</div> + <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + </div> + <div class="des-main"> + <div v-for="(item,index) in descContent" :key="index"> + <h4>{{item.name}}:{{item.count}}</h4> + </div> + </div> + </div> </div> - <div> - <h4>入库总数:2310</h4> - </div> - <div> - <h4>剩余总数:2103</h4> - </div> - <div></div> - <div> - <h4>安全帽:</h4> - </div> - <div> - <h4>入库总数:34312</h4> - </div> - <div> - <h4>剩余总数:23509</h4> - </div> - <div></div> - <div> - <h4>防护服:</h4> - </div> - <div> - <h4>入库总数:22140</h4> - </div> - <div> - <h4>剩余总数:12830</h4> - </div> - <div></div> - <div> - <h4>防护服:</h4> - </div> - <div> - <h4>入库总数:22140</h4> - </div> - <div> - <h4>剩余总数:12830</h4> - </div> - <div></div> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;"/> </div> </div> + </div> </template> <script lang="ts"> import screenfull from 'screenfull'; @@ -72,7 +51,9 @@ } export default defineComponent({ name: 'stoDesc', - components: {}, + components: { + stock: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/stock.vue')), + }, props:{ content: Object || null }, @@ -101,12 +82,15 @@ // state.descContent = props.content // } }) - + const getData = (data:Array)=>{ + state.descContent = data + } // 页面载入时执行方法 onMounted(() => { getTheme(); }); return { + getData, ...toRefs(state) }; } @@ -114,98 +98,257 @@ </script> <style scoped lang="scss"> - .dark-desc{ +.dark-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: url('../../../../../assets/warningScreen/body-bg.jpg'); + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: rgb(17, 254, 238); + cursor: pointer; + } + .tit{ width: 100%; - height: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t.png") no-repeat center; + background-size: 100% 100%; - .des-tit{ + + .title{ width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #11FEEE; - } - } - .des-main{ - width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; - color: #11FEEE; - - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } - - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; - - span{ - margin-right: 10px; - } - &:first-of-type{ - margin-bottom: 10px; - } - } - - &>p{ - font-size: 1rem; - margin-top: 10px; - } - } + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; + color: #11feee; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; } } - .light-desc{ - width: 100%; - height: 100%; - .des-tit{ - width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #333; + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; + + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; } } - .des-main{ + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r.png") no-repeat center; + background-size: 100% 100%; + + .dark-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #11FEEE; + } + } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #11FEEE; + + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + &:first-of-type{ + margin-bottom: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 10px; + } + } + } + } + } + } + + } +} +.light-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: #F0F0F0; + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: #333; + cursor: pointer; + } + .tit{ + width: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t-light.png") no-repeat center; + background-size: 100% 100%; + + + .title{ width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; color: #333; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; + } + } - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l-light.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; + } + } + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; - span{ - margin-right: 10px; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r-light.png") no-repeat center; + background-size: 100% 100%; + + .light-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #333; + } } - &:first-of-type{ - margin-bottom: 10px; - } - } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #333; - &>p{ - font-size: 1rem; - margin-top: 10px; + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + &:first-of-type{ + margin-bottom: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 10px; + } + } + } } } } + } +} </style> \ No newline at end of file diff --git a/src/views/riskWarningSys/warningBigScreen/indexs/components/train.vue b/src/views/riskWarningSys/warningBigScreen/indexs/components/train.vue index 58fa252..798ab6a 100644 --- a/src/views/riskWarningSys/warningBigScreen/indexs/components/train.vue +++ b/src/views/riskWarningSys/warningBigScreen/indexs/components/train.vue @@ -1,18 +1,31 @@ <template> - <div id="descCont" class="dark-desc"> - <div class="des-tit"> - <div>应急演练概况</div> - <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + <div> + <div class="tit"> + <div class="title">智能巡检超期未巡检任务</div> + </div> + <div class="chart-cont"> + <div class="chart"> + <training :size="2.5" @getData="getData"></training> </div> - <div class="des-main"> - <div> - <h4>应急演练分月情况汇总:</h4> + <div class="chart-right"> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;" /> + <div class="charts-des"> + <div id="descCont" class="dark-desc"> + <div class="des-tit"> + <div>超期未巡检概况</div> + <dv-decoration8 :color="lineColor" :reverse="true" style="width:100%;" /> + </div> + <div class="des-main"> + <div v-for="(item,index) in descContent" :key="index"> + <h4>{{item.year}}年{{item.month}}月份超期未巡检次数:{{item.count}}次;</h4> + </div> + </div> + </div> </div> - <div v-for="(item,index) in descContent.traData" :key="index"> - <h4>{{item.month}}月份应急演练次数:{{item.totalCount}}次;</h4> - </div> + <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;"/> </div> </div> + </div> </template> <script lang="ts"> import screenfull from 'screenfull'; @@ -38,7 +51,9 @@ } export default defineComponent({ name: 'trainDesc', - components: {}, + components: { + training: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/training.vue')), + }, props:{ content: Object || null }, @@ -68,11 +83,16 @@ } }) + const getData = (data:Array)=>{ + state.descContent = data + } + // 页面载入时执行方法 onMounted(() => { getTheme(); }); return { + getData, ...toRefs(state) }; } @@ -80,98 +100,256 @@ </script> <style scoped lang="scss"> - .dark-desc{ +.dark-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: url('../../../../../assets/warningScreen/body-bg.jpg'); + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: rgb(17, 254, 238); + cursor: pointer; + } + .tit{ width: 100%; - height: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t.png") no-repeat center; + background-size: 100% 100%; - .des-tit{ + + .title{ width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #11FEEE; - } - } - .des-main{ - width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; - color: #11FEEE; - - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } - - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; - - span{ - margin-right: 10px; - } - &:first-of-type{ - margin-bottom: 10px; - } - } - - &>p{ - font-size: 1rem; - margin-top: 10px; - } - } + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; + color: #11feee; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; } } - .light-desc{ - width: 100%; - height: 100%; - .des-tit{ - width: 100%; - &>div{ - font-size: 1.5rem; - height: 2.2rem; - line-height: 2.2rem; - text-align: center; - font-weight: bolder; - color: #333; + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; + + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; } } - .des-main{ + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r.png") no-repeat center; + background-size: 100% 100%; + + .dark-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #11FEEE; + } + } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #11FEEE; + + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + &:first-of-type{ + margin-bottom: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 10px; + } + } + } + } + } + } + + } +} +.light-page{ + width: 100%; + height: 100%; + border:1px #5a5959 solid; + background: #F0F0F0; + padding: 4%; + .btns{ + position: fixed; + width: 8%; + height: 6%; + right: 5%; + top: 1.25rem; + font-size: 1.125rem; + color: #333; + cursor: pointer; + } + .tit{ + width: 100%; + height: 122px; + background: url("../../../../../assets/warningScreen/pagebg-t-light.png") no-repeat center; + background-size: 100% 100%; + + + .title{ width: 100%; - height: calc(96% - 2.2rem); - padding: 1rem; - overflow: auto; + height: 122px; + line-height: 112px; + border-radius: 8px; + margin-bottom: 20px; + font-size: 2.8rem; color: #333; + font-weight: bolder; + text-align: center; + letter-spacing: 5px; + } + } - &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } - &::scrollbar { width: 0; height: 0; color: transparent; } + .chart-cont{ + width: 100%; + padding: 20px; + height: calc(92vh - 122px); + display: flex; + align-items: flex-start; + justify-content: space-between; - &>div{ - margin-bottom: 1rem; - &>h4{ - font-size: 1.25rem; - display: flex; - align-items: center; + .chart{ + width: calc((100% - 20px) * 0.63); + height: 100%; + padding: 3%; + background: url("../../../../../assets/warningScreen/pagebg-l-light.png") no-repeat center; + background-size: 100% 100%; + position: relative; + .selector-2{ + position: absolute; + top: 5%; + right: 10%; + width: 20%; + font-size: 1.25rem; + color: #fff; + } + .main-chart{ + width: 100%; + height: 100%; + } + } + .chart-right{ + width: calc((100% - 20px) * 0.37); + height: 100%; - span{ - margin-right: 10px; + .charts-des{ + height: 90%; + padding: 4%; + background: url("../../../../../assets/warningScreen/pagebg-r-light.png") no-repeat center; + background-size: 100% 100%; + + .light-desc{ + width: 100%; + height: 100%; + + .des-tit{ + width: 100%; + &>div{ + font-size: 1.5rem; + height: 2.2rem; + line-height: 2.2rem; + text-align: center; + font-weight: bolder; + color: #333; + } } - &:first-of-type{ - margin-bottom: 10px; - } - } + .des-main{ + width: 100%; + height: calc(96% - 2.2rem); + padding: 1rem; + overflow: auto; + color: #333; - &>p{ - font-size: 1rem; - margin-top: 10px; + &::-webkit-scrollbar { width: 0; height: 0; color: transparent; } + &::scrollbar { width: 0; height: 0; color: transparent; } + + &>div{ + margin-bottom: 1rem; + &>h4{ + font-size: 1.25rem; + display: flex; + align-items: center; + + span{ + margin-right: 10px; + } + &:first-of-type{ + margin-bottom: 10px; + } + } + + &>p{ + font-size: 1rem; + margin-top: 10px; + } + } + } } } } } +} </style> \ No newline at end of file diff --git a/src/views/riskWarningSys/warningBigScreen/indexs/index.vue b/src/views/riskWarningSys/warningBigScreen/indexs/index.vue index 81cd90a..771ed21 100644 --- a/src/views/riskWarningSys/warningBigScreen/indexs/index.vue +++ b/src/views/riskWarningSys/warningBigScreen/indexs/index.vue @@ -7,40 +7,16 @@ </div> </dv-decoration-11> </div> - - <div class="tit"> - <div class="title">{{curChart===1?'事故等级分布':curChart===2?'应急演练次数':curChart===3?'隐患等级数量分布':curChart===4?'SPI数据分析':curChart===5?'教育培训分析':curChart===6?'隐患等级':curChart===7?'人员专业度分布':curChart===8?'预警消息报告':curChart===9?'特殊作业实时监控':'风险应急物资储备'}}</div> - </div> - <div class="chart-cont"> - <div class="chart"> - <accident v-if="curChart===1" :size="2.5" ref="accRef"></accident> - <training v-else-if="curChart===2" :size="2.5" ref="trainRef"></training> - <risk v-else-if="curChart===3" :size="2.5" ref="riskRef"></risk> - <spi v-else-if="curChart===4" :size="2" ref="spiRef"></spi> - <educate v-else-if="curChart===5" :size="2.5"></educate> - <danger v-else-if="curChart===6" :size="2.5" ref="danRef"></danger> - <profession v-else-if="curChart===7" :size="2.5"></profession> - <message v-else-if="curChart===8" :size="2"></message> - <monitor v-else-if="curChart===9" :size="2.5"></monitor> - <stock v-else class="main-chart" :size="2"></stock> - </div> - <div class="chart-right"> - <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;" /> - <div class="charts-des"> - <acc-desc v-if="curChart===1" :content="accRef"></acc-desc> - <train-desc v-else-if="curChart===2" :content="trainRef"></train-desc> - <risk-desc v-else-if="curChart===3" :content="riskRef"></risk-desc> - <spi-desc v-else-if="curChart===4" :content="spiRef"></spi-desc> - <edu-desc v-else-if="curChart===5" :content="eduRef"></edu-desc> - <dan-desc v-else-if="curChart===6" :content="danRef"></dan-desc> - <pro-desc v-else-if="curChart===7" :content="proRef"></pro-desc> - <msg-desc v-else-if="curChart===8" :content="msgRef"></msg-desc> - <mon-desc v-else-if="curChart===9" :content="monRef"></mon-desc> - <sto-desc v-else :content="stoRef"></sto-desc> - </div> - <dv-decoration-10 :color="lineColor" style="width:100%;height:5%;"/> - </div> - </div> + <acc-desc v-show="curChart===1"></acc-desc> + <train-desc v-show="curChart===2"></train-desc> + <risk-desc v-show="curChart===3"></risk-desc> + <spi-desc v-show="curChart===4"></spi-desc> + <edu-desc v-show="curChart===5"></edu-desc> + <dan-desc v-show="curChart===6"></dan-desc> + <pro-desc v-show="curChart===7"></pro-desc> + <msg-desc v-show="curChart===8" ref="msgRef"/> + <mon-desc v-show="curChart===9"></mon-desc> + <sto-desc v-show="curChart===10"></sto-desc> </div> </template> @@ -60,77 +36,59 @@ import { ElTable } from 'element-plus'; import { FormInstance, FormRules, ElMessage } from 'element-plus'; import { safetyRiskEventApi } from '/@/api/doublePreventSystem/safetyRiskEvent/index.ts'; - import { useRoute } from 'vue-router'; + import {useRoute, useRouter} from 'vue-router'; import {hiddenReportApi} from "/@/api/doublePreventSystem/report"; import { productionDeviceApi } from '/@/api/doublePreventSystem/productionDevice/index.ts'; import '/@/theme/bigScreen.css' import {useScreenTheme} from "/@/stores/screenTheme" import {storeToRefs} from "pinia"; + import msgDesc from '/@/views/riskWarningSys/warningBigScreen/indexs/components/msg.vue' // 定义接口来定义对象的类型 interface stateType { isScreenfull: boolean; curChart: number | null; - lineColor: Array<string>; - accRef: Object; - trainRef: Object; - riskRef: Object; - spiRef: Object; - eduRef: Object; - danRef: Object; - proRef: Object; - msgRef: Object; - monRef: Object; - stoRef: Object + lineColor: Array<string> } export default defineComponent({ name: 'warningPage', components: { - accident: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/accident.vue')), accDesc: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/indexs/components/acc.vue')), - training: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/training.vue')), trainDesc: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/indexs/components/train.vue')), - spi: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/SPI.vue')), spiDesc: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/indexs/components/spi.vue')), - risk: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/risk.vue')), riskDesc: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/indexs/components/risk.vue')), - educate: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/educate.vue')), eduDesc: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/indexs/components/edu.vue')), - danger: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/danger.vue')), danDesc: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/indexs/components/dan.vue')), - profession: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/profession.vue')), proDesc: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/indexs/components/pro.vue')), - message: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/message.vue')), - msgDesc: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/indexs/components/msg.vue')), - monitor: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/monitor.vue')), + msgDesc, monDesc: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/indexs/components/mon.vue')), - stock: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/components/stock.vue')), stoDesc: defineAsyncComponent(() => import('/@/views/riskWarningSys/warningBigScreen/indexs/components/sto.vue')) }, setup() { + const msgRef = ref() const screenThemes = useScreenTheme() const { screenTheme } = storeToRefs(screenThemes); const route = useRoute(); + const router = useRouter(); const state = reactive<stateType>({ isScreenfull: false, curChart: null, lineColor: ['#11FEEE'], - accRef: {}, - trainRef: {}, - riskRef: {}, - spiRef: {}, - eduRef: {}, - danRef: {}, - proRef: {}, - msgRef: {}, - monRef: {}, - stoRef: {} }); // 页面载入时执行方法 onMounted(() => { + console.log(msgRef.value,'val') if (route.query.num) { state.curChart = Number(route.query.num) + + if(route.query.num == '8'){ + if(route.query.rowIndex){ + msgRef.value.showDetails(route.query.rowIndex) + }else{ + msgRef.value.showDetails(0) + } + } } getTheme() }); @@ -143,23 +101,23 @@ const onScreenfullClick = () => { if (!screenfull.isEnabled) { ElMessage.warning('暂不不支持全屏'); - return false; + return false } screenfull.toggle(); screenfull.on('change', () => { if (screenfull.isFullscreen) { - state.isScreenfull = true; + state.isScreenfull = true } else { - state.isScreenfull = false; + state.isScreenfull = false } }); }; const getTheme =()=>{ if(screenTheme.value.isDark){ - window.document.getElementById('pageCont').setAttribute( "class", 'dark-page' ); + window.document.getElementById('pageCont').setAttribute( "class", 'dark-page' ) state.lineColor = ['#11FEEE'] }else{ - window.document.getElementById('pageCont').setAttribute( "class", 'light-page' ); + window.document.getElementById('pageCont').setAttribute( "class", 'light-page' ) state.lineColor = ['#333','#ccc'] } } @@ -168,12 +126,15 @@ }) // 返回上一页 const goBack = () => { - window.history.go(-1); + router.push({ + name: "warningScreen" + }); }; return { route, + msgRef, onScreenfullClick, goBack, ...toRefs(state) diff --git a/src/views/specialWorkSystem/specialIndex/components/videoDetail.vue b/src/views/specialWorkSystem/specialIndex/components/videoDetail.vue index 70c4630..523d929 100644 --- a/src/views/specialWorkSystem/specialIndex/components/videoDetail.vue +++ b/src/views/specialWorkSystem/specialIndex/components/videoDetail.vue @@ -189,7 +189,7 @@ const recordRef = ref() const openDialog = (row)=>{ state.videoData = row - console.log(state.videoData,'data') + console.log(state.videoData.approvalDeviceList,'data') state.title = row.workTypeDesc + '编号' + row.workPermitNo + '实时监测详情' state.videoDetailDialog = true } diff --git a/src/views/specialWorkSystem/specialIndex/components/workRecord.vue b/src/views/specialWorkSystem/specialIndex/components/workRecord.vue index 5c9efeb..bfe8a50 100644 --- a/src/views/specialWorkSystem/specialIndex/components/workRecord.vue +++ b/src/views/specialWorkSystem/specialIndex/components/workRecord.vue @@ -20,6 +20,12 @@ <div>操作时间:{{item.operationTime}}</div> <div>操作内容:{{item.content}}</div> <div>操作意见:{{item.approvalOpinions}}</div> + <div v-if="item.fileUrl" style="display: flex;align-items: flex-start">附件内容: + <el-image style="width: 150px; height: 150px;margin-right: 50px;margin-bottom: 20px" :src="item.fileUrl" fit="cover" /> + </div> + <div v-if="item.signUrl" style="display: flex;align-items: flex-start">签字图片: + <el-image style="width: 150px; height: 150px;margin-right: 50px;margin-bottom: 20px" :src="item.signUrl" fit="cover" /> + </div> </div> </div> </el-dialog> @@ -101,16 +107,21 @@ } .item{ display: flex; - align-items: flex-start; + align-items: stretch; /* 使 marker 和 content 高度一致 */ width: 100%; padding-left: 50px; margin-bottom: 10px; + position: relative; .marker{ + position: absolute; + left: 0; + top: 0; + bottom: 0; display: flex; flex-direction: column; align-items: center; - margin-right: 20px; + height: 100%; /* 使 marker 高度自适应父元素 */ .dot{ width: 28px; @@ -121,11 +132,12 @@ } .line{ width: 1px; - height: 120px; + flex-grow: 1; /* 自动适应剩余高度 */ background: #13ce66; } } .content{ + div{ margin-bottom: 6px; } diff --git a/src/views/specialWorkSystem/specialIndex/index.vue b/src/views/specialWorkSystem/specialIndex/index.vue index d754f58..fb47fb3 100644 --- a/src/views/specialWorkSystem/specialIndex/index.vue +++ b/src/views/specialWorkSystem/specialIndex/index.vue @@ -110,7 +110,7 @@ <div class="homeCard"> <dv-border-box10 v-if="isFull==true" class="item-bg"></dv-border-box10> <el-row> - <el-col :span="5" style="display:flex;align-items: center"> + <el-col :span="4" style="display:flex;align-items: center"> <span style="white-space: nowrap">作业类型:</span> <div class="grid-content topInfo"> <el-select :teleported="false" v-model="searchParams.workType" size="small"> @@ -123,7 +123,7 @@ </el-select> </div> </el-col> - <el-col :span="5" style="display:flex;align-items: center"> + <el-col :span="4" style="display:flex;align-items: center"> <span style="white-space: nowrap">作业状态:</span> <div class="grid-content topInfo"> <el-select :teleported="false" v-model="searchParams.workAllStatus" size="small"> @@ -136,12 +136,12 @@ </el-select> </div> </el-col> - <el-col :span="5" style="display:flex;align-items: center"> - <span style="white-space: nowrap">作业部门:</span> - <div class="grid-content topInfo"> - <el-cascader :teleported="false" size="small" v-model="searchParams.workDepId" :options="departmentList" :props="casProps" :show-all-levels="false"/> - </div> - </el-col> +<!-- <el-col :span="4" style="display:flex;align-items: center">--> +<!-- <span style="white-space: nowrap">作业部门:</span>--> +<!-- <div class="grid-content topInfo">--> +<!-- <el-cascader :teleported="false" size="small" v-model="searchParams.workDepId" :options="departmentList" :props="casProps" :show-all-levels="false"/>--> +<!-- </div>--> +<!-- </el-col>--> <el-col :span="6" style="display:flex;align-items: center;"> <span style="white-space: nowrap;margin-left: 20px">申请时间:</span> <div class="grid-content topInfo"> @@ -155,6 +155,16 @@ start-placeholder="开始日期" end-placeholder="结束日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" + /> + </div> + </el-col> + <el-col :span="4" style="display:flex;align-items: center"> + <span style="white-space: nowrap;margin-left: 20px">作业票编号:</span> + <div class="grid-content topInfo"> + <el-input + v-model="searchParams.workPermitNo" + placeholder="请输入作业票编号" + size="small" /> </div> </el-col> @@ -186,7 +196,12 @@ <!-- </el-row>--> <el-table ref="multipleTableRef" stripe border :data="workData" style="width: 100%" :header-cell-style="{ background: '#fafafa' }"> <el-table-column property="workPermitNo" label="作业证编号" align="center"/> - <el-table-column property="workDepName" label="作业单位" align="center"/> + <el-table-column label="作业单位" align="center"> + <template #default="scope"> + <span v-if="scope.row.workDepList && scope.row.workDepList.length>0">{{scope.row.workDepList.map(i=>i.workDepName).join(',')}}</span> + <span v-else>{{scope.row.workDepName }}</span> + </template> + </el-table-column> <el-table-column property="applyUname" label="申请人" align="center"/> <el-table-column property="applyDepName" label="申请单位" align="center"/> <el-table-column property="applyTime" label="申请时间" align="center"/> @@ -880,6 +895,7 @@ workAllStatus: null } state.searchDate = [] + state.pageIndex = 1 getMydepList() }; diff --git a/src/views/system/spi/component/spiDialog.vue b/src/views/system/spi/component/spiDialog.vue new file mode 100644 index 0000000..91f7edf --- /dev/null +++ b/src/views/system/spi/component/spiDialog.vue @@ -0,0 +1,153 @@ +<template> + <div class="system-add-user-container"> + <el-dialog :title="title" v-model="isShowDialog" width="50%"> + <el-form :model="spiForm" size="default" ref="userRef" :rules="spiFormRules" label-width="120px"> + <el-row :gutter="35"> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="总值" prop="value"> + <el-input v-model.trim="spiForm.value" type="number" placeholder="请输入当月总值" clearable></el-input> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="isShowDialog = !isShowDialog" size="default">取 消</el-button> + <el-button type="primary" v-throttle @click="onSubmit" size="default">确 定</el-button> + </span> + </template> + </el-dialog> + </div> +</template> + +<script lang="ts"> +import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import {riskWarningApi} from "/@/api/riskWarning"; +// 定义接口来定义对象的类型 +interface DeptData {} +interface sexData {} +interface UserState { + title: string; + isShowDialog: boolean; + spiForm: { + id?: number | null + time: string | null + value: number | null + }; + spiFormRules:{ + + } +} + +export default defineComponent({ + name: 'spiDialog', + setup(props, context) { + const userRef = ref() + const state = reactive<UserState>({ + title: '', + isShowDialog: false, + spiForm: { + id: null, + time: '', + value: null + }, + spiFormRules:{ + value: [{ required: true, message: '请填写spi总值', trigger: 'blur' }], + } + }); + // 打开弹窗 + const openDialog = (type: string, val: any) => { + state.isShowDialog = true + if (type === '新增') { + state.title = '新增SPI总值' + state.spiForm = { + id: null, + time: '', + value: null + } + getTime() + } else { + state.title = '修改SPI总值' + const {id,time,value} = val + state.spiForm = {id,time, value} + } + }; + + // 时间格式化 + const timeForm = { + hour12: false, + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit' + }; + + const getTime = () =>{ + const curTime = new Date().toLocaleString('zh', timeForm).replace(/\//g, '-'); + state.spiForm.time = curTime.substring(0,7) + } + + // 新增修改 + const onSubmit = async () => { + userRef.value.validate(async (valid:Boolean) => { + if(valid){ + if (state.title === '新增SPI总值') { + const {id,...data} = state.spiForm + data.value = Number(state.spiForm.value) + let res = await riskWarningApi().addSpi(data); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '新增成功', + duration: 2000 + }); + state.isShowDialog = false; + context.emit('getSpiList'); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } else { + state.spiForm.value = Number(state.spiForm.value) + let res = await riskWarningApi().modSpi(state.spiForm); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '修改成功', + duration: 2000 + }); + state.isShowDialog = false; + context.emit('getSpiList'); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + }else{ + ElMessage({ + type:'warning', + message:'请完善基本信息' + }) + } + }) + + }; + + // 页面加载时 + onMounted(() => {}); + return { + userRef, + openDialog, + onSubmit, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/system/spi/index.vue b/src/views/system/spi/index.vue new file mode 100644 index 0000000..45ff0e1 --- /dev/null +++ b/src/views/system/spi/index.vue @@ -0,0 +1,227 @@ +<template> + <div class="system-user-container"> + <el-card shadow="hover"> + <div class="system-user-search mb15"> + <el-button size="default" type="success" class="ml10" @click="onOpenSpiDialog('新增', '')"> + <el-icon> + <ele-FolderAdd /> + </el-icon> + 新增 + </el-button> + </div> + <el-table :data="spiData.data" style="width: 100%"> + <el-table-column type="index" label="序号" width="60" align="center"/> + <el-table-column prop="time" label="日期" align="center" show-overflow-tooltip></el-table-column> + <el-table-column prop="value" label="总值" align="center" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="100" align="center"> + <template #default="scope"> + <el-button :disabled="scope.row.userName === 'admin'" size="small" text type="primary" @click="onOpenSpiDialog('修改', scope.row)">修改</el-button> + <el-button style="color: red" :disabled="scope.row.userName === 'admin'" size="small" text type="primary" @click="onRowDel(scope.row)">删除</el-button> + </template> + </el-table-column> + </el-table> + <br /> + <el-pagination @size-change="onHandleSizeChange" @current-change="onHandleCurrentChange" class="page-position" :pager-count="5" :page-sizes="[10, 20, 30]" v-model:current-page="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="spiData.total"> </el-pagination> + <br /> + <br /> + </el-card> + <spiDialog ref="userRef" @getSpiList="initSpiData"/> + </div> +</template> + +<script lang="ts"> +import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import spiDialog from '/@/views/system/spi/component/spiDialog.vue'; +import { videoApi } from '/@/api/systemManage/video'; +import { dutyApi } from '/@/api/systemManage/duty'; +import { departmentApi } from '/@/api/systemManage/department'; +import { useRoleApi } from '/@/api/systemManage/role'; +import {riskWarningApi} from "/@/api/riskWarning"; + +// 定义接口来定义对象的类型 +interface TableDataRow { + name: string; + userNickname: string; + roleSign: string; + department: string[]; + phone: string; + email: string; + sex: string; + password: string; + overdueTime: Date; + status: boolean; + describe: string; + createTime: string; +} +interface DepartmentDataRow {} +interface TableDataState { + spiData: { + data: Array<TableDataRow>; + total: number; + loading: boolean; + }; + listQuery: { + pageIndex: number; + pageSize: number; + }; + departmentList: []; + roleList: []; + dutyList: []; + props:{} +} + +export default defineComponent({ + name: 'systemVideo', + components: { spiDialog }, + setup() { + const userRef = ref(); + const state = reactive<TableDataState>({ + spiData: { + data: [], + total: 0, + loading: false, + }, + listQuery: { + pageIndex: 1, + pageSize: 10 + }, + departmentList: [], + roleList: [], + dutyList: [], + props: { + label: 'depName', + value: 'depId', + checkStrictly: true, + emitPath: false + } + }); + // 初始化表格数据 + const initSpiData = async () => { + let res = await riskWarningApi().getSpiPage(state.listQuery); + if (res.data.code === '200') { + state.spiData.data = res.data.data; + state.spiData.total = res.data.total; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + // 回显职务信息 + const parseNumber = (value: number) => { + return state.dutyList.find((i) => i.positionId === value)?.positionName; + }; + const getDepartmentData = async () => { + let res = await departmentApi().getDepartmentList(); + if (res.data.code === '200') { + state.departmentList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + const getRoleData = async () => { + let res = await useRoleApi().getRoleList(); + if (res.data.code === '200') { + state.roleList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + const getDutyData = async () => { + let res = await dutyApi().getAllList({positionName: '',positionCode: ''}); + if (res.data.code === '200') { + state.dutyList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + // 打开新增修改用户弹窗 + const onOpenSpiDialog = (type: string, value: any) => { + userRef.value.openDialog(type, value, state.departmentList, state.roleList, state.dutyList); + }; + + // 删除用户 + const onRowDel = (row: TableDataRow) => { + ElMessageBox.confirm(`此操作将永久删除该数据,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + let res = await riskWarningApi().delSpi(row.id); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + duration: 2000, + message: '删除成功' + }); + await initSpiData(); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }) + .catch(() => {}); + }; + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.listQuery.pageSize = val; + initSpiData(); + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.listQuery.pageIndex = val; + initSpiData(); + }; + // 页面加载时 + onMounted(() => { + let a = { name: 1, c: { name: 1 } }; + let b = Object.assign({}, a); + b.c.name = 2; + initSpiData(); + getDepartmentData(); + getRoleData(); + getDutyData() + }); + return { + userRef, + onOpenSpiDialog, + onRowDel, + parseNumber, + onHandleSizeChange, + initSpiData, + onHandleCurrentChange, + ...toRefs(state) + }; + } +}); +</script> +<style scoped> +:deep(.el-textarea.is-disabled .el-textarea__inner) { + background-color: var(--el-card-bg-color); + color: var(--el-input-text-color, var(--el-text-color-regular)); +} +:deep(.el-input.is-disabled .el-input__inner) { + color: var(--el-input-text-color, var(--el-text-color-regular)); +} +:deep(.el-input.is-disabled .el-input__wrapper) { + background-color: var(--el-card-bg-color); +} +</style> -- Gitblit v1.9.2