0508修改

This commit is contained in:
lzm
2026-05-08 09:33:34 +08:00
parent 2e3a6cc1ec
commit 9ea02751de
11 changed files with 328 additions and 51 deletions

View File

@@ -173,7 +173,7 @@
import type { FormRules } from 'element-plus'
import * as EmployeeApi from '@/api/tjt/employee'
import * as EmployeeYearCostBudgetApi from '@/api/tjt/employeeYearCostBudget'
import { EMPLOYEE_STATUS, formatAmountText } from '@/views/tjt/shared/planning'
import { formatAmountText } from '@/views/tjt/shared/planning'
defineOptions({ name: 'TjtEmployeeYearCostBudget' })
@@ -251,7 +251,6 @@ const searchEmployees = async (keyword: string) => {
try {
employeeOptions.value = await EmployeeApi.getEmployeeSimpleList({
keyword,
status: EMPLOYEE_STATUS.active,
enabledFlag: true
})
ensureEmployeeOption()

View File

@@ -401,7 +401,6 @@ const searchEmployees = async (keyword: string) => {
try {
employeeOptions.value = await EmployeeApi.getEmployeeSimpleList({
keyword,
status: '在职',
enabledFlag: true
})
ensureEmployeeOptions(formData.value.rolePersons)

View File

@@ -208,6 +208,28 @@
</ContentWrap>
</el-col>
</el-row>
<Dialog v-model="exportDialogVisible" title="导出项目考核产值预算表" width="420">
<el-form label-width="88px">
<el-form-item label="年度">
<el-date-picker
v-model="exportYearValue"
class="!w-220px"
clearable
placeholder="请选择年度"
type="year"
value-format="YYYY"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="exportDialogVisible = false">取消</el-button>
<el-button :loading="exportLoading" type="primary" @click="submitProjectBudgetExport">
确定导出
</el-button>
</template>
</Dialog>
</template>
<script lang="ts" setup>
@@ -226,10 +248,13 @@ import {
defineOptions({ name: 'TjtReportBudget' })
const message = useMessage()
const currentYear = new Date().getFullYear()
const loading = ref(false)
const planningLoading = ref(false)
const exportLoading = ref(false)
const exportDialogVisible = ref(false)
const exportYear = ref<number>()
const total = ref(0)
const projectList = ref<ProjectApi.ProjectVO[]>([])
const planningList = ref<PlanningApi.ProjectPlanningVO[]>([])
@@ -252,6 +277,13 @@ const queryProjectStartYearValue = computed({
}
})
const exportYearValue = computed({
get: () => (exportYear.value ? String(exportYear.value) : undefined),
set: (value?: string) => {
exportYear.value = value ? Number(value) : undefined
}
})
const totalPlanningAmount = computed(() =>
planningList.value.reduce((sum, item) => sum + Number(item.planningAmount || 0), 0)
)
@@ -313,11 +345,28 @@ const handleExportProjectBudget = async () => {
message.warning('请先选择项目')
return
}
exportYear.value = currentProject.value.projectStartYear || currentYear
exportDialogVisible.value = true
}
const submitProjectBudgetExport = async () => {
if (!currentProject.value?.id) {
message.warning('请先选择项目')
return
}
if (!exportYear.value) {
message.warning('请选择年度')
return
}
try {
await message.exportConfirm()
exportLoading.value = true
const data = await ReportApi.exportProjectBudget(currentProject.value.id)
download.excel(data, `${currentProject.value.projectName}_项目考核产值预算表.xlsx`)
const data = await ReportApi.exportProjectBudget({
projectId: currentProject.value.id,
year: exportYear.value
})
download.excel(data, `${currentProject.value.projectName}_${exportYear.value}_项目考核产值预算表.xlsx`)
exportDialogVisible.value = false
} finally {
exportLoading.value = false
}

View File

@@ -210,6 +210,28 @@
</ContentWrap>
</el-col>
</el-row>
<Dialog v-model="exportDialogVisible" :title="exportDialogTitle" width="420">
<el-form label-width="88px">
<el-form-item label="年度">
<el-date-picker
v-model="exportYearValue"
class="!w-220px"
clearable
placeholder="请选择年度"
type="year"
value-format="YYYY"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="exportDialogVisible = false">取消</el-button>
<el-button :loading="currentExportLoading" type="primary" @click="submitExport">
确定导出
</el-button>
</template>
</Dialog>
</template>
<script lang="ts" setup>
@@ -244,6 +266,8 @@ interface QuarterYearRow {
quarters: PlanningQuarterApi.ProjectPlanningQuarterVO[]
}
type ExportDialogType = 'projectQuarter' | 'projectLeadQuarter'
const annualCategoryOptions: { label: string; value: AnnualCategoryKey }[] = [
{ label: '项目经理/项目负责人', value: 'project_lead' },
{ label: '建筑专业', value: 'arch' },
@@ -256,12 +280,16 @@ const annualCategoryOptions: { label: string; value: AnnualCategoryKey }[] = [
]
const message = useMessage()
const currentYear = new Date().getFullYear()
const loading = ref(false)
const planningLoading = ref(false)
const quarterLoading = ref(false)
const exportQuarterLoading = ref(false)
const exportLeadLoading = ref(false)
const exportDialogVisible = ref(false)
const exportDialogType = ref<ExportDialogType>('projectQuarter')
const exportYear = ref<number>()
const total = ref(0)
const projectList = ref<ProjectApi.ProjectVO[]>([])
const planningList = ref<PlanningApi.ProjectPlanningVO[]>([])
@@ -288,6 +316,23 @@ const queryProjectStartYearValue = computed({
}
})
const exportDialogTitle = computed(() =>
exportDialogType.value === 'projectQuarter' ? '导出专业间年度季度计取表' : '导出项目负责人计取表'
)
const currentExportLoading = computed(() =>
exportDialogType.value === 'projectQuarter'
? exportQuarterLoading.value
: exportLeadLoading.value
)
const exportYearValue = computed({
get: () => (exportYear.value ? String(exportYear.value) : undefined),
set: (value?: string) => {
exportYear.value = value ? Number(value) : undefined
}
})
const toNumeric = (value?: number | string | null) => {
const numericValue = Number(value ?? 0)
return Number.isNaN(numericValue) ? 0 : numericValue
@@ -552,14 +597,9 @@ const handleExportProjectQuarter = async () => {
message.warning('请先选择合约规划')
return
}
try {
await message.exportConfirm()
exportQuarterLoading.value = true
const data = await ReportApi.exportProjectQuarterOutput(currentPlanning.value.id)
download.excel(data, '专业间年度季度计取表.xlsx')
} finally {
exportQuarterLoading.value = false
}
exportDialogType.value = 'projectQuarter'
exportYear.value = currentPlanning.value.planningStartYear || currentYear
exportDialogVisible.value = true
}
const handleExportProjectLeadQuarter = async () => {
@@ -567,11 +607,66 @@ const handleExportProjectLeadQuarter = async () => {
message.warning('请先选择合约规划')
return
}
exportDialogType.value = 'projectLeadQuarter'
exportYear.value = currentPlanning.value.planningStartYear || currentYear
exportDialogVisible.value = true
}
const submitExport = async () => {
if (exportDialogType.value === 'projectQuarter') {
await submitProjectQuarterExport()
return
}
await submitProjectLeadQuarterExport()
}
const submitProjectQuarterExport = async () => {
if (!currentPlanning.value?.id) {
message.warning('请先选择合约规划')
return
}
if (!exportYear.value) {
message.warning('请选择年度')
return
}
try {
await message.exportConfirm()
exportQuarterLoading.value = true
const data = await ReportApi.exportProjectQuarterOutput({
planningId: currentPlanning.value.id,
year: exportYear.value
})
download.excel(
data,
`${currentProject.value?.projectName || '项目'}_${exportYear.value}_专业间年度季度计取表.xlsx`
)
exportDialogVisible.value = false
} finally {
exportQuarterLoading.value = false
}
}
const submitProjectLeadQuarterExport = async () => {
if (!currentPlanning.value?.id) {
message.warning('请先选择合约规划')
return
}
if (!exportYear.value) {
message.warning('请选择年度')
return
}
try {
await message.exportConfirm()
exportLeadLoading.value = true
const data = await ReportApi.exportProjectLeadQuarterOutput(currentPlanning.value.id)
download.excel(data, '项目负责人年度季度计取表.xlsx')
const data = await ReportApi.exportProjectLeadQuarterOutput({
planningId: currentPlanning.value.id,
year: exportYear.value
})
download.excel(
data,
`${currentProject.value?.projectName || '项目'}_${exportYear.value}_项目负责人年度季度计取表.xlsx`
)
exportDialogVisible.value = false
} finally {
exportLeadLoading.value = false
}

View File

@@ -172,6 +172,28 @@
</ContentWrap>
</el-col>
</el-row>
<Dialog v-model="exportDialogVisible" title="导出专业内人员计取表" width="420">
<el-form label-width="88px">
<el-form-item label="年度">
<el-date-picker
v-model="exportYearValue"
class="!w-220px"
clearable
placeholder="请选择年度"
type="year"
value-format="YYYY"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="exportDialogVisible = false">取消</el-button>
<el-button :loading="exportSpecialtyLoading" type="primary" @click="submitSpecialtyExport">
确定导出
</el-button>
</template>
</Dialog>
</template>
<script lang="ts" setup>
@@ -199,10 +221,13 @@ interface SpecialtyGroup {
}
const message = useMessage()
const currentYear = new Date().getFullYear()
const loading = ref(false)
const planningLoading = ref(false)
const exportSpecialtyLoading = ref(false)
const exportDialogVisible = ref(false)
const exportYear = ref<number>()
const total = ref(0)
const projectList = ref<ProjectApi.ProjectVO[]>([])
const planningList = ref<PlanningApi.ProjectPlanningVO[]>([])
@@ -228,6 +253,13 @@ const queryProjectStartYearValue = computed({
}
})
const exportYearValue = computed({
get: () => (exportYear.value ? String(exportYear.value) : undefined),
set: (value?: string) => {
exportYear.value = value ? Number(value) : undefined
}
})
const roundRatio = (value?: number | string | null) => {
const numericValue = Number(value || 0)
return Number.isNaN(numericValue) ? 0 : Number(numericValue.toFixed(4))
@@ -393,14 +425,36 @@ const handleExportSpecialtyPerson = async () => {
message.warning('请选择具体专业后再导出')
return
}
exportYear.value = currentPlanning.value.planningStartYear || currentYear
exportDialogVisible.value = true
}
const submitSpecialtyExport = async () => {
if (!currentPlanning.value?.id) {
message.warning('请先选择合约规划')
return
}
if (!canExportCurrentGroup.value || !currentGroup.value?.specialtyCode) {
message.warning('请选择具体专业后再导出')
return
}
if (!exportYear.value) {
message.warning('请选择年度')
return
}
try {
await message.exportConfirm()
exportSpecialtyLoading.value = true
const data = await ReportApi.exportSpecialtyPersonOutput({
planningId: currentPlanning.value.id,
specialtyCode: currentGroup.value.specialtyCode
specialtyCode: currentGroup.value.specialtyCode,
year: exportYear.value
})
download.excel(data, `${currentGroup.value.specialtyName || '专业'}内人员年度季度计取表.xlsx`)
download.excel(
data,
`${currentProject.value?.projectName || '项目'}_${exportYear.value}_${currentGroup.value.specialtyName || '专业'}内人员年度季度计取表.xlsx`
)
exportDialogVisible.value = false
} finally {
exportSpecialtyLoading.value = false
}

View File

@@ -145,7 +145,6 @@
v-model="projectOverviewYearValue"
class="!w-220px"
clearable
disabled
placeholder="请选择年度"
type="year"
value-format="YYYY"
@@ -268,8 +267,10 @@ const currentOfficeName = computed(() => {
})
const projectOverviewYearValue = computed({
get: () => String(currentYear),
set: (_value?: string) => undefined
get: () => (projectOverviewForm.year ? String(projectOverviewForm.year) : undefined),
set: (value?: string) => {
projectOverviewForm.year = value ? Number(value) : undefined
}
})
const employeeSummaryYearValue = computed({
@@ -336,6 +337,9 @@ const openProjectOverviewExportDialog = () => {
message.warning('请选择专业所')
return
}
if (!projectOverviewForm.year) {
projectOverviewForm.year = currentYear
}
exportDialogType.value = 'projectOverview'
exportDialogVisible.value = true
}
@@ -353,15 +357,17 @@ const handleExportProjectOverview = async () => {
message.warning('请选择专业所')
return
}
if (!projectOverviewYearValue.value) {
if (!projectOverviewForm.year) {
message.warning('请选择年度')
return
}
try {
projectOverviewExportLoading.value = true
projectOverviewForm.year = currentYear
const data = await ReportApi.exportProjectOverview(projectOverviewForm)
download.excel(data, '项目总览表.xlsx')
download.excel(
data,
`${currentOfficeName.value || '专业所'}_${projectOverviewForm.year}_项目总览表.xlsx`
)
exportDialogVisible.value = false
} finally {
projectOverviewExportLoading.value = false
@@ -376,7 +382,7 @@ const handleExportEmployeeSummary = async () => {
try {
employeeSummaryExportLoading.value = true
const data = await ReportApi.exportEmployeeOutputSummary(employeeSummaryForm)
download.excel(data, '员工个人考核产值汇总表.xlsx')
download.excel(data, `${employeeSummaryForm.year}_员工个人考核产值汇总表.xlsx`)
exportDialogVisible.value = false
} finally {
employeeSummaryExportLoading.value = false

View File

@@ -455,7 +455,6 @@ const searchEmployees = async (keyword: string) => {
try {
employeeOptions.value = await EmployeeApi.getEmployeeSimpleList({
keyword,
status: '在职',
enabledFlag: true
})
editRoleList.value.forEach((row) => ensureEmployeeOptions(row.persons))