|
|
|
|
@ -55,9 +55,7 @@
|
|
|
|
|
<div class="header-left">
|
|
|
|
|
<i class="el-icon-document-copy section-icon"></i>
|
|
|
|
|
<span class="section-title">合同信息</span>
|
|
|
|
|
<el-tag v-if="contractList.length > 0" type="info" size="small" class="count-tag">
|
|
|
|
|
{{ contractList.length }} 条
|
|
|
|
|
</el-tag>
|
|
|
|
|
<el-tag v-if="contractList.length > 0" type="info" size="small" class="count-tag"> {{ contractList.length }} 条 </el-tag>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="header-actions">
|
|
|
|
|
<el-button size="default" type="primary" plain icon="Link" @click="openContractPage">前往合同页面</el-button>
|
|
|
|
|
@ -105,9 +103,7 @@
|
|
|
|
|
<div class="header-left">
|
|
|
|
|
<i class="el-icon-coin section-icon"></i>
|
|
|
|
|
<span class="section-title">预算信息</span>
|
|
|
|
|
<el-tag v-if="budgetTotal > 0" type="info" size="small" class="count-tag">
|
|
|
|
|
{{ budgetTotal }} 条
|
|
|
|
|
</el-tag>
|
|
|
|
|
<el-tag v-if="budgetTotal > 0" type="info" size="small" class="count-tag"> {{ budgetTotal }} 条 </el-tag>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="header-actions">
|
|
|
|
|
<el-button size="default" type="primary" plain icon="Link" @click="openBudgetPage">预算页面</el-button>
|
|
|
|
|
@ -163,9 +159,7 @@
|
|
|
|
|
<div class="header-left">
|
|
|
|
|
<i class="el-icon-calendar section-icon"></i>
|
|
|
|
|
<span class="section-title">项目计划</span>
|
|
|
|
|
<el-tag v-if="planTotal > 0" type="info" size="small" class="count-tag">
|
|
|
|
|
{{ planTotal }} 条
|
|
|
|
|
</el-tag>
|
|
|
|
|
<el-tag v-if="planTotal > 0" type="info" size="small" class="count-tag"> {{ planTotal }} 条 </el-tag>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="header-actions">
|
|
|
|
|
<el-button size="default" type="primary" plain icon="Link" @click="openPlanPage">项目计划页面</el-button>
|
|
|
|
|
@ -207,6 +201,59 @@
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
|
|
|
|
|
<!-- 新增:项目变更 Tab -->
|
|
|
|
|
<el-tab-pane label="项目变更" name="change">
|
|
|
|
|
<div v-loading="loadingChange" class="tab-content">
|
|
|
|
|
<div class="section-header">
|
|
|
|
|
<div class="header-left">
|
|
|
|
|
<i class="el-icon-edit-outline section-icon"></i>
|
|
|
|
|
<span class="section-title">项目变更</span>
|
|
|
|
|
<el-tag v-if="changeTotal > 0" type="info" size="small" class="count-tag"> {{ changeTotal }} 条 </el-tag>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="header-actions">
|
|
|
|
|
<el-button size="default" type="primary" plain icon="Link" @click="openChangePage">项目变更页面</el-button>
|
|
|
|
|
<el-button size="default" icon="Refresh" @click="loadChangeList">刷新</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<el-table :data="changeList" size="default" border stripe v-loading="loadingChange" class="data-table">
|
|
|
|
|
<el-table-column type="index" label="序号" width="60" align="center" />
|
|
|
|
|
<el-table-column label="变更编号" prop="projectChangeCode" width="180" show-overflow-tooltip />
|
|
|
|
|
<el-table-column label="变更类别" prop="changeType" width="150" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<dict-tag :options="change_type" :value="scope.row.changeType" />
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="变更次数" prop="changeNumber" width="100" align="center" />
|
|
|
|
|
<el-table-column label="申请变更时间" prop="applyChangeDate" width="120" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<span>{{ scope.row.applyChangeDate }}</span>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="变更原因" prop="changeReason" min-width="200" show-overflow-tooltip />
|
|
|
|
|
<el-table-column label="后续工作" prop="followUpWork" min-width="200" show-overflow-tooltip />
|
|
|
|
|
<el-table-column label="流程状态" prop="flowStatus" width="120" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<dict-tag :options="wf_business_status" :value="scope.row.flowStatus" />
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="操作" width="100" align="center" fixed="right">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-button size="default" type="primary" text @click="viewChange(scope.row)">查看</el-button>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
</el-table>
|
|
|
|
|
<el-empty v-if="!loadingChange && changeList.length === 0" description="暂无项目变更" class="empty-state" />
|
|
|
|
|
<pagination
|
|
|
|
|
v-show="changeTotal > 0"
|
|
|
|
|
:total="changeTotal"
|
|
|
|
|
v-model:page="changeQuery.pageNum"
|
|
|
|
|
v-model:limit="changeQuery.pageSize"
|
|
|
|
|
@pagination="loadChangeList"
|
|
|
|
|
class="pagination-wrapper"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
</el-tabs>
|
|
|
|
|
</el-card>
|
|
|
|
|
</div>
|
|
|
|
|
@ -223,13 +270,40 @@ import { ErpProjectPlanVO } from '@/api/oa/erp/erpProjectPlan/types';
|
|
|
|
|
import { ProjectInfoVO } from '@/api/oa/erp/projectInfo/types';
|
|
|
|
|
import { getErpProjectContractsList } from '@/api/oa/erp/projectContracts';
|
|
|
|
|
import { ProjectContractsVO } from '@/api/oa/erp/projectContracts/types';
|
|
|
|
|
import { listErpProjectChange } from '@/api/oa/erp/erpProjectChange';
|
|
|
|
|
import { ErpProjectChangeVO } from '@/api/oa/erp/erpProjectChange/types';
|
|
|
|
|
|
|
|
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
|
|
const route = useRoute();
|
|
|
|
|
const router = useRouter();
|
|
|
|
|
|
|
|
|
|
const { contract_flag, project_category, business_direction, project_status, wf_business_status, active_flag, contract_status, contract_category, project_plan_status, budget_status } =
|
|
|
|
|
toRefs<any>(proxy?.useDict('contract_flag', 'project_category', 'business_direction', 'project_status', 'wf_business_status', 'active_flag', 'contract_status', 'contract_category', 'project_plan_status', 'budget_status'));
|
|
|
|
|
const {
|
|
|
|
|
contract_flag,
|
|
|
|
|
project_category,
|
|
|
|
|
business_direction,
|
|
|
|
|
project_status,
|
|
|
|
|
wf_business_status,
|
|
|
|
|
active_flag,
|
|
|
|
|
contract_status,
|
|
|
|
|
contract_category,
|
|
|
|
|
project_plan_status,
|
|
|
|
|
budget_status,
|
|
|
|
|
change_type
|
|
|
|
|
} = toRefs<any>(
|
|
|
|
|
proxy?.useDict(
|
|
|
|
|
'contract_flag',
|
|
|
|
|
'project_category',
|
|
|
|
|
'business_direction',
|
|
|
|
|
'project_status',
|
|
|
|
|
'wf_business_status',
|
|
|
|
|
'active_flag',
|
|
|
|
|
'contract_status',
|
|
|
|
|
'contract_category',
|
|
|
|
|
'project_plan_status',
|
|
|
|
|
'budget_status',
|
|
|
|
|
'change_type'
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const projectId = computed(() => route.params.projectId as string | number | undefined);
|
|
|
|
|
const projectInfo = ref<ProjectInfoVO | null>(null);
|
|
|
|
|
@ -253,21 +327,31 @@ const planTotal = ref(0);
|
|
|
|
|
const budgetQuery = reactive({ pageNum: 1, pageSize: 5, projectId: undefined });
|
|
|
|
|
const planQuery = reactive({ pageNum: 1, pageSize: 5, projectId: undefined });
|
|
|
|
|
|
|
|
|
|
// 新增:项目变更相关变量
|
|
|
|
|
const loadingChange = ref(false);
|
|
|
|
|
const changeList = ref<ErpProjectChangeVO[]>([]);
|
|
|
|
|
const changeTotal = ref(0);
|
|
|
|
|
const changeQuery = reactive({ pageNum: 1, pageSize: 5, projectId: undefined });
|
|
|
|
|
|
|
|
|
|
const handleBack = () => {
|
|
|
|
|
proxy?.$tab.closePage(route);
|
|
|
|
|
router.back();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const openContractPage = () => {
|
|
|
|
|
proxy?.$tab.openPage('/oa/erp/contractInfo', '合同管理');
|
|
|
|
|
proxy?.$tab.openPage('/contract/contractInfo', '合同管理');
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const openBudgetPage = () => {
|
|
|
|
|
proxy?.$tab.openPage('/oa/erp/budgetInfo', '项目预算');
|
|
|
|
|
proxy?.$tab.openPage('/budget/erp/budgetInfo', '项目预算');
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const openPlanPage = () => {
|
|
|
|
|
proxy?.$tab.openPage('/oa/erp/erpProjectPlan', '项目计划');
|
|
|
|
|
proxy?.$tab.openPage('/project/erpProjectPlan', '项目计划');
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const openChangePage = () => {
|
|
|
|
|
proxy?.$tab.openPage('/project/erpProjectChange', '项目变更');
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const viewBudget = (row: budgetInfoVO) => {
|
|
|
|
|
@ -291,6 +375,14 @@ const viewContract = (row: ProjectContractsVO) => {
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const viewChange = (row: ErpProjectChangeVO) => {
|
|
|
|
|
if (!row?.projectChangeId) return;
|
|
|
|
|
proxy?.$tab.openPage('/oa/erp/erpProjectChange/edit', '项目变更详情', {
|
|
|
|
|
id: row.projectChangeId,
|
|
|
|
|
type: 'view'
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 格式化数字,添加千分位
|
|
|
|
|
const formatNumber = (num: number) => {
|
|
|
|
|
if (!num) return '0';
|
|
|
|
|
@ -365,6 +457,25 @@ const loadProjectInfo = async () => {
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const loadChangeList = async () => {
|
|
|
|
|
if (!projectId.value) {
|
|
|
|
|
changeList.value = [];
|
|
|
|
|
changeTotal.value = 0;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
loadingChange.value = true;
|
|
|
|
|
try {
|
|
|
|
|
const res: any = await listErpProjectChange({
|
|
|
|
|
...changeQuery,
|
|
|
|
|
projectId: projectId.value
|
|
|
|
|
});
|
|
|
|
|
changeList.value = res.rows || [];
|
|
|
|
|
changeTotal.value = res.total || 0;
|
|
|
|
|
} finally {
|
|
|
|
|
loadingChange.value = false;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 标签切换处理
|
|
|
|
|
const handleTabChange = (tabName: string) => {
|
|
|
|
|
if (!loadedTabs.value.has(tabName)) {
|
|
|
|
|
@ -383,6 +494,11 @@ const handleTabChange = (tabName: string) => {
|
|
|
|
|
planQuery.projectId = projectId.value;
|
|
|
|
|
loadPlanList();
|
|
|
|
|
break;
|
|
|
|
|
case 'change':
|
|
|
|
|
changeQuery.pageNum = 1;
|
|
|
|
|
changeQuery.projectId = projectId.value;
|
|
|
|
|
loadChangeList();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
@ -391,6 +507,7 @@ const loadAll = async () => {
|
|
|
|
|
await loadProjectInfo();
|
|
|
|
|
budgetQuery.projectId = projectId.value;
|
|
|
|
|
planQuery.projectId = projectId.value;
|
|
|
|
|
changeQuery.projectId = projectId.value;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
watch(
|
|
|
|
|
@ -510,4 +627,3 @@ watch(
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</style>
|
|
|
|
|
|
|
|
|
|
|