From 7c2cdcbc7f5585b96fba76a07b0e4417a09c4d7e Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 02 六月 2026 11:06:10 +0800
Subject: [PATCH] 新疆马铃薯 1.过程检验下载添加3个模版

---
 src/views/qualityManagement/processInspection/index.vue |  615 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 615 insertions(+), 0 deletions(-)

diff --git a/src/views/qualityManagement/processInspection/index.vue b/src/views/qualityManagement/processInspection/index.vue
new file mode 100644
index 0000000..dd40a5e
--- /dev/null
+++ b/src/views/qualityManagement/processInspection/index.vue
@@ -0,0 +1,615 @@
+<template>
+  <div class="app-container">
+    <div class="search_form mb20">
+      <div>
+        <span style="margin-left: 10px"
+              class="search_title">妫�娴嬫棩鏈燂細</span>
+        <el-date-picker v-model="searchForm.entryDate"
+                        value-format="YYYY-MM-DD"
+                        format="YYYY-MM-DD"
+                        type="daterange"
+                        placeholder="璇烽�夋嫨"
+                        clearable
+                        @change="changeDaterange" />
+        <el-button type="primary"
+                   @click="handleQuery"
+                   style="margin-left: 10px">鎼滅储</el-button>
+      </div>
+    </div>
+    <div class="table_list">
+       <div style="margin-bottom: 20px; text-align: right;">
+      <el-button type="primary" @click="openQuickCheck">蹇�熸楠�</el-button>
+      <el-button type="primary" @click="openForm('add')">鏂板</el-button>
+      <el-button @click="handleOut">瀵煎嚭</el-button>
+      <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+    </div>
+      <PIMTable rowKey="id"
+                :column="tableColumn"
+                :tableData="tableData"
+                :page="page"
+                :isSelection="true"
+                @selection-change="handleSelectionChange"
+                :tableLoading="tableLoading"
+                @pagination="pagination"
+                :total="page.total"></PIMTable>
+    </div>
+    <InspectionFormDia ref="inspectionFormDia"
+                       @close="handleQuery"></InspectionFormDia>
+    <FormDia ref="formDia"
+             @close="handleQuery"></FormDia>
+    <files-dia ref="filesDia"
+               @close="handleQuery"></files-dia>
+    <QuickCheckDia ref="quickCheckDia"
+                   @close="handleQuery"
+                   @success="getList"></QuickCheckDia>
+    <el-dialog v-model="dialogFormVisible"
+               title="缂栬緫妫�楠屽憳"
+               width="30%"
+               @close="closeDia">
+      <el-form :model="form"
+               label-width="140px"
+               label-position="top"
+               :rules="rules"
+               ref="formRef">
+        <el-form-item label="妫�楠屽憳锛�"
+                      prop="checkName">
+          <el-select v-model="form.checkName"
+                     placeholder="璇烽�夋嫨"
+                     clearable>
+            <el-option v-for="item in userList"
+                       :key="item.nickName"
+                       :label="item.nickName"
+                       :value="item.nickName" />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary"
+                     @click="submitForm">纭</el-button>
+          <el-button @click="closeDia">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+    <el-dialog v-model="templateDialogVisible"
+               title="閫夋嫨瀵煎嚭妯℃澘"
+               width="450px"
+               @close="closeTemplateDialog">
+      <div class="template-grid">
+        <div class="template-item" @click="handleTemplateExport('weilong')">
+          <div class="template-icon weilong-icon">浼�</div>
+          <div class="template-name">浼熼緳妯℃澘</div>
+        </div>
+        <!-- <div class="template-item" @click="handleTemplateExport('baishi')">
+          <div class="template-icon baishi-icon">鐧�</div>
+          <div class="template-name">鐧句簨妯℃澘</div>
+        </div> -->
+        <div class="template-item" @click="handleTemplateExport('dali')">
+          <div class="template-icon dali-icon">杈�</div>
+          <div class="template-name">杈惧埄妯℃澘</div>
+        </div>
+        <div class="template-item" @click="handleTemplateExport('common')">
+          <div class="template-icon common-icon">閫�</div>
+          <div class="template-name">閫氱敤妯℃澘</div>
+        </div>
+      </div>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="closeTemplateDialog">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+
+  </div>
+</template>
+
+<script setup>
+  import { Search } from "@element-plus/icons-vue";
+  import {
+    onMounted,
+    ref,
+    reactive,
+    toRefs,
+    getCurrentInstance,
+    nextTick,
+  } from "vue";
+  import InspectionFormDia from "@/views/qualityManagement/processInspection/components/inspectionFormDia.vue";
+  import FormDia from "@/views/qualityManagement/processInspection/components/formDia.vue";
+  import QuickCheckDia from "@/views/qualityManagement/processInspection/components/quickCheckDia.vue";
+  import { ElMessageBox } from "element-plus";
+  import {
+    downloadQualityInspect,
+    qualityInspectDel,
+    qualityInspectListPage,
+    qualityInspectUpdate,
+    submitQualityInspect,
+    exportWeilongTemplate,
+    exportBaishiTemplate,
+    exportDaliTemplate,
+    exportCommonTemplate,
+  } from "@/api/qualityManagement/rawMaterialInspection.js";
+  import FilesDia from "@/views/qualityManagement/processInspection/components/filesDia.vue";
+  import dayjs from "dayjs";
+  import { userListNoPage } from "@/api/system/user.js";
+  import useUserStore from "@/store/modules/user";
+
+  const data = reactive({
+    searchForm: {
+      entryDate: undefined, // 褰曞叆鏃ユ湡
+      workOrderNo: "",
+      entryDateStart: undefined,
+      entryDateEnd: undefined,
+    },
+    rules: {
+      checkName: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+    },
+  });
+  const { searchForm } = toRefs(data);
+
+  const tableColumn = ref([
+    {
+      label: "妫�娴嬫棩鏈�",
+      prop: "checkTime",
+      width: 120,
+    },
+    {
+      label: "妫�楠屽憳",
+      prop: "checkName",
+    },
+    {
+      label: "閲囪喘鍚堝悓鍙�",
+      prop: "purchaseContractNo",
+			width: 150,
+    },
+    {
+      label: "浜у搧鍚嶇О",
+      prop: "productName",
+    },
+    {
+      label: "瑙勬牸鍨嬪彿",
+      prop: "model",
+    },
+    {
+      label: "鍗曚綅",
+      prop: "unit",
+    },
+    {
+      label: "鎬绘暟閲�",
+      prop: "quantity",
+      width: 100,
+    },
+    {
+      label: "鍚堟牸鏁伴噺",
+      prop: "qualifiedQuantity",
+      width: 100,
+    },
+    {
+      label: "涓嶅悎鏍兼暟閲�",
+      prop: "unqualifiedQuantity",
+      width: 100,
+    },
+    {
+      label: "鍚堟牸鐜�",
+      prop: "passRate",
+      width: 100,
+      dataType: "tag",
+      formatType: params => {
+        if (!params) return "";
+        const rate = parseFloat(params);
+        if (rate < 90) {
+          return "danger";
+        } else if (rate === 100) {
+          return "success";
+        } else {
+          return "warning";
+        }
+      },
+    },
+    {
+      label: "妫�娴嬪崟浣�",
+      prop: "checkCompany",
+      width: 120,
+    },
+    {
+      label: "妫�娴嬬粨鏋�",
+      prop: "checkResult",
+      dataType: "tag",
+      formatType: params => {
+        if (params == "涓嶅悎鏍�") {
+          return "danger";
+        } else if (params == "鍚堟牸") {
+          return "success";
+        } else {
+          return "danger";
+        }
+      },
+    },
+    {
+      label: "鎻愪氦鐘舵��",
+      prop: "inspectState",
+      formatData: params => {
+        if (params) {
+          return "宸叉彁浜�";
+        } else {
+          return "鏈彁浜�";
+        }
+      },
+    },
+    {
+      dataType: "action",
+      label: "鎿嶄綔",
+      align: "center",
+      fixed: "right",
+      width: 280,
+      operation: [
+        {
+          name: "缂栬緫",
+          type: "text",
+          clickFun: row => {
+            openForm("edit", row);
+          },
+          disabled: row => {
+            // 宸叉彁浜ゅ垯绂佺敤
+            if (row.inspectState == 1) return true;
+            // 濡傛灉妫�楠屽憳鏈夊�硷紝鍙湁褰撳墠鐧诲綍鐢ㄦ埛鑳界紪杈�
+            if (row.checkName) {
+              return row.checkName !== userStore.nickName;
+            }
+            return false;
+          },
+        },
+        {
+          name: "鏌ョ湅",
+          type: "text",
+          clickFun: row => {
+            openForm("view", row);
+          },
+        },
+        {
+          name: "闄勪欢",
+          type: "text",
+          clickFun: row => {
+            openFilesFormDia(row);
+          },
+        },
+        {
+          name: "鎻愪氦",
+          type: "text",
+          clickFun: row => {
+            submit(row.id);
+          },
+          disabled: row => {
+            // 宸叉彁浜ゅ垯绂佺敤
+            if (row.inspectState == 1) return true;
+            // 濡傛灉妫�楠屽憳鏈夊�硷紝鍙湁褰撳墠鐧诲綍鐢ㄦ埛鑳芥彁浜�
+            if (row.checkName) {
+              return row.checkName !== userStore.nickName;
+            }
+            return false;
+          },
+        },
+        {
+          name: "鍒嗛厤妫�楠屽憳",
+          type: "text",
+          clickFun: row => {
+            if (!row.checkName) {
+              open(row);
+            } else {
+              proxy.$modal.msgError("妫�楠屽憳宸插瓨鍦�");
+            }
+          },
+          disabled: row => {
+            return row.inspectState == 1 || row.checkName;
+          },
+        },
+        {
+          name: "涓嬭浇",
+          type: "text",
+          clickFun: row => {
+            downLoadFile(row);
+          },
+        },
+      ],
+    },
+  ]);
+  const userList = ref([]);
+  const currentRow = ref(null);
+  const tableData = ref([]);
+  const selectedRows = ref([]);
+  const tableLoading = ref(false);
+  const dialogFormVisible = ref(false);
+  const form = ref({
+    checkName: "",
+  });
+  const page = reactive({
+    current: 1,
+    size: 100,
+    total: 0,
+  });
+  const formDia = ref();
+  const filesDia = ref();
+  const inspectionFormDia = ref();
+  const quickCheckDia = ref();
+  const { proxy } = getCurrentInstance();
+  const userStore = useUserStore();
+
+  const templateDialogVisible = ref(false);
+  const currentExportRow = ref(null);
+  const changeDaterange = value => {
+    searchForm.value.entryDateStart = undefined;
+    searchForm.value.entryDateEnd = undefined;
+    if (value) {
+      searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
+      searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
+    }
+    getList();
+  };
+  // 鏌ヨ鍒楄〃
+  /** 鎼滅储鎸夐挳鎿嶄綔 */
+  const handleQuery = () => {
+    page.current = 1;
+    getList();
+  };
+  const pagination = obj => {
+    page.current = obj.page;
+    page.size = obj.limit;
+    getList();
+  };
+  const getList = () => {
+    tableLoading.value = true;
+    const params = { ...searchForm.value, ...page };
+    params.entryDate = undefined;
+    qualityInspectListPage({ ...params, inspectType: 1 })
+      .then(res => {
+        tableLoading.value = false;
+        tableData.value = res.data.records.map(item => {
+          const quantity = parseFloat(item.quantity);
+          const qualifiedQuantity = parseFloat(item.qualifiedQuantity);
+          let passRate = null;
+          if (!isNaN(quantity) && !isNaN(qualifiedQuantity) && quantity > 0) {
+            passRate = ((qualifiedQuantity / quantity) * 100).toFixed(2) + "%";
+          }
+          return {
+            ...item,
+            passRate: passRate,
+          };
+        });
+        page.total = res.data.total;
+      })
+      .catch(err => {
+        tableLoading.value = false;
+      });
+  };
+  // 琛ㄦ牸閫夋嫨鏁版嵁
+  const handleSelectionChange = selection => {
+    selectedRows.value = selection;
+  };
+
+  // 鎵撳紑寮规
+  const openForm = (type, row) => {
+    nextTick(() => {
+      formDia.value?.openDialog(type, row);
+    });
+  };
+
+  // 鎵撳紑蹇�熸楠岀‘璁ゆ
+  const openQuickCheck = () => {
+    // 妫�鏌ユ槸鍚﹂�夋嫨浜嗘暟鎹�
+    if (!selectedRows.value || selectedRows.value.length === 0) {
+      proxy.$modal.msgWarning("璇峰厛閫夋嫨瑕佹楠岀殑鏁版嵁");
+      return;
+    }
+
+    // 杩囨护鍑烘湭鎻愪氦鐨勬暟鎹�
+    const unSubmittedRows = selectedRows.value.filter(item => item.inspectState !== 1);
+    if (unSubmittedRows.length === 0) {
+      proxy.$modal.msgWarning("閫変腑鐨勬暟鎹凡鍏ㄩ儴鎻愪氦锛屾棤闇�閲嶅妫�楠�");
+      return;
+    }
+
+    const ids = unSubmittedRows.map(item => item.id);
+    quickCheckDia.value?.openDialog(ids, unSubmittedRows);
+  };
+
+  // 鎵撳紑鏂板妫�楠屽脊妗�
+  const openInspectionForm = (type, row) => {
+    nextTick(() => {
+      inspectionFormDia.value?.openDialog(type, row);
+    });
+  };
+  // 鎵撳紑闄勪欢寮规
+  const openFilesFormDia = (type, row) => {
+    nextTick(() => {
+      filesDia.value?.openDialog(type, row);
+    });
+  };
+  // 鎻愪环
+  const submit = async id => {
+    const res = await submitQualityInspect({ id: id });
+    if (res.code === 200) {
+      proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+      getList();
+    }
+  };
+  const open = async row => {
+    let userLists = await userListNoPage();
+    userList.value = userLists.data;
+    currentRow.value = row;
+    dialogFormVisible.value = true;
+  };
+  // 鍏抽棴寮规
+  const closeDia = () => {
+    proxy.resetForm("formRef");
+    dialogFormVisible.value = false;
+  };
+  const submitForm = () => {
+    if (currentRow.value) {
+      const data = {
+        ...form.value,
+        id: currentRow.value.id,
+      };
+      qualityInspectUpdate(data).then(res => {
+        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+        closeDia();
+        getList();
+      });
+    }
+  };
+
+  // 鍒犻櫎
+  const handleDelete = () => {
+    let ids = [];
+    if (selectedRows.value.length > 0) {
+      ids = selectedRows.value.map(item => item.id);
+    } else {
+      proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+      return;
+    }
+    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
+      .then(() => {
+        qualityInspectDel(ids).then(res => {
+          proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          getList();
+        });
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+  };
+  const downLoadFile = row => {
+    currentExportRow.value = row;
+    templateDialogVisible.value = true;
+  };
+
+  const closeTemplateDialog = () => {
+    templateDialogVisible.value = false;
+    currentExportRow.value = null;
+  };
+
+  const handleTemplateExport = async (templateType) => {
+    if (!currentExportRow.value) {
+      proxy.$modal.msgError("璇烽�夋嫨瑕佸鍑虹殑鏁版嵁");
+      return;
+    }
+    const id = currentExportRow.value.id;
+    const fileNameMap = {
+      weilong: "浼熼緳妯$増妫�楠岀粨鏋�.doc",
+      baishi: "鐧句簨妯$増妫�楠岀粨鏋�.doc",
+      dali: "杈惧埄妯$増妫�楠岀粨鏋�.doc",
+      common: "閫氱敤妯$増妫�楠岀粨鏋�.doc",
+    };
+    const exportFuncMap = {
+      weilong: exportWeilongTemplate,
+      baishi: exportBaishiTemplate,
+      dali: exportDaliTemplate,
+      common: exportCommonTemplate,
+    };
+    try {
+      const response = await exportFuncMap[templateType](id);
+      const blob = new Blob([response], {
+        type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
+      });
+      const link = document.createElement("a");
+      link.href = URL.createObjectURL(blob);
+      link.download = fileNameMap[templateType];
+      document.body.appendChild(link);
+      link.click();
+      document.body.removeChild(link);
+      URL.revokeObjectURL(link.href);
+      proxy.$modal.msgSuccess("瀵煎嚭鎴愬姛");
+      closeTemplateDialog();
+    } catch (error) {
+      console.error("瀵煎嚭澶辫触", error);
+      proxy.$modal.msgError("瀵煎嚭澶辫触");
+    }
+  };
+  // 瀵煎嚭
+  const handleOut = () => {
+    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
+      .then(() => {
+        proxy.download(
+          "/quality/qualityInspect/export",
+          { inspectType: 1 },
+          "杩囩▼妫�楠�.xlsx"
+        );
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+  };
+  onMounted(() => {
+    getList();
+  });
+</script>
+
+<style scoped>
+.template-grid {
+  display: grid;
+  grid-template-columns: repeat(2, 1fr);
+  gap: 20px;
+  padding: 20px 10px;
+}
+
+.template-item {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  padding: 24px 16px;
+  border: 1px solid #e4e7ed;
+  border-radius: 8px;
+  cursor: pointer;
+  transition: all 0.3s;
+}
+
+.template-item:hover {
+  border-color: #409eff;
+  box-shadow: 0 2px 12px rgba(64, 158, 255, 0.2);
+  transform: translateY(-2px);
+}
+
+.template-icon {
+  width: 56px;
+  height: 56px;
+  border-radius: 50%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 24px;
+  font-weight: bold;
+  color: #fff;
+  margin-bottom: 12px;
+}
+
+.weilong-icon {
+  background: linear-gradient(135deg, #409eff, #1677ff);
+}
+
+.baishi-icon {
+  background: linear-gradient(135deg, #67c23a, #529b2e);
+}
+
+.dali-icon {
+  background: linear-gradient(135deg, #e6a23c, #c4860c);
+}
+
+.common-icon {
+  background: linear-gradient(135deg, #909399, #6d6d6d);
+}
+
+.template-name {
+  font-size: 15px;
+  color: #303133;
+  font-weight: 500;
+}
+</style>

--
Gitblit v1.9.3