出库-替换分配库存

main
bbl\baobl 2024-03-27 18:33:19 +08:00
parent 07d443c976
commit 91955c0961
10 changed files with 227 additions and 41 deletions

View File

@ -30,6 +30,12 @@ export function allocate(ids) {
data: ids data: ids
}) })
} }
export function getPickList() {
return request({
url: 'api/pick/getPickList',
method: 'post'
})
}
export function cancelAllocate(ids) { export function cancelAllocate(ids) {
return request({ return request({
@ -38,4 +44,4 @@ export function cancelAllocate(ids) {
data: ids data: ids
}) })
} }
export default { add, edit, del, allocate , cancelAllocate } export default { add, edit, del, allocate, getPickList, cancelAllocate }

View File

@ -56,4 +56,11 @@ export function pickBarBack(pickDetailId) {
}) })
} }
export default { add, edit, del,allocate,cancelAllocate,picking,pickBarBack } export function getPickDetail() {
return request({
url: 'api/pickDetail/getPickDetail',
method: 'post'
})
}
export default { add, edit, del,allocate,cancelAllocate,picking,pickBarBack,getPickDetail }

View File

@ -38,6 +38,16 @@ export function devanRfid(rfid, type) {
} }
}) })
} }
export function replaceInv(taskId, invId) {
return request({
url: 'api/task/replaceInv',
method: 'post',
data: {
'taskId': taskId,
'invId': invId
}
})
}
export function manualReceiving(data) { export function manualReceiving(data) {
return request({ return request({
url: 'api/task/manualReceiving', url: 'api/task/manualReceiving',
@ -52,5 +62,12 @@ export function queryPickTask(id) {
method: 'get' method: 'get'
}) })
} }
export function picking(datas) {
return request({
url: 'api/task/picking',
method: 'post',
data: datas
})
}
export default { add, edit, del, getTaskInfo, queryPickTask, manualReceiving, devanRfid } export default { add, edit, del, getTaskInfo, queryPickTask, manualReceiving, picking, devanRfid, replaceInv }

View File

@ -185,6 +185,9 @@
<el-form-item label="订单数量"> <el-form-item label="订单数量">
<el-input v-model="form.orderQty" style="width: 200px;"/> <el-input v-model="form.orderQty" style="width: 200px;"/>
</el-form-item> </el-form-item>
<el-form-item label="收货数量">
<el-input v-model="form.receivedQty" style="width: 200px;"/>
</el-form-item>
<el-form-item label="成品物料编码"> <el-form-item label="成品物料编码">
<el-input v-model="form.propC1" style="width: 200px;"/> <el-input v-model="form.propC1" style="width: 200px;"/>
</el-form-item> </el-form-item>

View File

@ -271,6 +271,7 @@ export default {
crudTask.manualReceiving(this.fromManualReceiving).then(res => { crudTask.manualReceiving(this.fromManualReceiving).then(res => {
this.crud.notify(res.message, res.status) this.crud.notify(res.message, res.status)
this.crud.toQuery() this.crud.toQuery()
this.fromManualReceiving={}
}) })
} }
} }

View File

@ -63,6 +63,10 @@
class="filter-item" class="filter-item"
@keyup.enter.native="crud.toQuery" @keyup.enter.native="crud.toQuery"
/> />
<el-input
v-show="false"
v-model="query.itemId"
/>
<rrOperation :crud="crud" /> <rrOperation :crud="crud" />
<el-button class="filter-item" size="mini" type="warning" icon="el-icon-refresh-left" @click="resetQuery"> <el-button class="filter-item" size="mini" type="warning" icon="el-icon-refresh-left" @click="resetQuery">
@ -81,6 +85,18 @@
> >
拆托 拆托
</el-button> </el-button>
<el-button
v-if="ButReplaceInvFlag"
slot="right"
class="filter-item"
type="success"
icon="el-icon-edit"
size="mini"
:disabled="crud.selections.length !== 1 || this.crud.selections[0].orderQty<=this.crud.selections[0].allocatedQty"
v-on:click="replaceInv()"
>
替换分配库存
</el-button>
</crudOperation> </crudOperation>
<!--表单组件--> <!--表单组件-->
<el-dialog <el-dialog
@ -262,11 +278,12 @@ import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation' import crudOperation from '@crud/CRUD.operation'
import udOperation from '@crud/UD.operation' import udOperation from '@crud/UD.operation'
import pagination from '@crud/Pagination' import pagination from '@crud/Pagination'
import {queryPickTask} from "@/api/task";
const defaultForm = { const defaultForm = {
id: null, id: null,
billCode: null, billCode: null,
itemKey: null, itemKey: { item: { id:null } },
point: null, point: null,
stock: null, stock: null,
bigStockId: null, bigStockId: null,
@ -311,6 +328,8 @@ export default {
}, },
data() { data() {
return { return {
//
ButReplaceInvFlag: false,
points: [], points: [],
stocks: [], stocks: [],
items: [], items: [],
@ -386,6 +405,17 @@ export default {
this.crud.toQuery() this.crud.toQuery()
}) })
}, },
//
replaceInv:function () {
this.$emit('replaceTaskInv',this.crud.selections[0].id)
},
//
queryInventory(itemId) {
this.ButReplaceInvFlag=true;
this.query.queuedQty=0;
this.query.itemId=itemId;
this.crud.toQuery()
},
deleteDataM(id) { // deleteDataM(id) { //
const ids = [] const ids = []
ids.push(id) ids.push(id)

View File

@ -56,21 +56,14 @@
height="70vh" height="70vh"
> >
<el-table-column type="selection" width="55"/> <el-table-column type="selection" width="55"/>
<el-table-column :show-overflow-tooltip="true" prop="itemCode" label="物料编码"> <el-table-column prop="itemCode" label="物料编码"/>
<template slot-scope="scope"> <el-table-column prop="itemName" label="物料名称"/>
<div>{{ scope.row.itemKey.item.code }}</div> <el-table-column prop="propC1" label="批次号"/>
</template> <el-table-column prop="propC2" label="字符"/>
</el-table-column> <el-table-column prop="propC3" label="系统单号"/>
<el-table-column :show-overflow-tooltip="true" prop="itemName" label="物料名称"> <el-table-column prop="propC4" label="厂家供货码"/>
<template slot-scope="scope"> <el-table-column prop="propC5" label="供货数量"/>
<div>{{ scope.row.itemKey.item.name }}</div> <el-table-column prop="propC6" label="流水号"/>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="propC1" label="批次号">
<template slot-scope="scope">
<div>{{ scope.row.itemKey.propC1 }}</div>
</template>
</el-table-column>
<el-table-column prop="logType" label="操作类型"> <el-table-column prop="logType" label="操作类型">
<template slot-scope="scope"> <template slot-scope="scope">
{{ dict.label.inv_log_type[scope.row.logType] }} {{ dict.label.inv_log_type[scope.row.logType] }}

View File

@ -4,6 +4,17 @@
<div class="head-container"> <div class="head-container">
<!-- 查询操作--> <!-- 查询操作-->
<el-form ref="form" :inline="true" :model="form" label-width="70px"> <el-form ref="form" :inline="true" :model="form" label-width="70px">
<el-form-item label="所属订单" prop="relatedBill1">
<el-select v-model="form.pick.relatedBill1" value-key="id" filterable placeholder="请所属订单"
style="width: 200px;">
<el-option
v-for="item in pickList"
:key="item.id"
:label="item.relatedBill1"
:value="item.relatedBill1"
/>
</el-select>
</el-form-item>
<el-form-item label="物料编码"> <el-form-item label="物料编码">
<!-- <el-input v-model="query.itemCode" clearable placeholder="请输入物料编码" style="width: 140px;"--> <!-- <el-input v-model="query.itemCode" clearable placeholder="请输入物料编码" style="width: 140px;"-->
<!-- class="filter-item"--> <!-- class="filter-item"-->
@ -94,7 +105,7 @@
slot="right" slot="right"
class="filter-item" class="filter-item"
type="danger" type="danger"
icon="el-icon-edit" icon="el-icon-document-add"
size="mini" size="mini"
:loading="crud.delAllLoading" :loading="crud.delAllLoading"
:disabled="crud.selections.length !== 1 || this.crud.selections[0].allocatedQty<=this.crud.selections[0].pickedQty" :disabled="crud.selections.length !== 1 || this.crud.selections[0].allocatedQty<=this.crud.selections[0].pickedQty"
@ -193,6 +204,17 @@
width="580px" width="580px"
> >
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="120px"> <el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="120px">
<el-form-item label="所属订单" prop="pick">
<el-select v-model="form.pick" value-key="id" filterable placeholder="请所属订单"
style="width: 200px;">
<el-option
v-for="item in pickList"
:key="item.id"
:label="item.relatedBill1"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item label="物料" prop="item"> <el-form-item label="物料" prop="item">
<el-select <el-select
v-model="form.item" v-model="form.item"
@ -262,6 +284,7 @@
<script> <script>
import crudPickDetail from '@/api/pickDetail' import crudPickDetail from '@/api/pickDetail'
import crudPick, { getPickList } from '@/api/pick'
import CRUD, { presenter, header, form, crud } from '@crud/crud' import CRUD, { presenter, header, form, crud } from '@crud/crud'
import rrOperation from '@crud/RR.operation' import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation' import crudOperation from '@crud/CRUD.operation'
@ -271,10 +294,11 @@ import { getItems, getItemsList } from '@/api/item'
import PickTask from '@/views/business-data/pickDetail/pickTicketTask.vue' import PickTask from '@/views/business-data/pickDetail/pickTicketTask.vue'
import DateRangePicker from '@/components/DateRangePicker/index.vue' import DateRangePicker from '@/components/DateRangePicker/index.vue'
import DonMessage from "@/utils/message"; import DonMessage from "@/utils/message";
import {getAsnList} from "@/api/asn";
const defaultForm = { const defaultForm = {
id: null, id: null,
pick: null, pick: { relatedBill1: null },
item: null, item: null,
lineNo: null, lineNo: null,
po: null, po: null,
@ -327,6 +351,7 @@ export default {
return { return {
show_jh: true, show_jh: true,
show_cancelfp: true, show_cancelfp: true,
pickList: [],
radio3: '全部', radio3: '全部',
items: [], items: [],
permission: { permission: {
@ -338,6 +363,9 @@ export default {
rules: { rules: {
item: [ item: [
{ required: true, message: '物料必填', trigger: 'blur' } { required: true, message: '物料必填', trigger: 'blur' }
],
pick: [
{ required: true, message: '所属出库单必填', trigger: 'blur' }
] ]
}, },
queryTypeOptions: [ queryTypeOptions: [
@ -349,16 +377,28 @@ export default {
itemListData: [] itemListData: []
} }
}, },
pick: { relatedBill1: null },
mounted() { mounted() {
// //
this.getItem() this.getItem()
this.itemDataGet() this.itemDataGet()
this.getPicks()
}, },
methods: { methods: {
// false // false
[CRUD.HOOK.beforeRefresh]() { [CRUD.HOOK.beforeRefresh]() {
return true return true
}, },
getPicks() {
crudPick.getPickList({}).then(res => {
this.pickList = res.map(function (obj) {
if (obj.hasChildren) {
obj.children = null
}
return obj
})
})
},
getItem() { getItem() {
getItems({}).then(res => { getItems({}).then(res => {
this.items = res.content.map(function(obj) { this.items = res.content.map(function(obj) {

View File

@ -33,9 +33,7 @@
</el-select> </el-select>
<date-range-picker v-model="query.createTime" class="date-item" style="width: 100px" /> <date-range-picker v-model="query.createTime" class="date-item" style="width: 100px" />
<label class="el-form-item-label">原点位</label>
<el-input v-model="query.srcPointCode" clearable placeholder="原点位" style="width: 185px;" class="filter-item" @keyup.enter.native="crud.toQuery" /> <el-input v-model="query.srcPointCode" clearable placeholder="原点位" style="width: 185px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
<label class="el-form-item-label">目标点位</label>
<el-input v-model="query.dstPointCode" clearable placeholder="目标点位" style="width: 185px;" class="filter-item" @keyup.enter.native="crud.toQuery" /> <el-input v-model="query.dstPointCode" clearable placeholder="目标点位" style="width: 185px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
<rrOperation :crud="crud" /> <rrOperation :crud="crud" />
<!--如果想在工具栏加入更多按钮可以使用插槽方式 slot = 'left' or 'right'--> <!--如果想在工具栏加入更多按钮可以使用插槽方式 slot = 'left' or 'right'-->
@ -51,12 +49,33 @@
> >
人工出库 人工出库
</el-button> </el-button>
<el-button
slot="right"
class="filter-item"
type="danger"
size="mini"
icon="el-icon-document-add"
v-show="true"
@click="FromInventoryFlag=true"
>
替换分配库存
</el-button>
</crudOperation> </crudOperation>
<!--表单组件--> <!--表单组件-->
<el-dialog title="人工出库" :visible.sync="ManualPTFlag" width="600px"> <el-dialog title="人工出库" :visible.sync="ManualPTFlag" width="600px">
<el-form ref="fromBack" :inline="true" :model="fromManualPT" :rules="rules" size="mini" label-width="120px"> <el-form ref="fromBack" :inline="true" :model="fromManualPT" :rules="rules" size="mini" label-width="120px">
<el-form-item label="RFID" prop="RFID"> <el-form-item label="RFID" prop="RFID">
<el-input v-model="fromManualPT.RFID" :rows="3" type="textarea" style="width: 350px;" @change="devan_rfid()"/> <el-input v-model="fromManualPT.RFID" :rows="3" type="textarea" style="width: 350px;" @change="devan_rfid('R')"/>
</el-form-item>
<el-form-item label="明细行号" prop="pdId">
<el-select v-model="fromManualPT.pdId" @change="devan_rfid('L')" value-key="id" :disabled="false" filterable placeholder="请选择" style="width: 350px;">
<el-option
v-for="item in pickDetailList"
:key="item.id"
:label="item.lineNo+','+item.pick.relatedBill1+','+item.item.code+','+(item.allocatedQty-item.pickedQty)"
:value="item.id"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="登记单号" prop="relatedBill2"> <el-form-item label="登记单号" prop="relatedBill2">
<el-input v-model="fromManualPT.relatedBill2" :disabled="true" style="width: 100px;"/> <el-input v-model="fromManualPT.relatedBill2" :disabled="true" style="width: 100px;"/>
@ -67,9 +86,9 @@
<el-form-item label="sku" prop="sku"> <el-form-item label="sku" prop="sku">
<el-input v-model="fromManualPT.sku" :disabled="true" style="width: 330px;"/> <el-input v-model="fromManualPT.sku" :disabled="true" style="width: 330px;"/>
</el-form-item> </el-form-item>
<el-form-item label="行号" prop="lineNo"> <!-- <el-form-item label="行号" prop="lineNo">
<el-input v-model="fromManualPT.lineNo" :disabled="true" style="width: 100px;"/> <el-input v-model="fromManualPT.lineNo" :disabled="false" style="width: 100px;"/>
</el-form-item> </el-form-item>-->
<el-form-item label="订单数量" prop="orderQty"> <el-form-item label="订单数量" prop="orderQty">
<el-input v-model="fromManualPT.orderQty" :disabled="true" style="width: 100px;"/> <el-input v-model="fromManualPT.orderQty" :disabled="true" style="width: 100px;"/>
</el-form-item> </el-form-item>
@ -78,7 +97,7 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button @click="ManualPTFlag = false"> </el-button> <el-button @click="fromManualPT={ };ManualPTFlag = false "> </el-button>
<el-button type="primary" @click="picking()"> </el-button> <el-button type="primary" @click="picking()"> </el-button>
</div> </div>
</el-dialog> </el-dialog>
@ -115,6 +134,19 @@
<el-table-column prop="createBy" label="创建人" /> <el-table-column prop="createBy" label="创建人" />
<el-table-column prop="createTime" label="创建时间" /> <el-table-column prop="createTime" label="创建时间" />
</el-table> </el-table>
<!-- <el-dialog title="修改分配库存" :visible.sync="FromInventoryFlag">
<Inventory ref="inventory" />
</el-dialog>-->
<el-drawer
ref="drawer"
title="可分配库存"
style="height: 250%"
@opened="queryInventoryFrom(crud.selections[0].itemKey.item.id)"
:visible.sync="FromInventoryFlag"
:direction="direction"
:before-close="handleClose">
<Inventory ref="inventory" v-on:replaceTaskInv="replaceTaskInv"/>
</el-drawer>
<!--分页组件--> <!--分页组件-->
<div style="float: right;"> <div style="float: right;">
<pagination/> <pagination/>
@ -124,7 +156,7 @@
</template> </template>
<script> <script>
import crudTask, {devanRfid} from '@/api/task' import crudTask, {devanRfid,replaceInv} from '@/api/task'
import CRUD, { presenter, header, form, crud } from '@crud/crud' import CRUD, { presenter, header, form, crud } from '@crud/crud'
import rrOperation from '@crud/RR.operation' import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation' import crudOperation from '@crud/CRUD.operation'
@ -132,12 +164,14 @@ import udOperation from '@crud/UD.operation'
import pagination from '@crud/Pagination' import pagination from '@crud/Pagination'
import DateRangePicker from "@/components/DateRangePicker/index.vue"; import DateRangePicker from "@/components/DateRangePicker/index.vue";
import {getItemsList} from "@/api/item"; import {getItemsList} from "@/api/item";
import crudPickDetail, { picking } from "@/api/pickDetail"; import crudPickDetail, { picking,getPickDetail } from "@/api/pickDetail";
import {getStockTypes} from "@/api/stockType";
import Inventory from "@/views/business-data/inventory/index.vue";
const defaultForm = { id: null, itemId: null, itemKeyId: null, billCode: null, taskType: null, asnDetailId: null, moveDetailId: null, waveDetailId: null, pickDetailId: null, srcStockId: null, dstStockId: null, srcPointId: null, dstPointId: null, srcStockCode: null, dstStockCode: null, srcPointCode: null, dstPointCode: null, invStatus: null, taskStatus: null, beSkip: null, beBack: null, planQty: null, moveQty: null, putCode: null, invId: null, deptId: null, createBy: null, updateBy: null, createTime: null, updateTime: null } const defaultForm = { id: null, itemId: null, itemKeyId: null, billCode: null, taskType: null, asnDetailId: null, moveDetailId: null, waveDetailId: null, pickDetailId: null, srcStockId: null, dstStockId: null, srcPointId: null, dstPointId: null, srcStockCode: null, dstStockCode: null, srcPointCode: null, dstPointCode: null, invStatus: null, taskStatus: null, beSkip: null, beBack: null, planQty: null, moveQty: null, putCode: null, invId: null, deptId: null, createBy: null, updateBy: null, createTime: null, updateTime: null }
export default { export default {
name: 'Task', name: 'Task',
components: {DateRangePicker, pagination, crudOperation, rrOperation, udOperation }, components: {Inventory, DateRangePicker, pagination, crudOperation, rrOperation, udOperation },
mixins: [presenter(), header(), form(defaultForm), crud()], mixins: [presenter(), header(), form(defaultForm), crud()],
dicts: ['pick_status'], dicts: ['pick_status'],
cruds() { cruds() {
@ -155,6 +189,10 @@ export default {
}, },
data() { data() {
return { return {
//
direction: 'ttb',
FromInventoryFlag: false,
pickDetailList: [],
ManualPTFlag: false, ManualPTFlag: false,
permission: { permission: {
add: ['admin', 'task:add'], add: ['admin', 'task:add'],
@ -163,6 +201,15 @@ export default {
}, },
tableKey: 'api/task', tableKey: 'api/task',
rules: { rules: {
RFID: [
{required: true, message: '必填', trigger: 'blur'}
],
relatedBill1: [
{required: true, message: '必填', trigger: 'blur'}
],
pdId: [
{required: true, message: '必填', trigger: 'blur'}
],
}, },
fromManualPT: { fromManualPT: {
@ -180,6 +227,7 @@ export default {
mounted() { mounted() {
// //
this.itemDataGet(); this.itemDataGet();
this.getPickDetail();
}, },
methods: { methods: {
// false // false
@ -189,18 +237,51 @@ export default {
indexMethod(index) { indexMethod(index) {
return index * 1+1; return index * 1+1;
}, },
queryInventoryFrom(itemId){
this.$refs.inventory.queryInventory(itemId)
},
handleClose(done) {
this.$confirm('确认关闭?')
.then(_ => {
done();
})
.catch(_ => {});
},
manualPT(){ manualPT(){
/*crudTask.manualReceiving(this.fromManualPT).then(res => { /*crudTask.manualReceiving(this.fromManualPT).then(res => {
this.crud.notify(res.message, res.status) this.crud.notify(res.message, res.status)
this.crud.toQuery() this.crud.toQuery()
})*/ })*/
}, },
devan_rfid() { //
console.log("解析RFID码") replaceTaskInv(invId){
devanRfid(this.fromManualPT.RFID,'PICK').then(res => { this.$confirm(`确认替换?`, '提示', {
if (res.status === 200) { confirmButtonText: '确定',
this.fromManualPT = res.data cancelButtonText: '取消',
type: 'warning'
}).then(() => {
crudTask.replaceInv(this.crud.selections[0].id,invId).then(res => {
this.crud.notify(res.message, res.status)
if (res.status==200) {
this.FromInventoryFlag = false
this.crud.toQuery()
} }
}).catch(() => {
})
}).catch(() => {
this.$parent.notify('取消成功!', CRUD.NOTIFICATION_TYPE.SUCCESS);
});
},
devan_rfid(type) {
// -RFID
devanRfid(this.fromManualPT.RFID,'PICK').then(res => {
if (res.status == 200||res.status == 201) {
this.fromManualPT = res.data
}else {
this.fromManualPT = { }
}
this.crud.notify(res.message, res.status)
}) })
}, },
//-- //--
@ -210,10 +291,9 @@ export default {
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
const ids = [] crudTask.picking(this.fromManualPT).then(res => {
ids.push(this.fromManualPT.taskId) this.crud.notify(res.message, res.status)
crudPickDetail.picking(ids).then(res => { this.fromManualPT= { };
this.$parent.crud.notify(res.message, res.status)
this.crud.toQuery() this.crud.toQuery()
}).catch(() => { }).catch(() => {
@ -223,6 +303,16 @@ export default {
this.$parent.notify('取消成功!', CRUD.NOTIFICATION_TYPE.SUCCESS); this.$parent.notify('取消成功!', CRUD.NOTIFICATION_TYPE.SUCCESS);
}); });
}, },
getPickDetail() {
getPickDetail({ }).then(res => {
this.pickDetailList= res.map(function(obj) {
if (obj.hasChildren) {
obj.children = null
}
return obj
})
})
},
// //
itemDataGet() { itemDataGet() {
getItemsList().then(res => { getItemsList().then(res => {

View File

@ -21,7 +21,7 @@
type="primary" type="primary"
icon="el-icon-lollipop" icon="el-icon-lollipop"
@click="picking()" @click="picking()"
>人工拣货 >单品拣货
</el-button> </el-button>
<el-button <el-button
@ -107,10 +107,9 @@ export default {
queryPickTask(id) { queryPickTask(id) {
queryPickTask(id).then(res => { queryPickTask(id).then(res => {
this.data = res; this.data = res;
this.loading = false; this.loading = false;
this.pickDetailId = id; this.pickDetailId = id;
return true; return true
}) })
}, },
selectionChangeHandlerTwos(val) { selectionChangeHandlerTwos(val) {