From e823dee9ffeb07fd26413b50cfdd720a286cea55 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E2=80=98937886381=E2=80=99?= <‘937886381@qq.com’>
Date: Mon, 17 Mar 2025 14:18:07 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/api/equipment/base/maintain/record.js     |   2 +-
 src/mixins/lb/basicPageMixin.js               |   2 +-
 .../components/deliveryLogDetail.vue          |  12 +-
 .../deliveryLog/components/editDetail.vue     |  29 +-
 .../components/deliveryLogDetDetail.vue       | 113 +----
 .../components/detailButton.vue               | 253 ++++++++++
 .../deliveryLogDet/components/shippingBtn.vue | 153 ++++++
 src/views/delivery/deliveryLogDet/index.vue   |  32 +-
 .../components/energyPlcParamAdd.vue          |   9 +-
 .../equipment/analysis/efficiency/index.vue   |   6 +-
 .../equipment/base/alarm/Record/index.vue     |  23 +-
 .../base/inspection/Confirm/index.vue         |   7 +-
 .../base/maintain/Monitor/showDetail.vue      |   9 +-
 .../items/components/add-or-updata.vue        |   4 +-
 .../equipment/base/maintain/items/index.vue   |   2 +-
 .../base/maintain/items/showDetail.vue        |  15 +-
 .../base/repair/CustomDialogForm.vue          | 211 +++++----
 .../equipment/base/repair/Repair--add.vue     | 126 +----
 .../equipment/base/repair/detail-btn.vue      |  53 +++
 src/views/equipment/base/repair/detail.vue    | 421 +++++++++++++++++
 src/views/equipment/base/repair/index.vue     | 151 +++---
 .../base/spareParts/Config/addSparts.vue      |  10 +-
 .../equipment/timing-diagram/status/index.vue |   2 +-
 .../processEquMaterialBom/add-or-updata.vue   |   2 +-
 .../processEquValueBom/add-or-updata.vue      |   5 -
 src/views/extend/processFlow/index.vue        |   6 +-
 .../components/BomSelector.vue                |   8 +-
 .../components/ProcessBomList.vue             |  12 +-
 .../components/ProcessInfo.vue                |  70 +--
 .../components/ProcessBomList.vue             |   4 +-
 src/views/material/material/add-or-updata.vue |  11 +-
 .../material/materialProductBom/attr-add.vue  |   6 +-
 .../material/materialUseLog/add-or-updata.vue | 201 +++-----
 src/views/packaging/custom/SmallTitle.vue     |  65 +++
 src/views/packaging/custom/index.vue          | 409 ++++++++++++++++
 src/views/packaging/custom/preview.vue        |  89 ++++
 src/views/packaging/custom/print-data.js      |  90 ++++
 src/views/packaging/custom/providers.js       | 245 ++++++++++
 src/views/packaging/mixins/basic-add.js       | 100 ++++
 src/views/packaging/mixins/basic-page.js      | 170 +++++++
 src/views/packaging/mixins/code-filter.js     |  85 ++++
 .../packagingPrintLog/SmallTitle.vue          |  65 +++
 .../packagingPrintLog/add-or-updata.vue       | 418 +++++++++++++++++
 .../packaging/packagingPrintLog/index.vue     | 356 ++++++++++++++
 .../packaging/packagingPrintLog/unitDict.vue  |  15 +
 .../packagingPrintModel/SmallTitle.vue        |  65 +++
 .../packagingPrintModel/add-or-updata.vue     | 441 ++++++++++++++++++
 .../packaging/packagingPrintModel/index.vue   | 215 +++++++++
 .../packagingPrintModel/unitDict.vue          |  15 +
 .../packagingPrintType/SmallTitle.vue         |  65 +++
 .../packagingPrintType/add-or-updata.vue      | 347 ++++++++++++++
 .../packaging/packagingPrintType/index.vue    | 191 ++++++++
 .../packaging/packagingPrintType/unitDict.vue |  15 +
 src/views/quality/currentData/currentTest.vue |   2 +-
 src/views/quality/currentData/hourData.vue    |  47 +-
 55 files changed, 4835 insertions(+), 645 deletions(-)
 create mode 100644 src/views/delivery/deliveryLogDet/components/detailButton.vue
 create mode 100644 src/views/delivery/deliveryLogDet/components/shippingBtn.vue
 create mode 100644 src/views/equipment/base/repair/detail-btn.vue
 create mode 100644 src/views/equipment/base/repair/detail.vue
 create mode 100644 src/views/packaging/custom/SmallTitle.vue
 create mode 100644 src/views/packaging/custom/index.vue
 create mode 100644 src/views/packaging/custom/preview.vue
 create mode 100644 src/views/packaging/custom/print-data.js
 create mode 100644 src/views/packaging/custom/providers.js
 create mode 100644 src/views/packaging/mixins/basic-add.js
 create mode 100644 src/views/packaging/mixins/basic-page.js
 create mode 100644 src/views/packaging/mixins/code-filter.js
 create mode 100644 src/views/packaging/packagingPrintLog/SmallTitle.vue
 create mode 100644 src/views/packaging/packagingPrintLog/add-or-updata.vue
 create mode 100644 src/views/packaging/packagingPrintLog/index.vue
 create mode 100644 src/views/packaging/packagingPrintLog/unitDict.vue
 create mode 100644 src/views/packaging/packagingPrintModel/SmallTitle.vue
 create mode 100644 src/views/packaging/packagingPrintModel/add-or-updata.vue
 create mode 100644 src/views/packaging/packagingPrintModel/index.vue
 create mode 100644 src/views/packaging/packagingPrintModel/unitDict.vue
 create mode 100644 src/views/packaging/packagingPrintType/SmallTitle.vue
 create mode 100644 src/views/packaging/packagingPrintType/add-or-updata.vue
 create mode 100644 src/views/packaging/packagingPrintType/index.vue
 create mode 100644 src/views/packaging/packagingPrintType/unitDict.vue

diff --git a/src/api/equipment/base/maintain/record.js b/src/api/equipment/base/maintain/record.js
index f6cf896e..ddf7c9a3 100644
--- a/src/api/equipment/base/maintain/record.js
+++ b/src/api/equipment/base/maintain/record.js
@@ -81,7 +81,7 @@ export function deleteLogDet(id) {
 
 export function getEqMaintainPlanPageData(query) {
   return request({
-    url: '/base/equipment-maintain-plan-det/page',
+    url: '/base/equipment-maintain-log-det/page',
     method: 'get',
     params: query
   })
diff --git a/src/mixins/lb/basicPageMixin.js b/src/mixins/lb/basicPageMixin.js
index 6c75636b..6d81c2f2 100644
--- a/src/mixins/lb/basicPageMixin.js
+++ b/src/mixins/lb/basicPageMixin.js
@@ -113,7 +113,7 @@ export default {
       console.log(btn);
 
 			// const keys = ['name', 'createTime']; // timeVal // 已被 searchBarKeys 替代
-			switch (btn.btnName) {
+      switch (btn.btnName) {
 				case 'search':
 					this.searchBarKeys.forEach((key) => {
 						if (key == 'timeVal') {
diff --git a/src/views/delivery/deliveryLog/components/deliveryLogDetail.vue b/src/views/delivery/deliveryLog/components/deliveryLogDetail.vue
index 41ff8883..b71cc4f0 100644
--- a/src/views/delivery/deliveryLog/components/deliveryLogDetail.vue
+++ b/src/views/delivery/deliveryLog/components/deliveryLogDetail.vue
@@ -93,6 +93,16 @@ const tableProps = [
     label: '装箱规格(片/箱)',
     width: 150
   },
+  {
+    prop: 'contactPerson',
+    label: '车辆联系人',
+    width: 150
+  },
+  {
+    prop: 'contactPersonCall',
+    label: '联系方式',
+    width: 150
+  },
   {
     prop: 'packagingNum',
     label: '箱数'
@@ -221,4 +231,4 @@ export default {
   padding:32px 32px 30px 30px;
   height: calc(100vh - 125px);
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/delivery/deliveryLog/components/editDetail.vue b/src/views/delivery/deliveryLog/components/editDetail.vue
index 97373334..9f21dc47 100644
--- a/src/views/delivery/deliveryLog/components/editDetail.vue
+++ b/src/views/delivery/deliveryLog/components/editDetail.vue
@@ -8,26 +8,29 @@
       </el-col>
       <el-col :span='12'>
         <el-form-item label="装车时间" prop="loadTime">
-          <el-date-picker
-            v-model="form.loadTime"
-            type="datetime"
-            format='yyyy-MM-dd HH:mm:ss'
-            value-format="timestamp"
-            style="width: 100%;"
-            placeholder="选择日期">
+          <el-date-picker v-model="form.loadTime" type="datetime" format='yyyy-MM-dd HH:mm:ss' value-format="timestamp"
+            style="width: 100%;" placeholder="选择日期">
           </el-date-picker>
         </el-form-item>
       </el-col>
     </el-row>
+    <el-row :gutter="24">
+      <el-col :span='12'>
+        <el-form-item label="车辆联系人" prop="contactPerson">
+          <el-input v-model="form.contactPerson"></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col :span='12'>
+        <el-form-item label="联系方式" prop="contactPersonCall">
+          <el-input v-model="form.contactPersonCall"></el-input>
+        </el-form-item>
+      </el-col>
+    </el-row>
     <el-row>
       <el-col :span='12'>
         <el-form-item label="装车产品" prop="productId">
           <el-select v-model="form.productId" disabled placeholder="请选择" style="width: 100%;">
-            <el-option
-              v-for="item in productList"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id">
+            <el-option v-for="item in productList" :key="item.id" :label="item.name" :value="item.id">
             </el-option>
           </el-select>
         </el-form-item>
@@ -121,4 +124,4 @@ export default {
     }
   }
 }
-</script>
\ No newline at end of file
+</script>
diff --git a/src/views/delivery/deliveryLogDet/components/deliveryLogDetDetail.vue b/src/views/delivery/deliveryLogDet/components/deliveryLogDetDetail.vue
index fda599ad..00a27c44 100644
--- a/src/views/delivery/deliveryLogDet/components/deliveryLogDetDetail.vue
+++ b/src/views/delivery/deliveryLogDet/components/deliveryLogDetDetail.vue
@@ -44,14 +44,14 @@
               :table-data="tableData"
               :max-height="tableH"
             >
-              <method-btn
+              <!-- <method-btn
                 v-if="tableBtn.length"
                 slot="handleBtn"
                 :width="80"
                 label="操作"
                 :method-list="tableBtn"
                 @clickBtn="viewDetDetail"
-              />
+              /> -->
             </base-table>
             <pagination
               :page.sync="queryParams.pageNo"
@@ -63,7 +63,7 @@
         </el-tab-pane>
         <el-tab-pane label="环形图" name="barChart">
           <div v-if="activeName === 'barChart'">
-            <div 
+            <div
               id="logDetPieBar"
               style="width: 60%"
               :style="{ height: chartHeight + 'px' }"
@@ -73,51 +73,14 @@
       </el-tabs>
     </div>
     <!-- 详情抽屉 -->
-    <el-drawer
-      title="发货详情"
-      size="50%"
-      :append-to-body="true"
-      :visible.sync="innerDrawer"
-      @close='closeB'
-      :show-close='false'>
-      <div class="box3">
-        <el-row>
-          <el-col :span='12'>
-            <span class="title">订单名:</span>
-            <span class="text">{{orderMsg.orderName ? orderMsg.orderName : '-'}}</span>
-          </el-col>
-          <el-col :span='12'>
-            <span class="title">发货单号:</span>
-            <span class="text">{{logCode ? logCode : '-'}}</span>
-          </el-col>
-        </el-row>
-      </div>
-      <div class="box4">
-        <div class="boxTitle">
-          <span class="blueTitle"></span>
-          <span>详情</span>
-        </div>
-        <base-table
-          :page="queryParams2.pageNo"
-          :limit="queryParams2.pageSize"
-          :table-props="tableProps2"
-          :table-data="tableData2"
-          :max-height="tableH2"
-        />
-        <pagination
-          :page.sync="queryParams2.pageNo"
-          :limit.sync="queryParams2.pageSize"
-          :total="total2"
-          @pagination="getList2"
-        />
-      </div>
-    </el-drawer>
   </el-drawer>
 </template>
 <script>
 import { deliveryLogPage, deliveryLogDetPage } from '@/api/base/delivery'
 import { parseTime } from '@/utils/ruoyi'
 import * as echarts from 'echarts'
+import detailButton from './detailButton';
+
 import resize from '@/utils/chartMixins/resize'
 const tableProps = [
   {
@@ -142,55 +105,21 @@ const tableProps = [
   {
     prop: 'rate',
     label: '发货比列(%)',
-    width: 110
+    width: 110,
+    filter: (val) =>
+      val != null ? `${(val).toFixed(2)}%` : '',
   },
   {
     prop: 'principalCost',
     label: '运输费用'
+  },
+  {
+    prop: 'desc',
+    label: '装车详情',
+    subcomponent: detailButton,
   }
 ]
-const tableProps2 = [
-  {
-    prop: 'createTime',
-    label: '添加时间',
-    filter: parseTime,
-    minWidth: 160
-  },
-  {
-    prop: 'deliveryCarCode',
-    label: '装车单号',
-    showOverflowtooltip: true
-  },
-  {
-    prop: 'loadTime',
-    label: '装车时间',
-    filter: parseTime,
-    minWidth: 160
-  },
-  {
-    prop: 'productName',
-    label: '装车产品',
-    showOverflowtooltip: true
-  },
-  {
-    prop: 'packagingSize',
-    label: '装箱规格(片/箱)',
-    minWidth: 140
-  },
-  {
-    prop: 'packagingNum',
-    label: '箱数'
-  },
-  {
-    prop: 'quantity',
-    label: '装车总量'
-  },
-  {
-    prop: 'productDate',
-    label: '产品批次',
-    showOverflowtooltip: true
-  }
-]
+
 export default {
   name: 'DeliveryLogDetDetail',
   mixins: [resize],
@@ -224,7 +153,6 @@ export default {
         pageSize: 20,
         logId: ''
       },
-      tableProps2,
       tableData2: [],
       tableH2: this.tableHeight(275),
       total2: 0,
@@ -288,7 +216,7 @@ export default {
         for (let i = 0; i < this.tableData.length; i++) {
           let obj = {}
           obj.value = this.tableData[i].num
-          obj.name = this.tableData[i].name
+          obj.name = this.tableData[i].code
           seriesData.push(obj)
           if (i < 5) {
             colorList.push(color[i])
@@ -394,14 +322,7 @@ export default {
         this.total2 = res.data.total || 0
       })
     },
-    closeB() {
-      this.logCode = ''
-      this.queryParams2.pageNo = 1
-      this.queryParams2.pageSize = 20
-      this.queryParams2.logId = ''
-      this.tableData2 = []
-      this.total2 = 0
-    }
+
   }
 }
 </script>
@@ -498,4 +419,4 @@ export default {
     color: rgba(0, 0, 0, 0.45);
   }
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/delivery/deliveryLogDet/components/detailButton.vue b/src/views/delivery/deliveryLogDet/components/detailButton.vue
new file mode 100644
index 00000000..fd315300
--- /dev/null
+++ b/src/views/delivery/deliveryLogDet/components/detailButton.vue
@@ -0,0 +1,253 @@
+<!--
+ * @Author: zwq
+ * @Date: 2023-08-03 14:09:18
+ * @LastEditors: DY
+ * @LastEditTime: 2023-10-13 16:47:25
+ * @Description:
+-->
+<template>
+  <div class="tableInner">
+      <el-button @click="viewDetDetail" type="text" style="margin: 5px 0; padding: 0" >
+        <span class="iconfont" :class="'icon-detail' +
+                      ' primary-color'
+                "></span>
+      </el-button>
+    <el-drawer title="发货详情" size="50%" :append-to-body="true" :visible.sync="innerDrawer" @close='closeB'
+      :show-close='false'>
+      <div class="box3">
+        <el-row>
+          <el-col :span='12'>
+            <span class="title">订单名:</span>
+            <span class="text">{{ orderMsg.orderName ? orderMsg.orderName : '-' }}</span>
+          </el-col>
+          <el-col :span='12'>
+            <span class="title">发货单号:</span>
+            <span class="text">{{ logCode ? logCode : '-' }}</span>
+          </el-col>
+        </el-row>
+      </div>
+      <div class="box4">
+        <div class="boxTitle">
+          <span class="blueTitle"></span>
+          <span>详情</span>
+        </div>
+        <base-table :page="queryParams2.pageNo" :limit="queryParams2.pageSize" :table-props="tableProps2"
+          :table-data="tableData2" :max-height="tableH2" />
+        <pagination :page.sync="queryParams2.pageNo" :limit.sync="queryParams2.pageSize" :total="total2"
+          @pagination="getList2" />
+      </div>
+    </el-drawer>
+  </div>
+</template>
+<script>
+import { deliveryLogDetPage } from '@/api/base/delivery'
+import { parseTime } from '@/utils/ruoyi'
+
+const tableProps2 = [
+  // {
+  //   prop: 'createTime',
+  //   label: '添加时间',
+  //   filter: parseTime,
+  //   minWidth: 160
+  // },
+  {
+    prop: 'deliveryCarCode',
+    label: '装车单号',
+    showOverflowtooltip: true
+  },
+  {
+    prop: 'loadTime',
+    label: '装车时间',
+    filter: parseTime,
+    minWidth: 160
+  },
+  {
+    prop: 'productName',
+    label: '装车产品',
+    showOverflowtooltip: true
+  },
+  {
+    prop: 'packagingSize',
+    label: '装箱规格(片/箱)',
+    minWidth: 140
+  },
+  {
+    prop: 'packagingNum',
+    label: '箱数'
+  },
+  {
+    prop: 'quantity',
+    label: '装车总量'
+  },
+  {
+    prop: 'productDate',
+    label: '产品批次',
+    showOverflowtooltip: true
+  }
+]
+export default {
+	props: {
+		injectData: {
+			type: Object,
+			default: () => ({}),
+		},
+	},
+	data() {
+		return {
+			list: this.injectData,
+      visible: false,
+      tableProps2,
+      logCode:'',
+      orderMsg: {},
+      tableData2: [],
+      tableH2: this.tableHeight(275),
+      total2: 0,
+      innerDrawer:false,
+      queryParams2: {
+        pageNo: 1,
+        pageSize: 20,
+        logId: ''
+      },
+		};
+  },
+  mounted() {
+    window.addEventListener('resize', () => {
+      this.tableH2 = this.tableHeight(275)
+    })
+  },
+	methods: {
+    viewDetDetail() {
+      console.log(this.list);
+
+      this.logCode = this.list.code
+      this.orderMsg.orderName = this.list.orderName
+      this.innerDrawer = true
+      this.queryParams2.logId = this.list.id
+      this.getList2()
+    },
+    closeB() {
+      this.logCode = ''
+      this.queryParams2.pageNo = 1
+      this.queryParams2.pageSize = 20
+      this.queryParams2.logId = ''
+      this.tableData2 = []
+      this.total2 = 0
+    },
+    getList2() {
+      deliveryLogDetPage({ ...this.queryParams2 }).then(res => {
+        this.tableData2 = res.data.list || []
+        this.total2 = res.data.total || 0
+      })
+    },
+	},
+};
+</script>
+<style scoped lang='scss'>
+.box1 {
+  height: 76px;
+  border-bottom: 1px solid #E9E9E9;
+  margin: 0px 8px 20px 30px;
+
+  .box_col {
+    display: inline-block;
+    width: 20%;
+    padding: 8px 8px 8px 8px;
+
+    .blodTip {
+      height: 16px;
+      font-size: 14px;
+      font-weight: 600;
+      color: rgba(0, 0, 0, 0.85);
+      margin-bottom: 8px;
+    }
+
+    .lightTip {
+      height: 16px;
+      font-size: 14px;
+      font-weight: 400;
+      color: rgba(102, 102, 102, 0.75);
+    }
+  }
+}
+
+.box2 {
+  padding: 0px 32px 30px 30px;
+  height: calc(100vh - 150px);
+}
+
+.boxTitle {
+  display: inline-block;
+  font-size: 16px;
+  font-weight: 400;
+  color: #000000;
+  margin: 0 10px 10px 0;
+}
+
+.blueTitle {
+  content: '';
+  display: inline-block;
+  width: 4px;
+  height: 18px;
+  background-color: #0B58FF;
+  border-radius: 1px;
+  margin-right: 8px;
+  vertical-align: bottom;
+}
+
+.box3 {
+  padding: 8px 8px 8px 40px;
+
+  .title {
+    height: 16px;
+    font-size: 14px;
+    font-weight: 600;
+    color: rgba(0, 0, 0, 0.85);
+  }
+
+  .text {
+    height: 16px;
+    font-size: 14px;
+    font-weight: 400;
+    color: rgba(102, 102, 102, 0.75);
+  }
+}
+
+.box4 {
+  padding: 32px 32px 30px 30px;
+  height: calc(100vh - 125px);
+}
+</style>
+<style lang='scss'>
+.deliveryLogDetail {
+  .el-tabs__nav::after {
+    content: "";
+    position: absolute;
+    left: 0;
+    bottom: 0;
+    width: 100%;
+    height: 2px;
+    background-color: #e4e7ed;
+    /* z-index: 1; */
+  }
+
+  .el-tabs__nav-wrap::after {
+    width: 0;
+  }
+
+  .el-tabs__item {
+    padding: 0 10px;
+  }
+
+  .el-tabs__item:hover {
+    color: rgba(0, 0, 0, 0.85);
+  }
+
+  .el-tabs__item.is-active {
+    color: rgba(0, 0, 0, 0.85);
+  }
+
+  .el-tabs__item {
+    color: rgba(0, 0, 0, 0.45);
+  }
+}
+</style>
diff --git a/src/views/delivery/deliveryLogDet/components/shippingBtn.vue b/src/views/delivery/deliveryLogDet/components/shippingBtn.vue
new file mode 100644
index 00000000..d270b985
--- /dev/null
+++ b/src/views/delivery/deliveryLogDet/components/shippingBtn.vue
@@ -0,0 +1,153 @@
+<!--
+ * @Author: zwq
+ * @Date: 2023-08-03 14:09:18
+ * @LastEditors: DY
+ * @LastEditTime: 2023-10-13 16:47:25
+ * @Description:
+-->
+<template>
+  <div class="tableInner">
+    <el-button @click="handleClick" type="text" style="margin: 5px 0; padding: 0">
+      <span class="iconfont" :class="'icon-detail' +
+                      ' primary-color'
+                "></span>
+    </el-button>
+    <delivery-log-det-detail ref='deliveryLogDetail' />
+  </div>
+</template>
+<script>
+import DeliveryLogDetDetail from './deliveryLogDetDetail.vue'
+export default {
+	props: {
+		injectData: {
+			type: Object,
+			default: () => ({}),
+		},
+	},
+	data() {
+		return {
+			list: this.injectData,
+		};
+  },
+  components: { DeliveryLogDetDetail },
+
+  mounted() {
+  },
+	methods: {
+    handleClick() {
+      this.$nextTick(() => {
+        this.$refs.deliveryLogDetail.init(this.list)
+      })
+    }
+	},
+};
+</script>
+<style scoped lang='scss'>
+.box1 {
+  height: 76px;
+  border-bottom: 1px solid #E9E9E9;
+  margin: 0px 8px 20px 30px;
+
+  .box_col {
+    display: inline-block;
+    width: 20%;
+    padding: 8px 8px 8px 8px;
+
+    .blodTip {
+      height: 16px;
+      font-size: 14px;
+      font-weight: 600;
+      color: rgba(0, 0, 0, 0.85);
+      margin-bottom: 8px;
+    }
+
+    .lightTip {
+      height: 16px;
+      font-size: 14px;
+      font-weight: 400;
+      color: rgba(102, 102, 102, 0.75);
+    }
+  }
+}
+
+.box2 {
+  padding: 0px 32px 30px 30px;
+  height: calc(100vh - 150px);
+}
+
+.boxTitle {
+  display: inline-block;
+  font-size: 16px;
+  font-weight: 400;
+  color: #000000;
+  margin: 0 10px 10px 0;
+}
+
+.blueTitle {
+  content: '';
+  display: inline-block;
+  width: 4px;
+  height: 18px;
+  background-color: #0B58FF;
+  border-radius: 1px;
+  margin-right: 8px;
+  vertical-align: bottom;
+}
+
+.box3 {
+  padding: 8px 8px 8px 40px;
+
+  .title {
+    height: 16px;
+    font-size: 14px;
+    font-weight: 600;
+    color: rgba(0, 0, 0, 0.85);
+  }
+
+  .text {
+    height: 16px;
+    font-size: 14px;
+    font-weight: 400;
+    color: rgba(102, 102, 102, 0.75);
+  }
+}
+
+.box4 {
+  padding: 32px 32px 30px 30px;
+  height: calc(100vh - 125px);
+}
+</style>
+<style lang='scss'>
+.deliveryLogDetail {
+  .el-tabs__nav::after {
+    content: "";
+    position: absolute;
+    left: 0;
+    bottom: 0;
+    width: 100%;
+    height: 2px;
+    background-color: #e4e7ed;
+    /* z-index: 1; */
+  }
+
+  .el-tabs__nav-wrap::after {
+    width: 0;
+  }
+
+  .el-tabs__item {
+    padding: 0 10px;
+  }
+
+  .el-tabs__item:hover {
+    color: rgba(0, 0, 0, 0.85);
+  }
+
+  .el-tabs__item.is-active {
+    color: rgba(0, 0, 0, 0.85);
+  }
+
+  .el-tabs__item {
+    color: rgba(0, 0, 0, 0.45);
+  }
+}
+</style>
diff --git a/src/views/delivery/deliveryLogDet/index.vue b/src/views/delivery/deliveryLogDet/index.vue
index dc02ec0c..74c003f9 100644
--- a/src/views/delivery/deliveryLogDet/index.vue
+++ b/src/views/delivery/deliveryLogDet/index.vue
@@ -14,14 +14,14 @@
       :table-data="list"
       :max-height="tableH"
     >
-      <method-btn
+      <!-- <method-btn
         v-if="tableBtn.length"
         slot="handleBtn"
         :width="80"
         label="操作"
         :method-list="tableBtn"
         @clickBtn="handleClick"
-      />
+      /> -->
     </base-table>
     <pagination
       :page.sync="queryParams.pageNo"
@@ -30,12 +30,13 @@
       @pagination="getList"
     />
     <!-- 详情抽屉 -->
-    <delivery-log-det-detail ref='deliveryLogDetail'/>
+    <!-- <delivery-log-det-detail ref='deliveryLogDetail'/> -->
   </div>
 </template>
 <script>
 import { deliveryProgressPage } from '@/api/base/delivery'
-import DeliveryLogDetDetail from './components/deliveryLogDetDetail.vue'
+
+import shippingBtn from './components/shippingBtn.vue';
 const tableProps = [
   {
     prop: 'orderName',
@@ -61,7 +62,12 @@ const tableProps = [
   },
   {
     prop: 'rate',
-    label: '累计发货比例(%)'
+    label: '发货进度(%)'
+  },
+  {
+    prop: 'desc',
+    label: '发货详情',
+    subcomponent: shippingBtn,
   }
 ]
 export default {
@@ -101,7 +107,7 @@ export default {
       ].filter((v) => v)
     }
   },
-  components: { DeliveryLogDetDetail },
+  // components: { DeliveryLogDetDetail },
   created() {
     window.addEventListener('resize', () => {
       this.tableH = this.tableHeight(260)
@@ -119,12 +125,12 @@ export default {
       this.queryParams.orderName = val.orderName
       this.getList()
     },
-    handleClick(val) {
-      console.log(val)
-      this.$nextTick(() => {
-        this.$refs.deliveryLogDetail.init(val.data)
-      })
-    }
+    // handleClick(val) {
+    //   console.log(val)
+    //   this.$nextTick(() => {
+    //     this.$refs.deliveryLogDetail.init(val.data)
+    //   })
+    // }
   }
 }
-</script>
\ No newline at end of file
+</script>
diff --git a/src/views/devConfig/energy/energyPlcConnect/components/energyPlcParamAdd.vue b/src/views/devConfig/energy/energyPlcConnect/components/energyPlcParamAdd.vue
index 6eed9ca8..42ea0551 100644
--- a/src/views/devConfig/energy/energyPlcConnect/components/energyPlcParamAdd.vue
+++ b/src/views/devConfig/energy/energyPlcConnect/components/energyPlcParamAdd.vue
@@ -3,7 +3,7 @@
     <el-row>
       <el-col :span="12">
         <el-form-item label="能源类型" prop="typeId">
-          <el-select v-model="form.typeId" placeholder="请选择" style="width: 100%;" filterable>
+          <el-select v-model="form.typeId" placeholder="请选择" style="width: 100%;" filterable @change="getUnit">
             <el-option
               v-for="item in energyListType"
               :key="item.id"
@@ -79,6 +79,13 @@ export default {
     }
   },
   methods: {
+    getUnit(val) {
+      this.energyListType.forEach((item) => {
+        if (val === item.id) {
+          this.form.unit = item.unit
+        }
+      })
+    },
     init(param) {
       this.form.connectId = param.connectId
       getEnergyTypeListAll().then((res) => {
diff --git a/src/views/equipment/analysis/efficiency/index.vue b/src/views/equipment/analysis/efficiency/index.vue
index 94d7571a..a96eadd5 100644
--- a/src/views/equipment/analysis/efficiency/index.vue
+++ b/src/views/equipment/analysis/efficiency/index.vue
@@ -331,7 +331,7 @@ export default {
 			queryParams: {
 				lineId: null,
 				factoryId: null,
-				recordTime: [],
+				recordTime: undefined,
 			},
 			// 表单参数
 			form: {},
@@ -410,15 +410,13 @@ export default {
 				this.queryParams.factoryId = payload.factoryId || null;
 				this.queryParams.lineId = payload.lineId || null;
 				if (0 == payload.dateFilterType) {
-					this.queryParams.recordTime = payload.timerange;
+          this.queryParams.recordTime = payload.timerange ? payload.timerange :undefined
 				} else if (1 == payload.dateFilterType) {
 					this.queryParams.recordTime = [
 						`${payload.timeday} 00:00:00`,
 						`${payload.timeday} 23:59:59`,
 					];
 				}
-			} else {
-				this.queryParams.recordTime = null;
 			}
 			this.getList();
 		},
diff --git a/src/views/equipment/base/alarm/Record/index.vue b/src/views/equipment/base/alarm/Record/index.vue
index 53da57d8..8d9dc49e 100644
--- a/src/views/equipment/base/alarm/Record/index.vue
+++ b/src/views/equipment/base/alarm/Record/index.vue
@@ -39,13 +39,6 @@
 			@close="cancel"
 			@cancel="cancel"
 			@confirm="submitForm">
-			<!-- <DialogForm
-				v-if="open"
-				ref="form"
-				v-model="form"
-				:disabled="mode == 'detail'"
-				:has-files="false"
-				:rows="rows" /> -->
 			<AddOrUpdate
 				v-if="open"
 				ref="addOrUpdate"
@@ -119,22 +112,22 @@ export default {
 				// 	: undefined,
 			].filter((v) => v),
 			tableProps: [
-				{ prop: 'productionLine', label: '产线', width: 120, showOverflowtooltip: true },
-				{ prop: 'workshopSection', label: '工段', width: 120, showOverflowtooltip: true },
-				{ prop: 'equipment', label: '设备名称', width: 120, showOverflowtooltip: true },
+				{ prop: 'productionLine', label: '产线', showOverflowtooltip: true },
+				{ prop: 'workshopSection', label: '工段',showOverflowtooltip: true },
+				{ prop: 'equipment', label: '设备名称', showOverflowtooltip: true },
 				{
 					prop: 'alarmGrade',
 					label: '报警级别',
 					filter: publicFormatter(this.DICT_TYPE.EQU_ALARM_LEVEL),
 				},
-				{ prop: 'createTime', label: '报警时间', filter: timeFilter, width: 150, showOverflowtooltip: true },
-				{ prop: 'alarmCode', label: '设备报警码', width: 180, showOverflowtooltip: true },
-				{ prop: 'alarmContent', label: '报警内容', width: 150, showOverflowtooltip: true },
+				{ prop: 'createTime', label: '报警时间', filter: timeFilter, showOverflowtooltip: true },
+				{ prop: 'alarmCode', label: '设备报警码',  showOverflowtooltip: true },
+				{ prop: 'alarmContent', label: '报警内容',  showOverflowtooltip: true },
 				this.$auth.hasPermiAnd([
 					'monitoring:equipment-alarm-log:query',
 					'base:equipment-alarm-hand:query'
 				]) ?
-				{ prop: 'opt1', label: '处理记录', name: '查看', subcomponent: btn } : undefined,
+				{ prop: 'opt1', label: '处理记录', name: '查看', subcomponent: btn } : '',
 				this.$auth.hasPermiAnd([
 					'monitoring:equipment-alarm-log:query',
 					'base:equipment-alarm-hand:query',
@@ -143,7 +136,7 @@ export default {
 					'base:equipment-alarm-hand:update',
 					'monitoring:equipment-alarm-log:update'
 				]) ?
-				{ prop: 'opt2', label: '处理', name: '报警处理', subcomponent: btn } : undefined,
+				{ prop: 'opt2', label: '处理', name: '报警处理', subcomponent: btn } : '',
 				// { prop: 'remark', label: '备注' },
 			],
 			searchBarFormConfig: [
diff --git a/src/views/equipment/base/inspection/Confirm/index.vue b/src/views/equipment/base/inspection/Confirm/index.vue
index 5d072a8b..fce79619 100644
--- a/src/views/equipment/base/inspection/Confirm/index.vue
+++ b/src/views/equipment/base/inspection/Confirm/index.vue
@@ -168,7 +168,8 @@ export default {
 				pageSize: 20,
 				maintainPlanId: null,
 				startTime: null,
-				special: false,
+        special: false,
+        name:undefined,
 				status: 1,
 			},
 			// 表单参数
@@ -196,7 +197,7 @@ export default {
 	methods: {
 		/** 批量确认 */
     async handleSearchBarBtnClick(btn) {
-      console.log(11111);
+      console.log(btn);
 
 			switch (btn.btnName) {
 				case 'batchConfirm':
@@ -263,6 +264,8 @@ export default {
             .catch(() => { });
           break;
         case 'search':
+          console.log(btn);
+          this.queryParams.name = btn.name || null;
           this.getList()
           break;
         case 'add':
diff --git a/src/views/equipment/base/maintain/Monitor/showDetail.vue b/src/views/equipment/base/maintain/Monitor/showDetail.vue
index 76a5a7a0..428db673 100644
--- a/src/views/equipment/base/maintain/Monitor/showDetail.vue
+++ b/src/views/equipment/base/maintain/Monitor/showDetail.vue
@@ -101,6 +101,7 @@ export default {
         addOrUpdateVisible: false,
         addOrEditTitle: '',
         queryParams: {
+          logId:null,
           pageNo:1,
           pageSize:10,
           planId:null,
@@ -124,8 +125,10 @@ export default {
   methods: {
     getDataList(id) {
       this.dataListLoading = true;
-      this.queryParams.planId = id
-      this.urlOptions.getDataListURL(this.listQuery).then(response => {
+      console.log(id);
+
+      this.queryParams.logId = id
+      this.urlOptions.getDataListURL(this.queryParams).then(response => {
         this.tableData = response.data.list;
         // this.listQuery.total = response.data.total;
         this.dataListLoading = false
@@ -147,6 +150,8 @@ export default {
     init(obj) {
       this.drawer = true
       this.dataForm = obj
+      console.log(obj.id);
+
       this.getDataList(obj.id)
       }
     },
diff --git a/src/views/equipment/base/maintain/items/components/add-or-updata.vue b/src/views/equipment/base/maintain/items/components/add-or-updata.vue
index 97d2d38d..dc4e7d76 100644
--- a/src/views/equipment/base/maintain/items/components/add-or-updata.vue
+++ b/src/views/equipment/base/maintain/items/components/add-or-updata.vue
@@ -44,8 +44,8 @@
           <el-input oninput="value=value.replace(/[^\-\d.]/g, '')" v-model="dataForm.minValue" placeholder="请输入最小值" />
         </el-form-item>
       </el-col>
-      <el-col :span="4">
-       —————
+      <el-col :span="4" style="text-align: center;">
+       —— 
       </el-col>
       <el-col :span="9">
         <el-form-item prop="maxValue" label-width="20">
diff --git a/src/views/equipment/base/maintain/items/index.vue b/src/views/equipment/base/maintain/items/index.vue
index d8acead8..e1af2a5a 100644
--- a/src/views/equipment/base/maintain/items/index.vue
+++ b/src/views/equipment/base/maintain/items/index.vue
@@ -186,7 +186,7 @@ export default {
     handleDetail(row) {
       this.showDetailVisible = true
       this.$nextTick(() => {
-        this.$refs.showDetail.init(row.id)
+        this.$refs.showDetail.init(row.equipmentTypeId)
       })
 				// alert('跳转到 保养记录')
 				// console.log(row)
diff --git a/src/views/equipment/base/maintain/items/showDetail.vue b/src/views/equipment/base/maintain/items/showDetail.vue
index 4cdd945b..40363600 100644
--- a/src/views/equipment/base/maintain/items/showDetail.vue
+++ b/src/views/equipment/base/maintain/items/showDetail.vue
@@ -103,9 +103,17 @@ export default {
       this.tableData[val._pageIndex - 1][val.prop] = val[val.prop]
       // console.log(this.tableData)
     },
-    getDataList(id) {
+    handleCancel() {
+      this.$refs.addOrUpdate.formClear()
+      this.addOrUpdateVisible = false
+      this.addOrEditTitle = ''
+    },
+    successSubmit() {
+      this.handleCancel()
+      this.getDataList()
+    },
+    getDataList() {
       this.dataListLoading = true;
-      this.queryParams.mainId = id
       this.urlOptions.getDataListURL(this.queryParams).then(response => {
         this.tableData = response.data.list;
         this.queryParams.total = response.data.total;
@@ -121,7 +129,8 @@ export default {
     },
     init(id) {
       this.drawer = true
-      this.getDataList(id)
+      this.queryParams.mainId = id || ''
+      this.getDataList()
       }
     },
   }
diff --git a/src/views/equipment/base/repair/CustomDialogForm.vue b/src/views/equipment/base/repair/CustomDialogForm.vue
index a7b23222..a5b82e21 100644
--- a/src/views/equipment/base/repair/CustomDialogForm.vue
+++ b/src/views/equipment/base/repair/CustomDialogForm.vue
@@ -8,10 +8,7 @@
 <template>
   <!-- <el-drawer :visible.sync="visible" :show-close="false" :wrapper-closable="disabled" class="drawer"
     custom-class="mes-drawer" size="50%" @closed="$emit('destroy')"> -->
-  <el-dialog
-  :visible.sync="visible"
-  width="50%"
-  :before-close="closed">
+  <el-dialog :visible.sync="visible" width="50%" :before-close="closed">
     <small-title slot="title" :no-padding="true">
       详情
       <!-- {{ disabled ? '查看详情' : !dataForm.maintenanceStatus ? '修改' : '完成' }} -->
@@ -20,55 +17,73 @@
       <div class="drawer-body__content">
         <div>
           <el-row :gutter="20">
+            <el-col :span="6">
+              <div class="blodTip">维修单号</div>
+              <div class="lightTip">{{ dataForm.repairOrderNumber }}</div>
+            </el-col>
+            <el-col :span="6">
+              <div class="blodTip">产线名</div>
+              <div class="lightTip">{{ dataForm.lineName }}</div>
+            </el-col>
+            <el-col :span="6">
+              <div class="blodTip">工段名</div>
+              <div class="lightTip">{{ dataForm.sectionName }}</div>
+            </el-col>
             <el-col :span="6">
               <div class="blodTip">故障发生时间</div>
               <div class="lightTip">{{ parseTime(dataForm.faultTime) }}</div>
             </el-col>
+          </el-row>
+          <el-row :gutter="20">
+            <!-- <el-col :span="6">
+              <div class="blodTip">故障发生时间</div>
+              <div class="lightTip">{{ parseTime(dataForm.faultTime) }}</div>
+            </el-col> -->
             <el-col :span="6">
+              <div class="blodTip">设备名</div>
+              <div class="lightTip">{{ dataForm.equipmentName }}</div>
+            </el-col>
+            <el-col :span="6">
+              <div class="blodTip">维修时长</div>
+              <div class="lightTip">{{ dataForm.maintenanceDuration }}</div>
+            </el-col>
+
+            <!-- <el-col :span="6">
               <div class="blodTip">故障级别</div>
               <div class="lightTip">{{ getDictDataLabel('fault-level', dataForm.faultLevel) }}</div>
             </el-col>
             <el-col :span="6">
               <div class="blodTip">故障类型</div>
               <div class="lightTip">{{ getDictDataLabel('fault-type', dataForm.faultType) }}</div>
-            </el-col>
+            </el-col> -->
             <el-col :span="6">
               <div class="blodTip">维修工</div>
               <div class="lightTip">{{ dataForm.repairman }}</div>
             </el-col>
-          </el-row>
-          <el-row :gutter="20">
             <el-col :span="6">
               <div class="blodTip">联系方式</div>
               <div class="lightTip">{{ dataForm.repairmanPhone }}</div>
             </el-col>
-            <el-col :span="6">
-              <div class="blodTip">维修方式</div>
-              <div class="lightTip">{{ getDictDataLabel('repair-mode', dataForm.repairMode) }}</div>
-            </el-col>
-            <el-col :span="6">
-              <div class="blodTip">创建时间</div>
-              <div class="lightTip">{{ parseTime(dataForm.createTime) }}</div>
-            </el-col>
-            <el-col :span="6">
-              <div class="blodTip">创建人</div>
-              <div class="lightTip">{{ dataForm.creator }}</div>
-            </el-col>
           </el-row>
-          <el-row>
-            <div class="blodTip">备注</div>
-            <div class="lightTip">{{ dataForm.remark }}</div>
+          <el-row :gutter="20">
+            <el-col :span="6">
+              <div class="blodTip">备注</div>
+              <div class="lightTip">{{ dataForm.remark }}</div>
+            </el-col>
+            <el-col :span="6">
+              <div class="blodTip">故障明细</div>
+              <div class="lightTip">{{ dataForm.faultDetail.replace(/<\/?p>/g, '') }}</div>
+            </el-col>
+            <el-col :span="6">
+              <div class="blodTip">维修明细</div>
+              <div class="lightTip">{{ dataForm.maintenanceDetail.replace(/<\/?p>/g, '') }}</div>
+            </el-col>
           </el-row>
           <el-row>
             <div class="blodTip">维修附件</div>
             <div v-if="dataForm.files && dataForm.files.length > 0">
-              <uploadedFile
-                class="file"
-                v-for="file in dataForm.files"
-                :file="file"
-                :key="file.fileUrl"
-                :disabled="disabled"
-                @delete="!disabled && handleDeleteFile(file, col.prop)" />
+              <uploadedFile class="file" v-for="file in dataForm.files" :file="file" :key="file.fileUrl"
+                :disabled="disabled" @delete="!disabled && handleDeleteFile(file, col.prop)" />
             </div>
             <p v-else>暂无附件</p>
           </el-row>
@@ -170,65 +185,65 @@ import { getDictDataLabel } from '@/utils/dict';
 import tupleImg from '@/assets/images/tuple.png';
 
 const uploadedFile = {
-	name: 'UploadedFile',
-	props: ['file', 'disabled'],
-	data() {
-		return {};
-	},
-	methods: {
-		handleDelete() {
-			this.$emit('delete', this.file);
-		},
-		async handleDownload() {
-			const data = await this.$axios({
-				url: this.file.fileUrl,
-				method: 'get',
-				responseType: 'blob',
-			});
+  name: 'UploadedFile',
+  props: ['file', 'disabled'],
+  data() {
+    return {};
+  },
+  methods: {
+    handleDelete() {
+      this.$emit('delete', this.file);
+    },
+    async handleDownload() {
+      const data = await this.$axios({
+        url: this.file.fileUrl,
+        method: 'get',
+        responseType: 'blob',
+      });
 
-			await this.$message.success('开始下载');
-			// create download link
-			const url = window.URL.createObjectURL(data);
-			const link = document.createElement('a');
-			link.href = url;
-			link.download = this.file.fileName;
-			document.body.appendChild(link);
-			link.click();
-			document.body.removeChild(link);
-		},
-	},
-	mounted() {
-	},
-	render: function (h) {
-		return (
-			<div
-				title={this.file.fileName}
-				onClick={this.handleDownload}
-				style={{
-					background: `url(${tupleImg}) no-repeat`,
-					backgroundSize: '14px',
-					backgroundPosition: '0 55%',
-					paddingLeft: '20px',
-					paddingRight: '24px',
-					textOverflow: 'ellipsis',
-					whiteSpace: 'nowrap',
-					overflow: 'hidden',
-					cursor: 'pointer',
-					display: 'inline-block',
-				}}>
-				{this.file.fileName}
-				{!this.disabled && (
-					<el-button
-						type="text"
-						icon="el-icon-close"
-						style="float: right; position: relative; top: 2px; left: 8px; z-index: 100"
-						class="dialog__upload_component__close"
-						onClick={this.handleDelete}
-					/>
-				)}
-			</div>
-		);
-	},
+      await this.$message.success('开始下载');
+      // create download link
+      const url = window.URL.createObjectURL(data);
+      const link = document.createElement('a');
+      link.href = url;
+      link.download = this.file.fileName;
+      document.body.appendChild(link);
+      link.click();
+      document.body.removeChild(link);
+    },
+  },
+  mounted() {
+  },
+  render: function (h) {
+    return (
+      <div
+        title={this.file.fileName}
+        onClick={this.handleDownload}
+        style={{
+          background: `url(${tupleImg}) no-repeat`,
+          backgroundSize: '14px',
+          backgroundPosition: '0 55%',
+          paddingLeft: '20px',
+          paddingRight: '24px',
+          textOverflow: 'ellipsis',
+          whiteSpace: 'nowrap',
+          overflow: 'hidden',
+          cursor: 'pointer',
+          display: 'inline-block',
+        }}>
+        {this.file.fileName}
+        {!this.disabled && (
+          <el-button
+            type="text"
+            icon="el-icon-close"
+            style="float: right; position: relative; top: 2px; left: 8px; z-index: 100"
+            class="dialog__upload_component__close"
+            onClick={this.handleDelete}
+          />
+        )}
+      </div>
+    );
+  },
 };
 
 export default {
@@ -392,18 +407,20 @@ export default {
   justify-content: flex-end;
   padding: 18px;
 }
+
 .blodTip {
-	height: 16px;
-	font-size: 14px;
-	font-weight: 600;
-	color: rgba(0,0,0,0.85);
-	margin-bottom: 8px;
+  height: 16px;
+  font-size: 14px;
+  font-weight: 600;
+  color: rgba(0, 0, 0, 0.85);
+  margin-bottom: 8px;
 }
+
 .lightTip {
-	/* height: 16px; */
-	font-size: 14px;
-	font-weight: 400;
-	color: rgba(102,102,102,0.75);
-	margin-bottom: 12px;
+  /* height: 16px; */
+  font-size: 14px;
+  font-weight: 400;
+  color: rgba(102, 102, 102, 0.75);
+  margin-bottom: 12px;
 }
 </style>
diff --git a/src/views/equipment/base/repair/Repair--add.vue b/src/views/equipment/base/repair/Repair--add.vue
index 16f96e9a..650a6efb 100644
--- a/src/views/equipment/base/repair/Repair--add.vue
+++ b/src/views/equipment/base/repair/Repair--add.vue
@@ -63,106 +63,6 @@
             value-format="timestamp" format="yyyy-MM-dd HH:mm:ss" clearable @change="$emit('update', form)" />
         </el-form-item>
       </el-col>
-
-      <!-- 故障级别  -->
-      <!-- <el-col :span="8">
-				<el-form-item
-					label="故障级别"
-					prop="faultLevel"
-					:rules="[
-						{
-							required: true,
-							message: '故障级别不能为空',
-							trigger: 'blur',
-						},
-					]">
-					<el-select
-						v-model="form.faultLevel"
-						placeholder="故障级别"
-						:disabled="disabled"
-						@change="$emit('update', form)">
-						<el-option
-							v-for="opt in getDictDatas(DICT_TYPE.FAULT_LEVEL)"
-							:key="opt.value"
-							:label="opt.label"
-							:value="opt.value" />
-					</el-select>
-				</el-form-item>
-			</el-col> -->
-
-      <!-- 故障类型 - 数据字典  -->
-      <!-- <el-col :span="8">
-				<el-form-item
-					label="故障类型"
-					prop="faultType"
-					:rules="[
-						{
-							required: true,
-							message: '故障类型不能为空',
-							trigger: 'blur',
-						},
-					]">
-					<el-select
-						v-model="form.faultType"
-						placeholder="故障类型"
-						:disabled="disabled"
-						@change="$emit('update', form)">
-						<el-option
-							v-for="opt in getDictDatas(DICT_TYPE.FAULT_TYPE)"
-							:key="opt.value"
-							:label="opt.label"
-							:value="opt.value" />
-					</el-select>
-				</el-form-item>
-			</el-col> -->
-
-      <!-- 维修开始时间  -->
-      <!-- <el-col :span="8">
-				<el-form-item
-					label="维修开始时间"
-					prop="maintenanceStartTime"
-					:rules="[
-						{
-							required: true,
-							message: '维修开始时间不能为空',
-							trigger: 'blur',
-						},
-					]">
-					<el-date-picker
-						v-model="form.maintenanceStartTime"
-						type="datetime"
-						:disabled="disabled"
-						:placeholder="`请选择维修开始时间`"
-						value-format="timestamp"
-						format="yyyy-MM-dd HH:mm:ss"
-						clearable
-						@change="$emit('update', form)" />
-				</el-form-item>
-			</el-col> -->
-
-      <!-- 维修结束时间  -->
-      <!-- <el-col :span="8">
-				<el-form-item
-					label="维修结束时间"
-					prop="maintenanceFinishTime"
-					:rules="[
-						{
-							required: true,
-							message: '维修结束时间不能为空',
-							trigger: 'blur',
-						},
-					]">
-					<el-date-picker
-						v-model="form.maintenanceFinishTime"
-						type="datetime"
-						:disabled="disabled"
-						:placeholder="`请选择维修结束时间`"
-						value-format="timestamp"
-						format="yyyy-MM-dd HH:mm:ss"
-						clearable
-						@change="$emit('update', form)" />
-				</el-form-item>
-			</el-col> -->
       <el-col :span="8">
         <el-form-item label="维修时长(h)" prop="maintenanceDuration">
           <el-input-number v-model="dataForm.maintenanceDuration" :min="0" controls-position="right" style="width: 100%"
@@ -433,8 +333,8 @@ export default {
 			sectionOptions: [],
 			lineOptions: [],
 			uploadOpen: false,
-			uploadUrl: process.env.VUE_APP_BASE_API + '/admin-api/infra/file/upload', // 上传有关的headers,url都是固定的
-			uploadHeaders: { Authorization: 'Bearer ' + getAccessToken() },
+      uploadHeaders: { Authorization: 'Bearer ' + getAccessToken() },
+      uploadUrl: process.env.VUE_APP_BASE_API + '/admin-api/infra/file/upload', // 上传有关的headers,url都是固定的
 		};
 	},
 	watch: {
@@ -633,17 +533,17 @@ export default {
 
 		handleUploadSuccess(response, file, prop) {
 			console.log('response', response);
-			if (response.code != 0) {
-				this.$modal.msgError('上传失败: ', response.msg || '-');
-				return;
-			}
-			this.form.files.push({
-				fileName: file.name,
-				fileUrl: response.data,
-				fileType: prop == 'files' ? 2 : 1,
-			});
-			this.$modal.msgSuccess('上传成功');
-			this.$emit('update', this.form);
+			// if (response.code != 0) {
+			// 	this.$modal.msgError('上传失败: ', response.msg || '-');
+			// 	return;
+			// }
+      this.form.files.push({
+        fileName: file.name,
+        fileUrl: response.data,
+        fileType: prop == 'files' ? 2 : 1,
+      });
+      this.$modal.msgSuccess('上传成功');
+      this.$emit('update', this.form);
 		},
 
 		handleDeleteFile(file, prop) {
diff --git a/src/views/equipment/base/repair/detail-btn.vue b/src/views/equipment/base/repair/detail-btn.vue
new file mode 100644
index 00000000..6aec06da
--- /dev/null
+++ b/src/views/equipment/base/repair/detail-btn.vue
@@ -0,0 +1,53 @@
+<!--
+ * @Author: zhp
+ * @Date: 2023-11-08 14:00:52
+ * @LastEditTime: 2023-12-01 10:12:27
+ * @LastEditors: DY
+ * @Description:
+-->
+<template>
+  <div>
+    <el-button type="text" @click="handleDetail">查看更多</el-button>
+    <CustomDialogForm v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getList" />
+  </div>
+</template>
+
+<script>
+import CustomDialogForm from './CustomDialogForm.vue';
+
+export default {
+  name: 'EquipmentRepairDetail',
+  components: { CustomDialogForm },
+  props: {
+    injectData: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data() {
+    return {
+      addOrUpdateVisible:false,
+    }
+  },
+  mounted() {
+    this.getContent()
+  },
+
+  methods: {
+    handleDetail() {
+      // this.reset();
+      // const id = row.id;
+      // this.info({ id }).then((response) => {
+      // 	this.form = response.data;
+      // 	// this.form.repairman = this.form.repairman.split(',')
+      // 	this.open = true;
+      // 	this.title = '修改维修记录';
+      // });
+      this.addOrUpdateVisible = true
+      this.$nextTick(() => {
+        this.$refs.addOrUpdate.init({ id: this.injectData.id });
+      });
+    },
+  }
+}
+</script>
diff --git a/src/views/equipment/base/repair/detail.vue b/src/views/equipment/base/repair/detail.vue
new file mode 100644
index 00000000..85ed57e3
--- /dev/null
+++ b/src/views/equipment/base/repair/detail.vue
@@ -0,0 +1,421 @@
+<!--
+    filename: dialogForm.vue
+    author: liubin
+    date: 2023-10-31 15:55:13
+    description:
+-->
+
+<template>
+  <!-- <el-drawer :visible.sync="visible" :show-close="false" :wrapper-closable="disabled" class="drawer"
+    custom-class="mes-drawer" size="50%" @closed="$emit('destroy')"> -->
+  <el-dialog :visible.sync="visible" width="50%" :before-close="closed">
+    <small-title slot="title" :no-padding="true">
+      详情
+      <!-- {{ disabled ? '查看详情' : !dataForm.maintenanceStatus ? '修改' : '完成' }} -->
+    </small-title>
+    <div class="drawer-body flex">
+      <div class="drawer-body__content">
+        <div>
+          <el-row :gutter="20">
+            <el-col :span="6">
+              <div class="blodTip">维修单号</div>
+              <div class="lightTip">{{ dataForm.repairOrderNumber }}</div>
+            </el-col>
+            <el-col :span="6">
+              <div class="blodTip">产线名</div>
+              <div class="lightTip">{{  dataForm.lineName }}</div>
+            </el-col>
+            <el-col :span="6">
+              <div class="blodTip">工段名</div>
+              <div class="lightTip">{{ dataForm.sectionName }}</div>
+            </el-col>
+            <!-- <el-col :span="6">
+              <div class="blodTip">维修工</div>
+              <div class="lightTip">{{ dataForm.repairman }}</div>
+            </el-col> -->
+          </el-row>
+          <el-row :gutter="20">
+            <el-col :span="6">
+              <div class="blodTip">故障发生时间</div>
+              <div class="lightTip">{{ parseTime(dataForm.faultTime) }}</div>
+            </el-col>
+            <el-col :span="6">
+              <div class="blodTip">故障级别</div>
+              <div class="lightTip">{{ getDictDataLabel('fault-level', dataForm.faultLevel) }}</div>
+            </el-col>
+            <el-col :span="6">
+              <div class="blodTip">故障类型</div>
+              <div class="lightTip">{{ getDictDataLabel('fault-type', dataForm.faultType) }}</div>
+            </el-col>
+            <el-col :span="6">
+              <div class="blodTip">维修工</div>
+              <div class="lightTip">{{ dataForm.repairman }}</div>
+            </el-col>
+          </el-row>
+          <el-row :gutter="20">
+            <el-col :span="6">
+              <div class="blodTip">联系方式</div>
+              <div class="lightTip">{{ dataForm.repairmanPhone }}</div>
+            </el-col>
+            <el-col :span="6">
+              <div class="blodTip">维修方式</div>
+              <div class="lightTip">{{ getDictDataLabel('repair-mode', dataForm.repairMode) }}</div>
+            </el-col>
+            <el-col :span="6">
+              <div class="blodTip">创建时间</div>
+              <div class="lightTip">{{ parseTime(dataForm.createTime) }}</div>
+            </el-col>
+            <el-col :span="6">
+              <div class="blodTip">创建人</div>
+              <div class="lightTip">{{ dataForm.creator }}</div>
+            </el-col>
+          </el-row>
+          <el-row>
+            <div class="blodTip">备注</div>
+            <div class="lightTip">{{ dataForm.remark }}</div>
+          </el-row>
+          <el-row>
+            <div class="blodTip">维修附件</div>
+            <div v-if="dataForm.files && dataForm.files.length > 0">
+              <uploadedFile class="file" v-for="file in dataForm.files" :file="file" :key="file.fileUrl"
+                :disabled="disabled" @delete="!disabled && handleDeleteFile(file, col.prop)" />
+            </div>
+            <p v-else>暂无附件</p>
+          </el-row>
+        </div>
+        <!-- <el-divider style="margin-top: -10px" />
+        <small-title style="margin: 16px 0; padding-left: 8px" :no-padding="true">
+          {{ '设备维修信息' }}
+        </small-title> -->
+        <!-- <el-form ref="form" :model="dataForm" label-width="100px" label-position="top" v-loading="formLoading">
+          <el-row :gutter="20">
+            <el-col :span="6">
+              <el-form-item label="维修开始时间" prop="maintenanceStartTime"
+                :rules="[{ required: true, message: '维修开始时间不能为空', trigger: 'blur' }]">
+                <el-date-picker v-model="dataForm.maintenanceStartTime" type="datetime" :disabled="disabled"
+                  placeholder="请选择维修开始时间" value-format="timestamp" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="维修结束时间" prop="maintenanceFinishTime"
+                :rules="[{ required: true, message: '维修结束时间不能为空', trigger: 'blur' }]">
+                <el-date-picker v-model="dataForm.maintenanceFinishTime" type="datetime" :disabled="disabled"
+                  placeholder="请选择维修开始时间" value-format="timestamp" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="维修方式" prop="repairMode"
+                :rules="[{ required: true, message: '维修方式不能为空', trigger: 'blur' }]">
+                <el-select :disabled="disabled" v-model="dataForm.repairMode" placeholder="请选择维修方式">
+                  <el-option v-for="opt in getDictDatas('repair-mode')" :key="opt.value" :label="opt.label"
+                    :value="opt.value" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="故障类型" prop="faultType">
+                <el-select :disabled="disabled" v-model="dataForm.faultType" placeholder="请选择故障类型">
+                  <el-option v-for="opt in getDictDatas('fault-type')" :key="opt.value" :label="opt.label"
+                    :value="opt.value" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col>
+              <el-form-item label="故障明细" prop="faultDetail"
+                :rules="[{ required: true, message: '故障明细不能为空', trigger: 'blur' }]">
+                <editor v-model="dataForm.faultDetail" :read-only="disabled" :min-height="150" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col>
+              <el-form-item label="维修记录" prop="maintenanceDetail">
+                <editor v-model="dataForm.maintenanceDetail" :read-only="disabled" :min-height="150" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col>
+              <el-form-item label="维修附件" prop="file">
+                <FileUpload v-model="file" :limit="1" :f-name="fileName" :disabled="disabled" @name="setFileName" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col>
+              <el-form-item label="备注" prop="remark">
+                <el-input v-model="dataForm.remark" :placeholder="`请输入备注`" :disabled="disabled" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form> -->
+
+        <!-- <div v-if="!disabled" class="drawer-body__footer">
+          <el-button style="" @click="goback()">取消</el-button>
+          <el-button type="primary" @click="dataFormSubmit()">确定</el-button>
+        </div> -->
+      </div>
+    </div>
+    <span slot="footer" class="dialog-footer">
+      <el-button @click="visible = false">取 消</el-button>
+    </span>
+  </el-dialog>
+  <!-- </el-drawer> -->
+</template>
+
+<script>
+import SmallTitle from '../../base/alarm/Record/SmallTitle.vue';
+import { getEqRepair, updateEqRepair } from '@/api/equipment/base/repair'
+import Editor from "@/components/Editor";
+// import FileUpload from "@/components/FileUpload";
+import { getDictDatas } from "@/utils/dict";
+import { parseTime } from '@/utils/ruoyi'
+import { getDictDataLabel } from '@/utils/dict';
+import tupleImg from '@/assets/images/tuple.png';
+
+const uploadedFile = {
+  name: 'UploadedFile',
+  props: ['file', 'disabled'],
+  data() {
+    return {};
+  },
+  methods: {
+    handleDelete() {
+      this.$emit('delete', this.file);
+    },
+    async handleDownload() {
+      const data = await this.$axios({
+        url: this.file.fileUrl,
+        method: 'get',
+        responseType: 'blob',
+      });
+
+      await this.$message.success('开始下载');
+      // create download link
+      const url = window.URL.createObjectURL(data);
+      const link = document.createElement('a');
+      link.href = url;
+      link.download = this.file.fileName;
+      document.body.appendChild(link);
+      link.click();
+      document.body.removeChild(link);
+    },
+  },
+  mounted() {
+  },
+  render: function (h) {
+    return (
+      <div
+        title={this.file.fileName}
+        onClick={this.handleDownload}
+        style={{
+          background: `url(${tupleImg}) no-repeat`,
+          backgroundSize: '14px',
+          backgroundPosition: '0 55%',
+          paddingLeft: '20px',
+          paddingRight: '24px',
+          textOverflow: 'ellipsis',
+          whiteSpace: 'nowrap',
+          overflow: 'hidden',
+          cursor: 'pointer',
+          display: 'inline-block',
+        }}>
+        {this.file.fileName}
+        {!this.disabled && (
+          <el-button
+            type="text"
+            icon="el-icon-close"
+            style="float: right; position: relative; top: 2px; left: 8px; z-index: 100"
+            class="dialog__upload_component__close"
+            onClick={this.handleDelete}
+          />
+        )}
+      </div>
+    );
+  },
+};
+
+export default {
+  name: 'DialogForm',
+  model: {
+    prop: 'dataForm',
+    event: 'update',
+  },
+  emits: ['update'],
+  components: { SmallTitle, Editor, uploadedFile },
+  props: {
+    // dataForm: {
+    // 	type: Object,
+    // 	default: () => ({}),
+    // },
+    // disabled: {
+    // 	type: Boolean,
+    // 	default: false
+    // },
+  },
+  data() {
+    return {
+      formLoading: true,
+      visible: false,
+      disabled: false,
+      dataForm: {},
+      file: '',
+      fileName: ''
+    };
+  },
+  mounted() { },
+  methods: {
+    closed() {
+      this.$emit('destroy')
+    },
+    setFileName(val) {
+      this.fileName = val
+    },
+    goback() {
+      this.$emit('refreshDataList');
+      this.visible = false;
+    },
+    goEdit() {
+      this.disabled = false;
+    },
+    /** 模拟透传 ref  */
+    validate(cb) {
+      return this.$refs.form.validate(cb);
+    },
+    resetFields(args) {
+      return this.$refs.form.resetFields(args);
+    },
+    initData() {
+      this.file = ''
+      this.fileName = ''
+    },
+    init(row, isdetail) {
+      this.initData();
+      this.disabled = isdetail || false;
+      this.dataForm.id = row.id || undefined;
+      this.visible = true;
+
+      this.$nextTick(() => {
+        // this.$refs['form'].resetFields();
+
+        if (this.dataForm.id) {
+          // 获取设备维修
+          getEqRepair(this.dataForm.id).then(response => {
+            this.formLoading = false
+            this.dataForm = response.data;
+            // this.dataForm.maintenanceStatus = row.maintenanceStatus || 0
+            // if (this.dataForm.files.length > 0) {
+            //   this.file = this.dataForm.files[0].fileUrl
+            //   this.fileName = this.dataForm.files[0].fileName
+            // }
+          });
+        } else {
+          // if (this.urlOptions.isGetCode) {
+          //   this.getCode()
+          // }
+        }
+      });
+    },
+    // 表单提交
+    dataFormSubmit() {
+      this.$refs["form"].validate((valid) => {
+        if (!valid) {
+          return false;
+        }
+        // 修改的提交
+        if (this.file) {
+          const temp = this.file.split(',') // 获取文件个数
+          let arry = []
+          temp.forEach(item => {
+            arry.push({
+              fileName: this.fileName,
+              fileType: 2,
+              fileUrl: item
+            })
+          })
+          this.dataForm.files = arry
+        }
+        if (this.dataForm.id) {
+          updateEqRepair(this.dataForm).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.visible = false;
+            this.$emit("refreshDataList");
+          });
+          return;
+        }
+        // 添加的提交
+        // this.urlOptions.createURL(this.dataForm).then(response => {
+        //   this.$modal.msgSuccess("新增成功");
+        //   this.visible = false;
+        //   this.$emit("refreshDataList");
+        // });
+      });
+    },
+  },
+};
+</script>
+
+<style scoped>
+.drawer>>>.el-drawer {
+  border-radius: 8px 0 0 8px;
+}
+
+.drawer>>>.el-drawer__header {
+  margin: 0;
+  padding: 32px 32px 24px;
+  border-bottom: 1px solid #dcdfe6;
+  margin-bottom: 0px;
+}
+
+.small-title::before {
+  content: '';
+  display: inline-block;
+  vertical-align: top;
+  width: 4px;
+  height: 22px;
+  border-radius: 1px;
+  margin-right: 8px;
+  background-color: #0b58ff;
+}
+
+.drawer-body {
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+}
+
+.drawer-body__content {
+  flex: 1;
+  /* background: #eee; */
+  padding: 5px 10px;
+  overflow-y: auto;
+}
+
+.drawer-body__footer {
+  display: flex;
+  justify-content: flex-end;
+  padding: 18px;
+}
+
+.blodTip {
+  height: 16px;
+  font-size: 14px;
+  font-weight: 600;
+  color: rgba(0, 0, 0, 0.85);
+  margin-bottom: 8px;
+}
+
+.lightTip {
+  /* height: 16px; */
+  font-size: 14px;
+  font-weight: 400;
+  color: rgba(102, 102, 102, 0.75);
+  margin-bottom: 12px;
+}
+</style>
diff --git a/src/views/equipment/base/repair/index.vue b/src/views/equipment/base/repair/index.vue
index 9bdb5690..b4aed842 100644
--- a/src/views/equipment/base/repair/index.vue
+++ b/src/views/equipment/base/repair/index.vue
@@ -1,54 +1,26 @@
 <template>
-	<div class="app-container">
-		<!-- 搜索工作栏 -->
-		<SearchBar
-			:formConfigs="searchBarFormConfig"
-			ref="search-bar"
-			@headBtnClick="handleSearchBarBtnClick" />
+  <div class="app-container">
+    <!-- 搜索工作栏 -->
+    <SearchBar :formConfigs="searchBarFormConfig" ref="search-bar" @headBtnClick="handleSearchBarBtnClick" />
 
-		<!-- 列表 -->
-		<base-table
-			:table-props="tableProps"
-			:page="queryParams.pageNo"
-			:limit="queryParams.pageSize"
-			:table-data="list"
-			@emitFun="handleEmitFun"
-			:max-height="tableH">
-			<method-btn
-				v-if="tableBtn.length"
-				slot="handleBtn"
-				label="操作"
-				:width="90"
-				:method-list="tableBtn"
-				@clickBtn="handleTableBtnClick" />
-		</base-table>
+    <!-- 列表 -->
+    <base-table :table-props="tableProps" :page="queryParams.pageNo" :limit="queryParams.pageSize" :table-data="list"
+      @emitFun="handleEmitFun" :max-height="tableH">
+      <method-btn v-if="tableBtn.length" slot="handleBtn" label="操作" :width="90" :method-list="tableBtn"
+        @clickBtn="handleTableBtnClick" />
+    </base-table>
 
-		<!-- 分页组件 -->
-		<pagination
-			v-show="total > 0"
-			:total="total"
-			:page.sync="queryParams.pageNo"
-			:limit.sync="queryParams.pageSize"
-			@pagination="getList" />
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
 
-		<!-- 对话框(添加 / 修改) -->
-		<base-dialog
-			:dialogTitle="title"
-			:dialogVisible="open"
-			@close="cancel"
-			@cancel="cancel"
-			@confirm="submitForm">
-			<DialogForm
-				v-if="open"
-				ref="form"
-				v-model="form"
-				:disabled="mode == 'detail'" />
-		</base-dialog>
-		<CustomDialogForm
-			v-if="addOrUpdateVisible"
-			ref="addOrUpdate"
-			@refreshDataList="getList" />
-	</div>
+    <!-- 对话框(添加 / 修改) -->
+    <base-dialog :dialogTitle="title" :dialogVisible="open" @close="cancel" @cancel="cancel" @confirm="submitForm">
+      <DialogForm v-if="open" ref="form" v-model="form" :disabled="mode === 'detail'" />
+    </base-dialog>
+    <CustomDialogForm v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getList" />
+    <!-- <detail v-if="detailOrUpdateVisible" ref="detailOrUpdate" @refreshDataList="getList" /> -->
+  </div>
 </template>
 
 <script>
@@ -57,26 +29,31 @@ import basicPageMixin from '@/mixins/lb/basicPageMixin';
 import CustomDialogForm from './CustomDialogForm.vue';
 import { deleteRepair, exportRepairLogExcel } from '@/api/equipment/base/repair'
 import { parseTime } from '@/utils/ruoyi'
+import detailBtn from './detail-btn.vue'
 import htmls from './htmls.vue'
+// import detail from './detail.vue'
+
+
 import DialogForm from './Repair--add.vue';
 import tableHeightMixin from '@/mixins/tableHeightMixin';
 // const timeFilter = (val) => moment(val).format('yyyy-MM-DD HH:mm:ss');
 
 export default {
 	name: 'EquipmentRepair',
-	components: { CustomDialogForm, DialogForm },
+  components: { CustomDialogForm, DialogForm },
 	mixins: [basicPageMixin, tableHeightMixin],
 	data() {
 		return {
-			addOrUpdateVisible: false,
+      addOrUpdateVisible: false,
+      detailOrUpdateVisible:false,
 			searchBarKeys: ['maintenanceResult', 'createTime', 'equipmentId'],
 			tableBtn: [
-				this.$auth.hasPermi('equipment:repair:query')
-					? {
-							type: 'detail',
-							btnName: '详情',
-					  }
-					: undefined,
+				// this.$auth.hasPermi('equipment:repair:query')
+				// 	? {
+				// 			type: 'detail',
+				// 			btnName: '详情',
+				// 	  }
+				// 	: undefined,
 				// this.$auth.hasPermi('equipment:repair:finish')
 				// 	? {
 				// 			type: 'finish',
@@ -108,31 +85,33 @@ export default {
 				{ prop: 'lineName', label: '产线名', width: 120, showOverflowtooltip: true },
 				{ prop: 'sectionName', label: '工段名', width: 120, showOverflowtooltip: true },
 				{ prop: 'equipmentName', label: '设备名称', minWidth: 100, showOverflowtooltip: true },
-				{ prop: 'faultDetail', label: '故障明细', subcomponent: htmls, width: 180, showOverflowtooltip: true },
+        { prop: 'faultDetail', label: '故障明细', subcomponent: htmls, width: 180, showOverflowtooltip: true },
 				// { prop: 'maintenanceDetail', label: '维修明细', subcomponent: htmls, minWidth: 100, showOverflowtooltip: true },
 				{
-					prop: 'maintenanceStartTime',
-					label: '维修开始时间',
-					width: 150,
-					filter: parseTime,
-				},
-				{
-					prop: 'maintenanceFinishTime',
-					label: '维修结束时间',
+          prop: 'faultTime',
+					label: '故障开始时间',
 					width: 150,
 					filter: parseTime,
 				},
+				// {
+				// 	prop: 'maintenanceFinishTime',
+				// 	label: '维修结束时间',
+				// 	width: 150,
+				// 	filter: parseTime,
+				// },
 				// { prop: 'maintenanceStartTime', label: '开始时间', filter: parseTime },
-				{
-					prop: 'maintenanceResult',
-					label: '维修结果',
-					filter: (v) => (v != null ? ['成功', '失败'][v] : ''),
-				},
-				// { prop: 'maintenanceDuration', label: '维修时长(h)' },
-				{ prop: 'maintenanceDetail', label: '维修描述', subcomponent: htmls }, // 没有参数
+				// {
+				// 	prop: 'maintenanceResult',
+				// 	label: '维修结果',
+				// 	filter: (v) => (v != null ? ['成功', '失败'][v] : ''),
+				// },
+				{ prop: 'maintenanceDuration', label: '维修时长(时)' },//
+        { prop: 'maintenanceDetail', label: '维修描述', subcomponent: htmls }, // 没有参数
+
 				// { prop: 'repairman', label: '维修工', minWidth: 100, showOverflowtooltip: true },
 				// { prop: 'repairmanPhone', label: '联系方式', minWidth: 100, showOverflowtooltip: true },
-				{ prop: 'remark', label: '备注', minWidth: 90, showOverflowtooltip: true }
+        { prop: 'remark', label: '备注', minWidth: 90, showOverflowtooltip: true },
+        { prop: 'detail', label: '查看详情', subcomponent: detailBtn }, // 没有参数
 			],
 			searchBarFormConfig: [
 				{
@@ -142,16 +121,16 @@ export default {
 					param: 'equipmentId',
 					filterable: true,
 				},
-				{
-					type: 'select',
-					label: '维修结果',
-					placeholder: '请选择状态',
-					param: 'maintenanceResult',
-					selectOptions: [
-						{ name: '成功', id: '0' },
-						{ name: '失败', id: '1' }
-					],
-				},
+				// {
+				// 	type: 'select',
+				// 	label: '维修结果',
+				// 	placeholder: '请选择状态',
+				// 	param: 'maintenanceResult',
+				// 	selectOptions: [
+				// 		{ name: '成功', id: '0' },
+				// 		{ name: '失败', id: '1' }
+				// 	],
+				// },
 				// 时间段
 				{
 					type: 'datePicker',
@@ -214,7 +193,7 @@ export default {
 			// 表单参数
 			form: {},
 			basePath: '/base/equipment-repair-log',
-			mode: null
+			mode: 'add'
 		};
 	},
 	created() {
@@ -249,7 +228,7 @@ export default {
 		/** 取消按钮 */
 		cancel() {
 			this.open = false;
-			this.mode = null;
+			// this.mode = null;
 			this.reset();
 		},
 		/** 表单重置 */
@@ -369,9 +348,9 @@ export default {
 				.catch(() => {});
 		},
 		handleDetail({ id }) {
-			this.addOrUpdateVisible = true
+      this.detailOrUpdateVisible = true
 			this.$nextTick(() => {
-				this.$refs.addOrUpdate.init({id: id}, true);
+        this.$refs.detailOrUpdate.init({id: id}, true);
 			});
 		},
 		/** 导出按钮操作 */
diff --git a/src/views/equipment/base/spareParts/Config/addSparts.vue b/src/views/equipment/base/spareParts/Config/addSparts.vue
index 06edaab2..020c4227 100644
--- a/src/views/equipment/base/spareParts/Config/addSparts.vue
+++ b/src/views/equipment/base/spareParts/Config/addSparts.vue
@@ -1,8 +1,8 @@
-<!-- 
+<!--
     filename: dialogForm.vue
     author: liubin
     date: 2023-10-31 15:55:13
-    description: 
+    description:
 -->
 
 <template>
@@ -41,11 +41,11 @@
 					</el-col>
 				</el-row>
 				<el-form-item label="描述" prop="description">
-					<div v-html="dataForm.description" style="padding: 5px; margin: 0; border: 1px solid #dfdfdf" />
+					<div v-html="dataForm.description" style="padding: 5px; margin: 0; border: 1px solid #dfdfdf;" />
 					<!-- <editor v-model="dataForm.description" read-only :min-height="200"/> -->
 				</el-form-item>
 			</el-form>
-			
+
 			<div>
 				<small-title style="margin: 16px 0; padding-left: 8px" :no-padding="true">
 					{{ '备品备件' }}
@@ -78,7 +78,7 @@
 					:limit.sync="listQuery.pageSize"
 					:page-sizes="[5, 10, 15]"
 					@pagination="getList" />
-			</div>	
+			</div>
 
 			<div v-if="!disabled" class="drawer-body__footer">
 				<el-button type="primary" @click="goback()">关闭</el-button>
diff --git a/src/views/equipment/timing-diagram/status/index.vue b/src/views/equipment/timing-diagram/status/index.vue
index 245bd701..b93896ff 100644
--- a/src/views/equipment/timing-diagram/status/index.vue
+++ b/src/views/equipment/timing-diagram/status/index.vue
@@ -297,7 +297,7 @@ export default {
 						},
 					}).then(({ code, data }) => {
             if (code == 0) {
-              this.searchBarFormConfig[2].defaultSelect = null
+              this.searchBarFormConfig[1].defaultSelect = null
 							this.searchBarFormConfig[1].selectOptions = data.map((item) => {
 								return {
 									name: item.name,
diff --git a/src/views/extend/processEquMaterialBom/add-or-updata.vue b/src/views/extend/processEquMaterialBom/add-or-updata.vue
index 77800735..8d68b58e 100644
--- a/src/views/extend/processEquMaterialBom/add-or-updata.vue
+++ b/src/views/extend/processEquMaterialBom/add-or-updata.vue
@@ -177,7 +177,7 @@ export default {
         name: '',
 				equipmentId: undefined,
         equipmentCode: undefined,
-        enabled:undefined,
+        enabled:1,
         // area: undefined,
 				// specifications: undefined,
 				// processTime: 0,
diff --git a/src/views/extend/processEquValueBom/add-or-updata.vue b/src/views/extend/processEquValueBom/add-or-updata.vue
index 3abaf2e4..3b6408eb 100644
--- a/src/views/extend/processEquValueBom/add-or-updata.vue
+++ b/src/views/extend/processEquValueBom/add-or-updata.vue
@@ -1,13 +1,8 @@
 <!--
  * @Author: zwq
  * @Date: 2021-11-18 14:16:25
-<<<<<<< HEAD
  * @LastEditors: zhp
  * @LastEditTime: 2023-11-28 10:09:20
-=======
- * @LastEditors: DY
- * @LastEditTime: 2023-11-27 16:37:17
->>>>>>> projects/mes-test
  * @Description:
 -->
 <template>
diff --git a/src/views/extend/processFlow/index.vue b/src/views/extend/processFlow/index.vue
index 494fd5de..3669e8de 100644
--- a/src/views/extend/processFlow/index.vue
+++ b/src/views/extend/processFlow/index.vue
@@ -274,7 +274,8 @@ export default {
 		async handleCopy(id) {
 			this.$confirm('确认拷贝操作?', '提示', {
 				confirmButtonText: '确 认',
-				cancelButtonText: '取 消',
+        cancelButtonText: '取 消',
+        type: 'info'
 			})
 				.then(async () => {
 					const { code } = await this.http(
@@ -294,7 +295,8 @@ export default {
 		async handleDelete(id) {
 			this.$confirm('确认删除这个工艺吗?', '提示', {
 				confirmButtonText: '确 认',
-				cancelButtonText: '取 消',
+        cancelButtonText: '取 消',
+        type: 'warning'
 			})
 				.then(async () => {
 					const { code } = await this.http(
diff --git a/src/views/extend/processFlowView/components/BomSelector.vue b/src/views/extend/processFlowView/components/BomSelector.vue
index 136a06cb..9852b54e 100644
--- a/src/views/extend/processFlowView/components/BomSelector.vue
+++ b/src/views/extend/processFlowView/components/BomSelector.vue
@@ -1,8 +1,8 @@
-<!-- 
+<!--
     filename: BomSelector.vue
     author: liubin
     date: 2023-11-17 16:23:28
-    description: 
+    description:
 -->
 
 <template>
@@ -20,7 +20,7 @@
 		</el-row>
 
 		<el-row v-if="filteredBomList.length" style="border: 1px solid #ccc; display: flex">
-			<el-col :span="8">
+			<el-col :span="12">
 				<div class="select-list">
 					<div class="sl__header" style="background: #f3f4fb; padding: 12px">
 						<span style="">可分配设备</span>
@@ -47,7 +47,7 @@
 					</div>
 				</div>
 			</el-col>
-			<el-col :span="8" style="border-left: 1px solid #ccc">
+			<el-col :span="6" style="border-left: 1px solid #ccc">
 				<div class="select-list">
 					<div class="sl__header" style="background: #f3f4fb; padding: 12px">
 						<span style="">物料BOM</span>
diff --git a/src/views/extend/processFlowView/components/ProcessBomList.vue b/src/views/extend/processFlowView/components/ProcessBomList.vue
index a086d547..b22c40d3 100644
--- a/src/views/extend/processFlowView/components/ProcessBomList.vue
+++ b/src/views/extend/processFlowView/components/ProcessBomList.vue
@@ -1,8 +1,8 @@
-<!-- 
+<!--
     filename: ProcessBomList.vue
     author: liubin
     date: 2023-10-20 15:00:58
-    description: 
+    description:
 -->
 
 <template>
@@ -185,7 +185,13 @@ export default {
 			this.btnLoading = true;
 			// 现将子组件的修改提交更新至本组件
 			this.$refs.bomSelector.commit();
-			// 再提交至后端
+      // 再提交至后端
+      const equMaterialBomId = this.selectedBoms.every(item => item.equMaterialBomId !== undefined && item.equMaterialBomId !== null && item.equMaterialBomId !== '');
+      const equValueBomId = this.selectedBoms.every(item => item.equValueBomId !== undefined && item.equValueBomId !== null && item.equValueBomId !== '')
+      if (!equMaterialBomId || !equValueBomId) {
+        this.btnLoading = false
+        return this.$message.warning('请选择物料bom和参数bom');
+      }
 			this.$nextTick(async () => {
 				console.log('selectedBoms', this.selectedBoms);
 				if (this.selectedBoms.length) {
diff --git a/src/views/extend/processFlowView/components/ProcessInfo.vue b/src/views/extend/processFlowView/components/ProcessInfo.vue
index af64dc8c..2b6bfe4f 100644
--- a/src/views/extend/processFlowView/components/ProcessInfo.vue
+++ b/src/views/extend/processFlowView/components/ProcessInfo.vue
@@ -1,41 +1,42 @@
-<!-- 
+<!--
     filename: ProcessInfo.vue
     author: liubin
     date: 2023-10-20 15:00:58
-    description: 
+    description:
 -->
 
 <template>
-	<section class="process-info">
-		<SearchBar :formConfigs="searchBarFormConfig" ref="search-bar" />
+  <section class="process-info">
+    <el-button style="position: absolute;right: 30px;z-index: 9999;" type="primary" plain @click="goBack">返回</el-button>
+    <SearchBar :formConfigs="searchBarFormConfig" ref="search-bar" />
 
-		<el-row :gutter="20">
-			<el-col :span="6">
-				<InfoItem label="工艺名称" :value="form.name" />
-			</el-col>
-			<el-col :span="6">
-				<InfoItem label="产线" :value="form.lineName" />
-			</el-col>
-			<el-col :span="12">
-				<InfoItem label="工艺描述" :value="form.remark" />
-			</el-col>
-		</el-row>
+    <el-row :gutter="20">
+      <el-col :span="6">
+        <InfoItem label="工艺名称" :value="form.name" />
+      </el-col>
+      <el-col :span="6">
+        <InfoItem label="产线" :value="form.lineName" />
+      </el-col>
+      <el-col :span="12">
+        <InfoItem label="工艺描述" :value="form.remark" />
+      </el-col>
+    </el-row>
 
-		<el-row :gutter="20" style="margin-top: 12px">
-			<el-col :span="6">
-				<!-- <InfoItem label="创建人" value="xxse" /> -->
-			</el-col>
-			<el-col :span="6">
-				<InfoItem label="创建时间" :value="form.createTime" :time-format="true" />
-			</el-col>
-			<el-col :span="6">
-				<!-- <InfoItem label="更新人" value="xxse" /> -->
-			</el-col>
-			<el-col :span="6">
-				<!-- <InfoItem label="更新时间" value="2023-10-22 10:11:00" /> -->
-			</el-col>
-		</el-row>
-	</section>
+    <el-row :gutter="20" style="margin-top: 12px">
+      <el-col :span="6">
+        <!-- <InfoItem label="创建人" value="xxse" /> -->
+      </el-col>
+      <el-col :span="6">
+        <InfoItem label="创建时间" :value="form.createTime" :time-format="true" />
+      </el-col>
+      <el-col :span="6">
+        <!-- <InfoItem label="更新人" value="xxse" /> -->
+      </el-col>
+      <el-col :span="6">
+        <!-- <InfoItem label="更新时间" value="2023-10-22 10:11:00" /> -->
+      </el-col>
+    </el-row>
+  </section>
 </template>
 
 <script>
@@ -49,7 +50,9 @@ const InfoItem = {
 		return {};
 	},
 	computed: {},
-	methods: {},
+  methods: {
+
+  },
 	render: function (h) {
 		return (
 			<div style="display: flex; align-items: center; font-size: 14px; line-height: 1.5">
@@ -99,7 +102,10 @@ export default {
 				params: method === 'get' ? payload : null,
 				data: method !== 'get' ? payload : null,
 			});
-		},
+    },
+    goBack() {
+      this.$router.go(-1);
+    },
 		put(payload) {
 			return this.http(this.updateUrl, 'put', payload);
 		},
diff --git a/src/views/extend/processTraceabilityDetail/components/ProcessBomList.vue b/src/views/extend/processTraceabilityDetail/components/ProcessBomList.vue
index 9b4903ff..292c284a 100644
--- a/src/views/extend/processTraceabilityDetail/components/ProcessBomList.vue
+++ b/src/views/extend/processTraceabilityDetail/components/ProcessBomList.vue
@@ -177,7 +177,7 @@ export default {
 			immediate: true,
 			deep: true
 		}
-	},
+  },
   methods: {
     handleSearchBarBtnClick(val) {
       console.log(val)
@@ -281,7 +281,7 @@ export default {
 	},
 };
 </script>
-
+` `
 <style scoped lang="scss">
 .process-bom {
 	position: relative;
diff --git a/src/views/material/material/add-or-updata.vue b/src/views/material/material/add-or-updata.vue
index fd0f1893..8643a161 100644
--- a/src/views/material/material/add-or-updata.vue
+++ b/src/views/material/material/add-or-updata.vue
@@ -154,8 +154,15 @@ export default {
 						required: true,
 						message: '物料产品类型不能为空',
 						trigger: 'blur',
-					},
-				],
+          },
+        ],
+        specifications: [
+          {
+            required: true,
+            message: '规格不能为空',
+            trigger: 'blur',
+          },
+        ],
 			},
 		};
 	},
diff --git a/src/views/material/materialProductBom/attr-add.vue b/src/views/material/materialProductBom/attr-add.vue
index d79b3582..df32b458 100644
--- a/src/views/material/materialProductBom/attr-add.vue
+++ b/src/views/material/materialProductBom/attr-add.vue
@@ -123,8 +123,10 @@ export default {
         typeId:typeId
       }
 			const materData = await getMaterialList(listQuery);
-			this.materialList = [];
-			this.materialList = materData.data;
+      this.materialList = [];
+      console.log('materData', materData);
+
+      this.materialList = materData.data.filter(item => item.typeId === 2)
 		},
 		init(id) {
 			this.dataForm.id = id || '';
diff --git a/src/views/material/materialUseLog/add-or-updata.vue b/src/views/material/materialUseLog/add-or-updata.vue
index 6d40925d..c615cd5f 100644
--- a/src/views/material/materialUseLog/add-or-updata.vue
+++ b/src/views/material/materialUseLog/add-or-updata.vue
@@ -6,138 +6,75 @@
  * @Description:
 -->
 <template>
-	<el-form
-		:model="dataForm"
-		:rules="dataRule"
-		ref="dataForm"
-		@keyup.enter.native="dataFormSubmit()"
-		label-width="80px"
-		label-position="top">
-		<el-row :gutter="20">
-			<el-col :span="8">
-				<el-form-item label="物料名称" prop="materialId">
-					<el-select
-						v-model="dataForm.materialId"
-						placeholder="请选择物料"
-						clearable
-						filterable
-						@change="setCode"
-						style="width: 100%">
-						<el-option
-							v-for="dict in materialList"
-							:key="dict.id"
-							:label="dict.name"
-							:value="dict.id" />
-					</el-select>
-				</el-form-item>
-			</el-col>
-			<el-col :span="8">
-				<el-form-item label="物料编码" prop="materialCode">
-					<el-input
-						v-model="dataForm.materialCode"
-						clearable
-						disabled
-						placeholder="请输入物料编码" />
-				</el-form-item>
-			</el-col>
-			<el-col :span="8">
-				<el-form-item label="物料批次" prop="materialDate">
-					<el-select
-						v-model="dataForm.materialDate"
-						clearable
-						filterable
-						allow-create
-						placeholder="请选择物料批次"
-						style="width: 100%">
-						<el-option
-							v-for="dict in materialDateList"
-							:key="dict.id"
-							:label="dict.code"
-							:value="dict.code" />
-					</el-select>
-				</el-form-item>
-			</el-col>
-		</el-row>
-		<el-row :gutter="20">
-			<el-col :span="8">
-				<el-form-item label="使用设备" prop="equipmentId">
-					<el-select
-						v-model="dataForm.equipmentId"
-						clearable
-						filterable
-						placeholder="请选择使用设备"
-						style="width: 100%">
-						<el-option
-							v-for="dict in eqList"
-							:key="dict.id"
-							:label="dict.name"
-							:value="dict.id" />
-					</el-select>
-				</el-form-item>
-			</el-col>
-			<el-col :span="8">
-				<el-form-item label="使用时间" prop="useTime">
-					<el-date-picker
-						v-model="dataForm.useTime"
-						type="datetime"
-						format="yyyy-MM-dd HH:mm:ss"
-						value-format="timestamp"
-						placeholder="选择日期时间" />
-				</el-form-item>
-			</el-col>
-			<el-col :span="8">
-				<el-form-item label="操作员" prop="userNames">
-					<el-select
-						v-model="dataForm.userNames"
-						clearable
-						filterable
-						multiple
-						placeholder="请选择操作员"
-						style="width: 100%">
-						<el-option
-							v-for="dict in workersList"
-							:key="dict.id"
-							:label="dict.nickname"
-							:value="dict.nickname" />
-					</el-select>
-				</el-form-item>
-			</el-col>
-		</el-row>
-		<el-row :gutter="20">
-			<el-col :span="8">
-				<el-form-item label="使用数量" prop="num">
-					<el-input-number
-						v-model="dataForm.num"
-						clearable
-						controls-position="right"
-						placeholder="请输入使用数量"
-						style="width: 100%" />
-				</el-form-item>
-			</el-col>
-			<el-col :span="8">
-				<el-form-item label="数据来源" prop="source">
-					<el-select
-						v-model="dataForm.source"
-						clearable
-						placeholder="请选择数据来源">
-						<el-option
-							v-for="dict in this.dataSourceList"
-							:key="dict.id"
-							:label="dict.name"
-							:value="dict.id" />
-					</el-select>
-				</el-form-item>
-			</el-col>
-			<el-col :span="8">
-				<el-form-item label="备注" prop="remark">
-					<el-input
-						v-model="dataForm.remark"
-						clearable
-						placeholder="请输入备注" />
-				</el-form-item>
-			</el-col>
-		</el-row>
-	</el-form>
+  <el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataFormSubmit()" label-width="80px"
+    label-position="top">
+    <el-row :gutter="20">
+      <el-col :span="8">
+        <el-form-item label="物料名称" prop="materialId">
+          <el-select v-model="dataForm.materialId" placeholder="请选择物料" clearable filterable @change="setCode"
+            style="width: 100%">
+            <el-option v-for="dict in materialList" :key="dict.id" :label="dict.name" :value="dict.id" />
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col :span="8">
+        <el-form-item label="物料编码" prop="materialCode">
+          <el-input v-model="dataForm.materialCode" clearable disabled placeholder="请输入物料编码" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="8">
+        <el-form-item label="物料批次" prop="materialDate">
+          <el-select v-model="dataForm.materialDate" clearable filterable allow-create placeholder="请选择物料批次"
+            style="width: 100%">
+            <el-option v-for="dict in materialDateList" :key="dict.id" :label="dict.code" :value="dict.code" />
+          </el-select>
+        </el-form-item>
+      </el-col>
+    </el-row>
+    <el-row :gutter="20">
+      <el-col :span="8">
+        <el-form-item label="使用设备" prop="equipmentId">
+          <el-select v-model="dataForm.equipmentId" clearable filterable placeholder="请选择使用设备" style="width: 100%">
+            <el-option v-for="dict in eqList" :key="dict.id" :label="dict.name" :value="dict.id" />
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col :span="8">
+        <el-form-item label="使用时间" prop="useTime">
+          <el-date-picker v-model="dataForm.useTime" type="datetime" style="width: 100%" format="yyyy-MM-dd HH:mm:ss"
+            value-format="timestamp" placeholder="选择日期时间" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="8">
+        <el-form-item label="操作员" prop="userNames">
+          <el-select v-model="dataForm.userNames" clearable filterable multiple placeholder="请选择操作员"
+            style="width: 100%">
+            <el-option v-for="dict in workersList" :key="dict.id" :label="dict.nickname" :value="dict.nickname" />
+          </el-select>
+        </el-form-item>
+      </el-col>
+    </el-row>
+    <el-row :gutter="20">
+      <el-col :span="8">
+        <el-form-item label="使用数量" prop="num">
+          <el-input-number v-model="dataForm.num" clearable controls-position="right" placeholder="请输入使用数量"
+            style="width: 100%" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="8">
+        <el-form-item label="数据来源" prop="source">
+          <el-select v-model="dataForm.source" clearable placeholder="请选择数据来源" style="width: 100%">
+            <el-option v-for="dict in this.dataSourceList" :key="dict.id" :label="dict.name" :value="dict.id" />
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col :span="8">
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="dataForm.remark" clearable placeholder="请输入备注" />
+        </el-form-item>
+      </el-col>
+    </el-row>
+  </el-form>
 </template>
 
 <script>
diff --git a/src/views/packaging/custom/SmallTitle.vue b/src/views/packaging/custom/SmallTitle.vue
new file mode 100644
index 00000000..93b4a18f
--- /dev/null
+++ b/src/views/packaging/custom/SmallTitle.vue
@@ -0,0 +1,65 @@
+<!--
+ * @Author: zwq
+ * @Date: 2023-08-01 15:27:31
+ * @LastEditors: zwq
+ * @LastEditTime: 2023-08-01 16:25:54
+ * @Description:
+-->
+<template>
+	<div :class="[className, { 'p-0': noPadding }]">
+		<slot />
+	</div>
+</template>
+
+<script>
+export default {
+	props: {
+		size: {
+			// 取值范围:  xl lg md sm
+			type: String,
+			default: 'de',
+			validator: function (val) {
+				return ['xl', 'lg', 'de', 'md', 'sm'].indexOf(val) !== -1;
+			},
+		},
+		noPadding: {
+			type: Boolean,
+			default: false,
+		},
+	},
+	computed: {
+		className: function () {
+			return `${this.size}-title`;
+		},
+	},
+};
+</script>
+
+<style lang="scss" scoped>
+$pxls: (xl, 28px) (lg, 24px) (de, 20px) (md, 18px) (sm, 16px);
+$mgr: 8px;
+@each $size, $height in $pxls {
+	.#{$size}-title {
+		font-size: 18px;
+		line-height: $height;
+		color: #000;
+		font-weight: 500;
+		font-family: '微软雅黑', 'Microsoft YaHei', Arial, Helvetica, sans-serif;
+
+		&::before {
+			content: '';
+			display: inline-block;
+			vertical-align: top;
+			width: 4px;
+			height: $height + 2px;
+			border-radius: 1px;
+			margin-right: $mgr;
+			background-color: #0b58ff;
+		}
+	}
+}
+
+.p-0 {
+	padding: 0;
+}
+</style>
diff --git a/src/views/packaging/custom/index.vue b/src/views/packaging/custom/index.vue
new file mode 100644
index 00000000..97c816dc
--- /dev/null
+++ b/src/views/packaging/custom/index.vue
@@ -0,0 +1,409 @@
+<template>
+  <el-drawer :visible.sync="drawer" :append-to-body="true" size="80%" >
+    <small-title slot="title" :no-padding="true">
+      <!-- <template v-for="demo in demoList"> -->
+      <!-- <el-button :key="demo.name" :type="demo.name === curDemo ? 'primary' : ' '" @click="curDemo = demo.name"> -->
+      <!-- {{ $t('module.packingManage.printModelDesign') }} -->
+      模板设计
+      <!-- </el-button> -->
+      <!-- </template> -->
+    </small-title>
+    <el-card>
+      <el-row style="margin-bottom: 10px">
+        <el-col :span="4">
+          <!-- 模板选择 -->
+
+          <!-- <el-select
+          v-model="mode"
+          filterable
+          :default-value="0"
+          option-label-prop="label"
+          style="width: 100%;"
+          @change="changeMode"
+        >
+          <el-option v-for="(opt,idx) in modeList" :key="idx" :label="opt.name" :value="idx">
+            {{ opt.name }}
+          </el-option>
+        </el-select> -->
+        </el-col>
+        <el-col :span="20">
+          <!-- 纸张设置 -->
+          <el-button-group style="margin:0 10px">
+            <el-button v-for="(value,type) in paperTypes" :key="type" :type="curPaperType === type ? 'primary' : ' '"
+              @click="setPaper(type,value)">
+              {{ type }}
+            </el-button>
+          </el-button-group>
+          <el-input-number style="margin:0 10px" :value="scaleValue " :precision="2" :step="0.1" :min="scaleMin"
+            :max="scaleMax" @change="changeScale" />
+          <el-popover v-model="paperPopVisible" placement="bottom" width="300" title="设置纸张宽高(mm)">
+            <div style="display: flex;align-items: center;justify-content: space-between;margin-bottom: 10px">
+              <el-input v-model="paperWidth" type="number" style=" width: 100px; text-align: center" place="宽(mm)" />~
+              <el-input v-model="paperHeight" type="number" style=" width: 100px; text-align: center" place="高(mm)" />
+            </div>
+            <div>
+              <el-button type="primary" style="width: 100%" size="mini" @click="otherPaper">确定</el-button>
+            </div>
+            <el-button slot="reference" type="primary" style="margin:0 10px">自定义宽高</el-button>
+          </el-popover>
+
+          <!--          <a-button-group>-->
+          <!--            <template v-for="(value,type) in paperTypes">-->
+          <!--              <a-button :type="curPaperType === type ? 'primary' : 'info'" @click="setPaper(type,value)" :key="type">-->
+          <!--                {{ type }}-->
+          <!--              </a-button>-->
+          <!--            </template>-->
+          <!--            <a-popover v-model="paperPopVisible" title="设置纸张宽高(mm)" trigger="click">-->
+          <!--              <div slot="content">-->
+          <!--                <a-input-group compact style="margin: 10px 10px">-->
+          <!--                  <a-input type="number" v-model="paperWidth" style=" width: 100px; text-align: center"-->
+          <!--                           placeholder="宽(mm)"/>-->
+          <!--                  <a-input style=" width: 30px; border-left: 0; pointer-events: none; backgroundColor: #fff"-->
+          <!--                           placeholder="~" disabled-->
+          <!--                  />-->
+          <!--                  <a-input type="number" v-model="paperHeight" style="width: 100px; text-align: center; border-left: 0"-->
+          <!--                           placeholder="高(mm)"/>-->
+          <!--                </a-input-group>-->
+          <!--                <a-button type="primary" style="width: 100%" @click="otherPaper">确定</a-button>-->
+          <!--              </div>-->
+          <!--              <a-button :type="'other'==curPaperType?'primary':''">自定义纸张</a-button>-->
+          <!--            </a-popover>-->
+          <!--          </a-button-group>-->
+
+          <!-- 预览/打印 -->
+          <el-button-group>
+            <el-button type="primary" icon="redo" @click="rotatePaper()">旋转</el-button>
+            <el-button type="primary" icon="el-icon-view" @click="preView">
+              预览
+            </el-button>
+            <!-- <el-button type="primary" icon="el-icon-printer" @click="print">
+            直接打印
+          </el-button> -->
+            <el-button type="primary" icon="el-icon-s-management" @click="save">
+              保存
+            </el-button>
+            <el-button type="danger" icon="el-icon-delete" @click="clearPaper">
+              清空
+            </el-button>
+          </el-button-group>
+          <!-- 保存/清空 -->
+
+        </el-col>
+      </el-row>
+      <el-row :gutter="24">
+        <el-col :span="4">
+          <el-card style="height: 100vh">
+            <el-row>
+              <el-col :span="24" class="rect-printElement-types hiprintEpContainer" />
+            </el-row>
+          </el-card>
+        </el-col>
+        <el-col :span="16">
+          <el-card class="card-design">
+            <div id="hiprint-printTemplate" class="hiprint-printTemplate" />
+          </el-card>
+        </el-col>
+        <el-col :span="4" class="params_setting_container">
+          <el-card>
+            <el-row class="hinnn-layout-sider">
+              <div id="PrintElementOptionSetting" />
+            </el-row>
+          </el-card>
+        </el-col>
+      </el-row>
+      <!-- 预览 -->
+      <print-preview ref="preView" />
+    </el-card>
+  </el-drawer>
+</template>
+
+<script>
+
+import printPreview from './preview'
+import { MessageBox } from 'element-ui'
+import { hiprint } from 'vue-plugin-hiprint'
+import providers from './providers'
+// import printData from './print-data'
+import $ from 'jquery'
+import SmallTitle from './SmallTitle.vue'
+let hiprintTemplate = null
+export default {
+  name: 'PrintCustom',
+  components: { printPreview, SmallTitle },
+  // props: {
+  //   modelData: {
+  //     type: String,
+  //     default: ''
+  //   }
+  // },
+  data() {
+    return {
+      // paperPopVisible: false,
+      // 模板选择
+      mode: 0,
+      template: null,
+      modeList: [],
+      // 当前纸张
+      curPaper: {
+        // type: 'other',
+        // width: 220,
+        // height: 80
+      },
+      printData:{},
+      drawer: false,
+      // 纸张类型
+      paperTypes: {
+        'A3': {
+          width: 420,
+          height: 296.6
+        },
+        'A4': {
+          width: 210,
+          height: 297
+        },
+        'A5': {
+          width: 210,
+          height: 147.6
+        },
+        'B3': {
+          width: 500,
+          height: 352.6
+        },
+        'B4': {
+          width: 250,
+          height: 352.6
+        },
+        'B5': {
+          width: 250,
+          height: 175.6
+        }
+      },
+      scaleValue: 1,
+      scaleMax: 5,
+      scaleMin: 0.5,
+      // 自定义纸张
+      paperPopVisible: false,
+      paperWidth: '210',
+      paperHeight: '297'
+    }
+  },
+  computed: {
+    curPaperType() {
+      let type = 'other'
+      const types = this.paperTypes
+      for (const key in types) {
+        const item = types[key]
+        const { width, height } = this.curPaper
+        if (item.width === width && item.height === height) {
+          type = key
+        }
+      }
+      return type
+    }
+  },
+  created() {
+    // $('.hiprintEpContainer').empty()
+  },
+  destroyed () {
+    $('.hiprintEpContainer').empty()
+    console.log(11111)
+  },
+  methods: {
+    // handleClose() {
+    //   $('.hiprintEpContainer').empty()
+    // },
+    closed() {
+      $('.hiprintEpContainer').empty()
+      $('.hiprint-printTemplate').empty()
+    },
+    init(data) {
+      this.drawer = true
+      this.modelData = data
+      this.modeList = providers.map((e) => {
+        return { type: e.type, name: e.name, value: e.value }
+      })
+      this.changeMode()
+    },
+    changeMode() {
+      // hiprintTemplate.clear()
+      // console.log(this.modelData)
+      this.$nextTick(() => {
+        const { mode } = this
+        const provider = providers[mode]
+        hiprint.init({
+          providers: [provider.f]
+        })
+
+        // $('#hiprint-printTemplate').empty()
+        // console.log(JSON.parse(this.modelData))
+        hiprint.setConfig()
+        // 替换配置
+        hiprint.setConfig({
+          movingDistance: 2.5,
+          text: {
+            supportOptions: [
+              {
+                name: 'styler',
+                hidden: true
+              },
+              {
+                name: 'formatter',
+                hidden: true
+              }
+            ]
+          }
+        })
+
+        // console.log(this.modelData)
+        // console.log($('#hiprint-printTemplate').empty())
+        // if () {
+          // console.log(this.modelData);
+          // $('.hiprintEpContainer').empty()
+          // hiprint.PrintElementTypeManager.build('.hiprintEpContainer', provider.value)
+          // $('.hiprint-printTemplate').empty()
+          // hiprintTemplate = new hiprint.PrintTemplate({
+          //   template: JSON.parse(this.modelData),
+          //   settingContainer: '#PrintElementOptionSetting',
+          //   paginationContainer: '.hiprint-printPagination'
+          // })
+        // } else {
+          $('.hiprintEpContainer').empty()
+          console.log(this.modelData);
+          hiprint.PrintElementTypeManager.build('.hiprintEpContainer', provider.value)
+          $('.hiprint-printTemplate').empty()
+          // const templates = this.$ls.get('KEY_TEMPLATES', {})
+          const template = provider.value
+          // console.log(template)
+          hiprintTemplate = new hiprint.PrintTemplate({
+            template: this.modelData != '' ? JSON.parse(this.modelData) : {},
+            settingContainer: '#PrintElementOptionSetting',
+            paginationContainer: '.hiprint-printPagination'
+          })
+        // }
+        hiprintTemplate.design('#hiprint-printTemplate')
+        // console.log(hiprintTemplate)
+        console.log(hiprintTemplate);
+        // hiprintTemplate.design('#hiprint-printTemplate', { grid: true })
+        // 获取当前放大比例, 当zoom时传true 才会有
+        this.scaleValue = hiprintTemplate.editingPanel.scale || 1
+        // this.scaleValue = hiprintTemplate.editingPanel.scale || 1
+      })
+    },
+    /**
+     * 设置纸张大小
+     * @param type [A3, A4, A5, B3, B4, B5, other]
+     * @param value {width,height} mm
+     */
+    setPaper(type, value) {
+      try {
+        if (Object.keys(this.paperTypes).includes(type)) {
+          this.curPaper = { type: type, width: value.width, height: value.height }
+          hiprintTemplate.setPaper(value.width, value.height)
+        } else {
+          this.curPaper = { type: 'other', width: value.width, height: value.height }
+          hiprintTemplate.setPaper(value.width, value.height)
+        }
+      } catch (error) {
+        this.$message.error(`操作失败: ${error}`)
+      }
+    },
+    changeScale(currentValue, oldValue) {
+      let big = false
+      currentValue <= oldValue ? big = false : big = true
+      let scaleValue = this.scaleValue
+      if (big) {
+        scaleValue += 0.1
+        if (scaleValue > this.scaleMax) scaleValue = 5
+      } else {
+        scaleValue -= 0.1
+        if (scaleValue < this.scaleMin) scaleValue = 0.5
+      }
+      if (hiprintTemplate) {
+        // scaleValue: 放大缩小值, false: 不保存(不传也一样), 如果传 true, 打印时也会放大
+        hiprintTemplate.zoom(scaleValue)
+        this.scaleValue = scaleValue
+      }
+    },
+    clearPaper() {
+      MessageBox.confirm('是否确认清空模板信息?', '警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        try {
+          hiprintTemplate.clear()
+        } catch (error) {
+          this.$message.error(`操作失败: ${error}`)
+        }
+      }).catch((err) => {
+        console.log(err)
+      })
+    },
+    otherPaper() {
+      const value = {}
+      value.width = this.paperWidth
+      value.height = this.paperHeight
+      this.paperPopVisible = false
+      this.setPaper('other', value)
+    },
+    rotatePaper() {
+      if (hiprintTemplate) {
+        hiprintTemplate.rotatePaper()
+      }
+    },
+    preView() {
+      const { width } = this.curPaper
+      this.$refs.preView.show(hiprintTemplate, this.printData, width)
+    },
+    print() {
+      // if (window.hiwebSocket.opened) {
+      const printerList = hiprintTemplate.getPrinterList()
+      console.log(printerList)
+      hiprintTemplate.print2(this.printData, { printer: '', title: '预览打印' })
+      // return
+      // }
+      // this.$message.error('客户端未连接,无法直接打印')
+    },
+    save() {
+      // console.log(hiprintTemplate.getJson())
+      const { mode } = this
+      const provider = providers[mode]
+      // console.log(hiprintTemplate.getJson())
+      this.setTemplate({
+        name: provider.value,
+        json: hiprintTemplate.getJson()
+      })
+    },
+    setTemplate(payload) {
+      // const templates = this.$ls.get('KEY_TEMPLATES', {})
+      // console.log(payload.json)
+      // templates[payload.name] = payload.json
+      // this.$ls.set('KEY_TEMPLATES', templates)
+      this.$message.info('保存成功')
+      // console.log(JSON.stringify(payload.json))
+      this.drawer = false
+      this.$emit('saveData', payload.json)
+      $('.hiprintEpContainer').empty()
+      // this.$parent.$parent.getModelData(payload.json)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+// build 拖拽
+::v-deep .hiprint-printElement-type >li>ul>li>a {
+  padding: 4px 4px;
+  color: #1296db;
+  line-height: 1;
+  height: auto;
+  text-overflow: ellipsis;
+}
+// 设计容器
+.card-design {
+  // overflow: hidden;
+  overflow-x: auto;
+  overflow-y: auto;
+}
+
+</style>
diff --git a/src/views/packaging/custom/preview.vue b/src/views/packaging/custom/preview.vue
new file mode 100644
index 00000000..f7d18de2
--- /dev/null
+++ b/src/views/packaging/custom/preview.vue
@@ -0,0 +1,89 @@
+<!--
+ * @Author: zhp
+ * @Date: 2023-09-27 14:23:54
+ * @LastEditTime: 2023-10-19 11:20:36
+ * @LastEditors: zhp
+ * @Description:
+-->
+<template>
+  <el-dialog :visible="visible" :mask-closable="false" width="50%" @close="hideModal" :append-to-body="true">
+    <div id="preview_content" />
+    <template slot="title">
+      <div style="margin-right: 20px">打印预览</div>
+      <el-button :loading="waitShowPrinter" type="primary" icon="printer" @click.stop="print">打印</el-button>
+      <el-button type="primary" icon="printer" @click.stop="toPdf">pdf</el-button>
+    </template>
+    <template slot="footer">
+      <el-button key="close" type="info" @click="hideModal">
+        关闭
+      </el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  name: 'PrintPreview',
+  props: {},
+  data() {
+    return {
+      visible: false,
+      spinning: true,
+      waitShowPrinter: false,
+      // 纸张宽 mm
+      width: 0,
+      // 模板
+      hiprintTemplate: {},
+      // 数据
+      printData: {}
+    }
+  },
+  computed: {},
+  watch: {},
+  created() {
+  },
+  mounted() {
+  },
+  methods: {
+    hideModal() {
+      this.visible = false
+    },
+    show(hiprintTemplate, printData, width = '210') {
+      this.visible = true
+      this.spinning = true
+      this.width = width
+      this.hiprintTemplate = hiprintTemplate
+      this.printData = printData
+      console.log(hiprintTemplate)
+      console.log(printData)
+      setTimeout(() => {
+        // eslint-disable-next-line no-undef
+        $('#preview_content').html(hiprintTemplate.getHtml(printData))
+        this.spinning = false
+      }, 500)
+    },
+    print() {
+      this.waitShowPrinter = true
+      this.hiprintTemplate.print(this.printData, {}, {
+        callback: () => {
+          console.log('callback')
+          this.waitShowPrinter = false
+        }
+      })
+    },
+    toPdf() {
+      this.hiprintTemplate.toPdf({}, '打印预览')
+    }
+  }
+}
+
+</script>
+<!-- <style lang="less" scoped>
+/deep/ .ant-modal-body {
+  padding: 0px;
+}
+
+/deep/ .ant-modal-content {
+  margin-bottom: 24px;
+}
+</style> -->
diff --git a/src/views/packaging/custom/print-data.js b/src/views/packaging/custom/print-data.js
new file mode 100644
index 00000000..077f8388
--- /dev/null
+++ b/src/views/packaging/custom/print-data.js
@@ -0,0 +1,90 @@
+/*
+ * @Author: zhp
+ * @Date: 2023-09-27 14:23:54
+ * @LastEditTime: 2023-09-27 14:29:59
+ * @LastEditors: zhp
+ * @Description:
+ */
+export default {
+  totalCap: '壹佰元整',
+  test: {
+    a: '111',
+    b: '222',
+    longText: '浙江在线3月29日讯最近,\n一篇小学五年级学生写的作文引起了钱报记者的关注这篇作文的题目叫做《脏话风波》,讲述的是小作者班级里发生的一种不文明现象——讲脏话的同学越来越多,有的人说话甚至句句“带把儿”。班主任为了遏制这种现象,煞费苦心想了很多办法,跟学生斗智斗勇……看到这篇作文,记者突然想到,自己读六年级的儿子有天突然冒出一句脏话。此前,他是从不说脏话的。问他怎么学会的,他也说不出个所以然来。于是,记者做了这个小学生脏话现象调查。经过了解才发现,小学生爱说脏话竟然较为普遍,一般三年级会冒出苗头。无论是学习成绩好的,还是平时不太起眼的,都会说脏话。而且,说脏话会“传染”,一旦冒头不制止,到了五六年级甚至可能在班里大爆发。以下为作文《脏话风波》浙江在线3月29日讯最近,一篇小学五年级学生写的作文引起了钱报记者的关注。这篇作文的题目叫做《脏话风波》,讲述的是小作者班级里发生的一种不文明现象——讲脏话的同学越来越多,有的人说话甚至句句“带把儿”。班主任为了遏制这种现象,煞费苦心想了很多办法,跟学生斗智斗勇……看到这篇作文,记者突然想到,自己读六年级的儿子有天突然冒出一句脏话。此前,他是从不说脏话的。问他怎么学会的,他也说不出个所以然来。于是,记者做了这个小学生脏话现象调查。经过了解才发现,小学生爱说脏话竟然较为普遍,一般三年级会冒出苗头。无论是学习成绩好的,还是平时不太起眼的,都会说脏话。而且,说脏话会“传染”,一旦冒头不制止,到了五六年级甚至可能在班里大爆发。以下为作文《脏话风波》浙江在线3月29日讯最近,一篇小学五年级学生写的作文引起了钱报记者的关注。这篇作文的题目叫做《脏话风波》,讲述的是小作者班级里发生的一种不文明现象——讲脏话的同学越来越多,有的人说话甚至句句“带把儿”。班主任为了遏制这种现象,煞费苦心想了很多办法,跟学生斗智斗勇……看到这篇作文,记者突然想到,自己读六年级的儿子有天突然冒出一句脏话。此前,他是从不说脏话的。问他怎么学会的,他也说不出个所以然来。于是,记者做了这个小学生脏话现象调查。经过了解才发现,小学生爱说脏话竟然较为普遍,一般三年级会冒出苗头。无论是学习成绩好的,还是平时不太起眼的,都会说脏话。而且,说脏话会“传染”,一旦冒头不制止,到了五六年级甚至可能在班里大爆发。以下为作文《脏话风波》浙江在线3月29日讯最近,一篇小学五年级学生写的作文引起了钱报记者的关注。这篇作文的题目叫做《脏话风波》,讲述的是小作者班级里发生的一种不文明现象——讲脏话的同学越来越多,有的人说话甚至句句“带把儿”。班主任为了遏制这种现象,煞费苦心想了很多办法,跟学生斗智斗勇……看到这篇作文,记者突然想到,自己读六年级的儿子有天突然冒出一句脏话。此前,他是从不说脏话的。问他怎么学会的,他也说不出个所以然来。于是,记者做了这个小学生脏话现象调查。经过了解才发现,小学生爱说脏话竟然较为普遍,一般三年级会冒出苗头。无论是学习成绩好的,还是平时不太起眼的,都会说脏话。而且,说脏话会“传染”,一旦冒头不制止,到了五六年级甚至可能在班里大爆发。以下为作文《脏话风波》浙江在线3月29日讯最近,一篇小学五年级学生写的作文引起了钱报记者的关注。这篇作文的题目叫做《脏话风波》,讲述的是小作者班级里发生的一种不文明现象——讲脏话的同学越来越多,有的人说话甚至句句“带把儿”。班主任为了遏制这种现象,煞费苦心想了很多办法,跟学生斗智斗勇……看到这篇作文,记者突然想到,自己读六年级的儿子有天突然冒出一句脏话。此前,他是从不说脏话的。问他怎么学会的,他也说不出个所以然来。于是,记者做了这个小学生脏话现象调查。经过了解才发现,小学生爱说脏话竟然较为普遍,一般三年级会冒出苗头。无论是学习成绩好的,还是平时不太起眼的,都会说脏话。而且,说脏话会“传染”,一旦冒头不制止,到了五六年级甚至可能在班里大爆发。以下为作文讲述的是小作者班级里发生的一种不文明现象——讲脏话的同学越来越多,有的人说话甚至句句“带把儿”。班主任为了遏制这种现象,煞费苦心想了很多办法,跟学生斗智斗勇……看到这篇作文,记者突然想到,自己读六年级的儿子有天突然冒出一句脏话。此前,他是从不说脏话的。问他怎么学会的,他也说不出个所以然来。于是,记者做了这个小学生脏话现象调查。经过了解才发现,小学生爱说脏话竟然较为普遍,一般三年级会冒出苗头。无论是学习成绩好的,还是平时不太起眼的,都会说脏话。而且,说脏话会“传染”,一旦冒头不制止,到了五六年级甚至可能在班里大爆发。以下为作文经过了解才发现,小学生爱说脏话竟然较为普遍,一般三年级会冒出苗头。无论是学习成绩好的,还是平时不太起眼的,都会说脏话。而且,说脏话会“传染”,一旦冒头不制止,到了五六年级甚至可能在班里大爆发。以下为作文讲述的是小作者班级里发生的一种不文明现象——讲脏话的同学越来越多,有的人说话甚至句句“带把儿”。班主任为了遏制这种现象,煞费苦心想了很多办法,跟学生斗智斗勇……看到这篇作文,记者突然想到,自己读六年级的儿子有天突然冒出一句脏话。此前,他是从不说脏话的。问他怎么学会的,他也说不出个所以然来。于是,记者做了这个小学生脏话现象调查。经过了解才发现,小学生爱说脏话竟然较为普遍,一般三年级会冒出苗头。无论是学习成绩好的,还是平时不太起眼的,都会说脏话。而且,说脏话会“传染”,一旦冒头不制止,到了五六年级甚至可能在班里大爆发。以下为作文'
+  },
+  testaaa: {
+    a: {
+      b: {
+        c: {
+          d: 'dddddddddddd'
+        }
+      }
+    }
+  },
+  table_test: {
+    a: [
+      { NAME: '测试商品01', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品02', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品03', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品04', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品05', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品06', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品07', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品08', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品09', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品10', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品11', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品12', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品13', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品14', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品15', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品16', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品17', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品18', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品19', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品20', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品21', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品22', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品23', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品24', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品25', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品26', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品27', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品28', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品29', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+      { NAME: '测试商品30', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }
+    ]
+  },
+  table: [
+    { NAME: '测试商品01', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品02', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品03', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品04', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品05', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品06', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品07', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品08', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品09', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品10', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品11', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品12', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品13', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品14', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品15', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品16', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品17', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品18', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品19', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品20', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品21', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品22', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品23', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品24', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品25', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品26', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品27', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品28', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品29', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' },
+    { NAME: '测试商品30', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }
+  ]
+}
diff --git a/src/views/packaging/custom/providers.js b/src/views/packaging/custom/providers.js
new file mode 100644
index 00000000..a37fb60f
--- /dev/null
+++ b/src/views/packaging/custom/providers.js
@@ -0,0 +1,245 @@
+/* eslint-disable */
+import {hiprint} from 'vue-plugin-hiprint'
+
+/* eslint-disable */
+// import {hiprint} from '../../index'
+
+// 自定义设计元素1
+export const aProvider = function (ops) {
+  var addElementTypes = function (context) {
+    context.removePrintElementTypes("aProviderModule");
+    context.addPrintElementTypes(
+      "aProviderModule",
+      [
+        new hiprint.PrintElementTypeGroup("平台", [
+          {
+            tid: 'aProviderModule.header', title: '单据表头', data: '单据表头', type: 'text',
+            options: {
+              testData: '单据表头',
+              height: 17,
+              fontSize: 16.5,
+              fontWeight: "700",
+              textAlign: "center",
+              hideTitle: true
+            }
+          },
+          {
+            tid: 'aProviderModule.type', title: '单据类型', data: '单据类型', type: 'text',
+            options: {
+              testData: '单据类型',
+              height: 16,
+              fontSize: 15,
+              fontWeight: "700",
+              textAlign: "center",
+              hideTitle: true
+            }
+          },
+          {
+            tid: 'aProviderModule.order', title: '订单编号', data: 'XS888888888', type: 'text',
+            options: {
+              field: 'orderId',
+              testData: 'XS888888888',
+              height: 16,
+              fontSize: 6.75,
+              fontWeight: "700",
+              textAlign: "left",
+              textContentVerticalAlign: "middle"
+            }
+          },
+          {
+            tid: 'aProviderModule.date', title: '业务日期', data: '2020-01-01', type: 'text',
+            options: {
+              field: 'date',
+              testData: '2020-01-01',
+              height: 16,
+              fontSize: 6.75,
+              fontWeight: "700",
+              textAlign: "left",
+              textContentVerticalAlign: "middle"
+            }
+          },
+          {
+            tid: 'aProviderModule.barcode', title: '条形码', data: 'XS888888888', type: 'text',
+            options: {
+              field: 'barcode',
+              testData: 'XS888888888',
+              height: 32,
+              fontSize: 12,
+              lineHeight: 18,
+              textType: "barcode"
+            }
+          },
+          {
+            tid: 'aProviderModule.qrcode', title: '二维码', data: 'XS888888888', type: 'text',
+            options: {
+              field: 'qrcode',
+              testData: 'XS888888888',
+              height: 32,
+              fontSize: 12,
+              lineHeight: 18,
+              textType: "qrcode"
+            }
+          },
+          {
+            tid: 'aProviderModule.platform', title: '平台名称', data: '平台名称', type: 'text',
+            options: {
+              testData: '平台名称',
+              height: 17,
+              fontSize: 16.5,
+              fontWeight: "700",
+              textAlign: "center",
+              hideTitle: true
+            }
+          },
+          {tid: 'aProviderModule.logo', title: 'Logo', data: '', type: 'image'},
+        ]),
+        new hiprint.PrintElementTypeGroup("库管", [
+          {
+            tid: 'aProviderModule.creater', title: '制单人', data: '李四', type: 'text',
+            options: {
+              field: 'creater',
+              testData: '李四',
+              height: 16,
+              fontSize: 6.75,
+              fontWeight: "700",
+              textAlign: "left",
+              textContentVerticalAlign: "middle"
+            }
+          },
+          {
+            tid: 'aProviderModule.printDate', title: '打印时间', data: '2022-01-01 09:00', type: 'text',
+            options: {
+              field: 'printDate',
+              testData: '2022-01-01 09:00',
+              height: 16,
+              fontSize: 6.75,
+              fontWeight: "700",
+              textAlign: "left",
+              textContentVerticalAlign: "middle"
+            }
+          },
+          {
+            tid: 'aProviderModule.signer', title: '库管签字', data: '', type: 'text',
+            options: {
+              title: '库管签字:',
+              height: 16,
+              fontSize: 6.75,
+              fontWeight: "700",
+              textAlign: "left",
+              textContentVerticalAlign: "middle"
+            }
+          },
+        ]),
+        new hiprint.PrintElementTypeGroup("表格/其他", [
+          {
+            tid: 'aProviderModule.table', title: '订单数据',
+            type: 'table',
+            options: {
+              field: 'table',
+              tableHeaderRepeat: 'first',
+              tableFooterRepeat: 'last',
+              fields: [
+                {text: '名称', field: 'NAME'},
+                {text: '数量', field: 'SL'},
+                {text: '规格', field: 'GG'},
+                {text: '条码', field: 'TM'},
+                {text: '单价', field: 'DJ'},
+                {text: '金额', field: 'JE'},
+              ],
+            },
+            editable: true,
+            columnDisplayEditable: true,//列显示是否能编辑
+            columnDisplayIndexEditable: true,//列顺序显示是否能编辑
+            columnTitleEditable: true,//列标题是否能编辑
+            columnResizable: true, //列宽是否能调整
+            columnAlignEditable: true,//列对齐是否调整
+            isEnableEditField: true, //编辑字段
+            isEnableContextMenu: true, //开启右键菜单 默认true
+            isEnableInsertRow: true, //插入行
+            isEnableDeleteRow: true, //删除行
+            isEnableInsertColumn: true, //插入列
+            isEnableDeleteColumn: true, //删除列
+            isEnableMergeCell: true, //合并单元格
+            columns: [
+              [
+                {title: '名称', align: 'center', field: 'NAME', width: 150},
+                {title: '数量', align: 'center', field: 'SL', width: 80},
+                {title: '规格', align: 'center', field: 'GG', width: 80, checked: false},
+                {title: '条码', align: 'center', field: 'TM', width: 100, checked: false},
+                {title: '单价', align: 'center', field: 'DJ', width: 100},
+                {title: '金额', align: 'center', field: 'JE', width: 100, checked: false},
+              ],
+            ],
+            rowsColumnsMerge: function (data, col, index) {
+              // 返回一个数组,参数一为行(rowspan)合并数,参数二为列(colspan)合并数, 被合并的行或者列值设为0
+              if (index == 0) {
+                return [1, data.INDEX % 2 == 1 ? 2 : 1]
+              } else if (index > 0 && index < 2) {
+                return [data.INDEX % 2 == 1 ? 0 : 1, 1]
+              } else {
+                return [data.INDEX % 2 == 1 ? 2 : 0, 1]
+              }
+            },
+            footerFormatter: function (options, rows, data, currentPageGridRowsData) {
+              if (data && data['totalCap']) {
+                return `<td style="padding:0 10px" colspan="100">${'应收金额大写: ' + data['totalCap']}</td>`
+              }
+              return '<td style="padding:0 10px" colspan="100">应收金额大写: </td>'
+            },
+          },
+          {tid: 'aProviderModule.customText', title: '文本', customText: '自定义文本', custom: true, type: 'text'},
+          {
+            tid: 'aProviderModule.longText', title: '长文本', type: 'longText', options: {
+              field: 'test.longText',
+              width: 200,
+              testData: '长文本分页/不分页测试'
+            },
+          }
+        ]),
+        new hiprint.PrintElementTypeGroup("辅助", [
+          {
+            tid: 'aProviderModule.hline',
+            title: '横线',
+            type: 'hline'
+          },
+          {
+            tid: 'aProviderModule.vline',
+            title: '竖线',
+            type: 'vline'
+          },
+          {
+            tid: 'aProviderModule.rect',
+            title: '矩形',
+            type: 'rect'
+          },
+          {
+            tid: 'aProviderModule.oval',
+            title: '椭圆',
+            type: 'oval'
+          },
+          {
+            tid: 'aProviderModule.barcode',
+            title: '条形码',
+            type: 'barcode',
+          },
+          {
+            tid: 'aProviderModule.qrcode',
+            title: '二维码',
+            type: 'qrcode',
+          }
+        ])
+      ]
+    );
+  };
+  return {
+    addElementTypes: addElementTypes
+  };
+};
+
+// type: 1供货商 2经销商
+export default [{
+  name: 'A设计',
+  value: 'aProviderModule',
+  type: 1,
+  f: aProvider()
+}]
diff --git a/src/views/packaging/mixins/basic-add.js b/src/views/packaging/mixins/basic-add.js
new file mode 100644
index 00000000..0b9acd23
--- /dev/null
+++ b/src/views/packaging/mixins/basic-add.js
@@ -0,0 +1,100 @@
+/*
+ * @Author: zwq
+ * @Date: 2022-08-24 11:19:43
+ * @LastEditors: zwq
+ * @LastEditTime: 2023-08-03 14:21:04
+ * @Description:
+ */
+export default {
+  data() {
+    /* eslint-disable */
+    return {
+      urlOptions: {
+        createURL: '',
+        updateURL: '',
+        infoURL: '',
+        codeURL: '',
+        getOption: false,
+        isGetCode: false,
+        optionArrUrl: [],
+        optionArr: {}
+      },
+      visible: false,
+      setData: false
+    }
+  },
+  created() {
+  },
+  activated() {
+  },
+  methods: {
+    init(id) {
+      this.dataForm.id = id || "";
+      this.visible = true;
+      if (this.urlOptions.getOption) {
+        this.getArr()
+      }
+      this.$nextTick(() => {
+        this.$refs["dataForm"].resetFields();
+        if (this.dataForm.id) {
+          this.urlOptions.infoURL(id).then(response => {
+            this.dataForm = response.data;
+            if (this.setData) {
+              this.setDataForm()
+            }
+          });
+        } else {
+          if (this.urlOptions.isGetCode) {
+            this.getCode()
+          }
+				}
+      });
+    },
+		getCode() {
+			this.urlOptions.codeURL()
+				.then(({ data: res }) => {
+					this.dataForm.code = res;
+				})
+				.catch(() => {});
+		},
+    getArr() {
+      const params = {
+        pageSize: 100,
+        pageNo: 1,
+      }
+      this.urlOptions.optionArrUrl.forEach((item, index) => {
+        item(params).then(({ data: res }) => {
+          this.$set(this.urlOptions.optionArr, `arr${index}`, res.list)
+        })
+          .catch(() => {
+          });
+      });
+    },
+    // 表单提交
+    dataFormSubmit() {
+      this.$refs["dataForm"].validate((valid) => {
+        if (!valid) {
+          return false;
+        }
+        // 修改的提交
+        if (this.dataForm.id) {
+          this.urlOptions.updateURL(this.dataForm).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.visible = false;
+            this.$emit("refreshDataList");
+          });
+          return;
+        }
+        // 添加的提交
+        this.urlOptions.createURL(this.dataForm).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.visible = false;
+          this.$emit("refreshDataList");
+        });
+      });
+    },
+    formClear() {
+      this.$refs.dataForm.resetFields()
+    }
+  }
+}
diff --git a/src/views/packaging/mixins/basic-page.js b/src/views/packaging/mixins/basic-page.js
new file mode 100644
index 00000000..28fa3b54
--- /dev/null
+++ b/src/views/packaging/mixins/basic-page.js
@@ -0,0 +1,170 @@
+/*
+ * @Author: zwq
+ * @Date: 2022-08-24 11:19:43
+ * @LastEditors: zwq
+ * @LastEditTime: 2024-07-05 10:10:12
+ * @Description:
+ */
+export default {
+  data() {
+    /* eslint-disable */
+    return {
+      urlOptions: {
+        getDataListURL: '',
+        deleteURL: '',
+        statusUrl: '',
+        exportURL: ''
+      },
+      tableData: [],
+      listQuery: {
+        pageSize: 10,
+        pageNo: 1,
+        total: 1,
+      },
+      exportLoading: false,
+      dataListLoading: false,
+      addOrEditTitle: '',
+      addOrUpdateVisible: false,
+    }
+  },
+  created() {
+  },
+  mounted() {
+    this.getDataList()
+  },
+  methods: {
+    // 获取数据列表
+    getDataList() {
+      this.dataListLoading = true;
+      this.urlOptions.getDataListURL(this.listQuery).then(response => {
+        this.tableData = response.data.list;
+        this.listQuery.total = response.data.total;
+        this.dataListLoading = false;
+      });
+    },
+    // 每页数
+    sizeChangeHandle(val) {
+      this.listQuery.pageSize = val;
+      this.listQuery.pageNo = 1;
+      this.getDataList();
+    },
+    // 当前页
+    currentChangeHandle(val) {
+      this.listQuery.pageNo = val;
+      this.getDataList();
+    },
+    // 新增
+    addOrUpdateHandle() {
+      this.addOrEditTitle = '新增';
+      this.addOrUpdateVisible = true;
+      this.$nextTick(() => {
+        this.$refs.addOrUpdate.init();
+      });
+    },
+    cancel(id) {
+      this.$refs["popover-" + id].showPopper = false;
+    },
+    //改变状态
+    changeStatus(id) {
+      this.$http
+        .post(this.urlOptions.statusUrl, { id })
+        .then(({ data: res }) => {
+          if (res.code !== 0) {
+            return this.$message.error(res.msg);
+          }
+          this.$refs["popover-" + id].showPopper = false;
+          this.$message({
+            message: this.$t("prompt.success"),
+            type: "success",
+            duration: 500,
+            onClose: () => {
+              this.getDataList();
+            },
+          });
+        })
+        .catch(() => { });
+    },
+    //tableBtn点击
+    handleClick(val) {
+      console.log(val.data.packagingCode);
+      if (val.type === "edit") {
+        this.addOrUpdateVisible = true;
+        this.addOrEditTitle = "编辑";
+        this.$nextTick(() => {
+          this.$refs.addOrUpdate.init(val.data.id);
+        });
+      } else if (val.type === "delete") {
+        this.deleteHandle(val.data.id, val.data.name, val.data._pageIndex,val.data.packagingCode )
+      } else if (val.type === "change") {
+        this.changeStatus(val.data.id)
+      } else {
+        this.otherMethods(val)
+      }
+    },
+    // 删除
+    deleteHandle(id, name, index) {
+      this.$confirm(`是否确认删除${name ? ' 名称为'+ name : '[' + index + ']'}数据项?`, "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.urlOptions.deleteURL(id).then(({ data }) => {
+            this.$message({
+              message: "操作成功",
+              type: "success",
+              duration: 1500,
+              onClose: () => {
+                this.getDataList();
+              },
+            });
+          });
+        })
+        .catch(() => { });
+    },
+    //search-bar点击
+    buttonClick(val) {
+      switch (val.btnName) {
+        case "search":
+          this.listQuery.xm1 = val.xm1;
+          this.listQuery.xm2 = val.xm2;
+          this.listQuery.pageNo = 1;
+          this.getDataList();
+          break;
+        case "add":
+          this.addOrEditTitle = '新增'
+          this.addOrUpdateVisible = true;
+          this.addOrUpdateHandle()
+          break;
+        default:
+          console.log(val)
+      }
+    },
+    handleCancel() {
+      this.$refs.addOrUpdate.formClear()
+      this.addOrUpdateVisible = false
+      this.addOrEditTitle = ''
+    },
+    handleConfirm() {
+      this.$refs.addOrUpdate.dataFormSubmit()
+    },
+    successSubmit() {
+      this.handleCancel()
+      this.getDataList()
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams };
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有数据项?').then(() => {
+        this.exportLoading = true;
+        return this.urlOptions.exportURL(params);
+      }).then(response => {
+        this.$download.excel(response, '工厂.xls');
+        this.exportLoading = false;
+      }).catch(() => { });
+    }
+  }
+}
diff --git a/src/views/packaging/mixins/code-filter.js b/src/views/packaging/mixins/code-filter.js
new file mode 100644
index 00000000..96061ff5
--- /dev/null
+++ b/src/views/packaging/mixins/code-filter.js
@@ -0,0 +1,85 @@
+
+/*
+ * @Date: 2020-12-29 16:49:28
+ * @LastEditors: zwq
+ * @LastEditTime: 2024-07-08 16:27:39
+ * @FilePath: \basic-admin\src\filters\basicData\index.js
+ * @Description:
+ */
+
+const table = {
+  lineStatus: {
+    1: '生产中',
+    2: '停止',
+    3: '未知',
+  },
+  reportType: {
+    1: '日',
+    2: '周',
+    3: '月'
+  }
+}
+
+// 日期格式化
+export function parseTime(time, pattern) {
+  if (arguments.length === 0 || !time) {
+    return null
+  }
+  const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
+  let date
+  if (typeof time === 'object') {
+    date = time
+  } else {
+    if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
+      time = parseInt(time)
+    } else if (typeof time === 'string') {
+      time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.\d{3}/gm), '');
+    }
+    if ((typeof time === 'number') && (time.toString().length === 10)) {
+      time = time * 1000
+    }
+    date = new Date(time)
+  }
+  const formatObj = {
+    y: date.getFullYear(),
+    m: date.getMonth() + 1,
+    d: date.getDate(),
+    h: date.getHours(),
+    i: date.getMinutes(),
+    s: date.getSeconds(),
+    a: date.getDay()
+  }
+  const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
+    let value = formatObj[key]
+    // Note: getDay() returns 0 on Sunday
+    if (key === 'a') {
+      return ['日', '一', '二', '三', '四', '五', '六'][value]
+    }
+    if (result.length > 0 && value < 10) {
+      value = '0' + value
+    }
+    return value || 0
+  })
+  return time_str
+}
+// 遍历树结构返回数组
+export function getTreeArr(arr) {
+  let result =[]
+  arr.forEach(item => {
+    if(item.children && item.children.length>0){
+      let {children,...obj} = item
+      result.push(obj)
+      result = result.concat(getTreeArr(children))
+    }else{
+      let {children,...obj} = item
+      result.push(obj)
+    }
+  });
+  return result
+}
+
+export default function (dictTable) {
+  return function (val) {
+    return table?.[dictTable]?.[val]
+  }
+}
diff --git a/src/views/packaging/packagingPrintLog/SmallTitle.vue b/src/views/packaging/packagingPrintLog/SmallTitle.vue
new file mode 100644
index 00000000..93b4a18f
--- /dev/null
+++ b/src/views/packaging/packagingPrintLog/SmallTitle.vue
@@ -0,0 +1,65 @@
+<!--
+ * @Author: zwq
+ * @Date: 2023-08-01 15:27:31
+ * @LastEditors: zwq
+ * @LastEditTime: 2023-08-01 16:25:54
+ * @Description:
+-->
+<template>
+	<div :class="[className, { 'p-0': noPadding }]">
+		<slot />
+	</div>
+</template>
+
+<script>
+export default {
+	props: {
+		size: {
+			// 取值范围:  xl lg md sm
+			type: String,
+			default: 'de',
+			validator: function (val) {
+				return ['xl', 'lg', 'de', 'md', 'sm'].indexOf(val) !== -1;
+			},
+		},
+		noPadding: {
+			type: Boolean,
+			default: false,
+		},
+	},
+	computed: {
+		className: function () {
+			return `${this.size}-title`;
+		},
+	},
+};
+</script>
+
+<style lang="scss" scoped>
+$pxls: (xl, 28px) (lg, 24px) (de, 20px) (md, 18px) (sm, 16px);
+$mgr: 8px;
+@each $size, $height in $pxls {
+	.#{$size}-title {
+		font-size: 18px;
+		line-height: $height;
+		color: #000;
+		font-weight: 500;
+		font-family: '微软雅黑', 'Microsoft YaHei', Arial, Helvetica, sans-serif;
+
+		&::before {
+			content: '';
+			display: inline-block;
+			vertical-align: top;
+			width: 4px;
+			height: $height + 2px;
+			border-radius: 1px;
+			margin-right: $mgr;
+			background-color: #0b58ff;
+		}
+	}
+}
+
+.p-0 {
+	padding: 0;
+}
+</style>
diff --git a/src/views/packaging/packagingPrintLog/add-or-updata.vue b/src/views/packaging/packagingPrintLog/add-or-updata.vue
new file mode 100644
index 00000000..6b1d63b4
--- /dev/null
+++ b/src/views/packaging/packagingPrintLog/add-or-updata.vue
@@ -0,0 +1,418 @@
+<!--
+ * @Author: zhp
+ * @Date: 2023-10-17 16:50:19
+ * @LastEditTime: 2023-10-30 10:47:13
+ * @LastEditors: zhp
+ * @Description:
+-->
+<template>
+  <el-dialog :visible.sync="visible" :show-close="false" :wrapper-closable="false" width="40%">
+    <small-title slot="title" :no-padding="true">
+      {{ !dataForm.id ? '新增' : '编辑' }}
+    </small-title>
+
+    <div class="content">
+      <div class="visual-part">
+        <el-form ref="dataForm" :model="dataForm" :rules="dataRule" label-width="100px"
+          @keyup.enter.native="dataFormSubmit">
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="包装流水号" prop="packagingCode">
+                <el-input v-model="dataForm.packagingCode" clearable placeholder="请输入包装流水号" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="内容" prop="content">
+                <el-input v-model="dataForm.content" clearable placeholder="请输入内容" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="所属工单" prop="workOrderId">
+                <el-select v-model="dataForm.workOrderId" style="width: 100%;" placeholder="请选择所属工单" clearable>
+                  <el-option v-for="dict in workOrderList" :key="dict.id" :label="dict.name" :value="dict.id" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="客户" prop="customerId">
+                <el-select v-model="dataForm.customerId" style="width: 100%;" placeholder="请选择客户" clearable>
+                  <el-option v-for="dict in customerList" :key="dict.id" :label="dict.name" :value="dict.id" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="标签模板" prop="modelId">
+                <el-select v-model="dataForm.modelId" style="width: 100%;" placeholder="请选择标签模板" clearable>
+                  <el-option v-for="dict in modelList" :key="dict.id" :label="dict.name" :value="dict.id" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <!-- <el-col :span="12">
+              <el-form-item label="单位平方数" prop="area">
+                <el-input v-model="dataForm.area" placeholder="请输入单位平方数" />
+              </el-form-item>
+            </el-col> -->
+          </el-row>
+          <!-- <el-row :gutter="20">
+            <el-col :span="24">
+              <el-form-item label="完成单位产品用时" prop="processTime">
+                <el-input v-model="dataForm.processTime" placeholder="请输入完成单位产品用时" />
+              </el-form-item>
+            </el-col>
+          </el-row> -->
+        </el-form>
+
+        <!-- <small-title
+					style="margin: 16px 0; padding-left: 8px"
+					:no-padding="true">
+					产品属性列表
+				</small-title>
+
+				<div class="attr-list">
+					<base-table
+						:table-props="tableProps"
+						:page="listQuery.pageNo"
+						:limit="listQuery.pageSize"
+						:add-button-show="isdetail ? null : '添加属性'"
+						@emitButtonClick="addNew()"
+						:table-data="productAttributeList">
+						<method-btn
+							v-if="!isdetail"
+							slot="handleBtn"
+							:width="120"
+							label="操作"
+							:method-list="tableBtn"
+							@clickBtn="handleClick" />
+					</base-table>
+					<pagination
+						v-show="listQuery.total > 0"
+						:total="listQuery.total"
+						:page.sync="listQuery.pageNo"
+						:limit.sync="listQuery.pageSize"
+						:page-sizes="[5, 10, 15]"
+						@pagination="getList" />
+				</div> -->
+      </div>
+    </div>
+
+    <!-- <div style="position: absolute; bottom: 24px; right: 24px">
+			<el-button style="margin-right: 10px" @click="goback()">返回</el-button>
+			<el-button v-if="isdetail" type="primary" @click="goEdit()">
+				编辑
+			</el-button>
+			<span v-if="!isdetail">
+				<el-button type="primary" @click="dataFormSubmit()">保存</el-button>
+				<el-button
+					v-if="dataForm.id && !isdetail"
+					type="primary"
+					@click="addNew()">
+					添加属性
+				</el-button>
+			</span>
+		</div> -->
+    <template slot="footer">
+      <el-button style="" @click="goback()">取消</el-button>
+      <!-- <el-button v-if="isdetail" type="primary" @click="goEdit()">
+				编辑
+			</el-button> -->
+      <el-button type="primary" @click="dataFormSubmit()">确定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+
+import {
+	createPacking,
+	updatePacking,
+  getPacking,
+  getWorkOrderList,
+  getCode,
+  getCustomerList,
+  getModelList
+} from '@/api/base/packingInfo.js';
+// import productAttrAdd from './attr-add';
+import { parseTime } from '../mixins/code-filter';
+import SmallTitle from './SmallTitle';
+
+const tableBtn = [
+	{
+		type: 'edit',
+		btnName: '编辑',
+	},
+	{
+		type: 'delete',
+		btnName: '删除',
+	},
+];
+const tableProps = [
+	{
+		prop: 'createTime',
+		label: '添加时间',
+		filter: parseTime,
+	},
+	{
+		prop: 'name',
+		label: '属性名',
+	},
+	{
+		prop: 'value',
+		label: '属性值',
+	},
+];
+
+export default {
+	components: { SmallTitle },
+	data() {
+		return {
+			visible: false,
+			addOrUpdateVisible: false,
+			tableBtn,
+      tableProps,
+      customerList: [],
+      modelList:[],
+      workOrderList:[],
+			productAttributeList: [],
+			dataForm: {
+				id: null,
+				// name: '', // 产品名称
+        packagingCode: '', // 产品编码
+				// area: 0, // 单位平方数(float only)
+        modelId: null, // 产品类型id
+        workOrderId: null, // 单位产品用时 (s)
+        customerId: '', // 规格
+        content: '', // 单位id
+			},
+			listQuery: {
+				pageSize: 10,
+				pageNo: 1,
+				total: 0,
+			},
+			dataRule: {
+        content: [
+					{
+						required: true,
+						message: '内容不能为空',
+						trigger: 'blur',
+					},
+					// {
+					// 	type: 'number',
+					// 	message: '产品编码为数字类型',
+					// 	trigger: 'blur',
+					// 	transfom: 'val => Number(val)',
+					// },
+				],
+        workOrderId: [
+					{
+						required: true,
+						message: '所属工单不能为空',
+						trigger: 'change',
+					},
+				],
+				typeDictValue: [
+					{
+						required: true,
+						message: '产品类型不能为空',
+						trigger: 'blur',
+					},
+				],
+				area: [
+					{
+						type: 'number',
+						message: '请输入正确的数值',
+						trigger: 'change',
+						transform: (val) => Number(val),
+					},
+				],
+				processTime: [
+					{
+						required: true,
+						message: '完成单位产品用时不能为空',
+						trigger: 'blur',
+					},
+					{
+						type: 'number',
+						message: '请输入正确的数值',
+						trigger: 'blur',
+						transform: (val) => Number(val),
+					},
+				],
+			},
+			// isdetail: false,
+		};
+  },
+	methods: {
+		// initData() {
+		// 	this.productAttributeList.splice(0);
+		// 	this.listQuery.total = 0;
+		// },
+    init(id) {
+      this.getDict()
+			// this.initData();
+			// this.isdetail = isdetail || false;
+			this.dataForm.id = id || null;
+			this.visible = true;
+
+			this.$nextTick(() => {
+				this.$refs['dataForm'].resetFields();
+
+				if (this.dataForm.id) {
+					// 获取产品详情
+					getPacking(id).then((response) => {
+						this.dataForm = response.data;
+					});
+					// 获取产品的属性列表
+					// this.getList();
+				} else {
+					getCode().then((res) => {
+            this.dataForm.packagingCode = res.data;
+					});
+				}
+			});
+		},
+
+		getDict() {
+      // 获取产品的属性列表
+      getCustomerList().then((response) => {
+        console.log(response);
+        this.customerList = response.data
+        // this.listQuery.total = response.data.total;
+      })
+      getModelList().then((response) => {
+        console.log(response);
+        this.modelList = response.data
+        // this.listQuery.total = response.data.total;
+      })
+      getWorkOrderList().then((response) => {
+        // console.log(response);
+        this.workOrderList = response.data
+				// this.listQuery.total = response.data.total;
+			})
+		},
+		// handleClick(raw) {
+		// 	if (raw.type === 'delete') {
+		// 		this.$confirm(
+		// 			`确定对${
+		// 				raw.data.name
+		// 					? '[名称=' + raw.data.name + ']'
+		// 					: '[序号=' + raw.data._pageIndex + ']'
+		// 			}进行删除操作?`,
+		// 			'提示',
+		// 			{
+		// 				confirmButtonText: '确定',
+		// 				cancelButtonText: '取消',
+		// 				type: 'warning',
+		// 			}
+		// 		)
+		// 			.then(() => {
+		// 				deleteProductAttr(raw.data.id).then(({ data }) => {
+		// 					this.$message({
+		// 						message: '操作成功',
+		// 						type: 'success',
+		// 						duration: 1500,
+		// 						onClose: () => {
+		// 							this.getList();
+		// 						},
+		// 					});
+		// 				});
+		// 			})
+		// 			.catch(() => {});
+		// 	} else {
+		// 		this.addNew(raw.data.id);
+		// 	}
+		// },
+		// 表单提交
+		dataFormSubmit() {
+			this.$refs['dataForm'].validate((valid) => {
+				if (valid) {
+					// 修改的提交
+					if (this.dataForm.id) {
+						updatePacking(this.dataForm).then((response) => {
+							this.$modal.msgSuccess('修改成功');
+							this.visible = false;
+							this.$emit('refreshDataList');
+						});
+						return;
+					}
+					// 添加的提交
+					createPacking(this.dataForm).then((response) => {
+						this.$modal.msgSuccess('新增成功');
+						this.visible = false;
+						this.$emit('refreshDataList');
+					});
+				}
+			});
+		},
+		// goEdit() {
+		// 	this.isdetail = false;
+		// },
+		// // 新增 / 修改
+		// addNew(id) {
+		// 	this.addOrUpdateVisible = true;
+		// 	this.$nextTick(() => {
+		// 		this.$refs.addOrUpdate.init(id);
+		// 	});
+		// },
+		goback() {
+			this.$emit('refreshDataList');
+			this.visible = false;
+			// this.initData();
+		},
+	},
+};
+</script>
+
+<!-- <style scoped>
+.drawer >>> .el-drawer {
+	border-radius: 8px 0 0 8px;
+	display: flex;
+	flex-direction: column;
+}
+
+.drawer >>> .el-form-item__label {
+	padding: 0;
+}
+
+.drawer >>> .el-drawer__header {
+	margin: 0;
+	padding: 32px 32px 24px;
+	border-bottom: 1px solid #dcdfe6;
+}
+.drawer >>> .el-drawer__body {
+	flex: 1;
+	height: 1px;
+	display: flex;
+	flex-direction: column;
+}
+
+.drawer >>> .content {
+	padding: 30px 24px;
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	/* height: 100%; */
+}
+
+.drawer >>> .visual-part {
+	flex: 1 auto;
+	max-height: 76vh;
+	overflow: hidden;
+	overflow-y: scroll;
+	padding-right: 10px; /* 调整滚动条样式 */
+}
+
+.drawer >>> .el-form,
+.drawer >>> .attr-list {
+	padding: 0 16px;
+}
+
+.drawer-body__footer {
+	display: flex;
+	justify-content: flex-end;
+	padding: 18px;
+}
+</style> -->
diff --git a/src/views/packaging/packagingPrintLog/index.vue b/src/views/packaging/packagingPrintLog/index.vue
new file mode 100644
index 00000000..3e4ec4ea
--- /dev/null
+++ b/src/views/packaging/packagingPrintLog/index.vue
@@ -0,0 +1,356 @@
+<!--
+ * @Author: zwq
+ * @Date: 2023-08-01 14:55:51
+ * @LastEditors: zhp
+ * @LastEditTime: 2023-11-24 09:13:50
+ * @Description:
+-->
+<template>
+	<div class="app-container">
+		<search-bar
+			:formConfigs="formConfig"
+			ref="searchBarForm"
+			@headBtnClick="buttonClick" />
+		<base-table
+			:table-props="tableProps"
+			:page="listQuery.pageNo"
+			:limit="listQuery.pageSize"
+			:table-data="tableData">
+			<method-btn
+				v-if="tableBtn.length"
+				slot="handleBtn"
+				:width="120"
+				label="操作"
+				:method-list="tableBtn"
+				@clickBtn="handleClick" />
+		</base-table>
+		<pagination
+			:limit.sync="listQuery.pageSize"
+			:page.sync="listQuery.pageNo"
+			:total="listQuery.total"
+			@pagination="getDataList" />
+		<add-or-update
+			v-if="addOrUpdateVisible"
+			ref="addOrUpdate"
+			@refreshDataList="getDataList" />
+	</div>
+</template>
+
+<script>
+import AddOrUpdate from './add-or-updata';
+// import unitDict from './unitDict';
+import basicPage from '../mixins/basic-page';
+import { parseTime } from '../mixins/code-filter';
+import {
+  getPackingModel,
+} from '@/api/base/printModel.js'
+import {
+	deletePacking,
+  getPackingPage,
+  getWorkOrderList,
+	exportPackingExcel,
+} from '@/api/base/packingInfo';
+
+const tableProps = [
+	{
+    prop: 'packagingCode',
+    label: '包装流水号'
+	},
+	{
+    prop: 'workOrderName',
+		label: '所属工单'
+	},
+	{
+    prop: 'customerName',
+		label: '客户'
+	},
+	{
+    prop: 'content',
+		label: '内容',
+		// subcomponent: unitDict,
+  },
+  {
+    prop: 'modelName',
+    label: '标签模板',
+    // subcomponent: unitDict,
+  },
+  {
+    prop: 'printStatus',
+    label: '打印状态',
+    filter: (val) => val == 1 ? '未打印' : '已打印',
+  },
+	{
+    prop: 'createTime',
+		label: '生成日期',
+		filter: parseTime
+	},
+];
+
+export default {
+	mixins: [basicPage],
+	data() {
+		return {
+			urlOptions: {
+        getDataListURL: getPackingPage,
+				deleteURL: deletePacking,
+				exportURL: exportPackingExcel,
+			},
+			tableProps,
+      tableBtn: [
+        {
+          type: 'print',
+          btnName: '打印',
+        },
+        this.$auth.hasPermi(`base:packaging-print-log:update`)
+					? {
+							type: 'edit',
+							btnName: '编辑',
+					  }
+          : undefined,
+        this.$auth.hasPermi(`base:packaging-print-log:delete`)
+					? {
+							type: 'delete',
+							btnName: '删除',
+					  }
+          : undefined,
+			].filter((v) => v),
+			tableData: [],
+      formConfig: [
+        {
+          type: 'select',
+          label: '工单',
+          selectOptions: [],
+          labelField: 'name',
+          valueField: 'id',
+          param: 'workOrderId',
+          filterable: true,
+        },
+        {
+          // parent: 'dateFilterType',
+          // 时间段选择
+          type: 'datePicker',
+          // label: '时间段',
+          dateType: 'daterange',
+          format: 'yyyy-MM-dd HH:mm:ss',
+          valueFormat: 'yyyy-MM-dd HH:mm:ss',
+          defaultTime: ['00:00:00', '00:00:00'],
+          rangeSeparator: '-',
+          startPlaceholder: '开始时间',
+          endPlaceholder: '结束时间',
+          param: 'createTime',
+        },
+				{
+					type: 'button',
+					btnName: '搜索',
+					name: 'search',
+					color: 'primary',
+				},
+				// {
+				// 	type: 'separate',
+				// },
+				// {
+				// 	type: 'button',
+				// 	btnName: '重置',
+				// 	name: 'reset',
+				// },
+				{
+					type: 'separate',
+				},
+				{
+          type: this.$auth.hasPermi('base:packaging-print-log:create') ? 'button' : '',
+					btnName: '新增',
+					name: 'add',
+					color: 'success',
+					plain: true,
+				},
+				// {
+				// 	type: 'separate',
+				// 	type: this.$auth.hasPermi('base:product:create') ? 'separate' : '',
+				// },
+				// {
+				// 	type: this.$auth.hasPermi('base:product:export') ? 'button' : '',
+				// 	btnName: '导出',
+				// 	name: 'export',
+				// 	color: 'warning',
+				// },
+			],
+		};
+	},
+	components: {
+		AddOrUpdate,
+	},
+  created() {
+    this.getDict()
+  },
+  methods: {
+    getDataList() {
+      this.dataListLoading = true;
+      this.urlOptions.getDataListURL(this.listQuery).then(response => {
+        this.tableData = response.data.records;
+        this.listQuery.total = response.data.total;
+        this.dataListLoading = false;
+      });
+    },
+    getDict() {
+      // 获取产品的属性列表
+      // getCustomerList().then((response) => {
+      //   console.log(response);
+      //   this.customerList = response.data
+      //   // this.listQuery.total = response.data.total;
+      // })
+      // getModelList().then((response) => {
+      //   console.log(response);
+      //   this.modelList = response.data
+      //   // this.listQuery.total = response.data.total;
+      // })
+      getWorkOrderList().then((response) => {
+        // console.log(response);
+        this.formConfig[0].selectOptions = response.data.map((item) => {
+          return {
+            name: item.name,
+            id: item.id
+          }
+        })
+        console.log(this.formConfig[0].selectOptions);
+        // this.listQuery.total = response.data.total;
+      })
+    },
+    deleteHandle(id, name, index, packagingCode) {
+      this.$confirm(`是否确认删除${'[' + packagingCode + ']'}数据项?`, "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.urlOptions.deleteURL(id).then(({ data }) => {
+            this.$message({
+              message: "操作成功",
+              type: "success",
+              duration: 1500,
+              onClose: () => {
+                this.getDataList();
+              },
+            });
+          });
+        })
+        .catch(() => { });
+    },
+    handlePrint(id) {
+      if (id) {
+        getPackingModel(id).then(res => {
+          var obj = {
+            code: '11111222',
+            test: '11111',
+            test2: '3333333',
+            test1: '222222',
+          }
+          console.log(res);
+          // getPackingListInfo({
+          //   size: 20,
+          //   current: 1,
+          //   boxNo: printModel.boxNo
+          // }).then(result => {
+          //   this.substrateList = result.data.records
+          //   var obj = {
+          //     // time: this.getNewDate(),
+          //     boxNo: this.currentData.boxNo,
+          //     orderNum: this.currentData.orderNum,
+          //     powerLevel: this.currentData.powerLevel,
+          //     sapMaterial: this.currentData.sapMaterial,
+          //     img: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAHVklEQVR4nO2dT2wUVRzHv2/2T5eSAlvFilwgQUH+eLACaUxEiJLAxdh44MDZi2ChUIrSFtoCgbbSP4GDdwgeEA8kRTAI0iIGBL1ITLxgLAlCsCKBYndnx7zd35pl2+7On/de387OJ9l00515/z7z/szMmzfs7869mD0yCjw2gZAB4VhAiln4/dUaRGdU18aOnzw9dn24ioGJj0soFsJr1z2yNm+qN2/fvRFL8XyMYqTmFfxZ+TwMc1xKDsL/f2Ms8xGeLwuIRpCKx99MHf/i4uPrw5GQ9jIAfsCMXfw2HkuOX03Wb1qLh4+uIGFJjzecPoS5iEhUTg1hDMaM2GuRk6cGMTQUCYmPQQq86CMAkkPDkQirGAzXf7Du34ejN9IHmETCRjQGPL6D+4NnYDEJDQmXbaY6on/dm2Vm/jHdZe0Almm6Ll+YNQbzasX7765BNHI1o0sOYRghwExg7MG9dDQSiqsdwHuZmlFKMjLwQ3QcFtjlSxHTenLO3Lp7vfU09AOS41Ka+HC6CjIDIaqmguvIPgBtIgOcDhjVlMTQtarKOScumR/teCdpxoeNZGJCapjFt7Rcywrb2MYtnQBatCpZTzCkYCF+5suKRXf+6EvOmv0GSzwrhB/QpmGkBYZSpqvIZAlp8ZeMLFwKUH3z2gqWyd/+3F/5b1yRQQMCN8gQspeaKt+SAItSCxCiPjIjhDEkjRAMxmCZSbgZkYke537qdxl57KM8C0OkkD0ADohMXIlwgPIuBFFC9uS3p2XGflFSRAgpdxlZeBl84jUQr0ImjDTKGWZZBwE0eCkCL0J20UgjgGCwEDHNPjB86PbiilshfGRxOBCRD0tLCSWTnzMLO9yE4EbIzjIdTdmGpc8/rB4qK0c4FcKbqe7pyWZJ0k1lZhsnQnZq3EzV00dHDjupKXaFNGtcM7YA+Io+WzRIz2R0UxkWxY6QJgCHlCbfPlzAsZytj2ks5RCVZUGKCdkOoEt+Wl3RkCcjyzGv5wIS6aIynZJCQni7d0TTjPFaMFDg9wGNa8qRQn3KVEI+1rjPmKpm5KNzTemmMp7AZEK2AehXmz7bbC1SM/IZoH10pJ/K+hnyhXBrvZpmoBHAURf7HaV9daQ3v6Zk7hhWVr4AYDOAzzRNeKPHAyW7r459Yj/deUynMcyqqpY9/fXW+RTwkiF/ms5pADcd7nMbwAkBcfMM3wOwwOF+rys46TxCt+T72d2NG0YSg2fnC58ANDkbAZyVH41QNgAYVBTXNiMxeLYG6qawvagmGqGoTHOfwcAe6T8TvWwYlTC7OsALgRDNCIRoRiBEMwIhmhEI0YxAiGYEQjRDtZCY9iUyEaVpVi3kvuL4RKA0zSqF8Ad5TimMTxSnKO1KUCWEZ6hDVaYk0KFKigohbSUuI0uHiieKZQtp89kM+U7ZUmQKafHp4wpSH/eWJaTT5zPkD8g62GQI8cXqDTZok/HEsWgh+3Of2y4D2kU/0idKyEOaJdgqKLxSotXlfLFJESXkicKZGTrys6g0iRIyD8AvAFYLCq+UWC1yACOyD+Hrf1wAUCcwTN2pozzXiEqn6E59JoBvANQKDldHaimvM0WmTcawlydw2Oc1pY7yKFQGJJ4YxqiTXyEp/OlkBeVNyn0SmZdO5gC47rOOfjXlaY6sCGRfXKwA8LVP+pRaykuFzEhUXH7nR9P3AFYqiEsWKykP0mpGFlU3qKI0IlmlKD6RrKK0R1VEpvIW7uwSHXnVUdqVoHqSwz+K4xOB0jQH87I0IxCiGYEQzQiEaEYgRDMCIZoRCNGMQIhmBEI0gwuJK0xScKZemHiY1mzqUxThYgBLHO7zQOAzGnMBPOdwn8WC4rbDNjaSWVajQaEUp9wBsB7ALY/hLAVwHsB89VmwRXrhuGwf0q/xIl/z6f6105qVyxIKQ1cZjdlV/HI79V6N1yjk/dxlAMtc7LuM9lXZVzqhIXdxtvxR1kCxZUynkbl0o2ihgyQspH3mapqn7flrSE427O3TuKbwGZI/AlhuY9vltO08Belyw6T99lTnIQN2VmGeJqppskGhpfoW0DbVmuahaarVVQudGPZo3tH/RCOnfJbSbzp34D1T/VjsTL3X6esWFMJngJwDsCgnykX0P+mzQ1yyq9jqqtnzkGI0a7wgPz9pfJm+/6ZxB77bzus+7L7pkwdkarr8OBdwJee7jjQVaqZysVtDsuwK3j3lmGYnb5hwerW3S+PRl440OX3dh5vL7z0iXzXqY/bYbaZycXs/5KDdV/iUKc1URo7xcoOqq0yfui1Gq5e3EoUava1qzS/aJQGs8xKIj2jx+gCoVyGcoUBKGs8yIEgIAiliZEDwJAehL3ovIYS+2F9UDckyRH/fFhmoxuwTvdaJaCGc7+gyi9+br1YZSzTJEAIaffHrZG/JCFwDpK16JEsI5yK9uMdvzVe7zAUxZQrhXKKBwxqZkSikQ8aiZbnIFgKS4oea0i5bBhQJgQ+kKJEBhUJAUkqxo+cduJqVrQH8B6xBgBhvJFNDAAAAAElFTkSuQmCC',
+          //     // lineBody: this.currentData.lineBody == 1 ? 'F ' : 'S',
+          //     createTime: moment(this.currentData.createTime).format('YYYY-MM-DD HH:mm:ss')
+          //     // modul1: '20210320000012',
+          //     // modul2: '20210320000012',
+          //     // modul3: '20210320000012'
+          //   }
+          //   for (var i = 0; i < this.substrateList.length; i++) {
+          //     var model = 'model' + Number(i + 1)
+          //     var pmpp = 'PMPP' + Number(i + 1)
+          //     var m = 'm' + Number(i + 1)
+
+          //     console.log(model)
+          //     // console.log(this.list[i].woSubstrateId)
+          //     // console.log(this.list[i].woSubstrateId)
+          //     obj['' + model + ''] = this.substrateList[i].woSubstrateId
+          //     obj['' + pmpp + ''] = this.substrateList[i].pmpp
+          //     obj['' + m + ''] = i + 1
+          //   }
+          //   console.log(obj)
+          // this.printPreview('预览', res.data)
+          const hiprintTemplate = this.$print(undefined, JSON.parse(res.data.content), obj, {}, {
+            // styleHandler: () => {
+            //   const css = '<link href="http://hiprint.io/Content/hiprint/css/print-lock.css" media="print" rel="stylesheet">'
+            //   return css
+            // }
+          })
+
+          hiprintTemplate.on('printSuccess', function () {
+            console.log(1111);
+            // that.$notification.success({
+            //   // key: key,
+            //   placement: 'topRight',
+            //   message: key + ' 打印成功',
+            //   description: 'Api单独直接打印回调',
+            // });
+          });
+          console.log(hiprintTemplate)
+        })
+      } else {
+        this.$message({
+          message: '请选择打印标签模板',
+          type: 'warning'
+        });
+      }
+    },
+    closeCallback(vue) {
+      console.log('关闭了打印工具')
+    },
+		buttonClick(val) {
+			switch (val.btnName) {
+				case 'search':
+					this.listQuery.pageNo = 1;
+					this.listQuery.pageSize = 10;
+          this.listQuery.workOrderId = val.workOrderId;
+          if (val.createTime && val.createTime.length != 0) {
+            this.listQuery.createTime = val.createTime
+            // this.listQuery.createTime[1] = val.timeVal[1]
+          } else {
+            this.listQuery.createTime = undefined
+            // this.listQuery.endTime = undefined
+          }
+          this.getDataList();
+          console.log(this.tableData)
+					break;
+				case 'reset':
+					this.$refs.searchBarForm.resetForm();
+					this.listQuery = {
+						pageSize: 10,
+						pageNo: 1,
+						total: 1,
+					};
+					this.getDataList();
+					break;
+				case 'add':
+					this.addOrEditTitle = '新增';
+					this.addOrUpdateVisible = true;
+					this.addOrUpdateHandle();
+					break;
+				case 'export':
+					this.handleExport();
+					break;
+				default:
+					console.log(val);
+			}
+		},
+    otherMethods(val) {
+      this.handlePrint(val.data.modelId)
+			// this.addOrUpdateVisible = true;
+			// this.addOrEditTitle = '详情';
+			// this.$nextTick(() => {
+			// 	this.$refs.addOrUpdate.init(val.data.id, true);
+			// });
+		},
+	},
+};
+</script>
diff --git a/src/views/packaging/packagingPrintLog/unitDict.vue b/src/views/packaging/packagingPrintLog/unitDict.vue
new file mode 100644
index 00000000..94702ab4
--- /dev/null
+++ b/src/views/packaging/packagingPrintLog/unitDict.vue
@@ -0,0 +1,15 @@
+<template>
+  <dict-tag
+    :type="DICT_TYPE.UNIT_DICT"
+    :value="injectData.unitDictValue" />
+</template>
+<script>
+export default {
+	props: {
+		injectData: {
+			type: Object,
+			default: () => ({}),
+		},
+	},
+};
+</script>
diff --git a/src/views/packaging/packagingPrintModel/SmallTitle.vue b/src/views/packaging/packagingPrintModel/SmallTitle.vue
new file mode 100644
index 00000000..93b4a18f
--- /dev/null
+++ b/src/views/packaging/packagingPrintModel/SmallTitle.vue
@@ -0,0 +1,65 @@
+<!--
+ * @Author: zwq
+ * @Date: 2023-08-01 15:27:31
+ * @LastEditors: zwq
+ * @LastEditTime: 2023-08-01 16:25:54
+ * @Description:
+-->
+<template>
+	<div :class="[className, { 'p-0': noPadding }]">
+		<slot />
+	</div>
+</template>
+
+<script>
+export default {
+	props: {
+		size: {
+			// 取值范围:  xl lg md sm
+			type: String,
+			default: 'de',
+			validator: function (val) {
+				return ['xl', 'lg', 'de', 'md', 'sm'].indexOf(val) !== -1;
+			},
+		},
+		noPadding: {
+			type: Boolean,
+			default: false,
+		},
+	},
+	computed: {
+		className: function () {
+			return `${this.size}-title`;
+		},
+	},
+};
+</script>
+
+<style lang="scss" scoped>
+$pxls: (xl, 28px) (lg, 24px) (de, 20px) (md, 18px) (sm, 16px);
+$mgr: 8px;
+@each $size, $height in $pxls {
+	.#{$size}-title {
+		font-size: 18px;
+		line-height: $height;
+		color: #000;
+		font-weight: 500;
+		font-family: '微软雅黑', 'Microsoft YaHei', Arial, Helvetica, sans-serif;
+
+		&::before {
+			content: '';
+			display: inline-block;
+			vertical-align: top;
+			width: 4px;
+			height: $height + 2px;
+			border-radius: 1px;
+			margin-right: $mgr;
+			background-color: #0b58ff;
+		}
+	}
+}
+
+.p-0 {
+	padding: 0;
+}
+</style>
diff --git a/src/views/packaging/packagingPrintModel/add-or-updata.vue b/src/views/packaging/packagingPrintModel/add-or-updata.vue
new file mode 100644
index 00000000..9e66ebe9
--- /dev/null
+++ b/src/views/packaging/packagingPrintModel/add-or-updata.vue
@@ -0,0 +1,441 @@
+<!--
+ * @Author: zhp
+ * @Date: 2023-10-17 16:50:19
+ * @LastEditTime: 2023-10-30 10:41:07
+ * @LastEditors: zhp
+ * @Description:
+-->
+<template>
+  <el-dialog :visible.sync="visible" :show-close="false" :wrapper-closable="false" width="30%">
+    <small-title slot="title" :no-padding="true">
+      {{ !dataForm.id ? '新增' : '编辑' }}
+    </small-title>
+
+    <div class="content">
+      <div class="visual-part">
+        <el-form ref="dataForm" :model="dataForm" :rules="dataRule" label-width="100px"
+          @keyup.enter.native="dataFormSubmit">
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="模板名称" prop="name">
+                <el-input v-model="dataForm.name" clearable placeholder="请输入模板名称" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="标签类型" prop="typeId">
+                <el-select v-model="dataForm.typeId" style="width: 100%;" placeholder="请选择打印方式" clearable>
+                  <el-option v-for="dict in typeList" :key="dict.id" :label="dict.name" :value="dict.id" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="打印方式" prop="printModel">
+                <el-select v-model="dataForm.printModel" style="width: 100%;" placeholder="请选择打印方式" clearable>
+                  <el-option v-for="dict in printModelList" :key="dict.id" :label="dict.name" :value="dict.id" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="标签备注" prop="remark">
+                <el-input v-model="dataForm.remark" clearable placeholder="请输入标签备注" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="模板设计" prop="content">
+                <el-button type="primary" @click="btnClickDesign()">模板设计</el-button>
+              </el-form-item>
+            </el-col>
+            <!-- <el-col :span="12">
+              <el-form-item label="单位平方数" prop="area">
+                <el-input v-model="dataForm.area" placeholder="请输入单位平方数" />
+              </el-form-item>
+            </el-col> -->
+          </el-row>
+          <!-- <el-row :gutter="20">
+            <el-col :span="24">
+              <el-form-item label="完成单位产品用时" prop="processTime">
+                <el-input v-model="dataForm.processTime" placeholder="请输入完成单位产品用时" />
+              </el-form-item>
+            </el-col>
+          </el-row> -->
+        </el-form>
+
+        <!-- <small-title
+					style="margin: 16px 0; padding-left: 8px"
+					:no-padding="true">
+					产品属性列表
+				</small-title>
+
+				<div class="attr-list">
+					<base-table
+						:table-props="tableProps"
+						:page="listQuery.pageNo"
+						:limit="listQuery.pageSize"
+						:add-button-show="isdetail ? null : '添加属性'"
+						@emitButtonClick="addNew()"
+						:table-data="productAttributeList">
+						<method-btn
+							v-if="!isdetail"
+							slot="handleBtn"
+							:width="120"
+							label="操作"
+							:method-list="tableBtn"
+							@clickBtn="handleClick" />
+					</base-table>
+					<pagination
+						v-show="listQuery.total > 0"
+						:total="listQuery.total"
+						:page.sync="listQuery.pageNo"
+						:limit.sync="listQuery.pageSize"
+						:page-sizes="[5, 10, 15]"
+						@pagination="getList" />
+				</div> -->
+      </div>
+    </div>
+
+    <!-- <div style="position: absolute; bottom: 24px; right: 24px">
+			<el-button style="margin-right: 10px" @click="goback()">返回</el-button>
+			<el-button v-if="isdetail" type="primary" @click="goEdit()">
+				编辑
+			</el-button>
+			<span v-if="!isdetail">
+				<el-button type="primary" @click="dataFormSubmit()">保存</el-button>
+				<el-button
+					v-if="dataForm.id && !isdetail"
+					type="primary"
+					@click="addNew()">
+					添加属性
+				</el-button>
+			</span>
+		</div> -->
+    <template slot="footer">
+      <el-button style="" @click="goback()">取消</el-button>
+      <!-- <el-button v-if="isdetail" type="primary" @click="goEdit()">
+				编辑
+			</el-button> -->
+      <el-button type="primary" @click="dataFormSubmit()">确定</el-button>
+    </template>
+    <print-model-design v-if="modelShow" ref="printModelDesign" @saveData="getModelData" />
+  </el-dialog>
+</template>
+
+<script>
+
+import {
+  createPackingModel,
+  updatePackingModel,
+  getPackingModel,
+  // getWorkOrderList,
+  // getCode,
+  // getCustomerList,
+  getTypeList
+} from '@/api/base/printModel.js';
+// import productAttrAdd from './attr-add';
+import { parseTime } from '../mixins/code-filter';
+import SmallTitle from './SmallTitle';
+import printModelDesign from '../custom/index'
+
+const tableBtn = [
+	{
+		type: 'edit',
+		btnName: '编辑',
+	},
+	{
+		type: 'delete',
+		btnName: '删除',
+	},
+];
+const tableProps = [
+	{
+		prop: 'createTime',
+		label: '添加时间',
+		filter: parseTime,
+	},
+	{
+		prop: 'name',
+		label: '属性名',
+	},
+	{
+		prop: 'value',
+		label: '属性值',
+	},
+];
+
+export default {
+  components: { SmallTitle, printModelDesign },
+	data() {
+		return {
+			visible: false,
+			addOrUpdateVisible: false,
+			tableBtn,
+      tableProps,
+      modelShow:false,
+      typeList:[],
+			dataForm: {
+				id: null,
+				// name: '', // 产品名称
+        name: '', // 产品编码
+				// area: 0, // 单位平方数(float only)
+        typeId: null, // 产品类型id
+        printModel: null, // 单位产品用时 (s)
+        content: '', // 规格
+        remark: '', // 单位id
+      },
+      printModelList: [
+        {
+          id: 1,
+          name:'自动'
+        },
+        {
+          id: 2,
+          name: '手动'
+        },
+      ],
+			listQuery: {
+				pageSize: 10,
+				pageNo: 1,
+				total: 0,
+			},
+			dataRule: {
+        typeId: [
+					{
+						required: true,
+						message: '打印类型不能为空',
+						trigger: 'blur',
+					},
+					// {
+					// 	type: 'number',
+					// 	message: '产品编码为数字类型',
+					// 	trigger: 'blur',
+					// 	transfom: 'val => Number(val)',
+					// },
+				],
+				name: [
+					{
+						required: true,
+						message: '模板名称不能为空',
+						trigger: 'blur',
+					},
+				],
+        printModel: [
+					{
+						required: true,
+						message: '模板类型不能为空',
+						trigger: 'blur',
+					},
+				],
+				content: [
+          {
+            required: true,
+            message: '模板不能为空',
+            trigger: 'blur',
+          },
+				],
+				processTime: [
+					{
+						required: true,
+						message: '完成单位产品用时不能为空',
+						trigger: 'blur',
+					},
+					{
+						type: 'number',
+						message: '请输入正确的数值',
+						trigger: 'blur',
+						transform: (val) => Number(val),
+					},
+				],
+			},
+			// isdetail: false,
+		};
+  },
+  methods: {
+    getModelData(data) {
+      console.log(data)
+      this.content = JSON.stringify(data)
+      this.dataForm.content = JSON.stringify(data)
+    },
+    btnClickDesign() {
+      console.log(11111)
+      this.modelShow = true
+      this.$nextTick(() => {
+        this.$refs.printModelDesign.init(this.dataForm.content)
+        console.log(this.dataForm.content)
+      })
+      // this.$router.push({
+      //   path: '/printModelDesign'
+      // })
+    },
+		// initData() {
+		// 	this.productAttributeList.splice(0);
+		// 	this.listQuery.total = 0;
+		// },
+    init(id) {
+      this.getDict()
+			// this.initData();
+			// this.isdetail = isdetail || false;
+			this.dataForm.id = id || null;
+			this.visible = true;
+
+			this.$nextTick(() => {
+				this.$refs['dataForm'].resetFields();
+
+				if (this.dataForm.id) {
+					// 获取产品详情
+          getPackingModel(id).then((response) => {
+						this.dataForm = response.data;
+					});
+					// 获取产品的属性列表
+					// this.getList();
+				} else {
+					// getCode().then((res) => {
+          //   this.dataForm.packagingCode = res.data;
+					// });
+				}
+			});
+		},
+
+		getDict() {
+      // 获取产品的属性列表
+      // getCustomerList().then((response) => {
+      //   console.log(response);
+      //   this.customerList = response.data
+      //   // this.listQuery.total = response.data.total;
+      // })
+      getTypeList().then((response) => {
+        console.log(response);
+        this.typeList = response.data
+        // this.listQuery.total = response.data.total;
+      })
+      // getWorkOrderList().then((response) => {
+      //   // console.log(response);
+      //   this.workOrderList = response.data
+			// 	// this.listQuery.total = response.data.total;
+			// })
+		},
+		// handleClick(raw) {
+		// 	if (raw.type === 'delete') {
+		// 		this.$confirm(
+		// 			`确定对${
+		// 				raw.data.name
+		// 					? '[名称=' + raw.data.name + ']'
+		// 					: '[序号=' + raw.data._pageIndex + ']'
+		// 			}进行删除操作?`,
+		// 			'提示',
+		// 			{
+		// 				confirmButtonText: '确定',
+		// 				cancelButtonText: '取消',
+		// 				type: 'warning',
+		// 			}
+		// 		)
+		// 			.then(() => {
+		// 				deleteProductAttr(raw.data.id).then(({ data }) => {
+		// 					this.$message({
+		// 						message: '操作成功',
+		// 						type: 'success',
+		// 						duration: 1500,
+		// 						onClose: () => {
+		// 							this.getList();
+		// 						},
+		// 					});
+		// 				});
+		// 			})
+		// 			.catch(() => {});
+		// 	} else {
+		// 		this.addNew(raw.data.id);
+		// 	}
+		// },
+		// 表单提交
+		dataFormSubmit() {
+			this.$refs['dataForm'].validate((valid) => {
+				if (valid) {
+					// 修改的提交
+					if (this.dataForm.id) {
+            updatePackingModel(this.dataForm).then((response) => {
+							this.$modal.msgSuccess('修改成功');
+							this.visible = false;
+							this.$emit('refreshDataList');
+						});
+						return;
+					}
+					// 添加的提交
+          createPackingModel(this.dataForm).then((response) => {
+						this.$modal.msgSuccess('新增成功');
+						this.visible = false;
+						this.$emit('refreshDataList');
+					});
+				}
+			});
+		},
+		// goEdit() {
+		// 	this.isdetail = false;
+		// },
+		// // 新增 / 修改
+		// addNew(id) {
+		// 	this.addOrUpdateVisible = true;
+		// 	this.$nextTick(() => {
+		// 		this.$refs.addOrUpdate.init(id);
+		// 	});
+		// },
+		goback() {
+			this.$emit('refreshDataList');
+			this.visible = false;
+			// this.initData();
+		},
+	},
+};
+</script>
+
+<!-- <style scoped>
+.drawer >>> .el-drawer {
+	border-radius: 8px 0 0 8px;
+	display: flex;
+	flex-direction: column;
+}
+
+.drawer >>> .el-form-item__label {
+	padding: 0;
+}
+
+.drawer >>> .el-drawer__header {
+	margin: 0;
+	padding: 32px 32px 24px;
+	border-bottom: 1px solid #dcdfe6;
+}
+.drawer >>> .el-drawer__body {
+	flex: 1;
+	height: 1px;
+	display: flex;
+	flex-direction: column;
+}
+
+.drawer >>> .content {
+	padding: 30px 24px;
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	/* height: 100%; */
+}
+
+.drawer >>> .visual-part {
+	flex: 1 auto;
+	max-height: 76vh;
+	overflow: hidden;
+	overflow-y: scroll;
+	padding-right: 10px; /* 调整滚动条样式 */
+}
+
+.drawer >>> .el-form,
+.drawer >>> .attr-list {
+	padding: 0 16px;
+}
+
+.drawer-body__footer {
+	display: flex;
+	justify-content: flex-end;
+	padding: 18px;
+}
+</style> -->
diff --git a/src/views/packaging/packagingPrintModel/index.vue b/src/views/packaging/packagingPrintModel/index.vue
new file mode 100644
index 00000000..bc4a71e6
--- /dev/null
+++ b/src/views/packaging/packagingPrintModel/index.vue
@@ -0,0 +1,215 @@
+<!--
+ * @Author: zwq
+ * @Date: 2023-08-01 14:55:51
+ * @LastEditors: zhp
+ * @LastEditTime: 2023-11-22 14:40:07
+ * @Description:
+-->
+<template>
+  <div class="app-container">
+    <search-bar :formConfigs="formConfig" ref="searchBarForm" @headBtnClick="buttonClick" />
+    <base-table :table-props="tableProps" :page="listQuery.pageNo" :limit="listQuery.pageSize" :table-data="tableData">
+      <method-btn v-if="tableBtn.length" slot="handleBtn" :width="120" label="操作" :method-list="tableBtn"
+        @clickBtn="handleClick" />
+    </base-table>
+    <pagination :limit.sync="listQuery.pageSize" :page.sync="listQuery.pageNo" :total="listQuery.total"
+      @pagination="getDataList" />
+    <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList" />
+    <print-model-design v-if="modelShow" ref="printModelDesign" @saveData="getModelData" />
+  </div>
+</template>
+
+<script>
+import AddOrUpdate from './add-or-updata';
+// import unitDict from './unitDict';
+import basicPage from '../mixins/basic-page';
+
+import { parseTime } from '../mixins/code-filter';
+import printModelDesign from '../custom/index'
+import { updatePackingModel,} from '@/api/base/printModel.js';
+import {
+  deletePackingModel,
+  getPackingModelPage,
+	// exportPackingExcel,
+} from '@/api/base/printModel';
+
+const tableProps = [
+  {
+    prop: 'createTime',
+    label: '创建时间',
+    filter: parseTime
+  },
+	{
+    prop: 'name',
+    label: '模板名称'
+	},
+	{
+    prop: 'typeName',
+		label: '标签类型'
+	},
+	{
+    prop: 'printModel',
+    label: '打印方式',
+    filter: (val) => val ==1 ? '自动打印' : '手动打印',
+	},
+	{
+    prop: 'remark',
+		label: '备注',
+		// subcomponent: unitDict,
+  },
+];
+
+export default {
+	mixins: [basicPage],
+	data() {
+		return {
+			urlOptions: {
+        getDataListURL: getPackingModelPage,
+        deleteURL: deletePackingModel,
+				// exportURL: exportPackingExcel,
+			},
+      tableProps,
+      modelShow:false,
+      tableBtn: [
+        {
+          type: 'print',
+          btnName: '查看',
+        },
+        this.$auth.hasPermi(`base:packaging-print-model:update`)
+					? {
+							type: 'edit',
+							btnName: '编辑',
+					  }
+          : undefined,
+        this.$auth.hasPermi(`base:packaging-print-model:delete`)
+					? {
+							type: 'delete',
+							btnName: '删除',
+					  }
+          : undefined,
+			].filter((v) => v),
+			tableData: [],
+			formConfig: [
+				// {
+				// 	type: 'input',
+        //   label: '工单',
+        //   placeholder: '工单',
+        //   param: 'workOrderId',
+				// },
+				// {
+        //   // parent: 'dateFilterType',
+        //   // 日期选择
+        //   type: 'datePicker',
+        //   label: '时间',
+        //   dateType: 'date',
+        //   placeholder: '选择日期',
+        //   format: 'yyyy-MM-dd',
+        //   valueFormat: 'yyyy-MM-dd',
+        //   param: 'createTime',
+				// },
+				// {
+				// 	type: 'button',
+				// 	btnName: '搜索',
+				// 	name: 'search',
+				// 	color: 'primary',
+				// },
+				// {
+				// 	type: 'separate',
+				// },
+				// {
+				// 	type: 'button',
+				// 	btnName: '重置',
+				// 	name: 'reset',
+				// },
+				{
+					type: 'separate',
+				},
+				{
+          type: this.$auth.hasPermi('base:packaging-print-model:create') ? 'button' : '',
+					btnName: '新增模板',
+					name: 'add',
+					color: 'success',
+					plain: true,
+				},
+				// {
+				// 	type: 'separate',
+				// 	type: this.$auth.hasPermi('base:product:create') ? 'separate' : '',
+				// },
+				// {
+				// 	type: this.$auth.hasPermi('base:product:export') ? 'button' : '',
+				// 	btnName: '导出',
+				// 	name: 'export',
+				// 	color: 'warning',
+				// },
+			],
+		};
+	},
+	components: {
+    AddOrUpdate,
+    printModelDesign
+	},
+	created() {},
+  methods: {
+    getDataList() {
+      this.dataListLoading = true;
+      this.urlOptions.getDataListURL(this.listQuery).then(response => {
+        this.tableData = response.data.records;
+        this.listQuery.total = response.data.total;
+        this.dataListLoading = false;
+      });
+    },
+		buttonClick(val) {
+			switch (val.btnName) {
+				case 'search':
+					this.listQuery.pageNo = 1;
+					this.listQuery.pageSize = 10;
+          this.listQuery.packagingCode = val.packagingCode;
+          this.listQuery.createTime = val.createTime;
+					this.getDataList();
+					break;
+				case 'reset':
+					this.$refs.searchBarForm.resetForm();
+					this.listQuery = {
+						pageSize: 10,
+						pageNo: 1,
+						total: 1,
+					};
+					this.getDataList();
+					break;
+				case 'add':
+					this.addOrEditTitle = '新增';
+					this.addOrUpdateVisible = true;
+					this.addOrUpdateHandle();
+					break;
+				case 'export':
+					this.handleExport();
+					break;
+				default:
+					console.log(val);
+			}
+    },
+    getModelData(data) {
+      // console.log(data)
+      // this.content = JSON.stringify(data)
+      // this.dataForm.content = JSON.stringify(data)
+      console.log(data)
+      // this.content = JSON.stringify(data)
+      this.obj.content = JSON.stringify(data)
+      updatePackingModel(this.obj).then((response) => {
+        // this.$modal.msgSuccess('修改成功');
+        // this.visible = false;
+        // this.$emit('refreshDataList');
+      });
+
+    },
+    otherMethods(val) {
+      console.log(val)
+      this.modelShow = true
+      this.$nextTick(() => {
+        this.obj = val.data
+        this.$refs.printModelDesign.init(val.data.content)
+      })
+		},
+	},
+};
+</script>
diff --git a/src/views/packaging/packagingPrintModel/unitDict.vue b/src/views/packaging/packagingPrintModel/unitDict.vue
new file mode 100644
index 00000000..94702ab4
--- /dev/null
+++ b/src/views/packaging/packagingPrintModel/unitDict.vue
@@ -0,0 +1,15 @@
+<template>
+  <dict-tag
+    :type="DICT_TYPE.UNIT_DICT"
+    :value="injectData.unitDictValue" />
+</template>
+<script>
+export default {
+	props: {
+		injectData: {
+			type: Object,
+			default: () => ({}),
+		},
+	},
+};
+</script>
diff --git a/src/views/packaging/packagingPrintType/SmallTitle.vue b/src/views/packaging/packagingPrintType/SmallTitle.vue
new file mode 100644
index 00000000..93b4a18f
--- /dev/null
+++ b/src/views/packaging/packagingPrintType/SmallTitle.vue
@@ -0,0 +1,65 @@
+<!--
+ * @Author: zwq
+ * @Date: 2023-08-01 15:27:31
+ * @LastEditors: zwq
+ * @LastEditTime: 2023-08-01 16:25:54
+ * @Description:
+-->
+<template>
+	<div :class="[className, { 'p-0': noPadding }]">
+		<slot />
+	</div>
+</template>
+
+<script>
+export default {
+	props: {
+		size: {
+			// 取值范围:  xl lg md sm
+			type: String,
+			default: 'de',
+			validator: function (val) {
+				return ['xl', 'lg', 'de', 'md', 'sm'].indexOf(val) !== -1;
+			},
+		},
+		noPadding: {
+			type: Boolean,
+			default: false,
+		},
+	},
+	computed: {
+		className: function () {
+			return `${this.size}-title`;
+		},
+	},
+};
+</script>
+
+<style lang="scss" scoped>
+$pxls: (xl, 28px) (lg, 24px) (de, 20px) (md, 18px) (sm, 16px);
+$mgr: 8px;
+@each $size, $height in $pxls {
+	.#{$size}-title {
+		font-size: 18px;
+		line-height: $height;
+		color: #000;
+		font-weight: 500;
+		font-family: '微软雅黑', 'Microsoft YaHei', Arial, Helvetica, sans-serif;
+
+		&::before {
+			content: '';
+			display: inline-block;
+			vertical-align: top;
+			width: 4px;
+			height: $height + 2px;
+			border-radius: 1px;
+			margin-right: $mgr;
+			background-color: #0b58ff;
+		}
+	}
+}
+
+.p-0 {
+	padding: 0;
+}
+</style>
diff --git a/src/views/packaging/packagingPrintType/add-or-updata.vue b/src/views/packaging/packagingPrintType/add-or-updata.vue
new file mode 100644
index 00000000..469b5622
--- /dev/null
+++ b/src/views/packaging/packagingPrintType/add-or-updata.vue
@@ -0,0 +1,347 @@
+<!--
+ * @Author: zhp
+ * @Date: 2023-10-17 16:50:19
+ * @LastEditTime: 2023-10-18 16:07:39
+ * @LastEditors: zhp
+ * @Description:
+-->
+<template>
+  <el-dialog :visible.sync="visible" :show-close="false" :wrapper-closable="false" width="40%">
+    <small-title slot="title" :no-padding="true">
+      {{ !dataForm.id ? '新增' : '编辑' }}
+    </small-title>
+
+    <div class="content">
+      <div class="visual-part">
+        <el-form ref="dataForm" :model="dataForm" :rules="dataRule" label-width="100px"
+          @keyup.enter.native="dataFormSubmit">
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="名称" prop="name">
+                <el-input v-model="dataForm.name" clearable placeholder="名称" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="类型描述" prop="description">
+                <el-input v-model="dataForm.description" clearable placeholder="类型描述" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <!-- <el-row :gutter="20">
+            <el-col :span="24">
+              <el-form-item label="完成单位产品用时" prop="processTime">
+                <el-input v-model="dataForm.processTime" placeholder="请输入完成单位产品用时" />
+              </el-form-item>
+            </el-col>
+          </el-row> -->
+        </el-form>
+
+        <!-- <small-title
+					style="margin: 16px 0; padding-left: 8px"
+					:no-padding="true">
+					产品属性列表
+				</small-title>
+
+				<div class="attr-list">
+					<base-table
+						:table-props="tableProps"
+						:page="listQuery.pageNo"
+						:limit="listQuery.pageSize"
+						:add-button-show="isdetail ? null : '添加属性'"
+						@emitButtonClick="addNew()"
+						:table-data="productAttributeList">
+						<method-btn
+							v-if="!isdetail"
+							slot="handleBtn"
+							:width="120"
+							label="操作"
+							:method-list="tableBtn"
+							@clickBtn="handleClick" />
+					</base-table>
+					<pagination
+						v-show="listQuery.total > 0"
+						:total="listQuery.total"
+						:page.sync="listQuery.pageNo"
+						:limit.sync="listQuery.pageSize"
+						:page-sizes="[5, 10, 15]"
+						@pagination="getList" />
+				</div> -->
+      </div>
+    </div>
+
+    <!-- <div style="position: absolute; bottom: 24px; right: 24px">
+			<el-button style="margin-right: 10px" @click="goback()">返回</el-button>
+			<el-button v-if="isdetail" type="primary" @click="goEdit()">
+				编辑
+			</el-button>
+			<span v-if="!isdetail">
+				<el-button type="primary" @click="dataFormSubmit()">保存</el-button>
+				<el-button
+					v-if="dataForm.id && !isdetail"
+					type="primary"
+					@click="addNew()">
+					添加属性
+				</el-button>
+			</span>
+		</div> -->
+    <template slot="footer">
+      <el-button style="" @click="goback()">取消</el-button>
+      <!-- <el-button v-if="isdetail" type="primary" @click="goEdit()">
+				编辑
+			</el-button> -->
+      <el-button type="primary" @click="dataFormSubmit()">确定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+
+import {
+  createPackingType,
+  updatePackingType,
+  getPackingType,
+  // getWorkOrderList,
+  // getCode,
+  // getCustomerList,
+  // getModelList
+} from '@/api/base/modelType.js';
+// import productAttrAdd from './attr-add';
+import { parseTime } from '../mixins/code-filter';
+import SmallTitle from './SmallTitle';
+
+const tableBtn = [
+	{
+		type: 'edit',
+		btnName: '编辑',
+	},
+	{
+		type: 'delete',
+		btnName: '删除',
+	},
+];
+const tableProps = [
+	{
+		prop: 'createTime',
+		label: '添加时间',
+		filter: parseTime,
+	},
+	{
+		prop: 'name',
+		label: '属性名',
+	},
+	{
+		prop: 'value',
+		label: '属性值',
+	},
+];
+
+export default {
+	components: { SmallTitle },
+	data() {
+		return {
+			visible: false,
+			addOrUpdateVisible: false,
+			tableBtn,
+      tableProps,
+      customerList: [],
+      modelList:[],
+      workOrderList:[],
+			productAttributeList: [],
+			dataForm: {
+				id: null,
+				// name: '', // 产品名称
+        name: '', // 产品编码
+				// area: 0, // 单位平方数(float only)
+        description: null, // 产品类型id
+        // workOrderId: null, // 单位产品用时 (s)
+        // customerId: '', // 规格
+        // content: '', // 单位id
+			},
+			listQuery: {
+				pageSize: 10,
+				pageNo: 1,
+				total: 0,
+			},
+			dataRule: {
+				name: [
+					{
+						required: true,
+						message: '名称不能为空',
+						trigger: 'blur',
+					},
+				],
+			},
+			// isdetail: false,
+		};
+  },
+	methods: {
+		// initData() {
+		// 	this.productAttributeList.splice(0);
+		// 	this.listQuery.total = 0;
+		// },
+    init(id) {
+      // this.getDict()
+			// this.initData();
+			// this.isdetail = isdetail || false;
+			this.dataForm.id = id || null;
+			this.visible = true;
+
+			this.$nextTick(() => {
+				this.$refs['dataForm'].resetFields();
+
+				if (this.dataForm.id) {
+					// 获取产品详情
+          getPackingType(id).then((response) => {
+						this.dataForm = response.data;
+					});
+					// 获取产品的属性列表
+					// this.getList();
+				} else {
+					// getCode().then((res) => {
+          //   this.dataForm.packagingCode = res.data;
+					// });
+				}
+			});
+		},
+
+		// getDict() {
+    //   // 获取产品的属性列表
+    //   getCustomerList().then((response) => {
+    //     console.log(response);
+    //     this.customerList = response.data
+    //     // this.listQuery.total = response.data.total;
+    //   })
+    //   getModelList().then((response) => {
+    //     console.log(response);
+    //     this.modelList = response.data
+    //     // this.listQuery.total = response.data.total;
+    //   })
+    //   getWorkOrderList().then((response) => {
+    //     // console.log(response);
+    //     this.workOrderList = response.data
+		// 		// this.listQuery.total = response.data.total;
+		// 	})
+		// },
+		// handleClick(raw) {
+		// 	if (raw.type === 'delete') {
+		// 		this.$confirm(
+		// 			`确定对${
+		// 				raw.data.name
+		// 					? '[名称=' + raw.data.name + ']'
+		// 					: '[序号=' + raw.data._pageIndex + ']'
+		// 			}进行删除操作?`,
+		// 			'提示',
+		// 			{
+		// 				confirmButtonText: '确定',
+		// 				cancelButtonText: '取消',
+		// 				type: 'warning',
+		// 			}
+		// 		)
+		// 			.then(() => {
+		// 				deleteProductAttr(raw.data.id).then(({ data }) => {
+		// 					this.$message({
+		// 						message: '操作成功',
+		// 						type: 'success',
+		// 						duration: 1500,
+		// 						onClose: () => {
+		// 							this.getList();
+		// 						},
+		// 					});
+		// 				});
+		// 			})
+		// 			.catch(() => {});
+		// 	} else {
+		// 		this.addNew(raw.data.id);
+		// 	}
+		// },
+		// 表单提交
+		dataFormSubmit() {
+			this.$refs['dataForm'].validate((valid) => {
+				if (valid) {
+					// 修改的提交
+					if (this.dataForm.id) {
+            updatePackingType(this.dataForm).then((response) => {
+							this.$modal.msgSuccess('修改成功');
+							this.visible = false;
+							this.$emit('refreshDataList');
+						});
+						return;
+					}
+					// 添加的提交
+          createPackingType(this.dataForm).then((response) => {
+						this.$modal.msgSuccess('新增成功');
+						this.visible = false;
+						this.$emit('refreshDataList');
+					});
+				}
+			});
+		},
+		// goEdit() {
+		// 	this.isdetail = false;
+		// },
+		// // 新增 / 修改
+		// addNew(id) {
+		// 	this.addOrUpdateVisible = true;
+		// 	this.$nextTick(() => {
+		// 		this.$refs.addOrUpdate.init(id);
+		// 	});
+		// },
+		goback() {
+			this.$emit('refreshDataList');
+			this.visible = false;
+			// this.initData();
+		},
+	},
+};
+</script>
+
+<!-- <style scoped>
+.drawer >>> .el-drawer {
+	border-radius: 8px 0 0 8px;
+	display: flex;
+	flex-direction: column;
+}
+
+.drawer >>> .el-form-item__label {
+	padding: 0;
+}
+
+.drawer >>> .el-drawer__header {
+	margin: 0;
+	padding: 32px 32px 24px;
+	border-bottom: 1px solid #dcdfe6;
+}
+.drawer >>> .el-drawer__body {
+	flex: 1;
+	height: 1px;
+	display: flex;
+	flex-direction: column;
+}
+
+.drawer >>> .content {
+	padding: 30px 24px;
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	/* height: 100%; */
+}
+
+.drawer >>> .visual-part {
+	flex: 1 auto;
+	max-height: 76vh;
+	overflow: hidden;
+	overflow-y: scroll;
+	padding-right: 10px; /* 调整滚动条样式 */
+}
+
+.drawer >>> .el-form,
+.drawer >>> .attr-list {
+	padding: 0 16px;
+}
+
+.drawer-body__footer {
+	display: flex;
+	justify-content: flex-end;
+	padding: 18px;
+}
+</style> -->
diff --git a/src/views/packaging/packagingPrintType/index.vue b/src/views/packaging/packagingPrintType/index.vue
new file mode 100644
index 00000000..740d250a
--- /dev/null
+++ b/src/views/packaging/packagingPrintType/index.vue
@@ -0,0 +1,191 @@
+<!--
+ * @Author: zwq
+ * @Date: 2023-08-01 14:55:51
+ * @LastEditors: zhp
+ * @LastEditTime: 2023-11-22 14:36:33
+ * @Description:
+-->
+<template>
+	<div class="app-container">
+		<search-bar
+			:formConfigs="formConfig"
+			ref="searchBarForm"
+			@headBtnClick="buttonClick" />
+		<base-table
+			:table-props="tableProps"
+			:page="listQuery.pageNo"
+			:limit="listQuery.pageSize"
+			:table-data="tableData">
+			<method-btn
+				v-if="tableBtn.length"
+				slot="handleBtn"
+				:width="120"
+				label="操作"
+				:method-list="tableBtn"
+				@clickBtn="handleClick" />
+		</base-table>
+		<pagination
+			:limit.sync="listQuery.pageSize"
+			:page.sync="listQuery.pageNo"
+			:total="listQuery.total"
+			@pagination="getDataList" />
+		<add-or-update
+			v-if="addOrUpdateVisible"
+			ref="addOrUpdate"
+			@refreshDataList="getDataList" />
+	</div>
+</template>
+
+<script>
+import AddOrUpdate from './add-or-updata';
+// import unitDict from './unitDict';
+import basicPage from '../mixins/basic-page';
+import { parseTime } from '../mixins/code-filter';
+import {
+	deletePackingType,
+  getPackingTypePage,
+	// exportPackingExcel,
+} from '@/api/base/modelType';
+
+const tableProps = [
+	{
+    prop: 'name',
+    label: '名称'
+	},
+	{
+    prop: 'description',
+		label: '描述'
+	},
+	{
+    prop: 'createTime',
+		label: '生成日期',
+		filter: parseTime
+	},
+];
+
+export default {
+	mixins: [basicPage],
+	data() {
+		return {
+			urlOptions: {
+        getDataListURL: getPackingTypePage,
+				deleteURL: deletePackingType,
+				// exportURL: exportPackingExcel,
+			},
+			tableProps,
+			tableBtn: [
+        this.$auth.hasPermi(`base:packaging-print-log:update`)
+					? {
+							type: 'edit',
+							btnName: '编辑',
+					  }
+          : undefined,
+        this.$auth.hasPermi(`base:packaging-print-log:delete`)
+					? {
+							type: 'delete',
+							btnName: '删除',
+					  }
+          : undefined,
+
+			].filter((v) => v),
+			tableData: [],
+			formConfig: [
+				// {
+				// 	type: 'input',
+        //   label: '工单',
+        //   placeholder: '工单',
+        //   param: 'workOrderId',
+				// },
+				// {
+        //   // parent: 'dateFilterType',
+        //   // 日期选择
+        //   type: 'datePicker',
+        //   label: '时间',
+        //   dateType: 'date',
+        //   placeholder: '选择日期',
+        //   format: 'yyyy-MM-dd',
+        //   valueFormat: 'yyyy-MM-dd',
+        //   param: 'createTime',
+				// },
+				// {
+				// 	type: 'button',
+				// 	btnName: '搜索',
+				// 	name: 'search',
+				// 	color: 'primary',
+				// },
+				// {
+				// 	type: 'separate',
+				// },
+				// {
+				// 	type: 'button',
+				// 	btnName: '重置',
+				// 	name: 'reset',
+				// },
+				{
+					type: 'separate',
+				},
+				{
+          type: this.$auth.hasPermi('base:packaging-print-type:create') ? 'button' : '',
+					btnName: '新增',
+					name: 'add',
+					color: 'success',
+					plain: true,
+				},
+				// {
+				// 	type: 'separate',
+				// 	type: this.$auth.hasPermi('base:product:create') ? 'separate' : '',
+				// },
+				// {
+				// 	type: this.$auth.hasPermi('base:product:export') ? 'button' : '',
+				// 	btnName: '导出',
+				// 	name: 'export',
+				// 	color: 'warning',
+				// },
+			],
+		};
+	},
+	components: {
+		AddOrUpdate,
+	},
+	created() {},
+	methods: {
+		buttonClick(val) {
+			switch (val.btnName) {
+				case 'search':
+					this.listQuery.pageNo = 1;
+					this.listQuery.pageSize = 10;
+          this.listQuery.packagingCode = val.packagingCode;
+          this.listQuery.createTime = val.createTime;
+					this.getDataList();
+					break;
+				case 'reset':
+					this.$refs.searchBarForm.resetForm();
+					this.listQuery = {
+						pageSize: 10,
+						pageNo: 1,
+						total: 1,
+					};
+					this.getDataList();
+					break;
+				case 'add':
+					this.addOrEditTitle = '新增';
+					this.addOrUpdateVisible = true;
+					this.addOrUpdateHandle();
+					break;
+				case 'export':
+					this.handleExport();
+					break;
+				default:
+					console.log(val);
+			}
+		},
+		otherMethods(val) {
+			this.addOrUpdateVisible = true;
+			this.addOrEditTitle = '详情';
+			this.$nextTick(() => {
+				this.$refs.addOrUpdate.init(val.data.id, true);
+			});
+		},
+	},
+};
+</script>
diff --git a/src/views/packaging/packagingPrintType/unitDict.vue b/src/views/packaging/packagingPrintType/unitDict.vue
new file mode 100644
index 00000000..94702ab4
--- /dev/null
+++ b/src/views/packaging/packagingPrintType/unitDict.vue
@@ -0,0 +1,15 @@
+<template>
+  <dict-tag
+    :type="DICT_TYPE.UNIT_DICT"
+    :value="injectData.unitDictValue" />
+</template>
+<script>
+export default {
+	props: {
+		injectData: {
+			type: Object,
+			default: () => ({}),
+		},
+	},
+};
+</script>
diff --git a/src/views/quality/currentData/currentTest.vue b/src/views/quality/currentData/currentTest.vue
index 96b753bb..f00ada1b 100644
--- a/src/views/quality/currentData/currentTest.vue
+++ b/src/views/quality/currentData/currentTest.vue
@@ -70,7 +70,7 @@ export default {
 		};
 	},
 	mounted() {
-		// this.getList();
+		this.getList();
 	},
 	methods: {
 		/** 查询列表 */
diff --git a/src/views/quality/currentData/hourData.vue b/src/views/quality/currentData/hourData.vue
index ac876041..a7acb694 100644
--- a/src/views/quality/currentData/hourData.vue
+++ b/src/views/quality/currentData/hourData.vue
@@ -43,8 +43,51 @@ export default {
 		async getList() {
 			const res = await getRecordInOneDay();
 			if (res.data) {
-				this.nameData = this.filterNameData(res.data.nameData);
-				this.list = this.filterData(res.data.data);
+				// this.nameData = this.filterNameData(res.data.nameData);
+        // this.list = this.filterData(res.data.data);
+        const seen = new Set(); // 用于去重
+        const columns = [];
+
+        res.data.nameData.forEach(item => {
+          if (item.tree === 1) {
+            const primaryHeader = item.name;
+            const children = res.data.nameData
+              .filter(child => child.tree === 2 && child.parentId === item.id)
+              .map(child => {
+                const key = `${primaryHeader}-${child.name}`;
+                if (!seen.has(key)) {
+                  seen.add(key);
+                  return {
+                    label: child.name,
+                    prop: child.id
+                  };
+                }
+                return null;
+              })
+              .filter(Boolean); // 过滤掉 null
+
+            if (children.length > 0) {
+              this.nameData.push({
+                label: moment(primaryHeader).format('yyyy-MM-DD HH:mm:ss'),
+                children
+              });
+            }
+          }
+        });
+        this.list = res.data.data.map(item => {
+          const row = {};
+          row.inspectionDetContent = item.inspectionDetContent;
+          item.data.forEach((inner) => {
+            inner.children.forEach((child) => {
+              row[child.id] = child.dynamicValue;
+            });
+          });
+          return row;
+        });
+        // this.nameData = columns.filter((column, index, self) =>
+        //   index === self.findIndex(c => c.label === column.label)
+        // );
+        console.log(this.list, this.nameData)
 			} else {
 				this.nameData = [];
 				this.list = [];
-- 
2.45.2