You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

382 lines
13 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<ContentWrap>
<!--计时计件日报表搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-row>
<el-col :span="7">
<el-form-item label="日期" prop="reportDate">
<el-date-picker
v-model="queryParams.reportDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
@change="handleQuery"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="人员" prop="userId">
<el-select v-model="queryParams.userId" clearable filterable placeholder="请选择人员" class="!w-180px">
<el-option
v-for="item in userList"
:key="item.id"
:label="item.nickname"
:value="item.id"
@change="handleQuery"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="工位" prop="orgId">
<el-tree-select
v-model="queryParams.orgId"
:data="organizationTree"
:props="defaultProps"
check-strictly
default-expand-all
@change="handleQuery"
placeholder="请选择工位"
class="!w-240px"
/>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="产品" prop="productId">
<el-select v-model="queryParams.productId" @change="handleQuery" clearable filterable placeholder="请选择" class="!w-180px">
<el-option
v-for="item in productList"
:key="item.id"
:label="item.name"
:value="item.id"
@change="handleQuery"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="工序" prop="orgType">
<el-radio-group v-model="queryParams.orgType">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.MES_ORG_TYPE)"
:key="dict.value"
:label="dict.value"
@change="handleQuery"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<el-tabs v-model="typeName" @tab-click="handleTabClick2">
<el-tab-pane label="计件报表" name="jijian" />
<el-tab-pane label="计时报表" name="jishi" />
</el-tabs>
<ContentWrap v-if="typeName==='jijian'">
<el-row>
<el-col :span="4">
<el-text>本页,产品总数:{{totalNumber}} </el-text>
</el-col>
<el-col :span="4">
<el-text>成品总数:{{totalQuality}} </el-text>
</el-col>
<el-col :span="4">
<el-text>废品总数:{{totalWaste}} </el-text>
</el-col>
<el-col :span="4">
<el-text>成品率{{erpNumberFormatter(Number(totalQuality)/Number(totalNumber)*100,3)+'%'}} </el-text>
</el-col>
</el-row>
<el-divider />
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column
label="报工日期"
align="center"
prop="reportDate"
:formatter="dateFormatter2"
width="120px"
sortable
/>
<el-table-column label="工人" align="center" width="80px" prop="userName" sortable/>
<el-table-column label="工位" align="center" width="100px" prop="orgName" sortable/>
<el-table-column align="center" label="工序" >
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_ORG_TYPE" :value="scope.row.orgType" />
</template>
</el-table-column>
<el-table-column label="产品" align="center" width="120px" prop="productName" sortable/>
<el-table-column label="成品数量" align="center" prop="qualityNumber" />
<el-table-column label="废品数量" align="center" prop="wasteNumber" />
<el-table-column label="总数量" align="center" prop="totalNumber" />
<el-table-column label="成品率%" align="center" prop="qualityRate" :formatter="erpCountTableColumnFormatter"/>
<el-table-column label="打包数量" align="center" prop="packageNumber" />
<el-table-column label="废品原因" align="center" prop="wasteReason" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="类型" align="center" prop="reportType" width="90px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_PRODUCE_REPORT_TYPE" :value="scope.row.reportType" />
</template>
</el-table-column>
<el-table-column label="状态" align="center" fixed="right" prop="reportStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_RECORD_STATUS" :value="scope.row.reportStatus" />
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 列表 -->
<ContentWrap v-if="typeName==='jishi'">
<el-text>本页总计时数:{{totalTime}} </el-text>
<el-divider />
<el-table v-loading="loading" :data="listJiShi" :stripe="true" :show-overflow-tooltip="true">
<el-table-column
label="报工日期"
align="center"
prop="reportDate"
:formatter="dateFormatter2"
width="180px"
sortable
/>
<el-table-column label="用户" align="center" prop="userName" sortable/>
<el-table-column label="工序" align="center" prop="orgType" >
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_ORG_TYPE" :value="scope.row.orgType" />
</template>
</el-table-column>
<el-table-column label="工位" align="center" prop="orgName" sortable/>
<el-table-column label="计时时段" align="center" prop="reportTime" />
<el-table-column label="计时时长" align="center" prop="totalTime" />
<el-table-column label="状态" align="center" prop="reportStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_RECORD_STATUS" :value="scope.row.reportStatus" />
</template>
</el-table-column>
<el-table-column label="班别" align="center" prop="groupType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_GROUP_TYPE" :value="scope.row.groupType" />
</template>
</el-table-column>
<el-table-column label="类型" align="center" prop="reportType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_PRODUCE_REPORT_TYPE" :value="scope.row.reportType" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
</el-table>
<!-- 分页 -->
<Pagination
:total="totalJiShi"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
</template>
<script setup lang="ts">
import {getIntDictOptions, DICT_TYPE, getStrDictOptions} from '@/utils/dict'
import {dateFormatter, dateFormatter2} from '@/utils/formatTime'
import download from '@/utils/download'
import {
ProduceReportApi,
ProduceReportDetailApi,
ProduceReportDetailVO,
ProduceReportVO
} from '@/api/mes/producereport'
import ProduceReportDetailForm from './ProduceReportDetailForm.vue'
import ReplaceForm from './components/ReplaceForm.vue'
import {defaultProps, handleTree} from "@/utils/tree";
import * as UserApi from "@/api/system/user";
import {OrganizationApi} from "@/api/mes/organization";
import {ProductApi, ProductVO} from "@/api/erp/product/product";
import {erpCountTableColumnFormatter, erpNumberFormatter} from "@/utils";
import {useUserStore} from "@/store/modules/user";
import {checkPermi} from "@/utils/permission";
import ProduceReportDetailList
from "@/views/mes/producereport/components/ProduceReportDetailList.vue";
/** */
defineOptions({ name: 'DailyReportIndex' })
const userStore = useUserStore()
const message = useMessage() //
const { t } = useI18n() //
const userList = ref<UserApi.UserVO[]>([]) // 用户列表
const organizationTree = ref() // 树形结构
const productList = ref<ProductVO[]>([]) // 产品列表
const loading = ref(true) // 列表的加载中
const list = ref<ProduceReportDetailVO[]>([]) // 列表的数据
const total = ref(0) // 列表的总页数
const listJiShi = ref<ProduceReportVO[]>([]) // 列表的数据
const totalJiShi = ref(0) // 列表的总页数
const totalNumber = ref(0) // 总数
const totalQuality = ref(0) // 成品总数
const totalWaste = ref(0) //废品总数
const totalTime = ref(0) //计时总数
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
reportId: undefined,
planId: undefined,
productId: undefined,
userId: undefined,
orgId: undefined,
orgType: undefined,
wasteReason: undefined,
totalTime: undefined,
remark: undefined,
isEnable: undefined,
createTime: [],
reportDate: [],
reportStatus: undefined,
reportType: undefined
})
const queryFormRef = ref() // 搜索的表单
const exportLoading = ref(false) // 导出的加载中
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
//只v查通过了的
queryParams.reportStatus = 2
//计时报表
if(typeName.value ==='jishi'){
queryParams.totalTime=0
const data = await ProduceReportApi.getDailyReportPage(queryParams)
listJiShi.value = data.list
totalJiShi.value = data.total
let sumTime= 0;
// 遍历列表,累加每个实体对象的 value 属性值
for (let entity of listJiShi.value) {
sumTime += entity.totalTime
}
totalTime.value = sumTime
}
//计件报表
else{
const data = await ProduceReportDetailApi.getProduceReportDetailPage(queryParams)
list.value = data.list
total.value = data.total
// 初始化总和为 0
let sumQuality= 0;
let sumWaste= 0;
// 遍历列表,累加每个实体对象的 value 属性值
for (let entity of list.value) {
sumQuality += entity.qualityNumber;
sumWaste += entity.wasteNumber
}
totalQuality.value = sumQuality
totalWaste.value = sumWaste
totalNumber.value = Number(totalQuality.value)+Number(totalWaste.value)
}
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
// 导出的二次确认
await message.exportConfirm()
// 发起导出
exportLoading.value = true
//只v查通过了的
queryParams.reportStatus = 2
queryParams.totalTime=0
//计时报表
if(typeName.value ==='jishi'){
const data = await ProduceReportApi.exportProduceReport(queryParams)
download.excel(data, '生产计时报表.xls')
}
//计件报表
else{
const data = await ProduceReportDetailApi.exportProduceReportDetail(queryParams)
download.excel(data, '生产计件报表.xls')
}
} catch {
} finally {
exportLoading.value = false
}
}
/** 获得产线工位树 */
const getOrganizationTree = async () => {
organizationTree.value = []
const data = await OrganizationApi.getOrganizationList()
const root: Tree = { id: 0, name: 'ALL', children: [] }
root.children = handleTree(data, 'id', 'parentId')
organizationTree.value.push(root)
}
/** 初始化 **/
onMounted(async () => {
queryParams.orgType = 'chengxing'
await getList()
await getOrganizationTree()
// 加载用户列表
userList.value = await UserApi.getSimpleUserList()
// 加载产品、
productList.value = await ProductApi.getMesProductSimpleList()
})
/** tab 切换 */
const typeName = ref('jijian')
const handleTabClick2 = (tab: TabsPaneContext) => {
typeName.value = tab.paneName
handleQuery()
}
</script>