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

  1. package models
  2. import (
  3. "LAPP_LF_MOM_BACKEND/conf"
  4. "LAPP_LF_MOM_BACKEND/db"
  5. "LAPP_LF_MOM_BACKEND/utils"
  6. "bufio"
  7. "errors"
  8. "github.com/tealeg/xlsx"
  9. "log"
  10. "os"
  11. "path"
  12. "path/filepath"
  13. "strings"
  14. "time"
  15. "xorm.io/core"
  16. )
  17. type PrintTask struct {
  18. TaskId string
  19. TaskFile string // 保存打印文件的文件路径
  20. PrinterId string
  21. Printhead Printheadtab
  22. PrintdetailList []Printdetailtab
  23. }
  24. type ByteFile struct {
  25. ByteLine []byte
  26. }
  27. // 基于模板将打印任务转换成字节码输出
  28. func (t *PrintTask) GenBytesFile(conf *conf.EnvConfig) ([]ByteFile, error) {
  29. templatefile := filepath.Join(conf.TemplatePath, t.Printhead.Templatefile)
  30. f, err := os.Open(templatefile)
  31. defer f.Close()
  32. if err != nil {
  33. log.Printf("failed to open template file: %s due to: %v", templatefile, err)
  34. return nil, err
  35. }
  36. var results []ByteFile
  37. scanner := bufio.NewScanner(f)
  38. for scanner.Scan() {
  39. linetext := scanner.Text()
  40. for _, pd := range t.PrintdetailList {
  41. // -1 替换所有; 1 替换第一个; 5 替换前5个
  42. linetext = strings.Replace(linetext, pd.Varname, pd.Varvalue, -1)
  43. }
  44. var r ByteFile
  45. r.ByteLine = []byte(linetext)
  46. results = append(results, r)
  47. }
  48. return results, nil
  49. }
  50. // 基于模板将打印任务转换成打印文件输出
  51. func (t *PrintTask) GenPrintFile(conf *conf.EnvConfig) error {
  52. templatefile := filepath.Join(conf.TemplatePath, t.Printhead.Templatefile)
  53. f, err := os.Open(templatefile)
  54. defer f.Close()
  55. if err != nil {
  56. log.Printf("GenPrintFile: failed to open template file: %s due to: %v", templatefile, err)
  57. return err
  58. }
  59. // 获取替换文件的内容行
  60. var results []string
  61. scanner := bufio.NewScanner(f)
  62. for scanner.Scan() {
  63. linetext := scanner.Text()
  64. for _, pd := range t.PrintdetailList {
  65. // -1 替换所有; 1 替换第一个; 5 替换前5个
  66. linetext = strings.Replace(linetext, pd.Varname, pd.Varpos, -1)
  67. }
  68. results = append(results, linetext)
  69. }
  70. // 输出替换内容行到新建的打印文件
  71. fileext := path.Ext(templatefile)
  72. printfile := t.TaskId + fileext
  73. t.TaskFile = filepath.Join(conf.Inbox, printfile)
  74. fn, err := os.Create(t.TaskFile)
  75. defer fn.Close()
  76. if err != nil {
  77. log.Printf("GenPrintFile: failed to create print file for task: %s due to: %v", t.TaskId, err)
  78. return err
  79. }
  80. w := bufio.NewWriter(fn)
  81. for _, linetext := range results {
  82. _, err := w.WriteString(linetext)
  83. if err != nil {
  84. log.Printf("GenPrintFile: failed to write print file for task: %s due to: %v", t.TaskId, err)
  85. return err
  86. }
  87. }
  88. w.Flush()
  89. return nil
  90. }
  91. // 基于模板将打印任务转换成Excel文件输出
  92. func (t *PrintTask) GenExcelFile(conf *conf.EnvConfig) error {
  93. var (
  94. templatefile string
  95. xlFile *xlsx.File
  96. sheet *xlsx.Sheet
  97. row, col int
  98. err error
  99. )
  100. templatefile = filepath.Join(conf.TemplatePath, t.Printhead.Templatefile)
  101. xlFile, err = xlsx.OpenFile(templatefile)
  102. if err != nil {
  103. log.Printf("Failed to open the template file: %s due to: %v", templatefile, err)
  104. return err
  105. }
  106. // 获取模板文件的第一个sheet
  107. if len(xlFile.Sheets) <= 0 {
  108. log.Printf("The specified excel template : %s has no sheets!", t.Printhead.Templatefile)
  109. return errors.New("The specified excel template has no sheets!")
  110. } else {
  111. sheet = xlFile.Sheet[xlFile.Sheets[0].Name]
  112. }
  113. // 获取替换文件的内容行并替换Excel表格中的内容
  114. for _, pd := range t.PrintdetailList {
  115. // 替换单元格对应的内容
  116. row, col, _ = utils.GetExcelCellIntPos(pd.Varpos)
  117. sheet.Cell(row, col).Value = pd.Varvalue
  118. }
  119. // 输出替换内容行到新建的Excel文件
  120. fileext := path.Ext(templatefile)
  121. printfile := t.TaskId + fileext
  122. t.TaskFile = filepath.Join(conf.Inbox, printfile)
  123. err = xlFile.Save(t.TaskFile)
  124. if err != nil {
  125. log.Printf("GenExcelFile: failed to create excel file for task: %s due to: %v", t.TaskId, err)
  126. return err
  127. }
  128. return nil
  129. }
  130. // 获取打印任务
  131. func (t *PrintTask) GetPrintTaskList(stalist []string, prnlist []string, conf *conf.EnvConfig) ([]PrintTask, error) {
  132. var (
  133. tasklist []PrintTask
  134. printheadlist []Printheadtab
  135. err error
  136. )
  137. e := db.Eloquent.Master()
  138. // 获取所有开口的打印任务头
  139. if len(prnlist) > 0 {
  140. err = e.Where("finr = ?", conf.Finr).In("status", stalist).In("printerid", prnlist).OrderBy("printheadid").Find(&printheadlist)
  141. } else {
  142. err = e.Where("finr = ?", conf.Finr).In("status", stalist).OrderBy("printheadid").Find(&printheadlist)
  143. }
  144. if err != nil {
  145. log.Printf("failed to query printheadtab due to: %v", err)
  146. return nil, err
  147. }
  148. // 遍历打印任务头
  149. for _, p := range printheadlist {
  150. var t PrintTask
  151. t.Printhead = p
  152. t.Printhead.Clipped()
  153. t.TaskId = t.Printhead.Printheadid
  154. t.PrinterId = t.Printhead.Printerid
  155. var pdlist []Printdetailtab
  156. err := e.Where("finr = ? and printheadid = ?", conf.Finr, t.Printhead.Printheadid).OrderBy("pos").Find(&pdlist)
  157. if err != nil {
  158. log.Printf("failed to query printdetailtab due to: %v", err)
  159. return nil, err
  160. }
  161. for _, pd := range pdlist {
  162. pd.Clipped()
  163. t.PrintdetailList = append(t.PrintdetailList, pd)
  164. }
  165. tasklist = append(tasklist, t)
  166. }
  167. return tasklist, nil
  168. }
  169. // 关闭打印任务
  170. func (t *PrintTask) ChangePrintTaskStatus(task PrintTask, newStatus string) error {
  171. e := db.Eloquent.Master()
  172. task.Printhead.Status = newStatus
  173. task.Printhead.Lastmodif = time.Now().Format("20060102150405")
  174. _, err := e.Id(core.PK{task.Printhead.Finr, task.Printhead.Printheadid}).Cols("status", "lastmodif").Update(&task.Printhead)
  175. if err != nil {
  176. log.Printf("failed to change printerheadtab status for printheadid: %s", task.Printhead.Printheadid)
  177. return err
  178. }
  179. return nil
  180. }