report-produce-excel.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  1. package api
  2. import (
  3. "box-cost/db/model"
  4. "fmt"
  5. "github.com/xuri/excelize/v2"
  6. )
  7. type ReportProduceExcel struct {
  8. Offset int
  9. Row int
  10. Title string //标题
  11. Excel *excelize.File
  12. SheetName string
  13. AlignCenterStyle int
  14. Content *model.ProduceBill
  15. BudgetAmount float64
  16. RealAmount float64
  17. }
  18. func (b *ReportProduceExcel) drawTitle() error {
  19. b.Row++
  20. // 设置外边距
  21. startCell := fmt.Sprintf("A%d", b.Row)
  22. endCell := fmt.Sprintf("L%d", b.Row)
  23. marginLeft := excelize.PageMarginLeft(0.15)
  24. if b.Content.IsPrint {
  25. // A加工项目 B规格 C纸张 D来纸尺寸 E印刷尺寸 F下单数量 G完成数量 H单价 I预算金额 J实际金额 K交货时间 L备注
  26. b.Excel.SetColWidth(b.SheetName, "A", "A", 16)
  27. b.Excel.SetColWidth(b.SheetName, "B", "B", 14)
  28. b.Excel.SetColWidth(b.SheetName, "C", "C", 10)
  29. b.Excel.SetColWidth(b.SheetName, "D", "E", 14)
  30. b.Excel.SetColWidth(b.SheetName, "F", "K", 12)
  31. b.Excel.SetColWidth(b.SheetName, "J", "J", 18)
  32. } else {
  33. // 不是打印
  34. // A加工项目 B规格 C下单数量 D完成数量 E单价 F预算金额 G实际金额 H交货时间 I备注
  35. endCell = fmt.Sprintf("G%d", b.Row)
  36. marginLeft = excelize.PageMarginLeft(0.6)
  37. b.Excel.SetColWidth(b.SheetName, "A", "A", 16)
  38. b.Excel.SetColWidth(b.SheetName, "B", "B", 14)
  39. b.Excel.SetColWidth(b.SheetName, "C", "H", 12)
  40. b.Excel.SetColWidth(b.SheetName, "I", "I", 18)
  41. // 是覆膜
  42. if b.Content.IsLam {
  43. // A加工项目 B规格 C覆膜尺寸 D下单数量 E完成数量 F元/吨,G元/张 H预算金额 I实际金额 J交货时间 K备注
  44. endCell = fmt.Sprintf("I%d", b.Row)
  45. marginLeft = excelize.PageMarginLeft(0.3)
  46. b.Excel.SetColWidth(b.SheetName, "A", "A", 16)
  47. b.Excel.SetColWidth(b.SheetName, "B", "C", 14)
  48. // 覆膜规格
  49. b.Excel.SetColWidth(b.SheetName, "D", "J", 12)
  50. b.Excel.SetColWidth(b.SheetName, "K", "K", 18)
  51. }
  52. }
  53. b.Excel.SetPageMargins(b.SheetName, marginLeft)
  54. err := b.Excel.MergeCell(b.SheetName, startCell, endCell)
  55. if err != nil {
  56. return err
  57. }
  58. style, err := b.Excel.NewStyle(&excelize.Style{
  59. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
  60. Font: &excelize.Font{Bold: true, Size: 18}})
  61. if err != nil {
  62. return err
  63. }
  64. err = b.Excel.SetCellStyle(b.SheetName, startCell, startCell, style)
  65. if err != nil {
  66. return err
  67. }
  68. b.Excel.SetRowHeight(b.SheetName, b.Row, 23)
  69. b.Excel.SetCellValue(b.SheetName, startCell, b.Title)
  70. return nil
  71. }
  72. func (b *ReportProduceExcel) drawSubTitles() error {
  73. b.Row++
  74. styleLeft, err := b.Excel.NewStyle(&excelize.Style{
  75. Alignment: &excelize.Alignment{Horizontal: "left", Vertical: "center"},
  76. Font: &excelize.Font{Size: 11}})
  77. if err != nil {
  78. return err
  79. }
  80. styleRight, err := b.Excel.NewStyle(&excelize.Style{
  81. Alignment: &excelize.Alignment{Horizontal: "right", Vertical: "center"},
  82. Font: &excelize.Font{Size: 11}})
  83. if err != nil {
  84. return err
  85. }
  86. var drawLeft = func(rowIndex int, value string) error {
  87. //左边1
  88. left1Cell := fmt.Sprintf("A%d", rowIndex)
  89. err = b.Excel.MergeCell(b.SheetName, left1Cell, fmt.Sprintf("I%d", rowIndex))
  90. if err != nil {
  91. return err
  92. }
  93. err = b.Excel.SetCellStyle(b.SheetName, left1Cell, left1Cell, styleLeft)
  94. if err != nil {
  95. return err
  96. }
  97. b.Excel.SetCellValue(b.SheetName, left1Cell, value)
  98. return nil
  99. }
  100. var drawRight = func(rowIndex int, value string) error {
  101. right1Cell := fmt.Sprintf("J%d", rowIndex)
  102. err = b.Excel.MergeCell(b.SheetName, right1Cell, fmt.Sprintf("L%d", rowIndex))
  103. if err != nil {
  104. return err
  105. }
  106. err = b.Excel.SetCellStyle(b.SheetName, right1Cell, right1Cell, styleRight)
  107. if err != nil {
  108. return err
  109. }
  110. b.Excel.SetCellValue(b.SheetName, right1Cell, value)
  111. return nil
  112. }
  113. // !isPrint
  114. if !b.Content.IsPrint {
  115. drawLeft = func(rowIndex int, value string) error {
  116. //左边1
  117. left1Cell := fmt.Sprintf("A%d", rowIndex)
  118. err = b.Excel.MergeCell(b.SheetName, left1Cell, fmt.Sprintf("F%d", rowIndex))
  119. if err != nil {
  120. return err
  121. }
  122. err = b.Excel.SetCellStyle(b.SheetName, left1Cell, left1Cell, styleLeft)
  123. if err != nil {
  124. return err
  125. }
  126. b.Excel.SetCellValue(b.SheetName, left1Cell, value)
  127. return nil
  128. }
  129. drawRight = func(rowIndex int, value string) error {
  130. right1Cell := fmt.Sprintf("G%d", rowIndex)
  131. err = b.Excel.MergeCell(b.SheetName, right1Cell, fmt.Sprintf("I%d", rowIndex))
  132. if err != nil {
  133. return err
  134. }
  135. err = b.Excel.SetCellStyle(b.SheetName, right1Cell, right1Cell, styleRight)
  136. if err != nil {
  137. return err
  138. }
  139. b.Excel.SetCellValue(b.SheetName, right1Cell, value)
  140. return nil
  141. }
  142. if b.Content.IsLam {
  143. drawLeft = func(rowIndex int, value string) error {
  144. //左边1
  145. left1Cell := fmt.Sprintf("A%d", rowIndex)
  146. err = b.Excel.MergeCell(b.SheetName, left1Cell, fmt.Sprintf("H%d", rowIndex))
  147. if err != nil {
  148. return err
  149. }
  150. err = b.Excel.SetCellStyle(b.SheetName, left1Cell, left1Cell, styleLeft)
  151. if err != nil {
  152. return err
  153. }
  154. b.Excel.SetCellValue(b.SheetName, left1Cell, value)
  155. return nil
  156. }
  157. drawRight = func(rowIndex int, value string) error {
  158. right1Cell := fmt.Sprintf("I%d", rowIndex)
  159. err = b.Excel.MergeCell(b.SheetName, right1Cell, fmt.Sprintf("K%d", rowIndex))
  160. if err != nil {
  161. return err
  162. }
  163. err = b.Excel.SetCellStyle(b.SheetName, right1Cell, right1Cell, styleRight)
  164. if err != nil {
  165. return err
  166. }
  167. b.Excel.SetCellValue(b.SheetName, right1Cell, value)
  168. return nil
  169. }
  170. }
  171. }
  172. //第一行
  173. drawLeft(b.Row, "类别:"+b.Content.Type)
  174. drawRight(b.Row, "单号:"+b.Content.SerialNumber)
  175. b.Excel.SetRowHeight(b.SheetName, b.Row, 21)
  176. //第二行
  177. drawLeft(b.Row+1, "供应商名称:"+b.Content.Supplier)
  178. timeformat := b.Content.CreateTime.Local().Format("2006年01月02号 15:04:05")
  179. drawRight(b.Row+1, "下单时间:"+timeformat)
  180. b.Excel.SetRowHeight(b.SheetName, b.Row+1, 21)
  181. //第三行
  182. drawLeft(b.Row+2, "产品名称:"+b.Content.ProductName)
  183. status := ""
  184. if b.Content.Status == "complete" {
  185. status = "已完成"
  186. }
  187. if b.Content.Status == "created" {
  188. status = "进行中"
  189. }
  190. drawRight(b.Row+2, "状态:"+status)
  191. b.Excel.SetRowHeight(b.SheetName, b.Row+2, 21)
  192. return nil
  193. }
  194. func (b *ReportProduceExcel) drawTableTitle() error {
  195. b.Row += 3
  196. //A加工项目 B规格(克) 尺寸C-D 数量E 单价F-G 交货时间H 备注I
  197. var drawCol = func(prefix string, value string) error {
  198. left1Cell := fmt.Sprintf("%s%d", prefix, b.Row)
  199. left2Cell := fmt.Sprintf("%s%d", prefix, b.Row+1)
  200. err := b.Excel.MergeCell(b.SheetName, left1Cell, left2Cell)
  201. if err != nil {
  202. return err
  203. }
  204. err = b.Excel.SetCellStyle(b.SheetName, left1Cell, left2Cell, b.AlignCenterStyle)
  205. if err != nil {
  206. return err
  207. }
  208. return b.Excel.SetCellValue(b.SheetName, left1Cell, value)
  209. }
  210. var drawCol2 = func(prefix string, value1 string, value2 string) error {
  211. left1Cell := fmt.Sprintf("%s%d", prefix, b.Row)
  212. left2Cell := fmt.Sprintf("%s%d", prefix, b.Row+1)
  213. err := b.Excel.SetCellStyle(b.SheetName, left1Cell, left2Cell, b.AlignCenterStyle)
  214. if err != nil {
  215. return err
  216. }
  217. b.Excel.SetCellValue(b.SheetName, left1Cell, value1)
  218. b.Excel.SetCellValue(b.SheetName, left2Cell, value2)
  219. return nil
  220. }
  221. var drawCol3 = func(prefix1 string, prefix2 string, value1 string, value2 string, value3 string) error {
  222. left1Cell := fmt.Sprintf("%s%d", prefix1, b.Row)
  223. left2Cell := fmt.Sprintf("%s%d", prefix2, b.Row)
  224. err := b.Excel.MergeCell(b.SheetName, left1Cell, left2Cell)
  225. if err != nil {
  226. return err
  227. }
  228. if err != nil {
  229. fmt.Println(err)
  230. return err
  231. }
  232. err = b.Excel.SetCellStyle(b.SheetName, left1Cell, left2Cell, b.AlignCenterStyle)
  233. if err != nil {
  234. return err
  235. }
  236. b.Excel.SetCellValue(b.SheetName, left1Cell, value1)
  237. val2Cel := fmt.Sprintf("%s%d", prefix1, b.Row+1)
  238. b.Excel.SetCellStyle(b.SheetName, val2Cel, val2Cel, b.AlignCenterStyle)
  239. b.Excel.SetCellValue(b.SheetName, val2Cel, value2)
  240. val3Cel := fmt.Sprintf("%s%d", prefix2, b.Row+1)
  241. b.Excel.SetCellStyle(b.SheetName, val3Cel, val3Cel, b.AlignCenterStyle)
  242. b.Excel.SetCellValue(b.SheetName, val3Cel, value3)
  243. return nil
  244. }
  245. unit := b.Content.Produces[0].Unit
  246. if b.Content.IsPrint {
  247. drawCol("A", "加工项目")
  248. drawCol("B", "规格")
  249. drawCol("C", "纸张")
  250. drawCol("D", "来纸尺寸")
  251. drawCol("E", "印刷尺寸")
  252. drawCol("F", "下单数量")
  253. drawCol("G", "完成数量")
  254. drawCol2("H", "单价", unit)
  255. drawCol("I", "预算金额")
  256. drawCol("J", "实际金额")
  257. drawCol("K", "交货时间")
  258. drawCol("L", "备注")
  259. } else {
  260. if b.Content.IsLam {
  261. drawCol("A", "加工项目")
  262. drawCol("B", "规格")
  263. drawCol("C", "覆膜尺寸")
  264. drawCol("D", "下单数量")
  265. drawCol("E", "完成数量")
  266. unit2 := b.Content.Produces[0].Unit2
  267. drawCol3("E", "G", "单价", unit, unit2)
  268. drawCol("H", "预算金额")
  269. drawCol("I", "实际金额")
  270. drawCol("J", "交货时间")
  271. drawCol("K", "备注")
  272. } else {
  273. drawCol("A", "加工项目")
  274. drawCol("B", "规格")
  275. drawCol("C", "下单数量")
  276. drawCol("D", "完成数量")
  277. drawCol2("E", "单价", unit)
  278. drawCol("F", "预算金额")
  279. drawCol("G", "实际金额")
  280. drawCol("H", "交货时间")
  281. drawCol("I", "备注")
  282. }
  283. }
  284. return nil
  285. }
  286. func (b *ReportProduceExcel) drawTableContent() error {
  287. b.Row += 2
  288. var DrawRow = func(rowIndex int, values ...string) {
  289. charas := []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"}
  290. // !isPrint
  291. if !b.Content.IsPrint {
  292. charas = []string{"A", "B", "C", "D", "E", "F", "G", "H", "I"}
  293. if b.Content.IsLam {
  294. charas = []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"}
  295. }
  296. }
  297. for i, c := range charas {
  298. v := ""
  299. if i < len(values) {
  300. v = values[i]
  301. }
  302. b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("%s%d", c, rowIndex), v)
  303. val2Cel := fmt.Sprintf("%s%d", c, rowIndex)
  304. b.Excel.SetCellStyle(b.SheetName, val2Cel, val2Cel, b.AlignCenterStyle)
  305. b.Excel.SetRowHeight(b.SheetName, rowIndex, 21)
  306. }
  307. }
  308. produces := b.Content.Produces
  309. if len(produces) > 0 {
  310. for _, produce := range produces {
  311. realCount := ""
  312. price := produce.OrderPrice
  313. priceStr := fmt.Sprintf("%.3f", price)
  314. b.FormatToEmpty(&priceStr)
  315. // 预算金额
  316. budgetAmount := fmt.Sprintf("%.3f", produce.OrderPrice*float64(produce.OrderCount))
  317. b.FormatToEmpty(&budgetAmount)
  318. // 实际金额
  319. realPrice := ""
  320. // 实际完成数
  321. realCount = fmt.Sprintf("%d", produce.ConfirmCount)
  322. b.FormatToEmpty(&realCount)
  323. realPrice = fmt.Sprintf("%.3f", produce.OrderPrice*float64(produce.ConfirmCount))
  324. b.FormatToEmpty(&realPrice)
  325. deliveryTime := produce.DeliveryTime.Local().Format("2006-01-02")
  326. // !isPrint
  327. if !b.Content.IsPrint {
  328. if b.Content.IsLam {
  329. DrawRow(b.Row, produce.Name, produce.Norm, produce.PrintSize, fmt.Sprintf("%d", produce.OrderCount), realCount, priceStr, fmt.Sprintf("%.3f", produce.Price2), budgetAmount, realPrice, deliveryTime, produce.Remark)
  330. } else {
  331. DrawRow(b.Row, produce.Name, produce.Norm, fmt.Sprintf("%d", produce.OrderCount), realCount, priceStr, budgetAmount, realPrice, deliveryTime, produce.Remark)
  332. }
  333. } else {
  334. DrawRow(b.Row, produce.Name, produce.Norm, produce.Paper, produce.PaperSize, produce.PrintSize, fmt.Sprintf("%d", produce.OrderCount), realCount, priceStr, budgetAmount, realPrice, deliveryTime, produce.Remark)
  335. }
  336. b.Row++
  337. b.BudgetAmount += produce.OrderPrice * float64(produce.OrderCount)
  338. b.RealAmount += produce.OrderPrice * float64(produce.ConfirmCount)
  339. }
  340. }
  341. return nil
  342. }
  343. func (b *ReportProduceExcel) Draws() {
  344. b.drawTitle()
  345. b.drawSubTitles()
  346. b.drawTableTitle()
  347. b.drawTableContent()
  348. }
  349. func NewReportProduceExcel(f *excelize.File) *ReportProduceExcel {
  350. border := []excelize.Border{
  351. {Type: "top", Style: 1, Color: "000000"},
  352. {Type: "left", Style: 1, Color: "000000"},
  353. {Type: "right", Style: 1, Color: "000000"},
  354. {Type: "bottom", Style: 1, Color: "000000"},
  355. }
  356. styleLeft, _ := f.NewStyle(&excelize.Style{
  357. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
  358. Border: border,
  359. })
  360. b := &ReportProduceExcel{
  361. Title: "中鱼互动加工单",
  362. SheetName: "Sheet1",
  363. Excel: f,
  364. Offset: 0,
  365. AlignCenterStyle: styleLeft,
  366. }
  367. f.SetPageMargins(b.SheetName, excelize.PageMarginTop(0), excelize.PageMarginLeft(0), excelize.PageMarginRight(0))
  368. return b
  369. }
  370. func (b *ReportProduceExcel) FormatToEmpty(str *string) {
  371. if *str == "0" || *str == "0.000" {
  372. *str = ""
  373. }
  374. }