From 52f0aa42410a2102a8fa1badfc8e467cae7d6a7c Mon Sep 17 00:00:00 2001
From: zhouwenxuan <1175765986@qq.com>
Date: 星期二, 16 一月 2024 09:19:46 +0800
Subject: [PATCH] 项目管理
---
src/api/projectManage/project.js | 28
src/layout/components/Sidebar/menu.js | 10
src/api/projectManage/riskAnalysis.js | 25
src/views/safetyReview/projectManage/process.vue | 846 +++++++++++++++++++++++++++++
src/router/index.js | 27
src/views/safetyReview/projectManage/index.vue | 318 ++++++++++
src/views/safetyReview/projectManage/components/riskAnalysis.vue | 456 +++++++++++++++
7 files changed, 1,710 insertions(+), 0 deletions(-)
diff --git a/src/api/projectManage/project.js b/src/api/projectManage/project.js
new file mode 100644
index 0000000..3f61973
--- /dev/null
+++ b/src/api/projectManage/project.js
@@ -0,0 +1,28 @@
+import request from '@/utils/request'
+
+export function getProjectList(params) {
+ return request({
+ url: '/manage/project/list',
+ method: 'get',
+ params: params
+
+ })
+}
+
+export function getProjectStatus(data) {
+ return request({
+ url: '/manage/project/progress/' + data,
+ method: 'get'
+
+ })
+}
+
+export function getProjectStatistics() {
+ return request({
+ url: '/manage/project/statistics',
+ method: 'get'
+
+ })
+}
+
+
diff --git a/src/api/projectManage/riskAnalysis.js b/src/api/projectManage/riskAnalysis.js
new file mode 100644
index 0000000..9610ae0
--- /dev/null
+++ b/src/api/projectManage/riskAnalysis.js
@@ -0,0 +1,25 @@
+import request from '@/utils/request'
+
+export function addRisk(data) {
+ return request({
+ url: '/manage/risk-estimate/add',
+ method: 'post',
+ data: data
+ })
+}
+
+export function editRisk(params) {
+ return request({
+ url: `/manage/risk-estimate/edit`,
+ method: 'put',
+ data: params
+ })
+}
+
+export function getRiskDetail(data) {
+ return request({
+ url: '/manage/risk-estimate/getRiskByProjectId',
+ method: 'get',
+ params: data
+ })
+}
diff --git a/src/layout/components/Sidebar/menu.js b/src/layout/components/Sidebar/menu.js
index 7a0d0c2..56f02e5 100644
--- a/src/layout/components/Sidebar/menu.js
+++ b/src/layout/components/Sidebar/menu.js
@@ -2,6 +2,11 @@
const menu = {
adminMenu: [
{
+ path: '/project',
+ name: 'Project',
+ meta: { title: '项目管理',icon: 'form',affix: true }
+ },
+ {
path: '/institution',
name: 'Institution',
meta: { title: '机构公示',icon: 'form',affix: true }
@@ -87,6 +92,11 @@
],
agencyMenu: [
{
+ path: '/project',
+ name: 'Project',
+ meta: { title: '项目管理',icon: 'form',affix: true }
+ },
+ {
path: '/userManage',
redirect: '/userManage/supervise',
meta: { title: '用户管理',icon: 'form'},
diff --git a/src/router/index.js b/src/router/index.js
index e9967eb..782e60a 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -130,6 +130,33 @@
]
},
{
+ path: '/project',
+ component: Layout,
+ redirect: '/project',
+ children: [
+ {
+ path: '/project',
+ component: () => import('@/views/safetyReview/projectManage/index.vue'),
+ name: 'Project',
+ meta: { title: '项目管理',icon: 'form', affix: true }
+ }
+ ]
+ },
+ {
+ path: '/process',
+ component: Layout,
+ redirect: '/process',
+ children: [
+ {
+ path: '/process',
+ component: () => import('@/views/safetyReview/projectManage/process.vue'),
+ name: 'Process',
+ meta: { title: '项目信息管理'}
+ }
+ ]
+ },
+
+ {
path: '/userManage',
component: Layout,
redirect: '/userManage/supervise',
diff --git a/src/views/safetyReview/projectManage/components/riskAnalysis.vue b/src/views/safetyReview/projectManage/components/riskAnalysis.vue
new file mode 100644
index 0000000..da3b0ae
--- /dev/null
+++ b/src/views/safetyReview/projectManage/components/riskAnalysis.vue
@@ -0,0 +1,456 @@
+<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="project.name" label="项目名称">
+ <el-input
+ v-model="state.formData.project.name"
+ size="large"
+ placeholder="请输入项目名称"
+ >
+ </el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="6">
+ <el-form-item prop="project.client" label="委托单位">
+ <el-input
+ v-model="state.formData.project.client"
+ size="large"
+ placeholder="请输入委托单位"
+ >
+ </el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="6">
+ <el-form-item prop="project.creditCode" label="委托单位统一社会信用代码">
+ <el-input
+ v-model="state.formData.project.creditCode"
+ size="large"
+ placeholder="请输入委托单位统一社会信用代码"
+ >
+ </el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="6">
+ <el-form-item prop="project.address" label="详细地址">
+ <el-input
+ maxlength="100"
+ show-word-limit
+ v-model="state.formData.project.address"
+ size="large"
+ placeholder="请输入详细地址"
+ >
+ </el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="6">
+ <el-form-item prop="project.estimateType" label="评价类型">
+ <el-select v-model="state.formData.project.estimateType" class="m-2" size="large" placeholder="请选择" style="width: 100%" >
+ <el-option
+ v-for="item in state.estimateTypeList"
+ :key="item.id"
+ :label="item.label"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="6">
+ <el-form-item prop="project.code" label="项目编号">
+ <el-input
+ v-model="state.formData.project.code"
+ size="large"
+ placeholder="请输入项目编号"
+ >
+ </el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="6">
+ <el-form-item prop="project.invest" label="项目投资金额">
+ <el-input
+ v-model="state.formData.project.invest"
+ size="large"
+ placeholder="请输入项目投资金额"
+ >
+ <template #append>万元</template>
+ </el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="6">
+ <el-form-item prop="project.area" label="所属区域">
+ <el-cascader
+ v-model="state.formData.project.area"
+ :options="state.addressList"
+ :props="props"
+ @change="handleChange"
+ style="width: 100%"
+ size="large"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row el-row :gutter="30">
+ <el-col :span="6">
+ <el-form-item prop="project.business" label="业务范围">
+ <el-select v-model="state.formData.project.business" class="m-2" size="large" placeholder="请选择" style="width: 100%" >
+ <el-option
+ v-for="item in state.businessList"
+ :key="item.id"
+ :label="item.label"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-form-item prop="project.introduction" label="基本概括">
+ <el-input
+ v-model="state.formData.project.introduction"
+ :autosize="{ minRows: 6 }"
+ maxlength="500"
+ show-word-limit
+ type="textarea">
+ </el-input>
+ </el-form-item>
+ <el-form-item prop="riskCharacter" label="行业风险特性">
+ <el-input
+ v-model="state.formData.riskCharacter"
+ :autosize="{ minRows: 6 }"
+ maxlength="500"
+ show-word-limit
+ type="textarea">
+ </el-input>
+ </el-form-item>
+ <el-form-item prop="surroundings" label="周边环境">
+ <el-input
+ v-model="state.formData.surroundings"
+ :autosize="{ minRows: 6 }"
+ maxlength="500"
+ show-word-limit
+ type="textarea">
+ </el-input>
+ </el-form-item>
+ <el-form-item prop="equipment" label="主要生产装置">
+ <el-input
+ v-model="state.formData.equipment"
+ :autosize="{ minRows: 6 }"
+ maxlength="500"
+ show-word-limit
+ type="textarea">
+ </el-input>
+ </el-form-item>
+ <el-form-item prop="technology" label="生产工艺概况">
+ <el-input
+ v-model="state.formData.technology"
+ :autosize="{ minRows: 6 }"
+ maxlength="500"
+ show-word-limit
+ type="textarea">
+ </el-input>
+ </el-form-item>
+ <el-table :data="state.tableData" :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="选择" header-align="center" class-name="small-padding fixed-width" width="175">
+ <template #default="scope">
+ <el-radio-group v-model="scope.row.status" >
+ <el-radio :label="1">{{scope.row.id ==='6' ? '可行': '是'}}</el-radio>
+ <el-radio :label="0">{{scope.row.id ==='6' ? '不可行': '否'}}</el-radio>
+ </el-radio-group>
+ </template>
+ </el-table-column>
+ </el-table>
+ <el-row :gutter="30">
+ <el-col :span="6">
+ <el-form-item prop="estimateDate" label="评估日期">
+ <el-date-picker
+ style="width: 100%"
+ v-model="state.formData.estimateDate"
+ type="date"
+ value-format="YYYY-MM-DD 00:00:00"
+ placeholder="选择日期"
+ size="large"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="6">
+ <el-form-item prop="techOpinion" label="技术负责人意见">
+ <el-input
+ v-model="state.formData.techOpinion"
+ size="large"
+ maxlength="30"
+ show-word-limit
+ placeholder="技术负责人意见"
+ >
+ </el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="6">
+ <el-form-item prop="riskOpinion" label="风险评估人意见">
+ <el-input
+ v-model="state.formData.riskOpinion"
+ size="large"
+ maxlength="30"
+ show-word-limit
+ placeholder="请输入风险评估人意见"
+ >
+ </el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="6">
+ <el-form-item prop="agencyOpinon" label="机构评价负责人意见">
+ <el-input
+ maxlength="30"
+ show-word-limit
+ v-model="state.formData.agencyOpinon"
+ size="large"
+ placeholder="请输入机构评价负责人意见"
+ >
+ </el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ </el-form>
+ </div>
+
+</template>
+<script setup>
+
+import {defineEmits, onMounted, reactive, ref} from "vue";
+import {getDictList} from "@/api/backManage/evaluate";
+import {ElMessage} from "element-plus";
+import {getDict} from "@/api/login";
+import {getRegionTree} from "@/api/area";
+import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis";
+import Cookies from "js-cookie";
+const emit = defineEmits(["getNextStatus"]);
+
+const state = reactive({
+ formData: {
+ project: {
+ id: '',
+ name: '',
+ client: '',
+ creditCode: '',
+ address:'',
+ estimateType: null,
+ code: '',
+ invest: '',
+ area: [],
+ district: '',
+ city: '',
+ province: '',
+ business: '',
+ introduction: '',
+ },
+ id: '',
+ riskCharacter: '',
+ surroundings: '',
+ equipment: '',
+ technology: '',
+ isInBusiness: true,
+ isSatisfyNeed: true,
+ isNeedExpert: true,
+ isFinishReport: true,
+ isAcceptChargess: true,
+ isFeasibility: true,
+ estimateDate: '',
+ techOpinion: '',
+ riskOpinion: '',
+ agencyOpinon: ''
+ },
+ rules: {
+ "project.name": [{required: true, message: '请填写项目名称', trigger: 'blur'}],
+ "project.client": [{required: true, message: '请填写委托单位', trigger: 'blur'}],
+ "project.creditCode": [{required: true, message: '请填写委托单位统一社会信用代码', trigger: 'blur'}],
+ "project.estimateType": [{required: true, message: '请选择评价类型', trigger: 'blur'}],
+ "project.address": [{required: true, message: '请填写详细地址', trigger: 'blur'}],
+ "project.invest": [{required: true, message: '请填写投资金额', trigger: 'blur'}],
+ "project.area": [{required: true, message: '请选择所属区域', trigger: 'blur'}],
+ "project.business": [{required: true, message: '请选择业务范围', trigger: 'blur'}],
+ "project.introduction": [{required: true, message: '请填写基本概况', trigger: 'blur'}],
+ riskCharacter: [{required: true, message: '请填写行业风险特性', trigger: 'blur'}],
+ surroundings: [{required: true, message: '请填写周边环境', trigger: 'blur'}],
+ estimateDate: [{required: true, message: '请选择评估日期', trigger: 'blur'}],
+ techOpinion: [{required: true, message: '请填写技术负责人意见', trigger: 'blur'}],
+ riskOpinion: [{required: true, message: '请填写风险评估人意见', trigger: 'blur'}],
+ agencyOpinon: [{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
+ },
+ ]
+})
+const props = {
+ expandTrigger: 'hover',
+ value: 'name',
+ label: 'name'
+}
+const isAmin = ref(false)
+const formRef = ref();
+onMounted(() => {
+ const userInfo = JSON.parse(Cookies.get('userInfo'))
+ if(userInfo.identity === 0){
+ isAmin.value = true;
+ }
+ getRiskList();
+ getBusinessList();
+ getArea();
+});
+
+const getRiskList = async () => {
+ const res = await getDictList({dictType: "sys_assess_type"});
+ if(res.code === 200){
+ state.estimateTypeList = res.data.list
+ }else{
+ ElMessage.warning(res.message)
+ }
+}
+const getBusinessList = async () => {
+ const res = await getDict({dictType: 'sys_business_scope'})
+ if(res.code === 200){
+ state.businessList = res.data
+ }else{
+ ElMessage.warning(res.message)
+ }
+}
+const getArea = async ()=>{
+ const type = 1
+ const res = await getRegionTree({name: '',parentId: null,regionType: type})
+ if(res.code == 200){
+ state.addressList = res.data
+ }else{
+ ElMessage.warning(res.message)
+ }
+}
+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)
+ }
+ }
+ if(type === 'add' || type === 'clickEdit') {
+ const valid = await formRef.value.validate();
+ if(valid){
+ if (isAmin.value) {
+ ElMessage.warning("当前用户暂无权限");
+ return;
+ }
+ 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('保存成功')
+ formRef.value.clearValidate();
+ emit('getNextStatus', res.data);
+
+ } else {
+ ElMessage.warning(res.message)
+ }
+ }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) {
+ ElMessage.success('变更成功')
+ formRef.value.clearValidate();
+ // emit('getNextStatus', data.project.id);
+ } else {
+ ElMessage.warning(res.message)
+ }
+ }
+ }
+ }
+}
+
+const handleChange = (value) => {
+ // if(state.registerForm.agency.attribute == 0){
+ // state.registerForm.agency.province = '新疆维吾尔自治区'
+ // state.registerForm.agency.city = value[0]?value[0]:''
+ // state.registerForm.agency.district = value[1]?value[1]:''
+ // }else{
+ state.formData.project.province = value[0]?value[0]:''
+ state.formData.project.city = value[1]?value[1]:''
+ state.formData.project.district = value[2]?value[2]:''
+ // }
+}
+
+
+
+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/index.vue b/src/views/safetyReview/projectManage/index.vue
new file mode 100644
index 0000000..2127984
--- /dev/null
+++ b/src/views/safetyReview/projectManage/index.vue
@@ -0,0 +1,318 @@
+<template>
+ <div class="project-container">
+ <div class="header">
+ <el-button type="success" icon="Plus" @click="toProcess('add',{})">新增</el-button>
+ <el-button type="warning" >导出</el-button>
+ <el-button type="primary" icon="Filter">筛选</el-button>
+ </div>
+ <div class="middle">
+ <div class="card-box">
+ <div class="box-left" @click="choose('')">
+ <class class="font-left">
+ <div>项目</div>
+ <div>总数</div>
+ </class>
+ <class class="font-right">{{search.num.projectTotal}}</class>
+ </div>
+ <div class="box-right">
+ <div class="inbox" @click="choose(1)" style="box-shadow: rgba(132, 122, 253, 0.2) 0 3px 5px 0;" :class="{btn1: chooseType === 1}">
+ <div class="top" style="background: linear-gradient(90deg, rgb(127, 118, 253), rgb(218, 180, 246));">
+ <span class="top-right-font">风险分析及计划评价</span>
+ </div>
+ <div class="bottom">
+ <span class="top-right-font-bottom">{{search.num.riskTotal}}</span>
+ </div>
+ </div>
+ <div class="inbox" @click="choose(2)" style="box-shadow: rgba(255, 142, 139, 0.15) 0 3px 5px 0;" :class="{btn2: chooseType === 2}">
+ <div class="top" style="background: linear-gradient(90deg, rgb(255, 140, 138), rgb(239, 186, 141));">
+ <span class="top-right-font">现场勘验</span>
+ </div>
+ <div class="bottom">
+ <span class="top-right-font-bottom">{{search.num.investigationTotal}}</span>
+ </div>
+ </div>
+ <div class="inbox" @click="choose(3)" style="box-shadow: rgba(222, 106, 169, 0.15) 0 3px 5px 0;" :class="{btn3: chooseType === 3}">
+ <div class="top" style="background: linear-gradient(90deg, rgb(229, 119, 180), rgb(249, 159, 192));">
+ <span class="top-right-font">项目审核</span>
+ </div>
+ <div class="bottom">
+ <span class="top-right-font-bottom">{{search.num.reviewTotal}}</span>
+ </div>
+ </div>
+ <div class="inbox" @click="choose(4)" style="box-shadow: rgba(109, 177, 254, 0.2) 0 3px 5px 0;" :class="{btn4: chooseType === 4}">
+ <div class="top" style="background: linear-gradient(90deg, rgb(54, 115, 255), rgb(124, 196, 242));">
+ <span class="top-right-font">出具报告</span>
+ </div>
+ <div class="bottom">
+ <span class="top-right-font-bottom">{{search.num.reportTotal}}</span>
+ </div>
+ </div>
+ <div class="inbox" @click="choose(5)" style="box-shadow: rgba(88, 211, 137, 0.2) 0 3px 5px 0;" :class="{btn5: chooseType === 5}">
+ <div class="top" style="background: linear-gradient(90deg, rgb(0, 195, 151), rgb(114, 232, 200));">
+ <span class="top-right-font">项目归档</span>
+ </div>
+ <div class="bottom">
+ <span class="top-right-font-bottom">{{search.num.archiveTotal}}</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- 表格数据 -->
+ <el-table v-loading="loading" :data="dataList" :border="true" ref="tableRef" :height="tableHeight" style="width: 100%;">
+ <el-table-column label="序号" width="80" align="center" type="index" ></el-table-column>
+ <el-table-column label="项目名称" prop="name" align="center" :show-overflow-tooltip="true" width="180" />
+ <el-table-column label="委托单位" prop="client" align="center" :show-overflow-tooltip="true" width="180"/>
+ <el-table-column label="所属地市" prop="updateTime" align="center" width="250">
+ <template #default="scope">
+ {{scope.row.province}}/{{scope.row.city}}
+ </template>
+ </el-table-column>
+ <el-table-column label="评价类型" prop="estimateTypeName" align="center" width="150"/>
+ <el-table-column label="业务范围" prop="businessName" align="center" :show-overflow-tooltip="true" width="150"/>
+ <el-table-column label="项目负责人" prop="" align="center" width="120" :show-overflow-tooltip="true"/>
+ <el-table-column label="项目阶段" prop="" align="center" width="200">
+ <template #default="scope">
+
+ </template>
+ </el-table-column>
+ <el-table-column label="项目实施天数" prop="" align="center" width="150"/>
+ <el-table-column label="项目变更" prop="" align="center" width="120"/>
+ <el-table-column label="预估金额(万元)" prop="" align="center" width="130"/>
+ <el-table-column label="归档金额(万元)" prop="" align="center" width="130"/>
+ <el-table-column label="缺失要件" prop="" align="center" width="150"/>
+ <el-table-column label="归档确认" prop="" align="center" width="150"/>
+ <el-table-column fixed="right" label="操作" align="center" class-name="small-padding fixed-width" width="180">
+ <template #default="scope">
+ <el-button link type="primary" @click="toProcess('view',scope.row)">查看</el-button>
+ <el-button link type="primary" @click="toProcess('edit',scope.row)">编辑</el-button>
+ <el-button link type="danger">删除</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <div class="pag-container">
+ <el-pagination
+ v-model:current-page="search.queryParams.pageNum"
+ v-model:page-size="search.queryParams.pageSize"
+ :page-sizes="[10,15,20,25]"
+ layout="total, sizes, prev, pager, next, jumper"
+ :total="total"
+ @size-change="handleSizeChange"
+ @current-change="handleCurrentChange"
+ />
+ </div>
+ </div>
+
+</template>
+
+<script setup>
+import {onMounted, reactive, ref} from "vue";
+import {getProjectList, getProjectStatistics} from "@/api/projectManage/project";
+import {ElMessage} from "element-plus";
+const router = useRouter();
+
+const loading = ref(false);
+const search = reactive({
+ queryParams: {
+ pageNum: 1,
+ pageSize: 20,
+ params:{
+ projectPhase: '',
+ }
+ },
+ num: {
+ projectTotal: 0,
+ riskTotal: 0,
+ investigationTotal: 0,
+ reviewTotal: 0,
+ reportTotal: 0,
+ archiveTotal: 0
+ }
+});
+const tableRef = ref(null);
+const tableHeight = ref(0);
+const dataList = ref([]);
+const total = ref(0);
+
+onMounted(() => {
+ getList();
+ getStatistics();
+ tableHeight.value = window.innerHeight - tableRef.value.$el.offsetTop - 170;
+ // 监听浏览器高度变化
+ window.onresize = () => {
+ tableHeight.value = window.innerHeight - tableRef.value.$el.offsetTop - 170;
+ };
+
+});
+const chooseType = ref('');
+const choose = (val) => {
+ chooseType.value = val;
+ search.queryParams.params.projectPhase = val;
+ getList();
+}
+const getList = async () => {
+ loading.value = true;
+ console.log(search.queryParams,'search.queryParams')
+ const res = await getProjectList(search.queryParams);
+ if(res.code == 200){
+ dataList.value = res.data.list;
+ total.value = res.data.total
+ loading.value = false;
+ }else{
+ ElMessage.warning(res.message)
+ }
+}
+const getStatistics = async () => {
+ const res = await getProjectStatistics();
+ if(res.code == 200){
+ console.log("res",res)
+ search.num = res.data
+
+ }else{
+ ElMessage.warning(res.message)
+ }
+}
+const handleSizeChange = (val) => {
+ search.queryParams.pageSize = val
+ getList()
+}
+const handleCurrentChange = (val) => {
+ search.queryParams.pageNum = val
+ getList()
+}
+const toProcess = (type,value) => {
+ value.type = type;
+ router.push({ path: '/process', query: {id: value.id, type: type}});
+}
+</script>
+
+<style scoped lang="scss">
+.project-container{
+ .header{
+ margin: 15px 10px;
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+ }
+ .middle{
+ height: 99px;
+ margin-bottom: 20px;
+ }
+ .card-box{
+ margin: 20px;
+ height: 99px;
+ background: #fff;
+ box-shadow: 0 3px 10px 0 rgba(62,62,62,.25);
+ border-radius: 10px;
+ display: flex;
+ .box-left{
+ width: 20%;
+ min-width: 200px;
+ height: 99px;
+ background: #fff;
+ box-shadow: 0 0 5px 0 rgba(62,62,62,.2);
+ border-radius: 10px;
+ display: flex;
+ margin-left: -15px;
+ align-items: center;
+ cursor: pointer;
+ padding-left: 2%;
+ .font-left{
+ width: 40px;
+ height: 40px;
+ font-size: 20px;
+ font-weight: 400;
+ color: #9198ad;
+ line-height: 18px;
+ font-family: fantasy;
+ }
+ .font-right{
+ position: relative;
+ left: 7%;
+ top: -3px;
+ height: 40px;
+ font-size: 36px;
+ font-family: fantasy;
+ font-weight: 400;
+ color: #222733;
+ }
+ }
+ .box-left:hover{
+ border: 1px solid #4378f1
+ }
+ .box-right{
+ width: 80%;
+ height: 99px;
+ border-radius: 10px;
+ margin-left: 15px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ .inbox{
+ width: 19%;
+ height: 76px;
+ background: #fff;
+ border-radius: 5px;
+ cursor: pointer;
+ .top{
+ width: 100%;
+ height: 39px;
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+ .top-right-font{
+ font-size: 16px;
+ color: #fff;
+ line-height: 39px;
+ margin-left: 10px;
+ }
+ }
+ .bottom{
+ height: 37px;
+ .top-right-font-bottom{
+ font-size: 20px;
+ color: #333;
+ line-height: 37px;
+ margin-left: 20px;
+ font-family: fantasy;
+ }
+ }
+ }
+ .inbox:nth-child(1):hover{
+ border: 1px solid #dab4f6;
+ }
+ .inbox:nth-child(2):hover{
+ border: 1px solid #efba8d;
+ }
+ .inbox:nth-child(3):hover{
+ border: 1px solid #f99fc0;
+ }
+ .inbox:nth-child(4):hover{
+ border: 1px solid #7cc4f2;
+ }
+ .inbox:nth-child(5):hover{
+ border: 1px solid #72e8c8;
+ }
+ }
+ }
+ .btn1{
+ border: 1px solid #dab4f6;
+ }
+ .btn2{
+ border: 1px solid #efba8d;
+ }
+ .btn3{
+ border: 1px solid #f99fc0;
+ }
+ .btn4{
+ border: 1px solid #7cc4f2;
+ }
+ .btn5{
+ border: 1px solid #72e8c8;
+ }
+ .pag-container{
+ float: right;
+ margin-top: 20px;
+ }
+}
+</style>
diff --git a/src/views/safetyReview/projectManage/process.vue b/src/views/safetyReview/projectManage/process.vue
new file mode 100644
index 0000000..6c50762
--- /dev/null
+++ b/src/views/safetyReview/projectManage/process.vue
@@ -0,0 +1,846 @@
+<template>
+ <div class="process-container">
+ <div class="flow">
+ <div class="content" :class="{show: isShowMenu}" >
+ <div class="content-middle" @click="clickMenu(true)">
+ <div style="margin-right:20px;height: 85px;display: flex;align-items: center;flex-shrink: 1;">
+ <img :src="projectPng">
+ </div>
+ <div v-for="item in menuList" :key="item.id" style="flex: 1" :class="{choose: item.status === 1 || item.status === 2}">
+ <div class="header-item">
+ <div class="item-content">
+ <img v-if="item.status === 0" :src="status0Png">
+ <img v-else-if="item.status === 1" :src="status1Png">
+ <img v-else :src="status2Png">
+ <span class="text-eclipse" style="margin-left: 5px">{{item.name}}</span>
+ </div>
+ </div>
+ <div v-for="child in item.subMenus" :key="child.id" @click="chooseSubMenu(child,true)">
+ <div class="down-item" :class="{itemActive: child.status === 1 || child.status === 3, itemPrev: child.status === 2}">
+ <div class="item-icon-status0" v-if="child.status === 0">{{child.id}}</div>
+ <div class="item-icon-status0 item-icon-status1" v-else-if="child.status === 1 || (selectedObj.status === 3 && child.id === selectedObj.id)">{{child.id}}</div>
+ <div class="item-icon-status0 item-icon-status2" v-else-if="child.status === 2 "><img :src="itemStatus2Png"></div>
+ <div class="item-icon-status0 item-icon-status4 " v-else-if="nextObj.status === 4 && child.id === nextObj.id">{{child.id}}</div>
+ <div class="text-eclipse" style="margin-right: 15%">{{child.name}}</div>
+ <div v-if="child.status === 1 || (selectedObj.status === 1 && child.id ===selectedObj.id)" class="item-icon-status0 item-icon-status2"><img :src="status1Png"></div>
+ <div v-if="nextObj.status === 4 && child.id === nextObj.id" class="item-icon-status0 item-icon-status4" ><img :src="status1Png"></div>
+ </div>
+ <div></div>
+ </div>
+ </div>
+ </div>
+ <div class="content-bottom" @click="clickMenu(false)"></div>
+ </div>
+ </div>
+
+ <div class="middle" :style="'height:' + middleHeight + 'px'">
+ <el-card>
+ <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>
+
+
+ </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>
+ <el-button type="warning" style="width: 80px" v-if="projectStatus === 'edit' && selectedObj.status !== 1" @click="clickEdit">变更</el-button>
+<!-- <el-button type="warning" style="width: 80px" v-if="selectedObj.status === 1" @click="save">暂存</el-button>-->
+ <el-button type="primary" style="width: 80px" @click="next">下一步</el-button>
+ </div>
+ </div>
+ </el-card>
+ </div>
+ <div class="bottom"></div>
+ </div>
+</template>
+
+<script setup>
+
+import {onMounted, ref} from "vue";
+import {ElMessage} from "element-plus";
+import rickAnalysis from "./components/riskAnalysis.vue"
+import projectPng from "@/assets/images/project.png"
+import status0Png from "@/assets/images/status0.png"
+import status1Png from "@/assets/images/status1.png"
+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";
+
+const route = useRoute()
+const menuList = ref([
+ {
+ id: 'a',
+ name: '风险分析及计划评价',
+ status: 1 ,
+ subMenus: [
+ {
+ id: 1,
+ name: '项目风险分析',
+ status: 1 // 0:未完成,1:选中待完成,2:已完成 ,3:选中已完成,4:未选中待完成
+ },
+ {
+ id: 2,
+ name: '合同管理',
+ status: 0
+ },
+ {
+ id: 3,
+ name: '评价任务通知',
+ status: 0
+ },
+ {
+ id: 4,
+ name: '评价项目计划',
+ status: 0
+ },
+ ]
+ },
+ {
+ id: 'b',
+ name: '现场勘验',
+ status: 0,
+ subMenus: [
+ {
+ id: 5,
+ name: '从业告知',
+ status: 0
+ },
+ {
+ id: 6,
+ name: '现场勘验',
+ status: 0
+ },
+ ]
+ },
+ {
+ id: 'c',
+ name: '项目审核',
+ status: 0,
+ subMenus: [
+ {
+ id: 7,
+ name: '内部审核',
+ status: 0
+ },
+ {
+ id: 8,
+ name: '技术负责人审核',
+ status: 0
+ },
+ {
+ id: 9,
+ name: '审核记录',
+ status: 0
+ },
+ ]
+ },
+ {
+ id: 'd',
+ name: '出具报告',
+ status: 0,
+ subMenus: [
+ {
+ id: 10,
+ name: '评价结论',
+ status: 0
+ },
+ {
+ id: 11,
+ name: '过程控制负责人审核',
+ status: 0
+ },
+
+ ]
+ },
+ {
+ id: 'e',
+ name: '项目归档',
+ status: 0,
+ subMenus: [
+ {
+ id: 12,
+ name: '项目归档',
+ status: 0
+ },
+ {
+ id: 13,
+ name: '签字确认',
+ status: 0
+ },
+ {
+ id: 14,
+ name: '确认完结',
+ status: 0
+ },
+ ]
+ },
+])
+const riskRef = ref();
+const isShowMenu = ref(false);
+const selectedObj = ref({})
+const middleHeight = ref(0);
+const middleContentHeight = ref(0);
+const projectId = ref();
+const projectStatus = ref();
+onMounted(() => {
+ middleHeight.value = window.innerHeight - 250;
+ middleContentHeight.value = window.innerHeight - 385;
+ // 监听浏览器高度变化
+ window.onresize = () => {
+ middleHeight.value = window.innerHeight - 250;
+ middleContentHeight.value = window.innerHeight - 385;
+ };
+ if(route.query.type !== 'add'){
+ projectStatus.value = route.query.type;
+ projectId.value = route.query.id;
+ getStatus(projectId.value);
+ }else {
+ projectStatus.value = route.query.type;
+ selectedObj.value = {
+ id: 1,
+ name: '项目风险分析',
+ status: 1
+ }
+ }
+});
+const nextObj = ref({})
+const setMenuList = (id) => {
+ menuList.value[id].subMenus.forEach(item => {
+ item.status = 2;
+ })
+}
+const getStatus = async (projectId) => {
+ const res = await getProjectStatus(projectId);
+ if(res.code == 200){
+ if(res.data <= 4 ){
+ menuList.value[0].subMenus.forEach(item => {
+ if(item.id <= res.data){
+ item.status = 2
+ }
+ if(item.id === res.data + 1){
+ item.status = 4;
+ nextObj.value = item;
+ }
+ if(item.id === res.data){
+ item.status = 3;
+ selectedObj.value =item;
+ setTimeout(() => {
+ goRouter(selectedObj.value.id)
+ }, 10)
+
+ }
+ })
+ menuList.value[0].status = 1;
+ console.log("menu11",menuList.value)
+ }
+ if(res.data >=4 && res.data <=6){
+ setMenuList(0)
+ if(res.data === 4){
+ menuList.value[0].subMenus[3].status = 3;
+ }
+ menuList.value[1].subMenus.forEach(item => {
+ if(item.id <= res.data) {
+ item.status = 2
+ }
+ if(item.id === res.data + 1){
+ item.status = 4;
+ nextObj.value = item;
+ }
+ if(item.id === res.data){
+ item.status = 3;
+ selectedObj.value =item;
+ setTimeout(() => {
+ goRouter(selectedObj.value.id)
+ }, 10)
+ }
+ })
+ menuList.value[0].status = 2;
+ menuList.value[1].status = 1;
+ console.log("menu22",menuList.value)
+ }
+ if(res.data >= 6 && res.data <= 9){
+ setMenuList(0);
+ setMenuList(1);
+ if(res.data === 6){
+ menuList.value[1].subMenus[1].status = 3;
+ }
+ menuList.value[2].subMenus.forEach(item => {
+ if(item.id <= res.data) {
+ item.status = 2
+ }
+ if(item.id === res.data + 1){
+ item.status = 4;
+ nextObj.value = item;
+ }
+ if(item.id === res.data){
+ item.status = 3;
+ selectedObj.value =item;
+ setTimeout(() => {
+ goRouter(selectedObj.value.id)
+ }, 10)
+ }
+ })
+ menuList.value[0].status = 2;
+ menuList.value[1].status = 2;
+ menuList.value[2].status = 1;
+ }
+ if(res.data >= 9 && res.data <=11){
+ setMenuList(0);
+ setMenuList(1);
+ setMenuList(2);
+ if(res.data === 9){
+ menuList.value[2].subMenus[2].status = 3;
+ }
+ menuList.value[3].subMenus.forEach(item => {
+ if(item.id <= res.data) {
+ item.status = 2
+ }
+ if(item.id === res.data + 1){
+ item.status = 4;
+ nextObj.value = item;
+ }
+ if(item.id === res.data){
+ item.status = 3;
+ selectedObj.value =item;
+ setTimeout(() => {
+ goRouter(selectedObj.value.id)
+ }, 10)
+ }
+ })
+ menuList.value[0].status = 2;
+ menuList.value[1].status = 2;
+ menuList.value[2].status = 2;
+ menuList.value[3].status = 1;
+ }
+ if(res.data >= 11){
+ setMenuList(0);
+ setMenuList(1);
+ setMenuList(2);
+ setMenuList(3);
+ if(res.data === 11){
+ menuList.value[3].subMenus[1].status = 3;
+ }
+ menuList.value[4].subMenus.forEach(item => {
+ if(item.id <= res.data) {
+ item.status = 2
+ }
+ if(item.id === res.data + 1){
+ item.status = 4;
+ nextObj.value = item;
+ }
+ if(item.id === res.data){
+ item.status = 3;
+ selectedObj.value =item;
+ setTimeout(() => {
+ goRouter(selectedObj.value.id)
+ }, 10)
+ }
+ menuList.value[0].status = 2;
+ menuList.value[1].status = 2;
+ menuList.value[2].status = 2;
+ menuList.value[3].status = 2;
+ menuList.value[4].status = 1;
+ if(res.data === 14 && res.data === item.id){
+ item.status = 3;
+ menuList.value[4].status = 2;
+ selectedObj.value =item;
+ }
+ })
+
+ }
+ }else{
+ ElMessage.warning(res.message)
+ }
+}
+
+const clickMenu = (val) => {
+ isShowMenu.value = val;
+}
+const chooseSubMenu = (val,flag) => {
+ if(val.status === 0) {
+ setTimeout(() => {
+ isShowMenu.value = false;
+ ElMessage({
+ type: 'warning',
+ message: '请按顺序操作,未完成步骤无法查看!'
+ });
+ }, 10)
+ }else if(val.status === 1){
+ setTimeout(() => {
+ isShowMenu.value = false;
+ selectedObj.value = val;
+ }, 10)
+ }else if(val.status === 2){
+ setTimeout(() => {
+ isShowMenu.value = false;
+ if((val !== selectedObj.value && nextObj.value === selectedObj.value) || nextObj.value === selectedObj.value){
+ nextObj.value = selectedObj.value;
+ }
+ if(nextObj.value !== val) {
+ selectedObj.value.status = 2
+ }
+
+ selectedObj.value = val;
+ selectedObj.value.status = 3;
+ nextObj.value.status = 4;
+ console.log('selectedObj.valu',selectedObj.value)
+ //跳转
+ }, 10)
+ if(flag){
+ setTimeout(() => {
+ goRouter(selectedObj.value.id)
+ }, 10)
+ }
+
+ }else if (val.status === 3) {
+ setTimeout(() => {
+ isShowMenu.value = false;
+ selectedObj.value = val;
+ //跳转
+ }, 10)
+ }else if (val.status === 4) {
+ setTimeout(() => {
+ isShowMenu.value = false;
+ nextObj.value = selectedObj.value;
+ selectedObj.value = val;
+ selectedObj.value.status = 1;
+ nextObj.value.status = 2;
+ nextObj.value = val;
+ //跳转
+ }, 10)
+ }
+}
+const next = () => {
+ if(selectedObj.value.status === 3){
+ if(selectedObj.value.id + 1 <= 4){
+ nextMenu(0)
+ }else if (selectedObj.value.id+ 1 >4 && selectedObj.value.id+ 1 <= 6){
+ nextMenu(1)
+ }else if (selectedObj.value.id+ 1 >6 && selectedObj.value.id+ 1 <= 9){
+ nextMenu(2)
+ }else if (selectedObj.value.id+ 1 >9 && selectedObj.value.id+ 1 <= 11){
+ nextMenu(3)
+ }else if (selectedObj.value.id+ 1 >11){
+ nextMenu(4)
+ }
+ } else {
+ //下一步——保存
+ goRouter(selectedObj.value.id,'add')
+ // switch (selectedObj.value.id){
+ // case 1:
+ // riskRef.value.riskOpen('add','');
+ // break;
+ // case 2:
+ //
+ // break;
+ // case 3:
+ //
+ // break;
+ // case 4:
+ //
+ // break;
+ // case 5:
+ //
+ // break;
+ // case 6:
+ //
+ // break;
+ // case 7:
+ //
+ // break;
+ // case 8:
+ //
+ // break;
+ // case 9:
+ //
+ // break;
+ // case 10:
+ //
+ // break;
+ // case 11:
+ //
+ // break;
+ // case 12:
+ //
+ // break;
+ // case 13:
+ //
+ // break;
+ // case 14:
+ //
+ // break;
+ // }
+ }
+ setTimeout( () => {
+ goRouter(selectedObj.value.id)
+ }, 100)
+}
+
+const nextMenu = (id) => {
+ menuList.value[id].subMenus.forEach( item => {
+ if(item.id === selectedObj.value.id + 1){
+ chooseSubMenu(item,false);
+ }
+ })
+}
+
+const backMenu = (id) => {
+ menuList.value[id].subMenus.forEach(async item => {
+ if(item.id === selectedObj.value.id - 1){
+ await chooseSubMenu(item,false);
+ console.log("ssssss",selectedObj.value)
+ }
+ })
+}
+
+//上一步——回退(查看详情)
+const back = () => {
+ if(selectedObj.value.id-1 <= 4){
+ backMenu(0)
+ }else if (selectedObj.value.id-1 >4 && selectedObj.value.id-1 <= 6){
+ backMenu(1)
+ }else if (selectedObj.value.id-1 >6 && selectedObj.value.id-1 <= 9){
+ backMenu(2)
+ }else if (selectedObj.value.id-1 >9 && selectedObj.value.id-1 <= 11){
+ backMenu(3)
+ }else if (selectedObj.value.id-1 >11){
+ backMenu(4)
+ }
+ setTimeout( () => {
+ goRouter(selectedObj.value.id)
+ // switch (selectedObj.value.id){
+ // case 1:
+ // if(projectStatus.value === 'view'){
+ // riskRef.value.riskOpen('detail',projectId.value);
+ // }else {
+ // riskRef.value.riskOpen('edit',projectId.value);
+ // }
+ // break;
+ // case 2:
+ //
+ // break;
+ // case 3:
+ //
+ // break;
+ // case 4:
+ //
+ // break;
+ // case 5:
+ //
+ // break;
+ // case 6:
+ //
+ // break;
+ // case 7:
+ //
+ // break;
+ // case 8:
+ //
+ // break;
+ // case 9:
+ //
+ // break;
+ // case 10:
+ //
+ // break;
+ // case 11:
+ //
+ // break;
+ // case 12:
+ //
+ // break;
+ // case 13:
+ //
+ // break;
+ // case 14:
+ //
+ // break;
+ // }
+ }, 100)
+
+}
+const clickEdit = () => {
+ goRouter(selectedObj.value.id,'clickEdit')
+ // switch (selectedObj.value.id){
+ // case 1:
+ // riskRef.value.riskOpen('clickEdit',projectId.value);
+ // break;
+ // case 2:
+ //
+ // break;
+ // case 3:
+ //
+ // break;
+ // case 4:
+ //
+ // break;
+ // case 5:
+ //
+ // break;
+ // case 6:
+ //
+ // break;
+ // case 7:
+ //
+ // break;
+ // case 8:
+ //
+ // break;
+ // case 9:
+ //
+ // break;
+ // case 10:
+ //
+ // break;
+ // case 11:
+ //
+ // break;
+ // case 12:
+ //
+ // break;
+ // case 13:
+ //
+ // break;
+ // case 14:
+ //
+ // break;
+ // }
+}
+const getNextStatus = (val) => {
+ getStatus(val);
+}
+
+const goRouter = (val,type) => {
+ switch (val){
+ case 1:
+ if(type === 'add'){
+ riskRef.value.riskOpen('add','');
+ }else if (type === 'clickEdit'){
+ riskRef.value.riskOpen('clickEdit',projectId.value);
+ }else {
+ if(projectStatus.value === 'view'){
+ riskRef.value.riskOpen('detail',projectId.value);
+ }else {
+ riskRef.value.riskOpen('edit',projectId.value);
+ }
+ }
+ console.log("1")
+ break;
+ case 2:
+ console.log("2")
+ break;
+ case 3:
+ console.log("3")
+ break;
+ case 4:
+ console.log("4")
+ break;
+ case 5:
+ console.log("5")
+ break;
+ case 6:
+ console.log("6")
+ break;
+ case 7:
+ console.log("7")
+ break;
+ case 8:
+ console.log("8")
+ break;
+ case 9:
+ console.log("9")
+ break;
+ case 10:
+ console.log("10")
+ break;
+ case 11:
+ console.log("11")
+ break;
+ case 12:
+ console.log("12")
+ break;
+ case 13:
+ console.log("13")
+ break;
+ case 14:
+ console.log("14")
+ break;
+ }
+}
+
+</script>
+
+<style scoped lang="scss">
+.process-container{
+ height: 100%;
+ .flow{
+ position: relative;
+ height: 85px;
+ background: transparent;
+ .content{
+ z-index: 10;
+ top: 0;
+ left: 0;
+ right: 0;
+ min-height: 85px;
+ max-height: 85px;
+ cursor: pointer;
+ background-color: hsla(0,0%,100%,.97);
+ background-image: url(../../../assets/images/bg.png);
+ background-repeat: no-repeat;
+ background-size: 100% 84px;
+ overflow: hidden;
+ transition: max-height .3s linear;
+ position: absolute;
+ .content-bottom{
+ position: relative;
+ height: 18px;
+ text-align: center;
+ background-color: transparent;
+ pointer-events: none;
+ }
+ .content-bottom:after {
+ content: " ";
+ cursor: pointer;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 50%;
+ pointer-events: auto;
+ transform: translateX(-50%);
+ width: 118px;
+ background-image: url(../../../assets/images/back.png);
+ }
+ .choose .header-item{
+ color: #fff;
+ background-image: url(../../../assets/images/choosed.png);
+ }
+ }
+ .show{
+ cursor: default;
+ max-height: 600px;
+ }
+ .content-middle{
+ padding-left: 37px;
+ padding-right: 27px;
+ display: flex;
+ flex-direction: row;
+ box-shadow: 0 0 18px 3px rgba(145,146,171,.2);
+ }
+ .header-item{
+ position: relative;
+ height: 83px;
+ color: #5d6c8e;
+ flex: 1;
+ margin-left: -2%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ background-image: url(../../../assets/images/header.png);
+ .item-content{
+ width: 80%;
+ padding: 0 20px;
+ display: flex;
+ align-items: center;
+ margin-left: 8%;
+ margin-bottom: 2px;
+ font-size: 20px;
+ font-weight: 400;
+ }
+ }
+ .down-item{
+ height: 47px;
+ margin: 30px auto 10px auto;
+ font-size: 19px;
+ color: #626c8b;
+ border: 1px solid #fff;
+ background: rgba(198,230,255,.2);
+ border-radius: 8px;
+ display: flex;
+ align-items: center;
+ width: 70%;
+ padding-left: 20px;
+ padding-right: 15px;
+ .item-icon-status0{
+ width: 21px;
+ height: 21px;
+ color: #fff;
+ font-size: 16px;
+ line-height: 20px;
+ text-align: center;
+ border-radius: 50%;
+ background: #b9c2d5;
+ margin-right: 10px;
+ }
+ .item-icon-status1{
+ color: #3b75ff;
+ background: #fff;
+ }
+ .item-icon-status2{
+ background: transparent;
+ }
+ .item-icon-status4{
+ background: #0cca8f;
+ }
+ }
+ .itemActive{
+ cursor: pointer;
+ color: #fff;
+ border: 1px solid #c6e6ff;
+ background: linear-gradient(90deg,#57b6ff,#3b75ff);
+ }
+ .itemPrev{
+ cursor: pointer;
+ color: #3b75ff;
+ border: 1px solid #c6e6ff;
+ background: rgba(198,230,255,.4);
+ }
+ .itemPrev:hover{
+ transform: scale(1.1);
+ -webkit-transform: scale(1.1);
+ -moz-transform: scale(1.1);
+ -o-transform: scale(1.1);
+ -ms-transform: scale(1.1);
+ }
+ }
+ .middle{
+ padding: 10px;
+ .card-header{
+ height: 50px;
+ line-height: 26px;
+ font-weight: 700;
+ padding: 12px 56px;
+ font-size: 18px;
+ color: #fff;
+ background-image: url(../../../assets/images/cardHeader.png);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ margin: -20px;
+ }
+ .card-content{
+ padding: 20px 60px;
+ margin-top: 20px;
+ }
+ ::-webkit-scrollbar {
+ display: none;
+ }
+ }
+ .bottom{
+ height: 60px;
+ background: rgb(255, 255, 255);
+ padding: 9px 10px;
+ }
+ .text-eclipse{
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+
+
+}
+
+</style>
--
Gitblit v1.9.2