| | |
| | | <template> |
| | | <view> |
| | | <scroll-view scroll-y catch:touchmove="touchmove"> |
| | | <view class="square-2"> |
| | | <view class="square-title"> |
| | | <view class="title-sign"> |
| | | <view class="sign"></view> |
| | | </view> |
| | | <view class="title-text"><text>托盘条码</text></view> |
| | | </view> |
| | | <view class="square-content"> |
| | | <view class="content-input"> |
| | | <input v-model="barcode" type="text" placeholder="扫码 / 输入" maxlength="10" :focus="barcodeFocus" |
| | | @input="barcodeInput" placeholder-style="line-height: 85rpx;"> |
| | | <uni-icons type="closeempty" size="20" color="#dadada" @click="removeBarcode()"></uni-icons> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view class="page-container"> |
| | | <scroll-view scroll-y class="page-scroll"> |
| | | |
| | | <!-- 1. Pallet Barcode Section --> |
| | | <view class="card-box"> |
| | | <view class="card-header"> |
| | | <view class="header-indicator"></view> |
| | | <text class="header-title">Pallet Barcode</text> |
| | | </view> |
| | | <view class="card-body"> |
| | | <view class="input-wrapper"> |
| | | <input |
| | | v-model="barcode" |
| | | type="text" |
| | | placeholder="Scan Pallet Barcode" |
| | | maxlength="20" |
| | | :focus="barcodeFocus" |
| | | @confirm="barcodeInput" |
| | | class="custom-input" |
| | | /> |
| | | <view class="icon-scan" @click="barcodeInput"> |
| | | <uni-icons type="scan" size="24" color="#007aff" /> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="square-2"> |
| | | <view class="square-title"> |
| | | <view class="title-sign"> |
| | | <view class="sign"></view> |
| | | </view> |
| | | <view class="title-text"><text>商品条码</text></view> |
| | | </view> |
| | | <view class="square-content"> |
| | | <view class="content-input"> |
| | | <input v-model="code" type="text" placeholder="扫码 / 输入" :focus="codeFocus" @input="codeInput" |
| | | placeholder-style="line-height: 85rpx;"> |
| | | <uni-icons type="closeempty" size="20" color="#dadada" @click="removeCode()()"></uni-icons> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <!-- 2. Scanning Options --> |
| | | <view class="card-box"> |
| | | <view class="card-header"> |
| | | <text class="header-title">Carton Scanning Option</text> |
| | | </view> |
| | | <view class="card-body"> |
| | | <radio-group @change="modeChange" class="radio-group-vertical"> |
| | | <label class="radio-row"> |
| | | <radio value="one" :checked="scanMode === 'one'" color="#007aff" style="transform:scale(0.8)" /> |
| | | <text class="radio-label">One Label per Carton</text> |
| | | </label> |
| | | <label class="radio-row"> |
| | | <radio value="multi" :checked="scanMode === 'multi'" color="#007aff" style="transform:scale(0.8)" /> |
| | | <text class="radio-label">Multiple Labels per Carton</text> |
| | | </label> |
| | | </radio-group> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 3. Scan Carton Label --> |
| | | <view class="card-box"> |
| | | <view class="card-header"> |
| | | <view class="header-indicator"></view> |
| | | <text class="header-title">Scan Carton Label</text> |
| | | </view> |
| | | <view class="card-body"> |
| | | <view class="input-row"> |
| | | <view class="input-wrapper flex-1"> |
| | | <input |
| | | v-model="code" |
| | | type="text" |
| | | placeholder="Scan Carton Label" |
| | | :focus="codeFocus" |
| | | @confirm="codeInput" |
| | | class="custom-input" |
| | | /> |
| | | </view> |
| | | <button class="cu-btn bg-blue shadow-blur sm margin-left-sm" @click="codeInput">Add</button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="square-1"> |
| | | <view class="square-title"> |
| | | <view class="title-sign"> |
| | | <view class="sign"></view> |
| | | </view> |
| | | <view class="title-text" style="width: 200rpx;"><text>商品列表</text></view> |
| | | <view v-show="matList.length != 0" class="lable"> |
| | | <label class="label-btn" style="width: 170rpx;line-height: 95rpx;"> |
| | | <checkbox :checked="check" @click="allChecked()">{{checkText}}</checkbox> |
| | | </label> |
| | | <label class="label-btn"> |
| | | <text @click="reChecked()">反选</text> |
| | | </label> |
| | | <label> |
| | | <uni-icons type="trash" size="25" color="#a5a5a5" @click="remove()"></uni-icons> |
| | | </label> |
| | | </view> |
| | | </view> |
| | | <!-- 4. Zone Selection & Queue Action --> |
| | | <view class="card-box"> |
| | | <view class="card-body"> |
| | | <!-- Zone Selector --> |
| | | <view class="form-row"> |
| | | <text class="form-label">Zone:</text> |
| | | <picker @change="zoneChange" :value="zoneIndex" :range="zoneList" range-key="areaId" class="flex-1"> |
| | | <view class="picker-box"> |
| | | <text class="picker-text">{{ zoneList[zoneIndex] ? zoneList[zoneIndex].areaId : 'Select Zone' }}</text> |
| | | <uni-icons type="arrowdown" size="14" color="#666"></uni-icons> |
| | | </view> |
| | | </picker> |
| | | </view> |
| | | |
| | | <!-- Add Queue Button (Full Width) --> |
| | | <button class="cu-btn bg-blue block margin-top-sm lg shadow" @click="addToQueue"> |
| | | <text class="text-bold">ADD TO QUEUE</text> |
| | | </button> |
| | | </view> |
| | | </view> |
| | | |
| | | </view> |
| | | <view class="square-none" v-show="matList.length === 0"> |
| | | <view class="v-show">暂无更多数据...</view> |
| | | </view> |
| | | <!-- 5. Data Tables --> |
| | | <view class="tables-section"> |
| | | |
| | | <!-- Left Table: Current Scanned --> |
| | | <view class="card-box no-padding"> |
| | | <view class="table-header-row"> |
| | | <text class="th col-2">Carton Label</text> |
| | | <text class="th col-1 text-center">Qty</text> |
| | | <text class="th col-05 text-center">Op</text> |
| | | </view> |
| | | <view class="table-body-scroll"> |
| | | <view v-for="(item, index) in matList" :key="index" class="table-row"> |
| | | <text class="td col-2 text-cut">{{ item.barcode }}</text> |
| | | <text class="td col-1 text-center">{{ item.anfme }}</text> |
| | | <view class="td col-05 text-center"> |
| | | <uni-icons type="trash" size="18" color="#dd524d" @click="removeCurrentItem(index)" /> |
| | | </view> |
| | | </view> |
| | | <view v-if="matList.length === 0" class="empty-state">No data</view> |
| | | </view> |
| | | <view class="table-footer-info"> |
| | | <text>Total Quantity: <text class="text-blue text-bold">{{ totalQty }}</text></text> |
| | | </view> |
| | | </view> |
| | | |
| | | <checkbox-group @change="checkbox"> |
| | | <view v-for="(item,index) in matList" :key="index" class="data-list bg-false" |
| | | :class="'bg-'+item.checked"> |
| | | <label class="left-check-box"> |
| | | <checkbox :value="item.id+''" :checked="item.checked" style="display: block;" /> |
| | | </label> |
| | | <view class="data-list-left"> |
| | | <view class="matnr"><text style="width: 500rpx;">编码:{{item.matnr}}</text> |
| | | <text style="margin-left: 100rpx;">名称:{{item.maktx}}</text> |
| | | </view> |
| | | <view><text style="width: 500rpx;">PO:{{item.standby1}}</text> |
| | | <text style="margin-left: 100rpx;">SKU:{{item.standby3}}</text> |
| | | </view> |
| | | <view><text style="width: 500rpx;">UPC:{{item.standby2}}</text></view> |
| | | <view><text style="width: 500rpx;">采购单:{{item.boxType3}}</text> |
| | | <text style="margin-left: 100rpx;">数量:{{item.anfme}}</text> |
| | | </view> |
| | | </view> |
| | | <view class="data-list-right"> |
| | | <label><uni-icons type="compose" size="20" color="#a5a5a5" |
| | | @click="revise(item,index)"></uni-icons></label> |
| | | <!-- list中删除键 --> |
| | | <!-- <label><uni-icons type="trash" size="25" color="#a5a5a5" @click="remove(item,index)"></uni-icons></label> --> |
| | | </view> |
| | | </view> |
| | | </checkbox-group> |
| | | </scroll-view> |
| | | <!-- Right Table: Queue List --> |
| | | <view class="card-box no-padding margin-top-sm"> |
| | | <view class="card-header small-header"> |
| | | <text class="header-title text-sm">Queue List</text> |
| | | </view> |
| | | <scroll-view scroll-y class="queue-list-scroll"> |
| | | <view v-for="(qItem, qIndex) in queueList" :key="qIndex" class="queue-card"> |
| | | <view class="queue-header"> |
| | | <view class="flex align-center"> |
| | | <uni-icons type="box" size="16" color="#007aff" class="margin-right-xs"/> |
| | | <text class="text-bold text-dark">{{ qItem.barcode }}</text> |
| | | </view> |
| | | <view class="flex align-center"> |
| | | <text class="cu-tag bg-cyan light sm margin-right-xs">{{ qItem.zoneName }}</text> |
| | | <uni-icons type="closeempty" size="18" color="#999" @click="removeFromQueue(qIndex)" /> |
| | | </view> |
| | | </view> |
| | | <view class="queue-content"> |
| | | <view v-for="(cItem, cIndex) in qItem.cartons" :key="cIndex" class="queue-detail-row"> |
| | | <text class="text-grey">Label:{{ cItem.barcode }}</text> |
| | | <text class="text-grey">ItemNo:{{ cItem.matnr }}</text> |
| | | <text class="text-grey">x{{ cItem.anfme }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view v-if="queueList.length === 0" class="empty-state">Queue is empty</view> |
| | | </scroll-view> |
| | | </view> |
| | | |
| | | <!-- 底部按钮 --> |
| | | <view class="footer flex justify-around"> |
| | | <!-- 底部全选 反选按钮 --> |
| | | <!-- <label class="label-btn" style="width: 170rpx;"> |
| | | <checkbox :checked="check" @click="allChecked()">{{checkText}}</checkbox> |
| | | </label> |
| | | <label class="label-btn" style="width: 100rpx;"> |
| | | <text @click="reChecked()">反选</text> |
| | | </label> --> |
| | | </view> |
| | | |
| | | <label class="label-btn flex justify-center align-center"> |
| | | <button class="cu-btn" @click="resst()">重置</button> |
| | | </label> |
| | | <label class="label-btn flex justify-center align-center"> |
| | | <button class="cu-btn bg-blue " @click="comb()">组托</button> |
| | | </label> |
| | | </view> |
| | | <view style="height: 140rpx;"></view> |
| | | </scroll-view> |
| | | |
| | | <view> |
| | | <!-- 修改数量 --> |
| | | <uni-popup ref="revise" background-color="#fff" @change="change"> |
| | | <view class="revise-box"> |
| | | <view class="revise-box-top"> |
| | | <view class="color-block-blue"></view> |
| | | <text class="title">组托数量</text> |
| | | </view> |
| | | <view class="text-box"> |
| | | <text>可组数量:{{enableQty}}</text> |
| | | </view> |
| | | <view class="changeBox flex justify-around"> |
| | | <view class="num-box"> |
| | | <uni-number-box v-model="count" :min="minCount" :max="maxCount" color="#747474" |
| | | @change="changeValue" /> |
| | | </view> |
| | | |
| | | </view> |
| | | <view class="revise-box-buttom"> |
| | | <view> |
| | | <button class="cu-btn bg-blue" @click="confirm()">确认</button> |
| | | </view> |
| | | </view> |
| | | |
| | | </view> |
| | | </uni-popup> |
| | | </view> |
| | | </view> |
| | | <!-- Bottom Footer --> |
| | | <view class="footer-actions"> |
| | | <button class="cu-btn bg-blue shadow-blur lg flex-1 margin-right-sm" @click="moveToASRS">MOVE TO ASRS</button> |
| | | <button class="cu-btn line-grey lg flex-1" @click="cancelAll">X CANCEL</button> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | import permision from "@/common/permission.js" |
| | | export default { |
| | | data() { |
| | | return { |
| | | commonUrl: null, |
| | | barcode: '', |
| | | barcodeFocus: true, |
| | | focus: false, |
| | | type: 'center', |
| | | searchBox: 'hide', |
| | | pick: 'hide', |
| | | order: null, |
| | | matList: [], |
| | | result: '', |
| | | count: '', |
| | | minCount: 0, |
| | | maxCount: '', |
| | | rowNum: '', |
| | | enableQty: '', |
| | | check: false, |
| | | checkText: '全选', |
| | | checkedData: [], |
| | | orderNo: '', |
| | | orderNoList: [], |
| | | showDropdown: false, |
| | | code: '', |
| | | codeFocus: true, |
| | | } |
| | | }, |
| | | mounted() { |
| | | const UIP = uni.getStorageSync('UIP'); |
| | | this.baseIP = UIP; |
| | | const UPORT = uni.getStorageSync('UPORT'); |
| | | this.basePORT = UPORT |
| | | const PROJ = uni.getStorageSync('UPROJ'); |
| | | this.baseUrl = PROJ |
| | | this.getUrl() |
| | | }, |
| | | methods: { |
| | | getOrderDet(orderNo) { |
| | | if (!orderNo || orderNo.trim() === '') return; |
| | | uni.request({ |
| | | url: this.commonUrl + '/mobile/order/search/orderNoList/auth', |
| | | method: 'GET', |
| | | data: { |
| | | orderNo |
| | | }, |
| | | header: { |
| | | token: uni.getStorageSync('token') |
| | | }, |
| | | success: res => { |
| | | const list = res.data.data || []; |
| | | this.orderNoList = list.map(o => o.orderNo); |
| | | } |
| | | }); |
| | | }, |
| | | import permision from "@/common/permission.js"; |
| | | |
| | | onOrderSelect(order) { |
| | | this.orderNo = order; |
| | | // 可选:自动触发查询 |
| | | // this.getOrderDetlByOrderNo(); |
| | | }, |
| | | getOrderDetlByOrderNo() { |
| | | if (!this.orderNo) { |
| | | uni.showToast({ |
| | | title: '请选择订单', |
| | | icon: 'none' |
| | | }); |
| | | return; |
| | | } |
| | | let that = this; |
| | | uni.request({ |
| | | url: that.commonUrl + '/mobile/order/search/orderNo/auth', |
| | | data: { |
| | | orderNo: that.orderNo |
| | | }, |
| | | header: { |
| | | token: uni.getStorageSync('token') |
| | | }, |
| | | success(result) { |
| | | let res = result.data; |
| | | console.log(res.data[0]); |
| | | if (res.code === 200) { |
| | | if (res.data) { |
| | | uni.showLoading(); |
| | | that.matList = res.data[0].combMats; |
| | | that.initAnfme(); |
| | | console.log(that.matList); |
| | | } |
| | | } else if (res.code == 403) { |
| | | uni.showToast({ |
| | | title: res.msg, |
| | | icon: "none", |
| | | position: 'top' |
| | | }); |
| | | setTimeout(() => { |
| | | uni.reLaunch({ |
| | | url: '../login/login' |
| | | }); |
| | | }, 1000); |
| | | } else { |
| | | uni.showToast({ |
| | | title: res.msg, |
| | | icon: "none", |
| | | position: 'top' |
| | | }); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | export default { |
| | | data() { |
| | | return { |
| | | commonUrl: null, |
| | | |
| | | // Pallet |
| | | barcode: "", |
| | | barcodeFocus: true, |
| | | |
| | | // Scan Mode |
| | | scanMode: "multi", // 'one' | 'multi' |
| | | |
| | | // Carton Input |
| | | code: "", |
| | | codeFocus: false, |
| | | |
| | | // Zone |
| | | zoneList: [], |
| | | zoneIndex: -1, |
| | | |
| | | // Current List (Left Table) |
| | | matList: [], // { matnr: string, qty: number } |
| | | |
| | | // Queue List (Right Table) |
| | | queueList: [], // { barcode: string, zoneId: string, zoneName: string, cartons: [] } |
| | | |
| | | // System |
| | | baseIP: "", |
| | | basePORT: "", |
| | | baseUrl: "", |
| | | }; |
| | | }, |
| | | computed: { |
| | | totalQty() { |
| | | return this.matList.reduce((sum, item) => sum + (Number(item.qty) || 0), 0); |
| | | } |
| | | }, |
| | | mounted() { |
| | | const UIP = uni.getStorageSync("UIP"); |
| | | this.baseIP = UIP; |
| | | const UPORT = uni.getStorageSync("UPORT"); |
| | | this.basePORT = UPORT; |
| | | const PROJ = uni.getStorageSync("UPROJ"); |
| | | this.baseUrl = PROJ; |
| | | this.getUrl(); |
| | | |
| | | // Load Zones |
| | | this.getZoneList(); |
| | | }, |
| | | methods: { |
| | | getUrl() { |
| | | this.commonUrl = this.baseHttp + this.baseIP + ":" + this.basePORT + "/" + this.baseUrl; |
| | | }, |
| | | |
| | | // 1. Get Zone List |
| | | getZoneList() { |
| | | uni.showLoading({ title: "Loading Zones..." }); |
| | | uni.request({ |
| | | url: this.commonUrl + "/area/list/auth", |
| | | method: "POST", |
| | | data: { |
| | | }, |
| | | header: { token: uni.getStorageSync("token") }, |
| | | success: res => { |
| | | uni.hideLoading(); |
| | | const r = res.data; |
| | | if (r.code === 200) { |
| | | this.zoneList = (r.data && r.data.records) ? r.data.records : []; |
| | | // Default select first if available |
| | | if (this.zoneList.length > 0) { |
| | | this.zoneIndex = 0; |
| | | } |
| | | } else if (r.code === 403) { |
| | | uni.showToast({ title: r.msg || "Re-login required", icon: "none" }); |
| | | setTimeout(() => { |
| | | uni.reLaunch({ url: "/pages/login/login" }); |
| | | }, 1000); |
| | | } else { |
| | | uni.showToast({ title: r.msg || "Fetch failed", icon: "none" }); |
| | | } |
| | | }, |
| | | fail() { |
| | | uni.hideLoading(); |
| | | uni.showToast({ title: "Request failed", icon: "none" }); |
| | | }, |
| | | }); |
| | | }, |
| | | |
| | | // 2. Zone Change |
| | | zoneChange(e) { |
| | | this.zoneIndex = e.detail.value; |
| | | }, |
| | | |
| | | selectOrder(orderNo) { |
| | | this.order = orderNo |
| | | this.showDropdown = false |
| | | }, |
| | | removeOrder() { |
| | | this.order = '' |
| | | this.orderSuggestions = [] |
| | | this.showDropdown = false |
| | | }, |
| | | // 获取url |
| | | getUrl() { |
| | | this.commonUrl = this.baseHttp + this.baseIP + ':' + this.basePORT + "/" + this.baseUrl |
| | | }, |
| | | // barcode input 事件 |
| | | barcodeInput() { |
| | | var len = this.barcode.length |
| | | if (len != 6) { |
| | | uni.showToast({ |
| | | title: '托盘码有误请重试', |
| | | icon: "none", |
| | | position: 'top' |
| | | }); |
| | | this.barcodeFocuss() |
| | | return; |
| | | } |
| | | if (len == 6) { |
| | | this.focuss() |
| | | } |
| | | }, |
| | | codeInput() { |
| | | const that = this; |
| | | let m = that.code.split(";") |
| | | if (!m[1] || !m[5] || !m[9]) { |
| | | uni.showToast({ |
| | | title: '条码有误', |
| | | icon: "none", |
| | | position: 'top' |
| | | }); |
| | | this.codeFocuss() |
| | | return; |
| | | } |
| | | uni.request({ |
| | | url: that.commonUrl + '/mobile/order/search/orderDetl/auth', |
| | | data: JSON.stringify({ |
| | | orderNo: m[1], |
| | | sku: m[5], |
| | | upc: m[9], |
| | | }), |
| | | method: 'POST', |
| | | header: { |
| | | 'token': uni.getStorageSync('token'), |
| | | }, |
| | | success(result) { |
| | | var res = result.data; |
| | | if (res.code === 200) { |
| | | res.data.combMats.forEach(item => { |
| | | const existItem = that.matList.find(m => m.matnr === item.matnr && |
| | | m.standby2 === item.standby2 && |
| | | m.standby3 === item.standby3 && |
| | | m.boxtype3 === item.boxtype3 |
| | | ) |
| | | if (existItem) { |
| | | existItem.anfme = (existItem.anfme || 0) + (item.anfme || 1) |
| | | } else { |
| | | item.anfme = 1 |
| | | that.matList.push(item) |
| | | } |
| | | }) |
| | | that.codeFocuss() |
| | | } else if (res.code == 403) { |
| | | uni.showToast({ |
| | | title: res.msg, |
| | | icon: "none", |
| | | position: 'top' |
| | | }); |
| | | setTimeout(() => { |
| | | uni.reLaunch({ |
| | | url: '../login/login' |
| | | }); |
| | | }, 1000); |
| | | } else { |
| | | uni.showToast({ |
| | | title: res.msg, |
| | | icon: "none", |
| | | position: 'top' |
| | | }); |
| | | } |
| | | } |
| | | }); |
| | | console.log(m) |
| | | }, |
| | | // 托盘码有误重置 |
| | | codeFocuss() { |
| | | // 3. Mode Change |
| | | modeChange(e) { |
| | | this.scanMode = e.detail.value; |
| | | // If switching to 'one' and we have > 1 items, warn or clear? |
| | | // Requirement says: "One label per carton... only allows one data" |
| | | if (this.scanMode === 'one' && this.matList.length > 1) { |
| | | uni.showToast({ title: "Switched to One Label mode. Clearing extra items.", icon: "none" }); |
| | | this.matList = [this.matList[0]]; |
| | | } |
| | | }, |
| | | |
| | | let that = this; |
| | | that.codeFocus = false; |
| | | setTimeout(() => { |
| | | that.code = ''; |
| | | that.codeFocus = true; |
| | | }, 100); |
| | | // 4. Pallet Barcode Input |
| | | barcodeInput() { |
| | | if (!this.barcode) return; |
| | | // Validate if needed |
| | | this.barcodeFocus = false; |
| | | this.$nextTick(() => { |
| | | this.codeFocus = true; // Jump to carton scan |
| | | }); |
| | | }, |
| | | |
| | | }, |
| | | barcodeFocuss() { |
| | | // #ifdef APP |
| | | let that = this; |
| | | that.barcodeFocus = false; |
| | | setTimeout(() => { |
| | | that.barcode = ''; |
| | | that.barcodeFocus = true; |
| | | }, 100); |
| | | // #endif |
| | | }, |
| | | focuss() { |
| | | // #ifdef APP |
| | | let that = this; |
| | | that.focus = false; |
| | | setTimeout(() => { |
| | | that.matnrId = ''; |
| | | that.focus = true; |
| | | }, 100); |
| | | // #endif |
| | | }, |
| | | resst() { |
| | | this.matList = [] |
| | | this.barcode = '' |
| | | this.order = '' |
| | | this.orderNo = ''; |
| | | this.barcodeFocuss() |
| | | uni.vibrateShort(); |
| | | }, |
| | | removeBarcode() { |
| | | this.barcode = '' |
| | | uni.vibrateShort(); |
| | | this.barcodeFocus = false; |
| | | this.$nextTick(function() { |
| | | this.barcodeFocus = true; |
| | | }); |
| | | }, |
| | | removeCode() { |
| | | this.code = '' |
| | | uni.vibrateShort(); |
| | | this.codeFocus = false; |
| | | this.$nextTick(function() { |
| | | this.codeFocus = true; |
| | | }); |
| | | }, |
| | | removeOrder() { |
| | | this.order = '' |
| | | uni.vibrateShort(); |
| | | this.focus = false; |
| | | this.$nextTick(function() { |
| | | this.focus = true; |
| | | }); |
| | | }, |
| | | eject(type) { |
| | | this.type = type |
| | | // open 方法传入参数 等同在 uni-popup 组件上绑定 type属性 |
| | | this.$refs.revise.open(type) |
| | | }, |
| | | initAnfme() { |
| | | // 5. Carton Code Input |
| | | codeInput() { |
| | | if (!this.code) { |
| | | this.codeFocus = false; |
| | | this.$nextTick(() => this.codeFocus = true); |
| | | return; |
| | | } |
| | | |
| | | for (var i = 0; i < this.matList.length; i++) { |
| | | this.matList[i].enableQty = this.matList[i].anfme |
| | | this.matList[i].anfme = 0 |
| | | } |
| | | uni.hideLoading(); |
| | | }, |
| | | revise(item, index) { |
| | | var maxCount = this.matList[index].maxCount |
| | | if (maxCount == undefined) { |
| | | this.matList[index]["maxCount"] = item.enableQty |
| | | } |
| | | this.enableQty = item.enableQty |
| | | this.count = this.minCount |
| | | this.maxCount = item.maxCount |
| | | this.rowNum = index |
| | | this.eject() |
| | | }, |
| | | changeMax() { |
| | | this.count = this.enableQty |
| | | }, |
| | | changeValue() { |
| | | // Check Mode Constraints |
| | | if (this.scanMode === 'one') { |
| | | if (this.matList.length >= 1) { |
| | | uni.showToast({ title: "One Label Mode: Only 1 carton allowed per pallet.", icon: "none" }); |
| | | this.code = ""; |
| | | this.codeFocus = false; |
| | | this.$nextTick(() => this.codeFocus = true); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | }, |
| | | remove() { |
| | | console.log(this.matList.filter(item => item.checked !== true)) |
| | | this.matList = this.matList.filter(item => item.checked !== true) |
| | | if (this.queueList.some(q => q.barcode === this.barcode)) { |
| | | uni.showToast({ title: "Pallet Barcode has been in queue", icon: "none" }); |
| | | this.code = ""; |
| | | this.codeFocus = false; |
| | | this.$nextTick(() => this.codeFocus = true); |
| | | return; |
| | | } |
| | | |
| | | // this.matList.splice(i,1) |
| | | const cartonLabel = this.code; |
| | | if (this.queueList.some(q => (q.cartons || []).some(c => c.barcode === cartonLabel))) { |
| | | uni.showToast({ title: "Label has been in queue", icon: "none" }); |
| | | this.code = ""; |
| | | this.codeFocus = false; |
| | | this.$nextTick(() => this.codeFocus = true); |
| | | return; |
| | | } |
| | | uni.showLoading({ title: "Scanning..." }); |
| | | |
| | | // for (var i = 0; i < this.matList.length; i++) { |
| | | // if (this.matList[i].checked == true) { |
| | | uni.request({ |
| | | url: this.commonUrl + "/mobile/cartonScan/auth", |
| | | method: "POST", |
| | | data: { |
| | | cartonLabel: cartonLabel |
| | | }, |
| | | header: { token: uni.getStorageSync("token") }, |
| | | success: (res) => { |
| | | uni.hideLoading(); |
| | | const r = res.data; |
| | | if (r.code === 200) { |
| | | const data = r.data || {}; |
| | | const newItem = { |
| | | matnr: data.matnr || data.cartonLabel || cartonLabel, |
| | | barcode: data.barcode || cartonLabel, |
| | | cartonLabel:data.barcode || cartonLabel, |
| | | anfme: data.anfme || 0, |
| | | orderNo: data.orderNo, // Store orderNo from API |
| | | ...data // Store other fields |
| | | }; |
| | | |
| | | // Check if exists in current list |
| | | const exist = this.matList.find(m => m.barcode === newItem.barcode); |
| | | if (exist) { |
| | | exist.anfme = newItem.anfme; |
| | | } else { |
| | | this.matList.push(newItem); |
| | | } |
| | | |
| | | uni.vibrateShort(); |
| | | } else if (r.code === 403) { |
| | | uni.showToast({ title: r.msg || "Re-login required", icon: "none" }); |
| | | setTimeout(() => { |
| | | uni.reLaunch({ url: "/pages/login/login" }); |
| | | }, 1000); |
| | | } else { |
| | | uni.showToast({ title: r.msg || "Scan failed", icon: "none" }); |
| | | } |
| | | |
| | | // Clear and Refocus |
| | | this.code = ""; |
| | | this.codeFocus = false; |
| | | this.$nextTick(() => this.codeFocus = true); |
| | | }, |
| | | fail: () => { |
| | | uni.hideLoading(); |
| | | uni.showToast({ title: "Request failed", icon: "none" }); |
| | | this.code = ""; |
| | | this.codeFocus = false; |
| | | this.$nextTick(() => this.codeFocus = true); |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | removeCurrentItem(index) { |
| | | this.matList.splice(index, 1); |
| | | }, |
| | | |
| | | // } |
| | | // } |
| | | this.checkList(); |
| | | uni.vibrateShort(); |
| | | }, |
| | | // 列表中删除 |
| | | // remove(item,index) { |
| | | // this.matList.splice(index,1) |
| | | // uni.vibrateShort(); |
| | | // }, |
| | | confirm() { |
| | | this.matList[this.rowNum].anfme = this.count |
| | | this.$refs.revise.close() |
| | | }, |
| | | comb() { |
| | | uni.vibrateShort(); |
| | | let that = this; |
| | | // 6. Add to Queue |
| | | addToQueue() { |
| | | if (!this.barcode) { |
| | | uni.showToast({ title: "Please scan Pallet Barcode", icon: "none" }); |
| | | return; |
| | | } |
| | | if (this.matList.length === 0) { |
| | | uni.showToast({ title: "Please scan Carton Labels", icon: "none" }); |
| | | return; |
| | | } |
| | | if (this.zoneIndex < 0 || !this.zoneList[this.zoneIndex]) { |
| | | uni.showToast({ title: "Please select a Zone", icon: "none" }); |
| | | return; |
| | | } |
| | | |
| | | if (that.barcode === '') { |
| | | uni.showToast({ |
| | | title: '请扫描托盘条码', |
| | | icon: "none", |
| | | position: 'top' |
| | | }); |
| | | return; |
| | | } |
| | | if (that.barcode.length !== 6) { |
| | | uni.showToast({ |
| | | title: '托盘码必须为6位', |
| | | icon: "none", |
| | | position: 'top' |
| | | }); |
| | | return; |
| | | } |
| | | if (that.matList.length === 0) { |
| | | uni.showToast({ |
| | | title: '请添加商品列表', |
| | | icon: "none", |
| | | position: 'top' |
| | | }); |
| | | return; |
| | | } |
| | | const zone = this.zoneList[this.zoneIndex]; |
| | | |
| | | // 过滤出数量大于0的商品 |
| | | const validMats = that.matList.filter(item => item.anfme > 0); |
| | | // Extract orderNo from first carton if available (assuming same order per pallet or taking first) |
| | | const firstCarton = this.matList[0] || {}; |
| | | const orderNo = firstCarton.orderNo || ""; |
| | | |
| | | if (validMats.length === 0) { |
| | | uni.showToast({ |
| | | title: '所有商品组托数量为0,无法组托', |
| | | icon: "none", |
| | | position: 'top' |
| | | }); |
| | | return; |
| | | } |
| | | this.queueList.push({ |
| | | barcode: this.barcode, |
| | | zoneId: zone.id, // Submit ID |
| | | zoneName: zone.areaId, // Display areaId |
| | | orderNo: orderNo, // Add orderNo |
| | | cartons: JSON.parse(JSON.stringify(this.matList)) // Deep copy |
| | | }); |
| | | |
| | | // 删除数量为0的商品 |
| | | that.matList = validMats; |
| | | // Clear Inputs |
| | | this.barcode = ""; |
| | | this.matList = []; |
| | | this.barcodeFocus = true; // Focus back to pallet |
| | | |
| | | uni.showToast({ title: "Added to Queue", icon: "success" }); |
| | | }, |
| | | |
| | | uni.showLoading(); |
| | | removeFromQueue(index) { |
| | | this.queueList.splice(index, 1); |
| | | }, |
| | | |
| | | uni.request({ |
| | | url: that.commonUrl + '/mobile/comb/auth', |
| | | data: JSON.stringify({ |
| | | billNo: that.orderNo, |
| | | orderNo: that.orderNo, |
| | | barcode: that.barcode, |
| | | combMats: validMats |
| | | }), |
| | | method: 'POST', |
| | | header: { |
| | | 'token': uni.getStorageSync('token'), |
| | | }, |
| | | success(result) { |
| | | uni.showLoading(); |
| | | var res = result.data; |
| | | if (res.code === 200) { |
| | | uni.showToast({ |
| | | title: res.msg, |
| | | position: 'top', |
| | | duration: 1000 |
| | | }); |
| | | that.resst(); |
| | | } else if (res.code == 403) { |
| | | uni.showToast({ |
| | | title: res.msg, |
| | | icon: "none", |
| | | position: 'top' |
| | | }); |
| | | setTimeout(() => { |
| | | uni.reLaunch({ |
| | | url: '../login/login' |
| | | }); |
| | | }, 1000); |
| | | } else { |
| | | uni.showToast({ |
| | | title: res.msg, |
| | | icon: "none", |
| | | position: 'top' |
| | | }); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | // 7. Move to ASRS (Submit) |
| | | moveToASRS() { |
| | | if (this.queueList.length === 0) { |
| | | uni.showToast({ title: "Queue is empty", icon: "none" }); |
| | | return; |
| | | } |
| | | |
| | | findOrder() { |
| | | let that = this |
| | | uni.request({ |
| | | url: that.commonUrl + '/mobile/order/search/orderNo/auth', |
| | | data: { |
| | | orderNo: that.order |
| | | }, |
| | | header: { |
| | | 'token': uni.getStorageSync('token') |
| | | }, |
| | | success(result) { |
| | | let res = result.data |
| | | console.log(res.data[0]) |
| | | if (res.code === 200) { |
| | | if (res.data) { |
| | | uni.showLoading(); |
| | | that.matList = res.data[0].combMats; |
| | | that.orderNo = that.order |
| | | that.initAnfme() |
| | | console.log(that.matList) |
| | | } |
| | | } else if (res.code == 403) { |
| | | uni.showToast({ |
| | | title: res.msg, |
| | | icon: "none", |
| | | position: 'top' |
| | | }) |
| | | setTimeout(() => { |
| | | uni.reLaunch({ |
| | | url: '../login/login' |
| | | }); |
| | | }, 1000); |
| | | } else { |
| | | uni.showToast({ |
| | | title: res.msg, |
| | | icon: "none", |
| | | position: 'top' |
| | | }) |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | change(e) { |
| | | // console.log('当前模式:' + e.type + ',状态:' + e.show); |
| | | }, |
| | | toggle(type) { |
| | | this.type = type |
| | | // open 方法传入参数 等同在 uni-popup 组件上绑定 type属性 |
| | | this.$refs.goodsSearch.open(type) |
| | | }, |
| | | // 列表选择 |
| | | checkbox(e) { |
| | | const values = e.detail.value; |
| | | this.matList.forEach(item => { |
| | | // 确保 item.id 是字符串 |
| | | const itemId = item.id + ''; |
| | | item.checked = values.includes(itemId); |
| | | }); |
| | | const that = this; |
| | | uni.showLoading({ title: "Submitting..." }); |
| | | |
| | | if (values.length === this.matList.length) { |
| | | this.check = true; |
| | | this.checkText = "取消全选"; |
| | | } else { |
| | | this.check = false; |
| | | this.checkText = "全选"; |
| | | } |
| | | // Submit to API |
| | | uni.request({ |
| | | url: that.commonUrl + "/mobile/cartonComb/auth", |
| | | method: "POST", |
| | | data: that.queueList, |
| | | header: { |
| | | token: uni.getStorageSync("token"), |
| | | 'content-type': 'application/json' |
| | | }, |
| | | success: (res) => { |
| | | uni.hideLoading(); |
| | | const r = res.data; |
| | | if (r.code === 200) { |
| | | uni.showToast({ title: "Moved to ASRS Successfully", icon: "success" }); |
| | | that.queueList = []; // Clear Queue |
| | | that.cancelAll(); // Reset form |
| | | } else if (r.code === 403) { |
| | | uni.showToast({ title: r.msg || "Re-login required", icon: "none" }); |
| | | setTimeout(() => { |
| | | uni.reLaunch({ url: "/pages/login/login" }); |
| | | }, 1000); |
| | | } else { |
| | | uni.showToast({ title: r.msg || "Submission failed", icon: "none" }); |
| | | } |
| | | }, |
| | | fail: () => { |
| | | uni.hideLoading(); |
| | | uni.showToast({ title: "Network request failed", icon: "none" }); |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | uni.vibrateShort(); |
| | | }, |
| | | |
| | | // 列表反选 |
| | | reChecked() { |
| | | if (this.matList.length == 0) { |
| | | return; |
| | | } |
| | | var checkArr = [] |
| | | for (var i = 0; i < this.matList.length; i++) { |
| | | if (this.matList[i].checked == true) { |
| | | this.$set(this.matList[i], 'checked', false) |
| | | } else { |
| | | this.$set(this.matList[i], 'checked', true) |
| | | } |
| | | if (this.matList[i].checked == true) { |
| | | checkArr.push(this.matList[i].checked) |
| | | } |
| | | } |
| | | if (checkArr.length == this.matList.length) { |
| | | this.check = true |
| | | this.checkText = "取消全选" |
| | | } else { |
| | | this.check = false |
| | | this.checkText = "全选" |
| | | } |
| | | uni.vibrateShort(); |
| | | }, |
| | | // 列表全选 |
| | | allChecked(e) { |
| | | if (this.check == true) { |
| | | for (var i = 0; i < this.matList.length; i++) { |
| | | this.$set(this.matList[i], 'checked', false) |
| | | } |
| | | this.check = false |
| | | this.checkText = "全选" |
| | | } else { |
| | | for (var i = 0; i < this.matList.length; i++) { |
| | | this.$set(this.matList[i], 'checked', true) |
| | | } |
| | | this.check = true |
| | | this.checkText = "取消全选" |
| | | } |
| | | uni.vibrateShort(); |
| | | }, |
| | | // 检验列表长度 等于0 显示全选 |
| | | checkList() { |
| | | if (this.matList.length == 0) { |
| | | this.check = false |
| | | this.checkText = "全选" |
| | | return; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | // 8. Cancel |
| | | cancelAll() { |
| | | this.barcode = ""; |
| | | this.matList = []; |
| | | this.queueList = []; // User said "Cancel ... clear queue list" |
| | | this.code = ""; |
| | | this.scanMode = "multi"; // Reset default? |
| | | this.barcodeFocus = true; |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style> |
| | | /* @import "../../colorui/main.css"; |
| | | @import "../../colorui/icon.css"; */ |
| | | .square-1 .lable { |
| | | display: inline-block; |
| | | float: right; |
| | | height: 100%; |
| | | width: 400rpx; |
| | | } |
| | | <style scoped> |
| | | .page-container { |
| | | background-color: #f1f1f1; |
| | | height: 100vh; |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .square-1 .lable label { |
| | | display: inline-block; |
| | | float: left; |
| | | height: 100%; |
| | | width: 90rpx; |
| | | line-height: 100rpx; |
| | | } |
| | | .page-scroll { |
| | | flex: 1; |
| | | padding: 20rpx; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .pak-seach-box { |
| | | background-color: #FFFFFF; |
| | | margin: 15rpx 15rpx 0rpx 15rpx; |
| | | width: 96%; |
| | | height: 150rpx; |
| | | border-radius: 20rpx; |
| | | } |
| | | /* Card Styling */ |
| | | .card-box { |
| | | background-color: #ffffff; |
| | | border-radius: 12rpx; |
| | | margin-bottom: 20rpx; |
| | | box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.03); |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .box-top { |
| | | display: block; |
| | | height: 60rpx; |
| | | width: 720rpx; |
| | | } |
| | | .card-header { |
| | | padding: 20rpx; |
| | | border-bottom: 1rpx solid #f0f0f0; |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .color-block-blue { |
| | | background-color: #1E9FFF; |
| | | display: inline-block; |
| | | float: left; |
| | | margin: 15rpx 15rpx 0 15rpx; |
| | | width: 12rpx; |
| | | height: 40rpx; |
| | | border: 5rpx solid #1E9FFF; |
| | | border-radius: 20rpx; |
| | | } |
| | | .header-indicator { |
| | | width: 8rpx; |
| | | height: 28rpx; |
| | | background-color: #007aff; |
| | | border-radius: 4rpx; |
| | | margin-right: 16rpx; |
| | | } |
| | | |
| | | .title { |
| | | display: inline-block; |
| | | float: left; |
| | | font-size: 34rpx; |
| | | font-weight: 700; |
| | | height: 50rpx; |
| | | line-height: 50rpx; |
| | | margin-top: 10rpx; |
| | | } |
| | | .header-title { |
| | | font-size: 30rpx; |
| | | font-weight: bold; |
| | | color: #333; |
| | | } |
| | | |
| | | .box-buttom { |
| | | display: inline-block; |
| | | background-color: #ededed; |
| | | width: 96%; |
| | | height: 60rpx; |
| | | border-radius: 20rpx; |
| | | margin: 15rpx 15rpx 0rpx 15rpx; |
| | | } |
| | | .small-header { |
| | | padding: 15rpx 20rpx; |
| | | background-color: #fafafa; |
| | | } |
| | | |
| | | .box-buttom input { |
| | | width: 75%; |
| | | float: left; |
| | | margin: 8rpx 10rpx 0rpx 25rpx; |
| | | } |
| | | .card-body { |
| | | padding: 20rpx; |
| | | } |
| | | |
| | | .box-buttom .search-icon { |
| | | width: 60rpx; |
| | | height: 60rpx; |
| | | float: right; |
| | | margin-top: 5rpx; |
| | | margin-right: 10rpx; |
| | | } |
| | | /* Inputs */ |
| | | .input-wrapper { |
| | | background-color: #f5f7fa; |
| | | border-radius: 8rpx; |
| | | padding: 0 20rpx; |
| | | height: 80rpx; |
| | | display: flex; |
| | | align-items: center; |
| | | border: 1rpx solid #e0e0e0; |
| | | } |
| | | |
| | | .pak-seach-box button { |
| | | background-color: #1E9FFF; |
| | | color: #ffffff; |
| | | display: inline-block; |
| | | float: right; |
| | | width: 150rpx; |
| | | height: 60rpx; |
| | | margin: 15rpx 15rpx 0rpx 15rpx; |
| | | line-height: 60rpx; |
| | | } |
| | | .custom-input { |
| | | flex: 1; |
| | | height: 100%; |
| | | font-size: 28rpx; |
| | | color: #333; |
| | | } |
| | | |
| | | .pakin-btn { |
| | | background-color: #1E9FFF; |
| | | } |
| | | .icon-scan { |
| | | padding: 10rpx; |
| | | } |
| | | |
| | | .pak-data-box { |
| | | background-color: #F1F1F1; |
| | | margin: 15rpx 15rpx 0rpx 15rpx; |
| | | width: 96%; |
| | | height: 70rpx; |
| | | border-radius: 20rpx; |
| | | } |
| | | .input-row { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .pak-data-box .box-top { |
| | | background-color: #FFFFFF; |
| | | height: 70rpx; |
| | | border-radius: 20rpx 20rpx 20rpx 20rpx; |
| | | } |
| | | /* Radio Group */ |
| | | .radio-group-vertical { |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .bg-false { |
| | | background-color: #FFFFFF; |
| | | } |
| | | .radio-row { |
| | | display: flex; |
| | | align-items: center; |
| | | padding: 10rpx 0; |
| | | } |
| | | |
| | | .bg-true { |
| | | background-color: #ebebeb; |
| | | } |
| | | .radio-label { |
| | | font-size: 28rpx; |
| | | margin-left: 10rpx; |
| | | color: #333; |
| | | } |
| | | |
| | | .data-list { |
| | | border-bottom: 1px solid #d8d8d8; |
| | | height: 180rpx; |
| | | margin: 15rpx; |
| | | border-radius: 20rpx; |
| | | } |
| | | /* Zone & Form */ |
| | | .form-row { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .data-list:first-child { |
| | | margin-top: 20rpx; |
| | | } |
| | | .form-label { |
| | | font-weight: bold; |
| | | font-size: 28rpx; |
| | | margin-right: 20rpx; |
| | | color: #333; |
| | | } |
| | | |
| | | .data-list:last-child { |
| | | margin-bottom: 160rpx; |
| | | } |
| | | .picker-box { |
| | | background-color: #f5f7fa; |
| | | border: 1rpx solid #e0e0e0; |
| | | border-radius: 8rpx; |
| | | height: 70rpx; |
| | | padding: 0 20rpx; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | } |
| | | |
| | | /* .data-list-left { |
| | | display: inline-block; |
| | | float: left; |
| | | text-align: center; |
| | | width: 100rpx; |
| | | height: 180rpx; |
| | | line-height: 180rpx; |
| | | } */ |
| | | .left-check-box { |
| | | display: inline-block; |
| | | /* background-color: #1E9FFF; */ |
| | | float: left; |
| | | height: 100%; |
| | | width: 100rpx; |
| | | text-align: center; |
| | | line-height: 170rpx; |
| | | } |
| | | .picker-text { |
| | | font-size: 28rpx; |
| | | color: #333; |
| | | } |
| | | |
| | | .data-list-left { |
| | | /* background-color: #ffff7f; */ |
| | | display: inline-block; |
| | | float: left; |
| | | height: 180rpx; |
| | | width: 500rpx; |
| | | color: #676767; |
| | | } |
| | | /* Tables */ |
| | | .tables-section { |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .matnr { |
| | | padding-top: 10rpx; |
| | | } |
| | | .no-padding { |
| | | padding: 0; |
| | | } |
| | | |
| | | .data-list-right { |
| | | /* background-color: #55ffff; */ |
| | | display: inline-block; |
| | | float: right; |
| | | width: 100rpx; |
| | | height: 180rpx; |
| | | line-height: 180rpx; |
| | | } |
| | | .table-header-row { |
| | | display: flex; |
| | | background-color: #f0f2f5; |
| | | padding: 15rpx 20rpx; |
| | | font-weight: bold; |
| | | font-size: 26rpx; |
| | | color: #666; |
| | | } |
| | | |
| | | .data-list-right label { |
| | | display: inline-block; |
| | | float: left; |
| | | width: 100rpx; |
| | | height: 180rpx; |
| | | } |
| | | .table-body-scroll { |
| | | max-height: 300rpx; |
| | | overflow-y: auto; |
| | | } |
| | | |
| | | .revise-box { |
| | | width: 500rpx; |
| | | height: 500rpx; |
| | | } |
| | | .table-row { |
| | | display: flex; |
| | | padding: 20rpx; |
| | | border-bottom: 1rpx solid #eee; |
| | | align-items: center; |
| | | font-size: 26rpx; |
| | | } |
| | | |
| | | .revise-box-top { |
| | | width: 100%; |
| | | height: 100rpx; |
| | | background-color: #fff; |
| | | padding: 10rpx; |
| | | } |
| | | .col-2 { flex: 2; } |
| | | .col-1 { flex: 1; } |
| | | .col-05 { flex: 0.5; } |
| | | |
| | | .changeBox { |
| | | width: 100%; |
| | | height: 100rpx; |
| | | line-height: 120rpx; |
| | | text-align: center; |
| | | background-color: #FFF; |
| | | margin-top: 20rpx; |
| | | border-bottom: 1px solid #e3e3e3; |
| | | } |
| | | .text-center { text-align: center; } |
| | | .text-cut { |
| | | overflow: hidden; |
| | | white-space: nowrap; |
| | | text-overflow: ellipsis; |
| | | } |
| | | |
| | | .text-box { |
| | | width: 100%; |
| | | height: 100rpx; |
| | | line-height: 120rpx; |
| | | text-align: center; |
| | | /* padding-left: 120rpx; */ |
| | | background-color: #FFF; |
| | | margin-top: 20rpx; |
| | | border-bottom: 1px solid #e3e3e3; |
| | | } |
| | | .empty-state { |
| | | padding: 40rpx; |
| | | text-align: center; |
| | | color: #999; |
| | | font-size: 26rpx; |
| | | } |
| | | |
| | | .changeBox .num-box { |
| | | display: inline-block; |
| | | float: left; |
| | | } |
| | | .table-footer-info { |
| | | padding: 15rpx 20rpx; |
| | | text-align: right; |
| | | font-size: 26rpx; |
| | | background-color: #fff; |
| | | border-top: 1rpx solid #f0f0f0; |
| | | } |
| | | |
| | | .changeBox button { |
| | | float: left; |
| | | } |
| | | /* Queue List */ |
| | | .queue-list-scroll { |
| | | max-height: 400rpx; |
| | | padding: 10rpx; |
| | | background-color: #f8faff; |
| | | } |
| | | |
| | | .revise-box-buttom { |
| | | position: absolute; |
| | | width: 100%; |
| | | height: 100rpx; |
| | | line-height: 100rpx; |
| | | background-color: #FFFFFF; |
| | | bottom: 0; |
| | | text-align: center; |
| | | } |
| | | </style> |
| | | .queue-card { |
| | | background-color: #fff; |
| | | border: 1rpx solid #eee; |
| | | border-radius: 8rpx; |
| | | margin-bottom: 10rpx; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .queue-header { |
| | | padding: 15rpx; |
| | | background-color: #eef6ff; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | font-size: 26rpx; |
| | | } |
| | | |
| | | .queue-content { |
| | | padding: 10rpx 15rpx; |
| | | } |
| | | |
| | | .queue-detail-row { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | font-size: 24rpx; |
| | | padding: 5rpx 0; |
| | | } |
| | | |
| | | /* Footer Actions */ |
| | | .footer-actions { |
| | | position: fixed; |
| | | bottom: 0; |
| | | left: 0; |
| | | right: 0; |
| | | height: 120rpx; |
| | | background-color: #fff; |
| | | display: flex; |
| | | align-items: center; |
| | | padding: 0 20rpx; |
| | | box-shadow: 0 -2rpx 10rpx rgba(0,0,0,0.05); |
| | | z-index: 99; |
| | | } |
| | | |
| | | /* Utilities */ |
| | | .flex-1 { flex: 1; } |
| | | .margin-top-sm { margin-top: 20rpx; } |
| | | .margin-left-sm { margin-left: 20rpx; } |
| | | .margin-right-sm { margin-right: 20rpx; } |
| | | .margin-right-xs { margin-right: 10rpx; } |
| | | .text-bold { font-weight: bold; } |
| | | .text-blue { color: #007aff; } |
| | | .text-dark { color: #333; } |
| | | .text-grey { color: #888; } |
| | | .text-sm { font-size: 24rpx; } |
| | | |
| | | </style> |