feat(projectLedger): 新增项目变更页签及列表展示功能

dev
Yangk 2 weeks ago
parent a1c1f561ec
commit 599b544d50

@ -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>

Loading…
Cancel
Save