Forráskód Böngészése

Merge branch 'qingban' of http://192.168.101.4:3000/jiaxiaoqiang/JG-ADMIN-TEMP into qingban

qinhb 5 hónapja
szülő
commit
23aaf69ac6

+ 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>

+ 4 - 4
src/views/plan/workOrder/index.vue

@@ -111,14 +111,14 @@
           :size="size"
           >撤销</el-button
         >
-        <el-button
+        <!-- <el-button
           icon="el-icon-setting"
           text
           @click="showCheckTask(row)"
           type="primary"
           :size="size"
           >检验任务</el-button
-        >
+        > -->
         <el-button
           icon="el-icon-setting"
           text
@@ -664,7 +664,7 @@ option.value = Object.assign(option.value, {
   editBtn: false,
   column: [
     {
-      label: "工单编号",
+      label: "生产编号",
       prop: "workOrderCode",
       search: true,
       display: false,
@@ -1010,7 +1010,7 @@ option.value = Object.assign(option.value, {
       },
     },
     {
-      label: "生产批号",
+      label: "检验批号",
       prop: "produceCode",
       width: "100",
     },

+ 1 - 1
src/views/pro/traceability/components/materialsCom.vue

@@ -123,7 +123,7 @@ option.value = Object.assign(option.value, {
       prop: "itemModel",
       disabled: "true",
       search: true,
-      type: "select",
+      type: "input",
     },
     {
       label: "物料编号",

+ 19 - 1
src/views/pro/traceability/components/traceabilityCom.vue

@@ -61,7 +61,10 @@ const onUserSelectedFinish = (selectedValue) => {
 const crudRef = ref(null); //crudRef.value 获取avue-crud对象
 const userRef = ref(null);
 const refreshTra = (row) => {
-  commonConfig.value.params = { seqNo: row.seqNo,workOrderCode: row.workOrderCode};
+  commonConfig.value.params = {
+    seqNo: row.seqNo,
+    workOrderCode: row.workOrderCode,
+  };
   dataList();
 };
 defineExpose({ refreshTra });
@@ -194,6 +197,14 @@ option.value = Object.assign(option.value, {
       },
     },
     {
+      label: "报工人",
+      prop: "reportName",
+      search: false,
+      display: false,
+      width: 100,
+      overHidden: true,
+    },
+    {
       label: "工时(秒)",
       prop: "totalTime",
       editDisplay: false,
@@ -205,6 +216,13 @@ option.value = Object.assign(option.value, {
       editDisplay: false,
       search: false,
     },
+    {
+      label: "备注",
+      prop: "operateCondition",
+      search: false,
+      width: 100,
+      overHidden: true,
+    },
   ],
 });
 

+ 28 - 17
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,16 +57,20 @@
           >
         </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
-                >维修履历
+                >生产履历
                 <el-badge
                   :value="tabCount.traceability"
                   class="item"
@@ -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>

+ 175 - 0
src/views/storage/scrapped/index.vue

@@ -0,0 +1,175 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+      ref="crudRef"
+      v-model:search="search"
+      v-model="form"
+      :data="data"
+      :option="option"
+      v-model:page="page"
+      @row-save="createRow"
+      @row-update="updateRow"
+      @row-del="deleteRow"
+      @search-change="searchChange"
+      @search-reset="resetChange"
+      @size-change="dataList"
+      @current-change="dataList"
+      @selection-change="selectionChange"
+    >
+      <template #menu-left="{ size }">
+        <el-button
+          :disabled="toDeleteIds.length < 1"
+          type="danger"
+          icon="el-icon-delete"
+          :size="size"
+          @click="multipleDelete"
+          >删除</el-button
+        >
+      </template>
+      <!-- <template #menu-right="{}">
+        <el-dropdown split-button
+          >导入
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item
+                @click="downloadTemplate('/api/v1/plan/order/template')"
+              >
+                <i-ep-download />下载模板
+              </el-dropdown-item>
+              <el-dropdown-item @click="importExcelData">
+                <i-ep-top />导入数据
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+        <el-button
+          class="ml-3"
+          @click="exportData('/api/v1/plan/order/export')"
+        >
+          <template #icon> <i-ep-download /> </template>导出
+        </el-button>
+      </template> -->
+    </avue-crud>
+    <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+import ButtonPermKeys from "@/common/configs/buttonPermission";
+import { useCommonStoreHook, useDictionaryStore } from "@/store";
+
+// 数据字典相关
+const { dicts } = useDictionaryStore();
+
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/scrapped",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+  Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+// checkBtnPerm(ButtonPermKeys.PLAN.BTNS.order_add) :permission="permission"
+// const permission = reactive({
+//   delBtn: checkPerm(buttonPermission.PLAN.BTNS.order_del),
+//   addBtn: checkPerm(buttonPermission.PLAN.BTNS.order_add),
+//   editBtn: checkPerm(buttonPermission.PLAN.BTNS.order_edit),
+//   menu: true,
+// });
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+onMounted(() => {
+  // console.log("crudRef", crudRef)
+  dataList();
+});
+
+/**
+ * 上传excel相关
+ */
+const uploadRef = ref(null);
+const uploadFinished = () => {
+  // 上传完成后的刷新操作
+  page.currentPage = 1;
+  dataList();
+};
+const importExcelData = () => {
+  if (uploadRef.value) {
+    uploadRef.value.show("/api/v1/plan/order/import");
+  }
+};
+
+// 设置表格列或者其他自定义的option
+const switchOp = [
+  {
+    label: "",
+    value: 0,
+  },
+  {
+    label: "",
+    value: 1,
+  },
+];
+option.value = Object.assign(option.value, {
+  selection: true,
+  column: [
+    /*{
+      label: "缺陷类型",
+      prop: "bugType",
+      minWidth: 200,
+      search: true,
+      overHidden: true,
+      rules: [
+        {
+          required: true,
+          message: "缺陷类型不能为空",
+          trigger: "change",
+        },
+      ],
+      type: "select",
+      dicUrl: dictDataUtil.request_url + dictDataUtil.TYPE_CODE.defect_mana,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+    },*/
+    {
+      label: "物料名称",
+      prop: "materialName",
+      span: 12,
+      search: true,
+      rules: [
+        {
+          required: true,
+          message: "物料名称不能为空",
+          trigger: "blur",
+        },
+      ],
+    },
+    {
+      label: "物料编码",
+      prop: "materialCode",
+      span: 12,
+      search: true,
+      rules: [
+        {
+          required: false,
+          message: "物料编码不能为空",
+          trigger: "blur",
+        },
+      ],
+    },
+    {
+      label: "报废数量",
+      prop: "scrappedNum",
+      span: 12,
+      search: true,
+      /*display: false,*/
+      editDisabled: true,
+    },
+  ],
+});
+</script>