Explorar el Código

Merge branch 'qingban' of http://119.91.214.11:8091/jiaxiaoqiang/mes-admin-temp into qingban

dengyu hace 5 meses
padre
commit
0830206842

+ 2 - 2
.env.development

@@ -8,9 +8,9 @@ VITE_APP_PORT = 3005
 VITE_APP_BASE_API = '/dev-api'
 
 # 上传文件接口地址
-VITE_APP_UPLOAD_URL = 'http://192.168.101.4:9000'
+VITE_APP_UPLOAD_URL = 'http://139.155.176.112:19000'
 # 开发接口地址
-VITE_APP_API_URL = 'http://139.155.176.112:7100/'
+ VITE_APP_API_URL = 'http://139.155.176.112:7100'
 
 
 # 是否启用 Mock 服务

+ 1 - 0
package.json

@@ -56,6 +56,7 @@
     "animate.css": "^4.1.1",
     "axios": "^1.7.9",
     "background@1.3.0": "link:vue-flow/background@1.3.0",
+    "big.js": "^6.2.2",
     "codemirror": "^5.65.18",
     "codemirror-editor-vue3": "^2.8.0",
     "core@1.37.1": "link:vue-flow/core@1.37.1",

+ 8 - 0
pnpm-lock.yaml

@@ -56,6 +56,9 @@ importers:
       background@1.3.0:
         specifier: link:vue-flow/background@1.3.0
         version: link:vue-flow/background@1.3.0
+      big.js:
+        specifier: ^6.2.2
+        version: 6.2.2
       codemirror:
         specifier: ^5.65.18
         version: 5.65.18
@@ -2250,6 +2253,9 @@ packages:
   big.js@5.2.2:
     resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
 
+  big.js@6.2.2:
+    resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==}
+
   binary-extensions@2.3.0:
     resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
     engines: {node: '>=8'}
@@ -8045,6 +8051,8 @@ snapshots:
 
   big.js@5.2.2: {}
 
+  big.js@6.2.2: {}
+
   binary-extensions@2.3.0: {}
 
   binary@0.3.0:

+ 9 - 0
src/api/craft/process/index.ts

@@ -26,6 +26,15 @@ export function addBatch(data: object) {
     data: data,
   });
 }
+// 新增工序采集辅料
+export function addFuliao(data: object) {
+  return request({
+    url: "/api/v1/operationAccessoryItem/addBatch",
+    method: "post",
+    data: data,
+  });
+}
+
 //批量新增esop
 export function addEsopBatch(data: object) {
   return request({

+ 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,
+  });
+}
+

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 9 - 0
src/assets/icons/fuliaoCJ.svg


+ 1 - 0
src/common/configs/dictDataUtil.ts

@@ -69,6 +69,7 @@ const DictDataUtil = {
     produce_type: "produce_type",
     op_group: "op_group",
     filter_order: "filter_order",
+    quality_grade: "quality_grade",
   },
   EXPAND_FIELD_TABLE: {
     //字段类型

+ 68 - 0
src/components/CommonTable/configs/tableConfig.ts

@@ -785,4 +785,72 @@ export const tableConfig = {
       },
     ],
   },
+  FULIAO_CAIJI: {
+    url: "/api/v1/base/accessories/material",
+    column: [
+      {
+        label: "辅料属性",
+        prop: "accessoriesProperty",
+        search: true,
+        type: "select",
+        dicData: dicts.accessories_property,
+        props: {
+          label: "dictLabel",
+          value: "dictValue",
+        },
+        rules: [
+          {
+            required: true,
+            message: "辅料属性不能为空",
+            trigger: "blur",
+          },
+        ],
+      },
+      {
+        label: "物料编码",
+        prop: "materialCode",
+        clearable: false,
+        search: true,
+        rules: [
+          {
+            required: true,
+            message: "生产物料编码不能为空",
+            trigger: "change",
+          },
+        ],
+      },
+      {
+        label: "物料名称",
+        prop: "materialName",
+        addDisplay: false,
+        editDisplay: false,
+        search: true,
+      },
+      {
+        label: "物料规格",
+        prop: "spec",
+        addDisplay: false,
+        editDisplay: false,
+        search: true,
+      },
+      {
+        label: "辅料类型",
+        prop: "accessoriesType",
+        search: true,
+        type: "select",
+        dicData: dicts.accessories_type,
+        props: {
+          label: "dictLabel",
+          value: "dictValue",
+        },
+        rules: [
+          {
+            required: true,
+            message: "辅料类型不能为空",
+            trigger: "blur",
+          },
+        ],
+      },
+    ],
+  },
 };

+ 77 - 24
src/components/ExcelView/export.js

@@ -1,5 +1,7 @@
 // import { createCellPos } from './translateNumToLetter'
 import Excel from "exceljs";
+
+import Big from 'big.js';
 import FileSaver from "file-saver";
 function exportExcel(luckysheet, name, excelType) {
   // 1.创建工作簿,可以为工作簿添加属性
@@ -467,7 +469,7 @@ var setStyleAndValue = function (cellArr, worksheet) {
 }*/
 
 //获取图片在单元格的位置
-var getImagePosition = function (num, arr) {
+/*var getImagePosition = function (num, arr) {
   let index = 0;
   let minIndex;
   let maxIndex;
@@ -493,45 +495,96 @@ var getImagePosition = function (num, arr) {
   let max = arr[maxIndex];
   let radio = Math.abs((num - min) / (max - min)) + index;
   return radio;
-};
+};*/
+var getImagePosition = function (num, arr) {
+  for (let i = 0; i < arr.length; i++) {
+    const item = arr[i]
+    if (num < item) {
+      const cell = i > 0 ? arr[i] - arr[i - 1]:item
+      // 偏移量单位为Emu,所以单元格的宽高需要转换为Emu的单位,cellWidth = cellWidth*10000
+      const cellInEmu = cell * 10000
+      const rowOrCol = i > 0 ? (num - arr[i - 1]) / (arr[i] - arr[i - 1]) + i:num/item
+      const native = Math.floor(rowOrCol)
+      const nativeOff = parseInt(new Big(rowOrCol).minus(native).toNumber() * cellInEmu)
+      return { rowOrCol, native, nativeOff }
+    }
+  }
+}
 /**
  * 设置图片
  * @param images
  * @param worksheet
  * @param workbook
  */
+/*var setImages = function (table, worksheet, workbook) {
+  let {
+    images,
+    visibledatacolumn,//所有行的位置
+    visibledatarow //所有列的位置
+  } = {...table}
+  if (typeof images != 'object') return;
+  for (let key in images) {
+    // 通过 base64  将图像添加到工作簿
+    const myBase64Image = images[key].src;
+    //开始行 开始列 结束行 结束列
+    const item = images[key];
+    const imageId = workbook.addImage({
+      base64: myBase64Image,
+      extension: 'png'
+    });
+
+    const col_st = getImagePosition(item.default.left,visibledatacolumn);
+    const row_st = getImagePosition(item.default.top,visibledatarow);
+
+    console.log(item.default.left,item.default.top,visibledatacolumn,visibledatarow)
+    console.log("1111111111111::" + col_st)
+    console.log("2222222222222::" + row_st)
+    //模式1,图片左侧与luckysheet位置一样,像素比例保持不变,但是,右侧位置可能与原图所在单元格不一致
+    worksheet.addImage(imageId, {
+      tl: { col: col_st, row: row_st},
+      ext: { width: item.default.width, height: item.default.height },
+    });
+    //模式2,图片四个角位置没有变动,但是图片像素比例可能和原图不一样
+    // const w_ed = item.default.left+item.default.width;
+    // const h_ed = item.default.top+item.default.height;
+    // const col_ed = getImagePosition(w_ed,visibledatacolumn);
+    // const row_ed = getImagePosition(h_ed,visibledatarow);
+    // worksheet.addImage(imageId, {
+    //   tl: { col: col_st, row: row_st},
+    //   br: { col: col_ed, row: row_ed},
+    // });
+  }
+};*/
+
 var setImages = function (table, worksheet, workbook) {
   let {
     images,
-    visibledatacolumn, //所有行的位置
-    visibledatarow, //所有列的位置
-  } = { ...table };
-  if (typeof images != "object") return;
+    visibledatacolumn,//所有行的位置
+    visibledatarow //所有列的位置
+  } = { ...table }
+  if (typeof images != 'object') return;
   for (let key in images) {
-    // console.log(images[key]);
-    // "data:image/png;base64,iVBORw0KG..."
     // 通过 base64  将图像添加到工作簿
     const myBase64Image = images[key].src;
-    //位置
-    const col_st = getImagePosition(
-      images[key].default.left,
-      visibledatacolumn
-    );
-    const row_st = getImagePosition(images[key].default.top, visibledatarow);
-    /*const tl = {col: images[key].default.left / 72, row: images[key].default.top / 19}*/
-    const tl = { col: col_st, row: row_st };
-    // 大小
-    const ext = {
-      width: images[key].default.width,
-      height: images[key].default.height,
-    };
+    //开始行 开始列 结束行 结束列
+    const item = images[key];
     const imageId = workbook.addImage({
       base64: myBase64Image,
-      //extension: 'png',
+      extension: 'png'
     });
+
+    // 只有设置tl、br的图片可以被luckysheet识别并展示,设置ext宽高的不行
+    const col_st = getImagePosition(item.default.left, visibledatacolumn);
+    const row_st = getImagePosition(item.default.top, visibledatarow);
+    const w_ed = item.default.left + item.default.width;
+    const h_ed = item.default.top + item.default.height;
+    const col_ed = getImagePosition(w_ed, visibledatacolumn);
+    const row_ed = getImagePosition(h_ed, visibledatarow);
+    // 需要设置nativeCol,nativeColOff,nativeRow,nativeRowOff,可以省略col,row
     worksheet.addImage(imageId, {
-      tl: tl,
-      ext: ext,
+      tl: { nativeCol: col_st.native, nativeColOff: col_st.nativeOff, nativeRow: row_st.native, nativeRowOff: row_st.nativeOff },
+      br: { nativeCol: col_ed.native, nativeColOff: col_ed.nativeOff, nativeRow: row_ed.native, nativeRowOff: row_ed.nativeOff },
+      editAs: 'oneCell',
     });
   }
 };

+ 1 - 0
src/store/modules/dictionary.ts

@@ -37,6 +37,7 @@ export const useDictionaryStore = defineStore("dictionaryStore", () => {
     "warehouse_type",
     "signature_type",
     "signature_attribution",
+    "accessories_property",
   ];
   const dicts = ref<{ [key: string]: any[] }>({});
 

+ 9 - 7
src/views/base/apply/excelDataBbox.vue

@@ -322,13 +322,15 @@ watch(
 );
 
 onMounted(() => {
-  setTimeout(() => {
-    let blobPromese = excelViewRef.value.toGetExcelBlob();
-    blobPromese.then((res) => {
-      console.log("=========", res);
-      uploadExcelBlob(res, props.data.id);
-    });
-  }, 1000);
+  if(props.data.state === '3'){
+    setTimeout(() => {
+      let blobPromese = excelViewRef.value.toGetExcelBlob();
+      blobPromese.then((res) => {
+        console.log("=========", res);
+        uploadExcelBlob(res, props.data.id);
+      });
+    }, 1000);
+  }
 });
 </script>
 <style lang="scss" scoped>

+ 14 - 1
src/views/base/craftManagement/route/bindConfig.ts

@@ -18,6 +18,18 @@ export const formOption = {
   labelWidth: 120,
   column: [
     {
+      label: "工序名称",
+      prop: "operationName",
+      span: 24,
+      rules: [
+        {
+          required: true,
+          message: "请选择工序类型",
+          trigger: "blur",
+        },
+      ],
+    },
+    {
       label: "工序类型",
       prop: "operationType",
       type: "select",
@@ -167,9 +179,10 @@ export const formOption = {
       label: "批量报工",
       prop: "batchReport",
       span: 24,
+      disabled: true,
       type: "switch",
       dicData: switchOp,
-      value: 0,
+      value: 1,
     },
     {
       label: "是否可跳过",

+ 2 - 0
src/views/base/craftManagement/route/bindProcess.vue

@@ -265,6 +265,8 @@ function isJSON(str) {
 }
 const avueKey = ref(false);
 const nodeClick = (event) => {
+  // 所有的批量报工设置为1
+  event.node.batchReport = 1;
   if (usableStatus.value == false && !editStatus.value) return;
   if (!editStatus.value) {
     selectNode.value = event.node;

+ 44 - 0
src/views/base/craftManagement/route/components/bottomTable.vue

@@ -88,6 +88,7 @@ import {
   addBatch,
   addEsopBatch,
   addCheckBatch,
+  addFuliao,
 } from "@/api/craft/process/index";
 import SingleUpload from "@/components/Upload/SingleUpload.vue";
 
@@ -226,6 +227,18 @@ const startCreat = () => {
         reserveSelection: true,
       });
     });
+  } else if (props.tableType === "fuliaoCJ") {
+    commonTableType.value = "FULIAO_CAIJI";
+
+    nextTick(() => {
+      commonTableRef.value?.startSelect({
+        accessoriesProperty: "2", //默认直接查所有的部件辅料)
+      });
+      commonTableRef.value?.mergeOption({
+        selection: true,
+        reserveSelection: true,
+      });
+    });
   } else {
     crudRef.value && crudRef.value.rowAdd();
   }
@@ -257,6 +270,7 @@ const esopList = ref([]);
 const checkItem = ref({});
 const checkList = ref([]);
 const onSelectedFinish = (itemValue) => {
+  console.log(itemValue);
   if (Object.keys(itemValue).length == 0) {
     ElMessage.error("请选择数据,数据不能为空!");
   }
@@ -357,6 +371,36 @@ const onSelectedFinish = (itemValue) => {
         });
       }
     });
+  } else if (props.tableType === "fuliaoCJ") {
+    itemValue?.forEach((item, index) => {
+      const recordItem = ref({});
+      recordItem.value.itemName = item.materialName;
+      recordItem.value.itemCode = item.materialCode;
+      recordItem.value.itemModel = item.spec;
+      recordItem.value.recordVersion = item.bomVersion;
+      recordItem.value.num = item.materialNumber;
+      recordItem.value.traceType = "S";
+      recordItem.value.operationId = route.params.id;
+      recordItem.value.unit = item.unit;
+      recordItem.value.isTrace = 1;
+      itemRecordList.value.push(recordItem.value);
+    });
+    itemRecord.value.operationId = route.params.id;
+    itemRecord.value.itemList = Array.from(itemRecordList.value);
+    addFuliao(itemRecord.value).then((data) => {
+      if (data.code == "200") {
+        dataList();
+        ElMessage({
+          message: data.msg,
+          type: "success",
+        });
+      } else {
+        ElMessage({
+          message: data.msg,
+          type: "error",
+        });
+      }
+    });
   }
 };
 

+ 64 - 0
src/views/base/craftManagement/route/components/configs.ts

@@ -111,6 +111,66 @@ export const getTableConfig = (id: string) => {
         },
       ],
     },
+    // 辅料采集
+    fuliaoCJ: {
+      url: "/api/v1/operationAccessoryItem",
+      column: [
+        {
+          label: "工序id",
+          prop: "operationId",
+          display: false,
+          hide: true,
+          value: id,
+        },
+        {
+          label: "物料名称",
+          prop: "itemName",
+          addDisabled: true,
+          editDisabled: true,
+        },
+        {
+          label: "物料版本号",
+          prop: "recordVersion",
+          addDisabled: true,
+          editDisabled: true,
+        },
+        {
+          label: "物料编码",
+          prop: "itemCode",
+          addDisabled: true,
+          editDisabled: true,
+        },
+        {
+          label: "物料规格",
+          prop: "itemModel",
+          addDisabled: true,
+          editDisabled: true,
+        },
+        {
+          label: "是否需要",
+          prop: "isTrace",
+          type: "radio", //类型为单选框
+          dicData: [
+            {
+              label: "需采集物料",
+              value: 1,
+            },
+            {
+              label: "非必须采集物料",
+              value: 0,
+            },
+          ],
+          value: 1,
+          rules: [
+            {
+              required: true,
+              message: "是否需要",
+              trigger: "blur",
+            },
+          ],
+        },
+      ],
+    },
     dianjian: {
       url: `/api/v1/op/operationCheck`,
       column: [
@@ -332,6 +392,10 @@ export const comTypes: comType[] = [
     compentType: "wuliaocaiji",
   },
   {
+    compentName: "辅料采集",
+    compentType: "fuliaoCJ",
+  },
+  {
     compentName: "ESOP",
     compentType: "ESOP",
   },

+ 124 - 0
src/views/base/craftManagement/route/components/routeChangeLog.vue

@@ -0,0 +1,124 @@
+<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"
+    />
+
+  </div>
+</template>
+<script setup lang="ts">
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+
+import {
+  useCommonStoreHook,
+  useDictionaryStore,
+  useDictionaryStoreHook,
+} from "@/store";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+
+const { dicts } = useDictionaryStore();
+
+const test = () => {
+  isShowTable.value = true;
+  tableType.value = tableType.value == 1 ? 2 : 1;
+};
+
+const drawingDetail = ref(null);
+const drawing = (row) => {
+  drawingDetail.value = row;
+  dialog.visible = true;
+};
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+    useCrud({
+      src: "/api/v1/routeChange",
+    });
+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对象
+const props = defineProps({
+  targetRouteId: {
+    type: String,
+    required: true,
+  },
+});
+onMounted(() => {
+  // 设置表格列或者其他自定义的option
+  search.value.targetRouteId = props.targetRouteId;
+  dataList();
+});
+
+/**
+ * 上传excel相关
+ */
+const uploadRef = ref(null);
+const uploadFinished = () => {
+  // 上传完成后的刷新操作
+  page.currentPage = 1;
+  dataList();
+};
+
+option.value = Object.assign(option.value, {
+  searchEnter: true,
+  addBtn: false,
+  menu: false,
+  column: [
+    {
+      label: "来源工艺路线编码",
+      prop: "sourceRouteCode",
+      width: 160,
+      overHidden: true,
+    },
+    {
+      label: "修改的工序名称",
+      prop: "operationName",
+      width: 140,
+      overHidden: true,
+    },
+    {
+      label: "修改前版本",
+      prop: "sourceVersion",
+    },
+    {
+      label: "修改后版本",
+      prop: "targetVersion",
+    },
+    {
+      label: "修改内容",
+      prop: "difference",
+    },
+    {
+      label: "修改人",
+      prop: "creator",
+    },
+    {
+      label: "修改时间",
+      prop: "created",
+    },
+  ],
+});
+</script>

+ 23 - 1
src/views/base/craftManagement/route/index.vue

@@ -78,6 +78,8 @@
           @click="deleteRow(row, index)"
           >删除</el-button
         >
+        <el-button link type="primary" v-if="row.upgradeVersion==='1'" icon="el-icon-notification" @click="changeLog(row)"
+        >修改记录</el-button>
         <el-button
           link
           icon="el-icon-copy-document"
@@ -167,6 +169,15 @@
         </div>
       </template>
     </el-dialog>
+    <el-dialog
+        v-model="dialog1.visible"
+        :title="dialog1.title"
+        width="900px"
+        @close="dialog1.visible=false"
+        :destroy-on-close="true"
+    >
+      <RouteChangeLog :targetRouteId="routeDeatil.id" />
+    </el-dialog>
   </div>
 </template>
 <script setup>
@@ -176,6 +187,7 @@ import dictDataUtil from "@/common/configs/dictDataUtil";
 import { useDictionaryStore } from "@/store";
 import { copyRoute, editRouteWith } from "@/api/craft/route/index";
 import { getUserList } from "@/api/system/user/index";
+import RouteChangeLog from "@/views/base/craftManagement/route/components/routeChangeLog.vue";
 // 数据字典相关
 const { dicts } = useDictionaryStore();
 const sureCancelProductManager = () => {
@@ -183,6 +195,10 @@ const sureCancelProductManager = () => {
   dataList();
   form.value = {};
 };
+const dialog1 = ref({
+  title: "修改记录",
+  visible: false,
+});
 // 传入一个url,后面不带/
 const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
   useCrud({
@@ -242,7 +258,13 @@ const uploadFinished = () => {
   page.currentPage = 1;
   dataList();
 };
-
+const routeDeatil = ref({});
+const changeLog = (row) => {
+  console.log(row);
+  routeDeatil.value = row;
+  console.log(routeDeatil.value);
+  dialog1.value.visible = true;
+}
 const doEdit = (row, index) => {
   row.prodtName1 = row.prodtName;
   crudRef.value && crudRef.value.rowEdit(row, index);

+ 22 - 2
src/views/base/craftManagement/routeCommon/index.vue

@@ -62,6 +62,8 @@
           @click="copyRow(row)"
           >复制</el-button
         >-->
+        <el-button link type="primary" v-if="row.upgradeVersion==='1'" icon="el-icon-notification" @click="changeLog(row)"
+        >修改记录</el-button>
         <el-button link icon="el-icon-copy-document" @click="bindProcess(row)"
           >绑定</el-button
         >
@@ -102,6 +104,15 @@
         </div>
       </template>
     </el-dialog>
+    <el-dialog
+        v-model="dialog1.visible"
+        :title="dialog1.title"
+        width="900px"
+        @close="dialog1.visible=false"
+        :destroy-on-close="true"
+    >
+      <RouteChangeLog :targetRouteId="routeDeatil.id" />
+    </el-dialog>
   </div>
 </template>
 <script setup>
@@ -112,6 +123,7 @@ import dictDataUtil from "@/common/configs/dictDataUtil";
 import { useDictionaryStore } from "@/store";
 import { copyRoute } from "@/api/craft/route/index";
 import { getUserList } from "@/api/system/user/index";
+import RouteChangeLog from "@/views/base/craftManagement/route/components/routeChangeLog.vue";
 
 // 数据字典相关
 const { dicts } = useDictionaryStore();
@@ -119,7 +131,10 @@ const { dicts } = useDictionaryStore();
 const testDebunce = () => {
   console.log("执行了事件");
 };
-
+const dialog1 = ref({
+  title: "修改记录",
+  visible: false,
+});
 // 传入一个url,后面不带/
 const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
   useCrud({
@@ -148,7 +163,12 @@ onMounted(() => {
     userList.value = data.data;
   });
 });
-
+const changeLog = (row) => {
+  console.log(row);
+  routeDeatil.value = row;
+  console.log(routeDeatil.value);
+  dialog1.value.visible = true;
+}
 /**
  * 上传excel相关
  */

+ 9 - 3
src/views/plan/workOrder/index.vue

@@ -750,17 +750,23 @@ option.value = Object.assign(option.value, {
       prop: "materialModel",
     },
     {
-      label: "是否H级",
+      label: "质量等级",
       prop: "hOrder",
       type: "select", //类型为下拉选择框
       width: 100,
       overHidden: true,
-      dicUrl: dictDataUtil.request_url + dictDataUtil.TYPE_CODE.filter_order,
+      dicUrl: dictDataUtil.request_url + dictDataUtil.TYPE_CODE.quality_grade,
       props: {
         label: "dictLabel",
         value: "dictValue",
       },
-      value: "0",
+        rules: [
+            {
+                required: true,
+                message: "质量等级不能为空",
+                trigger: "trigger",
+            },
+        ],
     },
     {
       label: "优先级",

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

+ 5 - 1
src/views/quality/rework/index.vue

@@ -245,13 +245,17 @@ option.value = Object.assign(option.value, {
           value: 0,
         },
         {
-          label: "返工完成",
+          label: "返工",
           value: 1,
         },
         {
           label: "驳回",
           value: 2,
         },
+        {
+          label: "返工完成",
+          value: 3,
+        },
       ],
     },