feat(生产条码履历报表):新增生产条码履历报表

This commit is contained in:
leiqiaozhen 2025-03-06 17:01:48 +08:00
parent bffa944444
commit c6a6c7f4c6

View File

@ -0,0 +1,651 @@
<template>
<div class="execution">
<!-- 车间弹出框 -->
<input-multiple-select-checkbox-dialog
:modal-obj="fabNoDialogObj"
:modal-fetch-fun="fabNoDialogFetchFun"
:modal-show.sync="fabNoDialogVisible"
@inputDialogSelected="dialogSelected"
></input-multiple-select-checkbox-dialog>
<!-- 工单号弹出框 -->
<input-multiple-select-checkbox-dialog
:modal-obj="shopOrderDialogObj"
:modal-fetch-fun="shopOrderDialogFetchFun"
:modal-show.sync="shopOrderDialogVisible"
@inputDialogSelected="dialogSelected"
></input-multiple-select-checkbox-dialog>
<!-- 工作中心 弹窗 -->
<input-multiple-select-checkbox-dialog
:modal-obj="workCenterDialogObj"
:modal-fetch-fun="workCenterDialogFetchFun"
:modal-show.sync="workCenterDialogVisible"
@inputDialogSelected="dialogSelected"
></input-multiple-select-checkbox-dialog>
<!-- 工序弹窗 -->
<input-multiple-select-checkbox-dialog
:modal-obj="operationDialogObj"
:modal-fetch-fun="operationDialogFetchFun"
:modal-show.sync="operationDialogVisible"
@inputDialogSelected="dialogSelected"
></input-multiple-select-checkbox-dialog>
<!-- 设备弹出框 -->
<input-multiple-select-checkbox-dialog
:modal-obj="resrceDialogObj"
:modal-fetch-fun="resrceDialogFetchFun"
:modal-show.sync="resrceDialogVisible"
@inputDialogSelected="dialogSelected"
></input-multiple-select-checkbox-dialog>
<!-- 物料编码弹出框 -->
<input-multiple-select-checkbox-dialog
:modal-obj="itemDialogObj"
:modal-fetch-fun="itemDialogFetchFun"
:modal-show.sync="itemDialogVisible"
@inputDialogSelected="dialogSelected"
></input-multiple-select-checkbox-dialog>
<!-- 产品型号弹出框 -->
<input-multiple-select-checkbox-dialog
:modal-obj="productModelDialogObj"
:modal-fetch-fun="productModelDialogFetchFun"
:modal-show.sync="productModelDialogVisible"
@inputDialogSelected="dialogSelected"
></input-multiple-select-checkbox-dialog>
<!-- 主页面 -->
<basic-container>
<el-form
ref="form"
:model="form"
label-width="120px"
label-suffix=":"
>
<el-row :gutter="24">
<!-- 站点 -->
<el-col :span="6">
<el-form-item label="站点" prop="site">
<el-input clearable v-model="form.site" :disabled="true"></el-input>
</el-form-item>
</el-col>
<!-- 车间 -->
<el-col :span="6">
<el-form-item prop="fabNo">
<template slot="label">
<tooltip content="车间:" :triangle="true"> </tooltip>
</template>
<el-input v-model="form.fabNo" clearable >
<i
slot="suffix"
class="el-input__icon el-icon-copy-document"
@click.stop="showDialog('fabNo')"
></i>
</el-input>
</el-form-item>
</el-col>
<!-- 工单号 -->
<el-col :span="6">
<el-form-item label="工单号" prop="shopOrder">
<el-input v-model="form.shopOrder" clearable >
<i
slot="suffix"
class="el-input__icon el-icon-copy-document"
@click.stop="showDialog('shopOrder')"
></i>
</el-input>
</el-form-item>
</el-col>
<!-- 条码号 -->
<el-col :span="6">
<el-form-item prop="lotNo">
<template slot="label">
<tooltip content="条码号:" :triangle="true"> </tooltip>
</template>
<el-input clearable v-model="form.lotNo" ref="lotNoInput" @change="scanEvent"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<!-- 工作中心 -->
<el-col :span="6">
<el-form-item label="工作中心" prop="workCenter">
<el-input v-model="form.workCenter" clearable >
<i
slot="suffix"
class="el-input__icon el-icon-copy-document"
@click.stop="showDialog('workCenter')"
></i>
</el-input>
</el-form-item>
</el-col>
<!-- 工序 -->
<el-col :span="6">
<el-form-item label="工序" prop="operation">
<el-input v-model="form.operation" clearable >
<i
slot="suffix"
class="el-input__icon el-icon-copy-document"
@click.stop="showDialog('operation')"
></i>
</el-input>
</el-form-item>
</el-col>
<!-- 设备编码 -->
<el-col :span="6">
<el-form-item label="设备编码" prop="resrce">
<el-input v-model="form.resrce" clearable >
<i
slot="suffix"
class="el-input__icon el-icon-copy-document"
@click.stop="showDialog('resrce')"
></i>
</el-input>
</el-form-item>
</el-col>
<!-- 物料编码 -->
<el-col :span="6">
<el-form-item label="物料编码" prop="item">
<el-input v-model="form.item" clearable >
<i
slot="suffix"
class="el-input__icon el-icon-copy-document"
@click.stop="showDialog('item')"
></i>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<!-- 产品型号 -->
<el-col :span="6">
<el-form-item label="产品型号" prop="productModel">
<el-input v-model="form.productModel" clearable >
<i
slot="suffix"
class="el-input__icon el-icon-copy-document"
@click.stop="showDialog('productModel')"
></i>
</el-input>
</el-form-item>
</el-col>
<!-- 进站时间 -->
<el-col :span="12">
<el-form-item prop="timeRange">
<template slot="label">
<tooltip content="进站时间:" :triangle="true"> </tooltip>
</template>
<el-date-picker
v-model="form.timeRange"
type="datetimerange"
:picker-options="pickerOptions"
range-separator="~"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="yyyy-MM-dd HH:mm:ss"
valueFormat="yyyy-MM-dd HH:mm:ss"
style="width: 100%"
align="right">
</el-date-picker>
</el-form-item>
</el-col>
<!-- 按钮 -->
<el-col :span="6">
<el-button type="primary" @click="doSearch">搜索</el-button>
<el-button type="primary" @click="doReset">清空</el-button>
<el-button type="primary" @click="doExcel">导出</el-button>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="24">
<el-table
ref="storagRequestData"
stripe
:data="productLotHistoryReportList"
tooltip-effect="dark"
height="calc(100vh - 480px)"
style="width: 100%"
:header-cell-style="{ 'text-align': 'center' }"
:cell-style="{ 'text-align': 'center' }"
@selection-change="handleSelectionChange">
<el-table-column prop="site" width="100" label="站点" />
<el-table-column prop="lotNo" width="150" label="条码号" />
<el-table-column prop="item" width="100" label="物料编码" />
<el-table-column prop="itemDesc" width="150" label="物料描述" />
<el-table-column prop="productModel" width="150" label="产品型号" />
<el-table-column prop="shopOrder" width="150" label="工单号" />
<el-table-column prop="workCenter" width="100" label="工作中心" />
<el-table-column prop="fabNo" width="100" label="车间" />
<el-table-column prop="fabNoDesc" width="120" label="车间描述" />
<el-table-column prop="resrce" width="100" label="设备号" />
<el-table-column prop="resrceDesc" width="120" label="设备描述" />
<el-table-column prop="operation" width="100" label="工序" />
<el-table-column prop="operationDesc" width="120" label="工序描述" />
<el-table-column prop="inputUser" width="150" label="进站操作员" />
<el-table-column prop="outputUser" width="150" label="出站操作员" />
<el-table-column prop="startTime" width="160" label="进站时间" />
<el-table-column prop="endTime" width="160" label="出站时间" />
<el-table-column prop="inputQty" width="100" label="进站数量" />
<el-table-column prop="outputQty" width="100" label="出站数量" />
<el-table-column prop="lotStatus" width="140" label="条码状态" />
<el-table-column prop="invStatus" width="100" label="库存状态" />
<el-table-column prop="invQty" width="100" label="库存数量" />
<el-table-column prop="treadeSide" width="140" label="处理面" />
<el-table-column prop="vlt" width="100" label="VLT" />
<el-table-column prop="irr" width="100" label="IRR" />
<el-table-column prop="uvr" width="100" label="UVR" />
<el-table-column prop="length" width="100" label="标准长度" />
<el-table-column prop="width" width="100" label="宽度" />
<el-table-column prop="remark" width="140" label="备注" />
</el-table>
<div style="width: 100%; display: flex; flex-direction: column; align-items: flex-end; justify-content: center">
<el-pagination @current-change="handleCurrentChange"
@size-change="handleSizeChange"
:current-page.sync="page.current"
:page-sizes="[50, 100, 200]"
:page-size="page.size"
layout="total, sizes, prev, pager, next, jumper"
:total="page.total">
</el-pagination>
</div>
</el-col>
</el-row>
</el-form>
</basic-container>
</div>
</template>
<script>
import {
fabNoDialogObj,
shopOrderDialogObj,
workCenterDialogObj,
operationDialogObj,
resrceDialogObj,
itemDialogObj,
productModelDialogObj,
pickerOptions
} from "@/views/mes/wip/product-lot-history-report/init";
import {
getObj,
fetchFabNoList,
fetchShopOrderList,
fetchWorkCenterList,
fetchOperationList,
fetchResrceList,
fetchItemList,
fetchProductModelList
} from "@/api/mes/wip/product-lot-history-report";
import {isBlank} from "@/util/string";
import { mapGetters } from 'vuex'
import { getStore } from '@/util/store'
import {hideLoading, showLoading} from '@/const/loading'
import {listByActivityId} from "@/api/admin/activity-option";
import {iep} from "@/api/prefix";
import tooltip from "@/components/tooltip/index.vue";
export default {
name: 'product-lot-history-report',
mixins: [],
components: {tooltip},
data() {
return {
site: getStore({name: 'tenantId'}),
username: getStore({name: 'userInfo'}).username,
form: {},
initData: {
site: getStore({name: 'tenantId'}),
fabNo: '',
shopOrder: '',
lotNo: '',
workCenter: '',
operation: '',
resrce: '',
item: '',
productModel: '',
timeRange: '',
},
// 作业规则
fabNos: '',
// 车间弹窗
fabNoDialogVisible: false,
fabNoDialogFetchFun: fetchFabNoList,
fabNoDialogObj,
// 工单弹窗
shopOrderDialogVisible: false,
shopOrderDialogFetchFun: fetchShopOrderList,
shopOrderDialogObj,
// 工作中心弹窗
workCenterDialogVisible: false,
workCenterDialogFetchFun: fetchWorkCenterList,
workCenterDialogObj,
// 工序弹窗
operationDialogVisible: false,
operationDialogFetchFun: fetchOperationList,
operationDialogObj,
// 设备弹出框
resrceDialogVisible: false,
resrceDialogFetchFun: fetchResrceList,
resrceDialogObj,
// 物料编码弹出框
itemDialogVisible: false,
itemDialogFetchFun: fetchItemList,
itemDialogObj,
// 产品型号弹出框
productModelDialogVisible: false,
productModelDialogFetchFun: fetchProductModelList,
productModelDialogObj,
// 便捷时间范围选项
pickerOptions,
// table列表
productLotHistoryReportList:[],
page: {
total: 0,
current: 1,
size: 50
},
}
},
created() {
// 初始化数据
this.form = Object.assign({}, this.initData);
// 获取作业规则
let activityId = this.$route.query.ACTIVITY_ID
showLoading()
listByActivityId(activityId)
.then((response) => {
hideLoading()
if (response.data.code != 0) {
return this.$message.error(response.data.msg)
}
for (let i = 0; i < response.data.data.length; i++) {
// 判断 作业规则是否为 Z_FAB;
if (response.data.data[i].optionName == 'Z_FAB') {
this.fabNos = response.data.data[i].optionValue
}
}
})
.catch((e) => {
hideLoading()
})
},
mounted() {
},
computed: {
...mapGetters(['permissions']),
permissionList() {
return {}
}
},
methods: {
// 打开弹窗
showDialog(key) {
let me = this;
this.openKey = key
switch (key) {
case 'fabNo':
this.fabNoDialogObj.queryParam.fabNos = this.fabNos;
this.fabNoDialogVisible = true
break;
case 'shopOrder':
this.shopOrderDialogVisible = true
break;
case 'workCenter':
this.workCenterDialogObj.queryParam.fabNos = this.form.fabNo;
this.workCenterDialogVisible = true
break;
case 'operation':
this.operationDialogVisible = true
break;
case 'resrce':
this.resrceDialogObj.queryParam.fabNos = this.form.fabNo;
this.resrceDialogVisible = true
break;
case 'item':
this.itemDialogVisible = true
break;
case 'productModel':
this.productModelDialogVisible = true
break;
}
},
// 选择弹窗资料
dialogSelected(row) {
let obj = {}
switch (this.openKey) {
case 'fabNo':
let fabNoStr = '';
if (row.length > 0) {
for (let i = 0; i < row.length; i++) {
if (isBlank(fabNoStr)) {
fabNoStr = row[i].FAB_NO;
} else {
fabNoStr = fabNoStr + ';' + row[i].FAB_NO;
}
}
obj['fabNo'] = fabNoStr
}
break;
case 'shopOrder':
let shopOrderStr = '';
if (row.length > 0) {
for (let i = 0; i < row.length; i++) {
if (isBlank(shopOrderStr)) {
shopOrderStr = row[i].SHOP_ORDER;
} else {
shopOrderStr = shopOrderStr + ';' + row[i].SHOP_ORDER;
}
}
obj['shopOrder'] = shopOrderStr
}
break;
case 'workCenter':
let workCenterStr = '';
if (row.length > 0) {
for (let i = 0; i < row.length; i++) {
if (isBlank(workCenterStr)) {
workCenterStr = row[i].WORK_CENTER;
} else {
workCenterStr = workCenterStr + ';' + row[i].WORK_CENTER;
}
}
obj['workCenter'] = workCenterStr
}
break;
case 'operation':
let operationStr = '';
if (row.length > 0) {
for (let i = 0; i < row.length; i++) {
if (isBlank(operationStr)) {
operationStr = row[i].OPERATION;
} else {
operationStr = operationStr + ';' + row[i].OPERATION;
}
}
obj['operation'] = operationStr
}
break;
case 'resrce':
let resrceStr = '';
if (row.length > 0) {
for (let i = 0; i < row.length; i++) {
if (isBlank(resrceStr)) {
resrceStr = row[i].RESRCE;
} else {
resrceStr = resrceStr + ';' + row[i].RESRCE;
}
}
obj['resrce'] = resrceStr
}
break;
case 'item':
let itemStr = '';
if (row.length > 0) {
for (let i = 0; i < row.length; i++) {
if (isBlank(itemStr)) {
itemStr = row[i].ITEM;
} else {
itemStr = itemStr + ';' + row[i].ITEM;
}
}
obj['item'] = itemStr
}
break;
case 'productModel':
let productModelStr = '';
if (row.length > 0) {
for (let i = 0; i < row.length; i++) {
if (isBlank(productModelStr)) {
productModelStr = row[i].PRODUCT_MODEL;
} else {
productModelStr = productModelStr + ';' + row[i].PRODUCT_MODEL;
}
}
obj['productModel'] = productModelStr
}
break;
}
// 更新form对象
this.form = Object.assign({}, this.form, obj)
},
// 条码号 扫描事件
scanEvent() {
let me = this;
let lotNo = me.form.lotNo;
// 判断如果条码号都为空,则报错
if (isBlank(lotNo)) {
return me.$message.error("条码号不能为空!");
}
me.doSearch();
},
// 搜索事件
doSearch() {
let me = this;
let fabNo = me.form.fabNo;
let lotNo = me.form.lotNo;
let timeRange = me.form.timeRange;
// 判断如果车间、条码号、进站时间都为空,则报错
if (isBlank(fabNo) && isBlank(lotNo) && isBlank(timeRange)) {
return me.$message.error("择一输入的条件至少要输入一项");
}
let inputStartTime = "";
let inputEndTime = "";
if (!isBlank(timeRange)) {
[inputStartTime, inputEndTime] = timeRange;
}
let param = {
"site": me.site,
"fabNo": me.form.fabNo,
"shopOrder": me.form.shopOrder,
"lotNo": me.form.lotNo,
"workCenter": me.form.workCenter,
"operation": me.form.operation,
"resrce": me.form.resrce,
"item": me.form.item,
"productModel": me.form.productModel,
"inputStartTime": inputStartTime,
"inputEndTime": inputEndTime,
};
me.productLotHistoryReportList = [];
showLoading();
getObj(param,me.page).then(res => {
hideLoading();
if (res.data.code !== 0) {
return me.$message.error(res.data.msg);
}
if(res.data.data.records.length === 0) {
return me.$message.error("查询无数据");
}
me.productLotHistoryReportList = res.data.data.records;
me.page.total = res.data.data.total;
me.page.current = res.data.data.current;
}).catch(() => {
hideLoading();
})
},
// 导出excel
doExcel() {
let me = this;
let fabNo = me.form.fabNo;
let lotNo = me.form.lotNo;
let timeRange = me.form.timeRange;
// 判断如果车间、条码号、进站时间都为空,则报错
if (isBlank(fabNo) && isBlank(lotNo) && isBlank(timeRange)) {
return me.$message.error("择一输入的条件至少要输入一项");
}
let inputStartTime = "";
let inputEndTime = "";
if (!isBlank(timeRange)) {
[inputStartTime, inputEndTime] = timeRange;
}
let param = {
"site": me.site,
"fabNo": me.form.fabNo,
"shopOrder": me.form.shopOrder,
"lotNo": me.form.lotNo,
"workCenter": me.form.workCenter,
"operation": me.form.operation,
"resrce": me.form.resrce,
"item": me.form.item,
"productModel": me.form.productModel,
"inputStartTime": inputStartTime,
"inputEndTime": inputEndTime,
};
this.downBlobFile(iep('/product-lot-history-report/exportData'), param, this.site + '_生产条码履历报表.xlsx');
},
//表格多选
handleSelectionChange(val) {
this.multipleSelection = val;
},
// 清空
doReset() {
this.form = Object.assign({}, this.initData);
this.page = {
total: 0,
current: 1,
size: 50
};
// 清空列表信息
this.productLotHistoryReportList = [];
},
handleSizeChange(val) {
let me = this
me.page.size = val
me.doSearch()
},
handleCurrentChange(val) {
let me = this
me.page.current = val
me.doSearch()
},
},
}
</script>