@@ -1,75 +1,8 @@
< template >
< ContentWrap >
< div class = "flex items-center justify-between gap-16px" >
< div >
< div class = "text-16px font-600" > 产值汇总报表中心 < / div >
< div class = "mt-4px text-13px text-[var(--el-text-color-secondary)]" >
页面9 : 独立承载 7.1 .5 项目总览表 、 7.1 .6 员工个人考核产值汇总
< / div >
< / div >
< / div >
< / ContentWrap >
< ContentWrap >
< el-tabs v-model = "activeTab" >
< el -tab -pane label = "项目总览表 " name = "projectOverview " >
< el-form :inline = "true" :model = "projectOverview Form" label -width = " 88px " >
< el-form-item label = "年度" >
< el-date-picker
v-model = "projectOverviewYearValue"
class = "!w-180px"
clearable
placeholder = "请选择年度"
type = "year"
value -format = " YYYY "
/ >
< / el-form-item >
< el-form-item label = "专业" >
< el-select
v-model = "projectOverviewForm.specialtyCode"
class = "!w-220px"
clearable
placeholder = "请选择专业"
>
< el-option
v-for = "item in REPORT_SPECIALTY_OPTIONS"
:key = "item.value"
:label = "item.label"
:value = "item.value"
/ >
< / el-select >
< / el-form-item >
< el-form-item label = "排序方式" >
< el-select
v-model = "projectOverviewForm.sortType"
class = "!w-220px"
placeholder = "请选择排序方式"
>
< el-option
v-for = "item in PROJECT_OVERVIEW_SORT_OPTIONS"
:key = "item.value"
:label = "item.label"
:value = "item.value"
/ >
< / el-select >
< / el-form-item >
< el-form-item >
< el-button
v-hasPermi = "['tjt:report-summary:export']"
:loading = "projectOverviewExportLoading"
plain
type = "primary"
@click ="handleExportProjectOverview"
>
< Icon class = "mr-5px" icon = "ep:download" / >
导出项目总览表
< / el-button >
< / el-form-item >
< / el-form >
< / el-tab-pane >
< el-tab-pane label = "员工个人考核产值汇总" name = "employeeSummary" >
< el-form :inline = "true" :model = "employeeSummaryForm" label -width = " 100px " >
< el -tab -pane label = "员工产值汇总 " name = "employeeSummary " >
< el-form :inline = "true" :model = "employeeSummary Form" label -width = " 88px " >
< el-form-item label = "年度" >
< el-date-picker
v-model = "employeeSummaryYearValue"
@@ -80,13 +13,57 @@
value -format = " YYYY "
/ >
< / el-form-item >
<!-- < el-form-item >
< el-button @click ="getEmployeeBudgetList" >
< Icon class = "mr-5px" icon = "ep:refresh" / >
刷新预览
< / el-button >
< / el-form-item > -- >
< el-form-item >
< el-button
v-hasPermi = "['tjt:report-summary:export']"
:loading = "employeeSummaryExportLoading"
plain
type = "primary"
@click ="openEmployeeSummaryExportDialog"
>
< Icon class = "mr-5px" icon = "ep:download" / >
导出员工汇总
< / el-button >
< / el-form-item >
< / el-form >
< el-table
v-loading = "employeeBudgetLoading"
:data = "employeeBudgetList"
class = "mt-12px"
: empty -text = " employeeSummaryForm.year ? ' 暂无年度成本预算数据 ' : ' 请先选择年度 ' "
>
< el-table-column align = "center" label = "序号" type = "index" width = "70" / >
< el-table-column align = "center" label = "员工姓名" min -width = " 160 " prop = "employeeName" / >
< el-table-column align = "center" label = "预计年度" prop = "budgetYear" width = "120" / >
< el-table-column align = "center" label = "预计发生成本" min -width = " 160 " >
< template # default = "scope" >
{ { formatAmount ( scope . row . expectedCostAmount ) } }
< / template >
< / el-table-column >
< / el-table >
< Pagination
v -model :limit = "employeeBudgetQuery.pageSize"
v -model :page = "employeeBudgetQuery.pageNo"
:total = "employeeBudgetTotal"
@pagination ="getEmployeeBudgetList"
/ >
< / el-tab-pane >
< el-tab-pane label = "项目产值总览" name = "projectOverview" >
< el-form :inline = "true" :model = "projectOverviewForm" label -width = " 88px " >
< el-form-item label = "专业所" >
< el-select
v-model = "employeeSummary Form.officeId"
v-model = "projectOverview Form.officeId"
class = "!w-220px"
clearable
placeholder = "请选择专业所"
@change ="handleOfficeChange"
>
< el-option
v-for = "item in officeOptions"
@@ -96,116 +73,203 @@
/ >
< / el-select >
< / el-form-item >
< el-form-item label = "员工" >
< el-select
v-model = "employeeSummaryForm.employeeId"
class = "!w-240px"
clearable
filterable
remote
reserve -keyword
placeholder = "请输入员工姓名搜索"
:loading = "employeeLoading"
:remote-method = "searchEmployees"
>
< el-option
v-for = "item in employeeOptions"
:key = "item.id"
: label = "item.officeName ? `${item.employeeName} / ${item.officeName}` : item.employeeName"
:value = "item.id"
/ >
< / el-select >
< / el-form-item >
< el-form-item label = "员工状态" >
< el-select
v-model = "employeeSummaryForm.employeeStatus"
class = "!w-180px"
clearable
placeholder = "请选择员工状态"
@change ="handleEmployeeStatusChange"
>
< el-option
v-for = "item in EMPLOYEE_STATUS_OPTIONS"
:key = "item.value"
:label = "item.label"
:value = "item.value"
/ >
< / el-select >
< / el-form-item >
< el-form-item label = "排序方式" >
< el-select
v-model = "employeeSummaryForm.sortType"
class = "!w-220px"
placeholder = "请选择排序方式"
>
< el-option
v-for = "item in EMPLOYEE_SUMMARY_SORT_OPTIONS"
:key = "item.value"
:label = "item.label"
:value = "item.value"
/ >
< / el-select >
< / el-form-item >
<!-- < el-form-item >
< el-button @click ="getProjectEmployeeList" >
< Icon class = "mr-5px" icon = "ep:refresh" / >
刷新预览
< / el-button >
< / el-form-item > -- >
< el-form-item >
< el-button
v-hasPermi = "['tjt:report-summary:export']"
:loading = "employeeSummary ExportLoading"
:loading = "projectOverview ExportLoading"
plain
type = "primary"
@click ="handleExportEmployeeSummary "
@click ="openProjectOverviewExportDialog "
>
< Icon class = "mr-5px" icon = "ep:download" / >
导出员工汇总表
导出项目总览
< / el-button >
< / el-form-item >
< / el-form >
< el-table
v-loading = "projectEmployeeLoading"
:data = "projectEmployeeList"
class = "mt-12px"
: empty -text = " projectOverviewForm.officeId ? ' 该专业所下暂无员工 ' : ' 请先选择专业所 ' "
>
< el-table-column align = "center" label = "序号" type = "index" width = "70" / >
< el-table-column align = "center" label = "员工姓名" min -width = " 160 " prop = "employeeName" / >
< el-table-column align = "center" label = "性别" prop = "gender" width = "100" / >
< el-table-column align = "center" label = "所属所" min -width = " 180 " prop = "officeName" / >
< / el-table >
< Pagination
v -model :limit = "projectEmployeeQuery.pageSize"
v -model :page = "projectEmployeeQuery.pageNo"
:total = "projectEmployeeTotal"
@pagination ="getProjectEmployeeList"
/ >
< / el-tab-pane >
< / el-tabs >
< / ContentWrap >
< Dialog v-model = "exportDialogVisible" :title="exportDialogTitle" width="480" >
< el -form label -width = " 88px " >
< template v-if = "exportDialogType === 'employeeSummary'" >
< el -form -item label = "年度" >
< span > { { employeeSummaryForm . year || '-' } } < / span >
< / el-form-item >
< el-form-item label = "导出排序" >
< el-select
v-model = "employeeSummaryForm.sortType"
class = "!w-220px"
placeholder = "请选择导出排序"
>
< el-option
v-for = "item in EMPLOYEE_SUMMARY_SORT_OPTIONS"
:key = "item.value"
:label = "item.label"
:value = "item.value"
/ >
< / el-select >
< / el-form-item >
< / template >
< template v-else >
< el -form -item label = "专业所" >
< span > { { currentOfficeName || '-' } } < / span >
< / el-form-item >
< el-form-item label = "年度" >
< el-date-picker
v-model = "projectOverviewYearValue"
class = "!w-220px"
clearable
disabled
placeholder = "请选择年度"
type = "year"
value -format = " YYYY "
/ >
< / el-form-item >
< el-form-item label = "导出排序" >
< el-select
v-model = "projectOverviewForm.sortType"
class = "!w-220px"
placeholder = "请选择导出排序"
>
< el-option
v-for = "item in PROJECT_OVERVIEW_SORT_OPTIONS"
:key = "item.value"
:label = "item.label"
:value = "item.value"
/ >
< / el-select >
< / el-form-item >
< / template >
< / 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 >
import * as EmployeeApi from '@/api/tjt/employee'
import * as EmployeeYearCostBudgetApi from '@/api/tjt/employeeYearCostBudget'
import * as OfficeApi from '@/api/tjt/office'
import * as ReportApi from '@/api/tjt/report'
import download from '@/utils/download'
import { EMPLOYEE _STATUS _OPTIONS } from '@/views/tjt/shared/planning'
import {
EMPLOYEE _SUMMARY _SORT _OPTIONS ,
PROJECT _OVERVIEW _SORT _OPTIONS ,
REPORT _SPECIALTY _OPTIONS
} from '@/views/tjt/shared/report'
defineOptions ( { name : 'TjtReportSummary' } )
type SelectOption = {
label : string
value : string
}
type ExportDialogType = 'employeeSummary' | 'projectOverview'
const PROJECT _OVERVIEW _SORT _OPTIONS : SelectOption [ ] = [
{ label : '产值从高到低' , value : 'output_desc' } ,
{ label : '产值从低到高' , value : 'output_asc' } ,
{ label : '项目名称升序' , value : 'name_asc' }
]
const EMPLOYEE _SUMMARY _SORT _OPTIONS : SelectOption [ ] = [
{ label : '年度合计从高到低' , value : 'annual_total_desc' } ,
{ label : '年度合计从低到高' , value : 'annual_total_asc' } ,
{ label : '员工姓名升序' , value : 'name_asc' }
]
const message = useMessage ( )
const activeTab = ref ( 'projectOverview ' )
const activeTab = ref ( 'employeeSummary ' )
const exportDialogVisible = ref ( false )
const exportDialogType = ref < ExportDialogType > ( 'employeeSummary' )
const projectOverviewExportLoading = ref ( false )
const employeeSummaryExportLoading = ref ( false )
const employeeLoading = ref ( false )
const employeeBudget Loading = ref ( false )
const projectEmployeeLoading = ref ( false )
const officeOptions = ref < OfficeApi .OfficeSimpleVO [ ] > ( [ ] )
const employeeOptions = ref < EmployeeApi .EmployeeSimple VO [ ] > ( [ ] )
const employeeBudgetList = ref < EmployeeYearCostBudgetApi .EmployeeYearCostBudget VO [ ] > ( [ ] )
const projectEmployeeList = ref < EmployeeApi .EmployeeVO [ ] > ( [ ] )
const employeeBudgetTotal = ref ( 0 )
const projectEmployeeTotal = ref ( 0 )
const currentYear = new Date ( ) . getFullYear ( )
const projectOverviewForm = reactive < ReportApi .ProjectOverviewExportReqVO > ( {
year : new Date ( ) . getFullYear ( ) ,
specialtyCode : 'water' ,
year : currentYear ,
officeId : undefined ,
sortType : 'output_desc'
} )
const employeeSummaryForm = reactive < ReportApi .EmployeeOutputSummaryExportReqVO > ( {
year : new Date ( ) . getFullYear ( ) ,
year : currentYear ,
officeId : undefined ,
employeeId : undefined ,
employeeStatus : '在职' ,
employeeStatus : undefined ,
sortType : 'annual_total_desc'
} )
const employeeBudgetQuery = reactive < EmployeeYearCostBudgetApi .EmployeeYearCostBudgetPageReqVO > ( {
pageNo : 1 ,
pageSize : 10 ,
employeeId : undefined ,
employeeName : undefined ,
budgetYear : currentYear ,
enabledFlag : true
} )
const projectEmployeeQuery = reactive < EmployeeApi .EmployeePageReqVO > ( {
pageNo : 1 ,
pageSize : 10 ,
employeeName : undefined ,
officeId : undefined ,
employeeStatus : undefined ,
enabledFlag : true
} )
const exportDialogTitle = computed ( ( ) =>
exportDialogType . value === 'employeeSummary' ? '导出员工产值汇总' : '导出项目产值总览'
)
const currentExportLoading = computed ( ( ) =>
exportDialogType . value === 'employeeSummary'
? employeeSummaryExportLoading . value
: projectOverviewExportLoading . value
)
const currentOfficeName = computed ( ( ) => {
return officeOptions . value . find ( ( item ) => item . id === projectOverviewForm . officeId ) ? . officeName || ''
} )
const projectOverviewYearValue = computed ( {
get : ( ) => ( projectOverviewForm . year ? String ( projectOverviewForm . year ) : undefined ) ,
set : ( value ? : string ) => {
projectOverviewForm . year = value ? Number ( value ) : undefined
}
get : ( ) => String ( currentYear ) ,
set : ( _ value? : string ) => undefined
} )
const employeeSummaryYearValue = computed ( {
@@ -215,48 +279,90 @@ const employeeSummaryYearValue = computed({
}
} )
const formatAmount = ( value ? : number ) => {
if ( value === undefined || value === null ) {
return ''
}
return Number ( value ) . toFixed ( 2 )
}
const getOfficeList = async ( ) => {
officeOptions . value = await OfficeApi . getOfficeSimpleList ( )
}
const search Employees = async ( keyword : string ) => {
employeeLoading . value = true
const get EmployeeBudgetList = async ( ) => {
if ( ! employeeBudgetQuery . budgetYear ) {
employeeBudgetList . value = [ ]
employeeBudgetTotal . value = 0
return
}
employeeBudgetLoading . value = true
try {
employeeOptions . value = await EmployeeApi . getEmployeeSimpleList ( {
keyword ,
officeId : employeeSummaryForm . officeId ,
status : employeeSummaryForm . employeeStatus ,
enabledFlag : true
} )
const data = await EmployeeYearCostBudget Api . getEmployeeYearCostBudgetPage ( employeeBudgetQuery )
employeeBudgetList . value = data . list
employeeBudgetTotal . value = data . total
} finally {
employeeLoading . value = false
employeeBudget Loading . value = false
}
}
const handleOfficeChange = ( ) => {
employeeSummaryForm . employeeId = undefined
search Employees ( '' )
const getProjectEmployeeList = async ( ) => {
if ( ! projectEmployeeQuery . officeId ) {
project EmployeeList . value = [ ]
projectEmployeeTotal . value = 0
return
}
projectEmployeeLoading . value = true
try {
const data = await EmployeeApi . getEmployeePage ( projectEmployeeQuery )
projectEmployeeList . value = data . list
projectEmployeeTotal . value = data . total
} finally {
projectEmployeeLoading . value = false
}
}
const handle EmployeeStatusChange = ( ) => {
employeeSummaryForm . employeeId = undefined
searchEmployees ( '' )
}
const handleExportProjectOverview = async ( ) => {
if ( ! projectOverviewForm . year ) {
const open EmployeeSummaryExportDialog = ( ) => {
if ( ! employeeSummaryForm . year ) {
message . warning ( '请选择年度' )
return
}
if ( ! projectOverviewForm . specialtyCode ) {
message . warning ( '请选择专业' )
exportDialogType . value = 'employeeSummary'
exportDialogVisible . value = true
}
const openProjectOverviewExportDialog = ( ) => {
if ( ! projectOverviewForm . officeId ) {
message . warning ( '请选择专业所' )
return
}
exportDialogType . value = 'projectOverview'
exportDialogVisible . value = true
}
const submitExport = async ( ) => {
if ( exportDialogType . value === 'employeeSummary' ) {
await handleExportEmployeeSummary ( )
return
}
await handleExportProjectOverview ( )
}
const handleExportProjectOverview = async ( ) => {
if ( ! projectOverviewForm . officeId ) {
message . warning ( '请选择专业所' )
return
}
if ( ! projectOverviewYearValue . value ) {
message . warning ( '请选择年度' )
return
}
try {
await message . exportConfirm ( )
projectOverviewExportLoading . value = true
projectOverviewForm . year = currentYear
const data = await ReportApi . exportProjectOverview ( projectOverviewForm )
download . excel ( data , '项目总览表.xlsx' )
exportDialogVisible . value = false
} finally {
projectOverviewExportLoading . value = false
}
@@ -268,17 +374,36 @@ const handleExportEmployeeSummary = async () => {
return
}
try {
await message . exportConfirm ( )
employeeSummaryExportLoading . value = true
const data = await ReportApi . exportEmployeeOutputSummary ( employeeSummaryForm )
download . excel ( data , '员工个人考核产值汇总.xlsx' )
download . excel ( data , '员工个人考核产值汇总表 .xlsx' )
exportDialogVisible . value = false
} finally {
employeeSummaryExportLoading . value = false
}
}
watch (
( ) => employeeSummaryForm . year ,
( year ) => {
employeeBudgetQuery . pageNo = 1
employeeBudgetQuery . budgetYear = year
getEmployeeBudgetList ( )
} ,
{ immediate : true }
)
watch (
( ) => projectOverviewForm . officeId ,
( officeId ) => {
projectEmployeeQuery . pageNo = 1
projectEmployeeQuery . officeId = officeId
getProjectEmployeeList ( )
} ,
{ immediate : true }
)
onMounted ( async ( ) => {
await getOfficeList ( )
await searchEmployees ( '' )
} )
< / script >