From aca7aa9ce32acc4c8795342f945b027d3bc9f62a Mon Sep 17 00:00:00 2001
From: 曹睿 <360930172@qq.com>
Date: 星期二, 10 六月 2025 17:37:34 +0800
Subject: [PATCH] feat: 添加时效报工,修复扫码内存泄漏

---
 src/pages.json                                 |    6 
 src/pages/production/list/index.vue            |    1 
 src/pages/production/twist/receive/monofil.vue |    6 
 src/components/scan/index3.vue                 |  104 +++++++++
 src/pages/index/index.vue                      |   81 ++++---
 src/pages/timely/index.vue                     |  108 +++++++++
 src/components/scan/index.vue                  |  187 ++++++++--------
 .env.development                               |    7 
 /dev/null                                      |   48 ----
 src/api/home/index.ts                          |   13 +
 src/api/product/twist.ts                       |    8 
 .env.production                                |    6 
 src/pages/production/wire/report/wireForm.vue  |   28 +-
 src/pages/production/index.vue                 |   44 +++
 src/components/product_card/index.vue          |    6 
 15 files changed, 452 insertions(+), 201 deletions(-)

diff --git a/.env.development b/.env.development
index a01cc4d..5f42f2f 100644
--- a/.env.development
+++ b/.env.development
@@ -4,7 +4,10 @@
 VITE_APP_PORT = 4096
 
 # API 鍩虹璺緞锛屽紑鍙戠幆澧冧笅鐨勮姹傚墠缂�
-VITE_APP_BASE_API = 'http://114.132.189.42:7002/mes'
+# VITE_APP_BASE_API = 'http://114.132.189.42:7002/mes'
+# VITE_APP_BASE_API = 'http://192.168.0.206:7002/mes' # 閭硅
+VITE_APP_BASE_API = 'http://192.168.0.244:8893/mes' # 
 
 # API 鏈嶅姟鍣ㄧ殑 URL
-VITE_APP_API_URL = 'http://114.132.189.42:7002/mes'
+# VITE_APP_API_URL = 'http://114.132.189.42:7002/mes'
+VITE_APP_API_URL = 'http://192.168.0.244:8893/mes' #
diff --git a/.env.production b/.env.production
index 1226d8b..a5aa117 100644
--- a/.env.production
+++ b/.env.production
@@ -1,4 +1,8 @@
 
 
 # API 鍩虹璺緞锛屽紑鍙戠幆澧冧笅鐨勮姹傚墠缂�
-VITE_APP_BASE_API = '/prod-api'
+# VITE_APP_BASE_API = 'http://114.132.189.42:7002/mes'
+# API 鏈嶅姟鍣ㄧ殑 URL
+# VITE_APP_API_URL = 'http://114.132.189.42:7002/mes'
+# 灞变笢
+VITE_APP_API_URL = 'http://192.168.100.131:7002/mes'
diff --git a/src/api/home/index.ts b/src/api/home/index.ts
new file mode 100644
index 0000000..de1a66a
--- /dev/null
+++ b/src/api/home/index.ts
@@ -0,0 +1,13 @@
+import request from "@/utils/request";
+import { BaseResult } from "@/models/base";
+
+const HomeApi = {
+  getIndex() {
+    return request<BaseResult<any>>({
+      url: "/app/getIndex",
+      method: "GET",
+    });
+  },
+};
+
+export default HomeApi;
diff --git a/src/api/product/twist.ts b/src/api/product/twist.ts
index 57996cd..900e4a9 100644
--- a/src/api/product/twist.ts
+++ b/src/api/product/twist.ts
@@ -36,6 +36,14 @@
       data: data,
     });
   },
+
+  saveAge(data: any) {
+    return request<BaseResult<any>>({
+      url: "/app/ageing",
+      method: "POST",
+      data: data,
+    });
+  },
 };
 
 export default TwistApi;
diff --git a/src/components/product_card/index.vue b/src/components/product_card/index.vue
index 3cb28bb..9fb6b8c 100644
--- a/src/components/product_card/index.vue
+++ b/src/components/product_card/index.vue
@@ -16,7 +16,7 @@
           </view>
           <text class="text-[#646874] mx-2">
             鎬婚渶姹傛暟閲�:
-            <text class="text-[#252525]">{{ data[map.totalAmount] }}m</text>
+            <text class="text-[#252525]">{{ data[map.totalAmount] }}{{ data[map.unit] }}</text>
           </text>
         </view>
       </wd-col>
@@ -29,7 +29,7 @@
           </view>
           <text class="text-[#646874] mx-2">
             宸茬敓浜ф暟閲�:
-            <text class="text-[#252525]">{{ data[map.amount] }}m</text>
+            <text class="text-[#252525]">{{ data[map.amount] }}{{ data[map.unit] }}</text>
           </text>
         </view>
       </wd-col>
@@ -40,7 +40,7 @@
           </view>
           <text class="text-[#646874] mx-2">
             寰呮帓浜ф暟閲�:
-            <text class="text-[#252525]">{{ data[map.unAmount] }}m</text>
+            <text class="text-[#252525]">{{ data[map.unAmount] }}{{ data[map.unit] }}</text>
           </text>
         </view>
       </wd-col>
diff --git a/src/components/scan/index.vue b/src/components/scan/index.vue
index 72b928f..018c202 100644
--- a/src/components/scan/index.vue
+++ b/src/components/scan/index.vue
@@ -3,100 +3,101 @@
     <view class="content"></view>
   </view>
 </template>
-<!-- 婵�鍏夋壂鐮侊紝骞挎挱妯″紡 -->
-<script>
-var main, receiver, filter;
-var codeQueryTag = false;
-export default {
-  data() {
-    return {
-      scanCode: "",
-    };
+<script lang="ts" setup>
+const main = ref();
+const receiver = ref();
+const filter = ref();
+const codeQueryTag = ref(false);
+const props = defineProps({
+  emitName: {
+    type: String,
+    default: "scan",
   },
-  created() {
-    // 鍒濆鍖�
-    this.initScan();
-    // 鍚姩骞挎挱
-    this.startScan();
-  },
-  onHide() {
-    // 缁撴潫骞挎挱
-    this.stopScan();
-  },
-  destroyed() {
-    // 缁撴潫骞挎挱
-    this.stopScan();
-  },
-  methods: {
-    // 鍒濆鍖�
-    initScan() {
-      //  #ifdef APP
-      // console.log('initScan:鎵爜鍒濆鍖�');
-      let that = this;
-      main = plus.android.runtimeMainActivity(); //鑾峰彇activity
-      //var context = plus.android.importClass('android.content.Context'); //涓婁笅鏂�
-      var IntentFilter = plus.android.importClass("android.content.IntentFilter");
-      filter = new IntentFilter();
-      //涓嬮潰鐨刟ddAction 鏀逛负鑷繁 pad 璁惧鐨勫箍鎾姩浣滐紙鍦ㄦ壂鎻忚缃垨鑰呭巶鍟嗛檮甯︾殑app 閲岄潰璁剧疆涓哄箍鎾ā寮忥紝鐒跺悗鏌ョ湅鐩稿簲鍙傛暟锛�
-      filter.addAction("com.dwexample.ACTION");
-      receiver = plus.android.implements("io.dcloud.feature.internal.reflect.BroadcastReceiver", {
-        onReceive: (context, intent) => {
-          console.log("---onReceive锛�", context, intent);
-          plus.android.importClass(intent);
-          //涓嬮潰鐨刧etStringExtra鍐呮敼涓鸿嚜宸辩殑骞挎挱鏍囩锛堥敭鍊�/key锛夛細 data
-          //鏂戦┈ TC20
-          var banMaSacanInfo = intent.getStringExtra(
-            "com.motorolasolutions.emdk.datawedge.data_string"
-          );
-          // callback(intent.getStringExtra('com.motorolasolutions.emdk.datawedge.data_string'));
-          console.log("鏂戦┈鎵弿缁撴灉", banMaSacanInfo);
-          // 浼犲叆鎺ユ敹鍒扮殑鍙傛暟
-          that.queryCode(banMaSacanInfo);
-        },
-      });
-      // #endif
+});
+
+const initScan = () => {
+  main.value = plus.android.runtimeMainActivity(); //鑾峰彇activity
+  let IntentFilter: any = plus.android.importClass("android.content.IntentFilter");
+  filter.value = new IntentFilter();
+  //涓嬮潰鐨刟ddAction 鏀逛负鑷繁 pad 璁惧鐨勫箍鎾姩浣滐紙鍦ㄦ壂鎻忚缃垨鑰呭巶鍟嗛檮甯︾殑app 閲岄潰璁剧疆涓哄箍鎾ā寮忥紝鐒跺悗鏌ョ湅鐩稿簲鍙傛暟锛�
+  filter.value.addAction("com.dwexample.ACTION");
+  receiver.value = plus.android.implements("io.dcloud.feature.internal.reflect.BroadcastReceiver", {
+    onReceive: (context: any, intent: any) => {
+      console.log("---onReceive锛�", context, intent);
+      plus.android.importClass(intent);
+      //涓嬮潰鐨刧etStringExtra鍐呮敼涓鸿嚜宸辩殑骞挎挱鏍囩锛堥敭鍊�/key锛夛細 data
+      //鏂戦┈ TC20
+      var banMaSacanInfo = intent.getStringExtra(
+        "com.motorolasolutions.emdk.datawedge.data_string"
+      );
+      // callback(intent.getStringExtra('com.motorolasolutions.emdk.datawedge.data_string'));
+      console.log("鏂戦┈鎵弿缁撴灉", banMaSacanInfo);
+      // 浼犲叆鎺ユ敹鍒扮殑鍙傛暟
+      queryCode(banMaSacanInfo);
     },
-    // 寮�鍚箍鎾�
-    startScan() {
-      //  #ifdef APP
-      console.log("startScan,寮�鍚箍鎾帴鏀�");
-      main.registerReceiver(receiver, filter);
-      // #endif
-    },
-    // 鍏抽棴骞挎挱
-    stopScan() {
-      //  #ifdef APP
-      console.log("stopScan缁撴潫");
-      main.unregisterReceiver(receiver);
-      // #endif
-    },
-    // 閬垮厤閲嶅鎵爜
-    queryCode: function (code) {
-      //  #ifdef APP
-      if (codeQueryTag) return false;
-      codeQueryTag = true;
-      setTimeout(function () {
-        codeQueryTag = false;
-      }, 150);
-      // console.log('-****--鎵爜code锛� ', code);
-      let data = code;
-      uni.$emit("scan", {
-        code: data,
-      });
-      // #endif
-    },
-    triggerScan() {
-      console.log("瑙﹀彂鎵弿");
-      // 鑾峰彇Android鎰忓浘绫�
-      let Intent = plus.android.importClass("android.content.Intent");
-      // 瀹炰緥鍖栨剰鍥�
-      let intent = new Intent();
-      // 瀹氫箟鎰忓浘锛岀敱鍘傚晢鎻愪緵(姝ゅ璁剧疆涓轰笢澶х殑锛� 寮�濮嬫壂鎻忓箍鎾璫om.scan.onStartScan锛屽搴旂殑鍋滄鎵弿骞挎挱涓篶om.scan.onEndScan)
-      intent.setAction("com.symbol.datawedge.api.ACTION");
-      intent.putExtra("com.symbol.datawedge.api.SOFT_SCAN_TRIGGER", "START_SCANNING");
-      // 骞挎挱杩欎釜鎰忓浘
-      main.sendBroadcast(intent);
-    },
-  },
+  });
 };
+
+// 寮�鍚箍鎾�
+const startScan = () => {
+  //  #ifdef APP
+  console.log("startScan,寮�鍚箍鎾帴鏀�");
+  main.value.registerReceiver(receiver.value, filter.value);
+  // #endif
+};
+// 鍏抽棴骞挎挱
+const stopScan = () => {
+  //  #ifdef APP
+  console.log("stopScan缁撴潫");
+  main.value.unregisterReceiver(receiver.value);
+  // #endif
+};
+
+const queryCode = (code: any) => {
+  //  #ifdef APP
+  if (codeQueryTag.value) return false;
+  codeQueryTag.value = true;
+  setTimeout(function () {
+    codeQueryTag.value = false;
+  }, 150);
+  // console.log('-****--鎵爜code锛� ', code);
+  let data = code;
+  uni.$emit(props.emitName, {
+    code: data,
+  });
+  // #endif
+};
+
+const triggerScan = () => {
+  console.log("瑙﹀彂鎵弿");
+  // 鑾峰彇Android鎰忓浘绫�
+  let Intent = plus.android.importClass("android.content.Intent");
+  // 瀹炰緥鍖栨剰鍥�
+  let intent = new Intent();
+  // 瀹氫箟鎰忓浘锛岀敱鍘傚晢鎻愪緵(姝ゅ璁剧疆涓轰笢澶х殑锛� 寮�濮嬫壂鎻忓箍鎾璫om.scan.onStartScan锛屽搴旂殑鍋滄鎵弿骞挎挱涓篶om.scan.onEndScan)
+  intent.setAction("com.symbol.datawedge.api.ACTION");
+  intent.putExtra("com.symbol.datawedge.api.SOFT_SCAN_TRIGGER", "START_SCANNING");
+  // 骞挎挱杩欎釜鎰忓浘
+  main.value.sendBroadcast(intent);
+};
+
+onLoad(() => {
+  console.log("鍒濆鍖�");
+  // 鍒濆鍖�
+  initScan();
+  // 鍚姩骞挎挱
+  startScan();
+});
+
+onHide(() => {
+  stopScan();
+});
+
+onUnmounted(() => {
+  stopScan();
+});
+
+defineExpose({
+  triggerScan,
+});
 </script>
diff --git a/src/components/scan/index3.vue b/src/components/scan/index3.vue
new file mode 100644
index 0000000..b3984d6
--- /dev/null
+++ b/src/components/scan/index3.vue
@@ -0,0 +1,104 @@
+<template>
+  <view>
+    <view class="content"></view>
+  </view>
+</template>
+<!-- 婵�鍏夋壂鐮侊紝骞挎挱妯″紡 -->
+<script>
+var main, receiver, filter;
+var codeQueryTag = false;
+export default {
+  data() {
+    return {
+      scanCode: "",
+    };
+  },
+
+  onLoad() {
+    console.log("鍒濆鍖�");
+    // 鍒濆鍖�
+    this.initScan();
+    // 鍚姩骞挎挱
+    this.startScan();
+  },
+  onHide() {
+    // 缁撴潫骞挎挱
+    this.stopScan();
+  },
+  destroyed() {
+    // 缁撴潫骞挎挱
+    this.stopScan();
+  },
+  methods: {
+    // 鍒濆鍖�
+    initScan() {
+      //  #ifdef APP
+      // console.log('initScan:鎵爜鍒濆鍖�');
+      let that = this;
+      main = plus.android.runtimeMainActivity(); //鑾峰彇activity
+      //var context = plus.android.importClass('android.content.Context'); //涓婁笅鏂�
+      var IntentFilter = plus.android.importClass("android.content.IntentFilter");
+      filter = new IntentFilter();
+      //涓嬮潰鐨刟ddAction 鏀逛负鑷繁 pad 璁惧鐨勫箍鎾姩浣滐紙鍦ㄦ壂鎻忚缃垨鑰呭巶鍟嗛檮甯︾殑app 閲岄潰璁剧疆涓哄箍鎾ā寮忥紝鐒跺悗鏌ョ湅鐩稿簲鍙傛暟锛�
+      filter.addAction("com.dwexample.ACTION");
+      receiver = plus.android.implements("io.dcloud.feature.internal.reflect.BroadcastReceiver", {
+        onReceive: (context, intent) => {
+          console.log("---onReceive锛�", context, intent);
+          plus.android.importClass(intent);
+          //涓嬮潰鐨刧etStringExtra鍐呮敼涓鸿嚜宸辩殑骞挎挱鏍囩锛堥敭鍊�/key锛夛細 data
+          //鏂戦┈ TC20
+          var banMaSacanInfo = intent.getStringExtra(
+            "com.motorolasolutions.emdk.datawedge.data_string"
+          );
+          // callback(intent.getStringExtra('com.motorolasolutions.emdk.datawedge.data_string'));
+          console.log("鏂戦┈鎵弿缁撴灉", banMaSacanInfo);
+          // 浼犲叆鎺ユ敹鍒扮殑鍙傛暟
+          that.queryCode(banMaSacanInfo);
+        },
+      });
+      // #endif
+    },
+    // 寮�鍚箍鎾�
+    startScan() {
+      //  #ifdef APP
+      console.log("startScan,寮�鍚箍鎾帴鏀�");
+      main.registerReceiver(receiver, filter);
+      // #endif
+    },
+    // 鍏抽棴骞挎挱
+    stopScan() {
+      //  #ifdef APP
+      console.log("stopScan缁撴潫");
+      main.unregisterReceiver(receiver);
+      // #endif
+    },
+    // 閬垮厤閲嶅鎵爜
+    queryCode: function (code) {
+      //  #ifdef APP
+      if (codeQueryTag) return false;
+      codeQueryTag = true;
+      setTimeout(function () {
+        codeQueryTag = false;
+      }, 150);
+      // console.log('-****--鎵爜code锛� ', code);
+      let data = code;
+      uni.$emit(this.emitName, {
+        code: data,
+      });
+      // #endif
+    },
+    triggerScan() {
+      console.log("瑙﹀彂鎵弿");
+      // 鑾峰彇Android鎰忓浘绫�
+      let Intent = plus.android.importClass("android.content.Intent");
+      // 瀹炰緥鍖栨剰鍥�
+      let intent = new Intent();
+      // 瀹氫箟鎰忓浘锛岀敱鍘傚晢鎻愪緵(姝ゅ璁剧疆涓轰笢澶х殑锛� 寮�濮嬫壂鎻忓箍鎾璫om.scan.onStartScan锛屽搴旂殑鍋滄鎵弿骞挎挱涓篶om.scan.onEndScan)
+      intent.setAction("com.symbol.datawedge.api.ACTION");
+      intent.putExtra("com.symbol.datawedge.api.SOFT_SCAN_TRIGGER", "START_SCANNING");
+      // 骞挎挱杩欎釜鎰忓浘
+      main.sendBroadcast(intent);
+    },
+  },
+};
+</script>
diff --git a/src/pages.json b/src/pages.json
index e5b5e6b..279327f 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -260,6 +260,12 @@
       "style": {
         "navigationBarTitleText": "缁炵嚎鏉傚伐缂栬緫"
       }
+    },
+    {
+      "path": "pages/timely/index",
+      "style": {
+        "navigationBarTitleText": "鏃舵晥鎶ュ伐"
+      }
     }
   ],
   "globalStyle": {
diff --git a/src/pages/index/components/ReportWorkTime.vue b/src/pages/index/components/ReportWorkTime.vue
deleted file mode 100644
index 4f67ec1..0000000
--- a/src/pages/index/components/ReportWorkTime.vue
+++ /dev/null
@@ -1,48 +0,0 @@
-<template>
-  <view>
-    <wd-icon name="scan" color="#999" size="18px" @click="openScan" />
-    <Scan ref="scanRef" />
-    <!-- 寮圭獥 -->
-    <wd-toast />
-  </view>
-</template>
-
-<script setup lang="ts">
-import Scan from "@/components/scan/index.vue";
-import { useUserStore } from "@/store/modules/user";
-import reportApi from "@/api/work/report";
-import { useToast } from "wot-design-uni";
-
-defineOptions({
-  name: "宸ユ椂鍙戦��",
-});
-
-const scanRef = ref();
-const userStore = useUserStore();
-const userInfo: any = computed(() => userStore.userInfo);
-const toast = useToast();
-
-const openScan = () => {
-  scanRef.value.triggerScan();
-};
-
-const getScanCode = async () => {
-  const { code } = await reportApi.sendWorkTime({
-    userName: userInfo.value.userName,
-  });
-  if (code == 200) {
-    toast.success("鎵爜鎴愬姛");
-  }
-};
-
-onLoad(() => {
-  // 寮�鍚箍鎾洃鍚簨浠�
-  uni.$on("scan", getScanCode);
-});
-onUnload(() => {
-  // 寮�鍚箍鎾洃鍚簨浠�
-  uni.$off("scan", getScanCode);
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/pages/index/index.vue b/src/pages/index/index.vue
index a1fa7f1..844ab8b 100644
--- a/src/pages/index/index.vue
+++ b/src/pages/index/index.vue
@@ -6,9 +6,6 @@
       <view class="text-[#0D867F] font-medium py-2 text-lg">
         <text>浜ㄦ椇鐗瑰绾跨紗涓婃姤绯荤粺</text>
       </view>
-      <view>
-        <ReportWorkTime />
-      </view>
     </view>
     <WorkerCallingCard />
 
@@ -20,19 +17,15 @@
       </template>
     </wd-notice-bar>
     <!-- 蹇嵎瀵艰埅 -->
-    <wd-grid clickable :column="4" class="mt-2">
-      <wd-grid-item
-        v-for="(item, index) in navList"
-        :key="index"
-        use-slot
-        link-type="navigateTo"
-        :url="item.url"
-      >
-        <view class="p-2">
-          <image class="w-72rpx h-72rpx rounded-8rpx" :src="item.icon" />
-        </view>
-        <view class="text">{{ item.title }}</view>
-      </wd-grid-item>
+    <wd-grid clickable :column="1" class="mt-2">
+      <view v-for="(item, index) in navList">
+        <wd-grid-item v-if="item.show" :key="index" use-slot link-type="navigateTo" :url="item.url">
+          <view class="p-2">
+            <image class="w-72rpx h-72rpx rounded-8rpx" :src="item.icon" />
+          </view>
+          <view class="text">{{ item.title }}</view>
+        </wd-grid-item>
+      </view>
     </wd-grid>
 
     <!-- 鏁版嵁缁熻 -->
@@ -87,10 +80,11 @@
 </template>
 
 <script setup lang="ts">
+import { reactive } from "vue";
 import { dayjs } from "wot-design-uni";
 import LogAPI, { VisitStatsVO } from "@/api/system/log";
 import WorkerCallingCard from "@/components/worker-calling-card/index.vue";
-import ReportWorkTime from "./components/ReportWorkTime.vue";
+import HomeApi from "@/api/home";
 
 const visitStatsData = ref<VisitStatsVO>({
   todayUvCount: 0,
@@ -141,24 +135,31 @@
     icon: "/static/icons/user.png",
     title: "鐢熶骇绠$悊",
     url: "/pages/production/index",
+    show: false,
   },
+  // {
+  //   icon: "/static/icons/role.png",
+  //   title: "瑙掕壊绠$悊",
+  //   url: "/pages/work/role/index",
+  //   prem: "sys:role:query",
+  // },
+  // {
+  //   icon: "/static/icons/notice.png",
+  //   title: "閫氱煡鍏憡",
+  //   url: "/pages/work/notice/index",
+  //   prem: "sys:notice:query",
+  // },
+  // {
+  //   icon: "/static/icons/setting.png",
+  //   title: "绯荤粺閰嶇疆",
+  //   url: "/pages/work/config/index",
+  //   prem: "sys:config:query",
+  // },
   {
-    icon: "/static/icons/role.png",
-    title: "瑙掕壊绠$悊",
-    url: "/pages/work/role/index",
-    prem: "sys:role:query",
-  },
-  {
-    icon: "/static/icons/notice.png",
-    title: "閫氱煡鍏憡",
-    url: "/pages/work/notice/index",
-    prem: "sys:notice:query",
-  },
-  {
-    icon: "/static/icons/setting.png",
-    title: "绯荤粺閰嶇疆",
-    url: "/pages/work/config/index",
-    prem: "sys:config:query",
+    icon: "/static/icons/log.png",
+    title: "鏃舵晥鎶ュ伐",
+    url: "/pages/timely/index",
+    show: false,
   },
 ]);
 
@@ -205,9 +206,17 @@
   loadVisitTrendData();
 };
 
-onReady(() => {
-  // loadVisitStatsData();
-  // loadVisitTrendData();
+const init = async () => {
+  const { data } = await HomeApi.getIndex();
+  if (data.deviceGroupName == "鏃舵晥缁�") {
+    navList[1].show = true;
+  } else {
+    navList[0].show = true;
+  }
+};
+
+onMounted(() => {
+  init();
 });
 </script>
 
diff --git a/src/pages/production/index.vue b/src/pages/production/index.vue
index a55a50a..017062f 100644
--- a/src/pages/production/index.vue
+++ b/src/pages/production/index.vue
@@ -5,7 +5,7 @@
         <wd-search placeholder-left hide-cancel></wd-search>
       </wd-col>
       <wd-col :span="3">
-        <view class="scan_box">
+        <view class="scan_box" @click="openScan">
           <wd-icon name="scan" size="24px" color="#0D867F"></wd-icon>
         </view>
       </wd-col>
@@ -28,6 +28,8 @@
         />
       </wd-tab>
     </wd-tabs>
+    <Scan ref="scanRef" emitName="scan" />
+    <wd-toast />
   </view>
 </template>
 
@@ -35,6 +37,15 @@
 import ManageApi from "@/api/product/manage";
 import { ref } from "vue";
 import ProductList from "./list/index.vue";
+import Scan from "@/components/scan/index.vue";
+import { useUserStore } from "@/store/modules/user";
+import reportApi from "@/api/work/report";
+import { useToast } from "wot-design-uni";
+
+const scanRef = ref();
+const userStore = useUserStore();
+const userInfo: any = computed(() => userStore.userInfo);
+const toast = useToast();
 
 const waitRef = ref();
 const alreadyRef = ref();
@@ -51,6 +62,37 @@
 const changeAlready = (num: number) => {
   total.already = num;
 };
+
+const openScan = () => {
+  scanRef.value.triggerScan();
+};
+
+const getScanCode = async () => {
+  console.log("鐢熶骇绠$悊鎵爜鍥炶皟");
+  const { code } = await reportApi.sendWorkTime({
+    userName: userInfo.value.userName,
+  });
+  if (code == 200) {
+    toast.success("鎵爜鎴愬姛");
+  }
+};
+
+// 纭繚鍏堢Щ闄ゅ啀娣诲姞鐩戝惉
+const setupScanListener = () => {
+  uni.$off("scan", getScanCode); // 鍏堢Щ闄ゆ棫鐨�
+  uni.$on("scan", getScanCode); // 鍐嶆坊鍔犳柊鐨�
+};
+
+onMounted(() => {
+  // 寮�鍚箍鎾洃鍚簨浠�
+  setupScanListener();
+  console.log("鏄剧ず1");
+});
+onUnmounted(() => {
+  // 寮�鍚箍鎾洃鍚簨浠�
+  uni.$off("scan", getScanCode);
+  console.log("绂诲紑1");
+});
 </script>
 
 <style lang="scss" scoped>
diff --git a/src/pages/production/list/index.vue b/src/pages/production/list/index.vue
index 93d3a2e..92862f8 100644
--- a/src/pages/production/list/index.vue
+++ b/src/pages/production/list/index.vue
@@ -39,6 +39,7 @@
   totalAmount: "totalAmount",
   amount: "amount",
   unAmount: "unAmount",
+  unit: "unit",
 });
 const props = defineProps({
   api: {
diff --git a/src/pages/production/twist/receive/monofil.vue b/src/pages/production/twist/receive/monofil.vue
index ab8eb9f..9f3fb11 100644
--- a/src/pages/production/twist/receive/monofil.vue
+++ b/src/pages/production/twist/receive/monofil.vue
@@ -23,7 +23,7 @@
         </view>
       </template>
     </z-paging>
-    <Scan ref="scanRef" />
+    <Scan ref="scanRef" emitName="scanMono" />
     <wd-toast />
   </view>
 </template>
@@ -103,12 +103,12 @@
 
 onLoad((options: any) => {
   // 寮�鍚箍鎾洃鍚簨浠�
-  uni.$on("scan", getScanCode);
+  uni.$on("scanMono", getScanCode);
   paramsId.value = options.id;
 });
 onUnload(() => {
   // 寮�鍚箍鎾洃鍚簨浠�
-  uni.$off("scan", getScanCode);
+  uni.$off("scanMono", getScanCode);
 });
 </script>
 
diff --git a/src/pages/production/wire/report/wireForm.vue b/src/pages/production/wire/report/wireForm.vue
index b2c4b74..f4e71f6 100644
--- a/src/pages/production/wire/report/wireForm.vue
+++ b/src/pages/production/wire/report/wireForm.vue
@@ -51,9 +51,9 @@
         clearable
         placeholder="璇疯緭鍏ユ潌鍖呭彿"
       >
-          <template #label>
-            <span style="color: #F56C6C">鏉嗗寘鍙�</span>
-          </template>
+        <template #label>
+          <span style="color: #f56c6c">鏉嗗寘鍙�</span>
+        </template>
       </wd-input>
       <wd-input
         v-model="model.dishModel"
@@ -62,9 +62,9 @@
         clearable
         placeholder="璇疯緭鍏ョ洏鍨嬪彿"
       >
-          <template #label>
-            <span style="color: #F56C6C">鐩樺瀷鍙�</span>
-          </template>
+        <template #label>
+          <span style="color: #f56c6c">鐩樺瀷鍙�</span>
+        </template>
       </wd-input>
       <wd-input
         v-model="model.actuallyLength"
@@ -73,9 +73,9 @@
         clearable
         placeholder="璇疯緭鍏ュ疄闄呴暱搴�"
       >
-          <template #label>
-            <span style="color: #F56C6C">瀹為檯闀垮害(m)</span>
-          </template>
+        <template #label>
+          <span style="color: #f56c6c">瀹為檯闀垮害(m)</span>
+        </template>
       </wd-input>
       <wd-input
         v-model="model.actuallyWeight"
@@ -84,9 +84,9 @@
         clearable
         placeholder="璇疯緭鍏ュ疄闄呴噸閲�"
       >
-          <template #label>
-            <span style="color: #F56C6C">瀹為檯閲嶉噺(kg)</span>
-          </template>
+        <template #label>
+          <span style="color: #f56c6c">瀹為檯閲嶉噺(kg)</span>
+        </template>
       </wd-input>
     </wd-cell-group>
     <wd-toast />
@@ -123,7 +123,7 @@
   });
   if (code == 200) {
     toast.success("鎻愪氦鎴愬姛");
-    resetForm()
+    resetForm();
     return true;
   } else {
     toast.error("鎻愪氦澶辫触");
@@ -142,7 +142,7 @@
   const arr = code.code.split(",");
   model.poleNumber = arr[3]; //  棰嗙敤鏉嗗彿
   model.poleWeight = arr[4]; //  鏉嗛噸
-  model.poleModel = '桅' + arr[1].slice(2); //  鏉嗗瀷鍙�
+  model.poleModel = arr[2]; //  鏉嗗瀷鍙�
 };
 
 onLoad((options: any) => {
diff --git a/src/pages/timely/index.vue b/src/pages/timely/index.vue
new file mode 100644
index 0000000..ab55d7b
--- /dev/null
+++ b/src/pages/timely/index.vue
@@ -0,0 +1,108 @@
+<template>
+  <view class="list_box">
+    <z-paging ref="pagingRef" v-model="cardList" :fixed="false" :auto-show-back-to-top="true">
+      <template #top>
+        <CardTitle title="鏃舵晥鎶ュ伐" :hideAction="false">
+          <template #action>
+            <wd-button type="icon" icon="scan" color="#0D867F" @click="openScan"></wd-button>
+          </template>
+        </CardTitle>
+      </template>
+      <MonofilCard v-for="(item, index) in cardList" :key="index" :data="item" />
+      <template #bottom>
+        <view class="flex justify-center items-center">
+          <wd-button block @click="save">
+            <text class="text-[#fff]">淇濆瓨</text>
+          </wd-button>
+        </view>
+      </template>
+    </z-paging>
+    <Scan ref="scanRef" emitName="scanTime" />
+    <wd-toast />
+  </view>
+</template>
+
+<script setup lang="ts">
+import CardTitle from "@/components/card-title/index.vue";
+import zPaging from "@/components/z-paging/z-paging.vue";
+import Scan from "@/components/scan/index.vue";
+import MonofilCard from "../production/twist/components/MonofilCard.vue";
+import TwistApi from "@/api/product/twist";
+import { useToast } from "wot-design-uni";
+
+const pagingRef = ref();
+const scanRef = ref();
+const toast = useToast();
+const cardList = ref<any>([]);
+
+const getScanCode = async (code: any) => {
+  console.log("鏃舵晥鎵爜鍥炶皟:", code);
+  console.log("json:", JSON.parse(code.code));
+  console.log("id:=============", JSON.parse(code.code).id);
+  const { data } = await TwistApi.getScarn({
+    outPutId: JSON.parse(code.code).id,
+  });
+  console.log("=======璇锋眰========", data);
+  const exists = cardList.value.some(
+    (item: any) => item.monofilamentNumber === data.monofilamentNumber
+  );
+  if (!exists) {
+    const { id, outPutId, wireId, oneLength, ...rest } = data;
+    console.log("sb", {
+      outputId: id,
+      amount: oneLength,
+      ongLength: oneLength,
+      ...rest,
+    });
+    cardList.value.push({
+      outputId: id,
+      amount: oneLength,
+      ongLength: oneLength,
+      ...rest,
+    });
+    pagingRef.value.complete(cardList.value);
+  } else {
+    toast.error("璇ュ崟涓濆凡棰嗙敤锛岃鍕块噸澶嶆壂鐮�");
+  }
+};
+const save = async () => {
+  const { code } = await TwistApi.saveAge(cardList.value);
+  if (code == 200) {
+    toast.success("淇濆瓨鎴愬姛");
+    pagingRef.value.refresh();
+  } else {
+    toast.error("淇濆瓨澶辫触");
+  }
+};
+
+const openScan = () => {
+  scanRef.value.triggerScan();
+};
+
+// 纭繚鍏堢Щ闄ゅ啀娣诲姞鐩戝惉
+const setupScanListener = () => {
+  uni.$off("scanTime", getScanCode); // 鍏堢Щ闄ゆ棫鐨�
+  uni.$on("scanTime", getScanCode); // 鍐嶆坊鍔犳柊鐨�
+};
+
+onMounted(() => {
+  setupScanListener();
+  console.log("椤甸潰鏄剧ず - 鎵爜鐩戝惉宸茶缃�");
+});
+
+onUnmounted(() => {
+  // 寮�鍚箍鎾洃鍚簨浠�
+  uni.$off("scanTime", getScanCode);
+  console.log("椤甸潰鍗歌浇 - 鎵爜鐩戝惉宸茬Щ闄�");
+});
+</script>
+
+<style lang="scss" scoped>
+.list_box {
+  height: calc(100vh - 100px);
+  background: #f3f9f8;
+}
+:deep(.wd-button__content) {
+  color: #0d867f;
+}
+</style>

--
Gitblit v1.9.3