出库-替换分配库存

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
})
}
export function getPickList() {
return request({
url: 'api/pick/getPickList',
method: 'post'
})
}
export function cancelAllocate(ids) {
return request({
@ -38,4 +44,4 @@ export function cancelAllocate(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) {
return request({
url: 'api/task/manualReceiving',
@ -52,5 +62,12 @@ export function queryPickTask(id) {
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-input v-model="form.orderQty" style="width: 200px;"/>
</el-form-item>
<el-form-item label="收货数量">
<el-input v-model="form.receivedQty" style="width: 200px;"/>
</el-form-item>
<el-form-item label="成品物料编码">
<el-input v-model="form.propC1" style="width: 200px;"/>
</el-form-item>

View File

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

View File

@ -63,6 +63,10 @@
class="filter-item"
@keyup.enter.native="crud.toQuery"
/>
<el-input
v-show="false"
v-model="query.itemId"
/>
<rrOperation :crud="crud" />
<el-button class="filter-item" size="mini" type="warning" icon="el-icon-refresh-left" @click="resetQuery">
@ -81,6 +85,18 @@
>
拆托
</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>
<!--表单组件-->
<el-dialog
@ -262,11 +278,12 @@ import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation'
import udOperation from '@crud/UD.operation'
import pagination from '@crud/Pagination'
import {queryPickTask} from "@/api/task";
const defaultForm = {
id: null,
billCode: null,
itemKey: null,
itemKey: { item: { id:null } },
point: null,
stock: null,
bigStockId: null,
@ -311,6 +328,8 @@ export default {
},
data() {
return {
//
ButReplaceInvFlag: false,
points: [],
stocks: [],
items: [],
@ -386,6 +405,17 @@ export default {
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) { //
const ids = []
ids.push(id)

View File

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

View File

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

View File

@ -33,9 +33,7 @@
</el-select>
<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" />
<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" />
<rrOperation :crud="crud" />
<!--如果想在工具栏加入更多按钮可以使用插槽方式 slot = 'left' or 'right'-->
@ -51,12 +49,33 @@
>
人工出库
</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>
<!--表单组件-->
<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-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 label="登记单号" prop="relatedBill2">
<el-input v-model="fromManualPT.relatedBill2" :disabled="true" style="width: 100px;"/>
@ -67,9 +86,9 @@
<el-form-item label="sku" prop="sku">
<el-input v-model="fromManualPT.sku" :disabled="true" style="width: 330px;"/>
</el-form-item>
<el-form-item label="行号" prop="lineNo">
<el-input v-model="fromManualPT.lineNo" :disabled="true" style="width: 100px;"/>
</el-form-item>
<!-- <el-form-item label="行号" prop="lineNo">
<el-input v-model="fromManualPT.lineNo" :disabled="false" style="width: 100px;"/>
</el-form-item>-->
<el-form-item label="订单数量" prop="orderQty">
<el-input v-model="fromManualPT.orderQty" :disabled="true" style="width: 100px;"/>
</el-form-item>
@ -78,7 +97,7 @@
</el-form-item>
</el-form>
<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>
</div>
</el-dialog>
@ -115,6 +134,19 @@
<el-table-column prop="createBy" label="创建人" />
<el-table-column prop="createTime" label="创建时间" />
</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;">
<pagination/>
@ -124,7 +156,7 @@
</template>
<script>
import crudTask, {devanRfid} from '@/api/task'
import crudTask, {devanRfid,replaceInv} from '@/api/task'
import CRUD, { presenter, header, form, crud } from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation'
@ -132,12 +164,14 @@ import udOperation from '@crud/UD.operation'
import pagination from '@crud/Pagination'
import DateRangePicker from "@/components/DateRangePicker/index.vue";
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 }
export default {
name: 'Task',
components: {DateRangePicker, pagination, crudOperation, rrOperation, udOperation },
components: {Inventory, DateRangePicker, pagination, crudOperation, rrOperation, udOperation },
mixins: [presenter(), header(), form(defaultForm), crud()],
dicts: ['pick_status'],
cruds() {
@ -155,6 +189,10 @@ export default {
},
data() {
return {
//
direction: 'ttb',
FromInventoryFlag: false,
pickDetailList: [],
ManualPTFlag: false,
permission: {
add: ['admin', 'task:add'],
@ -163,6 +201,15 @@ export default {
},
tableKey: 'api/task',
rules: {
RFID: [
{required: true, message: '必填', trigger: 'blur'}
],
relatedBill1: [
{required: true, message: '必填', trigger: 'blur'}
],
pdId: [
{required: true, message: '必填', trigger: 'blur'}
],
},
fromManualPT: {
@ -180,6 +227,7 @@ export default {
mounted() {
//
this.itemDataGet();
this.getPickDetail();
},
methods: {
// false
@ -189,18 +237,51 @@ export default {
indexMethod(index) {
return index * 1+1;
},
queryInventoryFrom(itemId){
this.$refs.inventory.queryInventory(itemId)
},
handleClose(done) {
this.$confirm('确认关闭?')
.then(_ => {
done();
})
.catch(_ => {});
},
manualPT(){
/*crudTask.manualReceiving(this.fromManualPT).then(res => {
this.crud.notify(res.message, res.status)
this.crud.toQuery()
})*/
},
devan_rfid() {
console.log("解析RFID码")
devanRfid(this.fromManualPT.RFID,'PICK').then(res => {
if (res.status === 200) {
this.fromManualPT = res.data
//
replaceTaskInv(invId){
this.$confirm(`确认替换?`, '提示', {
confirmButtonText: '确定',
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: '取消',
type: 'warning'
}).then(() => {
const ids = []
ids.push(this.fromManualPT.taskId)
crudPickDetail.picking(ids).then(res => {
this.$parent.crud.notify(res.message, res.status)
crudTask.picking(this.fromManualPT).then(res => {
this.crud.notify(res.message, res.status)
this.fromManualPT= { };
this.crud.toQuery()
}).catch(() => {
@ -223,6 +303,16 @@ export default {
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() {
getItemsList().then(res => {

View File

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