nrwms_web/src/views/business-data/asnDetail/index.vue

556 lines
19 KiB
Vue
Raw Normal View History

2024-02-18 15:46:31 +08:00
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<!-- 搜索 -->
<!-- <el-input v-model="query.itemCode" clearable placeholder="物料代码" style="width: 140px;" class="filter-item"-->
<!-- @keyup.enter.native="crud.toQuery"/>-->
2024-03-07 09:23:49 +08:00
<el-input v-model="query.relatedBill1" clearable placeholder="入库单号" style="width: 140px;" class="filter-item"
@keyup.enter.native="crud.toQuery"/>
2024-02-18 15:46:31 +08:00
<el-select v-model="query.itemCode" placeholder="物料代码" style="width: 140px;" class="filter-item">
<el-option
@keyup.enter.native="crud.toQuery"
v-for="item in this.itemListData"
:key="item.code"
:label="item.code"
:value="item.code">
<span style="float: left">{{ item.code }}</span>
<span style="float: right; color: #8492a6; font-size: 13px">{{ item.name }}</span>
</el-option>
</el-select>
<el-input v-model="query.itemName" clearable placeholder="物料名称" style="width: 140px;" class="filter-item"
@keyup.enter.native="crud.toQuery"/>
<el-input v-model="query.po" clearable placeholder="MO票" style="width: 140px;" class="filter-item"
@keyup.enter.native="crud.toQuery"/>
<el-select
v-model="query.status"
clearable
size="small"
placeholder="状态"
class="filter-item"
style="width: 100px"
@change="crud.toQuery"
>
<el-option
v-for="item in dict.asn_status"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select>
<date-range-picker v-model="query.createTime" class="date-item" style="width: 100px"/>
<rrOperation :crud="crud"/>
<!--如果想在工具栏加入更多按钮可以使用插槽方式 slot = 'left' or 'right'-->
<crudOperation :permission="permission" :table-key="this.$options.name">
2024-02-18 15:46:31 +08:00
<el-button
slot="right"
v-permission="permission.checkAsn"
class="filter-item"
type="primary"
size="mini"
@click="collectMO = true"
icon="el-icon-document-add"
v-if="false"
>
MO票采集
</el-button>
<el-button
slot="right"
v-permission="permission.checkAsn"
class="filter-item"
size="mini"
type="primary"
icon="el-icon-bottom-right"
:disabled="receivingStatus"
@click="checkAsn(crud.selections)"
v-if="false"
>
</el-button>
<!-- 容器更换 -->
<el-button
slot="right"
v-permission="permission.checkAsn"
class="filter-item"
size="mini"
type="primary"
icon="el-icon-bottom-right"
:disabled="crud.selections.length !== 1 || containerReplacementStatus"
@click="ontainerReplacementOnOff=true"
v-if="false"
>
容器更换
</el-button>
<el-button
slot="right"
class="filter-item"
size="mini"
type="info"
icon="el-icon-s-order"
@click="doAsnTask(crud.selections[0].id)"
:disabled="crud.selections.length !== 1"
v-if="false"
>收货详情
</el-button>
<el-upload
class="upload-demo"
slot='right'
style="float: right;padding-left: 5px"
:headers="headers"
action="/api/asnDetail/import_mo"
:file-list="fileList"
:on-error="handleErr"
:on-success=" (response, file, fileList) => { return handleSuccess(response, file, fileList,crud);}"
:show-file-list="true">
<el-button size="mini" v-if="false" type="success" icon="el-icon-upload2"></el-button>
</el-upload>
</crudOperation>
<AsnTask ref="asnTask"/>
</div>
<!--MO票采集表单组件-->
2024-03-07 09:23:49 +08:00
<!-- <el-dialog title="MO票采集" :visible.sync="collectMO" width="400px">
2024-02-18 15:46:31 +08:00
<el-form ref="form2" :model="form2" :rules="rules" size="small" label-width="80px">
<el-form-item label="MO票" prop="po">
<el-input v-model="form2.po" style="width: 200px;"/>
</el-form-item>
<el-form-item label="容器" prop="stock">
<el-select v-model="form2.stock" @focus="getStock" value-key="id" filterable placeholder="请选择容器"
style="width: 200px;">
<el-option
v-for="item in stocks"
:key="item.id"
:label="item.code"
:value="item"
/>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="collectMO= false"> </el-button>
<el-button type="primary" @click="collectMO2()"> </el-button>
</div>
2024-03-07 09:23:49 +08:00
</el-dialog>-->
2024-02-18 15:46:31 +08:00
<!-- 容器更换 -->
2024-03-07 09:23:49 +08:00
<!-- <el-dialog title="容器更换" :visible.sync="ontainerReplacementOnOff" width="400px">
2024-02-18 15:46:31 +08:00
<el-form ref="form3" :model="form3" :rules="rules" size="small" label-width="80px">
<el-form-item label="原容器" prop="stockName">
<el-input v-model="form3.stockName" style="width: 200px;" readonly="true"/>
</el-form-item>
<el-form-item label="目标容器" prop="newStock" :rules="[{ required: true, message: '目标容器不能为空'}]">
<el-select v-model="form3.newStock" @focus="getStock" value-key="id" filterable placeholder="请选择容器"
style="width: 200px;">
<el-option
v-for="item in stocks"
:key="item.id"
:label="item.code"
:value="item"
/>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="ontainerReplacementOnOff= false"> </el-button>
<el-button type="primary" @click="performContainerChange"> </el-button>
</div>
2024-03-07 09:23:49 +08:00
</el-dialog>-->
2024-02-18 15:46:31 +08:00
<!--表单组件-->
<el-dialog :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0"
2024-03-07 09:23:49 +08:00
:title="crud.status.title" width="500px">
<el-form ref="form" :model="form" :rules="rules" size="small" label-width="100px">
<!-- <el-form-item label="所属订单">
<el-input v-model="form.asn.relatedBill1" style="width: 200px;"/>
</el-form-item>-->
<el-form-item label="所属订单" prop="item">
<el-select v-model="form.asn.relatedBill1" value-key="id" filterable placeholder="请所属订单"
style="width: 200px;" @change="applicantTypes">
2024-02-18 15:46:31 +08:00
<el-option
2024-03-07 09:23:49 +08:00
v-for="item in asnList"
:key="item.id"
:label="item.relatedBill1"
:value="item.relatedBill1"
2024-02-18 15:46:31 +08:00
/>
</el-select>
</el-form-item>
2024-03-07 09:23:49 +08:00
<el-form-item label="物料" prop="item" style="width: 200px">
<el-select v-model="form.item" value-key="id" filterable placeholder="请选择物料"
2024-02-18 15:46:31 +08:00
style="width: 200px;">
<el-option
2024-03-07 09:23:49 +08:00
v-for="item in items"
2024-02-18 15:46:31 +08:00
:key="item.id"
:label="item.code"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item label="订单数量">
<el-input v-model="form.orderQty" style="width: 200px;"/>
</el-form-item>
2024-03-27 18:33:19 +08:00
<el-form-item label="收货数量">
<el-input v-model="form.receivedQty" style="width: 200px;"/>
</el-form-item>
2024-03-07 09:23:49 +08:00
<el-form-item label="成品物料编码">
2024-02-18 15:46:31 +08:00
<el-input v-model="form.propC1" style="width: 200px;"/>
</el-form-item>
2024-03-07 09:23:49 +08:00
<el-form-item label="中标批次名称">
<el-input v-model="form.propC2" style="width: 200px;"/>
</el-form-item>
<el-form-item label="序列号">
<el-input type="textarea" v-model="form.propC3" style="width: 270px;"/>
2024-02-18 15:46:31 +08:00
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="crud.cancelCU"></el-button>
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU"></el-button>
</div>
</el-dialog>
<!--表格渲染-->
<el-table ref="table" height="68vh" v-loading="crud.loading" :data="crud.data" size="small" style="width: 100%;"
2024-03-11 13:46:44 +08:00
@selection-change="this.selectionChangeHandler" @row-click="this.clickRow" border>
2024-03-07 09:23:49 +08:00
<el-table-column prop="asn.relatedBill1" label="入库单号" width="100"/>
<el-table-column prop="asn.billType.name" label="单据类型" width="100"/>
2024-03-07 09:23:49 +08:00
<el-table-column prop="asn.status" label="入库单状态" width="100">
<template slot-scope="scope">
{{ dict.label.asn_status[scope.row.asn.status] }}
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="lineNo" width="50" label="行号">
<template slot-scope="scope">
<div>{{ scope.row.lineNo }}</div>
</template>
</el-table-column>
2024-02-18 15:46:31 +08:00
<el-table-column :show-overflow-tooltip="true" prop="itemCode" label="物料编码">
<template slot-scope="scope">
<div>{{ scope.row.item.code }}</div>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="itemName" label="物料名称">
<template slot-scope="scope">
<div>{{ scope.row.item.name }}</div>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="propC4" label="操作方式">
<template slot-scope="scope">
<div>{{ scope.row.propC4 }}</div>
</template>
</el-table-column>
2024-02-18 15:46:31 +08:00
<el-table-column prop="status" label="状态">
<template slot-scope="scope">
{{ dict.label.asn_status[scope.row.status] }}
</template>
</el-table-column>
<el-table-column prop="orderQty" label="订单数量"/>
<el-table-column prop="receivedQty" label="收货数量"/>
2024-03-07 09:23:49 +08:00
<el-table-column prop="propC1" label="中标批次名称"/>
<el-table-column prop="propC2" label="成品物料编码"/>
<el-table-column prop="propC3" label="序列号" :show-overflow-tooltip="true"/>
2024-02-18 15:46:31 +08:00
<el-table-column prop="createTime" label="创建时间" width="135" sortable/>
2024-03-07 09:23:49 +08:00
<el-table-column v-if="checkPer(['admin','item:edit'])" label="操作" fixed="right" width="200px" align="center">
<template slot-scope="scope">
<udOperation
:data="scope.row"
:permission="permission"
:show-dle="true"
>
</udOperation>
</template>
</el-table-column>
2024-02-18 15:46:31 +08:00
</el-table>
<!--分页组件-->
<div style="float: right;">
<pagination/>
</div>
</div>
</template>
<script>
import crudAsnDetail, {add, updateContainer} from '@/api/asnDetail'
import CRUD, {presenter, header, form, crud} from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation'
import udOperation from '@crud/UD.operation'
import pagination from '@crud/Pagination'
import {getItems, getItemsList} from "@/api/item"
import {queryKyStockList} from "@/api/stock"
2024-03-07 09:23:49 +08:00
import {getAsnList} from "@/api/asn"
2024-02-18 15:46:31 +08:00
import Treeselect from '@riophae/vue-treeselect'
import Search from "@/views/monitor/log/search.vue"
import AsnTask from "@/views/business-data/asnDetail/viewAsnTask"
import DonMessage from "@/utils/message";
import DateRangePicker from "@/components/DateRangePicker/index.vue";
import {getToken} from "@/utils/auth";
const defaultForm = {
id: null,
2024-03-07 09:23:49 +08:00
asn: {relatedBill1:null},
2024-02-18 15:46:31 +08:00
item: null,
stock: null,
lineNo: null,
po: null,
status: 'OPEN',
orderQty: 0,
receivedQty: 0,
moveQty: 0,
putQty: 0,
weight: 0,
volume: 0,
remark: null,
propC1: null,
propC2: null,
propC3: null,
propC4: null,
propC5: null,
propC6: null,
propD1: null,
propD2: null,
deptId: null,
sourceName: null,
sourceId: null,
createBy: null,
updateBy: null,
createTime: null,
updateTime: null
}
export default {
name: 'AsnDetail',
components: {DateRangePicker, AsnTask, Search, Treeselect, pagination, crudOperation, rrOperation, udOperation},
mixins: [presenter(), header(), form(defaultForm), crud()],
dicts: ['asn_status'],
cruds() {
return CRUD({
2024-03-07 09:23:49 +08:00
title: '收货明细', url: 'api/asnDetail', idField: 'id', sort: 'id,desc', crudMethod: {...crudAsnDetail},
2024-02-18 15:46:31 +08:00
optShow: {
add: true,
edit: false,
del: false,
reset: true,
download: true
2024-03-07 09:23:49 +08:00
},
queryOnPresenterCreated: false
2024-02-18 15:46:31 +08:00
})
},
data() {
return {
headers: {'Authorization': getToken()},
fileList:[],
2024-03-07 09:23:49 +08:00
asnList: [],
2024-02-18 15:46:31 +08:00
items: [],
stocks: [],
form2: {po: null, stock: null},
form3: {stockName: null, newStock: null, asnDetailUpdate: null},
permission: {
add: ['admin', 'asnDetail:add'],
edit: ['admin', 'asnDetail:edit'],
del: ['admin', 'asnDetail:del'],
checkAsn: ['admin', 'asnDetail:checkAsn']
},
rules: {
item: [
{required: true, message: '物料不能为空', trigger: 'blur'}
],
stock: [
{required: true, message: '容器不能为空', trigger: 'blur'}
],
po: [
{required: true, message: 'MO票不能为空', trigger: 'blur'}
]
},
queryTypeOptions: [
{key: 'itemCode', display_name: '物料代码'},
{key: 'itemName', display_name: '物料名称'},
{key: 'po', display_name: 'MO票'},
{key: 'status', display_name: '状态'}
],
collectMO: false,
// 收货按钮的控制
receivingStatus: true,
//容器更换按钮的控制
containerReplacementStatus: true,
ontainerReplacementOnOff: false,
itemListData: []
}
},
mounted() {
//初始化数据
2024-03-07 09:23:49 +08:00
this.itemDataGet()
this.getItem()
this.jumpAsnDetail()
this.getAsns()
2024-02-18 15:46:31 +08:00
},
methods: {
2024-03-07 09:23:49 +08:00
applicantTypes(value){
this.asnList.forEach(item => {
if(item.id===item.id){
console.log("item:"+item)
this.form.asn.value = item
}
})
},
jumpAsnDetail() {
this.query.relatedBill1 = this.$route.query.relatedBill1
defaultForm.asn.relatedBill1=this.query.relatedBill1
this.crud.toQuery()
},
2024-02-18 15:46:31 +08:00
handleSuccess(response, file, fileList, crud) {
let myError = response.toString();//转字符串
DonMessage.success("" + response['message'])
crud.toQuery()
},
handleErr(err, file, fileList) {
let myError = err.toString();//转字符串
myError = myError.replace("Error: ", "") // 去掉前面的" Error: "
myError = JSON.parse(myError);//转对象
DonMessage.error("" + myError['message'])
},
// 钩子在获取表格数据之前执行false 则代表不获取数据
[CRUD.HOOK.beforeRefresh]() {
return true
},
getItem() {
getItems({}).then(res => {
this.items = res.content.map(function (obj) {
if (obj.hasChildren) {
obj.children = null
}
return obj
})
})
},
2024-03-07 09:23:49 +08:00
getAsns() {
getAsnList({}).then(res => {
this.asnList = res.map(function (obj) {
if (obj.hasChildren) {
obj.children = null
}
return obj
})
})
},
2024-02-18 15:46:31 +08:00
getStock() {
queryKyStockList({}).then(res => {
this.stocks = res.map(function (obj) {
if (obj.hasChildren) {
obj.children = null
}
return obj
})
})
},
indexMethod(index) {
return index * 1 + 1;
},
checkAsn(datas) {
this.$confirm(`选中的${datas.length}条数据收货确认?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const ids = []
for (let i = 0; i < datas.length; i++) {
ids.push(datas[i].id)
}
crudAsnDetail.doCheckAsn(ids).then(res => {
DonMessage.success('收货成功!');
this.crud.toQuery()
this.getStock()
})
}).catch(() => {
DonMessage.success('收货失败!');
})
},
collectMO2() {
crudAsnDetail.collectMOCreate(this.form2).then(res => {
this.collectMO = false
this.crud.toQuery()
this.getStock()
this.resetForm()
}).catch(() => {
})
},
// 显示日志
doAsnTask(id) {
this.$refs.asnTask.dialog = true
this.$refs.asnTask.doInit(id)
},
//重置表单
resetForm() {
this.$refs["form2"].resetFields();
this.$data.form2 = JSON.parse(JSON.stringify(this.$options.data().form2))
},
WuLiaoClick(pack_number) {
this.form.orderQty = pack_number;
},
clickRow(row) {
this.crud.getTable().clearSelection()
this.crud.getTable().toggleRowSelection(row, true)
this.selectSingleClick_()
},
selectionChangeHandler(val) {
this.crud.selections = val
this.selectSingleClick_()
},
//收货状态的判断 => 当用户手动勾选全选 Checkbox 时触发的事件
selectSingleClick_() {
if (this.crud.selections.length > 0) {
this.receivingStatus = false;
} else {
this.receivingStatus = true;
}
this.containerReplacementStatus = true;
for (const valElement of this.crud.selections) {
if (valElement.status === 'RECEIVED') {
this.receivingStatus = true;
}
if (valElement.status === 'OPEN') {
this.containerReplacementStatus = false;
this.form3.stockName = valElement.stock.name;
this.form3.asnDetailUpdate = valElement;
}
}
},
//容器更换按钮触发
performContainerChange() {
this.$refs['form3'].validate((valid) => {
if (valid) {
let data_ = {data: null, id: null};
data_.id = this.form3.asnDetailUpdate.stock.id;
this.form3.asnDetailUpdate.stock = this.form3.newStock;
data_.data = this.form3.asnDetailUpdate;
updateContainer(data_).then(res => {
this.ontainerReplacementOnOff = false;
this.crud.toQuery()
this.getStock()
DonMessage.success('容器更换成功');
}).catch(() => {
DonMessage.success('容器更换失败!');
})
} else {
return false;
}
});
},
//物料数据
itemDataGet() {
getItemsList().then(res => {
this.itemListData = res;
}).catch(e => {
this.$message({
showClose: true,
message: '物料加载失败',
type: 'error'
});
})
}
}
}
</script>
<style scoped>
</style>