新增合约规划的分栏
This commit is contained in:
@@ -71,8 +71,8 @@
|
|||||||
/>
|
/>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<el-row :gutter="16">
|
<SplitPane>
|
||||||
<el-col :span="8">
|
<template #left>
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<div class="mb-12px text-14px font-600">
|
<div class="mb-12px text-14px font-600">
|
||||||
{{ currentProject?.projectName || '合约规划列表' }}
|
{{ currentProject?.projectName || '合约规划列表' }}
|
||||||
@@ -84,7 +84,6 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentPlanningChange"
|
@current-change="handleCurrentPlanningChange"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="序号" type="index" width="70" />
|
|
||||||
<el-table-column align="center" label="项目任务包" min-width="180" prop="planningContent" />
|
<el-table-column align="center" label="项目任务包" min-width="180" prop="planningContent" />
|
||||||
<el-table-column align="center" label="归属类型" min-width="110">
|
<el-table-column align="center" label="归属类型" min-width="110">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -100,9 +99,9 @@
|
|||||||
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</el-col>
|
</template>
|
||||||
|
|
||||||
<el-col :span="16">
|
<template #right>
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<div v-loading="quarterLoading" class="min-h-320px">
|
<div v-loading="quarterLoading" class="min-h-320px">
|
||||||
<template v-if="currentPlanning && formData">
|
<template v-if="currentPlanning && formData">
|
||||||
@@ -224,8 +223,8 @@
|
|||||||
<el-empty v-else-if="!quarterLoading" description="请选择合约规划后查看分配结果" />
|
<el-empty v-else-if="!quarterLoading" description="请选择合约规划后查看分配结果" />
|
||||||
</div>
|
</div>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</el-col>
|
</template>
|
||||||
</el-row>
|
</SplitPane>
|
||||||
|
|
||||||
<Dialog v-model="dialogVisible" title="编辑专业及项目总分配比例" width="920">
|
<Dialog v-model="dialogVisible" title="编辑专业及项目总分配比例" width="920">
|
||||||
<template v-if="editForm">
|
<template v-if="editForm">
|
||||||
@@ -288,6 +287,7 @@ import * as ProjectApi from '@/api/tjt/project'
|
|||||||
import * as PlanningApi from '@/api/tjt/planning'
|
import * as PlanningApi from '@/api/tjt/planning'
|
||||||
import * as PlanningQuarterApi from '@/api/tjt/planningQuarter'
|
import * as PlanningQuarterApi from '@/api/tjt/planningQuarter'
|
||||||
import * as OutputSplitApi from '@/api/tjt/outputSplit'
|
import * as OutputSplitApi from '@/api/tjt/outputSplit'
|
||||||
|
import SplitPane from '@/views/tjt/shared/SplitPane.vue'
|
||||||
import {
|
import {
|
||||||
formatAmountText,
|
formatAmountText,
|
||||||
fromPercentValue,
|
fromPercentValue,
|
||||||
|
|||||||
@@ -111,8 +111,8 @@
|
|||||||
/>
|
/>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<el-row :gutter="16">
|
<SplitPane>
|
||||||
<el-col :span="9">
|
<template #left>
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<div class="mb-12px flex items-center justify-between">
|
<div class="mb-12px flex items-center justify-between">
|
||||||
<div class="text-14px font-600">
|
<div class="text-14px font-600">
|
||||||
@@ -127,7 +127,6 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentPlanningChange"
|
@current-change="handleCurrentPlanningChange"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="序号" type="index" width="70" />
|
|
||||||
<el-table-column
|
<el-table-column
|
||||||
align="center"
|
align="center"
|
||||||
label="项目任务包"
|
label="项目任务包"
|
||||||
@@ -163,12 +162,10 @@
|
|||||||
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</el-col>
|
</template>
|
||||||
|
|
||||||
<el-col :span="15">
|
<template #right>
|
||||||
<div v-loading="quarterLoading" class="min-h-320px">
|
<ContentWrap v-if="currentPlanning">
|
||||||
<template v-if="currentPlanning">
|
|
||||||
<ContentWrap>
|
|
||||||
<div class="mb-16px flex items-center justify-between gap-16px">
|
<div class="mb-16px flex items-center justify-between gap-16px">
|
||||||
<div>
|
<div>
|
||||||
<div class="text-16px font-600">{{ currentPlanning.planningContent }}</div>
|
<div class="text-16px font-600">{{ currentPlanning.planningContent }}</div>
|
||||||
@@ -300,17 +297,19 @@
|
|||||||
</el-descriptions>
|
</el-descriptions>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<ContentWrap>
|
<ContentWrap v-if="currentPlanning">
|
||||||
<div class="mb-16px flex items-center justify-between gap-16px">
|
<div class="mb-16px flex items-center justify-between gap-16px">
|
||||||
<div>
|
<div>
|
||||||
<div class="text-14px font-600">季度分配</div>
|
<div class="text-14px font-600">季度分配</div>
|
||||||
|
<div class="mt-4px text-12px text-[var(--el-text-color-secondary)]">
|
||||||
|
总分配、已分配、待分配和提取进度备注属于合约规划的总体分配控制;季度分配表只展示年度、季度和分配比例明细。
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<el-button
|
<el-button
|
||||||
v-hasPermi="['tjt:planning:update', 'tjt:planning-quarter:update', 'tjt:planning-quarter:create']"
|
v-hasPermi="['tjt:planning:update', 'tjt:planning-quarter:update', 'tjt:planning-quarter:create']"
|
||||||
:disabled="guideDetailMode && !historyParentMode && !activeGuideDetail"
|
|
||||||
plain
|
plain
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="openQuarterDistributionForm(activeGuideDetail?.id)"
|
@click="openQuarterDistributionForm"
|
||||||
>
|
>
|
||||||
编辑季度分配
|
编辑季度分配
|
||||||
</el-button>
|
</el-button>
|
||||||
@@ -329,13 +328,7 @@
|
|||||||
<div class="rounded-8px bg-[var(--el-fill-color-light)] px-16px py-12px">
|
<div class="rounded-8px bg-[var(--el-fill-color-light)] px-16px py-12px">
|
||||||
<div class="text-12px text-[var(--el-text-color-secondary)]">已分配</div>
|
<div class="text-12px text-[var(--el-text-color-secondary)]">已分配</div>
|
||||||
<div class="mt-6px text-18px font-600">
|
<div class="mt-6px text-18px font-600">
|
||||||
{{
|
{{ formatPercentText(currentPlanning.allocatedAmount) }}
|
||||||
formatPercentText(
|
|
||||||
guideDetailMode && activeGuideDetail
|
|
||||||
? activeGuideDetail.allocatedAmount
|
|
||||||
: currentPlanning.allocatedAmount
|
|
||||||
)
|
|
||||||
}}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -343,13 +336,7 @@
|
|||||||
<div class="rounded-8px bg-[var(--el-fill-color-light)] px-16px py-12px">
|
<div class="rounded-8px bg-[var(--el-fill-color-light)] px-16px py-12px">
|
||||||
<div class="text-12px text-[var(--el-text-color-secondary)]">待分配</div>
|
<div class="text-12px text-[var(--el-text-color-secondary)]">待分配</div>
|
||||||
<div class="mt-6px text-18px font-600">
|
<div class="mt-6px text-18px font-600">
|
||||||
{{
|
{{ formatPercentText(currentPlanning.pendingAmount) }}
|
||||||
formatPercentText(
|
|
||||||
guideDetailMode && activeGuideDetail
|
|
||||||
? activeGuideDetail.pendingAmount
|
|
||||||
: currentPlanning.pendingAmount
|
|
||||||
)
|
|
||||||
}}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -363,63 +350,7 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<template v-if="guideDetailMode && !historyParentMode">
|
<el-table v-loading="quarterLoading" :data="quarterRows" border>
|
||||||
<el-empty
|
|
||||||
v-if="!guideDetailRows.length"
|
|
||||||
description="暂无指导价法明细,请先维护指导价法明细"
|
|
||||||
/>
|
|
||||||
<template v-else>
|
|
||||||
<el-tabs v-model="activeGuideDetailTab" class="mb-12px" type="card">
|
|
||||||
<el-tab-pane
|
|
||||||
v-for="detail in guideDetailRows"
|
|
||||||
:key="detail.tabKey"
|
|
||||||
:label="`序号 ${detail.sortNo || '-'}`"
|
|
||||||
:name="detail.tabKey"
|
|
||||||
/>
|
|
||||||
</el-tabs>
|
|
||||||
|
|
||||||
<el-descriptions
|
|
||||||
v-if="activeGuideDetail"
|
|
||||||
:column="4"
|
|
||||||
border
|
|
||||||
class="mb-12px"
|
|
||||||
size="small"
|
|
||||||
>
|
|
||||||
<el-descriptions-item label="设计部位">
|
|
||||||
{{ getDesignPartLabel(activeGuideDetail.designPart) }}
|
|
||||||
</el-descriptions-item>
|
|
||||||
<el-descriptions-item label="设计内容/设计类型">
|
|
||||||
{{ activeGuideDetail.buildingType || '-' }}
|
|
||||||
</el-descriptions-item>
|
|
||||||
<el-descriptions-item label="设计面积">
|
|
||||||
{{ formatAreaText(activeGuideDetail.designArea) }}
|
|
||||||
</el-descriptions-item>
|
|
||||||
<el-descriptions-item label="考核产值小计">
|
|
||||||
{{ formatAmountText(activeGuideDetail.assessmentOutputValue) }}
|
|
||||||
</el-descriptions-item>
|
|
||||||
</el-descriptions>
|
|
||||||
|
|
||||||
<el-table :data="activeGuideDetailQuarterRows" border>
|
|
||||||
<el-table-column align="center" label="分配年度" width="150" prop="distributionYear" />
|
|
||||||
<el-table-column
|
|
||||||
v-for="quarter in QUARTER_OPTIONS"
|
|
||||||
:key="quarter.value"
|
|
||||||
:label="quarter.label"
|
|
||||||
min-width="220"
|
|
||||||
>
|
|
||||||
<template #default="scope">
|
|
||||||
<div class="flex flex-col gap-8px">
|
|
||||||
<div class="rounded-6px bg-[var(--el-fill-color-light)] px-10px py-8px text-12px">
|
|
||||||
分配比例:{{ formatQuarterRatio(scope.row, quarter.value) }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
</template>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<el-table v-else :data="quarterRows" border>
|
|
||||||
<el-table-column align="center" label="分配年度" width="150" prop="distributionYear" />
|
<el-table-column align="center" label="分配年度" width="150" prop="distributionYear" />
|
||||||
<el-table-column
|
<el-table-column
|
||||||
v-for="quarter in QUARTER_OPTIONS"
|
v-for="quarter in QUARTER_OPTIONS"
|
||||||
@@ -437,14 +368,12 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</template>
|
|
||||||
|
|
||||||
<ContentWrap v-else-if="!quarterLoading">
|
<ContentWrap v-else>
|
||||||
<el-empty description="请选择合约规划后查看测算结果和季度分配" />
|
<el-empty description="请选择合约规划后查看测算结果和季度分配" />
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</div>
|
</template>
|
||||||
</el-col>
|
</SplitPane>
|
||||||
</el-row>
|
|
||||||
|
|
||||||
<PlanningOutputForm ref="planningOutputFormRef" @success="handlePlanningOutputFormSuccess" />
|
<PlanningOutputForm ref="planningOutputFormRef" @success="handlePlanningOutputFormSuccess" />
|
||||||
<QuarterDistributionForm
|
<QuarterDistributionForm
|
||||||
@@ -460,6 +389,7 @@ import * as PlanningApi from '@/api/tjt/planning'
|
|||||||
import * as PlanningQuarterApi from '@/api/tjt/planningQuarter'
|
import * as PlanningQuarterApi from '@/api/tjt/planningQuarter'
|
||||||
import PlanningOutputForm from './PlanningOutputForm.vue'
|
import PlanningOutputForm from './PlanningOutputForm.vue'
|
||||||
import QuarterDistributionForm from './QuarterDistributionForm.vue'
|
import QuarterDistributionForm from './QuarterDistributionForm.vue'
|
||||||
|
import SplitPane from '@/views/tjt/shared/SplitPane.vue'
|
||||||
import {
|
import {
|
||||||
CONTRACT_SIGN_OPTIONS,
|
CONTRACT_SIGN_OPTIONS,
|
||||||
QUARTER_OPTIONS,
|
QUARTER_OPTIONS,
|
||||||
@@ -468,7 +398,6 @@ import {
|
|||||||
formatPercentText,
|
formatPercentText,
|
||||||
getCalculationMethodLabel,
|
getCalculationMethodLabel,
|
||||||
getCalculationRatioLabel,
|
getCalculationRatioLabel,
|
||||||
getDesignPartLabel,
|
|
||||||
getDesignStageLabel,
|
getDesignStageLabel,
|
||||||
getOwnershipTypeLabel,
|
getOwnershipTypeLabel,
|
||||||
getVirtualCalculationMethodLabel,
|
getVirtualCalculationMethodLabel,
|
||||||
@@ -486,11 +415,6 @@ interface QuarterYearRow {
|
|||||||
quarters: PlanningQuarterApi.ProjectPlanningQuarterVO[]
|
quarters: PlanningQuarterApi.ProjectPlanningQuarterVO[]
|
||||||
}
|
}
|
||||||
|
|
||||||
interface GuideDetailQuarterRow extends PlanningQuarterApi.ProjectPlanningQuarterGuideDetailVO {
|
|
||||||
tabKey: string
|
|
||||||
quarterRows: QuarterYearRow[]
|
|
||||||
}
|
|
||||||
|
|
||||||
const message = useMessage()
|
const message = useMessage()
|
||||||
|
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
@@ -502,10 +426,6 @@ const planningList = ref<PlanningApi.ProjectPlanningVO[]>([])
|
|||||||
const currentProject = ref<ProjectApi.ProjectVO>()
|
const currentProject = ref<ProjectApi.ProjectVO>()
|
||||||
const currentPlanning = ref<PlanningApi.ProjectPlanningVO>()
|
const currentPlanning = ref<PlanningApi.ProjectPlanningVO>()
|
||||||
const quarterRows = ref<QuarterYearRow[]>([])
|
const quarterRows = ref<QuarterYearRow[]>([])
|
||||||
const guideDetailMode = ref(false)
|
|
||||||
const historyParentMode = ref(false)
|
|
||||||
const guideDetailRows = ref<GuideDetailQuarterRow[]>([])
|
|
||||||
const activeGuideDetailTab = ref('')
|
|
||||||
const queryFormRef = ref()
|
const queryFormRef = ref()
|
||||||
const projectTableRef = ref()
|
const projectTableRef = ref()
|
||||||
const planningTableRef = ref()
|
const planningTableRef = ref()
|
||||||
@@ -558,13 +478,6 @@ const showParentInternalGuidanceUnitPrice = computed(
|
|||||||
currentPlanning.value?.internalGuidanceUnitPrice !== undefined &&
|
currentPlanning.value?.internalGuidanceUnitPrice !== undefined &&
|
||||||
currentPlanning.value?.internalGuidanceUnitPrice !== null
|
currentPlanning.value?.internalGuidanceUnitPrice !== null
|
||||||
)
|
)
|
||||||
const activeGuideDetail = computed(() => {
|
|
||||||
return (
|
|
||||||
guideDetailRows.value.find((item) => item.tabKey === activeGuideDetailTab.value) ||
|
|
||||||
guideDetailRows.value[0]
|
|
||||||
)
|
|
||||||
})
|
|
||||||
const activeGuideDetailQuarterRows = computed(() => activeGuideDetail.value?.quarterRows || [])
|
|
||||||
|
|
||||||
const formatFactorText = (value?: number, digits = 4) => {
|
const formatFactorText = (value?: number, digits = 4) => {
|
||||||
if (value === undefined || value === null) {
|
if (value === undefined || value === null) {
|
||||||
@@ -622,14 +535,6 @@ const buildQuarterRows = (
|
|||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
const resetQuarterDetailState = () => {
|
|
||||||
quarterRows.value = []
|
|
||||||
guideDetailMode.value = false
|
|
||||||
historyParentMode.value = false
|
|
||||||
guideDetailRows.value = []
|
|
||||||
activeGuideDetailTab.value = ''
|
|
||||||
}
|
|
||||||
|
|
||||||
const getProjectList = async () => {
|
const getProjectList = async () => {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
try {
|
try {
|
||||||
@@ -640,7 +545,7 @@ const getProjectList = async () => {
|
|||||||
currentProject.value = undefined
|
currentProject.value = undefined
|
||||||
planningList.value = []
|
planningList.value = []
|
||||||
currentPlanning.value = undefined
|
currentPlanning.value = undefined
|
||||||
resetQuarterDetailState()
|
quarterRows.value = []
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const targetProjectId = currentProject.value?.id || projectList.value[0].id
|
const targetProjectId = currentProject.value?.id || projectList.value[0].id
|
||||||
@@ -657,7 +562,7 @@ const getPlanningList = async () => {
|
|||||||
if (!currentProject.value?.id) {
|
if (!currentProject.value?.id) {
|
||||||
planningList.value = []
|
planningList.value = []
|
||||||
currentPlanning.value = undefined
|
currentPlanning.value = undefined
|
||||||
resetQuarterDetailState()
|
quarterRows.value = []
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
planningLoading.value = true
|
planningLoading.value = true
|
||||||
@@ -665,7 +570,7 @@ const getPlanningList = async () => {
|
|||||||
planningList.value = await PlanningApi.getProjectPlanningListByProjectId(currentProject.value.id)
|
planningList.value = await PlanningApi.getProjectPlanningListByProjectId(currentProject.value.id)
|
||||||
if (!planningList.value.length) {
|
if (!planningList.value.length) {
|
||||||
currentPlanning.value = undefined
|
currentPlanning.value = undefined
|
||||||
resetQuarterDetailState()
|
quarterRows.value = []
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const targetPlanningId = currentPlanning.value?.id || planningList.value[0].id
|
const targetPlanningId = currentPlanning.value?.id || planningList.value[0].id
|
||||||
@@ -679,27 +584,12 @@ const getPlanningList = async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const loadPlanningDetail = async (planningId: number) => {
|
const loadPlanningDetail = async (planningId: number) => {
|
||||||
|
const planning = await PlanningApi.getProjectPlanning(planningId)
|
||||||
|
currentPlanning.value = planning
|
||||||
quarterLoading.value = true
|
quarterLoading.value = true
|
||||||
try {
|
try {
|
||||||
const detail = await PlanningQuarterApi.getProjectPlanningQuarterPlanningDetail(planningId)
|
const quarterList = await PlanningQuarterApi.getProjectPlanningQuarterListByPlanningId(planningId)
|
||||||
currentPlanning.value = detail?.planning
|
quarterRows.value = buildQuarterRows(planning, quarterList)
|
||||||
guideDetailMode.value = !!detail?.guideDetailMode
|
|
||||||
historyParentMode.value = !!detail?.historyParentMode
|
|
||||||
if (!detail?.planning) {
|
|
||||||
resetQuarterDetailState()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
quarterRows.value = buildQuarterRows(detail.planning, detail.quarters || [])
|
|
||||||
guideDetailRows.value = (detail.guideDetails || []).map((item, index) => ({
|
|
||||||
...item,
|
|
||||||
tabKey: String(item.id || item.sortNo || index),
|
|
||||||
quarterRows: buildQuarterRows(detail.planning!, item.quarters || [])
|
|
||||||
}))
|
|
||||||
const currentTab = activeGuideDetailTab.value
|
|
||||||
activeGuideDetailTab.value =
|
|
||||||
guideDetailRows.value.find((item) => item.tabKey === currentTab)?.tabKey ||
|
|
||||||
guideDetailRows.value[0]?.tabKey ||
|
|
||||||
''
|
|
||||||
} finally {
|
} finally {
|
||||||
quarterLoading.value = false
|
quarterLoading.value = false
|
||||||
}
|
}
|
||||||
@@ -723,7 +613,7 @@ const handleCurrentProjectChange = async (row?: ProjectApi.ProjectVO) => {
|
|||||||
const handleCurrentPlanningChange = async (row?: PlanningApi.ProjectPlanningVO) => {
|
const handleCurrentPlanningChange = async (row?: PlanningApi.ProjectPlanningVO) => {
|
||||||
if (!row?.id) {
|
if (!row?.id) {
|
||||||
currentPlanning.value = undefined
|
currentPlanning.value = undefined
|
||||||
resetQuarterDetailState()
|
quarterRows.value = []
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
await loadPlanningDetail(row.id)
|
await loadPlanningDetail(row.id)
|
||||||
@@ -740,15 +630,12 @@ const openPlanningOutputForm = () => {
|
|||||||
planningOutputFormRef.value.open(currentPlanning.value.id)
|
planningOutputFormRef.value.open(currentPlanning.value.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
const openQuarterDistributionForm = (guideDetailId?: number) => {
|
const openQuarterDistributionForm = () => {
|
||||||
if (!currentPlanning.value?.id) {
|
if (!currentPlanning.value?.id) {
|
||||||
message.warning('请先选择合约规划')
|
message.warning('请先选择合约规划')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
quarterDistributionFormRef.value.open(
|
quarterDistributionFormRef.value.open(currentPlanning.value.id)
|
||||||
currentPlanning.value.id,
|
|
||||||
guideDetailMode.value && !historyParentMode.value ? guideDetailId : undefined
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const handlePlanningOutputFormSuccess = async () => {
|
const handlePlanningOutputFormSuccess = async () => {
|
||||||
@@ -759,18 +646,11 @@ const handlePlanningOutputFormSuccess = async () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let activatedOnce = false
|
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
getProjectList()
|
getProjectList()
|
||||||
})
|
})
|
||||||
|
|
||||||
onActivated(() => {
|
onActivated(() => {
|
||||||
// KeepAlive 首次挂载也会触发 onActivated,跳过首轮避免重复请求项目与合约规划列表。
|
|
||||||
if (!activatedOnce) {
|
|
||||||
activatedOnce = true
|
|
||||||
return
|
|
||||||
}
|
|
||||||
getProjectList()
|
getProjectList()
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -111,8 +111,8 @@
|
|||||||
/>
|
/>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<el-row :gutter="16">
|
<SplitPane>
|
||||||
<el-col :span="8">
|
<template #left>
|
||||||
<ContentWrap v-if="currentProject">
|
<ContentWrap v-if="currentProject">
|
||||||
<div class="mb-16px flex items-center justify-between gap-12px">
|
<div class="mb-16px flex items-center justify-between gap-12px">
|
||||||
<div>
|
<div>
|
||||||
@@ -178,9 +178,9 @@
|
|||||||
<ContentWrap v-else>
|
<ContentWrap v-else>
|
||||||
<el-empty description="请选择项目后查看预算导出范围" />
|
<el-empty description="请选择项目后查看预算导出范围" />
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</el-col>
|
</template>
|
||||||
|
|
||||||
<el-col :span="16">
|
<template #right>
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<div class="mb-12px flex items-center justify-between">
|
<div class="mb-12px flex items-center justify-between">
|
||||||
<div class="text-14px font-600">
|
<div class="text-14px font-600">
|
||||||
@@ -189,7 +189,6 @@
|
|||||||
<el-button v-if="currentProject" size="small" @click="getPlanningList">刷新</el-button>
|
<el-button v-if="currentProject" size="small" @click="getPlanningList">刷新</el-button>
|
||||||
</div>
|
</div>
|
||||||
<el-table v-loading="planningLoading" :data="planningList" border>
|
<el-table v-loading="planningLoading" :data="planningList" border>
|
||||||
<el-table-column align="center" label="序号" type="index" width="70" />
|
|
||||||
<el-table-column align="center" label="项目任务包" min-width="180" prop="planningContent" />
|
<el-table-column align="center" label="项目任务包" min-width="180" prop="planningContent" />
|
||||||
<el-table-column align="center" label="归属类型" width="100">
|
<el-table-column align="center" label="归属类型" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -215,8 +214,8 @@
|
|||||||
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</el-col>
|
</template>
|
||||||
</el-row>
|
</SplitPane>
|
||||||
|
|
||||||
<Dialog v-model="exportDialogVisible" title="导出项目考核产值预算表" width="420">
|
<Dialog v-model="exportDialogVisible" title="导出项目考核产值预算表" width="420">
|
||||||
<el-form label-width="88px">
|
<el-form label-width="88px">
|
||||||
@@ -246,6 +245,7 @@ import * as PlanningApi from '@/api/tjt/planning'
|
|||||||
import * as ProjectApi from '@/api/tjt/project'
|
import * as ProjectApi from '@/api/tjt/project'
|
||||||
import * as ReportApi from '@/api/tjt/report'
|
import * as ReportApi from '@/api/tjt/report'
|
||||||
import download from '@/utils/download'
|
import download from '@/utils/download'
|
||||||
|
import SplitPane from '@/views/tjt/shared/SplitPane.vue'
|
||||||
import {
|
import {
|
||||||
CONTRACT_SIGN_OPTIONS,
|
CONTRACT_SIGN_OPTIONS,
|
||||||
formatAmountText,
|
formatAmountText,
|
||||||
|
|||||||
@@ -71,8 +71,8 @@
|
|||||||
/>
|
/>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<el-row :gutter="16">
|
<SplitPane>
|
||||||
<el-col :span="8">
|
<template #left>
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<div class="mb-12px text-14px font-600">
|
<div class="mb-12px text-14px font-600">
|
||||||
{{ currentProject?.projectName || '合约规划列表' }}
|
{{ currentProject?.projectName || '合约规划列表' }}
|
||||||
@@ -84,7 +84,6 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentPlanningChange"
|
@current-change="handleCurrentPlanningChange"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="序号" type="index" width="70" />
|
|
||||||
<el-table-column align="center" label="项目任务包" min-width="180" prop="planningContent" />
|
<el-table-column align="center" label="项目任务包" min-width="180" prop="planningContent" />
|
||||||
<el-table-column align="center" label="归属类型" min-width="110">
|
<el-table-column align="center" label="归属类型" min-width="110">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -100,9 +99,9 @@
|
|||||||
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</el-col>
|
</template>
|
||||||
|
|
||||||
<el-col :span="16">
|
<template #right>
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<div v-loading="quarterLoading" class="min-h-320px">
|
<div v-loading="quarterLoading" class="min-h-320px">
|
||||||
<template v-if="currentPlanning && formData">
|
<template v-if="currentPlanning && formData">
|
||||||
@@ -219,8 +218,8 @@
|
|||||||
<el-empty v-else-if="!quarterLoading" description="请选择合约规划后查看导出预览" />
|
<el-empty v-else-if="!quarterLoading" description="请选择合约规划后查看导出预览" />
|
||||||
</div>
|
</div>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</el-col>
|
</template>
|
||||||
</el-row>
|
</SplitPane>
|
||||||
|
|
||||||
<Dialog v-model="exportDialogVisible" :title="exportDialogTitle" width="420">
|
<Dialog v-model="exportDialogVisible" :title="exportDialogTitle" width="420">
|
||||||
<el-form label-width="88px">
|
<el-form label-width="88px">
|
||||||
@@ -252,6 +251,7 @@ import * as PlanningQuarterApi from '@/api/tjt/planningQuarter'
|
|||||||
import * as ProjectApi from '@/api/tjt/project'
|
import * as ProjectApi from '@/api/tjt/project'
|
||||||
import * as ReportApi from '@/api/tjt/report'
|
import * as ReportApi from '@/api/tjt/report'
|
||||||
import download from '@/utils/download'
|
import download from '@/utils/download'
|
||||||
|
import SplitPane from '@/views/tjt/shared/SplitPane.vue'
|
||||||
import {
|
import {
|
||||||
formatAmountText,
|
formatAmountText,
|
||||||
getOwnershipTypeLabel,
|
getOwnershipTypeLabel,
|
||||||
|
|||||||
@@ -73,8 +73,8 @@
|
|||||||
/>
|
/>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<el-row :gutter="16">
|
<SplitPane>
|
||||||
<el-col :span="8">
|
<template #left>
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<div class="mb-12px text-14px font-600">
|
<div class="mb-12px text-14px font-600">
|
||||||
{{ currentProject?.projectName || '合约规划列表' }}
|
{{ currentProject?.projectName || '合约规划列表' }}
|
||||||
@@ -86,7 +86,6 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentPlanningChange"
|
@current-change="handleCurrentPlanningChange"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="序号" type="index" width="70" />
|
|
||||||
<el-table-column align="center" label="项目任务包" min-width="180" prop="planningContent" />
|
<el-table-column align="center" label="项目任务包" min-width="180" prop="planningContent" />
|
||||||
<el-table-column align="center" label="归属类型" min-width="110">
|
<el-table-column align="center" label="归属类型" min-width="110">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -102,9 +101,9 @@
|
|||||||
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</el-col>
|
</template>
|
||||||
|
|
||||||
<el-col :span="16">
|
<template #right>
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<div v-loading="previewLoading" class="min-h-320px">
|
<div v-loading="previewLoading" class="min-h-320px">
|
||||||
<template v-if="currentPlanning && currentGroup">
|
<template v-if="currentPlanning && currentGroup">
|
||||||
@@ -258,8 +257,8 @@
|
|||||||
<el-empty v-else-if="!previewLoading" description="请选择合约规划后查看导出预览" />
|
<el-empty v-else-if="!previewLoading" description="请选择合约规划后查看导出预览" />
|
||||||
</div>
|
</div>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</el-col>
|
</template>
|
||||||
</el-row>
|
</SplitPane>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
@@ -267,6 +266,7 @@ import * as PlanningApi from '@/api/tjt/planning'
|
|||||||
import * as ProjectApi from '@/api/tjt/project'
|
import * as ProjectApi from '@/api/tjt/project'
|
||||||
import * as ReportApi from '@/api/tjt/report'
|
import * as ReportApi from '@/api/tjt/report'
|
||||||
import download from '@/utils/download'
|
import download from '@/utils/download'
|
||||||
|
import SplitPane from '@/views/tjt/shared/SplitPane.vue'
|
||||||
import {
|
import {
|
||||||
formatAmountText,
|
formatAmountText,
|
||||||
formatPercentText,
|
formatPercentText,
|
||||||
|
|||||||
@@ -73,8 +73,8 @@
|
|||||||
/>
|
/>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<el-row :gutter="16">
|
<SplitPane>
|
||||||
<el-col :span="8">
|
<template #left>
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<div class="mb-12px text-14px font-600">
|
<div class="mb-12px text-14px font-600">
|
||||||
{{ currentProject?.projectName || '合约规划列表' }}
|
{{ currentProject?.projectName || '合约规划列表' }}
|
||||||
@@ -86,7 +86,6 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentPlanningChange"
|
@current-change="handleCurrentPlanningChange"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="序号" type="index" width="70" />
|
|
||||||
<el-table-column align="center" label="项目任务包" min-width="180" prop="planningContent" />
|
<el-table-column align="center" label="项目任务包" min-width="180" prop="planningContent" />
|
||||||
<el-table-column align="center" label="归属类型" min-width="110">
|
<el-table-column align="center" label="归属类型" min-width="110">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -102,9 +101,9 @@
|
|||||||
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</el-col>
|
</template>
|
||||||
|
|
||||||
<el-col :span="16">
|
<template #right>
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<div v-loading="roleLoading" class="min-h-320px">
|
<div v-loading="roleLoading" class="min-h-320px">
|
||||||
<template v-if="currentPlanning && currentGroup">
|
<template v-if="currentPlanning && currentGroup">
|
||||||
@@ -179,8 +178,8 @@
|
|||||||
<el-empty v-else-if="!roleLoading" description="请选择合约规划后查看人员分配" />
|
<el-empty v-else-if="!roleLoading" description="请选择合约规划后查看人员分配" />
|
||||||
</div>
|
</div>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</el-col>
|
</template>
|
||||||
</el-row>
|
</SplitPane>
|
||||||
|
|
||||||
<Dialog v-model="dialogVisible" title="编辑专业人员角色分配" width="1180">
|
<Dialog v-model="dialogVisible" title="编辑专业人员角色分配" width="1180">
|
||||||
<template v-if="currentEditGroup">
|
<template v-if="currentEditGroup">
|
||||||
@@ -320,6 +319,7 @@ import * as EmployeeApi from '@/api/tjt/employee'
|
|||||||
import * as ProjectApi from '@/api/tjt/project'
|
import * as ProjectApi from '@/api/tjt/project'
|
||||||
import * as PlanningApi from '@/api/tjt/planning'
|
import * as PlanningApi from '@/api/tjt/planning'
|
||||||
import * as SpecialtyRoleSplitApi from '@/api/tjt/specialtyRoleSplit'
|
import * as SpecialtyRoleSplitApi from '@/api/tjt/specialtyRoleSplit'
|
||||||
|
import SplitPane from '@/views/tjt/shared/SplitPane.vue'
|
||||||
import {
|
import {
|
||||||
formatAmountText,
|
formatAmountText,
|
||||||
formatPercentText,
|
formatPercentText,
|
||||||
|
|||||||
Reference in New Issue
Block a user