|
|
|
|
@ -2,7 +2,6 @@
|
|
|
|
|
<div class="p-2">
|
|
|
|
|
<el-card shadow="never">
|
|
|
|
|
<approvalButton
|
|
|
|
|
v-if="!isViewMode"
|
|
|
|
|
@submitForm="handleApprovalSubmit"
|
|
|
|
|
@approvalVerifyOpen="approvalVerifyOpen"
|
|
|
|
|
@handleApprovalRecord="handleApprovalRecord"
|
|
|
|
|
@ -12,37 +11,24 @@
|
|
|
|
|
:pageType="approvalPageType"
|
|
|
|
|
:mode="false"
|
|
|
|
|
/>
|
|
|
|
|
<!-- 查看模式下显示返回按钮和审批记录 -->
|
|
|
|
|
<el-row v-if="isViewMode" :gutter="10" class="mb-2">
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-button @click="goBack">返回</el-button>
|
|
|
|
|
<el-button v-if="form.projectChangeStatus === '2' || form.projectChangeStatus === '3'" @click="handleApprovalRecord">查看审批记录</el-button>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
|
|
|
|
|
<el-form ref="projectChangeFormRef" :model="form" :rules="rules" label-width="140px">
|
|
|
|
|
<el-form ref="projectChangeFormRef" :model="form" :disabled="!isFormEditable" :rules="rules" label-width="140px">
|
|
|
|
|
<!-- 基本信息 -->
|
|
|
|
|
<el-divider content-position="left">基本信息</el-divider>
|
|
|
|
|
<el-row :gutter="20">
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="项目名称" prop="projectId">
|
|
|
|
|
<el-select
|
|
|
|
|
v-if="showProjectSelect"
|
|
|
|
|
v-model="form.projectId"
|
|
|
|
|
placeholder="请选择项目"
|
|
|
|
|
@change="handleProjectChange"
|
|
|
|
|
style="width: 100%"
|
|
|
|
|
>
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="project in projectInfoList"
|
|
|
|
|
:key="project.projectId"
|
|
|
|
|
:label="project.projectName"
|
|
|
|
|
:value="project.projectId"
|
|
|
|
|
/>
|
|
|
|
|
<el-select v-if="showProjectSelect" v-model="form.projectId" placeholder="请选择项目" @change="handleProjectChange" style="width: 100%">
|
|
|
|
|
<el-option v-for="project in projectInfoList" :key="project.projectId" :label="project.projectName" :value="project.projectId" />
|
|
|
|
|
</el-select>
|
|
|
|
|
<el-input v-else v-model="form.projectName" disabled placeholder="项目名称" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="项目变更编号" prop="projectChangeCode">
|
|
|
|
|
<el-input v-model="form.projectChangeCode" placeholder="由系统自动生成" disabled />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="项目编号">
|
|
|
|
|
<el-input v-model="form.projectCode" disabled />
|
|
|
|
|
@ -82,14 +68,13 @@
|
|
|
|
|
type="date"
|
|
|
|
|
value-format="YYYY-MM-DD"
|
|
|
|
|
placeholder="请选择申请变更日期"
|
|
|
|
|
:disabled="!isFormEditable"
|
|
|
|
|
style="width: 100%"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="变更类型" prop="changeType">
|
|
|
|
|
<el-checkbox-group v-model="changeTypeList" :disabled="!isFormEditable">
|
|
|
|
|
<el-checkbox-group v-model="changeTypeList">
|
|
|
|
|
<el-checkbox v-for="dict in change_type" :key="dict.value" :label="dict.value">{{ dict.label }}</el-checkbox>
|
|
|
|
|
</el-checkbox-group>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
@ -100,12 +85,12 @@
|
|
|
|
|
<el-row :gutter="20" class="mb-2">
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item label="当前合同额">
|
|
|
|
|
<el-input-number v-model="form.contractAmount" :precision="2" disabled style="width: 100%" />
|
|
|
|
|
<el-input-number v-model="form.contractAmount" :precision="2" :disabled="!isFormEditable" style="width: 100%" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item label="当前合同净额">
|
|
|
|
|
<el-input-number v-model="form.contractNetAmount" :precision="2" disabled style="width: 100%" />
|
|
|
|
|
<el-input-number v-model="form.contractNetAmount" :precision="2" :disabled="!isFormEditable" style="width: 100%" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
@ -118,37 +103,39 @@
|
|
|
|
|
<el-table-column label="序号" type="index" width="60" align="center" />
|
|
|
|
|
<el-table-column label="科目名称" width="200" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-input v-model="scope.row.subjectName" placeholder="请输入科目名称" :disabled="!isFormEditable" />
|
|
|
|
|
<el-input v-model="scope.row.subjectName" placeholder="请输入科目名称" />
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="变更前预算" width="150" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-input-number v-model="scope.row.budgetBefore" :min="0" :precision="2" controls-position="right" :disabled="!isFormEditable" style="width: 100%" />
|
|
|
|
|
<el-input-number v-model="scope.row.budgetBefore" :min="0" :precision="2" controls-position="right" style="width: 100%" />
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="变更后预算" width="150" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-input-number v-model="scope.row.budgetAfter" :min="0" :precision="2" controls-position="right" :disabled="!isFormEditable" style="width: 100%" />
|
|
|
|
|
<el-input-number v-model="scope.row.budgetAfter" :min="0" :precision="2" controls-position="right" style="width: 100%" />
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="已使用金额" width="150" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-input-number v-model="scope.row.amountUsed" :min="0" :precision="2" controls-position="right" :disabled="!isFormEditable" style="width: 100%" />
|
|
|
|
|
<el-input-number v-model="scope.row.amountUsed" :min="0" :precision="2" controls-position="right" style="width: 100%" />
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="费用调整原因" min-width="200" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-input v-model="scope.row.adjustmentReason" placeholder="请输入费用调整原因" :disabled="!isFormEditable" />
|
|
|
|
|
<el-input v-model="scope.row.adjustmentReason" placeholder="请输入费用调整原因" />
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="备注" min-width="150" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-input v-model="scope.row.remark" placeholder="请输入备注" :disabled="!isFormEditable" />
|
|
|
|
|
<el-input v-model="scope.row.remark" placeholder="请输入备注" />
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column v-if="isFormEditable" label="操作" width="80" align="center" fixed="right">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-button type="danger" link icon="Delete" @click="handleDeleteBudget(scope.$index)">删除</el-button>
|
|
|
|
|
<!-- 只允许删除新增的预算行,不允许删除从后端带出的原有预算科目 -->
|
|
|
|
|
<el-button v-if="!scope.row.changeBudgetId" type="danger" link icon="Delete" @click="handleDeleteBudget(scope.$index)">删除</el-button>
|
|
|
|
|
<span v-else style="color: #909399; font-size: 12px">原有科目</span>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
</el-table>
|
|
|
|
|
@ -163,7 +150,7 @@
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="里程碑名称" width="150" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-input v-model="scope.row.milestoneName" placeholder="请输入里程碑名称" :disabled="!isFormEditable" />
|
|
|
|
|
<el-input v-model="scope.row.milestoneName" placeholder="请输入里程碑名称" />
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="原计划时间起" width="160" align="center">
|
|
|
|
|
@ -178,22 +165,29 @@
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="变更后时间起" width="160" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-date-picker v-model="scope.row.changedStart" type="date" value-format="YYYY-MM-DD" placeholder="选择日期" :disabled="!isFormEditable" style="width: 100%" />
|
|
|
|
|
<el-date-picker v-model="scope.row.changedStart" type="date" value-format="YYYY-MM-DD" placeholder="选择日期" style="width: 100%" />
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="变更后时间止" width="160" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-date-picker v-model="scope.row.changedEnd" type="date" value-format="YYYY-MM-DD" placeholder="选择日期" :disabled="!isFormEditable" style="width: 100%" />
|
|
|
|
|
<el-date-picker v-model="scope.row.changedEnd" type="date" value-format="YYYY-MM-DD" placeholder="选择日期" style="width: 100%" />
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="完成程度" width="120" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-input-number v-model="scope.row.completionDegree" :min="0" :max="100" :precision="0" controls-position="right" :disabled="!isFormEditable" style="width: 100%" />
|
|
|
|
|
<el-input-number
|
|
|
|
|
v-model="scope.row.completionDegree"
|
|
|
|
|
:min="0"
|
|
|
|
|
:max="100"
|
|
|
|
|
:precision="0"
|
|
|
|
|
controls-position="right"
|
|
|
|
|
style="width: 100%"
|
|
|
|
|
/>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="备注" min-width="200" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-input v-model="scope.row.remark" placeholder="请输入备注" :disabled="!isFormEditable" />
|
|
|
|
|
<el-input v-model="scope.row.remark" placeholder="请输入备注" />
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
</el-table>
|
|
|
|
|
@ -202,17 +196,17 @@
|
|
|
|
|
<el-row :gutter="20">
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="当前情况" prop="currentStatus">
|
|
|
|
|
<el-input v-model="form.currentStatus" type="textarea" :rows="3" placeholder="请输入当前情况" :disabled="!isFormEditable" />
|
|
|
|
|
<el-input v-model="form.currentStatus" type="textarea" :rows="3" placeholder="请输入当前情况" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="变更原因" prop="changeReason">
|
|
|
|
|
<el-input v-model="form.changeReason" type="textarea" :rows="3" placeholder="请输入变更原因" :disabled="!isFormEditable" />
|
|
|
|
|
<el-input v-model="form.changeReason" type="textarea" :rows="3" placeholder="请输入变更原因" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="后续工作" prop="followUpWork">
|
|
|
|
|
<el-input v-model="form.followUpWork" type="textarea" :rows="3" placeholder="请输入后续工作" :disabled="!isFormEditable" />
|
|
|
|
|
<el-input v-model="form.followUpWork" type="textarea" :rows="3" placeholder="请输入后续工作" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
@ -225,14 +219,19 @@
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts" name="ErpProjectChangeEdit">
|
|
|
|
|
import { ref, reactive, onMounted, getCurrentInstance, toRefs, watch, onActivated, nextTick, computed } from 'vue';
|
|
|
|
|
import type { ComponentInternalInstance } from 'vue';
|
|
|
|
|
import { computed, getCurrentInstance, nextTick, onActivated, onMounted, reactive, ref, toRefs, watch } from 'vue';
|
|
|
|
|
import { useRoute, useRouter } from 'vue-router';
|
|
|
|
|
import { getErpProjectChange, addErpProjectChange, updateErpProjectChange, prepareProjectChangeWithInfo, submitProjectChangeAndFlowStart } from '@/api/oa/erp/erpProjectChange';
|
|
|
|
|
import { ElMessage, ElMessageBox } from 'element-plus';
|
|
|
|
|
import {
|
|
|
|
|
addErpProjectChange,
|
|
|
|
|
getErpProjectChange,
|
|
|
|
|
prepareProjectChangeWithInfo,
|
|
|
|
|
submitProjectChangeAndFlowStart,
|
|
|
|
|
updateErpProjectChange
|
|
|
|
|
} from '@/api/oa/erp/erpProjectChange';
|
|
|
|
|
import { ElMessage } from 'element-plus';
|
|
|
|
|
import { useUserStore } from '@/store/modules/user';
|
|
|
|
|
import type { ErpProjectChangeForm, ErpProjectChangeBudget } from '@/api/oa/erp/erpProjectChange/types';
|
|
|
|
|
import { useDict } from '@/utils/dict';
|
|
|
|
|
import type { ErpProjectChangeBudget, ErpProjectChangeForm } from '@/api/oa/erp/erpProjectChange/types';
|
|
|
|
|
// import approvalButton from '@/components/Workflow/approvalButton.vue';
|
|
|
|
|
// import SubmitVerify from '@/components/Workflow/SubmitVerify.vue';
|
|
|
|
|
// import ApprovalRecord from '@/components/Workflow/ApprovalRecord.vue';
|
|
|
|
|
@ -259,6 +258,13 @@ const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
|
|
|
|
|
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
|
|
|
|
|
const taskVariables = ref<Record<string, any>>({});
|
|
|
|
|
|
|
|
|
|
// 标记是否已经生成过项目变更编号
|
|
|
|
|
// 设计思路:
|
|
|
|
|
// 1. 新增模式:后端在首次保存或提交流程时生成 projectChangeCode,此时 isCodeGenerated 为 false
|
|
|
|
|
// 2. 编辑模式:如果从后端加载到已有的 projectChangeCode,则认为编号已经生成,不允许前端再次生成
|
|
|
|
|
// 3. 当前页面暂未提供“生成项目变更编号”按钮,但预留该标志位,未来可用于控制按钮禁用状态
|
|
|
|
|
const isCodeGenerated = ref(false);
|
|
|
|
|
|
|
|
|
|
// 计算属性:判断是否为查看模式
|
|
|
|
|
const isViewMode = computed(() => routeParams.value.type === 'view');
|
|
|
|
|
// 计算属性:判断是否为审批模式
|
|
|
|
|
@ -292,6 +298,7 @@ const toDateOnly = (time?: string) => {
|
|
|
|
|
|
|
|
|
|
const getDefaultForm = (): ErpProjectChangeForm => ({
|
|
|
|
|
projectChangeId: undefined,
|
|
|
|
|
projectChangeCode: '',
|
|
|
|
|
projectId: undefined,
|
|
|
|
|
projectCode: '',
|
|
|
|
|
projectName: '',
|
|
|
|
|
@ -382,6 +389,8 @@ const handleProjectChange = async (projectId: string | number) => {
|
|
|
|
|
const resetFormState = async () => {
|
|
|
|
|
form.value = { ...getDefaultForm() };
|
|
|
|
|
changeTypeList.value = [];
|
|
|
|
|
// 重置为“未生成编号”状态,防止上一次编辑的值残留
|
|
|
|
|
isCodeGenerated.value = false;
|
|
|
|
|
await nextTick();
|
|
|
|
|
projectChangeFormRef.value?.clearValidate?.();
|
|
|
|
|
};
|
|
|
|
|
@ -448,6 +457,9 @@ const handleSave = async (action: 'draft' | 'submit') => {
|
|
|
|
|
form.value.changeType = changeTypeList.value.join(',');
|
|
|
|
|
|
|
|
|
|
if (action === 'draft') {
|
|
|
|
|
// 暂存时保持草稿状态
|
|
|
|
|
form.value.projectChangeStatus = '1';
|
|
|
|
|
form.value.flowStatus = 'draft';
|
|
|
|
|
draftLoading.value = true;
|
|
|
|
|
try {
|
|
|
|
|
if (form.value.projectChangeId) {
|
|
|
|
|
@ -463,6 +475,9 @@ const handleSave = async (action: 'draft' | 'submit') => {
|
|
|
|
|
draftLoading.value = false;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 提交审批时设置为审批中,与项目信息模块保持一致
|
|
|
|
|
form.value.projectChangeStatus = '2';
|
|
|
|
|
form.value.flowStatus = 'waiting';
|
|
|
|
|
submitLoading.value = true;
|
|
|
|
|
try {
|
|
|
|
|
// 设置流程编码
|
|
|
|
|
@ -543,6 +558,9 @@ const loadFormData = async () => {
|
|
|
|
|
form.value.applyChangeDate = dateOnly ?? formatToday();
|
|
|
|
|
form.value.budgetList = res.data.budgetList ?? [];
|
|
|
|
|
form.value.progressList = res.data.progressList ?? [];
|
|
|
|
|
// 如果后端已返回项目变更编号,则认为编号已生成
|
|
|
|
|
// 用于后续(如增加“生成编号”按钮时)控制按钮禁用状态
|
|
|
|
|
isCodeGenerated.value = !!form.value.projectChangeCode;
|
|
|
|
|
if (res.data.changeType) {
|
|
|
|
|
changeTypeList.value = res.data.changeType.split(',');
|
|
|
|
|
}
|
|
|
|
|
@ -563,6 +581,9 @@ const loadFormData = async () => {
|
|
|
|
|
form.value.applyChangeDate = dateOnly ?? formatToday();
|
|
|
|
|
form.value.budgetList = res.data.budgetList ?? [];
|
|
|
|
|
form.value.progressList = res.data.progressList ?? [];
|
|
|
|
|
// 根据是否已有编号控制生成按钮状态
|
|
|
|
|
// true 表示当前记录已经有 projectChangeCode,后续不应再允许前端重新生成
|
|
|
|
|
isCodeGenerated.value = !!form.value.projectChangeCode;
|
|
|
|
|
if (res.data.changeType) {
|
|
|
|
|
changeTypeList.value = res.data.changeType.split(',');
|
|
|
|
|
}
|
|
|
|
|
|