|
@@ -10,8 +10,8 @@
|
|
|
<el-option v-for="dict in projectTypeOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
<el-option v-for="dict in projectTypeOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="项目状态" prop="status">
|
|
|
|
|
- <el-select v-model="queryParams.status" placeholder="项目状态" clearable style="width: 200px">
|
|
|
|
|
|
|
+ <el-form-item label="项目状态" prop="projectStatus">
|
|
|
|
|
+ <el-select v-model="queryParams.projectStatus" placeholder="项目状态" clearable style="width: 200px">
|
|
|
<el-option v-for="dict in projectStatusOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
<el-option v-for="dict in projectStatusOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -79,28 +79,28 @@
|
|
|
<el-table-column label="实际产值(万元)" align="center" prop="actualOutput" width="120" />
|
|
<el-table-column label="实际产值(万元)" align="center" prop="actualOutput" width="120" />
|
|
|
<el-table-column label="项目状态" align="center" width="160">
|
|
<el-table-column label="项目状态" align="center" width="160">
|
|
|
<template #default="scope">
|
|
<template #default="scope">
|
|
|
- <ReviewStatusTag :status="scope.row.status" :options="statusTagOptions" />
|
|
|
|
|
|
|
+ <ReviewStatusTag :status="scope.row.projectStatus" :options="statusTagOptions" />
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
<el-table-column label="操作" align="center" width="240" class-name="small-padding fixed-width">
|
|
<el-table-column label="操作" align="center" width="240" class-name="small-padding fixed-width">
|
|
|
<template #default="scope">
|
|
<template #default="scope">
|
|
|
<el-button link type="primary" icon="View" @click="handleDetail(scope.row)">详情</el-button>
|
|
<el-button link type="primary" icon="View" @click="handleDetail(scope.row)">详情</el-button>
|
|
|
- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-if="scope.row.status !== 'COMPLETED'" v-hasPermi="['performance:project:edit']">编辑</el-button>
|
|
|
|
|
- <el-dropdown @command="(cmd) => handleStatusChange(scope.row, cmd)" v-if="getAvailableTransitions(scope.row.status).length > 0">
|
|
|
|
|
|
|
+ <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-if="scope.row.projectStatus !== 'COMPLETED'" v-hasPermi="['performance:project:edit']">编辑</el-button>
|
|
|
|
|
+ <el-dropdown @command="(cmd) => handleStatusChange(scope.row, cmd)" v-if="getAvailableTransitions(scope.row.projectStatus).length > 0">
|
|
|
<el-button link type="warning" icon="Switch">
|
|
<el-button link type="warning" icon="Switch">
|
|
|
状态<el-icon class="el-icon--right"><arrow-down /></el-icon>
|
|
状态<el-icon class="el-icon--right"><arrow-down /></el-icon>
|
|
|
</el-button>
|
|
</el-button>
|
|
|
<template #dropdown>
|
|
<template #dropdown>
|
|
|
<el-dropdown-menu>
|
|
<el-dropdown-menu>
|
|
|
<el-dropdown-item
|
|
<el-dropdown-item
|
|
|
- v-for="t in getAvailableTransitions(scope.row.status)"
|
|
|
|
|
|
|
+ v-for="t in getAvailableTransitions(scope.row.projectStatus)"
|
|
|
:key="t.value"
|
|
:key="t.value"
|
|
|
:command="t.value"
|
|
:command="t.value"
|
|
|
>{{ t.label }}</el-dropdown-item>
|
|
>{{ t.label }}</el-dropdown-item>
|
|
|
</el-dropdown-menu>
|
|
</el-dropdown-menu>
|
|
|
</template>
|
|
</template>
|
|
|
</el-dropdown>
|
|
</el-dropdown>
|
|
|
- <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-if="scope.row.status === 'PLANNING_NOT_STARTED'" v-hasPermi="['performance:project:remove']">删除</el-button>
|
|
|
|
|
|
|
+ <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-if="scope.row.projectStatus === 'PLANNING_NOT_STARTED'" v-hasPermi="['performance:project:remove']">删除</el-button>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
</el-table>
|
|
</el-table>
|
|
@@ -118,11 +118,11 @@
|
|
|
>
|
|
>
|
|
|
<template #actions>
|
|
<template #actions>
|
|
|
<el-button type="primary" size="small" @click.stop="handleUpdate(project)" v-hasPermi="['performance:project:edit']">编辑</el-button>
|
|
<el-button type="primary" size="small" @click.stop="handleUpdate(project)" v-hasPermi="['performance:project:edit']">编辑</el-button>
|
|
|
- <el-dropdown @command="(cmd) => handleStatusChange(project, cmd)" v-if="getAvailableTransitions(project.status).length > 0">
|
|
|
|
|
|
|
+ <el-dropdown @command="(cmd) => handleStatusChange(project, cmd)" v-if="getAvailableTransitions(project.projectStatus).length > 0">
|
|
|
<el-button type="warning" size="small" @click.stop>状态变更</el-button>
|
|
<el-button type="warning" size="small" @click.stop>状态变更</el-button>
|
|
|
<template #dropdown>
|
|
<template #dropdown>
|
|
|
<el-dropdown-menu>
|
|
<el-dropdown-menu>
|
|
|
- <el-dropdown-item v-for="t in getAvailableTransitions(project.status)" :key="t.value" :command="t.value">{{ t.label }}</el-dropdown-item>
|
|
|
|
|
|
|
+ <el-dropdown-item v-for="t in getAvailableTransitions(project.projectStatus)" :key="t.value" :command="t.value">{{ t.label }}</el-dropdown-item>
|
|
|
</el-dropdown-menu>
|
|
</el-dropdown-menu>
|
|
|
</template>
|
|
</template>
|
|
|
</el-dropdown>
|
|
</el-dropdown>
|
|
@@ -156,8 +156,8 @@
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="协作部门" prop="coopDeptId">
|
|
|
|
|
- <DeptSelector v-model="form.coopDeptId" :useTree="true" :treeData="deptOptions" placeholder="请选择协作部门(可选)" />
|
|
|
|
|
|
|
+ <el-form-item label="协作部门" prop="collabDeptIds">
|
|
|
|
|
+ <DeptSelector v-model="form.collabDeptIds" :useTree="true" :treeData="deptOptions" :multiple="true" placeholder="请选择协作部门(可选)" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
@@ -170,8 +170,8 @@
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="外协成本(万元)" prop="outsourceCost">
|
|
|
|
|
- <el-input-number v-model="form.outsourceCost" :precision="4" :min="0" placeholder="请输入外协成本" style="width: 100%" />
|
|
|
|
|
|
|
+ <el-form-item label="外协成本(万元)" prop="externalCost">
|
|
|
|
|
+ <el-input-number v-model="form.externalCost" :precision="4" :min="0" placeholder="请输入外协成本" style="width: 100%" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
@@ -215,8 +215,8 @@
|
|
|
</el-row>
|
|
</el-row>
|
|
|
<el-row>
|
|
<el-row>
|
|
|
<el-col :span="12">
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="项目状态" prop="status">
|
|
|
|
|
- <el-select v-model="form.status" placeholder="请选择项目状态" style="width: 100%">
|
|
|
|
|
|
|
+ <el-form-item label="项目状态" prop="projectStatus">
|
|
|
|
|
+ <el-select v-model="form.projectStatus" placeholder="请选择项目状态" style="width: 100%">
|
|
|
<el-option v-for="dict in editableStatusOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
<el-option v-for="dict in editableStatusOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -334,7 +334,7 @@ const columns = ref({
|
|
|
contractAmount: { label: '合同额', visible: true },
|
|
contractAmount: { label: '合同额', visible: true },
|
|
|
estimatedOutput: { label: '预估产值', visible: true },
|
|
estimatedOutput: { label: '预估产值', visible: true },
|
|
|
actualOutput: { label: '实际产值', visible: true },
|
|
actualOutput: { label: '实际产值', visible: true },
|
|
|
- status: { label: '项目状态', visible: true }
|
|
|
|
|
|
|
+ projectStatus: { label: '项目状态', visible: true }
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const data = reactive({
|
|
const data = reactive({
|
|
@@ -343,13 +343,13 @@ const data = reactive({
|
|
|
projectName: undefined,
|
|
projectName: undefined,
|
|
|
projectType: undefined,
|
|
projectType: undefined,
|
|
|
leadDeptId: undefined,
|
|
leadDeptId: undefined,
|
|
|
- coopDeptId: undefined,
|
|
|
|
|
|
|
+ collabDeptIds: [],
|
|
|
contractAmount: undefined,
|
|
contractAmount: undefined,
|
|
|
- outsourceCost: undefined,
|
|
|
|
|
|
|
+ externalCost: undefined,
|
|
|
estimatedOutput: undefined,
|
|
estimatedOutput: undefined,
|
|
|
riskLevel: undefined,
|
|
riskLevel: undefined,
|
|
|
successRate: undefined,
|
|
successRate: undefined,
|
|
|
- status: undefined,
|
|
|
|
|
|
|
+ projectStatus: undefined,
|
|
|
remark: undefined
|
|
remark: undefined
|
|
|
},
|
|
},
|
|
|
queryParams: {
|
|
queryParams: {
|
|
@@ -357,14 +357,14 @@ const data = reactive({
|
|
|
pageSize: 10,
|
|
pageSize: 10,
|
|
|
projectName: undefined,
|
|
projectName: undefined,
|
|
|
projectType: undefined,
|
|
projectType: undefined,
|
|
|
- status: undefined,
|
|
|
|
|
|
|
+ projectStatus: undefined,
|
|
|
deptId: undefined
|
|
deptId: undefined
|
|
|
},
|
|
},
|
|
|
rules: {
|
|
rules: {
|
|
|
projectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],
|
|
projectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],
|
|
|
leadDeptId: [{ required: true, message: '牵头部门不能为空', trigger: 'change' }],
|
|
leadDeptId: [{ required: true, message: '牵头部门不能为空', trigger: 'change' }],
|
|
|
projectType: [{ required: true, message: '项目类型不能为空', trigger: 'change' }],
|
|
projectType: [{ required: true, message: '项目类型不能为空', trigger: 'change' }],
|
|
|
- status: [{ required: true, message: '项目状态不能为空', trigger: 'change' }]
|
|
|
|
|
|
|
+ projectStatus: [{ required: true, message: '项目状态不能为空', trigger: 'change' }]
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
|
|
|
|
@@ -373,7 +373,7 @@ const { queryParams, form, rules } = toRefs(data)
|
|
|
const hasContract = computed(() => (form.value.contractAmount || 0) > 0)
|
|
const hasContract = computed(() => (form.value.contractAmount || 0) > 0)
|
|
|
const computedActualOutput = computed(() => {
|
|
const computedActualOutput = computed(() => {
|
|
|
const contract = form.value.contractAmount || 0
|
|
const contract = form.value.contractAmount || 0
|
|
|
- const cost = form.value.outsourceCost || 0
|
|
|
|
|
|
|
+ const cost = form.value.externalCost || 0
|
|
|
return Math.max(0, contract - cost).toFixed(4)
|
|
return Math.max(0, contract - cost).toFixed(4)
|
|
|
})
|
|
})
|
|
|
const computedRiskOutput = computed(() => {
|
|
const computedRiskOutput = computed(() => {
|
|
@@ -427,10 +427,10 @@ function handleSelectionChange(selection) {
|
|
|
function reset() {
|
|
function reset() {
|
|
|
form.value = {
|
|
form.value = {
|
|
|
projectId: undefined, projectName: undefined, projectType: undefined,
|
|
projectId: undefined, projectName: undefined, projectType: undefined,
|
|
|
- leadDeptId: undefined, coopDeptId: undefined,
|
|
|
|
|
- contractAmount: undefined, outsourceCost: undefined,
|
|
|
|
|
|
|
+ leadDeptId: undefined, collabDeptIds: [],
|
|
|
|
|
+ contractAmount: undefined, externalCost: undefined,
|
|
|
estimatedOutput: undefined, riskLevel: undefined, successRate: undefined,
|
|
estimatedOutput: undefined, riskLevel: undefined, successRate: undefined,
|
|
|
- status: undefined, remark: undefined
|
|
|
|
|
|
|
+ projectStatus: undefined, remark: undefined
|
|
|
}
|
|
}
|
|
|
proxy.resetForm('projectRef')
|
|
proxy.resetForm('projectRef')
|
|
|
}
|
|
}
|
|
@@ -462,7 +462,13 @@ function handleUpdate(row) {
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
getProject(projectId).then(res => {
|
|
getProject(projectId).then(res => {
|
|
|
- form.value = res.data
|
|
|
|
|
|
|
+ const data = res.data
|
|
|
|
|
+ if (data.collaborations && data.collaborations.length > 0) {
|
|
|
|
|
+ data.collabDeptIds = data.collaborations.map(c => c.deptId)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ data.collabDeptIds = []
|
|
|
|
|
+ }
|
|
|
|
|
+ form.value = data
|
|
|
open.value = true
|
|
open.value = true
|
|
|
title.value = '修改项目'
|
|
title.value = '修改项目'
|
|
|
})
|
|
})
|
|
@@ -487,7 +493,7 @@ function handleDelete(row) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function handleStatusChange(row, newStatus) {
|
|
function handleStatusChange(row, newStatus) {
|
|
|
- const transition = getAvailableTransitions(row.status).find(t => t.value === newStatus)
|
|
|
|
|
|
|
+ const transition = getAvailableTransitions(row.projectStatus).find(t => t.value === newStatus)
|
|
|
const label = transition ? transition.label : newStatus
|
|
const label = transition ? transition.label : newStatus
|
|
|
proxy.$modal.confirm(`确认将项目「${row.projectName}」的状态${label}?`).then(() => {
|
|
proxy.$modal.confirm(`确认将项目「${row.projectName}」的状态${label}?`).then(() => {
|
|
|
return changeProjectStatus(row.projectId, newStatus)
|
|
return changeProjectStatus(row.projectId, newStatus)
|