You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

744 lines
25 KiB

<template>
<view class="page-wraper">
<view class="">
<com-blank-view @goScan="showFromLocationPopup" v-if="recommendList.length == 0"></com-blank-view>
</view>
<view class="page-wraper" v-if="recommendList.length > 0">
<!-- <view class="page-header">
<view class="header_item">
来源库位 : {{fromLocationCode}}
</view>
<view class='split_line'></view>
</view> -->
<view class="page-header">
<view class="header_item" style="font-size: 35rpx; padding: 10rpx">
<uni-collapse ref="collapse">
<uni-collapse-item :open="true">
<template v-slot:title>
<view class="card_itemName" style="padding: 3px 5px; font-size: 28rpx"> 先进先出推荐信息 </view>
</template>
<view class="detail-list" v-for="(recommend, index) in recommendList" :key="recommend.id">
<view class="card_view">
<text class="card_item_code">物料代码</text>
<text class="card_content">{{ recommend.itemCode }}</text>
</view>
<balance :dataContent="recommend" :isShowStatus="false"></balance>
</view>
</uni-collapse-item>
</uni-collapse>
</view>
</view>
<view class="page-main">
<scroll-view scroll-y="true" class="page-main-scroll">
<view class="detail-list" v-for="(item, index) in detailSource" :key="item.id">
<view class="">
<record-com-detail-card :dataContent="item" :index="index" :settingParam="dataContent" :isShowFromLocation="false" @removeItem="removeItem(index, item)" :isShowToLocation="false" @updateData="updateData" @removePack="removePack"> </record-com-detail-card>
</view>
</view>
</scroll-view>
</view>
<view class="page-footer">
<view class="uni-flex u-col-center space-between padding_10" style="background-color: ghostwhite; width: 100%">
<view class="uni-row uni-flex">
<text>生产线:</text>
<view class="uni-flex u-col-center uni-row" @click="showSelect">
<view class="" style="margin-left: 20rpx">
{{ positionInfo }}
</view>
<u-select v-model="show" mode="mutil-column-auto" :list="positionList" @confirm="confirmSelect"></u-select>
</view>
</view>
<view class="uni-flex uni-row">
<button class="btn_single_commit" hover-class="btn_commit_after" @click="commit">提交</button>
</view>
</view>
</view>
<win-scan-button @goScan="openScanPopup"></win-scan-button>
</view>
<win-scan-pack-and-location ref="scanPopup" @getResult="onScan" :allowModifyLocation="false" :queryBalance="false"> </win-scan-pack-and-location>
<comMessage ref="comMessage"></comMessage>
<win-scan-location ref="scanLocationCode" title="来源库位" @getLocation="getLocation" :locationAreaTypeList="fromLocationAreaTypeList"></win-scan-location>
<balance-select ref="balanceSelect" @onSelectItem="selectBalanceItem"></balance-select>
</view>
</template>
<script>
import { issueRecordSubmit, getWorkShopLineStation, getBalanceByFilter, getBalanceByBatchOffShelf } from '@/api/request2.js'
import { goHome, getPackingNumberAndBatchByList, deepCopyData } from '@/common/basic.js'
import { calc } from '@/common/calc.js'
import { getInventoryStatusDesc, getDirectoryItemArray } from '@/common/directory.js'
import { getBusinessType, createItemInfo, createDetailInfo, calcTreeHandleQty, calcHandleQty } from '@/common/record.js'
import { getManagementPrecisions, getPrecisionStrategyList, getPrecisionStrategyParams } from '@/common/balance.js'
import winScanButton from '@/mycomponents/scan/winScanButton.vue'
import winScanPack from '@/mycomponents/scan/winScanPack.vue'
import requiredLocation from '@/mycomponents/location/requiredLocation.vue'
import comBlankView from '@/mycomponents/common/comBlankView.vue'
import winScanLocation from '@/mycomponents/scan/winScanLocation.vue'
import winScanPackAndLocation from '@/mycomponents/scan/winScanPackAndLocation.vue'
import recordComDetailCard from '@/mycomponents/record/recordComDetailCard.vue'
import recordDetailCard from '@/mycomponents/record/recordDetailCard.vue'
import balanceSelect from '@/mycomponents/balance/balanceSelect.vue'
import balance from '@/mycomponents/balance/balance.vue'
export default {
components: {
winScanButton,
winScanPack,
requiredLocation,
comBlankView,
winScanLocation,
winScanPackAndLocation,
recordComDetailCard,
recordDetailCard,
balanceSelect,
balance
},
data() {
return {
id: '',
dataContent: {}, // 内容
detailSource: [], // 绑定在页面上的数据源
fromLocationInfo: {},
fromLocationCode: '',
fromLocationAreaTypeList: [],
toLocationAreaTypeList: [],
inInventoryStatus: '', // 目标入库库存状态
outInventoryStatus: '', // 来源出库库存状态
businessType: {},
showToLoaction: true,
recommendLocationList: [], // 推荐库位列表
fromWarehouseCode: '', // 来源仓库
businessTypeCode: 'Issue',
positionList: [],
show: false,
positionInfo: '请选择生产线',
resultData: {},
recommendList: []
}
},
onLoad(option) {
uni.setNavigationBarTitle({
title: option.title
})
this.clearData()
getBusinessType(this.businessTypeCode, (res) => {
if (res.success) {
this.businessType = res.businessType
this.fromLocationAreaTypeList = res.fromLocationAreaTypeList
this.toLocationAreaTypeList = res.toLocationAreaTypeList
this.showFromLocationPopup()
} else {
this.showErrorMessage(res.message)
}
})
// if (this.positionList.length == 0) {
getWorkShopLineStation()
.then((res) => {
if (res.data != null && res.data.length > 0) {
this.positionList = res.data
} else {
this.showErrorMessage('未查找到位置信息')
}
})
.catch((error) => {
this.showErrorMessage(error)
})
// }
},
// 返回首页
onNavigationBarButtonTap(e) {
if (e.index === 0) {
goHome()
}
},
// 拦截返回按钮事件
onBackPress(e) {},
onPullDownRefresh() {},
mounted() {},
methods: {
getBalance(label, packageInfo, callback) {
const filters = []
if (packageInfo.parentNumber) {
const packingNumber = `${packageInfo.parentNumber},${label.packingNumber}`
filters.push({
column: 'packingNumber',
action: 'in',
value: packingNumber
})
} else {
filters.push({
column: 'packingNumber',
action: '==',
value: label.packingNumber
})
}
filters.push({
column: 'itemCode',
action: '==',
value: label.itemCode
})
filters.push({
column: 'batch',
action: '==',
value: label.batch
})
if (this.fromInventoryStatuses != null && this.fromInventoryStatuses != '') {
filters.push({
column: 'inventoryStatus',
action: 'in',
value: this.fromInventoryStatuses
})
}
const params = {
filters,
pageNo: 1,
pageSize: 100
}
getBalanceByFilter(params)
.then((res) => {
callback(res.data)
})
.catch((err) => {
this.showErrorMessage(err.message)
})
},
getScanResult(result) {
this.resultData = result
const packageInfo = result.package
this.getBalance(result.label, packageInfo, (balances) => {
// 扫描的是外包装
const s = ''
if (!result.package.parentNumber) {
if (balances.list.length == 0) {
this.showErrorMessage('未查找到该包装的库存信息,请重新扫描')
} else {
const newBalances = balances.list.filter((b) => b.locationCode == this.fromLocationCode)
if (newBalances.length == 0) {
this.showErrorMessage('未查找到该包装的库存信息,请重新扫描')
} else if (newBalances.length == 1) {
const balance = newBalances[0]
result.balance = balance
this.afterGetBalance(result)
} else {
this.showBalanceSelect(newBalances)
}
}
} else {
// 扫描的是小包装
if (balances.list.length == 0) {
this.showErrorMessage('未查找到该包装的库存信息,请重新扫描')
} else {
// 小包装库存
const subPackitems = balances.list.filter((r) => r.packingNumber == packageInfo.number)
// 外包装库存
const subParentPackitems = balances.list.filter((r) => r.packingNumber == packageInfo.parentNumber && r.locationCode == this.fromLocationCode)
// 小包装没有库存,
if (subPackitems.length == 0) {
// 外包装有库存,出库后剩余库存未转换为出库包装规格
if (subParentPackitems.length > 0) {
if (subParentPackitems.length == 1) {
const balance = subParentPackitems[0]
balance.qty = packageInfo.qty
result.balance = balance
this.afterGetBalance(result)
} else {
this.showBalanceSelect(subParentPackitems)
}
} else {
this.showErrorMessage(`按外包装【${packageInfo.parentNumber}】和子包装【${packageInfo.number}】都未查找到库存余额`)
}
} else {
let locationCode = this.fromLocationCode
if (balances.list == 1) {
locationCode = balances.list[0].locationCode
} else {
const manyBlances = balances.list.filter((r) => r.locationCode != this.fromLocationCode)
if (manyBlances.length > 0) {
locationCode = manyBlances[0].locationCode
}
}
this.showErrorMessage(`该包装【${packageInfo.number}】在库位【${locationCode}】已经有库存余额,请重新扫描`)
}
}
}
})
},
onScan(result) {
const that = this
const pack = result.package
if (that.recommendList.length > 0) {
const recommend = that.recommendList.filter((r) => r.itemCode == pack.itemCode)
if (recommend.length == 0) {
this.showErrorMessage(`物料代码【${pack.itemCode}】不在推荐列表中`)
} else {
const batch = recommend.find((r) => r.batch == pack.batch)
if (batch == undefined) {
that.showErrorMessage(`扫描的批次【${pack.batch}】,不是系统推荐的批次,不满足系统的先进先出规则,请重新扫描物料`)
} else {
this.getScanResult(result)
}
}
} else {
this.getRecommendInfo(result)
}
},
getRecommendInfo(result) {
const that = this
uni.showLoading({
title: '加载中...',
mask: true
})
const item = {
itemCode: result.package.itemCode,
qty: result.package.qty
}
getBalanceByBatchOffShelf(item.itemCode, item.qty, 'issue')
.then((res) => {
if (res.data == null) {
that.showErrorMessage('未获取到推荐信息')
} else {
if (res.data.length > 0) {
that.recommendList = res.data
that.recommendList.forEach((r) => (r.locationCode = r.fromLocationCode))
const recommendInfo = res.data[0]
if (recommendInfo.batch != result.package.batch) {
that.showErrorMessage(`扫描的批次【${result.package.batch}】,不是系统推荐的批次【${recommendInfo.batch}】,不满足系统的先进先出规则,请重新扫描`)
} else {
this.getScanResult(result)
}
} else {
that.showErrorMessage('未查找到物料的推荐信息')
}
uni.hideLoading()
}
})
.catch((error) => {
uni.hideLoading()
that.showErrorMessage(error)
})
},
showBalanceSelect(items) {
this.$refs.balanceSelect.openPopup(items)
},
selectBalanceItem(balance) {
this.resultData.balance = balance
this.afterGetBalance(this.resultData)
},
afterGetBalance(result) {
const { balance } = result
const { label } = result
const pack = result.package
const { packUnit } = pack
const { packQty } = pack
const item = this.detailSource.find((res) => {
if (res.itemCode == balance.itemCode) {
return res
}
})
if (this.fromWarehouseCode == '') {
this.fromWarehouseCode = balance.warehouseCode
}
if (item == undefined) {
const itemp = createItemInfo(balance, pack)
const newDetail = createDetailInfo(balance, pack) //
newDetail.parentNumber = pack.parentNumber
newDetail.packingNumber = pack.number
newDetail.packUnit = packUnit
newDetail.packQty = packQty
itemp.subList.push(newDetail)
this.detailSource.push(itemp)
calcHandleQty(this.detailSource)
} else {
const detail = item.subList.find((r) => {
if (r.packingNumber == pack.number && r.batch == balance.batch && r.locationCode == balance.locationCode && r.inventoryStatus == balance.inventoryStatus) {
return r
}
})
if (detail == undefined) {
const newDetail = createDetailInfo(balance, pack)
newDetail.parentNumber = pack.parentNumber
newDetail.packingNumber = pack.number
newDetail.packUnit = packUnit
newDetail.packQty = packQty
item.subList.push(newDetail)
calcHandleQty(this.detailSource)
} else if (detail.scaned == true) {
this.showErrorMessage(`箱码[${detail.packingNumber}]批次[${balance.batch}]已经在列表中`)
}
}
},
getScanResult1(result) {
const { balance } = result
const { label } = result
const pack = result.package
const { packUnit } = pack
const { packQty } = pack
const item = this.detailSource.find((res) => {
if (res.itemCode == balance.itemCode) {
return res
}
})
if (this.fromWarehouseCode == '') {
this.fromWarehouseCode = balance.warehouseCode
}
if (item == undefined) {
const itemp = createItemInfo(balance, pack)
const newDetail = createDetailInfo(balance, pack) //
newDetail.packUnit = packUnit
newDetail.packQty = packQty
itemp.subList.push(newDetail)
this.detailSource.push(itemp)
calcHandleQty(this.detailSource)
} else {
const detail = item.subList.find((r) => {
if (r.packingNumber == balance.packingNumber && r.batch == balance.batch && r.locationCode == balance.locationCode && r.inventoryStatus == balance.inventoryStatus) {
return r
}
})
if (detail == undefined) {
const newDetail = createDetailInfo(balance, pack)
newDetail.packUnit = packUnit
newDetail.packQty = packQty
item.subList.push(newDetail)
calcHandleQty(this.detailSource)
} else if (detail.scaned == true) {
this.showErrorMessage(`箱码[${balance.packingNumber}批次[${balance.batch}]已经在列表中`)
}
}
},
// 获取推荐库位
getRecommendLocation(balance, pack, callback) {
uni.showLoading({
title: '扫描中...',
mask: true
})
const recommend = this.recommendLocationList.find((r) => r.itemCode == balance.itemCode)
if (recommend == undefined) {
const param = {
itemCode: balance.itemCode,
batch: balance.batch,
inventoryStatus: balance.inventoryStatus,
supplierCode: pack.supplierCode,
businessCode: this.businessTypeCode
}
console.log(JSON.stringify(param))
getPutawayRecommendLocation(param)
.then((res) => {
this.recommendLocationList.push({
itemCode: balance.itemCode,
locationCode: res.data.code
})
callback(res.data)
uni.hideLoading()
})
.catch((error) => {
uni.hideLoading()
this.showErrorMessage(error)
uni.hideLoading()
})
} else {
callback(recommend)
}
},
showErrorMessage(message) {
this.$refs.comMessage.showErrorMessage(message, (res) => {
if (res) {
}
})
},
calcTreeHandleQty() {
for (const item of this.detailSource) {
item.qty = 0
for (const detail of item.subList) {
if (detail != undefined) {
item.qty = calc.add(item.qty, detail.qty)
}
}
}
this.$forceUpdate()
},
showSelect() {
// if (this.editPosition) {
this.show = true
// }
},
confirmSelect(e) {
this.positionInfo = `${e[0].label}-${e[1].label}-${e[2].label}`
console.log('位置', this.positionInfo)
this.workshopCode = e[0].value
this.productionLineCode = e[1].value
this.workStationCode = e[2].value
this.workShopName = e[0].label
this.productionLineName = e[1].label
this.workStationName = e[2].label
const shop = this.positionList.find((shop) => shop.value == this.workshopCode)
if (shop != undefined && shop.children != undefined) {
const prodLine = shop.children.find((line) => line.value == this.productionLineCode)
if (prodLine != undefined && prodLine.children != undefined) {
const station = prodLine.children.find((r) => r.value == this.workStationCode)
if (station.rawLocationCode == '' && station.rawLocationCode == null) {
this.showErrorMessage(`${this.workStationName}的原材料库位为空,请重新选择`)
return
}
this.rawLocationCode = station.rawLocationCode
this.fgLocationCode = station.fgLocationCode
} else {
this.showErrorMessage('生产线-工位基础信息维护错误')
}
} else {
this.showErrorMessage('车间-生产线基础信息维护错误')
}
// 赋值到库位代码
let toLocationCode = ''
this.positionList.forEach((item) => {
if (this.workshopCode == item.value) {
// 车间
item.children.find((child) => {
if (this.productionLineCode == child.value) {
toLocationCode = child.children.find((subChild) => this.workStationCode == subChild.value).rawLocationCode
}
})
}
})
this.detailSource.forEach((item) => {
item.subList.forEach((detail) => {
detail.toLocationCode = toLocationCode
})
})
},
removeItem(index, item) {
this.detailSource.splice(index, 1)
},
removePack() {
for (let i = 0; i < this.detailSource.length; i++) {
const item = this.detailSource[i]
if (item.subList.length == 0) {
this.detailSource.splice(i, 1)
}
}
this.updateData()
},
openScanPopup() {
if (this.fromLocationCode == '') {
this.showFromLocationPopup()
return
}
this.$refs.scanPopup.openScanPopupForType(this.fromLocationCode, this.businessType)
},
showFromLocationPopup() {
this.$nextTick(() => {
this.$refs.scanLocationCode.openScanPopup()
})
},
closeScanPopup() {
if (this.$refs.scanPopup != undefined) {
this.$refs.scanPopup.closeScanPopup()
}
},
scanPopupGetFocus() {
if (this.$refs.scanPopup != undefined) {
this.$refs.scanPopup.getfocus()
}
},
// scanLocationCode(location, code) {
// this.toLocationCode = code
// this.toLocationCode = location;
// },
commit() {
uni.showLoading({
title: '提交中....',
mask: true
})
// 记录有目标库位,需要查询管理模式
const precisionStrategyParams = getPrecisionStrategyParams(this.detailSource)
// 2:获取管理模式,封装参数
getPrecisionStrategyList(precisionStrategyParams, (res) => {
if (res.success) {
this.managementList = res.list
const params = {
...this.setRecordParams()
}
console.log('提交参数', JSON.stringify(params))
issueRecordSubmit(params)
.then((res) => {
uni.hideLoading()
if (res.data) {
this.showCommitSuccessMessage(`提交成功<br>生成直接发料记录<br>${res.data}`)
} else {
this.showErrorMessage(`提交失败[${res.msg}]`)
}
})
.catch((error) => {
uni.hideLoading()
this.showErrorMessage(error)
})
} else {
uni.hideLoading()
this.showErrorMessage(res.message)
}
})
},
setRecordParams() {
const subList = []
const creator = this.$store.state.user.id
this.detailSource.forEach((item) => {
item.subList.forEach((detail) => {
if (detail.scaned) {
const info = getPackingNumberAndBatchByList(this.managementList, detail.itemCode, detail.packingNumber, detail.toLocationCode, detail.batch)
const submitItem = deepCopyData(detail)
submitItem.toPackingNumber = info.packingNumber
submitItem.toBatch = info.batch
submitItem.toContainerNumber = detail.containerNumber
submitItem.fromPackingNumber = info.packingNumber
submitItem.fromBatch = info.batch
submitItem.fromContainerNumber = detail.containerNumber
submitItem.fromLocationCode = detail.locationCode
submitItem.toLocationCode = detail.toLocationCode
// detail.toInventoryStatus = detail.inventoryStatus
// detail.toLocationCode = detail.toLocationCode
submitItem.qty = detail.handleQty
submitItem.package = ''
submitItem.recordList = [
{
toInventoryStatus: detail.inventoryStatus,
fromParentPackingNumber: detail.parentNumber,
fromPackingNumber: info.packingNumber,
fromBatch: info.batch,
toPackingNumber: info.packingNumber,
toBatch: info.batch,
fromLocationCode: detail.locationCode,
toLocationCode: detail.toLocationCode,
handleQty: detail.handleQty,
fromPackUnit: detail.packUnit,
toPackUnit: detail.packUnit,
fromPackQty: detail.packQty,
toPackQty: detail.packQty
}
]
subList.push(submitItem)
}
})
})
if (subList.length > 0) {
this.dataContent.toWarehouseCode = subList[0].toWarehouseCode
}
this.dataContent.subList = subList
this.dataContent.creator = creator
this.dataContent.fromWarehouseCode = this.fromWarehouseCode
return this.dataContent
},
showMessage(message) {
this.$refs.comMessage.showMessage(message, (res) => {
if (res) {
}
})
},
showScanMessage(message) {
this.$refs.comMessage.showScanMessage(message)
},
afterCloseMessage() {
this.scanPopupGetFocus()
},
closeScanMessage() {
this.scanPopupGetFocus()
},
getLocation(location, code) {
this.getFromLocationCode(location, code)
},
getFromLocationCode(location, code) {
this.fromLocationInfo = location
this.fromLocationCode = code
this.openScanPopup()
},
getToLocationCode(location, code) {
if (this.fromLocationCode == code) {
uni.showToast({
title: `来源库位[${this.fromLocationCode}]不能与目标库位[${code}]一致`,
duration: 2000
})
return
}
this.toLocationCode = code
},
showCommitSuccessMessage(hint) {
this.$refs.comMessage.showSuccessMessage(hint, (res) => {
this.clearData()
})
},
updateData() {
calcHandleQty(this.detailSource)
for (let i = 0; i < this.detailSource.length; i++) {
const item = this.detailSource[i]
if (item.qty == 0) {
this.detailSource.splice(i, 1)
}
}
this.$forceUpdate()
},
clearData() {
this.fromLocationInfo = {}
this.fromLocationCode = ''
this.fromWarehouseCode = ''
this.toWarehouseCode = ''
this.detailSource = []
this.positionInfo = '请选择生产线'
}
}
}
</script>
<style scoped lang="scss"></style>