pda界面和功能优化,完善mes下发版辊字段

This commit is contained in:
Lenovo
2026-09-18 15:31:27 +08:00
parent ac7becee2e
commit 555a49f3a4
51 changed files with 1873 additions and 161 deletions

View File

@@ -0,0 +1,63 @@
import request from '@/utils/request'
// 根据入库明细ID查询物料信息(入库绑盘用)
export function getMaterialByDetailId(detailId) {
return request({
url: '/pda/getProductInfoByInDetailId',
method: 'get',
params: { detailId }
})
}
// 根据辊号查询物料信息(入库绑盘用)
export function getMaterialByRollerNumber(rollerNumber) {
return request({
url: '/pda/getStockinInfoByRollerNumber',
method: 'get',
params: { rollerNumber }
})
}
export function submitBindTray(data) {
return request({
url: '/pda/bindTray',
method: 'post',
data: data
})
}
export function submitBindTrayMsg(data) {
return request({
url: '/pda/bindTrayMsgs',
method: 'post',
data: data
})
}
// 获取入库待处理单据列表
export function getInboundStockList(query) {
return request({
url: '/pda/inboundStockList',
method: 'get',
params: query
})
}
// 获取入库单据子单列表
export function getDetailList(query) {
return request({
url: '/pda/getDetailListByStockinId',
method: 'get',
params: query
})
}
// 生成入库作业
export function submitAddInJob(data) {
return request({
url: '/pda/addInJob',
method: 'post',
data: data
})
}

View File

@@ -0,0 +1,27 @@
import request from '@/utils/request'
// 根据入库明细ID查询物料信息(入库绑盘用)
export function getMaterialByDetailId(detailId) {
return request({
url: '/pda/getProductInfoByInDetailId',
method: 'get',
params: { detailId }
})
}
// 根据辊号查询物料信息(入库绑盘用)
export function getTrayMsgByRollerNumber(rollerNumber) {
return request({
url: '/pda/getTrayMsgByRollerNumber',
method: 'get',
params: { rollerNumber }
})
}
export function submitCancelTrayMsg(data) {
return request({
url: '/pda/cancelTrayMsgs',
method: 'post',
data: data
})
}

View File

@@ -0,0 +1,28 @@
import request from '@/utils/request'
export function getTrayCodeDetail(trayCode) {
return request({
url: '/pda/getTrayBindMsgInfoByTrayCode',
method: 'get',
params: { trayCode }
})
}
// 取消版辊绑定状态
export function cancelTrayMsg(data) {
return request({
url: '/pda/cancelTrayMsg',
method: 'post',
data: data
})
}
// 取消当前托盘的所有绑定信息
export function cancelTrayMsgAllByTrayCode(data) {
return request({
url: '/pda/cancelTrayMsgs',
method: 'post',
// data: { trayCode: trayCode }
data: data
})
}

View File

@@ -0,0 +1,10 @@
import request from '@/utils/request'
// 生成空托入库作业
export function submitAddEmptyTrayJob(data) {
return request({
url: '/pda/addEmptyTrayJob',
method: 'post',
data: data
})
}

View File

@@ -0,0 +1,19 @@
import request from '@/utils/request'
// 获取入库待处理任务列表
export function getInboundTaskList(query) {
return request({
url: '/pda/inboundTaskList',
method: 'get',
params: query
})
}
// 获取入库待处理单据列表
export function getInboundStockList(query) {
return request({
url: '/pda/inboundStockList',
method: 'get',
params: query
})
}

View File

@@ -0,0 +1 @@
import request from '@/utils/request'

View File

@@ -0,0 +1,2 @@
import request from '@/utils/request'

View File

@@ -0,0 +1,38 @@
import request from '@/utils/request'
// 获取盘点待处理任务列表
export function getInventoryOutTaskList(query) {
return request({
url: '/pda/inventoryOutTaskList',
method: 'get',
params: query
})
}
// 获取出库盘点任务库存
export function getTrayCodeDetail(trayCode) {
return request({
url: '/pda/getInventoryOutInfoByTrayCode',
method: 'get',
params: { trayCode }
})
}
// 确认版辊库存状态
export function confirmExcetion(data) {
return request({
url: '/pda/inventoryStockExcetion',
method: 'post',
data: data
})
}
// 确认托盘盘点出库完成 - 盘点出库
export function inventoryTrayCodeComplete(data) {
return request({
url: '/pda/inventoryTrayCodeComplete',
method: 'post',
// data: { trayCode: trayCode }
data: data
})
}

View File

@@ -0,0 +1,21 @@
import request from '@/utils/request'
// 获取盘点待处理任务列表
export function getInventoryOutTaskList(query) {
return request({
url: '/pda/inventoryOutTaskList',
method: 'get',
params: query
})
}
// 确认托盘盘点出库完成 - 盘点出库
export function inventoryTrayCodeComplete(data) {
return request({
url: '/pda/inventoryTrayCodeComplete',
method: 'post',
// data: { trayCode: trayCode }
data: data
})
}

View File

@@ -0,0 +1,29 @@
import request from '@/utils/request'
// 获取出库任务详情
export function getOutboundDetail(rollerNumber) {
return request({
url: '/pda/getStockoutInfoByRollerNumber',
method: 'get',
params: { rollerNumber }
})
}
// 确认版辊出库数量 - 单独出库确认
export function confirmOutbound(data) {
return request({
url: '/pda/stockoutDetailComplete',
method: 'post',
data: data
})
}
// 版辊强制出库确认
export function rollerNumberComplete(data) {
return request({
url: '/pda/rollerNumberComplete',
method: 'post',
data: data
})
}

View File

@@ -0,0 +1,18 @@
import request from '@/utils/request'
/**
* 呼叫空托出库
* @param {String} cargoAreaId 库区ID
* @param {Number} palletType 托盘类型
*/
export function callStockOutForContainer(cargoAreaId, palletType) {
return request({
url: '/pda/callStockOutForContainer',
method: 'post',
data: {
cargoAreaId: cargoAreaId,
palletType: palletType
},
})
}

View File

@@ -0,0 +1,20 @@
import request from '@/utils/request'
// 获取出库任务详情
export function getOutboundDetail(rollerNumber) {
return request({
url: '/pda/getStockoutInfoByRollerNumber',
method: 'get',
params: { rollerNumber }
})
}
// 提交出库异常确认
export function submitOutboundException(data) {
return request({
url: '/wms/outbound/exception',
method: 'post',
data: data
})
}

View File

@@ -0,0 +1,10 @@
import request from '@/utils/request'
// 获取出库待处理任务列表
export function getOutboundTaskList(query) {
return request({
url: '/pda/outboundTaskList',
method: 'get',
params: query
})
}

View File

@@ -0,0 +1,40 @@
import request from '@/utils/request'
// 获取出库任务详情 - 拣选/常规出库
export function getTrayCodeDetail(trayCode) {
return request({
url: '/pda/getStockoutInfoByTrayCode',
method: 'get',
params: { trayCode }
})
}
// 确认版辊出库数量 - 单独出库确认
export function confirmOutbound(data) {
return request({
url: '/pda/stockoutDetailComplete',
method: 'post',
data: data
})
}
// 确认托盘出库完成 - 单据出库
export function stockoutTrayCodeComplete(trayCode) {
return request({
url: '/pda/stockoutTrayCodeComplete',
method: 'post',
// data: { trayCode: trayCode }
params: { trayCode }
})
}
// 确认托盘出库完成 - 一键确认
export function stockoutTrayCodeCompleteAll(trayCode) {
return request({
url: '/pda/stockoutTrayCodeCompleteAll',
method: 'post',
// data: { trayCode: trayCode }
params: { trayCode }
})
}

View File

@@ -0,0 +1,29 @@
import request from '@/utils/request'
// 获取出库任务详情 - 手动指定出库
export function getTrayCodeDetailForManual(trayCode) {
return request({
url: '/pda/getManualStockoutInfoByTrayCode',
method: 'get',
params: { trayCode }
})
}
// 确认版辊出库数量 - 单独出库确认
export function confirmOutbound(data) {
return request({
url: '/pda/stockoutDetailComplete',
method: 'post',
data: data
})
}
// 确认托盘出库完成 - 手动出库
export function stockoutTrayCodeCompleteManual(trayCode) {
return request({
url: '/pda/stockoutTrayCodeCompleteManual',
method: 'post',
// data: { trayCode: trayCode }
params: { trayCode }
})
}

View File

@@ -71,9 +71,14 @@
"navigationBarTitleText": "入库绑盘" "navigationBarTitleText": "入库绑盘"
} }
}, { }, {
"path": "pages/warehouse/inbound/cancelBindTray", "path": "pages/warehouse/inbound/cancelBindTrayByTrayCode",
"style": { "style": {
"navigationBarTitleText": "版辊绑定取消" "navigationBarTitleText": "取消版辊绑定信息"
}
},{
"path": "pages/warehouse/inbound/cancelBindTrayByRoller",
"style": {
"navigationBarTitleText": "单版辊绑定信息作废"
} }
},{ },{
"path": "pages/warehouse/inbound/emptyTray", "path": "pages/warehouse/inbound/emptyTray",

View File

@@ -1,5 +1,5 @@
<template> <template>
<view class="page-container"> <view class="page-container" style="margin-top: 50rpx;">
<!-- 顶部区域 --> <!-- 顶部区域 -->
<view class="header"> <view class="header">
<view class="header-info"> <view class="header-info">
@@ -19,7 +19,7 @@
<uni-icons type="download" size="28" color="#fff"></uni-icons> <uni-icons type="download" size="28" color="#fff"></uni-icons>
</view> </view>
<text class="menu-label">入库管理</text> <text class="menu-label">入库管理</text>
<text class="menu-desc">入库绑盘 / 补料入库</text> <text class="menu-desc">入库绑盘 / 空托入库</text>
</view> </view>
<view class="menu-item" @click="navigateTo('/pages/warehouse/outbound/index')"> <view class="menu-item" @click="navigateTo('/pages/warehouse/outbound/index')">
@@ -27,7 +27,7 @@
<uni-icons type="upload" size="28" color="#fff"></uni-icons> <uni-icons type="upload" size="28" color="#fff"></uni-icons>
</view> </view>
<text class="menu-label">出库管理</text> <text class="menu-label">出库管理</text>
<text class="menu-desc">出库确认 / 异常确认</text> <text class="menu-desc">出库确认 / 空托呼叫</text>
</view> </view>
<view class="menu-item" @click="navigateTo('/pages/warehouse/inventory/index')"> <view class="menu-item" @click="navigateTo('/pages/warehouse/inventory/index')">

View File

@@ -68,21 +68,25 @@
<text class="info-label">物料名称</text> <text class="info-label">物料名称</text>
<text class="info-value">{{ currentMaterial.productName }}</text> <text class="info-value">{{ currentMaterial.productName }}</text>
</view> --> </view> -->
<view class="info-row">
<text class="info-label">子单号</text>
<text class="info-value">{{ currentMaterial.stockinDetailId }}</text>
</view>
<view class="info-row"> <view class="info-row">
<text class="info-label">辊号</text> <text class="info-label">辊号</text>
<text class="info-value">{{ currentMaterial.rollerNumber }}</text> <text class="info-value">{{ currentMaterial.rollerNumber }}</text>
</view> </view>
<view class="info-row">
<text class="info-label">产品名称</text>
<text class="info-value">{{ currentMaterial.productName }}</text>
</view>
<view class="info-row"> <view class="info-row">
<text class="info-label">颜色</text> <text class="info-label">版长</text>
<text class="info-value">{{ currentMaterial.color }}</text> <text class="info-value">{{ currentMaterial.length }}</text>
</view> </view>
<!-- <view class="info-row"> <view class="info-row">
<text class="info-label">色序</text> <text class="info-label">版周</text>
<text class="info-value">{{ currentMaterial.colorSequence }}</text> <text class="info-value">{{ currentMaterial.perimeter }}</text>
</view> -->
<view class="info-row">
<text class="info-label">子单号</text>
<text class="info-value">{{ currentMaterial.stockinDetailId }}</text>
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">绑定数量</text> <text class="form-label">绑定数量</text>
@@ -114,17 +118,17 @@
<text class="item-label">辊号</text> <text class="item-label">辊号</text>
<text class="item-value">{{ item.rollerNumber }}</text> <text class="item-value">{{ item.rollerNumber }}</text>
</view> </view>
<!-- <view class="item-row"> <view class="item-row">
<text class="item-label">色序</text> <text class="item-label">产品名称</text>
<text class="item-value">{{ item.colorSequence }}</text> <text class="item-value">{{ item.productName }}</text>
</view> -->
<view class="item-row">
<text class="item-label">颜色</text>
<text class="item-value">{{ item.color }}</text>
</view> </view>
<view class="item-row"> <view class="item-row">
<text class="item-label">规格</text> <text class="item-label">版长</text>
<text class="item-value">{{ item.spec }}</text> <text class="item-value">{{ item.length }}</text>
</view>
<view class="item-row">
<text class="item-label">版周</text>
<text class="item-value">{{ item.perimeter }}</text>
</view> </view>
<view class="item-row"> <view class="item-row">
<text class="item-label">绑定数量</text> <text class="item-label">绑定数量</text>
@@ -157,7 +161,7 @@
</template> </template>
<script> <script>
import { getMaterialByDetailId, getMaterialByRollerNumber, submitBindTray, submitBindTrayMsg, submitAddInJob, getInboundStockList, getDetailList } from '@/api/warehouse/inbound' import { getMaterialByDetailId, getMaterialByRollerNumber, submitBindTray, submitBindTrayMsg, submitAddInJob, getInboundStockList, getDetailList } from '@/api/warehouse/inbound/bindTray'
export default { export default {
data() { data() {
@@ -556,7 +560,7 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
padding: 20rpx 0; padding: 10rpx 0;
border: none; border: none;
} }

View File

@@ -63,7 +63,7 @@
</template> </template>
<script> <script>
import { getMaterialByDetailId, getTrayMsgByRollerNumber, submitCancelTray, submitCancelTrayMsg } from '@/api/warehouse/inbound' import { getMaterialByDetailId, getTrayMsgByRollerNumber, submitCancelTrayMsg } from '@/api/warehouse/inbound/cancelBindTrayByRoller'
export default { export default {
data() { data() {

View File

@@ -0,0 +1,424 @@
<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 inTrayMsgList" :key="index">
<view class="scan-header">
<text class="scan-title">绑定信息</text>
<view class="info-btn">
<button class="scan-btn-text red" @click="submitCancelTrayAction(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.productName }}</text>
</view>
<view class="info-row">
<text class="info-label">版长</text>
<text class="info-value">{{ item.length }}</text>
</view>
<view class="info-row">
<text class="info-label">版周</text>
<text class="info-value">{{ item.perimeter }}</text>
</view>
</view>
<!-- 操作按钮 -->
<view class="btn-section" >
<button class="btn btn-orange" v-if="inTrayMsgList" @click="cancelBindTrayMsgsAll">取消全部</button>
<button class="btn btn-default" @click="resetForm">重置</button>
</view>
</view>
</template>
<script>
import { getTrayCodeDetail } from '@/api/warehouse/inbound/cancelBindTrayByTrayCode'
import { cancelTrayMsg } from '@/api/warehouse/inbound/cancelBindTrayByTrayCode'
import { cancelTrayMsgAllByTrayCode } from '@/api/warehouse/inbound/cancelBindTrayByTrayCode'
export default {
data() {
return {
taskNo: '',
barcode: '',
traCode: '',
outInventoryInfo: null,
inTrayMsgList: [],
confirmQty: '',
form: {
remark: ''
},
productDetailStatusMap: {
1: '正常',
2: '异常产品',
},
}
},
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.inTrayMsgList = res.data
} else if (res.data) {
that.inTrayMsgList = [res.data]
} else {
that.inTrayMsgList = []
}
if (that.inTrayMsgList.length > 0) {
that.$modal.msgSuccess('获取到 ' + that.inTrayMsgList.length + ' 条绑定信息')
} else {
that.$modal.msg('未找到该托盘信息')
}
}).catch(function() {
that.inTrayMsgList = []
that.$modal.msg('找不到托盘明细信息,可能是任务类型不符或已确认出库完成')
})
},
// 取消版辊绑定信息
submitCancelTrayAction(item) {
// 构造你需要的参数
var params = {
barcode: item.rollerNumber,
productStatus: item.productStatus
}
uni.showLoading({ title: '提交中...' })
// TODO: 替换为你实际的后端确认接口
cancelTrayMsg(params).then(res => {
uni.hideLoading()
this.$modal.msgSuccess('版辊 ' + item.rollerNumber + ' 绑盘信息已取消')
// 可选:出库成功后从列表中移除该项,避免重复点击
this.inTrayMsgList = this.inTrayMsgList.filter(i => i.rollerNumber !== item.rollerNumber)
}).catch(err => {
// uni.hideLoading()
// this.$modal.msg('出库失败', err)
})
},
//托盘物料盘点完成确认回流
cancelBindTrayMsgsAll() {
if (!this.barcode) {
this.$modal.msg('请输入托盘号')
return
}
var data = {
// taskNo: this.taskNo,
barcode: this.barcode,
}
// console.log(this.barcode)
this.$modal.confirm('取消全部操作会将该托盘所有版辊绑定信息移除,确认执行吗?后续你仍然可以重新进行绑定操作').then(() => {
cancelTrayMsgAllByTrayCode(data).then(() => {
this.$modal.msgSuccess(this.barcode + '托盘绑定信息已全部取消,可继续执行绑定操作')
this.inTrayMsgList = []
this.resetForm()
}).catch(() => {
// 全局拦截器通常已处理错误弹窗,这里可只处理状态重置
// console.log('出库确认失败')
})
}).then(() => {
this.$modal.msgSuccess(this.barcode + '取消成功');
this.inTrayMsgList = []
this.resetForm();
}).catch(() => {
// 全局拦截器通常已处理错误弹窗,这里可只处理状态重置
// console.log('出库确认失败或用户取消')
});
},
resetForm() {
this.barcode = ''
this.outInventoryInfo = null
this.inTrayMsgList = []
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;
}
.scan-btn-text.green {
color: #fff;
background-color: #00aa00;
}
.scan-btn-text.red {
color: #fff;
background-color: #ef494c;
}
.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-green {
background: #0cb306;
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

@@ -30,7 +30,7 @@
</template> </template>
<script> <script>
import { getMaterialByBarcode, submitSupplyInbound, submitAddEmptyTrayJob} from '@/api/warehouse/inbound' import { getMaterialByBarcode, submitSupplyInbound, submitAddEmptyTrayJob} from '@/api/warehouse/inbound/emptyTray'
export default { export default {
data() { data() {

View File

@@ -15,14 +15,27 @@
<uni-icons type="right" size="18" color="#ccc"></uni-icons> <uni-icons type="right" size="18" color="#ccc"></uni-icons>
</view> </view>
<view class="menu-card" @click="navigateTo('/pages/warehouse/inbound/cancelBindTray')"> <view class="menu-card" @click="navigateTo('/pages/warehouse/inbound/cancelBindTrayByTrayCode')">
<view class="card-left">
<view class="card-icon red">
<uni-icons type="scan" size="24" color="#fff"></uni-icons>
</view>
<view class="card-info">
<text class="card-title">选择托盘作废绑定信息</text>
<text class="card-desc">扫描或输入托盘条码选择版辊绑盘信息作废</text>
</view>
</view>
<uni-icons type="right" size="18" color="#ccc"></uni-icons>
</view>
<view class="menu-card" @click="navigateTo('/pages/warehouse/inbound/cancelBindTrayByRoller')">
<view class="card-left"> <view class="card-left">
<view class="card-icon orange"> <view class="card-icon orange">
<uni-icons type="scan" size="24" color="#fff"></uni-icons> <uni-icons type="scan" size="24" color="#fff"></uni-icons>
</view> </view>
<view class="card-info"> <view class="card-info">
<text class="card-title">入库绑盘作废</text> <text class="card-title">版辊绑定信息作废</text>
<text class="card-desc">扫描物料条码进行绑盘作废操作</text> <text class="card-desc">扫描或输入辊号执行当前版辊绑盘信息作废</text>
</view> </view>
</view> </view>
<uni-icons type="right" size="18" color="#ccc"></uni-icons> <uni-icons type="right" size="18" color="#ccc"></uni-icons>
@@ -41,18 +54,6 @@
<uni-icons type="right" size="18" color="#ccc"></uni-icons> <uni-icons type="right" size="18" color="#ccc"></uni-icons>
</view> </view>
<!-- <view class="menu-card" @click="navigateTo('/pages/warehouse/inbound/supply')">
<view class="card-left">
<view class="card-icon green">
<uni-icons type="plus" size="24" color="#fff"></uni-icons>
</view>
<view class="card-info">
<text class="card-title">补料入库</text>
<text class="card-desc">产线补料申请入库操作</text>
</view>
</view>
<uni-icons type="right" size="18" color="#ccc"></uni-icons>
</view> -->
</view> </view>
<!-- 待处理单据 --> <!-- 待处理单据 -->
@@ -110,7 +111,7 @@
</template> </template>
<script> <script>
import { getInboundTaskList, getInboundStockList } from '@/api/warehouse/inbound' import { getInboundTaskList, getInboundStockList } from '@/api/warehouse/inbound/index'
import UniIcons from "../../../uni_modules/uni-icons/components/uni-icons/uni-icons.vue"; import UniIcons from "../../../uni_modules/uni-icons/components/uni-icons/uni-icons.vue";
export default { export default {
@@ -214,6 +215,10 @@
background: linear-gradient(135deg, #f8b12e, #f5eb69); background: linear-gradient(135deg, #f8b12e, #f5eb69);
} }
.card-icon.red {
background: linear-gradient(135deg, #df5254, #f56c6e);
}
.card-info { .card-info {
display: flex; display: flex;
flex-direction: column; flex-direction: column;

View File

@@ -54,7 +54,7 @@
</template> </template>
<script> <script>
import { getInventoryOutTaskList, getTrayCodeDetail, confirmExcetion, inventoryTrayCodeComplete } from '@/api/warehouse/inventory' import { getInventoryOutTaskList, getTrayCodeDetail, confirmExcetion, inventoryTrayCodeComplete } from '@/api/warehouse/inventory/inventoryConfirm'
export default { export default {
data() { data() {

View File

@@ -80,8 +80,8 @@
</template> </template>
<script> <script>
import { getInventoryOutTaskList } from '@/api/warehouse/inventory' import { getInventoryOutTaskList } from '@/api/warehouse/inventory/jobList'
import { inventoryTrayCodeComplete } from '@/api/warehouse/inventory' import { inventoryTrayCodeComplete } from '@/api/warehouse/inventory/jobList'
export default { export default {
data() { data() {

View File

@@ -47,12 +47,12 @@
<text class="info-value">{{ outboundInfo.color }}</text> <text class="info-value">{{ outboundInfo.color }}</text>
</view> </view>
<view class="info-row"> <view class="info-row">
<text class="info-label">色序</text> <text class="info-label">版长</text>
<text class="info-value">{{ outboundInfo.colorSequence }}</text> <text class="info-value">{{ outboundInfo.length }}</text>
</view> </view>
<view class="info-row"> <view class="info-row">
<text class="info-label">规格</text> <text class="info-label">版周</text>
<text class="info-value">{{ outboundInfo.spec }}</text> <text class="info-value">{{ outboundInfo.perimeter }}</text>
</view> </view>
<!-- <view class="info-row"> <!-- <view class="info-row">
@@ -107,7 +107,7 @@
</template> </template>
<script> <script>
import { getOutboundDetail, confirmOutbound, rollerNumberComplete } from '@/api/warehouse/outbound' import { getOutboundDetail, confirmOutbound, rollerNumberComplete } from '@/api/warehouse/outbound/confirm'
export default { export default {
data() { data() {

View File

@@ -38,7 +38,7 @@
</template> </template>
<script> <script>
import { getOutboundDetail, callStockOutForContainer, confirmOutbound } from '@/api/warehouse/outbound' import { callStockOutForContainer } from '@/api/warehouse/outbound/container'
export default { export default {
data() { data() {

View File

@@ -86,7 +86,7 @@
</template> </template>
<script> <script>
import { getOutboundDetail, submitOutboundException } from '@/api/warehouse/outbound' import { getOutboundDetail, submitOutboundException } from '@/api/warehouse/outbound/exception'
export default { export default {
data() { data() {

View File

@@ -135,7 +135,7 @@
</template> </template>
<script> <script>
import { getOutboundTaskList } from '@/api/warehouse/outbound' import { getOutboundTaskList } from '@/api/warehouse/outbound/index'
export default { export default {
data() { data() {

View File

@@ -65,7 +65,7 @@
</template> </template>
<script> <script>
import { getOutboundDetail, getTrayCodeDetail, confirmOutbound, stockoutTrayCodeComplete, stockoutTrayCodeCompleteAll } from '@/api/warehouse/outbound' import { getTrayCodeDetail, confirmOutbound, stockoutTrayCodeComplete, stockoutTrayCodeCompleteAll } from '@/api/warehouse/outbound/trayConfirm'
export default { export default {
data() { data() {

View File

@@ -69,7 +69,7 @@
</template> </template>
<script> <script>
import { getTrayCodeDetailForManual, confirmOutbound, stockoutTrayCodeCompleteManual } from '@/api/warehouse/outbound' import { getTrayCodeDetailForManual, confirmOutbound, stockoutTrayCodeCompleteManual } from '@/api/warehouse/outbound/trayConfirmManual'
export default { export default {
data() { data() {

View File

@@ -116,7 +116,7 @@ public class ApiErpService implements IApiErpService {
.stockinId((stockinId)) .stockinId((stockinId))
.inType("1") .inType("1")
.stockSource("ERP") .stockSource("ERP")
.status(StockStatusEnum.CREATE.getCode()) .status(StockStatusEnum.RUNNING.getCode())
.createDate(DateUtil.date()) .createDate(DateUtil.date())
.erpBill(docNo) .erpBill(docNo)
.warehouseId("01") .warehouseId("01")
@@ -205,7 +205,7 @@ public class ApiErpService implements IApiErpService {
.stockoutId((stockoutId)) .stockoutId((stockoutId))
.outType("1") .outType("1")
.stockSource("ERP") .stockSource("ERP")
.status(StockStatusEnum.CREATE.getCode()) .status(StockStatusEnum.RUNNING.getCode())
.createDate(DateUtil.date()) .createDate(DateUtil.date())
.erpBill(docNo) .erpBill(docNo)
.warehouseId("01") .warehouseId("01")

View File

@@ -136,13 +136,13 @@ public class BasStock extends BaseEntity
@Excel(name = "供应商名称") @Excel(name = "供应商名称")
private String supplierName; private String supplierName;
// /** 托盘类型 */ /** 版长 */
// @Excel(name = "托盘类型") @Excel(name = "版长")
// private int trayType; private BigDecimal length;
// //
// /** 托盘可用位置 */ /** 版周 */
// @Excel(name = "可用位置") @Excel(name = "版周")
// private int availablePlace; private BigDecimal perimeter;
} }

View File

@@ -46,6 +46,10 @@ public class InTrayMsg
@Excel(name = "物料编码") @Excel(name = "物料编码")
private String productId; private String productId;
/** 物料名称 */
@Excel(name = "物料名称")
private String productName;
/** 绑定数量 */ /** 绑定数量 */
@Excel(name = "绑定数量") @Excel(name = "绑定数量")
private BigDecimal quantity; private BigDecimal quantity;
@@ -78,6 +82,14 @@ public class InTrayMsg
@Excel(name = "色序") @Excel(name = "色序")
private Integer colorSequence; private Integer colorSequence;
/** 版长 */
@Excel(name = "版长")
private BigDecimal length;
/** 版周 */
@Excel(name = "版周")
private BigDecimal perimeter;
/** 颜色 */ /** 颜色 */
@Excel(name = "颜色") @Excel(name = "颜色")
private String color; private String color;

View File

@@ -19,6 +19,14 @@ public interface IInTrayMsgService
*/ */
public InTrayMsg selectInTrayMsgById(Long id); public InTrayMsg selectInTrayMsgById(Long id);
/**
* 查询入库信息
*
* @param rollerNumber 辊号
* @return 入库信息
*/
public InTrayMsg selectInTrayMsgByRollerNumber(String rollerNumber);
/** /**
* 查询入库信息列表 * 查询入库信息列表
* *
@@ -59,7 +67,6 @@ public interface IInTrayMsgService
*/ */
public int deleteInTrayMsgById(Long id); public int deleteInTrayMsgById(Long id);
/** /**
* 删除入库信息信息 * 删除入库信息信息
* *
@@ -68,7 +75,6 @@ public interface IInTrayMsgService
*/ */
public int deleteInTrayMsgByTrayCode(String trayCode); public int deleteInTrayMsgByTrayCode(String trayCode);
/** /**
* 删除入库信息信息 * 删除入库信息信息
* *
@@ -77,7 +83,6 @@ public interface IInTrayMsgService
*/ */
public int deleteInTrayMsgByRollerNumber(String rollerNumber); public int deleteInTrayMsgByRollerNumber(String rollerNumber);
/** /**
* 删除入库信息信息 * 删除入库信息信息
* *

View File

@@ -32,6 +32,18 @@ public class InTrayMsgServiceImpl implements IInTrayMsgService
return inTrayMsgMapper.selectInTrayMsgById(id); return inTrayMsgMapper.selectInTrayMsgById(id);
} }
/**
* 查询入库信息
*
* @param rollerNumber 入库信息主键
* @return 入库信息
*/
@Override
public InTrayMsg selectInTrayMsgByRollerNumber(String rollerNumber)
{
return inTrayMsgMapper.selectInTrayMsgByRollerNumber(rollerNumber);
}
/** /**
* 查询入库信息列表 * 查询入库信息列表
* *

View File

@@ -395,6 +395,7 @@ public class MydoJobServiceImpl implements IMydoJobService
//每条子任务生成一条库存信息 //每条子任务生成一条库存信息
for (MydoJobDetail detail : details){ for (MydoJobDetail detail : details){
BasStock stock = basStockService.selectBasStockByRollerNumber(detail.getRollerNumber()); BasStock stock = basStockService.selectBasStockByRollerNumber(detail.getRollerNumber());
InTrayMsg inTrayMsg = inTrayMsgService.selectInTrayMsgByRollerNumber(detail.getRollerNumber());//获取当前板棍绑定信息 - 用于插入库存和移除绑定
//常规入库没有当前板棍库存的情况 //常规入库没有当前板棍库存的情况
if (ObjUtil.isNull(stock)){ if (ObjUtil.isNull(stock)){
//物料数量固定为1,辊号唯一 //物料数量固定为1,辊号唯一
@@ -407,28 +408,18 @@ public class MydoJobServiceImpl implements IMydoJobService
.trayCode(detail.getTrayCode()) .trayCode(detail.getTrayCode())
.jobId(jobId) .jobId(jobId)
.jobDetailId(jobId + "-" + num++) .jobDetailId(jobId + "-" + num++)
.stockinId(inTrayMsgs.get(0).getStockinId())//获取单据号需要从托盘绑定信息表获取 .stockinId(inTrayMsg.getStockinId())//获取单据号需要从托盘绑定信息表获取
.stockinDetailId(inTrayMsgs.get(0).getStockinDetailId()) .stockinDetailId(inTrayMsg.getStockinDetailId())
.rollerNumber(detail.getRollerNumber()) .rollerNumber(detail.getRollerNumber())
.quantity(detail.getInQuantity()) .quantity(detail.getInQuantity())
.cargoSpaceId(mydoJob.getCargoSpaceId()) .cargoSpaceId(mydoJob.getCargoSpaceId())
.productId(detail.getProductId()) .productId(detail.getProductId())
.productName(detail.getProductName()) .productName(detail.getProductName())
.length(inTrayMsg.getLength())
.perimeter(inTrayMsg.getPerimeter())
.inDate(DateUtil.date().now()) .inDate(DateUtil.date().now())
.build() .build()
); );
log.info("【账务处理】新增库存明细,作业号:{},库存编号:{},辊号:{}", jobId, stockId, detail.getRollerNumber());
//更新实际数量 = 当前入库数量
InStockinDetail inStockinDetail = instockinDetailService.selectInStockinDetailByRollerNumber(detail.getRollerNumber());
if (ObjUtil.isNotNull(inStockinDetail)){
inStockinDetail.setAssignNum(detail.getInQuantity());
inStockinDetail.setStatus(1);
instockinDetailService.updateInStockinDetail(inStockinDetail);
}else{
log.info("【账务处理-异常提示】找不到版辊的子单明细,子单号:{},辊号:{}", inStockinDetail.getStockinDetailId(), detail.getRollerNumber());
}
}else{ }else{
//回流入库 - 已经有当前板棍的库存 - 更新货位即可 //回流入库 - 已经有当前板棍的库存 - 更新货位即可
stock.setCargoSpaceId(mydoJob.getCargoSpaceId()); stock.setCargoSpaceId(mydoJob.getCargoSpaceId());
@@ -438,13 +429,24 @@ public class MydoJobServiceImpl implements IMydoJobService
basStockService.updateBasStock(stock); basStockService.updateBasStock(stock);
} }
inTrayMsgService.deleteInTrayMsgByRollerNumber(inTrayMsg.getRollerNumber());
log.info("【账务处理】新增库存明细,移除库存辊号入库绑定信息,作业号:{},库存编号:{},辊号:{}", jobId, stockId, detail.getRollerNumber());
} //更新实际数量 = 当前入库数量
InStockinDetail inStockinDetail = instockinDetailService.selectInStockinDetailByRollerNumber(detail.getRollerNumber());
if (ObjUtil.isNotNull(inStockinDetail)){
inStockinDetail.setAssignNum(detail.getInQuantity());
inStockinDetail.setStatus(1);
instockinDetailService.updateInStockinDetail(inStockinDetail);
}else{
log.info("【账务处理-异常提示】找不到版辊的子单明细,子单号:{},辊号:{}", inStockinDetail.getStockinDetailId(), detail.getRollerNumber());
}
}//子任务循环处理
//--------------------更新货位状态-------------------- //--------------------更新货位状态--------------------
BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(mydoJob.getCargoSpaceId()); basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED);
basCargoSpaceService.updateBasCargoSpaceStatus(cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED); log.info("【账务处理】更新货位状态<占用>,作业号:{},货位:{},托盘号:{}", jobId, mydoJob.getCargoSpaceId(), mydoJob.getTrayCode());
log.info("【账务处理】更新货位状态<已占用>,作业号:{},货位:{},托盘号:{}", jobId, cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode());
//--------------------处理任务表和子任务表-------------------- //--------------------处理任务表和子任务表--------------------
//1.更新任务主表状态并移除作业 //1.更新任务主表状态并移除作业
@@ -457,9 +459,6 @@ public class MydoJobServiceImpl implements IMydoJobService
mydoJobDetailService.insertMydoJobDetailsForJobFinish(jobId); mydoJobDetailService.insertMydoJobDetailsForJobFinish(jobId);
mydoJobDetailService.deleteMydoJobDetailsByJobId(jobId); mydoJobDetailService.deleteMydoJobDetailsByJobId(jobId);
//3.移除当前托盘的绑定信息
inTrayMsgService.deleteInTrayMsgByTrayCode(mydoJob.getTrayCode());
log.info("【账务处理】移除任务数据和绑定信息,生成历史记录,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode()); log.info("【账务处理】移除任务数据和绑定信息,生成历史记录,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
return AjaxResult.success(); return AjaxResult.success();

View File

@@ -24,6 +24,7 @@ import com.ruoyi.pda.domain.AddInJobRequest;
import com.ruoyi.pda.domain.TrayMsgBinding; import com.ruoyi.pda.domain.TrayMsgBinding;
import com.ruoyi.pda.domain.BindTrayRequest; import com.ruoyi.pda.domain.BindTrayRequest;
import com.ruoyi.pda.service.IPdaService; import com.ruoyi.pda.service.IPdaService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -31,6 +32,7 @@ import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
/** /**
* 手持机 Controller * 手持机 Controller
@@ -39,7 +41,8 @@ import java.util.Map;
* @date 2026-05-11 * @date 2026-05-11
*/ */
@RestController @RestController
@RequestMapping("/pda") @RequestMapping("/pdaSevice")
@Slf4j
public class PdaController extends BaseController { public class PdaController extends BaseController {
@Autowired @Autowired
@@ -170,13 +173,29 @@ public class PdaController extends BaseController {
/** /**
* 取消入库绑盘 * 取消入库绑盘 - 单版辊取消
*/
@PostMapping("/cancelTrayMsg")
@PreAuthorize("@ss.hasPermi('in:bound:msg:cancel')")
public AjaxResult cancelTray(@RequestBody Map<String, Object> params) {
try {
String rollerNumber = (String) params.get("barcode");
return pdaService.cancelTrayMsg(rollerNumber);
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 取消入库绑盘 - 托盘全部取消
*/ */
@PostMapping("/cancelTrayMsgs") @PostMapping("/cancelTrayMsgs")
@PreAuthorize("@ss.hasPermi('in:bound:msg:cancel')") @PreAuthorize("@ss.hasPermi('in:bound:msg:cancel')")
public AjaxResult cancelTrays(@RequestBody String rollerNumber) { public AjaxResult cancelTrays(@RequestBody Map<String, Object> params) {
try { try {
return pdaService.cancelTrayMsg(rollerNumber); String trayCode = (String) params.get("barcode");
return pdaService.cancelTrayMsgAll(trayCode);
} catch (RuntimeException e) { } catch (RuntimeException e) {
return AjaxResult.error(e.getMessage()); return AjaxResult.error(e.getMessage());
} }
@@ -217,7 +236,7 @@ public class PdaController extends BaseController {
/** /**
* 入库绑盘-查询物料信息(子单号查询) * 入库绑盘-查询子单物料信息(子单号查询)
* @param detailId 子单号 * @param detailId 子单号
* @return * @return
*/ */
@@ -234,7 +253,7 @@ public class PdaController extends BaseController {
/** /**
* 入库绑盘-查询物料信息(辊号查询) * 入库绑盘-查询子单物料信息(辊号查询)
* @param rollerNumber 辊号 * @param rollerNumber 辊号
* @return * @return
*/ */
@@ -268,12 +287,33 @@ public class PdaController extends BaseController {
@PreAuthorize("@ss.hasPermi('in:bound:task:info')") @PreAuthorize("@ss.hasPermi('in:bound:task:info')")
public AjaxResult getTrayMsgByRollerNumber(String rollerNumber) { public AjaxResult getTrayMsgByRollerNumber(String rollerNumber) {
try { try {
InTrayMsg msg = pdaService.getTrayMsgByRollerNumber(rollerNumber); InTrayMsg info = pdaService.getTrayMsgByRollerNumber(rollerNumber);
if(ObjUtil.isNull(msg)){ if(ObjUtil.isNull(info)){
return AjaxResult.error("找不到当前辊号信息,请检查入库单据明细"); log.warn("【获取版辊绑定信息】找不到当前辊号的绑定信息,辊号:{}", rollerNumber);
}else{ return AjaxResult.error("找不到当前辊号的绑定信息");
return pdaService.cancelTrayMsg(rollerNumber);
} }
return AjaxResult.success(info);
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 入库绑盘作废-查询托盘已经绑定的版辊信息
* @param trayCode 托盘号
* @return
*/
@GetMapping("/getTrayBindMsgInfoByTrayCode")
@PreAuthorize("@ss.hasPermi('in:bound:task:info')")
public AjaxResult getTrayMsgsByTrayCode(String trayCode) {
try {
List<InTrayMsg> inTrayMsgs = pdaService.getTrayMsgsByTrayCode(trayCode);
if(inTrayMsgs.isEmpty()){
log.warn("【获取托盘绑定信息】找不到当前托盘的任何绑定信息,托盘号:{}", trayCode);
return AjaxResult.error();
}
return AjaxResult.success(inTrayMsgs);
} catch (RuntimeException e) { } catch (RuntimeException e) {
return AjaxResult.error(e.getMessage()); return AjaxResult.error(e.getMessage());
} }
@@ -351,7 +391,7 @@ public class PdaController extends BaseController {
/** /**
* 入库绑定 - 通过入库单据号获取所有版辊信息集合 * 入库绑定 - 通过入库单据号获取所有未扫码的版辊信息集合
* @param stockinId 托盘号 * @param stockinId 托盘号
* @return * @return
*/ */
@@ -359,7 +399,9 @@ public class PdaController extends BaseController {
@PreAuthorize("@ss.hasPermi('out:bound:task:info')") @PreAuthorize("@ss.hasPermi('out:bound:task:info')")
public AjaxResult getDetailListByStockinId(String stockinId) { public AjaxResult getDetailListByStockinId(String stockinId) {
try { try {
List<InStockinDetail> details = inStockinDetailService.selectInStockinDetailByStockinId(stockinId); List<InStockinDetail> details = inStockinDetailService.selectInStockinDetailByStockinId(stockinId)
.stream()
.filter(s -> DecimalUtil.eq(s.getScanNum(), BigDecimal.ZERO)).collect(Collectors.toList());
if(details.isEmpty()){ if(details.isEmpty()){
return AjaxResult.error(); return AjaxResult.error();
}else{ }else{

View File

@@ -0,0 +1,119 @@
package com.ruoyi.pda.controller;
import cn.hutool.core.util.ObjUtil;
import com.ruoyi.bas.stock.domain.BasStock;
import com.ruoyi.bas.stock.service.IBasStockService;
import com.ruoyi.common.TaskType;
import com.ruoyi.common.Utils.DecimalUtil;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.in.bind.domain.InTrayMsg;
import com.ruoyi.in.job.domain.MydoJob;
import com.ruoyi.in.job.service.IMydoJobService;
import com.ruoyi.in.jobdetail.domain.MydoJobDetail;
import com.ruoyi.in.stockin.domain.InStockin;
import com.ruoyi.in.stockin.service.IInStockinService;
import com.ruoyi.in.stockindetail.domain.InStockinDetail;
import com.ruoyi.in.stockindetail.service.IInStockinDetailService;
import com.ruoyi.out.stockoutdetail.domain.OutStockoutDetail;
import com.ruoyi.pda.domain.AddInJobRequest;
import com.ruoyi.pda.domain.BindTrayRequest;
import com.ruoyi.pda.domain.TrayMsgBinding;
import com.ruoyi.pda.service.IPdaService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 手持机 Controller
*
* @author ruoyi
* @date 2026-05-11
*/
@RestController
@RequestMapping("/pda")
@Slf4j
public class PdaInventoryController extends BaseController {
@Autowired
private IPdaService pdaService;
@Autowired
IMydoJobService mydoJobService;
@Autowired
IBasStockService basStockService;
//==================================== 盘点 ========================================
//==================================== 盘点 ========================================
//==================================== 盘点 ========================================
/**
* 盘点出库待处理任务列表
*/
@GetMapping("/inventoryOutTaskList")
@PreAuthorize("@ss.hasPermi('inventory:task:list')")
public TableDataInfo listInventoryTask(MydoJob mydoJob) {
mydoJob.setInOrOut(TaskType.TASKTYPE_STOCKOUT_INVENTORY);
startPage();
List<MydoJob> list = mydoJobService.selectMydoJobList(mydoJob);
return getDataTable(list);
}
/**
* 盘点-查询物料库存(托盘号查询)
* @param trayCode 托盘号
* @return
*/
@GetMapping("/getInventoryOutInfoByTrayCode")
@PreAuthorize("@ss.hasPermi('out:inventory:task:info')")
public AjaxResult getInventoryOutInfoByTrayCode(String trayCode) {
try {
MydoJob job = mydoJobService.selectMydoJobByTrayCode(trayCode);
// List<MydoJobDetail> info = pdaService.getStockoutInfoByTrayCode(trayCode);
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(trayCode);
if(ObjUtil.isNull(job) || stocks.isEmpty()){
return AjaxResult.error("找不到当前托盘出库明细,请检查作业状态");
}else{
return AjaxResult.success(stocks);
}
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 物料(版辊)库存【产品状态】异常标记
* @param params
* @return
*/
@PostMapping("/inventoryStockExcetion")
@PreAuthorize("@ss.hasPermi('out:inventory:task:info')")
public AjaxResult inventoryStockExcetion(@RequestBody Map<String, Object> params) {
return pdaService.inventoryStockExcetion(params);
}
/**
* 手动指定出库确认 - 版辊单独确认
* @param params
* @return
*/
@PostMapping("/inventoryTrayCodeComplete")
@PreAuthorize("@ss.hasPermi('out:bound:task:info')")
public AjaxResult inventoryTrayCodeComplete(@RequestBody Map<String, Object> params) {
return pdaService.inventoryTrayCodeComplete(params);
}
}

View File

@@ -0,0 +1,315 @@
package com.ruoyi.pda.controller;
import cn.hutool.core.util.ObjUtil;
import com.ruoyi.bas.stock.domain.BasStock;
import com.ruoyi.bas.stock.service.IBasStockService;
import com.ruoyi.common.TaskType;
import com.ruoyi.common.Utils.DecimalUtil;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.in.bind.domain.InTrayMsg;
import com.ruoyi.in.job.domain.MydoJob;
import com.ruoyi.in.job.service.IMydoJobService;
import com.ruoyi.in.jobdetail.domain.MydoJobDetail;
import com.ruoyi.in.stockin.domain.InStockin;
import com.ruoyi.in.stockin.service.IInStockinService;
import com.ruoyi.in.stockindetail.domain.InStockinDetail;
import com.ruoyi.in.stockindetail.service.IInStockinDetailService;
import com.ruoyi.out.stockoutdetail.domain.OutStockoutDetail;
import com.ruoyi.pda.domain.AddInJobRequest;
import com.ruoyi.pda.domain.BindTrayRequest;
import com.ruoyi.pda.domain.TrayMsgBinding;
import com.ruoyi.pda.service.IPdaService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 手持机 Controller
*
* @author ruoyi
* @date 2026-05-11
*/
@RestController
@RequestMapping("/pda")
@Slf4j
public class PdaStockinController extends BaseController {
@Autowired
private IPdaService pdaService;
@Autowired
IInStockinDetailService inStockinDetailService;
/**
* 入库待处理任务列表
*/
@GetMapping("/inboundTaskList")
@PreAuthorize("@ss.hasPermi('in:bound:task:list')")
public TableDataInfo list(InStockinDetail inStockinDetail) {
startPage();
List<InStockinDetail> list = pdaService.inboundTaskList(inStockinDetail);
return getDataTable(list);
}
/**
* 入库待处理单据列表
*/
@GetMapping("/inboundStockList")
@PreAuthorize("@ss.hasPermi('in:bound:stock:list')")
public TableDataInfo list(InStockin inStockin) {
startPage();
List<InStockin> list = pdaService.inboundStockList(inStockin);
return getDataTable(list);
}
/**
* 入库绑盘(支持一托多料)
* <p>
* 请求体示例:
* {
* "trayCode": "T001",
* "warehouseId": "WH01",
* "items": [
* { "stockinDetailId": "D001", "productId": "P001", "quantity": 10 },
* { "stockinDetailId": "D002", "productId": "P002", "quantity": 20 }
* ]
* }
*/
@PostMapping("/bindTray")
@PreAuthorize("@ss.hasPermi('in:bound:msg:add')")
public AjaxResult bindTray(@RequestBody BindTrayRequest request) {
try {
String res = pdaService.bindTray(request);
if (StringUtils.isEmpty(res)){
return AjaxResult.success();
}else {
return AjaxResult.error(res);
}
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 入库绑盘
*/
@PostMapping("/bindTrayMsg")
@PreAuthorize("@ss.hasPermi('in:bound:msg:add')")
public AjaxResult bindTray(@RequestBody TrayMsgBinding bindTray) {
try {
if (bindTray == null) {
return AjaxResult.error();
}
return pdaService.bindingTrayMsg(bindTray);
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 入库绑盘
*/
@PostMapping("/bindTrayMsgs")
@PreAuthorize("@ss.hasPermi('in:bound:msg:add')")
public AjaxResult bindTrays(@RequestBody BindTrayRequest bindTray) {
try {
if (bindTray == null) {
return AjaxResult.error();
}
return pdaService.bindingTrayMsg(bindTray);
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 取消入库绑盘 - 单版辊取消
*/
@PostMapping("/cancelTrayMsg")
@PreAuthorize("@ss.hasPermi('in:bound:msg:cancel')")
public AjaxResult cancelTray(@RequestBody Map<String, Object> params) {
try {
String rollerNumber = (String) params.get("barcode");
return pdaService.cancelTrayMsg(rollerNumber);
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 取消入库绑盘 - 托盘全部取消
*/
@PostMapping("/cancelTrayMsgs")
@PreAuthorize("@ss.hasPermi('in:bound:msg:cancel')")
public AjaxResult cancelTraysAll(@RequestBody Map<String, Object> params) {
try {
String trayCode = (String) params.get("barcode");
return pdaService.cancelTrayMsgAll(trayCode);
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 生成入库作业
* @param request
* @return
*/
@PostMapping("/addInJob")
@PreAuthorize("@ss.hasPermi('in:job:add')")
public AjaxResult addInJob(@RequestBody AddInJobRequest request){
try {
String res = pdaService.addInJob(request);
return AjaxResult.success(res);
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 生成空托盘入库绑定信息
* @param request
* @return
*/
@PostMapping("/addEmptyTrayJob")
@PreAuthorize("@ss.hasPermi('in:job:add')")
public AjaxResult addEmptyTrayJob(@RequestBody AddInJobRequest request){
try {
return pdaService.addEmptyTrayJob(request);
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 入库绑盘-查询子单物料信息(子单号查询)
* @param detailId 子单号
* @return
*/
@GetMapping("/getProductInfoByInDetailId")
@PreAuthorize("@ss.hasPermi('in:bound:task:info')")
public AjaxResult getProductInfoByInDetailId(String detailId) {
try {
InStockinDetail info = pdaService.getProductInfoByInDetailId(detailId);
return AjaxResult.success(info);
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 入库绑盘-查询子单物料信息(辊号查询)
* @param rollerNumber 辊号
* @return
*/
@GetMapping("/getStockinInfoByRollerNumber")
@PreAuthorize("@ss.hasPermi('in:bound:task:info')")
public AjaxResult getStockinInfoByRollerNumber(String rollerNumber) {
try {
InStockinDetail info = pdaService.getStockinInfoByRollerNumber(rollerNumber);
if(ObjUtil.isNull(info)){
return AjaxResult.error("找不到当前辊号信息,请检查入库单据明细");
}else{
if (DecimalUtil.eq(info.getScanNum(), BigDecimal.valueOf(0))) {
return AjaxResult.success(info);
}else{
return AjaxResult.warn("该版辊已经执行过绑定操作,请确认绑定信息");
}
}
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 入库绑盘作废-查询绑定信息(辊号查询)
* @param rollerNumber 辊号
* @return
*/
@GetMapping("/getTrayMsgByRollerNumber")
@PreAuthorize("@ss.hasPermi('in:bound:task:info')")
public AjaxResult getTrayMsgByRollerNumber(String rollerNumber) {
try {
InTrayMsg info = pdaService.getTrayMsgByRollerNumber(rollerNumber);
if(ObjUtil.isNull(info)){
log.warn("【获取版辊绑定信息】找不到当前辊号的绑定信息,辊号:{}", rollerNumber);
return AjaxResult.error("找不到当前辊号的绑定信息");
}
return AjaxResult.success(info);
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 入库绑盘作废-查询托盘已经绑定的版辊信息
* @param trayCode 托盘号
* @return
*/
@GetMapping("/getTrayBindMsgInfoByTrayCode")
@PreAuthorize("@ss.hasPermi('in:bound:task:info')")
public AjaxResult getTrayMsgsByTrayCode(String trayCode) {
try {
List<InTrayMsg> inTrayMsgs = pdaService.getTrayMsgsByTrayCode(trayCode);
if(inTrayMsgs.isEmpty()){
log.warn("【获取托盘绑定信息】找不到当前托盘的任何绑定信息,托盘号:{}", trayCode);
return AjaxResult.error();
}
return AjaxResult.success(inTrayMsgs);
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 入库绑定 - 通过入库单据号获取子单所有未扫码的明细集合
* @param stockinId 托盘号
* @return
*/
@GetMapping("/getDetailListByStockinId")
@PreAuthorize("@ss.hasPermi('out:bound:task:info')")
public AjaxResult getDetailListByStockinId(String stockinId) {
try {
List<InStockinDetail> details = inStockinDetailService.selectInStockinDetailByStockinId(stockinId)
.stream()
.filter(s -> DecimalUtil.eq(s.getScanNum(), BigDecimal.ZERO)).collect(Collectors.toList());
if(details.isEmpty()){
return AjaxResult.error();
}else{
return AjaxResult.success(details);
}
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
}

View File

@@ -0,0 +1,219 @@
package com.ruoyi.pda.controller;
import cn.hutool.core.util.ObjUtil;
import com.ruoyi.bas.stock.domain.BasStock;
import com.ruoyi.bas.stock.service.IBasStockService;
import com.ruoyi.common.TaskType;
import com.ruoyi.common.Utils.DecimalUtil;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.in.bind.domain.InTrayMsg;
import com.ruoyi.in.job.domain.MydoJob;
import com.ruoyi.in.job.service.IMydoJobService;
import com.ruoyi.in.jobdetail.domain.MydoJobDetail;
import com.ruoyi.in.stockin.domain.InStockin;
import com.ruoyi.in.stockin.service.IInStockinService;
import com.ruoyi.in.stockindetail.domain.InStockinDetail;
import com.ruoyi.in.stockindetail.service.IInStockinDetailService;
import com.ruoyi.out.stockoutdetail.domain.OutStockoutDetail;
import com.ruoyi.pda.domain.AddInJobRequest;
import com.ruoyi.pda.domain.BindTrayRequest;
import com.ruoyi.pda.domain.TrayMsgBinding;
import com.ruoyi.pda.service.IPdaService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 手持机 Controller
*
* @author ruoyi
* @date 2026-05-11
*/
@RestController
@RequestMapping("/pda")
@Slf4j
public class PdaStockoutController extends BaseController {
@Autowired
private IPdaService pdaService;
@Autowired
IMydoJobService mydoJobService;
/**
* 出库待处理任务列表
*/
@GetMapping("/outboundStockList")
@PreAuthorize("@ss.hasPermi('out:bound:stock:list')")
public TableDataInfo list(OutStockoutDetail outStockoutDetail) {
startPage();
List<OutStockoutDetail> list = pdaService.outboundTaskList(outStockoutDetail);
return getDataTable(list);
}
/**
* 出库待处理任务列表
*/
@GetMapping("/outboundTaskList")
@PreAuthorize("@ss.hasPermi('out:bound:task:list')")
public TableDataInfo listTask(MydoJob mydoJob) {
startPage();
List<MydoJob> list = pdaService.selectMydoJobToDealList(mydoJob);
return getDataTable(list);
}
/**
* 出库确认-查询出库子单物料信息(辊号查询)
* @param rollerNumber 辊号
* @return
*/
@GetMapping("/getStockoutInfoByRollerNumber")
@PreAuthorize("@ss.hasPermi('out:bound:task:info')")
public AjaxResult getStockoutInfoByRollerNumber(String rollerNumber) {
try {
OutStockoutDetail info = pdaService.getStockoutInfoByRollerNumber(rollerNumber);
if(ObjUtil.isNull(info)){
return AjaxResult.error("找不到当前辊号信息,请检查出库单据明细");
}else{
if (info.getAssignNum().equals(BigDecimal.valueOf(0))){
return AjaxResult.success(info);
}else{
return AjaxResult.warn("该版辊已经执行过出库确认操作");
}
}
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 【常规出库】出库确认 - 托盘号查询 - 仅查询托盘上出库单中包含的版辊信息
* @param trayCode 托盘号
* @return
*/
@GetMapping("/getStockoutInfoByTrayCode")
@PreAuthorize("@ss.hasPermi('out:bound:task:info')")
public AjaxResult getStockoutInfoByTrayCode(String trayCode) {
try {
MydoJob job = mydoJobService.selectMydoJobByTrayCode(trayCode);
List<MydoJobDetail> info = pdaService.getStockoutInfoByTrayCode(trayCode);
if(ObjUtil.isNull(job) || info.isEmpty()){
return AjaxResult.error("找不到当前托盘出库明细,请检查作业状态");
}else{
return AjaxResult.success(info);
}
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 【手动指定出库】出库确认 - 托盘号查询 - 仅查询托盘上出库单中包含的版辊信息
* @param trayCode 托盘号
* @return
*/
@GetMapping("/getManualStockoutInfoByTrayCode")
@PreAuthorize("@ss.hasPermi('out:bound:task:info')")
public AjaxResult getManualStockoutInfoByTrayCode(String trayCode) {
try {
MydoJob job = mydoJobService.selectMydoJobByTrayCode(trayCode);
List<MydoJobDetail> info = pdaService.getStockoutInfoByTrayCode(trayCode);
if(ObjUtil.isNull(job) || info.isEmpty() || job.getInOrOut() != TaskType.TASKTYPE_STOCKOUT_MANUAL){
return AjaxResult.error("找不到当前<手动>出库作业明细,请检查作业状态");
}else{
return AjaxResult.success(info);
}
} catch (RuntimeException e) {
return AjaxResult.error(e.getMessage());
}
}
/**
* 呼叫空托出库
* @param params 货位区域,托盘类型
* @return
*/
@PostMapping("/callStockOutForContainer")
@PreAuthorize("@ss.hasPermi('out:bound:task:info')")
public AjaxResult callStockOutForContainer(@RequestBody Map<String, Object> params) {
return pdaService.callContainerStockOut(params);
}
/**
* 物料(版辊)手动强制出库
* @param params
* @return
*/
@PostMapping("/rollerNumberComplete")
@PreAuthorize("@ss.hasPermi('out:bound:task:info')")
public AjaxResult rollerNumberComplete(@RequestBody Map<String, Object> params) {
return pdaService.rollerNumberComplete(params);
}
/**
* 出库确认 - 更新子任务中的出库数量 - 用于下一步执行托盘确认
* @param params
* @return
*/
@PostMapping("/stockoutDetailComplete")
@PreAuthorize("@ss.hasPermi('out:bound:task:info')")
public AjaxResult stockoutDetailComplete(@RequestBody Map<String, Object> params) {
return pdaService.stockoutDetailComplete(params);
}
/**
* 【常规/拣选出库】托盘出库确认 - 更新版辊出库数量
* @param trayCode
* @return
*/
@PostMapping("/stockoutTrayCodeComplete")
@PreAuthorize("@ss.hasPermi('out:bound:task:info')")
public AjaxResult stockoutTrayCodeComplete(String trayCode) {
return pdaService.stockoutTrayCodeComplete(trayCode);
}
/**
* 【手动指定出库】托盘出库确认 - 更新版辊出库数量
* @param trayCode
* @return
*/
@PostMapping("/stockoutTrayCodeCompleteManual")
@PreAuthorize("@ss.hasPermi('out:bound:task:info')")
public AjaxResult stockoutTrayCodeCompleteManual(String trayCode) {
return pdaService.stockoutTrayCodeCompleteManual(trayCode);
}
/**
* 出库确认 - 一键确认 - 托盘统一更新出库数量
* @param trayCode
* @return
*/
@PostMapping("/stockoutTrayCodeCompleteAll")
@PreAuthorize("@ss.hasPermi('out:bound:task:info')")
public AjaxResult stockoutTrayCodeCompleteAll(String trayCode) {
return pdaService.stockoutTrayCodeCompleteAll(trayCode);
}
}

View File

@@ -55,6 +55,10 @@ public class BindTrayRequest {
// @NotNull // @NotNull
private String productId; private String productId;
/** 物料名称 */
// @NotNull
private String productName;
/** 绑定数量 */ /** 绑定数量 */
@NotNull @NotNull
private BigDecimal quantity; private BigDecimal quantity;
@@ -71,6 +75,12 @@ public class BindTrayRequest {
/** 规格 */ /** 规格 */
private String spec; private String spec;
/** 版长 */
private BigDecimal length;
/** 版周 */
private BigDecimal perimeter;
} }
} }

View File

@@ -63,13 +63,21 @@ public interface IPdaService {
AjaxResult bindingTrayMsg(BindTrayRequest bindTray); AjaxResult bindingTrayMsg(BindTrayRequest bindTray);
/** /**
* 取消入库绑盘(多托) * 取消入库绑盘
* *
* @param rollerNumber 绑盘请求体,包含托盘号和物料明细列表 * @param rollerNumber 辊号
* @return 成功插入条数 * @return 成功插入条数
*/ */
AjaxResult cancelTrayMsg(String rollerNumber); AjaxResult cancelTrayMsg(String rollerNumber);
/**
* 取消入库绑盘(整托)
*
* @param trayCode 托盘号
* @return
*/
AjaxResult cancelTrayMsgAll(String trayCode);
/** /**
* 入库绑盘-查询物料信息 * 入库绑盘-查询物料信息
* @param detailId 入库子单号 * @param detailId 入库子单号
@@ -91,6 +99,12 @@ public interface IPdaService {
*/ */
InTrayMsg getTrayMsgByRollerNumber(String rollerNumber); InTrayMsg getTrayMsgByRollerNumber(String rollerNumber);
/**
* 入库绑盘作废-查询托盘绑定版辊信息集合
* @param trayCode 托盘号
* @return
*/
List<InTrayMsg> getTrayMsgsByTrayCode(String trayCode);
/** /**
* 出库确认-查询物料信息 * 出库确认-查询物料信息
@@ -99,7 +113,6 @@ public interface IPdaService {
*/ */
OutStockoutDetail getStockoutInfoByRollerNumber(String rollerNumber); OutStockoutDetail getStockoutInfoByRollerNumber(String rollerNumber);
/** /**
* 出库确认-查询物料信息 * 出库确认-查询物料信息
* @param trayCode 托盘号 * @param trayCode 托盘号

View File

@@ -197,6 +197,11 @@ public class PdaServiceImpl implements IPdaService {
new InTrayMsg().builder() new InTrayMsg().builder()
.trayCode(trayCode) .trayCode(trayCode)
.productId(bindTrayMsg.getRollerNumber()) .productId(bindTrayMsg.getRollerNumber())
.productName(detail.getProductName())
.color(detail.getColor())
.colorSequence(detail.getColorSequence())
.length(detail.getLength())
.perimeter(detail.getPerimeter())
.quantity(bindTrayMsg.getQuantity()) .quantity(bindTrayMsg.getQuantity())
.rollerNumber(bindTrayMsg.getRollerNumber()) .rollerNumber(bindTrayMsg.getRollerNumber())
.stockinId(detail.getStockinId()) .stockinId(detail.getStockinId())
@@ -313,10 +318,15 @@ public class PdaServiceImpl implements IPdaService {
new InTrayMsg().builder() new InTrayMsg().builder()
.trayCode(trayCode) .trayCode(trayCode)
.productId(item.getProductId()) .productId(item.getProductId())
.productName(item.getProductName())
.quantity(item.getQuantity()) .quantity(item.getQuantity())
.rollerNumber(item.getRollerNumber()) .rollerNumber(item.getRollerNumber())
.stockinId(detail.getStockinId()) .stockinId(detail.getStockinId())
.stockinDetailId(detail.getStockinDetailId()) .stockinDetailId(detail.getStockinDetailId())
.color(detail.getColor())
.colorSequence(detail.getColorSequence())
.length(detail.getLength())
.perimeter(detail.getPerimeter())
.warehouseId("01") .warehouseId("01")
.trayType(type) .trayType(type)
.status(trayMsgStatus) .status(trayMsgStatus)
@@ -349,9 +359,10 @@ public class PdaServiceImpl implements IPdaService {
public AjaxResult cancelTrayMsg(String rollerNumber){ public AjaxResult cancelTrayMsg(String rollerNumber){
//======================作废版辊绑定信息====================== //======================作废版辊绑定信息======================
if(StrUtil.isBlank(rollerNumber)){ InTrayMsg msg = getTrayMsgByRollerNumber(rollerNumber);
log.warn("【操作失败】找不到当前版辊的绑定信息,版辊号:{}", rollerNumber); if(ObjUtil.isNull(msg)){
return AjaxResult.error("【操作失败】找不到当前版辊的绑定信息"); log.warn("【操作失败】找不到当前辊号的绑定信息,请检查是否执行过绑定操作,辊号:{}", rollerNumber);
return AjaxResult.error("找不到当前辊号信息,请检查是否执行过绑定操作,辊号:" + rollerNumber);
} }
inTrayMsgService.deleteInTrayMsgByRollerNumber(rollerNumber); inTrayMsgService.deleteInTrayMsgByRollerNumber(rollerNumber);
@@ -360,6 +371,7 @@ public class PdaServiceImpl implements IPdaService {
InStockinDetail detail = inStockinDetailService.selectInStockinDetailByRollerNumber(rollerNumber); InStockinDetail detail = inStockinDetailService.selectInStockinDetailByRollerNumber(rollerNumber);
if (ObjUtil.isNotNull(detail)){ if (ObjUtil.isNotNull(detail)){
detail.setScanNum(BigDecimal.valueOf(0)); detail.setScanNum(BigDecimal.valueOf(0));
detail.setStatus(0);
inStockinDetailService.updateInStockinDetail(detail); inStockinDetailService.updateInStockinDetail(detail);
log.info("【操作成功】辊号:<{}>的出库子单明细扫描数量已更新为初始状态", rollerNumber); log.info("【操作成功】辊号:<{}>的出库子单明细扫描数量已更新为初始状态", rollerNumber);
} }
@@ -369,6 +381,37 @@ public class PdaServiceImpl implements IPdaService {
} }
@Override
public AjaxResult cancelTrayMsgAll(String trayCode){
//======================作废版辊绑定信息======================
if(StrUtil.isBlank(trayCode)){
log.warn("【操作失败】托盘条码空,请输入有效的托盘条码,条码:{}", trayCode);
return AjaxResult.error("【操作失败】托盘条码空,请输入有效的托盘条码");
}
List<InTrayMsg> msgs = getTrayMsgsByTrayCode(trayCode);
if (msgs.isEmpty()){
log.warn("【操作失败】找不到该托盘的任何绑定信息,请确认该托盘是否已经执行过绑定操作,托盘号:{}", trayCode);
return AjaxResult.error("【操作失败】找不到该托盘的绑定信息,请确认该托盘是否已经执行过绑定操");
}
inTrayMsgService.deleteInTrayMsgByTrayCode(trayCode);
log.info("【操作成功】已经取消托盘号:<{}>的所有版辊绑定信息", trayCode);
for (InTrayMsg msg : msgs){
InStockinDetail detail = inStockinDetailService.selectInStockinDetailByRollerNumber(msg.getRollerNumber());
if (ObjUtil.isNotNull(detail)){
detail.setScanNum(BigDecimal.valueOf(0));
detail.setStatus(0);
inStockinDetailService.updateInStockinDetail(detail);
log.info("【操作成功】辊号:<{}>的出库子单明细扫描数量已更新为初始状态,子单号:{}", detail.getStockinDetailId(), msg.getRollerNumber());
}
}
return AjaxResult.success("操作成功");
}
@Override @Override
public InStockinDetail getProductInfoByInDetailId(String detailId) { public InStockinDetail getProductInfoByInDetailId(String detailId) {
return inStockinDetailMapper.selectInStockinDetailByStockinDetailId(detailId); return inStockinDetailMapper.selectInStockinDetailByStockinDetailId(detailId);
@@ -397,6 +440,14 @@ public class PdaServiceImpl implements IPdaService {
} }
@Override
public List<InTrayMsg> getTrayMsgsByTrayCode(String trayCode){
return inTrayMsgService.selectInTrayMsgList(
new InTrayMsg().builder().trayCode(trayCode).build()
);
}
@Override @Override
public OutStockoutDetail getStockoutInfoByRollerNumber(String rollerNumber) { public OutStockoutDetail getStockoutInfoByRollerNumber(String rollerNumber) {
return outStockoutDetailService.selectOutStockoutDetailByRollerNumber(rollerNumber); return outStockoutDetailService.selectOutStockoutDetailByRollerNumber(rollerNumber);

View File

@@ -3,6 +3,7 @@ package com.ruoyi.scheduleTask;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjUtil;
import com.ruoyi.api.service.IApiWcsService; import com.ruoyi.api.service.IApiWcsService;
import com.ruoyi.bas.cargospace.domain.BasCargoSpace;
import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService; import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService;
import com.ruoyi.bas.id.job.service.IBasJobIdService; import com.ruoyi.bas.id.job.service.IBasJobIdService;
import com.ruoyi.bas.stock.domain.BasStock; import com.ruoyi.bas.stock.domain.BasStock;
@@ -11,6 +12,7 @@ import com.ruoyi.bas.stock.service.IBasStockInfoService;
import com.ruoyi.bas.stock.service.IBasStockService; import com.ruoyi.bas.stock.service.IBasStockService;
import com.ruoyi.common.*; import com.ruoyi.common.*;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.in.bind.domain.InTrayMsg;
import com.ruoyi.in.bind.service.IInTrayMsgService; import com.ruoyi.in.bind.service.IInTrayMsgService;
import com.ruoyi.in.job.domain.MydoJob; import com.ruoyi.in.job.domain.MydoJob;
import com.ruoyi.in.job.service.IMydoJobService; import com.ruoyi.in.job.service.IMydoJobService;
@@ -61,6 +63,8 @@ public class MydoJobHandler {
IPdStockpdService pdStockpdService; IPdStockpdService pdStockpdService;
@Autowired @Autowired
IPdStockpdDetailService pdStockpdDetailService; IPdStockpdDetailService pdStockpdDetailService;
@Autowired
IInTrayMsgService inTrayMsgService;
private static final int TIMEINTERVAL_DEFAULT = 1000; private static final int TIMEINTERVAL_DEFAULT = 1000;
@@ -659,23 +663,37 @@ public class MydoJobHandler {
//每条子任务生成一条库存信息 //每条子任务生成一条库存信息
for (MydoJobDetail detail : details){ for (MydoJobDetail detail : details){
BasStock stock = basStockService.selectBasStockByRollerNumber(detail.getRollerNumber());
//物料数量固定为1,辊号唯一 InTrayMsg inTrayMsg = inTrayMsgService.selectInTrayMsgByRollerNumber(detail.getRollerNumber());//获取当前板棍绑定信息 - 用于插入库存和移除绑定
//插入库存明细信息 if (ObjUtil.isNull(inTrayMsg)){
BasStock stockInit = new BasStock().builder() //物料数量固定为1,辊号唯一
.stockId(stockId) //插入库存明细信息
.stockDetailId(stockId + "-" + num) BasStock stockInit = new BasStock().builder()
.stockStatus(BasStockCode.STOCK_STATUS_AVAILABLE) .stockId(stockId)
.jobId(mydoJob.getJobId()) .stockDetailId(stockId + "-" + num)
.jobDetailId(mydoJob.getJobId() + "-" + num++) .stockStatus(BasStockCode.STOCK_STATUS_AVAILABLE)
.rollerNumber(detail.getRollerNumber()) .jobId(mydoJob.getJobId())
.quantity(detail.getInQuantity()) .jobDetailId(mydoJob.getJobId() + "-" + num++)
.cargoSpaceId(mydoJob.getCargoSpaceId()) .stockinId(inTrayMsg.getStockinId())//获取单据号需要从托盘绑定信息表获取
.productId(detail.getProductId()) .stockinDetailId(inTrayMsg.getStockinDetailId())
.productName(detail.getProductName()) .rollerNumber(detail.getRollerNumber())
.inDate(DateUtil.date().now()) .quantity(detail.getInQuantity())
.build(); .cargoSpaceId(mydoJob.getCargoSpaceId())
basStockService.insertBasStock(stockInit); .productId(detail.getProductId())
.productName(detail.getProductName())
.length(inTrayMsg.getLength())
.perimeter(inTrayMsg.getPerimeter())
.inDate(DateUtil.date().now())
.build();
basStockService.insertBasStock(stockInit);
}else{
//回流入库 - 已经有当前板棍的库存 - 更新货位即可
stock.setCargoSpaceId(mydoJob.getCargoSpaceId());
stock.setStockStatus(BasStockCode.STOCK_STATUS_AVAILABLE);
stock.setJobId(detail.getJobId());
stock.setJobDetailId(detail.getJobDetailId());
basStockService.updateBasStock(stock);
}
//更新子单数量 //更新子单数量
InStockinDetail inStockinDetail = inStockinDetailService.selectInStockinDetailByRollerNumber(detail.getRollerNumber()); InStockinDetail inStockinDetail = inStockinDetailService.selectInStockinDetailByRollerNumber(detail.getRollerNumber());
@@ -684,18 +702,20 @@ public class MydoJobHandler {
inStockinDetail.setAssignNum(BigDecimal.ONE); inStockinDetail.setAssignNum(BigDecimal.ONE);
inStockinDetail.setStatus(1); inStockinDetail.setStatus(1);
inStockinDetailService.updateInStockinDetail(inStockinDetail); inStockinDetailService.updateInStockinDetail(inStockinDetail);
stockInit.setStockinId(inStockinDetail.getStockinId());
stockInit.setStockDetailId(inStockinDetail.getStockinDetailId());
} }
intrayMsgService.deleteInTrayMsgByRollerNumber(detail.getRollerNumber()); intrayMsgService.deleteInTrayMsgByRollerNumber(detail.getRollerNumber());
mydoJobService.insertMydoJobFinish(mydoJob.getJobId()); }//子任务循环处理
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
log.info("【账务处理-入库】任务完成,移除作业和绑定信息,更新货位信息,作业号:{}", mydoJob.getJobId()); //--------------------更新货位状态--------------------
} basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED);
log.info("【账务处理】更新货位状态<占用>,作业号:{},货位:{},托盘号:{}", mydoJob.getJobId(), mydoJob.getCargoSpaceId(), mydoJob.getTrayCode());
mydoJobService.insertMydoJobFinish(mydoJob.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
log.info("【账务处理-入库】任务完成,移除作业和绑定信息,更新货位信息,作业号:{}", mydoJob.getJobId());
} }
@@ -756,7 +776,6 @@ public class MydoJobHandler {
} }
basStockInfoService.deleteBasStockInfoByTrayCode(mydoJob.getTrayCode()); basStockInfoService.deleteBasStockInfoByTrayCode(mydoJob.getTrayCode());
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), "", CargoSpaceCode.CARGOSPACE_STATUS_AVAILABLE); basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), "", CargoSpaceCode.CARGOSPACE_STATUS_AVAILABLE);
log.info("【账务处理-出库】任务完成,移除托盘库存,更新货位和库存信息,作业号:{},托盘号:{}", mydoJob.getJobId(), mydoJob.getTrayCode()); log.info("【账务处理-出库】任务完成,移除托盘库存,更新货位和库存信息,作业号:{},托盘号:{}", mydoJob.getJobId(), mydoJob.getTrayCode());

View File

@@ -16,6 +16,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="productId" column="product_id" /> <result property="productId" column="product_id" />
<result property="productName" column="product_name" /> <result property="productName" column="product_name" />
<result property="rollerNumber" column="roller_number" /> <result property="rollerNumber" column="roller_number" />
<result property="length" column="length" />
<result property="perimeter" column="perimeter" />
<result property="rollerNumber" column="roller_number" />
<result property="quantity" column="quantity" /> <result property="quantity" column="quantity" />
<result property="jobId" column="job_id" /> <result property="jobId" column="job_id" />
<result property="jobDetailId" column="job_detail_id" /> <result property="jobDetailId" column="job_detail_id" />
@@ -36,7 +39,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<sql id="selectBasStockVo"> <sql id="selectBasStockVo">
select stock_id, stock_detail_id, cargo_space_id, stock_status, product_status, lot_no, in_date, back_date, product_id, product_name, roller_number, select stock_id, stock_detail_id, cargo_space_id, stock_status, product_status, lot_no, in_date, back_date, product_id, product_name, roller_number,
quantity, job_id, job_detail_id, tray_code, out_quantity, stockin_detail_id, stockin_id, in_type, warehouse_id, warehouse_name, length, perimeter, quantity, job_id, job_detail_id, tray_code, out_quantity, stockin_detail_id, stockin_id, in_type, warehouse_id, warehouse_name,
user_id, user_name, dept_id, dept_name, supplier_id, supplier_name user_id, user_name, dept_id, dept_name, supplier_id, supplier_name
from bas_stock_detail from bas_stock_detail
</sql> </sql>
@@ -44,7 +47,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectBasStockList" parameterType="BasStock" resultMap="BasStockResult"> <select id="selectBasStockList" parameterType="BasStock" resultMap="BasStockResult">
select bs.stock_id, bs.stock_detail_id, bs.cargo_space_id, bs.stock_status, bs.product_status, 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.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.length, bs.perimeter, 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.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 bs.user_id, bs.user_name, bs.dept_id, bs.dept_name, bs.supplier_id, bs.supplier_name
from bas_stock_detail bs from bas_stock_detail bs
@@ -60,6 +63,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="productId != null and productId != ''"> and bs.product_id = #{productId}</if> <if test="productId != null and productId != ''"> and bs.product_id = #{productId}</if>
<if test="productName != null and productName != ''"> and bs.product_name like concat('%', #{productName}, '%')</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="rollerNumber != null and rollerNumber != ''"> and bs.roller_number like concat('%', #{rollerNumber}, '%')</if>
<if test="length != null "> and bs.length = #{length}</if>
<if test="perimeter != null "> and bs.perimeter = #{quantity}</if>
<if test="quantity != null "> and bs.quantity = #{quantity}</if> <if test="quantity != null "> and bs.quantity = #{quantity}</if>
<if test="jobId != null and jobId != ''"> and bs.job_id = #{jobId}</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="jobDetailId != null and jobDetailId != ''"> and bs.job_detail_id = #{jobDetailId}</if>
@@ -78,7 +83,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectBasStockListForEmptyTray" parameterType="BasStock" resultMap="BasStockResult"> <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, 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.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.length, bs.perimeter, 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.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 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 from bas_stock_detail bs
@@ -94,6 +99,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<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="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="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="rollerNumber != null and rollerNumber != ''"> and bs.roller_number like concat('%', #{rollerNumber}, '%')</if>
<if test="length != null "> and bs.length = #{length}</if>
<if test="perimeter != null "> and bs.perimeter = #{quantity}</if>
<if test="quantity != null "> and bs.quantity = #{quantity}</if> <if test="quantity != null "> and bs.quantity = #{quantity}</if>
<if test="jobId != null and jobId != ''"> and bs.job_id = #{jobId}</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="jobDetailId != null and jobDetailId != ''"> and bs.job_detail_id = #{jobDetailId}</if>
@@ -143,6 +150,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="productId != null">product_id,</if> <if test="productId != null">product_id,</if>
<if test="productName != null">product_name,</if> <if test="productName != null">product_name,</if>
<if test="rollerNumber != null">roller_number,</if> <if test="rollerNumber != null">roller_number,</if>
<if test="length != null">length,</if>
<if test="perimeter != null">perimeter,</if>
<if test="quantity != null">quantity,</if> <if test="quantity != null">quantity,</if>
<if test="jobId != null">job_id,</if> <if test="jobId != null">job_id,</if>
<if test="jobDetailId != null">job_detail_id,</if> <if test="jobDetailId != null">job_detail_id,</if>
@@ -172,6 +181,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="productId != null">#{productId},</if> <if test="productId != null">#{productId},</if>
<if test="productName != null">#{productName},</if> <if test="productName != null">#{productName},</if>
<if test="rollerNumber != null">#{rollerNumber},</if> <if test="rollerNumber != null">#{rollerNumber},</if>
<if test="length != null">#{length},</if>
<if test="perimeter != null">#{perimeter},</if>
<if test="quantity != null">#{quantity},</if> <if test="quantity != null">#{quantity},</if>
<if test="jobId != null">#{jobId},</if> <if test="jobId != null">#{jobId},</if>
<if test="jobDetailId != null">#{jobDetailId},</if> <if test="jobDetailId != null">#{jobDetailId},</if>
@@ -203,6 +214,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="productId != null">product_id = #{productId},</if> <if test="productId != null">product_id = #{productId},</if>
<if test="productName != null">product_name = #{productName},</if> <if test="productName != null">product_name = #{productName},</if>
<if test="rollerNumber != null">roller_number = #{rollerNumber},</if> <if test="rollerNumber != null">roller_number = #{rollerNumber},</if>
<if test="length != null">length = #{length},</if>
<if test="perimeter != null">perimeter = #{perimeter},</if>
<if test="quantity != null">quantity = #{quantity},</if> <if test="quantity != null">quantity = #{quantity},</if>
<if test="jobId != null">job_id = #{jobId},</if> <if test="jobId != null">job_id = #{jobId},</if>
<if test="jobDetailId != null">job_detail_id = #{jobDetailId},</if> <if test="jobDetailId != null">job_detail_id = #{jobDetailId},</if>

View File

@@ -20,10 +20,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="colorSequence" column="color_sequence" /> <result property="colorSequence" column="color_sequence" />
<result property="color" column="color" /> <result property="color" column="color" />
<result property="status" column="status" /> <result property="status" column="status" />
<result property="length" column="length" />
<result property="perimeter" column="perimeter" />
</resultMap> </resultMap>
<sql id="selectInTrayMsgVo"> <sql id="selectInTrayMsgVo">
select id, tray_code, stockin_detail_id, product_id, quantity, warehouse_id, user_id, dept_id, create_time, tray_type, roller_number, color_sequence, color, status from in_tray_msg select id, tray_code, stockin_detail_id, product_id, quantity, warehouse_id, user_id, dept_id, create_time, tray_type, roller_number, color_sequence, color, length, perimeter, status from in_tray_msg
</sql> </sql>
<select id="selectInTrayMsgList" parameterType="InTrayMsg" resultMap="InTrayMsgResult"> <select id="selectInTrayMsgList" parameterType="InTrayMsg" resultMap="InTrayMsgResult">
@@ -42,6 +44,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="colorSequence != null "> and color_sequence = #{colorSequence}</if> <if test="colorSequence != null "> and color_sequence = #{colorSequence}</if>
<if test="color != null and color != ''"> and color = #{color}</if> <if test="color != null and color != ''"> and color = #{color}</if>
<if test="status != null "> and status = #{status}</if> <if test="status != null "> and status = #{status}</if>
<if test="length != null "> and length = #{length}</if>
<if test="perimeter != null "> and perimeter = #{perimeter}</if>
</where> </where>
</select> </select>
@@ -78,6 +82,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="colorSequence != null ">color_sequence,</if> <if test="colorSequence != null ">color_sequence,</if>
<if test="color != null ">color,</if> <if test="color != null ">color,</if>
<if test="status != null ">status,</if> <if test="status != null ">status,</if>
<if test="length != null ">length,</if>
<if test="perimeter != null ">perimeter,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="trayCode != null">#{trayCode},</if> <if test="trayCode != null">#{trayCode},</if>
@@ -94,6 +100,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="colorSequence != null ">#{colorSequence},</if> <if test="colorSequence != null ">#{colorSequence},</if>
<if test="color != null ">#{color},</if> <if test="color != null ">#{color},</if>
<if test="status != null ">#{status},</if> <if test="status != null ">#{status},</if>
<if test="length != null ">#{length},</if>
<if test="perimeter != null ">#{perimeter},</if>
</trim> </trim>
</insert> </insert>
@@ -114,6 +122,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="colorSequence != null ">color_sequence = #{colorSequence},</if> <if test="colorSequence != null ">color_sequence = #{colorSequence},</if>
<if test="color != null ">color = #{color},</if> <if test="color != null ">color = #{color},</if>
<if test="status != null ">status = #{status},</if> <if test="status != null ">status = #{status},</if>
<if test="length != null ">length = #{length},</if>
<if test="perimeter != null ">perimeter = #{perimeter},</if>
</trim> </trim>
where id = #{id} where id = #{id}
</update> </update>

View File

@@ -19,13 +19,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="colorSequence" column="color_sequence" /> <result property="colorSequence" column="color_sequence" />
<result property="color" column="color" /> <result property="color" column="color" />
<result property="spec" column="spec" /> <result property="spec" column="spec" />
<result property="length" column="length" />
<result property="perimeter" column="perimeter" />
</resultMap> </resultMap>
<sql id="selectOutStockoutDetailVo"> <sql id="selectOutStockoutDetailVo">
select stockout_detail_id, stockout_id, lot_no, product_id, product_name, quantity, allot_num, assign_num, roller_number, color_sequence, color, spec, status, remark from out_stockout_detail select stockout_detail_id, stockout_id, lot_no, product_id, product_name, quantity, allot_num, assign_num, roller_number, color_sequence, color, spec, length, perimeter, status, remark from out_stockout_detail
</sql> </sql>
<sql id="selectOutStockoutDetailFinishVo"> <sql id="selectOutStockoutDetailFinishVo">
select stockout_detail_id, stockout_id, lot_no, product_id, product_name, quantity, allot_num, assign_num, roller_number, color_sequence, color, spec, status, remark from out_stockout_detail_finish select stockout_detail_id, stockout_id, lot_no, product_id, product_name, quantity, allot_num, assign_num, roller_number, color_sequence, color, spec, length, perimeter, status, remark from out_stockout_detail_finish
</sql> </sql>
<select id="selectOutStockoutDetailList" parameterType="OutStockoutDetail" resultMap="OutStockoutDetailResult"> <select id="selectOutStockoutDetailList" parameterType="OutStockoutDetail" resultMap="OutStockoutDetailResult">
@@ -42,6 +44,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="colorSequence != null "> and color_sequence = #{colorSequence}</if> <if test="colorSequence != null "> and color_sequence = #{colorSequence}</if>
<if test="color != null "> and color = #{color}</if> <if test="color != null "> and color = #{color}</if>
<if test="spec != null and spec != '' "> and spec like concat('%', #{spec}, '%')</if> <if test="spec != null and spec != '' "> and spec like concat('%', #{spec}, '%')</if>
<if test="length != null"> and length = #{length}</if>
<if test="perimeter != null"> and perimeter = #{perimeter}</if>
<if test="status != null"> and status = #{status}</if> <if test="status != null"> and status = #{status}</if>
</where> </where>
</select> </select>
@@ -81,6 +85,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="color != null "> and color = #{color}</if> <if test="color != null "> and color = #{color}</if>
<if test="spec != null and spec != '' "> and spec like concat('%', #{spec}, '%')</if> <if test="spec != null and spec != '' "> and spec like concat('%', #{spec}, '%')</if>
<if test="status != null"> and status = #{status}</if> <if test="status != null"> and status = #{status}</if>
<if test="length != null"> and length = #{length}</if>
<if test="perimeter != null"> and perimeter = #{perimeter}</if>
</where> </where>
</select> </select>
@@ -101,6 +107,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="spec != null ">spec,</if> <if test="spec != null ">spec,</if>
<if test="remark != null">remark,</if> <if test="remark != null">remark,</if>
<if test="status != null">status,</if> <if test="status != null">status,</if>
<if test="length != null">length,</if>
<if test="perimeter != null">perimeter,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="stockoutDetailId != null">#{stockoutDetailId},</if> <if test="stockoutDetailId != null">#{stockoutDetailId},</if>
@@ -117,6 +125,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="spec != null ">#{spec},</if> <if test="spec != null ">#{spec},</if>
<if test="remark != null">#{remark},</if> <if test="remark != null">#{remark},</if>
<if test="status != null">#{status},</if> <if test="status != null">#{status},</if>
<if test="length != null">#{length},</if>
<if test="perimeter != null">#{perimeter},</if>
</trim> </trim>
</insert> </insert>
@@ -136,6 +146,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="spec != null ">spec = #{spec},</if> <if test="spec != null ">spec = #{spec},</if>
<if test="remark != null">remark = #{remark},</if> <if test="remark != null">remark = #{remark},</if>
<if test="status != null">status = #{status},</if> <if test="status != null">status = #{status},</if>
<if test="length != null">length = #{length},</if>
<if test="perimeter != null">perimeter = #{perimeter},</if>
</trim> </trim>
where stockout_detail_id = #{stockoutDetailId} where stockout_detail_id = #{stockoutDetailId}
</update> </update>

View File

@@ -33,6 +33,14 @@
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item label="物料名称" prop="productName">
<el-input
v-model="queryParams.productName"
placeholder="请输入物料名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="版辊编号" prop="rollerNumber"> <el-form-item label="版辊编号" prop="rollerNumber">
<el-input <el-input
v-model="queryParams.rollerNumber" v-model="queryParams.rollerNumber"
@@ -41,6 +49,22 @@
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item label="版长" prop="length">
<el-input
v-model="queryParams.length"
placeholder="请输入版长"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="版周" prop="perimeter">
<el-input
v-model="queryParams.perimeter"
placeholder="请输入版周"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="入库数量" prop="quantity"> <el-form-item label="入库数量" prop="quantity">
<el-input <el-input
v-model="queryParams.quantity" v-model="queryParams.quantity"
@@ -141,7 +165,10 @@
<el-table-column label="入库主单" align="center" prop="stockinId" /> <el-table-column label="入库主单" align="center" prop="stockinId" />
<el-table-column label="入库子单" align="center" prop="stockinDetailId" /> <el-table-column label="入库子单" align="center" prop="stockinDetailId" />
<el-table-column label="物料编码" align="center" prop="productId" /> <el-table-column label="物料编码" align="center" prop="productId" />
<el-table-column label="物料名称" align="center" prop="productName" />
<el-table-column label="版辊编号" align="center" prop="rollerNumber" /> <el-table-column label="版辊编号" align="center" prop="rollerNumber" />
<el-table-column label="版长" align="center" prop="length" />
<el-table-column label="版周" align="center" prop="perimeter" />
<el-table-column label="入库数量" align="center" prop="quantity" /> <el-table-column label="入库数量" align="center" prop="quantity" />
<el-table-column label="用户编码" align="center" prop="userId" /> <el-table-column label="用户编码" align="center" prop="userId" />
<el-table-column label="部门编码" align="center" prop="deptId" /> <el-table-column label="部门编码" align="center" prop="deptId" />
@@ -151,20 +178,15 @@
<dict-tag :options="dict.type.in_tray_msg_status" :value="scope.row.status" /> <dict-tag :options="dict.type.in_tray_msg_status" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column label="${comment}" align="center" prop="jobId" /> <!-- <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="jobDetailId" />-->
<!-- <el-table-column label="${comment}" align="center" prop="supplierId" /> <!-- <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="spec" />-->
<el-table-column label="${comment}" align="center" prop="rollerNumber" /> <!-- <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="diameter" />-->
<el-table-column label="${comment}" align="center" prop="splicingLength" /> <!-- <el-table-column label="${comment}" align="center" prop="length" />-->
<el-table-column label="${comment}" align="center" prop="plugHole" /> --> <!-- <el-table-column label="${comment}" align="center" prop="plugHole" />-->
<el-table-column label="颜色" align="center" prop="color" /> <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"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
@@ -207,6 +229,16 @@
<el-input v-model="form.rollerNumber" :disabled="isBindEmptyTray" placeholder="请输入版辊编号" /> <el-input v-model="form.rollerNumber" :disabled="isBindEmptyTray" placeholder="请输入版辊编号" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-form-item label="版长" prop="length">
<el-input v-model="form.length" placeholder="请输入版长" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="版周" prop="perimeter">
<el-input v-model="form.perimeter" placeholder="请输入版周" />
</el-form-item>
</el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="入库数量" prop="quantity"> <el-form-item label="入库数量" prop="quantity">
<el-input v-model="form.quantity" disabled placeholder="1" /> <el-input v-model="form.quantity" disabled placeholder="1" />
@@ -270,7 +302,8 @@ export default {
spec: null, spec: null,
rollerNumber: null, rollerNumber: null,
diameter: null, diameter: null,
splicingLength: null, length: null,
perimeter: null,
plugHole: null, plugHole: null,
colorSequence: null, colorSequence: null,
color: null, color: null,
@@ -333,7 +366,8 @@ export default {
spec: null, spec: null,
rollerNumber: null, rollerNumber: null,
diameter: null, diameter: null,
splicingLength: null, length: null,
perimeter: null,
plugHole: null, plugHole: null,
colorSequence: null, colorSequence: null,
color: null, color: null,

View File

@@ -226,6 +226,8 @@
<el-table-column label="物料编码" align="center" prop="productId" width="150"/> <el-table-column label="物料编码" align="center" prop="productId" width="150"/>
<el-table-column label="物料名称" align="center" prop="productName" min-width="150" show-overflow-tooltip/> <el-table-column label="物料名称" align="center" prop="productName" min-width="150" show-overflow-tooltip/>
<el-table-column label="版辊编号" align="center" prop="rollerNumber"/> <el-table-column label="版辊编号" align="center" prop="rollerNumber"/>
<el-table-column label="版长" align="center" prop="length"/>
<el-table-column label="版周" align="center" prop="perimeter"/>
<el-table-column label="计划数量" align="center" prop="quantity" width="100"/> <el-table-column label="计划数量" align="center" prop="quantity" width="100"/>
<el-table-column label="扫码数量" align="center" prop="scanNum" width="100"/> <el-table-column label="扫码数量" align="center" prop="scanNum" width="100"/>
<el-table-column label="实际数量" align="center" prop="assignNum" width="100"/> <el-table-column label="实际数量" align="center" prop="assignNum" width="100"/>
@@ -328,8 +330,8 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="仓库ID562" prop="warehouseId"> <el-form-item label="仓库ID" prop="warehouseId">
<el-input v-model="form.warehouseId" placeholder="请输入仓库ID562"/> <el-input v-model="form.warehouseId" placeholder="请输入仓库ID"/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">

View File

@@ -249,6 +249,8 @@
<el-table-column label="子单ID" align="center" prop="stockoutDetailId" width="180"/> <el-table-column label="子单ID" align="center" prop="stockoutDetailId" width="180"/>
<el-table-column label="批次" align="center" prop="lotNo" width="150"/> <el-table-column label="批次" align="center" prop="lotNo" width="150"/>
<el-table-column label="辊号" align="center" prop="rollerNumber" width="150"/> <el-table-column label="辊号" align="center" prop="rollerNumber" width="150"/>
<el-table-column label="版长" align="center" prop="length" width="150"/>
<el-table-column label="版周" align="center" prop="perimeter" width="150"/>
<el-table-column label="物料编码" align="center" prop="productId" width="150"/> <el-table-column label="物料编码" align="center" prop="productId" width="150"/>
<el-table-column label="物料名称" align="center" prop="productName" min-width="150" show-overflow-tooltip/> <el-table-column label="物料名称" align="center" prop="productName" min-width="150" show-overflow-tooltip/>
<el-table-column label="计划数量" align="center" prop="quantity" width="100"/> <el-table-column label="计划数量" align="center" prop="quantity" width="100"/>
@@ -290,6 +292,8 @@
<el-table-column type="selection" width="55" align="center"/> <el-table-column type="selection" width="55" align="center"/>
<el-table-column label="库存ID" prop="stockId" align="center"/> <el-table-column label="库存ID" prop="stockId" align="center"/>
<el-table-column label="辊号" prop="rollerNumber" align="center"/> <el-table-column label="辊号" prop="rollerNumber" align="center"/>
<el-table-column label="版长" prop="length" align="center"/>
<el-table-column label="版周" prop="perimeter" align="center"/>
<el-table-column label="物料编码" prop="productId" align="center"/> <el-table-column label="物料编码" prop="productId" align="center"/>
<el-table-column label="物料名称" prop="productName" align="center"/> <el-table-column label="物料名称" prop="productName" align="center"/>
<el-table-column label="批次" prop="lotNo" align="center"/> <el-table-column label="批次" prop="lotNo" align="center"/>

View File

@@ -183,17 +183,41 @@
style="width:140px;margin-right:8px;" style="width:140px;margin-right:8px;"
@keyup.enter.native="searchStock" @keyup.enter.native="searchStock"
/> />
<el-input
v-model="stockQuery.productId"
placeholder="物料编码"
size="small"
clearable
style="width:140px;margin-right:8px;"
@keyup.enter.native="searchStock"
/>
<el-input <el-input
v-model="stockQuery.productName" v-model="stockQuery.productName"
placeholder="物料名称" placeholder="物料名称"
size="small" size="small"
clearable clearable
style="width:160px;margin-right:8px;" style="width:140px;margin-right:8px;"
@keyup.enter.native="searchStock" @keyup.enter.native="searchStock"
/> />
<el-input <el-input
v-model="stockQuery.productId" v-model="stockQuery.rollerNumber"
placeholder="物料编码" placeholder="辊号"
size="small"
clearable
style="width:140px;margin-right:8px;"
@keyup.enter.native="searchStock"
/>
<el-input
v-model="stockQuery.length"
placeholder="版长"
size="small"
clearable
style="width:140px;margin-right:8px;"
@keyup.enter.native="searchStock"
/>
<el-input
v-model="stockQuery.perimeter"
placeholder="版周"
size="small" size="small"
clearable clearable
style="width:140px;margin-right:8px;" style="width:140px;margin-right:8px;"
@@ -228,6 +252,9 @@
<el-table-column label="货位" prop="cargoSpaceId" align="center" width="100" /> <el-table-column label="货位" prop="cargoSpaceId" align="center" width="100" />
<el-table-column label="物料编码" prop="productId" align="center" width="120" /> <el-table-column label="物料编码" prop="productId" align="center" width="120" />
<el-table-column label="物料名称" prop="productName" align="center" min-width="130" show-overflow-tooltip /> <el-table-column label="物料名称" prop="productName" align="center" min-width="130" show-overflow-tooltip />
<el-table-column label="辊号" prop="rollerNumber" align="center" width="120" />
<el-table-column label="版长" prop="length" align="center" width="120" />
<el-table-column label="版周" prop="perimeter" align="center" width="120" />
<el-table-column label="批次" prop="lotNo" align="center" width="120" /> <el-table-column label="批次" prop="lotNo" align="center" width="120" />
<el-table-column label="托盘条码" prop="trayCode" align="center" width="120" show-overflow-tooltip /> <el-table-column label="托盘条码" prop="trayCode" align="center" width="120" show-overflow-tooltip />
<el-table-column label="可用库存" prop="quantity" align="center" width="90" /> <el-table-column label="可用库存" prop="quantity" align="center" width="90" />
@@ -425,6 +452,7 @@ export default {
warehouseId: null, warehouseId: null,
productId: null, productId: null,
productName: null, productName: null,
rollerNumber: null,
lotNo: null lotNo: null
}, },
selectedStocks: [], selectedStocks: [],