现场调试更改
This commit is contained in:
152
pda/_pages.json
Normal file
152
pda/_pages.json
Normal file
@@ -0,0 +1,152 @@
|
||||
{
|
||||
"pages": [{
|
||||
"path": "pages/login",
|
||||
"style": {
|
||||
"navigationBarTitleText": "登录"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/register",
|
||||
"style": {
|
||||
"navigationBarTitleText": "注册"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "WMS 仓储管理",
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/work/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "工作台"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/mine/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "我的"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/mine/avatar/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "修改头像"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/mine/info/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "个人信息"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/mine/info/edit",
|
||||
"style": {
|
||||
"navigationBarTitleText": "编辑资料"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/mine/pwd/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "修改密码"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/mine/setting/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "应用设置"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/mine/help/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "常见问题"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/mine/about/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "关于我们"
|
||||
}
|
||||
} , {
|
||||
"path": "pages/warehouse/inbound/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "入库管理"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/warehouse/inbound/bindTray",
|
||||
"style": {
|
||||
"navigationBarTitleText": "入库绑盘"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/warehouse/inbound/emptyTray",
|
||||
"style": {
|
||||
"navigationBarTitleText": "空托入库"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/warehouse/inbound/supply",
|
||||
"style": {
|
||||
"navigationBarTitleText": "补料入库"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/warehouse/outbound/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "出库管理"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/warehouse/outbound/confirm",
|
||||
"style": {
|
||||
"navigationBarTitleText": "版辊出库确认"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/warehouse/outbound/trayConfirm",
|
||||
"style": {
|
||||
"navigationBarTitleText": "托盘出库确认"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/warehouse/outbound/exception",
|
||||
"style": {
|
||||
"navigationBarTitleText": "出库异常确认"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/warehouse/inventory/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "盘点管理"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/warehouse/stock/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "库存统计"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/common/webview/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "浏览网页"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/common/textview/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "浏览文本"
|
||||
}
|
||||
}],
|
||||
"tabBar": {
|
||||
"color": "#000000",
|
||||
"selectedColor": "#000000",
|
||||
"borderStyle": "white",
|
||||
"backgroundColor": "#ffffff",
|
||||
"list": [{
|
||||
"pagePath": "pages/index",
|
||||
"iconPath": "static/images/tabbar/home.png",
|
||||
"selectedIconPath": "static/images/tabbar/home_.png",
|
||||
"text": "首页"
|
||||
}, {
|
||||
"pagePath": "pages/work/index",
|
||||
"iconPath": "static/images/tabbar/work.png",
|
||||
"selectedIconPath": "static/images/tabbar/work_.png",
|
||||
"text": "工作台"
|
||||
}, {
|
||||
"pagePath": "pages/mine/index",
|
||||
"iconPath": "static/images/tabbar/mine.png",
|
||||
"selectedIconPath": "static/images/tabbar/mine_.png",
|
||||
"text": "我的"
|
||||
}
|
||||
]
|
||||
},
|
||||
"globalStyle": {
|
||||
"navigationBarTextStyle": "black",
|
||||
"navigationBarTitleText": "RuoYi",
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
}
|
||||
@@ -64,13 +64,13 @@
|
||||
<uni-icons type="plus" size="22" color="#52c41a"></uni-icons>
|
||||
<text class="quick-label">空托入库</text>
|
||||
</view>
|
||||
<view class="quick-item" @click="navigateTo('/pages/warehouse/outbound/confirm')">
|
||||
<view class="quick-item" @click="navigateTo('/pages/warehouse/outbound/trayConfirm')">
|
||||
<uni-icons type="checkmarkempty" size="22" color="#fa8c16"></uni-icons>
|
||||
<text class="quick-label">出库确认</text>
|
||||
</view>
|
||||
<view class="quick-item" @click="navigateTo('/pages/warehouse/outbound/exception')">
|
||||
<view class="quick-item" @click="navigateTo('/pages/warehouse/outbound/container')">
|
||||
<uni-icons type="info" size="22" color="#f5222d"></uni-icons>
|
||||
<text class="quick-label">出库异常</text>
|
||||
<text class="quick-label">呼叫空托</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
441
pda/pages/warehouse/inbound/cancelBindTray.vue
Normal file
441
pda/pages/warehouse/inbound/cancelBindTray.vue
Normal file
@@ -0,0 +1,441 @@
|
||||
<template>
|
||||
<view class="page-container">
|
||||
<!-- 任务信息 -->
|
||||
<view class="task-info" v-if="taskNo">
|
||||
<text class="task-label">任务编号</text>
|
||||
<text class="task-value">{{ taskNo }}</text>
|
||||
</view>
|
||||
|
||||
|
||||
|
||||
<!-- 扫码添加物料 -->
|
||||
<view class="scan-section">
|
||||
<view class="scan-header">
|
||||
<text class="scan-title">版辊信息</text>
|
||||
<view class="scan-btn" @click="startScan">
|
||||
<uni-icons type="scan" size="18" color="#1890ff"></uni-icons>
|
||||
<text class="scan-btn-text">扫码</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="input-wrap">
|
||||
<input class="scan-input" v-model="barcode" placeholder="请输入或扫描版辊编号"
|
||||
@confirm="handleBarcode" />
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 当前扫码物料信息(待添加) -->
|
||||
<view class="form-section" v-if="currentMaterial">
|
||||
<text class="form-title">物料信息</text>
|
||||
<!-- <view class="info-row">
|
||||
<text class="info-label">物料编码</text>
|
||||
<text class="info-value">{{ currentMaterial.productId }}</text>
|
||||
</view>
|
||||
<view class="info-row">
|
||||
<text class="info-label">物料名称</text>
|
||||
<text class="info-value">{{ currentMaterial.productName }}</text>
|
||||
</view> -->
|
||||
<view class="info-row">
|
||||
<text class="info-label">辊号</text>
|
||||
<text class="info-value">{{ currentMaterial.rollerNumber }}</text>
|
||||
</view>
|
||||
<view class="info-row">
|
||||
<text class="info-label">托盘号</text>
|
||||
<text class="info-value">{{ currentMaterial.trayCode }}</text>
|
||||
</view>
|
||||
|
||||
<view class="form-item">
|
||||
<text class="form-label">绑定数量</text>
|
||||
<input class="form-input" v-model="currentQty" disabled type="number" placeholder="请输入绑定数量" />
|
||||
</view>
|
||||
|
||||
</view>
|
||||
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<view class="btn-section">
|
||||
<button class="btn btn-danger" :disabled="!this.barcode || this.barcode.trim() === ''" @click="submitCancelTrayAction">
|
||||
确认取消绑定<!-- ({{ items.length }} 种物料) -->
|
||||
</button>
|
||||
|
||||
<button class="btn btn-default" @click="resetAll">全部重置</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getMaterialByDetailId, getTrayMsgByRollerNumber, submitCancelTray, submitCancelTrayMsg } from '@/api/warehouse/inbound'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
taskNo: '',
|
||||
trayCode: '',
|
||||
// 当前扫码
|
||||
barcode: '',
|
||||
currentMaterial: null,
|
||||
currentQty: '',
|
||||
// 已加入列表的物料
|
||||
items: []
|
||||
}
|
||||
},
|
||||
onLoad(options) {
|
||||
if (options.taskNo) {
|
||||
this.taskNo = options.taskNo
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// 调用摄像头扫码
|
||||
startScan() {
|
||||
var that = this
|
||||
uni.scanCode({
|
||||
onlyFromCamera: false,
|
||||
scanType: ['barCode', 'qrCode'],
|
||||
success: function(res) {
|
||||
that.barcode = res.result
|
||||
that.handleBarcode()
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
// 根据入库明细ID查询物料
|
||||
handleBarcode() {
|
||||
if (!this.barcode) {
|
||||
// this.$modal.msg('请输入入库子单号')
|
||||
this.$modal.msg('请输入版辊信息')
|
||||
return
|
||||
}
|
||||
var that = this
|
||||
getTrayMsgByRollerNumber(this.barcode).then(function(res) {
|
||||
that.currentMaterial = res.data
|
||||
that.currentQty = res.data.quantity ? String(res.data.quantity) : ''
|
||||
that.$modal.msgSuccess('物料信息获取成功')
|
||||
}).catch(function() {
|
||||
that.currentMaterial = null
|
||||
that.currentQty = ''
|
||||
|
||||
})
|
||||
},
|
||||
|
||||
|
||||
// 从列表中移除某条物料
|
||||
removeItem(index) {
|
||||
this.items.splice(index, 1)
|
||||
},
|
||||
|
||||
// 提交绑盘
|
||||
submitCancelTrayAction() {
|
||||
if (!this.barcode || this.barcode.trim() === "") {
|
||||
this.$modal.msg('请输入辊号')
|
||||
return
|
||||
}
|
||||
var data = {
|
||||
barcode: this.barcode,
|
||||
items: this.items.map(function(i) {
|
||||
return {
|
||||
stockinDetailId: i.stockinDetailId,
|
||||
productId: i.rollerNumber,
|
||||
rollerNumber: i.rollerNumber,
|
||||
colorSequence: i.colorSequence,
|
||||
color: i.color,
|
||||
spec: i.spec,
|
||||
quantity: i.quantity
|
||||
}
|
||||
})
|
||||
}
|
||||
var that = this
|
||||
// submitBindTray(data).then(function(res) {
|
||||
submitCancelTrayMsg(this.barcode).then(function(res) {
|
||||
that.$modal.msgSuccess(res.msg || '入库绑盘信息已作废')
|
||||
that.resetAll()
|
||||
}).catch(function() {})
|
||||
},
|
||||
|
||||
// 全部重置
|
||||
resetAll() {
|
||||
this.trayCode = ''
|
||||
this.barcode = ''
|
||||
this.currentMaterial = null
|
||||
this.currentQty = ''
|
||||
this.items = []
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
page {
|
||||
background-color: #f5f7fa;
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
.page-container {
|
||||
padding: 24rpx;
|
||||
padding-bottom: 60rpx;
|
||||
}
|
||||
|
||||
/* 任务信息 */
|
||||
.task-info {
|
||||
background: #e6f7ff;
|
||||
border-radius: 12rpx;
|
||||
padding: 20rpx 24rpx;
|
||||
margin-bottom: 24rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.task-label {
|
||||
font-size: 26rpx;
|
||||
color: #1890ff;
|
||||
}
|
||||
|
||||
.task-value {
|
||||
font-size: 26rpx;
|
||||
color: #333;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* 扫码区 */
|
||||
.scan-section {
|
||||
background: #fff;
|
||||
border-radius: 16rpx;
|
||||
padding: 28rpx;
|
||||
margin-bottom: 24rpx;
|
||||
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
|
||||
}
|
||||
|
||||
.scan-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.scan-title {
|
||||
font-size: 30rpx;
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.scan-btn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 8rpx 20rpx;
|
||||
border: 1rpx solid #1890ff;
|
||||
border-radius: 8rpx;
|
||||
}
|
||||
|
||||
.scan-btn-text {
|
||||
font-size: 24rpx;
|
||||
color: #1890ff;
|
||||
margin-left: 8rpx;
|
||||
}
|
||||
|
||||
.input-wrap {
|
||||
border: 1rpx solid #e8e8e8;
|
||||
border-radius: 8rpx;
|
||||
padding: 4rpx;
|
||||
}
|
||||
|
||||
.scan-input {
|
||||
font-size: 28rpx;
|
||||
padding: 16rpx;
|
||||
word-break: break-all;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
/* 通用 form-section */
|
||||
.form-section {
|
||||
background: #fff;
|
||||
border-radius: 16rpx;
|
||||
padding: 28rpx;
|
||||
margin-bottom: 24rpx;
|
||||
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
|
||||
}
|
||||
|
||||
.form-title {
|
||||
font-size: 30rpx;
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
margin-bottom: 24rpx;
|
||||
padding-bottom: 16rpx;
|
||||
border-bottom: 1rpx solid #f0f0f0;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.form-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 16rpx 0;
|
||||
}
|
||||
|
||||
.form-label {
|
||||
font-size: 28rpx;
|
||||
color: #666;
|
||||
width: 160rpx;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.form-input {
|
||||
flex: 1;
|
||||
font-size: 28rpx;
|
||||
border: 1rpx solid #e8e8e8;
|
||||
border-radius: 8rpx;
|
||||
padding: 16rpx;
|
||||
word-break: break-all;
|
||||
min-width: 0;
|
||||
height: auto;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.info-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 16rpx 0;
|
||||
border-bottom: 1rpx solid #f5f5f5;
|
||||
}
|
||||
|
||||
.info-label {
|
||||
font-size: 28rpx;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.info-value {
|
||||
font-size: 28rpx;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
/* 加入列表按钮 */
|
||||
.btn-add {
|
||||
margin-top: 24rpx;
|
||||
background: #1890ff;
|
||||
color: #fff;
|
||||
border-radius: 12rpx;
|
||||
font-size: 28rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 20rpx 0;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.btn-add-text {
|
||||
font-size: 28rpx;
|
||||
color: #fff;
|
||||
margin-left: 8rpx;
|
||||
}
|
||||
|
||||
/* 已添加物料列表 */
|
||||
.list-section {
|
||||
margin-bottom: 24rpx;
|
||||
}
|
||||
|
||||
.section-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 16rpx;
|
||||
}
|
||||
|
||||
.section-title {
|
||||
font-size: 30rpx;
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.item-card {
|
||||
background: #fff;
|
||||
border-radius: 16rpx;
|
||||
padding: 24rpx 28rpx;
|
||||
margin-bottom: 16rpx;
|
||||
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.item-body {
|
||||
flex: 1;
|
||||
margin-right: 20rpx;
|
||||
}
|
||||
|
||||
.item-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 8rpx 0;
|
||||
}
|
||||
|
||||
.item-label {
|
||||
font-size: 26rpx;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.item-value {
|
||||
font-size: 26rpx;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.item-value.highlight {
|
||||
color: #1890ff;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.item-delete {
|
||||
padding: 8rpx;
|
||||
}
|
||||
|
||||
/* 空状态 */
|
||||
.empty-state {
|
||||
background: #fff;
|
||||
border-radius: 16rpx;
|
||||
padding: 60rpx 0;
|
||||
margin-bottom: 24rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.empty-text {
|
||||
font-size: 28rpx;
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
/* 底部按钮 */
|
||||
.btn-section {
|
||||
padding: 8rpx 0 24rpx;
|
||||
}
|
||||
|
||||
.btn {
|
||||
font-size: 30rpx;
|
||||
border-radius: 12rpx;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background: #1890ff;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.btn-danger {
|
||||
background: #d42427;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.btn-success {
|
||||
background: #0fe825;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.btn-primary[disabled] {
|
||||
background: #b0d4f5;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.btn-default {
|
||||
background: #fff;
|
||||
color: #666;
|
||||
border: 1rpx solid #d9d9d9;
|
||||
}
|
||||
</style>
|
||||
269
pda/pages/warehouse/inbound/emptyTray.vue
Normal file
269
pda/pages/warehouse/inbound/emptyTray.vue
Normal file
@@ -0,0 +1,269 @@
|
||||
<template>
|
||||
<view class="page-container">
|
||||
<!-- 任务信息 -->
|
||||
<view class="task-info" v-if="taskNo">
|
||||
<text class="task-label">任务编号</text>
|
||||
<text class="task-value">{{ taskNo }}</text>
|
||||
</view>
|
||||
|
||||
<!-- 扫码区域 -->
|
||||
<view class="scan-section">
|
||||
<view class="scan-header">
|
||||
<text class="scan-title">托盘条码</text>
|
||||
<view class="scan-btn" @click="startScan">
|
||||
<uni-icons type="scan" size="18" color="#52c41a"></uni-icons>
|
||||
<text class="scan-btn-text green">扫码</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="input-wrap">
|
||||
<input class="scan-input" v-model="barcode" placeholder="请输入或扫描托盘条码"
|
||||
@confirm="handleBarcode" focus />
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<view class="btn-section">
|
||||
<button class="btn btn-success" @click="submitSupply">生成绑定信息</button>
|
||||
<button class="btn btn-default" @click="resetForm">重置</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getMaterialByBarcode, submitSupplyInbound, submitAddEmptyTrayJob} from '@/api/warehouse/inbound'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
taskNo: '',
|
||||
barcode: '',
|
||||
materialInfo: null,
|
||||
form: {
|
||||
lineCode: '',
|
||||
stationCode: '',
|
||||
quantity: '',
|
||||
reason: ''
|
||||
}
|
||||
}
|
||||
},
|
||||
onLoad(options) {
|
||||
if (options.taskNo) {
|
||||
this.taskNo = options.taskNo
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
startScan() {
|
||||
var that = this
|
||||
uni.scanCode({
|
||||
onlyFromCamera: false,
|
||||
scanType: ['barCode', 'qrCode'],
|
||||
success: function(res) {
|
||||
that.barcode = res.result
|
||||
that.handleBarcode()
|
||||
}
|
||||
})
|
||||
},
|
||||
handleBarcode() {
|
||||
if (!this.barcode) {
|
||||
this.$modal.msg('请输入物料条码')
|
||||
return
|
||||
}
|
||||
var that = this
|
||||
getMaterialByBarcode(this.barcode).then(function(res) {
|
||||
that.materialInfo = res.data
|
||||
that.$modal.msgSuccess('物料信息获取成功')
|
||||
}).catch(function() {
|
||||
that.materialInfo = null
|
||||
})
|
||||
},
|
||||
submitSupply() {
|
||||
if (!this.barcode) {
|
||||
this.$modal.msg('请输入托盘条码')
|
||||
return
|
||||
}
|
||||
|
||||
var data = {
|
||||
barcode: this.barcode,
|
||||
}
|
||||
|
||||
var that = this
|
||||
submitAddEmptyTrayJob(data).then(function() {
|
||||
that.$modal.msgSuccess('绑定操作成功')
|
||||
that.resetForm()
|
||||
})
|
||||
},
|
||||
resetForm() {
|
||||
this.barcode = ''
|
||||
this.materialInfo = null
|
||||
this.form = {
|
||||
lineCode: '',
|
||||
stationCode: '',
|
||||
quantity: '',
|
||||
reason: ''
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
page {
|
||||
background-color: #f5f7fa;
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
.page-container {
|
||||
padding: 24rpx;
|
||||
}
|
||||
|
||||
.task-info {
|
||||
background: #f6ffed;
|
||||
border-radius: 12rpx;
|
||||
padding: 20rpx 24rpx;
|
||||
margin-bottom: 24rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.task-label {
|
||||
font-size: 26rpx;
|
||||
color: #52c41a;
|
||||
}
|
||||
|
||||
.task-value {
|
||||
font-size: 26rpx;
|
||||
color: #333;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.scan-section {
|
||||
background: #fff;
|
||||
border-radius: 16rpx;
|
||||
padding: 28rpx;
|
||||
margin-bottom: 24rpx;
|
||||
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
|
||||
}
|
||||
|
||||
.scan-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.scan-title {
|
||||
font-size: 30rpx;
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.scan-btn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 8rpx 20rpx;
|
||||
border: 1rpx solid #52c41a;
|
||||
border-radius: 8rpx;
|
||||
}
|
||||
|
||||
.scan-btn-text {
|
||||
font-size: 24rpx;
|
||||
color: #1890ff;
|
||||
margin-left: 8rpx;
|
||||
}
|
||||
|
||||
.scan-btn-text.green {
|
||||
color: #52c41a;
|
||||
}
|
||||
|
||||
.input-wrap {
|
||||
border: 1rpx solid #e8e8e8;
|
||||
border-radius: 8rpx;
|
||||
padding: 5rpx;
|
||||
}
|
||||
|
||||
.scan-input {
|
||||
font-size: 28rpx;
|
||||
padding: 16rpx;
|
||||
word-break: break-all;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.form-section {
|
||||
background: #fff;
|
||||
border-radius: 16rpx;
|
||||
padding: 28rpx;
|
||||
margin-bottom: 24rpx;
|
||||
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
|
||||
}
|
||||
|
||||
.form-title {
|
||||
font-size: 30rpx;
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
margin-bottom: 24rpx;
|
||||
padding-bottom: 16rpx;
|
||||
border-bottom: 1rpx solid #f0f0f0;
|
||||
}
|
||||
|
||||
.form-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 16rpx 0;
|
||||
}
|
||||
|
||||
.form-label {
|
||||
font-size: 28rpx;
|
||||
color: #666;
|
||||
width: 160rpx;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.form-input {
|
||||
flex: 1;
|
||||
font-size: 28rpx;
|
||||
border: 1rpx solid #e8e8e8;
|
||||
border-radius: 8rpx;
|
||||
padding: 16rpx;
|
||||
}
|
||||
|
||||
.info-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 16rpx 0;
|
||||
border-bottom: 1rpx solid #f5f5f5;
|
||||
}
|
||||
|
||||
.info-label {
|
||||
font-size: 28rpx;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.info-value {
|
||||
font-size: 28rpx;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.btn-section {
|
||||
padding: 24rpx 0;
|
||||
}
|
||||
|
||||
.btn {
|
||||
font-size: 30rpx;
|
||||
border-radius: 12rpx;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.btn-success {
|
||||
background: #52c41a;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.btn-default {
|
||||
background: #fff;
|
||||
color: #666;
|
||||
border: 1rpx solid #d9d9d9;
|
||||
}
|
||||
</style>
|
||||
274
pda/pages/warehouse/outbound/container.vue
Normal file
274
pda/pages/warehouse/outbound/container.vue
Normal file
@@ -0,0 +1,274 @@
|
||||
<template>
|
||||
<view class="page-container">
|
||||
<!-- 任务信息 -->
|
||||
<view class="task-info" v-if="taskNo">
|
||||
<text class="task-label">出库任务编号</text>
|
||||
<text class="task-value">{{ taskNo }}</text>
|
||||
</view>
|
||||
|
||||
<!-- 扫码区域 -->
|
||||
<view class="scan-section">
|
||||
<view class="scan-header">
|
||||
<text class="scan-title">1.选择立库区域</text>
|
||||
</view>
|
||||
<picker mode="selector" :range="cargoAreaOptions" @change="onCargoAreaChange">
|
||||
<view class="form-input picker-text">
|
||||
{{ selectedCargoArea || '请选择库区' }}
|
||||
</view>
|
||||
</picker>
|
||||
</view>
|
||||
|
||||
<view class="scan-section">
|
||||
<view class="scan-header">
|
||||
<text class="scan-title">2.选择托盘类型</text>
|
||||
</view>
|
||||
<picker mode="selector" :range="palletTypeOptions" @change="onPalletTypeChange">
|
||||
<view class="form-input picker-text">
|
||||
{{ selectedPalletType || '请选择托盘类型' }}
|
||||
</view>
|
||||
</picker>
|
||||
</view>
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<view class="btn-section" >
|
||||
<button class="btn btn-orange" @click="handleCallContainer">呼叫容器出库</button>
|
||||
<button class="btn btn-default" @click="resetForm">重置</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getOutboundDetail, callStockOutForContainer, confirmOutbound } from '@/api/warehouse/outbound'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
taskNo: '',
|
||||
barcode: '',
|
||||
traCode: '',
|
||||
outboundInfo: null,
|
||||
confirmQty: '',
|
||||
form: {
|
||||
remark: ''
|
||||
},
|
||||
// 新增:下拉框选项与选中状态
|
||||
cargoAreaOptions: ['01', '02', '03', '04'],
|
||||
palletTypeOptions: [1, 2, 3],
|
||||
selectedCargoArea: '', // 库区
|
||||
selectedPalletType: '' // 托盘类型
|
||||
}
|
||||
},
|
||||
onLoad(options) {
|
||||
if (options.taskNo) {
|
||||
this.taskNo = options.taskNo
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// 处理库区选择
|
||||
onCargoAreaChange(e) {
|
||||
this.selectedCargoArea = this.cargoAreaOptions[e.detail.value]
|
||||
},
|
||||
|
||||
// 处理托盘类型选择
|
||||
onPalletTypeChange(e) {
|
||||
this.selectedPalletType = this.palletTypeOptions[e.detail.value]
|
||||
},
|
||||
|
||||
// 呼叫空托出库逻辑
|
||||
handleCallContainer() {
|
||||
if (!this.selectedCargoArea || !this.selectedPalletType) {
|
||||
this.$modal.msg('请先选择库区和托盘类型')
|
||||
return
|
||||
}
|
||||
|
||||
uni.showLoading({ title: '呼叫中...' })
|
||||
callStockOutForContainer(this.selectedCargoArea, this.selectedPalletType)
|
||||
.then(res => {
|
||||
uni.hideLoading()
|
||||
this.$modal.msgSuccess('呼叫空托出库成功')
|
||||
|
||||
})
|
||||
.catch(err => {
|
||||
uni.hideLoading()
|
||||
// this.$modal.msg('网络异常,请稍后重试')
|
||||
})
|
||||
},
|
||||
|
||||
|
||||
resetForm() {
|
||||
this.selectedCargoArea = ''
|
||||
this.selectedPalletType = ''
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
page {
|
||||
background-color: #f5f7fa;
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
.page-container {
|
||||
padding: 24rpx;
|
||||
}
|
||||
|
||||
.task-info {
|
||||
background: #fff7e6;
|
||||
border-radius: 12rpx;
|
||||
padding: 20rpx 24rpx;
|
||||
margin-bottom: 24rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.task-label {
|
||||
font-size: 26rpx;
|
||||
color: #fa8c16;
|
||||
}
|
||||
|
||||
.task-value {
|
||||
font-size: 26rpx;
|
||||
color: #333;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.scan-section {
|
||||
background: #fff;
|
||||
border-radius: 16rpx;
|
||||
padding: 28rpx;
|
||||
margin-bottom: 24rpx;
|
||||
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
|
||||
}
|
||||
|
||||
.scan-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.scan-title {
|
||||
font-size: 30rpx;
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.scan-btn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 8rpx 20rpx;
|
||||
border: 1rpx solid #fa8c16;
|
||||
border-radius: 8rpx;
|
||||
}
|
||||
|
||||
.scan-btn-text {
|
||||
font-size: 24rpx;
|
||||
margin-left: 8rpx;
|
||||
}
|
||||
|
||||
.scan-btn-text.orange {
|
||||
color: #fa8c16;
|
||||
}
|
||||
|
||||
|
||||
.scan-input {
|
||||
font-size: 28rpx;
|
||||
padding: 16rpx;
|
||||
word-break: break-all;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.form-section {
|
||||
background: #fff;
|
||||
border-radius: 16rpx;
|
||||
padding: 28rpx;
|
||||
margin-bottom: 24rpx;
|
||||
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
|
||||
}
|
||||
|
||||
.form-title {
|
||||
font-size: 30rpx;
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
margin-bottom: 24rpx;
|
||||
padding-bottom: 16rpx;
|
||||
border-bottom: 1rpx solid #f0f0f0;
|
||||
}
|
||||
|
||||
.form-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 16rpx 0;
|
||||
}
|
||||
|
||||
.form-label {
|
||||
font-size: 28rpx;
|
||||
color: #666;
|
||||
width: 160rpx;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.form-input {
|
||||
flex: 1;
|
||||
font-size: 28rpx;
|
||||
border: 1rpx solid #e8e8e8;
|
||||
border-radius: 8rpx;
|
||||
padding: 16rpx;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.info-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 16rpx 0;
|
||||
border-bottom: 1rpx solid #f5f5f5;
|
||||
}
|
||||
|
||||
.info-label {
|
||||
font-size: 28rpx;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.info-value {
|
||||
font-size: 28rpx;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.info-value.highlight {
|
||||
color: #fa8c16;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.btn-section {
|
||||
padding: 24rpx 0;
|
||||
}
|
||||
|
||||
.btn {
|
||||
font-size: 30rpx;
|
||||
border-radius: 12rpx;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.btn-orange {
|
||||
background: #fa8c16;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.btn-default {
|
||||
background: #fff;
|
||||
color: #666;
|
||||
border: 1rpx solid #d9d9d9;
|
||||
}
|
||||
|
||||
.picker-text {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: #767676;
|
||||
}
|
||||
</style>
|
||||
440
pda/pages/warehouse/outbound/trayConfirm.vue
Normal file
440
pda/pages/warehouse/outbound/trayConfirm.vue
Normal file
@@ -0,0 +1,440 @@
|
||||
<template>
|
||||
<view class="page-container">
|
||||
<!-- 任务信息 -->
|
||||
<view class="task-info" v-if="taskNo">
|
||||
<text class="task-label">出库任务编号</text>
|
||||
<text class="task-value">{{ taskNo }}</text>
|
||||
</view>
|
||||
|
||||
<!-- 扫码区域 -->
|
||||
<view class="scan-section">
|
||||
<view class="scan-header">
|
||||
<text class="scan-title">扫描出库托盘条码</text>
|
||||
<view class="scan-btn" @click="startScan">
|
||||
<uni-icons type="scan" size="18" color="#fa8c16"></uni-icons>
|
||||
<text class="scan-btn-text orange">扫码</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="input-wrap">
|
||||
<input class="scan-input" v-model="barcode" placeholder="请输入或扫描托盘条码"
|
||||
@confirm="handleBarcode" focus />
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 出库信息 -->
|
||||
<view class="form-section" v-for="(item, index) in outboundList" :key="index">
|
||||
<view class="scan-header">
|
||||
<text class="scan-title">出库信息</text>
|
||||
<view class="info-btn">
|
||||
<button class="scan-btn-text orange" @click="confirmSingleOutbound(item)">确认出库</button>
|
||||
</view>
|
||||
</view>
|
||||
<view class="info-row">
|
||||
<text class="info-label">版辊编号</text>
|
||||
<text class="info-value">{{ item.rollerNumber }}</text>
|
||||
</view>
|
||||
<view class="info-row">
|
||||
<text class="info-label">托盘库存数量</text>
|
||||
<text class="info-value">{{ item.stockQuantity }}</text>
|
||||
</view>
|
||||
<view class="info-row">
|
||||
<text class="info-label">出库数量</text>
|
||||
<!-- <text class="info-value">{{ item.outQuantity }}</text> -->
|
||||
<input
|
||||
class="form-section-input"
|
||||
type="number"
|
||||
v-model="item.outQuantity"
|
||||
:value="item.outQuantity || 0"
|
||||
placeholder="0"
|
||||
/>
|
||||
</view>
|
||||
<view class="btn-group">
|
||||
<button class="btn-max btn-reset" @click="resetItemQty(item)">重置</button>
|
||||
<button class="btn-max" @click="setMaxQty(item)">最大</button>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<view class="btn-section" >
|
||||
<button class="btn btn-orange" v-if="outboundList" @click="stockoutComplete">托盘确认出库</button>
|
||||
<button class="btn btn-default" @click="resetForm">重置</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getOutboundDetail, getTrayCodeDetail, confirmOutbound, stockoutTrayCodeComplete } from '@/api/warehouse/outbound'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
taskNo: '',
|
||||
barcode: '',
|
||||
traCode: '',
|
||||
outboundInfo: null,
|
||||
outboundList: [],
|
||||
confirmQty: '',
|
||||
form: {
|
||||
remark: ''
|
||||
}
|
||||
}
|
||||
},
|
||||
onLoad(options) {
|
||||
if (options.taskNo) {
|
||||
this.taskNo = options.taskNo
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
startScan() {
|
||||
var that = this
|
||||
uni.scanCode({
|
||||
onlyFromCamera: false,
|
||||
scanType: ['barCode', 'qrCode'],
|
||||
success: function(res) {
|
||||
that.barcode = res.result
|
||||
that.handleBarcode()
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
handleBarcode() {
|
||||
if (!this.barcode) {
|
||||
this.$modal.msg('请输入托盘条码')
|
||||
return
|
||||
}
|
||||
|
||||
var that = this
|
||||
// var params = { taskNo: this.taskNo, barcode: this.barcode }
|
||||
var params = { barcode: this.barcode }
|
||||
|
||||
getTrayCodeDetail(this.barcode).then(function(res) {
|
||||
if (Array.isArray(res.data)) {
|
||||
that.outboundList = res.data
|
||||
} else if (res.data) {
|
||||
that.outboundList = [res.data]
|
||||
} else {
|
||||
that.outboundList = []
|
||||
}
|
||||
|
||||
if (that.outboundList.length > 0) {
|
||||
that.$modal.msgSuccess('获取到 ' + that.outboundList.length + ' 条出库信息')
|
||||
} else {
|
||||
that.$modal.msg('未找到该托盘信息')
|
||||
}
|
||||
}).catch(function() {
|
||||
that.outboundList = []
|
||||
// that.$modal.msg('未找到该托盘信息,可能是未分配单据或已出库完成')
|
||||
})
|
||||
},
|
||||
|
||||
// 新增:确认单条出库请求
|
||||
confirmSingleOutbound(item) {
|
||||
// 构造你需要的参数
|
||||
var params = {
|
||||
barcode: item.rollerNumber,
|
||||
outQuantity: item.outQuantity
|
||||
}
|
||||
|
||||
uni.showLoading({ title: '提交中...' })
|
||||
// TODO: 替换为你实际的后端确认接口
|
||||
confirmOutbound(params).then(res => {
|
||||
uni.hideLoading()
|
||||
this.$modal.msgSuccess('版辊 ' + item.rollerNumber + ' 出库成功')
|
||||
|
||||
// 可选:出库成功后从列表中移除该项,避免重复点击
|
||||
this.outboundList = this.outboundList.filter(i => i.rollerNumber !== item.rollerNumber)
|
||||
}).catch(err => {
|
||||
// uni.hideLoading()
|
||||
// this.$modal.msg('出库失败', err)
|
||||
})
|
||||
},
|
||||
|
||||
|
||||
//版辊出库数量确认
|
||||
confirmOutbound() {
|
||||
if (!this.barcode) {
|
||||
this.$modal.msg('请输入托盘号')
|
||||
return
|
||||
}
|
||||
// if (!this.confirmQty) {
|
||||
// this.$modal.msg('请输入实际数量')
|
||||
// return
|
||||
// }
|
||||
|
||||
var data = {
|
||||
taskNo: this.taskNo,
|
||||
barcode: this.barcode,
|
||||
quantity: this.confirmQty,
|
||||
remark: this.form.remark
|
||||
}
|
||||
var that = this
|
||||
confirmOutbound(data).then(function() {
|
||||
that.$modal.msg('出库确认完成')
|
||||
that.resetForm()
|
||||
}).catch(() => {
|
||||
// 全局拦截器通常已处理错误弹窗,这里可只处理状态重置
|
||||
console.log('出库确认失败')
|
||||
})
|
||||
},
|
||||
|
||||
//托盘物料出库完成确认
|
||||
stockoutComplete() {
|
||||
if (!this.barcode) {
|
||||
this.$modal.msg('请输入托盘号')
|
||||
return
|
||||
}
|
||||
|
||||
// var data = {
|
||||
// // taskNo: this.taskNo,
|
||||
// barcode: this.barcode,
|
||||
// }
|
||||
|
||||
// console.log(this.barcode)
|
||||
// var that = this
|
||||
stockoutTrayCodeComplete(this.barcode).then(() => {
|
||||
that.$modal.msgSuccess(this.barcode + '出库确认成功')
|
||||
that.resetForm()
|
||||
}).catch(() => {
|
||||
// 全局拦截器通常已处理错误弹窗,这里可只处理状态重置
|
||||
// console.log('出库确认失败')
|
||||
})
|
||||
},
|
||||
|
||||
resetItemQty(item) {
|
||||
item.outQuantity = 0; // 或者重置为后端返回的默认数量
|
||||
},
|
||||
|
||||
setMaxQty(item) {
|
||||
// 假设最大数量就是 item 初始带的某个字段,比如 maxQuantity
|
||||
// 如果没有这个字段,你可以写死一个值,或者使用 item.outQuantity 的某个上限
|
||||
if (item.maxQuantity !== undefined) {
|
||||
item.outQuantity = item.maxQuantity;
|
||||
} else {
|
||||
// 兜底逻辑:如果后端没传最大数量字段,你可以自定义一个默认最大值
|
||||
item.outQuantity = 1;
|
||||
}
|
||||
},
|
||||
|
||||
resetForm() {
|
||||
this.barcode = ''
|
||||
this.outboundInfo = null
|
||||
this.outboundList = []
|
||||
this.confirmQty = ''
|
||||
this.form = {
|
||||
remark: ''
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
page {
|
||||
background-color: #f5f7fa;
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
.page-container {
|
||||
padding: 24rpx;
|
||||
}
|
||||
|
||||
.task-info {
|
||||
background: #fff7e6;
|
||||
border-radius: 12rpx;
|
||||
padding: 20rpx 24rpx;
|
||||
margin-bottom: 24rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.task-label {
|
||||
font-size: 26rpx;
|
||||
color: #fa8c16;
|
||||
}
|
||||
|
||||
.task-value {
|
||||
font-size: 26rpx;
|
||||
color: #333;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.scan-section {
|
||||
background: #fff;
|
||||
border-radius: 16rpx;
|
||||
padding: 28rpx;
|
||||
margin-bottom: 24rpx;
|
||||
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
|
||||
}
|
||||
|
||||
.scan-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.scan-title {
|
||||
font-size: 30rpx;
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.scan-btn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 8rpx 20rpx;
|
||||
border: 1rpx solid #fa8c16;
|
||||
border-radius: 8rpx;
|
||||
}
|
||||
|
||||
.scan-btn-text {
|
||||
font-size: 24rpx;
|
||||
margin-left: 8rpx;
|
||||
}
|
||||
|
||||
.scan-btn-text.orange {
|
||||
color: #fa8c16;
|
||||
}
|
||||
|
||||
.input-wrap {
|
||||
border: 1rpx solid #e8e8e8;
|
||||
border-radius: 8rpx;
|
||||
padding: 4rpx;
|
||||
}
|
||||
|
||||
.scan-input {
|
||||
font-size: 28rpx;
|
||||
padding: 16rpx;
|
||||
word-break: break-all;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.form-section {
|
||||
background: #fff;
|
||||
border-radius: 16rpx;
|
||||
padding: 28rpx;
|
||||
margin-bottom: 24rpx;
|
||||
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
|
||||
}
|
||||
|
||||
.form-title {
|
||||
font-size: 30rpx;
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
margin-bottom: 24rpx;
|
||||
padding-bottom: 16rpx;
|
||||
border-bottom: 1rpx solid #f0f0f0;
|
||||
}
|
||||
|
||||
.form-section-input {
|
||||
flex: 1;
|
||||
font-size: 28rpx; /* ✅ 关键:字体大小必须与 label 一致 */
|
||||
color: #333;
|
||||
text-align: right; /* ✅ 关键:内容靠右对齐 */
|
||||
height: 28rpx; /* ✅ 关键:明确设置高度 */
|
||||
line-height: 28rpx; /* ✅ 关键:行高必须与 label 完全一致,解决多端对齐差异 */
|
||||
padding: 0; /* ✅ 关键:清除 input 默认的 padding,防止错位 */
|
||||
margin: 0; /* 清除默认 margin */
|
||||
border: none; /* 如果需要无边框效果 */
|
||||
}
|
||||
|
||||
.form-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 16rpx 0;
|
||||
}
|
||||
|
||||
.form-label {
|
||||
font-size: 28rpx;
|
||||
color: #666;
|
||||
width: 160rpx;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.form-input {
|
||||
flex: 1;
|
||||
font-size: 28rpx;
|
||||
border: 1rpx solid #e8e8e8;
|
||||
border-radius: 8rpx;
|
||||
padding: 16rpx;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.info-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 12rpx 0;
|
||||
border-bottom: 1rpx solid #f5f5f5;
|
||||
}
|
||||
|
||||
.info-label {
|
||||
font-size: 28rpx;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.info-value {
|
||||
font-size: 28rpx;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.info-value.highlight {
|
||||
color: #fa8c16;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.btn-section {
|
||||
padding: 24rpx 0;
|
||||
}
|
||||
|
||||
.btn {
|
||||
font-size: 30rpx;
|
||||
border-radius: 12rpx;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.btn-orange {
|
||||
background: #fa8c16;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.btn-default {
|
||||
background: #fff;
|
||||
color: #666;
|
||||
border: 1rpx solid #d9d9d9;
|
||||
}
|
||||
|
||||
/* ✅ 新增:按钮组容器,让两个按钮并排 */
|
||||
.btn-group {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-left: 16rpx; /* 与输入框的间距 */
|
||||
margin-top: 10rpx;
|
||||
}
|
||||
|
||||
/* 按钮基础样式(最大按钮) */
|
||||
.btn-max {
|
||||
font-size: 22rpx;
|
||||
color: #fafafa;
|
||||
background-color: #fa8c16;
|
||||
border: 1rpx solid #fa8c16;
|
||||
border-radius: 8rpx;
|
||||
padding: 0 100rpx;
|
||||
height: 50rpx;
|
||||
line-height: 50rpx;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
/* ✅ 新增:重置按钮样式(与最大按钮之间留一点间距) */
|
||||
.btn-reset {
|
||||
color: #fa8c16;
|
||||
margin-right: 12rpx;
|
||||
background-color: #fff7e6;
|
||||
}
|
||||
|
||||
</style>
|
||||
@@ -10,10 +10,9 @@ import com.ruoyi.common.core.domain.AjaxResult;
|
||||
import com.ruoyi.log.domain.RequestLog;
|
||||
import com.ruoyi.log.service.IRequestLogService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/wmsService/wcs")
|
||||
@@ -37,6 +36,19 @@ public class WcsServiceController extends BaseController {
|
||||
return ajaxResult;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 手动指定货位出库
|
||||
*/
|
||||
@PostMapping("/stockoutByManual")
|
||||
public AjaxResult stockoutByManual(@RequestBody Map<String, String> params) {
|
||||
AjaxResult ajaxResult = apiWcsService.stockoutByManual(params);
|
||||
RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(params), "创建入库任务请求", ajaxResult);
|
||||
requestLogService.insertRequestLog(requestLog);
|
||||
return ajaxResult;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 请求补码作业
|
||||
*/
|
||||
|
||||
@@ -15,7 +15,7 @@ public interface IApiWcsService {
|
||||
* 呼叫可用容器出库
|
||||
* @return
|
||||
*/
|
||||
public AjaxResult callContainerOut(String cargoAreaId, Integer type);
|
||||
public AjaxResult callContainerOut(Map<String, Object> params);
|
||||
|
||||
/**
|
||||
* 响应wcs请求-下发入库任务
|
||||
|
||||
@@ -21,6 +21,7 @@ import com.ruoyi.bas.stock.service.IBasStockInfoService;
|
||||
import com.ruoyi.bas.stock.service.IBasStockService;
|
||||
import com.ruoyi.common.*;
|
||||
import com.ruoyi.common.core.domain.AjaxResult;
|
||||
import com.ruoyi.common.core.text.Convert;
|
||||
import com.ruoyi.common.utils.MessageUtils;
|
||||
import com.ruoyi.in.bind.domain.InTrayMsg;
|
||||
import com.ruoyi.in.bind.service.IInTrayMsgService;
|
||||
@@ -38,6 +39,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.*;
|
||||
@@ -85,26 +87,29 @@ public class ApiWcsService implements IApiWcsService {
|
||||
* @return
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public AjaxResult callContainerOut(String cargoAreaId, Integer type){
|
||||
public AjaxResult callContainerOut(Map<String, Object> params){
|
||||
|
||||
String cargoAreaId = (String) params.get("cargoAreaId");
|
||||
int type = Convert.toInt(params.get("palletType"), 0);
|
||||
|
||||
//获取立库区域和托盘类型
|
||||
List<BasCargoSpace> basCargoSpaces = basCargoSpaceService.selectAllBasCargoSpaceForStockout(
|
||||
List<BasCargoSpace> basCargoSpaceEmptyTray = basCargoSpaceService.selectBasCargoSpaceListForEmptyTray(
|
||||
new BasCargoSpace().builder().cargoAreaId(cargoAreaId).theType(type).build()
|
||||
);
|
||||
// List<BasCargoSpace> basCargoSpaceContainer = basCargoSpaceService.selectBasCargoSpaceListForContainer(
|
||||
// new BasCargoSpace().builder().cargoAreaId(cargoAreaId).theType(type).build()
|
||||
// );
|
||||
|
||||
List<BasStock> stocks = basStockService.selectBasStockList(
|
||||
new BasStock().builder().productId("KTP0001").stockStatus("1").build()
|
||||
);
|
||||
|
||||
if (stocks.isEmpty()) {
|
||||
if (basCargoSpaceEmptyTray.isEmpty()) {
|
||||
log.info("【呼叫容器】空容器呼叫失败,无可用的空容器库存");
|
||||
|
||||
//todo 此处可查存放库存较少的托盘出库
|
||||
}else{
|
||||
BasStock stock = stocks.get(0);
|
||||
//要执行容器出库的货位
|
||||
BasCargoSpace cargoSpaceCurrent = basCargoSpaceEmptyTray.get(0);
|
||||
|
||||
//检查出库货位是否触发移库作业 - 双伸货位出库查询单伸是否有货
|
||||
BasCargoSpace cargoSpaceCurrent = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(stock.getCargoSpaceId());//要出库的货位
|
||||
|
||||
if (cargoSpaceCurrent.getIssDouble().equals(CargoSpaceCode.CARGOSPACE_ISDOUBLE_Y)){//是否处于双伸位
|
||||
BasCargoSpace cargoSpaceInSide = basCargoSpaceService.selectAnotherBasCargoSpaceBySameGroup(cargoSpaceCurrent);//获取【要出库货位】对应的【单伸货位】
|
||||
//如果外侧有货,先执行移库
|
||||
@@ -159,9 +164,14 @@ public class ApiWcsService implements IApiWcsService {
|
||||
"【空托出库-移库】推送成功,作业号:{},托盘条码:{},移库货位:{},目标货位:{}", moveJob.getJobId(), moveJob.getTrayCode(), moveJob.getCargoSpaceId(), moveJob.getTargetCargoSpaceId()
|
||||
);
|
||||
|
||||
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(cargoSpaceCurrent.getTrayCode());
|
||||
if (!stocks.isEmpty()){
|
||||
for (BasStock stock : stocks) {
|
||||
//更新库存表货位【占用】状态
|
||||
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
|
||||
basStockService.updateBasStock(stock);
|
||||
}
|
||||
}
|
||||
|
||||
//更新货位表【预占用】状态
|
||||
basCargoSpaceService.updateBasCargoSpaceStatus(cargoSpaceInSide.getCargoSpaceId(),cargoSpaceInSide.getTrayCode(),CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKOUT);
|
||||
@@ -174,34 +184,40 @@ public class ApiWcsService implements IApiWcsService {
|
||||
|
||||
}
|
||||
|
||||
if (basCargoSpaces.stream().anyMatch(s -> s.getCargoSpaceId().equals(stock.getCargoSpaceId()))) {
|
||||
//生成空托出库作业
|
||||
if (mydoJobService.selectMydoJobByTrayCode(stock.getTrayCode()) == null) {
|
||||
//库存号 - 用于获取托盘号
|
||||
BasStockInfo stockInfo = basStockInfoService.selectBasStockInfoByStockId(stock.getStockId());
|
||||
//作业号
|
||||
//生成容器出库作业
|
||||
MydoJob job = mydoJobService.selectMydoJobByTrayCode(cargoSpaceCurrent.getTrayCode());
|
||||
if (ObjUtil.isNull(job)) {
|
||||
|
||||
//库存号 - 用于判断容器是【空托】或者【带货托盘】
|
||||
BasStockInfo stockInfo = basStockInfoService.selectBasStockInfoByTrayCode(cargoSpaceCurrent.getTrayCode());
|
||||
|
||||
//判断托盘【未满】或【空】区分任务类型
|
||||
String jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKOUT_EMPTY_PALLET);
|
||||
String taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKOUT_EMPTY_PALLET);
|
||||
//判断托盘【未满】或【空】区分任务类型
|
||||
int taskType = TaskType.TASKTYPE_STOCKOUT_EMPTY_TRAY;
|
||||
if (stockInfo.getEmptyStatus() > 0){
|
||||
taskType = TaskType.TASKTYPE_STOCKOUT_CONTAINER;
|
||||
}
|
||||
|
||||
MydoJob mydoJob = new MydoJob().builder()
|
||||
.jobId(jobId)
|
||||
.taskNo(taskNo)
|
||||
.inOrOut(taskType)
|
||||
.trayCode(stockInfo.getTrayCode())
|
||||
.trayCode(cargoSpaceCurrent.getTrayCode())
|
||||
.status(TaskStatusEnum.READY.getCode())
|
||||
.cargoSpaceId(stock.getCargoSpaceId())
|
||||
.cargoSpaceId(cargoSpaceCurrent.getCargoSpaceId())
|
||||
.trayType(type)
|
||||
.executionPhase("0")
|
||||
.warehouseId("01")
|
||||
.build();
|
||||
mydoJobService.insertMydoJob(mydoJob);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return AjaxResult.success();
|
||||
|
||||
|
||||
}
|
||||
|
||||
return AjaxResult.error();
|
||||
}
|
||||
|
||||
|
||||
@@ -245,27 +261,16 @@ public class ApiWcsService implements IApiWcsService {
|
||||
return AjaxResult.error("未找到该托盘的绑定信息,请确认是否有绑定操作");
|
||||
}
|
||||
|
||||
//--------------------------- 入库货位分配 ---------------------------
|
||||
//区分高矮货,只能在堆垛机上获取货物高度,高货位可放全部高度的托盘
|
||||
BasCargoSpace cargoParam;
|
||||
if (wcsStockinReiceive.getHeight() == 1){
|
||||
//低货位380H - 不限制高度
|
||||
cargoParam = new BasCargoSpace().builder().theType(type).cargoAreaId(wcsStockinReiceive.getCargoAreaId()).build();
|
||||
}else{
|
||||
//高货位510H - 只能放指定层高的货位
|
||||
cargoParam = new BasCargoSpace().builder().theType(type).cargoAreaId(wcsStockinReiceive.getCargoAreaId()).theHeight(wcsStockinReiceive.getHeight()).build();
|
||||
}
|
||||
BasCargoSpace cargoStockin = basCargoSpaceService.selectBasCargoSpaceForStockin(cargoParam);
|
||||
if (cargoParam == null) {
|
||||
log.warn("【货位分配】该类型托盘立库中无可用货位");
|
||||
return AjaxResult.error("【货位分配失败】该类型托盘立库中无可用货位");
|
||||
}
|
||||
|
||||
//检查当前条码是否已经生成作业
|
||||
MydoJob mydoJob = mydoJobService.selectMydoJobByTrayCode(wcsStockinReiceive.getTrayCode());
|
||||
|
||||
String jobId;
|
||||
String taskNo;
|
||||
int taskType;
|
||||
String instockinId;
|
||||
String instockinDetailId;
|
||||
BasCargoSpace basCargoSpace;
|
||||
|
||||
//>>>判断入库类型
|
||||
if (trayMsgs.stream().anyMatch(s -> s.getProductId().equals(ProductType.EMPTY_TRAY))){
|
||||
@@ -288,11 +293,25 @@ public class ApiWcsService implements IApiWcsService {
|
||||
|
||||
}
|
||||
|
||||
//检查当前条码是否已经生成作业
|
||||
MydoJob mydoJob = mydoJobService.selectMydoJobByTrayCode(wcsStockinReiceive.getTrayCode());
|
||||
|
||||
if (ObjUtil.isEmpty(mydoJob)) {
|
||||
|
||||
//--------------------------- 入库货位分配 ---------------------------
|
||||
//区分高矮货,只能在堆垛机上获取货物高度,高货位可放全部高度的托盘
|
||||
BasCargoSpace cargoParam;
|
||||
if (wcsStockinReiceive.getHeight() == 1){
|
||||
//低货位380H - 不限制高度
|
||||
cargoParam = new BasCargoSpace().builder().theType(type).cargoAreaId(wcsStockinReiceive.getCargoAreaId()).build();
|
||||
}else{
|
||||
//高货位510H - 只能放指定层高的货位
|
||||
cargoParam = new BasCargoSpace().builder().theType(type).cargoAreaId(wcsStockinReiceive.getCargoAreaId()).theHeight(wcsStockinReiceive.getHeight()).build();
|
||||
}
|
||||
BasCargoSpace cargoStockin = basCargoSpaceService.selectBasCargoSpaceForStockin(cargoParam);
|
||||
basCargoSpace = cargoStockin;
|
||||
if (cargoParam == null) {
|
||||
log.warn("【货位分配】该类型托盘立库中无可用货位");
|
||||
return AjaxResult.error("【货位分配失败】该类型托盘立库中无可用货位");
|
||||
}
|
||||
|
||||
//>>>生成wms的入库主作业
|
||||
MydoJob mydoJobNew = new MydoJob().builder()
|
||||
.jobId(jobId)
|
||||
@@ -314,6 +333,7 @@ public class ApiWcsService implements IApiWcsService {
|
||||
log.info("【wms生成入库】<空托入库>作业,作业号:{},任务号:{},托盘号:{},分配货位:{}",mydoJobNew.getJobId() ,mydoJobNew.getTaskNo() ,mydoJobNew.getTrayCode(), cargoStockin.getCargoSpaceId());
|
||||
}else{
|
||||
log.info("【提示】<常规入库>wms已存在该条码作业,托盘号:{}",mydoJob.getTrayCode());
|
||||
basCargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(mydoJob.getCargoSpaceId());
|
||||
}
|
||||
|
||||
//>>>根据绑定物料信息条数循环生成子作业,单条绑定信息对应一条子任务
|
||||
@@ -347,7 +367,6 @@ public class ApiWcsService implements IApiWcsService {
|
||||
.build();
|
||||
mydoJobDetailService.insertMydoJobDetail(detail);
|
||||
}
|
||||
|
||||
}else {
|
||||
instockinId = trayMsg.getStockinId();
|
||||
instockinDetailId = trayMsg.getStockinDetailId() + sum;
|
||||
@@ -368,7 +387,7 @@ public class ApiWcsService implements IApiWcsService {
|
||||
.stockinId(instockinId)
|
||||
.stockinDetailId(instockinDetailId)
|
||||
.status(0)
|
||||
.trayType(cargoStockin.getTheType())
|
||||
.trayType(type)
|
||||
.build();
|
||||
mydoJobDetailService.insertMydoJobDetail(detail);
|
||||
}
|
||||
@@ -378,8 +397,8 @@ public class ApiWcsService implements IApiWcsService {
|
||||
}
|
||||
|
||||
//货位状态更新为【入库预占用】
|
||||
cargoStockin.setStatus(CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKIN);
|
||||
basCargoSpaceService.updateBasCargoSpace(cargoStockin);
|
||||
basCargoSpace.setStatus(CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKIN);
|
||||
basCargoSpaceService.updateBasCargoSpace(basCargoSpace);
|
||||
|
||||
//返回wcs的响应信息
|
||||
WcsStockinResponse response = new WcsStockinResponse()
|
||||
@@ -389,10 +408,10 @@ public class ApiWcsService implements IApiWcsService {
|
||||
.taskNo(taskNo)
|
||||
.taskType(taskType)
|
||||
.trayCode(wcsStockinReiceive.getTrayCode())
|
||||
.cargoSpaceId(cargoStockin.getCargoSpaceId())
|
||||
.cargoSpaceId(basCargoSpace.getCargoSpaceId())
|
||||
.build();
|
||||
|
||||
log.info("【wms请求响应】<常规入库>响应信息,作业号:{},任务号:{},分配货位:{}",jobId ,taskNo, cargoStockin.getCargoSpaceId());
|
||||
log.info("【wms请求响应】<常规入库>响应信息,作业号:{},任务号:{},分配货位:{}",jobId ,taskNo, basCargoSpace.getCargoSpaceId());
|
||||
|
||||
return AjaxResult.success(response);
|
||||
|
||||
@@ -401,28 +420,31 @@ public class ApiWcsService implements IApiWcsService {
|
||||
|
||||
/**
|
||||
* 指定货位出库
|
||||
* @param cargoSpaceId
|
||||
* @param params
|
||||
* @return
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public AjaxResult stockoutByManual(String cargoSpaceId){
|
||||
public AjaxResult stockoutByManual(Map<String, String> params){
|
||||
|
||||
String cargoSpaceId = params.get("cargoSpaceId");
|
||||
|
||||
BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(cargoSpaceId);
|
||||
if (ObjUtil.isNull(cargoSpace)){
|
||||
log.warn("【操作失败】找不到该货位,可能是货位信息错误,请联系管理员,货位号:", cargoSpaceId);
|
||||
log.warn("【操作失败】找不到该货位,可能是货位异常或参数错误,请联系管理员,货位号:", cargoSpaceId);
|
||||
return AjaxResult.error("找不到该货位信息");
|
||||
}
|
||||
|
||||
if (!cargoSpace.getStatus().equals(CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED)){
|
||||
log.warn("【操作失败】该货位已被其它任务预占用,请等待任务执行完成后重试,货位号:", cargoSpaceId);
|
||||
return AjaxResult.error("该货位已被其它任务预占用,请等待任务执行完成后重试");
|
||||
}
|
||||
// if (!cargoSpace.getStatus().equals(CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED)){
|
||||
// log.warn("【操作失败】该货位已被其它任务预占用,请等待任务执行完成后重试,货位号:", cargoSpaceId);
|
||||
// return AjaxResult.error("该货位已被其它任务预占用,请等待任务执行完成后重试");
|
||||
// }
|
||||
|
||||
MydoJob job = mydoJobService.selectMydoJobByTrayCode(cargoSpace.getTrayCode());
|
||||
if (ObjUtil.isNull(job)){
|
||||
|
||||
String jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKIN_EMPTY_PALLET);
|
||||
String taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKIN_EMPTY_PALLET);
|
||||
int taskType = TaskType.TASKTYPE_STOCKIN_EMPTY_TRAY;
|
||||
String jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKOUT_MANUAL);
|
||||
String taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKOUT);
|
||||
int taskType = TaskType.TASKTYPE_STOCKOUT_MANUAL;
|
||||
|
||||
MydoJob mydoJob = new MydoJob().builder()
|
||||
.jobId(jobId)
|
||||
@@ -441,7 +463,7 @@ public class ApiWcsService implements IApiWcsService {
|
||||
.build();
|
||||
|
||||
mydoJobService.insertMydoJob(mydoJob);
|
||||
log.info("【wms生成出库】<指定货位出库>作业,作业号:{},任务号:{},托盘号:{},分配货位:{}",mydoJob.getJobId() ,mydoJob.getTaskNo() ,mydoJob.getTrayCode(), cargoSpaceId);
|
||||
log.info("【wms生成出库】<指定货位出库>作业,作业号:{},任务号:{},托盘号:{},出库货位:{}",mydoJob.getJobId() ,mydoJob.getTaskNo() ,mydoJob.getTrayCode(), cargoSpaceId);
|
||||
|
||||
List<BasStock> stocks = basStockService.selectBasStockList(
|
||||
new BasStock().builder().cargoSpaceId(cargoSpaceId).build()
|
||||
|
||||
@@ -29,6 +29,22 @@ public interface BasCargoSpaceMapper
|
||||
*/
|
||||
public List<BasCargoSpace> selectBasCargoSpaceList(BasCargoSpace basCargoSpace);
|
||||
|
||||
/**
|
||||
* 查询货位信息列表 - 空托盘
|
||||
*
|
||||
* @param basCargoSpace 货位信息
|
||||
* @return 货位信息集合
|
||||
*/
|
||||
public List<BasCargoSpace> selectBasCargoSpaceListForEmptyTray(BasCargoSpace basCargoSpace);
|
||||
|
||||
/**
|
||||
* 查询货位信息列表 - 带货容器
|
||||
*
|
||||
* @param basCargoSpace 货位信息
|
||||
* @return 货位信息集合
|
||||
*/
|
||||
public List<BasCargoSpace> selectBasCargoSpaceListForContainer(BasCargoSpace basCargoSpace);
|
||||
|
||||
/**
|
||||
* 新增货位信息
|
||||
*
|
||||
@@ -66,6 +82,7 @@ public interface BasCargoSpaceMapper
|
||||
* @return
|
||||
*/
|
||||
List<BasCargoSpaceStatus> selectBasCargoSpaceListByGroupByStatus(BasCargoSpace basCargoSpace);
|
||||
|
||||
/**
|
||||
* 查询排列表
|
||||
* @param basCargoSpace
|
||||
|
||||
@@ -29,6 +29,24 @@ public interface IBasCargoSpaceService
|
||||
public List<BasCargoSpace> selectBasCargoSpaceList(BasCargoSpace basCargoSpace);
|
||||
|
||||
|
||||
/**
|
||||
* 查询货位信息列表 - 空托盘
|
||||
*
|
||||
* @param basCargoSpace 货位信息
|
||||
* @return 货位信息集合
|
||||
*/
|
||||
public List<BasCargoSpace> selectBasCargoSpaceListForEmptyTray(BasCargoSpace basCargoSpace);
|
||||
|
||||
|
||||
/**
|
||||
* 查询货位信息列表 - 非空载货托盘
|
||||
*
|
||||
* @param basCargoSpace 货位信息
|
||||
* @return 货位信息集合
|
||||
*/
|
||||
public List<BasCargoSpace> selectBasCargoSpaceListForContainer(BasCargoSpace basCargoSpace);
|
||||
|
||||
|
||||
/**
|
||||
* 新增货位信息
|
||||
*
|
||||
|
||||
@@ -46,6 +46,30 @@ public class BasCargoSpaceServiceImpl implements IBasCargoSpaceService
|
||||
return basCargoSpaceMapper.selectBasCargoSpaceList(basCargoSpace);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询货位信息列表 - 空托盘
|
||||
*
|
||||
* @param basCargoSpace 货位信息
|
||||
* @return 货位信息
|
||||
*/
|
||||
@Override
|
||||
public List<BasCargoSpace> selectBasCargoSpaceListForEmptyTray(BasCargoSpace basCargoSpace)
|
||||
{
|
||||
return basCargoSpaceMapper.selectBasCargoSpaceListForEmptyTray(basCargoSpace);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询货位信息列表 - 非空载货托盘
|
||||
*
|
||||
* @param basCargoSpace 货位信息
|
||||
* @return 货位信息
|
||||
*/
|
||||
@Override
|
||||
public List<BasCargoSpace> selectBasCargoSpaceListForContainer(BasCargoSpace basCargoSpace)
|
||||
{
|
||||
return basCargoSpaceMapper.selectBasCargoSpaceListForContainer(basCargoSpace);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增货位信息
|
||||
*
|
||||
|
||||
@@ -29,6 +29,15 @@ public interface BasStockMapper
|
||||
public List<BasStock> selectBasStockList(BasStock basStock);
|
||||
|
||||
|
||||
/**
|
||||
* 查询库存信息列表
|
||||
*
|
||||
* @param basStock 库存信息
|
||||
* @return 库存信息集合
|
||||
*/
|
||||
public List<BasStock> selectBasStockListForEmptyTray(BasStock basStock);
|
||||
|
||||
|
||||
/**
|
||||
* 查询指定物料的所有库存信息
|
||||
* @param productId
|
||||
|
||||
@@ -56,6 +56,14 @@ public interface IBasStockService
|
||||
*/
|
||||
public List<BasStock> selectBasStockList(BasStock basStock);
|
||||
|
||||
/**
|
||||
* 查询空托盘库存信息列表
|
||||
*
|
||||
* @param basStock 库存信息
|
||||
* @return 库存信息集合
|
||||
*/
|
||||
public List<BasStock> selectBasStockListForEmptyTray(BasStock basStock);
|
||||
|
||||
|
||||
/**
|
||||
* 新增库存信息
|
||||
|
||||
@@ -91,6 +91,17 @@ public class BasStockServiceImpl implements IBasStockService
|
||||
return basStockMapper.selectBasStockList(basStock);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询空托盘库存信息列表
|
||||
*
|
||||
* @param basStock 库存信息
|
||||
* @return 库存信息集合
|
||||
*/
|
||||
@Override
|
||||
public List<BasStock> selectBasStockListForEmptyTray(BasStock basStock){
|
||||
return basStockMapper.selectBasStockListForEmptyTray(basStock);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增库存信息
|
||||
*
|
||||
|
||||
@@ -38,6 +38,11 @@ public class JobIdType {
|
||||
*/
|
||||
public static final String MYDOJOB_STOCKOUT = "CK";
|
||||
|
||||
/**
|
||||
* 指定货位出库任务
|
||||
*/
|
||||
public static final String MYDOJOB_STOCKOUT_MANUAL = "ZC";
|
||||
|
||||
/**
|
||||
* 移库任务
|
||||
*/
|
||||
|
||||
@@ -465,7 +465,8 @@ public class MydoJobServiceImpl implements IMydoJobService
|
||||
//>>>>>>>>>>>>>>>>>>>>>>>常规(整托)出库\拣选出库\指定出库<<<<<<<<<<<<<<<<<<<<<<<<
|
||||
//>>>>>>>>>>>>>>>>>>>>>>>常规(整托)出库\拣选出库\指定出库<<<<<<<<<<<<<<<<<<<<<<<<
|
||||
//>>>>>>>>>>>>>>>>>>>>>>>常规(整托)出库\拣选出库\指定出库<<<<<<<<<<<<<<<<<<<<<<<<
|
||||
if (type == TaskType.TASKTYPE_STOCKOUT || type == TaskType.TASKTYPE_STOCKOUT_PICKING || type == TaskType.TASKTYPE_STOCKOUT_MANUAL){
|
||||
if (type == TaskType.TASKTYPE_STOCKOUT ||
|
||||
type == TaskType.TASKTYPE_STOCKOUT_PICKING){
|
||||
|
||||
//子任务
|
||||
List<MydoJobDetail> details = mydoJobDetailService.selectMydoJobDetailByJobId(jobId);
|
||||
@@ -494,7 +495,6 @@ public class MydoJobServiceImpl implements IMydoJobService
|
||||
outStockoutDetailService.updateOutStockoutDetail(outStockoutDetail);
|
||||
|
||||
log.info("【账务处理】移除库存信息,更新单据出库分配数量,作业号:{},库存编号:{},辊号:{}", jobId, detail.getStockinDetailId(), detail.getRollerNumber());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -507,12 +507,6 @@ public class MydoJobServiceImpl implements IMydoJobService
|
||||
//--------------------处理任务表和子任务表--------------------
|
||||
//1.更新任务主表状态并移除作业
|
||||
mydoJob.setStatus(TaskStatusEnum.AUTO_FINISHED.getCode());
|
||||
// mydoJobMapper.updateMydoJob(mydoJob);
|
||||
// deleteMydoJobByJobId(jobId);
|
||||
//
|
||||
// //2.并移除所有子作业
|
||||
// mydoJobDetailService.insertMydoJobDetailsForJobFinish(jobId);
|
||||
// mydoJobDetailService.deleteMydoJobDetailsByJobId(jobId);
|
||||
|
||||
log.info("【账务处理】出库完成,等待确认,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
|
||||
|
||||
@@ -520,6 +514,7 @@ public class MydoJobServiceImpl implements IMydoJobService
|
||||
|
||||
}
|
||||
|
||||
|
||||
//>>>>>>>>>>>>>>>>>>>>> 移库任务 <<<<<<<<<<<<<<<<<<<<<<<<
|
||||
//>>>>>>>>>>>>>>>>>>>>> 移库任务 <<<<<<<<<<<<<<<<<<<<<<<<
|
||||
//>>>>>>>>>>>>>>>>>>>>> 移库任务 <<<<<<<<<<<<<<<<<<<<<<<<
|
||||
@@ -561,6 +556,37 @@ public class MydoJobServiceImpl implements IMydoJobService
|
||||
return AjaxResult.success();
|
||||
}
|
||||
|
||||
|
||||
//>>>>>>>>>>>>>>>>>>>>> 手动指定货位出库 <<<<<<<<<<<<<<<<<<<<<<<<
|
||||
//>>>>>>>>>>>>>>>>>>>>> 手动指定货位出库 <<<<<<<<<<<<<<<<<<<<<<<<
|
||||
//>>>>>>>>>>>>>>>>>>>>> 手动指定货位出库 <<<<<<<<<<<<<<<<<<<<<<<<
|
||||
if (type == TaskType.TASKTYPE_STOCKOUT_MANUAL){
|
||||
//--------------------处理库存信息--------------------
|
||||
//移除指定辊号的库存明细
|
||||
basStockService.deleteBasStockByTrayCode(mydoJob.getTrayCode());
|
||||
basStockInfoService.deleteBasStockInfoByTrayCode(mydoJob.getTrayCode());
|
||||
|
||||
//--------------------更新货位状态--------------------
|
||||
BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(mydoJob.getCargoSpaceId());
|
||||
basCargoSpaceService.updateBasCargoSpaceStatus(cargoSpace.getCargoSpaceId(), "", CargoSpaceCode.CARGOSPACE_STATUS_AVAILABLE);
|
||||
log.info("【账务处理-手动出库】更新货位状态,作业号:{},货位编号:{},托盘号:{}", jobId, cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode());
|
||||
|
||||
//--------------------处理任务表和子任务表--------------------
|
||||
//1.更新任务主表状态并移除作业
|
||||
mydoJob.setStatus(TaskStatusEnum.AUTO_FINISHED.getCode());
|
||||
mydoJobMapper.updateMydoJob(mydoJob);
|
||||
deleteMydoJobByJobId(jobId);
|
||||
|
||||
//2.并移除所有子作业
|
||||
mydoJobDetailService.insertMydoJobDetailsForJobFinish(jobId);
|
||||
mydoJobDetailService.deleteMydoJobDetailsByJobId(jobId);
|
||||
|
||||
log.info("【账务处理-手动出库】任务完成,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
|
||||
|
||||
return AjaxResult.success();
|
||||
|
||||
}
|
||||
|
||||
return AjaxResult.error();
|
||||
}
|
||||
|
||||
@@ -581,13 +607,6 @@ public class MydoJobServiceImpl implements IMydoJobService
|
||||
log.warn("【任务完成】查不到该作业,请检查作业状态,作业号:" + jobId);
|
||||
return AjaxResult.error("查不到该作业,请检查作业状态");
|
||||
}
|
||||
//子任务
|
||||
// List<MydoJobDetail> details = mydoJobDetailService.selectMydoJobDetailByJobId(jobId);
|
||||
// if (details.isEmpty()){
|
||||
// log.warn("【任务完成】查不到该作业对应的子单明细,请检查子单状态,任务号:" + jobId);
|
||||
// return AjaxResult.error("查不到该作业对应的子单明细,请检查子单状态");
|
||||
// }
|
||||
|
||||
|
||||
//--------------------处理库存信息--------------------
|
||||
//>>>>>>>>>>>>>>>>>>>>>>> 空托入库 <<<<<<<<<<<<<<<<<<<<<<<<
|
||||
@@ -640,7 +659,6 @@ public class MydoJobServiceImpl implements IMydoJobService
|
||||
);
|
||||
log.info("【账务处理-空托盘】新增库存明细,作业号:{},库存编号:{},托盘号:{}", jobId, stockId, mydoJob.getTrayCode());
|
||||
|
||||
|
||||
//--------------------更新货位状态--------------------
|
||||
BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(mydoJob.getCargoSpaceId());
|
||||
basCargoSpaceService.updateBasCargoSpaceStatus(cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED);
|
||||
@@ -659,7 +677,80 @@ public class MydoJobServiceImpl implements IMydoJobService
|
||||
|
||||
//3.移除当前托盘的绑定信息
|
||||
inTrayMsgService.deleteInTrayMsgByTrayCode(mydoJob.getTrayCode());
|
||||
log.info("【账务处理-空托盘】移除任务数据,生成历史记录,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
|
||||
log.info("【账务处理-载货容器出库】移除任务数据,生成历史记录,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
|
||||
|
||||
return AjaxResult.success();
|
||||
|
||||
}
|
||||
|
||||
//>>>>>>>>>>>>>>>>>>>>>>>带货托盘出库<<<<<<<<<<<<<<<<<<<<<<<<
|
||||
if (type == TaskType.TASKTYPE_STOCKOUT_CONTAINER){
|
||||
|
||||
//>>>>>>>>>>>>>>>>>>>>>>> 生成回流 <<<<<<<<<<<<<<<<<<<<<<<<
|
||||
//获取托盘剩余库存
|
||||
String trayCode = mydoJob.getTrayCode();
|
||||
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(trayCode);
|
||||
int trayType = getTrayTypeByTrayCode(trayCode);
|
||||
//空托盘回流
|
||||
if (stocks.isEmpty()){
|
||||
inTrayMsgService.insertInTrayMsg(
|
||||
new InTrayMsg().builder()
|
||||
.trayCode(trayCode)
|
||||
.quantity(BigDecimal.ONE)
|
||||
.productId(ProductType.EMPTY_TRAY)
|
||||
.warehouseId("01")
|
||||
.rollerNumber(ProductType.EMPTY_TRAY)
|
||||
.trayType(trayType)
|
||||
.status(1)
|
||||
.createTime(DateUtil.date())
|
||||
.build()
|
||||
);
|
||||
|
||||
log.info("【非空容器绑定回流】<非空容器入库>生成绑定信息成功,托盘号:{}", trayCode);
|
||||
|
||||
}else{
|
||||
for (BasStock stock : stocks){
|
||||
inTrayMsgService.insertInTrayMsg(
|
||||
new InTrayMsg().builder()
|
||||
.trayCode(trayCode)
|
||||
.quantity(stock.getQuantity())
|
||||
.warehouseId("01")
|
||||
.rollerNumber(stock.getRollerNumber())
|
||||
.trayType(trayType)
|
||||
.status(2)
|
||||
.createTime(DateUtil.date())
|
||||
.build()
|
||||
);
|
||||
|
||||
basStockService.deleteBasStockByRollerNumber(stock.getRollerNumber());
|
||||
log.info("【非空容器绑定回流】<非空容器入库>移除当前版辊库存明细,生成绑定信息成功,托盘号:{},辊号:{}", trayCode, stock.getRollerNumber());
|
||||
}
|
||||
basStockInfoService.deleteBasStockInfoByTrayCode(trayCode);
|
||||
log.info("【非空容器绑定回流】<非空容器入库>移除主表库存信息,托盘号:{}}", trayCode);
|
||||
|
||||
}
|
||||
|
||||
//--------------------处理库存信息--------------------
|
||||
//移除指定辊号的库存明细
|
||||
basStockService.deleteBasStockByTrayCode(mydoJob.getTrayCode());
|
||||
basStockInfoService.deleteBasStockInfoByTrayCode(mydoJob.getTrayCode());
|
||||
|
||||
//--------------------更新货位状态--------------------
|
||||
BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(mydoJob.getCargoSpaceId());
|
||||
basCargoSpaceService.updateBasCargoSpaceStatus(cargoSpace.getCargoSpaceId(), "", CargoSpaceCode.CARGOSPACE_STATUS_AVAILABLE);
|
||||
log.info("【账务处理-载货容器出库】更新货位状态,作业号:{},货位编号:{},托盘号:{}", jobId, cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode());
|
||||
|
||||
//--------------------处理任务表和子任务表--------------------
|
||||
//1.更新任务主表状态并移除作业
|
||||
mydoJob.setStatus(TaskStatusEnum.AUTO_FINISHED.getCode());
|
||||
mydoJobMapper.updateMydoJob(mydoJob);
|
||||
deleteMydoJobByJobId(jobId);
|
||||
|
||||
//2.并移除所有子作业
|
||||
mydoJobDetailService.insertMydoJobDetailsForJobFinish(jobId);
|
||||
mydoJobDetailService.deleteMydoJobDetailsByJobId(jobId);
|
||||
|
||||
log.info("【账务处理-载货容器出库】任务完成,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
|
||||
|
||||
return AjaxResult.success();
|
||||
|
||||
|
||||
@@ -316,13 +316,13 @@ public class PdaController extends BaseController {
|
||||
|
||||
/**
|
||||
* 呼叫空托出库
|
||||
* @param palletType 托盘类型
|
||||
* @param params 货位区域,托盘类型
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/callStockOutForContainer")
|
||||
@PreAuthorize("@ss.hasPermi('out:bound:task:info')")
|
||||
public AjaxResult callStockOutForEmptyPallet(String cargoAreaId, Integer palletType) {
|
||||
return pdaService.callContainerStockOut(cargoAreaId, palletType);
|
||||
public AjaxResult callStockOutForEmptyPallet(@RequestBody Map<String, Object> params) {
|
||||
return pdaService.callContainerStockOut(params);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -130,10 +130,10 @@ public interface IPdaService {
|
||||
|
||||
/**
|
||||
* 呼叫空托盘出库
|
||||
* @param palletType 托盘类型
|
||||
* @param params 托盘类型
|
||||
* @return
|
||||
*/
|
||||
AjaxResult callContainerStockOut(String cargoAreaId, Integer palletType);
|
||||
AjaxResult callContainerStockOut(Map<String, Object> params);
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -489,10 +489,9 @@ public class PdaServiceImpl implements IPdaService {
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public AjaxResult callContainerStockOut(String cargoAreaId, Integer palletType){
|
||||
return apiWcsService.callContainerOut(cargoAreaId, palletType);
|
||||
public AjaxResult callContainerStockOut(Map<String, Object> params){
|
||||
return apiWcsService.callContainerOut(params);
|
||||
}
|
||||
|
||||
|
||||
@@ -638,8 +637,6 @@ public class PdaServiceImpl implements IPdaService {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//移除剩余库存 - 生成回流任务和任务明细绑定信息
|
||||
|
||||
return AjaxResult.success("确认成功");
|
||||
|
||||
@@ -55,6 +55,7 @@ public class MydoJobHandler {
|
||||
@Autowired
|
||||
IInTrayMsgService intrayMsgService;
|
||||
|
||||
|
||||
private static final int TIMEINTERVAL_DEFAULT = 1000;
|
||||
private static final int TIMEINTERVAL_2000 = 2000;
|
||||
private static final int TIMEINTERVAL_5000 = 5000;
|
||||
@@ -104,6 +105,9 @@ public class MydoJobHandler {
|
||||
basStockInfoService.updateBasStockInfo(stockInfo);
|
||||
}
|
||||
|
||||
mydoJobService.insertMydoJobFinish(mydoJob.getJobId());
|
||||
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
|
||||
|
||||
log.info(
|
||||
"【账务处理-移库】任务作废,更新库存和货位信息,作业号:{},托盘号:{},源位置:{},目标位置:{}", mydoJob.getJobId(), mydoJob.getTrayCode(), mydoJob.getCargoSpaceId(), mydoJob.getTargetCargoSpaceId()
|
||||
);
|
||||
@@ -120,11 +124,18 @@ public class MydoJobHandler {
|
||||
for (MydoJobDetail mydoJobDetail : details){
|
||||
//还原子单数量
|
||||
InStockinDetail inStockinDetail = inStockinDetailService.selectInStockinDetailByRollerNumber(mydoJobDetail.getRollerNumber());
|
||||
if (ObjUtil.isNotNull(inStockinDetail)){
|
||||
inStockinDetail.setScanNum(BigDecimal.ZERO);
|
||||
inStockinDetail.setAssignNum(BigDecimal.ZERO);
|
||||
inStockinDetail.setStatus(0);
|
||||
inStockinDetailService.updateInStockinDetail(inStockinDetail);
|
||||
}
|
||||
}
|
||||
|
||||
mydoJobService.insertMydoJobFinish(mydoJob.getJobId());
|
||||
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
|
||||
|
||||
// apiWcsService.cancelWcsMydojob()
|
||||
|
||||
log.info("【账务处理-入库】任务作废,更新货位信息,作业号:{}", mydoJob.getJobId());
|
||||
return;
|
||||
@@ -143,11 +154,16 @@ public class MydoJobHandler {
|
||||
for (MydoJobDetail mydoJobDetail : details){
|
||||
//还原子单数量
|
||||
OutStockoutDetail outStockoutDetail = outStockoutDetailService.selectOutStockoutDetailByRollerNumber(mydoJobDetail.getRollerNumber());
|
||||
if(ObjUtil.isNotNull(outStockoutDetail)){
|
||||
outStockoutDetail.setAllotNum(BigDecimal.ZERO);
|
||||
outStockoutDetail.setAssignNum(BigDecimal.ZERO);
|
||||
outStockoutDetail.setStatus(0);
|
||||
outStockoutDetailService.updateOutStockoutDetail(outStockoutDetail);
|
||||
}
|
||||
}
|
||||
|
||||
mydoJobService.insertMydoJobFinish(mydoJob.getJobId());
|
||||
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
|
||||
|
||||
log.info("【账务处理-出库】任务作废,更新货位和库存信息,作业号:{}", mydoJob.getJobId());
|
||||
}
|
||||
|
||||
@@ -68,7 +68,55 @@ public class RequestWcsHandler {
|
||||
AjaxResult ajaxResult = apiWcsService.sendEmptyTrayOutMydoJob(paramMap);
|
||||
|
||||
if (ajaxResult.isSuccess()){
|
||||
log.info("【推送出库】<容器>出库,wms作业号:{},货位:{},托盘号:{}", mydoJob.getJobId(), mydoJob.getCargoSpaceId(), mydoJob.getTrayCode());
|
||||
log.info("【推送出库】<空容器>出库,wms作业号:{},货位:{},托盘号:{}", mydoJob.getJobId(), mydoJob.getCargoSpaceId(), mydoJob.getTrayCode());
|
||||
mydoJob.setStatus(TaskStatusEnum.RUNNING.getCode());
|
||||
mydoJobService.updateMydoJob(mydoJob);
|
||||
|
||||
//更新库存状态【占用中】
|
||||
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode());
|
||||
for (BasStock stock : stocks) {
|
||||
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
|
||||
basStockService.updateBasStock(stock);
|
||||
}
|
||||
|
||||
//更新货位状态【出库预占用】
|
||||
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKOUT);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 推送wcs带货容器出库作业
|
||||
*/
|
||||
@Scheduled(fixedRate = TIMEINTERVAL_2000)
|
||||
public void sendWcsContainerTask(){
|
||||
List<MydoJob> mydoJobs = mydoJobService.selectOutMydoJobList(
|
||||
new MydoJob().builder()
|
||||
.inOrOut(TaskType.TASKTYPE_STOCKOUT_CONTAINER)
|
||||
.status(TaskStatusEnum.READY.getCode())
|
||||
.build()
|
||||
);
|
||||
|
||||
if (mydoJobs.isEmpty()) return;
|
||||
|
||||
for (MydoJob mydoJob : mydoJobs) {
|
||||
|
||||
//初始化参数
|
||||
HashMap<String, Object> paramMap = new HashMap<>();
|
||||
paramMap.put("reqCode", UUID.randomUUID().toString());//请求码
|
||||
paramMap.put("trayCode", mydoJob.getTrayCode());//容器编号
|
||||
paramMap.put("taskNo", mydoJob.getTaskNo());//容器编号
|
||||
paramMap.put("jobId", mydoJob.getJobId());
|
||||
paramMap.put("inOrOut", mydoJob.getInOrOut());
|
||||
paramMap.put("cargoSpaceId", mydoJob.getCargoSpaceId());
|
||||
|
||||
AjaxResult ajaxResult = apiWcsService.sendEmptyTrayOutMydoJob(paramMap);
|
||||
|
||||
if (ajaxResult.isSuccess()){
|
||||
log.info("【推送出库】<带货容器>出库,wms作业号:{},货位:{},托盘号:{}", mydoJob.getJobId(), mydoJob.getCargoSpaceId(), mydoJob.getTrayCode());
|
||||
mydoJob.setStatus(TaskStatusEnum.RUNNING.getCode());
|
||||
mydoJobService.updateMydoJob(mydoJob);
|
||||
|
||||
@@ -121,10 +169,12 @@ public class RequestWcsHandler {
|
||||
|
||||
//更新库存状态【占用中】
|
||||
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode());
|
||||
if (!stocks.isEmpty()){
|
||||
for (BasStock stock : stocks) {
|
||||
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
|
||||
basStockService.updateBasStock(stock);
|
||||
}
|
||||
}
|
||||
|
||||
//更新货位状态【出库预占用】
|
||||
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKOUT);
|
||||
|
||||
@@ -41,6 +41,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<include refid="selectBasCargoSpaceVo"/>
|
||||
<where>
|
||||
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
|
||||
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and cargo_space_id = #{cargoSpaceId}</if>
|
||||
<if test="roadwayId != null and roadwayId != ''"> and roadway_id = #{roadwayId}</if>
|
||||
<if test="cargoAreaId != null and cargoAreaId != ''"> and cargo_area_id = #{cargoAreaId}</if>
|
||||
<if test="theType != null and theType != ''"> and the_type = #{theType}</if>
|
||||
@@ -65,6 +66,38 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
order by cargo_space_id asc
|
||||
</select>
|
||||
|
||||
<select id="selectBasCargoSpaceListForEmptyTray" parameterType="BasCargoSpace" resultMap="BasCargoSpaceResult">
|
||||
select bcs.cargo_space_id, bcs.warehouse_id, bcs.roadway_id, bcs.cargo_area_id, bcs.the_type, bcs.the_type_name,
|
||||
bcs.cargo_space_name, bcs.the_platoon, bcs.the_column, bcs.the_floor, bcs.status, bcs.locked, bcs.tray_code,
|
||||
bcs.iss_double, bcs.group_coding_no, bcs.group_coding, bcs.cargo_space_logo, bcs.this_cargo_area,
|
||||
bcs.dept_id, bcs.dept_name, bcs.the_weight, bcs.the_height,
|
||||
bs.product_id, bs.stock_status
|
||||
from bas_cargo_space bcs
|
||||
inner join bas_stock_detail bs on bs.cargo_space_id = bcs.cargo_space_id and bs.product_id = 'KTP0001' and bs.stock_status = '1'
|
||||
where
|
||||
bcs.cargo_area_id = #{cargoAreaId}
|
||||
and bcs.the_type = #{theType}
|
||||
and bcs.status = '2'
|
||||
and bcs.locked = 'N'
|
||||
order by bcs.iss_double asc, bcs.cargo_space_id asc
|
||||
</select>
|
||||
|
||||
<select id="selectBasCargoSpaceListForContainer" parameterType="BasCargoSpace" resultMap="BasCargoSpaceResult">
|
||||
select bcs.cargo_space_id, bcs.warehouse_id, bcs.roadway_id, bcs.cargo_area_id, bcs.the_type, bcs.the_type_name,
|
||||
bcs.cargo_space_name, bcs.the_platoon, bcs.the_column, bcs.the_floor, bcs.status, bcs.locked, bcs.tray_code,
|
||||
bcs.iss_double, bcs.group_coding_no, bcs.group_coding, bcs.cargo_space_logo, bcs.this_cargo_area,
|
||||
bcs.dept_id, bcs.dept_name, bcs.the_weight, bcs.the_height,
|
||||
bs.empty_status
|
||||
from bas_cargo_space bcs
|
||||
inner join bas_stock bs on bs.cargo_space_id = bcs.cargo_space_id
|
||||
where
|
||||
bcs.cargo_area_id = #{cargoAreaId}
|
||||
and bcs.the_type = #{theType}
|
||||
and bcs.status = '2'
|
||||
and bcs.locked = 'N'
|
||||
order by bcs.iss_double asc, bcs.cargo_space_id asc, bs.empty_status asc
|
||||
</select>
|
||||
|
||||
<select id="selectBasCargoSpaceByCargoSpaceId" parameterType="String" resultMap="BasCargoSpaceResult">
|
||||
<include refid="selectBasCargoSpaceVo"/>
|
||||
where cargo_space_id = #{cargoSpaceId}
|
||||
@@ -106,6 +139,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<include refid="selectBasCargoSpaceVoTop1"/>
|
||||
<where>
|
||||
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
|
||||
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and cargo_space_id = #{cargoSpaceId}</if>
|
||||
<if test="cargoAreaId != null and cargoAreaId != ''"> and cargo_area_id = #{cargoAreaId}</if>
|
||||
<if test="theTypeName != null and theTypeName != ''"> and the_type_name like concat('%', #{theTypeName}, '%')</if>
|
||||
<if test="cargoSpaceName != null and cargoSpaceName != ''"> and cargo_space_name like concat('%', #{cargoSpaceName}, '%')</if>
|
||||
@@ -134,6 +168,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<include refid="selectBasCargoSpaceVo"/>
|
||||
<where>
|
||||
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
|
||||
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and cargo_space_id = #{cargoSpaceId}</if>
|
||||
<if test="cargoAreaId != null and cargoAreaId != ''"> and cargo_area_id = #{cargoAreaId}</if>
|
||||
<if test="theTypeName != null and theTypeName != ''"> and the_type_name like concat('%', #{theTypeName}, '%')</if>
|
||||
<if test="cargoSpaceName != null and cargoSpaceName != ''"> and cargo_space_name like concat('%', #{cargoSpaceName}, '%')</if>
|
||||
@@ -162,6 +197,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<include refid="selectBasCargoSpaceVoTop1"/>
|
||||
<where>
|
||||
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
|
||||
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and cargo_space_id = #{cargoSpaceId}</if>
|
||||
<if test="cargoAreaId != null and cargoAreaId != ''"> and cargo_area_id = #{cargoAreaId}</if>
|
||||
<if test="theTypeName != null and theTypeName != ''"> and the_type_name like concat('%', #{theTypeName}, '%')</if>
|
||||
<if test="cargoSpaceName != null and cargoSpaceName != ''"> and cargo_space_name like concat('%', #{cargoSpaceName}, '%')</if>
|
||||
@@ -190,6 +226,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<include refid="selectBasCargoSpaceVo"/>
|
||||
<where>
|
||||
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
|
||||
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and cargo_space_id = #{cargoSpaceId}</if>
|
||||
<if test="cargoAreaId != null and cargoAreaId != ''"> and cargo_area_id = #{cargoAreaId}</if>
|
||||
<if test="theTypeName != null and theTypeName != ''"> and the_type_name like concat('%', #{theTypeName}, '%')</if>
|
||||
<if test="cargoSpaceName != null and cargoSpaceName != ''"> and cargo_space_name like concat('%', #{cargoSpaceName}, '%')</if>
|
||||
|
||||
@@ -75,6 +75,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
${params.warehouseScope}
|
||||
</select>
|
||||
|
||||
<select id="selectBasStockListForEmptyTray" parameterType="BasStock" resultMap="BasStockResult">
|
||||
select bs.stock_id, bs.stock_detail_id, bs.cargo_space_id, bs.stock_status, bs.product_status,
|
||||
bs.lot_no, bs.in_date, bs.back_date, bs.product_id, bs.product_name,bs.roller_number,
|
||||
bs.quantity, bs.job_id, bs.job_detail_id, bs.tray_code, bs.out_quantity,
|
||||
bs.stockin_detail_id, bs.stockin_id, bs.in_type, bs.warehouse_id, bs.warehouse_name,
|
||||
bs.user_id, bs.user_name, bs.dept_id, bs.dept_name, bs.supplier_id, bs.supplier_name, bcs.iss_double, bcs.cargo_area_id, bcs.the_type
|
||||
from bas_stock_detail bs
|
||||
left join bas_cargo_space bcs on bs.cargo_space_id = bcs.cargo_space_id
|
||||
where
|
||||
bcs.status = '2' and
|
||||
bs.product_id = 'KTP0001' and
|
||||
bs.stock_status = '1'
|
||||
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and bs.cargo_space_id = #{cargoSpaceId}</if>
|
||||
<if test="productStatus != null and productStatus != ''"> and bs.product_status = #{productStatus}</if>
|
||||
<if test="lotNo != null and lotNo != ''"> and bs.lot_no = #{lotNo}</if>
|
||||
<if test="params.beginInDate != null and params.beginInDate != '' and params.endInDate != null and params.endInDate != ''"> and bs.in_date between #{params.beginInDate} and #{params.endInDate}</if>
|
||||
<if test="params.beginBackDate != null and params.beginBackDate != '' and params.endBackDate != null and params.endBackDate != ''"> and bs.back_date between #{params.beginBackDate} and #{params.endBackDate}</if>
|
||||
<if test="productName != null and productName != ''"> and bs.product_name like concat('%', #{productName}, '%')</if>
|
||||
<if test="rollerNumber != null and rollerNumber != ''"> and bs.roller_number like concat('%', #{rollerNumber}, '%')</if>
|
||||
<if test="quantity != null "> and bs.quantity = #{quantity}</if>
|
||||
<if test="jobId != null and jobId != ''"> and bs.job_id = #{jobId}</if>
|
||||
<if test="jobDetailId != null and jobDetailId != ''"> and bs.job_detail_id = #{jobDetailId}</if>
|
||||
<if test="trayCode != null and trayCode != ''"> and bs.tray_code = #{trayCode}</if>
|
||||
<if test="outQuantity != null "> and bs.out_quantity = #{outQuantity}</if>
|
||||
<if test="stockinDetailId != null and stockinDetailId != ''"> and bs.stockin_detail_id = #{stockinDetailId}</if>
|
||||
<if test="stockinId != null and stockinId != ''"> and bs.stockin_id = #{stockinId}</if>
|
||||
<if test="inType != null and inType != ''"> and bs.in_type = #{inType}</if>
|
||||
<if test="warehouseName != null and warehouseName != ''"> and bs.warehouse_name like concat('%', #{warehouseName}, '%')</if>
|
||||
<if test="userName != null and userName != ''"> and bs.user_name like concat('%', #{userName}, '%')</if>
|
||||
<if test="deptName != null and deptName != ''"> and bs.dept_name like concat('%', #{deptName}, '%')</if>
|
||||
<if test="supplierName != null and supplierName != ''"> and bs.supplier_name like concat('%', #{supplierName}, '%')</if>
|
||||
ORDER BY bcs.iss_double asc, bcs.cargo_space_id asc
|
||||
</select>
|
||||
|
||||
<select id="selectBasStockByStockId" parameterType="String" resultMap="BasStockResult">
|
||||
<include refid="selectBasStockVo"/>
|
||||
where stock_id = #{stockId}
|
||||
|
||||
@@ -52,3 +52,13 @@ export function delCargospace(cargoSpaceId) {
|
||||
}
|
||||
|
||||
|
||||
// 指定货位出库
|
||||
export function stockoutByManual(cargoSpaceId) {
|
||||
return request({
|
||||
url: '/api/wmsService/wcs/stockoutByManual',
|
||||
method: 'post',
|
||||
data: { cargoSpaceId: cargoSpaceId }
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
52
ruoyi-ui/src/api/in/bindTrayMsg.js
Normal file
52
ruoyi-ui/src/api/in/bindTrayMsg.js
Normal file
@@ -0,0 +1,52 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询入库信息列表
|
||||
export function listBindTrayMsg(query) {
|
||||
return request({
|
||||
url: '/in/bindMsg/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询入库信息详细
|
||||
export function getBindTrayMsg(id) {
|
||||
return request({
|
||||
url: '/in/bindMsg/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增入库信息
|
||||
export function addBindTrayMsg(data) {
|
||||
return request({
|
||||
url: '/pda/bindMsg',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改入库信息
|
||||
export function updateBindTrayMsg(data) {
|
||||
return request({
|
||||
url: '/in/bindMsg',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除入库信息
|
||||
export function delBindTrayMsg(id) {
|
||||
return request({
|
||||
url: '/in/bindMsg/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 删除入库信息
|
||||
export function delBindTrayMsgByRollerNumber(rollerNumbers) {
|
||||
return request({
|
||||
url: '/in/bindMsg/delete/' + rollerNumbers,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
@@ -1,10 +1,10 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="仓库id" prop="warehouseId">
|
||||
<el-form-item label="货位id" prop="cargoSpaceId">
|
||||
<el-input
|
||||
v-model="queryParams.warehouseId"
|
||||
placeholder="请输入仓库id"
|
||||
v-model="queryParams.cargoSpaceId"
|
||||
placeholder="请输入货位id"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
@@ -83,22 +83,6 @@
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="部门名称" prop="deptName">
|
||||
<el-input
|
||||
v-model="queryParams.deptName"
|
||||
placeholder="请输入部门名称"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="重量" prop="theWeight">
|
||||
<el-input
|
||||
v-model="queryParams.theWeight"
|
||||
placeholder="请输入重量"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="高度" prop="theHeight">
|
||||
<el-input
|
||||
v-model="queryParams.theHeight"
|
||||
@@ -120,8 +104,8 @@
|
||||
plain
|
||||
icon="el-icon-plus"
|
||||
size="mini"
|
||||
@click="handleAdd"
|
||||
v-hasPermi="['bas:cargospace:add']"
|
||||
@click="stockoutByManualHandle"
|
||||
:disabled="multiple"
|
||||
>指定货位出库</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
@@ -190,8 +174,6 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="托盘条码" align="center" prop="trayCode" />
|
||||
<el-table-column label="部门名称" align="center" prop="deptName" />
|
||||
<el-table-column label="重量" align="center" prop="theWeight" />
|
||||
<el-table-column label="高度" align="center" prop="theHeight" />
|
||||
<el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
@@ -226,8 +208,8 @@
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="仓库id" prop="warehouseId">
|
||||
<el-input v-model="form.warehouseId" placeholder="请输入仓库id" />
|
||||
<el-form-item label="货位id" prop="cargoSpaceId">
|
||||
<el-input v-model="form.cargoSpaceId" placeholder="请输入货位id" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
@@ -343,7 +325,7 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listCargospace, getCargospace, delCargospace, addCargospace, updateCargospace } from "@/api/bas/cargospace"
|
||||
import { listCargospace, getCargospace, delCargospace, addCargospace, updateCargospace, stockoutByManual } from "@/api/bas/cargospace"
|
||||
|
||||
export default {
|
||||
name: "Cargospace",
|
||||
@@ -372,6 +354,7 @@ export default {
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
cargoSpeceId: null,
|
||||
warehouseId: null,
|
||||
roadwayId: null,
|
||||
cargoAreaId: null,
|
||||
@@ -396,6 +379,9 @@ export default {
|
||||
roadwayId: [
|
||||
{ required: true, message: "巷道id不能为空", trigger: "blur" }
|
||||
],
|
||||
cargoSpaceId: [
|
||||
{ required: true, message: "货位id不能为空", trigger: "blur" }
|
||||
],
|
||||
cargoSpaceName: [
|
||||
{ required: true, message: "货位名称不能为空", trigger: "blur" }
|
||||
],
|
||||
@@ -476,9 +462,29 @@ export default {
|
||||
// 多选框选中数据
|
||||
handleSelectionChange(selection) {
|
||||
this.ids = selection.map(item => item.cargoSpaceId)
|
||||
this.cargoSpaces = selection.map(item => item.cargoSpaceId)
|
||||
this.single = selection.length !== 1
|
||||
this.multiple = !selection.length
|
||||
},
|
||||
|
||||
stockoutByManualHandle() {
|
||||
if (!this.cargoSpaces || this.cargoSpaces.length === 0) {
|
||||
this.$modal.msgWarning("请至少选择一个货位执行手动出库操作");
|
||||
return;
|
||||
}
|
||||
|
||||
const cargoSpaceId = this.ids[0]
|
||||
var data ={
|
||||
cargoSpaceId: cargoSpaceId
|
||||
}
|
||||
this.$modal.confirm('是否确认将货位编号为"' + cargoSpaceId + '"货位库存手动出库?').then(() => {
|
||||
return stockoutByManual(cargoSpaceId)
|
||||
}).then(() => {
|
||||
this.getList()
|
||||
this.$modal.msgSuccess("操作成功")
|
||||
}).catch(() => {})
|
||||
},
|
||||
|
||||
/** 新增按钮操作 */
|
||||
handleAdd() {
|
||||
this.reset()
|
||||
|
||||
438
ruoyi-ui/src/views/in/bindTrayMsg/index.vue
Normal file
438
ruoyi-ui/src/views/in/bindTrayMsg/index.vue
Normal file
@@ -0,0 +1,438 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="入库主单" prop="stockinId">
|
||||
<el-input
|
||||
v-model="queryParams.stockinId"
|
||||
placeholder="请输入入库主单号"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="入库子单" prop="stockinDetailId">
|
||||
<el-input
|
||||
v-model="queryParams.stockinDetailId"
|
||||
placeholder="请输入入库子单码"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="托盘码" prop="trayCode">
|
||||
<el-input
|
||||
v-model="queryParams.trayCode"
|
||||
placeholder="请输入托盘码"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="物料编码" prop="productId">
|
||||
<el-input
|
||||
v-model="queryParams.productId"
|
||||
placeholder="请输入物料编码"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="版辊编号" prop="rollerNumber">
|
||||
<el-input
|
||||
v-model="queryParams.rollerNumber"
|
||||
placeholder="请输入版辊编号"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="入库数量" prop="quantity">
|
||||
<el-input
|
||||
v-model="queryParams.quantity"
|
||||
placeholder="请输入入库数量"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="用户编码" prop="userId">
|
||||
<el-input
|
||||
v-model="queryParams.userId"
|
||||
placeholder="请输入用户编码"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="部门编码" prop="deptId">
|
||||
<el-input
|
||||
v-model="queryParams.deptId"
|
||||
placeholder="请输入部门编码"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="颜色" prop="color">
|
||||
<el-input
|
||||
v-model="queryParams.color"
|
||||
placeholder="请输入颜色"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="primary"
|
||||
plain
|
||||
icon="el-icon-plus"
|
||||
size="mini"
|
||||
@click="handleAdd"
|
||||
v-hasPermi="['in:bindMsg:add']"
|
||||
>新增</el-button>
|
||||
</el-col>
|
||||
<!-- <el-col :span="1.5">
|
||||
<el-button
|
||||
type="success"
|
||||
plain
|
||||
icon="el-icon-edit"
|
||||
size="mini"
|
||||
:disabled="single"
|
||||
@click="handleUpdate"
|
||||
v-hasPermi="['in:bindTrayMsg:edit']"
|
||||
>修改</el-button>
|
||||
</el-col> -->
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="danger"
|
||||
plain
|
||||
icon="el-icon-delete"
|
||||
size="mini"
|
||||
:disabled="multiple"
|
||||
@click="handleDelete"
|
||||
v-hasPermi="['in:bindMsg:remove']"
|
||||
>删除</el-button>
|
||||
</el-col>
|
||||
<!-- <el-col :span="1.5">
|
||||
<el-button
|
||||
type="warning"
|
||||
plain
|
||||
icon="el-icon-download"
|
||||
size="mini"
|
||||
@click="handleExport"
|
||||
v-hasPermi="['in:bindTrayMsg:export']"
|
||||
>导出</el-button>
|
||||
</el-col> -->
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="bindTrayMsgList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="托盘码" align="center" prop="trayCode" />
|
||||
<el-table-column label="入库主单" align="center" prop="stockinId" />
|
||||
<el-table-column label="入库子单" align="center" prop="stockinDetailId" />
|
||||
<el-table-column label="物料编码" align="center" prop="productId" />
|
||||
<el-table-column label="版辊编号" align="center" prop="rollerNumber" />
|
||||
<el-table-column label="入库数量" align="center" prop="quantity" />
|
||||
<el-table-column label="用户编码" align="center" prop="userId" />
|
||||
<el-table-column label="部门编码" align="center" prop="deptId" />
|
||||
<el-table-column label="托盘类型" align="center" prop="trayType" />
|
||||
<el-table-column label="状态" align="center" prop="status" >
|
||||
<template slot-scope="scope">
|
||||
<dict-tag :options="dict.type.in_tray_msg_status" :value="scope.row.status" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- <el-table-column label="${comment}" align="center" prop="jobId" />
|
||||
<el-table-column label="${comment}" align="center" prop="jobDetailId" /> -->
|
||||
<!-- <el-table-column label="${comment}" align="center" prop="supplierId" />
|
||||
<el-table-column label="${comment}" align="center" prop="spec" />
|
||||
<el-table-column label="${comment}" align="center" prop="rollerNumber" />
|
||||
<el-table-column label="${comment}" align="center" prop="diameter" />
|
||||
<el-table-column label="${comment}" align="center" prop="splicingLength" />
|
||||
<el-table-column label="${comment}" align="center" prop="plugHole" /> -->
|
||||
<el-table-column label="颜色" align="center" prop="color" />
|
||||
<!-- <el-table-column label="${comment}" align="center" prop="productName" />
|
||||
<el-table-column label="${comment}" align="center" prop="warehouseName" />
|
||||
<el-table-column label="${comment}" align="center" prop="userName" />
|
||||
<el-table-column label="${comment}" align="center" prop="deptName" />
|
||||
<el-table-column label="${comment}" align="center" prop="supplierName" /> -->
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-edit"
|
||||
@click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['in:bindMsg:edit']"
|
||||
>修改</el-button>
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-delete"
|
||||
@click="handleDelete(scope.row)"
|
||||
v-hasPermi="['in:bindMsg:remove']"
|
||||
>删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
v-show="total>0"
|
||||
:total="total"
|
||||
:page.sync="queryParams.pageNum"
|
||||
:limit.sync="queryParams.pageSize"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加或修改入库信息对话框 -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="托盘码" prop="trayCode">
|
||||
<el-input v-model="form.trayCode" placeholder="请输入托盘码" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="版辊编号" prop="rollerNumber">
|
||||
<el-input v-model="form.rollerNumber" placeholder="请输入版辊编号" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="入库数量" prop="quantity">
|
||||
<el-input v-model="form.quantity" disabled placeholder="1" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listBindTrayMsg, getBindTrayMsg, delBindTrayMsg, delBindTrayMsgByRollerNumber, addBindTrayMsg, updateBindTrayMsg } from "@/api/in/bindTrayMsg"
|
||||
import { data } from "vue-barcode";
|
||||
|
||||
export default {
|
||||
name: "BindTrayMsg",
|
||||
dicts: ['in_tray_msg_status'],
|
||||
data() {
|
||||
return {
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
// 选中数组
|
||||
ids: [],
|
||||
// 非单个禁用
|
||||
single: true,
|
||||
// 非多个禁用
|
||||
multiple: true,
|
||||
// 显示搜索条件
|
||||
showSearch: true,
|
||||
// 总条数
|
||||
total: 0,
|
||||
// 入库信息表格数据
|
||||
bindTrayMsgList: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
trayCode: null,
|
||||
stockinDetailId: null,
|
||||
productId: null,
|
||||
quantity: null,
|
||||
warehouseId: null,
|
||||
userId: null,
|
||||
deptId: null,
|
||||
trayType: null,
|
||||
trayLocation: null,
|
||||
status: null,
|
||||
jobId: null,
|
||||
jobDetailId: null,
|
||||
stockinId: null,
|
||||
supplierId: null,
|
||||
spec: null,
|
||||
rollerNumber: null,
|
||||
diameter: null,
|
||||
splicingLength: null,
|
||||
plugHole: null,
|
||||
colorSequence: null,
|
||||
color: null,
|
||||
productName: null,
|
||||
warehouseName: null,
|
||||
userName: null,
|
||||
deptName: null,
|
||||
supplierName: null
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
// 表单校验
|
||||
rules: {
|
||||
id: [
|
||||
{ required: true, message: "$comment不能为空", trigger: "blur" }
|
||||
],
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getList()
|
||||
},
|
||||
methods: {
|
||||
/** 查询入库信息列表 */
|
||||
getList() {
|
||||
this.loading = true
|
||||
listBindTrayMsg(this.queryParams).then(response => {
|
||||
this.bindTrayMsgList = response.rows
|
||||
this.total = response.total
|
||||
this.loading = false
|
||||
})
|
||||
},
|
||||
// 取消按钮
|
||||
cancel() {
|
||||
this.open = false
|
||||
this.reset()
|
||||
},
|
||||
|
||||
// 表单重置
|
||||
reset() {
|
||||
this.form = {
|
||||
id: null,
|
||||
trayCode: null,
|
||||
stockinDetailId: null,
|
||||
productId: null,
|
||||
quantity: null,
|
||||
warehouseId: null,
|
||||
userId: null,
|
||||
deptId: null,
|
||||
createTime: null,
|
||||
trayType: null,
|
||||
trayLocation: null,
|
||||
status: null,
|
||||
jobId: null,
|
||||
jobDetailId: null,
|
||||
stockinId: null,
|
||||
supplierId: null,
|
||||
spec: null,
|
||||
rollerNumber: null,
|
||||
diameter: null,
|
||||
splicingLength: null,
|
||||
plugHole: null,
|
||||
colorSequence: null,
|
||||
color: null,
|
||||
productName: null,
|
||||
warehouseName: null,
|
||||
userName: null,
|
||||
deptName: null,
|
||||
supplierName: null
|
||||
}
|
||||
this.resetForm("form")
|
||||
},
|
||||
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1
|
||||
this.getList()
|
||||
},
|
||||
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.resetForm("queryForm")
|
||||
this.handleQuery()
|
||||
},
|
||||
|
||||
// 多选框选中数据
|
||||
handleSelectionChange(selection) {
|
||||
// this.ids = selection.map(item => item.id)
|
||||
this.rollerNumbers = selection.map(item => item.rollerNumber)
|
||||
this.single = selection.length !== 1
|
||||
this.multiple = !selection.length
|
||||
},
|
||||
|
||||
/** 新增按钮操作 */
|
||||
handleAdd() {
|
||||
this.reset()
|
||||
this.open = true
|
||||
this.title = "添加入库信息"
|
||||
},
|
||||
|
||||
/** 修改按钮操作 */
|
||||
handleUpdate(row) {
|
||||
this.reset()
|
||||
const id = row.id || this.ids
|
||||
getBindTrayMsg(id).then(response => {
|
||||
this.form = response.data
|
||||
this.open = true
|
||||
this.title = "修改入库信息"
|
||||
})
|
||||
},
|
||||
|
||||
/** 提交按钮 */
|
||||
submitForm() {
|
||||
if (!this.form.trayCode) {
|
||||
this.$modal.msg('请输入托盘号')
|
||||
return
|
||||
}
|
||||
|
||||
if (!this.form.rollerNumber) {
|
||||
this.$modal.msg('请输入版辊编号')
|
||||
return
|
||||
}
|
||||
|
||||
var data = {
|
||||
trayCode: this.form.trayCode,
|
||||
rollerNumber: this.form.rollerNumber,
|
||||
quantity: this.form.quantity,
|
||||
}
|
||||
|
||||
addBindTrayMsg(data).then(() => {
|
||||
this.$modal.msgSuccess("新增成功")
|
||||
this.open = false
|
||||
this.getList()
|
||||
}).catch(() => {})
|
||||
|
||||
},
|
||||
|
||||
/** 删除按钮操作 */
|
||||
// handleDelete(row) {
|
||||
// // 统一将单条数据转为数组,方便后端 String[] 接收
|
||||
// const ids = row.id || row.ids;
|
||||
|
||||
// this.$modal.confirm('是否确认删除编号为"' + ids + '"的数据项?').then(function() {
|
||||
// return delBindTrayMsg(ids)
|
||||
// }).then(() => {
|
||||
// this.getList()
|
||||
// this.$modal.msgSuccess("删除成功")
|
||||
// }).catch(() => {})
|
||||
// },
|
||||
handleDelete(row) {
|
||||
// 统一将单条数据转为数组,方便后端 String[] 接收
|
||||
const rollerNumbers = row.rollerNumber ? [row.rollerNumber] : this.rollerNumbers;
|
||||
console.log(row)
|
||||
console.log(rollerNumbers)
|
||||
this.$modal.confirm('是否确认删除版辊编号为"' + rollerNumbers.join(",") + '"的数据项?').then(() => {
|
||||
return delBindTrayMsgByRollerNumber(rollerNumbers)
|
||||
}).then(() => {
|
||||
this.getList()
|
||||
this.$modal.msgSuccess("删除成功")
|
||||
}).catch(() => {
|
||||
this.getList()
|
||||
})
|
||||
},
|
||||
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
this.download('in/bindTrayMsg/export', {
|
||||
...this.queryParams
|
||||
}, `bindTrayMsg_${new Date().getTime()}.xlsx`)
|
||||
},
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -2162,7 +2162,7 @@ GO
|
||||
INSERT INTO [dbo].[gen_table] ([table_id], [table_name], [table_comment], [sub_table_name], [sub_table_fk_name], [class_name], [tpl_category], [tpl_web_type], [package_name], [module_name], [business_name], [function_name], [function_author], [form_col_num], [gen_type], [gen_path], [options], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'6', N'in_stockin', N'入库单据主信息表', NULL, NULL, N'InStockin', N'crud', N'element-ui', N'com.ruoyi.in.stockin', N'in', N'stockin', N'入库单据主信息', N'ruoyi', N'1', N'0', N'/', N'{"genView":"0","parentMenuId":2000}', N'admin', N'2026-05-11 11:08:00.000', N'', N'2026-05-11 11:24:01.000', NULL)
|
||||
GO
|
||||
|
||||
INSERT INTO [dbo].[gen_table] ([table_id], [table_name], [table_comment], [sub_table_name], [sub_table_fk_name], [class_name], [tpl_category], [tpl_web_type], [package_name], [module_name], [business_name], [function_name], [function_author], [form_col_num], [gen_type], [gen_path], [options], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'7', N'in_stockin_detail', N'入库单据子信息表', NULL, NULL, N'InStockinDetail', N'crud', N'element-ui', N'com.ruoyi.in.stockindetail', N'in', N'sotckindetail', N'入库单据子信息', N'ruoyi', N'1', N'0', N'/', N'{"genView":"0","parentMenuId":2000}', N'admin', N'2026-05-11 11:08:00.000', N'', N'2026-05-11 11:29:04.000', NULL)
|
||||
INSERT INTO [dbo].[gen_table] ([table_id], [table_name], [table_comment], [sub_table_name], [sub_table_fk_name], [class_name], [tpl_category], [tpl_web_type], [package_name], [module_name], [business_name], [function_name], [function_author], [form_col_num], [gen_type], [gen_path], [options], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'7', N'in_stockin_detail', N'入库单据子信息表', NULL, NULL, N'InStockinDetail', N'crud', N'element-ui', N'com.ruoyi.in.stockindetail', N'in', N'stockindetail', N'入库单据子信息', N'ruoyi', N'1', N'0', N'/', N'{"genView":"0","parentMenuId":2000}', N'admin', N'2026-05-11 11:08:00.000', N'', N'2026-05-11 11:29:04.000', NULL)
|
||||
GO
|
||||
|
||||
INSERT INTO [dbo].[gen_table] ([table_id], [table_name], [table_comment], [sub_table_name], [sub_table_fk_name], [class_name], [tpl_category], [tpl_web_type], [package_name], [module_name], [business_name], [function_name], [function_author], [form_col_num], [gen_type], [gen_path], [options], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'8', N'in_stockin_detail_finish', N'入库单据子信息表', NULL, NULL, N'InStockinDetailFinish', N'crud', N'element-ui', N'com.ruoyi.system', N'system', N'finish', N'入库单据子信息', N'ruoyi', N'1', N'0', N'/', NULL, N'admin', N'2026-05-11 11:08:00.000', N'', NULL, NULL)
|
||||
@@ -8864,7 +8864,7 @@ GO
|
||||
INSERT INTO [dbo].[sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [component], [query], [route_name], [is_frame], [is_cache], [menu_type], [visible], [status], [perms], [icon], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'2113', N'添加入库单据', N'2056', N'0', N'', NULL, NULL, N'', N'1', N'0', N'F', N'0', N'0', N'in:stockin:add', N'#', N'admin', N'2026-05-20 09:57:59.127', N'', NULL, N'')
|
||||
GO
|
||||
|
||||
INSERT INTO [dbo].[sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [component], [query], [route_name], [is_frame], [is_cache], [menu_type], [visible], [status], [perms], [icon], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'2114', N'查询子单据', N'2044', N'6', N'', NULL, NULL, N'', N'1', N'0', N'F', N'0', N'0', N'in:sotckindetail:list', N'#', N'admin', N'2026-05-20 10:02:52.333', N'', NULL, N'')
|
||||
INSERT INTO [dbo].[sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [component], [query], [route_name], [is_frame], [is_cache], [menu_type], [visible], [status], [perms], [icon], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'2114', N'查询子单据', N'2044', N'6', N'', NULL, NULL, N'', N'1', N'0', N'F', N'0', N'0', N'in:stockindetail:list', N'#', N'admin', N'2026-05-20 10:02:52.333', N'', NULL, N'')
|
||||
GO
|
||||
|
||||
INSERT INTO [dbo].[sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [component], [query], [route_name], [is_frame], [is_cache], [menu_type], [visible], [status], [perms], [icon], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'2115', N'手动作废', N'2044', N'0', N'', NULL, NULL, N'', N'1', N'0', N'F', N'0', N'0', N'in:stockin:cancel', N'#', N'admin', N'2026-05-20 10:03:54.427', N'', NULL, N'')
|
||||
@@ -9785,7 +9785,7 @@ GO
|
||||
INSERT INTO [dbo].[sys_oper_log] ([oper_id], [title], [business_type], [method], [request_method], [operator_type], [oper_name], [dept_name], [oper_url], [oper_ip], [oper_location], [oper_param], [json_result], [status], [error_msg], [oper_time], [cost_time]) VALUES (N'97', N'菜单管理', N'3', N'com.ruoyi.web.controller.system.SysMenuController.remove()', N'DELETE', N'1', N'admin', N'天津一重', N'/system/menu/2049', N'127.0.0.1', N'内网IP', N'2049 ', N'{"msg":"菜单已分配,不允许删除","code":601}', N'0', NULL, N'2026-05-20 10:02:35.570', N'24')
|
||||
GO
|
||||
|
||||
INSERT INTO [dbo].[sys_oper_log] ([oper_id], [title], [business_type], [method], [request_method], [operator_type], [oper_name], [dept_name], [oper_url], [oper_ip], [oper_location], [oper_param], [json_result], [status], [error_msg], [oper_time], [cost_time]) VALUES (N'98', N'菜单管理', N'1', N'com.ruoyi.web.controller.system.SysMenuController.add()', N'POST', N'1', N'admin', N'天津一重', N'/system/menu', N'127.0.0.1', N'内网IP', N'{"children":[],"createBy":"admin","isCache":"0","isFrame":"1","menuName":"查询子单据","menuType":"F","orderNum":6,"params":{},"parentId":2044,"perms":"in:sotckindetail:list","status":"0","visible":"0"} ', N'{"msg":"操作成功","code":200}', N'0', NULL, N'2026-05-20 10:02:52.357', N'19')
|
||||
INSERT INTO [dbo].[sys_oper_log] ([oper_id], [title], [business_type], [method], [request_method], [operator_type], [oper_name], [dept_name], [oper_url], [oper_ip], [oper_location], [oper_param], [json_result], [status], [error_msg], [oper_time], [cost_time]) VALUES (N'98', N'菜单管理', N'1', N'com.ruoyi.web.controller.system.SysMenuController.add()', N'POST', N'1', N'admin', N'天津一重', N'/system/menu', N'127.0.0.1', N'内网IP', N'{"children":[],"createBy":"admin","isCache":"0","isFrame":"1","menuName":"查询子单据","menuType":"F","orderNum":6,"params":{},"parentId":2044,"perms":"in:stockindetail:list","status":"0","visible":"0"} ', N'{"msg":"操作成功","code":200}', N'0', NULL, N'2026-05-20 10:02:52.357', N'19')
|
||||
GO
|
||||
|
||||
INSERT INTO [dbo].[sys_oper_log] ([oper_id], [title], [business_type], [method], [request_method], [operator_type], [oper_name], [dept_name], [oper_url], [oper_ip], [oper_location], [oper_param], [json_result], [status], [error_msg], [oper_time], [cost_time]) VALUES (N'99', N'角色管理', N'2', N'com.ruoyi.web.controller.system.SysRoleController.edit()', N'PUT', N'1', N'admin', N'天津一重', N'/system/role', N'127.0.0.1', N'内网IP', N'{"admin":false,"createTime":"2026-05-11 09:49:00","dataScope":"1","delFlag":"0","deptCheckStrictly":true,"flag":false,"menuCheckStrictly":true,"menuIds":[2000,2056,2110,2111,2112,2113,2044,2045,2046,2047,2048,2049,2114],"params":{},"roleId":100,"roleKey":"el:common:role","roleName":"二联合普通人员","roleSort":0,"status":"0","updateBy":"admin"} ', N'{"msg":"操作成功","code":200}', N'0', NULL, N'2026-05-20 10:03:01.850', N'77')
|
||||
|
||||
Reference in New Issue
Block a user