| | |
| | | <template> |
| | | <view class="has-foot"> |
| | | <view> |
| | | |
| | | <form> |
| | | <view class="cu-form-group margin-top"> |
| | | <view class="title">订单号</view> |
| | | <input placeholder="请输入订单号" v-model="asnCode"></input> |
| | | <!-- <text class='cuIcon-search text-blue' @click="search"></text> --> |
| | | </view> |
| | | <view class="cu-form-group"> |
| | | <view class="title">容器号</view> |
| | | <input placeholder="请扫描容器编码" v-model="container" @input="getList" focus></input> |
| | | <!-- <text class='cuIcon-search text-blue' @click="getList"></text> --> |
| | | </view> |
| | | <view class="cu-form-group"> |
| | | <view class="title">物料号</view> |
| | | <input placeholder="请扫描物料编码" v-model="matnrCode"></input> |
| | | <text class='cuIcon-search text-blue' @click="search"></text> |
| | | </view> |
| | | </form> |
| | | <form> |
| | | <view class="cu-form-group margin-top"> |
| | | <view class="title">订单号</view> |
| | | <input |
| | | placeholder="请输入订单号" |
| | | v-model="asnCode" |
| | | /> |
| | | <!-- <text class='cuIcon-search text-blue' @click="search"></text> --> |
| | | </view> |
| | | <view class="cu-form-group"> |
| | | <view class="title">容器号</view> |
| | | <input |
| | | placeholder="请扫描容器编码" |
| | | v-model="container" |
| | | @input="getList" |
| | | focus |
| | | /> |
| | | <!-- <text class='cuIcon-search text-blue' @click="getList"></text> --> |
| | | </view> |
| | | <view class="cu-form-group"> |
| | | <view class="title">物料号</view> |
| | | <input |
| | | placeholder="请扫描物料编码" |
| | | v-model="matnrCode" |
| | | /> |
| | | <text |
| | | class="cuIcon-search text-blue" |
| | | @click="search" |
| | | ></text> |
| | | </view> |
| | | </form> |
| | | |
| | | <view class="flex solid-bottom padding-sm justify-between"> |
| | | <view class="text-blue">物料种类:{{list.length}}</view> |
| | | <view class="text-blue">组托总数:{{allCount}}</view> |
| | | </view> |
| | | |
| | | <view class="flex solid-bottom padding-sm justify-between"> |
| | | <view class="text-blue">物料种类:{{ list.length }}</view> |
| | | <view class="text-blue">组托总数:{{ allCount }}</view> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="padding-lr margin-top-sm" style="padding-bottom: 120upx;"> |
| | | <block v-for="(item, index) in list" :key="index"> |
| | | <view class="cu-list det menu sm-border margin-bottom-sm " :class="[item.trackCode===barcode&&'act']" |
| | | :ref="item.trackCode+'ref'"> |
| | | <view class="cu-bar bg-white solid-bottom "> |
| | | <view |
| | | class="padding-lr margin-top-sm" |
| | | style="padding-bottom: 120upx" |
| | | > |
| | | <block |
| | | v-for="(item, index) in list" |
| | | :key="index" |
| | | > |
| | | <view |
| | | class="cu-list det menu sm-border margin-bottom-sm" |
| | | :class="[item.trackCode === barcode && 'act']" |
| | | :ref="item.trackCode + 'ref'" |
| | | > |
| | | <view class="cu-bar bg-white solid-bottom"> |
| | | <view class="action"> |
| | | <view class="index"> |
| | | {{index+1}} |
| | | {{ index + 1 }} |
| | | </view> |
| | | <view class="text-blue"> |
| | | 编码: |
| | | {{`${item.matnrCode}`}} |
| | | {{ `${item.matnrCode}` }} |
| | | </view> |
| | | </view> |
| | | <view class="action" v-if="!isconfirm"> |
| | | <text @click="remove(index)" class="cuIcon-close text-red" style="font-size: 24px;"></text> |
| | | <view |
| | | class="action" |
| | | v-if="!isconfirm" |
| | | > |
| | | <text |
| | | @click="remove(index)" |
| | | class="cuIcon-close text-red" |
| | | style="font-size: 24px" |
| | | ></text> |
| | | </view> |
| | | </view> |
| | | <view class="cu-item"> |
| | | <view class="content"> |
| | | <text class="text-black">物料编码:</text> |
| | | <text class="text-grey ">{{item.maktx}}</text> |
| | | <text class="text-black">物料名称:</text> |
| | | <text class="text-grey">{{ item.maktx }}</text> |
| | | </view> |
| | | </view> |
| | | <view class="cu-item"> |
| | |
| | | <text class="text-black">单号:</text> |
| | | </view> |
| | | <view class="action"> |
| | | <text class="text-grey ">{{item.asnCode}}</text> |
| | | </view> |
| | | </view> |
| | | <view class="cu-item"> |
| | | <view class="content"> |
| | | <text class="text-black">供应商批次:</text> |
| | | </view> |
| | | <view class="action"> |
| | | <text class="text-grey ">{{item.splrBatch}}</text> |
| | | <text class="text-grey">{{ item.asnCode }}</text> |
| | | </view> |
| | | </view> |
| | | <!-- <view class="cu-item"> |
| | | <view class="content"> |
| | | <text class="text-black">质检结果: <text class="text-grey ">{{item.inspect}}</text></text> |
| | | </view> |
| | | </view> --> |
| | | <!-- <view class="cu-item"> |
| | | <view class="content"> |
| | | <text class="text-black">平台行号: <text class="text-grey ">{{item.platformId}}</text></text> |
| | | </view> |
| | | <view class="content"> |
| | | <text class="text-black">质检结果: <text class="text-grey ">{{item.inspect}}</text></text> |
| | | </view> |
| | | </view> --> |
| | | |
| | | <view class="cu-item"> |
| | | <view class="content"> |
| | | <text class="text-black">库存单位: <text class="text-grey ">{{item.stockUnit}}</text></text> |
| | | <text class="text-black">跟踪号:</text> |
| | | </view> |
| | | <view class="action"> |
| | | <text class="text-grey">{{ item.platWorkCode }}</text> |
| | | </view> |
| | | </view> |
| | | <view class="cu-item"> |
| | | <view class="content"> |
| | | <text class="text-black">批次:</text> |
| | | </view> |
| | | <view class="action"> |
| | | <text class="text-grey">{{ item.splrBatch }}</text> |
| | | </view> |
| | | </view> |
| | | <view class="cu-item"> |
| | | <view class="content"> |
| | | <text class="text-black"> |
| | | 单位: |
| | | <text class="text-grey"> |
| | | {{ item.stockUnit }} |
| | | </text> |
| | | </text> |
| | | </view> |
| | | <view class="content"> |
| | | <text class="text-black">收货数量: <text class="text-grey ">{{item.anfme}}</text></text> |
| | | <text class="text-black"> |
| | | 收货数量: |
| | | <text class="text-grey">{{ item.anfme }}</text> |
| | | </text> |
| | | </view> |
| | | <!-- <view class="content"> |
| | | <text class="text-black">已上架数量: <text |
| | |
| | | </view> |
| | | <view class="cu-item"> |
| | | <view class="content"> |
| | | <text class="text-black">可组盘数量: <text |
| | | class="text-grey ">{{item.ableQty}}</text></text> |
| | | <text class="text-black"> |
| | | 可组盘数量: |
| | | <text class="text-grey"> |
| | | {{ item.ableQty }} |
| | | </text> |
| | | </text> |
| | | </view> |
| | | |
| | | </view> |
| | | <view class="cu-item"> |
| | | <view class="cu-item"> |
| | | <view class="content"> |
| | | <view class="cu-form-group padding-lr-0"> |
| | | <view class="title text-blue"><text |
| | | class="text-red text-xl vertical-middle">*</text>组盘数量: |
| | | <view class="title text-blue"> |
| | | <text |
| | | class="text-red text-xl vertical-middle" |
| | | > |
| | | * |
| | | </text> |
| | | 组盘数量: |
| | | </view> |
| | | <uni-number-box style="width: 70%;" :min="0" :max="item.ableQty" :decimal="2" :step="0.01" v-model="item.receiptQty" |
| | | ></uni-number-box> |
| | | <uni-number-box |
| | | style="width: 70%" |
| | | :min="0" |
| | | :max="item.ableQty" |
| | | :decimal="2" |
| | | :step="0.01" |
| | | v-model="item.receiptQty" |
| | | ></uni-number-box> |
| | | </view> |
| | | </view> |
| | | </view> |
| | |
| | | </block> |
| | | </view> |
| | | <view class="cu-bar btn-group foot"> |
| | | <button v-if="hasButtonPermission('reset')" class="cu-btn text-blue line-blue shadow" @click="clear">清空</button> |
| | | <button v-if="hasButtonPermission('submit')" class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="confirm">组托</button> |
| | | <button v-if="hasButtonPermission('submitNoJudge')" class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="confirm2">组托</button> |
| | | <button |
| | | v-if="hasButtonPermission('reset')" |
| | | class="cu-btn text-blue line-blue shadow" |
| | | @click="clear" |
| | | > |
| | | 清空 |
| | | </button> |
| | | <button |
| | | v-if="hasButtonPermission('submit')" |
| | | class="cu-btn bg-blue shadow-blur" |
| | | :disabled="repeatClick" |
| | | @click="confirm" |
| | | > |
| | | 组托 |
| | | </button> |
| | | <button |
| | | v-if="hasButtonPermission('submitNoJudge')" |
| | | class="cu-btn bg-blue shadow-blur" |
| | | :disabled="repeatClick" |
| | | @click="confirm2" |
| | | > |
| | | 组托 |
| | | </button> |
| | | </view> |
| | | |
| | | |
| | | <!-- AGV呼叫确认弹窗 --> |
| | | <view class="modal-mask" v-if="showAgvModal" @click="closeAgvModal"> |
| | | <view class="modal-container" @click.stop> |
| | | <view |
| | | class="modal-mask" |
| | | v-if="showAgvModal" |
| | | @click="closeAgvModal" |
| | | > |
| | | <view |
| | | class="modal-container" |
| | | @click.stop |
| | | > |
| | | <view class="modal-header"> |
| | | <text class="cuIcon-deliver" style="font-size: 48rpx; color: #0081ff;"></text> |
| | | <text |
| | | class="cuIcon-deliver" |
| | | style="font-size: 48rpx; color: #0081ff" |
| | | ></text> |
| | | <text class="modal-title">AGV呼叫确认</text> |
| | | </view> |
| | | <view class="modal-body"> |
| | | <text class="modal-message">是否需要呼叫AGV进行托盘搬运?</text> |
| | | <text class="modal-message"> |
| | | 是否需要呼叫AGV进行托盘搬运? |
| | | </text> |
| | | </view> |
| | | <view class="modal-footer"> |
| | | <button class="modal-btn modal-btn-cancel" @click="handleAgvNo">不需要</button> |
| | | <button class="modal-btn modal-btn-confirm" @click="handleAgvYes">需要呼叫</button> |
| | | <button |
| | | class="modal-btn modal-btn-cancel" |
| | | @click="handleAgvNo" |
| | | > |
| | | 不需要 |
| | | </button> |
| | | <button |
| | | class="modal-btn modal-btn-confirm" |
| | | @click="handleAgvYes" |
| | | > |
| | | 需要呼叫 |
| | | </button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | |
| | | <!-- AGV站点输入弹窗 --> |
| | | <view class="modal-mask" v-if="showAgvInputModal" @click="closeAgvInputModal"> |
| | | <view class="modal-container" @click.stop> |
| | | <view |
| | | class="modal-mask" |
| | | v-if="showAgvInputModal" |
| | | @click="closeAgvInputModal" |
| | | > |
| | | <view |
| | | class="modal-container" |
| | | @click.stop |
| | | > |
| | | <view class="modal-header"> |
| | | <text class="cuIcon-locationfill" style="font-size: 48rpx; color: #0081ff;"></text> |
| | | <text |
| | | class="cuIcon-locationfill" |
| | | style="font-size: 48rpx; color: #0081ff" |
| | | ></text> |
| | | <text class="modal-title">输入AGV站点</text> |
| | | </view> |
| | | <view class="modal-body"> |
| | | <view class="form-item"> |
| | | <text class="form-label">AGV站点</text> |
| | | <view class="input-wrapper"> |
| | | <input class="agv-input" type="text" v-model="agvStationInput" placeholder="请输入AGV站点编号" @input="checkAgvStation()"/> |
| | | <input |
| | | class="agv-input" |
| | | type="text" |
| | | v-model="agvStationInput" |
| | | placeholder="请输入AGV站点编号" |
| | | @input="checkAgvStation()" |
| | | /> |
| | | </view> |
| | | </view> |
| | | <view class="form-item"> |
| | | <text class="form-label">目标库区</text> |
| | | <view class="input-wrapper picker-wrapper"> |
| | | <picker class="picker" mode="selector" :range="rangeText" @change="pickerChange"> |
| | | <picker |
| | | class="picker" |
| | | mode="selector" |
| | | :range="rangeText" |
| | | @change="pickerChange" |
| | | > |
| | | <view class="picker-view"> |
| | | <text>{{ whAreaId ? selectedText : '请选择库区' }}</text> |
| | | <text class="cuIcon-right picker-arrow"></text> |
| | | <text> |
| | | {{ |
| | | whAreaId |
| | | ? selectedText |
| | | : '请选择库区' |
| | | }} |
| | | </text> |
| | | <text |
| | | class="cuIcon-right picker-arrow" |
| | | ></text> |
| | | </view> |
| | | </picker> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view class="modal-footer"> |
| | | <button class="modal-btn modal-btn-cancel" @click="handleAgvNo">不需要</button> |
| | | <button class="modal-btn modal-btn-confirm" @click="confirmAgvStation">确定</button> |
| | | <button |
| | | class="modal-btn modal-btn-cancel" |
| | | @click="handleAgvNo" |
| | | > |
| | | 不需要 |
| | | </button> |
| | | <button |
| | | class="modal-btn modal-btn-confirm" |
| | | @click="confirmAgvStation" |
| | | > |
| | | 确定 |
| | | </button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import { |
| | | request |
| | | } from '../../common/request.js' |
| | | import { |
| | | mapState, |
| | | mapMutations, |
| | | mapActions, |
| | | mapGetters |
| | | } from 'vuex'; |
| | | export default { |
| | | data() { |
| | | return { |
| | | whAreaId:'', |
| | | barcode: '', |
| | | container: '', |
| | | megreQty: '', |
| | | list: [], |
| | | range: [], |
| | | asnCode: '', |
| | | repeatClick: false, |
| | | isconfirm: false, |
| | | matnrCode:'', |
| | | max: 99999999, |
| | | buttonPermissions: [], // 按钮权限列表 |
| | | showAgvModal: false, // AGV确认弹窗 |
| | | showAgvInputModal: false, // AGV站点输入弹窗 |
| | | agvStationInput: '' ,// AGV站点输入值 |
| | | agvStationName: '' |
| | | } |
| | | import { request } from '../../common/request.js' |
| | | import { mapState, mapMutations, mapActions, mapGetters } from 'vuex' |
| | | export default { |
| | | data() { |
| | | return { |
| | | whAreaId: '', |
| | | barcode: '', |
| | | container: '', |
| | | megreQty: '', |
| | | list: [], |
| | | range: [], |
| | | asnCode: '', |
| | | repeatClick: false, |
| | | isconfirm: false, |
| | | matnrCode: '', |
| | | max: 99999999, |
| | | buttonPermissions: [], // 按钮权限列表 |
| | | showAgvModal: false, // AGV确认弹窗 |
| | | showAgvInputModal: false, // AGV站点输入弹窗 |
| | | agvStationInput: '', // AGV站点输入值 |
| | | agvStationName: '' |
| | | } |
| | | }, |
| | | computed: { |
| | | ...mapState('user', ['dynamicFields']), |
| | | allCount() { |
| | | return this.list.reduce((acc, row) => +row.receiptQty + acc, 0) || 0 |
| | | }, |
| | | computed: { |
| | | ...mapState('user', ['dynamicFields']), |
| | | allCount() { |
| | | return this.list.reduce((acc, row) => +row.receiptQty + acc, 0) || 0 |
| | | }, |
| | | rangeText() { |
| | | return this.range.map(item => item.text) |
| | | }, |
| | | selectedText() { |
| | | const found = this.range.find(item => item.value === this.whAreaId) |
| | | return found ? found.text : '请选择库区' |
| | | } |
| | | rangeText() { |
| | | return this.range.map((item) => item.text) |
| | | }, |
| | | mounted() { |
| | | // this.getRece() |
| | | // 获取按钮权限 |
| | | this.buttonPermissions = uni.getStorageSync('buttonPermissions') || []; |
| | | console.log('当前页面按钮权限:', this.buttonPermissions); |
| | | }, |
| | | methods: { |
| | | async checkAgvStation(){ |
| | | const that = this; |
| | | if(this.agvStationInput === '' || this.agvStationInput === null){ |
| | | uni.showToast({ |
| | | title: "容器码为空", |
| | | icon: "none", |
| | | position: 'top' |
| | | }) |
| | | return ; |
| | | } |
| | | const { |
| | | code, |
| | | data, |
| | | msg |
| | | } = await request('/check/agvStation', { |
| | | transferStationNo: this.agvStationInput |
| | | }) |
| | | if (code === 200) { |
| | | this.agvStationName = data.stationName |
| | | } else { |
| | | uni.showToast({ |
| | | title: msg, |
| | | icon: "none", |
| | | position: 'top' |
| | | }) |
| | | setTimeout(function() { |
| | | that.agvStationName = '' |
| | | that.agvStationInput = '' |
| | | }, 200); |
| | | } |
| | | }, |
| | | pickerChange(e) { |
| | | const index = e.detail.value |
| | | this.whAreaId = this.range[index].value |
| | | uni.setStorageSync('whAreaId', this.whAreaId) |
| | | }, |
| | | // 检查按钮权限 |
| | | hasButtonPermission(route) { |
| | | return this.buttonPermissions.includes(route); |
| | | }, |
| | | async search() { |
| | | const find = this.list.find(el => el.trackCode === this.barcode); |
| | | find ? this.scrollTo() : this.getDet(); |
| | | |
| | | }, |
| | | getDet() { |
| | | let that = this; |
| | | uni.navigateTo({ |
| | | url: "../listing/itemSelect", |
| | | success: function(res) { |
| | | // 通过eventChannel向被打开页面传送数据 向另外一个页面传递值的 |
| | | res.eventChannel.emit('data', { |
| | | matnrCode: that.matnrCode, |
| | | asnCode: that.asnCode |
| | | }) |
| | | }, |
| | | events: { |
| | | // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据 另外一个页面传过来的 |
| | | backData: function(data) { |
| | | that.showBackData(data.data) |
| | | }, |
| | | }, |
| | | |
| | | |
| | | }); |
| | | }, |
| | | |
| | | async getList() { |
| | | if(this.container === '' || this.container === null){ |
| | | uni.showToast({ |
| | | title: "容器码为空", |
| | | icon: "none", |
| | | position: 'top' |
| | | }) |
| | | return ; |
| | | } |
| | | const { |
| | | code, |
| | | data, |
| | | msg |
| | | } = await request('/asnOrderItem/container', { |
| | | barcode: this.container |
| | | }) |
| | | if (code === 200) { |
| | | this.range = data.map(item => ({ |
| | | value: item.id, |
| | | text: item.name |
| | | })); |
| | | |
| | | this.whAreaId = this.range[0].value |
| | | } else { |
| | | uni.showToast({ |
| | | title: msg, |
| | | icon: "none", |
| | | position: 'top' |
| | | }) |
| | | } |
| | | }, |
| | | showBackData(data){ |
| | | let status ; |
| | | data.map(item => { |
| | | this.list.push(item) |
| | | }) |
| | | let oldLength = this.list.length |
| | | this.list = this.list.filter((item, index, self) => |
| | | self.findIndex(i => ( |
| | | i.id === item.id // 根据id去重 |
| | | )) === index && item.isptResult === self[0].isptResult |
| | | ); |
| | | let newLength = this.list.length |
| | | |
| | | if(oldLength > newLength){ |
| | | this.showMsg("新明细被过滤,请检查状态") |
| | | |
| | | } |
| | | |
| | | }, |
| | | showMsg(msg){ |
| | | setTimeout(function() { |
| | | uni.showToast({ |
| | | icon: "none", |
| | | position: 'top', |
| | | title: msg, |
| | | duration:2000, |
| | | }) |
| | | }, 200); |
| | | |
| | | }, |
| | | scrollTo() { |
| | | const ref = this.$refs[`${this.barcode}ref`][0]; |
| | | uni.pageScrollTo({ |
| | | scrollTop: ref.$el.offsetTop, |
| | | duration: 300 |
| | | }) |
| | | }, |
| | | remove(index) { |
| | | this.list.splice(index, 1); |
| | | }, |
| | | clear() { |
| | | this.list = [] |
| | | this.barcode = '' |
| | | }, |
| | | next() { |
| | | if (this.list.length) { |
| | | this.isconfirm = true |
| | | } else { |
| | | uni.showToast({ |
| | | icon: "none", |
| | | title: '未选物料标签' |
| | | }) |
| | | } |
| | | }, |
| | | prev() { |
| | | this.isconfirm = false |
| | | }, |
| | | confirm() { |
| | | if(this.container === '' || this.container === null){ |
| | | uni.showToast({ |
| | | title: "容器码为空", |
| | | icon: "none", |
| | | position: 'top' |
| | | }) |
| | | return ; |
| | | } |
| | | if(this.list.length ===0 || this.list === null){ |
| | | uni.showToast({ |
| | | title: "未添加明细", |
| | | icon: "none", |
| | | position: 'top' |
| | | }) |
| | | return ; |
| | | } |
| | | // 显示AGV确认弹窗 |
| | | this.showAgvInputModal = true; |
| | | }, |
| | | confirm2() { |
| | | if(this.container === '' || this.container === null){ |
| | | uni.showToast({ |
| | | title: "容器码为空", |
| | | icon: "none", |
| | | position: 'top' |
| | | }) |
| | | return ; |
| | | } |
| | | if(this.list.length ===0 || this.list === null){ |
| | | uni.showToast({ |
| | | title: "未添加明细", |
| | | icon: "none", |
| | | position: 'top' |
| | | }) |
| | | return ; |
| | | } |
| | | this.submitConfirm(''); |
| | | }, |
| | | // 关闭AGV确认弹窗 |
| | | closeAgvModal() { |
| | | this.showAgvModal = false; |
| | | }, |
| | | // 选择不需要AGV |
| | | handleAgvNo() { |
| | | |
| | | this.showAgvModal = false; |
| | | this.submitConfirm(''); |
| | | }, |
| | | // 选择需要AGV |
| | | handleAgvYes() { |
| | | this.showAgvModal = false; |
| | | this.agvStationInput = ''; |
| | | this.agvStationName = ''; |
| | | this.showAgvInputModal = true; |
| | | }, |
| | | // 关闭AGV站点输入弹窗 |
| | | closeAgvInputModal() { |
| | | this.showAgvInputModal = false; |
| | | this.agvStationInput = ''; |
| | | this.agvStationName = ''; |
| | | }, |
| | | // 确认AGV站点 |
| | | confirmAgvStation() { |
| | | if (this.agvStationInput.trim() === '') { |
| | | uni.showToast({ |
| | | title: "AGV站点不能为空", |
| | | icon: "none", |
| | | position: 'top' |
| | | }); |
| | | return; |
| | | } |
| | | if (this.whAreaId === '') { |
| | | uni.showToast({ |
| | | title: "目标库区不能为空", |
| | | icon: "none", |
| | | position: 'top' |
| | | }); |
| | | return; |
| | | } |
| | | this.showAgvInputModal = false; |
| | | this.submitConfirm(this.agvStationName); |
| | | }, |
| | | // 提交组托请求 |
| | | async submitConfirm(agvStation) { |
| | | this.repeatClick = true |
| | | try { |
| | | const newArr = this.list.map(item => { |
| | | |
| | | return { |
| | | ...item, |
| | | anfme: item.anfme === null ? 0 : +item.anfme, |
| | | }; |
| | | }); |
| | | |
| | | const requestData = { |
| | | items: newArr, |
| | | barcode: this.container, |
| | | }; |
| | | |
| | | // 如果有AGV站点,添加到请求参数中 |
| | | if (agvStation) { |
| | | requestData.staNo = agvStation; |
| | | requestData.agvSign = 1; |
| | | requestData.area = this.whAreaId; |
| | | }else{ |
| | | requestData.agvSign = 0; |
| | | } |
| | | |
| | | const { |
| | | code, |
| | | data, |
| | | msg |
| | | } = await request('/waitPakin/merge', requestData) |
| | | if (code === 200) { |
| | | selectedText() { |
| | | const found = this.range.find( |
| | | (item) => item.value === this.whAreaId |
| | | ) |
| | | return found ? found.text : '请选择库区' |
| | | } |
| | | }, |
| | | mounted() { |
| | | // this.getRece() |
| | | // 获取按钮权限 |
| | | this.buttonPermissions = uni.getStorageSync('buttonPermissions') || [] |
| | | console.log('当前页面按钮权限:', this.buttonPermissions) |
| | | }, |
| | | methods: { |
| | | async checkAgvStation() { |
| | | const that = this |
| | | if (this.agvStationInput === '' || this.agvStationInput === null) { |
| | | uni.showToast({ |
| | | title: '组盘成功' |
| | | title: '容器码为空', |
| | | icon: 'none', |
| | | position: 'top' |
| | | }) |
| | | this.list = [] |
| | | this.barcode = '' |
| | | this.container = '' |
| | | this.isconfirm = false |
| | | return |
| | | } |
| | | const { code, data, msg } = await request('/check/agvStation', { |
| | | transferStationNo: this.agvStationInput |
| | | }) |
| | | if (code === 200) { |
| | | this.agvStationName = data.stationName |
| | | } else { |
| | | uni.showToast({ |
| | | title: msg, |
| | | icon: "none", |
| | | icon: 'none', |
| | | position: 'top' |
| | | }) |
| | | setTimeout(function () { |
| | | that.agvStationName = '' |
| | | that.agvStationInput = '' |
| | | }, 200) |
| | | } |
| | | }, |
| | | pickerChange(e) { |
| | | const index = e.detail.value |
| | | this.whAreaId = this.range[index].value |
| | | uni.setStorageSync('whAreaId', this.whAreaId) |
| | | }, |
| | | // 检查按钮权限 |
| | | hasButtonPermission(route) { |
| | | return this.buttonPermissions.includes(route) |
| | | }, |
| | | async search() { |
| | | const find = this.list.find((el) => el.trackCode === this.barcode) |
| | | find ? this.scrollTo() : this.getDet() |
| | | }, |
| | | getDet() { |
| | | let that = this |
| | | uni.navigateTo({ |
| | | url: '../listing/itemSelect', |
| | | success: function (res) { |
| | | // 通过eventChannel向被打开页面传送数据 向另外一个页面传递值的 |
| | | res.eventChannel.emit('data', { |
| | | matnrCode: that.matnrCode, |
| | | asnCode: that.asnCode |
| | | }) |
| | | }, |
| | | events: { |
| | | // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据 另外一个页面传过来的 |
| | | backData: function (data) { |
| | | that.showBackData(data.data) |
| | | } |
| | | } |
| | | }) |
| | | }, |
| | | |
| | | async getList() { |
| | | if (this.container === '' || this.container === null) { |
| | | uni.showToast({ |
| | | title: '容器码为空', |
| | | icon: 'none', |
| | | position: 'top' |
| | | }) |
| | | return |
| | | } |
| | | const { code, data, msg } = await request( |
| | | '/asnOrderItem/container', |
| | | { |
| | | barcode: this.container |
| | | } |
| | | ) |
| | | if (code === 200) { |
| | | this.range = data.map((item) => ({ |
| | | value: item.id, |
| | | text: item.name |
| | | })) |
| | | |
| | | this.whAreaId = this.range[0].value |
| | | } else { |
| | | uni.showToast({ |
| | | title: msg, |
| | | icon: 'none', |
| | | position: 'top' |
| | | }) |
| | | } |
| | | } finally { |
| | | // 无论请求成功还是失败,都释放按钮锁定 |
| | | this.repeatClick = false |
| | | } |
| | | }, |
| | | async getRece() { |
| | | const { |
| | | code, |
| | | data, |
| | | msg |
| | | } = await request('/areas/user/all', {}, 'get') |
| | | if (code === 200) { |
| | | this.range = data.map(item => ({ |
| | | value: item.id, |
| | | text: item.name |
| | | })); |
| | | }, |
| | | showBackData(data) { |
| | | let status |
| | | data.map((item) => { |
| | | this.list.push(item) |
| | | }) |
| | | let oldLength = this.list.length |
| | | this.list = this.list.filter( |
| | | (item, index, self) => |
| | | self.findIndex( |
| | | (i) => |
| | | i.id === item.id // 根据id去重 |
| | | ) === index && item.isptResult === self[0].isptResult |
| | | ) |
| | | let newLength = this.list.length |
| | | |
| | | if (oldLength > newLength) { |
| | | this.showMsg('新明细被过滤,请检查状态') |
| | | } |
| | | }, |
| | | showMsg(msg) { |
| | | setTimeout(function () { |
| | | uni.showToast({ |
| | | icon: 'none', |
| | | position: 'top', |
| | | title: msg, |
| | | duration: 2000 |
| | | }) |
| | | }, 200) |
| | | }, |
| | | scrollTo() { |
| | | const ref = this.$refs[`${this.barcode}ref`][0] |
| | | uni.pageScrollTo({ |
| | | scrollTop: ref.$el.offsetTop, |
| | | duration: 300 |
| | | }) |
| | | }, |
| | | remove(index) { |
| | | this.list.splice(index, 1) |
| | | }, |
| | | clear() { |
| | | this.list = [] |
| | | this.barcode = '' |
| | | }, |
| | | next() { |
| | | if (this.list.length) { |
| | | this.isconfirm = true |
| | | } else { |
| | | uni.showToast({ |
| | | icon: 'none', |
| | | title: '未选物料标签' |
| | | }) |
| | | } |
| | | }, |
| | | prev() { |
| | | this.isconfirm = false |
| | | }, |
| | | confirm() { |
| | | if (this.container === '' || this.container === null) { |
| | | uni.showToast({ |
| | | title: '容器码为空', |
| | | icon: 'none', |
| | | position: 'top' |
| | | }) |
| | | return |
| | | } |
| | | if (this.list.length === 0 || this.list === null) { |
| | | uni.showToast({ |
| | | title: '未添加明细', |
| | | icon: 'none', |
| | | position: 'top' |
| | | }) |
| | | return |
| | | } |
| | | // 显示AGV确认弹窗 |
| | | this.showAgvInputModal = true |
| | | }, |
| | | confirm2() { |
| | | if (this.container === '' || this.container === null) { |
| | | uni.showToast({ |
| | | title: '容器码为空', |
| | | icon: 'none', |
| | | position: 'top' |
| | | }) |
| | | return |
| | | } |
| | | if (this.list.length === 0 || this.list === null) { |
| | | uni.showToast({ |
| | | title: '未添加明细', |
| | | icon: 'none', |
| | | position: 'top' |
| | | }) |
| | | return |
| | | } |
| | | this.submitConfirm('') |
| | | }, |
| | | // 关闭AGV确认弹窗 |
| | | closeAgvModal() { |
| | | this.showAgvModal = false |
| | | }, |
| | | // 选择不需要AGV |
| | | handleAgvNo() { |
| | | this.showAgvModal = false |
| | | this.submitConfirm('') |
| | | }, |
| | | // 选择需要AGV |
| | | handleAgvYes() { |
| | | this.showAgvModal = false |
| | | this.agvStationInput = '' |
| | | this.agvStationName = '' |
| | | this.showAgvInputModal = true |
| | | }, |
| | | // 关闭AGV站点输入弹窗 |
| | | closeAgvInputModal() { |
| | | this.showAgvInputModal = false |
| | | this.agvStationInput = '' |
| | | this.agvStationName = '' |
| | | }, |
| | | // 确认AGV站点 |
| | | confirmAgvStation() { |
| | | if (this.agvStationInput.trim() === '') { |
| | | uni.showToast({ |
| | | title: 'AGV站点不能为空', |
| | | icon: 'none', |
| | | position: 'top' |
| | | }) |
| | | return |
| | | } |
| | | if (this.whAreaId === '') { |
| | | uni.showToast({ |
| | | title: '目标库区不能为空', |
| | | icon: 'none', |
| | | position: 'top' |
| | | }) |
| | | return |
| | | } |
| | | this.showAgvInputModal = false |
| | | this.submitConfirm(this.agvStationName) |
| | | }, |
| | | // 提交组托请求 |
| | | async submitConfirm(agvStation) { |
| | | this.repeatClick = true |
| | | try { |
| | | const newArr = this.list.map((item) => { |
| | | return { |
| | | ...item, |
| | | anfme: item.anfme === null ? 0 : +item.anfme |
| | | } |
| | | }) |
| | | |
| | | const requestData = { |
| | | items: newArr, |
| | | barcode: this.container |
| | | } |
| | | |
| | | // 如果有AGV站点,添加到请求参数中 |
| | | if (agvStation) { |
| | | requestData.staNo = agvStation |
| | | requestData.agvSign = 1 |
| | | requestData.area = this.whAreaId |
| | | } else { |
| | | requestData.agvSign = 0 |
| | | } |
| | | |
| | | const { code, data, msg } = await request( |
| | | '/waitPakin/merge', |
| | | requestData |
| | | ) |
| | | if (code === 200) { |
| | | uni.showToast({ |
| | | title: '组盘成功' |
| | | }) |
| | | this.list = [] |
| | | this.barcode = '' |
| | | this.container = '' |
| | | this.isconfirm = false |
| | | } else { |
| | | uni.showToast({ |
| | | title: msg, |
| | | icon: 'none', |
| | | position: 'top' |
| | | }) |
| | | } |
| | | } finally { |
| | | // 无论请求成功还是失败,都释放按钮锁定 |
| | | this.repeatClick = false |
| | | } |
| | | }, |
| | | async getRece() { |
| | | const { code, data, msg } = await request( |
| | | '/areas/user/all', |
| | | {}, |
| | | 'get' |
| | | ) |
| | | if (code === 200) { |
| | | this.range = data.map((item) => ({ |
| | | value: item.id, |
| | | text: item.name |
| | | })) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style> |
| | | .index { |
| | | border: 1px solid #e54d42; |
| | | color: #e54d42; |
| | | border-radius: 50%; |
| | | display: block; |
| | | width: 50rpx; |
| | | height: 50rpx; |
| | | line-height: 48rpx; |
| | | text-align: center; |
| | | margin-right: 20rpx; |
| | | font-size: 30rpx; |
| | | } |
| | | .index { |
| | | border: 1px solid #e54d42; |
| | | color: #e54d42; |
| | | border-radius: 50%; |
| | | display: block; |
| | | width: 50rpx; |
| | | height: 50rpx; |
| | | line-height: 48rpx; |
| | | text-align: center; |
| | | margin-right: 20rpx; |
| | | font-size: 30rpx; |
| | | } |
| | | |
| | | .text-blue { |
| | | color: #0081ff !important; |
| | | } |
| | | .text-blue { |
| | | color: #0081ff !important; |
| | | } |
| | | |
| | | .act { |
| | | border: 1px solid #e54d42; |
| | | } |
| | | .act { |
| | | border: 1px solid #e54d42; |
| | | } |
| | | |
| | | .item { |
| | | position: relative; |
| | | display: flex; |
| | | min-height: 80upx; |
| | | align-items: center; |
| | | } |
| | | |
| | | /* 弹窗遮罩层 */ |
| | | .modal-mask { |
| | | position: fixed; |
| | | top: 0; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | background-color: rgba(0, 0, 0, 0.5); |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | z-index: 999; |
| | | } |
| | | |
| | | /* 弹窗容器 */ |
| | | .modal-container { |
| | | width: 600rpx; |
| | | background-color: #ffffff; |
| | | border-radius: 24rpx; |
| | | overflow: hidden; |
| | | box-shadow: 0 8rpx 40rpx rgba(0, 0, 0, 0.15); |
| | | } |
| | | |
| | | /* 弹窗头部 */ |
| | | .modal-header { |
| | | padding: 40rpx 30rpx 20rpx; |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | background: linear-gradient(135deg, #f0f7ff 0%, #e8f4ff 100%); |
| | | } |
| | | |
| | | .modal-title { |
| | | font-size: 34rpx; |
| | | font-weight: bold; |
| | | color: #333; |
| | | /* margin-top: 16rpx; */ |
| | | } |
| | | |
| | | /* 弹窗内容 */ |
| | | .modal-body { |
| | | padding: 30rpx; |
| | | } |
| | | |
| | | .form-item { |
| | | margin-bottom: 24rpx; |
| | | } |
| | | |
| | | .form-item:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | |
| | | .form-label { |
| | | display: block; |
| | | font-size: 28rpx; |
| | | color: #333; |
| | | font-weight: 500; |
| | | margin-bottom: 12rpx; |
| | | padding-left: 4rpx; |
| | | } |
| | | |
| | | .modal-message { |
| | | font-size: 30rpx; |
| | | color: #666; |
| | | text-align: center; |
| | | display: block; |
| | | } |
| | | |
| | | /* 输入框容器 */ |
| | | .input-wrapper { |
| | | background-color: #f5f7fa; |
| | | border-radius: 12rpx; |
| | | padding: 10rpx; |
| | | border: 2rpx solid #e4e7ed; |
| | | transition: border-color 0.2s; |
| | | } |
| | | |
| | | .input-wrapper:focus-within { |
| | | border-color: #0081ff; |
| | | } |
| | | |
| | | .picker-wrapper { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .agv-input { |
| | | width: 100%; |
| | | height: 70rpx; |
| | | font-size: 30rpx; |
| | | color: #333; |
| | | background-color: transparent; |
| | | } |
| | | .picker{ |
| | | width: 100%; |
| | | } |
| | | |
| | | .picker-view { |
| | | width: 100%; |
| | | height: 70rpx; |
| | | line-height: 70rpx; |
| | | font-size: 30rpx; |
| | | color: #333; |
| | | display: flex; |
| | | justify-content:space-between; |
| | | align-items: center; |
| | | } |
| | | |
| | | .picker-arrow { |
| | | color: #999; |
| | | font-size: 28rpx; |
| | | } |
| | | |
| | | /* 弹窗底部按钮 */ |
| | | .modal-footer { |
| | | display: flex; |
| | | border-top: 1rpx solid #eee; |
| | | } |
| | | |
| | | .modal-btn { |
| | | flex: 1; |
| | | height: 100rpx; |
| | | line-height: 100rpx; |
| | | font-size: 32rpx; |
| | | border: none; |
| | | border-radius: 0; |
| | | background-color: #fff; |
| | | } |
| | | |
| | | .modal-btn::after { |
| | | border: none; |
| | | } |
| | | |
| | | .modal-btn-cancel { |
| | | color: #999; |
| | | border-right: 1rpx solid #eee; |
| | | } |
| | | |
| | | .modal-btn-confirm { |
| | | color: #fff; |
| | | background: linear-gradient(135deg, #0081ff 0%, #1890ff 100%); |
| | | font-weight: bold; |
| | | } |
| | | |
| | | .modal-btn-confirm:active { |
| | | background: linear-gradient(135deg, #0070dd 0%, #1480e8 100%); |
| | | } |
| | | |
| | | .modal-btn-cancel:active { |
| | | background-color: #f5f5f5; |
| | | } |
| | | </style> |
| | | .item { |
| | | position: relative; |
| | | display: flex; |
| | | min-height: 80upx; |
| | | align-items: center; |
| | | } |
| | | |
| | | /* 弹窗遮罩层 */ |
| | | .modal-mask { |
| | | position: fixed; |
| | | top: 0; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | background-color: rgba(0, 0, 0, 0.5); |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | z-index: 999; |
| | | } |
| | | |
| | | /* 弹窗容器 */ |
| | | .modal-container { |
| | | width: 600rpx; |
| | | background-color: #ffffff; |
| | | border-radius: 24rpx; |
| | | overflow: hidden; |
| | | box-shadow: 0 8rpx 40rpx rgba(0, 0, 0, 0.15); |
| | | } |
| | | |
| | | /* 弹窗头部 */ |
| | | .modal-header { |
| | | padding: 40rpx 30rpx 20rpx; |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | background: linear-gradient(135deg, #f0f7ff 0%, #e8f4ff 100%); |
| | | } |
| | | |
| | | .modal-title { |
| | | font-size: 34rpx; |
| | | font-weight: bold; |
| | | color: #333; |
| | | /* margin-top: 16rpx; */ |
| | | } |
| | | |
| | | /* 弹窗内容 */ |
| | | .modal-body { |
| | | padding: 30rpx; |
| | | } |
| | | |
| | | .form-item { |
| | | margin-bottom: 24rpx; |
| | | } |
| | | |
| | | .form-item:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | |
| | | .form-label { |
| | | display: block; |
| | | font-size: 28rpx; |
| | | color: #333; |
| | | font-weight: 500; |
| | | margin-bottom: 12rpx; |
| | | padding-left: 4rpx; |
| | | } |
| | | |
| | | .modal-message { |
| | | font-size: 30rpx; |
| | | color: #666; |
| | | text-align: center; |
| | | display: block; |
| | | } |
| | | |
| | | /* 输入框容器 */ |
| | | .input-wrapper { |
| | | background-color: #f5f7fa; |
| | | border-radius: 12rpx; |
| | | padding: 10rpx; |
| | | border: 2rpx solid #e4e7ed; |
| | | transition: border-color 0.2s; |
| | | } |
| | | |
| | | .input-wrapper:focus-within { |
| | | border-color: #0081ff; |
| | | } |
| | | |
| | | .picker-wrapper { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .agv-input { |
| | | width: 100%; |
| | | height: 70rpx; |
| | | font-size: 30rpx; |
| | | color: #333; |
| | | background-color: transparent; |
| | | } |
| | | .picker { |
| | | width: 100%; |
| | | } |
| | | |
| | | .picker-view { |
| | | width: 100%; |
| | | height: 70rpx; |
| | | line-height: 70rpx; |
| | | font-size: 30rpx; |
| | | color: #333; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | } |
| | | |
| | | .picker-arrow { |
| | | color: #999; |
| | | font-size: 28rpx; |
| | | } |
| | | |
| | | /* 弹窗底部按钮 */ |
| | | .modal-footer { |
| | | display: flex; |
| | | border-top: 1rpx solid #eee; |
| | | } |
| | | |
| | | .modal-btn { |
| | | flex: 1; |
| | | height: 100rpx; |
| | | line-height: 100rpx; |
| | | font-size: 32rpx; |
| | | border: none; |
| | | border-radius: 0; |
| | | background-color: #fff; |
| | | } |
| | | |
| | | .modal-btn::after { |
| | | border: none; |
| | | } |
| | | |
| | | .modal-btn-cancel { |
| | | color: #999; |
| | | border-right: 1rpx solid #eee; |
| | | } |
| | | |
| | | .modal-btn-confirm { |
| | | color: #fff; |
| | | background: linear-gradient(135deg, #0081ff 0%, #1890ff 100%); |
| | | font-weight: bold; |
| | | } |
| | | |
| | | .modal-btn-confirm:active { |
| | | background: linear-gradient(135deg, #0070dd 0%, #1480e8 100%); |
| | | } |
| | | |
| | | .modal-btn-cancel:active { |
| | | background-color: #f5f5f5; |
| | | } |
| | | </style> |