forked from integrated_whb/integrated_whb_vue
				
			init
							parent
							
								
									5ea9fb929d
								
							
						
					
					
						commit
						2324d1110d
					
				|  | @ -945,6 +945,56 @@ export default [ | |||
|       }, | ||||
|     ], | ||||
|   }, | ||||
|   { | ||||
|     path: "/safety_environmental_management", | ||||
|     redirect: "/safety_environmental_management/safety_environmental", | ||||
|     meta: { title: "安全、环保检查管理", model: MODEL["1"] }, | ||||
|     component: "children", | ||||
|     children: [ | ||||
|       { | ||||
|         path: "/safety_environmental_management/safety_environmental", | ||||
|         meta: { title: "安全、环保检查", isSubMenu: false }, | ||||
|         component: "children", | ||||
|         children: [ | ||||
|           { | ||||
|             path: "", | ||||
|             component: | ||||
|               "safety_environmental_management/safety_environmental/index", | ||||
|           }, | ||||
|           { | ||||
|             path: "/safety_environmental_management/safety_environmental/add", | ||||
|             meta: { | ||||
|               title: "新增", | ||||
|               activeMenu: | ||||
|                 "/safety_environmental_management/safety_environmental", | ||||
|             }, | ||||
|             component: | ||||
|               "safety_environmental_management/safety_environmental/add", | ||||
|           }, | ||||
|           { | ||||
|             path: "/safety_environmental_management/safety_environmental/edit", | ||||
|             meta: { | ||||
|               title: "编辑", | ||||
|               activeMenu: | ||||
|                 "/safety_environmental_management/safety_environmental", | ||||
|             }, | ||||
|             component: | ||||
|               "safety_environmental_management/safety_environmental/add", | ||||
|           }, | ||||
|           { | ||||
|             path: "/safety_environmental_management/safety_environmental/view", | ||||
|             meta: { | ||||
|               title: "查看", | ||||
|               activeMenu: | ||||
|                 "/safety_environmental_management/safety_environmental", | ||||
|             }, | ||||
|             component: | ||||
|               "safety_environmental_management/safety_environmental/view", | ||||
|           }, | ||||
|         ], | ||||
|       }, | ||||
|     ], | ||||
|   }, | ||||
|   { | ||||
|     path: "/off_duty_management", | ||||
|     redirect: "/off_duty_management/leave", | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ import { | |||
|   getDepartmentTree, | ||||
|   getLevelsCorp, | ||||
|   getElectronicFenceTree, | ||||
|   getListSelectTree, | ||||
| } from "@/request/data_dictionary.js"; | ||||
| import { ref } from "vue"; | ||||
| 
 | ||||
|  | @ -388,6 +389,13 @@ export const layoutFnGetElectronicFenceTree = async (params) => { | |||
|   const resData = await getElectronicFenceTree(params); | ||||
|   return ref(JSON.parse(resData.zTreeNodes)); | ||||
| }; | ||||
| // 检查类型树
 | ||||
| export const layoutFnGetInspectionTypeTree = async () => { | ||||
|   const resData = await getListSelectTree({ | ||||
|     DICTIONARIES_ID: "60e6481d96e44a5390ff5c347c4d1ffe", | ||||
|   }); | ||||
|   return ref(JSON.parse(resData.zTreeNodes)); | ||||
| }; | ||||
| // 无法确定DICTIONARIES_ID的数据字典
 | ||||
| export const layoutFnGetLevels = async (DICTIONARIES_ID) => { | ||||
|   const resData = await getLevels({ DICTIONARIES_ID }); | ||||
|  |  | |||
|  | @ -0,0 +1,46 @@ | |||
| <template> | ||||
|   <el-tree-select | ||||
|     ref="treeSelectRef" | ||||
|     v-model="modelValue" | ||||
|     :data="data" | ||||
|     :props="{ | ||||
|       value: 'id', | ||||
|       children: 'nodes', | ||||
|       label: 'name', | ||||
|     }" | ||||
|     node-key="id" | ||||
|     :render-after-expand="false" | ||||
|     accordion | ||||
|     check-strictly | ||||
|     :clearable="true" | ||||
|   /> | ||||
| </template> | ||||
| 
 | ||||
| <script setup> | ||||
| import { layoutFnGetInspectionTypeTree } from "@/assets/js/data_dictionary"; | ||||
| import { ref } from "vue"; | ||||
| import { useVModel } from "@vueuse/core"; | ||||
| 
 | ||||
| defineOptions({ | ||||
|   name: "LayoutInspectionType", | ||||
| }); | ||||
| const props = defineProps({ | ||||
|   modelValue: { | ||||
|     type: String, | ||||
|     required: true, | ||||
|     default: "", | ||||
|   }, | ||||
| }); | ||||
| const emits = defineEmits(["update:modelValue"]); | ||||
| const modelValue = useVModel(props, "modelValue", emits); | ||||
| const treeSelectRef = ref(null); | ||||
| const getCurrentNode = () => { | ||||
|   return treeSelectRef.value.getCurrentNode(); | ||||
| }; | ||||
| defineExpose({ | ||||
|   getCurrentNode, | ||||
| }); | ||||
| const data = await layoutFnGetInspectionTypeTree(); | ||||
| </script> | ||||
| 
 | ||||
| <style scoped></style> | ||||
|  | @ -14,7 +14,7 @@ | |||
|       :height="300" | ||||
|       :is-crop="false" | ||||
|       :line-width="6" | ||||
|       line-color="red" | ||||
|       line-color="#fff" | ||||
|     /> | ||||
|     <template #footer> | ||||
|       <el-button @click="fnReset">重签</el-button> | ||||
|  |  | |||
|  | @ -45,12 +45,18 @@ export const getDepartmentTree = (params) => | |||
|     loading: false, | ||||
|     ...params, | ||||
|   }); | ||||
| // 部门树
 | ||||
| // 电子围栏树
 | ||||
| export const getElectronicFenceTree = (params) => | ||||
|   post("/electronicfence/listTree", { | ||||
|     loading: false, | ||||
|     ...params, | ||||
|   }); | ||||
| // 下拉选择树
 | ||||
| export const getListSelectTree = (params) => | ||||
|   post("/dictionaries/listSelectTree", { | ||||
|     loading: false, | ||||
|     ...params, | ||||
|   }); | ||||
| // 获取岗位
 | ||||
| export const getPostListAll = (params) => | ||||
|   post("/post/listAll", { | ||||
|  |  | |||
|  | @ -0,0 +1,10 @@ | |||
| import { post } from "@/request/axios.js"; | ||||
| 
 | ||||
| export const getSafetyEnvironmentalList = (params) => | ||||
|   post("/safetyenvironmental/list", params); // 安全环保管理列表
 | ||||
| export const getSafetyEnvironmentalFlowChart = (params) => | ||||
|   post("/safetyenvironmental/getFlow", params); // 安全环保管理流程图
 | ||||
| export const setSafetyEnvironmentalDelete = (params) => | ||||
|   post("/safetyenvironmental/hide", params); // 安全环保管理删除
 | ||||
| export const setSafetyEnvironmentalDefense = (params) => | ||||
|   post("/safetyenvironmental/explain", params); // 安全环保管理申辩
 | ||||
|  | @ -0,0 +1,258 @@ | |||
| <template> | ||||
|   <layout-card> | ||||
|     <el-form | ||||
|       ref="formRef" | ||||
|       :model="data.form" | ||||
|       :rules="rules" | ||||
|       label-width="180px" | ||||
|     > | ||||
|       <el-row> | ||||
|         <el-col :span="24"> | ||||
|           <el-form-item label="检查题目" prop="INSPECTION_SUBJECT"> | ||||
|             <el-radio-group v-model="data.form.INSPECTION_SUBJECT"> | ||||
|               <el-radio label="安全">安全</el-radio> | ||||
|               <el-radio label="环保">环保</el-radio> | ||||
|               <el-radio label="综合">综合</el-radio> | ||||
|             </el-radio-group> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="12"> | ||||
|           <el-form-item label="被检查单位" prop="INSPECTED_DEPARTMENT_ID"> | ||||
|             <layout-department | ||||
|               v-model="data.form.INSPECTED_DEPARTMENT_ID" | ||||
|               @update:model-value="fnInspectedDepartmentChange" | ||||
|             /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="12"> | ||||
|           <el-form-item | ||||
|             label="被检查单位现场负责人" | ||||
|             prop="INSPECTED_SITEUSER_ID" | ||||
|           > | ||||
|             <el-select v-model="data.form.INSPECTED_SITEUSER_ID"> | ||||
|               <el-option | ||||
|                 v-for="item in data.inspectedSiteUserList" | ||||
|                 :key="item.USER_ID" | ||||
|                 :label="item.NAME" | ||||
|                 :value="item.USER_ID" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="24"> | ||||
|           <el-form-item label="检查场所" prop="INSPECTION_PLACE"> | ||||
|             <el-input v-model="data.form.INSPECTION_PLACE" /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="24"> | ||||
|           <el-form-item label="检查人意见" prop="INSPECTION_USER_OPINION"> | ||||
|             <el-input | ||||
|               v-model="data.form.INSPECTION_USER_OPINION" | ||||
|               :autosize="{ minRows: 3 }" | ||||
|               type="textarea" | ||||
|             /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="24"> | ||||
|           <el-form-item label="检查人" prop="INSPECTION_USER_SIGN_IMG"> | ||||
|             <layout-sign v-model="data.form.INSPECTION_USER_SIGN_IMG" /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="检查类型" prop="INSPECTION_TYPE"> | ||||
|             <layout-inspection-type v-model="data.form.INSPECTION_TYPE" /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="检查开始时间" prop="INSPECTION_TIME_START"> | ||||
|             <el-date-picker | ||||
|               v-model="data.form.INSPECTION_TIME_START" | ||||
|               format="YYYY-MM-DD HH:mm" | ||||
|               value-format="YYYY-MM-DD HH:mm" | ||||
|               type="datetime" | ||||
|             /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="8"> | ||||
|           <el-form-item label="检查结束时间" prop="INSPECTION_TIME_END"> | ||||
|             <el-date-picker | ||||
|               v-model="data.form.INSPECTION_TIME_END" | ||||
|               format="YYYY-MM-DD HH:mm" | ||||
|               value-format="YYYY-MM-DD HH:mm" | ||||
|               type="datetime" | ||||
|             /> | ||||
|           </el-form-item> | ||||
|         </el-col> | ||||
|         <el-col :span="24"> | ||||
|           <el-divider content-position="left">检查人员</el-divider> | ||||
|         </el-col> | ||||
|         <el-col :span="24" class="tr mb-10"> | ||||
|           <el-button type="primary" @click="fnAddInspectorList"> | ||||
|             添加检查人员 | ||||
|           </el-button> | ||||
|         </el-col> | ||||
|         <template | ||||
|           v-for="(item, index) in data.form.inspectorList" | ||||
|           :key="item.id" | ||||
|         > | ||||
|           <el-col :span="12"> | ||||
|             <el-form-item label="检查人员部门" prop="INSPECTION_DEPARTMENT_ID"> | ||||
|               <layout-department | ||||
|                 v-model="item.INSPECTION_DEPARTMENT_ID" | ||||
|                 @update:model-value=" | ||||
|                   fnInspectionDepartmentChange($event, index) | ||||
|                 " | ||||
|               /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="12"> | ||||
|             <el-form-item label="检查人员" prop="INSPECTION_USER_ID"> | ||||
|               <div | ||||
|                 style=" | ||||
|                   flex: 1; | ||||
|                   display: flex; | ||||
|                   justify-content: space-between; | ||||
|                   align-items: flex-start; | ||||
|                 " | ||||
|               > | ||||
|                 <el-select v-model="item.INSPECTION_USER_ID"> | ||||
|                   <el-option | ||||
|                     v-for="data in item.inspectionUserList" | ||||
|                     :key="data.USER_ID" | ||||
|                     :label="data.NAME" | ||||
|                     :value="data.USER_ID" | ||||
|                   /> | ||||
|                 </el-select> | ||||
|                 <el-button | ||||
|                   v-if="index !== 0" | ||||
|                   type="danger" | ||||
|                   class="ml-10" | ||||
|                   @click="data.form.inspectorList.splice(index, 1)" | ||||
|                 > | ||||
|                   删除 | ||||
|                 </el-button> | ||||
|               </div> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|         </template> | ||||
|         <el-col :span="24"> | ||||
|           <el-divider content-position="left">检查情况</el-divider> | ||||
|         </el-col> | ||||
|         <el-col :span="24" class="tr mb-10"> | ||||
|           <el-button type="primary" @click="fnAddSituationList"> | ||||
|             添加检查情况 | ||||
|           </el-button> | ||||
|         </el-col> | ||||
|         <template | ||||
|           v-for="(item, index) in data.form.situationList" | ||||
|           :key="item.id" | ||||
|         > | ||||
|           <el-col :span="24"> | ||||
|             <el-form-item label="检查情况" prop="SITUATION"> | ||||
|               <div | ||||
|                 style=" | ||||
|                   flex: 1; | ||||
|                   display: flex; | ||||
|                   justify-content: space-between; | ||||
|                   align-items: flex-start; | ||||
|                 " | ||||
|               > | ||||
|                 <el-input | ||||
|                   v-model="item.SITUATION" | ||||
|                   :autosize="{ minRows: 3 }" | ||||
|                   type="textarea" | ||||
|                 /> | ||||
|                 <el-button | ||||
|                   v-if="index !== 0" | ||||
|                   class="ml-10" | ||||
|                   type="danger" | ||||
|                   @click="data.form.situationList.splice(index, 1)" | ||||
|                 > | ||||
|                   删除 | ||||
|                 </el-button> | ||||
|               </div> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|         </template> | ||||
|         <el-col :span="24"> | ||||
|           <el-divider content-position="left">发现问题</el-divider> | ||||
|         </el-col> | ||||
|         <el-col :span="24" class="tr mb-10"> | ||||
|           <el-button type="primary"> 添加发现问题 </el-button> | ||||
|         </el-col> | ||||
|         <el-col :span="24"> | ||||
|           <layout-table :data="data.form.hiddenList" :show-pagination="false"> | ||||
|             <el-table-column type="index" label="序号" width="60" /> | ||||
|           </layout-table> | ||||
|         </el-col> | ||||
|       </el-row> | ||||
|     </el-form> | ||||
|   </layout-card> | ||||
| </template> | ||||
| 
 | ||||
| <script setup> | ||||
| import { reactive, ref, watchEffect } from "vue"; | ||||
| import LayoutDepartment from "@/components/department/index.vue"; | ||||
| import LayoutSign from "@/components/sign/index.vue"; | ||||
| import { getUserListAll } from "@/request/data_dictionary.js"; | ||||
| import LayoutInspectionType from "@/components/inspection_type/index.vue"; | ||||
| 
 | ||||
| const rules = {}; | ||||
| const formRef = ref(null); | ||||
| const data = reactive({ | ||||
|   form: { | ||||
|     INSPECTION_SUBJECT: "安全", | ||||
|     INSPECTED_DEPARTMENT_ID: "", | ||||
|     INSPECTED_SITEUSER_ID: "", | ||||
|     INSPECTION_PLACE: "", | ||||
|     INSPECTION_USER_OPINION: "", | ||||
|     INSPECTION_USER_SIGN_IMG: "", | ||||
|     INSPECTION_TYPE: "", | ||||
|     INSPECTION_TIME_START: "", | ||||
|     INSPECTION_TIME_END: "", | ||||
|     inspectorList: [], | ||||
|     situationList: [], | ||||
|     hiddenList: [], | ||||
|   }, | ||||
|   inspectedSiteUserList: [], | ||||
| }); | ||||
| const fnAddInspectorList = () => { | ||||
|   data.form.inspectorList.push({ | ||||
|     INSPECTION_DEPARTMENT_ID: "", | ||||
|     INSPECTION_USER_ID: "", | ||||
|     inspectionUserList: [], | ||||
|     id: Math.random(), | ||||
|   }); | ||||
| }; | ||||
| fnAddInspectorList(); | ||||
| const fnAddSituationList = () => { | ||||
|   data.form.situationList.push({ | ||||
|     SITUATION: "", | ||||
|     id: Math.random(), | ||||
|   }); | ||||
| }; | ||||
| fnAddSituationList(); | ||||
| const fnInspectedDepartmentChange = () => { | ||||
|   data.inspectedSiteUserList.value = []; | ||||
|   data.form.INSPECTED_SITEUSER_ID = ""; | ||||
| }; | ||||
| const fnGetInspectedSitUserList = async (DEPARTMENT_ID) => { | ||||
|   const { userList } = await getUserListAll({ DEPARTMENT_ID }); | ||||
|   data.inspectedSiteUserList.value = userList; | ||||
| }; | ||||
| const fnInspectionDepartmentChange = (value, index) => { | ||||
|   data.form.inspectorList[index].INSPECTION_USER_ID = ""; | ||||
|   data.form.inspectorList[index].inspectionUserList = []; | ||||
|   fnGetInspectionSitUserList(value, index); | ||||
| }; | ||||
| const fnGetInspectionSitUserList = async (DEPARTMENT_ID, index) => { | ||||
|   const { userList } = await getUserListAll({ DEPARTMENT_ID }); | ||||
|   data.form.inspectorList[index].inspectionUserList = userList; | ||||
| }; | ||||
| watchEffect(() => { | ||||
|   if (data.form.INSPECTED_DEPARTMENT_ID) | ||||
|     fnGetInspectedSitUserList(data.form.INSPECTED_DEPARTMENT_ID); | ||||
| }); | ||||
| </script> | ||||
| 
 | ||||
| <style scoped lang="scss"></style> | ||||
|  | @ -0,0 +1,126 @@ | |||
| <template> | ||||
|   <el-dialog v-model="visible" title="申辩处理" :on-close="fnClose"> | ||||
|     <el-form ref="formRef" :rules="rules" :model="form" label-width="130px"> | ||||
|       <el-form-item label="申辩人"> | ||||
|         <img | ||||
|           v-viewer | ||||
|           :src="VITE_FILE_URL + info.INSPECTED_SITEUSER_SIGN_IMG" | ||||
|           style="width: 100px; height: 100px" | ||||
|           alt="" | ||||
|         /> | ||||
|       </el-form-item> | ||||
|       <el-form-item label="申辩时间"> | ||||
|         <el-input :model-value="info.INSPECTED_SITEUSER_SIGN_TIME" disabled /> | ||||
|       </el-form-item> | ||||
|       <el-form-item label="申辩说明"> | ||||
|         <el-input | ||||
|           :model-value="info.INSPECTED_EXPLAIN" | ||||
|           disabled | ||||
|           type="textarea" | ||||
|           autosize | ||||
|         /> | ||||
|       </el-form-item> | ||||
|       <el-form-item label="申辩附件" v-if="info.INSPECTED_EXPLAIN_FILEPATH"> | ||||
|         <el-input :model-value="info.INSPECTED_EXPLAIN_FILENAME" disabled /> | ||||
|         <el-button type="primary" @click="fnDownloadFile(info.INSPECTION_ID)"> | ||||
|           下载 | ||||
|         </el-button> | ||||
|       </el-form-item> | ||||
|       <el-form-item label="申辩是否成立" prop="INSPECTION_STATUS"> | ||||
|         <el-radio v-model="form.INSPECTION_STATUS" label="3">否</el-radio> | ||||
|         <el-radio v-model="form.INSPECTION_STATUS" label="-2">是</el-radio> | ||||
|       </el-form-item> | ||||
|       <template v-if="form.INSPECTION_STATUS === '3'"> | ||||
|         <el-form-item label="不成立理由内容" prop="INSPECTED_EXPLAIN_REFUSE"> | ||||
|           <el-input | ||||
|             v-model="form.INSPECTED_EXPLAIN_REFUSE" | ||||
|             :autosize="{ minRows: 3 }" | ||||
|             type="textarea" | ||||
|           /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="确认人" prop="INSPECTION_ORIGINATOR_SIGN_IMG"> | ||||
|           <layout-sign v-model="form.INSPECTION_ORIGINATOR_SIGN_IMG" /> | ||||
|         </el-form-item> | ||||
|       </template> | ||||
|     </el-form> | ||||
|     <template #footer> | ||||
|       <el-button @click="fnClose">取 消</el-button> | ||||
|       <el-button type="primary" @click="fnSubmit">确 定</el-button> | ||||
|     </template> | ||||
|   </el-dialog> | ||||
| </template> | ||||
| 
 | ||||
| <script setup> | ||||
| import { useVModel } from "@vueuse/core"; | ||||
| import { debounce } from "throttle-debounce"; | ||||
| import { reactive, ref } from "vue"; | ||||
| import LayoutSign from "@/components/sign/index.vue"; | ||||
| import useFormValidate from "@/assets/js/useFormValidate.js"; | ||||
| import { setSafetyEnvironmentalDefense } from "@/request/safety_environmental_management.js"; | ||||
| import { ElMessage } from "element-plus"; | ||||
| import { useRouter } from "vue-router"; | ||||
| 
 | ||||
| const router = useRouter(); | ||||
| const props = defineProps({ | ||||
|   visible: { | ||||
|     type: Boolean, | ||||
|     required: true, | ||||
|     default: false, | ||||
|   }, | ||||
|   info: { | ||||
|     type: Object, | ||||
|     required: true, | ||||
|     default: () => ({}), | ||||
|   }, | ||||
| }); | ||||
| const emits = defineEmits(["update:visible", "get-data"]); | ||||
| const visible = useVModel(props, "visible", emits); | ||||
| const VITE_FILE_URL = import.meta.env.VITE_FILE_URL; | ||||
| const rules = { | ||||
|   INSPECTION_STATUS: [ | ||||
|     { required: true, message: "请选择申辩是否成立", trigger: "change" }, | ||||
|   ], | ||||
|   INSPECTED_EXPLAIN_REFUSE: [ | ||||
|     { required: true, message: "请输入不成立理由内容", trigger: "blur" }, | ||||
|   ], | ||||
|   INSPECTION_ORIGINATOR_SIGN_IMG: [ | ||||
|     { required: true, message: "请签字", trigger: "change" }, | ||||
|   ], | ||||
| }; | ||||
| const form = reactive({ | ||||
|   INSPECTION_STATUS: "3", | ||||
|   INSPECTED_EXPLAIN_REFUSE: "", | ||||
|   INSPECTION_ORIGINATOR_SIGN_IMG: "", | ||||
| }); | ||||
| const formRef = ref(null); | ||||
| const fnDownloadFile = (INSPECTION_ID) => { | ||||
|   window.location.href = | ||||
|     import.meta.env[import.meta.env.DEV ? "VITE_PROXY" : "VITE_BASE_URL"] + | ||||
|     "safetyenvironmental/download?INSPECTION_ID=" + | ||||
|     INSPECTION_ID; | ||||
| }; | ||||
| const fnClose = () => { | ||||
|   formRef.value.resetFields(); | ||||
|   visible.value = false; | ||||
| }; | ||||
| const fnSubmit = debounce( | ||||
|   1000, | ||||
|   async () => { | ||||
|     await useFormValidate(formRef.value); | ||||
|     if (form.INSPECTION_STATUS === "3") { | ||||
|       await setSafetyEnvironmentalDefense({ ...props.info, ...form.value }); | ||||
|       ElMessage.success("申辩处理成功"); | ||||
|       fnClose(); | ||||
|       emits("get-data"); | ||||
|     } else { | ||||
|       await router.push({ | ||||
|         path: "/safety_environmental_management/safety_environmental/edit", | ||||
|         query: { INSPECTION_ID: props.info.INSPECTION_ID }, | ||||
|       }); | ||||
|     } | ||||
|   }, | ||||
|   { atBegin: true } | ||||
| ); | ||||
| </script> | ||||
| 
 | ||||
| <style scoped lang="scss"></style> | ||||
|  | @ -0,0 +1,79 @@ | |||
| <template> | ||||
|   <el-dialog v-model="visible" title="流程图" width="80%"> | ||||
|     <div style="height: calc(100vh - 200px)"> | ||||
|       <RelationGraph ref="relationGraphRef" :options="graphOptions" /> | ||||
|     </div> | ||||
|   </el-dialog> | ||||
| </template> | ||||
| 
 | ||||
| <script setup> | ||||
| import { useVModel } from "@vueuse/core"; | ||||
| import RelationGraph from "relation-graph/vue3"; | ||||
| import { ref, watchEffect } from "vue"; | ||||
| import { getSafetyEnvironmentalFlowChart } from "@/request/safety_environmental_management.js"; | ||||
| 
 | ||||
| const props = defineProps({ | ||||
|   visible: { | ||||
|     type: Boolean, | ||||
|     required: true, | ||||
|     default: false, | ||||
|   }, | ||||
|   id: { | ||||
|     type: String, | ||||
|     required: true, | ||||
|     default: "", | ||||
|   }, | ||||
| }); | ||||
| const emits = defineEmits(["update:visible"]); | ||||
| const visible = useVModel(props, "visible", emits); | ||||
| const relationGraphRef = ref(null); | ||||
| const graphOptions = ref({ | ||||
|   disableDragNode: "false", | ||||
|   layouts: [ | ||||
|     { | ||||
|       label: "中心", | ||||
|       layoutName: "tree", | ||||
|       layoutClassName: "seeks-layout-center", | ||||
|       defaultJunctionPoint: "border", | ||||
|       defaultNodeShape: 0, | ||||
|       defaultLineShape: 1, | ||||
|       min_per_width: 300, | ||||
|       max_per_width: 600, | ||||
|       min_per_height: 40, | ||||
|       max_per_height: 60, | ||||
|       from: "left", | ||||
|     }, | ||||
|   ], | ||||
|   buttonloading: false, | ||||
|   defaultLineMarker: { | ||||
|     markerWidth: 12, | ||||
|     markerHeight: 12, | ||||
|     refX: 6, | ||||
|     refY: 6, | ||||
|     data: "M2,2 L10,6 L2,10 L6,6 L2,2", | ||||
|   }, | ||||
|   defaultNodeShape: 1, | ||||
|   defaultLineShape: 2, | ||||
|   defaultJunctionPoint: "lr", | ||||
|   defaultNodeBorderWidth: 0, | ||||
|   backgroundColor: "#08163b", | ||||
|   defaultLineColor: "rgba(0, 186, 189, 1)", | ||||
|   defaultNodeColor: "rgba(0, 206, 209, 1)", | ||||
|   defaultNodeHeight: 150, | ||||
|   defaultNodeWidth: 200, | ||||
| }); | ||||
| const fnGetData = async () => { | ||||
|   const { nodes, from } = await getSafetyEnvironmentalFlowChart({ | ||||
|     INSPECTION_ID: props.id, | ||||
|   }); | ||||
|   fnSeeksGraph(nodes, from); | ||||
| }; | ||||
| const fnSeeksGraph = (nodes, links) => { | ||||
|   relationGraphRef.value.setJsonData({ nodes, links }, () => {}); | ||||
| }; | ||||
| watchEffect(() => { | ||||
|   if (visible.value) fnGetData(); | ||||
| }); | ||||
| </script> | ||||
| 
 | ||||
| <style scoped lang="scss"></style> | ||||
|  | @ -0,0 +1,344 @@ | |||
| <template> | ||||
|   <div> | ||||
|     <el-card> | ||||
|       <el-form | ||||
|         :model="searchForm" | ||||
|         label-width="100px" | ||||
|         @submit.prevent="fnResetPaginationTransfer" | ||||
|       > | ||||
|         <el-row> | ||||
|           <el-col :span="4"> | ||||
|             <el-form-item label="被检查单位" prop="INSPECTED_DEPARTMENT_ID"> | ||||
|               <layout-department v-model="searchForm.INSPECTED_DEPARTMENT_ID" /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="4"> | ||||
|             <el-form-item label="检查部门" prop="INSPECTION_DEPARTMENT_ID"> | ||||
|               <layout-department | ||||
|                 v-model="searchForm.INSPECTION_DEPARTMENT_ID" | ||||
|               /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="4"> | ||||
|             <el-form-item label="检查发起人" prop="INSPECTION_ORIGINATOR_NAME"> | ||||
|               <el-input v-model="searchForm.INSPECTION_ORIGINATOR_NAME" /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="4"> | ||||
|             <el-form-item label="检查类型" prop="INSPECTION_TYPE"> | ||||
|               <layout-inspection-type v-model="searchForm.INSPECTION_TYPE" /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="6"> | ||||
|             <el-form-item label="检查时间" prop="dates"> | ||||
|               <el-date-picker | ||||
|                 v-model="searchForm.dates" | ||||
|                 type="daterange" | ||||
|                 value-format="YYYY-MM-DD" | ||||
|                 format="YYYY-MM-DD" | ||||
|                 range-separator="至" | ||||
|               /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="4"> | ||||
|             <el-form-item label="检查状态" prop="INSPECTION_STATUS"> | ||||
|               <el-select v-model="searchForm.INSPECTION_STATUS"> | ||||
|                 <el-option | ||||
|                   v-for="item in stateList" | ||||
|                   :key="item.ID" | ||||
|                   :label="item.NAME" | ||||
|                   :value="item.ID" | ||||
|                 /> | ||||
|               </el-select> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="4"> | ||||
|             <el-form-item label="隐患描述" prop="HIDDENDESCR"> | ||||
|               <el-input v-model="searchForm.HIDDENDESCR" /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="4"> | ||||
|             <el-form-item label="检查题目" prop="INSPECTION_SUBJECT"> | ||||
|               <el-select v-model="searchForm.INSPECTION_SUBJECT"> | ||||
|                 <el-option | ||||
|                   v-for="item in inspectionQuestionList" | ||||
|                   :key="item.ID" | ||||
|                   :label="item.NAME" | ||||
|                   :value="item.ID" | ||||
|                 /> | ||||
|               </el-select> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="6"> | ||||
|             <el-form-item label-width="10px"> | ||||
|               <el-button type="primary" native-type="submit">搜索</el-button> | ||||
|               <el-button native-type="reset" @click="fnResetPaginationTransfer"> | ||||
|                 重置 | ||||
|               </el-button> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|         </el-row> | ||||
|       </el-form> | ||||
|     </el-card> | ||||
|     <layout-card> | ||||
|       <div class="mtb-10"> | ||||
|         {{ | ||||
|           INSPECT_NAME_MAP[searchForm.INSPECTION_SUBJECT] || "安全环保总数" | ||||
|         }}: | ||||
|         <b> | ||||
|           <i>{{ safetyTotal }}</i> | ||||
|         </b> | ||||
|         <span class="pl-10"> | ||||
|           涉及隐患总数: | ||||
|           <b> | ||||
|             <i>{{ hiddenTotal }}</i> | ||||
|           </b> | ||||
|         </span> | ||||
|       </div> | ||||
|       <layout-table | ||||
|         :data="list" | ||||
|         @get-data="fnGetDataTransfer" | ||||
|         v-model:pagination="pagination" | ||||
|         ref="tableRef" | ||||
|         row-key="INSPECTION_ID" | ||||
|       > | ||||
|         <el-table-column reserve-selection type="selection" width="55" /> | ||||
|         <el-table-column label="序号" width="60"> | ||||
|           <template #default="{ $index }"> | ||||
|             {{ serialNumber(pagination, $index) }} | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|         <el-table-column prop="INSPECTED_DEPARTMENT_NAMES" label="被检查单位" /> | ||||
|         <el-table-column | ||||
|           prop="INSPECTED_SITEUSER_NAME" | ||||
|           label="被检查单位现场负责人" | ||||
|         /> | ||||
|         <el-table-column prop="INSPECTION_DEPARTMENT_NAME" label="检查部门" /> | ||||
|         <el-table-column | ||||
|           prop="INSPECTION_ORIGINATOR_NAME" | ||||
|           label="检查发起人" | ||||
|           width="120" | ||||
|         /> | ||||
|         <el-table-column prop="INSPECTION_TYPE_NAME" label="检查类型" /> | ||||
|         <el-table-column prop="HIDDEN_COUNT" label="涉及隐患数" width="120" /> | ||||
|         <el-table-column label="检查时间" width="270"> | ||||
|           <template v-slot="{ row }"> | ||||
|             <span> | ||||
|               自 {{ row.INSPECTION_TIME_START }} 至 | ||||
|               {{ row.INSPECTION_TIME_END }} 止 | ||||
|             </span> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|         <el-table-column label="状态" width="120"> | ||||
|           <template v-slot="{ row }"> | ||||
|             {{ translationStatus(row.INSPECTION_STATUS, stateList) }} | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|         <el-table-column prop="INSPECTION_SUBJECT" label="检查题目" /> | ||||
|         <el-table-column label="操作" width="270"> | ||||
|           <template #default="{ row }"> | ||||
|             <el-button | ||||
|               type="primary" | ||||
|               text | ||||
|               link | ||||
|               @click=" | ||||
|                 router.push({ | ||||
|                   path: '/safety_environmental_management/safety_environmental/view', | ||||
|                   query: { INSPECTION_ID: row.INSPECTION_ID }, | ||||
|                 }) | ||||
|               " | ||||
|             > | ||||
|               查看 | ||||
|             </el-button> | ||||
|             <el-button | ||||
|               type="primary" | ||||
|               text | ||||
|               link | ||||
|               @click="fnFlowChart(row.INSPECTION_ID)" | ||||
|             > | ||||
|               流程图 | ||||
|             </el-button> | ||||
|             <el-button | ||||
|               v-if="buttonJurisdiction.edit && row.INSPECTION_STATUS === '-1'" | ||||
|               type="primary" | ||||
|               text | ||||
|               link | ||||
|               @click=" | ||||
|                 router.push({ | ||||
|                   path: '/safety_environmental_management/safety_environmental/edit', | ||||
|                   query: { INSPECTION_ID: row.INSPECTION_ID }, | ||||
|                 }) | ||||
|               " | ||||
|             > | ||||
|               编辑 | ||||
|             </el-button> | ||||
|             <el-button | ||||
|               v-if=" | ||||
|                 row.INSPECTION_ORIGINATOR_ID === USER_ID && | ||||
|                 row.INSPECTION_STATUS === '-2' | ||||
|               " | ||||
|               type="primary" | ||||
|               text | ||||
|               link | ||||
|               @click="fnDefense(row)" | ||||
|             > | ||||
|               申辩处理 | ||||
|             </el-button> | ||||
|             <el-button | ||||
|               v-if="buttonJurisdiction.del && row.INSPECTION_SOURCE !== '4'" | ||||
|               type="primary" | ||||
|               text | ||||
|               link | ||||
|               @click="fnDelete(row.INSPECTION_ID)" | ||||
|             > | ||||
|               删除 | ||||
|             </el-button> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|         <template #button> | ||||
|           <el-button | ||||
|             v-if="buttonJurisdiction.add" | ||||
|             type="primary" | ||||
|             @click=" | ||||
|               router.push({ | ||||
|                 path: '/safety_environmental_management/safety_environmental/add', | ||||
|               }) | ||||
|             " | ||||
|           > | ||||
|             新建检查 | ||||
|           </el-button> | ||||
|         </template> | ||||
|       </layout-table> | ||||
|     </layout-card> | ||||
|     <flow-chart | ||||
|       v-model:visible="data.flowChartDialog.visible" | ||||
|       :id="data.flowChartDialog.INSPECTION_ID" | ||||
|     /> | ||||
|     <defense | ||||
|       v-model:visible="data.defenseDialog.visible" | ||||
|       :info="data.defenseDialog.info" | ||||
|       @get-data="fnResetPaginationTransfer" | ||||
|     /> | ||||
|   </div> | ||||
| </template> | ||||
| 
 | ||||
| <script setup> | ||||
| import { useRouter } from "vue-router"; | ||||
| import { serialNumber, translationStatus } from "@/assets/js/utils"; | ||||
| import { debounce } from "throttle-debounce"; | ||||
| import { ElMessage, ElMessageBox } from "element-plus"; | ||||
| import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js"; | ||||
| import useListData from "@/assets/js/useListData.js"; | ||||
| import LayoutDepartment from "@/components/department/index.vue"; | ||||
| import LayoutInspectionType from "@/components/inspection_type/index.vue"; | ||||
| import { | ||||
|   getSafetyEnvironmentalList, | ||||
|   setSafetyEnvironmentalDelete, | ||||
| } from "@/request/safety_environmental_management.js"; | ||||
| import { useUserStore } from "@/pinia/user.js"; | ||||
| import { reactive, ref } from "vue"; | ||||
| import FlowChart from "./components/flow_chart.vue"; | ||||
| import Defense from "./components/defense.vue"; | ||||
| 
 | ||||
| const stateList = [ | ||||
|   { ID: "0", 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: "-1", NAME: "检查人核实打回" }, | ||||
|   { ID: "-2", NAME: "被检查人申辩" }, | ||||
| ]; | ||||
| const inspectionQuestionList = [ | ||||
|   { ID: "安全", NAME: "安全" }, | ||||
|   { ID: "环保", NAME: "环保" }, | ||||
|   { ID: "综合", NAME: "综合" }, | ||||
| ]; | ||||
| const INSPECT_NAME_MAP = { | ||||
|   安全: "安全检查总数", | ||||
|   环保: "环保检查总数", | ||||
|   综合: "安全检查总数", | ||||
| }; | ||||
| const safetyTotal = ref(0); | ||||
| const hiddenTotal = ref(0); | ||||
| const userStore = useUserStore(); | ||||
| const USER_ID = userStore.getUserInfo.USER_ID; | ||||
| const router = useRouter(); | ||||
| const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } = | ||||
|   useListData(getSafetyEnvironmentalList, { | ||||
|     callbackFn: (list, resData) => { | ||||
|       safetyTotal.value = resData.safetyTotal; | ||||
|       hiddenTotal.value = resData.hiddenTotal; | ||||
|     }, | ||||
|   }); | ||||
| const data = reactive({ | ||||
|   flowChartDialog: { | ||||
|     visible: false, | ||||
|     INSPECTION_ID: "", | ||||
|   }, | ||||
|   defenseDialog: { | ||||
|     visible: false, | ||||
|     info: { | ||||
|       INSPECTION_ID: "", | ||||
|       INSPECTED_SITEUSER_SIGN_IMG: "", | ||||
|       INSPECTED_SITEUSER_SIGN_TIME: "", | ||||
|       INSPECTED_EXPLAIN: "", | ||||
|       INSPECTED_EXPLAIN_FILENAME: "", | ||||
|       INSPECTED_EXPLAIN_FILEPATH: "", | ||||
|     }, | ||||
|   }, | ||||
| }); | ||||
| const fnGetDataTransfer = () => { | ||||
|   fnGetData({ | ||||
|     INSPECTION_TIME_START: searchForm.value.dates?.[0], | ||||
|     INSPECTION_TIME_END: searchForm.value.dates?.[1], | ||||
|   }); | ||||
| }; | ||||
| const fnResetPaginationTransfer = () => { | ||||
|   fnResetPagination({ | ||||
|     INSPECTION_TIME_START: searchForm.value.dates?.[0], | ||||
|     INSPECTION_TIME_END: searchForm.value.dates?.[1], | ||||
|   }); | ||||
| }; | ||||
| const buttonJurisdiction = await useButtonJurisdiction("safetyenvironmental"); | ||||
| const fnDelete = debounce( | ||||
|   1000, | ||||
|   async (INSPECTION_ID) => { | ||||
|     await ElMessageBox.confirm("确定要删除吗?", { type: "warning" }); | ||||
|     await setSafetyEnvironmentalDelete({ INSPECTION_ID, hide: "1" }); | ||||
|     ElMessage.success("删除成功"); | ||||
|     fnResetPaginationTransfer(); | ||||
|   }, | ||||
|   { atBegin: true } | ||||
| ); | ||||
| const fnFlowChart = (INSPECTION_ID) => { | ||||
|   data.flowChartDialog.visible = true; | ||||
|   data.flowChartDialog.INSPECTION_ID = INSPECTION_ID; | ||||
| }; | ||||
| const fnDefense = ({ | ||||
|   INSPECTED_SITEUSER_SIGN_IMG, | ||||
|   INSPECTED_SITEUSER_SIGN_TIME, | ||||
|   INSPECTED_EXPLAIN, | ||||
|   INSPECTED_EXPLAIN_FILENAME, | ||||
|   INSPECTED_EXPLAIN_FILEPATH, | ||||
|   INSPECTION_ID, | ||||
| }) => { | ||||
|   data.defenseDialog.visible = true; | ||||
|   data.defenseDialog.info.INSPECTED_SITEUSER_SIGN_IMG = | ||||
|     INSPECTED_SITEUSER_SIGN_IMG; | ||||
|   data.defenseDialog.info.INSPECTED_SITEUSER_SIGN_TIME = | ||||
|     INSPECTED_SITEUSER_SIGN_TIME; | ||||
|   data.defenseDialog.info.INSPECTED_EXPLAIN = INSPECTED_EXPLAIN; | ||||
|   data.defenseDialog.info.INSPECTED_EXPLAIN_FILENAME = | ||||
|     INSPECTED_EXPLAIN_FILENAME; | ||||
|   data.defenseDialog.info.INSPECTED_EXPLAIN_FILEPATH = | ||||
|     INSPECTED_EXPLAIN_FILEPATH; | ||||
|   data.defenseDialog.info.INSPECTION_ID = INSPECTION_ID; | ||||
| }; | ||||
| </script> | ||||
| 
 | ||||
| <style scoped></style> | ||||
|  | @ -0,0 +1,7 @@ | |||
| <template> | ||||
|   <layout-card></layout-card> | ||||
| </template> | ||||
| 
 | ||||
| <script setup></script> | ||||
| 
 | ||||
| <style scoped lang="scss"></style> | ||||
		Loading…
	
		Reference in New Issue