SJA工艺
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

225 lines
5.5 KiB

package Engine
import (
"LAPP_SJA_ME/conf"
"LAPP_SJA_ME/utils"
"LAPP_SJA_ME/web/middleware/glog"
"LAPP_SJA_ME/web/models"
"fmt"
"net"
"os/exec"
"syscall"
"time"
)
type Printer struct {
PrinterId string // 打印机ID
PrinterName string // 打印机名
PrinterType string // 打印机类型,N=网络端口打印,L=文件打印
Ip string // 打印机IP地址
Port int // 打印机端口号
Interval int // 打印机打印间隔时间,单位:秒
conn net.Conn // 打印机连接句柄
InTaskChan chan models.PrintTask // 任务接入管道
Printertab models.Printertab // 打印机信息
printer syscall.Handle
}
// 创建打印机对象
func (p *Printer) Create(printertab models.Printertab){
p.PrinterId = printertab.Printerid
p.PrinterName = printertab.Printername
p.PrinterType = printertab.Printertype
p.Ip = printertab.Ipaddress
p.Port = printertab.Port
p.Interval = printertab.Printinterval
p.Printertab = printertab
p.InTaskChan = make(chan models.PrintTask, 1000)
}
// 输出打印任务到端口
// 打印任务是以ByteArray数组类型的文件行
func (p *Printer) printTaskBytesFile(bytesFile []models.ByteFile) error {
var(
err error
bytesRow models.ByteFile
)
for _, bytesRow = range bytesFile {
if _, err = p.conn.Write(bytesRow.ByteLine); err != nil {
return err
}
}
return nil
}
func (p *Printer) printTaskBytesRow(bytes []byte) error {
var err error
if _, err = p.conn.Write(bytes); err != nil {
return err
}
return nil
}
func (p *Printer) getSocketAddress() string {
return fmt.Sprintf("%s:%d", p.Ip, p.Port)
}
// 通过TCP打开端口
func (p *Printer) openSocket() error {
var err error
if p.conn, err = net.Dial("tcp", p.getSocketAddress()); err != nil {
return err
}
return nil
}
// 关闭通信端口
func (p *Printer) closeSocket() error {
return p.conn.Close()
}
// 通过端口打印
func (p *Printer) printBySocket(conf *conf.EnvConfig, saveChan chan models.PrintTask){
var (
t models.PrintTask
err error
bytesFile []models.ByteFile
)
// 从缓存队列的头部取出一个任务并输出打印
for {
t = <- p.InTaskChan
if bytesFile, err = t.GenBytesFile(conf); err != nil {
glog.InfoExtln("Printer","Failed to generate bytes for task : ", t)
continue
}
if err = p.openSocket(); err != nil {
glog.InfoExtln("Printer","Failed to open the socket: ", p.Ip, p.Port)
time.Sleep(time.Duration(p.Interval) * time.Second)
continue
}
if err = p.printTaskBytesFile(bytesFile); err != nil {
glog.InfoExtln("Printer","Failed to print the content due to: ", err)
continue
}
if err = p.closeSocket(); err != nil {
glog.InfoExtln("Printer","Failed to close the socket due to: ", err)
continue
}
// 将输出打印的任务输出到保存管道
saveChan <- t
if p.Interval > 0 {
time.Sleep(time.Duration(p.Interval) * time.Second)
}
}
}
// 通过输出文件打印
func (p *Printer) printByFile(conf *conf.EnvConfig, saveChan chan models.PrintTask){
var (
t models.PrintTask
err error
)
for {
t = <- p.InTaskChan
if err = t.GenPrintFile(conf); err != nil {
glog.InfoExtln("Printer","printByFile: Failed to generate print file for task : due to: ", t, err)
continue
}
// 通过windows文件输出方式打印
c := exec.Command("cmd", "/C", "COPY", "/B", t.TaskFile, p.PrinterName)
if err = c.Run(); err != nil {
glog.InfoExtln("Printer","PrintByFile: copy file to printer error: ", err)
continue
}
saveChan <- t
if p.Interval > 0 {
time.Sleep(time.Duration(p.Interval) * time.Second)
}
}
}
func (p *Printer) printByExcel(conf *conf.EnvConfig, printChan chan models.PrintTask){
var (
t models.PrintTask
err error
)
for {
t = <- p.InTaskChan
if err = t.GenExcelFile(conf); err != nil {
glog.InfoExtln("Printer","printByFile: Failed to generate print file for task : due to: ", t, err)
continue
}
// 通过windows文件输出方式打印
printChan <- t
if p.Interval > 0 {
time.Sleep(time.Duration(p.Interval) * time.Second)
}
}
}
// 创建打印机对象
func CreatePrinter(printertab models.Printertab)(p *Printer){
p = &Printer{}
p.PrinterName = printertab.Printername
p.PrinterType = printertab.Printertype
p.Ip = printertab.Ipaddress
p.Port = printertab.Port
p.Interval = printertab.Printinterval
p.Printertab = printertab
p.InTaskChan = make(chan models.PrintTask, 1000)
return p
}
// 启动打印机的打印服务
func StartPrinter(p *Printer, conf *conf.EnvConfig, printChan, outChan chan models.PrintTask){
switch p.PrinterType{
case "N": // 网络端口打印
go func (){
p.printBySocket(conf, outChan)
}()
case "L": // 输出文件打印
go func(){
p.printByFile(conf, outChan)
}()
case "E": // Excel表单打印机
go func(){
p.printByExcel(conf, printChan)
}()
}
}
// 串行打印表单文件并输出到任务保存队列
func StartSheetSerialPrintService(prnDict map[string] *Printer,printChan, outChan chan models.PrintTask){
var (
prn *Printer
t models.PrintTask
err error
ok bool
)
go func() {
for {
t = <-printChan
if prn, ok = prnDict[t.PrinterId]; !ok{
glog.InfoExtln("Printer","SheetPrintService: Task: printer: was not in the printer list.",t.TaskId, t.PrinterId)
continue
}
// 通过windows文件输出方式打印
utils.SetDefaultPrinter(prn.PrinterName,t.Printhead.Orientation)
if err = utils.ShellExecute(0, "print", t.TaskFile, prn.PrinterName, ".", 0); err != nil {
glog.InfoExtln("Printer","PrintExcelFile: failed to print the file: due to: ", t.TaskFile, err)
continue
}
outChan <- t
}
}()
}