|
|
@@ -1,7 +1,6 @@
|
|
|
<template>
|
|
|
<div>
|
|
|
<el-form ref="form" :model="form">
|
|
|
-
|
|
|
<!-- 数据表格 -->
|
|
|
<ele-pro-table
|
|
|
ref="table"
|
|
|
@@ -17,26 +16,27 @@
|
|
|
<!-- 表头工具栏 -->
|
|
|
<template v-slot:toolbar>
|
|
|
<el-button
|
|
|
- v-if="dialogType!=='view'"
|
|
|
+ v-if="dialogType !== 'view'"
|
|
|
size="small"
|
|
|
type="primary"
|
|
|
icon="el-icon-plus"
|
|
|
class="ele-btn-icon"
|
|
|
- @click="handleAddInfo">
|
|
|
+ @click="handleAddInfo"
|
|
|
+ >
|
|
|
新增计划节点
|
|
|
</el-button>
|
|
|
</template>
|
|
|
|
|
|
- <template v-slot:action="{row,$index}">
|
|
|
+ <template v-slot:action="{ row, $index }">
|
|
|
<el-popconfirm
|
|
|
class="ele-action"
|
|
|
title="确定要删除此信息吗?"
|
|
|
- :disabled="form.datasource.length==1"
|
|
|
+ :disabled="form.datasource.length == 1"
|
|
|
@confirm="handleDelInfo($index)"
|
|
|
>
|
|
|
<template v-slot:reference>
|
|
|
<el-link
|
|
|
- v-if="dialogType!=='view'"
|
|
|
+ v-if="dialogType !== 'view'"
|
|
|
type="danger"
|
|
|
:underline="false"
|
|
|
icon="el-icon-delete"
|
|
|
@@ -46,390 +46,458 @@
|
|
|
</template>
|
|
|
</el-popconfirm>
|
|
|
|
|
|
-<!-- <el-dropdown v-if="dialogType=='view'" trigger="click">-->
|
|
|
-<!-- <span class="el-dropdown-link">-->
|
|
|
-<!-- 操作菜单<i class="el-icon-arrow-down el-icon--right"></i>-->
|
|
|
-<!-- </span>-->
|
|
|
-<!-- <el-dropdown-menu slot="dropdown">-->
|
|
|
-<!-- <el-dropdown-item>-->
|
|
|
-<!-- <el-link icon="el-icon-success" type="success" :underline="false" @click="handleStatus(planStageFinishAPI,'完成',row)">完成-->
|
|
|
-<!-- </el-link>-->
|
|
|
-<!-- </el-dropdown-item>-->
|
|
|
-<!-- <el-dropdown-item>-->
|
|
|
-<!-- <el-link icon="el-icon-video-pause" type="warning" :underline="false" @click="handleStatus(planStagePauseAPI,'暂停',row)">暂停-->
|
|
|
-<!-- </el-link>-->
|
|
|
-<!-- </el-dropdown-item>-->
|
|
|
-<!-- <el-dropdown-item>-->
|
|
|
-<!-- <el-link icon="el-icon-video-play" type="success" :underline="false" @click="handleStatus(planStageStartupAPI,'启动',row)">启动-->
|
|
|
-<!-- </el-link>-->
|
|
|
-<!-- </el-dropdown-item>-->
|
|
|
-<!-- <el-dropdown-item>-->
|
|
|
-<!-- <el-link icon="el-icon-error" type="danger" :underline="false" @click="handleStatus(planStageTerminationAPI,'终止',row)">终止</el-link>-->
|
|
|
-<!-- </el-dropdown-item>-->
|
|
|
-<!-- <el-dropdown-item divided v-if="[2].includes(row.processStatus)&&[0,1].includes(row.status)">-->
|
|
|
-<!-- <el-link-->
|
|
|
-<!-- type="primary"-->
|
|
|
-<!-- :underline="false"-->
|
|
|
-<!-- icon="el-icon-plus"-->
|
|
|
-<!-- @click="handleAddTask(row)">-->
|
|
|
-<!-- 新增任务-->
|
|
|
-<!-- </el-link>-->
|
|
|
-<!-- </el-dropdown-item>-->
|
|
|
-<!-- </el-dropdown-menu>-->
|
|
|
-<!-- </el-dropdown>-->
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+ <!-- <el-dropdown v-if="dialogType=='view'" trigger="click">-->
|
|
|
+ <!-- <span class="el-dropdown-link">-->
|
|
|
+ <!-- 操作菜单<i class="el-icon-arrow-down el-icon--right"></i>-->
|
|
|
+ <!-- </span>-->
|
|
|
+ <!-- <el-dropdown-menu slot="dropdown">-->
|
|
|
+ <!-- <el-dropdown-item>-->
|
|
|
+ <!-- <el-link icon="el-icon-success" type="success" :underline="false" @click="handleStatus(planStageFinishAPI,'完成',row)">完成-->
|
|
|
+ <!-- </el-link>-->
|
|
|
+ <!-- </el-dropdown-item>-->
|
|
|
+ <!-- <el-dropdown-item>-->
|
|
|
+ <!-- <el-link icon="el-icon-video-pause" type="warning" :underline="false" @click="handleStatus(planStagePauseAPI,'暂停',row)">暂停-->
|
|
|
+ <!-- </el-link>-->
|
|
|
+ <!-- </el-dropdown-item>-->
|
|
|
+ <!-- <el-dropdown-item>-->
|
|
|
+ <!-- <el-link icon="el-icon-video-play" type="success" :underline="false" @click="handleStatus(planStageStartupAPI,'启动',row)">启动-->
|
|
|
+ <!-- </el-link>-->
|
|
|
+ <!-- </el-dropdown-item>-->
|
|
|
+ <!-- <el-dropdown-item>-->
|
|
|
+ <!-- <el-link icon="el-icon-error" type="danger" :underline="false" @click="handleStatus(planStageTerminationAPI,'终止',row)">终止</el-link>-->
|
|
|
+ <!-- </el-dropdown-item>-->
|
|
|
+ <!-- <el-dropdown-item divided v-if="[2].includes(row.processStatus)&&[0,1].includes(row.status)">-->
|
|
|
+ <!-- <el-link-->
|
|
|
+ <!-- type="primary"-->
|
|
|
+ <!-- :underline="false"-->
|
|
|
+ <!-- icon="el-icon-plus"-->
|
|
|
+ <!-- @click="handleAddTask(row)">-->
|
|
|
+ <!-- 新增任务-->
|
|
|
+ <!-- </el-link>-->
|
|
|
+ <!-- </el-dropdown-item>-->
|
|
|
+ <!-- </el-dropdown-menu>-->
|
|
|
+ <!-- </el-dropdown>-->
|
|
|
</template>
|
|
|
- <template v-slot:name="{row,$index}" v-if="dialogType!=='view'">
|
|
|
- <el-form-item :prop="'datasource.'+$index+'.name'"
|
|
|
- :rules="{required:true,message:'请选择',trigger:['blur','change']}">
|
|
|
+ <template v-slot:name="{ row, $index }" v-if="dialogType !== 'view'">
|
|
|
+ <el-form-item
|
|
|
+ :prop="'datasource.' + $index + '.name'"
|
|
|
+ :rules="{
|
|
|
+ required: true,
|
|
|
+ message: '请选择',
|
|
|
+ trigger: ['blur', 'change']
|
|
|
+ }"
|
|
|
+ >
|
|
|
<el-input v-model="row.name" clearable></el-input>
|
|
|
</el-form-item>
|
|
|
</template>
|
|
|
- <template v-slot:stage="{row,$index}" v-if="dialogType!=='view'">
|
|
|
- <el-form-item :prop="'datasource.'+$index+'.stage'">
|
|
|
+ <template v-slot:stage="{ row, $index }" v-if="dialogType !== 'view'">
|
|
|
+ <el-form-item :prop="'datasource.' + $index + '.stage'">
|
|
|
<el-input v-model="row.stage" clearable></el-input>
|
|
|
</el-form-item>
|
|
|
</template>
|
|
|
- <template v-slot:planStartDate="{row,$index}" v-if="dialogType!=='view'">
|
|
|
- <el-form-item :prop="'datasource.'+$index+'.planStartDate'"
|
|
|
- :rules="{required:true,message:'请选择',trigger:['blur','change']}">
|
|
|
+ <template
|
|
|
+ v-slot:planStartDate="{ row, $index }"
|
|
|
+ v-if="dialogType !== 'view'"
|
|
|
+ >
|
|
|
+ <el-form-item
|
|
|
+ :prop="'datasource.' + $index + '.planStartDate'"
|
|
|
+ :rules="{
|
|
|
+ required: true,
|
|
|
+ message: '请选择',
|
|
|
+ trigger: ['blur', 'change']
|
|
|
+ }"
|
|
|
+ >
|
|
|
<el-date-picker
|
|
|
style="width: 100%"
|
|
|
- :disabled="dialogType=='view'"
|
|
|
+ :disabled="dialogType == 'view'"
|
|
|
v-model="row.planStartDate"
|
|
|
- :picker-options="{disabledDate:(time)=>{return row.planEndDate&&time.getTime()>new Date(row.planEndDate)}}"
|
|
|
+ :picker-options="{
|
|
|
+ disabledDate: (time) => {
|
|
|
+ return (
|
|
|
+ row.planEndDate &&
|
|
|
+ time.getTime() > new Date(row.planEndDate)
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }"
|
|
|
type="date"
|
|
|
- placeholder="选择日期">
|
|
|
+ placeholder="选择日期"
|
|
|
+ >
|
|
|
</el-date-picker>
|
|
|
</el-form-item>
|
|
|
</template>
|
|
|
- <template v-slot:planEndDate="{row,$index}" v-if="dialogType!=='view'">
|
|
|
- <el-form-item :prop="'datasource.'+$index+'.planEndDate'"
|
|
|
- :rules="{required:true,message:'请选择',trigger:['blur','change']}">
|
|
|
+ <template
|
|
|
+ v-slot:planEndDate="{ row, $index }"
|
|
|
+ v-if="dialogType !== 'view'"
|
|
|
+ >
|
|
|
+ <el-form-item
|
|
|
+ :prop="'datasource.' + $index + '.planEndDate'"
|
|
|
+ :rules="{
|
|
|
+ required: true,
|
|
|
+ message: '请选择',
|
|
|
+ trigger: ['blur', 'change']
|
|
|
+ }"
|
|
|
+ >
|
|
|
<el-date-picker
|
|
|
style="width: 100%"
|
|
|
- :disabled="dialogType=='view'"
|
|
|
- :picker-options="{disabledDate:(time)=>{return row.planStartDate&&time.getTime()<new Date(row.planStartDate)}}"
|
|
|
+ :disabled="dialogType == 'view'"
|
|
|
+ :picker-options="{
|
|
|
+ disabledDate: (time) => {
|
|
|
+ return (
|
|
|
+ row.planStartDate &&
|
|
|
+ time.getTime() < new Date(row.planStartDate)
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }"
|
|
|
v-model="row.planEndDate"
|
|
|
type="date"
|
|
|
- placeholder="选择日期">
|
|
|
+ placeholder="选择日期"
|
|
|
+ >
|
|
|
</el-date-picker>
|
|
|
</el-form-item>
|
|
|
</template>
|
|
|
- <template v-slot:responsibleDeptId="{row,$index}">
|
|
|
- <el-form-item :prop="'datasource.'+$index+'.responsibleDeptId'">
|
|
|
+ <template v-slot:responsibleDeptId="{ row, $index }">
|
|
|
+ <el-form-item :prop="'datasource.' + $index + '.responsibleDeptId'">
|
|
|
<ele-tree-select
|
|
|
- :disabled="dialogType=='view'"
|
|
|
+ :disabled="dialogType == 'view'"
|
|
|
clearable
|
|
|
:data="deptTreeList"
|
|
|
- :ref="'deptTreeRef'+$index"
|
|
|
+ :ref="'deptTreeRef' + $index"
|
|
|
v-model="row.responsibleDeptId"
|
|
|
valueKey="id"
|
|
|
labelKey="name"
|
|
|
placeholder="请选择"
|
|
|
- @change="(id)=>changeDeptInfo(id,$index)"
|
|
|
+ @change="(id) => changeDeptInfo(id, $index)"
|
|
|
default-expand-all
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
</template>
|
|
|
- <template v-slot:responsibleUserIds="{row,$index}" v-if="dialogType!=='view'">
|
|
|
- <el-form-item :prop="'datasource.'+$index+'.responsibleUserIds'">
|
|
|
- <el-select v-if="userList.length" v-model="row.responsibleUserIds" multiple collapse-tags
|
|
|
- filterable placeholder="请选择" style="width: 100%;"
|
|
|
- clearable
|
|
|
- size="medium"
|
|
|
- :disabled="dialogType=='view'">
|
|
|
+ <template
|
|
|
+ v-slot:responsibleUserIds="{ row, $index }"
|
|
|
+ v-if="dialogType !== 'view'"
|
|
|
+ >
|
|
|
+ <el-form-item :prop="'datasource.' + $index + '.responsibleUserIds'">
|
|
|
+ <el-select
|
|
|
+ v-if="userList.length"
|
|
|
+ v-model="row.responsibleUserIds"
|
|
|
+ multiple
|
|
|
+ collapse-tags
|
|
|
+ filterable
|
|
|
+ placeholder="请选择"
|
|
|
+ style="width: 100%"
|
|
|
+ clearable
|
|
|
+ size="medium"
|
|
|
+ :disabled="dialogType == 'view'"
|
|
|
+ >
|
|
|
<el-option
|
|
|
v-for="item in userList"
|
|
|
:key="item.id"
|
|
|
:label="item.name"
|
|
|
- :value="item.id">
|
|
|
+ :value="item.id"
|
|
|
+ >
|
|
|
</el-option>
|
|
|
</el-select>
|
|
|
<personSelect
|
|
|
v-else
|
|
|
- multiple collapse-tags
|
|
|
- :disabled="dialogType=='view'"
|
|
|
- :ref="'directorRef'+$index"
|
|
|
- v-model="row.responsibleUserIds"/>
|
|
|
+ multiple
|
|
|
+ collapse-tags
|
|
|
+ :disabled="dialogType == 'view'"
|
|
|
+ :ref="'directorRef' + $index"
|
|
|
+ v-model="row.responsibleUserIds"
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
</template>
|
|
|
- <template v-slot:isMilepost="{row,$index}" v-if="dialogType!=='view'">
|
|
|
+ <template
|
|
|
+ v-slot:isMilepost="{ row, $index }"
|
|
|
+ v-if="dialogType !== 'view'"
|
|
|
+ >
|
|
|
<el-form-item>
|
|
|
<el-select v-model="row.isMilepost">
|
|
|
- <el-option label="否" :value="0"/>
|
|
|
- <el-option label="是" :value="1"/>
|
|
|
+ <!-- {{ row.isMilepost }} -->
|
|
|
+ <el-option label="否" :value="0" />
|
|
|
+ <el-option label="是" :value="1" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
</template>
|
|
|
<template v-slot:speedPercent="{ row }">
|
|
|
- <el-progress :stroke-width="20" text-color="#606266" :text-inside="true" :percentage="row.speedPercent||0"
|
|
|
- :color="customColorMethod"></el-progress>
|
|
|
+ <el-progress
|
|
|
+ :stroke-width="20"
|
|
|
+ text-color="#606266"
|
|
|
+ :text-inside="true"
|
|
|
+ :percentage="row.speedPercent || 0"
|
|
|
+ :color="customColorMethod"
|
|
|
+ ></el-progress>
|
|
|
</template>
|
|
|
- <template v-slot:milepost="{row,$index}" v-if="dialogType!=='view'">
|
|
|
+ <template
|
|
|
+ v-slot:milepost="{ row, $index }"
|
|
|
+ v-if="dialogType !== 'view'"
|
|
|
+ >
|
|
|
<el-form-item>
|
|
|
<el-input v-model="row.milepost" clearable></el-input>
|
|
|
</el-form-item>
|
|
|
</template>
|
|
|
- <template v-slot:deliverContent="{row,$index}" v-if="dialogType!=='view'">
|
|
|
+ <template
|
|
|
+ v-slot:deliverContent="{ row, $index }"
|
|
|
+ v-if="dialogType !== 'view'"
|
|
|
+ >
|
|
|
<el-form-item>
|
|
|
- <el-input type="textarea" v-model="row.deliverContent" clearable></el-input>
|
|
|
+ <el-input
|
|
|
+ type="textarea"
|
|
|
+ v-model="row.deliverContent"
|
|
|
+ clearable
|
|
|
+ ></el-input>
|
|
|
</el-form-item>
|
|
|
</template>
|
|
|
<template v-slot:proportion="{ row }">
|
|
|
- <el-input type="number" :min="0" :max="100" v-model="row.proportion" :disabled="dialogType=='view'">
|
|
|
+ <el-input
|
|
|
+ type="number"
|
|
|
+ :min="0"
|
|
|
+ :max="100"
|
|
|
+ v-model="row.proportion"
|
|
|
+ :disabled="dialogType == 'view'"
|
|
|
+ >
|
|
|
</el-input>
|
|
|
</template>
|
|
|
- <template v-slot:remark="{row,$index}" v-if="dialogType!=='view'">
|
|
|
+ <template v-slot:remark="{ row, $index }" v-if="dialogType !== 'view'">
|
|
|
<el-form-item>
|
|
|
<el-input type="textarea" v-model="row.remark" clearable></el-input>
|
|
|
</el-form-item>
|
|
|
</template>
|
|
|
- <template v-slot:headerRequired="{column}">
|
|
|
+ <template v-slot:headerRequired="{ column }">
|
|
|
<span class="is-required">{{ column.label }}</span>
|
|
|
</template>
|
|
|
</ele-pro-table>
|
|
|
</el-form>
|
|
|
-
|
|
|
-
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
-
|
|
|
<script>
|
|
|
+ import fileUpload from '@/components/upload/fileUpload.vue';
|
|
|
+ import { getFile } from '@/api/system/file';
|
|
|
+ import PersonSelect from '@/components/CommomSelect/person-select.vue';
|
|
|
+ import { proStatusEnum } from '@/enum/dict';
|
|
|
+ import { deepClone } from '@/utils';
|
|
|
+ import {
|
|
|
+ planStageFinishAPI,
|
|
|
+ planStagePauseAPI,
|
|
|
+ planStageStartupAPI,
|
|
|
+ planStageTerminationAPI
|
|
|
+ } from '@/api/project-manage/plan';
|
|
|
|
|
|
-
|
|
|
-import fileUpload from "@/components/upload/fileUpload.vue";
|
|
|
-import {getFile} from "@/api/system/file";
|
|
|
-import PersonSelect from "@/components/CommomSelect/person-select.vue";
|
|
|
-import {proStatusEnum} from "@/enum/dict";
|
|
|
-import {deepClone} from "@/utils";
|
|
|
-import {
|
|
|
- planStageFinishAPI,
|
|
|
- planStagePauseAPI,
|
|
|
- planStageStartupAPI,
|
|
|
- planStageTerminationAPI
|
|
|
-} from "@/api/project-manage/plan";
|
|
|
-
|
|
|
-export default {
|
|
|
- name: "planInfoTable",
|
|
|
- components: {
|
|
|
- PersonSelect,
|
|
|
- fileUpload,
|
|
|
-
|
|
|
- },
|
|
|
- props: {
|
|
|
- dialogForm: {
|
|
|
- type: Object,
|
|
|
- default: () => {
|
|
|
- return {
|
|
|
- ...this.form
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- dialogType: {
|
|
|
- type: String,
|
|
|
- default: ''
|
|
|
- },
|
|
|
- deptList: {
|
|
|
- type: Array,
|
|
|
- default() {
|
|
|
- return []
|
|
|
- }
|
|
|
+ export default {
|
|
|
+ name: 'planInfoTable',
|
|
|
+ components: {
|
|
|
+ PersonSelect,
|
|
|
+ fileUpload
|
|
|
},
|
|
|
- userList: {
|
|
|
- type: Array,
|
|
|
- default() {
|
|
|
- return []
|
|
|
+ props: {
|
|
|
+ dialogForm: {
|
|
|
+ type: Object,
|
|
|
+ default: () => {
|
|
|
+ return {
|
|
|
+ ...this.form
|
|
|
+ };
|
|
|
+ }
|
|
|
+ },
|
|
|
+ dialogType: {
|
|
|
+ type: String,
|
|
|
+ default: ''
|
|
|
+ },
|
|
|
+ deptList: {
|
|
|
+ type: Array,
|
|
|
+ default() {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ },
|
|
|
+ userList: {
|
|
|
+ type: Array,
|
|
|
+ default() {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ },
|
|
|
+ deptTreeList: {
|
|
|
+ type: Array,
|
|
|
+ default() {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
}
|
|
|
},
|
|
|
- deptTreeList: {
|
|
|
- type: Array,
|
|
|
- default() {
|
|
|
- return []
|
|
|
+ watch: {
|
|
|
+ dialogForm: {
|
|
|
+ handler(val) {
|
|
|
+ this.form.datasource = deepClone(this.dialogForm.planStageList || []);
|
|
|
+ // this.$nextTick(async () => {
|
|
|
+ // this.form.datasource.forEach((item, index) => {
|
|
|
+ // this.getUserList(item.responsibleDeptId, index);
|
|
|
+ // })
|
|
|
+ // })
|
|
|
+ },
|
|
|
+ deep: true
|
|
|
+ },
|
|
|
+ userList: {
|
|
|
+ handler(val) {
|
|
|
+ this.form.datasource.forEach((item) => {
|
|
|
+ item.responsibleUserIds = [];
|
|
|
+ });
|
|
|
+ }
|
|
|
}
|
|
|
},
|
|
|
- },
|
|
|
- watch: {
|
|
|
- dialogForm: {
|
|
|
- handler(val) {
|
|
|
- this.form.datasource = deepClone(this.dialogForm.planStageList || [])
|
|
|
- // this.$nextTick(async () => {
|
|
|
- // this.form.datasource.forEach((item, index) => {
|
|
|
- // this.getUserList(item.responsibleDeptId, index);
|
|
|
- // })
|
|
|
- // })
|
|
|
- },
|
|
|
- deep: true,
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ planStageFinishAPI,
|
|
|
+ planStagePauseAPI,
|
|
|
+ planStageStartupAPI,
|
|
|
+ planStageTerminationAPI,
|
|
|
+ editIndex: undefined, //当前修改数据的下标
|
|
|
+ form: {
|
|
|
+ datasource: []
|
|
|
+ }
|
|
|
+ };
|
|
|
},
|
|
|
- userList:{
|
|
|
- handler(val) {
|
|
|
- this.form.datasource.forEach((item) => {
|
|
|
- item.responsibleUserIds = []
|
|
|
- })
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- data() {
|
|
|
- return {
|
|
|
- planStageFinishAPI,
|
|
|
- planStagePauseAPI,
|
|
|
- planStageStartupAPI,
|
|
|
- planStageTerminationAPI,
|
|
|
- editIndex: undefined,//当前修改数据的下标
|
|
|
- form: {
|
|
|
- datasource: []
|
|
|
- },
|
|
|
+ computed: {
|
|
|
+ columns() {
|
|
|
+ return [
|
|
|
+ {
|
|
|
+ columnKey: 'index',
|
|
|
+ label: '序号',
|
|
|
+ type: 'index',
|
|
|
+ width: 55,
|
|
|
+ align: 'center',
|
|
|
+ showOverflowTooltip: true
|
|
|
+ },
|
|
|
+ {
|
|
|
+ prop: 'name',
|
|
|
+ label: '节点名称',
|
|
|
+ align: 'center',
|
|
|
+ showOverflowTooltip: true,
|
|
|
+ minWidth: 120,
|
|
|
+ slot: 'name',
|
|
|
+ headerSlot: 'headerRequired'
|
|
|
+ },
|
|
|
+ // {
|
|
|
+ // prop: 'stage',
|
|
|
+ // label: '计划节点',
|
|
|
+ // align: 'center',
|
|
|
+ // showOverflowTooltip: true,
|
|
|
+ // minWidth: 120,
|
|
|
+ // slot: 'stage',
|
|
|
+ // headerSlot: 'headerRequired',
|
|
|
+ // },
|
|
|
+ // {
|
|
|
+ // prop: 'responsibleDeptId',
|
|
|
+ // label: '负责部门',
|
|
|
+ // align: 'center',
|
|
|
+ // showOverflowTooltip: true,
|
|
|
+ // minWidth: 130,
|
|
|
+ // slot: 'responsibleDeptId',
|
|
|
+ // headerSlot: 'headerRequired',
|
|
|
+ // },
|
|
|
+ {
|
|
|
+ prop: 'responsibleUserNames',
|
|
|
+ label: '负责人',
|
|
|
+ align: 'center',
|
|
|
+ showOverflowTooltip: true,
|
|
|
+ minWidth: 120,
|
|
|
+ slot: 'responsibleUserIds',
|
|
|
+ headerSlot: 'headerRequired'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ prop: 'planStartDate',
|
|
|
+ label: '开始时间',
|
|
|
+ align: 'center',
|
|
|
+ showOverflowTooltip: true,
|
|
|
+ minWidth: 120,
|
|
|
+ slot: 'planStartDate',
|
|
|
+ headerSlot: 'headerRequired'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ prop: 'planEndDate',
|
|
|
+ label: '结束时间',
|
|
|
+ align: 'center',
|
|
|
+ showOverflowTooltip: true,
|
|
|
+ minWidth: 120,
|
|
|
+ slot: 'planEndDate',
|
|
|
+ headerSlot: 'headerRequired'
|
|
|
+ },
|
|
|
|
|
|
- }
|
|
|
- },
|
|
|
- computed: {
|
|
|
- columns() {
|
|
|
- return [
|
|
|
- {
|
|
|
- columnKey: 'index',
|
|
|
- label: '序号',
|
|
|
- type: 'index',
|
|
|
- width: 55,
|
|
|
- align: 'center',
|
|
|
- showOverflowTooltip: true,
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'name',
|
|
|
- label: '节点名称',
|
|
|
- align: 'center',
|
|
|
- showOverflowTooltip: true,
|
|
|
- minWidth: 120,
|
|
|
- slot: 'name',
|
|
|
- headerSlot: 'headerRequired',
|
|
|
- },
|
|
|
- // {
|
|
|
- // prop: 'stage',
|
|
|
- // label: '计划节点',
|
|
|
- // align: 'center',
|
|
|
- // showOverflowTooltip: true,
|
|
|
- // minWidth: 120,
|
|
|
- // slot: 'stage',
|
|
|
- // headerSlot: 'headerRequired',
|
|
|
- // },
|
|
|
- // {
|
|
|
- // prop: 'responsibleDeptId',
|
|
|
- // label: '负责部门',
|
|
|
- // align: 'center',
|
|
|
- // showOverflowTooltip: true,
|
|
|
- // minWidth: 130,
|
|
|
- // slot: 'responsibleDeptId',
|
|
|
- // headerSlot: 'headerRequired',
|
|
|
- // },
|
|
|
- {
|
|
|
- prop: 'responsibleUserNames',
|
|
|
- label: '负责人',
|
|
|
- align: 'center',
|
|
|
- showOverflowTooltip: true,
|
|
|
- minWidth: 120,
|
|
|
- slot: 'responsibleUserIds',
|
|
|
- headerSlot: 'headerRequired',
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'planStartDate',
|
|
|
- label: '开始时间',
|
|
|
- align: 'center',
|
|
|
- showOverflowTooltip: true,
|
|
|
- minWidth: 120,
|
|
|
- slot: 'planStartDate',
|
|
|
- headerSlot: 'headerRequired',
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'planEndDate',
|
|
|
- label: '结束时间',
|
|
|
- align: 'center',
|
|
|
- showOverflowTooltip: true,
|
|
|
- minWidth: 120,
|
|
|
- slot: 'planEndDate',
|
|
|
- headerSlot: 'headerRequired',
|
|
|
- },
|
|
|
-
|
|
|
- {
|
|
|
- prop: 'isMilepost',
|
|
|
- label: '是否里程碑',
|
|
|
- align: 'center',
|
|
|
- showOverflowTooltip: true,
|
|
|
- minWidth: 120,
|
|
|
- slot: 'isMilepost',
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'deliverContent',
|
|
|
- label: '交付物说明',
|
|
|
- align: 'center',
|
|
|
- showOverflowTooltip: true,
|
|
|
- minWidth: 160,
|
|
|
- slot: 'deliverContent',
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'remark',
|
|
|
- label: '备注',
|
|
|
- align: 'center',
|
|
|
- showOverflowTooltip: true,
|
|
|
- minWidth: 160,
|
|
|
- slot: 'remark',
|
|
|
- },
|
|
|
- // {
|
|
|
- // prop: 'proportion',
|
|
|
- // label: '权重占比(%)',
|
|
|
- // align: 'center',
|
|
|
- // showOverflowTooltip: true,
|
|
|
- // minWidth: 110,
|
|
|
- // slot: 'proportion'
|
|
|
- // },
|
|
|
- {
|
|
|
- prop: 'speedPercent',
|
|
|
- label: '进度',
|
|
|
- align: 'center',
|
|
|
- showOverflowTooltip: true,
|
|
|
- minWidth: 120,
|
|
|
- slot: 'speedPercent'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'status',
|
|
|
- label: '状态',
|
|
|
- align: 'center',
|
|
|
- showOverflowTooltip: true,
|
|
|
- minWidth: 100,
|
|
|
- formatter: (_row, _column, cellValue) => {
|
|
|
- return proStatusEnum[_row.status].label;
|
|
|
+ {
|
|
|
+ prop: 'isMilepost',
|
|
|
+ label: '是否里程碑',
|
|
|
+ align: 'center',
|
|
|
+ showOverflowTooltip: true,
|
|
|
+ minWidth: 120,
|
|
|
+ slot: 'isMilepost',
|
|
|
+ formatter: (row, column, cellValue) => {
|
|
|
+ return cellValue === 0 ? '否' : '是';
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ prop: 'deliverContent',
|
|
|
+ label: '交付物说明',
|
|
|
+ align: 'center',
|
|
|
+ showOverflowTooltip: true,
|
|
|
+ minWidth: 160,
|
|
|
+ slot: 'deliverContent'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ prop: 'remark',
|
|
|
+ label: '备注',
|
|
|
+ align: 'center',
|
|
|
+ showOverflowTooltip: true,
|
|
|
+ minWidth: 160,
|
|
|
+ slot: 'remark'
|
|
|
+ },
|
|
|
+ // {
|
|
|
+ // prop: 'proportion',
|
|
|
+ // label: '权重占比(%)',
|
|
|
+ // align: 'center',
|
|
|
+ // showOverflowTooltip: true,
|
|
|
+ // minWidth: 110,
|
|
|
+ // slot: 'proportion'
|
|
|
+ // },
|
|
|
+ {
|
|
|
+ prop: 'speedPercent',
|
|
|
+ label: '进度',
|
|
|
+ align: 'center',
|
|
|
+ showOverflowTooltip: true,
|
|
|
+ minWidth: 120,
|
|
|
+ slot: 'speedPercent'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ prop: 'status',
|
|
|
+ label: '状态',
|
|
|
+ align: 'center',
|
|
|
+ showOverflowTooltip: true,
|
|
|
+ minWidth: 100,
|
|
|
+ formatter: (_row, _column, cellValue) => {
|
|
|
+ return proStatusEnum[_row.status].label;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ columnKey: 'action',
|
|
|
+ slot: 'action',
|
|
|
+ label: '操作',
|
|
|
+ resizable: false,
|
|
|
+ width: 130,
|
|
|
+ align: 'center',
|
|
|
+ showOverflowTooltip: true,
|
|
|
+ fixed: 'right'
|
|
|
}
|
|
|
- },
|
|
|
- {
|
|
|
- columnKey: 'action',
|
|
|
- slot: 'action',
|
|
|
- label: '操作',
|
|
|
- resizable: false,
|
|
|
- width: 130,
|
|
|
- align: 'center',
|
|
|
- showOverflowTooltip: true,
|
|
|
- fixed: 'right'
|
|
|
- },
|
|
|
-
|
|
|
- ]
|
|
|
+ ];
|
|
|
+ }
|
|
|
},
|
|
|
- },
|
|
|
- created() {
|
|
|
- console.log(this.dialogType);
|
|
|
-
|
|
|
- },
|
|
|
- mounted() {
|
|
|
- console.log(this.dialogType);
|
|
|
- },
|
|
|
- methods: {
|
|
|
- downloadFile(file) {
|
|
|
- getFile({objectName: file.storePath}, file.name);
|
|
|
+ created() {
|
|
|
+ console.log(this.dialogType);
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ console.log(this.dialogType);
|
|
|
},
|
|
|
- //新增计划数据
|
|
|
- handleAddInfo() {
|
|
|
- this.form.datasource.push(
|
|
|
- {
|
|
|
+ methods: {
|
|
|
+ downloadFile(file) {
|
|
|
+ getFile({ objectName: file.storePath }, file.name);
|
|
|
+ },
|
|
|
+ //新增计划数据
|
|
|
+ handleAddInfo() {
|
|
|
+ this.form.datasource.push({
|
|
|
deliverContent: '',
|
|
|
milepost: '',
|
|
|
isMilepost: 0,
|
|
|
@@ -440,90 +508,92 @@ export default {
|
|
|
name: '',
|
|
|
stage: '',
|
|
|
status: 0,
|
|
|
- remark: '',
|
|
|
+ remark: ''
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 选择负责人部门
|
|
|
+ changeDeptInfo(id, index) {
|
|
|
+ const info = this.deptList.find((e) => e.id == id) || {};
|
|
|
+ this.$set(
|
|
|
+ this.form.datasource[index],
|
|
|
+ 'responsibleDeptName',
|
|
|
+ info.name
|
|
|
+ );
|
|
|
+ this.$set(this.form.datasource[index], 'responsibleUserIds', '');
|
|
|
+ this.$set(this.form.datasource[index], 'responsibleUserName', '');
|
|
|
+ this.getUserList(id, index);
|
|
|
+ },
|
|
|
+ customColorMethod(percentage) {
|
|
|
+ if (percentage < 30) {
|
|
|
+ return '#909399';
|
|
|
+ } else if (percentage < 70) {
|
|
|
+ return '#e6a23c';
|
|
|
+ } else {
|
|
|
+ return '#67c23a';
|
|
|
}
|
|
|
- )
|
|
|
- },
|
|
|
- // 选择负责人部门
|
|
|
- changeDeptInfo(id, index) {
|
|
|
- const info = this.deptList.find((e) => e.id == id) || {};
|
|
|
- this.$set(this.form.datasource[index], 'responsibleDeptName', info.name);
|
|
|
- this.$set(this.form.datasource[index], 'responsibleUserIds', '');
|
|
|
- this.$set(this.form.datasource[index], 'responsibleUserName', '');
|
|
|
- this.getUserList(id, index);
|
|
|
- },
|
|
|
- customColorMethod(percentage) {
|
|
|
- if (percentage < 30) {
|
|
|
- return '#909399';
|
|
|
- } else if (percentage < 70) {
|
|
|
- return '#e6a23c';
|
|
|
- } else {
|
|
|
- return '#67c23a';
|
|
|
- }
|
|
|
- },
|
|
|
- // 获取人员数据
|
|
|
- getUserList(groupId, index) {
|
|
|
- if (groupId) {
|
|
|
- this.$refs['directorRef' + index].getList({groupId});
|
|
|
- }
|
|
|
- },
|
|
|
- personChange(val, info, index) {
|
|
|
- // this.$set(this.form.datasource[index], 'responsibleUserName', info.name);
|
|
|
- },
|
|
|
- //
|
|
|
- clearData() {
|
|
|
- this.form.datasource.forEach((item, index) => {
|
|
|
- this.$set(this.form.datasource[index], 'deliverContent', '')
|
|
|
- this.$set(this.form.datasource[index], 'milepost', '')
|
|
|
- this.$set(this.form.datasource[index], 'isMilepost', 0)
|
|
|
- this.$set(this.form.datasource[index], 'responsibleUserIds', '')
|
|
|
- this.$set(this.form.datasource[index], 'responsibleUserName', '')
|
|
|
- this.$set(this.form.datasource[index], 'planStartDate', '')
|
|
|
- this.$set(this.form.datasource[index], 'planEndDate', '')
|
|
|
- this.$set(this.form.datasource[index], 'name', '')
|
|
|
- this.$set(this.form.datasource[index], 'stage', '')
|
|
|
- })
|
|
|
- },
|
|
|
+ },
|
|
|
+ // 获取人员数据
|
|
|
+ getUserList(groupId, index) {
|
|
|
+ if (groupId) {
|
|
|
+ this.$refs['directorRef' + index].getList({ groupId });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ personChange(val, info, index) {
|
|
|
+ // this.$set(this.form.datasource[index], 'responsibleUserName', info.name);
|
|
|
+ },
|
|
|
+ //
|
|
|
+ clearData() {
|
|
|
+ this.form.datasource.forEach((item, index) => {
|
|
|
+ this.$set(this.form.datasource[index], 'deliverContent', '');
|
|
|
+ this.$set(this.form.datasource[index], 'milepost', '');
|
|
|
+ this.$set(this.form.datasource[index], 'isMilepost', 0);
|
|
|
+ this.$set(this.form.datasource[index], 'responsibleUserIds', '');
|
|
|
+ this.$set(this.form.datasource[index], 'responsibleUserName', '');
|
|
|
+ this.$set(this.form.datasource[index], 'planStartDate', '');
|
|
|
+ this.$set(this.form.datasource[index], 'planEndDate', '');
|
|
|
+ this.$set(this.form.datasource[index], 'name', '');
|
|
|
+ this.$set(this.form.datasource[index], 'stage', '');
|
|
|
+ });
|
|
|
+ },
|
|
|
|
|
|
- //删除关联信息数据
|
|
|
- handleDelInfo(index) {
|
|
|
- this.form.datasource.splice(index, 1)
|
|
|
- },
|
|
|
- // async handleStatus(API, msg, row) {
|
|
|
- // let message = '确定' + msg + '该计划节点吗';
|
|
|
- // this.$confirm(message, '提示', {
|
|
|
- // type: 'warning'
|
|
|
- // }).then(async () => {
|
|
|
- // await API(row.id)
|
|
|
- // this.$message.success('操作成功');
|
|
|
- // this.$emit('init',this.dialogForm);
|
|
|
- // }).catch(() => {
|
|
|
- // });
|
|
|
- // },
|
|
|
- getTableValidate() {
|
|
|
- return new Promise((resolve, reject) => {
|
|
|
- //if (this.form.datasource.length == 0) return this.$message.warning('请填写计划节点')
|
|
|
- this.$refs.form.validate((valid) => {
|
|
|
- if (!valid) {
|
|
|
- this.$message.warning('有必填项未填,请检查')
|
|
|
- reject('有必填项未填,请检查')
|
|
|
- } else {
|
|
|
- resolve(this.form.datasource)
|
|
|
- }
|
|
|
- })
|
|
|
- })
|
|
|
- },
|
|
|
- }
|
|
|
-}
|
|
|
+ //删除关联信息数据
|
|
|
+ handleDelInfo(index) {
|
|
|
+ this.form.datasource.splice(index, 1);
|
|
|
+ },
|
|
|
+ // async handleStatus(API, msg, row) {
|
|
|
+ // let message = '确定' + msg + '该计划节点吗';
|
|
|
+ // this.$confirm(message, '提示', {
|
|
|
+ // type: 'warning'
|
|
|
+ // }).then(async () => {
|
|
|
+ // await API(row.id)
|
|
|
+ // this.$message.success('操作成功');
|
|
|
+ // this.$emit('init',this.dialogForm);
|
|
|
+ // }).catch(() => {
|
|
|
+ // });
|
|
|
+ // },
|
|
|
+ getTableValidate() {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ //if (this.form.datasource.length == 0) return this.$message.warning('请填写计划节点')
|
|
|
+ this.$refs.form.validate((valid) => {
|
|
|
+ if (!valid) {
|
|
|
+ this.$message.warning('有必填项未填,请检查');
|
|
|
+ reject('有必填项未填,请检查');
|
|
|
+ } else {
|
|
|
+ resolve(this.form.datasource);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
</script>
|
|
|
|
|
|
-
|
|
|
<style scoped lang="scss">
|
|
|
-.el-dropdown-link {
|
|
|
- cursor: pointer;
|
|
|
- color: #188ffd;
|
|
|
-}
|
|
|
-::v-deep .ele-table-tool-default {
|
|
|
- display: flex !important;
|
|
|
-}
|
|
|
+ .el-dropdown-link {
|
|
|
+ cursor: pointer;
|
|
|
+ color: #188ffd;
|
|
|
+ }
|
|
|
+ ::v-deep .ele-table-tool-default {
|
|
|
+ display: flex !important;
|
|
|
+ }
|
|
|
</style>
|