From 18e2812133add57c3b707f39555321e2a598eea2 Mon Sep 17 00:00:00 2001
From: 马宇豪 <978517621@qq.com>
Date: Thu, 18 Jan 2024 13:54:50 +0800
Subject: [PATCH] 新增
---
src/views/safetyReview/projectManage/components/employNoticeRecord.vue | 190 +++++++
src/views/safetyReview/projectManage/components/evaluatePlan.vue | 306 ++++++++---
src/views/safetyReview/baseSet/expertsType/index.vue | 2
src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue | 69 --
src/views/safetyReview/projectManage/components/mapLocation.vue | 118 ++++
src/views/safetyReview/userManage/expertUsers/index.vue | 143 ++++
src/views/safetyReview/projectManage/components/siteCheckRcd.vue | 179 ++++++
src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue | 112 +---
src/views/safetyReview/projectManage/process.vue | 19
src/views/safetyReview/projectManage/components/expertsList.vue | 375 ++++++++-----
src/views/safetyReview/projectManage/components/riskAnalysis.vue | 17
11 files changed, 1,114 insertions(+), 416 deletions(-)
diff --git a/src/views/safetyReview/baseSet/expertsType/index.vue b/src/views/safetyReview/baseSet/expertsType/index.vue
index 55ecca9..019b523 100644
--- a/src/views/safetyReview/baseSet/expertsType/index.vue
+++ b/src/views/safetyReview/baseSet/expertsType/index.vue
@@ -44,7 +44,7 @@
<!-- <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>-->
</el-row>
- <el-table v-loading="state.loading" :data="state.expertList" :tree-props="{children: 'children', hasChildren: 'hasChildren'}" :border="true">
+ <el-table v-loading="state.loading" :data="state.expertList" row-key="id" :border="true">
<el-table-column label="分类名称" align="center" prop="classifyName" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
diff --git a/src/views/safetyReview/projectManage/components/employNoticeRecord.vue b/src/views/safetyReview/projectManage/components/employNoticeRecord.vue
new file mode 100644
index 0000000..7fa0b69
--- /dev/null
+++ b/src/views/safetyReview/projectManage/components/employNoticeRecord.vue
@@ -0,0 +1,190 @@
+<template>
+ <div class="riskBox">
+ <el-form ref="formRef" :model="state.formData" :rules="state.rules" class="register-form" label-position="top">
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item prop="timeRange" label="技术服务期限">
+ <el-date-picker
+ v-model="state.formData.timeRange"
+ style="width: 100%"
+ type="daterange"
+ range-separator="至"
+ start-placeholder="开始日期"
+ end-placeholder="结束日期"
+ value-format="YYYY-MM-DD 00:00:00"
+ size="large"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="6">
+ <el-form-item prop="investigationPlanDate" label="计划现场勘验时间">
+ <el-date-picker
+ style="width: 100%"
+ v-model="state.formData.investigationPlanDate"
+ type="date"
+ value-format="YYYY-MM-DD 00:00:00"
+ placeholder="选择日期"
+ size="large"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+<!-- <el-row :gutter="30">-->
+<!-- <el-col :span="6">-->
+<!-- <el-form-item label="附件上传">-->
+<!-- <el-upload-->
+<!-- accept="image/*"-->
+<!-- :action="state.uploadUrl"-->
+<!-- :headers="state.header"-->
+<!-- method="post"-->
+<!-- :on-success="(response, file, fileList) => handleAvatarSuccess(response, file, fileList, 1)"-->
+<!-- :on-preview="handlePictureCardPreview"-->
+<!-- v-model:file-list="state.socialList"-->
+<!-- list-type="picture-card"-->
+<!-- :before-upload="picSize"-->
+<!-- :on-remove="(file, file_list)=>{handleRemove(file, file_list, 1)}"-->
+<!-- >-->
+<!-- <el-icon><Plus /></el-icon>-->
+<!-- <template #tip>-->
+<!-- <div class="el-upload__tip">上传jpg/png图片尺寸小于5M</div>-->
+<!-- </template>-->
+<!-- </el-upload>-->
+<!-- </el-form-item>-->
+<!-- </el-col>-->
+<!-- </el-row>-->
+ <el-row>
+ <el-col :span="18">
+ <div style="display: flex;align-items: center">项目组成员<el-icon style="margin-left: 10px;margin-right: 4px"><InfoFilled /></el-icon><span style="font-size: 13px">金属、非金属矿及其他矿采选业:安全、机械、电气、采矿、通风、地质、水工结构</span></div>
+ </el-col>
+ </el-row>
+ <el-table :data="state.planPersons" :border="true" style="margin: 20px 0">
+ <el-table-column label="序号" width="60" align="center" type="index"></el-table-column>
+ <el-table-column label="评价组成员" prop="person.name" header-align="center" :show-overflow-tooltip="true"/>
+ <el-table-column label="资格证书" prop="person.certificateNo" header-align="center" :show-overflow-tooltip="true"/>
+ <el-table-column label="专业能力" prop="person.major" header-align="center" :show-overflow-tooltip="true"/>
+ <el-table-column label="承担工作" header-align="center" class-name="small-padding fixed-width">
+ <template #default="scope">
+ <el-select v-model="scope.row.work" multiple placeholder="承担工作" style="width: 100%" size="large" disabled>
+ <el-option v-for="item in state.workList" :key="item.value" :label="item.label" :value="item.value"/>
+ </el-select>
+ </template>
+ </el-table-column>
+ <el-table-column label="承诺后期前往现场勘验" header-align="center" class-name="small-padding fixed-width">
+ <template #default="scope">
+ <el-radio-group v-model="scope.row.laterPromise" size="large" disabled>
+ <el-radio :label="1" size="large">是</el-radio>
+ <el-radio :label="0" size="large">否</el-radio>
+ </el-radio-group>
+ </template>
+ </el-table-column>
+ <el-table-column label="未到现场勘验原因" header-align="center" class-name="small-padding fixed-width">
+ <template #default="scope">
+ <el-input v-model="scope.row.reason" maxlength="30" show-word-limit type="text" size="large" readonly/>
+ </template>
+ </el-table-column>
+ <el-table-column label="是否已告知" header-align="center" class-name="small-padding fixed-width">
+ <template #default="scope">
+ <el-radio-group v-model="scope.row.informed" size="large">
+ <el-radio :label="1" size="large">是</el-radio>
+ <el-radio :label="0" size="large">否</el-radio>
+ </el-radio-group>
+ </template>
+ </el-table-column>
+ </el-table>
+ </el-form>
+ </div>
+</template>
+<script setup>
+
+import {defineEmits, onMounted, reactive, ref} from "vue"
+import {ElMessage} from "element-plus"
+import {Search} from '@element-plus/icons-vue'
+import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis"
+import Cookies from "js-cookie"
+const emit = defineEmits(["getNextStatus"])
+
+const state = reactive({
+ formData: {
+ projectId: null,
+ timeRange: [],
+ serviceStartDate: '',
+ serviceEndDate: '',
+ investigationPlanDate: ''
+ },
+ planPersons: [],
+ rules: {
+ timeRange: [{required: true, message: '请选择技术服务期限', trigger: 'blur'}],
+ investigationPlanDate: [{required: true, message: '请选择计划现场勘验时间', trigger: 'blur'}],
+ }
+})
+
+const isAmin = ref(false)
+const formRef = ref()
+onMounted(() => {
+ const userInfo = JSON.parse(Cookies.get('userInfo'))
+ if(userInfo.identity === 0){
+ isAmin.value = true;
+ }
+});
+
+const riskOpen = async (type,val) => {
+ console.log("type",type,val)
+ if(type === 'detail' || type === 'edit' ){
+ const res = await getRiskDetail({projectId: val});
+ if(res.code == 200){
+ state.formData = res.data;
+ state.formData.project.business = parseInt(res.data.project.business);
+ state.formData.project.area = [res.data.project.province,res.data.project.city];
+ }else {
+ ElMessage.warning(res.message)
+ }
+ }
+ if(type === 'add' || type === 'clickEdit') {
+ const valid = await formRef.value.validate();
+ if(valid){
+ if (isAmin.value) {
+ ElMessage.warning("当前用户暂无权限");
+ return;
+ }
+ state.formData.serviceStartDate = state.formData.timeRange[0]
+ state.formData.serviceEndDate = state.formData.timeRange[1]
+ if(type === 'add'){
+ const {projectId,timeRange, ...data} = JSON.parse(JSON.stringify(state.formData))
+ const res = await addRisk(data);
+ if (res.code == 200) {
+ ElMessage.success('保存成功')
+ formRef.value.clearValidate();
+ emit('getNextStatus', res.data);
+
+ } else {
+ ElMessage.warning(res.message)
+ }
+ }else if(type === 'clickEdit'){
+ const {timeRange, ...data} = JSON.parse(JSON.stringify(state.formData))
+ const res = await editRisk(data);
+ if (res.code == 200) {
+ ElMessage.success('变更成功')
+ formRef.value.clearValidate();
+ // emit('getNextStatus', data.project.id);
+ } else {
+ ElMessage.warning(res.message)
+ }
+ }
+ }
+ }
+}
+
+defineExpose({
+ riskOpen
+});
+
+
+</script>
+<style scoped lang="scss">
+.riskBox{
+ :deep(.el-form .el-form-item__label) {
+ font-size: 15px;
+ }
+}
+
+</style>
diff --git a/src/views/safetyReview/projectManage/components/evaluatePlan.vue b/src/views/safetyReview/projectManage/components/evaluatePlan.vue
index 3446e59..13876a2 100644
--- a/src/views/safetyReview/projectManage/components/evaluatePlan.vue
+++ b/src/views/safetyReview/projectManage/components/evaluatePlan.vue
@@ -3,10 +3,10 @@
<el-form ref="formRef" :model="state.formData" :rules="state.rules" class="register-form" label-position="top">
<el-row :gutter="30">
<el-col :span="6">
- <el-form-item prop="evalStartDate" label="评价开始时间">
+ <el-form-item prop="startDate" label="评价开始时间">
<el-date-picker
style="width: 100%"
- v-model="state.formData.evalStartDate"
+ v-model="state.formData.startDate"
type="date"
value-format="YYYY-MM-DD 00:00:00"
placeholder="选择日期"
@@ -15,10 +15,10 @@
</el-form-item>
</el-col>
<el-col :span="6">
- <el-form-item prop="evalEndDate" label="评价结束时间">
+ <el-form-item prop="endDate" label="评价结束时间">
<el-date-picker
style="width: 100%"
- v-model="state.formData.evalEndDate"
+ v-model="state.formData.endDate"
type="date"
value-format="YYYY-MM-DD 00:00:00"
placeholder="选择日期"
@@ -27,9 +27,9 @@
</el-form-item>
</el-col>
<el-col :span="6">
- <el-form-item prop="deliver" label="机构评价负责人">
+ <el-form-item prop="auser.name" label="机构评价负责人">
<el-input
- v-model="state.formData.deliver"
+ v-model="state.formData.auser.name"
size="large"
placeholder="请选择机构评价负责人"
>
@@ -39,23 +39,28 @@
</el-input>
</el-form-item>
</el-col>
- <el-col :span="6">
- <el-form-item prop="deliver" label="技术负责人">
- <el-input
- v-model="state.formData.deliver"
- size="large"
- placeholder="请选择技术负责人"
- >
- <template #append>
- <el-button :icon="Search" @click="openExperts('技术负责人')"/>
- </template>
- </el-input>
- </el-form-item>
+<!-- <el-col :span="6">-->
+<!-- <el-form-item prop="deliver" label="技术负责人">-->
+<!-- <el-input-->
+<!-- v-model="state.formData.deliver"-->
+<!-- size="large"-->
+<!-- placeholder="请选择技术负责人"-->
+<!-- >-->
+<!-- <template #append>-->
+<!-- <el-button :icon="Search" @click="openExperts('技术负责人')"/>-->
+<!-- </template>-->
+<!-- </el-input>-->
+<!-- </el-form-item>-->
+<!-- </el-col>-->
+ </el-row>
+ <el-row>
+ <el-col :span="18">
+ <div style="display: flex;align-items: center">评价日程安排</div>
</el-col>
</el-row>
- <el-table :data="state.tableData" :border="true" style="margin: 20px 0">
+ <el-table :data="state.formData.estimateSchedules" :border="true" style="margin: 20px 0">
<el-table-column label="序号" width="60" align="center" type="index"></el-table-column>
- <el-table-column label="评价日程安排" prop="content" header-align="center" :show-overflow-tooltip="true"/>
+ <el-table-column label="评价日程安排" prop="name" header-align="center" :show-overflow-tooltip="true"/>
<el-table-column label="开始时间" header-align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-date-picker
@@ -81,6 +86,94 @@
</template>
</el-table-column>
</el-table>
+ <el-row>
+ <el-col :span="18">
+ <div style="display: flex;align-items: center">项目组成员<el-icon style="margin-left: 10px;margin-right: 4px"><InfoFilled /></el-icon><span style="font-size: 13px">金属、非金属矿及其他矿采选业:安全、机械、电气、采矿、通风、地质、水工结构</span></div>
+ </el-col>
+ <el-col :span="6">
+ <div style="width: 100%;display: flex;justify-content: right">
+ <el-button type="primary" icon="Plus" @click="openExperts('项目组成员')">添加成员</el-button>
+ </div>
+ </el-col>
+ </el-row>
+ <el-table :data="state.formData.planPersons" :border="true" style="margin: 20px 0">
+ <el-table-column label="序号" width="60" align="center" type="index"></el-table-column>
+ <el-table-column label="评价组成员" prop="person.name" header-align="center" :show-overflow-tooltip="true"/>
+ <el-table-column label="资格证书" prop="person.certificateNo" header-align="center" :show-overflow-tooltip="true"/>
+ <el-table-column label="专业能力" prop="person.major" header-align="center" :show-overflow-tooltip="true"/>
+ <el-table-column label="承担工作" header-align="center" class-name="small-padding fixed-width">
+ <template #default="scope">
+ <el-select v-model="scope.row.work" multiple placeholder="承担工作" style="width: 100%" size="large">
+ <el-option v-for="item in state.workList" :key="item.value" :label="item.label" :value="item.value"/>
+ </el-select>
+ </template>
+ </el-table-column>
+ <el-table-column label="承诺后期前往现场勘验" header-align="center" class-name="small-padding fixed-width">
+ <template #default="scope">
+ <el-radio-group v-model="scope.row.laterPromise" size="large">
+ <el-radio :label="1" size="large">是</el-radio>
+ <el-radio :label="0" size="large">否</el-radio>
+ </el-radio-group>
+ </template>
+ </el-table-column>
+ <el-table-column label="未到现场勘验原因" header-align="center" class-name="small-padding fixed-width">
+ <template #default="scope">
+ <el-input v-model="scope.row.reason" maxlength="30" show-word-limit type="text" size="large"/>
+ </template>
+ </el-table-column>
+ <el-table-column label="操作" header-align="center" class-name="small-padding fixed-width">
+ <template #default="scope">
+ <el-button link type="danger" @click="delMember(scope.$index)">删除</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ <el-row>
+ <el-col :span="18">
+ <div style="display: flex;align-items: center">所需仪器设备</div>
+ </el-col>
+ <el-col :span="6">
+ <div style="width: 100%;display: flex;justify-content: right">
+ <el-button type="primary" icon="Plus" @click="addDevice">添加设备</el-button>
+ </div>
+ </el-col>
+ </el-row>
+ <el-table :data="state.formData.devices" :border="true" style="margin: 20px 0">
+ <el-table-column label="序号" width="60" align="center" type="index"></el-table-column>
+ <el-table-column label="设备名称" header-align="center" class-name="small-padding fixed-width">
+ <template #default="scope">
+ <el-input v-model="scope.row.deviceName" maxlength="30" show-word-limit type="text" size="large"/>
+ </template>
+ </el-table-column>
+ <el-table-column label="开始时间" header-align="center" class-name="small-padding fixed-width">
+ <template #default="scope">
+ <el-date-picker
+ style="width: 100%"
+ v-model="scope.row.startDate"
+ type="date"
+ value-format="YYYY-MM-DD 00:00:00"
+ placeholder="选择日期"
+ size="large"
+ />
+ </template>
+ </el-table-column>
+ <el-table-column label="结束时间" header-align="center" class-name="small-padding fixed-width">
+ <template #default="scope">
+ <el-date-picker
+ style="width: 100%"
+ v-model="scope.row.endDate"
+ type="date"
+ value-format="YYYY-MM-DD 00:00:00"
+ placeholder="选择日期"
+ size="large"
+ />
+ </template>
+ </el-table-column>
+ <el-table-column label="操作" header-align="center" class-name="small-padding fixed-width">
+ <template #default="scope">
+ <el-button link type="danger" @click="delDevice(scope.$index)">删除</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
</el-form>
<experts-list ref="expertsListRef" @getName="getSelected"></experts-list>
</div>
@@ -97,57 +190,85 @@
const state = reactive({
formData: {
- project: {
- id: '',
-
+ projectId: null,
+ auser: {
+ name: ''
},
+ auserId: null,
+ estimateSchedules: [
+ {
+ id: 1,
+ name: '勘验准备',
+ startDate: '',
+ endDate: '',
+ scheduleType: 1
+ },
+ {
+ id: 2,
+ name: '现场勘验',
+ startDate: '',
+ endDate: '',
+ scheduleType: 2
+ },
+ {
+ id: 3,
+ name: '材料分析整理',
+ startDate: '',
+ endDate: '',
+ scheduleType: 3
+ },
+ {
+ id: 4,
+ name: '评价报告编写',
+ startDate: '',
+ endDate: '',
+ scheduleType: 4
+ },
+ {
+ id: 5,
+ name: '整改情况现场确认',
+ startDate: '',
+ endDate: '',
+ scheduleType: 5
+ },
+ {
+ id: 6,
+ name: '整理评价报告',
+ startDate: '',
+ endDate: '',
+ scheduleType: 6
+ },
+ {
+ id: 7,
+ name: '报告审核',
+ startDate: '',
+ endDate: '',
+ scheduleType: 7
+ },
+ {
+ id: 8,
+ name: '报告修改',
+ startDate: '',
+ endDate: '',
+ scheduleType: 8
+ },
+ ],
+ planPersons: [],
+ devices: [],
+ startDate: '',
+ endDate: '',
id: ''
},
rules: {
- "project.name": [{required: true, message: '请填写项目名称', trigger: 'blur'}],
- riskCharacter: [{required: true, message: '请填写行业风险特性', trigger: 'blur'}],
+ "auser.name": [{required: true, message: '请填写机构评价负责人', trigger: 'blur'}],
+ startDate: [{required: true, message: '请选择评价开始时间', trigger: 'blur'}],
+ endDate: [{required: true, message: '请选择评价结束时间', trigger: 'blur'}]
},
- tableData: [
- {
- id: '1',
- content: '勘验准备',
- status: 1
- },
- {
- id: '2',
- content: '现场勘验',
- status: 1
- },
- {
- id: '3',
- content: '材料分析整理',
- status: 1
- },
- {
- id: '4',
- content: '评价报告编写',
- status: 1
- },
- {
- id: '5',
- content: '整改情况现场确认',
- status: 1
- },
- {
- id: '6',
- content: '整理评价报告',
- status: 1
- },
- {
- id: '7',
- content: '报告审核',
- status: 1
- },
- {
- id: '8',
- content: '报告修改',
- status: 1
- },
+ workList: [
+ {value: '报告编制',label: '报告编制'},
+ {value: '文字校对',label: '文字校对'},
+ {value: '现场勘验',label: '现场勘验'},
+ {value: '资料收集整理',label: '资料收集整理'}
]
})
const props = {
@@ -173,12 +294,6 @@
state.formData = res.data;
state.formData.project.business = parseInt(res.data.project.business);
state.formData.project.area = [res.data.project.province,res.data.project.city];
- state.tableData[0].status = res.data.isInBusiness ? 1 : 0;
- state.tableData[1].status = res.data.isSatisfyNeed ? 1 : 0;
- state.tableData[2].status = res.data.isNeedExpert ? 1 : 0;
- state.tableData[3].status = res.data.isFinishReport ? 1 : 0;
- state.tableData[4].status = res.data.isAcceptChargess ? 1 : 0;
- state.tableData[5].status = res.data.isFeasibility ? 1 : 0;
}else {
ElMessage.warning(res.message)
}
@@ -194,12 +309,6 @@
const {id, ...data} = JSON.parse(JSON.stringify(state.formData))
delete data.project.area;
delete data.project.id;
- data.isInBusiness = state.tableData[0].status === 1;
- data.isSatisfyNeed = state.tableData[1].status === 1;
- data.isNeedExpert = state.tableData[2].status === 1;
- data.isFinishReport = state.tableData[3].status === 1;
- data.isAcceptChargess = state.tableData[4].status === 1;
- data.isFeasibility = state.tableData[5].status === 1;
console.log('data', data)
const res = await addRisk(data);
if (res.code == 200) {
@@ -213,12 +322,6 @@
}else if(type === 'clickEdit'){
const { ...data} = JSON.parse(JSON.stringify(state.formData))
delete data.project.area;
- data.isInBusiness = state.tableData[0].status === 1;
- data.isSatisfyNeed = state.tableData[1].status === 1;
- data.isNeedExpert = state.tableData[2].status === 1;
- data.isFinishReport = state.tableData[3].status === 1;
- data.isAcceptChargess = state.tableData[4].status === 1;
- data.isFeasibility = state.tableData[5].status === 1;
console.log('data', data)
const res = await editRisk(data);
if (res.code == 200) {
@@ -239,11 +342,40 @@
const getSelected = (type,obj)=>{
if(type == '项目负责人'){
- state.formData.project.leader = obj.name
+ state.formData.auser.name = obj.name
+ state.formData.auserId = obj.id
+ }else{
+ let member = {
+ person: {
+ name: obj.name,
+ certificateNo: obj.certificateNo?obj.certificateNo:'',
+ major: obj.speciality,
+ },
+ informed: 0,
+ work: '',
+ laterPromise: 0,
+ reason: ''
+ }
+ state.formData.planPersons.push(member)
}
- if(type == '任务下达人'){
- state.formData.deliver = obj.name
+}
+
+const delMember = (index)=>{
+ state.formData.planPersons.splice(index,1)
+}
+
+const addDevice = ()=>{
+ let device = {
+ projectId: null,
+ deviceName: '',
+ startDate: '',
+ endDate: ''
}
+ state.formData.devices.push(device)
+}
+
+const delDevice = (index)=>{
+ state.formData.devices.splice(index,1)
}
defineExpose({
diff --git a/src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue b/src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue
index ce56b11..d468496 100644
--- a/src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue
+++ b/src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue
@@ -3,9 +3,9 @@
<el-form ref="formRef" :model="state.formData" :rules="state.rules" class="register-form" label-position="top">
<el-row :gutter="30">
<el-col :span="6">
- <el-form-item prop="project.leader" label="项目负责人">
+ <el-form-item prop="leader.name" label="项目负责人">
<el-input
- v-model="state.formData.project.leader"
+ v-model="state.formData.leader.name"
size="large"
placeholder="请选择项目负责人"
>
@@ -16,9 +16,9 @@
</el-form-item>
</el-col>
<el-col :span="6">
- <el-form-item prop="project.contactor" label="联系人">
+ <el-form-item prop="linkMan" label="联系人">
<el-input
- v-model="state.formData.project.contactor"
+ v-model="state.formData.linkMan"
size="large"
placeholder="请选择联系人"
>
@@ -26,9 +26,9 @@
</el-form-item>
</el-col>
<el-col :span="6">
- <el-form-item prop="project.phone" label="联系电话">
+ <el-form-item prop="linkPhone" label="联系电话">
<el-input
- v-model="state.formData.project.phone"
+ v-model="state.formData.linkPhone"
size="large"
placeholder="请选择联系电话"
>
@@ -38,7 +38,7 @@
<el-col :span="6">
<el-form-item label="传真">
<el-input
- v-model="state.formData.project.fax"
+ v-model="state.formData.fax"
size="large"
placeholder="请选择传真"
>
@@ -48,9 +48,9 @@
</el-row>
<el-row :gutter="30">
<el-col :span="6">
- <el-form-item prop="deliver" label="任务下达人">
+ <el-form-item label="任务下达人">
<el-input
- v-model="state.formData.deliver"
+ v-model="state.formData.transmitPerson"
size="large"
placeholder="请选择任务下达人"
>
@@ -61,10 +61,10 @@
</el-form-item>
</el-col>
<el-col :span="6">
- <el-form-item prop="deliverDate" label="任务下达时间">
+ <el-form-item prop="transmitDate" label="任务下达时间">
<el-date-picker
style="width: 100%"
- v-model="state.formData.deliverDate"
+ v-model="state.formData.transmitDate"
type="date"
value-format="YYYY-MM-DD 00:00:00"
placeholder="选择日期"
@@ -90,56 +90,20 @@
const state = reactive({
formData: {
id: '',
- deliver: '',
- deliverDate: '',
- project: {
- id: '',
- leader: '',
- contactor: '',
- phone: ''
- }
+ leader: {
+ name: ''
+ },
+ leaderId: null,
+ linkMan: '',
+ transmitPerson: '',
+ transmitDate: ''
},
rules: {
- "project.leader": [{required: true, message: '请选择项目负责人', trigger: 'blur'}],
- "project.contactor": [{required: true, message: '请输入联系人', trigger: 'blur'}],
- "project.phone": [{required: true, message: '请输入联系电话', trigger: 'blur'}],
- deliverDate: [{required: true, message: '请选择任务下达时间', trigger: 'blur'}]
- },
- estimateTypeList: [],
- addressList: [],
- businessList: [],
- tableData: [
- {
- id: '1',
- content: '评价项目是否在本机构资质业务范围内',
- status: 1
- },
- {
- id: '2',
- content: '评价人员专业构成是否满足评价项目需要',
- status: 1
- },
- {
- id: '3',
- content: '是否需要聘请相关专业的技术专家',
- status: 1
- },
- {
- id: '4',
- content: '是否能在约定的时间内完成评价报告',
- status: 1
- },
- {
- id: '5',
- content: '评价费用是否在本机构所接受的范围内',
- status: 1
- },
- {
- id: '6',
- content: '项目的可行性(风险分析结论)',
- status: 1
- },
- ]
+ "leader.name": [{required: true, message: '请选择项目负责人', trigger: 'blur'}],
+ linkMan: [{required: true, message: '请输入联系人', trigger: 'blur'}],
+ linkPhone: [{required: true, message: '请输入联系电话', trigger: 'blur'}],
+ transmitDate: [{required: true, message: '请选择任务下达时间', trigger: 'blur'}]
+ }
})
const props = {
expandTrigger: 'hover',
@@ -157,19 +121,10 @@
})
const riskOpen = async (type,val) => {
- console.log("type",type,val)
if(type === 'detail' || type === 'edit' ){
const res = await getRiskDetail({projectId: val});
if(res.code == 200){
state.formData = res.data;
- state.formData.project.business = parseInt(res.data.project.business);
- state.formData.project.area = [res.data.project.province,res.data.project.city];
- state.tableData[0].status = res.data.isInBusiness ? 1 : 0;
- state.tableData[1].status = res.data.isSatisfyNeed ? 1 : 0;
- state.tableData[2].status = res.data.isNeedExpert ? 1 : 0;
- state.tableData[3].status = res.data.isFinishReport ? 1 : 0;
- state.tableData[4].status = res.data.isAcceptChargess ? 1 : 0;
- state.tableData[5].status = res.data.isFeasibility ? 1 : 0;
}else {
ElMessage.warning(res.message)
}
@@ -183,15 +138,6 @@
}
if(type === 'add'){
const {id, ...data} = JSON.parse(JSON.stringify(state.formData))
- delete data.project.area;
- delete data.project.id;
- data.isInBusiness = state.tableData[0].status === 1;
- data.isSatisfyNeed = state.tableData[1].status === 1;
- data.isNeedExpert = state.tableData[2].status === 1;
- data.isFinishReport = state.tableData[3].status === 1;
- data.isAcceptChargess = state.tableData[4].status === 1;
- data.isFeasibility = state.tableData[5].status === 1;
- console.log('data', data)
const res = await addRisk(data);
if (res.code == 200) {
ElMessage.success('保存成功')
@@ -203,13 +149,6 @@
}
}else if(type === 'clickEdit'){
const { ...data} = JSON.parse(JSON.stringify(state.formData))
- delete data.project.area;
- data.isInBusiness = state.tableData[0].status === 1;
- data.isSatisfyNeed = state.tableData[1].status === 1;
- data.isNeedExpert = state.tableData[2].status === 1;
- data.isFinishReport = state.tableData[3].status === 1;
- data.isAcceptChargess = state.tableData[4].status === 1;
- data.isFeasibility = state.tableData[5].status === 1;
const res = await editRisk(data);
if (res.code == 200) {
ElMessage.success('变更成功')
@@ -229,10 +168,11 @@
const getSelected = (type,obj)=>{
if(type == '项目负责人'){
- state.formData.project.leader = obj.name
+ state.formData.leader.name = obj.name
+ state.formData.leaderId = obj.id
}
if(type == '任务下达人'){
- state.formData.deliver = obj.name
+ state.formData.transmitPerson = obj.name
}
}
diff --git a/src/views/safetyReview/projectManage/components/expertsList.vue b/src/views/safetyReview/projectManage/components/expertsList.vue
index e08a46a..fbe7987 100644
--- a/src/views/safetyReview/projectManage/components/expertsList.vue
+++ b/src/views/safetyReview/projectManage/components/expertsList.vue
@@ -4,69 +4,146 @@
v-model="dialogVisible"
:title="title"
width="60%"
- :before-close="handleClose"
>
- <el-form :model="state.queryParams" ref="queryForm" :inline="true" v-show="state.showSearch" label-width="90px">
+ <el-form :model="queryParams" :inline="true" label-width="90px">
<el-form-item label="专业类别">
- <el-cascader
- clearable
- v-model="state.classiFy"
- :options="state.expertTypes"
- :props="{ expandTrigger: 'hover', value: 'id',label: 'classifyName'}"
- @change="handleChange"></el-cascader>
+ <el-radio-group v-model="queryParams.expertType">
+ <el-radio-button label="">全部</el-radio-button>
+ <el-radio-button label="1">安全评价</el-radio-button>
+ <el-radio-button label="2">检验检测</el-radio-button>
+ </el-radio-group>
</el-form-item>
- <el-form-item label="在岗情况" prop="dutyStatus">
- <el-select v-model="state.queryParams.dutyStatus" placeholder="岗位状态" clearable>
- <el-option :key="0" label="在岗" :value="0"/>
- <el-option :key="1" label="退休" :value="1"/>
- </el-select>
- </el-form-item>
- <el-form-item label="时间范围" prop="searchTime">
- <el-date-picker
- v-model="state.searchTime"
- type="daterange"
- @change="changeTime"
- range-separator="至"
- start-placeholder="开始日期"
- end-placeholder="结束日期"
- value-format="YYYY-MM-DD"
+ <el-form-item label="姓名">
+ <el-input
+ v-model="queryParams.name"
+ placeholder="姓名"
+ style="width: 250px"
/>
</el-form-item>
+ <el-form-item label="手机号">
+ <el-input
+ v-model="queryParams.phone"
+ placeholder="手机号"
+ style="width: 250px"
+ />
+ </el-form-item>
+ <el-form-item label="评价师等级">
+ <el-select v-model="queryParams.level" style="width: 250px" placeholder="评价师等级" >
+ <el-option
+ v-for="item in levelList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.name"
+ />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="专业方向">
+ <el-select v-model="queryParams.major" value-key="id" style="width: 250px" placeholder="专业方向">
+ <el-option
+ v-for="item in majorList"
+ :key="item.id"
+ :label="item.label"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="专业方向">
+ <el-select v-model="queryParams.post" style="width: 250px" placeholder="请选择职务">
+ <el-option
+ v-for="item in postList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.name"
+ />
+ </el-select>
+ </el-form-item>
<el-form-item>
- <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
- <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+ <el-button type="primary" icon="Search" @click="search">搜索</el-button>
+ <el-button icon="Refresh" @click="research">重置</el-button>
</el-form-item>
</el-form>
- <el-table ref="tableRef" v-loading="loading" :data="state.expertList" :border="true" @select="select" @selection-change="handleSelectionChange">
+ <el-table v-loading="loading" ref="tableRef" :data="dataList" :border="true" @select="select" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
- <el-table-column type="index" width="55" align="center" />
- <el-table-column label="姓名" align="center" prop="name" />
- <el-table-column label="出生日期" align="center" prop="birthday" />
- <el-table-column label="学历" align="center" prop="degree" />
- <el-table-column label="职称" align="center" prop="title"/>
- <el-table-column label="专业" align="center" prop="speciality" />
- <el-table-column label="推荐类别组别" align="center">
+ <el-table-column label="用户ID" prop="id" align="center" />
+ <el-table-column label="姓名" prop="name" align="center" width="110" />
+ <el-table-column label="手机号" prop="phone" align="center" width="125" />
+ <el-table-column label="用户名" prop="username" align="center" width="110" />
+ <el-table-column label="性别" prop="sex" align="center" >
<template #default="scope">
- {{findNodeById(state.expertTypes,scope.row.bigClassify)}}/{{findNodeById(state.expertTypes,scope.row.smallClassify)}}
+ <span v-if="scope.row.sex === 0">男</span>
+ <span v-if="scope.row.sex === 1">女</span>
</template>
</el-table-column>
- <el-table-column label="联系电话" align="center" prop="phone"/>
- <el-table-column label="申请时间" align="center" prop="createTime">
+ <el-table-column label="所属机构" prop="agency.name" align="center" width="110" />
+ <el-table-column label="社保" prop="socialSecurity" align="center" width="120">
<template #default="scope">
- {{scope.row.createTime?scope.row.createTime.substring(0,10):''}}
+ <div class="demo-image__preview" v-if="scope.row.socialAttach && scope.row.socialAttach.length>0">
+ <el-image
+ style="width: 100px; height: 100px"
+ :src= "scope.row.socialAttach[0]"
+ :zoom-rate="1.2"
+ :max-scale="7"
+ :min-scale="0.2"
+ :preview-src-list="scope.row.socialAttach"
+ :initial-index="0"
+ fit="cover"
+ preview-teleported="true"
+ />
+ </div>
</template>
</el-table-column>
+ <el-table-column label="医保" prop="medicalInsurance" align="center" width="120">
+ <template #default="scope">
+ <div class="demo-image__preview" v-if="scope.row.medicalAttach && scope.row.medicalAttach.length>0">
+ <el-image
+ style="width: 100px; height: 100px"
+ :src="scope.row.medicalAttach[0]"
+ :zoom-rate="1.2"
+ :max-scale="7"
+ :min-scale="0.2"
+ :preview-src-list="scope.row.medicalAttach"
+ :initial-index="0"
+ fit="cover"
+ preview-teleported="true"
+ />
+ </div>
+ </template>
+ </el-table-column>
+ <el-table-column label="工资清单" prop="salaryList" align="center" width="120">
+ <template #default="scope">
+ <div class="demo-image__preview" v-if="scope.row.salaryAttach && scope.row.salaryAttach.length>0">
+ <el-image
+ style="width: 100px; height: 100px"
+ :src= "scope.row.salaryAttach[0]"
+ :zoom-rate="1.2"
+ :max-scale="7"
+ :min-scale="0.2"
+ :preview-src-list="scope.row.salaryAttach"
+ :initial-index="0"
+ fit="cover"
+ preview-teleported="true"
+ />
+ </div>
+ </template>
+ </el-table-column>
+ <el-table-column label="职务" prop="post" align="center" width="120" />
+ <el-table-column label="职称" prop="jobTitle" align="center" />
+ <el-table-column label="专业方向" prop="majorNames" align="center" width="100" />
+ <el-table-column label="评价师等级" prop="level" align="center" width="100" />
+ <el-table-column label="业绩汇总" prop="summary" align="center" />
+ <el-table-column label="最近评价时间" prop="lastTime" align="center" width="120" />
</el-table>
+
<pagination
- v-show="state.total > 0"
- :total="state.total"
- v-model:page="state.queryParams.pageNum"
- v-model:limit="state.queryParams.pageSize"
+ v-show="total > 0"
+ :total="total"
+ v-model:page="queryParams.pageNum"
+ v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<template #footer>
<span class="dialog-footer">
- <el-button @click="handleClose" size="default">取 消</el-button>
+ <el-button @click="dialogVisible = false" size="default">取 消</el-button>
<el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button>
</span>
</template>
@@ -74,84 +151,120 @@
</div>
</template>
<script setup>
-import {defineEmits, reactive, ref, toRefs} from 'vue'
-import Editor from "@/components/Editor/index.vue";
-import {ElMessage} from "element-plus";
-import {addArea, editArea, getArea} from "@/api/backManage/area";
-import {getExpertsList, getExpertTypes} from "../../../../api/form";
-
-const dialogVisible = ref(false)
-const title = ref("")
-const loading = ref(false)
-const tableRef = ref()
-const emit = defineEmits([""]);
-const state = reactive({
- showSearch: true,
- total: 0,
- expertTypes: [],
- expertList: [],
+import {getCurrentInstance, onMounted, reactive, ref, toRefs,defineEmits} from "vue";
+import {getDictList} from "@/api/backManage/evaluate";
+import {ElMessage, ElMessageBox} from "element-plus";
+import Cookies from "js-cookie";
+import {delMonitor, getExpertList, getMonitorList} from "@/api/sysUsers";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const emit = defineEmits(['getName'])
+const data = reactive({
queryParams: {
pageNum: 1,
pageSize: 10,
- state: 2,
- bigClassify: null,
- smallClassify: null,
- dutyStatus: null,
- params: {
- startTime: '',
- endTime: ''
- }
+ expertType: "",
+ name: '',
+ phone: '',
+ level: '',
+ major: null,
+ post: ''
},
- classiFy: [],
- searchTime: [],
+ total: 0,
+ dataList: [],
+ majorList: [],
+ levelList: [
+ {
+ id: '1',
+ name: '一级'
+ },
+ {
+ id: '2',
+ name: '二级'
+ },
+ {
+ id: '3',
+ name: '三级'
+ },
+ {
+ id: '4',
+ name: '其他'
+ },
+ ],
+ postList: [
+ {
+ id: '1',
+ name: '法人'
+ },
+ {
+ id: '2',
+ name: '过程控制负责人'
+ },
+ {
+ id: '3',
+ name: '机构负责人'
+ },
+ {
+ id: '4',
+ name: '技术负责人'
+ },
+ {
+ id: '5',
+ name: '员工'
+ },
+ ],
+ dialogVisible: false,
+ title: '',
selected: []
})
+const tableRef = ref()
+const { queryParams, total, dataList, majorList, levelList, postList, dialogVisible,title,selected } = toRefs(data);
const openDialog = (type) => {
- resetQuery()
- getTypes()
- state.selected = []
- title.value = type
- dialogVisible.value = true
+ getMajor()
+ research()
+ data.selected = []
+ data.title = type
+ data.dialogVisible = true
}
const onSubmit = async () => {
- if(state.selected.length>0)
- emit('getName',title.value,state.selected[state.selected.length - 1])
- dialogVisible.value = false
-}
-
-const handleQuery=()=> {
- state.queryParams.pageNum = 1
- if(state.classiFy && state.classiFy.length>0){
- state.queryParams.bigClassify = state.classiFy[0]
- state.queryParams.smallClassify = state.classiFy[1]
- }
- if(state.searchTime && state.searchTime.length>0){
- state.queryParams.params.startTime = state.searchTime[0]
- state.queryParams.params.endTime = state.searchTime[1]
- }
- getList()
+ if(data.selected.length>0)
+ emit('getName',data.title,data.selected[data.selected.length - 1])
+ data.dialogVisible = false
}
const getList = async () => {
- loading.value = true;
- const res = await getExpertsList(state.queryParams)
+ loading.value = true
+ const res = await getExpertList(data.queryParams)
if(res.code == 200){
- state.expertList = res.data.list
- state.total = res.data.total
+ data.dataList = res.data.list.map(item => {
+ return{
+ ...item,
+ socialAttach: item.socialAttach.map(s => { return import.meta.env.VITE_APP_BASE_API + '/' + s.path}),
+ medicalAttach: item.medicalAttach.map(s => { return import.meta.env.VITE_APP_BASE_API + '/' + s.path}),
+ salaryAttach: item.salaryAttach.map(s => { return import.meta.env.VITE_APP_BASE_API + '/' + s.path})
+ }
+ })
+ console.log('RES',data.dataList)
+ data.total = res.data.total
}else{
- ElMessage.warning(res.msg)
+ ElMessage.warning(res.message)
}
- loading.value = false;
+ loading.value = false
}
-const getTypes = async()=> {
- const res = await getExpertTypes()
- if(res.code == 200){
- state.expertTypes = res.data
+const getMajor = async () => {
+ const queryParams = {
+ pageNum: 1,
+ pageSize: 50,
+ dictType: 'sys_major_orientation'
+ }
+ const res = await getDictList(queryParams);
+ if(res.code === 200){
+ data.majorList = res.data.list
}else{
- ElMessage.warning(res.msg)
+ ElMessage.warning(res.message)
}
}
@@ -164,58 +277,26 @@
})
const handleSelectionChange = (val) => {
- state.selected = val
+ data.selected = val
}
-const resetQuery=()=> {
- state.queryParams = {
+const search = ()=>{
+ data.queryParams.pageNum = 1
+ getList()
+}
+
+const research = ()=>{
+ data.queryParams = {
pageNum: 1,
pageSize: 10,
- state: 2,
- bigClassify: null,
- smallClassify: null,
- dutyStatus: null,
- params: {
- startTime: '',
- endTime: ''
- }
- };
- state.classiFy = []
- state.searchTime = []
- handleQuery()
-}
-
-const handleChange=(value)=> {
- if(!value){
- data.classiFy = []
- data.queryParams.bigClassify = ""
- data.queryParams.smallClassify = ""
+ expertType: "",
+ name: '',
+ phone: '',
+ level: '',
+ major: null,
+ post: ''
}
-}
-const changeTime=(value)=>{
- if(!value){
- data.queryParams.params.endTime = ""
- data.queryParams.params.startTime = ""
- }
-}
-
-const findNodeById = (data,value)=> {
- for (const node of data) {
- if (node.id === value) {
- return node.classifyName;
- }
- if (node.children) {
- const foundNode = findNodeById(node.children, value);
- if (foundNode) {
- return foundNode;
- }
- }
- }
- return null;
-}
-
-const handleClose = () => {
- dialogVisible.value = false;
+ getList()
}
defineExpose({
diff --git a/src/views/safetyReview/projectManage/components/mapLocation.vue b/src/views/safetyReview/projectManage/components/mapLocation.vue
new file mode 100644
index 0000000..27b8fd2
--- /dev/null
+++ b/src/views/safetyReview/projectManage/components/mapLocation.vue
@@ -0,0 +1,118 @@
+<template>
+ <el-dialog
+ v-model="state.mapLocationVisible"
+ append-to-body
+ :close-on-click-modal="false"
+ width="75%"
+ :title="state.title"
+ >
+ <div class="mapLocation_head">
+ <div>
+ <el-alert
+ title="点击地点获取经纬度信息"
+ type="info"
+ :closable="false"
+ >
+ </el-alert>
+ </div>
+ <div class="mapLocation_latlng">
+ <span>经度:</span>
+ <el-input class="mapLocation_latlng_input" id="lng" v-model="state.longitude"></el-input>
+ </div>
+ <div class="mapLocation_latlng">
+ <span>纬度:</span>
+ <el-input class="mapLocation_latlng_input" id="lat" v-model="state.latitude"></el-input>
+ </div>
+ </div>
+ <div class="mapLocation_body">
+ <baidu-map class="map" ak="BkZdiHBj9aGrMdVFM48r2njNiMzsekga" v="3.0" type="API" :center="state.center" :zoom="15" scroll-wheel-zoom @ready="initMap" @click="getPosition">
+ <bm-marker :position="{lng: state.longitude, lat: state.latitude}" :dragging="true" animation="BMAP_ANIMATION_BOUNCE">
+ <bm-label content="选择地点" :labelStyle="{color: 'red', fontSize : '24px'}" :offset="{width: -35, height: 30}"/>
+ </bm-marker>
+ </baidu-map>
+ </div>
+ <div align="right" style="margin-top: 10px">
+ <el-button @click="state.mapLocationVisible = false">取消</el-button>
+ <el-button type="primary" @click="submitLatLng()">确认</el-button>
+ </div>
+ </el-dialog>
+</template>
+
+<script setup>
+import {ref, onMounted, reactive, toRefs, defineComponent,defineExpose,defineEmits} from 'vue';
+import { BaiduMap,BmMarker } from 'vue-baidu-map-3x'
+const state = reactive({
+ title: '',
+ longitude: '',
+ latitude: '',
+ mapLocationVisible: false,
+ center: {
+ lng: '116.404',
+ lat: '39.915'
+ }
+})
+
+const emit = defineEmits(['giveLatLng'])
+
+onMounted(() => {
+ // ...(mounted钩子中的代码不变)
+});
+const map = reactive({})
+
+const getPosition = ({type, target, point, pixel, overlay})=>{
+ state.longitude = point.lng
+ state.latitude = point.lat
+}
+
+const openMapLocation=(longitude,latitude)=>{
+ state.longitude = longitude
+ state.latitude = latitude
+ state.mapLocationVisible = true
+}
+
+const submitLatLng=()=>{
+ state.mapLocationVisible = false
+ emit('giveLatLng',state.longitude,state.latitude);
+}
+
+const initMap=()=>{
+
+}
+
+defineExpose({
+ openMapLocation
+})
+</script>
+
+<style lang="scss" scoped>
+.map {
+ width: 100%;
+ height: 500px;
+
+ :deep(.BMap_cpyCtrl){
+ display: none!important;
+ visibility: hidden!important;
+ }
+
+ :deep(.anchorBL) {
+ display: none!important;
+ visibility: hidden!important;
+ }
+}
+.mapLocation_head{
+ width:100%;
+ height:100px;
+}
+.mapLocation_body{
+ width:100%;
+ height:500px
+}
+.mapLocation_latlng{
+ padding-top:10px;
+ display:inline-block;
+ margin-right: 20px;
+}
+.mapLocation_latlng_input{
+ width:250px;
+}
+</style>
diff --git a/src/views/safetyReview/projectManage/components/riskAnalysis.vue b/src/views/safetyReview/projectManage/components/riskAnalysis.vue
index cc167a3..ac08f96 100644
--- a/src/views/safetyReview/projectManage/components/riskAnalysis.vue
+++ b/src/views/safetyReview/projectManage/components/riskAnalysis.vue
@@ -195,7 +195,7 @@
size="large"
maxlength="30"
show-word-limit
- placeholder="请输入风险评估人意见"
+ placeholder="风险评估人意见"
>
</el-input>
</el-form-item>
@@ -207,7 +207,7 @@
show-word-limit
v-model="state.formData.agencyOpinon"
size="large"
- placeholder="请输入机构评价负责人意见"
+ placeholder="机构评价负责人意见"
>
</el-input>
</el-form-item>
@@ -408,13 +408,12 @@
data.id = val;
data.project.id = val;
delete data.project.area;
- data.isInBusiness = state.tableData[0].status === 1;
- data.isSatisfyNeed = state.tableData[1].status === 1;
- data.isNeedExpert = state.tableData[2].status === 1;
- data.isFinishReport = state.tableData[3].status === 1;
- data.isAcceptChargess = state.tableData[4].status === 1;
- data.isFeasibility = state.tableData[5].status === 1;
- console.log('data', data)
+ data.isInBusiness = state.tableData[0].status === 1
+ data.isSatisfyNeed = state.tableData[1].status === 1
+ data.isNeedExpert = state.tableData[2].status === 1
+ data.isFinishReport = state.tableData[3].status === 1
+ data.isAcceptChargess = state.tableData[4].status === 1
+ data.isFeasibility = state.tableData[5].status === 1
const res = await editRisk(data);
if (res.code == 200) {
ElMessage.success('变更成功')
diff --git a/src/views/safetyReview/projectManage/components/siteCheckRcd.vue b/src/views/safetyReview/projectManage/components/siteCheckRcd.vue
new file mode 100644
index 0000000..1c0da84
--- /dev/null
+++ b/src/views/safetyReview/projectManage/components/siteCheckRcd.vue
@@ -0,0 +1,179 @@
+<template>
+ <div class="riskBox">
+ <el-form ref="formRef" :model="state.formData" :rules="state.rules" class="register-form" label-position="top">
+ <el-row :gutter="30">
+ <el-col :span="6">
+ <el-form-item prop="investigationDate" label="现场勘验时间">
+ <el-date-picker
+ style="width: 100%"
+ v-model="state.formData.investigationPlanDate"
+ type="date"
+ value-format="YYYY-MM-DD 00:00:00"
+ placeholder="选择日期"
+ size="large"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item prop="investigationDate" label="现场勘验位置">
+ <el-input
+ v-model="state.formData.location"
+ size="large"
+ placeholder="请填写现场勘验位置"
+ >
+ <template #append>
+ <el-button :icon="Search" @click="openLocation"/>
+ </template>
+ </el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="6">
+ <el-form-item prop="isSafetyCheck" label="编制现场安全检查表">
+ <el-radio-group v-model="state.formData.isSafetyCheck" size="large">
+ <el-radio :label="true" size="large">是</el-radio>
+ <el-radio :label="false" size="large">否</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ </el-col>
+ </el-row>
+<!-- <el-row :gutter="30">-->
+<!-- <el-col :span="6">-->
+<!-- <el-form-item label="附件上传">-->
+<!-- <el-upload-->
+<!-- accept="image/*"-->
+<!-- :action="state.uploadUrl"-->
+<!-- :headers="state.header"-->
+<!-- method="post"-->
+<!-- :on-success="(response, file, fileList) => handleAvatarSuccess(response, file, fileList, 1)"-->
+<!-- :on-preview="handlePictureCardPreview"-->
+<!-- v-model:file-list="state.socialList"-->
+<!-- list-type="picture-card"-->
+<!-- :before-upload="picSize"-->
+<!-- :on-remove="(file, file_list)=>{handleRemove(file, file_list, 1)}"-->
+<!-- >-->
+<!-- <el-icon><Plus /></el-icon>-->
+<!-- <template #tip>-->
+<!-- <div class="el-upload__tip">上传jpg/png图片尺寸小于5M</div>-->
+<!-- </template>-->
+<!-- </el-upload>-->
+<!-- </el-form-item>-->
+<!-- </el-col>-->
+<!-- </el-row>-->
+ <el-form-item prop="recordData" label="现场勘验记录">
+ <el-input
+ v-model="state.formData.recordData"
+ :autosize="{ minRows: 6 }"
+ maxlength="200"
+ show-word-limit
+ type="textarea">
+ </el-input>
+ </el-form-item>
+ <el-form-item label="企业陪同照片">
+
+ </el-form-item>
+ </el-form>
+ <map-location ref="mapLocationRef" @giveLatLng="achieveLatLng"></map-location>
+ </div>
+</template>
+<script setup>
+
+import {defineEmits, onMounted, reactive, ref} from "vue"
+import {ElMessage} from "element-plus"
+import {Search} from '@element-plus/icons-vue'
+import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis"
+import Cookies from "js-cookie"
+const emit = defineEmits(["getNextStatus"])
+import MapLocation from "./mapLocation.vue"
+
+const state = reactive({
+ formData: {
+ id: null,
+ projectId: null,
+ investigationDate: '',
+ location: '',
+ isSafetyCheck: null,
+ recordData: ''
+ },
+ planPersons: [],
+ rules: {
+ recordData: [{required: true, message: '请填写现场勘验记录', trigger: 'blur'}]
+ }
+})
+
+const isAmin = ref(false)
+const formRef = ref()
+const mapLocationRef = ref()
+onMounted(() => {
+ const userInfo = JSON.parse(Cookies.get('userInfo'))
+ if(userInfo.identity === 0){
+ isAmin.value = true;
+ }
+});
+
+const riskOpen = async (type,val) => {
+ console.log("type",type,val)
+ if(type === 'detail' || type === 'edit' ){
+ const res = await getRiskDetail({projectId: val});
+ if(res.code == 200){
+ state.formData = res.data;
+ state.formData.project.business = parseInt(res.data.project.business);
+ state.formData.project.area = [res.data.project.province,res.data.project.city];
+ }else {
+ ElMessage.warning(res.message)
+ }
+ }
+ if(type === 'add' || type === 'clickEdit') {
+ const valid = await formRef.value.validate();
+ if(valid){
+ if (isAmin.value) {
+ ElMessage.warning("当前用户暂无权限");
+ return;
+ }
+ if(type === 'add'){
+ const {projectId, ...data} = JSON.parse(JSON.stringify(state.formData))
+ const res = await addRisk(data);
+ if (res.code == 200) {
+ ElMessage.success('保存成功')
+ formRef.value.clearValidate();
+ emit('getNextStatus', res.data);
+
+ } else {
+ ElMessage.warning(res.message)
+ }
+ }else if(type === 'clickEdit'){
+ const { ...data} = JSON.parse(JSON.stringify(state.formData))
+ const res = await editRisk(data);
+ if (res.code == 200) {
+ ElMessage.success('变更成功')
+ formRef.value.clearValidate();
+ // emit('getNextStatus', data.project.id);
+ } else {
+ ElMessage.warning(res.message)
+ }
+ }
+ }
+ }
+}
+
+const openLocation = ()=>{
+ mapLocationRef.value.openMapLocation(state.formData.location.split(',')[0],state.formData.location.split(',')[1])
+}
+
+const achieveLatLng=(lng,lat)=>{
+ state.formData.location = lng + ',' + lat
+}
+
+defineExpose({
+ riskOpen
+});
+
+
+</script>
+<style scoped lang="scss">
+.riskBox{
+ :deep(.el-form .el-form-item__label) {
+ font-size: 15px;
+ }
+}
+
+</style>
diff --git a/src/views/safetyReview/projectManage/process.vue b/src/views/safetyReview/projectManage/process.vue
index e40806e..970b2a2 100644
--- a/src/views/safetyReview/projectManage/process.vue
+++ b/src/views/safetyReview/projectManage/process.vue
@@ -38,10 +38,12 @@
<div class="card-header">{{selectedObj.id}}- {{selectedObj.name}}</div>
<div class="card-content">
<div :style="'height:' + middleContentHeight + 'px'" style="overflow-y: scroll;">
- <rickAnalysis ref="riskRef" v-if="selectedObj.id === 1" @getNextStatus="getNextStatus"></rickAnalysis>
+ <rickAnalysis ref="riskRef" v-if="selectedObj.id === 2" @getNextStatus="getNextStatus"></rickAnalysis>
<contract-manage ref="contractMngRef" v-if="selectedObj.id === 2" @getNextStatus="getNextStatus"></contract-manage>
<evaluate-task-notice ref="evaluteRef" v-if="selectedObj.id === 3" @getNextStatus="getNextStatus"></evaluate-task-notice>
<evaluate-plan ref="evalPlanRef" v-if="selectedObj.id === 4" @getNextStatus="getNextStatus"></evaluate-plan>
+ <employ-notice-record ref="employNoticeRcdRef" v-if="selectedObj.id === 5" @getNextStatus="getNextStatus"></employ-notice-record>
+ <site-check-rcd ref="siteCheckRcdRef" v-if="selectedObj.id === 6" @getNextStatus="getNextStatus"></site-check-rcd>
</div>
<div style="display: flex;align-items: center;justify-content: center;margin-bottom: -20px">
<el-button type="primary" v-if="selectedObj.id !== 1" style="width: 80px" @click="back">上一步</el-button>
@@ -53,7 +55,7 @@
</el-card>
</div>
<div class="bottom">
- <el-button type="primary" v-if="selectedObj.id === 1" plain @click="downloadFile">
+ <el-button type="primary" v-if="selectedObj.id === 3" plain @click="downloadFile">
评价任务通知书<el-icon class="el-icon--right"><Download /></el-icon>
</el-button>
</div>
@@ -74,10 +76,12 @@
import status2Png from "@/assets/images/status2.png"
import itemStatus2Png from "@/assets/images/itemStatus2.png"
import { useRoute } from 'vue-router'
-import {getProjectStatus} from "@/api/projectManage/project";
+import {getProjectStatus} from "@/api/projectManage/project"
import ContractManage from "./components/contractManage";
-import EvaluateTaskNotice from "./components/evaluateTaskNotice";
+import EvaluateTaskNotice from "./components/evaluateTaskNotice"
import EvaluatePlan from "./components/evaluatePlan";
+import EmployNoticeRecord from "./components/employNoticeRecord"
+import SiteCheckRcd from "./components/siteCheckRcd"
const route = useRoute()
const menuList = ref([
@@ -161,8 +165,7 @@
id: 11,
name: '过程控制负责人审核',
status: 0
- },
-
+ }
]
},
{
@@ -191,6 +194,9 @@
const riskRef = ref();
const contractMngRef = ref()
const evaluteRef = ref()
+const evalPlanRef = ref()
+const employNoticeRcdRef = ref()
+const siteCheckRcdRef = ref()
const isShowMenu = ref(false);
const selectedObj = ref({})
const middleHeight = ref(0);
@@ -511,7 +517,6 @@
}
const clickEdit = () => {
-
goRouter(selectedObj.value.id,'clickEdit')
}
const getNextStatus = async (val) => {
diff --git a/src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue b/src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue
index 7ef55dd..4ba643a 100644
--- a/src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue
+++ b/src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue
@@ -54,7 +54,7 @@
<!-- <el-input v-model.trim="state.form.post" :maxlength="11" ></el-input>-->
<el-select v-model="state.form.post" class="m-2" style="width: 100%" placeholder="请选择职务" popper-class="more_select_dropdown" >
<el-option
- v-for="item in state.postList"
+ v-for="item in props.postList"
:key="item.id"
:label="item.name"
:value="item.name"
@@ -73,7 +73,7 @@
<el-form-item label="专业方向:" prop="majorShow" v-if="state.title !== '修改密码'" >
<el-select v-model="state.form.majorShow" value-key="id" class="m-2" style="width: 100%" multiple placeholder="请选择专业方向" popper-class="more_select_dropdown" @change="selectChange">
<el-option
- v-for="item in state.majorList"
+ v-for="item in props.majorList"
:key="item.id"
:label="item.label"
:value="item"
@@ -112,7 +112,7 @@
<el-form-item label="评价师等级:" prop="level" v-if="state.title !== '修改密码'">
<el-select v-model="state.form.level" class="m-2" style="width: 100%" placeholder="请选择评价师等级" popper-class="more_select_dropdown" >
<el-option
- v-for="item in state.levelList"
+ v-for="item in props.levelList"
:key="item.id"
:label="item.name"
:value="item.name"
@@ -196,7 +196,7 @@
</div>
</template>
<script setup>
-import {reactive, ref, toRefs, defineEmits, onMounted, nextTick} from 'vue'
+import {reactive, ref, toRefs, defineEmits, defineProps, onMounted, nextTick} from 'vue'
import { View } from "@element-plus/icons-vue";
import {ElMessage} from "element-plus";
import {verifyPhone, verifyPwd, verifyUsername} from "../../../../../utils/validate";
@@ -207,9 +207,8 @@
import {resetUserPwd} from "../../../../../api/sysUsers";
import {getToken} from "@/utils/auth";
import {getInsitutionList} from "@/api/backManage/insitution";
-import {getDictList} from "@/api/backManage/evaluate";
-
const emit = defineEmits(["getList"]);
+const props = defineProps(['majorList','levelList','postList'])
const dialogVisible = ref(false)
const superRef = ref(null)
@@ -339,53 +338,11 @@
dialogImageUrl: '',
dialogImg: false,
pageNum: 1,
- pageSize: 10,
- postList: [
- {
- id: '1',
- name: '法人'
- },
- {
- id: '2',
- name: '过程控制负责人'
- },
- {
- id: '3',
- name: '机构负责人'
- },
- {
- id: '4',
- name: '技术负责人'
- },
- {
- id: '5',
- name: '员工'
- },
- ],
- majorList: [],
- levelList: [
- {
- id: '1',
- name: '一级'
- },
- {
- id: '2',
- name: '二级'
- },
- {
- id: '3',
- name: '三级'
- },
- {
- id: '4',
- name: '其他'
- },
- ]
+ pageSize: 10
})
onMounted(()=>{
getAgency()
- getMajor()
})
const openDialog = async (type, value) => {
@@ -669,20 +626,6 @@
ElMessage.warning(res.message)
}
}
-const getMajor = async () => {
- const queryParams = {
- pageNum: 1,
- pageSize: 50,
- dictType: 'sys_major_orientation'
- }
- const res = await getDictList(queryParams);
- if(res.code === 200){
- state.majorList = res.data.list
- }else{
- ElMessage.warning(res.message)
- }
-}
-
//触底函数
diff --git a/src/views/safetyReview/userManage/expertUsers/index.vue b/src/views/safetyReview/userManage/expertUsers/index.vue
index ab11d71..96d9db1 100644
--- a/src/views/safetyReview/userManage/expertUsers/index.vue
+++ b/src/views/safetyReview/userManage/expertUsers/index.vue
@@ -8,12 +8,50 @@
@click="openDialog('add',{})"
>新增</el-button>
</div>
- <div style="margin-top: 15px;margin-bottom: 15px;">
- <el-radio-group v-model="queryParams.expertType" @change="changeType">
+ <div style="margin-top: 15px;margin-bottom: 15px">
+ <el-radio-group v-model="queryParams.expertType">
<el-radio-button label="">全部</el-radio-button>
<el-radio-button label="1">安全评价</el-radio-button>
<el-radio-button label="2">检验检测</el-radio-button>
</el-radio-group>
+ </div>
+ <div style="margin-bottom: 15px; display: flex;align-items: center">
+ <el-input
+ v-model="queryParams.name"
+ placeholder="姓名"
+ style="width: 220px;margin-right: 12px"
+ />
+ <el-input
+ v-model="queryParams.phone"
+ placeholder="手机号"
+ style="width: 220px;margin-right: 12px"
+ />
+ <el-select v-model="queryParams.level" style="width: 220px;margin-right: 12px" placeholder="评价师等级" >
+ <el-option
+ v-for="item in levelList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.name"
+ />
+ </el-select>
+ <el-select v-model="queryParams.major" value-key="id" style="width: 220px;margin-right: 12px" placeholder="专业方向">
+ <el-option
+ v-for="item in majorList"
+ :key="item.id"
+ :label="item.label"
+ :value="item.id"
+ />
+ </el-select>
+ <el-select v-model="queryParams.post" style="width: 220px;margin-right: 12px" placeholder="请选择职务">
+ <el-option
+ v-for="item in postList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.name"
+ />
+ </el-select>
+ <el-button type="primary" icon="Filter" @click="search">查询</el-button>
+ <el-button type="primary" icon="Filter" @click="research">重置</el-button>
</div>
<!-- 表格数据 -->
@@ -102,13 +140,14 @@
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
- <expert-dialog ref="expertRef" @getList="getList"></expert-dialog>
+ <expert-dialog ref="expertRef" @getList="getList" :majorList="majorList" :levelList="levelList" :postList="postList"></expert-dialog>
</div>
</template>
<script setup>
import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
import expertDialog from "./components/expertDialog.vue"
+import {getDictList} from "@/api/backManage/evaluate";
import {ElMessage, ElMessageBox} from "element-plus";
import Cookies from "js-cookie";
import {delMonitor, getExpertList, getMonitorList} from "@/api/sysUsers";
@@ -117,19 +156,64 @@
const expertRef = ref();
const data = reactive({
queryParams: {
- pageNum: 1,
- pageSize: 10,
- expertType: ""
+ pageNum: 1,
+ pageSize: 10,
+ expertType: "",
+ name: '',
+ phone: '',
+ level: '',
+ major: null,
+ post: ''
},
total: 0,
- dataList: []
-
-
+ dataList: [],
+ majorList: [],
+ levelList: [
+ {
+ id: '1',
+ name: '一级'
+ },
+ {
+ id: '2',
+ name: '二级'
+ },
+ {
+ id: '3',
+ name: '三级'
+ },
+ {
+ id: '4',
+ name: '其他'
+ },
+ ],
+ postList: [
+ {
+ id: '1',
+ name: '法人'
+ },
+ {
+ id: '2',
+ name: '过程控制负责人'
+ },
+ {
+ id: '3',
+ name: '机构负责人'
+ },
+ {
+ id: '4',
+ name: '技术负责人'
+ },
+ {
+ id: '5',
+ name: '员工'
+ },
+ ]
});
-const { queryParams, total, dataList } = toRefs(data);
+const { queryParams, total, dataList, majorList, levelList, postList } = toRefs(data);
onMounted(()=>{
getList()
+ getMajor()
})
const getList = async () => {
loading.value = true
@@ -151,14 +235,41 @@
loading.value = false
}
+const getMajor = async () => {
+ const queryParams = {
+ pageNum: 1,
+ pageSize: 50,
+ dictType: 'sys_major_orientation'
+ }
+ const res = await getDictList(queryParams);
+ if(res.code === 200){
+ data.majorList = res.data.list
+ }else{
+ ElMessage.warning(res.message)
+ }
+}
+
+const search = ()=>{
+ data.queryParams.pageNum = 1
+ getList()
+}
+
+const research = ()=>{
+ data.queryParams = {
+ pageNum: 1,
+ pageSize: 10,
+ expertType: "",
+ name: '',
+ phone: '',
+ level: '',
+ major: null,
+ post: ''
+ }
+ getList()
+}
+
const openDialog = (type, value) => {
expertRef.value.openDialog(type, value);
-}
-const changeType = (val) => {
- console.log("val", val)
- queryParams.expertType = val;
- queryParams.pageNum = 1;
- getList();
}
/** 重置新增的表单以及其他数据 */
--
Gitblit v1.9.2