feat(最优配方):功能新增

This commit is contained in:
liaohechuan 2025-04-27 13:25:18 +08:00
parent fd75b0fede
commit b0c023c7e5
3 changed files with 610 additions and 1 deletions

View File

@ -72,3 +72,12 @@ export function doSubmitParameter(obj) {
data: obj
})
}
// 最优配方保存
export function doOptimumFormulaSave(obj) {
return request({
url: iep('/z-product-structure-parameter/doOptimumFormulaSave'),
method: 'post',
data: obj
})
}

View File

@ -0,0 +1,599 @@
<template>
<!--产品结构化参数最优配方-->
<div class="execution">
<!-- 设备 开窗 -->
<input-select-dialog
:modal-obj.sync="resrceDialogObj"
:modal-show.sync="resrceDialogVisible"
:modal-fetch-fun="openResrceList"
@inputDialogSelected="resrceSelected"
></input-select-dialog>
<!-- 工单 开窗 -->
<input-select-dialog
:modal-obj.sync="shopOrderDialogObj"
:modal-show.sync="shopOrderDialogVisible"
:modal-fetch-fun="openShopOrderList"
@inputDialogSelected="shopOrderSelected"
></input-select-dialog>
<!-- 物料 开窗 -->
<input-select-dialog
:modal-obj.sync="itemDialogObj"
:modal-show.sync="itemDialogVisible"
:modal-fetch-fun="openItemList"
@inputDialogSelected="itemSelected"
></input-select-dialog>
<basic-container>
<!-- 搜尋框 -->
<el-form ref="searchForm" :model="searchForm" label-width="120px" label-suffix=":" :inline="true">
<el-row>
<el-col :span="6">
<el-form-item label="设备号" prop="resrce">
<el-input v-model.trim="searchForm.resrce" readonly 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="6">
<el-form-item label="工单号" prop="shopOrder">
<el-input v-model.trim="searchForm.shopOrder" readonly clearable>
<i
slot="suffix"
class="el-input__icon el-icon-copy-document"
@click.stop="showShopOrderDialog"
></i>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="物料" prop="item">
<el-input v-model.trim="searchForm.item" clearable>
<i
slot="suffix"
class="el-input__icon el-icon-copy-document"
@click.stop="showItemDialog"
></i>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="配方设定" prop="optimumFormula" :rules="[{ required: true, message: '配方设定不能为空', trigger: 'change'}]">
<el-select v-model="searchForm.optimumFormula" clearable>
<el-option v-for="item in selectOptimumFormula" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="时间始" prop="dateCreateFrom">
<el-date-picker
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
v-model="searchForm.dateCreateFrom"
type="date"
placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="时间止" prop="dateCreateTo">
<el-date-picker
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
v-model="searchForm.dateCreateTo"
type="date"
placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="产品配方编码" prop="productFormulaCode">
<el-input v-model.trim="searchForm.productFormulaCode" clearable>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-button type="primary" icon="el-icon-search" size="small" @click="search(true)">检索</el-button>
<el-button type="primary" icon="el-icon-document" size="small" @click="doSave">保存</el-button>
<el-button type="primary" icon="el-icon-document" size="small" @click="doExport">导出</el-button>
<el-button icon="el-icon-delete" size="small" @click="searchReset">清空</el-button>
</el-col>
</el-row>
</el-form>
<el-tabs v-model="tabActiveName">
<el-tab-pane label="产品结构化参数" name="tabActiveNameTab">
<el-table ref="productStructureParameterData" :data="productStructureParameterData" tooltip-effect="dark" border style="width: 100%;"
@selection-change="handleSelectionChange"
:row-key="'handle'"
:highlight-current-row="true"
height="250px"
stripe>
<!-- 选择框列 -->
<el-table-column type="selection"></el-table-column>
<el-table-column label="序号" align="center" prop="seq" width="50">
<template v-slot:default="scope">
{{ getSeq(scope.$index) }}
</template>
</el-table-column>
<el-table-column prop="shopOrder" label="工单号" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.shopOrder }}
</div>
</template>
</el-table-column>
<el-table-column prop="resrce" label="设备编码" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.resrce }}
</div>
</template>
</el-table-column>
<el-table-column prop="resrceDesc" label="设备描述" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.resrceDesc }}
</div>
</template>
</el-table-column>
<el-table-column prop="item" label="物料编号" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.item }}
</div>
</template>
</el-table-column>
<el-table-column prop="itemDesc" label="物料描述" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.itemDesc }}
</div>
</template>
</el-table-column>
<el-table-column prop="pdcCode" label="PDC编号" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.pdcCode }}
</div>
</template>
</el-table-column>
<el-table-column prop="productFormulaCode" label="产品配方编码" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.productFormulaCode }}
</div>
</template>
</el-table-column>
<el-table-column prop="productFormulaVersion" label="产品配方版本" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.productFormulaVersion }}
</div>
</template>
</el-table-column>
<el-table-column prop="inspectionLevel" label="等级" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.inspectionLevel }}
</div>
</template>
</el-table-column>
<el-table-column prop="outputMeters" label="产出米数" header-align="center">
<template slot-scope="scope">
<div>
<el-input v-model="scope.row.outputMeters"/>
</div>
</template>
</el-table-column>
<el-table-column prop="optimumFormula" label="是否最优配方" header-align="center">
<template slot-scope="scope">
<div>
{{ getOptimumFormulaLabel(scope.row.optimumFormula) }}
</div>
</template>
</el-table-column>
</el-table>
<div style="width: 100%;display: flex;flex-direction: column;align-items: center;justify-content: center;">
<el-pagination @current-change="handleCurrentChange"
@size-change="handleSizeChange"
:current-page.sync="page.current"
:page-sizes="[10, 20, 50, 100, 200]"
:page-size="page.size"
layout="total, sizes, prev, pager, next, jumper"
:total="page.total">
</el-pagination>
</div>
</el-tab-pane>
</el-tabs>
<el-tabs v-model="tabActiveNameDetail">
<el-tab-pane label="产品结构化参数明细" name="tabActiveNameDetailTab">
<el-table ref="productStructureParameterDetailData" :data="productStructureParameterDetailData" tooltip-effect="dark" border style="width: 100%;"
:row-key="'handle'"
:highlight-current-row="true"
height="250px"
stripe>
<el-table-column label="序号" align="center" prop="seq" width="50">
<template v-slot:default="scope">
{{ getSeq(scope.$index) }}
</template>
</el-table-column>
<el-table-column prop="shopOrder" label="工单号" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.shopOrder }}
</div>
</template>
</el-table-column>
<el-table-column prop="resrce" label="设备编码" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.resrce }}
</div>
</template>
</el-table-column>
<el-table-column prop="resrceDesc" label="设备描述" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.resrceDesc }}
</div>
</template>
</el-table-column>
<el-table-column prop="item" label="物料编号" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.item }}
</div>
</template>
</el-table-column>
<el-table-column prop="itemDesc" label="物料描述" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.itemDesc }}
</div>
</template>
</el-table-column>
<el-table-column prop="pdcCode" label="PDC编号" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.pdcCode }}
</div>
</template>
</el-table-column>
<el-table-column prop="productFormulaCode" label="产品配方编码" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.productFormulaCode }}
</div>
</template>
</el-table-column>
<el-table-column prop="productFormulaVersion" label="产品配方版本" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.productFormulaVersion }}
</div>
</template>
</el-table-column>
<el-table-column prop="parameterCode" label="参数编码" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.parameterCode }}
</div>
</template>
</el-table-column>
<el-table-column prop="parameterName" label="参数名称" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.parameterName }}
</div>
</template>
</el-table-column>
<el-table-column prop="parameterValue" label="参数值" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.parameterValue }}
</div>
</template>
</el-table-column>
<el-table-column prop="unitOfMeasure" label="单位" header-align="center">
<template slot-scope="scope">
<div>
{{ scope.row.unitOfMeasure }}
</div>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
</basic-container>
</div>
</template>
<script>
import {mapGetters} from 'vuex';
import {getStore} from '@/util/store';
import {
doOptimumFormulaSave,
fetchItemPage,
fetchResrcePage,
fetchShopOrderPage,
readZProductStructureParameterDetailList,
readZProductStructureParameterPage
} from "@/api/mes/wip-nalinv/product-structure-parameter";
import {hideLoading, showLoading} from "@/const/loading";
import {
itemDialogObj,
shopOrderDialogObj,
resrceDialogObj
} from "@/views/mes/wip-nalinv/product-structure-parameter/init";
import {fetchItemList as fetchDictList} from "@/api/admin/dict";
export default {
name: 'product-optimum-formula',
data() {
return {
tabActiveName: "tabActiveNameTab",
tabActiveNameDetail: "tabActiveNameDetailTab",
searchForm: {
site: getStore({name: 'tenantId'}),
dateCreateFrom: this.formattedDate(),
dateCreateTo: this.formattedDate()
},
productStructureParameterData: [],
productStructureParameterDetailData: [],
site: getStore({name: 'tenantId'}),
resrceDialogObj: {...resrceDialogObj}, // 设备
openResrceList: null,
resrceDialogVisible: false,
shopOrderDialogObj: {...shopOrderDialogObj}, // 工单
openShopOrderList: null,
shopOrderDialogVisible: false,
itemDialogObj: {...itemDialogObj}, // 物料
openItemList: null,
itemDialogVisible: false,
selectOptimumFormula: [], // 配方设定
selectedRows: [], // 主列表选中行数据列表
page: {
total: 0,
current: 1,
size: 10
},
}
},
created() {
this.searchForm = Object.assign({}, this.searchForm);
this.getDataDictionary("YES_NO", "selectOptimumFormula"); // 配方设定
},
computed: {
//读取权限
...mapGetters(['permissions', 'userInfo']),
permissionList() {
return {
addBtn: false,
delBtn: false,
editBtn: false,
}
},
},
methods: {
getSeq(index) {
// 序号从 1 开始
return index + 1;
},
// 是否最优配方字典处理
getOptimumFormulaLabel(value) {
const optimumFormula = this.selectOptimumFormula.find(item => item.value === value);
return optimumFormula ? optimumFormula.label : '';
},
// 获取当前日期
formattedDate() {
const date = new Date();
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份是从 0 开始的,所以需要加 1
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`; // 格式化为 YYYY-MM-DD
},
// 获取数据字典
getDataDictionary(dictType, list) {
fetchDictList({
current: "1",
size: "1000",
dictType: dictType,
}).then((response) => {
this[list] = response.data.data.records
});
},
// 页面大小改变
handleSizeChange(val) {
this.page.size = val;
this.page.current = 1;
this.search();
},
//页面切换
handleCurrentChange(val) {
this.page.current = val;
this.search();
},
//主列表选中行赋值
handleSelectionChange(selection) {
this.selectedRows = selection;
let productFormulaCodeList = [];
this.selectedRows.forEach(item => {
productFormulaCodeList.push(item.productFormulaCode)
});
// 检索明细列表数据
showLoading();
readZProductStructureParameterDetailList({
site: this.site,
productFormulaCodeList: productFormulaCodeList
}).then((response) => {
hideLoading();
if (response.data.code !== 0) {
this.$message.error(response.data.message);
} else {
this.productStructureParameterDetailData = response.data.data;
}
}).catch(() => {
hideLoading();
});
},
// 检索列表数据
search(flag) {
if (!this.searchForm.dateCreateFrom) {
this.$message.error("时间始不可为空!");
return;
}
if (!this.searchForm.dateCreateTo) {
this.$message.error("时间止不可为空!");
return;
}
if (flag) {
this.page.current = 1;
}
showLoading();
readZProductStructureParameterPage({
...this.searchForm,
current: this.page.current,
size: this.page.size,
}).then((response) => {
hideLoading();
if (response.data.code !== 0) {
this.$message.error(response.data.message);
} else {
this.productStructureParameterData = response.data.data.records;
this.page.total = response.data.data.total;
this.page.current = response.data.data.current;
}
}).catch(() => {
hideLoading();
});
},
// 保存
doSave() {
this.$refs.searchForm.validate((valid) => {
if (valid) {
if (this.selectedRows.length === 0) {
return this.$message.warning("请先勾选需要保存的数据!");
}
this.$confirm(`是否确认保存?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
showLoading();
doOptimumFormulaSave({
optimumFormula: this.searchForm.optimumFormula,
parameterList: this.selectedRows
}).then((response) => {
hideLoading();
if (response.data.code !== 0) {
this.$message.error(response.data.message);
} else {
this.$message.success(`保存成功!`);
this.search(true);
}
}).catch(() => {
hideLoading();
});
}).catch(() => {
hideLoading();
});
}
})
},
// 导出
doExport() {
let me = this;
if (!me.searchForm.dateCreateFrom) {
me.$message.error("时间始不可为空!");
return;
}
if (!me.searchForm.dateCreateTo) {
me.$message.error("时间止不可为空!");
return;
}
me.$confirm(`是否确认导出产品结构化参数最优配方?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.downBlobFile("/iep-app/z-product-structure-parameter/exportProductStructureParameterFormula", me.searchForm, `产品结构化参数最优配方.xlsx`);
})
},
// 清空事件
searchReset() {
this.searchForm = {
site: this.site,
dateCreateFrom: this.formattedDate(),
dateCreateTo: this.formattedDate()
};
this.productStructureParameterData = [];
this.productStructureParameterDetailData = [];
},
// 设备点击开窗
showResrceDialog() {
this.resrceDialogObj.queryParam.site = this.site;
this.openResrceList = fetchResrcePage;
this.resrceDialogVisible = true
},
// 设备选择回填
resrceSelected(row) {
this.searchForm.resrce = row.resrce
this.searchForm.shopOrder = row.shopOrder
this.searchForm.item = row.item
this.searchForm.itemDesc = row.itemDesc
this.searchForm = Object.assign({}, this.searchForm)
},
// 工单点击开窗
showShopOrderDialog() {
if (!this.searchForm.resrce) {
this.$message.error("请先选择设备号!");
return;
}
this.shopOrderDialogObj.queryParam.site = this.site;
this.shopOrderDialogObj.queryParam.resrce = this.searchForm.resrce;
this.openShopOrderList = fetchShopOrderPage;
this.shopOrderDialogVisible = true
},
// 工单选择回填
shopOrderSelected(row) {
this.searchForm.shopOrder = row.shopOrder
this.searchForm.item = row.item
this.searchForm.itemDesc = row.itemDesc
this.searchForm = Object.assign({}, this.searchForm)
},
// 物料点击开窗
showItemDialog() {
this.itemDialogObj.queryParam.site = this.site;
this.openItemList = fetchItemPage;
this.itemDialogVisible = true
},
// 物料选择回填
itemSelected(row) {
this.searchForm.item = row.item
this.searchForm = Object.assign({}, this.searchForm)
},
},
}
</script>
<style lang="scss" scoped>
// 解决input框中添加disabled不可编辑属性后,改变字体颜色样式(主要解决:默认字体颜色为灰色)
::v-deep .el-input.is-disabled .el-input__inner {
color: black;
}
/* 禁用 el-input 时禁用图标和清除按钮 */
.el-input.is-disabled .el-input__icon,
.el-input.is-disabled .el-input__clear {
pointer-events: none;
}
</style>

View File

@ -294,7 +294,8 @@
import {mapGetters} from 'vuex';
import {getStore} from '@/util/store';
import {
doSaveParameter, doSubmitParameter,
doSaveParameter,
doSubmitParameter,
fetchItemPage,
fetchResrcePage,
fetchShopOrderPage,