From 7437dd7b944aaeb64e98a1e0a5943ec88db4afab Mon Sep 17 00:00:00 2001
From: lty <876263681@qq.com>
Date: 星期二, 03 二月 2026 15:37:00 +0800
Subject: [PATCH] #新增扫内部码入库和换码功能
---
pages/basics/codePakin.vue | 1486 ++++++++++++++++++++++++++---------------------------------
1 files changed, 651 insertions(+), 835 deletions(-)
diff --git a/pages/basics/codePakin.vue b/pages/basics/codePakin.vue
index 875bed8..4693db6 100644
--- a/pages/basics/codePakin.vue
+++ b/pages/basics/codePakin.vue
@@ -1,898 +1,714 @@
<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>
\ No newline at end of file
+.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>
--
Gitblit v1.9.1