From d0bec404f2c22ca04e8592f1a2ba0b39eab0be2f Mon Sep 17 00:00:00 2001
From: 马宇豪 <978517621@qq.com>
Date: 星期一, 22 五月 2023 09:37:03 +0800
Subject: [PATCH] Default Changelist

---
 src/assets/newMenu/card-12.png                                     |    0 
 src/assets/newMenu/icon12.png                                      |    0 
 src/views/loginPage/loginPage.vue                                  |    1 
 src/router/route.ts                                                |   16 +
 src/views/newSpecialWorkSystem/workTicket/zysq/index.vue           |    2 
 src/assets/newMenu/icon13.png                                      |    0 
 src/views/system/saftyManage/component/saftyDialog.vue             |  233 ++++++++++++++++
 src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue |  178 +++++++++++-
 src/views/newHome/index.vue                                        |   36 ++
 src/api/systemManage/saftyManage/index.ts                          |   38 ++
 src/assets/newMenu/card-13.png                                     |    0 
 src/views/system/saftyManage/index.vue                             |  288 ++++++++++++++++++++
 12 files changed, 768 insertions(+), 24 deletions(-)

diff --git a/src/api/systemManage/saftyManage/index.ts b/src/api/systemManage/saftyManage/index.ts
new file mode 100644
index 0000000..03af3d7
--- /dev/null
+++ b/src/api/systemManage/saftyManage/index.ts
@@ -0,0 +1,38 @@
+import request from '/@/utils/request';
+
+export function saftyApi() {
+    return {
+        // v1
+        getSaftyList: (data: any) => {
+            return request({
+                url: import.meta.env.VITE_API_URL + `/specialwork9step/measure/page/list`,
+                method: 'post',
+                data: data
+            });
+        },
+
+        addSafty: (data: any) => {
+            return request({
+                url: import.meta.env.VITE_API_URL + `/specialwork9step/measure/save`,
+                method: 'post',
+                data: data
+            });
+        },
+
+        modSafty: (data: any) => {
+            return request({
+                url: import.meta.env.VITE_API_URL + `/specialwork9step/measure/update`,
+                method: 'post',
+                data: data
+            });
+        },
+
+        delSafty: (data: any) => {
+            return request({
+                url: import.meta.env.VITE_API_URL + `/specialwork9step/measure/delete`,
+                method: 'post',
+                data: data
+            });
+        }
+    };
+}
diff --git a/src/assets/newMenu/card-12.png b/src/assets/newMenu/card-12.png
new file mode 100644
index 0000000..fc8cb0f
--- /dev/null
+++ b/src/assets/newMenu/card-12.png
Binary files differ
diff --git a/src/assets/newMenu/card-13.png b/src/assets/newMenu/card-13.png
new file mode 100644
index 0000000..70f02bc
--- /dev/null
+++ b/src/assets/newMenu/card-13.png
Binary files differ
diff --git a/src/assets/newMenu/icon12.png b/src/assets/newMenu/icon12.png
new file mode 100644
index 0000000..5d16886
--- /dev/null
+++ b/src/assets/newMenu/icon12.png
Binary files differ
diff --git a/src/assets/newMenu/icon13.png b/src/assets/newMenu/icon13.png
new file mode 100644
index 0000000..be149c8
--- /dev/null
+++ b/src/assets/newMenu/icon13.png
Binary files differ
diff --git a/src/router/route.ts b/src/router/route.ts
index 27f6937..0bbfea4 100644
--- a/src/router/route.ts
+++ b/src/router/route.ts
@@ -111,5 +111,21 @@
         meta: {
             title: '安全物资与设备'
         }
+    },
+    {
+        path: '/zysq',
+        name: 'zysq',
+        component: () => import('/@/views/newSpecialWorkSystem/workTicket/zysq/index.vue'),
+        meta: {
+            title: '作业申请'
+        }
+    },
+    {
+        path: '/saftyManage',
+        name: 'saftyManage',
+        component: () => import('/@/views/system/saftyManage/index.vue'),
+        meta: {
+            title: '安全措施管理'
+        }
     }
 ];
diff --git a/src/views/loginPage/loginPage.vue b/src/views/loginPage/loginPage.vue
index 14d69e8..ee6db15 100644
--- a/src/views/loginPage/loginPage.vue
+++ b/src/views/loginPage/loginPage.vue
@@ -112,6 +112,7 @@
     align-items: center;
     justify-content: center;
     background: url('../../assets/loginPage/login-bg.jpg') no-repeat center;
+    background-size: 100% 100%;
     /*background-image: radial-gradient(at center, #0075c3, #000b61);*/
 
     canvas {
diff --git a/src/views/newHome/index.vue b/src/views/newHome/index.vue
index 8450675..f944810 100644
--- a/src/views/newHome/index.vue
+++ b/src/views/newHome/index.vue
@@ -82,7 +82,17 @@
                     </div>
                     <img class="bgImg" src="../../assets/newMenu/card-7.png" />
                 </div>
-                <div class="grid-content cont-bg-1" v-throttle @click="render('7')">
+                <div class="grid-content cont-bg-1" v-throttle @click="toManLocation">
+                  <div class="toplayer">
+                    <img class="iconImg" src="../../assets/newMenu/icon12.png" />
+                    <div>
+                      <div class="itemTit">人员定位系统</div>
+                      <div class="enTit">Personnel Positioning System</div>
+                    </div>
+                  </div>
+                  <img class="bgImg" src="../../assets/newMenu/card-12.png" />
+                </div>
+                <div class="grid-content cont-bg-2" v-throttle @click="render('7')">
                     <div class="toplayer">
                         <img class="iconImg" src="../../assets/newMenu/icon5.png" />
                         <div>
@@ -141,6 +151,16 @@
                         </div>
                     </div>
                     <img class="bgImg" src="../../assets/newMenu/card-6.png" />
+                </div>
+                <div class="grid-content cont-bg-2" v-throttle @click="toSmartFactory">
+                  <div class="toplayer">
+                    <img class="iconImg" src="../../assets/newMenu/icon13.png" />
+                    <div>
+                      <div class="itemTit">智能工厂系统</div>
+                      <div class="enTit">Intelligent Factory System</div>
+                    </div>
+                  </div>
+                  <img class="bgImg" src="../../assets/newMenu/card-13.png" />
                 </div>
                 <div class="grid-content cont-bg-2" @click="render('1')">
                     <div class="toplayer">
@@ -336,6 +356,12 @@
         const toDoublePrevent = () => {
            window.open('http://121.239.169.27:6801');
         };
+        const toSmartFactory = () =>{
+          window.open('http://10.211.134.139:5522/#/login');
+        }
+        const toManLocation = () =>{
+          window.open('http://10.211.134.138:8081/GUOTAI');
+        }
         const throttle = (renderMenu: any, delay: number) => {
             let flag = true;
             let count = 0;
@@ -410,6 +436,8 @@
             renderToNew,
             toRiskPlatform,
             toDoublePrevent,
+            toSmartFactory,
+            toManLocation,
             onScreenfullClick,
             loginIconTwo,
             getThemeConfig,
@@ -455,10 +483,10 @@
 @media screen and (min-width: 1600px) {
     .gridCont {
         width: 100%;
-        height: 100%;
         display: grid;
         grid-gap: 20px;
         grid-template-columns: repeat(3, 1fr);
+        grid-template-rows: repeat(5, 200px);
         grid-auto-flow: row;
         justify-content: center;
         .toplayer {
@@ -551,7 +579,6 @@
 @media screen and (min-width: 1200px) and (max-width: 1600px) {
     .gridCont {
         width: 100%;
-        height: 100%;
         display: grid;
         grid-gap: 15px;
         grid-template-columns: repeat(3, 1fr);
@@ -644,7 +671,6 @@
 @media screen and (max-width: 1200px) {
     .gridCont {
         width: 100%;
-        height: 100%;
         display: grid;
         grid-gap: 10px;
         grid-template-columns: repeat(3, 1fr);
@@ -907,6 +933,8 @@
         position: absolute;
         top: 260px;
         left: 220px;
+      overflow: hidden;
+      overflow-y: scroll;
         .gridCont {
             .grid-content {
                 border-radius: 16px;
diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue
index 8177e7c..9d124d1 100644
--- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue
+++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue
@@ -1,12 +1,11 @@
 <template>
 	<div class="home-container">
-		<div style="height: 100%">
-		<el-form :model="form" label-width="150px" :rules="applyRules" ref="ruleFormRef">
+		<el-form :model="form" label-width="180px" :rules="applyRules" ref="ruleFormRef">
 			<div class="homeCard">
       <el-row>
         <el-col :span="12">
           <el-form-item label="作业申请单位" prop="workDetail.involvedDepIds">
-            <el-cascader v-model="form.workDetail.involvedDepIds" :options="departList" :show-all-levels="false"/>
+            <el-cascader style="width: 100%" v-model="form.workDetail.involvedDepIds" :options="departList" :props="depProps" :show-all-levels="false"/>
           </el-form-item>
         </el-col>
         <el-col :span="12">
@@ -71,7 +70,7 @@
 			<el-row>
         <el-col :span="12">
           <el-form-item label="作业单位" prop="workDetail.involvedDepIds">
-            <el-cascader v-model="form.workDetail.involvedDepIds" :options="departList" :show-all-levels="false"/>
+            <el-cascader style="width: 100%" v-model="form.workDetail.involvedDepIds" :props="depProps" :options="departList" :show-all-levels="false"/>
           </el-form-item>
         </el-col>
         <el-col :span="12">
@@ -154,27 +153,114 @@
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="预计整体完成时间" prop="workTimeLine">
+          <el-form-item label="预计(整体)完成时间" prop="workTimeLine">
             <el-date-picker
                 v-model="form.workTimeLine"
                 format="YYYY-MM-DD HH:mm"
                 value-format="YYYY-MM-DD HH:mm:00"
                 type="datetime"
+                style="width: 100%"
             />
           </el-form-item>
         </el-col>
       </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="备注" prop="info">
+              <el-input
+                  v-model="form.workContent"
+                  :autosize="{ minRows: 1 }"
+                  type="textarea"
+                  placeholder="请输入作业备注"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-table :data="safeData" style="width: 100%" border>
+            <el-table-column type="index" label="序号" width="80px"/>
+            <el-table-column prop="name" label="安全措施"/>
+            <el-table-column prop="address" label="确认人">
+              <template #default="scope">
+
+              </template>
+            </el-table-column>
+            <el-table-column prop="address" label="操作">
+              <template #default="scope">
+                <el-button link type="primary" size="small" :icon="Edit">修改确认人</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="其他安全措施填报人" prop="info">
+              <el-select v-model="form.operatorUids" multiple>
+                <el-option
+                    v-for="item in workerList"
+                    :key="item.uid"
+                    :label="item.username"
+                    :value="item.uid"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-table :data="form.reviewData" style="width: 100%" border>
+            <el-table-column prop="item" label="审批签字项目"/>
+            <el-table-column prop="isCheck" label="是否必签">
+              <template #default="scope">
+                <el-radio-group v-model="scope.row.isCheck">
+                  <el-radio :label="1">所有必签</el-radio>
+                  <el-radio :label="2">任一</el-radio>
+                  <el-radio :label="3">非必签</el-radio>
+                </el-radio-group>
+              </template>
+            </el-table-column>
+            <el-table-column prop="names" label="审批人">
+              <template #default="scope">
+
+              </template>
+            </el-table-column>
+            <el-table-column prop="address" label="操作">
+              <template #default="scope">
+                <el-button link type="primary" size="small" :icon="Edit">选择审批人</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="完工验收" prop="info">
+              <el-select v-model="form.operatorUids">
+                <el-option
+                    v-for="item in workerList"
+                    :key="item.uid"
+                    :label="item.username"
+                    :value="item.uid"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="现场开始结束确认人" prop="info">
+              <el-select v-model="form.operatorUids" multiple>
+                <el-option
+                    v-for="item in workerList"
+                    :key="item.uid"
+                    :label="item.username"
+                    :value="item.uid"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
 			</div>
 		</el-form>
-      <el-table :data="tableData" style="width: 100%">
-        <el-table-column type="index" label="序号"/>
-        <el-table-column prop="name" label="安全措施"/>
-        <el-table-column prop="address" label="确认人" />
-      </el-table>
 		<div class="applyBtn">
-			<el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">发起申请</el-button>
+			<el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">提交申报</el-button>
 		</div>
-	</div>
 	</div>
 </template>
 
@@ -184,7 +270,7 @@
 	import { initBackEndControlRoutes } from '/@/router/backEnd';
 	import {useUserInfo} from "/@/stores/userInfo";
 	import { Session } from '/@/utils/storage';
-	import { Search } from '@element-plus/icons-vue'
+	import { Search, Edit } from '@element-plus/icons-vue'
 	import { ElMessage, ElMessageBox } from 'element-plus'
 	import type { FormInstance, FormRules } from 'element-plus'
 	import { workApplyApi } from '/@/api/specialWorkSystem/workApply';
@@ -192,7 +278,9 @@
 		form: Object,
 		workLevelList: Array<any>,
 		otherWorkList: Array<any>,
-		equipmentDialog: boolean
+		equipmentDialog: boolean,
+    depProps:{},
+    safeData: []
 	}
 	export default defineComponent({
 		name: 'fireForm',
@@ -221,7 +309,49 @@
           receiveUids: [],
 					workTimeLine: [],
 					expStartTime: '',
-					expEndTime: ''
+					expEndTime: '',
+          reviewData: [
+            {
+              item: '作业负责人意见',
+              isCheck: null,
+              names: []
+            },
+            {
+              item: '车间主任意见',
+              isCheck: null,
+              names: []
+            },
+            {
+              item: '运营安环科意见',
+              isCheck: null,
+              names: []
+            },
+            {
+              item: '运营单位负责人意见',
+              isCheck: null,
+              names: []
+            },
+            {
+              item: '事业部安环科意见',
+              isCheck: null,
+              names: []
+            },
+            {
+              item: '事业部负责人审批意见',
+              isCheck: null,
+              names: []
+            },
+            {
+              item: '公司主要负责人审批意见',
+              isCheck: null,
+              names: []
+            },
+            {
+              item: '岗位当班班长验票情况',
+              isCheck: null,
+              names: []
+            }
+          ]
 				},
 				workLevelList: [
 					{
@@ -270,7 +400,13 @@
 						label: "盲板抽堵作业",
 						value: 8
 					}
-				]
+				],
+        depProps:{
+          expandTrigger: 'hover',
+          label: 'depName',
+          value: 'depId'
+        },
+        safeData: []
 			});
 			const ruleFormRef = ref<FormInstance>()
 			const applyRules = reactive<FormRules>({
@@ -287,7 +423,7 @@
 
 			// 页面载入时执行方法
 			onMounted(() => {
-
+        state.form.involvedDepIds = userInfos.value.depId
 			});
 
 
@@ -310,9 +446,12 @@
 
 <style scoped lang="scss">
 	.home-container {
-		height: 100%;
+		width: 100%;
+    height: 100vh;
 		overflow: hidden;
 		position: relative;
+    overflow-y: scroll;
+    padding: 40px 0 100px;
 		.homeCard{
 			width: 100%;
 			padding: 20px;
@@ -322,10 +461,11 @@
 			margin-bottom: 20px;
 		}
 		.applyBtn{
+      position: absolute;
+      z-index: 999;
 			width: 100%;
 			background: #fff;
 			padding-top: 15px;
-			z-index: 5;
 			box-shadow: 0 -3px 8px rgba(150,150,150,.1);
 			display: flex;
 			align-items: center;
diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/index.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/index.vue
index f4d8cee..d271403 100644
--- a/src/views/newSpecialWorkSystem/workTicket/zysq/index.vue
+++ b/src/views/newSpecialWorkSystem/workTicket/zysq/index.vue
@@ -127,7 +127,7 @@
 			onMounted(() => {
 				getAll();
 				getAllDepartment();
-        getAllDevice()
+        getAllDevice();
 			});
 
 			return {
diff --git a/src/views/system/saftyManage/component/saftyDialog.vue b/src/views/system/saftyManage/component/saftyDialog.vue
new file mode 100644
index 0000000..48a99ea
--- /dev/null
+++ b/src/views/system/saftyManage/component/saftyDialog.vue
@@ -0,0 +1,233 @@
+<template>
+    <div class="system-add-user-container">
+        <el-dialog :title="title" v-model="isShowVideoDialog" width="50%">
+            <el-form :model="saftyForm" size="default" ref="userRef" :rules="saftyFormRules" 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="orderNum">
+                        <el-input v-model.trim="saftyForm.orderNum" placeholder="请输入编号" clearable type="number" :readonly="isDisabled"></el-input>
+                      </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+                        <el-form-item label="作业类型" prop="workType">
+                          <el-select v-model="saftyForm.workType" :disabled="isDisabled">
+                            <el-option
+                                v-for="item in workTypeList"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            />
+                          </el-select>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+                        <el-form-item label="安全措施内容" prop="measureContent">
+                            <el-input v-model.trim="saftyForm.measureContent" placeholder="带填空内容必须以“(#)”格式输入,如:现场配备灭火器(#)台,灭火毯(#)块。否则无法提交。" type="textarea" :autosize="{ minRows: 3 }" clearable :readonly="isDisabled"></el-input>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+                      <el-form-item label="是否填空" prop="measureType">
+                        <el-radio-group v-model="saftyForm.measureType" :disabled="isDisabled">
+                          <el-radio :label="0">否</el-radio>
+                          <el-radio :label="1">是</el-radio>
+                        </el-radio-group>
+                      </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" v-if="saftyForm.measureType == 1">
+                      <el-form-item label="填空数量" prop="blanks">
+                        <el-input v-model.trim="saftyForm.blanks" placeholder="请输入填空数量" clearable type="number" :readonly="isDisabled"></el-input>
+                      </el-form-item>
+                    </el-col>
+                </el-row>
+            </el-form>
+            <template #footer>
+                <span class="dialog-footer">
+                    <el-button @click="isShowVideoDialog = !isShowVideoDialog" size="default">取 消</el-button>
+                    <el-button v-if="!isDisabled" 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 { saftyApi } from '/@/api/systemManage/saftyManage';
+
+// 定义接口来定义对象的类型
+interface DeptData {}
+interface sexData {}
+interface UserState {
+    title: string;
+    isDisabled: boolean;
+    isShowVideoDialog: boolean;
+    saftyForm: {
+        orderNum: number | null;
+        workType: number | null;
+        measureContent: string | null;
+        measureType: number | null;
+        blanks: number | null;
+    };
+    saftyFormRules:{
+
+    },
+    departmentData: Array<DeptData>;
+    addProps:{}
+  workTypeList: Array<TypeList>
+}
+interface TypeList {
+  label: string,
+  value: number
+}
+export default defineComponent({
+    name: 'videoDialog',
+    setup(props, context) {
+        const userRef = ref()
+        const state = reactive<UserState>({
+            title: '',
+            isDisabled: false,
+            isShowVideoDialog: false,
+            saftyForm: {
+              orderNum: null,
+              workType: null,
+              measureContent: '',
+              measureType: null,
+              blanks: null
+            },
+            saftyFormRules:{
+              orderNum: [{ required: true, message: '请填写安全措施编号', trigger: 'blur' }],
+              workType: [{ required: true, message: '请选择作业类型', trigger: 'blur' }],
+              measureContent: [{ required: true, message: '请填写安全措施内容', trigger: 'blur' }],
+              measureType: [{ required: true, message: '请选择措施类型', trigger: 'blur' }],
+              blanks: [{ required: true, message: '请填写填空数量', trigger: 'blur' }]
+            },
+            departmentData: [], // 部门数据
+            addProps:{
+              expandTrigger: 'hover',
+              emitPath: false,
+              value: 'depId',
+              label: 'depName',
+              checkStrictly: true
+            },
+          workTypeList: [
+            {
+              label: "动火作业",
+              value: 1
+            },
+            {
+              label: "受限空间作业",
+              value: 2
+            },
+            {
+              label: "吊装作业",
+              value: 3
+            },
+            {
+              label: "动土作业",
+              value: 4
+            },
+            {
+              label: "断路作业",
+              value: 5
+            },
+            {
+              label: "高处作业",
+              value: 6
+            },
+            {
+              label: "临时用电作业",
+              value: 7
+            },
+            {
+              label: "盲板抽堵作业",
+              value: 8
+            }
+          ]
+        });
+        // 打开弹窗
+        const openDialog = (type: string, value: any, departmentList: [], roleList: [], dutyList:[]) => {
+            state.isShowVideoDialog = true;
+            state.departmentData = departmentList;
+            if (type === '新增') {
+                state.title = '新增安全措施'
+                state.isDisabled = false
+                state.saftyForm = {
+                  orderNum: null,
+                  workType: null,
+                  measureContent: '',
+                  measureType: null,
+                  blanks: null
+                };
+            } else if(type === '修改'){
+                state.title = '修改安全措施';
+                state.isDisabled = false
+                state.saftyForm = JSON.parse(JSON.stringify(value));
+            } else{
+              state.title = '查看安全措施';
+              state.isDisabled = true
+              state.saftyForm = JSON.parse(JSON.stringify(value));
+            }
+        };
+
+        // 新增修改
+        const onSubmit = async () => {
+            userRef.value.validate(async (valid:Boolean) => {
+                if(valid){
+                  if(state.saftyForm.measureType == 0){
+                    state.saftyForm.blanks = null
+                  }
+                    if (state.title === '新增安全措施') {
+                        let res = await saftyApi().addSafty(state.saftyForm);
+                        if (res.data.code === '200') {
+                            ElMessage({
+                                type: 'success',
+                                message: '安全措施新增成功',
+                                duration: 2000
+                            });
+                            state.isShowVideoDialog = false;
+                            context.emit('getSaftyList');
+                        } else {
+                            ElMessage({
+                                type: 'warning',
+                                message: res.data.msg
+                            });
+                        }
+                    } else {
+                        let res = await saftyApi().modSafty(state.saftyForm);
+                        if (res.data.code === '200') {
+                            ElMessage({
+                                type: 'success',
+                                message: '安全措施修改成功',
+                                duration: 2000
+                            });
+                            state.isShowVideoDialog = false;
+                            context.emit('getSaftyList');
+                        } 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/saftyManage/index.vue b/src/views/system/saftyManage/index.vue
new file mode 100644
index 0000000..afdc253
--- /dev/null
+++ b/src/views/system/saftyManage/index.vue
@@ -0,0 +1,288 @@
+<template>
+    <div class="system-user-container">
+        <el-card shadow="hover">
+            <div class="system-user-search mb15">
+              <el-select v-model="listQuery.searchParams.workType" clearable size="default">
+                <el-option
+                    v-for="item in workTypeList"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                />
+              </el-select>
+                <el-button size="default" type="primary" class="ml10" @click="initSaftyTableData">
+                    <el-icon>
+                        <ele-Search />
+                    </el-icon>
+                    查询
+                </el-button>
+                <el-button size="default" type="success" class="ml10" @click="onOpenSaftyDialog('新增', '')">
+                    <el-icon>
+                        <ele-FolderAdd />
+                    </el-icon>
+                    新增
+                </el-button>
+            </div>
+            <el-table :data="saftyTableData.data" style="width: 100%">
+                <el-table-column prop="orderNum" label="编号" width="60" align="center"/>
+                <el-table-column prop="workTypeDesc" label="作业类型" align="center" show-overflow-tooltip></el-table-column>
+                <el-table-column prop="measureContent" label="安全措施内容" align="center" show-overflow-tooltip></el-table-column>
+                <el-table-column prop="gmtCreateUname" label="创建人" align="center" show-overflow-tooltip></el-table-column>
+                <el-table-column prop="gmtCreate" label="创建时间"  align="center" show-overflow-tooltip></el-table-column>
+                <el-table-column prop="gmtModifiedUname" label="最后修改人" align="center" show-overflow-tooltip></el-table-column>
+                <el-table-column prop="gmtModified" label="最后修改时间" align="center" show-overflow-tooltip></el-table-column>
+                <el-table-column label="操作" width="100" align="center">
+                    <template #default="scope">
+                        <el-button size="small" text type="primary" @click="onOpenSaftyDialog('查看', scope.row)">查看</el-button>
+                        <el-button size="small" text type="primary" @click="onOpenSaftyDialog('修改', scope.row)">修改</el-button>
+                        <el-button style="color: red" 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="saftyTableData.total"> </el-pagination>
+            <br />
+            <br />
+        </el-card>
+        <safty-dialog ref="safeRef" @getSaftyList="initSaftyTableData"/>
+    </div>
+</template>
+
+<script lang="ts">
+import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue';
+import { ElMessageBox, ElMessage } from 'element-plus';
+import saftyDialog from '/@/views/system/saftyManage/component/saftyDialog.vue';
+import { saftyApi } from '/@/api/systemManage/saftyManage';
+import { dutyApi } from '/@/api/systemManage/duty';
+import { departmentApi } from '/@/api/systemManage/department';
+import { useRoleApi } from '/@/api/systemManage/role';
+
+// 定义接口来定义对象的类型
+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 {
+    saftyTableData: {
+        data: Array<TableDataRow>;
+        total: number;
+        loading: boolean;
+    };
+    listQuery: {
+      pageIndex: number;
+      pageSize: number;
+      searchParams: {}
+    };
+    departmentList: [];
+    roleList: [];
+    dutyList: [];
+    props:{};
+    workTypeList: Array<TypeList>
+}
+interface TypeList {
+  label: string,
+  value: number
+}
+
+export default defineComponent({
+    name: 'saftyManage',
+    components: { saftyDialog },
+    setup() {
+        const safeRef = ref();
+        const state = reactive<TableDataState>({
+            saftyTableData: {
+                data: [],
+                total: 0,
+                loading: false,
+            },
+            listQuery: {
+              pageIndex: 1,
+              pageSize: 10,
+              searchParams: {
+                workType: null
+              }
+            },
+            departmentList: [],
+            roleList: [],
+            dutyList: [],
+            props: {
+              label: 'depName',
+              value: 'depId',
+              checkStrictly: true,
+              emitPath: false
+            },
+            workTypeList: [
+              {
+                label: "动火作业",
+                value: 1
+              },
+              {
+                label: "受限空间作业",
+                value: 2
+              },
+              {
+                label: "吊装作业",
+                value: 3
+              },
+              {
+                label: "动土作业",
+                value: 4
+              },
+              {
+                label: "断路作业",
+                value: 5
+              },
+              {
+                label: "高处作业",
+                value: 6
+              },
+              {
+                label: "临时用电作业",
+                value: 7
+              },
+              {
+                label: "盲板抽堵作业",
+                value: 8
+              }
+            ]
+        });
+        // 初始化表格数据
+        const initSaftyTableData = async () => {
+            let res = await saftyApi().getSaftyList(state.listQuery);
+            if (res.data.code === '200') {
+                state.saftyTableData.data = res.data.data;
+                state.saftyTableData.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 onOpenSaftyDialog = (type: string, value: any) => {
+            safeRef.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 saftyApi().delSafty({id: row.id});
+                    if (res.data.code === '200') {
+                        ElMessage({
+                            type: 'success',
+                            duration: 2000,
+                            message: '删除成功'
+                        });
+                        await initSaftyTableData();
+                    } else {
+                        ElMessage({
+                            type: 'warning',
+                            message: res.data.msg
+                        });
+                    }
+                })
+                .catch(() => {});
+        };
+        // 分页改变
+        const onHandleSizeChange = (val: number) => {
+            state.listQuery.pageSize = val;
+            initSaftyTableData();
+        };
+        // 分页改变
+        const onHandleCurrentChange = (val: number) => {
+            state.listQuery.pageIndex = val;
+            initSaftyTableData();
+        };
+        // 页面加载时
+        onMounted(() => {
+            let a = { name: 1, c: { name: 1 } };
+            let b = Object.assign({}, a);
+            b.c.name = 2;
+            initSaftyTableData();
+            getDepartmentData();
+            getRoleData();
+            getDutyData()
+        });
+        return {
+            safeRef,
+            onOpenSaftyDialog,
+            onRowDel,
+            parseNumber,
+            onHandleSizeChange,
+            initSaftyTableData,
+            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