现场调试修改 入库 出库 放货重新分配货位

This commit is contained in:
liuhanqing
2025-12-26 13:23:28 +08:00
parent ced125c8e9
commit 6b56e5f2ad
53 changed files with 3397 additions and 1832 deletions

View File

@@ -4,16 +4,13 @@
import { getToken } from '@/utils/auth'
export default {
globalData: {
config: {}
},
onLaunch: function() {
this.initApp()
},
onShow: function() {
// 检查应用状态,确保从后台恢复时状态一致
this.checkAppState()
},
// onShow: function() {
// // 检查应用状态,确保从后台恢复时状态一致
// this.checkAppState()
// },
methods: {
// 初始化应用
initApp() {
@@ -29,43 +26,39 @@
},
checkLogin() {
if (!getToken()) {
console.log('checkLogin 检查登录状态,token不存在')
this.$tab.reLaunch('/pages/login')
}
},
checkAppState() {
// 检查Token状态和页面导航栈状态
console.log('应用从后台切换到前台,检查应用状态')
// 获取当前页面路径,判断是否在登录页
const pages = getCurrentPages()
const currentPage = pages[pages.length - 1]
const currentPagePath = currentPage ? currentPage.route : ''
// 如果当前页面是登录页,则不检查token
if (currentPagePath === 'pages/login') {
console.log('当前已在登录页面,不进行token检查')
return
}
// 检查Token状态
if (!getToken()) {
console.log('Token不存在,提示并跳转到登录页')
uni.showToast({
icon: 'none',
title: '登录已过期,请重新登录'
})
setTimeout(() => {
uni.reLaunch({ url: '/pages/login' })
}, 1500)
} else {
console.log('Token存在,不做操作')
}
}
// checkAppState() {
// // 检查Token状态和页面导航栈状态
// console.log('应用从后台切换到前台,检查应用状态')
// // 检查Token状态
// if (!getToken()) {
// console.log('Token不存在,跳转到登录页')
// this.$tab.reLaunch('/pages/login')
// return
// }
// // 检查页面导航栈状态
// const pages = getCurrentPages()
// if (pages.length === 0) {
// console.log('页面导航栈为空,跳转到首页')
// this.$tab.reLaunch('/pages/index')
// return
// }
// // 检查当前页面是否为登录页
// const currentPage = pages[pages.length - 1].route
// if (currentPage === 'pages/login') {
// // 如果当前页面是登录页,不做任何操作
// console.log('当前页面是登录页,不需要跳转')
// }
// }
}
}
</script>
<style lang="scss">

View File

@@ -3,7 +3,7 @@ import request from '@/utils/request'
export function emptyTrayIn(data) {
return request({
url: '/pda/emptyTrayIn',
url: '/pda/ktpin',
method: 'post',
data: data
})

View File

@@ -21,7 +21,7 @@ export function getInOrderDetail(query) {
// 获取入库单物品信息
export function getOrderGoods(query) {
return request({
url: '/pda/inorder/detail',
url: '/pda/selectStockinDetail',
method: 'get',
params: query
})
@@ -39,7 +39,7 @@ export function bindTray(data) {
//查询绑定托盘信息
export function getTrayInfo(trayCode) {
return request({
url: '/pda/bindMsg?trayCode=' + trayCode,
url: '/pda/trayMsg?trayCode=' + trayCode,
method: 'get'
})
}
@@ -47,11 +47,21 @@ export function getTrayInfo(trayCode) {
//确认入库
export function addInJob(data) {
return request({
url: '/pda/addInJob',
url: '/pda/rkSure',
method: 'post',
data: data
})
}
export function addInJobpk(data) {
return request({
url: '/pda/rkSurepk',
method: 'post',
data: data
})
}
//获取质检单
export function getQualityCheckOrders(query) {
return request({

View File

@@ -2,7 +2,7 @@ import request from '@/utils/request'
export function emptyTrayOut(data) {
return request({
url: '/pda/emptyTrayOut',
url: '/pda/ktpout',
method: 'post',
data: data
})

View File

@@ -31,4 +31,13 @@ export function getTrayMaterials(data) {
method: 'post',
data: data
})
}
// 根据托盘条码获取物料信息
export function getTaskDetail(data) {
return request({
url: '/pda/selectDetailByPDTray',
method: 'post',
data:data
})
}

View File

@@ -1,58 +1,16 @@
<template>
<view class="language-switcher">
<picker :value="currentIndex" :range="languages" range-key="label" @change="handleLanguageChange">
<view class="picker-box">
<text>{{ $t('settings.language') }}</text>
<text class="current-language">{{ languages[currentIndex].label }}</text>
</view>
</picker>
<view class="picker-box">
<text>语言</text>
<text class="current-language">简体中文</text>
</view>
</view>
</template>
<script>
export default {
data() {
return {
languages: [
{ code: 'zh-CN', label: '简体中文' },
{ code: 'en-US', label: 'English' }
],
currentIndex: 0
}
},
created() {
// 初始化当前语言索引
const currentLang = uni.getStorageSync('language') || 'zh-CN'
const index = this.languages.findIndex(lang => lang.code === currentLang)
this.currentIndex = index !== -1 ? index : 0
},
methods: {
handleLanguageChange(e) {
const index = e.detail.value
const selectedLang = this.languages[index].code
// 保存语言设置
uni.setStorageSync('language', selectedLang)
// 切换语言
this.$i18n.locale = selectedLang
this.currentIndex = index
// 提示用户
uni.showToast({
title: this.$t('common.save') + '成功',
icon: 'success'
})
// 刷新页面
setTimeout(() => {
const pages = getCurrentPages()
const currentPage = pages[pages.length - 1]
uni.reLaunch({
url: '/' + currentPage.route
})
}, 1500)
}
return {}
}
}
</script>

View File

@@ -2,33 +2,15 @@ import Vue from 'vue'
import App from './App'
import store from './store' // store
import plugins from './plugins' // plugins
import VueI18n from 'vue-i18n'
import './permission' // permission
// 引入语言包
import enUS from './locales/en-US.json'
import zhCN from './locales/zh-CN.json'
Vue.use(plugins)
Vue.use(VueI18n)
Vue.config.productionTip = false
Vue.prototype.$store = store
// 创建i18n实例
const i18n = new VueI18n({
locale: uni.getStorageSync('language') || 'zh-CN', // 默认语言
messages: {
'en-US': enUS,
'zh-CN': zhCN
}
})
Vue.prototype._i18n = i18n
App.mpType = 'app'
const app = new Vue({
i18n,
...App
})

View File

@@ -1,5 +1,5 @@
{
"name" : "手持机",
"name" : "若依移动端",
"appid" : "__UNI__A2DE016",
"description" : "",
"versionName" : "1.1.0",

View File

@@ -1,5 +1,4 @@
{
"dependencies": {
"vue-i18n": "^9.1.9"
}
}

View File

@@ -233,6 +233,27 @@
{
"navigationBarTitleText" : "点对点搬运"
}
},
{
"path" : "pages/ktp/menu",
"style" :
{
"navigationBarTitleText" : "菜单"
}
},
{
"path" : "pages/in/bindMany",
"style" :
{
"navigationBarTitleText" : "绑定多物料"
}
},
{
"path" : "pages/in/bindManypk",
"style" :
{
"navigationBarTitleText" : "平库绑定入库"
}
}
@@ -249,12 +270,7 @@
"selectedIconPath": "static/images/tabbar/home_.png",
"text": "工作台"
},
{
"pagePath": "pages/task/taskList",
"iconPath": "static/images/tabbar/task.png",
"selectedIconPath": "static/images/tabbar/task_.png",
"text": "任务"
},
{
"pagePath": "pages/mine/index",

View File

@@ -2,12 +2,12 @@
<view class="container">
<view class="warehouse-selector">
<uni-forms>
<uni-forms-item :label="$t('spaceAnalysis.warehouse')">
<uni-forms-item label="仓库:">
<uni-data-select
v-model="selectedWarehouseId"
:localdata="warehouseList"
:clear="false"
:placeholder="$t('spaceAnalysis.warehousePlaceholder')"
placeholder="请选择仓库"
@change="handleWarehouseChange"
/>
</uni-forms-item>
@@ -58,7 +58,7 @@ export default {
},
pieOpts: {
title: {
name: this.$t('spaceAnalysis.cargoSpaceStatus'),
name: '货位状态分布',
fontSize: 15
},
legend: {
@@ -86,7 +86,7 @@ export default {
},
columnOpts: {
title: {
name: this.$t('spaceAnalysis.aisleStatistics'),
name: '巷道出入库统计',
fontSize: 15
},
legend: {
@@ -96,7 +96,7 @@ export default {
fontSize: 12
},
yAxis: {
name: this.$t('spaceAnalysis.quantity'),
name: '数量',
fontSize: 12
},
extra: {
@@ -159,12 +159,12 @@ export default {
if (res.code === 200 && res.data) {
// 更新柱状图数据
this.columnData = {
categories: [`1${this.$t('spaceAnalysis.aisle')}`],
categories: ['1巷道'],
series: [{
name: this.$t('spaceAnalysis.inboundQuantity'),
name: '入库数量',
data:[res.data["in"]]
},{
name: this.$t('spaceAnalysis.outboundQuantity'),
name: '出库数量',
data:[res.data["out"]]
}]
}

View File

@@ -1,10 +1,10 @@
<template>
<view class="container">
<view class="input-group">
<text class="input-label">{{ $t('inbound.backIn.rackCode') }}</text>
<text class="input-label">料架条码:</text>
<uni-easyinput
v-model="rackCode"
:placeholder="$t('inbound.backIn.rackCodePlaceholder')"
placeholder="请输入或扫码输入料架条码"
:clearable="true"
@input="handleInput"
@clear="handleClear"
@@ -17,22 +17,22 @@
</view>
<view class="loading-container" v-if="loading">
<uni-load-more status="loading" :content-text="{contentdown: $t('inbound.backIn.loading'),contentrefresh: $t('inbound.backIn.loading'),contentnomore: $t('common.noData')}"></uni-load-more>
<uni-load-more status="loading" :content-text="{contentdown: '加载中...',contentrefresh: '加载中...',contentnomore: '暂无数据'}"></uni-load-more>
</view>
<view class="card-container" v-if="materialList.length > 0">
<uni-card v-for="(item, index) in materialList" :key="index" class="material-card">
<view class="card-content">
<view class="info-row">
<text class="label">{{ $t('inbound.backIn.materialCode') }}</text>
<text class="label">物料编码:</text>
<text class="value">{{ item.productId }}</text>
</view>
<view class="info-row">
<text class="label">{{ $t('inbound.backIn.materialName') }}</text>
<text class="label">物料名称:</text>
<text class="value">{{ item.productName }}</text>
</view>
<view class="info-row">
<text class="label">{{ $t('inbound.backIn.quantity') }}</text>
<text class="label">数量:</text>
<uni-easyinput
v-model="item.editQuantity"
type="number"
@@ -46,28 +46,28 @@
</view>
<view class="empty-state" v-if="!loading && materialList.length === 0 && rackCode">
<text>{{ $t('inbound.backIn.noMaterialInfo') }}</text>
<text>未找到相关物料信息</text>
</view>
<view class="button-container" v-if="materialList.length > 0">
<button class="submit-button" @click="handleSubmit">{{ $t('inbound.backIn.submit') }}</button>
<button class="submit-button" @click="handleSubmit">提交</button>
</view>
<!-- 仓库选择弹窗 -->
<uni-popup ref="warehousePopup" type="center">
<view class="popup-content">
<view class="popup-title">{{ $t('inbound.backIn.selectWarehouse') }}</view>
<view class="popup-title">请选择仓库</view>
<view class="popup-body">
<uni-data-select
v-model="selectedWarehouseId"
:localdata="warehouseList"
:clear="false"
:placeholder="$t('inbound.backIn.warehousePlaceholder')"
placeholder="请选择仓库"
/>
</view>
<view class="popup-footer">
<button class="cancel-button" @click="closeWarehousePopup">{{ $t('inbound.backIn.cancel') }}</button>
<button class="confirm-button" @click="confirmSubmit">{{ $t('inbound.backIn.confirm') }}</button>
<button class="cancel-button" @click="closeWarehousePopup">取消</button>
<button class="confirm-button" @click="confirmSubmit">确定</button>
</view>
</view>
</uni-popup>
@@ -119,7 +119,7 @@
} catch (error) {
console.error('获取仓库列表失败:', error)
uni.showToast({
title: this.$t('inbound.backIn.getWarehouseListFailed'),
title: '获取仓库列表失败',
icon: 'none'
})
}
@@ -164,21 +164,21 @@
} else {
this.materialList = []
uni.showToast({
title: this.$t('inbound.backIn.noMaterialInfo'),
title: '未找到相关物料信息',
icon: 'none'
})
}
} else {
this.materialList = []
uni.showToast({
title: response.msg || this.$t('inbound.backIn.getRackInfoFailed'),
title: response.msg || '获取料架信息失败',
icon: 'none'
})
}
} catch (error) {
this.materialList = []
uni.showToast({
title: this.$t('inbound.backIn.getRackInfoFailed'),
title: '获取料架信息失败',
icon: 'none'
})
} finally {
@@ -208,14 +208,14 @@
if (this.materialList.length === 0) {
uni.showToast({
title: this.$t('inbound.backIn.noSubmitMaterial'),
title: '没有可提交的物料信息',
icon: 'none'
})
return
}
if(!this.rackCode){
uni.showToast({
title: this.$t('inbound.backIn.enterRackCode'),
title: '请输入料架条码',
icon: 'none'
})
return
@@ -231,7 +231,7 @@
if (!isValid) {
uni.showToast({
title: this.$t('inbound.backIn.enterValidQuantity'),
title: '请输入有效的数量',
icon: 'none'
})
return
@@ -264,7 +264,7 @@
async confirmSubmit() {
if (!this.selectedWarehouseId) {
uni.showToast({
title: this.$t('inbound.backIn.selectWarehouse'),
title: '请选择仓库',
icon: 'none'
})
return
@@ -290,7 +290,7 @@
if (response.code === 200) {
uni.showToast({
title: this.$t('inbound.backIn.submitSuccess'),
title: '提交成功',
icon: 'success'
})
@@ -300,13 +300,13 @@
})
} else {
uni.showToast({
title: response.msg || this.$t('inbound.backIn.submitFailed'),
title: response.msg || '提交失败',
icon: 'none'
})
}
} catch (error) {
uni.showToast({
title: this.$t('inbound.backIn.submitFailed'),
title: '提交失败',
icon: 'none'
})
console.error(error)

File diff suppressed because it is too large Load Diff

View File

@@ -168,7 +168,7 @@
})
}
// try {
try {
const response = await bindTray(this.formData)
console.log(response)
@@ -193,13 +193,13 @@
icon: 'none'
})
}
// } catch (error) {
// // console.error('绑定托盘失败:', error)
// uni.showToast({
// title: '绑定托盘失败',
// icon: 'none'
// })
// }
} catch (error) {
console.error('绑定托盘失败:', error)
uni.showToast({
title: '网络错误,请稍后重试',
icon: 'none'
})
}
}
}
}

View File

@@ -3,7 +3,7 @@
<view class="search-box">
<uni-easyinput
v-model="stockinId"
:placeholder="$t('inbound.inorder.searchPlaceholder')"
placeholder="请输入或扫码输入单据号"
:clearable="true"
@clear="handleClear"
@confirm="handleSearch"
@@ -21,28 +21,28 @@
<view class="card-content">
<view class="order-header" @click="handleOrderClick(order)">
<view class="info-row">
<text class="label">{{ $t('inbound.inorder.orderNumber') }}</text>
<text class="value">{{ order.stockinId }}</text>
</view>
<view class="info-row">
<text class="label">{{ $t('inbound.inorder.createTime') }}</text>
<text class="value">{{ order.createDate }}</text>
</view>
<view class="info-row">
<text class="label">{{ $t('inbound.inorder.supplier') }}</text>
<text class="value">{{ order.supplierName }}</text>
</view>
<text class="label">单据编号:</text>
<text class="value">{{ order.stockinId }}</text>
</view>
<view class="info-row">
<text class="label">创建时间:</text>
<text class="value">{{ order.createDate }}</text>
</view>
<view class="info-row">
<text class="label">供应商</text>
<text class="value">{{ order.supplierName }}</text>
</view>
</view>
<!-- 展开时显示物料信息 -->
<view v-if="order.expanded && order.goodsList" class="goods-list" @click.stop>
<view class="goods-title">{{ $t('inbound.inorder.goodsInfo') }}</view>
<view class="goods-title">物品信息</view>
<view class="goods-table">
<view class="table-header">
<text class="header-cell" style="display: none;">{{ $t('inbound.inorder.productCode') }}</text>
<text class="header-cell">{{ $t('inbound.inorder.productName') }}</text>
<text class="header-cell">{{ $t('inbound.inorder.planQuantity') }}</text>
<text class="header-cell">{{ $t('inbound.inorder.inboundQuantity') }}</text>
</view>
<text class="header-cell" style="display: none;">物品编码</text>
<text class="header-cell">物品名称</text>
<text class="header-cell">计划数量</text>
<text class="header-cell">入库数量</text>
</view>
<view v-for="(goods, goodsIndex) in order.goodsList" :key="goodsIndex" class="table-row">
<text class="table-cell" style="display: none;">{{ goods.productId }}</text>
<text class="table-cell material-name">{{ goods.extraField.materialDesc }}</text>
@@ -60,8 +60,8 @@
</view>
<view class="table-cell">
<button class="operate-btn" @click.stop="handleInStock(goods)" :class="{'operate-btn-disabled': !isValidQuantity(goods)}">
{{ $t('inbound.inorder.inbound') }}
</button>
入库
</button>
</view>
</view>
</view>
@@ -70,7 +70,7 @@
</uni-card>
</view>
</view>
<view v-else class="no-data">{{ $t('inbound.inorder.noOrderInfo') }}</view>
<view v-else class="no-data">暂无入库单信息</view>
</view>
</view>
</template>
@@ -118,7 +118,7 @@ export default {
} catch (error) {
console.error('获取入库单列表失败:', error)
uni.showToast({
title: this.$t('inbound.inorder.getOrderListFailed'),
title: '获取入库单列表失败',
icon: 'none'
})
}
@@ -139,7 +139,7 @@ export default {
} catch (error) {
console.error('获取物品信息失败:', error)
uni.showToast({
title: this.$t('inbound.inorder.getItemInfoFailed'),
title: '获取物品信息失败',
icon: 'none'
})
}
@@ -187,7 +187,7 @@ export default {
if (Number(goods.inQuantity) > maxQuantity) {
goods.inQuantity = maxQuantity;
uni.showToast({
title: this.$t('inbound.inorder.exceedInboundQuantity'),
title: '超出可入库数量',
icon: 'none'
});
}
@@ -197,7 +197,7 @@ export default {
async handleInStock(goods) {
if (!this.isValidQuantity(goods)) {
uni.showToast({
title: this.$t('inbound.inorder.enterValidQuantity'),
title: '请输入有效的入库数量',
icon: 'none'
})
return
@@ -210,7 +210,7 @@ export default {
})
uni.showToast({
title: this.$t('inbound.inorder.inboundSuccess'),
title: '入库成功',
icon: 'success'
})
@@ -219,7 +219,7 @@ export default {
} catch (error) {
console.error('入库操作失败:', error)
uni.showToast({
title: this.$t('inbound.inorder.inboundFailed'),
title: '入库失败',
icon: 'none'
})
}

View File

@@ -1,10 +1,10 @@
<template>
<view class="container">
<view class="input-group">
<text class="input-label">{{ $t('inbound.emptyPalletBox.emptyPallet.trayCode') }}</text>
<text class="input-label">托盘条码:</text>
<uni-easyinput
v-model="formData.trayCode"
:placeholder="$t('inbound.emptyPalletBox.emptyPallet.trayCodePlaceholder')"
placeholder="请输入或扫码输入托盘条码"
:clearable="true"
@clear="handleClear"
@confirm="handleConfirm"
@@ -16,33 +16,18 @@
</template>
</uni-easyinput>
</view>
<view class="input-group">
<text class="input-label">{{ $t('inbound.emptyPalletBox.emptyPallet.warehouse') }}</text>
<!-- <view class="input-group">
<text class="input-label">仓库</text>
<uni-data-select
v-model="formData.warehouseId"
:localdata="warehouseList"
:clear="false"
:placeholder="$t('inbound.emptyPalletBox.emptyPallet.warehousePlaceholder')"
@change="handleWarehouseChange"
placeholder="请选择仓库"
/>
</view>
<view class="input-group" v-if="currentWarehouseType == '1'">
<text class="input-label">{{ $t('inbound.emptyPalletBox.emptyPallet.cargoSpace') }}</text>
<view class="cargo-input-group">
<uni-easyinput
v-model="formData.cargoSpaceName"
:placeholder="$t('inbound.emptyPalletBox.emptyPallet.cargoSpacePlaceholder')"
:clearable="true"
@input="handleCargoSpaceInput"
/>
<button class="recommend-btn" @click="handleRecommendCargoSpace">{{ $t('inbound.emptyPalletBox.emptyPallet.recommendCargoSpace') }}</button>
</view>
</view>
<view v-if="currentWarehouseType == '1' && cargoSpaceHeight" class="cargo-space-info">
<text class="cargo-space-height">{{ $t('inbound.emptyPalletBox.emptyPallet.cargoSpaceHeight') }}{{ cargoSpaceHeight }}{{ $t('inbound.emptyPalletBox.emptyPallet.meter') }}</text>
</view>
</view> -->
<view class="button-group">
<button class="submit-button" @click="handleSubmit">{{ $t('inbound.emptyPalletBox.emptyPallet.submit') }}</button>
<button class="submit-button" @click="handleSubmit">空托盘入库</button>
</view>
</view>
@@ -57,16 +42,11 @@ import { getBasWarehouList,getCargoSpaceList } from '@/api/bas/bas.js'
return {
formData: {
trayCode: '',
warehouseId: '',
cargoSpaceId: '',
cargoSpaceName:'',
warehouseId: ''
},
warehouseList: [],
cargoSpaceId: '',
cargoSpaceList: [],
currentWarehouseType: null,
cargoSpaceHeight:''
warehouseList: []
}
},
onReady() {
@@ -77,7 +57,7 @@ import { getBasWarehouList,getCargoSpaceList } from '@/api/bas/bas.js'
}, 100)
// 获取仓库列表
this.getWarehouseList()
// this.getWarehouseList()
},
methods: {
// 获取仓库列表
@@ -85,20 +65,20 @@ import { getBasWarehouList,getCargoSpaceList } from '@/api/bas/bas.js'
try {
const response = await getBasWarehouList({
pageNum:1,
pageSize:100,
typeData:['1','2']
pageSize:100
})
if (response.code === 200) {
this.warehouseList = response.rows.map(item => ({
value: item.warehouseId,
text: item.warehouseName,
type: item.warehouseType
text: item.warehouseName
// type: item.warehouseType
}))
}
} catch (error) {
console.error('获取仓库列表失败:', error)
uni.showToast({
title: this.$t('inbound.emptyPalletBox.emptyPallet.getWarehouseListFailed'),
title: '获取仓库列表失败',
icon: 'none'
})
}
@@ -119,103 +99,34 @@ import { getBasWarehouList,getCargoSpaceList } from '@/api/bas/bas.js'
})
},
handleWarehouseChange(warehouseId) {
if (!warehouseId) return
const selectedWarehouse = this.warehouseList.find(item => item.value === warehouseId)
this.currentWarehouseType = selectedWarehouse ? selectedWarehouse.type : null
},
// 处理货位选择
async handleRecommendCargoSpace() {
// try {
const response = await getCargoSpaceList({ warehouseId: this.formData.warehouseId, status: 1 })
if (response.code === 200 && response.rows.length > 0) {
// 获取第一个推荐货位
this.formData.cargoSpaceId = response.rows[0].cargoSpaceId
this.formData.cargoSpaceName = response.rows[0].cargoSpaceName
// 手动触发handleCargoSpaceInput方法获取货位高度信息
await this.handleCargoSpaceInput(response.rows[0].cargoSpaceName)
} else {
uni.showToast({
title: this.$t('inbound.emptyPalletBox.emptyPallet.noAvailableCargoSpace'),
icon: 'none'
})
}
// } catch (error) {
// uni.showToast({
// title: '获取推荐货位失败',
// icon: 'none'
// })
// }
},
// 处理货位选择
async handleCargoSpaceInput(value) {
if (value) {
try {
const response = await getCargoSpaceList({ cargoSpaceName: value, warehouseId: this.formData.warehouseId })
if (response.code === 200 && response.rows.length > 0) {
this.formData.cargoSpaceId = response.rows[0].cargoSpaceId
this.cargoSpaceHeight = response.rows[0].cargoHight
console.log(this.formData.cargoSpaceId)
} else {
uni.showToast({
title: this.$t('inbound.emptyPalletBox.emptyPallet.getCargoSpaceInfoFailed'),
icon: 'none'
})
this.formData.cargoSpaceId = ''
this.cargoSpaceHeight = null
}
} catch (error) {
uni.showToast({
title: this.$t('inbound.emptyPalletBox.emptyPallet.getCargoSpaceInfoFailed'),
icon: 'none'
})
this.formData.cargoSpaceId = ''
this.cargoSpaceHeight = null
}
} else {
this.formData.cargoSpaceId = ''
this.cargoSpaceHeight = null
}
},
async handleSubmit() {
if (!this.formData.trayCode) {
uni.showToast({
title: this.$t('inbound.emptyPalletBox.emptyPallet.enterTrayCode'),
icon: 'none'
})
return
}
if (!this.formData.warehouseId) {
uni.showToast({
title: this.$t('inbound.emptyPalletBox.emptyPallet.selectWarehouse'),
icon: 'none'
})
return
}
if (this.currentWarehouseType === '1' && (!this.formData.cargoSpaceId || this.formData.cargoSpaceId === null)) {
uni.showToast({
title: this.$t('inbound.emptyPalletBox.emptyPallet.selectCargoSpace'),
title: '请输入托盘条码',
icon: 'none'
})
return
}
// if (!this.formData.warehouseId) {
// uni.showToast({
// title: '请选择仓库',
// icon: 'none'
// })
// return
// }
await emptyTrayIn(this.formData).then(response => {
if (response.code === 200) {
uni.showToast({
title: this.$t('inbound.emptyPalletBox.emptyPallet.inboundSuccess'),
title: '空托盘入库成功',
icon: 'success'
})
// 清空表单
this.formData = {
trayCode: '',
warehouseId: '',
cargoSpaceId: '',
cargoSpaceName: ''
warehouseId: ''
}
this.cargoSpaceHeight=''
this.currentWarehouseType=null
// 重新聚焦到托盘条码输入框
setTimeout(() => {
this.$nextTick(() => {
@@ -224,14 +135,14 @@ import { getBasWarehouList,getCargoSpaceList } from '@/api/bas/bas.js'
}, 100)
} else {
uni.showToast({
title: response.msg || this.$t('inbound.emptyPalletBox.emptyPallet.inboundOperationFailed'),
title: response.msg || '入库操作失败',
icon: 'none'
})
}
}).catch(error => {
console.error('入库失败:', error)
uni.showToast({
title: this.$t('inbound.emptyPalletBox.emptyPallet.inboundFailed'),
title: '入库失败',
icon: 'none'
})
})

View File

@@ -1,15 +1,15 @@
<template>
<view class="container">
<view class="function-list">
<view class="function-item" @click="navigateTo('/pages/in/qualityCheck')">
<!-- <view class="function-item" @click="navigateTo('/pages/in/qualityCheck')">
<view class="icon-box blue">
<image src="/static/images/tabbar/tray121.png" mode="aspectFit" class="icon-image" style="width: 40rpx; height: 40rpx;"></image>
</view>
<view class="function-text">
<text class="title">{{ $t('inbound.qualityCheck.title') }}</text>
<text class="desc">{{ $t('inbound.qualityCheck.desc') }}</text>
<text class="title">入库质检</text>
<text class="desc">物料收货质检入库</text>
</view>
</view>
</view> -->
<!-- <view class="function-item" @click="navigateTo('/pages/in/klxin')">
<view class="icon-box blue">
<image src="/static/images/tabbar/tray121.png" mode="aspectFit" class="icon-image" style="width: 40rpx; height: 40rpx;"></image>
@@ -19,42 +19,42 @@
<text class="desc">空料箱收货入库</text>
</view>
</view> -->
<view class="function-item" @click="navigateTo('/pages/in/ktpin')">
<!-- <view class="function-item" @click="navigateTo('/pages/in/ktpin')">
<view class="icon-box blue">
<image src="/static/images/tabbar/tray121.png" mode="aspectFit" class="icon-image" style="width: 40rpx; height: 40rpx;"></image>
</view>
<view class="function-text">
<text class="title">{{ $t('inbound.emptyPalletBox.title') }}</text>
<text class="desc">{{ $t('inbound.emptyPalletBox.desc') }}</text>
<text class="title">空托盘/料箱入库</text>
<text class="desc">空托盘/料箱扫码入库</text>
</view>
</view>
<view class="function-item" @click="navigateTo('/pages/in/inorder')">
</view> -->
<view class="function-item" @click="navigateTo('/pages/in/bindManypk')">
<view class="icon-box blue">
<image src="/static/images/tabbar/dingdandanjuwenjian-2.png" mode="aspectFit" class="icon-image" style="width: 40rpx; height: 40rpx;"></image>
</view>
<view class="function-text">
<text class="title">{{ $t('inbound.inorder.title') }}</text>
<text class="desc">{{ $t('inbound.inorder.desc') }}</text>
<text class="title">平库入库</text>
<text class="desc">平库收货入库</text>
</view>
</view>
<view class="function-item" @click="navigateTo('/pages/in/bindMsg')">
<view class="function-item" @click="navigateTo('/pages/in/bindMany')">
<view class="icon-box blue">
<image src="/static/images/tabbar/list.png" mode="aspectFit" class="icon-image" style="width: 40rpx; height: 40rpx;"></image>
</view>
<view class="function-text">
<text class="title">{{ $t('inbound.bindMsg.title') }}</text>
<text class="desc">{{ $t('inbound.bindMsg.desc') }}</text>
<text class="title">物资入库</text>
<text class="desc">托盘绑定物资</text>
</view>
</view>
<view class="function-item" @click="navigateTo('/pages/in/backIn')">
<!-- <view class="function-item" @click="navigateTo('/pages/in/backIn')">
<view class="icon-box blue">
<image src="/static/images/tabbar/list.png" mode="aspectFit" class="icon-image" style="width: 40rpx; height: 40rpx;"></image>
</view>
<view class="function-text">
<text class="title">{{ $t('inbound.backIn.title') }}</text>
<text class="desc">{{ $t('inbound.backIn.desc') }}</text>
<text class="title">退料入库</text>
<text class="desc">退料入库</text>
</view>
</view>
</view> -->
</view>
</view>
</template>

View File

@@ -5,30 +5,30 @@
<uni-card v-for="(item, index) in orderList" :key="index" class="order-card">
<view class="order-info" @click="handleOrderClick(item)">
<view class="info-row">
<text class="label">{{ $t('inbound.qualityCheck.orderNumber') }}</text>
<text class="label">单据编号:</text>
<text class="value">{{ item.stockinId }}</text>
</view>
<view class="info-row">
<text class="label">{{ $t('inbound.qualityCheck.supplier') }}</text>
<text class="label">供应商:</text>
<text class="value">{{ item.supplierName }}</text>
</view>
<view class="info-row">
<text class="label">{{ $t('inbound.qualityCheck.warehouse') }}</text>
<text class="label">仓库</text>
<text class="value">{{ item.warehouseName }}</text>
</view>
<view class="info-row">
<text class="label">{{ $t('inbound.qualityCheck.createTime') }}</text>
<text class="label">创建时间:</text>
<text class="value">{{ item.createDate }}</text>
</view>
<view class="expand-icon" :class="{'expanded': item.isExpanded}">
<text>{{ item.isExpanded ? $t('inbound.qualityCheck.collapse') : $t('inbound.qualityCheck.expand') }}</text>
<text>{{ item.isExpanded ? '收起' : '展开' }}</text>
</view>
</view>
<!-- 物料详情 -->
<view class="material-detail" v-if="item.isExpanded && item.materials && item.materials.length > 0">
<view class="material-header">
<button class="check-all-button" @click="handleCheckAll(index)">{{ $t('inbound.qualityCheck.checkAll') }}</button>
<button class="check-all-button" @click="handleCheckAll(index)">全部质检</button>
</view>
<view class="material-list">
<view v-for="(material, mIndex) in item.materials" :key="mIndex" class="material-item">
@@ -36,7 +36,7 @@
<!-- <text class="material-code">{{ material.productId }}</text> -->
<text class="material-name">{{ material.extraField.materialDesc }}</text>
<view class="material-quantity">
<text>{{ $t('inbound.qualityCheck.quantity') }}</text>
<text>数量:</text>
<uni-easyinput
v-model="material.quantity"
type="number"
@@ -46,9 +46,9 @@
/>
</view>
<text class="material-status" :class="{'status-checked': material.stockStatus == '1'}">
{{ material.stockStatus == '1' ? $t('inbound.qualityCheck.checked') : $t('inbound.qualityCheck.unchecked') }}
</text>
<button class="check-button" @click="handleQualityCheck(index, mIndex)">{{ $t('inbound.qualityCheck.check') }}</button>
{{ material.stockStatus == '1' ? '已质检' : '待质检' }}
</text>
<button class="check-button" @click="handleQualityCheck(index, mIndex)">质检</button>
</view>
</view>
</view>
@@ -56,7 +56,7 @@
</uni-card>
</view>
<view v-else class="no-data">
<text>{{ $t('inbound.qualityCheck.noOrders') }}</text>
<text>暂无待质检单据</text>
</view>
</view>
</template>
@@ -86,14 +86,14 @@ export default {
}))
} else {
uni.showToast({
title: response.msg || this.$t('inbound.qualityCheck.getOrdersFailed'),
title: response.msg || '获取单据列表失败',
icon: 'none'
})
}
} catch (error) {
console.error('获取单据列表失败:', error)
uni.showToast({
title: this.$t('inbound.qualityCheck.getOrdersFailed'),
title: '获取单据列表失败',
icon: 'none'
})
}
@@ -117,14 +117,14 @@ export default {
this.$set(this.orderList[index], 'materials', response.rows)
} else {
uni.showToast({
title: response.msg || this.$t('inbound.qualityCheck.getMaterialsFailed'),
title: response.msg || '获取物料信息失败',
icon: 'none'
})
}
} catch (error) {
console.error('获取物料信息失败:', error)
uni.showToast({
title: this.$t('inbound.qualityCheck.getMaterialsFailed'),
title: '获取物料信息失败',
icon: 'none'
})
}
@@ -135,7 +135,7 @@ export default {
const order = this.orderList[index]
if (!order.materials || order.materials.length === 0) {
uni.showToast({
title: this.$t('inbound.qualityCheck.noMaterials'),
title: '暂无可质检的物料',
icon: 'none'
})
return
@@ -150,7 +150,7 @@ export default {
if (materials.length === 0) {
uni.showToast({
title: this.$t('inbound.qualityCheck.allChecked'),
title: '所有物料已完成质检',
icon: 'none'
})
return
@@ -164,7 +164,7 @@ export default {
if (response.code === 200) {
uni.showToast({
title: this.$t('inbound.qualityCheck.batchCheckSuccess'),
title: '批量质检完成',
icon: 'success'
})
@@ -179,14 +179,14 @@ export default {
this.fetchOrderList()
} else {
uni.showToast({
title: response.msg || this.$t('inbound.qualityCheck.batchCheckFailed'),
title: response.msg || '批量质检失败',
icon: 'none'
})
}
} catch (error) {
console.error('批量质检失败:', error)
uni.showToast({
title: this.$t('inbound.qualityCheck.batchCheckFailed'),
title: '批量质检失败',
icon: 'none'
})
}
@@ -203,7 +203,7 @@ export default {
})
if (response.code === 200) {
uni.showToast({
title: `${material.extraField.materialDesc} ${this.$t('inbound.qualityCheck.checkSuccess')}`,
title: `${material.extraField.materialDesc} 质检完成`,
icon: 'success'
})
// 重新获取当前单据的物料列表
@@ -216,7 +216,7 @@ export default {
}
} else {
uni.showToast({
title: response.msg || this.$t('inbound.qualityCheck.checkFailed'),
title: response.msg || '质检操作失败',
icon: 'none'
})
}
@@ -230,7 +230,7 @@ export default {
// 验证输入值
if (isNaN(newQuantity) || newQuantity < 0) {
uni.showToast({
title: this.$t('inbound.qualityCheck.invalidQuantity'),
title: '请输入有效的数量',
icon: 'none'
})
material.quantity = material.quantity

View File

@@ -2,19 +2,19 @@
<view class="container">
<!-- 顶部信息卡片 -->
<view class="info-card">
<text class="welcome">{{ $t('home.greeting') }}{{ userName }}</text>
<text class="date">{{ $t('home.today') }}{{ currentDate }}</text>
<text class="welcome">你好,{{ userName }}</text>
<text class="date">今天是{{ currentDate }}</text>
<view class="stats-row">
<!-- <view class="stats-row"> -->
<!-- <view class="stat-item">
<text class="stat-label">{{ $t('home.taskCompletionRate') }}</text>
<text class="stat-label">任务完成率</text>
<text class="stat-value">98%</text>
</view> -->
<view class="stat-item" >
<text class="stat-label">{{ $t('home.pendingTasks') }}</text>
<!-- <view class="stat-item" >
<text class="stat-label">待处理任务</text>
<text class="stat-value">{{ pendingTaskCount }}</text>
</view>
</view>
</view> -->
</view>
<!-- 今日数据统计 -->
@@ -42,35 +42,45 @@
<image src="/static/images/tabbar/caigouruku.png" mode="aspectFit" class="icon-image"></image>
</view>
<view class="function-text">
<text class="title">{{ $t('home.inbound.title') }}</text>
<text class="desc">{{ $t('home.inbound.desc') }}</text>
<text class="title">入库管理</text>
<text class="desc">收货、上架、验收</text>
</view>
</view>
<view class="function-item" @click="navigateTo('/pages/out/menu')">
<view class="function-item" @click="navigateTo('/pages/out/ckMakeSureByTray')">
<view class="icon-box green">
<image src="/static/images/tabbar/chukudan.png" mode="aspectFit" class="icon-image"></image>
</view>
<view class="function-text">
<text class="title">{{ $t('home.outbound.title') }}</text>
<text class="desc">{{ $t('home.outbound.desc') }}</text>
<text class="title">出库管理</text>
<text class="desc">拣货、打包、发货</text>
</view>
</view>
<view class="function-item" @click="navigateTo('/pages/charts/spaceAnalysis')">
<view class="function-item" @click="navigateTo('/pages/ktp/menu')">
<view class="icon-box orange">
<image src="/static/images/tabbar/tray121.png" mode="aspectFit" class="icon-image"></image>
</view>
<view class="function-text">
<text class="title">托盘管理</text>
<text class="desc">空托盘出入库</text>
</view>
</view>
<!-- <view class="function-item" @click="navigateTo('/pages/charts/spaceAnalysis')">
<view class="icon-box orange">
<image src="/static/images/tabbar/warehouse.png" mode="aspectFit" class="icon-image"></image>
</view>
<view class="function-text">
<text class="title">{{ $t('home.inventory.title') }}</text>
<text class="desc">{{ $t('home.inventory.desc') }}</text>
<text class="title">库存分析</text>
<text class="desc">查询、移库、调整</text>
</view>
</view>
<view class="function-item" @click="navigateTo('/pages/pandian/menu')">
</view> -->
<view class="function-item" @click="navigateTo('/pages/pandian/confirm')">
<view class="icon-box purple">
<image src="/static/images/tabbar/pandian.png" mode="aspectFit" class="icon-image"></image>
</view>
<view class="function-text">
<text class="title">{{ $t('home.stocktaking.title') }}</text>
<text class="desc">{{ $t('home.stocktaking.desc') }}</text>
<text class="title">盘点管理</text>
<text class="desc">周期盘点、抽查</text>
</view>
</view>
</view>
@@ -78,8 +88,7 @@
</template>
<script>
import { getPrepareTask } from '@/api/search/job'
import { getPrepareTask } from '@/api/search/job.js'
export default {
data() {
return {
@@ -95,13 +104,8 @@ export default {
const day = date.getDate();
const weekDayIndex = date.getDay();
if (this.$i18n.locale === 'en-US') {
const weekDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
return `${year}-${month}-${day} ${weekDays[weekDayIndex]}`;
} else {
const weekDays = ['日', '一', '二', '三', '四', '五', '六'];
return `${year}年${month}月${day}日 星期${weekDays[weekDayIndex]}`;
}
const weekDays = ['日', '一', '二', '三', '四', '五', '六'];
return `${year}年${month}月${day}日 星期${weekDays[weekDayIndex]}`;
}
},
@@ -109,25 +113,25 @@ export default {
// 确保用户信息已加载
this.userName = this.$store.getters.name
// 获取待处理任务数量
this.getPendingTaskCount()
// this.getPendingTaskCount()
},
methods: {
navigateTo(url) {
uni.navigateTo({
url: url
})
},
async getPendingTaskCount() {
// 调用API获取待处理任务数量
const response=await getPrepareTask({inOut:''})
if(response.code=== 200){
this.pendingTaskCount=response.data.length
}else{
this.pendingTaskCount=0
}
}
// async getPendingTaskCount() {
// // 调用API获取待处理任务数量
// const response=await getPrepareTask({inOut:''})
// if(response.code=== 200){
// this.pendingTaskCount=response.data.length
// }else{
// this.pendingTaskCount=0
// }
// }
}
}
</script>

View File

@@ -3,12 +3,12 @@
<view class="logo-content align-center justify-center flex">
<image style="width: 100rpx;height: 100rpx;" :src="globalConfig.appInfo.logo" mode="widthFix">
</image>
<text class="title">{{ $t('login.appTitle') }}</text>
<text class="title">WMS手持终端</text>
</view>
<view class="login-form-content">
<view class="input-item flex align-center">
<view class="iconfont icon-user icon"></view>
<input v-model="loginForm.username" class="input" type="text" :placeholder="$t('login.usernamePlaceholder')" maxlength="30" @focus="showAccountList = true" @input="handleUsernameInput" />
<input v-model="loginForm.username" class="input" type="text" placeholder="请输入账号" maxlength="30" @focus="showAccountList = true" @input="handleUsernameInput" />
<view class="history-accounts" v-if="showAccountList && historyAccounts.length > 0">
<view v-for="(account, index) in historyAccounts" :key="index" class="account-item" @click="selectAccount(account)">
{{ account }}
@@ -17,15 +17,15 @@
</view>
<view class="input-item flex align-center">
<view class="iconfont icon-password icon"></view>
<input v-model="loginForm.password" type="password" class="input" :placeholder="$t('login.passwordPlaceholder')" maxlength="20" />
<input v-model="loginForm.password" type="password" class="input" placeholder="请输入密码" maxlength="20" />
</view>
<view class="remember-account flex align-center">
<checkbox :checked="rememberAccount" @click="toggleRememberAccount" style="transform:scale(0.7)" />
<text class="text-grey1" >{{ $t('login.rememberAccount') }}</text>
<text class="text-grey1" >记住账号</text>
</view>
<view class="action-btn">
<button @click="handleLogin" class="login-btn cu-btn block bg-blue lg round">{{ $t('login.login') }}</button>
<button @click="goToSettings" class="settings-btn cu-btn block lg round">{{ $t('login.serverSettings') }}</button>
<button @click="handleLogin" class="login-btn cu-btn block bg-blue lg round">登录</button>
<button @click="goToSettings" class="settings-btn cu-btn block lg round">服务器设置</button>
</view>
<!-- <view class="reg text-center" v-if="register">
<text class="text-grey1">没有账号?</text>
@@ -38,8 +38,8 @@
</view> -->
</view>
<view class="copyright-section text-center">
<text class="version">{{ $t('login.version') }}</text>
<text class="copyright">{{ $t('login.copyright') }}</text>
<text class="version">Version 1.0.0</text>
<text class="copyright">© 2025 WMS仓储管理系统</text>
</view>
</view>
</template>
@@ -95,11 +95,11 @@
if (this.loginForm.username === "") {
this.$modal.msgError(this.$t('login.usernameRequired'))
this.$modal.msgError('请输入您的账号')
} else if (this.loginForm.password === "") {
this.$modal.msgError(this.$t('login.passwordRequired'))
this.$modal.msgError('请输入您的密码')
} else {
this.$modal.loading(this.$t('login.loggingIn'))
this.$modal.loading('登录中,请耐心等待...')
this.pwdLogin()
}
},

View File

@@ -10,16 +10,16 @@
<image v-if="avatar" @click="handleToAvatar" :src="avatar" class="cu-avatar xl round" mode="widthFix">
</image>
<view v-if="!name" @click="handleToLogin" class="login-tip">
{{ $t('mine.clickToLogin') }}
点击登录
</view>
<view v-if="name" @click="handleToInfo" class="user-info">
<view class="u_title">
{{ $t('mine.username') }}:{{ name }}
用户名:{{ name }}
</view>
</view>
</view>
<view @click="handleToInfo" class="flex align-center info-link">
<text>{{ $t('mine.personalInfo') }}</text>
<text>个人信息</text>
<view class="iconfont icon-right"></view>
</view>
</view>
@@ -67,7 +67,7 @@
<view class="list-cell list-cell-arrow" @click="handleToSetting">
<view class="menu-item-box">
<view class="iconfont icon-setting menu-icon"></view>
<view>{{ $t('mine.appSettings') }}</view>
<view>应用设置</view>
</view>
</view>
</view>
@@ -110,7 +110,7 @@
this.$tab.navigateTo('/pages/mine/avatar/index')
},
handleLogout() {
this.$modal.confirm(this.$t('mine.logoutConfirm')).then(() => {
this.$modal.confirm('确定注销并退出系统吗?').then(() => {
this.$store.dispatch('LogOut').then(() => {
this.$tab.reLaunch('/pages/index')
})
@@ -126,7 +126,7 @@
this.$modal.showToast('QQ:①133713780(Full)、②146013835(Full)、③189091635')
},
handleBuilding() {
this.$modal.showToast(this.$t('mine.moduleBuilding'))
this.$modal.showToast('模块建设中~')
}
}
}

View File

@@ -22,14 +22,14 @@
<view class="list-cell list-cell-arrow" @click="handleToServerConfig">
<view class="menu-item-box">
<view class="iconfont icon-edit menu-icon"></view>
<view> {{ $t('mine.setting.updateServer') }}</view>
<view>修改服务器配置</view>
</view>
</view>
</view>
<view class="cu-list menu">
<view class="cu-item item-box">
<view class="content text-center" @click="handleLogout">
<text class="text-black">{{ $t('mine.setting.logout') }}</text>
<text class="text-black">退出登录</text>
</view>
</view>
</view>
@@ -126,7 +126,7 @@
this.$tab.navigateTo('/pages/setting')
},
handleLogout() {
this.$modal.confirm(this.$t('mine.logoutConfirm')).then(() => {
this.$modal.confirm('确定注销并退出系统吗?').then(() => {
this.$store.dispatch('LogOut').then(() => {
this.$tab.reLaunch('/pages/login')
})

View File

@@ -1,7 +1,7 @@
<template>
<view class="container">
<view class="header">
<text class="title">{{ $t('outbound.bindShelf.materialInfo') }}</text>
<text class="title">物料信息</text>
</view>
<view class="warehouse-select">
@@ -9,7 +9,7 @@
v-model="selectedWarehouse"
:localdata="warehouseList"
:clear="false"
:placeholder="$t('outbound.bindShelf.selectWarehouse')"
placeholder="请选择仓库"
@change="handleWarehouseChange"
/>
</view>
@@ -19,13 +19,13 @@
v-model="selectedExit"
:localdata="exitList"
:clear="false"
:placeholder="$t('outbound.bindShelf.selectExit')"
placeholder="请选择出口"
@change="handleExitChange"
/>
</view>
<view class="loading-container" v-if="loading">
<text class="loading-text">{{ $t('outbound.bindShelf.loading') }}</text>
<text class="loading-text">加载中...</text>
</view>
<view class="materials-list" v-else-if="materialList.length > 0">
@@ -36,12 +36,12 @@
</view>
<view class="material-info">
<view class="material-title">{{ item.productName }}</view>
<view class="material-code">{{ $t('outbound.bindShelf.materialInfo') }}: {{ item.productId }}</view>
<view class="material-code">物料信息: {{ item.productId }}</view>
</view>
</view>
<view class="material-content">
<view class="quantity-control">
<text class="quantity-label">{{ $t('outbound.bindShelf.bindQuantity') }}</text>
<text class="quantity-label">绑定数量</text>
<input
type="number"
v-model="item.bindQuantity"
@@ -54,18 +54,18 @@
</view>
<view v-else class="no-data">
<text>{{ $t('outbound.bindShelf.noMaterialInfo') }}</text>
<text>暂无物料信息</text>
</view>
<view class="button-group">
<button class="bind-button" @click="openBindShelfPopup">{{ $t('outbound.bindShelf.bindShelf') }}</button>
<button class="bind-button" @click="openBindShelfPopup">绑定料架</button>
</view>
<!-- 绑定料架弹窗 -->
<uni-popup ref="bindShelfPopup" type="center">
<view class="popup-content">
<view class="popup-header">
<text class="popup-title">{{ $t('outbound.bindShelf.bindShelfTitle') }}</text>
<text class="popup-title">绑定料架</text>
<text class="popup-close" @click="closeBindShelfPopup">×</text>
</view>
@@ -74,7 +74,7 @@
<input
type="text"
v-model="shelfCode"
:placeholder="$t('outbound.bindShelf.scanShelfCode')"
placeholder="请扫描料架条码"
class="scan-input"
@input="fetchShelfInfo"
@clear="handleClear"
@@ -86,14 +86,13 @@
<view class="shelf-info" v-if="shelfInfo.length > 0">
<view v-for="(item, index) in shelfInfo" :key="index" class="shelf-item">
<text class="shelf-name">{{ item.productName || $t('outbound.bindShelf.unknownMaterial') }}</text>
<text class="shelf-code">{{ item.productId || $t('outbound.bindShelf.noCode') }}</text>
<text class="shelf-quantity">{{ item.quantity || $t('outbound.bindShelf.noQuantity') }}</text>
<text class="shelf-name">{{ item.productName || '未知物料' }}</text>
<text class="shelf-code">{{ item.productId || '无编码' }}</text>
</view>
</view>
<view class="popup-footer">
<button class="submit-button" @click="submitBindShelf">{{ $t('outbound.bindShelf.submit') }}</button>
<button class="submit-button" @click="submitBindShelf">提交</button>
</view>
</view>
</uni-popup>
@@ -245,7 +244,7 @@ export default {
this.materialList = (response.rows || []).map(item => ({
...item,
selected: false,
bindQuantity: item.quantity
bindQuantity: item.quantit
}))
} else {
uni.showToast({
@@ -257,7 +256,7 @@ export default {
} catch (error) {
console.error('获取物料信息失败:', error)
uni.showToast({
title: this.$t('outbound.bindShelf.noMaterialInfo'),
title: '暂无物料信息',
icon: 'none'
})
this.materialList = []
@@ -300,19 +299,6 @@ export default {
return
}
// 检查绑定数量是否为0或空
const invalidQuantityItem = selectedItems.find(item => {
return !item.bindQuantity || item.bindQuantity === 0
})
if (invalidQuantityItem) {
uni.showToast({
title: '绑定数量不能为0或空',
icon: 'none'
})
return
}
this.$refs.bindShelfPopup.open()
},
// 关闭绑定料架弹窗
@@ -374,7 +360,7 @@ export default {
async submitBindShelf() {
if (!this.shelfCode) {
uni.showToast({
title: this.$t('outbound.bindShelf.pleaseScanShelfCode'),
title: '请先扫描料架条码',
icon: 'none'
})
return
@@ -383,20 +369,7 @@ export default {
const selectedItems = this.materialList.filter(item => item.selected)
if (selectedItems.length === 0) {
uni.showToast({
title: this.$t('outbound.bindShelf.pleaseSelectMaterial'),
icon: 'none'
})
return
}
// 检查绑定数量是否为0或空
const invalidQuantityItem = selectedItems.find(item => {
return !item.bindQuantity || item.bindQuantity === 0
})
if (invalidQuantityItem) {
uni.showToast({
title: '绑定数量不能为0或空',
title: '请先选择需要绑定的物料',
icon: 'none'
})
return

View File

@@ -1,9 +1,22 @@
<template>
<view class="container">
<!-- 出口选择框 -->
<view class="input-group">
<view class="input-label">出口:</view>
<uni-data-select
v-model="selectedExit"
:localdata="exitOptions"
placeholder="请选择出口"
class="select-input"
/>
</view>
<!-- 托盘条码输入框 -->
<view class="input-group">
<view class="input-label">物料条码:</view>
<uni-easyinput
v-model="trayCode"
placeholder="请输入或扫码输入托盘条码"
placeholder="请扫码输入物料条码"
:clearable="true"
@input="handleInput"
@clear="handleClear"
@@ -18,37 +31,21 @@
<view class="table-container" v-if="materialList.length > 0">
<view class="table">
<view class="table-header">
<view class="table-cell checkbox-cell">
<checkbox :checked="isAllSelected" @click="toggleSelectAll" />
</view>
<view class="table-cell">物资编码</view>
<view class="table-cell">物料名称</view>
<view class="table-cell">出库数量</view>
<view class="table-cell">绑定数量</view>
</view>
<view v-for="(item, index) in materialList" :key="index" class="table-row">
<view class="table-cell checkbox-cell">
<checkbox :checked="item.selected" @click="toggleSelect(index)" />
</view>
<view class="table-cell">{{ item.productId }}</view>
<view class="table-cell">{{ item.extraField.materialDesc }}</view>
<view class="table-cell">{{ item.outQuantity }}</view>
<view class="table-cell">
<input type="number" v-model.number="item.bindQuantity" @input="handleBindQuantityInput($event, index)" class="quantity-input" />
</view>
<view class="table-cell">{{ item.productName }}</view>
</view>
</view>
<view class="rack-code-input" v-if="materialList.length > 0 && (!materialList[0].spare2 || materialList[0].spare2 !== '2')">
<uni-easyinput
v-model="rackCode"
placeholder="请输入料架码"
:clearable="true"
>
</uni-easyinput>
</view>
</view>
<view class="button-group" v-if="materialList.length > 0">
<view class="button-group">
<button class="confirm-button" @click="handleConfirm">确认出库</button>
</view>
</view>
@@ -76,13 +73,26 @@
return {
trayCode: '',
materialList: [],
isAllSelected: false,
rackCode: ''
selectedExit: '',
// 出口选项
exitOptions: [
{ value: 'L1021', text: 'L1021' },
{ value: 'L1022', text: 'L1022' },
{ value: 'L2002', text: 'L2002' },
{ value: 'L2008', text: 'L2008' }
]
}
},
methods: {
// 处理输入事件
handleInput(value) {
if(!this.selectedExit){
uni.showToast({
title: '请选择出口',
icon: 'none'
})
return
}
if (value) {
this.fetchTrayInfo(value)
}
@@ -103,12 +113,11 @@
// 获取托盘信息
async fetchTrayInfo(trayCode) {
try {
const response = await getTaskDetail({trayCode:trayCode,status:'3'})
const response = await getTaskDetail({trayCode:trayCode,exitId:this.selectedExit})
// 为每个物料添加选择状态和绑定数量
this.materialList = response.data.map(item => ({
...item,
selected: false,
bindQuantity: item.pickQuantityReal
...item
}))
} catch (error) {
uni.showToast({
@@ -119,84 +128,43 @@
},
// 确认出库
async handleConfirm() {
const selectedItems = this.materialList.filter(item => item.selected)
if (this.materialList[0].spare2 === '2') {
try {
await ckMakeSure({
trayCode: this.trayCode,
containerCode: 'MOCK_CONTAINER',
mydoJobDetailList: [{
jobDetailId: 'MOCK_JOB_DETAIL_ID',
pickQuantity: 1
}]
})
uni.showToast({
title: '出库确认成功',
icon: 'success'
})
// 清空数据
this.trayCode = ''
this.rackCode = ''
this.materialList = []
return
} catch (error) {
uni.showToast({
title: '出库确认失败',
icon: 'none'
})
return
}
}
if (selectedItems.length === 0) {
// 验证出口选择
if (!this.selectedExit) {
uni.showToast({
title: '请选择要出库的物料',
title: '请选择出口',
icon: 'none'
})
return
}
if (!this.rackCode) {
if (!this.trayCode) {
uni.showToast({
title: '请输入料架码',
title: '请输入托盘条码',
icon: 'none'
})
return
}
for (const item of selectedItems) {
if (item.bindQuantity <= 0 || item.bindQuantity > item.outQuantity) {
uni.showToast({
title: '绑定数量必须大于0且不能超过出库数量',
icon: 'none'
})
return
}
}
try {
await ckMakeSure({
const response=await ckMakeSure({
trayCode: this.trayCode,
containerCode: this.rackCode,
mydoJobDetailList: selectedItems.map(item => ({
jobDetailId: item.jobDetailId,
pickQuantity: item.bindQuantity
}))
exitId: this.selectedExit
})
uni.showToast({
title: '出库确认成功',
if (response.code==200) {
uni.showToast({
title: '出库成功',
icon: 'success'
})
// 清空数据
this.trayCode = ''
this.rackCode = ''
this.materialList = []
} catch (error) {
uni.showToast({
title: '出库确认失败',
// 清空数据
this.trayCode = ''
this.materialList = []
this.selectedExit = ''
}else{
uni.showToast({
title: response.msg,
icon: 'none'
})
}
}
},
// 切换全选状态
toggleSelectAll() {
@@ -235,12 +203,49 @@
margin-bottom: 30rpx;
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.08);
.input-label {
display: block;
font-size: 28rpx;
color: #606266;
margin-bottom: 16rpx;
font-weight: 500;
}
.select-input {
width: 100%;
}
:deep(.uni-easyinput__content) {
background-color: #f8f8f8;
border-radius: 8rpx;
height: 80rpx;
padding: 0 24rpx;
}
// uni-data-select 样式
:deep(.uni-select) {
.uni-select__input-box {
background-color: #f8f8f8;
border-radius: 8rpx;
border: 2rpx solid #dcdfe6;
transition: all 0.3s ease;
height: 80rpx;
.uni-select__input-text {
font-size: 28rpx;
color: #606266;
}
.uni-select__input-placeholder {
font-size: 28rpx;
color: #c0c4cc;
}
}
.uni-select__input-box:hover {
border-color: #c0c4cc;
}
}
}
.scan-icon {

View File

@@ -3,7 +3,7 @@
<view class="input-group">
<uni-easyinput
v-model="trayCode"
:placeholder="$t('outbound.ckMakeSureByTray.trayCodePlaceholder')"
placeholder="请输入或扫码输入托盘条码"
:clearable="true"
@input="handleInput"
@clear="handleClear"
@@ -16,26 +16,26 @@
</view>
<view class="loading-container" v-if="loading">
<uni-load-more status="loading" :content-text="{contentdown: $t('outbound.ckMakeSureByTray.loading'),contentrefresh: $t('outbound.ckMakeSureByTray.loading'),contentnomore: $t('outbound.ckMakeSureByTray.noMoreData')}"></uni-load-more>
<uni-load-more status="loading" :content-text="{contentdown: '加载中...',contentrefresh: '加载中...',contentnomore: '没有更多数据'}"></uni-load-more>
</view>
<view class="materials-list" v-if="materialList.length > 0">
<view v-for="(item, index) in materialList" :key="index" class="material-card">
<view class="material-header">
<text class="material-title">{{ item.extraField.materialDesc || item.productId }}</text>
<text class="material-code">{{ item.productId }} | {{ $t('outbound.ckMakeSureByTray.quantity') }}: {{ item.outQuantity }}{{ $t('outbound.ckMakeSureByTray.unit') }}</text>
<text class="material-title">{{ item.productName }}</text>
<text class="material-code">{{ item.productId }} | 数量: {{ item.outQuantity }}件</text>
</view>
<!-- <view class="material-content">
<view class="material-info">
<text class="info-label">{{ $t('outbound.ckMakeSureByTray.batchNo') }}:</text>
<text class="info-label">批次号:</text>
<text class="info-value">{{ item.batchNo || '无' }}</text>
</view>
<view class="material-info">
<text class="info-label">{{ $t('outbound.ckMakeSureByTray.spec') }}:</text>
<text class="info-label">规格:</text>
<text class="info-value">{{ item.extraField.spec || '无' }}</text>
</view>
<view class="material-info">
<text class="info-label">{{ $t('outbound.ckMakeSureByTray.unit') }}:</text>
<text class="info-label">单位:</text>
<text class="info-value">{{ item.extraField.unit || '件' }}</text>
</view>
</view> -->
@@ -43,7 +43,7 @@
</view>
<view class="button-group" v-if="materialList.length > 0">
<button class="submit-button" @click="handleSubmit">{{ $t('outbound.ckMakeSureByTray.confirmOutbound') }}</button>
<button class="submit-button" @click="handleSubmit">确认出库</button>
</view>
</view>
</template>
@@ -101,13 +101,13 @@
this.materialList = response.data
} else {
uni.showToast({
title: this.$t('outbound.ckMakeSureByTray.trayInfoNotFound'),
title: '未找到托盘信息',
icon: 'none'
})
}
} catch (error) {
uni.showToast({
title: this.$t('outbound.ckMakeSureByTray.getTrayInfoFailed'),
title: '获取托盘信息失败',
icon: 'none'
})
} finally {
@@ -118,7 +118,7 @@
async handleSubmit() {
if (!this.trayCode) {
uni.showToast({
title: this.$t('outbound.ckMakeSureByTray.enterTrayCode'),
title: '请输入托盘条码',
icon: 'none'
})
return
@@ -126,7 +126,7 @@
if (this.materialList.length === 0) {
uni.showToast({
title: this.$t('outbound.ckMakeSureByTray.noOutboundMaterial'),
title: '没有可出库的物料',
icon: 'none'
})
return
@@ -139,7 +139,7 @@
})
if (response.code==200) {
uni.showToast({
title: this.$t('outbound.ckMakeSureByTray.outboundSuccess'),
title: '出库成功',
icon: 'success'
})
// 清空数据
@@ -155,7 +155,7 @@
} catch (error) {
uni.showToast({
title: this.$t('outbound.ckMakeSureByTray.outboundFailed'),
title: '出库失败',
icon: 'none'
})
}

View File

@@ -3,7 +3,7 @@
<view class="input-group">
<uni-easyinput
v-model="trayCode"
:placeholder="$t('outbound.exception.trayCodePlaceholder')"
placeholder="请输入或扫码输入托盘条码"
:clearable="true"
@input="handleInput"
@clear="handleClear"
@@ -19,27 +19,27 @@
<uni-card v-for="(item, index) in materialList" :key="index" class="material-card">
<view class="card-content">
<view class="info-row">
<text class="label">{{ $t('outbound.exception.materialCode') }}:</text>
<text class="label">物资编码:</text>
<text class="value">{{ item.productId }}</text>
</view>
<view class="info-row">
<text class="label">{{ $t('outbound.exception.materialName') }}:</text>
<text class="label">物料名称:</text>
<text class="value">{{ item.extraField.materialDesc }}</text>
</view>
<view class="info-row">
<text class="label">{{ $t('outbound.exception.outQuantity') }}:</text>
<text class="label">出库数量:</text>
<text class="value">{{ item.outQuantity }}</text>
</view>
<view class="info-row">
<text class="label">{{ $t('outbound.exception.pickQuantity') }}:</text>
<uni-easyinput v-model="item.pickQuantity" type="number" :placeholder="$t('outbound.exception.enterPickQuantity')" style="flex: 1;" @input="validatePickQuantity(item)"></uni-easyinput>
</view>
<text class="label">拣选数量:</text>
<text class="value">{{ item.pickQuantity }}</text>
</view>
</view>
</uni-card>
</view>
<view class="button-group" v-if="materialList.length > 0">
<button class="submit-button" @click="handleSubmit">{{ $t('outbound.exception.submit') }}</button>
<button class="submit-button" @click="handleSubmit">提交</button>
</view>
</view>
</template>
@@ -68,25 +68,19 @@ export default {
try {
const response = await getTaskDetail({trayCode: value,inOut:'2'})
if (response.code === 200) {
// 设置materialList并初始化pickQuantity为outQuantity的值
this.materialList = (response.data || []).map(item => {
return {
...item,
pickQuantity: item.outQuantity
}
})
this.materialList = response.data || []
} else {
uni.showToast({
title: response.msg || this.$t('common.noData'),
title: response.msg || '暂无数据',
icon: 'none'
})
}
} catch (error) {
console.error(this.$t('outbound.exception.getTrayInfoFailed'), error)
uni.showToast({
title: this.$t('outbound.exception.getTrayInfoFailed'),
icon: 'none'
})
console.error('获取托盘信息失败', error)
uni.showToast({
title: '获取托盘信息失败',
icon: 'none'
})
}
}
},
@@ -94,37 +88,6 @@ export default {
handleClear() {
this.materialList = []
},
// 验证拣货数量不超过出库数量且不为负数
validatePickQuantity(item) {
// 转换为数字
let pickQty = Number(item.pickQuantity)
let outQty = Number(item.outQuantity)
// 检查是否为有效数字
if (isNaN(pickQty) || pickQty === '') {
item.pickQuantity = outQty
return
}
// 检查是否为负数
if (pickQty < 0) {
uni.showToast({
title: this.$t('outbound.exception.pickQuantityNegative'),
icon: 'none'
})
item.pickQuantity = 0
return
}
// 检查是否超过出库数量
if (pickQty > outQty) {
uni.showToast({
title: this.$t('outbound.exception.pickQuantityExceed'),
icon: 'none'
})
item.pickQuantity = outQty
}
},
// 处理扫码事件
handleScan() {
uni.scanCode({
@@ -138,71 +101,19 @@ export default {
async handleSubmit() {
if (!this.materialList.length) {
uni.showToast({
title: this.$t('outbound.exception.scanTrayFirst'),
title: '请先扫描托盘条码',
icon: 'none'
})
return
}
// 提交前再次验证所有物料的pickQuantity
let isValid = true
this.materialList.forEach(item => {
// 转换为数字
let pickQty = Number(item.pickQuantity)
let outQty = Number(item.outQuantity)
// 检查是否为有效数字
if (isNaN(pickQty) || pickQty === '') {
isValid = false
uni.showToast({
title: this.$t('outbound.exception.invalidPickQuantity'),
icon: 'none'
})
item.pickQuantity = outQty
return
}
// 检查是否为负数
if (pickQty < 0) {
isValid = false
uni.showToast({
title: this.$t('outbound.exception.pickQuantityNegative'),
icon: 'none'
})
item.pickQuantity = 0
return
}
// 检查是否超过出库数量
if (pickQty > outQty) {
isValid = false
uni.showToast({
title: this.$t('outbound.exception.pickQuantityExceed'),
icon: 'none'
})
item.pickQuantity = outQty
}
})
if (!isValid) return
// 准备提交数据,包含所有物料编码和pickQuantity
const materialDetails = this.materialList.map(item => {
return {
jobDetailId: item.jobDetailId,
productId: item.productId,
pickQuantity: item.pickQuantity
}
})
try {
const response = await submitError({
trayCode: this.trayCode,
materialDetails: materialDetails
trayCode: this.trayCode
})
if (response.code === 200) {
uni.showToast({
title: this.$t('outbound.exception.submitSuccess'),
title: '提交成功',
icon: 'success'
})
// 清空数据
@@ -210,16 +121,16 @@ export default {
this.materialList = []
} else {
uni.showToast({
title: response.msg || this.$t('outbound.exception.submitFailed'),
title: response.msg || '提交失败',
icon: 'none'
})
}
} catch (error) {
console.error(this.$t('outbound.exception.submitFailed'), error)
uni.showToast({
title: this.$t('outbound.exception.submitFailed'),
icon: 'none'
})
console.error('提交失败', error)
uni.showToast({
title: '提交失败',
icon: 'none'
})
}
}
}

View File

@@ -2,43 +2,28 @@
<view class="container">
<view class="form-card">
<uni-forms>
<uni-forms-item :label="$t('outbound.emptyPalletBox.emptyPallet.warehouse')">
<uni-forms-item label="仓库">
<uni-data-select
v-model="formData.warehouseId"
:localdata="warehouseList"
:clear="false"
:placeholder="$t('outbound.emptyPalletBox.emptyPallet.warehousePlaceholder')"
placeholder="请选择仓库"
@change="handleWarehouseChange"
/>
</uni-forms-item>
<view class="cargo-space-container" v-if="currentWarehouseType == '1'">
<uni-forms-item :label="$t('outbound.emptyPalletBox.emptyPallet.cargoSpace')">
<view class="cargo-input-group">
<uni-easyinput
v-model="formData.cargoSpaceName"
:placeholder="$t('outbound.emptyPalletBox.emptyPallet.cargoSpacePlaceholder')"
:clearable="true"
@input="handleCargoSpaceInput"
/>
<button class="recommend-btn" @click="handleRecommendCargoSpace">{{ $t('outbound.emptyPalletBox.emptyPallet.recommendCargoSpace') }}</button>
</view>
</uni-forms-item>
</view>
<view v-if="currentWarehouseType == '1' && cargoSpaceHeight" class="cargo-space-info">
<text class="cargo-space-height">{{ $t('outbound.emptyPalletBox.emptyPallet.cargoSpaceHeight') }}{{ cargoSpaceHeight }}{{ $t('outbound.emptyPalletBox.emptyPallet.meter') }}</text>
</view>
<view class="cargo-space-container" v-if="currentWarehouseType == '2'">
<uni-forms-item :label="$t('outbound.emptyPalletBox.emptyPallet.exit')">
<view class="cargo-space-container">
<uni-forms-item label="出口">
<uni-data-select
v-model="formData.exitId"
:localdata="exitList"
:clear="false"
:placeholder="$t('outbound.emptyPalletBox.emptyPallet.exitPlaceholder')"
placeholder="请选择出口"
/>
</uni-forms-item>
</view>
<button class="submit-button" hover-class="button-hover" @click="handleSubmit">{{ $t('outbound.emptyPalletBox.emptyPallet.submit') }}</button>
<button class="submit-button" hover-class="button-hover" @click="handleSubmit">空托盘出库</button>
</uni-forms>
</view>
</view>
@@ -53,9 +38,7 @@ export default {
return {
formData: {
warehouseId: '',
cargoSpaceId: '',
exitId: '',
cargoSpaceName: ''
exitId: ''
},
warehouseList: [],
cargoSpaceList: [],
@@ -73,17 +56,17 @@ export default {
const res = await getBasWarehouList({
pageNum:1,
pageSize:100,
typeData:['1','2']
// typeData:['1','2']
})
if (res.code === 200) {
this.warehouseList = res.rows.map(item => ({
value: item.warehouseId,
text: item.warehouseName,
type: item.warehouseType
text: item.warehouseName
// type: item.warehouseType
}))
}
} catch (error) {
console.error(this.$t('outbound.emptyPalletBox.emptyPallet.getWarehouseListFailed'), error)
console.error('获取仓库列表失败', error)
}
},
async handleWarehouseChange(warehouseId) {
@@ -92,97 +75,27 @@ export default {
this.currentWarehouseType = selectedWarehouse ? selectedWarehouse.type : ''
this.formData.exitId = ''
if (this.currentWarehouseType == '2') {
// if (this.currentWarehouseType == '2') {
// 模拟出口数据,实际项目中应该从后端获取
this.exitList = [
{ value: '1', text: this.$t('outbound.emptyPalletBox.emptyPallet.exit') + '1' },
{ value: '2', text: this.$t('outbound.emptyPalletBox.emptyPallet.exit') + '2' },
{ value: '3', text: this.$t('outbound.emptyPalletBox.emptyPallet.exit') + '3' }
{ value: '1', text: '出口方向1' },
{ value: '2', text: '出口方向2' }
]
}
},
handleCargoSpaceSelect(item) {
this.formData.cargoSpaceId = item.value
},
async handleRecommendCargoSpace() {
if (!this.formData.warehouseId) {
uni.showToast({
title: this.$t('outbound.emptyPalletBox.emptyPallet.selectWarehouse'),
icon: 'none'
})
return
}
// try {
const response = await getFullCargoSpaceListByWarehouse({ warehouseId: this.formData.warehouseId })
if (response.code === 200 && response.data.length > 0) {
// 获取第一个推荐货位
this.formData.cargoSpaceId = response.data[0].cargoSpaceId
this.formData.cargoSpaceName = response.data[0].cargoSpaceName
// 手动触发handleCargoSpaceInput方法获取货位高度信息
await this.handleCargoSpaceInput(response.data[0].cargoSpaceName)
} else {
uni.showToast({
title: this.$t('outbound.emptyPalletBox.emptyPallet.noAvailableCargoSpace'),
icon: 'none'
})
}
// } catch (error) {
// console.error('获取推荐货位失败:', error)
// uni.showToast({
// title: '获取推荐货位失败',
// icon: 'none'
// })
// }
},
// 处理货位选择
async handleCargoSpaceInput(value) {
if (value) {
try {
const response = await getCargoSpaceList({ cargoSpaceName: value, warehouseId: this.formData.warehouseId })
if (response.code === 200 && response.rows.length > 0) {
this.formData.cargoSpaceId = response.rows[0].cargoSpaceId
this.cargoSpaceHeight = response.rows[0].cargoHight
console.log(this.formData.cargoSpaceId)
} else {
uni.showToast({
title: this.$t('outbound.emptyPalletBox.emptyPallet.getCargoSpaceInfoFailed'),
icon: 'none'
})
this.formData.cargoSpaceId = ''
this.cargoSpaceHeight = null
}
} catch (error) {
uni.showToast({
title: this.$t('outbound.emptyPalletBox.emptyPallet.getCargoSpaceInfoFailed'),
icon: 'none'
})
this.formData.cargoSpaceId = ''
this.cargoSpaceHeight = null
}
} else {
this.formData.cargoSpaceId = ''
this.cargoSpaceHeight = null
}
},
async handleSubmit() {
if (!this.formData.warehouseId) {
uni.showToast({
title: this.$t('outbound.emptyPalletBox.emptyPallet.selectWarehouse'),
title: '请选择仓库',
icon: 'none'
})
return
}
if (this.currentWarehouseType == '1' && !this.formData.cargoSpaceId) {
if ( !this.formData.exitId) {
uni.showToast({
title: this.$t('outbound.emptyPalletBox.emptyPallet.selectCargoSpace'),
icon: 'none'
})
return
}
if (this.currentWarehouseType == '2' && !this.formData.exitId) {
uni.showToast({
title: this.$t('outbound.emptyPalletBox.emptyPallet.selectExit'),
title: '请选择出口',
icon: 'none'
})
return
@@ -194,22 +107,19 @@ export default {
if (response.code === 200) {
uni.showToast({
title: this.$t('outbound.emptyPalletBox.emptyPallet.outboundSuccess'),
title: '空托盘出库成功',
icon: 'success'
})
// 重置表单数据
this.formData = {
warehouseId: '',
cargoSpaceId: '',
exitId: ''
}
this.cargoSpaceList = []
this.exitList = []
this.currentWarehouseType = ''
this.cargoSpaceHeight = ''
} else {
uni.showToast({
title: response.msg || this.$t('outbound.emptyPalletBox.emptyPallet.outboundOperationFailed'),
title: response.msg || '出库操作失败',
icon: 'none'
})
}

View File

@@ -6,8 +6,8 @@
<image src="/static/images/tabbar/trayout.png" mode="aspectFit" class="icon-image" style="width: 40rpx; height: 40rpx;"></image>
</view>
<view class="function-text">
<text class="title">{{ $t('outbound.emptyPalletBox.title') }}</text>
<text class="desc">{{ $t('outbound.emptyPalletBox.desc') }}</text>
<text class="title">空托盘/料箱出库</text>
<text class="desc">空托盘/料箱出库管理</text>
</view>
</view>
<view class="function-item" @click="navigateTo('/pages/out/pkout')">
@@ -15,8 +15,8 @@
<image src="/static/images/tabbar/trayout.png" mode="aspectFit" class="icon-image" style="width: 40rpx; height: 40rpx;"></image>
</view>
<view class="function-text">
<text class="title">{{ $t('outbound.pkout.title') }}</text>
<text class="desc">{{ $t('outbound.pkout.desc') }}</text>
<text class="title">平库出库</text>
<text class="desc">平库出库管理</text>
</view>
</view>
<view class="function-item" @click="navigateTo('/pages/out/ckMakeSureByTray')">
@@ -24,8 +24,8 @@
<image src="/static/images/tabbar/readyCheck.png" mode="aspectFit" class="icon-image" style="width: 40rpx; height: 40rpx;"></image>
</view>
<view class="function-text">
<text class="title">{{ $t('outbound.ckMakeSureByTray.title') }}</text>
<text class="desc">{{ $t('outbound.ckMakeSureByTray.desc') }}</text>
<text class="title">出库确认</text>
<text class="desc">出库单确认管理</text>
</view>
</view>
<view class="function-item" @click="navigateTo('/pages/out/bindShell')">
@@ -33,8 +33,8 @@
<image src="/static/images/tabbar/readyCheck.png" mode="aspectFit" class="icon-image" style="width: 40rpx; height: 40rpx;"></image>
</view>
<view class="function-text">
<text class="title">{{ $t('outbound.bindShelf.title') }}</text>
<text class="desc">{{ $t('outbound.bindShelf.desc') }}</text>
<text class="title">绑定料架</text>
<text class="desc">出库单确认管理</text>
</view>
</view>
<view class="function-item" @click="navigateTo('/pages/out/errorout')">
@@ -42,8 +42,8 @@
<image src="/static/images/tabbar/readyCheck.png" mode="aspectFit" class="icon-image" style="width: 40rpx; height: 40rpx;"></image>
</view>
<view class="function-text">
<text class="title">{{ $t('outbound.exception.title') }}</text>
<text class="desc">{{ $t('outbound.exception.desc') }}</text>
<text class="title">异常出库</text>
<text class="desc">异常出库</text>
</view>
</view>
<view class="function-item" @click="navigateTo('/pages/out/move')">
@@ -51,8 +51,8 @@
<image src="/static/images/tabbar/readyCheck.png" mode="aspectFit" class="icon-image" style="width: 40rpx; height: 40rpx;"></image>
</view>
<view class="function-text">
<text class="title">{{ $t('outbound.move.title') }}</text>
<text class="desc">{{ $t('outbound.move.desc') }}</text>
<text class="title">料架搬运</text>
<text class="desc">点对点搬运</text>
</view>
</view>
</view>

View File

@@ -3,49 +3,49 @@
<uni-forms class="form-card">
<view class="form-content">
<!-- 第一个独立下拉框 -->
<uni-forms-item :label="$t('outbound.move.startPointType')">
<uni-forms-item label="起始点类型">
<uni-data-select
v-model="formData.startPointType"
:localdata="pointTypeList"
:clear="false"
:placeholder="$t('outbound.move.startPointTypePlaceholder')"
placeholder="请选择起始点类型"
@change="handleStartPointTypeChange"
/>
</uni-forms-item>
<!-- 第二个独立下拉框 -->
<uni-forms-item :label="$t('outbound.move.targetPointType')">
<uni-forms-item label="目标点类型">
<uni-data-select
v-model="formData.targetPointType"
:localdata="pointTypeList"
:clear="false"
:placeholder="$t('outbound.move.targetPointTypePlaceholder')"
placeholder="请选择目标点类型"
@change="handleTargetPointTypeChange"
/>
</uni-forms-item>
<!-- 第一个联动下拉框(主) -->
<uni-forms-item :label="$t('outbound.move.sourceLocation')">
<uni-forms-item label="起始位置">
<uni-data-select
v-model="formData.sourceLocationId"
:localdata="sourceLocationList"
:clear="false"
:placeholder="$t('outbound.move.sourceLocationPlaceholder')"
placeholder="请选择起始位置"
/>
</uni-forms-item>
<!-- 第二个联动下拉框(从) -->
<uni-forms-item :label="$t('outbound.move.targetLocation')">
<uni-forms-item label="目标位置">
<uni-data-select
v-model="formData.targetLocationId"
:localdata="targetLocationList"
:clear="false"
:placeholder="$t('outbound.move.targetLocationPlaceholder')"
placeholder="请选择目标位置"
/>
</uni-forms-item>
</view>
<button class="submit-button" @click="handleSubmit">{{ $t('outbound.move.submit') }}</button>
<button class="submit-button" @click="handleSubmit">提交</button>
</uni-forms>
</view>
</template>
@@ -82,7 +82,7 @@ export default {
this.pointTypeList = res.map(item => ({
value: item.dictValue,
text: this.$t(item.dictLabel)
text: item.dictLabel
}))
@@ -90,7 +90,7 @@ export default {
} catch (error) {
console.error('获取点位列表失败', error)
uni.showToast({
title: this.$t('outbound.move.getPointTypeListFailed'),
title: '获取点位类型列表失败',
icon: 'none'
})
}
@@ -118,7 +118,7 @@ async handleStartPointTypeChange(value) {
} catch (error) {
console.error('获取端口列表失败', error)
uni.showToast({
title: this.$t('outbound.move.getPortListFailed'),
title: '获取端口列表失败',
icon: 'none'
})
}
@@ -148,7 +148,7 @@ async handleStartPointTypeChange(value) {
} catch (error) {
console.error('获取目标端口列表失败', error)
uni.showToast({
title: this.$t('outbound.move.getPortListFailed'),
title: '获取端口列表失败',
icon: 'none'
})
}
@@ -161,7 +161,7 @@ async handleStartPointTypeChange(value) {
// 表单验证
if (!this.formData.startPointType) {
uni.showToast({
title: this.$t('outbound.move.startPointTypeRequired'),
title: '请选择起始点类型',
icon: 'none'
})
return
@@ -169,7 +169,7 @@ async handleStartPointTypeChange(value) {
if (!this.formData.targetPointType) {
uni.showToast({
title: this.$t('outbound.move.targetPointTypeRequired'),
title: '请选择目标点类型',
icon: 'none'
})
return
@@ -177,7 +177,7 @@ async handleStartPointTypeChange(value) {
if (!this.formData.sourceLocationId) {
uni.showToast({
title: this.$t('outbound.move.sourceLocationRequired'),
title: '请选择起始位置',
icon: 'none'
})
return
@@ -185,7 +185,7 @@ async handleStartPointTypeChange(value) {
if (!this.formData.targetLocationId) {
uni.showToast({
title: this.$t('outbound.move.targetLocationRequired'),
title: '请选择目标位置',
icon: 'none'
})
return
@@ -197,7 +197,7 @@ async handleStartPointTypeChange(value) {
endPoint:this.formData.targetLocationId})
if (res.code === 200) {
uni.showToast({
title: this.$t('outbound.move.submitSuccess'),
title: '提交成功',
icon: 'success'
})
// 重置表单
@@ -211,14 +211,14 @@ async handleStartPointTypeChange(value) {
this.targetLocationList = []
} else {
uni.showToast({
title: res.msg || this.$t('outbound.move.submitFailed'),
title: res.msg || '提交失败',
icon: 'none'
})
}
} catch (error) {
console.error('提交移库请求失败', error)
uni.showToast({
title: res.msg ||this.$t('outbound.move.submitError'),
title: res.msg ||'提交请求失败',
icon: 'none'
})
}

View File

@@ -3,7 +3,7 @@
<view class="search-box">
<uni-easyinput
v-model="stockoutId"
:placeholder="$t('outbound.pkout.searchPlaceholder')"
placeholder="请输入或扫码输入单据号"
:clearable="true"
@clear="handleClear"
@confirm="handleSearch"
@@ -20,27 +20,27 @@
<uni-card>
<view class="card-content">
<view class="info-row">
<text class="label">{{ $t('outbound.pkout.orderNumber') }}</text>
<text class="label">单据编号:</text>
<text class="value">{{ order.stockoutId }}</text>
</view>
<view class="info-row">
<text class="label">{{ $t('outbound.pkout.createTime') }}</text>
<text class="label">创建时间:</text>
<text class="value">{{ order.createDate }}</text>
</view>
<view class="info-row">
<text class="label">{{ $t('outbound.pkout.customer') }}</text>
<text class="label">客户:</text>
<text class="value">{{ order.customerName }}</text>
</view>
<!-- 展开时显示物料信息 -->
<view v-if="order.expanded && order.goodsList" class="goods-list">
<view class="goods-title">{{ $t('outbound.pkout.goodsInfo') }}</view>
<view class="goods-title">物品信息</view>
<view class="goods-table">
<view class="table-header">
<text class="header-cell" style="display: none;">{{ $t('outbound.pkout.productCode') }}</text>
<text class="header-cell">{{ $t('outbound.pkout.productName') }}</text>
<text class="header-cell">{{ $t('outbound.pkout.planQuantity') }}</text>
<text class="header-cell">{{ $t('outbound.pkout.outboundQuantity') }}</text>
<text class="header-cell">{{ $t('outbound.pkout.operation') }}</text>
<text class="header-cell" style="display: none;">物品编码</text>
<text class="header-cell">物品名称</text>
<text class="header-cell">计划数量</text>
<text class="header-cell">出库数量</text>
<text class="header-cell">操作</text>
</view>
<view v-for="(goods, goodsIndex) in order.goodsList" :key="goodsIndex" class="table-row">
<text class="table-cell" style="display: none;">{{ goods.productId }}</text>
@@ -49,7 +49,7 @@
<text class="table-cell">{{ goods.quantity - goods.assignNum }}</text>
<view class="table-cell">
<button class="operate-btn" @click.stop="handleOutStock(goods)" :disabled="(goods.quantity - goods.assignNum) <= 0" :class="{'operate-btn-disabled': (goods.quantity - goods.assignNum) <= 0}">
{{ $t('outbound.pkout.outbound') }}
出库
</button>
</view>
</view>
@@ -59,7 +59,7 @@
</uni-card>
</view>
</view>
<view v-else class="no-data">{{ $t('outbound.pkout.noOrderInfo') }}</view>
<view v-else class="no-data">暂无出库单信息</view>
</view>
</view>
</template>
@@ -102,11 +102,11 @@ export default {
goodsList: null
}))
} catch (error) {
console.error(this.$t('outbound.pkout.getOrderListFailed'), error)
uni.showToast({
title: this.$t('outbound.pkout.getOrderListFailed'),
icon: 'none'
})
console.error('获取出库单列表失败', error)
uni.showToast({
title: '获取出库单列表失败',
icon: 'none'
})
}
},
// 获取物品列表
@@ -123,11 +123,11 @@ export default {
// outQuantity: item.quantity-item.assignNum
}))
} catch (error) {
console.error(this.$t('outbound.pkout.getItemInfoFailed'), error)
uni.showToast({
title: this.$t('outbound.pkout.getItemInfoFailed'),
icon: 'none'
})
console.error('获取物品信息失败', error)
uni.showToast({
title: '获取物品信息失败',
icon: 'none'
})
}
},
// 处理出库单点击
@@ -179,18 +179,18 @@ export default {
})
uni.showToast({
title: this.$t('outbound.pkout.outboundSuccess'),
icon: 'success'
})
title: '出库成功',
icon: 'success'
})
// 刷新数据
this.getOrderList()
} catch (error) {
console.error('出库失败:', error)
uni.showToast({
title: this.$t('outbound.pkout.outboundFailed'),
icon: 'none'
})
title: '出库失败',
icon: 'none'
})
}
}
}

View File

@@ -1,60 +1,146 @@
<template>
<view class="container">
<!-- 出口选择框 -->
<!-- <view class="input-group">
<text class="input-label">选择出口</text>
<uni-data-select
v-model="selectedExit"
:localdata="exitOptions"
placeholder="请选择出口"
class="select-input">
</uni-data-select>
</view> -->
<view class="input-group">
<view class="input-label">托盘条码:</view>
<uni-easyinput
v-model="trayCode"
:placeholder="$t('stocktaking.confirm.trayCodePlaceholder')"
placeholder="请输入或扫码输入托盘条码"
:clearable="true"
@input="handleInput"
@clear="handleClear"
ref="trayCodeInput"
>
<template #right>
<text class="scan-icon" @click="handleScan">📷</text>
</template>
</uni-easyinput>
</view>
<view class="materials-list" v-if="materialList.length > 0">
<button class="add-button" @click="showAddMaterialPopup">{{ $t('stocktaking.confirm.addMaterial') }}</button>
<view v-for="(item, index) in materialList" :key="index" class="material-card">
<view class="material-header">
<text class="material-title">{{ item.extraField.materialDesc || item.productId }}</text>
<text class="material-code">{{ item.productId }} | {{ $t('stocktaking.confirm.systemQuantity') }}: {{ item.outQuantity }}{{ $t('stocktaking.confirm.unit') }}</text>
</view>
<view class="material-content">
<view class="quantity-control">
<button class="control-btn" @click="item.countQuantity = Math.max(0, Number(item.countQuantity) - 1)">-</button>
<text class="quantity-value">{{ item.countQuantity }}</text>
<button class="control-btn" @click="item.countQuantity = Number(item.countQuantity) + 1">+</button>
<text class="quantity-diff" :class="{ 'plus': item.countQuantity > item.outQuantity, 'minus': item.countQuantity < item.outQuantity,'equal':item.countQuantity==item.outQuantity }">{{ item.countQuantity > item.outQuantity ? $t('stocktaking.confirm.surplus') + (item.countQuantity - item.outQuantity) : item.countQuantity < item.outQuantity ? $t('stocktaking.confirm.loss') + (item.outQuantity - item.countQuantity) : $t('stocktaking.confirm.match') }}</text>
<button class="clear-btn" @click="item.countQuantity = 0">{{ $t('stocktaking.confirm.clearQuantity') }}</button>
</view>
</view>
</view>
</view>
<view class="materials-list">
<view v-for="(item, index) in materialList" :key="index" class="material-card">
<view class="material-header">
<text class="material-title">{{ item.productName }}</text>
<view class="material-code-section">
<view class="code-input-group">
<text class="code-label">物料编码:</text>
<uni-easyinput
v-model="item.productId"
placeholder="请输入物料编码"
class="code-input"
@input="handleMaterialCodeChange(index, $event)"
/>
</view>
<view class="code-input-group">
<text class="code-label">盘点数量:</text>
<uni-easyinput
v-model="item.countQuantity"
type="number"
placeholder="请输入盘点数量"
class="code-input"
@input="handleMaterialQtyChange(index, $event)"
/>
</view>
<text class="quantity-info">系统数量: {{ item.outQuantity }}件</text>
</view>
</view>
</view>
<button class="add-button" @click="showAddMaterialPopup">新增</button>
</view>
<view class="button-group" v-if="materialList.length > 0">
<button class="confirm-button" @click="handleConfirm">{{ $t('stocktaking.confirm.confirmStocktaking') }}</button>
<button class="confirm-button" @click="handleConfirm">确认盘点</button>
</view>
<!-- 新增物料弹窗 -->
<uni-popup ref="addMaterialPopup" type="center">
<view class="popup-content">
<view class="popup-title">{{ $t('stocktaking.confirm.addMaterialTitle') }}</view>
<view class="popup-form">
<view class="form-item">
<text class="form-label">{{ $t('stocktaking.confirm.materialCodeLabel') }}</text>
<uni-easyinput v-model="newMaterial.productId" :placeholder="$t('stocktaking.confirm.materialCodePlaceholder')" />
<view class="popup-title">新增物料</view>
<view class="popup-form grid">
<view class="form-row">
<view class="form-col">
<text class="form-label">物料编码</text>
<uni-easyinput v-model="newMaterial.productId" placeholder="请输入物料编码" />
</view>
<view class="form-col">
<text class="form-label">数量</text>
<uni-easyinput v-model="newMaterial.inQuantity" type="number" placeholder="请输入数量" />
</view>
</view>
<view class="form-item">
<text class="form-label">{{ $t('stocktaking.confirm.quantityLabel') }}</text>
<uni-easyinput v-model="newMaterial.inQuantity" type="number" :placeholder="$t('stocktaking.confirm.quantityPlaceholder')" />
<view class="form-row">
<view class="form-col">
<text class="form-label">台次</text>
<uni-easyinput v-model="newMaterial.spare5" placeholder="请输入台次" />
</view>
<view class="form-col">
<text class="form-label">件次</text>
<uni-easyinput v-model="newMaterial.spare7" placeholder="请输入件次" />
</view>
</view>
<view class="form-row">
<view class="form-col">
<text class="form-label">合同号</text>
<uni-easyinput v-model="newMaterial.spare6" placeholder="请输入合同号" />
</view>
<view class="form-col">
<text class="form-label">管理号</text>
<uni-easyinput v-model="newMaterial.spare9" placeholder="请输入管理号" />
</view>
</view>
<view class="form-row">
<view class="form-col">
<text class="form-label">质量等级</text>
<uni-data-select :localdata="productStatus" v-model="newMaterial.spare8" placeholder="请选择质量等级"></uni-data-select>
</view>
<view class="form-col">
<text class="form-label">批次</text>
<uni-easyinput v-model="newMaterial.lotNo" placeholder="请输入批次" />
</view>
</view>
<!-- 可选扩展项(暂不显示) -->
<view class="form-row">
<view class="form-col">
<text class="form-label">状态</text>
<uni-data-select :localdata="turnover_type" v-model="newMaterial.spare2" placeholder="请选择状态"></uni-data-select>
</view>
<view class="form-col">
<text class="form-label">套账</text>
<uni-data-select :localdata="account_type" v-model="newMaterial.spare3" placeholder="请选择套账"></uni-data-select>
</view>
</view>
<view class="form-row">
<view class="form-col">
<text class="form-label">来源</text>
<uni-data-select :localdata="origin_type" v-model="newMaterial.spare1" placeholder="请选择来源"></uni-data-select>
</view>
<view class="form-col">
<text class="form-label">用途</text>
<uni-data-select :localdata="purpose_type" v-model="newMaterial.spare4" placeholder="请选择用途"></uni-data-select>
</view>
</view>
<view class="form-row">
<view class="form-col">
<text class="form-label">供应商</text>
<uni-easyinput v-model="newMaterial.supplierId" placeholder="请输入供应商"/>
</view>
<view class="form-col">
<text class="form-label">单价</text>
<uni-easyinput v-model="newMaterial.printDate" placeholder="请输入单价"/>
</view>
</view>
</view>
<view class="popup-buttons">
<button class="cancel-btn" @click="hideAddMaterialPopup">{{ $t('stocktaking.confirm.cancel') }}</button>
<button class="submit-btn" @click="handleAddMaterial">{{ $t('stocktaking.confirm.confirm') }}</button>
<button class="cancel-btn" @click="hideAddMaterialPopup">取消</button>
<button class="submit-btn" @click="handleAddMaterial">确定</button>
</view>
</view>
</uni-popup>
@@ -62,8 +148,7 @@
</template>
<script>
import { getTrayMaterials, confirmPandian } from '@/api/pandian/confirm.js'
import { confirmPandian,getTaskDetail } from '@/api/pandian/confirm.js'
export default {
onReady() {
setTimeout(() => {
@@ -74,17 +159,57 @@
},
data() {
return {
selectedExit: '',
exitOptions: [
{ value: '1', text: '1' },
{ value: '1', text: '1' }
],
productStatus:[
{ value:'1',text:'优秀'},
{ value:'2',text:'良好'},
{ value:'3',text:'合格'},
{ value:'4',text:'不合格'}
],
origin_type:[
{ value:'1',text:'国产'},
{ value:'2',text:'进口'}
],
turnover_type:[
{ value:'1',text:'正常'},
{ value:'2',text:'积压'}
],
account_type:[
{ value:'1',text:'帐内'},
{ value:'2',text:'帐外'}
],
purpose_type:[
{ value:'1',text:'民用'},
{ value:'2',text:'军用'}
],
trayCode: '',
materialList: [],
newMaterial: {
productId: '',
inQuantity: ''
inQuantity: '',
spare5:'',//台次
spare6:'',//合同号
spare7:'',//件次
spare8:'',//质量等级
spare9:'',//管理号
spare1:'',//来源
spare2:'',//状态
spare3:'',//套账
spare4:'',//用途
supplierId:'',
printDate:''
}
}
},
methods: {
methods: {
// 处理输入事件
handleInput(value) {
if (value) {
this.fetchTrayInfo(value)
}
@@ -93,26 +218,40 @@
handleClear() {
this.materialList = []
},
// 处理物料编码变化
handleMaterialCodeChange(index, value) {
this.materialList[index].productId = value
},
// 处理盘点数量变化
handleMaterialQtyChange(index, value) {
const num = Number(value)
if (Number.isNaN(num) || num < 0) {
this.materialList[index].countQuantity = 0
uni.showToast({ title: '数量需为非负数字', icon: 'none' })
} else {
this.materialList[index].countQuantity = num
}
},
// 处理扫码事件
handleScan() {
uni.scanCode({
success: (res) => {
this.trayCode = res.result
this.fetchTrayInfo(res.result)
}
})
},
// handleScan() {
// uni.scanCode({
// success: (res) => {
// this.trayCode = res.result
// this.fetchTrayInfo(res.result)
// }
// })
// },
// 获取托盘信息
async fetchTrayInfo(trayCode) {
try {
const response = await getTrayMaterials({trayCode:trayCode,inOut:'4'})
const response = await getTaskDetail({trayCode:trayCode})
this.materialList = response.data.map(item => ({
...item,
countQuantity: item.outQuantity
}))
} catch (error) {
uni.showToast({
title: this.$t('stocktaking.confirm.getTrayInfoFailed'),
title: '获取托盘信息失败',
icon: 'none'
})
}
@@ -126,14 +265,25 @@
this.$refs.addMaterialPopup.close()
this.newMaterial = {
productId: '',
inQuantity: ''
inQuantity: '',
spare5:'',//台次
spare6:'',//合同号
spare7:'',//件次
spare8:'',//质量等级
spare9:'',//管理号
spare1:'',//来源
spare2:'',//状态
spare3:'',//套账
spare4:'',//用途
supplierId:'',
printDate:''
}
},
// 处理新增物料
handleAddMaterial() {
if (!this.newMaterial.productId || !this.newMaterial.inQuantity) {
uni.showToast({
title: this.$t('stocktaking.confirm.fillCompleteInfo'),
title: '请填写完整信息',
icon: 'none'
})
return
@@ -144,45 +294,76 @@
countQuantity: Number(this.newMaterial.inQuantity),
outQuantity: 0,
stockId: null,
extraField: {
materialDesc: ''
}
spare5:this.newMaterial.spare5,//台次
spare6:this.newMaterial.spare6,//合同号
spare7:this.newMaterial.spare7,//件次
spare8:this.newMaterial.spare8,//质量等级
spare9:this.newMaterial.spare9,//管理号
spare1:this.newMaterial.spare1,//来源
spare2:this.newMaterial.spare2,//状态
spare3:this.newMaterial.spare3,//套账
spare4:this.newMaterial.spare4,//用途
supplierId:this.newMaterial.supplierId,
printDate:this.newMaterial.printDate
})
this.hideAddMaterialPopup()
uni.showToast({
title: this.$t('stocktaking.confirm.addSuccess'),
title: '新增成功',
icon: 'success'
})
},
// 确认盘点
async handleConfirm() {
try {
const data = {
trayCode: this.trayCode,
materials: this.materialList.map(item => ({
stockId: item.stockId,
productId:item.productId,
jobDetailId:item.jobDetailId,
inQuantity: item.countQuantity,
inOrOutDId:item.inOrOutDId
}))
}
// 验证出口选择
// if (!this.selectedExit) {
// uni.showToast({
// title: '请选择出口',
// icon: 'none'
// })
// return
// }
try {
const data = {
trayCode: this.trayCode,
// exitId: this.selectedExit,
materials: this.materialList.map(item => ({
stockId: item.stockId,
productId:item.productId,
jobDetailId:item.jobDetailId,
inQuantity: Number(item.countQuantity) || 0,
inOrOutDId:item.inOrOutDId,
spare5:item.spare5,//台次
spare6:item.spare6,//合同号
spare7:item.spare7,//件次
spare8:item.spare8,//质量等级
spare9:item.spare9,//管理号
spare1:item.spare1,//来源
spare2:item.spare2,//状态
spare3:item.spare3,//套账
spare4:item.spare4,//用途
supplierId:item.supplierId,
printDate:item.printDate
}))
}
const response=await confirmPandian(data)
if(response.code==200){
uni.showToast({
title: this.$t('stocktaking.confirm.stocktakingSuccess'),
title: '盘点成功',
icon: 'success'
})
// 清空数据
this.trayCode = ''
this.materialList = []
this.selectedExit = ''
}
} catch (error) {
uni.showToast({
title: this.$t('stocktaking.confirm.stocktakingFailed'),
title: '盘点失败',
icon: 'none'
})
}
@@ -218,6 +399,23 @@
padding: 0 20rpx;
}
.input-label {
font-size: 28rpx;
color: #333;
margin-bottom: 16rpx;
display: block;
font-weight: 500;
}
.select-input {
:deep(.uni-data-select) {
background-color: #f8f8f8;
border-radius: 8rpx;
height: 80rpx;
padding: 0 24rpx;
}
}
.materials-list {
padding: 0 20rpx;
}
@@ -250,13 +448,54 @@
color: #333;
font-weight: 500;
display: block;
margin-bottom: 8rpx;
margin-bottom: 12rpx;
}
.material-code {
.material-code-section {
display: flex;
flex-direction: column;
gap: 8rpx;
}
.code-input-group {
display: flex;
align-items: center;
gap: 12rpx;
}
.code-label {
font-size: 28rpx;
color: #666;
display: block;
min-width: 140rpx;
flex-shrink: 0;
}
.code-input {
flex: 1;
:deep(.uni-easyinput__content) {
background-color: #f8f9fa;
border-radius: 6rpx;
height: 60rpx;
padding: 0 16rpx;
border: 1rpx solid #e9ecef;
&:focus-within {
border-color: #3B7FFF;
background-color: #fff;
}
}
:deep(.uni-easyinput__content-input) {
font-size: 26rpx;
color: #333;
}
}
.quantity-info {
font-size: 26rpx;
color: #666;
margin-left: 152rpx;
}
.material-content {
@@ -369,18 +608,43 @@
}
.popup-form {
margin-bottom: 30rpx;
}
.form-item {
margin-bottom: 20rpx;
margin-bottom: 30rpx;
}
.form-label {
font-size: 28rpx;
color: #333;
margin-bottom: 10rpx;
display: block;
font-size: 28rpx;
color: #333;
margin-bottom: 10rpx;
display: block;
}
/* 弹窗两列表单布局 */
.popup-form.grid {
display: flex;
flex-direction: column;
gap: 20rpx;
}
.form-row {
display: flex;
gap: 20rpx;
}
.form-col {
flex: 1;
}
.form-col :deep(.uni-easyinput__content),
.form-col :deep(.uni-data-select) {
background-color: #f8f8f8;
border-radius: 8rpx;
height: 72rpx;
padding: 0 20rpx;
}
.form-col :deep(.uni-easyinput__content-input) {
font-size: 26rpx;
color: #333;
}
.popup-buttons {

View File

@@ -6,8 +6,8 @@
<image src="/static/images/tabbar/tray121.png" mode="aspectFit" class="icon-image" style="width: 40rpx; height: 40rpx;"></image>
</view>
<view class="function-text">
<text class="title">{{ $t('stocktaking.confirm.title') }}</text>
<text class="desc">{{ $t('stocktaking.confirm.desc') }}</text>
<text class="title">盘点确认</text>
<text class="desc">托盘物料盘点确认</text>
</view>
</view>
<view class="function-item" @click="navigateTo('/pages/pandian/pkconfirm')">
@@ -15,8 +15,8 @@
<image src="/static/images/tabbar/tray121.png" mode="aspectFit" class="icon-image" style="width: 40rpx; height: 40rpx;"></image>
</view>
<view class="function-text">
<text class="title">{{ $t('stocktaking.confirmPK.title') }}</text>
<text class="desc">{{ $t('stocktaking.confirmPK.desc') }}</text>
<text class="title">盘点确认(PK)</text>
<text class="desc">托盘物料盘点确认(PK)</text>
</view>
</view>
</view>

View File

@@ -5,13 +5,13 @@
v-model="selectedWarehouse"
:localdata="warehouseList"
:clear="false"
:placeholder="$t('stocktaking.confirmPK.selectWarehouse')"
placeholder="请选择仓库"
@change="handleWarehouseChange"
/>
</view>
<view class="add-button-container" v-if="selectedWarehouse!=''">
<button class="add-button" @click="showAddMaterialPopup">{{ $t('stocktaking.confirmPK.addMaterial') }}</button>
<button class="add-button" @click="showAddMaterialPopup">新增物料</button>
</view>
<view class="inventory-list" v-if="inventoryList.length > 0">
@@ -19,19 +19,19 @@
<uni-card>
<view class="card-content">
<view class="info-row">
<text class="label">{{ $t('stocktaking.confirmPK.materialCode') }}:</text>
<text class="label">物料编码:</text>
<text class="value">{{ item.extraField.productId }}</text>
</view>
<view class="info-row">
<text class="label">{{ $t('stocktaking.confirmPK.materialName') }}:</text>
<text class="label">物料名称:</text>
<text class="value">{{ item.extraField.materialDesc }}</text>
</view>
<view class="info-row">
<text class="label">{{ $t('stocktaking.confirmPK.inventoryQuantity') }}:</text>
<text class="label">库存数量:</text>
<text class="value">{{ item.quantity }}</text>
</view>
<view class="info-row">
<text class="label">{{ $t('stocktaking.confirmPK.countQuantity') }}:</text>
<text class="label">盘点数量:</text>
<view class="value">
<uni-easyinput
v-model.number="item.newQuantity"
@@ -43,7 +43,7 @@
</view>
</view>
<view class="button-row">
<button class="confirm-button" @click="handleConfirm(item)">{{ $t('stocktaking.confirmPK.countButton') }}</button>
<button class="confirm-button" @click="handleConfirm(item)">盘点</button>
</view>
</view>
</uni-card>
@@ -51,26 +51,26 @@
</view>
<view class="empty-state" v-else>
<text>{{ $t('stocktaking.confirmPK.noInventoryData') }}</text>
<text>暂无盘点数据</text>
</view>
<!-- 新增物料弹窗 -->
<uni-popup ref="addMaterialPopup" type="center">
<view class="popup-content">
<view class="popup-title">{{ $t('stocktaking.confirmPK.addMaterialTitle') }}</view>
<view class="popup-title">新增物料</view>
<view class="popup-form">
<view class="form-item">
<text class="form-label">{{ $t('stocktaking.confirmPK.materialCodeLabel') }}</text>
<uni-easyinput v-model="newMaterial.productId" :placeholder="$t('stocktaking.confirm.materialCodePlaceholder')" />
<text class="form-label">物料编码</text>
<uni-easyinput v-model="newMaterial.productId" placeholder="请输入物料编码" />
</view>
<view class="form-item">
<text class="form-label">{{ $t('stocktaking.confirmPK.quantityLabel') }}</text>
<uni-easyinput v-model="newMaterial.newQuantity" type="number" :placeholder="$t('stocktaking.confirm.quantityPlaceholder')" />
<text class="form-label">数量</text>
<uni-easyinput v-model="newMaterial.newQuantity" type="number" placeholder="请输入数量" />
</view>
</view>
<view class="popup-buttons">
<button class="cancel-btn" @click="hideAddMaterialPopup">{{ $t('stocktaking.confirmPK.cancel') }}</button>
<button class="submit-btn" @click="handleAddMaterial">{{ $t('stocktaking.confirmPK.confirm') }}</button>
<button class="cancel-btn" @click="hideAddMaterialPopup">取消</button>
<button class="submit-btn" @click="handleAddMaterial">确定</button>
</view>
</view>
</uni-popup>
@@ -122,7 +122,7 @@
} catch (error) {
console.error('获取仓库列表失败:', error)
uni.showToast({
title: this.$t('stocktaking.confirmPK.getWarehouseListFailed'),
title: '获取仓库列表失败',
icon: 'none'
})
}
@@ -144,7 +144,7 @@
} catch (error) {
console.error('获取库存列表失败:', error)
uni.showToast({
title: this.$t('stocktaking.confirmPK.getInventoryListFailed'),
title: '获取库存列表失败',
icon: 'none'
})
}
@@ -159,14 +159,14 @@
async handleConfirm(item) {
if (!item.newQuantity || item.newQuantity < 0) {
uni.showToast({
title: this.$t('stocktaking.confirmPK.enterValidCountQuantity'),
title: '请输入有效的盘点数量',
icon: 'none'
})
return
}
if(item.newQuantity==item.quantity){
uni.showToast({
title: this.$t('stocktaking.confirmPK.quantityMatch'),
title: '库存数量与盘点数量一致,无需盘点',
icon: 'none'
})
}
@@ -181,21 +181,21 @@
if (response.code === 200) {
uni.showToast({
title: this.$t('stocktaking.confirmPK.countSuccess'),
title: '盘点成功',
icon: 'success'
})
// 刷新库存列表
this.getInventoryList()
} else {
uni.showToast({
title: response.msg || this.$t('stocktaking.confirmPK.countFailed'),
title: response.msg || '盘点失败',
icon: 'none'
})
}
} catch (error) {
console.error('盘点失败:', error)
uni.showToast({
title: this.$t('stocktaking.confirmPK.countFailed'),
title: '盘点失败',
icon: 'none'
})
}
@@ -213,7 +213,7 @@
showAddMaterialPopup() {
if(!this.selectedWarehouse)
return uni.showToast({
title: this.$t('stocktaking.confirmPK.selectWarehouse'),
title: '请选择仓库',
icon: 'none'
})
this.$refs.addMaterialPopup.open()
@@ -233,7 +233,7 @@
async handleAddMaterial() {
if (!this.newMaterial.productId || !this.newMaterial.newQuantity || this.newMaterial.newQuantity < 0) {
uni.showToast({
title: this.$t('stocktaking.confirmPK.enterValidMaterialInfo'),
title: '请输入有效的物料信息',
icon: 'none'
})
return
@@ -249,7 +249,7 @@
if (response.code === 200) {
uni.showToast({
title: this.$t('stocktaking.confirmPK.addSuccess'),
title: '新增成功',
icon: 'success'
})
// 关闭弹窗并刷新列表
@@ -257,7 +257,7 @@
this.getInventoryList()
} else {
uni.showToast({
title: response.msg || this.$t('stocktaking.confirmPK.addFailed'),
title: response.msg || '新增失败',
icon: 'none'
})
}

View File

@@ -2,21 +2,21 @@
<view class="container">
<view class="form-card">
<uni-forms>
<uni-forms-item :label="$t('settings.ipLabel')">
<uni-easyinput v-model="settingformData.ip" :placeholder="$t('settings.ipPlaceholder')" />
<uni-forms-item label="IP:">
<uni-easyinput v-model="settingformData.ip" placeholder="请输入IP地址" />
</uni-forms-item>
<uni-forms-item :label="$t('settings.portLabel')">
<uni-easyinput v-model="settingformData.port" :placeholder="$t('settings.portPlaceholder')" />
<uni-forms-item label="端口:">
<uni-easyinput v-model="settingformData.port" placeholder="请输入端口号" />
</uni-forms-item>
</uni-forms>
<button class="submit-button" @click="handleSubmit">{{ $t('settings.saveSettings') }}</button>
<button class="submit-button" @click="handleSubmit">保存设置</button>
<view class="divider"></view>
<view class="language-section">
<text class="section-title">{{ $t('settings.languageSettings') }}</text>
<!-- <view class="language-section">
<text class="section-title">语言设置</text>
<language-switcher></language-switcher>
</view>
</view> -->
</view>
</view>
</template>
@@ -60,32 +60,32 @@
// 验证IP地址
if (!this.settingformData.ip) {
uni.showToast({
title: this.$t('settings.ipRequired'),
icon: 'none'
})
title: '请输入IP地址',
icon: 'none'
})
return
}
if (!this.validateIP(this.settingformData.ip)) {
uni.showToast({
title: this.$t('settings.invalidIpFormat'),
icon: 'none'
})
title: '请输入正确的IP地址格式',
icon: 'none'
})
return
}
// 验证端口号
if (!this.settingformData.port) {
uni.showToast({
title: this.$t('settings.portRequired'),
icon: 'none'
})
title: '请输入端口号',
icon: 'none'
})
return
}
if (!this.validatePort(this.settingformData.port)) {
uni.showToast({
title: this.$t('settings.invalidPortFormat'),
icon: 'none'
})
title: '请输入正确的端口号(1-65535)',
icon: 'none'
})
return
}
@@ -98,8 +98,8 @@
// getApp().globalData.config = config
// console.log("11111",config.baseUrl)
uni.showToast({
title: this.$t('settings.settingsSaved'),
icon: 'success',
title: '设置已保存',
icon: 'success',
complete: () => {
// 延迟跳转,确保Toast显示完成
setTimeout(() => {
@@ -112,9 +112,9 @@
} catch (e) {
console.error('保存设置失败:', e)
uni.showToast({
title: this.$t('settings.saveSettingsFailed'),
icon: 'none'
})
title: '保存设置失败',
icon: 'none'
})
}
}
}

View File

@@ -13,15 +13,15 @@
<view class="task-list" v-if="tasks.length > 0">
<view class="task-item" v-for="(task, index) in tasks" :key="index" @click="handleTaskClick(task)">
<view class="task-info">
<text class="task-title">{{ $t('task.list.trayCode') }}:{{ task.trayCode }}</text>
<text class="task-type">{{ $t('task.list.cargoSpace') }}:{{ task.cargoSpaceName }}</text>
<text class="task-status">{{ $t('task.list.warehouse') }}:{{ task.warehouseName }}</text>
<text class="task-status">{{ $t('task.list.createTime') }}:{{ task.createTime }}</text>
<text class="task-status status-tag">{{ $t('task.list.status') }}:{{ task.status === '1' ? $t('task.list.pending') : task.status === '3' ? $t('task.list.executing') : task.status }}</text>
<text class="task-title">托盘条码:{{ task.trayCode }}</text>
<text class="task-type">货位:{{ task.cargoSpaceName }}</text>
<text class="task-status">仓库:{{ task.warehouseName }}</text>
<text class="task-status">创建时间:{{ task.createTime }}</text>
<text class="task-status status-tag">状态:{{ task.status === '1' ? '待执行' : task.status === '3' ? '正执行' : task.status }}</text>
<view class="task-actions">
<button v-if="task.inOrOut < 20" class="action-button in-button" @click.stop="handleInStock(task)">{{ $t('task.list.inbound') }}</button>
<button v-if="task.inOrOut >= 20 && task.inOrOut != 25 && task.inOrOut != 26" class="action-button out-button" @click.stop="handleOutStock(task)">{{ $t('task.list.outbound') }}</button>
<button v-if="task.inOrOut == 25 || task.inOrOut == 26" class="action-button out-button" @click.stop="handleCheck(task)">{{ $t('task.list.stocktaking') }}</button>
<button v-if="task.inOrOut < 20" class="action-button in-button" @click.stop="handleInStock(task)">入库</button>
<button v-if="task.inOrOut >= 20 && task.inOrOut != 25 && task.inOrOut != 26" class="action-button out-button" @click.stop="handleOutStock(task)">出库</button>
<button v-if="task.inOrOut == 25 || task.inOrOut == 26" class="action-button out-button" @click.stop="handleCheck(task)">盘点</button>
</view>
</view>
</view>
@@ -29,21 +29,21 @@
<!-- 空状态 -->
<view class="empty-state" v-else>
<text>{{ $t('task.list.noTasks') }}</text>
<text>暂无任务</text>
</view>
<!-- 物料详情弹出层 -->
<uni-popup ref="materialPopup" type="center">
<view class="popup-content">
<view class="popup-header">
<text class="popup-title">{{ $t('task.list.materialDetails') }}</text>
<text class="popup-title">物料详情</text>
<text class="close-btn" @click="closePopup">×</text>
</view>
<view class="material-list">
<view class="material-item" v-for="(material, index) in materialDetails" :key="index">
<text class="material-code">{{ $t('task.list.materialCode') }}:{{ material.productId }}</text>
<text class="material-name">{{ $t('task.list.materialName') }}:{{ material.extraField.materialDesc }}</text>
<text class="material-quantity">{{ $t('task.list.quantity') }}:{{ currentTask.inOrOut < 20 ? material.inQuantity : material.outQuantity }}</text>
<text class="material-code">物料编码:{{ material.productId }}</text>
<text class="material-name">物料名称:{{ material.extraField.materialDesc }}</text>
<text class="material-quantity">数量:{{ currentTask.inOrOut < 20 ? material.inQuantity : material.outQuantity }}</text>
</view>
</view>
</view>
@@ -60,10 +60,10 @@ export default {
return {
selectedType: '',
taskTypes: [
{ value: '', text: this.$t('task.list.all') },
{ value: '1', text: this.$t('task.list.inbound') },
{ value: '2', text: this.$t('task.list.outbound') },
{ value: '4', text: this.$t('task.list.stocktaking') }
{ value: '', text: '全部' },
{ value: '1', text: '入库' },
{ value: '2', text: '出库' },
{ value: '4', text: '盘点' }
],
tasks: [],
materialDetails: [],
@@ -82,7 +82,7 @@ export default {
} else {
this.tasks = []
uni.showToast({
title: this.$t('task.list.getTaskListFailed'),
title: '获取任务列表失败',
icon: 'none'
})
}
@@ -90,7 +90,7 @@ export default {
console.error('获取任务列表出错:', error)
this.tasks = []
uni.showToast({
title: this.$t('task.list.getTaskListFailed'),
title: '获取任务列表失败',
icon: 'none'
})
}
@@ -106,20 +106,20 @@ export default {
if (response.code === 200) {
uni.showToast({
title: this.$t('task.list.inboundSuccess'),
title: '入库成功',
icon: 'success'
})
this.fetchTasks()
} else {
uni.showToast({
title: response.msg || this.$t('task.list.inboundFailed'),
title: response.msg || '入库失败',
icon: 'none'
})
}
} catch (error) {
console.error('入库操作失败:', error)
uni.showToast({
title: this.$t('task.list.inboundFailed'),
title: '入库失败',
icon: 'none'
})
}
@@ -145,14 +145,14 @@ export default {
this.$refs.materialPopup.open()
} else {
uni.showToast({
title: this.$t('task.list.getMaterialDetailsFailed'),
title: '获取物料详情失败',
icon: 'none'
})
}
} catch (error) {
console.error('获取物料详情失败:', error)
uni.showToast({
title: this.$t('task.list.getMaterialDetailsFailed'),
title: '获取物料详情失败',
icon: 'none'
})
}

View File

@@ -3,165 +3,39 @@ import { getToken } from '@/utils/auth'
// 登录页面
const loginPage = "/pages/login"
// 首页
const indexPage = "/pages/index"
// 标记是否由navigateBack触发的reLaunch
let isNavigateBackTriggered = false
// 获取当前页面路径
function getCurrentPageUrl() {
const pages = getCurrentPages()
const currentPage = pages[pages.length - 1]
console.log("当前页面",currentPage.route)
console.log("上一层页面", pages[pages.length - 2].route)
return currentPage ? currentPage.route : ''
}
// 页面白名单
const whiteList = [
'/pages/login', '/pages/register', '/pages/common/webview/index','/pages/setting'
]
// 检查地址白名单
function checkWhite(url) {
// 确保url以/开头
const normalizedUrl = url.startsWith('/') ? url : '/' + url
const path = normalizedUrl.split('?')[0]
const path = url.split('?')[0]
return whiteList.indexOf(path) !== -1
}
// 页面跳转验证拦截器
let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"]
list.forEach(item => {
uni.addInterceptor(item, {
invoke(to) {
console.log(`${item} 拦截器被触发,目标页面:`, to.url)
console.log('当前 Token 状态:', getToken() ? '存在' : '不存在')
// 如果是由navigateBack触发的reLaunch,直接放行
if (item === 'reLaunch' && isNavigateBackTriggered) {
console.log('由navigateBack触发的reLaunch,直接放行')
return true
}
if (getToken()) {
console.log('Token 存在,检查是否为登录页面')
if (to.url === loginPage) {
console.log('当前为登录页面,重定向到首页')
uni.reLaunch({ url: "/" })
}
return true
} else {
console.log('Token 不存在,检查是否在白名单中')
if (checkWhite(to.url)) {
console.log('目标页面在白名单中,允许访问')
return true
}
console.log('页面不在白名单中,准备跳转到登录页')
uni.showToast({
icon: 'none',
title: '登录已过期,请重新登录'
})
setTimeout(() => {
console.log('执行跳转到登录页')
uni.reLaunch({ url: loginPage })
}, 1500)
uni.reLaunch({ url: loginPage })
return false
}
},
fail(err) {
console.error(err)
console.log(err)
}
})
})
// 单独处理返回按钮操作
uni.addInterceptor('navigateBack', {
invoke(e) {
console.log('navigateBack 拦截器被触发', e)
console.log('当前 Token 状态:', getToken() ? '存在' : '不存在')
// 获取当前页面栈
const pages = getCurrentPages()
// 检查页面导航栈是否为空
if (pages.length <= 1) {
console.log('页面导航栈为空或只有一个页面,无法正常返回')
// 检查Token状态
if (getToken()) {
console.log('Token存在,跳转到首页')
// 设置标志,表明当前的reLaunch是由navigateBack触发的
isNavigateBackTriggered = true
uni.reLaunch({ url: indexPage })
// 重置标志
setTimeout(() => {
isNavigateBackTriggered = false
}, 100)
} else {
console.log('Token不存在,跳转到登录页')
uni.showToast({
icon: 'none',
title: '登录已过期,请重新登录'
})
// 设置标志,表明当前的reLaunch是由navigateBack触发的
isNavigateBackTriggered = true
setTimeout(() => {
console.log('执行跳转到登录页')
uni.reLaunch({ url: loginPage })
// 重置标志
setTimeout(() => {
isNavigateBackTriggered = false
}, 100)
}, 1500)
}
return false
}
// 页面导航栈不为空,检查Token状态
if (!getToken()) {
const currentPage = getCurrentPageUrl()
console.log('当前页面路径:', currentPage)
// 确保currentPage不为空且有内容
if (currentPage && currentPage.trim() && checkWhite(currentPage)) {
console.log('当前页面在白名单中,允许返回')
return true
}
console.log('Token不存在且页面不在白名单中,准备跳转到登录页')
uni.showToast({
icon: 'none',
title: '登录已过期,请重新登录'
})
// 设置标志,表明当前的reLaunch是由navigateBack触发的
isNavigateBackTriggered = true
setTimeout(() => {
console.log('执行跳转到登录页')
uni.reLaunch({ url: loginPage })
// 重置标志
setTimeout(() => {
isNavigateBackTriggered = false
}, 100)
}, 1500)
return false
}
// Token存在且页面导航栈不为空,允许正常返回
const currentPage = pages[pages.length - 1]
console.log("当前页面:", currentPage.route)
if (pages.length > 1) {
console.log("上一层页面:", pages[pages.length - 2].route)
}
console.log('Token存在,允许正常返回')
return true
},
fail(err) {
console.error('navigateBack 拦截器执行失败:', err)
}
})
})

View File

@@ -19,4 +19,6 @@ public class RequestEnter {
private String roadwayId;
private Integer height;
private Double weight;
}

View File

@@ -10,5 +10,5 @@ import lombok.NoArgsConstructor;
public class RequestEnterResponse {
private String cargoSpaceId;
private String trayCode;
private String taskNo;
private String jobId;
}

View File

@@ -32,21 +32,22 @@ public class ToWcsServiceImpl implements IToWcsService {
@Autowired
private IAgvContainerTaskService agvContainerTaskService;
public static final String PUSH_OUT_MYDO_JOB = "http://localhost:8081/wcs2Wms/api/receiveOutMydoJob";
public static final String PUSH_IN_MYDO_JOB = "http://localhost:8081/wcs2Wms/api/receiveInMydoJob";
public static final String PUSH_AGV_MOVE_JOB = "http://localhost:8081/agv/api/receiveAgvMoveJob";
public static final String OUT_MYDOJOB_MS = "http://localhost:8081/wcs2Wms/api/outMydojobMakesure";
public static final String CANCEL_MYDOJOB = "http://localhost:8081/wcs2Wms/api/cancelMydoJob";
public static final String PUSH_OUT_MYDO_JOB = "http://localhost:10012/wcs2Wms/api/receiveOutMydoJob";
public static final String PUSH_IN_MYDO_JOB = "http://localhost:10012/wcs2Wms/api/receiveInMydoJob";
public static final String PUSH_AGV_MOVE_JOB = "http://localhost:10012/agv/api/receiveAgvMoveJob";
public static final String OUT_MYDOJOB_MS = "http://localhost:10012/wcs2Wms/api/outMydojobMakesure";
public static final String CANCEL_MYDOJOB = "http://localhost:10012/wcs2Wms/api/cancelMydoJob";
@Override
//@Scheduled(fixedDelay=1500)
@Scheduled(fixedDelay=1500)
public void pushOutMydoJob() {
//查询所有未推送的料箱出库作业
MydoJob mydoJobParam = new MydoJob();
mydoJobParam.setStatus("1");
List<String> list = new ArrayList<>();
list.add("21");
list.add("23");
list.add("26");
mydoJobParam.setInOutIds(list);
List<MydoJob> outMydoJobs = mydoJobService.selectMydoJobListApi(mydoJobParam);

View File

@@ -157,6 +157,11 @@ public class ToWmsServiceImpl implements IToWmsService {
public AjaxResult reAssign(ReMaterialParam reMaterialParam) {
//重新分配货位
MydoJob mydoJob = mydoJobService.selectMydoJobByJobId(reMaterialParam.getJobId());
//先标记原来货位有问题
String cargoSpaceId = mydoJob.getCargoSpaceId();
BasCargoSpace oldBasCargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(cargoSpaceId);
oldBasCargoSpace.setStatus("5");
basCargoSpaceService.updateBasCargoSpace(oldBasCargoSpace);
String warehouseId = mydoJob.getWarehouseId();
BasCargoSpace basCargoSpaceParam = new BasCargoSpace();
basCargoSpaceParam.setWarehouseId(warehouseId);
@@ -198,6 +203,10 @@ public class ToWmsServiceImpl implements IToWmsService {
if (requestEnter.getHeight()==0) {
return AjaxResult.error("未检测到入库高度");
}
/*if (requestEnter.getWeight() ==0){
return AjaxResult.error("未检测到入库重量");
}*/
log.info("扫码内容{},入库高度{}", requestEnter.getTrayCode(), requestEnter.getHeight());
MydoJob param = new MydoJob();
@@ -211,8 +220,8 @@ public class ToWmsServiceImpl implements IToWmsService {
MydoJob mydoJob = mydoJobs.get(0);
if(StrUtil.isEmpty(mydoJob.getCargoSpaceId())){
BasCargoSpace basCargoSpaceParam = new BasCargoSpace();
basCargoSpaceParam.setWarehouseId(mydoJob.getWarehouseId());
basCargoSpaceParam.setRoadwayId(mydoJob.getRoadwayId());
basCargoSpaceParam.setWarehouseId(requestEnter.getWarehouseId());
basCargoSpaceParam.setRoadwayId(requestEnter.getRoadwayId());
if (requestEnter.getHeight()==1){
basCargoSpaceParam.setCargoHight("975");
}else {
@@ -228,6 +237,7 @@ public class ToWmsServiceImpl implements IToWmsService {
mydoJob.setStatus("3");
mydoJob.setStartTime(DateUtil.formatDateTime(new Date()));
mydoJob.setRoadwayId(requestEnter.getRoadwayId());
mydoJob.setLineId(Convert.toStr(requestEnter.getWeight()));
mydoJobService.updateMydoJob(mydoJob);
//修改货位状态为已分配

View File

@@ -32,6 +32,7 @@ import com.ruoyi.pda.service.PdaService;
import com.ruoyi.stock.stock.domain.BasStock;
import com.ruoyi.stock.stock.mapper.BasStockMapper;
import com.ruoyi.stock.stock.service.IBasStockService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -50,7 +51,7 @@ import java.util.*;
@Service
@Slf4j
public class MydoJobServiceImpl implements IMydoJobService {
@Autowired
@Resource
private MydoJobMapper mydoJobMapper;
@Autowired
private IBasJobIdService basJobIdService;
@@ -76,9 +77,9 @@ public class MydoJobServiceImpl implements IMydoJobService {
private IToWcsService iToWcsService;
@Autowired
private ITransferBillCallbackService transferBillCallbackService;
@Autowired
@Resource
private BasStockMapper basStockMapper;
@Autowired
@Resource
private PdaMapper pdaMapper;
@Autowired
private ICheckDifferenceRecordService checkDifferenceRecordService;
@@ -429,6 +430,7 @@ public class MydoJobServiceImpl implements IMydoJobService {
stock.setDistribution(mydoJobDetail.getSpare9());
stock.setModel(mydoJobDetail.getUnit());
stock.setOrderId(mydoJobDetail.getSpare6());
stock.setNetWeight(mydoJob.getLineId());
return stock;
}

View File

@@ -6,7 +6,7 @@ spring:
druid:
# 主库数据源
master:
url: jdbc:sqlserver://172.16.2.170:1433;databaseName=FT541-wms;encrypt=true;trustServerCertificate=true;
url: jdbc:sqlserver://127.0.0.1:1433;databaseName=FT541-wms;encrypt=true;trustServerCertificate=true;
username: sa
password: Flrd0914.
# 从库数据源

View File

@@ -71,7 +71,7 @@ spring:
# redis 配置
redis:
# 地址
host: 172.16.2.170
host: 127.0.0.1
# 端口,默认为6379
port: 6379
# 数据库索引

View File

@@ -182,12 +182,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
FROM bas_cargo_space
WHERE status = '1'
and locked = 'N'
<if test="warehouseId != null">
and warehouse_id = #{warehouseId}
</if>
<if test="roadwayId != null">
and roadway_id = #{roadwayId}
</if>
ORDER BY the_platoon, the_floor,the_column
</select>
<select id="selectBasCargoSpaceListByRoadway" parameterType="BasCargoSpace" resultMap="BasCargoSpaceResult">

View File

@@ -370,7 +370,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
mjd.spec,
mjd.unit,
mj.tray_code,
mj.warehosue_id
mj.warehouse_id
from mydo_job_detail mjd
left join bas_product bp on mjd.product_id = bp.product_id

View File

@@ -50,3 +50,12 @@ export function barcodePrinting(data) {
data:data
})
}
// 绑定托盘
export function bindTray(data) {
return request({
url: '/in/stockInDetail/bindTray',
method: 'post',
data: data
})
}

View File

@@ -115,7 +115,18 @@
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="info"
plain
icon="el-icon-download"
size="mini"
:disabled="detailSingle"
@click="bindTrayCode"
v-hasPermi="['in:stockIn:barcodePrinting']"
>绑定托盘
</el-button>
<!-- <el-button
type="info"
plain
icon="el-icon-download"
@@ -123,8 +134,8 @@
:disabled="detailMultiple"
@click="handleBarcodePrinting"
v-hasPermi="['in:stockIn:barcodePrinting']"
>打印条码<!--打印条码-->
</el-button>
>打印条码&lt;!&ndash;打印条码&ndash;&gt;
</el-button>-->
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
@@ -226,6 +237,39 @@
@pagination="getDetailList"
/>
<!-- 绑定托盘对话框 -->
<el-dialog :title="'绑定托盘'" :visible.sync="bindOpen" width="600px" append-to-body>
<el-descriptions title="物料信息" :column="2" border>
<el-descriptions-item label="物料编码">{{ bindData.productId }}</el-descriptions-item>
<el-descriptions-item label="物料名称">{{ bindData.productName }}</el-descriptions-item>
<el-descriptions-item label="计划数量">{{ bindData.quantity}}</el-descriptions-item>
<el-descriptions-item label="子单ID">{{ bindData.stockinDetailId }}</el-descriptions-item>
</el-descriptions>
<el-form ref="bindForm" :model="bindForm" :rules="bindRules" label-width="100px" style="margin-top: 20px;">
<el-form-item label="仓库" prop="warehouseId">
<el-select v-model="bindForm.warehouseId" placeholder="请选择仓库" style="width: 100%">
<el-option
v-for="item in warehouseOptions"
:key="item.warehouseId"
:label="item.warehouseName"
:value="item.warehouseId"
/>
</el-select>
</el-form-item>
<el-form-item label="托盘条码" prop="trayCode">
<el-input v-model="bindForm.trayCode" placeholder="请输入托盘条码" />
</el-form-item>
<el-form-item label="绑定数量" prop="quantity">
<el-input-number v-model="bindForm.quantity" :min="1" :max="bindData.quantity" label="绑定数量" style="width: 100%"></el-input-number>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitBind">确 定</el-button>
<el-button @click="cancelBind">取 消</el-button>
</div>
</el-dialog>
<!-- 打印模板 -->
<vue-easy-print v-show="true" ref="easyPrint2">
<div v-for="item in printData" :key="item.stockinDetailId" style="page-break-after:always" class="vue-easy-print">
@@ -249,7 +293,7 @@ import {
reviewStockIn,
confirmationStockIn
} from "@/api/in/stockIn"
import {listStockInDetail, barcodePrinting} from "@/api/in/stockInDetail"
import {listStockInDetail, barcodePrinting, bindTray} from "@/api/in/stockInDetail"
import {getLodop} from "@/plugins/LodopFuncs.js"
import {listWarehouse} from "@/api/bas/warehouse";
import vueEasyPrint from 'vue-easy-print'
@@ -277,6 +321,30 @@ export default {
stockInListSelected: [],
stockInDetailListSelected: [],
printData:[],
bindData:{
stockinDetailId:"",
productId:"",
productName:"",
quantity:""
},
// 绑定托盘弹出层
bindOpen: false,
bindForm: {
warehouseId: null,
trayCode: null,
quantity: null
},
bindRules: {
warehouseId: [
{ required: true, message: "仓库不能为空", trigger: "change" }
],
trayCode: [
{ required: true, message: "托盘条码不能为空", trigger: "blur" }
],
quantity: [
{ required: true, message: "绑定数量不能为空", trigger: "blur" }
]
},
// 非单个禁用
single: true,
detailSingle: true,
@@ -470,6 +538,52 @@ export default {
this.$modal.msgError('只有执行中的单据可以确认')
}
},
/*绑定托盘*/
bindTrayCode(row){
if (this.stockInDetailListSelected.length === 0) {
this.$modal.msgWarning('请选择要绑定的子单据')
return
}
if (this.stockInDetailListSelected.length > 1) {
this.$modal.msgWarning('只能选择一条子单据托盘绑定')
return
}
this.bindData = this.stockInDetailListSelected[0];
this.bindForm = {
warehouseId: null,
trayCode: null,
quantity: this.bindData.quantity
};
// 如果主单有仓库信息,可以尝试默认选中(可选)
// if (this.stockInListSelected.length > 0) {
// this.bindForm.warehouseId = this.stockInListSelected[0].warehouseId;
// }
this.bindOpen = true;
},
submitBind() {
this.$refs["bindForm"].validate(valid => {
if (valid) {
const data = {
stockinDetailId: this.bindData.stockinDetailId,
warehouseId: this.bindForm.warehouseId,
trayCode: this.bindForm.trayCode,
quantity: this.bindForm.quantity
};
bindTray(data).then(response => {
this.$modal.msgSuccess("绑定成功");
this.bindOpen = false;
this.getDetailList(this.bindData.stockinId);
});
}
});
},
cancelBind() {
this.bindOpen = false;
this.resetForm("bindForm");
},
/** 打印条码按钮操作 */
handleBarcodePrinting(row){
this.printData = this.stockInDetailListSelected

View File

@@ -0,0 +1,355 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="客户编号" prop="customerNo">
<el-input v-model="queryParams.customerNo" placeholder="请输入客户编号" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="客户名称" prop="customerName">
<el-input v-model="queryParams.customerName" placeholder="请输入客户名称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="简称" prop="simpleName">
<el-input v-model="queryParams.simpleName" placeholder="请输入简称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="是否可用" prop="useable">
<el-select v-model="queryParams.useable" placeholder="请选择是否可用" clearable>
<el-option
v-for="dict in dict.type.is_available"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" @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="['bas:BasCustomer: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="['bas:BasCustomer: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="['bas:BasCustomer: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="['bas:BasCustomer:export']">导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="BasCustomerList" @selection-change="handleSelectionChange" max-height="700">
<el-table-column type="selection" align="center" />
<el-table-column label="客户编号" align="left" prop="customerNo" />
<!-- <el-table-column label="客户类别" align="left" prop="customerGroupNo" /> -->
<el-table-column label="客户名称" align="left" prop="customerName" />
<el-table-column label="简称" align="left" prop="simpleName" />
<el-table-column label="是否可用" align="left" prop="useable" >
<template slot-scope="scope">
<dict-tag :options="dict.type.is_available" :value="scope.row.useable"/>
</template>
</el-table-column>
<el-table-column label="备注" align="left" prop="remark" />
<!-- <el-table-column width="120" label="业务部门" align="left" prop="businessDepartment" />
<el-table-column width="120" label="业务员" align="left" prop="salesman" />
<el-table-column width="120" label="助记码" align="left" prop="mnemonicCode" />
<el-table-column width="120" label="客户类型" align="left" prop="type" />
<el-table-column width="120" label="纳税人识别号" align="left" prop="taxpayerRegistrationNumber" />
<el-table-column width="120" label="财务组织" align="left" prop="organization" />
<el-table-column width="120" label="上级客户" align="left" prop="supCustomer" />
<el-table-column width="120" label="个人客户" align="left" prop="retailInvestor" />
<el-table-column width="120" label="国家/地区" align="left" prop="country" />
<el-table-column width="120" label="时区" align="left" prop="timeZone" />
<el-table-column width="120" label="数据格式" align="left" prop="dataFormat" />
<el-table-column width="120" label="联系人" align="left" prop="contactName" />
<el-table-column width="120" label="装运国家" align="left" prop="shipment" />
<el-table-column width="120" label="税种" align="left" prop="taxCategory" /> -->
<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="['bas:BasCustomer:edit']">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['bas:BasCustomer: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="80px">
<el-form-item label="客户编号" prop="customerNo">
<el-input v-model="form.customerNo" placeholder="请输入客户编号" />
</el-form-item>
<el-form-item label="客户名称" prop="customerName">
<el-input v-model="form.customerName" placeholder="请输入客户名称" />
</el-form-item>
<el-form-item label="简称" prop="simpleName">
<el-input v-model="form.simpleName" placeholder="请输入简称" />
</el-form-item>
<el-form-item label="是否可用" prop="useable">
<el-select v-model="form.useable" placeholder="请选择是否可用">
<el-option
v-for="dict in dict.type.is_available"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
<!-- <el-form-item label="业务部门" prop="businessDepartment">
<el-input v-model="form.businessDepartment" placeholder="请输入业务部门" />
</el-form-item>
<el-form-item label="业务员" prop="salesman">
<el-input v-model="form.salesman" placeholder="请输入业务员" />
</el-form-item>
<el-form-item label="助记码" prop="mnemonicCode">
<el-input v-model="form.mnemonicCode" placeholder="请输入助记码" />
</el-form-item>
<el-form-item label="客户类型" prop="type">
<el-input v-model="form.type" placeholder="请输入客户类型" />
</el-form-item>
<el-form-item label="纳税人识别号" prop="taxpayerRegistrationNumber">
<el-input v-model="form.taxpayerRegistrationNumber" placeholder="请输入纳税人识别号" />
</el-form-item>
<el-form-item label="财务组织" prop="organization">
<el-input v-model="form.organization" placeholder="请输入财务组织" />
</el-form-item>
<el-form-item label="上级客户" prop="supCustomer">
<el-input v-model="form.supCustomer" placeholder="请输入上级客户" />
</el-form-item>
<el-form-item label="个人客户" prop="retailInvestor">
<el-input v-model="form.retailInvestor" placeholder="请输入个人客户" />
</el-form-item>
<el-form-item label="国家/地区" prop="country">
<el-input v-model="form.country" placeholder="请输入国家/地区" />
</el-form-item>
<el-form-item label="时区" prop="timeZone">
<el-input v-model="form.timeZone" placeholder="请输入时区" />
</el-form-item>
<el-form-item label="数据格式" prop="dataFormat">
<el-input v-model="form.dataFormat" placeholder="请输入数据格式" />
</el-form-item>
<el-form-item label="联系人" prop="contactName">
<el-input v-model="form.contactName" placeholder="请输入联系人" />
</el-form-item>
<el-form-item label="装运国家" prop="shipment">
<el-input v-model="form.shipment" placeholder="请输入装运国家" />
</el-form-item>
<el-form-item label="税种" prop="taxCategory">
<el-input v-model="form.taxCategory" placeholder="请输入税种" />
</el-form-item> -->
</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 { listBasCustomer, getBasCustomer, delBasCustomer, addBasCustomer, updateBasCustomer } from "@/api/bas/BasCustomer"
export default {
name: "BasCustomer",
dicts:['is_available'],
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 客户管理表格数据
BasCustomerList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
customerNo: null,
customerGroupNo: null,
customerName: null,
simpleName: null,
useable: null,
businessDepartment: null,
salesman: null,
mnemonicCode: null,
type: null,
taxpayerRegistrationNumber: null,
organization: null,
supCustomer: null,
retailInvestor: null,
country: null,
timeZone: null,
dataFormat: null,
contactName: null,
shipment: null,
taxCategory: null
},
// 表单参数
form: {},
// 表单校验
rules: {
id: [
{ required: true, message: "ID不能为空", trigger: "blur" }
],
customerNo: [
{ required: true, message: "客户编号不能为空", trigger: "blur" }
],
customerName: [
{ required: true, message: "客户名称不能为空", trigger: "blur" }
],
useable: [
{ required: true, message: "是否可用不能为空", trigger: "blur" }
],
}
}
},
created() {
this.getList()
},
methods: {
/** 查询客户管理列表 */
getList() {
this.loading = true
listBasCustomer(this.queryParams).then(response => {
this.BasCustomerList = response.rows
this.total = response.total
this.loading = false
})
},
// 取消按钮
cancel() {
this.open = false
this.reset()
},
// 表单重置
reset() {
this.form = {
id: null,
customerNo: null,
customerGroupNo: null,
customerName: null,
simpleName: null,
useable: null,
remark: null,
businessDepartment: null,
salesman: null,
mnemonicCode: null,
type: null,
taxpayerRegistrationNumber: null,
organization: null,
supCustomer: null,
retailInvestor: null,
country: null,
timeZone: null,
dataFormat: null,
contactName: null,
shipment: null,
taxCategory: 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.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
getBasCustomer(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改客户"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateBasCustomer(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addBasCustomer(this.form).then(response => {
this.$modal.msgSuccess("添加成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除客户编号为"' + ids + '"的数据项?').then(function() {
return delBasCustomer(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('bas/BasCustomer/export', {
...this.queryParams
}, `BasCustomer_${new Date().getTime()}.xlsx`)
}
}
}
</script>
<style scoped>
/* 统一表单控件宽度 */
.el-select,
.el-input {
width: 100%;
}
</style>

View File

@@ -0,0 +1,355 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="客户编号" prop="customerNo">
<el-input v-model="queryParams.customerNo" placeholder="请输入客户编号" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="客户名称" prop="customerName">
<el-input v-model="queryParams.customerName" placeholder="请输入客户名称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="简称" prop="simpleName">
<el-input v-model="queryParams.simpleName" placeholder="请输入简称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="是否可用" prop="useable">
<el-select v-model="queryParams.useable" placeholder="请选择是否可用" clearable>
<el-option
v-for="dict in dict.type.is_available"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" @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="['bas:BasCustomer: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="['bas:BasCustomer: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="['bas:BasCustomer: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="['bas:BasCustomer:export']">导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="BasCustomerList" @selection-change="handleSelectionChange" max-height="700">
<el-table-column type="selection" align="center" />
<el-table-column label="客户编号" align="left" prop="customerNo" />
<!-- <el-table-column label="客户类别" align="left" prop="customerGroupNo" /> -->
<el-table-column label="客户名称" align="left" prop="customerName" />
<el-table-column label="简称" align="left" prop="simpleName" />
<el-table-column label="是否可用" align="left" prop="useable" >
<template slot-scope="scope">
<dict-tag :options="dict.type.is_available" :value="scope.row.useable"/>
</template>
</el-table-column>
<el-table-column label="备注" align="left" prop="remark" />
<!-- <el-table-column width="120" label="业务部门" align="left" prop="businessDepartment" />
<el-table-column width="120" label="业务员" align="left" prop="salesman" />
<el-table-column width="120" label="助记码" align="left" prop="mnemonicCode" />
<el-table-column width="120" label="客户类型" align="left" prop="type" />
<el-table-column width="120" label="纳税人识别号" align="left" prop="taxpayerRegistrationNumber" />
<el-table-column width="120" label="财务组织" align="left" prop="organization" />
<el-table-column width="120" label="上级客户" align="left" prop="supCustomer" />
<el-table-column width="120" label="个人客户" align="left" prop="retailInvestor" />
<el-table-column width="120" label="国家/地区" align="left" prop="country" />
<el-table-column width="120" label="时区" align="left" prop="timeZone" />
<el-table-column width="120" label="数据格式" align="left" prop="dataFormat" />
<el-table-column width="120" label="联系人" align="left" prop="contactName" />
<el-table-column width="120" label="装运国家" align="left" prop="shipment" />
<el-table-column width="120" label="税种" align="left" prop="taxCategory" /> -->
<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="['bas:BasCustomer:edit']">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['bas:BasCustomer: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="80px">
<el-form-item label="客户编号" prop="customerNo">
<el-input v-model="form.customerNo" placeholder="请输入客户编号" />
</el-form-item>
<el-form-item label="客户名称" prop="customerName">
<el-input v-model="form.customerName" placeholder="请输入客户名称" />
</el-form-item>
<el-form-item label="简称" prop="simpleName">
<el-input v-model="form.simpleName" placeholder="请输入简称" />
</el-form-item>
<el-form-item label="是否可用" prop="useable">
<el-select v-model="form.useable" placeholder="请选择是否可用">
<el-option
v-for="dict in dict.type.is_available"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
<!-- <el-form-item label="业务部门" prop="businessDepartment">
<el-input v-model="form.businessDepartment" placeholder="请输入业务部门" />
</el-form-item>
<el-form-item label="业务员" prop="salesman">
<el-input v-model="form.salesman" placeholder="请输入业务员" />
</el-form-item>
<el-form-item label="助记码" prop="mnemonicCode">
<el-input v-model="form.mnemonicCode" placeholder="请输入助记码" />
</el-form-item>
<el-form-item label="客户类型" prop="type">
<el-input v-model="form.type" placeholder="请输入客户类型" />
</el-form-item>
<el-form-item label="纳税人识别号" prop="taxpayerRegistrationNumber">
<el-input v-model="form.taxpayerRegistrationNumber" placeholder="请输入纳税人识别号" />
</el-form-item>
<el-form-item label="财务组织" prop="organization">
<el-input v-model="form.organization" placeholder="请输入财务组织" />
</el-form-item>
<el-form-item label="上级客户" prop="supCustomer">
<el-input v-model="form.supCustomer" placeholder="请输入上级客户" />
</el-form-item>
<el-form-item label="个人客户" prop="retailInvestor">
<el-input v-model="form.retailInvestor" placeholder="请输入个人客户" />
</el-form-item>
<el-form-item label="国家/地区" prop="country">
<el-input v-model="form.country" placeholder="请输入国家/地区" />
</el-form-item>
<el-form-item label="时区" prop="timeZone">
<el-input v-model="form.timeZone" placeholder="请输入时区" />
</el-form-item>
<el-form-item label="数据格式" prop="dataFormat">
<el-input v-model="form.dataFormat" placeholder="请输入数据格式" />
</el-form-item>
<el-form-item label="联系人" prop="contactName">
<el-input v-model="form.contactName" placeholder="请输入联系人" />
</el-form-item>
<el-form-item label="装运国家" prop="shipment">
<el-input v-model="form.shipment" placeholder="请输入装运国家" />
</el-form-item>
<el-form-item label="税种" prop="taxCategory">
<el-input v-model="form.taxCategory" placeholder="请输入税种" />
</el-form-item> -->
</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 { listBasCustomer, getBasCustomer, delBasCustomer, addBasCustomer, updateBasCustomer } from "@/api/bas/BasCustomer"
export default {
name: "BasCustomer",
dicts:['is_available'],
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 客户管理表格数据
BasCustomerList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
customerNo: null,
customerGroupNo: null,
customerName: null,
simpleName: null,
useable: null,
businessDepartment: null,
salesman: null,
mnemonicCode: null,
type: null,
taxpayerRegistrationNumber: null,
organization: null,
supCustomer: null,
retailInvestor: null,
country: null,
timeZone: null,
dataFormat: null,
contactName: null,
shipment: null,
taxCategory: null
},
// 表单参数
form: {},
// 表单校验
rules: {
id: [
{ required: true, message: "ID不能为空", trigger: "blur" }
],
customerNo: [
{ required: true, message: "客户编号不能为空", trigger: "blur" }
],
customerName: [
{ required: true, message: "客户名称不能为空", trigger: "blur" }
],
useable: [
{ required: true, message: "是否可用不能为空", trigger: "blur" }
],
}
}
},
created() {
this.getList()
},
methods: {
/** 查询客户管理列表 */
getList() {
this.loading = true
listBasCustomer(this.queryParams).then(response => {
this.BasCustomerList = response.rows
this.total = response.total
this.loading = false
})
},
// 取消按钮
cancel() {
this.open = false
this.reset()
},
// 表单重置
reset() {
this.form = {
id: null,
customerNo: null,
customerGroupNo: null,
customerName: null,
simpleName: null,
useable: null,
remark: null,
businessDepartment: null,
salesman: null,
mnemonicCode: null,
type: null,
taxpayerRegistrationNumber: null,
organization: null,
supCustomer: null,
retailInvestor: null,
country: null,
timeZone: null,
dataFormat: null,
contactName: null,
shipment: null,
taxCategory: 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.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
getBasCustomer(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改客户"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateBasCustomer(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addBasCustomer(this.form).then(response => {
this.$modal.msgSuccess("添加成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除客户编号为"' + ids + '"的数据项?').then(function() {
return delBasCustomer(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('bas/BasCustomer/export', {
...this.queryParams
}, `BasCustomer_${new Date().getTime()}.xlsx`)
}
}
}
</script>
<style scoped>
/* 统一表单控件宽度 */
.el-select,
.el-input {
width: 100%;
}
</style>

View File

@@ -0,0 +1,355 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="客户编号" prop="customerNo">
<el-input v-model="queryParams.customerNo" placeholder="请输入客户编号" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="客户名称" prop="customerName">
<el-input v-model="queryParams.customerName" placeholder="请输入客户名称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="简称" prop="simpleName">
<el-input v-model="queryParams.simpleName" placeholder="请输入简称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="是否可用" prop="useable">
<el-select v-model="queryParams.useable" placeholder="请选择是否可用" clearable>
<el-option
v-for="dict in dict.type.is_available"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" @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="['bas:BasCustomer: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="['bas:BasCustomer: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="['bas:BasCustomer: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="['bas:BasCustomer:export']">导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="BasCustomerList" @selection-change="handleSelectionChange" max-height="700">
<el-table-column type="selection" align="center" />
<el-table-column label="客户编号" align="left" prop="customerNo" />
<!-- <el-table-column label="客户类别" align="left" prop="customerGroupNo" /> -->
<el-table-column label="客户名称" align="left" prop="customerName" />
<el-table-column label="简称" align="left" prop="simpleName" />
<el-table-column label="是否可用" align="left" prop="useable" >
<template slot-scope="scope">
<dict-tag :options="dict.type.is_available" :value="scope.row.useable"/>
</template>
</el-table-column>
<el-table-column label="备注" align="left" prop="remark" />
<!-- <el-table-column width="120" label="业务部门" align="left" prop="businessDepartment" />
<el-table-column width="120" label="业务员" align="left" prop="salesman" />
<el-table-column width="120" label="助记码" align="left" prop="mnemonicCode" />
<el-table-column width="120" label="客户类型" align="left" prop="type" />
<el-table-column width="120" label="纳税人识别号" align="left" prop="taxpayerRegistrationNumber" />
<el-table-column width="120" label="财务组织" align="left" prop="organization" />
<el-table-column width="120" label="上级客户" align="left" prop="supCustomer" />
<el-table-column width="120" label="个人客户" align="left" prop="retailInvestor" />
<el-table-column width="120" label="国家/地区" align="left" prop="country" />
<el-table-column width="120" label="时区" align="left" prop="timeZone" />
<el-table-column width="120" label="数据格式" align="left" prop="dataFormat" />
<el-table-column width="120" label="联系人" align="left" prop="contactName" />
<el-table-column width="120" label="装运国家" align="left" prop="shipment" />
<el-table-column width="120" label="税种" align="left" prop="taxCategory" /> -->
<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="['bas:BasCustomer:edit']">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['bas:BasCustomer: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="80px">
<el-form-item label="客户编号" prop="customerNo">
<el-input v-model="form.customerNo" placeholder="请输入客户编号" />
</el-form-item>
<el-form-item label="客户名称" prop="customerName">
<el-input v-model="form.customerName" placeholder="请输入客户名称" />
</el-form-item>
<el-form-item label="简称" prop="simpleName">
<el-input v-model="form.simpleName" placeholder="请输入简称" />
</el-form-item>
<el-form-item label="是否可用" prop="useable">
<el-select v-model="form.useable" placeholder="请选择是否可用">
<el-option
v-for="dict in dict.type.is_available"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
<!-- <el-form-item label="业务部门" prop="businessDepartment">
<el-input v-model="form.businessDepartment" placeholder="请输入业务部门" />
</el-form-item>
<el-form-item label="业务员" prop="salesman">
<el-input v-model="form.salesman" placeholder="请输入业务员" />
</el-form-item>
<el-form-item label="助记码" prop="mnemonicCode">
<el-input v-model="form.mnemonicCode" placeholder="请输入助记码" />
</el-form-item>
<el-form-item label="客户类型" prop="type">
<el-input v-model="form.type" placeholder="请输入客户类型" />
</el-form-item>
<el-form-item label="纳税人识别号" prop="taxpayerRegistrationNumber">
<el-input v-model="form.taxpayerRegistrationNumber" placeholder="请输入纳税人识别号" />
</el-form-item>
<el-form-item label="财务组织" prop="organization">
<el-input v-model="form.organization" placeholder="请输入财务组织" />
</el-form-item>
<el-form-item label="上级客户" prop="supCustomer">
<el-input v-model="form.supCustomer" placeholder="请输入上级客户" />
</el-form-item>
<el-form-item label="个人客户" prop="retailInvestor">
<el-input v-model="form.retailInvestor" placeholder="请输入个人客户" />
</el-form-item>
<el-form-item label="国家/地区" prop="country">
<el-input v-model="form.country" placeholder="请输入国家/地区" />
</el-form-item>
<el-form-item label="时区" prop="timeZone">
<el-input v-model="form.timeZone" placeholder="请输入时区" />
</el-form-item>
<el-form-item label="数据格式" prop="dataFormat">
<el-input v-model="form.dataFormat" placeholder="请输入数据格式" />
</el-form-item>
<el-form-item label="联系人" prop="contactName">
<el-input v-model="form.contactName" placeholder="请输入联系人" />
</el-form-item>
<el-form-item label="装运国家" prop="shipment">
<el-input v-model="form.shipment" placeholder="请输入装运国家" />
</el-form-item>
<el-form-item label="税种" prop="taxCategory">
<el-input v-model="form.taxCategory" placeholder="请输入税种" />
</el-form-item> -->
</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 { listBasCustomer, getBasCustomer, delBasCustomer, addBasCustomer, updateBasCustomer } from "@/api/bas/BasCustomer"
export default {
name: "BasCustomer",
dicts:['is_available'],
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 客户管理表格数据
BasCustomerList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
customerNo: null,
customerGroupNo: null,
customerName: null,
simpleName: null,
useable: null,
businessDepartment: null,
salesman: null,
mnemonicCode: null,
type: null,
taxpayerRegistrationNumber: null,
organization: null,
supCustomer: null,
retailInvestor: null,
country: null,
timeZone: null,
dataFormat: null,
contactName: null,
shipment: null,
taxCategory: null
},
// 表单参数
form: {},
// 表单校验
rules: {
id: [
{ required: true, message: "ID不能为空", trigger: "blur" }
],
customerNo: [
{ required: true, message: "客户编号不能为空", trigger: "blur" }
],
customerName: [
{ required: true, message: "客户名称不能为空", trigger: "blur" }
],
useable: [
{ required: true, message: "是否可用不能为空", trigger: "blur" }
],
}
}
},
created() {
this.getList()
},
methods: {
/** 查询客户管理列表 */
getList() {
this.loading = true
listBasCustomer(this.queryParams).then(response => {
this.BasCustomerList = response.rows
this.total = response.total
this.loading = false
})
},
// 取消按钮
cancel() {
this.open = false
this.reset()
},
// 表单重置
reset() {
this.form = {
id: null,
customerNo: null,
customerGroupNo: null,
customerName: null,
simpleName: null,
useable: null,
remark: null,
businessDepartment: null,
salesman: null,
mnemonicCode: null,
type: null,
taxpayerRegistrationNumber: null,
organization: null,
supCustomer: null,
retailInvestor: null,
country: null,
timeZone: null,
dataFormat: null,
contactName: null,
shipment: null,
taxCategory: 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.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
getBasCustomer(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改客户"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateBasCustomer(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addBasCustomer(this.form).then(response => {
this.$modal.msgSuccess("添加成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除客户编号为"' + ids + '"的数据项?').then(function() {
return delBasCustomer(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('bas/BasCustomer/export', {
...this.queryParams
}, `BasCustomer_${new Date().getTime()}.xlsx`)
}
}
}
</script>
<style scoped>
/* 统一表单控件宽度 */
.el-select,
.el-input {
width: 100%;
}
</style>

View File

@@ -0,0 +1,355 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="客户编号" prop="customerNo">
<el-input v-model="queryParams.customerNo" placeholder="请输入客户编号" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="客户名称" prop="customerName">
<el-input v-model="queryParams.customerName" placeholder="请输入客户名称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="简称" prop="simpleName">
<el-input v-model="queryParams.simpleName" placeholder="请输入简称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="是否可用" prop="useable">
<el-select v-model="queryParams.useable" placeholder="请选择是否可用" clearable>
<el-option
v-for="dict in dict.type.is_available"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" @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="['bas:BasCustomer: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="['bas:BasCustomer: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="['bas:BasCustomer: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="['bas:BasCustomer:export']">导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="BasCustomerList" @selection-change="handleSelectionChange" max-height="700">
<el-table-column type="selection" align="center" />
<el-table-column label="客户编号" align="left" prop="customerNo" />
<!-- <el-table-column label="客户类别" align="left" prop="customerGroupNo" /> -->
<el-table-column label="客户名称" align="left" prop="customerName" />
<el-table-column label="简称" align="left" prop="simpleName" />
<el-table-column label="是否可用" align="left" prop="useable" >
<template slot-scope="scope">
<dict-tag :options="dict.type.is_available" :value="scope.row.useable"/>
</template>
</el-table-column>
<el-table-column label="备注" align="left" prop="remark" />
<!-- <el-table-column width="120" label="业务部门" align="left" prop="businessDepartment" />
<el-table-column width="120" label="业务员" align="left" prop="salesman" />
<el-table-column width="120" label="助记码" align="left" prop="mnemonicCode" />
<el-table-column width="120" label="客户类型" align="left" prop="type" />
<el-table-column width="120" label="纳税人识别号" align="left" prop="taxpayerRegistrationNumber" />
<el-table-column width="120" label="财务组织" align="left" prop="organization" />
<el-table-column width="120" label="上级客户" align="left" prop="supCustomer" />
<el-table-column width="120" label="个人客户" align="left" prop="retailInvestor" />
<el-table-column width="120" label="国家/地区" align="left" prop="country" />
<el-table-column width="120" label="时区" align="left" prop="timeZone" />
<el-table-column width="120" label="数据格式" align="left" prop="dataFormat" />
<el-table-column width="120" label="联系人" align="left" prop="contactName" />
<el-table-column width="120" label="装运国家" align="left" prop="shipment" />
<el-table-column width="120" label="税种" align="left" prop="taxCategory" /> -->
<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="['bas:BasCustomer:edit']">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['bas:BasCustomer: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="80px">
<el-form-item label="客户编号" prop="customerNo">
<el-input v-model="form.customerNo" placeholder="请输入客户编号" />
</el-form-item>
<el-form-item label="客户名称" prop="customerName">
<el-input v-model="form.customerName" placeholder="请输入客户名称" />
</el-form-item>
<el-form-item label="简称" prop="simpleName">
<el-input v-model="form.simpleName" placeholder="请输入简称" />
</el-form-item>
<el-form-item label="是否可用" prop="useable">
<el-select v-model="form.useable" placeholder="请选择是否可用">
<el-option
v-for="dict in dict.type.is_available"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
<!-- <el-form-item label="业务部门" prop="businessDepartment">
<el-input v-model="form.businessDepartment" placeholder="请输入业务部门" />
</el-form-item>
<el-form-item label="业务员" prop="salesman">
<el-input v-model="form.salesman" placeholder="请输入业务员" />
</el-form-item>
<el-form-item label="助记码" prop="mnemonicCode">
<el-input v-model="form.mnemonicCode" placeholder="请输入助记码" />
</el-form-item>
<el-form-item label="客户类型" prop="type">
<el-input v-model="form.type" placeholder="请输入客户类型" />
</el-form-item>
<el-form-item label="纳税人识别号" prop="taxpayerRegistrationNumber">
<el-input v-model="form.taxpayerRegistrationNumber" placeholder="请输入纳税人识别号" />
</el-form-item>
<el-form-item label="财务组织" prop="organization">
<el-input v-model="form.organization" placeholder="请输入财务组织" />
</el-form-item>
<el-form-item label="上级客户" prop="supCustomer">
<el-input v-model="form.supCustomer" placeholder="请输入上级客户" />
</el-form-item>
<el-form-item label="个人客户" prop="retailInvestor">
<el-input v-model="form.retailInvestor" placeholder="请输入个人客户" />
</el-form-item>
<el-form-item label="国家/地区" prop="country">
<el-input v-model="form.country" placeholder="请输入国家/地区" />
</el-form-item>
<el-form-item label="时区" prop="timeZone">
<el-input v-model="form.timeZone" placeholder="请输入时区" />
</el-form-item>
<el-form-item label="数据格式" prop="dataFormat">
<el-input v-model="form.dataFormat" placeholder="请输入数据格式" />
</el-form-item>
<el-form-item label="联系人" prop="contactName">
<el-input v-model="form.contactName" placeholder="请输入联系人" />
</el-form-item>
<el-form-item label="装运国家" prop="shipment">
<el-input v-model="form.shipment" placeholder="请输入装运国家" />
</el-form-item>
<el-form-item label="税种" prop="taxCategory">
<el-input v-model="form.taxCategory" placeholder="请输入税种" />
</el-form-item> -->
</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 { listBasCustomer, getBasCustomer, delBasCustomer, addBasCustomer, updateBasCustomer } from "@/api/bas/BasCustomer"
export default {
name: "BasCustomer",
dicts:['is_available'],
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 客户管理表格数据
BasCustomerList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
customerNo: null,
customerGroupNo: null,
customerName: null,
simpleName: null,
useable: null,
businessDepartment: null,
salesman: null,
mnemonicCode: null,
type: null,
taxpayerRegistrationNumber: null,
organization: null,
supCustomer: null,
retailInvestor: null,
country: null,
timeZone: null,
dataFormat: null,
contactName: null,
shipment: null,
taxCategory: null
},
// 表单参数
form: {},
// 表单校验
rules: {
id: [
{ required: true, message: "ID不能为空", trigger: "blur" }
],
customerNo: [
{ required: true, message: "客户编号不能为空", trigger: "blur" }
],
customerName: [
{ required: true, message: "客户名称不能为空", trigger: "blur" }
],
useable: [
{ required: true, message: "是否可用不能为空", trigger: "blur" }
],
}
}
},
created() {
this.getList()
},
methods: {
/** 查询客户管理列表 */
getList() {
this.loading = true
listBasCustomer(this.queryParams).then(response => {
this.BasCustomerList = response.rows
this.total = response.total
this.loading = false
})
},
// 取消按钮
cancel() {
this.open = false
this.reset()
},
// 表单重置
reset() {
this.form = {
id: null,
customerNo: null,
customerGroupNo: null,
customerName: null,
simpleName: null,
useable: null,
remark: null,
businessDepartment: null,
salesman: null,
mnemonicCode: null,
type: null,
taxpayerRegistrationNumber: null,
organization: null,
supCustomer: null,
retailInvestor: null,
country: null,
timeZone: null,
dataFormat: null,
contactName: null,
shipment: null,
taxCategory: 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.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
getBasCustomer(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改客户"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateBasCustomer(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addBasCustomer(this.form).then(response => {
this.$modal.msgSuccess("添加成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除客户编号为"' + ids + '"的数据项?').then(function() {
return delBasCustomer(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('bas/BasCustomer/export', {
...this.queryParams
}, `BasCustomer_${new Date().getTime()}.xlsx`)
}
}
}
</script>
<style scoped>
/* 统一表单控件宽度 */
.el-select,
.el-input {
width: 100%;
}
</style>

View File

@@ -0,0 +1,355 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="客户编号" prop="customerNo">
<el-input v-model="queryParams.customerNo" placeholder="请输入客户编号" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="客户名称" prop="customerName">
<el-input v-model="queryParams.customerName" placeholder="请输入客户名称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="简称" prop="simpleName">
<el-input v-model="queryParams.simpleName" placeholder="请输入简称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="是否可用" prop="useable">
<el-select v-model="queryParams.useable" placeholder="请选择是否可用" clearable>
<el-option
v-for="dict in dict.type.is_available"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" @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="['bas:BasCustomer: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="['bas:BasCustomer: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="['bas:BasCustomer: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="['bas:BasCustomer:export']">导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="BasCustomerList" @selection-change="handleSelectionChange" max-height="700">
<el-table-column type="selection" align="center" />
<el-table-column label="客户编号" align="left" prop="customerNo" />
<!-- <el-table-column label="客户类别" align="left" prop="customerGroupNo" /> -->
<el-table-column label="客户名称" align="left" prop="customerName" />
<el-table-column label="简称" align="left" prop="simpleName" />
<el-table-column label="是否可用" align="left" prop="useable" >
<template slot-scope="scope">
<dict-tag :options="dict.type.is_available" :value="scope.row.useable"/>
</template>
</el-table-column>
<el-table-column label="备注" align="left" prop="remark" />
<!-- <el-table-column width="120" label="业务部门" align="left" prop="businessDepartment" />
<el-table-column width="120" label="业务员" align="left" prop="salesman" />
<el-table-column width="120" label="助记码" align="left" prop="mnemonicCode" />
<el-table-column width="120" label="客户类型" align="left" prop="type" />
<el-table-column width="120" label="纳税人识别号" align="left" prop="taxpayerRegistrationNumber" />
<el-table-column width="120" label="财务组织" align="left" prop="organization" />
<el-table-column width="120" label="上级客户" align="left" prop="supCustomer" />
<el-table-column width="120" label="个人客户" align="left" prop="retailInvestor" />
<el-table-column width="120" label="国家/地区" align="left" prop="country" />
<el-table-column width="120" label="时区" align="left" prop="timeZone" />
<el-table-column width="120" label="数据格式" align="left" prop="dataFormat" />
<el-table-column width="120" label="联系人" align="left" prop="contactName" />
<el-table-column width="120" label="装运国家" align="left" prop="shipment" />
<el-table-column width="120" label="税种" align="left" prop="taxCategory" /> -->
<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="['bas:BasCustomer:edit']">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['bas:BasCustomer: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="80px">
<el-form-item label="客户编号" prop="customerNo">
<el-input v-model="form.customerNo" placeholder="请输入客户编号" />
</el-form-item>
<el-form-item label="客户名称" prop="customerName">
<el-input v-model="form.customerName" placeholder="请输入客户名称" />
</el-form-item>
<el-form-item label="简称" prop="simpleName">
<el-input v-model="form.simpleName" placeholder="请输入简称" />
</el-form-item>
<el-form-item label="是否可用" prop="useable">
<el-select v-model="form.useable" placeholder="请选择是否可用">
<el-option
v-for="dict in dict.type.is_available"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
<!-- <el-form-item label="业务部门" prop="businessDepartment">
<el-input v-model="form.businessDepartment" placeholder="请输入业务部门" />
</el-form-item>
<el-form-item label="业务员" prop="salesman">
<el-input v-model="form.salesman" placeholder="请输入业务员" />
</el-form-item>
<el-form-item label="助记码" prop="mnemonicCode">
<el-input v-model="form.mnemonicCode" placeholder="请输入助记码" />
</el-form-item>
<el-form-item label="客户类型" prop="type">
<el-input v-model="form.type" placeholder="请输入客户类型" />
</el-form-item>
<el-form-item label="纳税人识别号" prop="taxpayerRegistrationNumber">
<el-input v-model="form.taxpayerRegistrationNumber" placeholder="请输入纳税人识别号" />
</el-form-item>
<el-form-item label="财务组织" prop="organization">
<el-input v-model="form.organization" placeholder="请输入财务组织" />
</el-form-item>
<el-form-item label="上级客户" prop="supCustomer">
<el-input v-model="form.supCustomer" placeholder="请输入上级客户" />
</el-form-item>
<el-form-item label="个人客户" prop="retailInvestor">
<el-input v-model="form.retailInvestor" placeholder="请输入个人客户" />
</el-form-item>
<el-form-item label="国家/地区" prop="country">
<el-input v-model="form.country" placeholder="请输入国家/地区" />
</el-form-item>
<el-form-item label="时区" prop="timeZone">
<el-input v-model="form.timeZone" placeholder="请输入时区" />
</el-form-item>
<el-form-item label="数据格式" prop="dataFormat">
<el-input v-model="form.dataFormat" placeholder="请输入数据格式" />
</el-form-item>
<el-form-item label="联系人" prop="contactName">
<el-input v-model="form.contactName" placeholder="请输入联系人" />
</el-form-item>
<el-form-item label="装运国家" prop="shipment">
<el-input v-model="form.shipment" placeholder="请输入装运国家" />
</el-form-item>
<el-form-item label="税种" prop="taxCategory">
<el-input v-model="form.taxCategory" placeholder="请输入税种" />
</el-form-item> -->
</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 { listBasCustomer, getBasCustomer, delBasCustomer, addBasCustomer, updateBasCustomer } from "@/api/bas/BasCustomer"
export default {
name: "BasCustomer",
dicts:['is_available'],
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 客户管理表格数据
BasCustomerList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
customerNo: null,
customerGroupNo: null,
customerName: null,
simpleName: null,
useable: null,
businessDepartment: null,
salesman: null,
mnemonicCode: null,
type: null,
taxpayerRegistrationNumber: null,
organization: null,
supCustomer: null,
retailInvestor: null,
country: null,
timeZone: null,
dataFormat: null,
contactName: null,
shipment: null,
taxCategory: null
},
// 表单参数
form: {},
// 表单校验
rules: {
id: [
{ required: true, message: "ID不能为空", trigger: "blur" }
],
customerNo: [
{ required: true, message: "客户编号不能为空", trigger: "blur" }
],
customerName: [
{ required: true, message: "客户名称不能为空", trigger: "blur" }
],
useable: [
{ required: true, message: "是否可用不能为空", trigger: "blur" }
],
}
}
},
created() {
this.getList()
},
methods: {
/** 查询客户管理列表 */
getList() {
this.loading = true
listBasCustomer(this.queryParams).then(response => {
this.BasCustomerList = response.rows
this.total = response.total
this.loading = false
})
},
// 取消按钮
cancel() {
this.open = false
this.reset()
},
// 表单重置
reset() {
this.form = {
id: null,
customerNo: null,
customerGroupNo: null,
customerName: null,
simpleName: null,
useable: null,
remark: null,
businessDepartment: null,
salesman: null,
mnemonicCode: null,
type: null,
taxpayerRegistrationNumber: null,
organization: null,
supCustomer: null,
retailInvestor: null,
country: null,
timeZone: null,
dataFormat: null,
contactName: null,
shipment: null,
taxCategory: 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.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
getBasCustomer(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改客户"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateBasCustomer(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addBasCustomer(this.form).then(response => {
this.$modal.msgSuccess("添加成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除客户编号为"' + ids + '"的数据项?').then(function() {
return delBasCustomer(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('bas/BasCustomer/export', {
...this.queryParams
}, `BasCustomer_${new Date().getTime()}.xlsx`)
}
}
}
</script>
<style scoped>
/* 统一表单控件宽度 */
.el-select,
.el-input {
width: 100%;
}
</style>

View File

@@ -392,13 +392,13 @@
<dict-tag :options="dict.type.product_type" :value="scope.row.productType"/>
</template>
</el-table-column>
<el-table-column label="是否系统项" align="center" prop="systemItem">
<el-table-column label="是否系统项" align="center" prop="systemItem" width="160">
<template slot-scope="scope">
<dict-tag :options="dict.type.sys_yes_no" :value="scope.row.systemItem"/>
</template>
</el-table-column>
<el-table-column label="物料创建时间" align="center" prop="productCtm" width="160" />
<el-table-column label="物料创建人" align="center" prop="productCtu" />
<el-table-column label="创建时间" align="center" prop="productCtm" width="160" />
<el-table-column label="创建人" align="center" prop="productCtu" />
<el-table-column label="库存上限" align="center" prop="upperNum" />
<el-table-column label="库存下限" align="center" prop="limitNum" />
<el-table-column label="是否可用" align="center" prop="enableFlag">
@@ -436,7 +436,7 @@
</template>
</el-table-column>
<el-table-column label="管理号" align="center" prop="managementNo" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
@@ -453,7 +453,7 @@
v-hasPermi="['search:ViewOutJobFlow:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table-column>-->
</el-table>
<pagination