From e89c05837d20cd87a102f94eec8bae130097baf0 Mon Sep 17 00:00:00 2001 From: louwenzhi Date: Mon, 11 Oct 2021 10:47:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=B2=E5=8F=A3=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/Utils.go | 64 ++++++++++++++++++++++++++++++++++++------- config/config.yaml | 4 +-- db/PrintTask.go | 68 ++++++++++++++++++++++++++++++++++++++++++---- db/Printertab.go | 7 +++-- engine/printer.go | 12 ++++---- main.go | 18 ++++++++---- 6 files changed, 141 insertions(+), 32 deletions(-) diff --git a/common/Utils.go b/common/Utils.go index 64fbf2a..eda4397 100644 --- a/common/Utils.go +++ b/common/Utils.go @@ -1,11 +1,15 @@ package common import ( + "LAPP_PRN_Service/glog" + "bytes" "container/list" "errors" "fmt" "github.com/lianggx6/goutf16" "github.com/tarm/serial" + "golang.org/x/text/encoding/simplifiedchinese" + "golang.org/x/text/transform" "io/ioutil" "log" "math/rand" @@ -331,8 +335,12 @@ func SetDefaultPrinter(printerName string) error { // 发送到打印机 func SendFileToPrinter(filePath string, ip string, port int) error { + path, err := GetCurrentPath("config/TSCLIB.dll") + if err != nil { + return err + } 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 ( - 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) if err != nil { + glog.InfoExtln("Printer", "Failed to open serial port due to: : ", err) return err } defer s.Close() //发送之前清空缓冲区 - buffer := make([]byte, 8000) + buffer := make([]byte, 9600) _, err = s.Read(buffer) if err != nil { + glog.InfoExtln("Printer", "Failed to Read serial due to: ", 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 } @@ -538,3 +562,23 @@ func CreateCaptcha() string { func CreateCaptchaFive() string { 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 +} diff --git a/config/config.yaml b/config/config.yaml index 930b695..81d90bd 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -6,7 +6,7 @@ ip: 101.201.121.115 #ip: 192.168.3.22 user: sa password: Leit2020 -dbname: GAAS_MOM +dbname: LAPP_LF_MOM port: 1433 filefolder: C://MES @@ -21,7 +21,7 @@ readtaskinterval: 5 # 支持打印机类型 printertype: N,L,E,D,S #D是TSC打印机,S是串口打印机 # 支持打印机 -printers : "COM" +printers : "192.168.0.108" inbox: Template\\Inbox outbox: Template\\Outbox # 间隔时间 diff --git a/db/PrintTask.go b/db/PrintTask.go index 1390ddd..0d1b1bb 100644 --- a/db/PrintTask.go +++ b/db/PrintTask.go @@ -25,7 +25,11 @@ type PrintTask struct { // 基于模板将打印任务转换成字节码输出 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) f, err := os.Open(templatefile) defer f.Close() @@ -51,9 +55,44 @@ func (t *PrintTask) GenBytesFile(conf *conf.EnvConfig) ([]common.ByteFile, error 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 { - 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) f, err := os.Open(templatefile) defer f.Close() @@ -78,7 +117,11 @@ func (t *PrintTask) GenPrintFile(conf *conf.EnvConfig) error { // 输出替换内容行到新建的打印文件 fileext := path.Ext(templatefile) 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) fn, err := os.Create(t.TaskFile) defer fn.Close() @@ -88,7 +131,12 @@ func (t *PrintTask) GenPrintFile(conf *conf.EnvConfig) error { } w := bufio.NewWriter(fn) 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 { glog.Infoln("GenPrintFile: failed to write print file for task: due to: ", t.TaskId, err) return err @@ -106,7 +154,11 @@ func (t *PrintTask) GenExcelFile(conf *conf.EnvConfig) error { xlFile *excelize.File 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) xlFile, err = excelize.OpenFile(templatefile) if err != nil { @@ -123,7 +175,11 @@ func (t *PrintTask) GenExcelFile(conf *conf.EnvConfig) error { // 输出替换内容行到新建的Excel文件 fileext := path.Ext(templatefile) 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) err = xlFile.SaveAs(t.TaskFile) if err != nil { diff --git a/db/Printertab.go b/db/Printertab.go index d5f8a15..18a4dd5 100644 --- a/db/Printertab.go +++ b/db/Printertab.go @@ -126,13 +126,14 @@ func (t *Printer) GetPrinterList(conf *conf.EnvConfig) ([]Printer, error) { // 获取打印机ID列表 func (t *Printer) GetPrinterIdList(conf *conf.EnvConfig) ([]string, error) { var ( - printertablist []Printer - prnlist, pt []string + printertablist []Printer + prnlist, printers, pt []string ) e := G_DbEngine 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 { glog.Infoln("failed to query printertab for type: due to:", pt, err) return nil, err diff --git a/engine/printer.go b/engine/printer.go index 6f99271..9d77211 100644 --- a/engine/printer.go +++ b/engine/printer.go @@ -196,18 +196,18 @@ func (p *Printer) printBySerial(conf *conf.EnvConfig, saveChan chan db.PrintTask var ( t db.PrintTask err error - bytesFile []common.ByteFile + strsFile string ) for { 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) 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 } saveChan <- t @@ -251,9 +251,9 @@ func StartPrinter(p *Printer, conf *conf.EnvConfig, printChan, outChan chan db.P go func() { p.printByExcel(conf, printChan) }() - case "S": // 网口打印机 + case "S": // 串口打印机 go func() { - p.printBySerial(conf, printChan) + p.printBySerial(conf, outChan) }() } } diff --git a/main.go b/main.go index fd778b1..c1e0216 100644 --- a/main.go +++ b/main.go @@ -32,9 +32,9 @@ func (p *program) Stop(s service.Service) error { func main() { svcConfig := &service.Config{ - Name: "msg", - DisplayName: "msg", - Description: "this is msg", + Name: "printer", + DisplayName: "printer", + Description: "this is printer", } prg := &program{} @@ -80,13 +80,21 @@ func imain() { defer glog.Flush() pathLogDir := filepath.Join(baseDir, "glog") //备注,因为是打包成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.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) conf, err := config.ReadYamlConfig(path) if err != nil {