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.
 
 

203 lines
5.6 KiB

package models
import (
"LAPP_LF_MOM_BACKEND/conf"
"LAPP_LF_MOM_BACKEND/db"
"LAPP_LF_MOM_BACKEND/utils"
"bufio"
"errors"
"github.com/tealeg/xlsx"
"log"
"os"
"path"
"path/filepath"
"strings"
"time"
"xorm.io/core"
)
type PrintTask struct {
TaskId string
TaskFile string // 保存打印文件的文件路径
PrinterId string
Printhead Printheadtab
PrintdetailList []Printdetailtab
}
type ByteFile struct {
ByteLine []byte
}
// 基于模板将打印任务转换成字节码输出
func (t *PrintTask) GenBytesFile(conf *conf.EnvConfig) ([]ByteFile, error) {
templatefile := filepath.Join(conf.TemplatePath, t.Printhead.Templatefile)
f, err := os.Open(templatefile)
defer f.Close()
if err != nil {
log.Printf("failed to open template file: %s due to: %v", templatefile, err)
return nil, err
}
var results []ByteFile
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)
}
var r ByteFile
r.ByteLine = []byte(linetext)
results = append(results, r)
}
return results, nil
}
// 基于模板将打印任务转换成打印文件输出
func (t *PrintTask) GenPrintFile(conf *conf.EnvConfig) error {
templatefile := filepath.Join(conf.TemplatePath, t.Printhead.Templatefile)
f, err := os.Open(templatefile)
defer f.Close()
if err != nil {
log.Printf("GenPrintFile: failed to open template file: %s due to: %v", 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.Varpos, -1)
}
results = append(results, linetext)
}
// 输出替换内容行到新建的打印文件
fileext := path.Ext(templatefile)
printfile := t.TaskId + fileext
t.TaskFile = filepath.Join(conf.Inbox, printfile)
fn, err := os.Create(t.TaskFile)
defer fn.Close()
if err != nil {
log.Printf("GenPrintFile: failed to create print file for task: %s due to: %v", t.TaskId, err)
return err
}
w := bufio.NewWriter(fn)
for _, linetext := range results {
_, err := w.WriteString(linetext)
if err != nil {
log.Printf("GenPrintFile: failed to write print file for task: %s due to: %v", t.TaskId, err)
return err
}
}
w.Flush()
return nil
}
// 基于模板将打印任务转换成Excel文件输出
func (t *PrintTask) GenExcelFile(conf *conf.EnvConfig) error {
var (
templatefile string
xlFile *xlsx.File
sheet *xlsx.Sheet
row, col int
err error
)
templatefile = filepath.Join(conf.TemplatePath, t.Printhead.Templatefile)
xlFile, err = xlsx.OpenFile(templatefile)
if err != nil {
log.Printf("Failed to open the template file: %s due to: %v", templatefile, err)
return err
}
// 获取模板文件的第一个sheet
if len(xlFile.Sheets) <= 0 {
log.Printf("The specified excel template : %s has no sheets!", t.Printhead.Templatefile)
return errors.New("The specified excel template has no sheets!")
} else {
sheet = xlFile.Sheet[xlFile.Sheets[0].Name]
}
// 获取替换文件的内容行并替换Excel表格中的内容
for _, pd := range t.PrintdetailList {
// 替换单元格对应的内容
row, col, _ = utils.GetExcelCellIntPos(pd.Varpos)
sheet.Cell(row, col).Value = pd.Varvalue
}
// 输出替换内容行到新建的Excel文件
fileext := path.Ext(templatefile)
printfile := t.TaskId + fileext
t.TaskFile = filepath.Join(conf.Inbox, printfile)
err = xlFile.Save(t.TaskFile)
if err != nil {
log.Printf("GenExcelFile: failed to create excel file for task: %s due to: %v", t.TaskId, err)
return err
}
return nil
}
// 获取打印任务
func (t *PrintTask) GetPrintTaskList(stalist []string, prnlist []string, conf *conf.EnvConfig) ([]PrintTask, error) {
var (
tasklist []PrintTask
printheadlist []Printheadtab
err error
)
e := db.Eloquent.Master()
// 获取所有开口的打印任务头
if len(prnlist) > 0 {
err = e.Where("finr = ?", conf.Finr).In("status", stalist).In("printerid", prnlist).OrderBy("printheadid").Find(&printheadlist)
} else {
err = e.Where("finr = ?", conf.Finr).In("status", stalist).OrderBy("printheadid").Find(&printheadlist)
}
if err != nil {
log.Printf("failed to query printheadtab due to: %v", err)
return nil, err
}
// 遍历打印任务头
for _, p := range printheadlist {
var t PrintTask
t.Printhead = p
t.Printhead.Clipped()
t.TaskId = t.Printhead.Printheadid
t.PrinterId = t.Printhead.Printerid
var pdlist []Printdetailtab
err := e.Where("finr = ? and printheadid = ?", conf.Finr, t.Printhead.Printheadid).OrderBy("pos").Find(&pdlist)
if err != nil {
log.Printf("failed to query printdetailtab due to: %v", err)
return nil, err
}
for _, pd := range pdlist {
pd.Clipped()
t.PrintdetailList = append(t.PrintdetailList, pd)
}
tasklist = append(tasklist, t)
}
return tasklist, nil
}
// 关闭打印任务
func (t *PrintTask) ChangePrintTaskStatus(task PrintTask, newStatus string) error {
e := db.Eloquent.Master()
task.Printhead.Status = newStatus
task.Printhead.Lastmodif = time.Now().Format("20060102150405")
_, err := e.Id(core.PK{task.Printhead.Finr, task.Printhead.Printheadid}).Cols("status", "lastmodif").Update(&task.Printhead)
if err != nil {
log.Printf("failed to change printerheadtab status for printheadid: %s", task.Printhead.Printheadid)
return err
}
return nil
}