feat:添加报工记录页面

pull/1/head
黄伟杰 2 weeks ago
parent 6fc887d9f2
commit a99abc9e01

@ -3,11 +3,28 @@ import request from '@/config/axios'
// 报工 VO // 报工 VO
export interface BaogongRecordVO { export interface BaogongRecordVO {
id: number // id id: number // id
planId: number // 关联计划id planId: number // 关联计划 id
num: number // 派工数量 num: number // 派工数量
baogongTime: Date // 派工时间 baogongTime: Date // 派工时间
} }
// 报工统计 VO
export interface BaogongRecordStatVO {
id: number // ID
taskCode: string // 任务单编码
planCode: string // 计划单编码
employeeId: string // 员工 ID
employeeName: string // 员工姓名
productName: string // 产品名称
productCode: string // 产品编码
baogongNum: number // 报工数量
passNum: number // 合格数量
noPassNum: number // 不合格数量
passRate: number // 合格率 (%)
reason: string // 原因
baogongTime: Date // 报工时间
}
// 报工 API // 报工 API
export const BaogongRecordApi = { export const BaogongRecordApi = {
// 查询报工分页 // 查询报工分页
@ -15,6 +32,11 @@ export const BaogongRecordApi = {
return await request.get({ url: `/mes/baogong-record/page`, params }) return await request.get({ url: `/mes/baogong-record/page`, params })
}, },
// 查询报工统计分页
getBaogongRecordStatPage: async (params: any) => {
return await request.get({ url: `/mes/baogong-record/stat-page`, params })
},
// 查询报工详情 // 查询报工详情
getBaogongRecord: async (id: number) => { getBaogongRecord: async (id: number) => {
return await request.get({ url: `/mes/baogong-record/get?id=` + id }) return await request.get({ url: `/mes/baogong-record/get?id=` + id })
@ -40,4 +62,13 @@ export const BaogongRecordApi = {
return await request.download({ url: `/mes/baogong-record/export-excel`, params }) return await request.download({ url: `/mes/baogong-record/export-excel`, params })
}, },
// 导出报工统计 Excel
exportBaogongRecordStat: async (params) => {
return await request.download({ url: `/mes/baogong-record/export-stat-excel`, params })
},
// 导出报工统计 Excel (新)
statExportExcel: async (params) => {
return await request.download({ url: `/mes/baogong-record/stat-export-excel`, params })
},
} }

@ -3836,6 +3836,33 @@ export default {
actionDeleteLabel: 'Delete', actionDeleteLabel: 'Delete',
exportFilename: 'FormingRecord.xls' exportFilename: 'FormingRecord.xls'
},
WorkReportRecord: {
moduleName: 'Work Report Record',
searchBaogongTimeLabel: 'Report Date',
searchBaogongTimeStartPlaceholder: 'Start Date',
searchBaogongTimeEndPlaceholder: 'End Date',
buttonSearchText: 'Search',
buttonResetText: 'Reset',
buttonExportText: 'Export',
tableTaskCodeColumn: 'Task Code',
tablePlanCodeColumn: 'Plan Code',
tableEmployeeIdColumn: 'Employee ID',
tableEmployeeNameColumn: 'Employee Name',
tableProductNameColumn: 'Product Name',
tableProductCodeColumn: 'Product Code',
tableBaogongNumColumn: 'Report Quantity',
tablePassNumColumn: 'Pass Quantity',
tableNoPassNumColumn: 'No-Pass Quantity',
tablePassRateColumn: 'Pass Rate(%)',
tableReasonColumn: 'Reason',
tableBaogongTimeColumn: 'Report Time',
exportFilename: 'Employee Work Report Statistics.xls'
} }
}, },
DataCollection: { DataCollection: {

@ -3682,6 +3682,32 @@ export default {
actionDeleteLabel: '删除', actionDeleteLabel: '删除',
exportFilename: '成型记录.xls' exportFilename: '成型记录.xls'
},
WorkReportRecord: {
moduleName: '报工记录',
searchBaogongTimeLabel: '报工日期',
searchBaogongTimeStartPlaceholder: '开始日期',
searchBaogongTimeEndPlaceholder: '结束日期',
buttonSearchText: '搜索',
buttonResetText: '重置',
buttonExportText: '导出',
tableTaskCodeColumn: '任务单编码',
tablePlanCodeColumn: '计划单编码',
tableEmployeeIdColumn: '员工 ID',
tableEmployeeNameColumn: '员工姓名',
tableProductNameColumn: '产品名称',
tableProductCodeColumn: '产品编码',
tableBaogongNumColumn: '报工数量',
tablePassNumColumn: '合格数量',
tableNoPassNumColumn: '不合格数量',
tablePassRateColumn: '合格率 (%)',
tableReasonColumn: '原因',
tableBaogongTimeColumn: '报工时间',
exportFilename: '员工报工统计.xls'
} }
}, },
DataCollection: { DataCollection: {

@ -0,0 +1,224 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item :label="t('ProductionPlan.WorkReportRecord.searchBaogongTimeLabel')" prop="baogongTime">
<el-date-picker
v-model="queryParams.baogongTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
:start-placeholder="t('ProductionPlan.WorkReportRecord.searchBaogongTimeStartPlaceholder')"
:end-placeholder="t('ProductionPlan.WorkReportRecord.searchBaogongTimeEndPlaceholder')"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
:shortcuts="dateShortcuts"
class="!w-240px"
@change="handleDateChange"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{ t('ProductionPlan.WorkReportRecord.buttonSearchText') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('ProductionPlan.WorkReportRecord.buttonResetText') }}</el-button>
<el-button
type="success"
plain
@click="handleStatExport"
:loading="statExportLoading"
v-hasPermi="['mes:baogong-record:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column :label="t('ProductionPlan.WorkReportRecord.tableTaskCodeColumn')" align="center" prop="taskCode" min-width="120px" sortable />
<el-table-column :label="t('ProductionPlan.WorkReportRecord.tablePlanCodeColumn')" align="center" prop="planCode" min-width="120px" sortable />
<el-table-column :label="t('ProductionPlan.WorkReportRecord.tableEmployeeIdColumn')" align="center" prop="employeeId" min-width="100px" sortable />
<el-table-column :label="t('ProductionPlan.WorkReportRecord.tableEmployeeNameColumn')" align="center" prop="employeeName" min-width="100px" sortable />
<el-table-column :label="t('ProductionPlan.WorkReportRecord.tableProductNameColumn')" align="center" prop="productName" min-width="120px" sortable />
<el-table-column :label="t('ProductionPlan.WorkReportRecord.tableProductCodeColumn')" align="center" prop="productCode" min-width="100px" sortable />
<el-table-column :label="t('ProductionPlan.WorkReportRecord.tableBaogongNumColumn')" align="center" prop="baogongNum" min-width="100px" sortable />
<el-table-column :label="t('ProductionPlan.WorkReportRecord.tablePassNumColumn')" align="center" prop="passNum" min-width="100px" sortable />
<el-table-column :label="t('ProductionPlan.WorkReportRecord.tableNoPassNumColumn')" align="center" prop="noPassNum" min-width="100px" sortable />
<el-table-column :label="t('ProductionPlan.WorkReportRecord.tablePassRateColumn')" align="center" prop="passRate" min-width="100px" :formatter="formatPassRate" sortable />
<el-table-column :label="t('ProductionPlan.WorkReportRecord.tableReasonColumn')" align="center" prop="reason" min-width="150px" show-overflow-tooltip />
<el-table-column
:label="t('ProductionPlan.WorkReportRecord.tableBaogongTimeColumn')"
align="center"
prop="baogongTime"
:formatter="dateFormatter"
width="180px"
sortable
/>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { BaogongRecordApi, BaogongRecordStatVO } from '@/api/mes/baogongrecord'
/** 报工记录统计 列表 */
defineOptions({ name: 'WorkReportRecord' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<BaogongRecordStatVO[]>([]) //
const total = ref(0) //
const selectedIds = ref<(string | number)[]>([])
//
const dateShortcuts = [
{
text: '今日',
value: () => {
const start = new Date()
start.setHours(0, 0, 0, 0)
const end = new Date()
end.setHours(23, 59, 59, 999)
return [start, end]
}
},
{
text: '近七日',
value: () => {
const end = new Date()
end.setHours(23, 59, 59, 999)
const start = new Date()
start.setDate(start.getDate() - 6)
start.setHours(0, 0, 0, 0)
return [start, end]
}
},
{
text: '近三十日',
value: () => {
const end = new Date()
end.setHours(23, 59, 59, 999)
const start = new Date()
start.setDate(start.getDate() - 29)
start.setHours(0, 0, 0, 0)
return [start, end]
}
}
]
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
beginBaogongTime: undefined,
endBaogongTime: undefined,
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
const statExportLoading = ref(false)
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await BaogongRecordApi.getBaogongRecordStatPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
queryParams.beginBaogongTime = undefined
queryParams.endBaogongTime = undefined
handleQuery()
}
/** 日期选择变化处理 */
const handleDateChange = (value: any) => {
if (value && Array.isArray(value) && value.length === 2) {
queryParams.beginBaogongTime = value[0]
queryParams.endBaogongTime = value[1]
} else {
queryParams.beginBaogongTime = undefined
queryParams.endBaogongTime = undefined
}
handleQuery()
}
/** 合格率格式化 */
const formatPassRate = (row: BaogongRecordStatVO) => {
if (row.passRate === null || row.passRate === undefined) return ''
return row.passRate + '%'
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
await message.exportConfirm()
exportLoading.value = true
const data = await BaogongRecordApi.exportBaogongRecordStat(queryParams)
download.excel(data, t('ProductionPlan.WorkReportRecord.exportFilename'))
} catch {
} finally {
exportLoading.value = false
}
}
/** 多选变化 */
const handleSelectionChange = (selection: BaogongRecordStatVO[]) => {
selectedIds.value = selection
.map((item) => item.id)
.filter((id): id is string | number => id !== undefined && id !== null && id !== '')
}
/** 统计导出按钮操作 */
const handleStatExport = async () => {
try {
await message.exportConfirm()
statExportLoading.value = true
const params: any = { ...queryParams }
if (selectedIds.value.length > 0) {
params.ids = selectedIds.value.join(',')
}
const data = await BaogongRecordApi.statExportExcel(params)
download.excel(data, t('ProductionPlan.WorkReportRecord.exportFilename'))
} catch {
} finally {
statExportLoading.value = false
}
}
//
onMounted(async () => {
await getList()
})
</script>
<style lang="scss" scoped>
</style>
Loading…
Cancel
Save