曹睿
2 天以前 aca7aa9ce32acc4c8795342f945b027d3bc9f62a
feat: 添加时效报工,修复扫码内存泄漏
已修改11个文件
已删除1个文件
已添加3个文件
653 ■■■■■ 文件已修改
.env.development 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.production 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/home/index.ts 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/product/twist.ts 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/product_card/index.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/scan/index.vue 187 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/scan/index3.vue 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/index/components/ReportWorkTime.vue 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/index/index.vue 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/production/index.vue 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/production/list/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/production/twist/receive/monofil.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/production/wire/report/wireForm.vue 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/timely/index.vue 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.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' #
.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'
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;
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;
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>
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();
      //下面的addAction æ”¹ä¸ºè‡ªå·± 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);
          //下面的getStringExtra内改为自己的广播标签(键值/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();
  //下面的addAction æ”¹ä¸ºè‡ªå·± 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);
      //下面的getStringExtra内改为自己的广播标签(键值/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();
      // å®šä¹‰æ„å›¾ï¼Œç”±åŽ‚å•†æä¾›(此处设置为东大的: å¼€å§‹æ‰«æå¹¿æ’­com.scan.onStartScan,对应的停止扫描广播为com.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();
  // å®šä¹‰æ„å›¾ï¼Œç”±åŽ‚å•†æä¾›(此处设置为东大的: å¼€å§‹æ‰«æå¹¿æ’­com.scan.onStartScan,对应的停止扫描广播为com.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>
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();
      //下面的addAction æ”¹ä¸ºè‡ªå·± 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);
          //下面的getStringExtra内改为自己的广播标签(键值/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();
      // å®šä¹‰æ„å›¾ï¼Œç”±åŽ‚å•†æä¾›(此处设置为东大的: å¼€å§‹æ‰«æå¹¿æ’­com.scan.onStartScan,对应的停止扫描广播为com.scan.onEndScan)
      intent.setAction("com.symbol.datawedge.api.ACTION");
      intent.putExtra("com.symbol.datawedge.api.SOFT_SCAN_TRIGGER", "START_SCANNING");
      // å¹¿æ’­è¿™ä¸ªæ„å›¾
      main.sendBroadcast(intent);
    },
  },
};
</script>
src/pages.json
@@ -260,6 +260,12 @@
      "style": {
        "navigationBarTitleText": "绞线杂工编辑"
      }
    },
    {
      "path": "pages/timely/index",
      "style": {
        "navigationBarTitleText": "时效报工"
      }
    }
  ],
  "globalStyle": {
src/pages/index/components/ReportWorkTime.vue
ÎļþÒÑɾ³ý
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>
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>
src/pages/production/list/index.vue
@@ -39,6 +39,7 @@
  totalAmount: "totalAmount",
  amount: "amount",
  unAmount: "unAmount",
  unit: "unit",
});
const props = defineProps({
  api: {
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>
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) => {
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>