feat(生产日报):

1.新增生产日报前台逻辑
This commit is contained in:
leiqiaozhen 2025-05-20 14:39:19 +08:00
parent c0959c8b3e
commit 26566c3e3a
3 changed files with 527 additions and 0 deletions

View File

@ -0,0 +1,51 @@
// 生产入库单申请-分页查询
import request from "@/router/axios";
import {iep} from "@/api/prefix";
// 搜索
export function getObj(obj, params) {
return request({
url: iep('/z-product-daily-report/search'),
method: 'post',
data: obj,
params: params
})
}
// 保存事件
export function greatSaveOrUpdate(obj) {
return request({
url: iep('/z-product-daily-report/greatSaveOrUpdate'),
method: 'post',
data: obj
})
}
// 资源弹窗
export function fetchResourceList(query) {
return request({
url: iep('/z-product-daily-report/findResource'),
method: 'get',
params:query
})
}
// 工单弹窗
export function fetchShopOrderList(query) {
return request({
url: iep('/z-product-daily-report/findShopOrder'),
method: 'get',
params:query
})
}
// 班次数据来源
export function fetchUserWorkShiftList(query) {
return request({
url: iep('/user-work-shift/page'),
method: 'get',
params: query
})
}

View File

@ -0,0 +1,454 @@
<template>
<div class="execution">
<!-- 资源弹出框 -->
<input-multiple-select-checkbox-dialog
:modal-obj="resrceDialogObj"
:modal-fetch-fun="resrceDialogFetchFun"
:modal-show.sync="resrceDialogVisible"
@inputDialogSelected="resrceDialogSelected"
></input-multiple-select-checkbox-dialog>
<!-- 工单号弹出框 -->
<input-multiple-select-checkbox-dialog
:modal-obj="shopOrderDialogObj"
:modal-fetch-fun="shopOrderDialogFetchFun"
:modal-show.sync="shopOrderDialogVisible"
@inputDialogSelected="shopOrderDialogSelected"
></input-multiple-select-checkbox-dialog>
<!-- 主页面 -->
<basic-container>
<el-form
ref="form"
:model="form"
label-width="120px"
label-suffix=":"
:rules="rules"
>
<el-row :gutter="24">
<!-- 生产日期 -->
<el-col :span="12">
<el-form-item label="生产日期" prop="timeRange">
<el-date-picker
v-model="form.timeRange"
type="daterange"
:picker-options="pickerOptions"
range-separator="~"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="yyyy-MM-dd"
valueFormat="yyyy-MM-dd"
style="width: 100%"
align="right">
</el-date-picker>
</el-form-item>
</el-col>
<!-- 班次 -->
<el-col :span="12">
<el-form-item label="班次" prop="workShiftList">
<el-select v-model="form.workShiftList" multiple clearable>
<el-option
v-for="item in userWorkShiftList"
:key="item.userWorkShift"
:label="item.description"
:value="item.userWorkShift"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<!-- 设备编码 -->
<el-col :span="12">
<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="showResrceDialog"
></i>
</el-input>
</el-form-item>
</el-col>
<!-- 工单号 -->
<el-col :span="12">
<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="showShopOrderDialog"
></i>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row style="text-align: center; margin-bottom: 5px" :gutter="24">
<el-col :span="24">
<el-button type="primary" @click="doSearch">搜索</el-button>
<el-button type="primary" @click="doSave">保存</el-button>
<el-button type="primary" @click="doReset">清空</el-button>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="24">
<el-table
ref="productDailyReportData"
stripe
:data="productDailyReportList"
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 :reserve-selection="true" type="selection" width="45"/>
<!-- 顺序 -->
<el-table-column prop="seq" align="center" width="70" label="序号" />
<el-table-column prop="productDate" label="日期" />
<el-table-column prop="fabNo" label="车间" />
<el-table-column prop="fabNoDesc" label="车间描述" />
<el-table-column prop="userWorkShift" label="班次" />
<el-table-column prop="workShiftDesc" label="班次描述" />
<el-table-column prop="resrce" label="设备" />
<el-table-column prop="resrceDesc" label="设备描述" />
<el-table-column prop="shopOrder" label="工单号" />
<el-table-column prop="productItem" label="物料号" />
<el-table-column prop="productItemDesc" label="物料描述" />
<el-table-column prop="productModel" label="产品型号" />
<el-table-column prop="thickness" label="产品厚度" />
<el-table-column prop="density" label="密度" header-align="center" width="120px">
<template slot-scope="scope">
<div>
<el-input v-model="scope.row.density" type="number" clearable/>
</div>
</template>
</el-table-column>
<el-table-column prop="transitionFilmYield" label="过渡膜产量" header-align="center" width="120px">
<template slot-scope="scope">
<div>
<el-input v-model="scope.row.transitionFilmYield" type="number" clearable/>
</div>
</template>
</el-table-column>
<el-table-column prop="rawMaterialUsage" label="过渡膜原料用量" header-align="center" width="120px">
<template slot-scope="scope">
<div>
<el-input v-model="scope.row.rawMaterialUsage" type="number" clearable/>
</div>
</template>
</el-table-column>
<el-table-column prop="impactMaterial" label="冲击料" header-align="center" width="120px">
<template slot-scope="scope">
<div>
<el-input v-model="scope.row.impactMaterial" type="number" clearable/>
</div>
</template>
</el-table-column>
<el-table-column prop="releaseFilmLength" label="管底离型膜长度" header-align="center" width="120px">
<template slot-scope="scope">
<div>
<el-input v-model="scope.row.releaseFilmLength" type="number" clearable/>
</div>
</template>
</el-table-column>
<el-table-column prop="consumeItem" label="消耗物料编码" />
<el-table-column prop="consumeItemDesc" label="消耗物料描述" />
<el-table-column prop="consumeSumQty" label="消耗数量" />
<el-table-column prop="particleSumQty" label="粒子总用量" />
<el-table-column prop="consumeItemGroup" label="消耗物料的物料组" />
<el-table-column prop="inspectionLevelDesc" label="质检状态" />
<el-table-column prop="aplusSumQty" label="生产A+级品M" />
<el-table-column prop="asumQty" label="生产A级品M" />
<el-table-column prop="bsumQty" label="生产B级品M" />
<el-table-column prop="productTotalQty" label="生产总米数" />
<el-table-column prop="finishedWeight" label="成品重量" />
<el-table-column prop="wasteMaterials" label="废边料" />
<el-table-column prop="utilizationRate" 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="[20, 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 {
pickerOptions
} from "@/views/mes/wip/product-storag-request/init";
import {
getObj,
greatSaveOrUpdate,
fetchResourceList,
fetchShopOrderList,
fetchUserWorkShiftList
} from "@/api/mes/prd/product-daily-report";
import {isBlank} from "@/util/string";
import { mapGetters } from 'vuex'
import { getStore } from '@/util/store'
import {hideLoading, showLoading} from '@/const/loading'
import {setSeq} from "@/util/table";
import {resrceDialogObj, shopOrderDialogObj} from "@/views/mes/prd/product-daily-report/init";
import moment from "moment/moment";
export default {
name: 'product-storag-request',
mixins: [],
components: {},
data() {
return {
site: getStore({name: 'tenantId'}),
username: getStore({name: 'userInfo'}).username,
form: {},
initData: {
site: getStore({name: 'tenantId'}),
timeRange: [moment(new Date()).format('YYYY-MM-DD'), moment(new Date()).format('YYYY-MM-DD')],
userWorkShift: '',
workShiftList:[],
resrce: '',
shopOrder: '',
},
userWorkShiftList:[],
rules: {
timeRange: [
{
required: true,
message: '生产日期必填',
trigger: ['blur', 'change'],
},
],
},
// 设备
resrceDialogVisible: false,
resrceDialogFetchFun: fetchResourceList,
resrceDialogObj,
// 工单
shopOrderDialogVisible: false,
shopOrderDialogFetchFun: fetchShopOrderList,
shopOrderDialogObj,
// 便捷时间范围选项
pickerOptions,
productDailyReportList:[],
multipleSelection: [],
titleText: '',
selectedIndex: 0,
page: {
total: 0,
current: 1,
size: 20
},
}
},
created() {
// 初始化数据
this.form = Object.assign({}, this.initData);
this.getUserWorkShiftList();
},
mounted() {
},
computed: {
...mapGetters(['permissions']),
permissionList() {
return {}
}
},
methods: {
// 获取班次
getUserWorkShiftList() {
fetchUserWorkShiftList(
Object.assign(
{
current: '1',
size: '1000',
},
)
).then((res) => {
this.userWorkShiftList = res.data.data.records
})
},
//字符串不为空
isNotBank(str) {
return !isBlank(str);
},
// 显示设备选择弹窗
showResrceDialog() {
this.resrceDialogVisible = true
},
// 设备编号选取
resrceDialogSelected(row) {
let me = this
let resourceStr = '';
if (row.length > 0) {
for (let i = 0; i < row.length; i++) {
if (isBlank(resourceStr)) {
resourceStr = row[i].RESRCE;
} else {
resourceStr = resourceStr + ';' + row[i].RESRCE;
}
}
me.form.resrce = resourceStr;
}
},
// 显示工单选择弹窗
showShopOrderDialog() {
// 如果设备不为空,则根据设备查找派工表中对应的工单
if (this.isNotBank(this.form.resrce)) {
// 工单号不可为空
this.shopOrderDialogObj.queryParam.resrce = this.form.resrce;
}
this.shopOrderDialogVisible = true;
},
// 工单号选取
shopOrderDialogSelected(row) {
let me = this
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;
}
}
me.form.shopOrder = shopOrderStr;
}
},
// 保存
doSave() {
let me = this;
let list = me.$refs.productDailyReportData.selection
if (list.length === 0) {
return this.$message.warning('请选择需要保存的数据')
}
let param = {
list: list,
};
showLoading();
greatSaveOrUpdate(param).then(response => {
hideLoading();
if (response.data.code != 0) {
return me.$message.error(response.data.msg);
}
me.form.documentNo = response.data.data;
me.doSearch();
me.$message.success('保存成功');
me.$refs.productDailyReportData.clearSelection();
}).catch(e => {
console.log(e);
hideLoading();
});
},
// 搜索事件
doSearch(flag) {
let me = this;
let timeRange = me.form.timeRange;
let startTime = "";
let endTime = "";
if(!timeRange || timeRange == null) {
// 生产日期不可为空
return this.$message.error('生产日期' + this.$t('mes.wms.messages.doNotEmpty'))
} else {
startTime = timeRange[0];
endTime = timeRange[1];
}
let param = {
"site": me.site,
"startTime": startTime,
"endTime": endTime,
"workShiftList": me.form.workShiftList,
"resrce": me.form.resrce,
"shopOrder": me.form.shopOrder,
};
me.$refs.productDailyReportData.clearSelection();
me.productDailyReportList = [];
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) {
if (flag === 'delete') {
me.form.documentNo = "";
} else {
return me.$message.error("查询无数据");
}
}
me.productDailyReportList = res.data.data.records;
// me.form.notes = res.data.data.records[0].masterNotes;
me.page.total = res.data.data.total;
me.page.current = res.data.data.current;
setSeq(this.productDailyReportList, 'seq')
}).catch(() => {
hideLoading();
})
},
// // 导出excel
// doExcel() {
// this.downBlobFile(mom_wms('/z-storag-request/exportData'), this.form, '生产入库单.xlsx');
// this.$refs.productDailyReportData.clearSelection();
// },
//表格多选
handleSelectionChange(val) {
this.multipleSelection = val;
},
// 清空
doReset() {
this.form = Object.assign({}, this.initData);
this.page = {
total: 0,
current: 1,
size: 20
};
this.$refs.productDailyReportData.clearSelection();
this.multipleSelection = [];
// 清空列表信息
this.productDailyReportList = [];
},
handleSizeChange(val) {
let me = this
me.page.size = val
me.doSearch()
},
handleCurrentChange(val) {
let me = this
me.page.current = val
me.doSearch()
},
},
}
</script>

View File

@ -0,0 +1,22 @@
// 设备
export const resrceDialogObj = {
title: '设备选择',
"condition": "searchText",
tableColumn: [
{prop: 'RESRCE', label: '设备编码'},
{prop: 'RESRCE_DESC', label: '设备描述'},
],
// 查询参数
queryParam: {}
}
// 工单
export const shopOrderDialogObj = {
title: '工单选择',
condition: "searchText",
tableColumn: [
{prop: 'SHOP_ORDER', label: '工单号'},
],
// 查询参数
queryParam: {}
}