Ver código fonte

添加工序记录相关及下载

qinhb 5 meses atrás
pai
commit
e51d1a5ca8

+ 48 - 0
src/api/process/index.ts

@@ -1,5 +1,6 @@
 import request from "@/utils/request";
 import { AxiosPromise } from "axios";
+import {OrderInfoQuery} from "@/api/order/types";
 
 export function queryOutSourceDetails(id: object): AxiosPromise<any> {
   return request({
@@ -38,3 +39,50 @@ export function updateItemRecord(params: object): AxiosPromise<any> {
     data: params,
   });
 }
+
+export function addProRecord(params: object): AxiosPromise<any> {
+  return request({
+    url: "/api/v1/proRecord/add",
+    method: "post",
+    data: params,
+  });
+}
+
+export function queryProductHandover(id: number): AxiosPromise<any> {
+  return request({
+    url: "/api/v1/proRecord/get/" + id,
+    method: "get",
+  });
+}
+export function updateHandoverList(params: object): AxiosPromise<any> {
+  return request({
+    url: "/api/v1/proRecord/update",
+    method: "post",
+    data: params,
+  });
+}
+
+export function exportOperationRecord(queryParams: object) {
+  return request({
+    url: "/api/v1/proRecord/export",
+    method: "post",
+    data: queryParams,
+    responseType: "arraybuffer",
+  });
+}
+
+export function queryHInfo(id: number) {
+  return request({
+    url: "/api/v1/handoverDetails/get/" + id,
+    method: "get",
+  });
+}
+
+export function saveOpDetails(queryParams: object) {
+  return request({
+    url: "/api/v1/handoverDetails/add",
+    method: "post",
+    data: queryParams,
+  });
+}
+

+ 285 - 0
src/views/quality/handover/index.vue

@@ -0,0 +1,285 @@
+<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="createRowSave"
+        @row-update="updateRow"
+        @row-del="deleteRow"
+        :table-loading="loading"
+        @search-change="searchChange"
+        @search-reset="resetChange"
+        @size-change="dataList"
+        @current-change="dataList"
+        @selection-change="selectionChange"
+    >
+      <template #menu-right="{}">
+        <el-button
+            class="ml-3"
+            @click="handleExport"
+        >
+          <template #icon> <i-ep-download /> </template>导出
+        </el-button>
+      </template>
+      <template #menu="{ size, row, index }">
+        <el-button
+            icon="el-icon-edit"
+            text
+            @click="openDialog(1, row.id)"
+            type="primary"
+            :size="size"
+        >编辑</el-button
+        >
+
+        <el-button
+            icon="el-icon-edit"
+            text
+            @click="openDialog(0, row.id)"
+            type="primary"
+            :size="size"
+        >详情</el-button
+        >
+      </template>
+    </avue-crud>
+    <el-dialog
+        v-model="dialog.visible"
+        :title="dialog.title"
+        width="1500px"
+        @close="dialog.visible = false"
+    >
+      <el-table :data="itemList" border style="width: 100%" span-method="objectSpanMethod">
+        <el-table-column show-overflow-tooltip  prop="operationName" label="工序" width="100"/>
+        <el-table-column show-overflow-tooltip  prop="materialModel" label="物料型号" width="100"/>
+        <el-table-column show-overflow-tooltip  prop="workOrderCode" label="产品批号" width="120"/>
+        <el-table-column prop="reNum" label="数量(接收)" width="70">
+          <template v-if="dialog.type === 1" #default="scope">
+            <el-input v-model="scope.row.reNum"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="reFrontUser" label="下传人(接收)" width="140">
+          <template v-if="dialog.type === 1" #default="scope">
+            <el-input v-model="scope.row.reFrontUser"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="reReceiveUser" label="接收人(接收)" width="140">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-input v-model="scope.row.reReceiveUser"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="reDate" label="时间(接收)" width="120">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-date-picker value-format="YYYY-MM-DD" type="date" v-model="scope.row.reDate"></el-date-picker>
+          </template>
+        </el-table-column>
+        <el-table-column prop="next0Num" label="数量(下传合格)" width="80">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-input v-model="scope.row.next0Num"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="next0FrontUser" label="下传人(下传合格)" width="140">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-input v-model="scope.row.next0FrontUser"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="next0ReceiveUser" label="接收人(下传合格)" width="140">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-input v-model="scope.row.next0ReceiveUser"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="next0Date" label="时间(下传合格)" width="120">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-date-picker  value-format="YYYY-MM-DD" type="date" v-model="scope.row.next0Date"/>
+          </template>
+        </el-table-column>
+        <el-table-column prop="next1Num" label="数量(下传不合格)" width="80">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-input v-model="scope.row.next1Num"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="next1FrontUser" label="下传人(下传不合格)" width="140">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-date-picker  value-format="YYYY-MM-DD" type="date" v-model="scope.row.next1FrontUser"/>
+          </template>
+        </el-table-column>
+        <el-table-column prop="next1ReceiveUser" label="接收人(下传不合格)" width="140">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-input v-model="scope.row.next1ReceiveUser"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="next1Date" label="时间(下传不合格)" width="100">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-input v-model="scope.row.next1Date"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="remark" label="备注" width="100">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-input v-model="scope.row.remark"></el-input>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <div
+          class="dialog-footer"
+          align="center"
+      >
+        <el-button @click="dialog.visible = false">取 消</el-button>
+        <el-button type="primary" @click="saveItemList"  v-if="dialog.type === 1" >保 存</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import { exportOperationRecord ,addProRecord,queryProductHandover,updateHandoverList} from "@/api/process";
+import { useCommonStoreHook } from "@/store";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+const test = () => {
+  isShowTable.value = true;
+  tableType.value = tableType.value == 1 ? 2 : 1;
+};
+const radio = ref(0);
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+    useCrud({
+      src: "/api/v1/proRecord",
+    });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+    Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+const loading = ref(false);
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+const dialog = reactive({
+  title: "产品交接",
+  visible: false,
+  type: 0,
+});
+const createRowSave = (row,done,loading) =>{
+  form.value.type = "0"
+  addProRecord(form.value).then((data) =>{
+    ElMessage.success(data.msg);
+    form.value.startDate = "";
+    form.value.endDate = "";
+    done();
+    dialog.visible = true;
+    dialog.type = 1
+    itemList.value = data.data
+    dataList()
+  }).catch(() => {
+    loading()
+  });
+}
+const itemList = ref([])
+const openDialog = (type, id) => {
+  queryProductHandover(id).then((data) => {
+    itemList.value = data.data;
+    dialog.visible = true;
+    dialog.type = type;
+  });
+};
+const saveItemList = () => {
+  updateHandoverList(itemList.value).then((data) => {
+    if (data.code === "200") {
+      ElMessage.success("操作成功");
+      dialog.visible = false;
+      dataList();
+    } else {
+      ElMessage.error(data.msg);
+    }
+  });
+};
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  searchEnter: true,
+  editBtn: false,
+  viewBtn: false,
+  selection: true,
+  column: [
+    {
+      label: "开始日期",
+      prop: "startDate",
+      type: "date",
+      format: "YYYY-MM-DD", //前端展示格式
+      valueFormat: "YYYY-MM-DD", //设置后端接收的日期格式
+      overHidden: true,
+      search: true,
+    },
+    {
+      label: "结束日期",
+      prop: "endDate",
+      type: "date",
+      format: "YYYY-MM-DD", //前端展示格式
+      valueFormat: "YYYY-MM-DD", //设置后端接收的日期格式
+      search: true,
+      overHidden: true,
+    },
+    {
+      label: "操作人",
+      overHidden: true,
+      prop: "creator",
+      search: true,
+      addDisplay: false,
+      editDisplay: false,
+    },
+    {
+      label: "操作时间",
+      overHidden: true,
+      prop: "created",
+      addDisplay: false,
+      editDisplay: false,
+    },
+  ],
+});
+const handleExport = () => {
+  if(toDeleteIds.value.length == 0){
+    ElMessage.error("请选择数据导出");
+    return;
+  }
+  exportOperationRecord({ids: toDeleteIds.value,type: 0}).then((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);
+};
+onMounted(() => {
+  form.value.type = "0"
+  search.value.type = "0"
+  dataList();
+});
+</script>
+<style>
+/* 添加自定义类名以区分不同表格的样式 */
+.gray-header-table .el-table__header-wrapper {
+  background-color: #f2f2f2; /* 灰色背景 */
+}
+</style>

+ 501 - 0
src/views/quality/opRecord/index.vue

@@ -0,0 +1,501 @@
+<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="createRowSave"
+        @row-update="updateRow"
+        @row-del="deleteRow"
+        :table-loading="loading"
+        @search-change="searchChange"
+        @search-reset="resetChange"
+        @size-change="dataList"
+        @current-change="dataList"
+        @selection-change="selectionChange"
+    >
+      <template #menu-right="{}">
+        <el-button
+            class="ml-3"
+            @click="handleExport"
+        >
+          <template #icon> <i-ep-download /> </template>导出
+        </el-button>
+      </template>
+      <template #menu="{ size, row, index }">
+        <el-button
+            icon="el-icon-edit"
+            text
+            @click="openDialog(1, row.id)"
+            type="primary"
+            :size="size"
+        >编辑</el-button
+        >
+
+        <el-button
+            icon="el-icon-edit"
+            text
+            @click="openDialog(0, row.id)"
+            type="primary"
+            :size="size"
+        >详情</el-button
+        >
+      </template>
+    </avue-crud>
+    <el-dialog
+        v-model="dialog.visible"
+        :title="dialog.title"
+        width="1500px"
+        @close="dialog.visible = false"
+    >
+      <el-table :data="itemList" border style="width: 100%">
+        <el-table-column show-overflow-tooltip  prop="operationName" label="工序" width="90"/>
+        <el-table-column show-overflow-tooltip  prop="materialModel" label="物料型号" width="90"/>
+        <el-table-column show-overflow-tooltip  prop="workOrderCode" label="产品批号" width="90"/>
+        <el-table-column prop="reReceiveUser" label="操作人" width="140">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-input v-model="scope.row.reReceiveUser"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="reDate" label="时间" width="120">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-date-picker value-format="YYYY-MM-DD" type="date" v-model="scope.row.reDate"></el-date-picker>
+          </template>
+        </el-table-column>
+        <el-table-column prop="reNum" label="接收数量" width="60">
+          <template v-if="dialog.type === 1" #default="scope">
+            <el-input v-model="scope.row.reNum"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="next0Num" label="合格品数" width="60">
+          <template v-if="dialog.type === 1" #default="scope">
+            <el-input v-model="scope.row.next0Num"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="next1Num" label="不合格品数" width="60">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-input v-model="scope.row.next1Num"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="passRate" label="合格品率" width="80">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-input v-model="scope.row.passRate"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="useDevice" label="使用设备及编号" width="150">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-input v-model="scope.row.useDevice"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="craftCondition" label="工艺条件)" width="140">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-input v-model="scope.row.craftCondition"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="temperature" label="温度" width="85">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-input v-model="scope.row.temperature"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="humidity" label="湿度" width="85">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-input v-model="scope.row.humidity"></el-input>
+          </template>
+        </el-table-column>
+
+        <el-table-column prop="remark" label="备注" width="100">
+          <template v-if="dialog.type === 1"  #default="scope">
+            <el-input v-model="scope.row.remark"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="none" label="H级记录表" width="100">
+          <template  #default="scope">
+            <el-button v-if="scope.row.type == 1" @click="clickH(scope.row)" type="primary" link>
+              工作记录表
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <div
+          class="dialog-footer"
+          align="center"
+      >
+        <el-button @click="dialog.visible = false">取 消</el-button>
+        <el-button type="primary" @click="saveItemList"  v-if="dialog.type === 1" >保 存</el-button>
+      </div>
+    </el-dialog>
+
+    <el-dialog
+        v-model="dialog1.visible"
+        :title="dialog1.title"
+        width="800px"
+        @close="dialog1.visible = false"
+    >
+      <el-form label-width="120px" size="large" :model="hInfo" ref="applyFormRef">
+        <el-row>
+          <el-col :span="12">
+          <el-form-item
+              label="电路型号"
+              prop="materialModel"
+          >
+            <el-input v-model="hInfo.materialModel" />
+          </el-form-item>
+          </el-col>
+          <el-col :span="12">
+          <el-form-item
+              label="生产批号"
+              prop="workOrderCode"
+          >
+            <el-input v-model="hInfo.workOrderCode" />
+          </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="24">
+            <el-form-item  label="工艺规程" prop="craft" >
+              <el-input v-model="hInfo.craft" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item  label="产品装配图" prop="drawing" >
+              <el-input v-model="hInfo.drawing" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="8">
+            <el-form-item
+                label="温度"
+                prop="temperature"
+            >
+              <el-input v-model="hInfo.temperature" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item
+                label="相对湿度"
+                prop="humidity"
+            >
+              <el-input v-model="hInfo.humidity" />
+            </el-form-item>
+          </el-col>
+
+        </el-row>
+
+        <el-row>
+          <el-col :span="8">
+            <el-form-item
+                label="烤箱温度设置"
+                prop="temperatureSet"
+            >
+              <el-input v-model="hInfo.temperatureSet" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item
+                label="烘烤时间"
+                prop="bakeTime"
+            >
+              <el-input v-model="hInfo.bakeTime" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item
+                label="烘箱真空度"
+                prop="vacuum"
+            >
+              <el-input v-model="hInfo.vacuum" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="8">
+            <el-form-item
+                label="氦气流量"
+                prop="nitrogen"
+            >
+              <el-input v-model="hInfo.nitrogen" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item
+                label="氧含量"
+                prop="oxygen"
+            >
+              <el-input v-model="hInfo.oxygen" />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="8">
+            <el-form-item
+                label="封前箱内相对湿度监控值"
+                prop="frontHumidity"
+            >
+              <el-input v-model="hInfo.frontHumidity" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="8">
+            <el-form-item
+                label="封焊功率"
+                prop="sealPower"
+            >
+              <el-input v-model="hInfo.sealPower" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item
+                label="封焊压力"
+                prop="sealPressure"
+            >
+              <el-input v-model="hInfo.sealPressure" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item
+                label="封焊速度"
+                prop="sealSpeed"
+            >
+              <el-input v-model="hInfo.sealSpeed" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+
+        <el-row>
+          <el-col :span="8">
+            <el-form-item
+                label="封装数"
+                prop="num"
+            >
+              <el-input v-model="hInfo.num" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="合格数" prop="passNum" >
+              <el-input v-model="hInfo.passNum" />
+            </el-form-item>
+          </el-col>
+
+        </el-row>
+
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="操作者" prop="operator">
+              <el-input v-model="hInfo.operator" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="日期" prop="operatorTime">
+              <el-date-picker value-format="YYYY-MM-DD"  type="date" v-model="hInfo.operatorTime"></el-date-picker>
+            </el-form-item>
+          </el-col>
+
+        </el-row>
+      </el-form>
+
+      <div
+          class="dialog-footer"
+          align="center"
+      >
+        <el-button @click="dialog1.visible = false">取 消</el-button>
+        <el-button type="primary" @click="saveDetails"  v-if="dialog.type === 1" >保 存</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import { exportOperationRecord ,addProRecord,queryProductHandover,updateHandoverList,queryHInfo,saveOpDetails} from "@/api/process";
+import { useCommonStoreHook } from "@/store";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+const test = () => {
+  isShowTable.value = true;
+  tableType.value = tableType.value == 1 ? 2 : 1;
+};
+const radio = ref(0);
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+    useCrud({
+      src: "/api/v1/proRecord",
+    });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+    Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+const loading = ref(false);
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+const dialog = reactive({
+  title: "产品交接",
+  visible: false,
+  type: 0,
+});
+
+const dialog1 = reactive({
+  title: "工作记录",
+  visible: false,
+});
+
+const createRowSave = (row,done,loading) =>{
+  form.value.type = "1"
+  addProRecord(form.value).then((data) =>{
+    ElMessage.success(data.msg);
+    form.value.startDate = "";
+    form.value.endDate = "";
+    done();
+    dialog.visible = true;
+    dialog.type = 1
+    itemList.value = data.data
+    dataList()
+  }).catch(() => {
+    loading()
+  });
+}
+const itemList = ref([])
+const hInfo = ref({
+  operator: '',
+  materialModel: ''
+})
+const openDialog = (type, id) => {
+  queryProductHandover(id).then((data) => {
+    itemList.value = data.data;
+    dialog.visible = true;
+    dialog.type = type;
+  });
+};
+const clickH = (row) =>{
+  queryHInfo(row.id).then((data)=>{
+    if(data.data !== null){
+      hInfo.value = data.data
+    }else{
+      hInfo.value = JSON.parse(JSON.stringify(row))
+      hInfo.value.operator = row.reReceiveUser
+      hInfo.value.operatorTime = row.reDate
+      hInfo.value.handoverId = row.id
+      hInfo.value.num = row.reNum
+    }
+    dialog1.visible = true
+  });
+
+}
+
+const saveDetails = ()=>{
+  saveOpDetails(hInfo.value).then((data)=>{
+    ElMessage.success("操作成功");
+    dialog1.visible = false
+  })
+}
+const saveItemList = () => {
+  updateHandoverList(itemList.value).then((data) => {
+    if (data.code === "200") {
+      ElMessage.success("操作成功");
+      dialog.visible = false;
+      form.value.type = "1"
+      search.value.type = "1"
+      dataList();
+    } else {
+      ElMessage.error(data.msg);
+    }
+  });
+};
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  searchEnter: true,
+  editBtn: false,
+  viewBtn: false,
+  selection: true,
+  column: [
+    {
+      label: "开始日期",
+      prop: "startDate",
+      type: "date",
+      format: "YYYY-MM-DD", //前端展示格式
+      valueFormat: "YYYY-MM-DD", //设置后端接收的日期格式
+      overHidden: true,
+      search: true,
+    },
+    {
+      label: "结束日期",
+      prop: "endDate",
+      type: "date",
+      format: "YYYY-MM-DD", //前端展示格式
+      valueFormat: "YYYY-MM-DD", //设置后端接收的日期格式
+      search: true,
+      overHidden: true,
+    },
+    {
+      label: "操作人",
+      overHidden: true,
+      prop: "creator",
+      search: true,
+      addDisplay: false,
+      editDisplay: false,
+    },
+    {
+      label: "操作时间",
+      overHidden: true,
+      prop: "created",
+      addDisplay: false,
+      editDisplay: false,
+    },
+  ],
+});
+const handleExport = () => {
+  if(toDeleteIds.value.length == 0){
+    ElMessage.error("请选择数据导出");
+    return;
+  }
+  exportOperationRecord({ids: toDeleteIds.value,type: 1}).then((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);
+};
+onMounted(() => {
+  form.value.type = "1"
+  search.value.type = "1"
+  dataList();
+});
+</script>
+<style>
+.gray-header-table .el-table__header-wrapper {
+  background-color: #f2f2f2; /* 灰色背景 */
+}
+</style>