汉王、绘王签字版调用封装

说明

需要配合汉王或绘王签字版驱动以及对应的sdk服务使用

constants.js

javascript 复制代码
//汉王、绘王sdk websocket连接地址
export const WS_URLS ={
  1:'ws://127.0.0.1:29999', //汉王
  2:'ws://127.0.0.1:7181',
}

export const COMMAND1 = {
  1: {
  HWPenSign: "HWStartSign",
    nLogo: "签字",
    width: "1280",
    height: "800",
    key: "", //签字版signkey! 签字版signkey! 签字版signkey!
    fingerFap: "1",
    pencolor: "000000",//笔迹颜色,RGB
    backcolor: "FFDDff",//背景颜色,RGB
    topcolor: "FF0000",//顶部颜色
    logosize: "30",//左上角文字大小
    logocolor: "000000",//左上角文字颜色,BGR排序
    logotype: "黑体",//宋体、Arial、微软雅黑、黑体可以应用
    frameWidth: "3",//边框宽度
    framecolor: "adadad",//边框颜色,RGB
    okcolor: "FA8072",//确定按钮颜色
    resigncolor: "FFA500",//重签按钮颜色
    okTextColor: "B22222",//确定按钮文本颜色
    resignTextColor: "F5F5DC",//重签按钮文本颜色RGB
    okTextFont: "华文新魏",//确定按钮文本字体,C:/Winodws/fonts/ 下的字体文件,部分字体无法显示
    resignTextFont: "隶书",//重签按钮文本字体
    okTextSize: "20",
    resignTextSize: "20",//重签按钮文本内容
    OkButtonText: "确定",//确定按钮文本内容
    ResignButtonText: "重签",
    logoXAxis: "10",//左上角文字X坐标
    logoYAxis: "15",//左上角文字Y坐标
    okXAxis: "1150",//确定按钮X坐标
    okYAxis: "5",//确定按钮Y坐标
    resignXAxis: "1018",//重签按钮X坐标
    resignYAxis: "5",//重签按钮Y坐标
    topHeight: "30",//标题区高度
    roundValue: "30",//按钮圆角
    ButtonHeight: "60",
    ButtonWidth: "120",
    fingerTextColor: "000000",//指纹按钮文本颜色
    fingerTextFont: "Simsun",//指纹按钮文本字体
    fingercolor: "3ff3e4",//指纹按钮颜色 RGB
    fingerTextSize: "20",//指纹按钮文本大小
    FingerButtonText: "采集指纹",//指纹按钮文本内容
    fingerXAxis: "885",//指纹按钮X坐标
    fingerYAxis: "5",//指纹按钮Y坐标
},
  2:'begin'
}

export const COMMAND2 ={
  1:{HWPenSign: "HWEndSign"},
  2:'end'
}

export const toString = (val)=>{

  return typeof val==='string' ?  val: JSON.stringify(val)
}

signBoard.js

javascript 复制代码
import {Alert} from "./alert"; //弹窗提示可去除
import {toString, COMMAND1, WS_URLS, COMMAND2} from './constants'

export class SignBoard {
  constructor(type = 1) {
    this.type = type
    this.socket = null
    this._debounce = null
    this._bus = {}

    this._isReady = false
    this.onMessage = null
  }

  _onHanWangResponse(res) {
    if (typeof res === "object" && res.msgID === 0 && res.HWPenSign === "HWGetSign") {

      Alert.success('已操作')

      //签字成功事件返回
      this._bus.message.forEach(item => {
        typeof item === "function" && item(res)
      })

      typeof this.onMessage === "function" && this.onMessage(res)
    }

    if (this._debounce) clearTimeout(this._debounce)
    this._debounce = setTimeout(() => {
      if (typeof res === 'object' && res.msgID === 0 && res.HWPenSign === 'HWGetStatus') {
        res.DeviceStatus === 1 ? Alert.success('设备正常') : Alert.error('设备不存在')
      }
      if (typeof res === 'object' && res.msgID !== 0) {
        Alert.error(res.message || '设备异常')
      }
     
    }, 200)

  }

  _onHuiWangResponse(data) {

    try {
   
      if (data.type == 1) {
        const base64Img = "data:image/jpg;base64," + data.data;

        //签字成功事件返回
        const response = {message: base64Img,msgID:0,HWPenSign:'HWGetSign'}
        this._bus.message.forEach(item => {
          typeof item === "function" && item(response)
        })

        typeof this.onMessage === "function" && this.onMessage(response)
      } else {
        Alert.error('绘王签字版异常')
      }
    } catch (e) {
      console.log('[绘王签字版错误]', e);
    }

  }

  connect() {
    if (this._isReady){
      return
    }
    this._isReady = true
    this.socket = new WebSocket(WS_URLS[this.type])
    this.socket.onopen = () => {

      this.socket.send(toString({HWPenSign: "HWGetDeviceStatus"}))
    }
    this.socket.onmessage = ({data}) => {

      const res = data.indexOf('{') > -1 ? JSON.parse(data) : data;
      if (this.type === 1) {
        this._onHanWangResponse(res)
      } else {
        this._onHuiWangResponse(res)
      }
    }
    this.socket.onclose = () => {
      this._isReady = false
    }
    this.socket.onerror = () => {
      this._isReady = false

      setTimeout(()=>{
        this.connect()
      },5000)
    }

  }

  disconnect() {
    this.socket && this.socket.close()
  }

  on(name = '', fun) {
    (this._bus[name] || (this._bus[name] = [])).push(fun)
  }

  off(name = '', fun) {
    this._bus[name] && this._bus[name].forEach((item, i) => {
      if (fun === item) {
        this._bus[name].splice(i, 1)
      }
    })
  }

  startSign() {
    this.socket.send(toString(COMMAND1[this.type]))
  }

  closeSign() {

    this.socket.send(toString(COMMAND2[this.type]))
  }
}

const signType = 1
export default new SignBoard(signType)
相关推荐
拔剑纵狂歌7 分钟前
Golang异常处理机制
开发语言·后端·golang·go
fs哆哆10 分钟前
ExcelVBA运用Excel的【条件格式】(二)
linux·运维·服务器·前端·excel
L小李要学习23 分钟前
十一、作业
c语言·开发语言·c++
安冬的码畜日常24 分钟前
【CSS in Depth 2精译】2.5 无单位的数值与行高
前端·css
ilisi_25 分钟前
导航栏样式,盒子模型
前端·javascript·css
吉吉安34 分钟前
grid布局下的展开/收缩过渡效果【vue/已验证可正常运行】
前端·javascript·vue.js
DS_Watson36 分钟前
字符串和正则表达式踩坑
java·开发语言
Wayfreem37 分钟前
Java锁升级:无锁 → 偏向锁 → 轻量级锁 → 重量级锁
java·开发语言
梦凡尘39 分钟前
Vue3 对跳转 同一路由传入不同参数的页面分别进行缓存
前端·javascript·vue.js
攒了一袋星辰39 分钟前
Webpack安装以及快速入门
前端·webpack·node.js