yyb
5 天以前 d840ec98c37494baf79f3d05e3d2b01c76cec744
巡检
已添加5个文件
已修改2个文件
504 ■■■■■ 文件已修改
src/api/routingInspection/routingInspection.ts 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/index/index.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/routingInspection/index.vue 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/routingInspection/list/index.vue 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/routingInspection/product_card/index.vue 205 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/static/icons/routingInspection.png 补丁 | 查看 | 原始文档 | blame | 历史
src/api/routingInspection/routingInspection.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
import request from "@/utils/request";
import { BaseResult } from "@/models/base";
const RoutingInspectionApi = {
  // æŸ¥è¯¢å·¡æ£€è®°å½•
  getDeviceInspectListByPatrol(params: any) {
    return request<BaseResult<any>>({
      url: "/wireInspection/getDeviceInspectListByPatrol",
      method: "GET",
      data: params,
    });
  },
  // èŽ·å–å·¡æ£€æ•°æ®
  getInspectListByPatrol(data: any) {
    return request<BaseResult<any>>({
      url: "/wireInspection/getInspectListByPatrol",
      method: "POST",
      data: data,
    });
  },
};
export default RoutingInspectionApi;
src/pages.json
@@ -148,6 +148,12 @@
      }
    },
    {
      "path": "pages/routingInspection/index",
      "style": {
        "navigationBarTitleText": "巡检"
      }
    },
    {
      "path": "pages/production/detail/wireDetail",
      "style": {
        "navigationBarTitleText": "拉丝详情"
src/pages/index/index.vue
@@ -177,6 +177,12 @@
    url: "/pages/timely/index",
    show: false,
  },
  {
    icon: "/static/icons/routingInspection.png",
    title: "巡检",
    url: "/pages/routingInspection/index",
    show: true,
  },
]);
// åŠ è½½è®¿é—®ç»Ÿè®¡æ•°æ®
src/pages/routingInspection/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,153 @@
<template>
  <view>
    <wd-row>
      <wd-col :span="21">
        <wd-search placeholder-left hide-cancel></wd-search>
      </wd-col>
      <wd-col :span="3">
        <view class="scan_box" @click="openScan">
          <wd-icon name="scan" size="24px" color="#0D867F"></wd-icon>
        </view>
      </wd-col>
    </wd-row>
    <wd-tabs v-model="tab" auto-line-width slidable="always" map-num>
      <wd-tab
        v-for="(item, index) in patrolList"
        :key="index"
        :title="`${item.deviceModel}(待检查${item.pendingNum}条)`"
        class="tab_bg"
      >
        <ProductList
          :api="RoutingInspectionApi.getInspectListByPatrol"
          :ProList="item"
        />
      </wd-tab>
    </wd-tabs>
    <Scan ref="scanRef" emitName="scan" />
    <wd-toast />
  </view>
</template>
<script lang="ts" setup>
import { ref, reactive, computed, onMounted, onUnmounted } 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";
import RoutingInspectionApi from "@/api/routingInspection/routingInspection";
const scanRef = ref();
const userStore = useUserStore();
const userInfo: any = computed(() => userStore.userInfo);
const toast = useToast();
const tab = ref<number>(0);
const patrolList = ref<any[]>([]);// å·¡æ£€è®¾å¤‡åˆ—表数据
const handlePatrolData = (index: number, count: number) => {
  // å¯ä»¥åœ¨è¿™é‡Œæ›´æ–°ç‰¹å®šå·¡æ£€è®¾å¤‡çš„待检查数量
  // ä¾‹å¦‚:patrolList.value[index].pendingNum = count;
};
const openScan = () => {
  scanRef.value.triggerScan();
};
const getScanCode = async () => {
  const { code } = await reportApi.sendWorkTime({
    userName: userInfo.value.userName,
  });
  if (code == 200) {
    toast.success("扫码成功");
  }
};
// èŽ·å–ç‰¹å®šå·¡æ£€è®¾å¤‡çš„æ•°æ®
const getPatrolData = (item: any) => {
  return async (params: any) => {
    // è¿™é‡Œå¯ä»¥æ ¹æ®item中的信息调用相应的接口获取详情
    // è¿”回的数据格式需要与ProductList组件期望的格式一致
    return {
      code: 200,
      data: {
        type: "巡检",
        data: {
          total: 0,
          records: []
        }
      }
    };
  };
};
// èŽ·å–å·¡æ£€è®¾å¤‡åˆ—è¡¨
const loadPatrolList = async () => {
  try {
    const { data } = await RoutingInspectionApi.getDeviceInspectListByPatrol({});
    if (data) {
      patrolList.value = data;
    }
  } catch (error) {
    toast.error("获取巡检设备列表失败");
  }
};
// ç¡®ä¿å…ˆç§»é™¤å†æ·»åŠ ç›‘å¬
const setupScanListener = () => {
  uni.$off("scan", getScanCode); // å…ˆç§»é™¤æ—§çš„
  uni.$on("scan", getScanCode); // å†æ·»åŠ æ–°çš„
};
onMounted(() => {
  // å¼€å¯å¹¿æ’­ç›‘听事件
  setupScanListener();
  console.log("显示1");
  // é¡µé¢åŠ è½½æ—¶èŽ·å–å·¡æ£€è®¾å¤‡åˆ—è¡¨
  loadPatrolList();
});
onUnmounted(() => {
  // å¼€å¯å¹¿æ’­ç›‘听事件
  uni.$off("scan", getScanCode);
  console.log("离开1");
});
</script>
<style lang="scss" scoped>
::v-deep .wd-search__block {
  border-radius: unset;
}
.scan_box {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 38px;
  height: 38px;
  padding: 6px;
  background: #fff;
}
::v-deep .wd-tabs__line {
  background: #0d867f;
}
::v-deep .wd-tabs__nav {
  border-bottom: 1px #dddddd solid;
}
.tab_bg {
  background: #f3f9f8;
}
.icon_box {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  background: #e7f4ec99;
  border-radius: 50%;
}
.statistics_box {
  margin: 15px;
}
</style>
src/pages/routingInspection/list/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
<template>
    <view class="card_box">
        <z-paging ref="pagingRef" v-model="list" :fixed="false" :auto-show-back-to-top="true" @query="getList">
            <ProductCard v-for="(item, index) in list" :key="index" :data="item" :map="map"
                @click="toDetail(item.id, item.deviceType)" />
        </z-paging>
        <wd-toast />
    </view>
</template>
<script setup lang="ts">
    import ProductCard from "../product_card/index.vue";
    import { useUserStore } from "@/store/modules/user";
    import zPaging from "@/components/z-paging/z-paging.vue";
    import { useToast } from "wot-design-uni";
    const toast = useToast();
    const userStore = useUserStore();
    const userInfo : any = computed(() => userStore.userInfo);
    const pagingRef = ref();
const map = reactive({
        deviceModel: "deviceModel",
        model: "model",
        firstNo: "firstNo",
        recordDate: "recordDate",
        workShift: "workShift",
        teamName: "teamName",
        poleModel: "poleModel",
        poleNumber: "poleNumber",
        outputNumber: "outputNumber",
        inspectPerson: "inspectPerson",
        status: "status",
    rejectList: [
      {
        rejectPerson: "rejectPerson",
        rejectTime: "rejectTime",
        rejectReason: {
          reason: "reason"
        },
      },
        ], // æ”¹ä¸ºå¯¹è±¡ï¼ŒåŒ…含所需的嵌套属性
    });
    const props = defineProps({
        api: {
            type: Function,
            default: () => { },
        },
        ProList: {
            type: Object,
            default: () => { },
        },
    });
    const list = ref<any[]>([]);
const toDetail = (id: number, deviceType: number) => {
    console.log('点击卡片', id, deviceType);
        toast.show("点击卡片");
        if (deviceType == 0) {
            uni.navigateTo({
                url: `/pages/production/detail/wireDetail?id=${id}`,
            });
        } else if (deviceType == 1) {
            uni.navigateTo({
                url: `/pages/production/detail/twistDetail?id=${id}`,
            });
        }
    };
    const getList = async () => {
        const { code, data } = await props.api({
            deviceModel: props.ProList.deviceModel,
            status: "0",
            deviceType: props.ProList.deviceType,
        });
        if (code == 200) {
      map.deviceModel = "deviceModel";
            map.model = "model";
            map.firstNo = "firstNo";
            map.recordDate = "recordDate";
            map.workShift = "workShift";
            map.teamName = "teamName";
            map.poleModel = "poleModel";
            map.poleNumber = "poleNumber";
            map.outputNumber = "outputNumber";
      map.inspectPerson = "inspectPerson";
      map.rejectList = [
        {
          rejectPerson: "rejectPerson",
          rejectTime: "rejectTime",
          rejectReason: {
            reason: "reason"
          },
        },
      ];
            map.status = "status";
            if (data.total == 0) {
                pagingRef.value.complete(true);
      } else {
        console.log('data.records', data.records);
                pagingRef.value.complete(data.records);
            }
        }
    };
</script>
<style lang="scss" scoped>
    .card_box {
        height: calc(100vh - 120px);
    }
</style>
src/pages/routingInspection/product_card/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,205 @@
<template>
    <wd-card class="card_bg" @click="handleCardClick">
        <template #title>
            <view class="flex justify-between w-full">
                <text class="font-medium text-[#252525]">机台: {{ data[map.deviceModel] }}</text>
                <wd-tag color="#0D867F" bg-color="#E7F4EC">
                    <text class="text-xs">{{ data[map.model] }}</text>
                </wd-tag>
            </view>
        </template>
        <wd-row class="my-2">
            <wd-col :span="24">
                <view class="flex">
                    <view class="icon_box">
                        <wd-icon name="folder" color="#0D867F"></wd-icon>
                    </view>
                    <text class="text-[#646874] mx-2">
                        é¦–检单号:
                        <text class="text-[#252525]">{{ data[map.firstNo] }}</text>
                    </text>
                </view>
            </wd-col>
        </wd-row>
        <wd-row class="my-2">
            <wd-col :span="24">
                <view class="flex">
                    <view class="icon_box">
                        <wd-icon name="folder" color="#0D867F"></wd-icon>
                    </view>
                    <text class="text-[#646874] mx-2">
                        ç­æ¬¡:
                        <text class="text-[#252525]">{{ data[map.workShift] }}</text>
                    </text>
                </view>
            </wd-col>
        </wd-row>
        <wd-row class="my-2">
            <wd-col :span="24">
                <view class="flex">
                    <view class="icon_box">
                        <wd-icon name="folder" color="#0D867F"></wd-icon>
                    </view>
                    <text class="text-[#646874] mx-2">
                        ç­ç»„:
                        <text class="text-[#252525]">{{ data[map.teamName] }}</text>
                    </text>
                </view>
            </wd-col>
        </wd-row>
        <wd-row class="my-2">
            <wd-col :span="24">
                <view class="flex">
                    <view class="icon_box">
                        <wd-icon name="folder" color="#0D867F"></wd-icon>
                    </view>
                    <text class="text-[#646874] mx-2">
                        é¢†ç”¨æ†å·:
                        <text class="text-[#252525]">{{ data[map.poleNumber] }}</text>
                    </text>
                </view>
            </wd-col>
        </wd-row>
        <wd-col :span="12">
            <view class="flex">
                <view class="icon_box">
                    <wd-icon name="folder" color="#0D867F"></wd-icon>
                </view>
                <text class="text-[#646874] mx-2">
                    æ†åž‹å·:
                    <text class="text-[#252525]">{{ data[map.poleModel] }}</text>
                </text>
            </view>
        </wd-col>
        <wd-row class="my-2">
            <wd-col :span="12">
                <view class="flex">
                    <view class="icon_box">
                        <wd-icon name="folder" color="#0D867F"></wd-icon>
                    </view>
                    <text class="text-[#646874] mx-2">
                        ç”Ÿäº§è½´æ•°:
                        <text class="text-[#252525]">{{ data[map.outputNumber] }}</text>
                    </text>
                </view>
            </wd-col>
        </wd-row>
        <wd-row class="my-2">
            <wd-col :span="12">
                <view class="flex">
                    <view class="icon_box">
                        <wd-icon name="folder" color="#0D867F"></wd-icon>
                    </view>
                    <text class="text-[#646874] mx-2">
                        è‡ªæ£€äºº:
                        <text class="text-[#252525]">{{ data[map.inspectPerson] }}</text>
                    </text>
                </view>
            </wd-col>
            <wd-col :span="12">
                <view class="flex">
                    <view class="icon_box">
                        <wd-icon name="folder" color="#0D867F"></wd-icon>
                    </view>
                    <text class="text-[#646874] mx-2">
                        çŠ¶æ€:
                        <text class="text-[#252525]">{{ data[map.status] == 1 ? "被驳回" : "巡检" }}</text>
                    </text>
                </view>
            </wd-col>
        </wd-row>
        <wd-row class="my-2">
            <wd-col :span="16">
                <view class="flex">
                    <view class="icon_box">
                        <wd-icon name="folder" color="#0D867F"></wd-icon>
                    </view>
                    <text class="text-[#646874] mx-2">
                        è®°å½•æ—¶é—´:
                        <text class="text-[#252525]">{{ data[map.recordDate] }}</text>
                    </text>
                </view>
            </wd-col>
            <wd-col :span="8">
                <view class="flex">
                    <wd-button v-if="data[map.status] == 1" size="small" type="primary" @click.stop="showRejectPopup = true"
                        style="margin-left: auto;">
                        æŸ¥çœ‹é©³å›žä¿¡æ¯
                    </wd-button>
                </view>
            </wd-col>
        </wd-row>
    </wd-card>
<wd-popup v-model="showRejectPopup" title="驳回信息" custom-style="border-radius:32rpx;height: 500rpx;width: 600rpx;">
  <wd-card v-for="(item, index) in data.rejectList" :key="index"
           :class="index % 2 === 0 ? 'reject-card-bg-1' : 'reject-card-bg-2'"
           style="margin-bottom: 15px; padding: 10px; border-radius: 8px;">
    <view class="content">
      <view>
        <view style="display: flex; justify-content: space-between; align-items: center; color: rgba(0,0,0,0.85); font-size: 14px; margin-bottom: 8px;">
          <view>{{ item.rejectPerson }}</view>
          <view>{{ item.rejectTime }}</view>
        </view>
        <view style="color: rgba(0,0,0,0.85); font-size: 14px; word-break: break-word; overflow-wrap: break-word; max-width: 100%; padding: 5px 0;">
          {{ item.rejectReason.reason }}
        </view>
      </view>
    </view>
  </wd-card>
</wd-popup>
</template>
<script setup lang="ts">
import { ref } from "vue";
const emit = defineEmits(['click']);
    defineProps({
        data: {
            type: Object,
            default: () => { },
        },
        map: {
            type: Object,
            default: () => { },
        },
    });
const showRejectPopup = ref<boolean>(false)
const handleCardClick = () => {
  emit('click');
};
</script>
<style lang="scss" scoped>
  .card_bg {
    box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.05);
    padding-bottom: 10px;
  }
  // æ·»åŠ ï¼šä¸¤ç§ä¸åŒçš„èƒŒæ™¯è‰²æ ·å¼
  .reject-card-bg-1 {
    background-color: #f5f7fa;
  }
  .reject-card-bg-2 {
    background-color: #eef2f7;
  }
  .page-class {
    :deep() {
      .custom-shadow {
        box-shadow: 0 3px 1px -2px rgb(0 0 0 / 20%), 0 2px 2px 0 rgb(0 0 0 / 14%), 0 1px 5px 0 rgb(0 0 0 / 12%);
      }
    }
  }
  .header {
    display: flex;
    align-items: center;
    justify-content: space-between;
  }
  // ä¿®æ”¹ï¼šè°ƒæ•´å†…容区域的样式
  .content {
    padding: 5px;
  }
</style>
src/static/icons/routingInspection.png