Pārlūkot izejas kodu

选择打印机

lilei 3 gadi atpakaļ
vecāks
revīzija
7e0838d1c8

+ 15 - 3
src/layouts/BasicLayout.vue

@@ -67,7 +67,8 @@
       </div>
       <!-- pdf 预览 -->
       <pdfViewModal ref="pdfview" :openModal="showPdfView" @cancel="showPdfView=false"></pdfViewModal>
-
+      <!-- 选择打印机 -->
+      <selectPrint ref="selectPrint" :openModal="showSelectPrint" @cancel="showSelectPrint=false"></selectPrint>
       <!-- layout footer -->
       <a-layout-footer>
         <!-- <global-footer /> -->
@@ -87,6 +88,7 @@ import { mapState, mapActions, mapGetters } from 'vuex'
 import { mixin, mixinDevice, commonMixin } from '@/utils/mixin'
 import config from '@/config/defaultSettings'
 import pdfViewModal from '@/views/common/pdfViewModal.vue'
+import selectPrint from '@/views/common/selectPrint.vue'
 import RouteView from './RouteView'
 import SideMenu from '@/components/Menu/SideMenu'
 import GlobalHeader from '@/components/GlobalHeader'
@@ -109,7 +111,8 @@ export default {
     GlobalHeader,
     GlobalFooter,
     SettingDrawer,
-    pdfViewModal
+    pdfViewModal,
+    selectPrint
   },
   data () {
     return {
@@ -117,7 +120,8 @@ export default {
       collapsed: false,
       menus: [],
       isRouterAlive: true,
-      showPdfView: false
+      showPdfView: false,
+      showSelectPrint: false
     }
   },
   computed: {
@@ -200,6 +204,12 @@ export default {
           this.$refs.pdfview.setData(this.$store.state.app.pdfPrintList)
         })
       }
+    },
+    '$store.state.app.showSelectPrint' (newValue, oldValue) {
+      console.log(newValue)
+      if (newValue) {
+        this.showSelectPrint = newValue
+      }
     }
   },
   created () {
@@ -226,6 +236,8 @@ export default {
       })
     }
     this.$store.commit('SET_pdfPrintList', [])
+    this.$store.commit('SET_showPdfPrint', false)
+    this.$store.commit('SET_showSelectPrint', false)
   },
   mounted () {
     const userAgent = navigator.userAgent

+ 58 - 52
src/libs/JGPrint.js

@@ -121,34 +121,50 @@ export const blobToBaseByPdf = function(data,callback){
     callback(reader.result)
   })
 }
-
+// lodop 打印预览
+export const lodopPrintView = function(data){
+  const LODOP = getLodop(document.getElementById('LODOP_OB'), document.getElementById('LODOP_EM'))
+  LODOP.SET_SHOW_MODE('HIDE_PAPER_BOARD', 1) //  隐藏底图上有模拟走纸板的条纹线
+  // LODOP.SET_PRINT_MODE('POS_BASEON_PAPER', true) // 可使输出以纸张边缘为基点
+  // 预览
+  const dlen = data.length
+  LODOP.PRINT_INIT('')
+  if(dlen > 1){
+    LODOP.SET_SHOW_MODE("HIDE_PBUTTIN_PREVIEW",1);//隐藏打印按钮
+  }
+  LODOP.SET_PRINTER_INDEX(store.state.app.defaultPrint || '-1')
+  LODOP.ADD_PRINT_PDF(0, 0, '100%', '100%', data[0])
+  LODOP.SET_PRINT_PAGESIZE(3,2090,dlen>1?0:50,"");
+  LODOP.PREVIEW()
+}
+// 获取打印机列表
+export const getPrintList = function(){
+  const LODOP = getLodop(document.getElementById('LODOP_OB'), document.getElementById('LODOP_EM'))
+  // 获取打印机列表
+  const printCount = LODOP.GET_PRINTER_COUNT()
+  const printList = []
+  for(let i=0;i<printCount;i++){
+    const pname = LODOP.GET_PRINTER_NAME(i)
+    if(pname.indexOf('Microsoft')<0&&pname.indexOf('OneNote')<0&&pname.indexOf('Fax')<0&&pname.indexOf('导出')<0){
+      printList.push({name:pname,value:i})
+    }
+  }
+  console.log(printCount,printList)
+  return printList
+}
 // pdf 直接打印
 export const pdfPrint = function (data){
   const LODOP = getLodop(document.getElementById('LODOP_OB'), document.getElementById('LODOP_EM'))
-  if (!LODOP) {
-    confirm({
-      title: '提示?',
-      content: h => <div>打印控件未安装,请先下载并安装。安装完成后,刷新页面即可打印。</div>,
-      okText: '立即下载',
-      okType: 'danger',
-      cancelText: '暂不打印',
-      onOk () {
-        var agent = navigator.userAgent.toLowerCase();
-        if (agent.indexOf("win32") >= 0 || agent.indexOf("wow32") >= 0) {
-            window.open('https://iscm.360arrow.com/electron/CLodop.exe')
-        }else if (agent.indexOf("win64") >= 0 || agent.indexOf("wow64") >= 0) {
-            window.open('https://iscm.360arrow.com/electron/CLodop.exe')
-        }
-      }
-    })
-    return
-  }
   LODOP.SET_SHOW_MODE('HIDE_PAPER_BOARD', 1) //  隐藏底图上有模拟走纸板的条纹线
   // LODOP.SET_PRINT_MODE('POS_BASEON_PAPER', true) // 可使输出以纸张边缘为基点
   // 开始打印
   const dlen = data.length
   for(let i=0;i<dlen;i++){
     LODOP.PRINT_INIT("")
+    //这个语句设置网络共享打印机连接不通时是否提示一下
+    LODOP.SET_PRINT_MODE("TRYLINKPRINTER_NOALERT",true);
+    // 指定打印机
+    LODOP.SET_PRINTER_INDEX(store.state.app.defaultPrint)
     LODOP.ADD_PRINT_PDF(0, 0, '100%', '100%', data[i])
     LODOP.SET_PRINT_PAGESIZE(3, 2090, (i==dlen-1)?50:0, '')
     LODOP.PRINT()
@@ -157,38 +173,7 @@ export const pdfPrint = function (data){
 // pdf 打印预览
 export const pdfPrintView = function(data){
   store.commit('SET_pdfPrintList', data)
-}
-// lodop 打印预览
-export const lodopPrintView = function(data){
-  const LODOP = getLodop(document.getElementById('LODOP_OB'), document.getElementById('LODOP_EM'))
-  if (!LODOP) {
-    confirm({
-      title: '提示?',
-      content: h => <div>打印控件未安装,请先下载并安装。安装完成后,刷新页面即可打印。</div>,
-      okText: '立即下载',
-      okType: 'danger',
-      cancelText: '暂不打印',
-      onOk () {
-        var agent = navigator.userAgent.toLowerCase();
-        if (agent.indexOf("win32") >= 0 || agent.indexOf("wow32") >= 0) {
-            window.open('https://iscm.360arrow.com/electron/CLodop.exe')
-        }else if (agent.indexOf("win64") >= 0 || agent.indexOf("wow64") >= 0) {
-            window.open('https://iscm.360arrow.com/electron/CLodop.exe')
-        }
-      }
-    })
-    return
-  }
-  LODOP.SET_SHOW_MODE('HIDE_PAPER_BOARD', 1) //  隐藏底图上有模拟走纸板的条纹线
-  // LODOP.SET_PRINT_MODE('POS_BASEON_PAPER', true) // 可使输出以纸张边缘为基点
-  // 预览
-  const dlen = data.length
-  if(dlen > 1){
-    LODOP.SET_SHOW_MODE("HIDE_PBUTTIN_PREVIEW",1);//隐藏打印按钮
-  }
-  LODOP.ADD_PRINT_PDF(0, 0, '100%', '100%', data[0])
-  LODOP.SET_PRINT_PAGESIZE(3,2090,dlen>1?0:50,"");
-  LODOP.PREVIEW()
+  store.commit('SET_showPdfPrint', data)
 }
 
 // 打印控件
@@ -198,11 +183,32 @@ export const jGPrint = function (data, type, printerType) {
   }
   // 针式打印
   if (printerType == 'NEEDLE') {
+    const LODOP = getLodop(document.getElementById('LODOP_OB'), document.getElementById('LODOP_EM'))
+    if (!LODOP) {
+      confirm({
+        title: '提示?',
+        content: h => <div>打印控件未安装,请先下载并安装。安装完成后,刷新页面即可打印。</div>,
+        okText: '立即下载',
+        okType: 'danger',
+        cancelText: '暂不打印',
+        onOk () {
+          var agent = navigator.userAgent.toLowerCase();
+          if (agent.indexOf("win32") >= 0 || agent.indexOf("wow32") >= 0) {
+              window.open('https://iscm.360arrow.com/electron/CLodop.exe')
+          }else if (agent.indexOf("win64") >= 0 || agent.indexOf("wow64") >= 0) {
+              window.open('https://iscm.360arrow.com/electron/CLodop.exe')
+          }
+        }
+      })
+      return
+    }
     if (type == 'preview') { //  预览
       // lodopPrintView(data.data)
       pdfPrintView(data.data)
     } else if (type == 'print') { //  打印
-      pdfPrint(data.data)
+      // 先选择打印机
+      store.commit('SET_pdfPrintList', data.data)
+      store.commit('SET_showSelectPrint', true)
     }
   } else {
     // 喷墨打印

+ 9 - 2
src/store/modules/app.js

@@ -37,7 +37,9 @@ const app = {
     winHeight: 0 ,//  窗口高度
     isLastDayForMonth: false, // 是否是当月最后一天
     showPdfPrintView: false, // pdf 打印预览
-    pdfPrintList: [] // 打印的pdf 文件
+    pdfPrintList: [] ,// 打印的pdf 文件
+    showSelectPrint: false,
+    defaultPrint: '-1'
   },
   mutations: {
     SET_SIDEBAR_TYPE: (state, type) => {
@@ -108,10 +110,15 @@ const app = {
       state.loadingStatus = val
     },
     SET_pdfPrintList: (state, val) => {
-      console.log(val)
       state.pdfPrintList = val
+    },
+    SET_showPdfPrint: (state, val) => {
       state.showPdfPrintView = val && val.length > 0
     },
+    SET_showSelectPrint: (state, val) => {
+      console.log(val)
+      state.showSelectPrint = val
+    },
   },
   actions: {
     setSidebar ({

+ 4 - 4
src/views/common/pdfViewModal.vue

@@ -29,8 +29,8 @@
         </vue-scroll>
       </div>
       <div class="btn-box">
-        <a-button size="large" type="default" @click="handleCommonCancel" v-if="isCancel">{{ cancelText }}</a-button>
-        <a-button size="large" type="primary" class="button-error" @click="handleCommonOk">{{ okText }}</a-button>
+        <a-button size="large" style="margin-right: 25px;" @click="handleCommonCancel" v-if="isCancel">{{ cancelText }}</a-button>
+        <a-button size="large" type="primary" @click="handleCommonOk">{{ okText }}</a-button>
       </div>
     </a-spin>
   </a-modal>
@@ -39,7 +39,6 @@
 <script>
 import pdf from 'vue-pdf'
 import CMapReaderFactory from 'vue-pdf/src/CMapReaderFactory.js'
-import { pdfPrint } from '@/libs/JGPrint'
 export default {
   components: {
     pdf
@@ -116,7 +115,7 @@ export default {
     },
     // 确定
     handleCommonOk () {
-      pdfPrint(this.pdfList)
+      this.$store.commit('SET_showSelectPrint', true)
       this.$emit('ok')
     },
     // 取消
@@ -124,6 +123,7 @@ export default {
       this.isShow = false
       this.pdfList = []
       this.$store.commit('SET_pdfPrintList', [])
+      this.$store.commit('SET_showPdfPrint', false)
       this.$emit('cancel')
     },
     // 下载

+ 1 - 1
src/views/common/print.vue

@@ -4,7 +4,7 @@
       <a-radio value="NEEDLE">针式</a-radio>
       <a-radio value="INK">喷墨</a-radio>
     </a-radio-group>
-    <a-button key="3" id="print-preview-btn" :disabled="disabled" @click="handlePrint('preview')">打印预览</a-button>
+    <a-button key="3" id="print-preview-btn" v-if="printerType=='NEEDLE'" :disabled="disabled" @click="handlePrint('preview')">打印预览</a-button>
     <a-button key="2" type="primary" id="print-print-btn" :disabled="disabled" @click="handlePrint('print')">快捷打印</a-button>
     <a-button
       key="1"

+ 143 - 0
src/views/common/selectPrint.vue

@@ -0,0 +1,143 @@
+<template>
+  <a-modal
+    centered
+    class="common-modal"
+    :footer="null"
+    :maskClosable="false"
+    :z-index="1001"
+    v-model="isShow"
+    :title="modalTit"
+    :bodyStyle="{padding: modalTit?'25px 32px 20px':'50px 32px 15px'}"
+    @cancel="handleCommonCancel"
+    :width="416">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <div class="common-main">
+        <a-select v-model="printIndex" @change="changePrint" style="width: 100%" placeholder="选择打印机">
+          <a-select-option v-for="item in printList" :key="'print-'+item.value" :value="item.value">
+            {{ item.name }}
+          </a-select-option>
+        </a-select>
+      </div>
+      <div class="btn-box">
+        <a-button type="default" style="margin-right:20px;" @click="handleCommonCancel" v-if="isCancel">{{ cancelText }}</a-button>
+        <a-button type="primary" class="button-error" @click="handleCommonOk">{{ okText }}</a-button>
+      </div>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+import { getPrintList, pdfPrint } from '@/libs/JGPrint'
+export default {
+  name: 'CommonModal',
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    },
+    modalTit: { // 弹框标题
+      type: String,
+      default: '请选择打印机'
+    },
+    modalHtml: {
+      type: String,
+      default: ''
+    },
+    okText: { // 确定 按钮文字
+      type: String,
+      default: '确定'
+    },
+    cancelText: { // 取消 按钮文字
+      type: String,
+      default: '取消'
+    },
+    isCancel: { // 是否显示  取消 按钮
+      type: Boolean,
+      default: true
+    },
+    spinning: { // 加载中
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      isShow: this.openModal, //  是否打开弹框
+      printIndex: undefined,
+      printList: []
+
+    }
+  },
+  methods: {
+    // 确定
+    handleCommonOk () {
+      if (this.printIndex >= 0) {
+        // 关闭弹框
+        this.$store.commit('SET_showSelectPrint', false)
+        this.$emit('cancel')
+        // 继续打印
+        pdfPrint(this.$store.state.app.pdfPrintList)
+      } else {
+        this.$message.info('请选择打印机')
+      }
+    },
+    // 取消
+    handleCommonCancel () {
+      this.$emit('cancel')
+      this.$store.commit('SET_pdfPrintList', [])
+      this.$store.commit('SET_showSelectPrint', false)
+    },
+    getPrintList () {
+      this.printList = getPrintList()
+      this.printIndex = this.$store.state.app.defaultPrint
+    },
+    changePrint (v) {
+      this.$store.state.app.defaultPrint = v
+      this.printIndex = v
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+      } else {
+        // 获取打印机列表
+        this.getPrintList()
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less">
+  .common-modal{
+    .common-main{
+      display: flex;
+      line-height: 24px;
+      .common-cont{
+        .common-tit{
+          color: rgba(0, 0, 0);
+          font-weight: 500;
+          font-size: 16px;
+          line-height: 1.4;
+          margin: 0;
+        }
+        .common-txt{
+          margin: 8px 0 0;
+          color: rgba(0, 0, 0);
+          font-size: 14px;
+          line-height: 1.5;
+        }
+      }
+    }
+    .btn-box{
+      text-align: center;
+      margin-top: 20px;
+    }
+  }
+</style>