现场调试更改

This commit is contained in:
lsymicc
2026-09-12 09:26:24 +08:00
parent abeb081825
commit 8ddae081cd
29 changed files with 2579 additions and 146 deletions

152
pda/_pages.json Normal file
View File

@@ -0,0 +1,152 @@
{
"pages": [{
"path": "pages/login",
"style": {
"navigationBarTitleText": "登录"
}
}, {
"path": "pages/register",
"style": {
"navigationBarTitleText": "注册"
}
}, {
"path": "pages/index",
"style": {
"navigationBarTitleText": "WMS 仓储管理",
"navigationStyle": "custom"
}
}, {
"path": "pages/work/index",
"style": {
"navigationBarTitleText": "工作台"
}
}, {
"path": "pages/mine/index",
"style": {
"navigationBarTitleText": "我的"
}
}, {
"path": "pages/mine/avatar/index",
"style": {
"navigationBarTitleText": "修改头像"
}
}, {
"path": "pages/mine/info/index",
"style": {
"navigationBarTitleText": "个人信息"
}
}, {
"path": "pages/mine/info/edit",
"style": {
"navigationBarTitleText": "编辑资料"
}
}, {
"path": "pages/mine/pwd/index",
"style": {
"navigationBarTitleText": "修改密码"
}
}, {
"path": "pages/mine/setting/index",
"style": {
"navigationBarTitleText": "应用设置"
}
}, {
"path": "pages/mine/help/index",
"style": {
"navigationBarTitleText": "常见问题"
}
}, {
"path": "pages/mine/about/index",
"style": {
"navigationBarTitleText": "关于我们"
}
} , {
"path": "pages/warehouse/inbound/index",
"style": {
"navigationBarTitleText": "入库管理"
}
}, {
"path": "pages/warehouse/inbound/bindTray",
"style": {
"navigationBarTitleText": "入库绑盘"
}
}, {
"path": "pages/warehouse/inbound/emptyTray",
"style": {
"navigationBarTitleText": "空托入库"
}
}, {
"path": "pages/warehouse/inbound/supply",
"style": {
"navigationBarTitleText": "补料入库"
}
}, {
"path": "pages/warehouse/outbound/index",
"style": {
"navigationBarTitleText": "出库管理"
}
}, {
"path": "pages/warehouse/outbound/confirm",
"style": {
"navigationBarTitleText": "版辊出库确认"
}
}, {
"path": "pages/warehouse/outbound/trayConfirm",
"style": {
"navigationBarTitleText": "托盘出库确认"
}
}, {
"path": "pages/warehouse/outbound/exception",
"style": {
"navigationBarTitleText": "出库异常确认"
}
}, {
"path": "pages/warehouse/inventory/index",
"style": {
"navigationBarTitleText": "盘点管理"
}
}, {
"path": "pages/warehouse/stock/index",
"style": {
"navigationBarTitleText": "库存统计"
}
}, {
"path": "pages/common/webview/index",
"style": {
"navigationBarTitleText": "浏览网页"
}
}, {
"path": "pages/common/textview/index",
"style": {
"navigationBarTitleText": "浏览文本"
}
}],
"tabBar": {
"color": "#000000",
"selectedColor": "#000000",
"borderStyle": "white",
"backgroundColor": "#ffffff",
"list": [{
"pagePath": "pages/index",
"iconPath": "static/images/tabbar/home.png",
"selectedIconPath": "static/images/tabbar/home_.png",
"text": "首页"
}, {
"pagePath": "pages/work/index",
"iconPath": "static/images/tabbar/work.png",
"selectedIconPath": "static/images/tabbar/work_.png",
"text": "工作台"
}, {
"pagePath": "pages/mine/index",
"iconPath": "static/images/tabbar/mine.png",
"selectedIconPath": "static/images/tabbar/mine_.png",
"text": "我的"
}
]
},
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "RuoYi",
"navigationBarBackgroundColor": "#FFFFFF"
}
}

View File

@@ -64,13 +64,13 @@
<uni-icons type="plus" size="22" color="#52c41a"></uni-icons>
<text class="quick-label">空托入库</text>
</view>
<view class="quick-item" @click="navigateTo('/pages/warehouse/outbound/confirm')">
<view class="quick-item" @click="navigateTo('/pages/warehouse/outbound/trayConfirm')">
<uni-icons type="checkmarkempty" size="22" color="#fa8c16"></uni-icons>
<text class="quick-label">出库确认</text>
</view>
<view class="quick-item" @click="navigateTo('/pages/warehouse/outbound/exception')">
<view class="quick-item" @click="navigateTo('/pages/warehouse/outbound/container')">
<uni-icons type="info" size="22" color="#f5222d"></uni-icons>
<text class="quick-label">出库异常</text>
<text class="quick-label">呼叫空托</text>
</view>
</view>
</view>

View File

@@ -0,0 +1,441 @@
<template>
<view class="page-container">
<!-- 任务信息 -->
<view class="task-info" v-if="taskNo">
<text class="task-label">任务编号</text>
<text class="task-value">{{ taskNo }}</text>
</view>
<!-- 扫码添加物料 -->
<view class="scan-section">
<view class="scan-header">
<text class="scan-title">版辊信息</text>
<view class="scan-btn" @click="startScan">
<uni-icons type="scan" size="18" color="#1890ff"></uni-icons>
<text class="scan-btn-text">扫码</text>
</view>
</view>
<view class="input-wrap">
<input class="scan-input" v-model="barcode" placeholder="请输入或扫描版辊编号"
@confirm="handleBarcode" />
</view>
</view>
<!-- 当前扫码物料信息(待添加) -->
<view class="form-section" v-if="currentMaterial">
<text class="form-title">物料信息</text>
<!-- <view class="info-row">
<text class="info-label">物料编码</text>
<text class="info-value">{{ currentMaterial.productId }}</text>
</view>
<view class="info-row">
<text class="info-label">物料名称</text>
<text class="info-value">{{ currentMaterial.productName }}</text>
</view> -->
<view class="info-row">
<text class="info-label">辊号</text>
<text class="info-value">{{ currentMaterial.rollerNumber }}</text>
</view>
<view class="info-row">
<text class="info-label">托盘号</text>
<text class="info-value">{{ currentMaterial.trayCode }}</text>
</view>
<view class="form-item">
<text class="form-label">绑定数量</text>
<input class="form-input" v-model="currentQty" disabled type="number" placeholder="请输入绑定数量" />
</view>
</view>
<!-- 操作按钮 -->
<view class="btn-section">
<button class="btn btn-danger" :disabled="!this.barcode || this.barcode.trim() === ''" @click="submitCancelTrayAction">
确认取消绑定<!-- ({{ items.length }} 种物料) -->
</button>
<button class="btn btn-default" @click="resetAll">全部重置</button>
</view>
</view>
</template>
<script>
import { getMaterialByDetailId, getTrayMsgByRollerNumber, submitCancelTray, submitCancelTrayMsg } from '@/api/warehouse/inbound'
export default {
data() {
return {
taskNo: '',
trayCode: '',
// 当前扫码
barcode: '',
currentMaterial: null,
currentQty: '',
// 已加入列表的物料
items: []
}
},
onLoad(options) {
if (options.taskNo) {
this.taskNo = options.taskNo
}
},
methods: {
// 调用摄像头扫码
startScan() {
var that = this
uni.scanCode({
onlyFromCamera: false,
scanType: ['barCode', 'qrCode'],
success: function(res) {
that.barcode = res.result
that.handleBarcode()
}
})
},
// 根据入库明细ID查询物料
handleBarcode() {
if (!this.barcode) {
// this.$modal.msg('请输入入库子单号')
this.$modal.msg('请输入版辊信息')
return
}
var that = this
getTrayMsgByRollerNumber(this.barcode).then(function(res) {
that.currentMaterial = res.data
that.currentQty = res.data.quantity ? String(res.data.quantity) : ''
that.$modal.msgSuccess('物料信息获取成功')
}).catch(function() {
that.currentMaterial = null
that.currentQty = ''
})
},
// 从列表中移除某条物料
removeItem(index) {
this.items.splice(index, 1)
},
// 提交绑盘
submitCancelTrayAction() {
if (!this.barcode || this.barcode.trim() === "") {
this.$modal.msg('请输入辊号')
return
}
var data = {
barcode: this.barcode,
items: this.items.map(function(i) {
return {
stockinDetailId: i.stockinDetailId,
productId: i.rollerNumber,
rollerNumber: i.rollerNumber,
colorSequence: i.colorSequence,
color: i.color,
spec: i.spec,
quantity: i.quantity
}
})
}
var that = this
// submitBindTray(data).then(function(res) {
submitCancelTrayMsg(this.barcode).then(function(res) {
that.$modal.msgSuccess(res.msg || '入库绑盘信息已作废')
that.resetAll()
}).catch(function() {})
},
// 全部重置
resetAll() {
this.trayCode = ''
this.barcode = ''
this.currentMaterial = null
this.currentQty = ''
this.items = []
}
}
}
</script>
<style lang="scss" scoped>
page {
background-color: #f5f7fa;
min-height: 100%;
}
.page-container {
padding: 24rpx;
padding-bottom: 60rpx;
}
/* 任务信息 */
.task-info {
background: #e6f7ff;
border-radius: 12rpx;
padding: 20rpx 24rpx;
margin-bottom: 24rpx;
display: flex;
justify-content: space-between;
align-items: center;
}
.task-label {
font-size: 26rpx;
color: #1890ff;
}
.task-value {
font-size: 26rpx;
color: #333;
font-weight: 500;
}
/* 扫码区 */
.scan-section {
background: #fff;
border-radius: 16rpx;
padding: 28rpx;
margin-bottom: 24rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
}
.scan-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
}
.scan-title {
font-size: 30rpx;
font-weight: 500;
color: #333;
}
.scan-btn {
display: flex;
align-items: center;
padding: 8rpx 20rpx;
border: 1rpx solid #1890ff;
border-radius: 8rpx;
}
.scan-btn-text {
font-size: 24rpx;
color: #1890ff;
margin-left: 8rpx;
}
.input-wrap {
border: 1rpx solid #e8e8e8;
border-radius: 8rpx;
padding: 4rpx;
}
.scan-input {
font-size: 28rpx;
padding: 16rpx;
word-break: break-all;
width: 100%;
height: auto;
line-height: 1.4;
}
/* 通用 form-section */
.form-section {
background: #fff;
border-radius: 16rpx;
padding: 28rpx;
margin-bottom: 24rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
}
.form-title {
font-size: 30rpx;
font-weight: 500;
color: #333;
margin-bottom: 24rpx;
padding-bottom: 16rpx;
border-bottom: 1rpx solid #f0f0f0;
display: block;
}
.form-item {
display: flex;
align-items: center;
padding: 16rpx 0;
}
.form-label {
font-size: 28rpx;
color: #666;
width: 160rpx;
flex-shrink: 0;
}
.form-input {
flex: 1;
font-size: 28rpx;
border: 1rpx solid #e8e8e8;
border-radius: 8rpx;
padding: 16rpx;
word-break: break-all;
min-width: 0;
height: auto;
line-height: 1.4;
}
.info-row {
display: flex;
justify-content: space-between;
padding: 16rpx 0;
border-bottom: 1rpx solid #f5f5f5;
}
.info-label {
font-size: 28rpx;
color: #999;
}
.info-value {
font-size: 28rpx;
color: #333;
}
/* 加入列表按钮 */
.btn-add {
margin-top: 24rpx;
background: #1890ff;
color: #fff;
border-radius: 12rpx;
font-size: 28rpx;
display: flex;
align-items: center;
justify-content: center;
padding: 20rpx 0;
border: none;
}
.btn-add-text {
font-size: 28rpx;
color: #fff;
margin-left: 8rpx;
}
/* 已添加物料列表 */
.list-section {
margin-bottom: 24rpx;
}
.section-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16rpx;
}
.section-title {
font-size: 30rpx;
font-weight: 500;
color: #333;
}
.item-card {
background: #fff;
border-radius: 16rpx;
padding: 24rpx 28rpx;
margin-bottom: 16rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
display: flex;
align-items: center;
justify-content: space-between;
}
.item-body {
flex: 1;
margin-right: 20rpx;
}
.item-row {
display: flex;
justify-content: space-between;
padding: 8rpx 0;
}
.item-label {
font-size: 26rpx;
color: #999;
}
.item-value {
font-size: 26rpx;
color: #333;
}
.item-value.highlight {
color: #1890ff;
font-weight: 500;
}
.item-delete {
padding: 8rpx;
}
/* 空状态 */
.empty-state {
background: #fff;
border-radius: 16rpx;
padding: 60rpx 0;
margin-bottom: 24rpx;
display: flex;
align-items: center;
justify-content: center;
}
.empty-text {
font-size: 28rpx;
color: #ccc;
}
/* 底部按钮 */
.btn-section {
padding: 8rpx 0 24rpx;
}
.btn {
font-size: 30rpx;
border-radius: 12rpx;
margin-bottom: 20rpx;
}
.btn-primary {
background: #1890ff;
color: #fff;
}
.btn-danger {
background: #d42427;
color: #fff;
}
.btn-success {
background: #0fe825;
color: #fff;
}
.btn-primary[disabled] {
background: #b0d4f5;
color: #fff;
}
.btn-default {
background: #fff;
color: #666;
border: 1rpx solid #d9d9d9;
}
</style>

View File

@@ -0,0 +1,269 @@
<template>
<view class="page-container">
<!-- 任务信息 -->
<view class="task-info" v-if="taskNo">
<text class="task-label">任务编号</text>
<text class="task-value">{{ taskNo }}</text>
</view>
<!-- 扫码区域 -->
<view class="scan-section">
<view class="scan-header">
<text class="scan-title">托盘条码</text>
<view class="scan-btn" @click="startScan">
<uni-icons type="scan" size="18" color="#52c41a"></uni-icons>
<text class="scan-btn-text green">扫码</text>
</view>
</view>
<view class="input-wrap">
<input class="scan-input" v-model="barcode" placeholder="请输入或扫描托盘条码"
@confirm="handleBarcode" focus />
</view>
</view>
<!-- 操作按钮 -->
<view class="btn-section">
<button class="btn btn-success" @click="submitSupply">生成绑定信息</button>
<button class="btn btn-default" @click="resetForm">重置</button>
</view>
</view>
</template>
<script>
import { getMaterialByBarcode, submitSupplyInbound, submitAddEmptyTrayJob} from '@/api/warehouse/inbound'
export default {
data() {
return {
taskNo: '',
barcode: '',
materialInfo: null,
form: {
lineCode: '',
stationCode: '',
quantity: '',
reason: ''
}
}
},
onLoad(options) {
if (options.taskNo) {
this.taskNo = options.taskNo
}
},
methods: {
startScan() {
var that = this
uni.scanCode({
onlyFromCamera: false,
scanType: ['barCode', 'qrCode'],
success: function(res) {
that.barcode = res.result
that.handleBarcode()
}
})
},
handleBarcode() {
if (!this.barcode) {
this.$modal.msg('请输入物料条码')
return
}
var that = this
getMaterialByBarcode(this.barcode).then(function(res) {
that.materialInfo = res.data
that.$modal.msgSuccess('物料信息获取成功')
}).catch(function() {
that.materialInfo = null
})
},
submitSupply() {
if (!this.barcode) {
this.$modal.msg('请输入托盘条码')
return
}
var data = {
barcode: this.barcode,
}
var that = this
submitAddEmptyTrayJob(data).then(function() {
that.$modal.msgSuccess('绑定操作成功')
that.resetForm()
})
},
resetForm() {
this.barcode = ''
this.materialInfo = null
this.form = {
lineCode: '',
stationCode: '',
quantity: '',
reason: ''
}
}
}
}
</script>
<style lang="scss" scoped>
page {
background-color: #f5f7fa;
min-height: 100%;
}
.page-container {
padding: 24rpx;
}
.task-info {
background: #f6ffed;
border-radius: 12rpx;
padding: 20rpx 24rpx;
margin-bottom: 24rpx;
display: flex;
justify-content: space-between;
align-items: center;
}
.task-label {
font-size: 26rpx;
color: #52c41a;
}
.task-value {
font-size: 26rpx;
color: #333;
font-weight: 500;
}
.scan-section {
background: #fff;
border-radius: 16rpx;
padding: 28rpx;
margin-bottom: 24rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
}
.scan-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
}
.scan-title {
font-size: 30rpx;
font-weight: 500;
color: #333;
}
.scan-btn {
display: flex;
align-items: center;
padding: 8rpx 20rpx;
border: 1rpx solid #52c41a;
border-radius: 8rpx;
}
.scan-btn-text {
font-size: 24rpx;
color: #1890ff;
margin-left: 8rpx;
}
.scan-btn-text.green {
color: #52c41a;
}
.input-wrap {
border: 1rpx solid #e8e8e8;
border-radius: 8rpx;
padding: 5rpx;
}
.scan-input {
font-size: 28rpx;
padding: 16rpx;
word-break: break-all;
width: 100%;
height: auto;
line-height: 1.4;
}
.form-section {
background: #fff;
border-radius: 16rpx;
padding: 28rpx;
margin-bottom: 24rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
}
.form-title {
font-size: 30rpx;
font-weight: 500;
color: #333;
margin-bottom: 24rpx;
padding-bottom: 16rpx;
border-bottom: 1rpx solid #f0f0f0;
}
.form-item {
display: flex;
align-items: center;
padding: 16rpx 0;
}
.form-label {
font-size: 28rpx;
color: #666;
width: 160rpx;
flex-shrink: 0;
}
.form-input {
flex: 1;
font-size: 28rpx;
border: 1rpx solid #e8e8e8;
border-radius: 8rpx;
padding: 16rpx;
}
.info-row {
display: flex;
justify-content: space-between;
padding: 16rpx 0;
border-bottom: 1rpx solid #f5f5f5;
}
.info-label {
font-size: 28rpx;
color: #999;
}
.info-value {
font-size: 28rpx;
color: #333;
}
.btn-section {
padding: 24rpx 0;
}
.btn {
font-size: 30rpx;
border-radius: 12rpx;
margin-bottom: 20rpx;
}
.btn-success {
background: #52c41a;
color: #fff;
}
.btn-default {
background: #fff;
color: #666;
border: 1rpx solid #d9d9d9;
}
</style>

View File

@@ -0,0 +1,274 @@
<template>
<view class="page-container">
<!-- 任务信息 -->
<view class="task-info" v-if="taskNo">
<text class="task-label">出库任务编号</text>
<text class="task-value">{{ taskNo }}</text>
</view>
<!-- 扫码区域 -->
<view class="scan-section">
<view class="scan-header">
<text class="scan-title">1.选择立库区域</text>
</view>
<picker mode="selector" :range="cargoAreaOptions" @change="onCargoAreaChange">
<view class="form-input picker-text">
{{ selectedCargoArea || '请选择库区' }}
</view>
</picker>
</view>
<view class="scan-section">
<view class="scan-header">
<text class="scan-title">2.选择托盘类型</text>
</view>
<picker mode="selector" :range="palletTypeOptions" @change="onPalletTypeChange">
<view class="form-input picker-text">
{{ selectedPalletType || '请选择托盘类型' }}
</view>
</picker>
</view>
<!-- 操作按钮 -->
<view class="btn-section" >
<button class="btn btn-orange" @click="handleCallContainer">呼叫容器出库</button>
<button class="btn btn-default" @click="resetForm">重置</button>
</view>
</view>
</template>
<script>
import { getOutboundDetail, callStockOutForContainer, confirmOutbound } from '@/api/warehouse/outbound'
export default {
data() {
return {
taskNo: '',
barcode: '',
traCode: '',
outboundInfo: null,
confirmQty: '',
form: {
remark: ''
},
// 新增:下拉框选项与选中状态
cargoAreaOptions: ['01', '02', '03', '04'],
palletTypeOptions: [1, 2, 3],
selectedCargoArea: '', // 库区
selectedPalletType: '' // 托盘类型
}
},
onLoad(options) {
if (options.taskNo) {
this.taskNo = options.taskNo
}
},
methods: {
// 处理库区选择
onCargoAreaChange(e) {
this.selectedCargoArea = this.cargoAreaOptions[e.detail.value]
},
// 处理托盘类型选择
onPalletTypeChange(e) {
this.selectedPalletType = this.palletTypeOptions[e.detail.value]
},
// 呼叫空托出库逻辑
handleCallContainer() {
if (!this.selectedCargoArea || !this.selectedPalletType) {
this.$modal.msg('请先选择库区和托盘类型')
return
}
uni.showLoading({ title: '呼叫中...' })
callStockOutForContainer(this.selectedCargoArea, this.selectedPalletType)
.then(res => {
uni.hideLoading()
this.$modal.msgSuccess('呼叫空托出库成功')
})
.catch(err => {
uni.hideLoading()
// this.$modal.msg('网络异常,请稍后重试')
})
},
resetForm() {
this.selectedCargoArea = ''
this.selectedPalletType = ''
}
}
}
</script>
<style lang="scss" scoped>
page {
background-color: #f5f7fa;
min-height: 100%;
}
.page-container {
padding: 24rpx;
}
.task-info {
background: #fff7e6;
border-radius: 12rpx;
padding: 20rpx 24rpx;
margin-bottom: 24rpx;
display: flex;
justify-content: space-between;
align-items: center;
}
.task-label {
font-size: 26rpx;
color: #fa8c16;
}
.task-value {
font-size: 26rpx;
color: #333;
font-weight: 500;
}
.scan-section {
background: #fff;
border-radius: 16rpx;
padding: 28rpx;
margin-bottom: 24rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
}
.scan-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
}
.scan-title {
font-size: 30rpx;
font-weight: 500;
color: #333;
}
.scan-btn {
display: flex;
align-items: center;
padding: 8rpx 20rpx;
border: 1rpx solid #fa8c16;
border-radius: 8rpx;
}
.scan-btn-text {
font-size: 24rpx;
margin-left: 8rpx;
}
.scan-btn-text.orange {
color: #fa8c16;
}
.scan-input {
font-size: 28rpx;
padding: 16rpx;
word-break: break-all;
width: 100%;
height: auto;
line-height: 1.4;
}
.form-section {
background: #fff;
border-radius: 16rpx;
padding: 28rpx;
margin-bottom: 24rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
}
.form-title {
font-size: 30rpx;
font-weight: 500;
color: #333;
margin-bottom: 24rpx;
padding-bottom: 16rpx;
border-bottom: 1rpx solid #f0f0f0;
}
.form-item {
display: flex;
align-items: center;
padding: 16rpx 0;
}
.form-label {
font-size: 28rpx;
color: #666;
width: 160rpx;
flex-shrink: 0;
}
.form-input {
flex: 1;
font-size: 28rpx;
border: 1rpx solid #e8e8e8;
border-radius: 8rpx;
padding: 16rpx;
width: 100%;
height: auto;
line-height: 1.4;
}
.info-row {
display: flex;
justify-content: space-between;
padding: 16rpx 0;
border-bottom: 1rpx solid #f5f5f5;
}
.info-label {
font-size: 28rpx;
color: #999;
}
.info-value {
font-size: 28rpx;
color: #333;
}
.info-value.highlight {
color: #fa8c16;
font-weight: 500;
}
.btn-section {
padding: 24rpx 0;
}
.btn {
font-size: 30rpx;
border-radius: 12rpx;
margin-bottom: 20rpx;
}
.btn-orange {
background: #fa8c16;
color: #fff;
}
.btn-default {
background: #fff;
color: #666;
border: 1rpx solid #d9d9d9;
}
.picker-text {
display: flex;
align-items: center;
color: #767676;
}
</style>

View File

@@ -0,0 +1,440 @@
<template>
<view class="page-container">
<!-- 任务信息 -->
<view class="task-info" v-if="taskNo">
<text class="task-label">出库任务编号</text>
<text class="task-value">{{ taskNo }}</text>
</view>
<!-- 扫码区域 -->
<view class="scan-section">
<view class="scan-header">
<text class="scan-title">扫描出库托盘条码</text>
<view class="scan-btn" @click="startScan">
<uni-icons type="scan" size="18" color="#fa8c16"></uni-icons>
<text class="scan-btn-text orange">扫码</text>
</view>
</view>
<view class="input-wrap">
<input class="scan-input" v-model="barcode" placeholder="请输入或扫描托盘条码"
@confirm="handleBarcode" focus />
</view>
</view>
<!-- 出库信息 -->
<view class="form-section" v-for="(item, index) in outboundList" :key="index">
<view class="scan-header">
<text class="scan-title">出库信息</text>
<view class="info-btn">
<button class="scan-btn-text orange" @click="confirmSingleOutbound(item)">确认出库</button>
</view>
</view>
<view class="info-row">
<text class="info-label">版辊编号</text>
<text class="info-value">{{ item.rollerNumber }}</text>
</view>
<view class="info-row">
<text class="info-label">托盘库存数量</text>
<text class="info-value">{{ item.stockQuantity }}</text>
</view>
<view class="info-row">
<text class="info-label">出库数量</text>
<!-- <text class="info-value">{{ item.outQuantity }}</text> -->
<input
class="form-section-input"
type="number"
v-model="item.outQuantity"
:value="item.outQuantity || 0"
placeholder="0"
/>
</view>
<view class="btn-group">
<button class="btn-max btn-reset" @click="resetItemQty(item)">重置</button>
<button class="btn-max" @click="setMaxQty(item)">最大</button>
</view>
</view>
<!-- 操作按钮 -->
<view class="btn-section" >
<button class="btn btn-orange" v-if="outboundList" @click="stockoutComplete">托盘确认出库</button>
<button class="btn btn-default" @click="resetForm">重置</button>
</view>
</view>
</template>
<script>
import { getOutboundDetail, getTrayCodeDetail, confirmOutbound, stockoutTrayCodeComplete } from '@/api/warehouse/outbound'
export default {
data() {
return {
taskNo: '',
barcode: '',
traCode: '',
outboundInfo: null,
outboundList: [],
confirmQty: '',
form: {
remark: ''
}
}
},
onLoad(options) {
if (options.taskNo) {
this.taskNo = options.taskNo
}
},
methods: {
startScan() {
var that = this
uni.scanCode({
onlyFromCamera: false,
scanType: ['barCode', 'qrCode'],
success: function(res) {
that.barcode = res.result
that.handleBarcode()
}
})
},
handleBarcode() {
if (!this.barcode) {
this.$modal.msg('请输入托盘条码')
return
}
var that = this
// var params = { taskNo: this.taskNo, barcode: this.barcode }
var params = { barcode: this.barcode }
getTrayCodeDetail(this.barcode).then(function(res) {
if (Array.isArray(res.data)) {
that.outboundList = res.data
} else if (res.data) {
that.outboundList = [res.data]
} else {
that.outboundList = []
}
if (that.outboundList.length > 0) {
that.$modal.msgSuccess('获取到 ' + that.outboundList.length + ' 条出库信息')
} else {
that.$modal.msg('未找到该托盘信息')
}
}).catch(function() {
that.outboundList = []
// that.$modal.msg('未找到该托盘信息,可能是未分配单据或已出库完成')
})
},
// 新增:确认单条出库请求
confirmSingleOutbound(item) {
// 构造你需要的参数
var params = {
barcode: item.rollerNumber,
outQuantity: item.outQuantity
}
uni.showLoading({ title: '提交中...' })
// TODO: 替换为你实际的后端确认接口
confirmOutbound(params).then(res => {
uni.hideLoading()
this.$modal.msgSuccess('版辊 ' + item.rollerNumber + ' 出库成功')
// 可选:出库成功后从列表中移除该项,避免重复点击
this.outboundList = this.outboundList.filter(i => i.rollerNumber !== item.rollerNumber)
}).catch(err => {
// uni.hideLoading()
// this.$modal.msg('出库失败', err)
})
},
//版辊出库数量确认
confirmOutbound() {
if (!this.barcode) {
this.$modal.msg('请输入托盘号')
return
}
// if (!this.confirmQty) {
// this.$modal.msg('请输入实际数量')
// return
// }
var data = {
taskNo: this.taskNo,
barcode: this.barcode,
quantity: this.confirmQty,
remark: this.form.remark
}
var that = this
confirmOutbound(data).then(function() {
that.$modal.msg('出库确认完成')
that.resetForm()
}).catch(() => {
// 全局拦截器通常已处理错误弹窗,这里可只处理状态重置
console.log('出库确认失败')
})
},
//托盘物料出库完成确认
stockoutComplete() {
if (!this.barcode) {
this.$modal.msg('请输入托盘号')
return
}
// var data = {
// // taskNo: this.taskNo,
// barcode: this.barcode,
// }
// console.log(this.barcode)
// var that = this
stockoutTrayCodeComplete(this.barcode).then(() => {
that.$modal.msgSuccess(this.barcode + '出库确认成功')
that.resetForm()
}).catch(() => {
// 全局拦截器通常已处理错误弹窗,这里可只处理状态重置
// console.log('出库确认失败')
})
},
resetItemQty(item) {
item.outQuantity = 0; // 或者重置为后端返回的默认数量
},
setMaxQty(item) {
// 假设最大数量就是 item 初始带的某个字段,比如 maxQuantity
// 如果没有这个字段,你可以写死一个值,或者使用 item.outQuantity 的某个上限
if (item.maxQuantity !== undefined) {
item.outQuantity = item.maxQuantity;
} else {
// 兜底逻辑:如果后端没传最大数量字段,你可以自定义一个默认最大值
item.outQuantity = 1;
}
},
resetForm() {
this.barcode = ''
this.outboundInfo = null
this.outboundList = []
this.confirmQty = ''
this.form = {
remark: ''
}
}
}
}
</script>
<style lang="scss" scoped>
page {
background-color: #f5f7fa;
min-height: 100%;
}
.page-container {
padding: 24rpx;
}
.task-info {
background: #fff7e6;
border-radius: 12rpx;
padding: 20rpx 24rpx;
margin-bottom: 24rpx;
display: flex;
justify-content: space-between;
align-items: center;
}
.task-label {
font-size: 26rpx;
color: #fa8c16;
}
.task-value {
font-size: 26rpx;
color: #333;
font-weight: 500;
}
.scan-section {
background: #fff;
border-radius: 16rpx;
padding: 28rpx;
margin-bottom: 24rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
}
.scan-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
}
.scan-title {
font-size: 30rpx;
font-weight: 500;
color: #333;
}
.scan-btn {
display: flex;
align-items: center;
padding: 8rpx 20rpx;
border: 1rpx solid #fa8c16;
border-radius: 8rpx;
}
.scan-btn-text {
font-size: 24rpx;
margin-left: 8rpx;
}
.scan-btn-text.orange {
color: #fa8c16;
}
.input-wrap {
border: 1rpx solid #e8e8e8;
border-radius: 8rpx;
padding: 4rpx;
}
.scan-input {
font-size: 28rpx;
padding: 16rpx;
word-break: break-all;
width: 100%;
height: auto;
line-height: 1.4;
}
.form-section {
background: #fff;
border-radius: 16rpx;
padding: 28rpx;
margin-bottom: 24rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
}
.form-title {
font-size: 30rpx;
font-weight: 500;
color: #333;
margin-bottom: 24rpx;
padding-bottom: 16rpx;
border-bottom: 1rpx solid #f0f0f0;
}
.form-section-input {
flex: 1;
font-size: 28rpx; /* ✅ 关键:字体大小必须与 label 一致 */
color: #333;
text-align: right; /* ✅ 关键:内容靠右对齐 */
height: 28rpx; /* ✅ 关键:明确设置高度 */
line-height: 28rpx; /* ✅ 关键:行高必须与 label 完全一致,解决多端对齐差异 */
padding: 0; /* ✅ 关键:清除 input 默认的 padding,防止错位 */
margin: 0; /* 清除默认 margin */
border: none; /* 如果需要无边框效果 */
}
.form-item {
display: flex;
align-items: center;
padding: 16rpx 0;
}
.form-label {
font-size: 28rpx;
color: #666;
width: 160rpx;
flex-shrink: 0;
}
.form-input {
flex: 1;
font-size: 28rpx;
border: 1rpx solid #e8e8e8;
border-radius: 8rpx;
padding: 16rpx;
width: 100%;
height: auto;
line-height: 1.4;
}
.info-row {
display: flex;
justify-content: space-between;
padding: 12rpx 0;
border-bottom: 1rpx solid #f5f5f5;
}
.info-label {
font-size: 28rpx;
color: #999;
}
.info-value {
font-size: 28rpx;
color: #333;
}
.info-value.highlight {
color: #fa8c16;
font-weight: 500;
}
.btn-section {
padding: 24rpx 0;
}
.btn {
font-size: 30rpx;
border-radius: 12rpx;
margin-bottom: 20rpx;
}
.btn-orange {
background: #fa8c16;
color: #fff;
}
.btn-default {
background: #fff;
color: #666;
border: 1rpx solid #d9d9d9;
}
/* ✅ 新增:按钮组容器,让两个按钮并排 */
.btn-group {
display: flex;
align-items: center;
margin-left: 16rpx; /* 与输入框的间距 */
margin-top: 10rpx;
}
/* 按钮基础样式(最大按钮) */
.btn-max {
font-size: 22rpx;
color: #fafafa;
background-color: #fa8c16;
border: 1rpx solid #fa8c16;
border-radius: 8rpx;
padding: 0 100rpx;
height: 50rpx;
line-height: 50rpx;
flex-shrink: 0;
}
/* ✅ 新增:重置按钮样式(与最大按钮之间留一点间距) */
.btn-reset {
color: #fa8c16;
margin-right: 12rpx;
background-color: #fff7e6;
}
</style>

View File

@@ -10,10 +10,9 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.log.domain.RequestLog;
import com.ruoyi.log.service.IRequestLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@RequestMapping("/api/wmsService/wcs")
@@ -37,6 +36,19 @@ public class WcsServiceController extends BaseController {
return ajaxResult;
}
/**
* 手动指定货位出库
*/
@PostMapping("/stockoutByManual")
public AjaxResult stockoutByManual(@RequestBody Map<String, String> params) {
AjaxResult ajaxResult = apiWcsService.stockoutByManual(params);
RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(params), "创建入库任务请求", ajaxResult);
requestLogService.insertRequestLog(requestLog);
return ajaxResult;
}
/**
* 请求补码作业
*/

View File

@@ -15,7 +15,7 @@ public interface IApiWcsService {
* 呼叫可用容器出库
* @return
*/
public AjaxResult callContainerOut(String cargoAreaId, Integer type);
public AjaxResult callContainerOut(Map<String, Object> params);
/**
* 响应wcs请求-下发入库任务

View File

@@ -21,6 +21,7 @@ import com.ruoyi.bas.stock.service.IBasStockInfoService;
import com.ruoyi.bas.stock.service.IBasStockService;
import com.ruoyi.common.*;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.in.bind.domain.InTrayMsg;
import com.ruoyi.in.bind.service.IInTrayMsgService;
@@ -38,6 +39,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestParam;
import java.math.BigDecimal;
import java.util.*;
@@ -85,26 +87,29 @@ public class ApiWcsService implements IApiWcsService {
* @return
*/
@Transactional(rollbackFor = Exception.class)
public AjaxResult callContainerOut(String cargoAreaId, Integer type){
public AjaxResult callContainerOut(Map<String, Object> params){
String cargoAreaId = (String) params.get("cargoAreaId");
int type = Convert.toInt(params.get("palletType"), 0);
//获取立库区域和托盘类型
List<BasCargoSpace> basCargoSpaces = basCargoSpaceService.selectAllBasCargoSpaceForStockout(
List<BasCargoSpace> basCargoSpaceEmptyTray = basCargoSpaceService.selectBasCargoSpaceListForEmptyTray(
new BasCargoSpace().builder().cargoAreaId(cargoAreaId).theType(type).build()
);
// List<BasCargoSpace> basCargoSpaceContainer = basCargoSpaceService.selectBasCargoSpaceListForContainer(
// new BasCargoSpace().builder().cargoAreaId(cargoAreaId).theType(type).build()
// );
List<BasStock> stocks = basStockService.selectBasStockList(
new BasStock().builder().productId("KTP0001").stockStatus("1").build()
);
if (stocks.isEmpty()) {
if (basCargoSpaceEmptyTray.isEmpty()) {
log.info("【呼叫容器】空容器呼叫失败,无可用的空容器库存");
//todo 此处可查存放库存较少的托盘出库
}else{
BasStock stock = stocks.get(0);
//要执行容器出库的货位
BasCargoSpace cargoSpaceCurrent = basCargoSpaceEmptyTray.get(0);
//检查出库货位是否触发移库作业 - 双伸货位出库查询单伸是否有货
BasCargoSpace cargoSpaceCurrent = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(stock.getCargoSpaceId());//要出库的货位
if (cargoSpaceCurrent.getIssDouble().equals(CargoSpaceCode.CARGOSPACE_ISDOUBLE_Y)){//是否处于双伸位
BasCargoSpace cargoSpaceInSide = basCargoSpaceService.selectAnotherBasCargoSpaceBySameGroup(cargoSpaceCurrent);//获取【要出库货位】对应的【单伸货位】
//如果外侧有货,先执行移库
@@ -159,9 +164,14 @@ public class ApiWcsService implements IApiWcsService {
"【空托出库-移库】推送成功,作业号:{},托盘条码:{},移库货位:{},目标货位:{}", moveJob.getJobId(), moveJob.getTrayCode(), moveJob.getCargoSpaceId(), moveJob.getTargetCargoSpaceId()
);
//更新库存表货位【占用】状态
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
basStockService.updateBasStock(stock);
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(cargoSpaceCurrent.getTrayCode());
if (!stocks.isEmpty()){
for (BasStock stock : stocks) {
//更新库存表货位【占用】状态
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
basStockService.updateBasStock(stock);
}
}
//更新货位表【预占用】状态
basCargoSpaceService.updateBasCargoSpaceStatus(cargoSpaceInSide.getCargoSpaceId(),cargoSpaceInSide.getTrayCode(),CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKOUT);
@@ -174,34 +184,40 @@ public class ApiWcsService implements IApiWcsService {
}
if (basCargoSpaces.stream().anyMatch(s -> s.getCargoSpaceId().equals(stock.getCargoSpaceId()))) {
//生成空托出库作业
if (mydoJobService.selectMydoJobByTrayCode(stock.getTrayCode()) == null) {
//库存号 - 用于获取托盘号
BasStockInfo stockInfo = basStockInfoService.selectBasStockInfoByStockId(stock.getStockId());
//作业号
String jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKOUT_EMPTY_PALLET);
String taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKOUT_EMPTY_PALLET);
//判断托盘【未满】或【空】区分任务类型
int taskType = TaskType.TASKTYPE_STOCKOUT_EMPTY_TRAY;
MydoJob mydoJob = new MydoJob().builder()
.jobId(jobId)
.taskNo(taskNo)
.inOrOut(taskType)
.trayCode(stockInfo.getTrayCode())
.status(TaskStatusEnum.READY.getCode())
.cargoSpaceId(stock.getCargoSpaceId())
.trayType(type)
.executionPhase("0")
.warehouseId("01")
.build();
mydoJobService.insertMydoJob(mydoJob);
//生成容器出库作业
MydoJob job = mydoJobService.selectMydoJobByTrayCode(cargoSpaceCurrent.getTrayCode());
if (ObjUtil.isNull(job)) {
//库存号 - 用于判断容器是【空托】或者【带货托盘】
BasStockInfo stockInfo = basStockInfoService.selectBasStockInfoByTrayCode(cargoSpaceCurrent.getTrayCode());
//判断托盘【未满】或【空】区分任务类型
String jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKOUT_EMPTY_PALLET);
String taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKOUT_EMPTY_PALLET);
int taskType = TaskType.TASKTYPE_STOCKOUT_EMPTY_TRAY;
if (stockInfo.getEmptyStatus() > 0){
taskType = TaskType.TASKTYPE_STOCKOUT_CONTAINER;
}
MydoJob mydoJob = new MydoJob().builder()
.jobId(jobId)
.taskNo(taskNo)
.inOrOut(taskType)
.trayCode(cargoSpaceCurrent.getTrayCode())
.status(TaskStatusEnum.READY.getCode())
.cargoSpaceId(cargoSpaceCurrent.getCargoSpaceId())
.trayType(type)
.executionPhase("0")
.warehouseId("01")
.build();
mydoJobService.insertMydoJob(mydoJob);
}
return AjaxResult.success();
}
return AjaxResult.success();
return AjaxResult.error();
}
@@ -245,27 +261,16 @@ public class ApiWcsService implements IApiWcsService {
return AjaxResult.error("未找到该托盘的绑定信息,请确认是否有绑定操作");
}
//--------------------------- 入库货位分配 ---------------------------
//区分高矮货,只能在堆垛机上获取货物高度,高货位可放全部高度的托盘
BasCargoSpace cargoParam;
if (wcsStockinReiceive.getHeight() == 1){
//低货位380H - 不限制高度
cargoParam = new BasCargoSpace().builder().theType(type).cargoAreaId(wcsStockinReiceive.getCargoAreaId()).build();
}else{
//高货位510H - 只能放指定层高的货位
cargoParam = new BasCargoSpace().builder().theType(type).cargoAreaId(wcsStockinReiceive.getCargoAreaId()).theHeight(wcsStockinReiceive.getHeight()).build();
}
BasCargoSpace cargoStockin = basCargoSpaceService.selectBasCargoSpaceForStockin(cargoParam);
if (cargoParam == null) {
log.warn("【货位分配】该类型托盘立库中无可用货位");
return AjaxResult.error("【货位分配失败】该类型托盘立库中无可用货位");
}
//检查当前条码是否已经生成作业
MydoJob mydoJob = mydoJobService.selectMydoJobByTrayCode(wcsStockinReiceive.getTrayCode());
String jobId;
String taskNo;
int taskType;
String instockinId;
String instockinDetailId;
BasCargoSpace basCargoSpace;
//>>>判断入库类型
if (trayMsgs.stream().anyMatch(s -> s.getProductId().equals(ProductType.EMPTY_TRAY))){
@@ -288,11 +293,25 @@ public class ApiWcsService implements IApiWcsService {
}
//检查当前条码是否已经生成作业
MydoJob mydoJob = mydoJobService.selectMydoJobByTrayCode(wcsStockinReiceive.getTrayCode());
if (ObjUtil.isEmpty(mydoJob)) {
//--------------------------- 入库货位分配 ---------------------------
//区分高矮货,只能在堆垛机上获取货物高度,高货位可放全部高度的托盘
BasCargoSpace cargoParam;
if (wcsStockinReiceive.getHeight() == 1){
//低货位380H - 不限制高度
cargoParam = new BasCargoSpace().builder().theType(type).cargoAreaId(wcsStockinReiceive.getCargoAreaId()).build();
}else{
//高货位510H - 只能放指定层高的货位
cargoParam = new BasCargoSpace().builder().theType(type).cargoAreaId(wcsStockinReiceive.getCargoAreaId()).theHeight(wcsStockinReiceive.getHeight()).build();
}
BasCargoSpace cargoStockin = basCargoSpaceService.selectBasCargoSpaceForStockin(cargoParam);
basCargoSpace = cargoStockin;
if (cargoParam == null) {
log.warn("【货位分配】该类型托盘立库中无可用货位");
return AjaxResult.error("【货位分配失败】该类型托盘立库中无可用货位");
}
//>>>生成wms的入库主作业
MydoJob mydoJobNew = new MydoJob().builder()
.jobId(jobId)
@@ -314,6 +333,7 @@ public class ApiWcsService implements IApiWcsService {
log.info("【wms生成入库】<空托入库>作业,作业号:{},任务号:{},托盘号:{},分配货位:{}",mydoJobNew.getJobId() ,mydoJobNew.getTaskNo() ,mydoJobNew.getTrayCode(), cargoStockin.getCargoSpaceId());
}else{
log.info("【提示】<常规入库>wms已存在该条码作业,托盘号:{}",mydoJob.getTrayCode());
basCargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(mydoJob.getCargoSpaceId());
}
//>>>根据绑定物料信息条数循环生成子作业,单条绑定信息对应一条子任务
@@ -347,7 +367,6 @@ public class ApiWcsService implements IApiWcsService {
.build();
mydoJobDetailService.insertMydoJobDetail(detail);
}
}else {
instockinId = trayMsg.getStockinId();
instockinDetailId = trayMsg.getStockinDetailId() + sum;
@@ -368,7 +387,7 @@ public class ApiWcsService implements IApiWcsService {
.stockinId(instockinId)
.stockinDetailId(instockinDetailId)
.status(0)
.trayType(cargoStockin.getTheType())
.trayType(type)
.build();
mydoJobDetailService.insertMydoJobDetail(detail);
}
@@ -378,8 +397,8 @@ public class ApiWcsService implements IApiWcsService {
}
//货位状态更新为【入库预占用】
cargoStockin.setStatus(CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKIN);
basCargoSpaceService.updateBasCargoSpace(cargoStockin);
basCargoSpace.setStatus(CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKIN);
basCargoSpaceService.updateBasCargoSpace(basCargoSpace);
//返回wcs的响应信息
WcsStockinResponse response = new WcsStockinResponse()
@@ -389,10 +408,10 @@ public class ApiWcsService implements IApiWcsService {
.taskNo(taskNo)
.taskType(taskType)
.trayCode(wcsStockinReiceive.getTrayCode())
.cargoSpaceId(cargoStockin.getCargoSpaceId())
.cargoSpaceId(basCargoSpace.getCargoSpaceId())
.build();
log.info("【wms请求响应】<常规入库>响应信息,作业号:{},任务号:{},分配货位:{}",jobId ,taskNo, cargoStockin.getCargoSpaceId());
log.info("【wms请求响应】<常规入库>响应信息,作业号:{},任务号:{},分配货位:{}",jobId ,taskNo, basCargoSpace.getCargoSpaceId());
return AjaxResult.success(response);
@@ -401,28 +420,31 @@ public class ApiWcsService implements IApiWcsService {
/**
* 指定货位出库
* @param cargoSpaceId
* @param params
* @return
*/
@Transactional(rollbackFor = Exception.class)
public AjaxResult stockoutByManual(String cargoSpaceId){
public AjaxResult stockoutByManual(Map<String, String> params){
String cargoSpaceId = params.get("cargoSpaceId");
BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(cargoSpaceId);
if (ObjUtil.isNull(cargoSpace)){
log.warn("【操作失败】找不到该货位,可能是货位信息错误,请联系管理员,货位号:", cargoSpaceId);
log.warn("【操作失败】找不到该货位,可能是货位异常或参数错误,请联系管理员,货位号:", cargoSpaceId);
return AjaxResult.error("找不到该货位信息");
}
if (!cargoSpace.getStatus().equals(CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED)){
log.warn("【操作失败】该货位已被其它任务预占用,请等待任务执行完成后重试,货位号:", cargoSpaceId);
return AjaxResult.error("该货位已被其它任务预占用,请等待任务执行完成后重试");
}
// if (!cargoSpace.getStatus().equals(CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED)){
// log.warn("【操作失败】该货位已被其它任务预占用,请等待任务执行完成后重试,货位号:", cargoSpaceId);
// return AjaxResult.error("该货位已被其它任务预占用,请等待任务执行完成后重试");
// }
MydoJob job = mydoJobService.selectMydoJobByTrayCode(cargoSpace.getTrayCode());
if (ObjUtil.isNull(job)){
String jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKIN_EMPTY_PALLET);
String taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKIN_EMPTY_PALLET);
int taskType = TaskType.TASKTYPE_STOCKIN_EMPTY_TRAY;
String jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKOUT_MANUAL);
String taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKOUT);
int taskType = TaskType.TASKTYPE_STOCKOUT_MANUAL;
MydoJob mydoJob = new MydoJob().builder()
.jobId(jobId)
@@ -441,7 +463,7 @@ public class ApiWcsService implements IApiWcsService {
.build();
mydoJobService.insertMydoJob(mydoJob);
log.info("【wms生成出库】<指定货位出库>作业,作业号:{},任务号:{},托盘号:{},分配货位:{}",mydoJob.getJobId() ,mydoJob.getTaskNo() ,mydoJob.getTrayCode(), cargoSpaceId);
log.info("【wms生成出库】<指定货位出库>作业,作业号:{},任务号:{},托盘号:{},出库货位:{}",mydoJob.getJobId() ,mydoJob.getTaskNo() ,mydoJob.getTrayCode(), cargoSpaceId);
List<BasStock> stocks = basStockService.selectBasStockList(
new BasStock().builder().cargoSpaceId(cargoSpaceId).build()

View File

@@ -29,6 +29,22 @@ public interface BasCargoSpaceMapper
*/
public List<BasCargoSpace> selectBasCargoSpaceList(BasCargoSpace basCargoSpace);
/**
* 查询货位信息列表 - 空托盘
*
* @param basCargoSpace 货位信息
* @return 货位信息集合
*/
public List<BasCargoSpace> selectBasCargoSpaceListForEmptyTray(BasCargoSpace basCargoSpace);
/**
* 查询货位信息列表 - 带货容器
*
* @param basCargoSpace 货位信息
* @return 货位信息集合
*/
public List<BasCargoSpace> selectBasCargoSpaceListForContainer(BasCargoSpace basCargoSpace);
/**
* 新增货位信息
*
@@ -66,6 +82,7 @@ public interface BasCargoSpaceMapper
* @return
*/
List<BasCargoSpaceStatus> selectBasCargoSpaceListByGroupByStatus(BasCargoSpace basCargoSpace);
/**
* 查询排列表
* @param basCargoSpace

View File

@@ -29,6 +29,24 @@ public interface IBasCargoSpaceService
public List<BasCargoSpace> selectBasCargoSpaceList(BasCargoSpace basCargoSpace);
/**
* 查询货位信息列表 - 空托盘
*
* @param basCargoSpace 货位信息
* @return 货位信息集合
*/
public List<BasCargoSpace> selectBasCargoSpaceListForEmptyTray(BasCargoSpace basCargoSpace);
/**
* 查询货位信息列表 - 非空载货托盘
*
* @param basCargoSpace 货位信息
* @return 货位信息集合
*/
public List<BasCargoSpace> selectBasCargoSpaceListForContainer(BasCargoSpace basCargoSpace);
/**
* 新增货位信息
*

View File

@@ -46,6 +46,30 @@ public class BasCargoSpaceServiceImpl implements IBasCargoSpaceService
return basCargoSpaceMapper.selectBasCargoSpaceList(basCargoSpace);
}
/**
* 查询货位信息列表 - 空托盘
*
* @param basCargoSpace 货位信息
* @return 货位信息
*/
@Override
public List<BasCargoSpace> selectBasCargoSpaceListForEmptyTray(BasCargoSpace basCargoSpace)
{
return basCargoSpaceMapper.selectBasCargoSpaceListForEmptyTray(basCargoSpace);
}
/**
* 查询货位信息列表 - 非空载货托盘
*
* @param basCargoSpace 货位信息
* @return 货位信息
*/
@Override
public List<BasCargoSpace> selectBasCargoSpaceListForContainer(BasCargoSpace basCargoSpace)
{
return basCargoSpaceMapper.selectBasCargoSpaceListForContainer(basCargoSpace);
}
/**
* 新增货位信息
*

View File

@@ -29,6 +29,15 @@ public interface BasStockMapper
public List<BasStock> selectBasStockList(BasStock basStock);
/**
* 查询库存信息列表
*
* @param basStock 库存信息
* @return 库存信息集合
*/
public List<BasStock> selectBasStockListForEmptyTray(BasStock basStock);
/**
* 查询指定物料的所有库存信息
* @param productId

View File

@@ -56,6 +56,14 @@ public interface IBasStockService
*/
public List<BasStock> selectBasStockList(BasStock basStock);
/**
* 查询空托盘库存信息列表
*
* @param basStock 库存信息
* @return 库存信息集合
*/
public List<BasStock> selectBasStockListForEmptyTray(BasStock basStock);
/**
* 新增库存信息

View File

@@ -91,6 +91,17 @@ public class BasStockServiceImpl implements IBasStockService
return basStockMapper.selectBasStockList(basStock);
}
/**
* 查询空托盘库存信息列表
*
* @param basStock 库存信息
* @return 库存信息集合
*/
@Override
public List<BasStock> selectBasStockListForEmptyTray(BasStock basStock){
return basStockMapper.selectBasStockListForEmptyTray(basStock);
}
/**
* 新增库存信息
*

View File

@@ -38,6 +38,11 @@ public class JobIdType {
*/
public static final String MYDOJOB_STOCKOUT = "CK";
/**
* 指定货位出库任务
*/
public static final String MYDOJOB_STOCKOUT_MANUAL = "ZC";
/**
* 移库任务
*/

View File

@@ -465,7 +465,8 @@ public class MydoJobServiceImpl implements IMydoJobService
//>>>>>>>>>>>>>>>>>>>>>>>常规(整托)出库\拣选出库\指定出库<<<<<<<<<<<<<<<<<<<<<<<<
//>>>>>>>>>>>>>>>>>>>>>>>常规(整托)出库\拣选出库\指定出库<<<<<<<<<<<<<<<<<<<<<<<<
//>>>>>>>>>>>>>>>>>>>>>>>常规(整托)出库\拣选出库\指定出库<<<<<<<<<<<<<<<<<<<<<<<<
if (type == TaskType.TASKTYPE_STOCKOUT || type == TaskType.TASKTYPE_STOCKOUT_PICKING || type == TaskType.TASKTYPE_STOCKOUT_MANUAL){
if (type == TaskType.TASKTYPE_STOCKOUT ||
type == TaskType.TASKTYPE_STOCKOUT_PICKING){
//子任务
List<MydoJobDetail> details = mydoJobDetailService.selectMydoJobDetailByJobId(jobId);
@@ -494,7 +495,6 @@ public class MydoJobServiceImpl implements IMydoJobService
outStockoutDetailService.updateOutStockoutDetail(outStockoutDetail);
log.info("【账务处理】移除库存信息,更新单据出库分配数量,作业号:{},库存编号:{},辊号:{}", jobId, detail.getStockinDetailId(), detail.getRollerNumber());
}
}
@@ -507,12 +507,6 @@ public class MydoJobServiceImpl implements IMydoJobService
//--------------------处理任务表和子任务表--------------------
//1.更新任务主表状态并移除作业
mydoJob.setStatus(TaskStatusEnum.AUTO_FINISHED.getCode());
// mydoJobMapper.updateMydoJob(mydoJob);
// deleteMydoJobByJobId(jobId);
//
// //2.并移除所有子作业
// mydoJobDetailService.insertMydoJobDetailsForJobFinish(jobId);
// mydoJobDetailService.deleteMydoJobDetailsByJobId(jobId);
log.info("【账务处理】出库完成,等待确认,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
@@ -520,6 +514,7 @@ public class MydoJobServiceImpl implements IMydoJobService
}
//>>>>>>>>>>>>>>>>>>>>> 移库任务 <<<<<<<<<<<<<<<<<<<<<<<<
//>>>>>>>>>>>>>>>>>>>>> 移库任务 <<<<<<<<<<<<<<<<<<<<<<<<
//>>>>>>>>>>>>>>>>>>>>> 移库任务 <<<<<<<<<<<<<<<<<<<<<<<<
@@ -561,6 +556,37 @@ public class MydoJobServiceImpl implements IMydoJobService
return AjaxResult.success();
}
//>>>>>>>>>>>>>>>>>>>>> 手动指定货位出库 <<<<<<<<<<<<<<<<<<<<<<<<
//>>>>>>>>>>>>>>>>>>>>> 手动指定货位出库 <<<<<<<<<<<<<<<<<<<<<<<<
//>>>>>>>>>>>>>>>>>>>>> 手动指定货位出库 <<<<<<<<<<<<<<<<<<<<<<<<
if (type == TaskType.TASKTYPE_STOCKOUT_MANUAL){
//--------------------处理库存信息--------------------
//移除指定辊号的库存明细
basStockService.deleteBasStockByTrayCode(mydoJob.getTrayCode());
basStockInfoService.deleteBasStockInfoByTrayCode(mydoJob.getTrayCode());
//--------------------更新货位状态--------------------
BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(mydoJob.getCargoSpaceId());
basCargoSpaceService.updateBasCargoSpaceStatus(cargoSpace.getCargoSpaceId(), "", CargoSpaceCode.CARGOSPACE_STATUS_AVAILABLE);
log.info("【账务处理-手动出库】更新货位状态,作业号:{},货位编号:{},托盘号:{}", jobId, cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode());
//--------------------处理任务表和子任务表--------------------
//1.更新任务主表状态并移除作业
mydoJob.setStatus(TaskStatusEnum.AUTO_FINISHED.getCode());
mydoJobMapper.updateMydoJob(mydoJob);
deleteMydoJobByJobId(jobId);
//2.并移除所有子作业
mydoJobDetailService.insertMydoJobDetailsForJobFinish(jobId);
mydoJobDetailService.deleteMydoJobDetailsByJobId(jobId);
log.info("【账务处理-手动出库】任务完成,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
return AjaxResult.success();
}
return AjaxResult.error();
}
@@ -581,13 +607,6 @@ public class MydoJobServiceImpl implements IMydoJobService
log.warn("【任务完成】查不到该作业,请检查作业状态,作业号:" + jobId);
return AjaxResult.error("查不到该作业,请检查作业状态");
}
//子任务
// List<MydoJobDetail> details = mydoJobDetailService.selectMydoJobDetailByJobId(jobId);
// if (details.isEmpty()){
// log.warn("【任务完成】查不到该作业对应的子单明细,请检查子单状态,任务号:" + jobId);
// return AjaxResult.error("查不到该作业对应的子单明细,请检查子单状态");
// }
//--------------------处理库存信息--------------------
//>>>>>>>>>>>>>>>>>>>>>>> 空托入库 <<<<<<<<<<<<<<<<<<<<<<<<
@@ -640,7 +659,6 @@ public class MydoJobServiceImpl implements IMydoJobService
);
log.info("【账务处理-空托盘】新增库存明细,作业号:{},库存编号:{},托盘号:{}", jobId, stockId, mydoJob.getTrayCode());
//--------------------更新货位状态--------------------
BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(mydoJob.getCargoSpaceId());
basCargoSpaceService.updateBasCargoSpaceStatus(cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED);
@@ -659,7 +677,80 @@ public class MydoJobServiceImpl implements IMydoJobService
//3.移除当前托盘的绑定信息
inTrayMsgService.deleteInTrayMsgByTrayCode(mydoJob.getTrayCode());
log.info("【账务处理-空托盘】移除任务数据,生成历史记录,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
log.info("【账务处理-载货容器出库】移除任务数据,生成历史记录,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
return AjaxResult.success();
}
//>>>>>>>>>>>>>>>>>>>>>>>带货托盘出库<<<<<<<<<<<<<<<<<<<<<<<<
if (type == TaskType.TASKTYPE_STOCKOUT_CONTAINER){
//>>>>>>>>>>>>>>>>>>>>>>> 生成回流 <<<<<<<<<<<<<<<<<<<<<<<<
//获取托盘剩余库存
String trayCode = mydoJob.getTrayCode();
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(trayCode);
int trayType = getTrayTypeByTrayCode(trayCode);
//空托盘回流
if (stocks.isEmpty()){
inTrayMsgService.insertInTrayMsg(
new InTrayMsg().builder()
.trayCode(trayCode)
.quantity(BigDecimal.ONE)
.productId(ProductType.EMPTY_TRAY)
.warehouseId("01")
.rollerNumber(ProductType.EMPTY_TRAY)
.trayType(trayType)
.status(1)
.createTime(DateUtil.date())
.build()
);
log.info("【非空容器绑定回流】<非空容器入库>生成绑定信息成功,托盘号:{}", trayCode);
}else{
for (BasStock stock : stocks){
inTrayMsgService.insertInTrayMsg(
new InTrayMsg().builder()
.trayCode(trayCode)
.quantity(stock.getQuantity())
.warehouseId("01")
.rollerNumber(stock.getRollerNumber())
.trayType(trayType)
.status(2)
.createTime(DateUtil.date())
.build()
);
basStockService.deleteBasStockByRollerNumber(stock.getRollerNumber());
log.info("【非空容器绑定回流】<非空容器入库>移除当前版辊库存明细,生成绑定信息成功,托盘号:{},辊号:{}", trayCode, stock.getRollerNumber());
}
basStockInfoService.deleteBasStockInfoByTrayCode(trayCode);
log.info("【非空容器绑定回流】<非空容器入库>移除主表库存信息,托盘号:{}}", trayCode);
}
//--------------------处理库存信息--------------------
//移除指定辊号的库存明细
basStockService.deleteBasStockByTrayCode(mydoJob.getTrayCode());
basStockInfoService.deleteBasStockInfoByTrayCode(mydoJob.getTrayCode());
//--------------------更新货位状态--------------------
BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(mydoJob.getCargoSpaceId());
basCargoSpaceService.updateBasCargoSpaceStatus(cargoSpace.getCargoSpaceId(), "", CargoSpaceCode.CARGOSPACE_STATUS_AVAILABLE);
log.info("【账务处理-载货容器出库】更新货位状态,作业号:{},货位编号:{},托盘号:{}", jobId, cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode());
//--------------------处理任务表和子任务表--------------------
//1.更新任务主表状态并移除作业
mydoJob.setStatus(TaskStatusEnum.AUTO_FINISHED.getCode());
mydoJobMapper.updateMydoJob(mydoJob);
deleteMydoJobByJobId(jobId);
//2.并移除所有子作业
mydoJobDetailService.insertMydoJobDetailsForJobFinish(jobId);
mydoJobDetailService.deleteMydoJobDetailsByJobId(jobId);
log.info("【账务处理-载货容器出库】任务完成,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
return AjaxResult.success();

View File

@@ -316,13 +316,13 @@ public class PdaController extends BaseController {
/**
* 呼叫空托出库
* @param palletType 托盘类型
* @param params 货位区域,托盘类型
* @return
*/
@PostMapping("/callStockOutForContainer")
@PreAuthorize("@ss.hasPermi('out:bound:task:info')")
public AjaxResult callStockOutForEmptyPallet(String cargoAreaId, Integer palletType) {
return pdaService.callContainerStockOut(cargoAreaId, palletType);
public AjaxResult callStockOutForEmptyPallet(@RequestBody Map<String, Object> params) {
return pdaService.callContainerStockOut(params);
}

View File

@@ -130,10 +130,10 @@ public interface IPdaService {
/**
* 呼叫空托盘出库
* @param palletType 托盘类型
* @param params 托盘类型
* @return
*/
AjaxResult callContainerStockOut(String cargoAreaId, Integer palletType);
AjaxResult callContainerStockOut(Map<String, Object> params);
/**

View File

@@ -489,10 +489,9 @@ public class PdaServiceImpl implements IPdaService {
}
@Override
public AjaxResult callContainerStockOut(String cargoAreaId, Integer palletType){
return apiWcsService.callContainerOut(cargoAreaId, palletType);
public AjaxResult callContainerStockOut(Map<String, Object> params){
return apiWcsService.callContainerOut(params);
}
@@ -638,8 +637,6 @@ public class PdaServiceImpl implements IPdaService {
}
//移除剩余库存 - 生成回流任务和任务明细绑定信息
return AjaxResult.success("确认成功");

View File

@@ -55,6 +55,7 @@ public class MydoJobHandler {
@Autowired
IInTrayMsgService intrayMsgService;
private static final int TIMEINTERVAL_DEFAULT = 1000;
private static final int TIMEINTERVAL_2000 = 2000;
private static final int TIMEINTERVAL_5000 = 5000;
@@ -104,6 +105,9 @@ public class MydoJobHandler {
basStockInfoService.updateBasStockInfo(stockInfo);
}
mydoJobService.insertMydoJobFinish(mydoJob.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
log.info(
"【账务处理-移库】任务作废,更新库存和货位信息,作业号:{},托盘号:{},源位置:{},目标位置:{}", mydoJob.getJobId(), mydoJob.getTrayCode(), mydoJob.getCargoSpaceId(), mydoJob.getTargetCargoSpaceId()
);
@@ -120,12 +124,19 @@ public class MydoJobHandler {
for (MydoJobDetail mydoJobDetail : details){
//还原子单数量
InStockinDetail inStockinDetail = inStockinDetailService.selectInStockinDetailByRollerNumber(mydoJobDetail.getRollerNumber());
inStockinDetail.setScanNum(BigDecimal.ZERO);
inStockinDetail.setAssignNum(BigDecimal.ZERO);
inStockinDetail.setStatus(0);
inStockinDetailService.updateInStockinDetail(inStockinDetail);
if (ObjUtil.isNotNull(inStockinDetail)){
inStockinDetail.setScanNum(BigDecimal.ZERO);
inStockinDetail.setAssignNum(BigDecimal.ZERO);
inStockinDetail.setStatus(0);
inStockinDetailService.updateInStockinDetail(inStockinDetail);
}
}
mydoJobService.insertMydoJobFinish(mydoJob.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
// apiWcsService.cancelWcsMydojob()
log.info("【账务处理-入库】任务作废,更新货位信息,作业号:{}", mydoJob.getJobId());
return;
}
@@ -143,12 +154,17 @@ public class MydoJobHandler {
for (MydoJobDetail mydoJobDetail : details){
//还原子单数量
OutStockoutDetail outStockoutDetail = outStockoutDetailService.selectOutStockoutDetailByRollerNumber(mydoJobDetail.getRollerNumber());
outStockoutDetail.setAllotNum(BigDecimal.ZERO);
outStockoutDetail.setAssignNum(BigDecimal.ZERO);
outStockoutDetail.setStatus(0);
outStockoutDetailService.updateOutStockoutDetail(outStockoutDetail);
if(ObjUtil.isNotNull(outStockoutDetail)){
outStockoutDetail.setAllotNum(BigDecimal.ZERO);
outStockoutDetail.setAssignNum(BigDecimal.ZERO);
outStockoutDetail.setStatus(0);
outStockoutDetailService.updateOutStockoutDetail(outStockoutDetail);
}
}
mydoJobService.insertMydoJobFinish(mydoJob.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
log.info("【账务处理-出库】任务作废,更新货位和库存信息,作业号:{}", mydoJob.getJobId());
}

View File

@@ -68,7 +68,55 @@ public class RequestWcsHandler {
AjaxResult ajaxResult = apiWcsService.sendEmptyTrayOutMydoJob(paramMap);
if (ajaxResult.isSuccess()){
log.info("【推送出库】<容器>出库,wms作业号:{},货位:{},托盘号:{}", mydoJob.getJobId(), mydoJob.getCargoSpaceId(), mydoJob.getTrayCode());
log.info("【推送出库】<空容器>出库,wms作业号:{},货位:{},托盘号:{}", mydoJob.getJobId(), mydoJob.getCargoSpaceId(), mydoJob.getTrayCode());
mydoJob.setStatus(TaskStatusEnum.RUNNING.getCode());
mydoJobService.updateMydoJob(mydoJob);
//更新库存状态【占用中】
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode());
for (BasStock stock : stocks) {
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
basStockService.updateBasStock(stock);
}
//更新货位状态【出库预占用】
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKOUT);
}
}
}
/**
* 推送wcs带货容器出库作业
*/
@Scheduled(fixedRate = TIMEINTERVAL_2000)
public void sendWcsContainerTask(){
List<MydoJob> mydoJobs = mydoJobService.selectOutMydoJobList(
new MydoJob().builder()
.inOrOut(TaskType.TASKTYPE_STOCKOUT_CONTAINER)
.status(TaskStatusEnum.READY.getCode())
.build()
);
if (mydoJobs.isEmpty()) return;
for (MydoJob mydoJob : mydoJobs) {
//初始化参数
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("reqCode", UUID.randomUUID().toString());//请求码
paramMap.put("trayCode", mydoJob.getTrayCode());//容器编号
paramMap.put("taskNo", mydoJob.getTaskNo());//容器编号
paramMap.put("jobId", mydoJob.getJobId());
paramMap.put("inOrOut", mydoJob.getInOrOut());
paramMap.put("cargoSpaceId", mydoJob.getCargoSpaceId());
AjaxResult ajaxResult = apiWcsService.sendEmptyTrayOutMydoJob(paramMap);
if (ajaxResult.isSuccess()){
log.info("【推送出库】<带货容器>出库,wms作业号:{},货位:{},托盘号:{}", mydoJob.getJobId(), mydoJob.getCargoSpaceId(), mydoJob.getTrayCode());
mydoJob.setStatus(TaskStatusEnum.RUNNING.getCode());
mydoJobService.updateMydoJob(mydoJob);
@@ -121,9 +169,11 @@ public class RequestWcsHandler {
//更新库存状态【占用中】
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode());
for (BasStock stock : stocks) {
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
basStockService.updateBasStock(stock);
if (!stocks.isEmpty()){
for (BasStock stock : stocks) {
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
basStockService.updateBasStock(stock);
}
}
//更新货位状态【出库预占用】

View File

@@ -41,6 +41,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectBasCargoSpaceVo"/>
<where>
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and cargo_space_id = #{cargoSpaceId}</if>
<if test="roadwayId != null and roadwayId != ''"> and roadway_id = #{roadwayId}</if>
<if test="cargoAreaId != null and cargoAreaId != ''"> and cargo_area_id = #{cargoAreaId}</if>
<if test="theType != null and theType != ''"> and the_type = #{theType}</if>
@@ -64,6 +65,38 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</where>
order by cargo_space_id asc
</select>
<select id="selectBasCargoSpaceListForEmptyTray" parameterType="BasCargoSpace" resultMap="BasCargoSpaceResult">
select bcs.cargo_space_id, bcs.warehouse_id, bcs.roadway_id, bcs.cargo_area_id, bcs.the_type, bcs.the_type_name,
bcs.cargo_space_name, bcs.the_platoon, bcs.the_column, bcs.the_floor, bcs.status, bcs.locked, bcs.tray_code,
bcs.iss_double, bcs.group_coding_no, bcs.group_coding, bcs.cargo_space_logo, bcs.this_cargo_area,
bcs.dept_id, bcs.dept_name, bcs.the_weight, bcs.the_height,
bs.product_id, bs.stock_status
from bas_cargo_space bcs
inner join bas_stock_detail bs on bs.cargo_space_id = bcs.cargo_space_id and bs.product_id = 'KTP0001' and bs.stock_status = '1'
where
bcs.cargo_area_id = #{cargoAreaId}
and bcs.the_type = #{theType}
and bcs.status = '2'
and bcs.locked = 'N'
order by bcs.iss_double asc, bcs.cargo_space_id asc
</select>
<select id="selectBasCargoSpaceListForContainer" parameterType="BasCargoSpace" resultMap="BasCargoSpaceResult">
select bcs.cargo_space_id, bcs.warehouse_id, bcs.roadway_id, bcs.cargo_area_id, bcs.the_type, bcs.the_type_name,
bcs.cargo_space_name, bcs.the_platoon, bcs.the_column, bcs.the_floor, bcs.status, bcs.locked, bcs.tray_code,
bcs.iss_double, bcs.group_coding_no, bcs.group_coding, bcs.cargo_space_logo, bcs.this_cargo_area,
bcs.dept_id, bcs.dept_name, bcs.the_weight, bcs.the_height,
bs.empty_status
from bas_cargo_space bcs
inner join bas_stock bs on bs.cargo_space_id = bcs.cargo_space_id
where
bcs.cargo_area_id = #{cargoAreaId}
and bcs.the_type = #{theType}
and bcs.status = '2'
and bcs.locked = 'N'
order by bcs.iss_double asc, bcs.cargo_space_id asc, bs.empty_status asc
</select>
<select id="selectBasCargoSpaceByCargoSpaceId" parameterType="String" resultMap="BasCargoSpaceResult">
<include refid="selectBasCargoSpaceVo"/>
@@ -106,6 +139,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectBasCargoSpaceVoTop1"/>
<where>
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and cargo_space_id = #{cargoSpaceId}</if>
<if test="cargoAreaId != null and cargoAreaId != ''"> and cargo_area_id = #{cargoAreaId}</if>
<if test="theTypeName != null and theTypeName != ''"> and the_type_name like concat('%', #{theTypeName}, '%')</if>
<if test="cargoSpaceName != null and cargoSpaceName != ''"> and cargo_space_name like concat('%', #{cargoSpaceName}, '%')</if>
@@ -134,6 +168,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectBasCargoSpaceVo"/>
<where>
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and cargo_space_id = #{cargoSpaceId}</if>
<if test="cargoAreaId != null and cargoAreaId != ''"> and cargo_area_id = #{cargoAreaId}</if>
<if test="theTypeName != null and theTypeName != ''"> and the_type_name like concat('%', #{theTypeName}, '%')</if>
<if test="cargoSpaceName != null and cargoSpaceName != ''"> and cargo_space_name like concat('%', #{cargoSpaceName}, '%')</if>
@@ -162,6 +197,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectBasCargoSpaceVoTop1"/>
<where>
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and cargo_space_id = #{cargoSpaceId}</if>
<if test="cargoAreaId != null and cargoAreaId != ''"> and cargo_area_id = #{cargoAreaId}</if>
<if test="theTypeName != null and theTypeName != ''"> and the_type_name like concat('%', #{theTypeName}, '%')</if>
<if test="cargoSpaceName != null and cargoSpaceName != ''"> and cargo_space_name like concat('%', #{cargoSpaceName}, '%')</if>
@@ -190,6 +226,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectBasCargoSpaceVo"/>
<where>
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and cargo_space_id = #{cargoSpaceId}</if>
<if test="cargoAreaId != null and cargoAreaId != ''"> and cargo_area_id = #{cargoAreaId}</if>
<if test="theTypeName != null and theTypeName != ''"> and the_type_name like concat('%', #{theTypeName}, '%')</if>
<if test="cargoSpaceName != null and cargoSpaceName != ''"> and cargo_space_name like concat('%', #{cargoSpaceName}, '%')</if>

View File

@@ -74,6 +74,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="supplierName != null and supplierName != ''"> and bs.supplier_name like concat('%', #{supplierName}, '%')</if>
${params.warehouseScope}
</select>
<select id="selectBasStockListForEmptyTray" parameterType="BasStock" resultMap="BasStockResult">
select bs.stock_id, bs.stock_detail_id, bs.cargo_space_id, bs.stock_status, bs.product_status,
bs.lot_no, bs.in_date, bs.back_date, bs.product_id, bs.product_name,bs.roller_number,
bs.quantity, bs.job_id, bs.job_detail_id, bs.tray_code, bs.out_quantity,
bs.stockin_detail_id, bs.stockin_id, bs.in_type, bs.warehouse_id, bs.warehouse_name,
bs.user_id, bs.user_name, bs.dept_id, bs.dept_name, bs.supplier_id, bs.supplier_name, bcs.iss_double, bcs.cargo_area_id, bcs.the_type
from bas_stock_detail bs
left join bas_cargo_space bcs on bs.cargo_space_id = bcs.cargo_space_id
where
bcs.status = '2' and
bs.product_id = 'KTP0001' and
bs.stock_status = '1'
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and bs.cargo_space_id = #{cargoSpaceId}</if>
<if test="productStatus != null and productStatus != ''"> and bs.product_status = #{productStatus}</if>
<if test="lotNo != null and lotNo != ''"> and bs.lot_no = #{lotNo}</if>
<if test="params.beginInDate != null and params.beginInDate != '' and params.endInDate != null and params.endInDate != ''"> and bs.in_date between #{params.beginInDate} and #{params.endInDate}</if>
<if test="params.beginBackDate != null and params.beginBackDate != '' and params.endBackDate != null and params.endBackDate != ''"> and bs.back_date between #{params.beginBackDate} and #{params.endBackDate}</if>
<if test="productName != null and productName != ''"> and bs.product_name like concat('%', #{productName}, '%')</if>
<if test="rollerNumber != null and rollerNumber != ''"> and bs.roller_number like concat('%', #{rollerNumber}, '%')</if>
<if test="quantity != null "> and bs.quantity = #{quantity}</if>
<if test="jobId != null and jobId != ''"> and bs.job_id = #{jobId}</if>
<if test="jobDetailId != null and jobDetailId != ''"> and bs.job_detail_id = #{jobDetailId}</if>
<if test="trayCode != null and trayCode != ''"> and bs.tray_code = #{trayCode}</if>
<if test="outQuantity != null "> and bs.out_quantity = #{outQuantity}</if>
<if test="stockinDetailId != null and stockinDetailId != ''"> and bs.stockin_detail_id = #{stockinDetailId}</if>
<if test="stockinId != null and stockinId != ''"> and bs.stockin_id = #{stockinId}</if>
<if test="inType != null and inType != ''"> and bs.in_type = #{inType}</if>
<if test="warehouseName != null and warehouseName != ''"> and bs.warehouse_name like concat('%', #{warehouseName}, '%')</if>
<if test="userName != null and userName != ''"> and bs.user_name like concat('%', #{userName}, '%')</if>
<if test="deptName != null and deptName != ''"> and bs.dept_name like concat('%', #{deptName}, '%')</if>
<if test="supplierName != null and supplierName != ''"> and bs.supplier_name like concat('%', #{supplierName}, '%')</if>
ORDER BY bcs.iss_double asc, bcs.cargo_space_id asc
</select>
<select id="selectBasStockByStockId" parameterType="String" resultMap="BasStockResult">
<include refid="selectBasStockVo"/>

View File

@@ -52,3 +52,13 @@ export function delCargospace(cargoSpaceId) {
}
// 指定货位出库
export function stockoutByManual(cargoSpaceId) {
return request({
url: '/api/wmsService/wcs/stockoutByManual',
method: 'post',
data: { cargoSpaceId: cargoSpaceId }
})
}

View File

@@ -0,0 +1,52 @@
import request from '@/utils/request'
// 查询入库信息列表
export function listBindTrayMsg(query) {
return request({
url: '/in/bindMsg/list',
method: 'get',
params: query
})
}
// 查询入库信息详细
export function getBindTrayMsg(id) {
return request({
url: '/in/bindMsg/' + id,
method: 'get'
})
}
// 新增入库信息
export function addBindTrayMsg(data) {
return request({
url: '/pda/bindMsg',
method: 'post',
data: data
})
}
// 修改入库信息
export function updateBindTrayMsg(data) {
return request({
url: '/in/bindMsg',
method: 'put',
data: data
})
}
// 删除入库信息
export function delBindTrayMsg(id) {
return request({
url: '/in/bindMsg/' + id,
method: 'delete'
})
}
// 删除入库信息
export function delBindTrayMsgByRollerNumber(rollerNumbers) {
return request({
url: '/in/bindMsg/delete/' + rollerNumbers,
method: 'delete'
})
}

View File

@@ -1,10 +1,10 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="仓库id" prop="warehouseId">
<el-form-item label="货位id" prop="cargoSpaceId">
<el-input
v-model="queryParams.warehouseId"
placeholder="请输入仓库id"
v-model="queryParams.cargoSpaceId"
placeholder="请输入货位id"
clearable
@keyup.enter.native="handleQuery"
/>
@@ -83,22 +83,6 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="部门名称" prop="deptName">
<el-input
v-model="queryParams.deptName"
placeholder="请输入部门名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="重量" prop="theWeight">
<el-input
v-model="queryParams.theWeight"
placeholder="请输入重量"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="高度" prop="theHeight">
<el-input
v-model="queryParams.theHeight"
@@ -120,8 +104,8 @@
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['bas:cargospace:add']"
@click="stockoutByManualHandle"
:disabled="multiple"
>指定货位出库</el-button>
</el-col>
<el-col :span="1.5">
@@ -190,8 +174,6 @@
</template>
</el-table-column>
<el-table-column label="托盘条码" align="center" prop="trayCode" />
<el-table-column label="部门名称" align="center" prop="deptName" />
<el-table-column label="重量" align="center" prop="theWeight" />
<el-table-column label="高度" align="center" prop="theHeight" />
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
<template slot-scope="scope">
@@ -226,8 +208,8 @@
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-row>
<el-col :span="24">
<el-form-item label="仓库id" prop="warehouseId">
<el-input v-model="form.warehouseId" placeholder="请输入仓库id" />
<el-form-item label="货位id" prop="cargoSpaceId">
<el-input v-model="form.cargoSpaceId" placeholder="请输入货位id" />
</el-form-item>
</el-col>
<el-col :span="24">
@@ -343,7 +325,7 @@
</template>
<script>
import { listCargospace, getCargospace, delCargospace, addCargospace, updateCargospace } from "@/api/bas/cargospace"
import { listCargospace, getCargospace, delCargospace, addCargospace, updateCargospace, stockoutByManual } from "@/api/bas/cargospace"
export default {
name: "Cargospace",
@@ -372,6 +354,7 @@ export default {
queryParams: {
pageNum: 1,
pageSize: 10,
cargoSpeceId: null,
warehouseId: null,
roadwayId: null,
cargoAreaId: null,
@@ -396,6 +379,9 @@ export default {
roadwayId: [
{ required: true, message: "巷道id不能为空", trigger: "blur" }
],
cargoSpaceId: [
{ required: true, message: "货位id不能为空", trigger: "blur" }
],
cargoSpaceName: [
{ required: true, message: "货位名称不能为空", trigger: "blur" }
],
@@ -476,9 +462,29 @@ export default {
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.cargoSpaceId)
this.cargoSpaces = selection.map(item => item.cargoSpaceId)
this.single = selection.length !== 1
this.multiple = !selection.length
},
stockoutByManualHandle() {
if (!this.cargoSpaces || this.cargoSpaces.length === 0) {
this.$modal.msgWarning("请至少选择一个货位执行手动出库操作");
return;
}
const cargoSpaceId = this.ids[0]
var data ={
cargoSpaceId: cargoSpaceId
}
this.$modal.confirm('是否确认将货位编号为"' + cargoSpaceId + '"货位库存手动出库?').then(() => {
return stockoutByManual(cargoSpaceId)
}).then(() => {
this.getList()
this.$modal.msgSuccess("操作成功")
}).catch(() => {})
},
/** 新增按钮操作 */
handleAdd() {
this.reset()

View File

@@ -0,0 +1,438 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="入库主单" prop="stockinId">
<el-input
v-model="queryParams.stockinId"
placeholder="请输入入库主单号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="入库子单" prop="stockinDetailId">
<el-input
v-model="queryParams.stockinDetailId"
placeholder="请输入入库子单码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="托盘码" prop="trayCode">
<el-input
v-model="queryParams.trayCode"
placeholder="请输入托盘码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="物料编码" prop="productId">
<el-input
v-model="queryParams.productId"
placeholder="请输入物料编码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="版辊编号" prop="rollerNumber">
<el-input
v-model="queryParams.rollerNumber"
placeholder="请输入版辊编号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="入库数量" prop="quantity">
<el-input
v-model="queryParams.quantity"
placeholder="请输入入库数量"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="用户编码" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入用户编码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="部门编码" prop="deptId">
<el-input
v-model="queryParams.deptId"
placeholder="请输入部门编码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="颜色" prop="color">
<el-input
v-model="queryParams.color"
placeholder="请输入颜色"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['in:bindMsg:add']"
>新增</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['in:bindTrayMsg:edit']"
>修改</el-button>
</el-col> -->
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['in:bindMsg:remove']"
>删除</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['in:bindTrayMsg:export']"
>导出</el-button>
</el-col> -->
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="bindTrayMsgList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="托盘码" align="center" prop="trayCode" />
<el-table-column label="入库主单" align="center" prop="stockinId" />
<el-table-column label="入库子单" align="center" prop="stockinDetailId" />
<el-table-column label="物料编码" align="center" prop="productId" />
<el-table-column label="版辊编号" align="center" prop="rollerNumber" />
<el-table-column label="入库数量" align="center" prop="quantity" />
<el-table-column label="用户编码" align="center" prop="userId" />
<el-table-column label="部门编码" align="center" prop="deptId" />
<el-table-column label="托盘类型" align="center" prop="trayType" />
<el-table-column label="状态" align="center" prop="status" >
<template slot-scope="scope">
<dict-tag :options="dict.type.in_tray_msg_status" :value="scope.row.status" />
</template>
</el-table-column>
<!-- <el-table-column label="${comment}" align="center" prop="jobId" />
<el-table-column label="${comment}" align="center" prop="jobDetailId" /> -->
<!-- <el-table-column label="${comment}" align="center" prop="supplierId" />
<el-table-column label="${comment}" align="center" prop="spec" />
<el-table-column label="${comment}" align="center" prop="rollerNumber" />
<el-table-column label="${comment}" align="center" prop="diameter" />
<el-table-column label="${comment}" align="center" prop="splicingLength" />
<el-table-column label="${comment}" align="center" prop="plugHole" /> -->
<el-table-column label="颜色" align="center" prop="color" />
<!-- <el-table-column label="${comment}" align="center" prop="productName" />
<el-table-column label="${comment}" align="center" prop="warehouseName" />
<el-table-column label="${comment}" align="center" prop="userName" />
<el-table-column label="${comment}" align="center" prop="deptName" />
<el-table-column label="${comment}" align="center" prop="supplierName" /> -->
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['in:bindMsg:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['in:bindMsg:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改入库信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-row>
<el-col :span="24">
<el-form-item label="托盘码" prop="trayCode">
<el-input v-model="form.trayCode" placeholder="请输入托盘码" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="版辊编号" prop="rollerNumber">
<el-input v-model="form.rollerNumber" placeholder="请输入版辊编号" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="入库数量" prop="quantity">
<el-input v-model="form.quantity" disabled placeholder="1" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listBindTrayMsg, getBindTrayMsg, delBindTrayMsg, delBindTrayMsgByRollerNumber, addBindTrayMsg, updateBindTrayMsg } from "@/api/in/bindTrayMsg"
import { data } from "vue-barcode";
export default {
name: "BindTrayMsg",
dicts: ['in_tray_msg_status'],
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 入库信息表格数据
bindTrayMsgList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
trayCode: null,
stockinDetailId: null,
productId: null,
quantity: null,
warehouseId: null,
userId: null,
deptId: null,
trayType: null,
trayLocation: null,
status: null,
jobId: null,
jobDetailId: null,
stockinId: null,
supplierId: null,
spec: null,
rollerNumber: null,
diameter: null,
splicingLength: null,
plugHole: null,
colorSequence: null,
color: null,
productName: null,
warehouseName: null,
userName: null,
deptName: null,
supplierName: null
},
// 表单参数
form: {},
// 表单校验
rules: {
id: [
{ required: true, message: "$comment不能为空", trigger: "blur" }
],
}
}
},
created() {
this.getList()
},
methods: {
/** 查询入库信息列表 */
getList() {
this.loading = true
listBindTrayMsg(this.queryParams).then(response => {
this.bindTrayMsgList = response.rows
this.total = response.total
this.loading = false
})
},
// 取消按钮
cancel() {
this.open = false
this.reset()
},
// 表单重置
reset() {
this.form = {
id: null,
trayCode: null,
stockinDetailId: null,
productId: null,
quantity: null,
warehouseId: null,
userId: null,
deptId: null,
createTime: null,
trayType: null,
trayLocation: null,
status: null,
jobId: null,
jobDetailId: null,
stockinId: null,
supplierId: null,
spec: null,
rollerNumber: null,
diameter: null,
splicingLength: null,
plugHole: null,
colorSequence: null,
color: null,
productName: null,
warehouseName: null,
userName: null,
deptName: null,
supplierName: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
// 多选框选中数据
handleSelectionChange(selection) {
// this.ids = selection.map(item => item.id)
this.rollerNumbers = selection.map(item => item.rollerNumber)
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加入库信息"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getBindTrayMsg(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改入库信息"
})
},
/** 提交按钮 */
submitForm() {
if (!this.form.trayCode) {
this.$modal.msg('请输入托盘号')
return
}
if (!this.form.rollerNumber) {
this.$modal.msg('请输入版辊编号')
return
}
var data = {
trayCode: this.form.trayCode,
rollerNumber: this.form.rollerNumber,
quantity: this.form.quantity,
}
addBindTrayMsg(data).then(() => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
}).catch(() => {})
},
/** 删除按钮操作 */
// handleDelete(row) {
// // 统一将单条数据转为数组,方便后端 String[] 接收
// const ids = row.id || row.ids;
// this.$modal.confirm('是否确认删除编号为"' + ids + '"的数据项?').then(function() {
// return delBindTrayMsg(ids)
// }).then(() => {
// this.getList()
// this.$modal.msgSuccess("删除成功")
// }).catch(() => {})
// },
handleDelete(row) {
// 统一将单条数据转为数组,方便后端 String[] 接收
const rollerNumbers = row.rollerNumber ? [row.rollerNumber] : this.rollerNumbers;
console.log(row)
console.log(rollerNumbers)
this.$modal.confirm('是否确认删除版辊编号为"' + rollerNumbers.join(",") + '"的数据项?').then(() => {
return delBindTrayMsgByRollerNumber(rollerNumbers)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {
this.getList()
})
},
/** 导出按钮操作 */
handleExport() {
this.download('in/bindTrayMsg/export', {
...this.queryParams
}, `bindTrayMsg_${new Date().getTime()}.xlsx`)
},
}
}
</script>

View File

@@ -2162,7 +2162,7 @@ GO
INSERT INTO [dbo].[gen_table] ([table_id], [table_name], [table_comment], [sub_table_name], [sub_table_fk_name], [class_name], [tpl_category], [tpl_web_type], [package_name], [module_name], [business_name], [function_name], [function_author], [form_col_num], [gen_type], [gen_path], [options], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'6', N'in_stockin', N'入库单据主信息表', NULL, NULL, N'InStockin', N'crud', N'element-ui', N'com.ruoyi.in.stockin', N'in', N'stockin', N'入库单据主信息', N'ruoyi', N'1', N'0', N'/', N'{"genView":"0","parentMenuId":2000}', N'admin', N'2026-05-11 11:08:00.000', N'', N'2026-05-11 11:24:01.000', NULL)
GO
INSERT INTO [dbo].[gen_table] ([table_id], [table_name], [table_comment], [sub_table_name], [sub_table_fk_name], [class_name], [tpl_category], [tpl_web_type], [package_name], [module_name], [business_name], [function_name], [function_author], [form_col_num], [gen_type], [gen_path], [options], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'7', N'in_stockin_detail', N'入库单据子信息表', NULL, NULL, N'InStockinDetail', N'crud', N'element-ui', N'com.ruoyi.in.stockindetail', N'in', N'sotckindetail', N'入库单据子信息', N'ruoyi', N'1', N'0', N'/', N'{"genView":"0","parentMenuId":2000}', N'admin', N'2026-05-11 11:08:00.000', N'', N'2026-05-11 11:29:04.000', NULL)
INSERT INTO [dbo].[gen_table] ([table_id], [table_name], [table_comment], [sub_table_name], [sub_table_fk_name], [class_name], [tpl_category], [tpl_web_type], [package_name], [module_name], [business_name], [function_name], [function_author], [form_col_num], [gen_type], [gen_path], [options], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'7', N'in_stockin_detail', N'入库单据子信息表', NULL, NULL, N'InStockinDetail', N'crud', N'element-ui', N'com.ruoyi.in.stockindetail', N'in', N'stockindetail', N'入库单据子信息', N'ruoyi', N'1', N'0', N'/', N'{"genView":"0","parentMenuId":2000}', N'admin', N'2026-05-11 11:08:00.000', N'', N'2026-05-11 11:29:04.000', NULL)
GO
INSERT INTO [dbo].[gen_table] ([table_id], [table_name], [table_comment], [sub_table_name], [sub_table_fk_name], [class_name], [tpl_category], [tpl_web_type], [package_name], [module_name], [business_name], [function_name], [function_author], [form_col_num], [gen_type], [gen_path], [options], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'8', N'in_stockin_detail_finish', N'入库单据子信息表', NULL, NULL, N'InStockinDetailFinish', N'crud', N'element-ui', N'com.ruoyi.system', N'system', N'finish', N'入库单据子信息', N'ruoyi', N'1', N'0', N'/', NULL, N'admin', N'2026-05-11 11:08:00.000', N'', NULL, NULL)
@@ -8864,7 +8864,7 @@ GO
INSERT INTO [dbo].[sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [component], [query], [route_name], [is_frame], [is_cache], [menu_type], [visible], [status], [perms], [icon], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'2113', N'添加入库单据', N'2056', N'0', N'', NULL, NULL, N'', N'1', N'0', N'F', N'0', N'0', N'in:stockin:add', N'#', N'admin', N'2026-05-20 09:57:59.127', N'', NULL, N'')
GO
INSERT INTO [dbo].[sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [component], [query], [route_name], [is_frame], [is_cache], [menu_type], [visible], [status], [perms], [icon], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'2114', N'查询子单据', N'2044', N'6', N'', NULL, NULL, N'', N'1', N'0', N'F', N'0', N'0', N'in:sotckindetail:list', N'#', N'admin', N'2026-05-20 10:02:52.333', N'', NULL, N'')
INSERT INTO [dbo].[sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [component], [query], [route_name], [is_frame], [is_cache], [menu_type], [visible], [status], [perms], [icon], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'2114', N'查询子单据', N'2044', N'6', N'', NULL, NULL, N'', N'1', N'0', N'F', N'0', N'0', N'in:stockindetail:list', N'#', N'admin', N'2026-05-20 10:02:52.333', N'', NULL, N'')
GO
INSERT INTO [dbo].[sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [component], [query], [route_name], [is_frame], [is_cache], [menu_type], [visible], [status], [perms], [icon], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'2115', N'手动作废', N'2044', N'0', N'', NULL, NULL, N'', N'1', N'0', N'F', N'0', N'0', N'in:stockin:cancel', N'#', N'admin', N'2026-05-20 10:03:54.427', N'', NULL, N'')
@@ -9785,7 +9785,7 @@ GO
INSERT INTO [dbo].[sys_oper_log] ([oper_id], [title], [business_type], [method], [request_method], [operator_type], [oper_name], [dept_name], [oper_url], [oper_ip], [oper_location], [oper_param], [json_result], [status], [error_msg], [oper_time], [cost_time]) VALUES (N'97', N'菜单管理', N'3', N'com.ruoyi.web.controller.system.SysMenuController.remove()', N'DELETE', N'1', N'admin', N'天津一重', N'/system/menu/2049', N'127.0.0.1', N'内网IP', N'2049 ', N'{"msg":"菜单已分配,不允许删除","code":601}', N'0', NULL, N'2026-05-20 10:02:35.570', N'24')
GO
INSERT INTO [dbo].[sys_oper_log] ([oper_id], [title], [business_type], [method], [request_method], [operator_type], [oper_name], [dept_name], [oper_url], [oper_ip], [oper_location], [oper_param], [json_result], [status], [error_msg], [oper_time], [cost_time]) VALUES (N'98', N'菜单管理', N'1', N'com.ruoyi.web.controller.system.SysMenuController.add()', N'POST', N'1', N'admin', N'天津一重', N'/system/menu', N'127.0.0.1', N'内网IP', N'{"children":[],"createBy":"admin","isCache":"0","isFrame":"1","menuName":"查询子单据","menuType":"F","orderNum":6,"params":{},"parentId":2044,"perms":"in:sotckindetail:list","status":"0","visible":"0"} ', N'{"msg":"操作成功","code":200}', N'0', NULL, N'2026-05-20 10:02:52.357', N'19')
INSERT INTO [dbo].[sys_oper_log] ([oper_id], [title], [business_type], [method], [request_method], [operator_type], [oper_name], [dept_name], [oper_url], [oper_ip], [oper_location], [oper_param], [json_result], [status], [error_msg], [oper_time], [cost_time]) VALUES (N'98', N'菜单管理', N'1', N'com.ruoyi.web.controller.system.SysMenuController.add()', N'POST', N'1', N'admin', N'天津一重', N'/system/menu', N'127.0.0.1', N'内网IP', N'{"children":[],"createBy":"admin","isCache":"0","isFrame":"1","menuName":"查询子单据","menuType":"F","orderNum":6,"params":{},"parentId":2044,"perms":"in:stockindetail:list","status":"0","visible":"0"} ', N'{"msg":"操作成功","code":200}', N'0', NULL, N'2026-05-20 10:02:52.357', N'19')
GO
INSERT INTO [dbo].[sys_oper_log] ([oper_id], [title], [business_type], [method], [request_method], [operator_type], [oper_name], [dept_name], [oper_url], [oper_ip], [oper_location], [oper_param], [json_result], [status], [error_msg], [oper_time], [cost_time]) VALUES (N'99', N'角色管理', N'2', N'com.ruoyi.web.controller.system.SysRoleController.edit()', N'PUT', N'1', N'admin', N'天津一重', N'/system/role', N'127.0.0.1', N'内网IP', N'{"admin":false,"createTime":"2026-05-11 09:49:00","dataScope":"1","delFlag":"0","deptCheckStrictly":true,"flag":false,"menuCheckStrictly":true,"menuIds":[2000,2056,2110,2111,2112,2113,2044,2045,2046,2047,2048,2049,2114],"params":{},"roleId":100,"roleKey":"el:common:role","roleName":"二联合普通人员","roleSort":0,"status":"0","updateBy":"admin"} ', N'{"msg":"操作成功","code":200}', N'0', NULL, N'2026-05-20 10:03:01.850', N'77')