feat(生产管理):进站

This commit is contained in:
syngna_qiao 2024-11-13 20:36:11 +08:00
parent e8e70cc26f
commit 8143c9ba95
4 changed files with 563 additions and 3 deletions

View File

@ -38,3 +38,10 @@ export function delObj(id) {
method: 'delete'
})
}
export function getCurrentShift(id) {
return request({
url: iep('/user-work-shift/current-shift'),
method: 'get'
})
}

View File

@ -27,3 +27,35 @@ export function getParamsInfoForPackOut(query) {
params: query,
})
}
export function fetchShopOrderList(query) {
return request({
url: iep('/wip/nlv-lot-start/fetch-shop-order-list'),
method: 'get',
params: query,
})
}
export function firstOpReleaseItemList(data) {
return request({
url: iep('/wip/nlv-lot-start/first-op-release-item-list'),
method: 'post',
data: data,
})
}
export function selectInQueueLotList(query) {
return request({
url: iep('/wip/nlv-lot-start/in-queue-lot-list'),
method: 'get',
params: query,
})
}
export function start(obj) {
return request({
url: iep(`/wip/nlv-lot-start/start`),
method: 'post',
data: obj
})
}

View File

@ -417,12 +417,12 @@
.el-tree.tree-option{
span::after{
content: "";
}
}
}
.basic-containe-custom {
.basic-container-custom {
background-color: #ffffff !important;
padding: 8px 10px;
border-radius: 12px;
@ -458,4 +458,4 @@
.login-weaper {
margin-right: auto !important;
}
}
}

View File

@ -0,0 +1,521 @@
<template>
<div class="basic-container-custom">
<input-select-dialog
:modal-obj="operationDialogObj"
:modal-fetch-fun="operationDialogFetchFun"
:modal-show.sync="operationDialogVisible"
@inputDialogSelected="operationSelected"
>
</input-select-dialog>
<input-select-dialog
:modal-obj="resourceDialogObj"
:modal-fetch-fun="resourceDialogFetchFun"
:modal-show.sync="resourceDialogVisible"
@inputDialogSelected="resourceSelected"
>
</input-select-dialog>
<input-multiple-select-checkbox-dialog
:modal-obj="shopOrderDialogObj"
:modal-fetch-fun="shopOrderDialogFetchFun"
:modal-show.sync="shopOrderDialogVisible"
@inputDialogSelected="shopOrderSelected"
>
</input-multiple-select-checkbox-dialog>
<el-dialog
v-el-drag-dialog
:close-on-click-modal="false"
:close-on-press-escape="false"
:fullscreen="false"
:visible.sync="releasedLotDialogVisible"
title="条码列表"
@close="releasedLotDialogVisible = false"
center
v-if="releasedLotDialogVisible"
>
<el-table ref="lotListTable" :data="shopOrderReleaseItemInfoList" height="100%" border>
<el-table-column
type="selection"
width="40"></el-table-column>
<el-table-column label="序号" align="center" prop="seq" width="70">
<template v-slot:default="scope">
{{ getSeq(scope.$index) }}
</template>
</el-table-column>
<el-table-column label="条码号" align="center" prop="lotNo"/>
<el-table-column label="生产订单号" align="center" prop="shopOrder"/>
<el-table-column label="物料编号" align="center" prop="item"/>
<el-table-column label="物料描述" align="center" prop="itemDesc"/>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button type="default" size="small" @click="releasedLotDialogVisible = false">{{ $t('crud.closeBtn') }} </el-button>
</span>
</el-dialog>
<div class="flex-content">
<el-form :inline="true" ref="form" :rules="rules" :model="formObj" label-width="120px">
<el-row>
<el-form-item label="设备编码:" prop="resrce">
<el-input ref="resourceInput" v-model="formObj.resrce" @change="resourceChange">
<i slot="suffix" class="el-input__icon el-icon-copy-document" @click.stop="showResourceDialog"></i>
</el-input>
</el-form-item>
<el-form-item label="工序:" prop="operation">
<el-input ref="operationInput" v-model="formObj.operation" @change="operationChange">
<i slot="suffix" class="el-input__icon el-icon-copy-document" @click.stop="showOperationDialog"></i>
</el-input>
</el-form-item>
<el-form-item label="生产订单号:" prop="shopOrder">
<el-input ref="shopOrderInput" v-model="formObj.shopOrder" @change="shopOrderChange">
<i slot="suffix" class="el-input__icon el-icon-copy-document" @click.stop="showShopOrderDialog"></i>
</el-input>
</el-form-item>
</el-row>
<el-row>
<!--<el-form-item label="生产订单数量:" prop="shopOrderQty">
<el-input v-model="formObj.shopOrderQty" :disabled="true"></el-input>
</el-form-item>
<el-form-item label="生产订单剩余数量:" prop="shopOrderRemainQty">
<el-input v-model="formObj.shopOrderRemainQty" :disabled="true"></el-input>
</el-form-item>-->
<el-form-item label="日期:" prop="startDate">
<el-input v-model="formObj.startDate" :disabled="true"></el-input>
</el-form-item>
<el-form-item label="班次:" prop="shiftDesc">
<el-input v-model="formObj.shiftDesc" :disabled="true"></el-input>
</el-form-item>
</el-row>
<hr class="el-hr"/>
<el-form-item label="条码号:" prop="lotNo" v-if="!firstOp && !canAutoRelease">
<el-input ref="lotNoInput" v-model="formObj.lotNo" @keydown.enter.native.prevent="lotNoChange">
</el-input>
</el-form-item>
</el-form>
<div class="button-center">
<el-button type="primary" @click="doLotStart()">进站</el-button>
<el-button type="primary" @click="doSearch()">搜索</el-button>
<el-button type="primary" @click="doClear()">清空</el-button>
</div>
<hr class="el-hr"/>
<div class="flex-auto">
<el-table ref="lotListTable" :data="lotList" height="100%" @selection-change="handleLotListSelectionChange" border>
<el-table-column
type="selection"
width="40"></el-table-column>
<el-table-column label="序号" align="center" prop="seq" width="70">
<template v-slot:default="scope">
{{ getSeq(scope.$index) }}
</template>
</el-table-column>
<el-table-column v-if="!firstOp" label="条码号" align="center" prop="lotNo"/>
<el-table-column label="生产订单号" align="center" prop="shopOrder"/>
<el-table-column label="物料编号" align="center" prop="item"/>
<el-table-column label="物料描述" align="center" prop="itemDesc"/>
<el-table-column v-if="!firstOp" label="质检状态" align="center" prop="inspectionLevel"/>
<el-table-column v-if="!firstOp" align="center" prop="qty">
<template slot="header" slot-scope="scope">
<span><span style="color: red">*</span>产出米数</span>
</template>
</el-table-column>
<el-table-column v-if="!firstOp" align="center" prop="weightQty">
<template slot="header" slot-scope="scope">
<span><span style="color: red">*</span>产出重量</span>
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
</template>
<script>
import {showLoading, hideLoading} from '@/const/loading';
import {mapGetters} from 'vuex';
import {resourceDialogObj, operationDialogObj} from '@/views/mes/pod/init';
import {isBlank} from '@/util/string';
import {findResourceList as fetchResourceList} from '@/api/mes/pms/resrce';
import {findOperationList as fetchOperationList} from '@/api/mes/prd/operation';
import {fetchShopOrderList, firstOpReleaseItemList, selectInQueueLotList, start} from '@/api/mes/wip/start';
import {readCustomData} from '@/api/mes/common/custom-fields';
import {dateFormatCustom} from "@/util/date";
import {getCurrentShift} from "@/api/mes/prd/work-group/user-work-shift/user-work-shift";
import { getByActivityOption } from '@/api/admin/activity-option';
import {getStore} from "@/util/store";
import {common} from "@/views/mes/wip/operation/minix";
export default {
name: 'lot-start',
mixins: [common],
components: {},
props: {},
data() {
return {
site: getStore({name: 'tenantId'}),
operationDialogVisible: false,
resourceDialogVisible: false,
shopOrderDialogVisible: false,
operationDialogFetchFun: fetchOperationList,
resourceDialogFetchFun: fetchResourceList,
shopOrderDialogFetchFun: fetchShopOrderList,
operationDialogObj,
resourceDialogObj: {
condition: 'searchText',
tableColumn: [
{ prop: 'resrce', label: 'mes.pms.resource', width: '200' },
{ prop: 'description', label: 'mes.description' },
],
title: 'mes.pms.resource',
},
shopOrderDialogObj: {
condition: 'searchText',
tableColumn: [
{ prop: 'shopOrder', label: '生产订单' },
{ prop: 'plannedItem', label: '物料编码' },
{ prop: 'plannedItemDescription', label: '物料描述' },
{ prop: 'qty', label: '订单数量' }
],
title: '生产订单',
},
lotList: [],
formObj: {},
initData: {
resrce: '',
operation: '',
shopOrder: '',
shopOrderQty: 0,
shopOrderRemainQty: 0,
startDate: dateFormatCustom(new Date(), 'yyyy-MM-dd hh:mm:ss'),
shift: '',
shiftDesc: '',
lotNo: ''
},
autoReleasableLot: '',
firstOp: false,
canAutoRelease: true,
shopOrderList: [],
releaseList: [],
shopOrderReleaseItemInfoList: [],
releasedLotDialogVisible: false,
rules: {
resrce: [
{required: true, message: this.$t('mes.pod.resourceMustBeFilled'), trigger: 'change'}
],
operation: [
{required: true, message: this.$t('mes.pod.processMustBeFilled'), trigger: 'change'}
],
shopOrder: [
{required: this.firstOp && this.canAutoRelease, message: '生产订单不能为空', trigger: 'change'}
],
lotNo: [
{required: true, message: '条码号不能为空', trigger: 'change'}
]
}
}
},
watch: {
'formObj.shopOrder': {
handler(newVal) {
this.updateShopOrderList(newVal);
},
immediate: true
}
},
created() {
this.handleInitData();
},
computed: {
...mapGetters(['permissions']),
permissionList() {
return {};
},
},
mounted: function () {
},
beforeRouteEnter(to, from, next) {
next(vm => {
try {
let me = vm;
me.handleInitData();
} catch (e) {
}
});
},
methods: {
handleInitData() {
let me = this;
me.urlParam = me.$route.query;
let operation = me.urlParam.operation;
let resrce = me.urlParam.resrce;
let activityId = me.urlParam.ACTIVITY_ID;
me.formObj = Object.assign({}, me.initData);
me.formObj.operation = operation;
me.formObj.resrce = resrce;
me.getActivityOption(activityId);
me.getCurrentShift();
},
updateShopOrderList(shopOrder) {
if (shopOrder) {
this.shopOrderList = shopOrder.split(';').map(item => item.trim());
} else {
this.shopOrderList = [];
}
},
getSeq(index) {
// 序号从 1 开始
return index + 1;
},
getActivityOption(activityId) {
let me = this;
if (activityId) {
showLoading()
getByActivityOption(activityId, 'AUTO_RELEASABLE_LOT')
.then((response) => {
hideLoading()
if (response.data.code !== 0) {
return me.$message.error(response.data.msg)
}
me.autoReleasableLot = response.data.data.optionValue
})
.catch((e) => {
hideLoading()
})
}
},
getCurrentShift() {
let me = this;
getCurrentShift()
.then(response => {
me.formObj.shift = response.data.data.userWorkShift;
me.formObj.shiftDesc = response.data.data.description;
})
},
//显示操作弹窗框
showOperationDialog() {
let me = this;
this.operationDialogVisible = true;
},
//显示设备弹窗框
showResourceDialog() {
let me = this;
me.resourceDialogObj.queryParam = {
workCenter: '',
operation: me.formObj.operation
};
this.resourceDialogVisible = true;
},
validateResourceOperation() {
if(isBlank(this.formObj.resrce)) {
this.$message.error('请先选择设备');
return false;
}
if(isBlank(this.formObj.operation)) {
this.$message.error('请先选择工序');
return false;
}
return true;
},
showShopOrderDialog() {
if(!this.validateResourceOperation()) {
return;
}
this.shopOrderDialogObj.queryParam = {
resrce: this.formObj.resrce,
operation: this.formObj.operation
};
this.shopOrderDialogVisible = true;
},
resourceSelected(row) {
let me = this;
me.formObj.resrce = row.resrce;
me.resourceChange();
},
operationSelected(row) {
let me = this;
me.formObj.operation = row.operation;
me.operationChange();
},
shopOrderSelected(row) {
let me = this;
// me.formObj.shopOrder = row.shopOrder;
let shopOrderStr = '';
for (let i = 0; i < row.length; i++) {
let shopOrder = row[i].shopOrder;
if (isBlank(shopOrderStr)) {
shopOrderStr = shopOrder;
} else {
shopOrderStr = shopOrderStr + ';' + shopOrder;
}
}
me.formObj.shopOrder = shopOrderStr;
this.updateShopOrderList(shopOrderStr);
me.shopOrderChange();
},
resourceChange() {
this.changeFocus('resource');
this.getCurrentShift();
// this.doRetrieve();
},
operationChange() {
this.changeFocus('operation');
this.canAutoRelease = this.autoReleasableLot && !this.autoReleasableLot.split(";").indexOf(this.formObj.operation);
this.getCurrentShift();
this.getOperationCustomData();
},
shopOrderChange() {
this.changeFocus('shopOrder');
this.getCurrentShift();
this.doRetrieve();
},
lotNoChange() {
let me = this;
me.getCurrentShift();
me.doRetrieve();
},
changeFocus(currentField) {
},
doSearch() {
this.doRetrieve(true);
},
doRetrieve(validate) {
let me = this;
let params;
me.lotList = [];
if(me.firstOp && me.canAutoRelease) {
if(me.shopOrderList && this.shopOrderList.length > 0) {
params = me.shopOrderList;
showLoading();
firstOpReleaseItemList(params)
.then(response => {
hideLoading();
me.lotList = response.data.data;
})
.catch(() => {
hideLoading();
});
} else {
if(validate) {
this.$message.error('请先选择工单');
}
}
} else {
if(isBlank(me.formObj.operation)) {
return this.$message.error('请先选择工序');
}
params = {operation: this.formObj.operation, lotNo: this.formObj.lotNo}
showLoading();
selectInQueueLotList(params)
.then(response => {
hideLoading();
me.lotList = response.data.data;
if(!isBlank(me.formObj.lotNo)) {
me.formObj.shopOrder = me.lotList[0].shopOrder;
} else {
me.formObj.shopOrder = '';
}
})
.catch(() => {
hideLoading();
});
}
},
// 获取工序自定义字段
getOperationCustomData() {
// 查詢參數
let operation = this.formObj.operation;
if(isBlank(operation)) {
return;
}
let searchParam = {
objectAlias: 'OPERATION',
ref: `OperationBO:${this.site},${operation},#`
};
showLoading();
readCustomData(searchParam).then(res => {
hideLoading();
if (res.data.code !== 0) {
return this.$message.error(res.data.msg);
}
const data = res.data.data;
if (data) {
const fieldMap = data.reduce((acc, cur) => {
acc[cur.fieldName] = cur;
return acc;
}, {});
this.firstOp = fieldMap['FIRST_OP']?.fieldValue === 'F';
this.doRetrieve();
}
}).catch(err => {
hideLoading();
});
},
handleLotListSelectionChange(selection) {
this.releaseList = selection;
},
doLotStart() {
let me = this;
if(!this.validateResourceOperation()) {
return;
}
let needRelease = me.firstOp && me.canAutoRelease;
this.checkIn(needRelease);
},
// 進站
checkIn(needRelease) {
let params = {
lotNo: this.formObj.lotNo,
operation: this.formObj.operation,
resource: this.formObj.resrce,
note: ''
};
if(needRelease) {
if(!this.releaseList || this.releaseList.length === 0) {
return this.$message.error('请选择要过站的物料数据');
}
params.shopOrderReleaseItemInfoList = this.releaseList;
}
showLoading();
start(params).then(res => {
hideLoading();
if (res.data.code !== 0) {
return this.$message.error(res.data.msg);
}
this.shopOrderReleaseItemInfoList = res.data.data.shopOrderReleaseItemInfoList;
if(needRelease) {
this.releasedLotDialogVisible = true;
}
this.formObj.shopOrder = '';
this.formObj.lotNo = '';
this.shopOrderList = [];
this.lotList = [];
this.$message.success('进站成功');
}).catch(err => {
hideLoading();
});
},
doClear() {
let me = this;
me.formObj = Object.assign({}, me.initData);
me.shopOrderList = [];
me.lotList = [];
}
}
};
</script>
<style scoped>
.button-center {
text-align: center;
}
</style>