feat(生产管理):进站
This commit is contained in:
parent
e8e70cc26f
commit
8143c9ba95
@ -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'
|
||||
})
|
||||
}
|
||||
|
||||
@ -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
|
||||
})
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
521
src/views/mes/wip-nalinv/lot-start/index.vue
Normal file
521
src/views/mes/wip-nalinv/lot-start/index.vue
Normal 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>
|
||||
Loading…
Reference in New Issue
Block a user