Browse Source

新增历史记录补录功能

chensibo 14 hours ago
parent
commit
e734e8a7f9
4 changed files with 1157 additions and 400 deletions
  1. 2 2
      manifest.json
  2. 11 1
      pages.json
  3. 444 397
      pages/tabbar/workbranch.vue
  4. 700 0
      pages/workbranch/warehouse/historicalMaterialImport/index.vue

+ 2 - 2
manifest.json

@@ -2,8 +2,8 @@
     "name" : "东智MOM",
     "appid" : "__UNI__9190AB0",
     "description" : "",
-    "versionName" : "1.0.4",
-    "versionCode" : 261020,
+    "versionName" : "1.0.5",
+    "versionCode" : 261021,
     "transformPx" : false,
     /* 5+App特有相关 */
     "app-plus" : {

+ 11 - 1
pages.json

@@ -807,7 +807,17 @@
     {
       "path": "pages/workbranch/warehouse/scanInOut/Out/scanTieInputs/scanTieInputsDetail",
       "style": {
-        "navigationBarTitleText": "扫码出库(需要贴纸id的时候)",
+        "navigationBarTitleText": "扫码出库明细(需要贴纸id的时候)",
+        "navigationStyle": "custom",
+        "app-plus": {
+          "background": "#FFFFFF"
+        }
+      }
+    },
+    {
+      "path": "pages/workbranch/warehouse/historicalMaterialImport/index",
+      "style": {
+        "navigationBarTitleText": "历史物料补录",
         "navigationStyle": "custom",
         "app-plus": {
           "background": "#FFFFFF"

+ 444 - 397
pages/tabbar/workbranch.vue

@@ -1,10 +1,20 @@
 <template>
   <view>
-    <gui-page :custom-header="true" :is-header-sized="false" :header-class="['gui-bg-gray', 'gui-dark-bg-level-1']">
+    <gui-page
+      :custom-header="true"
+      :is-header-sized="false"
+      :header-class="['gui-bg-gray', 'gui-dark-bg-level-1']"
+    >
       <template #gHeader>
-        <view style="height:44px;" class="gui-flex gui-nowrap gui-rows gui-align-items-center">
+        <view
+          style="height: 44px"
+          class="gui-flex gui-nowrap gui-rows gui-align-items-center"
+        >
           <!-- 导航文本此处也可以是其他自定义内容 -->
-          <text class="gui-h4 gui-blod gui-flex1 gui-text-center gui-ellipsis gui-primary-text">工作台</text>
+          <text
+            class="gui-h4 gui-blod gui-flex1 gui-text-center gui-ellipsis gui-primary-text"
+            >工作台</text
+          >
           <!-- 此处加一个右侧展位元素与左侧同宽,实现标题居中 -->
           <!-- 实际宽度请根据自己情况设置 -->
           <!-- 如果右侧有其他内容可以利用条件编译和定位来实现-->
@@ -34,16 +44,27 @@
             </view>
             <view
               class="grid-list"
-              :style="[isPad == true?'grid-template-columns: repeat(5, 1fr)':
-                isPhone == true?'grid-template-columns: repeat(4, 1fr)':
-                'grid-template-columns: repeat(3, 1fr)']"
+              :style="[
+                isPad == true
+                  ? 'grid-template-columns: repeat(5, 1fr)'
+                  : isPhone == true
+                    ? 'grid-template-columns: repeat(4, 1fr)'
+                    : 'grid-template-columns: repeat(3, 1fr)',
+              ]"
             >
-              <view v-for="(item, key) in systemList" :key="key" class="gui-grid">
+              <view
+                v-for="(item, key) in systemList"
+                :key="key"
+                class="gui-grid"
+              >
                 <view class="gui-grid-item" @click="handleTap(item)">
                   <text
                     :class="['gui-grid-icon', item.iconClass ?? 'font-icons']"
-                  >{{ item.iconBase }}</text>
-                  <text class="gui-grid-text gui-color-black">{{ item.name }}</text>
+                    >{{ item.iconBase }}</text
+                  >
+                  <text class="gui-grid-text gui-color-black">{{
+                    item.name
+                  }}</text>
                 </view>
               </view>
               <!-- <view class="gui-grid">
@@ -61,9 +82,13 @@
             </view>
             <view
               class="grid-list"
-              :style="[isPad == true?'grid-template-columns: repeat(5, 1fr)':
-                isPhone == true?'grid-template-columns: repeat(4, 1fr)':
-                'grid-template-columns: repeat(3, 1fr)']"
+              :style="[
+                isPad == true
+                  ? 'grid-template-columns: repeat(5, 1fr)'
+                  : isPhone == true
+                    ? 'grid-template-columns: repeat(4, 1fr)'
+                    : 'grid-template-columns: repeat(3, 1fr)',
+              ]"
             >
               <view
                 v-for="(item, key) in WMSList"
@@ -74,8 +99,11 @@
                 <view class="gui-grid-item" @click="handleTap(item)">
                   <text
                     :class="['gui-grid-icon', item.iconClass ?? 'font-icons']"
-                  >{{ item.iconBase }}</text>
-                  <text class="gui-grid-text gui-color-black">{{ item.name }}</text>
+                    >{{ item.iconBase }}</text
+                  >
+                  <text class="gui-grid-text gui-color-black">{{
+                    item.name
+                  }}</text>
                 </view>
               </view>
             </view>
@@ -167,24 +195,19 @@
 
 <script>
 // import { getCLodop } from "../../unit/CLodopfuncs2.js"
-import {
-  ref,
-  getCurrentInstance
-} from 'vue'
+import { ref, getCurrentInstance } from "vue";
 export default {
   setup() {
-    const {
-      proxy
-    } = getCurrentInstance()
-    console.log(proxy)
-    const errorTip = ref('')
-    const errorTipMessage = ref('')
-    const srcs = ref([])
+    const { proxy } = getCurrentInstance();
+    console.log(proxy);
+    const errorTip = ref("");
+    const errorTipMessage = ref("");
+    const srcs = ref([]);
     const systemList = ref([
       {
-      	iconClass: 'font-icons',
-      	iconBase: '\ue6aa',
-      	name: '打印测试'
+        iconClass: "font-icons",
+        iconBase: "\ue6aa",
+        name: "打印测试",
       },
       // {
       // 	iconClass: 'font-icons',
@@ -197,54 +220,65 @@ export default {
       // 	name: "蓝牙测试"
       // },
       {
-        iconClass: 'font-icons',
-        iconBase: '\ue6d8',
-        name: '蓝牙配置'
-      }
-    ])
-    const SRMList = ref([{
-      iconClass: 'font-icons',
-      iconBase: '\ue692',
-      name: '预收单'
-    }])
-    const ETMList = ref([{
-      iconClass: 'font-icons',
-      iconBase: '\ue7f2',
-      name: '模具保养'
-    }])
-    const MESList = ref([{
-      iconClass: 'font-icons',
-      iconBase: '\ue692',
-      permission: 'system:home:glue',
-      name: '点胶机'
-    }, {
-      iconClass: 'font-icons',
-      iconBase: '\ue692',
-      permission: '',
-      // permission: 'system:home:ipqc',
-      name: 'IPQC检验'
-    }, {
-      iconClass: 'font-icons',
-      iconBase: '\ue692',
-      permission: '',
-      // permission: 'system:home:oqc',
-      name: 'IQC检验'
-    }, {
-      iconClass: 'font-icons',
-      iconBase: '\ue692',
-      permission: 'system:home:cutting',
-      name: '分切'
-    }, {
-      iconClass: 'font-icons',
-      iconBase: '\ue692',
-      permission: '',
-      name: '工序执行'
-    }, {
-      iconClass: 'font-icons',
-      iconBase: '\ue692',
-      permission: '',
-      name: '全检执行'
-    }])
+        iconClass: "font-icons",
+        iconBase: "\ue6d8",
+        name: "蓝牙配置",
+      },
+    ]);
+    const SRMList = ref([
+      {
+        iconClass: "font-icons",
+        iconBase: "\ue692",
+        name: "预收单",
+      },
+    ]);
+    const ETMList = ref([
+      {
+        iconClass: "font-icons",
+        iconBase: "\ue7f2",
+        name: "模具保养",
+      },
+    ]);
+    const MESList = ref([
+      {
+        iconClass: "font-icons",
+        iconBase: "\ue692",
+        permission: "system:home:glue",
+        name: "点胶机",
+      },
+      {
+        iconClass: "font-icons",
+        iconBase: "\ue692",
+        permission: "",
+        // permission: 'system:home:ipqc',
+        name: "IPQC检验",
+      },
+      {
+        iconClass: "font-icons",
+        iconBase: "\ue692",
+        permission: "",
+        // permission: 'system:home:oqc',
+        name: "IQC检验",
+      },
+      {
+        iconClass: "font-icons",
+        iconBase: "\ue692",
+        permission: "system:home:cutting",
+        name: "分切",
+      },
+      {
+        iconClass: "font-icons",
+        iconBase: "\ue692",
+        permission: "",
+        name: "工序执行",
+      },
+      {
+        iconClass: "font-icons",
+        iconBase: "\ue692",
+        permission: "",
+        name: "全检执行",
+      },
+    ]);
     const WMSList = ref([
       // {
       // 	iconClass: "font-icons",
@@ -263,36 +297,42 @@ export default {
       //   name: '扫码出入库'
       // },
       {
-        iconClass: 'font-icons',
-        iconBase: '\ue7d4',
-        permission: '',
-        name: '来料登记'
+        iconClass: "font-icons",
+        iconBase: "\ue7d4",
+        permission: "",
+        name: "来料登记",
       },
       {
-        iconClass: 'font-icons',
-        iconBase: '\ue692',
-        permission: '',
+        iconClass: "font-icons",
+        iconBase: "\ue692",
+        permission: "",
         // permission: 'system:home:oqc',
-        name: 'IQC检验'
+        name: "IQC检验",
+      },
+      {
+        iconClass: "font-icons",
+        iconBase: "\ue6b7",
+        permission: "",
+        name: "扫码入库",
       },
       {
-        iconClass: 'font-icons',
-        iconBase: '\ue6b7',
-        permission: '',
-        name: '扫码入库'
+        iconClass: "font-icons",
+        iconBase: "\ue6b7",
+        permission: "",
+        name: "扫码出库",
       },
       {
-        iconClass: 'font-icons',
-        iconBase: '\ue6b7',
-        permission: '',
-        name: '扫码出库'
+        iconClass: "font-icons",
+        iconBase: "\ue6b7",
+        permission: "",
+        name: "历史物料补录",
+      },
+      {
+        iconClass: "font-icons",
+        iconBase: "\ue7eb",
+        permission: "",
+        name: "盘点",
       },
-	  {
-	    iconClass: 'font-icons',
-	    iconBase: '\ue7eb',
-	    permission: '',
-	    name: '盘点'
-	  },
       // {
       //   iconClass: 'font-icons',
       //   iconBase: '\ue660',
@@ -408,241 +448,248 @@ export default {
       //   permission: '',
       //   name: '半成品流转'
       // }
-    ])
+    ]);
 
-    const handleTap = function(row) {
-      uni.$grace.msg(row.name + '模块正在火速开发中')
+    const handleTap = function (row) {
+      uni.$grace.msg(row.name + "模块正在火速开发中");
       // #ifdef APP-PLUS
-      const mpaasScanModule = uni.requireNativePlugin('Mpaas-Scan-Module')
+      const mpaasScanModule = uni.requireNativePlugin("Mpaas-Scan-Module");
       // #endif
       switch (row.name) {
-      case '扫码':
-        // #ifdef APP-PLUS
-        mpaasScanModule.mpaasScan({
-          // 扫码识别类型,参数可多选,qrCode、barCode,不设置,默认识别所有
-          'scanType': ['qrCode', 'barCode'],
-          // 是否隐藏相册,默认false不隐藏
-          'hideAlbum': false
-        },
-        (ret) => {
-          uni.showModal({
-            title: '弹窗标题',
-            // 返回值中,resp_code 表示返回结果值,10:用户取消,11:其他错误,1000:成功
-            // 返回值中,resp_message 表示返回结果信息
-            // 返回值中,resp_result 表示扫码结果,只有成功才会有返回
-            content: JSON.stringify(ret),
-            showCancel: false,
-            confirmText: '确定'
-          })
-        })
-        // #endif
-        break
-      case '打印测试':
-        uni.navigateTo({
-        	url: "/pages/tabbar/printTest"
-        })
+        case "扫码":
+          // #ifdef APP-PLUS
+          mpaasScanModule.mpaasScan(
+            {
+              // 扫码识别类型,参数可多选,qrCode、barCode,不设置,默认识别所有
+              scanType: ["qrCode", "barCode"],
+              // 是否隐藏相册,默认false不隐藏
+              hideAlbum: false,
+            },
+            (ret) => {
+              uni.showModal({
+                title: "弹窗标题",
+                // 返回值中,resp_code 表示返回结果值,10:用户取消,11:其他错误,1000:成功
+                // 返回值中,resp_message 表示返回结果信息
+                // 返回值中,resp_result 表示扫码结果,只有成功才会有返回
+                content: JSON.stringify(ret),
+                showCancel: false,
+                confirmText: "确定",
+              });
+            },
+          );
+          // #endif
+          break;
+        case "打印测试":
+          uni.navigateTo({
+            url: "/pages/tabbar/printTest",
+          });
 
-        //  // #ifdef APP-PLUS
-        //  const Activity = plus.android.runtimeMainActivity()
-        //  const Intent = plus.android.importClass('android.content.Intent')
-        //  const Uri = plus.android.importClass('android.net.Uri')
-        //  const browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(`${uni.$baseUrl}/jmreport/view/828502348750999552?token=32701364ce02496ba2b8a5f17c06dae4`))
-        //  Activity.startActivity(browserIntent)
-        //  // #endif
+          //  // #ifdef APP-PLUS
+          //  const Activity = plus.android.runtimeMainActivity()
+          //  const Intent = plus.android.importClass('android.content.Intent')
+          //  const Uri = plus.android.importClass('android.net.Uri')
+          //  const browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(`${uni.$baseUrl}/jmreport/view/828502348750999552?token=32701364ce02496ba2b8a5f17c06dae4`))
+          //  Activity.startActivity(browserIntent)
+          //  // #endif
 
-        //  // #ifdef H5
-        //  const dom = document.createElement('a')
-        //  dom.setAttribute('href',
-        // `http://192.168.1.101:48080/jmreport/view/828502348750999552?hotPressId=1664178203920498689`
-        //  )
-        //  dom.setAttribute('target', '_blank')
-        //  dom.click()
-        //  // #endif
-        break
-      case '蓝牙测试':
-        uni.navigateTo({
-          url: '/pages/workbranch/system/bluetooth'
-        })
-        break
-      case '蓝牙配置':
-        uni.navigateTo({
-          url: '/pages/workbranch/system/bluetoothConfig'
-        })
-        break
-      case '生产领料':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/production/prepareMaterials'
-        })
-        break
-      case '委外备料':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/outSourceMaterial/outSourceList'
-        })
-        break
-      case '来料登记':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/materialRegister/registerType'
-        })
-        break
-      case '物料上架':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/feeding/shelfType'
-        })
-        break
-      case '入库申请':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/warehousing/warehousingType'
-        })
-        break
-      case '退料申请':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/returnMaterial/returnMaterialType'
-        })
-        break
-      case '送货单回签':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/deliveryNote/deliveryNoteList'
-        })
-        break
-      case '分切备料':
-        uni.navigateTo({
-          url: '/pages/workbranch/production/cutting/cuttingMaterialPreparation'
-        })
-        break
-      case '货位调整':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/location/locationPage'
-        })
-        break
-      case '物料拆合批':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/materialDisass/materialWorkBranch'
-        })
-        break
-      case '栈板拆合批':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/trestle/trestleList'
-        })
-        break
-      case '成品拆合箱':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/box/boxList'
-        })
-        break
-      // case '生产发料':
-      //   uni.navigateTo({
-      //     url: '/pages/workbranch/warehouse/productionIssue/productionIssue'
-      //   })
-      //   break
-      case '条码拆分':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/codeSplitOrMerge/codeSplit'
-        })
-        break
-      case '条码合并':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/codeSplitOrMerge/codeMerge'
-        })
-        break
-      case '出货标签':
-        uni.navigateTo({
-          url: '/pages/workbranch/production/shipment/shipmentPage'
-        })
-        break
-      case '出货列表':
-        uni.navigateTo({
-          url: '/pages/workbranch/production/shipment/shipmentPatchworkPage'
-        })
-        break
-      case '销售出货':
-        uni.navigateTo({
-          url: '/pages/workbranch/production/shipmentMHT/shipmentPage'
-        })
-        break
-      case '点胶机':
-        uni.navigateTo({
-          url: '/pages/workbranch/production/glue/indexPage'
-        })
-        break
-      case 'IPQC检验':
-        uni.navigateTo({
-          url: '/pages/workbranch/production/IPQC/ipqcCheckout'
-        })
-        break
-      case 'IQC检验':
-        uni.navigateTo({
-          url: '/pages/workbranch/production/FQC/fqcList'
-        })
-        break
-      case '分切':
-        uni.navigateTo({
-          url: '/pages/workbranch/production/cutting/cuttingList'
-        })
-        break
-      case '工序执行':
-        uni.navigateTo({
-          url: '/pages/workbranch/production/processExecution/processList'
-        })
-        break
-      case '全检执行':
-        uni.navigateTo({
-          url: '/pages/workbranch/production/processExecution/processFullInspection'
-        })
-        break
-      case '模具保养':
-        uni.navigateTo({
-          url: '/pages/workbranch/ETM/moldPreserve/indexPage'
-        })
-        break
-      case '出入冷库':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/coldStorage/indexPage'
-        })
-        break
-      case '半成品流转':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/SemiFinishedProducts/indexPage'
-        })
-        break
-      case '扫码出入库':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/scanInOut/scanInOutType'
-        })
-        break
-      case '扫码入库':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/scanInOut/In/scanInPage'
-        })
-        break
-      case '扫码出库':
-        uni.navigateTo({
-          url: '/pages/workbranch/warehouse/scanInOut/Out/scanOutPage'
-        })
-        break
-	  case '盘点':
-	    uni.navigateTo({
-	      url: '/pages/workbranch/warehouse/Inventory/inventoryPage'
-	    })
-	    break
+          //  // #ifdef H5
+          //  const dom = document.createElement('a')
+          //  dom.setAttribute('href',
+          // `http://192.168.1.101:48080/jmreport/view/828502348750999552?hotPressId=1664178203920498689`
+          //  )
+          //  dom.setAttribute('target', '_blank')
+          //  dom.click()
+          //  // #endif
+          break;
+        case "蓝牙测试":
+          uni.navigateTo({
+            url: "/pages/workbranch/system/bluetooth",
+          });
+          break;
+        case "蓝牙配置":
+          uni.navigateTo({
+            url: "/pages/workbranch/system/bluetoothConfig",
+          });
+          break;
+        case "生产领料":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/production/prepareMaterials",
+          });
+          break;
+        case "委外备料":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/outSourceMaterial/outSourceList",
+          });
+          break;
+        case "来料登记":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/materialRegister/registerType",
+          });
+          break;
+        case "物料上架":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/feeding/shelfType",
+          });
+          break;
+        case "入库申请":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/warehousing/warehousingType",
+          });
+          break;
+        case "退料申请":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/returnMaterial/returnMaterialType",
+          });
+          break;
+        case "送货单回签":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/deliveryNote/deliveryNoteList",
+          });
+          break;
+        case "分切备料":
+          uni.navigateTo({
+            url: "/pages/workbranch/production/cutting/cuttingMaterialPreparation",
+          });
+          break;
+        case "货位调整":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/location/locationPage",
+          });
+          break;
+        case "物料拆合批":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/materialDisass/materialWorkBranch",
+          });
+          break;
+        case "栈板拆合批":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/trestle/trestleList",
+          });
+          break;
+        case "成品拆合箱":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/box/boxList",
+          });
+          break;
+        // case '生产发料':
+        //   uni.navigateTo({
+        //     url: '/pages/workbranch/warehouse/productionIssue/productionIssue'
+        //   })
+        //   break
+        case "条码拆分":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/codeSplitOrMerge/codeSplit",
+          });
+          break;
+        case "条码合并":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/codeSplitOrMerge/codeMerge",
+          });
+          break;
+        case "出货标签":
+          uni.navigateTo({
+            url: "/pages/workbranch/production/shipment/shipmentPage",
+          });
+          break;
+        case "出货列表":
+          uni.navigateTo({
+            url: "/pages/workbranch/production/shipment/shipmentPatchworkPage",
+          });
+          break;
+        case "销售出货":
+          uni.navigateTo({
+            url: "/pages/workbranch/production/shipmentMHT/shipmentPage",
+          });
+          break;
+        case "点胶机":
+          uni.navigateTo({
+            url: "/pages/workbranch/production/glue/indexPage",
+          });
+          break;
+        case "IPQC检验":
+          uni.navigateTo({
+            url: "/pages/workbranch/production/IPQC/ipqcCheckout",
+          });
+          break;
+        case "IQC检验":
+          uni.navigateTo({
+            url: "/pages/workbranch/production/FQC/fqcList",
+          });
+          break;
+        case "分切":
+          uni.navigateTo({
+            url: "/pages/workbranch/production/cutting/cuttingList",
+          });
+          break;
+        case "工序执行":
+          uni.navigateTo({
+            url: "/pages/workbranch/production/processExecution/processList",
+          });
+          break;
+        case "全检执行":
+          uni.navigateTo({
+            url: "/pages/workbranch/production/processExecution/processFullInspection",
+          });
+          break;
+        case "模具保养":
+          uni.navigateTo({
+            url: "/pages/workbranch/ETM/moldPreserve/indexPage",
+          });
+          break;
+        case "出入冷库":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/coldStorage/indexPage",
+          });
+          break;
+        case "半成品流转":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/SemiFinishedProducts/indexPage",
+          });
+          break;
+        case "扫码出入库":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/scanInOut/scanInOutType",
+          });
+          break;
+        case "扫码入库":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/scanInOut/In/scanInPage",
+          });
+          break;
+        case "扫码出库":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/scanInOut/Out/scanOutPage",
+          });
+          break;
+        case "历史物料补录":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/historicalMaterialImport/index",
+          });
+          break;
+        case "盘点":
+          uni.navigateTo({
+            url: "/pages/workbranch/warehouse/Inventory/inventoryPage",
+          });
+          break;
       }
-    }
+    };
 
-    const takePhoto = function() {
+    const takePhoto = function () {
       uni.chooseImage({
         count: 6, // count: 6, //默认9
-        sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
-        sourceType: ['album', 'camera'], // 从相册选择
-        success: function(res) {
-          srcs.value = res.tempFilePaths
-          console.log(res, JSON.stringify(res.tempFilePaths))
-        }
-      })
-    }
+        sizeType: ["original", "compressed"], // 可以指定是原图还是压缩图,默认二者都有
+        sourceType: ["album", "camera"], // 从相册选择
+        success: function (res) {
+          srcs.value = res.tempFilePaths;
+          console.log(res, JSON.stringify(res.tempFilePaths));
+        },
+      });
+    };
 
     // 关闭错误信息弹窗
-    const handleCloseErrorTipsModal = async function() {
-      errorTip.value.close()
-    }
+    const handleCloseErrorTipsModal = async function () {
+      errorTip.value.close();
+    };
 
     return {
       WMSList,
@@ -655,92 +702,92 @@ export default {
       takePhoto,
       errorTip,
       errorTipMessage,
-      handleCloseErrorTipsModal
-    }
-  }
-}
+      handleCloseErrorTipsModal,
+    };
+  },
+};
 </script>
 
 <style lang="scss" scoped>
-	.gridBody {
-		margin: 80px 0;
-		overflow-y: scroll;
-	}
+.gridBody {
+  margin: 80px 0;
+  overflow-y: scroll;
+}
 
-	.grid-box {
-		width: calc(100vw - 16px);
-		margin: 14px 8px;
-		display: flex;
-		flex-direction: column;
-		border-radius: 4px;
-		box-shadow: 0 0 9px 0 rgba(121, 118, 118, 0.34);
+.grid-box {
+  width: calc(100vw - 16px);
+  margin: 14px 8px;
+  display: flex;
+  flex-direction: column;
+  border-radius: 4px;
+  box-shadow: 0 0 9px 0 rgba(121, 118, 118, 0.34);
 
-		.panel {
-			height: 2.2rem;
-			width: calc(100vw - 32px);
-			padding-left: 16px;
-			border-top-left-radius: 4px;
-			border-top-right-radius: 4px;
-			background: linear-gradient(to right, rgb(78, 188, 250), rgb(0, 239, 239));
+  .panel {
+    height: 2.2rem;
+    width: calc(100vw - 32px);
+    padding-left: 16px;
+    border-top-left-radius: 4px;
+    border-top-right-radius: 4px;
+    background: linear-gradient(to right, rgb(78, 188, 250), rgb(0, 239, 239));
 
-			.panel-title {
-				width: calc(100vw / 4 - 2px);
-				height: inherit;
-				line-height: 2.2rem;
-				text-align: center;
-				font-size: 16px;
-				color: white;
-			}
-		}
+    .panel-title {
+      width: calc(100vw / 4 - 2px);
+      height: inherit;
+      line-height: 2.2rem;
+      text-align: center;
+      font-size: 16px;
+      color: white;
+    }
+  }
 
-		.grid-list {
-			width: calc(100vw - 16px);
-			/* 设置容器布局为grid布局 */
-			display: grid;
-			/* 指定每一行的宽度 每个宽度中间用空格隔开 */
-			grid-template-rows: auto;
-			/* 指定每一列的宽度 每个宽度中间用空格隔开 */
-			grid-template-columns: 1fr 1fr 1fr;
-			border-bottom-left-radius: 10px;
-			border-bottom-right-radius: 10px;
-			background-color: white;
+  .grid-list {
+    width: calc(100vw - 16px);
+    /* 设置容器布局为grid布局 */
+    display: grid;
+    /* 指定每一行的宽度 每个宽度中间用空格隔开 */
+    grid-template-rows: auto;
+    /* 指定每一列的宽度 每个宽度中间用空格隔开 */
+    grid-template-columns: 1fr 1fr 1fr;
+    border-bottom-left-radius: 10px;
+    border-bottom-right-radius: 10px;
+    background-color: white;
 
-			.gui-grid {
-				display: flex;
-				justify-content: center;
+    .gui-grid {
+      display: flex;
+      justify-content: center;
 
-				.font-icons {
-					width: 40px;
-					height: 40px;
-					border-radius: 6px;
-					display: flex;
-					justify-content: center;
-					align-items: center;
-					font-size: 26px;
-					color: #f4f4f4;
-					box-shadow: 2px 2px 1px 0 #d5dffd;
-					background-color: #539cf8;
-				}
+      .font-icons {
+        width: 40px;
+        height: 40px;
+        border-radius: 6px;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        font-size: 26px;
+        color: #f4f4f4;
+        box-shadow: 2px 2px 1px 0 #d5dffd;
+        background-color: #539cf8;
+      }
 
-				.gui-grid-item {
-					width: 85px;
-					height: 85px;
-					margin-top: 4px;
-					display: flex;
-					justify-content: center;
-					align-items: center;
+      .gui-grid-item {
+        width: 85px;
+        height: 85px;
+        margin-top: 4px;
+        display: flex;
+        justify-content: center;
+        align-items: center;
 
-					uni-text:nth-of-type(2) {
-						padding-top: 4px;
-						padding-left: 3px;
-						font-size: 14px;
-					}
-				}
-			}
-		}
-	}
+        uni-text:nth-of-type(2) {
+          padding-top: 4px;
+          padding-left: 3px;
+          font-size: 14px;
+        }
+      }
+    }
+  }
+}
 
-	.adapt-image {
-		width: 750rpx;
-	}
+.adapt-image {
+  width: 750rpx;
+}
 </style>

+ 700 - 0
pages/workbranch/warehouse/historicalMaterialImport/index.vue

@@ -0,0 +1,700 @@
+<template>
+  <gui-page
+    :custom-header="true"
+    :header-class="['gui-theme-background-color']"
+  >
+    <template #gHeader>
+      <view
+        style="height: 44px"
+        class="gui-flex gui-nowrap gui-rows gui-align-items-center"
+      >
+        <!-- 使用组件实现返回按钮及返回首页按钮 -->
+        <text
+          style="font-size: 44rpx"
+          class="gui-header-leader-btns gui-color-white font-icons"
+          @tap="goHome"
+          >&#xe6c5;</text
+        >
+        <!-- 导航文本此处也可以是其他自定义内容 -->
+        <text
+          class="gui-h4 gui-blod gui-flex1 gui-text-center gui-ellipsis gui-color-white gui-primary-text"
+          >历史记录补录</text
+        >
+        <!-- 此处加一个右侧展位元素与左侧同宽,实现标题居中 -->
+        <view style="width: 40px" />
+      </view>
+    </template>
+    <template #gBody>
+      <view class="list-content">
+        <view class="scan">
+          <view class="scan-card">
+            <uni-easyinput
+              ref="easyinput"
+              v-model="scanBatchNumber"
+              :input-border="false"
+              :clearable="false"
+              type="text"
+              :focus="true"
+              placeholder="请扫描物料二维码"
+              @confirm="handleKeydown"
+            />
+            <text class="font-icons" @click="handleScanMaterial">&#xe6b7;</text>
+          </view>
+        </view>
+        <view class="record-title">
+          <text class="record-title-text">本次补录记录</text>
+        </view>
+        <view class="custom-table">
+          <scroll-view scroll-y class="scroll-box" style="height: 300px">
+            <view class="cell-row">
+              <view class="cell1">二维码</view>
+              <view class="cell2">数量</view>
+              <view class="cell3">生产日期</view>
+            </view>
+            <view
+              v-for="(item, idx) in recordList"
+              :key="item.uniqueId"
+              class="swipe-row"
+              :data-index="idx"
+              @touchstart="touchStart"
+              @touchmove="touchMove"
+              @touchend="touchEnd"
+            >
+              <view
+                class="content-area"
+                :style="`transform: translateX(${item.slideX}px)`"
+              >
+                <view class="cell1">{{ item.qrCode }}</view>
+                <view class="cell2">{{ item.qrCodeQty }}</view>
+                <view class="cell3">{{ item.produceDate }}</view>
+              </view>
+              <view class="btn-area" @click="deleteItem(idx)">删除</view>
+            </view>
+          </scroll-view>
+        </view>
+        <uni-popup ref="errorTip" type="dialog">
+          <uni-popup-dialog
+            type="error"
+            cancel-text="关闭"
+            confirm-text="确认"
+            title="提示"
+            :content="errorTipMessage"
+            @confirm="handleCloseErrorTipsModal"
+            @close="handleCloseErrorTipsModal"
+          />
+        </uni-popup>
+        <!-- 条码是否在库校验弹窗 -->
+        <uni-popup ref="inStockCheckPopup" type="dialog">
+          <view class="instock-dialog">
+            <view class="instock-title"
+              >当前箱码未录入系统,请确认数量并录入</view
+            >
+            <view class="instock-row">
+              <text class="instock-label">生产日期</text>
+              <view class="instock-datetime">
+                <uni-datetime-picker
+                  v-model="inStockCheckProduceDate"
+                  type="date"
+                  placeholder="请选择生产日期"
+                />
+              </view>
+            </view>
+            <view class="instock-row">
+              <text class="instock-label">数量</text>
+              <input
+                v-model="inStockCheckQty"
+                class="instock-input"
+                type="number"
+                placeholder="请输入数量"
+              />
+            </view>
+            <view class="instock-row">
+              <text class="instock-label">库位</text>
+              <input
+                v-model="inStockCheckStore"
+                class="instock-input"
+                placeholder="请扫描/输入库位"
+                @confirm="confirmInStockStore"
+              />
+              <text
+                class="instock-scan-icon font-icons"
+                @click="scanInStockStore"
+                >&#xe6b7;</text
+              >
+            </view>
+            <view
+              v-if="inStockCheckErpStockName || inStockCheckWmsStoreName"
+              class="instock-store-info"
+            >
+              <text>仓库: {{ inStockCheckErpStockName }}</text>
+              <text>货位: {{ inStockCheckWmsStoreName }}</text>
+            </view>
+            <view class="instock-btns">
+              <view
+                class="instock-btn instock-btn-cancel"
+                @click="cancelInStockCheck"
+                >取消</view
+              >
+              <view
+                class="instock-btn instock-btn-confirm"
+                @click="confirmInStockCheck"
+                >确认</view
+              >
+            </view>
+          </view>
+        </uni-popup>
+      </view>
+    </template>
+  </gui-page>
+</template>
+
+<script>
+import { defineComponent, ref, nextTick } from "vue";
+
+export default defineComponent({
+  setup() {
+    const easyinput = ref();
+    const errorTip = ref();
+    const errorTipMessage = ref("");
+    const errorState = ref(0);
+    const scanBatchNumber = ref("");
+    // 本次补录记录列表
+    const recordList = ref([]);
+
+    /* -------------------- 条码是否在库校验相关 -------------------- */
+    const inStockCheckPopup = ref(null); // 弹窗实例
+    const inStockCheckQty = ref(""); // 数量输入
+    const inStockCheckProduceDate = ref(""); // 生产日期输入
+    const inStockCheckStore = ref(""); // 库位输入
+    const inStockCheckErpStockName = ref(""); // 弹窗内仓库名称
+    const inStockCheckWmsStoreName = ref(""); // 弹窗内货位名称
+    const wmsStockId = ref(""); // 仓库id
+    const wmsStoreAreaId = ref(""); // 区域id
+    const wmsStoreLocationId = ref(""); // 货位id
+    let instockQrCode = ""; // 缓存待入库的二维码
+
+    const goHome = function () {
+      uni.$goHome();
+    };
+
+    // 统一回到二维码输入框
+    const setInputFocus = function () {
+      nextTick(() => {
+        easyinput.value?.onBlur();
+        easyinput.value?.onFocus();
+      });
+    };
+
+    /* 统一出口:清空二维码输入框 */
+    const resetAllInputs = () => {
+      scanBatchNumber.value = "";
+    };
+
+    // 是否在库校验 + 未在库弹窗补录
+    const checkInstock = function (qrCode) {
+      return uni
+        .$reqPost("inStockCheck", { qrCode })
+        .then(({ code, data, msg }) => {
+          if (code !== 0) {
+            // #ifdef APP-PLUS
+            plus.device.beep(2);
+            // #endif
+            errorTipMessage.value = msg || "条码是否在库检查异常";
+            errorTip.value.open();
+            errorState.value = 0;
+            resetAllInputs();
+            setInputFocus();
+            return false;
+          }
+          // 已在库:无需补录,提示并结束
+          if (Number(data?.instockFlag) === 1) {
+            errorTipMessage.value = "该条码已在库,无需补录";
+            errorTip.value.open();
+            errorState.value = 0;
+            resetAllInputs();
+            setInputFocus();
+            return false;
+          }
+          // 不在库:弹窗确认数量 + 库位
+          instockQrCode = qrCode;
+          const defaultQty = Number(data?.qrCodeQty);
+          inStockCheckQty.value = Number.isFinite(defaultQty)
+            ? String(defaultQty)
+            : "";
+          inStockCheckProduceDate.value = data?.produceDate || "";
+          inStockCheckStore.value = "";
+          inStockCheckErpStockName.value = "";
+          inStockCheckWmsStoreName.value = "";
+          wmsStockId.value = "";
+          wmsStoreAreaId.value = "";
+          wmsStoreLocationId.value = "";
+          nextTick(() => inStockCheckPopup.value?.open());
+          return false;
+        });
+    };
+
+    // 确认补录:数量 > 0 且库位已正确返回,再调自动入库
+    const confirmInStockCheck = function () {
+      const qty = Number(inStockCheckQty.value);
+      if (!Number.isFinite(qty) || qty <= 0) {
+        uni.showToast({ title: "请输入大于0的数量", icon: "none" });
+        return;
+      }
+      const produceDate = (inStockCheckProduceDate.value || "").trim();
+      if (!produceDate) {
+        uni.showToast({ title: "请输入生产日期", icon: "none" });
+        return;
+      }
+      if (!/^\d{4}-\d{2}-\d{2}$/.test(produceDate)) {
+        uni.showToast({ title: "生产日期格式应为 2026-10-15", icon: "none" });
+        return;
+      }
+      if (!wmsStockId.value) {
+        uni.showToast({ title: "当前库位信息无仓库id数据", icon: "none" });
+        return;
+      }
+      if (!wmsStoreAreaId.value) {
+        uni.showToast({ title: "当前库位信息无区域id数据", icon: "none" });
+        return;
+      }
+      if (!wmsStoreLocationId.value) {
+        uni.showToast({ title: "当前库位信息无货位id数据", icon: "none" });
+        return;
+      }
+      uni
+        .$reqPost("autoInStock", {
+          qrCode: instockQrCode,
+          qrCodeQty: qty,
+          produceDate: produceDate,
+          wmsStockId: wmsStockId.value,
+          wmsStoreAreaId: wmsStoreAreaId.value,
+          wmsStoreLocationId: wmsStoreLocationId.value,
+        })
+        .then(({ code, data, msg }) => {
+          if (code !== 0) {
+            // #ifdef APP-PLUS
+            plus.device.beep(2);
+            // #endif
+            errorTipMessage.value = msg || "补录失败";
+            errorTip.value.open();
+            errorState.value = 0;
+            return;
+          }
+          // 补录成功:加入本次记录列表
+          recordList.value.push({
+            qrCode: instockQrCode,
+            qrCodeQty: qty,
+            produceDate: produceDate,
+            erpStockName: inStockCheckErpStockName.value,
+            wmsStoreName: inStockCheckWmsStoreName.value,
+            uniqueId: `${instockQrCode}_${Date.now()}`,
+            slideX: 0,
+          });
+          inStockCheckPopup.value?.close();
+          uni.showToast({ title: "补录成功", icon: "none" });
+          resetAllInputs();
+          setInputFocus();
+        });
+    };
+
+    // 弹窗取消
+    const cancelInStockCheck = function () {
+      inStockCheckPopup.value?.close();
+      instockQrCode = "";
+      resetAllInputs();
+      setInputFocus();
+    };
+
+    // 键盘扫描/输入回车
+    const handleKeydown = async function (e) {
+      const qrCode = (
+        typeof e === "string" ? e : e?.detail?.value || ""
+      ).trim();
+      if (!qrCode) return;
+      // 本次会话内已补录过的二维码不允许重复补录
+      if (recordList.value.some((it) => it.qrCode === qrCode)) {
+        errorTipMessage.value = "该条码本次已补录,请勿重复扫描";
+        errorTip.value.open();
+        errorState.value = 0;
+        resetAllInputs();
+        setInputFocus();
+        return;
+      }
+      await checkInstock(qrCode);
+    };
+
+    // 摄像头扫码
+    const handleScanMaterial = async function () {
+      // #ifdef APP-PLUS
+      const mpaasScanModule = { mpaasScan: uni.$scanByCameraCompat };
+      const ret = await new Promise((resolve) =>
+        mpaasScanModule.mpaasScan(
+          { scanType: ["qrCode", "barCode"], hideAlbum: false },
+          resolve,
+        ),
+      );
+      if (ret.resp_code !== 1000) return;
+      const qrCode = ret.resp_result;
+      if (recordList.value.some((it) => it.qrCode === qrCode)) {
+        errorTipMessage.value = "该条码本次已补录,请勿重复扫描";
+        errorTip.value.open();
+        errorState.value = 0;
+        setInputFocus();
+        return;
+      }
+      await checkInstock(qrCode);
+      // #endif
+    };
+
+    // 关闭错误信息弹窗
+    const handleCloseErrorTipsModal = async function () {
+      errorTip.value.close();
+      if (errorState.value === 0) {
+        await setInputFocus();
+      }
+    };
+
+    /* ========= 左滑删除(仅删除本次会话内的展示记录) ========= */
+    const touchStart = (e) => {
+      const idx = e.currentTarget.dataset.index;
+      recordList.value.forEach((v, i) => {
+        if (i !== idx) v.slideX = 0; // 其余归位
+      });
+      recordList.value[idx].startX = e.touches[0].pageX;
+      recordList.value[idx].slideX = recordList.value[idx].slideX || 0;
+    };
+
+    const touchMove = (e) => {
+      const idx = e.currentTarget.dataset.index;
+      const row = recordList.value[idx];
+      const delta = e.touches[0].pageX - row.startX;
+      if (delta < 0) {
+        row.slideX = Math.max(delta, -70); // 70 = 按钮宽度
+      } else {
+        row.slideX = Math.min(delta, 0);
+      }
+    };
+
+    const touchEnd = (e) => {
+      const idx = e.currentTarget.dataset.index;
+      const row = recordList.value[idx];
+      row.slideX = row.slideX <= -35 ? -70 : 0; // 过半则露出,否则收回
+    };
+
+    const deleteItem = (idx) => {
+      recordList.value.splice(idx, 1);
+    };
+
+    /* ========= 弹窗内库位扫描 ========= */
+    const scanInStockStore = function () {
+      // #ifdef APP-PLUS
+      const mpaasScanModule = { mpaasScan: uni.$scanByCameraCompat };
+      mpaasScanModule.mpaasScan(
+        {
+          scanType: ["qrCode", "barCode"],
+          hideAlbum: false,
+        },
+        (ret) => {
+          if (ret.resp_code === 1000) {
+            confirmInStockStore(ret.resp_result);
+          }
+        },
+      );
+      // #endif
+    };
+
+    // 弹窗内库位输入回车事件
+    const confirmInStockStore = function (e) {
+      const code =
+        typeof e === "string" ? e : (e && e.detail && e.detail.value) || "";
+      inStockCheckStore.value = code;
+      if (!code) return;
+      uni
+        .$reqGet("getStockLocaltionByCode", { code })
+        .then(({ code, data, msg }) => {
+          if (
+            code === 0 &&
+            data &&
+            data.erpStockId &&
+            data.wmsStoreAreaId &&
+            data.wmsStoreId
+          ) {
+            wmsStockId.value = data.erpStockId; // 仓库id
+            wmsStoreAreaId.value = data.wmsStoreAreaId; // 区域id
+            wmsStoreLocationId.value = data.wmsStoreId; // 货位id
+            inStockCheckErpStockName.value = data.erpStockName || "";
+            inStockCheckWmsStoreName.value = data.wmsStoreName || "";
+          } else {
+            // #ifdef APP-PLUS
+            plus.device.beep(2);
+            // #endif
+            inStockCheckStore.value = "";
+            wmsStockId.value = "";
+            wmsStoreAreaId.value = "";
+            wmsStockLocationId.value = "";
+            uni.showToast({ title: "请扫描正确的库位", icon: "none" });
+          }
+        });
+    };
+
+    return {
+      goHome,
+      easyinput,
+      errorTip,
+      errorTipMessage,
+      scanBatchNumber,
+      recordList,
+      handleKeydown,
+      handleScanMaterial,
+      handleCloseErrorTipsModal,
+      // 左滑删除相关
+      touchStart,
+      touchMove,
+      touchEnd,
+      deleteItem,
+      // 条码是否在库校验相关
+      inStockCheckPopup,
+      inStockCheckQty,
+      inStockCheckProduceDate,
+      inStockCheckStore,
+      inStockCheckErpStockName,
+      inStockCheckWmsStoreName,
+      confirmInStockCheck,
+      cancelInStockCheck,
+      confirmInStockStore,
+      scanInStockStore,
+    };
+  },
+});
+</script>
+
+<style lang="scss" scoped>
+.gui-header-leader-btns {
+  color: black;
+  font-size: 24px !important;
+  margin-left: 24rpx;
+}
+
+.list-content {
+  margin-top: 80px;
+  background-color: #edeeee;
+}
+
+.font-icons {
+  width: 40px;
+  font-size: 20px;
+}
+
+.scan {
+  height: 45px;
+  width: calc(100% - 48px);
+  margin: 12px;
+  padding: 0 12px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  border-radius: 6px;
+  background-color: white;
+
+  .scan-card {
+    width: 100%;
+    display: grid;
+    grid-template-rows: 1fr;
+    grid-template-columns: 7fr 2fr;
+    align-items: center;
+
+    input {
+      height: 35px;
+      line-height: 35px;
+    }
+
+    text {
+      width: 100%;
+      text-align: right;
+    }
+  }
+}
+
+.record-title {
+  padding: 8px 12px 4px;
+  background-color: white;
+
+  .record-title-text {
+    font-size: 14px;
+    font-weight: bold;
+    color: #333;
+    border-left: 3px solid #00a0e9;
+    padding-left: 8px;
+  }
+}
+
+.custom-table {
+  height: calc(100vh - 265px);
+  min-height: 230px;
+  margin: 5px 0;
+  overflow-y: scroll;
+  background-color: white;
+}
+
+/* 左滑删除样式 */
+.scroll-box {
+  height: 100%; /* 继承父级高度 */
+}
+.cell-row {
+  display: flex;
+  background-color: #f5f7fa;
+  font-weight: bold;
+  border-radius: 4px;
+  margin-bottom: 5px;
+}
+.swipe-row {
+  position: relative;
+  width: 100%;
+  height: 44px;
+  overflow: hidden;
+  border-bottom: 1px solid #eee;
+  margin-bottom: 5px;
+  border-radius: 4px;
+}
+.content-area {
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  z-index: 2;
+  background: #fff;
+  display: flex;
+  align-items: center;
+  transition: transform 0.25s;
+  border-radius: 4px;
+}
+.cell1 {
+  flex: 2;
+  text-align: center;
+  font-size: 14px;
+  color: #333;
+  height: 44px;
+  line-height: 44px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  padding: 0 4px;
+}
+.cell2 {
+  flex: 1;
+  text-align: center;
+  font-size: 14px;
+  color: #333;
+  height: 44px;
+  line-height: 44px;
+}
+.cell3 {
+  flex: 2;
+  text-align: center;
+  font-size: 14px;
+  color: #333;
+  height: 44px;
+  line-height: 44px;
+}
+.btn-area {
+  position: absolute;
+  right: 0;
+  top: 0;
+  width: 70px;
+  height: 100%;
+  background: #e54d42;
+  color: #fff;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 14px;
+  z-index: 1;
+  border-radius: 4px;
+}
+
+/* 条码是否在库校验弹窗样式 */
+.instock-dialog {
+  width: 600rpx;
+  background-color: #fff;
+  border-radius: 12rpx;
+  padding: 40rpx 32rpx;
+  box-sizing: border-box;
+}
+
+.instock-title {
+  font-size: 32rpx;
+  font-weight: bold;
+  color: #333;
+  text-align: center;
+  margin-bottom: 32rpx;
+  line-height: 1.4;
+}
+
+.instock-row {
+  display: flex;
+  align-items: center;
+  margin-bottom: 24rpx;
+}
+
+.instock-label {
+  width: 90rpx;
+  font-size: 28rpx;
+  color: #333;
+}
+
+.instock-input {
+  flex: 1;
+  height: 64rpx;
+  line-height: 64rpx;
+  border: 1rpx solid #dcdfe6;
+  border-radius: 8rpx;
+  padding: 0 16rpx;
+  font-size: 28rpx;
+  background-color: #fff;
+}
+
+.instock-datetime {
+  flex: 1;
+}
+
+.instock-scan-icon {
+  margin-left: 16rpx;
+  font-size: 36rpx;
+  color: #00a0e9;
+}
+
+.instock-store-info {
+  display: flex;
+  gap: 24rpx;
+  margin-bottom: 24rpx;
+  font-size: 24rpx;
+  color: #666;
+}
+
+.instock-btns {
+  display: flex;
+  justify-content: space-between;
+  margin-top: 16rpx;
+}
+
+.instock-btn {
+  flex: 1;
+  height: 72rpx;
+  line-height: 72rpx;
+  text-align: center;
+  border-radius: 8rpx;
+  font-size: 28rpx;
+}
+
+.instock-btn-cancel {
+  background-color: #f5f5f5;
+  color: #666;
+  margin-right: 16rpx;
+}
+
+.instock-btn-confirm {
+  background-color: #00a0e9;
+  color: #fff;
+}
+</style>