Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/qingban' into qingban

lupeng 5 mēneši atpakaļ
vecāks
revīzija
38f3c710d2

+ 9 - 0
src/api/order/index.ts

@@ -133,6 +133,15 @@ export function exportOrder(queryParams: OrderInfoQuery) {
   });
 }
 
+
+export function exportDataInfo(type,id) {
+  return request({
+    url: "/api/v1/data/"+type+"/" + id,
+    method: "get",
+    responseType: "arraybuffer",
+  });
+}
+
 /**
  * 导入
  *

+ 110 - 3
src/components/PDFView/index.vue

@@ -9,7 +9,7 @@
   </el-button>
   <VuePdfEmbed
     v-else
-    :source="pdfSource"
+    :source="{ url: pdfSource, cMapUrl: '/cmaps/', cMapPacked: true }"
     :page="pageNumber"
     annotation-layer
     text-layer
@@ -33,13 +33,14 @@
         cMapPacked: true,
       }"
       :page="showPdfNumber"
+      @rendered="rendered"
       annotation-layer
       text-layer
     />
   </el-drawer>
 </template>
 
-<script lang="ts" setup>
+<script setup>
 import VuePdfEmbed from "vue-pdf-embed";
 // essential styles
 import "vue-pdf-embed/dist/style/index.css";
@@ -63,7 +64,7 @@ const props = defineProps({
     default: false,
   },
   contentType: {
-    type: String as PropType<"button" | "pdf">,
+    type: String,
     default: "pdf",
   },
   btnText: {
@@ -89,6 +90,112 @@ const visible = ref(false);
 const showPdf = () => {
   visible.value = true;
 };
+const rendered = () => {
+  const clickableElementsA = document.querySelectorAll(
+    ".el-drawer__body .vue-pdf-embed div"
+  );
+  const clickableElements = document.querySelectorAll(
+    ".el-drawer__body .vue-pdf-embed .vue-pdf-embed__page"
+  );
+  clickableElementsA.forEach((element) => {
+    element.style.display = "flex";
+    element.style.alignItems = "center";
+    element.style.justifyContent = "center";
+  });
+  clickableElements.forEach((element, index) => {
+    let rotationAngle = 0;
+    element.addEventListener("click", () => {
+      const currentWidth = element.offsetWidth;
+      const currentHeight = element.offsetHeight;
+      const parent = element.parentNode;
+      let distance = 0;
+      if (currentHeight > currentWidth) {
+        distance = currentHeight - currentWidth;
+      } else {
+        element.style.width = `${currentHeight}px`;
+        element.style.height = `${currentWidth}px`;
+      }
+      rotationAngle = (rotationAngle + 90) % 360;
+      if (rotationAngle == 0) {
+        if (distance > 0) {
+          element.style.transform = `rotate(${rotationAngle}deg) `;
+          element.firstElementChild.style.transform = `translateY(0px) `;
+        } else {
+          element.style.transform = `rotate(${rotationAngle}deg) `;
+          element.firstElementChild.style.transform = `translateY(0px) `;
+        }
+      }
+      if (rotationAngle == 90) {
+        if (distance > 0) {
+          element.style.transform = `rotate(${rotationAngle}deg)`;
+          element.firstElementChild.style.transform = `translateY(-${distance / 2}px) `;
+        } else {
+          element.style.transform = `rotate(${rotationAngle}deg)`;
+          element.firstElementChild.style.transform = `translateY(0px) `;
+        }
+      }
+      if (rotationAngle === 180) {
+        if (distance > 0) {
+          element.style.transform = `rotate(${rotationAngle}deg) `;
+          element.firstElementChild.style.transform = `translateY(0px) `;
+        } else {
+          element.style.transform = `rotate(${rotationAngle}deg) `;
+          element.firstElementChild.style.transform = `translateY(0px) `;
+        }
+      }
+      if (rotationAngle === 270) {
+        if (distance > 0) {
+          element.style.transform = `rotate(${rotationAngle}deg) `;
+          element.firstElementChild.style.transform = `translateY(${distance / 2}px) `;
+        } else {
+          element.style.transform = `rotate(${rotationAngle}deg) `;
+          element.firstElementChild.style.transform = `translateY(0px) `;
+        }
+      }
+      parent.style.width = `${currentWidth}px`;
+      parent.style.height = `${currentHeight}px`;
+    });
+    element.addEventListener("wheel", function (event) {
+      const currentWidth = element.offsetWidth;
+      const currentHeight = element.offsetHeight;
+      const parent = element.parentNode;
+      if (event.ctrlKey) {
+        event.preventDefault();
+
+        // 获取当前的transform值并解析
+        const transform = getComputedStyle(element).transform;
+        let scale = 1,
+          rotate = 0;
+
+        if (transform && transform !== "none") {
+          const transformMatrix = new WebKitCSSMatrix(transform);
+          scale = Math.sqrt(
+            Math.pow(transformMatrix.a, 2) + Math.pow(transformMatrix.b, 2)
+          );
+          rotate =
+            Math.atan2(transformMatrix.b, transformMatrix.a) * (180 / Math.PI);
+        }
+
+        // 根据滚轮方向调整缩放级别
+        if (event.deltaY < 0) {
+          // 向上滚动,放大
+          scale += 0.1;
+        } else {
+          // 向下滚动,缩小
+          scale -= 0.1;
+        }
+        // 确保缩放级别不会变成负数或过小
+        scale = Math.max(0.1, Math.min(scale, 5));
+
+        // 应用新的缩放级别和原有的旋转角度
+        element.style.transform = `scale(${scale}) rotate(${rotate}deg)`;
+        //同步放大展示盒子
+        parent.style.width = `${currentWidth * scale}px`;
+        parent.style.height = `${currentHeight * scale}px`;
+      }
+    });
+  });
+};
 </script>
 
 <style lang="scss" scoped></style>

+ 3 - 1
src/utils/request.ts

@@ -26,12 +26,14 @@ service.interceptors.request.use(
 service.interceptors.response.use(
   (response: AxiosResponse) => {
     const { code, msg } = response.data;
-
+    console.log(msg,'2')
     if (code === "200") {
+        console.log('1')
       return response.data;
     }
     // 响应数据为二进制流处理(Excel导出)
     if (response.data instanceof ArrayBuffer) {
+        console.log('3')
       return response;
     }
 

+ 21 - 1
src/views/plan/order/index.vue

@@ -92,6 +92,15 @@
           @click="toReturn(row.orderCode)"
           ><i-ep-edit />领料
         </el-button>
+
+        <el-button
+            icon="el-icon-setting"
+            text
+            @click="exportDataZip(row.id)"
+            type="primary"
+            v-if="row.orderState === '5'"
+            :size="size"
+        >生产数据包</el-button>
         <!--        <el-button
           type="primary"
           size="small"
@@ -248,6 +257,7 @@ import {
   deleteOrders,
   downloadTemplateApi,
   exportOrder,
+  exportDataInfo,
   getOrderPage,
   importOrder,
   updateOrder,
@@ -292,6 +302,12 @@ const importData = reactive({
   file: undefined,
   fileList: [],
 });
+
+const exportDataZip = (id) => {
+  exportDataInfo(0,id).then((response) => {
+    downFile(response);
+  });
+};
 const materialInfo = (value) => {
   form.value.materialCode = value.materialCode;
   form.value.materialName = value.materialName;
@@ -895,7 +911,11 @@ const handleFileExceed = (files: any) => {
 /** 导出 */
 const handleExport = () => {
   exportOrder(search.value).then((response: any) => {
-    downFile(response);
+    if(response.code !== '200'){
+      ElMessage.error(response.msg);
+    }else{
+      downFile(response);
+    }
   });
 };
 onMounted?.(() => {

+ 47 - 2
src/views/plan/workOrder/index.vue

@@ -138,6 +138,16 @@
           >生产随工单</el-button
         >
 
+        <el-button
+          icon="el-icon-setting"
+          text
+          @click="exportDataZip(row.id)"
+          type="primary"
+          v-if="row.workOrderState === '6'"
+          :size="size"
+          >生产数据包</el-button
+        >
+
         <!--        <el-button
           icon="el-icon-notebook"
           text
@@ -313,6 +323,7 @@ import {
   distributeWorkOrder,
   revokeWorkOrder,
   lockWorkOrder,
+  exportOrder,
   excelWorkOrder,
   workOrderGroupStr,
 } from "@/api/order";
@@ -325,7 +336,7 @@ import CheckTask from "./components/check-task.vue";
 import { checkPerm } from "@/directive/permission";
 import { queryDictDataByType } from "@/api/system/dict";
 import { getProExcel } from "@/api/excel";
-import proWorkOrderExcel from "./components/proWorkOrderExcel.vue";
+import { exportDataInfo } from "@/api/order";
 import { getWorkshopData } from "@/api/report";
 import ButtonPermKeys from "@/common/configs/buttonPermission";
 const { isShowTable, tableType } = toRefs(useCommonStoreHook());
@@ -335,7 +346,6 @@ const router = useRouter();
 const workOderShow = ref(false);
 const ExDataObj = ref({});
 const excelData = ref([]);
-const showProList = ref([]);
 const showProExcel = async (id) => {
   const { data, code } = await getProExcel(id);
   if (code == "200") {
@@ -346,6 +356,41 @@ const showProExcel = async (id) => {
     workOderShow.value = false;
   }
 };
+
+const exportDataZip = async (id) => {
+  exportDataInfo(1, id).then((response) => {
+    console.log(response);
+    try {
+      const decoder = new TextDecoder("utf-8");
+      const jsonString = decoder.decode(response.data);
+      const jsonObject = JSON.parse(jsonString);
+      const { code, msg } = jsonObject;
+      if (code != "200") {
+        ElMessage.error(msg);
+      }
+    } catch (e) {
+      downFile(response);
+    }
+  });
+};
+
+const downFile = (response) => {
+  const fileData = response.data;
+  const fileName = decodeURI(
+    response.headers["content-disposition"].split(";")[1].split("=")[1]
+  );
+  const fileType =
+    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8";
+  const blob = new Blob([fileData], { type: fileType });
+  const downloadUrl = window.URL.createObjectURL(blob);
+  const downloadLink = document.createElement("a");
+  downloadLink.href = downloadUrl;
+  downloadLink.download = fileName;
+  document.body.appendChild(downloadLink);
+  downloadLink.click();
+  document.body.removeChild(downloadLink);
+  window.URL.revokeObjectURL(downloadUrl);
+};
 const toShowExcel = (item) => {
   ExDataObj.value = item;
   workOderShow.value = true;

+ 27 - 16
src/views/pro/traceability/index.vue

@@ -1,10 +1,7 @@
 <template>
   <div class="mainContentBox flex">
     <div>
-      <el-aside
-        width="600px"
-        style="min-height: 800px; max-height: calc(100vh - 200px)"
-      >
+      <el-aside width="600px" style="height: calc(100vh - 200px)">
         <avue-crud
           ref="crudRef"
           v-model:search="search"
@@ -28,7 +25,7 @@
         </avue-crud>
       </el-aside>
     </div>
-    <div style="width: calc(100% - 600px)">
+    <div style="width: calc(100% - 600px); height: calc(100vh - 160px)">
       <el-header style="height: 20%">
         <el-descriptions title="产品信息一览" border>
           <el-descriptions-item label="产品名称">{{
@@ -60,13 +57,17 @@
           >
         </el-descriptions>
       </el-header>
-      <el-main>
+      <el-main style="height: 80%">
         <el-tabs
           type="border-card"
           @tab-click="tabsEvent"
           v-model="defaultTabName"
         >
-          <el-tab-pane name="traceabilityComRef" label="生产履历">
+          <el-tab-pane
+            name="traceabilityComRef"
+            label="生产履历"
+            class="tabpaneBox"
+          >
             <template #label>
               <span
                 >生产履历
@@ -79,7 +80,11 @@
             </template>
             <TraceabilityCom ref="traceabilityComRef" />
           </el-tab-pane>
-          <el-tab-pane name="materialsComRef" label="已采物料">
+          <el-tab-pane
+            name="materialsComRef"
+            label="已采物料"
+            class="tabpaneBox"
+          >
             <template #label>
               <span
                 >已采物料
@@ -92,7 +97,7 @@
             </template>
             <MaterialsCom ref="materialsComRef" />
           </el-tab-pane>
-          <el-tab-pane name="recordComRef" label="记录项">
+          <el-tab-pane name="recordComRef" label="记录项" class="tabpaneBox">
             <template #label>
               <span
                 >记录项
@@ -105,7 +110,7 @@
             </template>
             <RecordCom ref="recordComRef"
           /></el-tab-pane>
-          <el-tab-pane name="checkComRef" label="点检判定">
+          <el-tab-pane name="checkComRef" label="点检判定" class="tabpaneBox">
             <template #label>
               <span
                 >点检判定
@@ -118,7 +123,7 @@
             </template>
             <CheckCom ref="checkComRef" />
           </el-tab-pane>
-          <el-tab-pane name="equitComRef" label="设备使用">
+          <el-tab-pane name="equitComRef" label="设备使用" class="tabpaneBox">
             <template #label>
               <span
                 >设备使用
@@ -127,7 +132,7 @@
             </template>
             <EquitCom ref="equitComRef"
           /></el-tab-pane>
-          <el-tab-pane name="faultComRef" label="报故记录">
+          <el-tab-pane name="faultComRef" label="报故记录" class="tabpaneBox">
             <template #label>
               <span
                 >报故记录
@@ -137,7 +142,7 @@
             <FaultCom ref="faultComRef" />
           </el-tab-pane>
           <!--            <el-tab-pane name="bugComRef" label="缺陷项">缺陷项</el-tab-pane>-->
-          <el-tab-pane name="mediaComRef" label="图片采集"
+          <el-tab-pane name="mediaComRef" label="图片采集" class="tabpaneBox"
             ><template #label>
               <span
                 >图片采集
@@ -151,7 +156,7 @@
             <media-com ref="mediaComRef"
           /></el-tab-pane>
 
-          <el-tab-pane name="excelComRef" label="表格数据"
+          <el-tab-pane name="excelComRef" label="表格数据" class="tabpaneBox"
             ><template #label>
               <span
                 >表格数据
@@ -160,7 +165,7 @@
             </template>
             <ExcelCom ref="excelComRef"
           /></el-tab-pane>
-          <el-tab-pane name="cssjComRef" label="设备数据"
+          <el-tab-pane name="cssjComRef" label="设备数据" class="tabpaneBox"
             ><template #label>
               <span
                 >设备数据
@@ -173,7 +178,7 @@
             </template>
             <TestData ref="cssjComRef"
           /></el-tab-pane>
-          <el-tab-pane name="fileComRef" label="工序文件">
+          <el-tab-pane name="fileComRef" label="工序文件" class="tabpaneBox">
             <template #label>
               <span
                 >工序文件
@@ -386,3 +391,9 @@ onMounted(() => {
   dataList();
 });
 </script>
+
+<style lang="scss" scoped>
+.tabpaneBox {
+  height: calc(100vh - 520px);
+}
+</style>