| | |
| | | { |
| | | path: '/institution', |
| | | name: 'Institution', |
| | | meta: { title: '机构公示',icon: 'form',affix: true } |
| | | meta: { title: '机构公示',icon: 'chart',affix: true } |
| | | }, |
| | | { |
| | | path: '/notice', |
| | | name: 'Notice', |
| | | meta: { title: '公告发布',icon: 'form', affix: true } |
| | | meta: { title: '公告发布',icon: 'email', affix: true } |
| | | }, |
| | | { |
| | | path: '/law', |
| | | name: 'Law', |
| | | meta: { title: '法律法规',icon: 'form', affix: true } |
| | | meta: { title: '法律法规',icon: 'excel', affix: true } |
| | | }, |
| | | { |
| | | path: '/userManage', |
| | | redirect: '/userManage/supervise', |
| | | meta: { title: '用户管理',icon: 'form'}, |
| | | meta: { title: '用户管理',icon: 'peoples'}, |
| | | children: [ |
| | | { |
| | | path: 'supervise', |
| | | name: 'supervise', |
| | | meta: { title: '监管用户管理',icon: 'form'} |
| | | meta: { title: '监管用户管理',icon: 'monitor'} |
| | | }, |
| | | { |
| | | path: 'institutionUser', |
| | | name: 'institutionUser', |
| | | meta: { title: '机构用户管理',icon: 'form'} |
| | | meta: { title: '机构用户管理',icon: 'list'} |
| | | }, |
| | | { |
| | | path: 'expertUsers', |
| | | name: 'expertUsers', |
| | | meta: { title: '专家用户管理',icon: 'form'} |
| | | meta: { title: '专家用户管理',icon: 'logininfor'} |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | path: '/expertManage', |
| | | redirect: '/expertManage/experts', |
| | | meta: { title: '厅专家库管理',icon: 'form'}, |
| | | meta: { title: '厅专家库管理',icon: 'post'}, |
| | | children: [ |
| | | { |
| | | path: 'experts', |
| | | name: 'experts', |
| | | meta: { title: '厅专家库',icon: 'form'} |
| | | meta: { title: '厅专家库',icon: 'server'} |
| | | }, |
| | | { |
| | | path: 'applyRecords', |
| | | name: 'applyRecords', |
| | | meta: { title: '专家申请记录',icon: 'form'} |
| | | meta: { title: '专家申请记录',icon: 'skill'} |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | path: '/baseSet', |
| | | redirect: '/baseSet/evaluate', |
| | | meta: { title: '基础设置',icon: 'form'}, |
| | | meta: { title: '基础设置',icon: 'dict'}, |
| | | children: [ |
| | | { |
| | | path: 'evaluate', |
| | | name: 'evaluate', |
| | | meta: { title: '评价类型管理',icon: 'form'} |
| | | meta: { title: '评价类型管理',icon: 'build'} |
| | | }, |
| | | { |
| | | path: 'expertsType', |
| | | name: 'expertsType', |
| | | meta: { title: '专家类型管理',icon: 'form'} |
| | | meta: { title: '专家类型管理',icon: 'clipboard'} |
| | | }, |
| | | { |
| | | path: 'business', |
| | | name: 'business', |
| | | meta: { title: '业务范围管理',icon: 'form'} |
| | | meta: { title: '业务范围管理',icon: 'cascader'} |
| | | }, |
| | | { |
| | | path: 'area', |
| | | name: 'area', |
| | | meta: { title: '地区维护管理',icon: 'form'} |
| | | meta: { title: '地区维护管理',icon: 'component'} |
| | | }, |
| | | { |
| | | path: 'major', |
| | | name: 'major', |
| | | meta: { title: '专业方向管理',icon: 'form'} |
| | | meta: { title: '专业方向管理',icon: 'documentation'} |
| | | } |
| | | |
| | | ] |
| | |
| | | { |
| | | path: '/userManage', |
| | | redirect: '/userManage/supervise', |
| | | meta: { title: '用户管理',icon: 'form'}, |
| | | meta: { title: '用户管理',icon: 'peoples'}, |
| | | children: [ |
| | | { |
| | | path: 'expertUsers', |
| | | name: 'expertUsers', |
| | | meta: { title: '专家用户管理',icon: 'form'} |
| | | meta: { title: '专家用户管理',icon: 'logininfor'} |
| | | } , |
| | | ] |
| | | }, |
| | |
| | | const sideTheme = computed(() => settingsStore.sideTheme); |
| | | const sidebar = computed(() => useAppStore().sidebar); |
| | | const device = computed(() => useAppStore().device); |
| | | const needTagsView = computed(() => settingsStore.tagsView); |
| | | // const needTagsView = computed(() => settingsStore.tagsView); |
| | | const needTagsView = false; |
| | | const fixedHeader = computed(() => settingsStore.fixedHeader); |
| | | |
| | | const classObj = computed(() => ({ |
| | |
| | | .mobile .fixed-header { |
| | | width: 100%; |
| | | } |
| | | </style> |
| | | </style> |
| | |
| | | <div class="main-content"> |
| | | <div class="top" style="z-index: 1"> |
| | | <div class="top-cont"> |
| | | <div class="logo blueFont">智慧安评</div> |
| | | <div class="logo blueFont">新疆维吾尔自治区智慧安评服务平台</div> |
| | | <div class="time"> |
| | | <div> |
| | | <span>{{state.date}}</span> |
| | |
| | | </div> |
| | | <!-- 底部 --> |
| | | <div class="el-login-footer"> |
| | | <span>Copyright © All Rights Reserved.</span> |
| | | <span>Copyright ©2023-{{nowYear}} All Rights Reserved.</span> |
| | | </div> |
| | | </div> |
| | | </template> |
| | |
| | | const { proxy } = getCurrentInstance() |
| | | const route = useRoute() |
| | | const router = useRouter() |
| | | const nowYear = ref(); |
| | | // 时间格式化 |
| | | const timeForm = { |
| | | hour12: false, |
| | |
| | | const getDateTime = () => { |
| | | const curTime = new Date().toLocaleString('zh', timeForm).replace(/\//g, '-'); |
| | | state.date = curTime.slice(0, 10); |
| | | nowYear.value = curTime.slice(0, 4); |
| | | let week = ['日', '一', '二', '三', '四', '五', '六']; |
| | | let day = new Date().getDay(); |
| | | state.weekDay = '星期' + week[day]; |
| | |
| | | <img :src="loginImgPng"> |
| | | </div> |
| | | <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form"> |
| | | <h3 class="title">智慧安评</h3> |
| | | <h3 class="title">新疆维吾尔自治区智慧安评服务平台</h3> |
| | | <el-form-item prop="username"> |
| | | <el-input |
| | | v-model="loginForm.username" |
| | |
| | | <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-button type="primary" @click="addRectify('add',{})">新增整改</el-button> |
| | | <el-button type="primary" @click="addRectify('add',{})" :disabled="projectType.value ==='detail'">新增整改</el-button> |
| | | </el-col> |
| | | </el-row> |
| | | <el-table :data="state.recitificationList" :border="true" style="margin: 20px 0"> |
| | |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" @click="addRectify('edit',scope.row)">编辑</el-button> |
| | | <el-button link type="danger" @click="del(scope.row)">删除</el-button> |
| | | <el-button link type="primary" @click="addRectify('edit',scope.row)" :disabled="projectType.value ==='detail'">编辑</el-button> |
| | | <el-button link type="danger" @click="del(scope.row)" :disabled="projectType.value ==='detail'">删除</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | |
| | | } |
| | | } |
| | | |
| | | const projectType = ref('') |
| | | const riskOpen = async (type,val) => { |
| | | // await getList(val); |
| | | projectType.value = type; |
| | | state.formData.projectId = val; |
| | | if(type === 'confirm') { |
| | | const res = await doConfirm({projectId: val}); |
| | |
| | | <el-table-column label="未到现场勘验原因" prop="reason" align="center" class-name="small-padding fixed-width"></el-table-column> |
| | | <el-table-column label="是否已告知" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-radio-group v-model="scope.row.informed" size="large" @change="(value)=>changePerson(value,scope.row)"> |
| | | <el-radio-group v-model="scope.row.informed" size="large" @change="(value)=>changePerson(value,scope.row)" :disabled="projectType==='detail'"> |
| | | <el-radio :label="1" size="large">是</el-radio> |
| | | <el-radio :label="0" size="large">否</el-radio> |
| | | </el-radio-group> |
| | |
| | | |
| | | }); |
| | | |
| | | const projectType = ref(''); |
| | | const riskOpen = async (type,val) => { |
| | | state.formData.projectId = val |
| | | state.projectId = val |
| | | projectType.value = type; |
| | | // await getWorksList(val) |
| | | if(type === 'detail' || type === 'edit' ){ |
| | | const res = await getWorkDetail({projectId: val}) |
| | |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <div style="width: 100%;display: flex;justify-content: right"> |
| | | <el-button type="primary" icon="Plus" @click="openWorksDialog('add',{})">添加成员</el-button> |
| | | <el-button type="primary" icon="Plus" @click="openWorksDialog('add',{})" :disabled="projectType==='detail'">添加成员</el-button> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | <el-table-column label="未到现场勘验原因" prop="reason" align="center" class-name="small-padding fixed-width"></el-table-column> |
| | | <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-button link @click="openWorksDialog('edit',scope.row)">修改</el-button> |
| | | <el-button link type="danger" @click="delMember(scope.row)">删除</el-button> |
| | | <el-button link @click="openWorksDialog('edit',scope.row)" :disabled="projectType==='detail'">修改</el-button> |
| | | <el-button link type="danger" @click="delMember(scope.row)" :disabled="projectType==='detail'">删除</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <div style="width: 100%;display: flex;justify-content: right"> |
| | | <el-button type="primary" icon="Plus" @click="openDeviceDialog('add',{})">添加设备</el-button> |
| | | <el-button type="primary" icon="Plus" @click="openDeviceDialog('add',{})" :disabled="projectType==='detail'">添加设备</el-button> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-button link @click="openDeviceDialog('edit',scope.row)">修改</el-button> |
| | | <el-button link type="danger" @click="delDeviceItem(scope.row)">删除</el-button> |
| | | <el-button link @click="openDeviceDialog('edit',scope.row)" :disabled="projectType==='detail'">修改</el-button> |
| | | <el-button link type="danger" @click="delDeviceItem(scope.row)" :disabled="projectType==='detail'">删除</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | |
| | | } |
| | | }) |
| | | |
| | | |
| | | const projectType = ref(''); |
| | | const riskOpen = async (type,val) => { |
| | | state.formData.projectId = val |
| | | state.projectId = val |
| | | projectType.value = type; |
| | | for(let i of state.formData.estimateSchedules){ |
| | | i.projectId = val |
| | | } |
| | |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="专业方向"> |
| | | <el-select v-model="queryParams.major" value-key="id" style="width: 250px" placeholder="专业方向"> |
| | | <el-select v-model="queryParams.major" clearable value-key="id" style="width: 250px" placeholder="专业方向"> |
| | | <el-option |
| | | v-for="item in majorList" |
| | | :key="item.id" |
| | |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="专业方向"> |
| | | <el-select v-model="queryParams.post" style="width: 250px" placeholder="请选择职务"> |
| | | <el-form-item label="职务"> |
| | | <el-select v-model="queryParams.post" clearable style="width: 250px" placeholder="请选择职务"> |
| | | <el-option |
| | | v-for="item in postList" |
| | | :key="item.id" |
| | |
| | | <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-column label="业绩汇总" prop="summary" align="center"> |
| | | <template #default="scope"> |
| | | <div style="cursor:pointer;color: #3b82f6;" @click="openList(scope.row)"> |
| | | <span>{{scope.row.projectCount}}</span> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="最近评价时间" prop="lastEstimateTime" align="center" width="120" /> |
| | | </el-table> |
| | | |
| | | <pagination |
| | |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | | <project-dialog ref="projectRef" @getList="getList"></project-dialog> |
| | | </div> |
| | | </template> |
| | | <script setup> |
| | | import {getCurrentInstance, onMounted, reactive, ref, toRefs,defineEmits} from "vue"; |
| | | import {getDictList} from "@/api/backManage/evaluate"; |
| | | import {ElMessage, ElMessageBox} from "element-plus"; |
| | | import projectDialog from "@/views/safetyReview/userManage/expertUsers/components/projectDialog.vue" |
| | | import Cookies from "js-cookie"; |
| | | import {delMonitor, getExpertList, getMonitorList} from "@/api/sysUsers"; |
| | | const { proxy } = getCurrentInstance(); |
| | |
| | | ...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}) |
| | | salaryAttach: item.salaryAttach.map(s => { return import.meta.env.VITE_APP_BASE_API + '/' + s.path}), |
| | | lastEstimateTime: item.personProjectVO ? item.personProjectVO.lastEstimateTime.slice(0,10) : '', |
| | | projectCount: item.personProjectVO ? item.personProjectVO.projectCount : '' |
| | | } |
| | | }) |
| | | console.log('RES',data.dataList) |
| | |
| | | } |
| | | loading.value = false |
| | | } |
| | | const projectRef = ref(); |
| | | const openList = (val) => { |
| | | projectRef.value.openDialog(val); |
| | | } |
| | | |
| | | const getMajor = async () => { |
| | | const queryParams = { |
| | |
| | | <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> |
| | | <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> |
| | |
| | | } |
| | | } |
| | | .mapLocation_head{ |
| | | width:100%; |
| | | height:100px; |
| | | width:100%; |
| | | height:100px; |
| | | } |
| | | .mapLocation_body{ |
| | | width:100%; |
| | | height:500px |
| | | width:100%; |
| | | height:500px |
| | | } |
| | | .mapLocation_latlng{ |
| | | padding-top:10px; |
| | | display:inline-block; |
| | | margin-right: 20px; |
| | | padding-top:10px; |
| | | display:inline-block; |
| | | margin-right: 20px; |
| | | } |
| | | .mapLocation_latlng_input{ |
| | | width:250px; |
| | | width:250px; |
| | | } |
| | | </style> |
| | |
| | | <template #default="scope"> |
| | | <el-upload accept=".pdf,.doc,.docx" |
| | | :action="state.uploadUrl" |
| | | :disabled="state.disabled" |
| | | :disabled="projectType === 'detail'" |
| | | :headers="state.header" |
| | | method="post" |
| | | :on-success="handleAvatarSuccess" |
| | | :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,scope.row)" |
| | | v-model:file-list="scope.row.fileList" |
| | | :on-remove="handleRemove" |
| | | :data="state.uploadData" |
| | |
| | | ElMessage.warning("当前用户暂无权限"); |
| | | return; |
| | | } |
| | | if(state.actualContract.actualContractMoney == '') { |
| | | |
| | | if(state.actualContract.actualContractMoney == '' || !state.actualContract.actualContractMoney) { |
| | | ElMessage.warning("请输入项目合同额"); |
| | | return; |
| | | } |
| | |
| | | } |
| | | }; |
| | | |
| | | const handleAvatarSuccess = (res, uploadFile) => { |
| | | const handleAvatarSuccess = (res, uploadFile,val) => { |
| | | if(res.code === 200){ |
| | | console.log("if",state.uploadList) |
| | | // ElMessage({ |
| | | // type: 'success', |
| | | // message: '文件上传成功' |
| | | // }) |
| | | ElMessage({ |
| | | type: 'success', |
| | | message: '文件上传成功' |
| | | }) |
| | | }else { |
| | | const delVal = state.uploadList.findIndex(i => i.id === val.id); |
| | | state.uploadList[delVal].fileList.splice(state.uploadList[delVal].fileList.indexOf(uploadFile),1) |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: res.message |
| | |
| | | <el-row :gutter="30"> |
| | | <el-col :span="18"> |
| | | <el-form-item> |
| | | <el-upload accept="image/*,.pdf,.doc,.docx,.xlsx,.xls" |
| | | :action="state.uploadUrl" |
| | | :disabled="state.disabled" |
| | | :headers="state.header" |
| | | method="post" |
| | | :on-success="handleAvatarSuccess" |
| | | :on-exceed="showTip" |
| | | v-model:file-list="state.fileList" |
| | | :on-remove="handleRemove" |
| | | :data="state.uploadData" |
| | | :on-preview="handlePreview" |
| | | :limit='1' |
| | | <el-upload |
| | | v-if="state.formData.isReviseManual === 1" |
| | | accept="image/*,.pdf,.doc,.docx,.xlsx,.xls" |
| | | :action="state.uploadUrl" |
| | | :disabled="state.disabled" |
| | | :headers="state.header" |
| | | method="post" |
| | | :on-success="handleAvatarSuccess" |
| | | :on-exceed="showTip" |
| | | v-model:file-list="state.fileList" |
| | | :on-remove="handleRemove" |
| | | :data="state.uploadData" |
| | | :on-preview="handlePreview" |
| | | :limit='1' |
| | | > |
| | | <el-button type="primary">附件上传</el-button> |
| | | <template #tip> |
| | |
| | | const handleAvatarSuccess = (res) => { |
| | | if(res.code === 200){ |
| | | getProcessFiles() |
| | | console.log("if",state.fileList) |
| | | // ElMessage({ |
| | | // type: 'success', |
| | | // message: '文件上传成功' |
| | | // }) |
| | | ElMessage({ |
| | | type: 'success', |
| | | message: '文件上传成功' |
| | | }) |
| | | }else { |
| | | state.fileList.splice(state.fileList.indexOf(uploadFile),1) |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: '文件上传失败' |
| | | message: res.message |
| | | }) |
| | | } |
| | | |
| | | } |
| | | const handlePreview = (file) => { |
| | | let path = ""; |
| | |
| | | <span>{{ scope.row.planPerson.playRole === 1?'项目负责人': scope.row.planPerson.playRole === 2? |
| | | '项目组成员':scope.row.planPerson.playRole === 3? |
| | | '过程控制负责人':scope.row.planPerson.playRole === 4? |
| | | '机构评价负责人':scope.row.planPerson.playRole === 5?'技术负责人':''}} |
| | | '机构评价负责人':scope.row.planPerson.playRole === 5? |
| | | '技术负责人':scope.row.planPerson.playRole === 6?'内部审核员':''}} |
| | | </span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <el-table-column label="扫脸时间" prop="faceRecord.updateTime" align="center" width="120"/> |
| | | <el-table-column label="是否扫脸" prop="username" align="center"> |
| | | <template #default="scope"> |
| | | <span v-if="scope.row.facePic">是</span> |
| | | <span v-if="scope.row.facePic.length>0">是</span> |
| | | <span v-else>否</span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | commitPic: item.insurancePath ? [import.meta.env.VITE_APP_BASE_API + '/' + item.insurancePath] : [], |
| | | } |
| | | }) |
| | | console.log("res",res) |
| | | console.log("res", state.tableData) |
| | | }else { |
| | | ElMessage.warning(res.message) |
| | | } |
| | |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item prop="isSafetyCheck" label="编制现场安全检查表"> |
| | | <el-radio-group v-model="state.formData.isSafetyCheck" size="large" @change="changeRadio"> |
| | | <el-radio-group v-model="state.formData.isSafetyCheck" size="large" @change="changeRadio" :disabled="projectType==='detail'"> |
| | | <el-radio :label="1" size="large">是</el-radio> |
| | | <el-radio :label="0" size="large">否</el-radio> |
| | | </el-radio-group> |
| | |
| | | <el-row :gutter="30"> |
| | | <el-col :span="24" v-if="state.formData.isSafetyCheck == 1"> |
| | | <el-form-item label="安全检查表上传" prop="assAccessoryFiles"> |
| | | <el-upload accept="image/*,.pdf,.doc,.docx,.xlsx,.xls" :action="state.uploadUrl" :data="{moduleType: 5,projectId: props.projectId}" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,5)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='1' v-model:file-list="state.safetyList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,5)"> |
| | | <el-upload :disabled="projectType==='detail'" accept="image/*,.pdf,.doc,.docx,.xlsx,.xls" :action="state.uploadUrl" :data="{moduleType: 5,projectId: props.projectId}" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,5)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='1' v-model:file-list="state.safetyList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,5)"> |
| | | <el-button type="primary">附件上传</el-button> |
| | | <template #tip> |
| | | <div class="el-upload__tip">上传文件尺寸小于5M,最多可上传1份</div> |
| | |
| | | <el-row style="border: 1px dashed #999;border-radius: 4px;padding: 10px;margin-top: 20px"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="主要装置前合影照片" prop="deviceImages"> |
| | | <el-upload accept="image/*" :action="state.uploadUrl" :data="{moduleType: 1,projectId: props.projectId}" list-type="picture-card" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,1)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='10' v-model:file-list="state.beforeDeviceList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,1)" > |
| | | <el-upload accept="image/*" :disabled="projectType === 'detail'" :action="state.uploadUrl" :data="{moduleType: 1,projectId: props.projectId}" list-type="picture-card" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,1)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='10' v-model:file-list="state.beforeDeviceList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,1)" > |
| | | <el-icon><Plus /></el-icon> |
| | | <template #tip> |
| | | <div class="el-upload__tip">上传照片尺寸小于5M,最多可上传10张</div> |
| | |
| | | <el-row style="border: 1px dashed #999;border-radius: 4px;padding: 10px;margin-top: 20px"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="现场勘验照片" prop="investingationImages"> |
| | | <el-upload accept="image/*" :action="state.uploadUrl" :data="{moduleType: 2,projectId: props.projectId}" list-type="picture-card" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,2)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='10' v-model:file-list="state.siteCheckList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,2)" > |
| | | <el-upload accept="image/*" :disabled="projectType === 'detail'" :action="state.uploadUrl" :data="{moduleType: 2,projectId: props.projectId}" list-type="picture-card" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,2)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='10' v-model:file-list="state.siteCheckList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,2)" > |
| | | <el-icon><Plus /></el-icon> |
| | | <template #tip> |
| | | <div class="el-upload__tip">上传照片尺寸小于5M,最多可上传10张</div> |
| | |
| | | <el-row style="border: 1px dashed #999;border-radius: 4px;padding: 10px;margin-top: 20px;margin-bottom: 20px"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="企业陪同人员照片" prop="ccompanyImages"> |
| | | <el-upload accept="image/*" :action="state.uploadUrl" :data="{moduleType: 3,projectId: props.projectId}" list-type="picture-card" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,3)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='10' v-model:file-list="state.companyList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,3)" > |
| | | <el-upload :disabled="projectType === 'detail'" accept="image/*" :action="state.uploadUrl" :data="{moduleType: 3,projectId: props.projectId}" list-type="picture-card" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,3)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='10' v-model:file-list="state.companyList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,3)" > |
| | | <el-icon><Plus /></el-icon> |
| | | <template #tip> |
| | | <div class="el-upload__tip">上传照片尺寸小于5M,最多可上传10张</div> |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | const projectType = ref(''); |
| | | const riskOpen = async (type,val) => { |
| | | state.formData.projectId = val |
| | | state.projectId = val |
| | | projectType.value = type; |
| | | if(type === 'detail' || type === 'edit' ){ |
| | | // await getDetail(val) |
| | | } |
| | |
| | | } |
| | | |
| | | const handleRemove = async (file, uploadFiles,type) => { |
| | | ElMessageBox.confirm( |
| | | '确定删除该附件?', |
| | | '提示', |
| | | { |
| | | confirmButtonText: '确定', |
| | | cancelButtonText: '取消', |
| | | type: 'warning', |
| | | }) |
| | | .then( async() => { |
| | | const res = await delFile(file.id) |
| | | if(res.code == 200){ |
| | | ElMessage({ |
| | | type: 'success', |
| | | message: '文件已删除' |
| | | }) |
| | | |
| | | ElMessageBox.confirm( |
| | | '确定删除该附件?', |
| | | '提示', |
| | | { |
| | | confirmButtonText: '确定', |
| | | cancelButtonText: '取消', |
| | | type: 'warning', |
| | | }) |
| | | .then( async() => { |
| | | const res = await delFile(file.id) |
| | | if(res.code == 200){ |
| | | ElMessage({ |
| | | type: 'success', |
| | | message: '文件已删除' |
| | | }) |
| | | if(type == 1){ |
| | | await getBeforeFiles() |
| | | } |
| | | if(type == 2){ |
| | | await getSiteCheckFiles() |
| | | } |
| | | if(type == 3){ |
| | | await getCompanyFiles() |
| | | } |
| | | if(type == 5){ |
| | | await getSafetyFiles() |
| | | } |
| | | }else{ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: res.message |
| | | }) |
| | | } |
| | | }) |
| | | .catch(()=>{ |
| | | if(type == 1){ |
| | | await getBeforeFiles() |
| | | getBeforeFiles() |
| | | } |
| | | if(type == 2){ |
| | | await getSiteCheckFiles() |
| | | getSiteCheckFiles() |
| | | } |
| | | if(type == 3){ |
| | | await getCompanyFiles() |
| | | getCompanyFiles() |
| | | } |
| | | if(type == 5){ |
| | | await getSafetyFiles() |
| | | getSafetyFiles() |
| | | } |
| | | }else{ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: res.message |
| | | }) |
| | | } |
| | | }) |
| | | .catch(()=>{ |
| | | if(type == 1){ |
| | | getBeforeFiles() |
| | | } |
| | | if(type == 2){ |
| | | getSiteCheckFiles() |
| | | } |
| | | if(type == 3){ |
| | | getCompanyFiles() |
| | | } |
| | | if(type == 5){ |
| | | getSafetyFiles() |
| | | } |
| | | }) |
| | | }) |
| | | |
| | | } |
| | | |
| | | defineExpose({ |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | </style> |
| | |
| | | <el-row :gutter="30"> |
| | | <el-col :span="18"> |
| | | <el-form-item label="附件上传"> |
| | | <el-upload accept="image/*,.pdf,.doc,.docx" :action="state.uploadUrl" :data="{moduleType: 6,projectId: props.projectId}" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="handleRemove"> |
| | | <el-upload :disabled="projectType === 'detail'" accept="image/*,.pdf,.doc,.docx" :action="state.uploadUrl" :data="{moduleType: 6,projectId: props.projectId}" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="handleRemove"> |
| | | <el-button type="primary">上传评审记录</el-button> |
| | | <template #tip> |
| | | <div class="el-upload__tip">上传文件尺寸尺寸小于2M</div> |
| | |
| | | <el-table-column label="操作" header-align="center" class-name="small-padding fixed-width" width="120"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" @click="checkFile(scope.row)">查看</el-button> |
| | | <el-button link type="danger" @click="handleRemove(scope.row,[])">删除</el-button> |
| | | <el-button link type="danger" @click="handleRemove(scope.row,[])" :disabled="projectType === 'detail'">删除</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | |
| | | getReviewFiles(props.projectId) |
| | | }) |
| | | |
| | | const projectType = ref(''); |
| | | const riskOpen = async (type,val) => { |
| | | projectType.value = type; |
| | | if(type === 'detail' || type === 'edit' ){ |
| | | await getReviewFiles |
| | | } |
| | | |
| | | if(type === 'add' || type === 'clickEdit') { |
| | | const valid = await formRef.value.validate(); |
| | | if(valid){ |
| | |
| | | if(res.code == 200){ |
| | | getReviewFiles() |
| | | }else{ |
| | | state.fileList.splice(state.fileList.indexOf(uploadFile),1) |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: '文件上传失败' |
| | | message: res.message |
| | | }) |
| | | } |
| | | } |
| | |
| | | <el-table-column label="归档确认" prop="" align="center" width="150"> |
| | | <template #default="scope"> |
| | | <div style="cursor:pointer;color: #3b82f6;" > |
| | | <span @click="goMenu('toThirteen',scope.row)">{{scope.row.activeConfirm}}</span> |
| | | <span v-if="scope.row.process === 5" @click="goMenu('toThirteen',scope.row)">{{scope.row.activeConfirm}}</span> |
| | | <!-- <span v-else></span>--> |
| | | </div> |
| | | </template> |
| | |
| | | }); |
| | | const goMenu = (toPath,val) => { |
| | | console.log("val",val) |
| | | if(toPath ==='toThirteen' && val.personRecognition && val.personRecognition. recognitionCnt === 0){ |
| | | ElMessage.warning('未进行签字确认,无法查看!') |
| | | return; |
| | | } |
| | | toProcess('edit',val,toPath); |
| | | } |
| | | |
| | |
| | | <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 class="project-title"> |
| | | <!-- <img :src="projectPng">--> |
| | | <span>项目</span> |
| | | <span>阶段</span> |
| | | </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"> |
| | |
| | | <sign-confirm ref="signConfirmRef" v-if="selectedObj.id === 13" @getNextStatus="getNextStatus" :projectId="projectId"></sign-confirm> |
| | | <confirm-end ref="confirmEndRef" v-if="selectedObj.id === 14" @getNextStatus="getNextStatus" :projectId="projectId"></confirm-end> |
| | | </div> |
| | | <div style="display: flex;align-items: center;justify-content: center;margin-bottom: -20px"> |
| | | <div style="display: flex;align-items: center;justify-content: center;margin-bottom: -30px;margin-top: 10px"> |
| | | <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 === 'add' && selectedObj.status === 1 && selectedObj.id !== 14)||(projectStatus === 'edit' && selectedObj.status === 1 && selectedObj.id !== 14) " @click="save">保存</el-button> |
| | | <el-button type="warning" style="width: 80px" v-if="(projectStatus === 'edit' && selectedObj.status !== 1 && selectedObj.id !== 13 && selectedObj.id !== 14 && reportProcess != 14) || (projectStatus === 'add' && selectedObj.status !== 1 && selectedObj.id !== 14 && reportProcess != 14) " @click="clickEdit">变更</el-button> |
| | |
| | | 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 itemStatus2Png from "@/assets/images/itemStatus2-1.png" |
| | | import { useRoute } from 'vue-router' |
| | | import {getProjectStatus} from "@/api/projectManage/project" |
| | | import ContractManage from "./components/contractManage"; |
| | |
| | | max-height: 85px; |
| | | cursor: pointer; |
| | | background-color: hsla(0,0%,100%,.97); |
| | | background-image: url(../../../assets/images/bg.png); |
| | | //background-image: url(../../../assets/images/bg2.png); |
| | | background-repeat: no-repeat; |
| | | background-size: 100% 84px; |
| | | overflow: hidden; |
| | |
| | | pointer-events: auto; |
| | | transform: translateX(-50%); |
| | | width: 118px; |
| | | background-image: url(../../../assets/images/back.png); |
| | | background-image: url(../../../assets/images/back1.png); |
| | | } |
| | | .choose .header-item{ |
| | | color: #fff; |
| | |
| | | display: flex; |
| | | flex-direction: row; |
| | | box-shadow: 0 0 18px 3px rgba(145,146,171,.2); |
| | | .project-title{ |
| | | margin-right: 20px; |
| | | height: 85px; |
| | | display: flex; |
| | | align-items: center; |
| | | flex-shrink: 1; |
| | | flex-direction: column; |
| | | justify-content: center; |
| | | font-size: 20px; |
| | | font-weight: 700; |
| | | color: rgb(255, 140, 138); |
| | | } |
| | | } |
| | | .header-item{ |
| | | position: relative; |
| | |
| | | font-size: 19px; |
| | | color: #626c8b; |
| | | border: 1px solid #fff; |
| | | background: rgba(198,230,255,.2); |
| | | background: rgba(233 223 211 / 20%); |
| | | border-radius: 8px; |
| | | display: flex; |
| | | align-items: center; |
| | | width: 70%; |
| | | width: 80%; |
| | | padding-left: 20px; |
| | | padding-right: 15px; |
| | | cursor: pointer; |
| | |
| | | line-height: 20px; |
| | | text-align: center; |
| | | border-radius: 50%; |
| | | background: #b9c2d5; |
| | | background: #f3ccb0; |
| | | margin-right: 10px; |
| | | min-width: 21px; |
| | | min-height: 21px; |
| | | } |
| | | .item-icon-status1{ |
| | | color: #3b75ff; |
| | | color: #f17235; |
| | | background: #fff; |
| | | } |
| | | .item-icon-status2{ |
| | |
| | | cursor: pointer; |
| | | color: #fff; |
| | | border: 1px solid #c6e6ff; |
| | | background: linear-gradient(90deg,#57b6ff,#3b75ff); |
| | | background: linear-gradient(90deg,rgb(239, 186, 141),rgb(255, 140, 138)); |
| | | } |
| | | .itemPrev{ |
| | | cursor: pointer; |
| | | color: #3b75ff; |
| | | border: 1px solid #c6e6ff; |
| | | background: rgba(198,230,255,.4); |
| | | color: #f38323; |
| | | border: 1px solid #f5e4cf; |
| | | background: rgb(249 210 170 / 40%); |
| | | } |
| | | .itemPrev:hover{ |
| | | transform: scale(1.1); |
| | |
| | | padding: 12px 56px; |
| | | font-size: 18px; |
| | | color: #fff; |
| | | background-image: url(../../../assets/images/cardHeader.png); |
| | | background-image: url(../../../assets/images/cardHeader2.png); |
| | | background-size: 100% 100%; |
| | | background-repeat: no-repeat; |
| | | margin: -20px; |
| | |
| | | overflow: hidden; |
| | | white-space: nowrap; |
| | | text-overflow: ellipsis; |
| | | font-size: 16px; |
| | | } |
| | | |
| | | |
| | |
| | | const isAgency = ref(false); |
| | | onMounted(()=>{ |
| | | |
| | | const userInfo = JSON.parse(Cookies.get('userInfo')) |
| | | |
| | | if(userInfo.identity === 1){ |
| | | state.agencyName = userInfo.agentName; |
| | | state.form.agencyId = userInfo.agentId; |
| | | isAgency.value = true; |
| | | }else { |
| | | getAgency() |
| | | } |
| | | console.log("userinfo",userInfo) |
| | | }) |
| | | |
| | | const getUserInfoAgency = () => { |
| | | const userInfo = JSON.parse(Cookies.get('userInfo')) |
| | | if(userInfo.identity === 1){ |
| | | state.agencyName = userInfo.agentName; |
| | | state.form.agencyId = userInfo.agentId; |
| | | isAgency.value = true; |
| | | }else { |
| | | getAgency() |
| | | } |
| | | console.log("userinfo",userInfo) |
| | | } |
| | | |
| | | |
| | | |
| | | const openDialog = async (type, value) => { |
| | | getArea() |
| | | await getUserInfoAgency(); |
| | | await getArea() |
| | | state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : type ==='pwd' ? '修改密码' : '查看' ; |
| | | if(type === 'edit') { |
| | | const param = { |
| | |
| | | ElMessage.warning(res.message) |
| | | } |
| | | |
| | | }else if(type === 'add'){ |
| | | console.log("aa",props.majorList) |
| | | props.majorList.forEach(item => { |
| | | if(item.certificateNo){ |
| | | item.certificateNo = '' |
| | | } |
| | | }) |
| | | } |
| | | if(type == 'pwd'){ |
| | | state.form.id = value.id |
| | |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | reset(); |
| | | superRef.value.clearValidate(); |
| | | superRef.value.resetFields(); |
| | | state.salaryList = []; |
| | | state.medicalList = []; |
| | | state.socialList = []; |
| | | state.photoList = []; |
| | | |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | superRef.value.clearValidate(); |
| | | reset() |
| | | superRef.value.clearValidate(); |
| | | |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | superRef.value.clearValidate(); |
| | | reset() |
| | | superRef.value.clearValidate(); |
| | | |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | |
| | | <el-table-column label="归档确认" prop="" align="center" width="150"> |
| | | <template #default="scope"> |
| | | <div style="cursor:pointer;color: #3b82f6;" > |
| | | <span v-if="scope.row.process === 5 && scope.row.personRecognition" @click="goMenu('toThirteen',scope.row)">{{scope.row.personRecognition.recognitionCnt}}/{{scope.row.personRecognition.personCnt}}</span> |
| | | <span v-if="scope.row.process === 5" @click="goMenu('toThirteen',scope.row)">{{scope.row.activeConfirm}}</span> |
| | | <span v-else></span> |
| | | </div> |
| | | </template> |
| | |
| | | filingDate: item.filingDate ? item.filingDate : conversionDays(item.createTime), |
| | | contractMoney: item.contract ? item.contract.contractMoney : '', |
| | | actualContractMoney: item.contract ? item.contract.actualContractMoney : '', |
| | | activeConfirm: item.personRecognition ? item.personRecognition.recognitionCnt + '/' + item.personRecognition.personCnt: '', |
| | | missingMaterialCnt: 3-item.materialCnt |
| | | } |
| | | }) |
| | |
| | | } |
| | | const goMenu = (toPath,val) => { |
| | | console.log("val",val) |
| | | if(toPath ==='toThirteen' && val.personRecognition && val.personRecognition. recognitionCnt === 0){ |
| | | ElMessage.warning('未进行签字确认,无法查看!') |
| | | return; |
| | | } |
| | | toProcess('edit',val,toPath); |
| | | } |
| | | const conversionDays = (createTime) => { |
| | |
| | | |
| | | <!-- 表格数据 --> |
| | | <el-table v-loading="loading" :data="dataList" :border="true"> |
| | | <el-table-column label="用户ID" prop="id" align="center" /> |
| | | <el-table-column label="序号" type="index" align="center" width="60" /> |
| | | <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" /> |
| | |
| | | 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}), |
| | | idPhoto: item.idPhoto ? [import.meta.env.VITE_APP_BASE_API + '/' + item.idPhoto ] : [], |
| | | lastEstimateTime: item.personProjectVO ? item.personProjectVO.lastEstimateTime : '', |
| | | lastEstimateTime: item.personProjectVO ? item.personProjectVO.lastEstimateTime.slice(0,10) : '', |
| | | projectCount: item.personProjectVO ? item.personProjectVO.projectCount : '' |
| | | } |
| | | }) |