From a892616db370b2185bc546a11c873df1137cc7e0 Mon Sep 17 00:00:00 2001
From: zhaowei <zhaowei>
Date: 星期一, 01 九月 2025 09:44:01 +0800
Subject: [PATCH] 1、设备事故登记表以及三不放过原则分析报表导出及批量打印功能 2、调整首页看板及图表样式

---
 src/views/dashboard/IndexSignage.vue                                    |  294 ++++++++---------
 src/components/page/GlobalFooter.vue                                    |    2 
 src/views/eam/repair/EamReportAccidentsRegisterList.vue                 |   31 +
 src/views/eam/repair/EamReportThreeNoSpareList.vue                      |  154 +++++----
 src/views/eam/repair/modules/EamAccidentsRegisterBatchPrintModal.vue    |  273 +++++++++++++++++
 src/views/eam/repair/modules/EamThreeNoSpareAnalysisBatchPrintModal.vue |  190 +++++++++++
 src/components/page/GlobalLayout.vue                                    |    2 
 7 files changed, 713 insertions(+), 233 deletions(-)

diff --git a/src/components/page/GlobalFooter.vue b/src/components/page/GlobalFooter.vue
index 9bb6f97..7527d2e 100644
--- a/src/components/page/GlobalFooter.vue
+++ b/src/components/page/GlobalFooter.vue
@@ -9,7 +9,7 @@
     <!--<a href="https://vuecomponent.github.io/ant-design-vue/docs/vue/introduce-cn/">Vue Antd</a>-->
     <!--</div>-->
     <div class="copyright"
-         :style="{background:$route.meta.title==='棣栭〉'?'#fff':''}">
+         :style="{background:$route.meta.title==='棣栭〉'?'#FEFEFE':''}">
       Copyright
       <a-icon type="copyright"/>
       2024 <span>2015-2025 鐏电鏅鸿兘</span>
diff --git a/src/components/page/GlobalLayout.vue b/src/components/page/GlobalLayout.vue
index f389d43..341ba4e 100644
--- a/src/components/page/GlobalLayout.vue
+++ b/src/components/page/GlobalLayout.vue
@@ -70,7 +70,7 @@
 
       <!-- layout content -->
       <a-layout-content
-        :style="{ height: '100%', paddingTop: fixedHeader ? '59px' : '0' ,background: $route.meta.title=='棣栭〉'?'#fff':''}">
+        :style="{ height: '100%', paddingTop: fixedHeader ? '59px' : '0' ,background: $route.meta.title=='棣栭〉'?'#FEFEFE':''}">
         <slot></slot>
       </a-layout-content>
 
diff --git a/src/views/dashboard/IndexSignage.vue b/src/views/dashboard/IndexSignage.vue
index a93745a..949d5f3 100644
--- a/src/views/dashboard/IndexSignage.vue
+++ b/src/views/dashboard/IndexSignage.vue
@@ -213,25 +213,37 @@
             if (res.success && res.result) {
               this.techConditionData = [
                 {
-                  value: res.result.jszt.find(item => item.code === 'QUALIFIED').value,
+                  value: res.result.jszt.length > 0 ? res.result.jszt.find(item => item.code === 'QUALIFIED').value : 0,
                   name: '鍚堟牸',
                   technologyStatus: 'QUALIFIED'
                 },
                 {
-                  value: res.result.jszt.find(item => item.code === 'PROHIBITED').value,
+                  value: res.result.jszt.length > 0 ? res.result.jszt.find(item => item.code === 'PROHIBITED').value : 0,
                   name: '绂佺敤',
                   technologyStatus: 'PROHIBITED'
                 },
                 {
-                  value: res.result.jszt.find(item => item.code === 'RESTRICTED').value,
+                  value: res.result.jszt.length > 0 ? res.result.jszt.find(item => item.code === 'RESTRICTED').value : 0,
                   name: '闄愮敤',
                   technologyStatus: 'RESTRICTED'
                 }
               ]
               this.warrantyMalfunctionData = [
-                { value: res.result.bxqk.find(item => item.code === 'bx').value, name: '鎶ヤ慨', code: 'bx' },
-                { value: res.result.bxqk.find(item => item.code === 'stop').value, name: '鍋滄満', code: 'stop' },
-                { value: res.result.bxqk.find(item => item.code === 'run').value, name: '杩愯', code: 'run' }
+                {
+                  value: res.result.bxqk.length > 0 ? res.result.bxqk.find(item => item.code === 'bx').value : 0,
+                  name: '鎶ヤ慨',
+                  code: 'bx'
+                },
+                {
+                  value: res.result.bxqk.length > 0 ? res.result.bxqk.find(item => item.code === 'stop').value : 0,
+                  name: '鍋滄満',
+                  code: 'stop'
+                },
+                {
+                  value: res.result.bxqk.length > 0 ? res.result.bxqk.find(item => item.code === 'run').value : 0,
+                  name: '杩愯',
+                  code: 'run'
+                }
               ]
               this.techConditionChartRequireFinished = true
               this.warrantyMalfunctionChartRequireFinished = true
@@ -341,7 +353,7 @@
             icon: 'roundRect',
             itemGap: 15,
             textStyle: {
-              color: 'inherit',
+              color: 'rgba(0,0,0,.45)',
               fontSize: 14,
               padding: [0, 0, 0, 0]
             },
@@ -360,13 +372,13 @@
               color: [
                 '#686869',
                 '#AA6349',
-                '#EAEA7C',
+                '#FFFF88',
                 '#5D975D'
               ],
               label: {
                 position: 'outside',
                 show: true,
-                color: 'inherit',
+                color: 'rgba(0,0,0,.45)',
                 // textBorderColor: 'inherit',
                 // textBorderWidth: 1,
                 fontSize: 16,
@@ -379,7 +391,10 @@
               labelLine: {
                 show: true,
                 length2: 10,
-                length: 10
+                length: 10,
+                lineStyle: {
+                  color: 'rgba(0,0,0,.45)'
+                }
               },
               data: this.runningStateData
             }
@@ -400,31 +415,20 @@
       drawEfficiencyChart() {
         const colorArray = [
           {
-            top: '#79CEAA',
-            bottom: '#79CEAA'
+            top: '#EA967B',
+            bottom: '#F8E18B'
           },
           {
-            top: '#F589A2',
-            bottom: '#F589A2'
+            top: '#62AC75',
+            bottom: '#A8D07C'
           },
           {
-            top: '#6FBF9D',
-            bottom: '#6FBF9D'
+            top: '#32ACBF',
+            bottom: '#7BCAC5'
           },
           {
-            top: '#66DFE2',
-            bottom: '#66DFE2'
-          }, {
-            top: '#A7F0C1',
-            bottom: '#A7F0C1'
-          },
-          {
-            top: '#FAE893',
-            bottom: '#FAE893'
-          },
-          {
-            top: '#F7B7A0',
-            bottom: '#F7B7A0'
+            top: '#7196CE',
+            bottom: '#8DCCEF'
           }
         ]
         const data = this.efficiencyData
@@ -629,7 +633,7 @@
             icon: 'roundRect',
             itemGap: 15,
             textStyle: {
-              color: 'inherit',
+              color: 'rgba(0,0,0,.45)',
               fontSize: 14,
               padding: [0, 0, 0, 0]
             },
@@ -652,7 +656,7 @@
               label: {
                 position: 'outside',
                 show: true,
-                color: 'inherit',
+                color: 'rgba(0,0,0,.45)',
                 // textBorderColor: 'inherit',
                 // textBorderWidth: 1,
                 fontSize: 16,
@@ -665,7 +669,10 @@
               labelLine: {
                 show: true,
                 length2: 10,
-                length: 10
+                length: 10,
+                lineStyle: {
+                  color: 'rgba(0,0,0,.45)'
+                }
               },
               data: this.techConditionData
             }
@@ -715,7 +722,7 @@
             icon: 'roundRect',
             itemGap: 15,
             textStyle: {
-              color: 'inherit',
+              color: 'rgba(0,0,0,.45)',
               fontSize: 14,
               padding: [0, 0, 0, 0]
             },
@@ -733,12 +740,12 @@
               color: [
                 '#00CED1',
                 '#B85B38',
-                '#EAEA7C'
+                '#FFFF88'
               ],
               label: {
                 position: 'outside',
                 show: true,
-                color: 'inherit',
+                color: 'rgba(0,0,0,.45)',
                 // textBorderColor: 'inherit',
                 // textBorderWidth: 1,
                 fontSize: 16,
@@ -751,7 +758,10 @@
               labelLine: {
                 show: true,
                 length2: 10,
-                length: 10
+                length: 10,
+                lineStyle: {
+                  color: 'rgba(0,0,0,.45)'
+                }
               },
               data: this.warrantyMalfunctionData
             }
@@ -773,9 +783,9 @@
         this.maintenanceConfig = {
           indexHeader: '搴忓彿',
           header: ['杞﹂棿', '鏃ユ湡', '鍐呭'],
-          headerBGC: '#266C86',
-          oddRowBGC: '#003B51',
-          evenRowBGC: '#0A2732',
+          headerBGC: '#46B7E3',
+          oddRowBGC: '#0383AF',
+          evenRowBGC: '#0395C9',
           data: this.twoMaintenanceChartData,
           index: true,
           columnWidth: [100, 300, 300, 300],
@@ -785,7 +795,6 @@
 
       /* 缁樺埗鍗曟煴鍥� */
       drawBarChart() {
-        const colorArray = ['#79CEAA', '#F589A2', '#6FBF9D', '#66DFE2', '#A7F0C1', '#FAE893', '#F7B7A0']
         const defaultData = []
         const dataMax = this.barChartData.length > 0 ? +this.barChartData.sort((x, y) => +y.value - +x.value)[0].value : 0
         let yAxisMax
@@ -793,6 +802,9 @@
         else yAxisMax = Math.ceil(dataMax / 5) * 5 // 璁剧疆鏌卞浘鑳屾櫙闃村奖榛樿鍊硷紝鎬濊矾涓烘暟鎹渶澶у�兼渶鎺ヨ繎鐨勮兘琚�5鏁撮櫎鐨勬暟瀛�
         const yAxisInterval = yAxisMax / 5 // 鍚屾椂灏嗗埢搴﹀�煎垎鎴�5浠�
         this.barChartData.forEach(item => defaultData.push(yAxisMax))
+        console.log('bar', this.barChartData)
+        let barTopColor = ['#EA967B', '#62AC75', '#32ACBF', '#7196CE']
+        let barBottomColor = ['#F8E18B', '#A8D07C', '#7BCAC5', '#8DCCEF']
         const option = {
           title: {
             show: true, // 鏄惁鏄剧ず鏍囬锛岄粯璁や负true
@@ -814,149 +826,124 @@
             formatter: function(params) {
               return '<span style="font-weight:bolder;">' + params[0].name + '</span><br/>' +
                 '<span style="display:inline-block; width:10px; height:10px; border-radius:100px; margin-right:5px; background:' + params[0].color + '"></span>' + ' OEE: ' + params[0].value + '%'
-            },
-            // backgroundColor: 'rgba(9, 24, 48, 0.5)',
-            borderColor: 'rgba(75, 253, 238, 0.4)',
-            textStyle: {
-              // color: '#CFE3FC'
-            },
-            borderWidth: 1
+            }
           },
           grid: {
             top: '15%',
             left: '10%'
           },
-          xAxis: [{
-            name: '',
-            nameLocation: 'middle',
-            nameGap: 40, // x杞磏ame涓庢í鍧愭爣杞寸嚎鐨勯棿璺�
-            type: 'category',
-            data: this.barChartData.map(item => item.productionId),
+          xAxis: {
+            data: this.barChartData.map(item => item.name),
+            axisTick: {
+              show: false
+            },
             axisLine: {
+              show: true,
               lineStyle: {
                 color: 'rgba(0,0,0,.45)'
               }
             },
             axisLabel: {
-              show: true, // 鏄惁鏄剧ず鍒诲害鏍囩锛岄粯璁ゆ樉绀�
-              interval: 0, // 鍧愭爣杞村埢搴︽爣绛剧殑鏄剧ず闂撮殧锛屽湪绫荤洰杞翠腑鏈夋晥锛涢粯璁や細閲囩敤鏍囩涓嶉噸鍙犵殑绛栫暐闂撮殧鏄剧ず鏍囩锛涘彲浠ヨ缃垚0寮哄埗鏄剧ず鎵�鏈夋爣绛撅紱濡傛灉璁剧疆涓�1锛岃〃绀恒�庨殧涓�涓爣绛炬樉绀轰竴涓爣绛俱�忥紝濡傛灉鍊间负2锛岃〃绀洪殧涓や釜鏍囩鏄剧ず涓�涓爣绛撅紝浠ユ绫绘帹銆�
-              rotate: this.barChartData.length >= 6 ? -30 : 0, // 鍒诲害鏍囩鏃嬭浆鐨勮搴︼紝鍦ㄧ被鐩酱鐨勭被鐩爣绛炬樉绀轰笉涓嬬殑鏃跺�欏彲浠ラ�氳繃鏃嬭浆闃叉鏍囩涔嬮棿閲嶅彔锛涙棆杞殑瑙掑害浠�-90搴﹀埌90搴�
-              inside: false, // 鍒诲害鏍囩鏄惁鏈濆唴锛岄粯璁ゆ湞澶�
-              margin: 10, // 鍒诲害鏍囩涓庤酱绾夸箣闂寸殑璺濈
-              formatter: value => {
-                return `${this.barChartData.find(item => item.productionId === value).name}`
-              },
-              fontSize: 14
-            },
-            axisTick: {
               show: true,
-              alignWithLabel: true
-            }
-          }],
-          yAxis: [{
+              rotate: 20,
+              margin: 25,
+              textStyle: {
+                fontSize: 14,
+                color: 'rgba(0,0,0,.45)',
+                align: 'center'
+              }
+            },
+            interval: 0
+          },
+          yAxis: {
             name: '%',
-            min: 0,
-            max: yAxisMax,
-            interval: yAxisInterval,
-            axisLabel: {
-              formatter: '{value}',
-              fontSize: 14
+            splitLine: {
+              show: false
             },
             axisTick: {
               show: false
             },
             axisLine: {
-              show: false,
+              show: true,
               lineStyle: {
                 color: 'rgba(0,0,0,.45)'
               }
             },
-            splitLine: {
-              show: false,
-              lineStyle: {
-                color: 'rgba(255,255,255,0.12)'
+            axisLabel: {
+              show: true,
+              margin: 10,
+              textStyle: {
+                fontSize: 14,
+                color: 'rgba(0,0,0,.45)'
               }
             }
-          }],
+          },
           series: [
             {
-              type: 'bar',
-              data: this.barChartData,
-              barWidth: this.barChartData.length > 5 ? '40%' : 30,
+              type: 'pictorialBar',
+              symbolSize: [26, 10],
+              symbolOffset: [0, -5],
+              z: 12,
               itemStyle: {
                 color: function(params) {
-                  let num = colorArray.length
-                  return colorArray[params.dataIndex % num]
+                  return barBottomColor[params.dataIndex % barBottomColor.length]
                 }
-                // color: new echarts.graphic.LinearGradient(
-                //   0, 0, 0, 1, [{
-                //     offset: 0,
-                //     color: '#83bff6'
-                //   },
-                //     {
-                //       offset: 0.5,
-                //       color: '#188df0'
-                //     },
-                //     {
-                //       offset: 1,
-                //       color: '#188df0'
-                //     }
-                //   ]
-                // )
               },
-              zlevel: 1,
               label: {
-                show: false,
-                lineHeight: 10,
-                formatter: params => {
-                  if (+params.value === 0) return ''
-                  else return params.value
-                },
+                show: true,
                 position: 'top',
-                textStyle: {
-                  color: '#fff',
-                  fontSize: 16
-                }
-              }
+                fontSize: 12,
+                color: 'rgba(0,0,0,.45)'
+              },
+              symbolPosition: 'end',
+              data: this.barChartData
             },
             {
-              name: '鑳屾櫙',
-              type: 'bar',
-              barWidth: this.barChartData.length > 5 ? '40%' : 30,
-              barGap: '-100%',
-              data: defaultData,
+              type: 'pictorialBar',
+              symbolSize: [26, 10],
+              symbolOffset: [0, 5],
+              z: 12,
               itemStyle: {
-                color: 'rgba(0,0,0,.05)'
-              }
+                color: function(params) {
+                  return barTopColor[params.dataIndex % barTopColor.length]
+                }
+              },
+              data: this.barChartData
+            },
+            {
+              type: 'bar',
+              itemStyle: {
+                color: function(params) {
+                  return new echarts.graphic.LinearGradient(
+                    0, 0, 0, 1,
+                    [{
+                      offset: 1,
+                      color: barTopColor[params.dataIndex % barTopColor.length]
+                    },
+                      {
+                        offset: 0,
+                        color: barBottomColor[params.dataIndex % barBottomColor.length]
+                      }
+                    ]
+                  )
+                },
+                opacity: .9
+              },
+              z: 16,
+              barWidth: 26,
+              barGap: '-100%',
+              data: this.barChartData
             }]
-          // aria: {
-          //   enabled: true,
-          //   decal: {
-          //     show: true,
-          //     decals: [
-          //       {
-          //         color: 'rgba(0,0,0,.2)',
-          //         dashArrayX: [20, 0],
-          //         dashArrayY: [1, 2],
-          //         symbol: 'rect',
-          //         rotation: Math.PI / 4
-          //       },
-          //       {
-          //         symbol: 'none'
-          //       }
-          //     ]
-          //   }
-          // }
         }
+
         option.title.text = moment().subtract(1, 'months').format('M鏈�') + `OEE`
         this.barChart.setOption(option, true)
         this.barChart.hideLoading()
 
         this.barChart.on('click', params => {
           let productionId
-          // 鐐瑰嚮鐨勬槸鏌变綋鐨勫�硷紝鍚﹀垯鐐瑰嚮鐨勪负鏌变綋鑳屾櫙闃村奖
-          if (params.seriesIndex === 0) productionId = params.data.productionId
-          else productionId = params.name
+          console.log('params', params)
+          productionId = params.data.productionId
 
           this.$router.push({
             name: 'mdc-base-OEEAnalysis',
@@ -968,7 +955,7 @@
       /* 缁樺埗鍙屾煴鍥� */
       drawDoubleBarChart() {
         const option = {
-          color: ['#4992FF', '#4DC0B1'],
+          color: ['#1890FF', '#2EC35C'],
           tooltip: {
             confine: true,
             formatter: function(params) {
@@ -1077,30 +1064,32 @@
           series: [{
             type: 'bar',
             barWidth: 20,
+            barGap: '0%',
             itemStyle: { barBorderRadius: 4 },
             name: 'OEE',
             data: this.doubleBarChartData.oeeList,
             label: {
-              show: false,
+              show: true,
               lineHeight: 10,
               formatter: params => {
                 if (+params.value === 0) return ''
                 else return params.value
               },
-              position: 'inside',
+              position: 'top',
               textStyle: {
-                color: '#fff',
-                fontSize: 12
+                color: 'rgba(0,0,0,.45)',
+                fontSize: 10
               }
             }
           }, {
             type: 'bar',
             barWidth: 20,
+            barGap: '0%',
             itemStyle: { barBorderRadius: 4 },
             name: 'TEEP',
             data: this.doubleBarChartData.utilizationList,
             label: {
-              show: false,
+              show: true,
               lineHeight: 10,
               formatter: params => {
                 if (+params.value === 0) return ''
@@ -1108,8 +1097,8 @@
               },
               position: 'inside',
               textStyle: {
-                color: '#fff',
-                fontSize: 12
+                color: 'rgba(0,0,0,.45)',
+                fontSize: 10
               }
             }
           }
@@ -1124,13 +1113,13 @@
         this.problemConfig = {
           indexHeader: '搴忓彿',
           header: ['鏃堕棿', '闂鍐呭'],
-          headerBGC: '#83B883',
-          oddRowBGC: '#556955',
-          evenRowBGC: '#556955',
+          headerBGC: '#A5CCE6',
+          oddRowBGC: '#6B9FCD',
+          evenRowBGC: '#5A7D9A',
           data: this.workshopProblemChartData,
           index: true,
           columnWidth: [100, 200, 300],
-          align: ['center']
+          align: ['center', 'center', 'center']
         }
       },
 
@@ -1152,7 +1141,6 @@
         } else {
           this.pieChartRadius = this.normalPieChartRadius.map(item => item = (+item.slice(0, -1) * (clientWidth / this.firstEnterClientWidth)) + '%')
         }
-        console.log('pieChartRadius', this.pieChartRadius)
         this.$nextTick(() => {
           if (this.runningStateChartDataRequireFinished) this.drawRunningStateChart(this.currentPageProductionId)
           if (this.techConditionChartRequireFinished) this.drawTechConditionChart()
diff --git a/src/views/eam/repair/EamReportAccidentsRegisterList.vue b/src/views/eam/repair/EamReportAccidentsRegisterList.vue
index 9677555..a01df26 100644
--- a/src/views/eam/repair/EamReportAccidentsRegisterList.vue
+++ b/src/views/eam/repair/EamReportAccidentsRegisterList.vue
@@ -26,9 +26,22 @@
       </a-form>
     </div>
 
+    <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
+    <div class="table-operator">
+      <a-button @click="handleBatchPrint" type="primary" icon="monitor" :disabled="selectedRowKeys.length===0">鎵归噺棰勮
+      </a-button>
+    </div>
+
+    <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+      <i class="anticon anticon-info-circle ant-alert-icon"></i> 宸查�夋嫨 <a style="font-weight: 600">{{
+      selectedRowKeys.length }}</a>椤�
+      <a style="margin-left: 24px" @click="onClearSelected">娓呯┖</a>
+    </div>
+
     <!-- table鍖哄煙-begin -->
     <a-table ref="table" size="middle" bordered rowKey="id" :columns="columns" :dataSource="dataSource"
-             :pagination="ipagination" :loading="loading" :scroll="{x:'max-content'}" @change="handleTableChange">
+             :pagination="ipagination" :loading="loading" :scroll="{x:'max-content'}" @change="handleTableChange"
+             :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}">
 
       <!--鏄惁鏈夎澶囨搷浣滆瘉-->
       <template slot="operationCertificate" slot-scope="text">
@@ -89,6 +102,9 @@
     <!--瀹℃壒绐楀彛-->
     <report-accidents-register-approval-modal ref="reportAccidentsRegisterApprovalModal"
                                               :selectShenpiData="selectedRowData"/>
+
+    <!--鎵归噺鎵撳嵃绐楀彛-->
+    <eam-accidents-register-batch-print-modal ref="batchPrintModal"/>
   </a-card>
 </template>
 
@@ -99,11 +115,13 @@
   import { getAction } from '@/api/manage'
   import ReportAccidentsRegisterApprovalModal
     from '../../flowable/workflow/repairOrder/ReportAccidentsRegisterApprovalModal'
+  import EamAccidentsRegisterBatchPrintModal from './modules/EamAccidentsRegisterBatchPrintModal'
 
   export default {
     name: 'EamReportAccidentsRegisterList',
     mixins: [JeecgListMixin],
     components: {
+      EamAccidentsRegisterBatchPrintModal,
       ReportAccidentsRegisterApprovalModal,
       LxSearchEquipmentSelect,
       EamReportAccidentsRegisterModal
@@ -202,19 +220,19 @@
             title: '浜嬫晠鐜拌薄',
             align: 'center',
             dataIndex: 'accidentPhenomenon',
-            scopedSlots: {customRender: 'accidentPhenomenon'},
+            scopedSlots: { customRender: 'accidentPhenomenon' }
           },
           {
             title: '閲囧彇鎺柦',
             align: 'center',
             dataIndex: 'measure',
-            scopedSlots: {customRender: 'measure'},
+            scopedSlots: { customRender: 'measure' }
           },
           {
             title: '閫犳垚缁撴灉',
             align: 'center',
             dataIndex: 'causingResults',
-            scopedSlots: {customRender: 'causingResults'},
+            scopedSlots: { customRender: 'causingResults' }
           },
           {
             title: '鎿嶄綔宸�',
@@ -409,6 +427,11 @@
           })
       },
 
+      // 鎵归噺鎵撳嵃
+      handleBatchPrint() {
+        this.$refs.batchPrintModal.handlePreview(this.selectedRowKeys.join())
+      },
+
       /**
        * 鐐瑰嚮璇︽儏鏃惰Е鍙戞椂瑙﹀彂
        * @param record
diff --git a/src/views/eam/repair/EamReportThreeNoSpareList.vue b/src/views/eam/repair/EamReportThreeNoSpareList.vue
index 6fd1953..cdea0ba 100644
--- a/src/views/eam/repair/EamReportThreeNoSpareList.vue
+++ b/src/views/eam/repair/EamReportThreeNoSpareList.vue
@@ -12,25 +12,26 @@
           </a-col>
           <a-col :xl="6" :lg="7" :md="8" :sm="24">
             <a-form-item label="鐘舵��">
-              <j-dict-select-tag dict-code="report_three_no_spare_submit_status"  placeholder="璇烽�夋嫨鐘舵��" v-model="queryParam.submitStatus"/>
+              <j-dict-select-tag dict-code="report_three_no_spare_submit_status" placeholder="璇烽�夋嫨鐘舵��"
+                                 v-model="queryParam.submitStatus"/>
             </a-form-item>
           </a-col>
-        <template v-if="toggleSearchStatus">
-          <a-col :xl="6" :lg="7" :md="8" :sm="24">
-            <a-form-item label="鍘熷洜鍒嗘瀽">
-              <a-input placeholder="璇疯緭鍏ュ師鍥犲垎鏋�" v-model="queryParam.causeAnalysis"></a-input>
-            </a-form-item>
-          </a-col>
-          <a-col :xl="6" :lg="7" :md="8" :sm="24">
-            <a-form-item label="鍩硅褰㈠紡">
-              <a-input placeholder="璇疯緭鍏ュ煿璁舰寮�" v-model="queryParam.trainingFormat"></a-input>
-            </a-form-item>
-          </a-col>
-          <a-col :xl="6" :lg="7" :md="8" :sm="24">
-            <a-form-item label="鍩硅鍐呭">
-              <a-input placeholder="璇疯緭鍏ュ煿璁唴瀹�" v-model="queryParam.trainingContent"></a-input>
-            </a-form-item>
-          </a-col>
+          <template v-if="toggleSearchStatus">
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="鍘熷洜鍒嗘瀽">
+                <a-input placeholder="璇疯緭鍏ュ師鍥犲垎鏋�" v-model="queryParam.causeAnalysis"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="鍩硅褰㈠紡">
+                <a-input placeholder="璇疯緭鍏ュ煿璁舰寮�" v-model="queryParam.trainingFormat"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="鍩硅鍐呭">
+                <a-input placeholder="璇疯緭鍏ュ煿璁唴瀹�" v-model="queryParam.trainingContent"></a-input>
+              </a-form-item>
+            </a-col>
           </template>
           <a-col :xl="6" :lg="7" :md="8" :sm="24">
             <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
@@ -49,27 +50,23 @@
 
     <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
     <div class="table-operator">
+      <a-button @click="handleBatchPrint" type="primary" icon="monitor" :disabled="selectedRowKeys.length===0">鎵归噺棰勮
+      </a-button>
     </div>
 
     <!-- table鍖哄煙-begin -->
     <div>
-
-      <a-table
-        ref="table"
-        size="middle"
-        bordered
-        rowKey="id"
-        :columns="columns"
-        :dataSource="dataSource"
-        :pagination="ipagination"
-        :loading="loading"
-        :scroll="{x:'max-content'}"
-        @change="handleTableChange">
+      <a-table ref="table" size="middle" bordered rowKey="id" :columns="columns" :dataSource="dataSource"
+               :pagination="ipagination" :loading="loading" :scroll="{x:'max-content'}"
+               :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+               @change="handleTableChange">
         <span slot="action" slot-scope="text, record">
           <template>
-             <a v-if="record.submitStatus=='PENDING_SUBMIT'||record.submitStatus=='REJECTED'" @click="handleFillIn(record)">濉姤</a>
-             <a-divider  v-if="record.submitStatus=='PENDING_SUBMIT'||record.submitStatus=='REJECTED'" type="vertical"/>
-             <a-popconfirm  v-if="record.submitStatus=='PENDING_SUBMIT'||record.submitStatus=='REJECTED'" title="纭畾鎻愪氦鍚�?" @confirm="() => handleSubmit(record.id)">
+             <a v-if="record.submitStatus=='PENDING_SUBMIT'||record.submitStatus=='REJECTED'"
+                @click="handleFillIn(record)">濉姤</a>
+             <a-divider v-if="record.submitStatus=='PENDING_SUBMIT'||record.submitStatus=='REJECTED'" type="vertical"/>
+             <a-popconfirm v-if="record.submitStatus=='PENDING_SUBMIT'||record.submitStatus=='REJECTED'" title="纭畾鎻愪氦鍚�?"
+                           @confirm="() => handleSubmit(record.id)">
                <a>鎻愪氦</a>
              </a-popconfirm>
           </template>
@@ -112,12 +109,13 @@
     <!-- table鍖哄煙-end -->
 
     <!-- 琛ㄥ崟鍖哄煙 -->
-    <eamReportThreeNoSpare-modal ref="modalForm" @ok="modalFormOk"></eamReportThreeNoSpare-modal>
+    <eamReportThreeNoSpare-modal ref="modalForm" @ok="modalFormOk"/>
 
     <!--瀹℃壒绐楀彛-->
-    <report-threeNo-spare-approval-modal ref="reportThreeNoSpareApprovalModal"
-                                     :selectShenpiData="selectedRowData"/>
+    <report-threeNo-spare-approval-modal ref="reportThreeNoSpareApprovalModal" :selectShenpiData="selectedRowData"/>
 
+    <!--鎵归噺鎵撳嵃寮圭獥-->
+    <eam-three-no-spare-analysis-batch-print-modal ref="batchPrintModal"/>
   </a-card>
 </template>
 
@@ -125,15 +123,17 @@
   import '@/assets/less/TableExpand.less'
   import EamReportThreeNoSpareModal from './modules/EamReportThreeNoSpareModal'
   import { JeecgListMixin } from '@/mixins/JeecgListMixin'
-  import {getAction} from "@api/manage";
-  import LxSearchEquipmentSelect from "@views/eam/equipment/modules/LxSearchEquipmentSelect.vue";
+  import { getAction } from '@api/manage'
+  import LxSearchEquipmentSelect from '@views/eam/equipment/modules/LxSearchEquipmentSelect.vue'
   import ReportThreeNoSpareApprovalModal
     from '../../flowable/workflow/repairOrder/ReportThreeNoSpareApprovalModal'
+  import EamThreeNoSpareAnalysisBatchPrintModal from './modules/EamThreeNoSpareAnalysisBatchPrintModal'
 
   export default {
-    name: "EamReportThreeNoSpareList",
-    mixins:[JeecgListMixin],
+    name: 'EamReportThreeNoSpareList',
+    mixins: [JeecgListMixin],
     components: {
+      EamThreeNoSpareAnalysisBatchPrintModal,
       ReportThreeNoSpareApprovalModal,
       LxSearchEquipmentSelect,
       EamReportThreeNoSpareModal
@@ -147,7 +147,7 @@
         type: Object
       }
     },
-    data () {
+    data() {
       return {
         description: '鈥滀笁涓嶆斁杩囩殑鍘熷垯鈥濆垎鏋愯〃绠$悊椤甸潰',
         disableMixinCreated: true,
@@ -187,96 +187,97 @@
             title: '鐘舵��',
             align: 'center',
             dataIndex: 'submitStatus_dictText',
+            fixed: 'left'
           },
           {
             title: '浜嬫晠鐜拌薄',
             align: 'center',
             dataIndex: 'accidentPhenomenon',
-            scopedSlots: {customRender: 'accidentPhenomenon'},
+            scopedSlots: { customRender: 'accidentPhenomenon' }
           },
           {
             title: '閲囧彇鎺柦',
             align: 'center',
             dataIndex: 'measure',
-            scopedSlots: {customRender: 'measure'},
+            scopedSlots: { customRender: 'measure' }
           },
           {
             title: '閫犳垚缁撴灉',
             align: 'center',
             dataIndex: 'causingResults',
-            scopedSlots: {customRender: 'causingResults'},
+            scopedSlots: { customRender: 'causingResults' }
           },
-		      {
+          {
             title: '鍘熷洜鍒嗘瀽',
-            align:"center",
+            align: 'center',
             dataIndex: 'causeAnalysis',
-            scopedSlots: {customRender: 'causeAnalysis'},
+            scopedSlots: { customRender: 'causeAnalysis' }
           },
           {
             title: '棰勯槻鎺柦',
             align: 'center',
             dataIndex: 'preventionMeasures',
-            scopedSlots: {customRender: 'preventionMeasures'},
+            scopedSlots: { customRender: 'preventionMeasures' }
           },
           {
             title: '鍩硅鏁欒偛',
-            align:"center",
-            dataIndex: 'isTrainingEducation_dictText',
+            align: 'center',
+            dataIndex: 'isTrainingEducation_dictText'
           },
           {
             title: '鍩硅褰㈠紡',
-            align:"center",
+            align: 'center',
             dataIndex: 'trainingFormat',
-            scopedSlots: {customRender: 'trainingFormat'},
+            scopedSlots: { customRender: 'trainingFormat' }
           },
           {
             title: '鍩硅鍐呭',
-            align:"center",
+            align: 'center',
             dataIndex: 'trainingContent',
-            scopedSlots: {customRender: 'trainingContent'},
+            scopedSlots: { customRender: 'trainingContent' }
           },
-		      {
+          {
             title: '鍩硅浜�',
-            align:"center",
+            align: 'center',
             dataIndex: 'trainingUser_dictText'
           },
-		      {
+          {
             title: '鍩硅鏃堕棿',
-            align:"center",
+            align: 'center',
             dataIndex: 'trainingUserTime'
           },
-		      {
+          {
             title: '鍗曚綅棰嗗',
-            align:"center",
+            align: 'center',
             dataIndex: 'unitLeader_dictText'
           },
-		      {
+          {
             title: '棰嗗鎰忚',
-            align:"center",
+            align: 'center',
             dataIndex: 'leaderOpinion'
           },
-		      {
+          {
             title: '棰嗗纭鏃堕棿',
-            align:"center",
+            align: 'center',
             dataIndex: 'leaderConfirmTime'
           },
           {
             title: 'HF缂栫爜',
             align: 'center',
             dataIndex: 'hfCode'
-          },
+          }
         ],
         selectedRowData: {},
         url: {
-          list: "/eam/eamReportThreeNoSpare/list",
-          delete: "/eam/eamReportThreeNoSpare/delete",
-          deleteBatch: "/eam/eamReportThreeNoSpare/deleteBatch",
-          exportXlsUrl: "eam/eamReportThreeNoSpare/exportXls",
-          importExcelUrl: "eam/eamReportThreeNoSpare/importExcel",
-          submit:"eam/eamReportThreeNoSpare/submit"
-        },
-    }
-  },
+          list: '/eam/eamReportThreeNoSpare/list',
+          delete: '/eam/eamReportThreeNoSpare/delete',
+          deleteBatch: '/eam/eamReportThreeNoSpare/deleteBatch',
+          exportXlsUrl: 'eam/eamReportThreeNoSpare/exportXls',
+          importExcelUrl: 'eam/eamReportThreeNoSpare/importExcel',
+          submit: 'eam/eamReportThreeNoSpare/submit'
+        }
+      }
+    },
     created() {
       if (!this.isDisplayOperation) this.queryParam = Object.assign({}, this.propsQueryParam)
       else {
@@ -293,6 +294,11 @@
       this.loadData(1)
     },
     methods: {
+      // 鎵归噺鎵撳嵃
+      handleBatchPrint() {
+        this.$refs.batchPrintModal.handlePreview(this.selectedRowKeys.join())
+      },
+
       /**
        * 鐐瑰嚮濉姤鏃惰Е鍙�
        * @param record
@@ -330,7 +336,7 @@
        * @param record 琛ㄦ牸琛屼俊鎭�
        */
       handleDetail(record) {
-        this.selectRepairOrderData = Object.assign({}, record)
+        this.selectedRowData = Object.assign({}, record)
         this.$refs.reportThreeNoSpareApprovalModal.visible = true
         this.$refs.reportThreeNoSpareApprovalModal.title = '璇︽儏'
         this.$refs.reportThreeNoSpareApprovalModal.disableSubmit = true
diff --git a/src/views/eam/repair/modules/EamAccidentsRegisterBatchPrintModal.vue b/src/views/eam/repair/modules/EamAccidentsRegisterBatchPrintModal.vue
new file mode 100644
index 0000000..584b727
--- /dev/null
+++ b/src/views/eam/repair/modules/EamAccidentsRegisterBatchPrintModal.vue
@@ -0,0 +1,273 @@
+<template>
+  <j-modal title="棰勮锛堜粎鍙瑙堝凡瀹屾垚宸ュ崟锛�" :width="948" :visible="visible" switchFullscreen centered
+           :mask-closable="false" @cancel="handleCancel" cancelText="鍏抽棴">
+    <a-spin :spinning="spinning" style="height: 100%">
+      <div id="dataTable">
+        <div v-for="dataItem in dataSource" class="table-container">
+          <div style="page-break-before:always"></div>
+
+          <table class="import-table" :id="dataItem.equipmentCode">
+            <thead>
+            <tr>
+              <td colspan="6" style="border: none">
+                <div style="text-align: right">{{dataItem.hfCode}}</div>
+              </td>
+            </tr>
+            </thead>
+
+            <tbody>
+            <tr style="height: 48px;">
+              <th colspan="6" style="border: none;font-size: 20px">璁惧浜嬫晠鐧昏琛�</th>
+            </tr>
+
+            <tr>
+              <td>鐢熶骇鍗曚綅</td>
+              <td>{{dataItem.factoryName}}</td>
+              <td>浜嬫晠鍙戠敓鏃堕棿</td>
+              <td>{{dataItem.faultStartTime}}</td>
+              <td>鎿嶄綔宸�</td>
+              <td>{{dataItem.confirmer_dictText}}</td>
+            </tr>
+
+            <tr>
+              <td>缁熶竴缂栧彿</td>
+              <td>{{dataItem.equipmentCode}}</td>
+              <td>璁惧鍚嶇О</td>
+              <td>{{dataItem.equipmentName}}</td>
+              <td>璁惧鍨嬪彿</td>
+              <td>{{dataItem.equipmentModel}}</td>
+            </tr>
+
+            <tr>
+              <td>搴熷搧浠跺彿</td>
+              <td>{{dataItem.scrapPartNumber}}</td>
+              <td>搴熷搧浠舵暟</td>
+              <td>{{dataItem.scrapPartQuantity}}</td>
+              <td>搴熷搧浠峰��</td>
+              <td>{{dataItem.scrapPartValue}}</td>
+            </tr>
+
+            <tr>
+              <td colspan="6" style="padding: 5px">
+                <div style="text-align: left">鎿嶄綔鑰呭~鍐欎簨鏁呭彂鐢熺粡杩囷細</div>
+                <div style="text-align: left">1.鏄惁鏈夎澶囨搷浣滆瘉锛歿{+dataItem.operationCertificate===1?'鏈夛紙鈭氾級鏃狅紙锛�':'鏈夛紙锛夋棤锛堚垰锛�'}}
+                </div>
+                <div style="text-align: left">2.浜嬫晠鍙戠敓鍚庤澶囨槸鍚︽柇鐢甸噸鍚細{{+dataItem.powerOffRestart===1?'鏄紙鈭氾級鍚︼紙锛�':'鏄紙锛夊惁锛堚垰锛�'}}
+                </div>
+                <div style="text-align: left">3.鍔犲伐闆朵欢鏄惁涓烘壒娆¢浠讹細{{+dataItem.batchFirstPiece===1?'鏄紙鈭氾級鍚︼紙锛�':'鏄紙锛夊惁锛堚垰锛�'}}</div>
+                <div style="text-align: left">
+                  4.鍔犲伐杩囩▼涓殑鍙樺姩鍥犵礌锛堝~鍐欐槸鎴栧惁锛夛細鍒�鍏锋洿鎹紙{{setValueYesOrNot(dataItem,'tool_replacement')}}锛夊伐鑹烘洿鏀癸紙{{setValueYesOrNot(dataItem,'process_change')}}锛夊姞宸ョ▼搴忔洿鏀癸紙{{setValueYesOrNot(dataItem,'processing_program_update')}}锛夊垁鍏疯ˉ鍋垮�兼洿鏀癸紙{{setValueYesOrNot(dataItem,'tool_compensation_adjustment')}}锛夐浂鐐瑰亸缃�兼洿鏀癸紙{{setValueYesOrNot(dataItem,'zero_point_offset_value_change')}}锛夊弬鏁颁慨鏀癸紙{{setValueYesOrNot(dataItem,'parameter_modification')}}锛夊叾浠栧洜绱狅紙{{setValueYesOrNot(dataItem,'other_factors')}}锛�
+                </div>
+                <br/>
+                <div style="text-align: left">鍏蜂綋鏇存敼鍐呭锛�</div>
+                <div style="text-align: left">5.鍙戠敓浜嬫晠鏃舵墍鎵ц鐨勭▼搴忥細{{dataItem.executeNc}}</div>
+                <div style="text-align: left">6.璁惧鍙戠敓浜嬫晠鏃剁殑鐜拌薄锛�</div>
+                <div style="text-align: left" v-html="dataItem.accidentPhenomenon.replace(/\n/g,'<br/>')"></div>
+                <br/>
+                <div style="text-align: left">7.鎿嶄綔宸ラ噰鍙栦簡鍝簺鎺柦锛堟寜椤哄簭濉啓锛夛細</div>
+                <div style="text-align: left" v-html="dataItem.measure.replace(/\n/g,'<br/>')"></div>
+                <div style="text-align: left">8.浜嬫晠鎵�閫犳垚鐨勭粨鏋滐細</div>
+                <div style="text-align: left" v-html="dataItem.causingResults.replace(/\n/g,'<br/>')"></div>
+                <br/>
+                <div style="text-align: right">鎿嶄綔宸ワ細{{dataItem.confirmer_dictText}}</div>
+                <div style="text-align: right">{{dataItem.confirmTime.split('-')[0]}}&nbsp;骞�&nbsp;{{dataItem.confirmTime.split('-')[1]}}&nbsp;鏈�&nbsp;{{dataItem.confirmTime.split('-')[2]}}&nbsp;鏃�</div>
+              </td>
+            </tr>
+
+            <tr style="height: 35px;">
+              <td>鍖洪暱</td>
+              <td colspan="2">{{dataItem.district_dictText}}</td>
+              <td>涓績涓讳换</td>
+              <td colspan="2">{{dataItem.centerDirector_dictText}}</td>
+            </tr>
+
+            <tr>
+              <td colspan="6" style="padding: 5px">
+                <div style="text-align: left">缁翠慨浜哄憳杩涜浜嬫晠鍒嗘瀽锛�</div>
+                <div style="text-align: left">
+                  1.寮�濮嬫鏌ョ殑鏃堕棿锛歿{dataItem.reportStartTime.split('-')[0]}}骞磠{dataItem.reportStartTime.split('-')[1]}}鏈坽{dataItem.reportStartTime.split('-')[2]}}鏃�
+                </div>
+                <div style="text-align: left">2.鍙戠敓浜嬫晠鍚庤澶囩殑鐘舵�侊細{{dataItem.equipmentStatus}}</div>
+                <div style="text-align: left">3.缁翠慨浜哄憳瀵逛簨鏁呭師鍥犵殑鍒嗘瀽锛�</div>
+                <div style="text-align: left" v-html="dataItem.causeAnalysis.replace(/\n/g,'<br/>')"></div>
+                <br/>
+                <div style="text-align: left">4.妫�鏌ョ殑缁撴灉锛歿{dataItem.inspectionResults}}</div>
+                <div style="text-align: left">5.浜嬫晠鍘熷洜鍒嗘瀽杩囩▼涓墍閲囧彇鐨勭浉鍏宠涓猴細</div>
+                <div style="text-align: left">{{dataItem.takeSteps}}</div>
+                <br/>
+                <div style="text-align: left">
+                  6.寤鸿閲囧彇鐨勬帾鏂藉強鏃堕棿鑺傜偣锛歿{dataItem.suggestionTakeStepsTime.split('-')[0]}}骞磠{dataItem.suggestionTakeStepsTime.split('-')[1]}}鏈坽{dataItem.suggestionTakeStepsTime.split('-')[2]}}鏃�
+                </div>
+                <div style="text-align: left" v-html="dataItem.suggestionTakeSteps.replace(/\n/g,'<br/>')"></div>
+                <br/>
+                <div style="text-align: right">缁翠慨浜哄憳锛歿{dataItem.repairConfirm_dictText}}</div>
+                <div style="text-align: right">{{dataItem.repairConfirmTime.split('-')[0]}}&nbsp;骞�&nbsp;{{dataItem.repairConfirmTime.split('-')[1]}}&nbsp;鏈�&nbsp;{{dataItem.repairConfirmTime.split('-')[2]}}&nbsp;鏃�</div>
+              </td>
+            </tr>
+
+            <tr style="height: 35px;">
+              <td>缁翠慨璐熻矗浜�(缁勯暱)</td>
+              <td colspan="2">{{dataItem.repairGroupLeader_dictText}}</td>
+              <td>缁翠慨璐熻矗浜�(鍖洪暱)</td>
+              <td colspan="2">{{dataItem.repairDistrict_dictText}}</td>
+            </tr>
+
+            <tr>
+              <td colspan="6" style="padding: 5px">
+                <div style="text-align: left">璁惧鎶�鏈笓瀹舵剰瑙侊細</div>
+                <div style="text-align: left">1.浜嬫晠鍙戠敓鍘熷洜鍒嗘瀽鐨勬牳瀵癸細{{+dataItem.checkAgree===1?'鍚屾剰锛堚垰锛変笉鍚屾剰锛堬級':'鍚屾剰锛堬級涓嶅悓鎰忥紙鈭氾級'}}</div>
+                <div style="text-align: left">涓嶅悓鎰忕殑鍘熷洜鍙婂垎鏋愶細{{!dataItem.disagreeReason?'鏃�':dataItem.disagreeReason}}</div>
+                <br/>
+                <div style="text-align: left">2.鏁存敼鎺柦锛歿{dataItem.rectificationMeasures}}</div>
+                <br/>
+                <div style="text-align: left">3.浜嬫晠缁撹锛歿{dataItem.accidentConclusion}}</div>
+                <br/>
+                <div style="text-align: right">鎶�鏈礋璐d汉锛歿{dataItem.technicalDirector_dictText}}</div>
+                <div style="text-align: right">{{dataItem.technicalDirectorTime.split('-')[0]}}&nbsp;骞�&nbsp;{{dataItem.technicalDirectorTime.split('-')[1]}}&nbsp;鏈�&nbsp;{{dataItem.technicalDirectorTime.split('-')[2]}}&nbsp;鏃�</div>
+              </td>
+            </tr>
+
+            <tr style="height: 35px;">
+              <td>鎶�鏈富绠″绾ч瀵�</td>
+              <td colspan="2">{{dataItem.technicalDirectorLeader_dictText}}</td>
+              <td>涓荤閮ㄧ骇棰嗗</td>
+              <td colspan="2">{{dataItem.technicalDirectorPart_dictText}}</td>
+            </tr>
+
+            <tr>
+              <td colspan="6" style="border: none">
+                濉啓璇存槑锛氬璁惧浜嬫晠鏈�犳垚浜у搧璐ㄩ噺闂锛屽垯搴熷搧浠跺彿銆佸簾鍝佷欢鏁般�佸簾鍝佷环鍊兼爮濉啓鈥�/鈥濄��
+              </td>
+            </tr>
+            </tbody>
+          </table>
+        </div>
+      </div>
+    </a-spin>
+
+    <template slot="footer">
+      <a-button @click="handleCancel">鍏抽棴</a-button>
+      <a-button type="primary" @click="handleExportToExcel">瀵煎嚭</a-button>
+      <a-button type="primary" v-print="'#dataTable'">鎵撳嵃</a-button>
+    </template>
+  </j-modal>
+</template>
+
+<script>
+  import { getAction } from '@/api/manage'
+  import $ from 'jquery'
+  import '@/components/table2excel/table2excel'
+
+  export default {
+    name: 'EamAccidentsRegisterBatchPrintModal',
+    data() {
+      return {
+        visible: false,
+        spinning: false,
+        dataSource: [],
+        url: {
+          list: '/eam/eamReportAccidentsRegister/batchExport'
+        }
+      }
+    },
+    methods: {
+      /**
+       * 鎵归噺棰勮
+       * @param ids String 涓婚〉闈㈠垪琛ㄥ嬀閫塱ds
+       */
+      handlePreview(ids) {
+        this.visible = true
+        this.spinning = true
+        this.dataSource = []
+        const that = this
+        getAction(this.url.list, { ids })
+          .then(res => {
+            if (res.success) that.dataSource = res.result
+          })
+          .finally(() => {
+            that.spinning = false
+          })
+      },
+
+      // 瀵煎嚭鍒癊xcel
+      handleExportToExcel() {
+        document.querySelectorAll('table.import-table').forEach(element => {
+          console.log('element', element.id)
+          $(element).table2excel({
+            exclude: '.noExl',
+            name: 'Excel Document Name',
+            filename: '璁惧浜嬫晠鐧昏琛�-' + element.id,
+            exclude_img: true,
+            fileext: '.xls',
+            exclude_links: true,
+            exclude_inputs: false
+          })
+        })
+      },
+
+      /**
+       * 璁剧疆鍙樺姩鍥犵礌鍊�
+       * @param dataItem 瀵瑰簲瀵硅薄
+       * @param value 瀛楀吀鍊�
+       * @returns {string} 鏄�/鍚�
+       */
+      setValueYesOrNot(dataItem, value) {
+        return dataItem.variableFactorsValue !== value ? '鍚�' : '鏄�'
+      },
+
+      handleCancel() {
+        this.close()
+      },
+
+      close() {
+        this.$emit('close')
+        this.visible = false
+        if (this.$refs.form) this.$refs.form.clearValidate()
+      }
+    }
+  }
+</script>
+
+<style scoped lang="less">
+  /deep/ .ant-modal {
+    height: 90%;
+    overflow: hidden;
+
+    .ant-modal-content {
+      height: 100%;
+      display: flex;
+      flex-direction: column;
+      overflow: hidden;
+
+      ::-webkit-scrollbar {
+        width: 8px;
+        height: 8px;
+      }
+
+      .ant-modal-body {
+        flex: 1;
+        overflow: auto;
+      }
+    }
+  }
+
+  .table-container:not(:last-child) {
+    margin-bottom: 20px;
+  }
+
+  table {
+    width: 100%;
+    text-align: center;
+    table-layout: fixed;
+
+    td, th {
+      border: 1px solid #000;
+    }
+
+    td.vertical-display {
+      writing-mode: vertical-lr;
+      letter-spacing: 5px;
+      padding: 5px 0;
+    }
+  }
+</style>
\ No newline at end of file
diff --git a/src/views/eam/repair/modules/EamThreeNoSpareAnalysisBatchPrintModal.vue b/src/views/eam/repair/modules/EamThreeNoSpareAnalysisBatchPrintModal.vue
new file mode 100644
index 0000000..0c3e9d5
--- /dev/null
+++ b/src/views/eam/repair/modules/EamThreeNoSpareAnalysisBatchPrintModal.vue
@@ -0,0 +1,190 @@
+<template>
+  <j-modal title="棰勮锛堜粎鍙瑙堝凡瀹屾垚宸ュ崟锛�" :width="948" :visible="visible" switchFullscreen centered
+           :mask-closable="false" @cancel="handleCancel" cancelText="鍏抽棴">
+    <a-spin :spinning="spinning" style="height: 100%">
+      <div id="dataTable">
+
+        <div v-for="dataItem in dataSource" class="table-container">
+          <div style="page-break-before:always"></div>
+
+          <table class="import-table">
+            <thead>
+            <tr>
+              <td colspan="10" style="border: none;">
+                <div style="text-align: right">{{dataItem.hfCode}}</div>
+              </td>
+            </tr>
+            </thead>
+
+            <tbody>
+            <tr style="height: 48px;">
+              <th colspan="10" style="border: none;font-size: 20px">鈥滀笁涓嶆斁杩囩殑鍘熷垯鈥濆垎鏋愯〃</th>
+            </tr>
+
+            <tr>
+              <th colspan="10" style="border: none;font-size: 20px;">
+                <div style="text-align: left">鈥滀笁涓嶆斁杩囩殑鍘熷垯鈥濆垎鏋愶細</div>
+                <div style="text-align: left">1銆佷簨鏁呭師鍥犲垎鏋愪笉娓呬笉鏀捐繃銆�</div>
+                <div style="text-align: left">2銆佽矗浠昏�呭拰缇や紬鏈彈鍒版暀鑲蹭笉鏀捐繃銆�</div>
+                <div style="text-align: left">3銆佹病鏈夐槻鑼冩帾鏂戒笉鏀捐繃銆�</div>
+              </th>
+            </tr>
+
+            <tr style="height: 35px">
+              <td colspan="10">
+                <div style="text-align: left">浜嬫晠鍘熷洜鍒嗘瀽锛歿{dataItem.causeAnalysis}}</div>
+              </td>
+            </tr>
+
+            <tr>
+              <td colspan="10" style="padding: 5px">
+                <div style="text-align: left">
+                  鏄惁瀵规搷浣滆�呭強鐩稿叧璐d换浜鸿繘琛屽煿璁暀鑲诧細{{+dataItem.isTrainingEducation===1?'鏄紙鈭氾級鍚︼紙锛�':'鏄紙锛夊惁锛堚垰锛�'}}
+                </div>
+                <div style="text-align: left">鍩硅褰㈠紡锛歿{dataItem.trainingFormat}}</div>
+                <div style="text-align: left">鍩硅鍐呭鍖呮嫭锛�</div>
+                <div style="text-align: left" v-html="dataItem.trainingContent.replace(/\n/g,'<br/>')"></div>
+                <template v-for="item in 5-dataItem.trainingContent.split('\n').length"><br/></template>
+                <div style="text-align: left">鎺ュ彈鍩硅浜哄憳绛惧瓧锛歿{dataItem.trainingUser_dictText}}</div>
+              </td>
+            </tr>
+
+            <tr>
+              <td colspan="10" style="padding: 5px">
+                <div style="text-align: left">鐩墠宸插疄鏂斤紙锛夐璁″疄鏂斤紙锛夌殑棰勯槻鎺柦</div>
+                <div style="text-align: left" v-html="dataItem.preventionMeasures.replace(/\n/g,'<br/>')"></div>
+                <template v-for="item in 5-dataItem.preventionMeasures.split('\n').length"><br/></template>
+              </td>
+            </tr>
+
+            <tr>
+              <td colspan="5" style="border: none">
+                <div style="text-align: left">濉啓浜猴細{{dataItem.createBy_dictText}}</div>
+              </td>
+              <td colspan="5" style="border: none">
+                <div style="text-align: right">鍗曚綅棰嗗锛歿{dataItem.unitLeader_dictText}}</div>
+              </td>
+            </tr>
+            </tbody>
+          </table>
+        </div>
+      </div>
+    </a-spin>
+
+    <template slot="footer">
+      <a-button @click="handleCancel">鍏抽棴</a-button>
+      <a-button type="primary" @click="handleExportToExcel">瀵煎嚭</a-button>
+      <a-button type="primary" v-print="'#dataTable'">鎵撳嵃</a-button>
+    </template>
+  </j-modal>
+</template>
+
+<script>
+  import { getAction } from '@/api/manage'
+  import $ from 'jquery'
+  import '@/components/table2excel/table2excel'
+
+  export default {
+    name: 'EamThreeNoSpareAnalysisBatchPrintModal',
+    data() {
+      return {
+        visible: false,
+        spinning: false,
+        dataSource: [],
+        url: {
+          list: '/eam/eamReportThreeNoSpare/batchExport'
+        }
+      }
+    },
+    methods: {
+      /**
+       * 鎵归噺棰勮
+       * @param ids String 涓婚〉闈㈠垪琛ㄥ嬀閫塱ds
+       */
+      handlePreview(ids) {
+        this.visible = true
+        this.spinning = true
+        this.dataSource = []
+        const that = this
+        getAction(this.url.list, { ids })
+          .then(res => {
+            if (res.success) that.dataSource = res.result
+          })
+          .finally(() => {
+            that.spinning = false
+          })
+      },
+
+      // 瀵煎嚭鍒癊xcel
+      handleExportToExcel() {
+        document.querySelectorAll('table.import-table').forEach(item => {
+          $(item).table2excel({
+            exclude: '.noExl',
+            name: 'Excel Document Name',
+            filename: '鈥滀笁涓嶆斁杩囩殑鍘熷垯鈥濆垎鏋愯〃-',
+            exclude_img: true,
+            fileext: '.xls',
+            exclude_links: true,
+            exclude_inputs: false
+          })
+        })
+
+      },
+
+      handleCancel() {
+        this.close()
+      },
+
+      close() {
+        this.$emit('close')
+        this.visible = false
+        if (this.$refs.form) this.$refs.form.clearValidate()
+      }
+    }
+  }
+</script>
+
+<style scoped lang="less">
+  /deep/ .ant-modal {
+    height: 90%;
+    overflow: hidden;
+
+    .ant-modal-content {
+      height: 100%;
+      display: flex;
+      flex-direction: column;
+      overflow: hidden;
+
+      ::-webkit-scrollbar {
+        width: 8px;
+        height: 8px;
+      }
+
+      .ant-modal-body {
+        flex: 1;
+        overflow: auto;
+      }
+    }
+  }
+
+  .table-container:not(:last-child) {
+    margin-bottom: 20px;
+  }
+
+  table {
+    width: 100%;
+    text-align: center;
+    table-layout: fixed;
+
+    td, th {
+      border: 1px solid #000;
+    }
+
+    td.vertical-display {
+      transform: rotate(360deg);
+      writing-mode: vertical-lr;
+      letter-spacing: 5px;
+      padding: 10px 0;
+    }
+  }
+</style>
\ No newline at end of file

--
Gitblit v1.9.3