Browse Source

串口打印

master
娄文智 3 years ago
parent
commit
e89c05837d
6 changed files with 141 additions and 32 deletions
  1. +54
    -10
      common/Utils.go
  2. +2
    -2
      config/config.yaml
  3. +62
    -6
      db/PrintTask.go
  4. +4
    -3
      db/Printertab.go
  5. +6
    -6
      engine/printer.go
  6. +13
    -5
      main.go

+ 54
- 10
common/Utils.go View File

@ -1,11 +1,15 @@
package common package common
import ( import (
"LAPP_PRN_Service/glog"
"bytes"
"container/list" "container/list"
"errors" "errors"
"fmt" "fmt"
"github.com/lianggx6/goutf16" "github.com/lianggx6/goutf16"
"github.com/tarm/serial" "github.com/tarm/serial"
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform"
"io/ioutil" "io/ioutil"
"log" "log"
"math/rand" "math/rand"
@ -331,8 +335,12 @@ func SetDefaultPrinter(printerName string) error {
// 发送到打印机 // 发送到打印机
func SendFileToPrinter(filePath string, ip string, port int) error { func SendFileToPrinter(filePath string, ip string, port int) error {
path, err := GetCurrentPath("config/TSCLIB.dll")
if err != nil {
return err
}
var ( var (
dll = syscall.NewLazyDLL(EnsureDir("config/TSCLIB.dll"))
dll = syscall.NewLazyDLL(path)
) )
//调用文件 //调用文件
//打开 打印机 端口. //打开 打印机 端口.
@ -363,31 +371,47 @@ type ByteFile struct {
} }
// 发送到打印机 // 发送到打印机
func SendFileBySerial(bytesFile []ByteFile, SerialName string, SerialPort int) error {
func SendFileBySerial(strsFile string, SerialName string, SerialPort int) error {
var ( var (
err error
bytesRow ByteFile
err error
) )
c := &serial.Config{Name: SerialName, Baud: SerialPort}
c := &serial.Config{
Name: SerialName,
Baud: SerialPort,
StopBits: serial.Stop1,
Size: 8,
Parity: serial.ParityNone,
ReadTimeout: 5 * time.Second,
}
glog.InfoExtln("打印指令", "打印指令: ", strsFile)
s, err := serial.OpenPort(c) s, err := serial.OpenPort(c)
if err != nil { if err != nil {
glog.InfoExtln("Printer", "Failed to open serial port due to: : ", err)
return err return err
} }
defer s.Close() defer s.Close()
//发送之前清空缓冲区 //发送之前清空缓冲区
buffer := make([]byte, 8000)
buffer := make([]byte, 9600)
_, err = s.Read(buffer) _, err = s.Read(buffer)
if err != nil { if err != nil {
glog.InfoExtln("Printer", "Failed to Read serial due to: ", err)
return err return err
} }
for _, bytesRow = range bytesFile {
if _, err = s.Write(bytesRow.ByteLine); err != nil {
return err
}
GBKStr, err := Utf8ToGbk([]byte(strsFile))
if err != nil {
glog.InfoExtln("Printer", "Failed to Read serial due to: ", err)
return err
} }
if _, err = s.Write(GBKStr); err != nil {
glog.InfoExtln("Printer", "Failed to Read serial Write to: ", err)
return err
}
time.Sleep(1 * time.Second)
return nil return nil
} }
@ -538,3 +562,23 @@ func CreateCaptcha() string {
func CreateCaptchaFive() string { func CreateCaptchaFive() string {
return fmt.Sprintf("%05v", rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(100000)) return fmt.Sprintf("%05v", rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(100000))
} }
// GBK 转 UTF-8
func GbkToUtf8(s []byte) ([]byte, error) {
reader := transform.NewReader(bytes.NewReader(s), simplifiedchinese.GBK.NewDecoder())
d, e := ioutil.ReadAll(reader)
if e != nil {
return nil, e
}
return d, nil
}
// UTF-8 转 GBK
func Utf8ToGbk(s []byte) ([]byte, error) {
reader := transform.NewReader(bytes.NewReader(s), simplifiedchinese.GBK.NewEncoder())
d, e := ioutil.ReadAll(reader)
if e != nil {
return nil, e
}
return d, nil
}

+ 2
- 2
config/config.yaml View File

@ -6,7 +6,7 @@ ip: 101.201.121.115
#ip: 192.168.3.22 #ip: 192.168.3.22
user: sa user: sa
password: Leit2020 password: Leit2020
dbname: GAAS_MOM
dbname: LAPP_LF_MOM
port: 1433 port: 1433
filefolder: C://MES filefolder: C://MES
@ -21,7 +21,7 @@ readtaskinterval: 5
# 支持打印机类型 # 支持打印机类型
printertype: N,L,E,D,S #D是TSC打印机,S是串口打印机 printertype: N,L,E,D,S #D是TSC打印机,S是串口打印机
# 支持打印机 # 支持打印机
printers : "COM"
printers : "192.168.0.108"
inbox: Template\\Inbox inbox: Template\\Inbox
outbox: Template\\Outbox outbox: Template\\Outbox
# 间隔时间 # 间隔时间


+ 62
- 6
db/PrintTask.go View File

@ -25,7 +25,11 @@ type PrintTask struct {
// 基于模板将打印任务转换成字节码输出 // 基于模板将打印任务转换成字节码输出
func (t *PrintTask) GenBytesFile(conf *conf.EnvConfig) ([]common.ByteFile, error) { func (t *PrintTask) GenBytesFile(conf *conf.EnvConfig) ([]common.ByteFile, error) {
TemplatePath := common.EnsureDir(conf.TemplatePath)
TemplatePath,err := common.GetCurrentPath(conf.TemplatePath)
if err != nil {
glog.Infoln("failed to open template file: due to: ", err)
return nil, err
}
templatefile := filepath.Join(TemplatePath, t.PrintHead.TemplateFile) templatefile := filepath.Join(TemplatePath, t.PrintHead.TemplateFile)
f, err := os.Open(templatefile) f, err := os.Open(templatefile)
defer f.Close() defer f.Close()
@ -51,9 +55,44 @@ func (t *PrintTask) GenBytesFile(conf *conf.EnvConfig) ([]common.ByteFile, error
return results, nil return results, nil
} }
// 基于模板将打印任务转换成字节码输出
func (t *PrintTask) GenStrsFile(conf *conf.EnvConfig) (string, error) {
TemplatePath,err := common.GetCurrentPath(conf.TemplatePath)
if err != nil {
glog.Infoln("failed to open template file: due to: ", err)
return "", err
}
templatefile := filepath.Join(TemplatePath, t.PrintHead.TemplateFile)
f, err := os.Open(templatefile)
defer f.Close()
if err != nil {
glog.Infoln("failed to open template file: due to: ", templatefile, err)
return "", err
}
var results string
scanner := bufio.NewScanner(f)
for scanner.Scan() {
linetext := scanner.Text()
for _, pd := range t.PrintDetailList {
// -1 替换所有; 1 替换第一个; 5 替换前5个
linetext = strings.Replace(linetext, pd.VarName, pd.VarValue, -1)
}
results += linetext
}
return results, nil
}
// 基于模板将打印任务转换成打印文件输出 // 基于模板将打印任务转换成打印文件输出
func (t *PrintTask) GenPrintFile(conf *conf.EnvConfig) error { func (t *PrintTask) GenPrintFile(conf *conf.EnvConfig) error {
TemplatePath := common.EnsureDir(conf.TemplatePath)
TemplatePath,err := common.GetCurrentPath(conf.TemplatePath)
if err != nil {
glog.Infoln("failed to open template file: due to: ", err)
return err
}
templatefile := filepath.Join(TemplatePath, t.PrintHead.TemplateFile) templatefile := filepath.Join(TemplatePath, t.PrintHead.TemplateFile)
f, err := os.Open(templatefile) f, err := os.Open(templatefile)
defer f.Close() defer f.Close()
@ -78,7 +117,11 @@ func (t *PrintTask) GenPrintFile(conf *conf.EnvConfig) error {
// 输出替换内容行到新建的打印文件 // 输出替换内容行到新建的打印文件
fileext := path.Ext(templatefile) fileext := path.Ext(templatefile)
printfile := t.TaskId + fileext printfile := t.TaskId + fileext
inbox := common.EnsureDir(conf.Inbox)
inbox,err := common.GetCurrentPath(conf.Inbox)
if err != nil {
glog.Infoln("GenPrintFile: failed to create print file for task: due to: ", t.TaskId, err)
return err
}
t.TaskFile = filepath.Join(inbox, printfile) t.TaskFile = filepath.Join(inbox, printfile)
fn, err := os.Create(t.TaskFile) fn, err := os.Create(t.TaskFile)
defer fn.Close() defer fn.Close()
@ -88,7 +131,12 @@ func (t *PrintTask) GenPrintFile(conf *conf.EnvConfig) error {
} }
w := bufio.NewWriter(fn) w := bufio.NewWriter(fn)
for _, linetext := range results { for _, linetext := range results {
_, err := w.WriteString(linetext+ "\r\n")
GBKStr,err := common.Utf8ToGbk([]byte(linetext))
if err != nil {
glog.InfoExtln("Printer", "Failed to Utf8ToGbk due to: ", err)
return err
}
_, err = w.WriteString(string(GBKStr)+ "\r\n")
if err != nil { if err != nil {
glog.Infoln("GenPrintFile: failed to write print file for task: due to: ", t.TaskId, err) glog.Infoln("GenPrintFile: failed to write print file for task: due to: ", t.TaskId, err)
return err return err
@ -106,7 +154,11 @@ func (t *PrintTask) GenExcelFile(conf *conf.EnvConfig) error {
xlFile *excelize.File xlFile *excelize.File
err error err error
) )
TemplatePath := common.EnsureDir(conf.TemplatePath)
TemplatePath,err := common.GetCurrentPath(conf.TemplatePath)
if err != nil {
glog.Infoln("failed to open template file: due to: ", err)
return err
}
templatefile = filepath.Join(TemplatePath, t.PrintHead.TemplateFile) templatefile = filepath.Join(TemplatePath, t.PrintHead.TemplateFile)
xlFile, err = excelize.OpenFile(templatefile) xlFile, err = excelize.OpenFile(templatefile)
if err != nil { if err != nil {
@ -123,7 +175,11 @@ func (t *PrintTask) GenExcelFile(conf *conf.EnvConfig) error {
// 输出替换内容行到新建的Excel文件 // 输出替换内容行到新建的Excel文件
fileext := path.Ext(templatefile) fileext := path.Ext(templatefile)
printfile := t.TaskId + fileext printfile := t.TaskId + fileext
inbox := common.EnsureDir(conf.Inbox)
inbox,err := common.GetCurrentPath(conf.Inbox)
if err != nil {
glog.Infoln("Failed to open the template file: due to: ", templatefile, err)
return err
}
t.TaskFile = filepath.Join(inbox, printfile) t.TaskFile = filepath.Join(inbox, printfile)
err = xlFile.SaveAs(t.TaskFile) err = xlFile.SaveAs(t.TaskFile)
if err != nil { if err != nil {


+ 4
- 3
db/Printertab.go View File

@ -126,13 +126,14 @@ func (t *Printer) GetPrinterList(conf *conf.EnvConfig) ([]Printer, error) {
// 获取打印机ID列表 // 获取打印机ID列表
func (t *Printer) GetPrinterIdList(conf *conf.EnvConfig) ([]string, error) { func (t *Printer) GetPrinterIdList(conf *conf.EnvConfig) ([]string, error) {
var ( var (
printertablist []Printer
prnlist, pt []string
printertablist []Printer
prnlist, printers, pt []string
) )
e := G_DbEngine e := G_DbEngine
pt = strings.Split(conf.PrinterType, ",") pt = strings.Split(conf.PrinterType, ",")
printers = strings.Split(conf.Printers, ",")
err := e.Where("PlantNr = ? and active = ?", conf.PlantNr, 1).In("PrinterType", pt).Find(&printertablist)
err := e.Where("PlantNr = ? and Active = ?", conf.PlantNr, 1).In("PrinterId", printers).In("PrinterType", pt).Find(&printertablist)
if err != nil { if err != nil {
glog.Infoln("failed to query printertab for type: due to:", pt, err) glog.Infoln("failed to query printertab for type: due to:", pt, err)
return nil, err return nil, err


+ 6
- 6
engine/printer.go View File

@ -196,18 +196,18 @@ func (p *Printer) printBySerial(conf *conf.EnvConfig, saveChan chan db.PrintTask
var ( var (
t db.PrintTask t db.PrintTask
err error err error
bytesFile []common.ByteFile
strsFile string
) )
for { for {
t = <-p.InTaskChan t = <-p.InTaskChan
if bytesFile, err = t.GenBytesFile(conf); err != nil {
if strsFile, err = t.GenStrsFile(conf); err != nil {
glog.InfoExtln("Printer", "Failed to generate bytes for task : ", t) glog.InfoExtln("Printer", "Failed to generate bytes for task : ", t)
continue continue
} }
// 通过串口形式打印 // 通过串口形式打印
if err = common.SendFileBySerial(bytesFile, p.SerialName, p.SerialPort); err != nil {
glog.InfoExtln("Printer", "Failed to by dll: ", err)
if err = common.SendFileBySerial(strsFile, p.SerialName, p.SerialPort); err != nil {
glog.InfoExtln("Printer", "Failed to printBySerial: ", err)
continue continue
} }
saveChan <- t saveChan <- t
@ -251,9 +251,9 @@ func StartPrinter(p *Printer, conf *conf.EnvConfig, printChan, outChan chan db.P
go func() { go func() {
p.printByExcel(conf, printChan) p.printByExcel(conf, printChan)
}() }()
case "S": // 口打印机
case "S": // 口打印机
go func() { go func() {
p.printBySerial(conf, printChan)
p.printBySerial(conf, outChan)
}() }()
} }
} }


+ 13
- 5
main.go View File

@ -32,9 +32,9 @@ func (p *program) Stop(s service.Service) error {
func main() { func main() {
svcConfig := &service.Config{ svcConfig := &service.Config{
Name: "msg",
DisplayName: "msg",
Description: "this is msg",
Name: "printer",
DisplayName: "printer",
Description: "this is printer",
} }
prg := &program{} prg := &program{}
@ -80,13 +80,21 @@ func imain() {
defer glog.Flush() defer glog.Flush()
pathLogDir := filepath.Join(baseDir, "glog") pathLogDir := filepath.Join(baseDir, "glog")
//备注,因为是打包成windows服务,路径需要转义 //备注,因为是打包成windows服务,路径需要转义
pathLogDir = common.EnsureDir(pathLogDir)
pathLogDir, err := common.GetCurrentPath(pathLogDir)
if err != nil {
log.Printf("failed pathLogDir due to: %v", err)
return
}
glog.DefaultInit(true, pathLogDir) glog.DefaultInit(true, pathLogDir)
glog.Infoln("启动日志", "InitDB return success") glog.Infoln("启动日志", "InitDB return success")
//加载配置 //加载配置
path := common.EnsureDir("config/config.yaml")
path, err := common.GetCurrentPath("config/config.yaml")
if err != nil {
log.Printf("failed to read yaml config due to: %v", err)
return
}
fmt.Println(path) fmt.Println(path)
conf, err := config.ReadYamlConfig(path) conf, err := config.ReadYamlConfig(path)
if err != nil { if err != nil {


Loading…
Cancel
Save