summary-sample-excel.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. package api
  2. import (
  3. "fmt"
  4. "strings"
  5. "github.com/xuri/excelize/v2"
  6. )
  7. // 生产成本表
  8. type SummarySampleExcel struct {
  9. Row int
  10. Title string
  11. Excel *excelize.File
  12. SheetName string
  13. AlignCenterStyle int
  14. Content *SupplierPlanSummary
  15. }
  16. func (b *SummarySampleExcel) drawTitle() error {
  17. b.Row++
  18. startCell := fmt.Sprintf("A%d", b.Row)
  19. err := b.Excel.MergeCell(b.SheetName, startCell, fmt.Sprintf("G%d", b.Row))
  20. if err != nil {
  21. return err
  22. }
  23. style, err := b.Excel.NewStyle(&excelize.Style{
  24. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  25. Font: &excelize.Font{Bold: true, Size: 18}})
  26. if err != nil {
  27. return err
  28. }
  29. err = b.Excel.SetCellStyle(b.SheetName, startCell, startCell, style)
  30. if err != nil {
  31. return err
  32. }
  33. b.Excel.SetRowHeight(b.SheetName, b.Row, 23)
  34. b.Excel.SetCellValue(b.SheetName, startCell, "追踪表")
  35. return nil
  36. }
  37. func (b *SummarySampleExcel) drawTableTitle() error {
  38. b.Row++
  39. var drawCol = func(prefix string, value string) error {
  40. left1Cell := fmt.Sprintf("%s%d", prefix, b.Row)
  41. left2Cell := fmt.Sprintf("%s%d", prefix, b.Row+1)
  42. err := b.Excel.MergeCell(b.SheetName, left1Cell, left2Cell)
  43. if err != nil {
  44. return err
  45. }
  46. err = b.Excel.SetCellStyle(b.SheetName, left1Cell, left2Cell, b.AlignCenterStyle)
  47. if err != nil {
  48. return err
  49. }
  50. return b.Excel.SetCellValue(b.SheetName, left1Cell, value)
  51. }
  52. drawCol("A", "序号")
  53. drawCol("B", "产品名称")
  54. drawCol("C", "产品部件名称")
  55. drawCol("D", "下单日期")
  56. drawCol("E", "交货日期")
  57. drawCol("F", "工序")
  58. drawCol("G", "备注")
  59. return nil
  60. }
  61. func (b *SummarySampleExcel) drawRow(rowIndex int, values ...string) {
  62. charas := []string{"A", "B", "C", "D", "E", "F", "G"}
  63. for i, c := range charas {
  64. v := ""
  65. if i < len(values) {
  66. v = values[i]
  67. }
  68. b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("%s%d", c, rowIndex), v)
  69. val2Cel := fmt.Sprintf("%s%d", c, rowIndex)
  70. b.Excel.SetCellStyle(b.SheetName, val2Cel, val2Cel, b.AlignCenterStyle)
  71. if c == "F" {
  72. border := []excelize.Border{
  73. {Type: "top", Style: 1, Color: "000000"},
  74. {Type: "left", Style: 1, Color: "000000"},
  75. {Type: "right", Style: 1, Color: "000000"},
  76. {Type: "bottom", Style: 1, Color: "000000"},
  77. }
  78. styleLeft, _ := b.Excel.NewStyle(&excelize.Style{
  79. Alignment: &excelize.Alignment{Horizontal: "left", Vertical: "center", WrapText: true},
  80. Font: &excelize.Font{Size: 11},
  81. Border: border})
  82. b.Excel.SetCellStyle(b.SheetName, val2Cel, val2Cel, styleLeft)
  83. }
  84. b.Excel.SetRowHeight(b.SheetName, rowIndex, 32)
  85. }
  86. }
  87. func (b *SummarySampleExcel) drawAllContent() error {
  88. b.Row += 2
  89. // summaryPlans
  90. index := 0
  91. for _, splan := range b.Content.Plans {
  92. index++
  93. planStartRow := b.Row
  94. plan := splan.Plan
  95. comps := plan.Pack.Components
  96. if len(comps) > 0 {
  97. for _, comp := range comps {
  98. if len(comp.Stages) > 0 {
  99. startRow := b.Row
  100. cates := map[string][]int{}
  101. for _, stage := range comp.Stages {
  102. // 状态
  103. stageStatus := ""
  104. statusMark := "【x】"
  105. // if len(stage.BillId) < 1 {
  106. // stageStatus = "未生成订单"
  107. // }
  108. // if splan.State[stage.BillId] == "created" {
  109. // stageStatus = "进行中"
  110. // }
  111. // // 审核状态
  112. // if splan.Reviewed[stage.BillId] == 1 {
  113. // stageStatus = "已审核"
  114. // } else {
  115. // stageStatus = "未审核"
  116. // }
  117. // // 接单状态
  118. // if splan.IsAck[stage.BillId] {
  119. // stageStatus = "已接单"
  120. // } else {
  121. // stageStatus = "未接单"
  122. // }
  123. // // 完成状态
  124. // if splan.State[stage.BillId] == "complete" {
  125. // stageStatus = "已完成"
  126. // statusMark = "【v】"
  127. // }
  128. if len(stage.BillId) < 1 {
  129. stageStatus = "未生成订单"
  130. } else {
  131. if splan.State[stage.BillId] == "created" {
  132. stageStatus = "进行中"
  133. // 审核状态
  134. if splan.Reviewed[stage.BillId] == 1 {
  135. stageStatus = "已审核"
  136. if splan.IsAck[stage.BillId] {
  137. stageStatus = "已接单"
  138. } else {
  139. stageStatus = "未接单"
  140. }
  141. } else {
  142. stageStatus = "未审核"
  143. }
  144. } else if splan.State[stage.BillId] == "complete" {
  145. stageStatus = "已完成"
  146. statusMark = "【v】"
  147. } else {
  148. stageStatus = "订单已销毁"
  149. }
  150. }
  151. fmt.Println(stageStatus)
  152. createTime := splan.CreateTimes[stage.BillId].Local().Format("2006-01-02")
  153. deliveryTime := stage.DeliveryTime.Local().Format("2006-01-02")
  154. stageNmae := fmt.Sprintf("%s %s", statusMark, stage.Name)
  155. b.drawRow(b.Row, "", "", "", createTime, deliveryTime, stageNmae, "")
  156. cates[fmt.Sprintf("%s,%s,%s", createTime, deliveryTime, stageNmae)] = append(cates[fmt.Sprintf("%s,%s,%s", createTime, deliveryTime, stageNmae)], b.Row)
  157. b.Row++
  158. }
  159. for stageInfo, cate := range cates {
  160. sf := strings.Split(stageInfo, ",")
  161. fmt.Println(sf)
  162. mergeStartRow := cate[0]
  163. mergeEndRow := cate[len(cate)-1]
  164. b.Excel.MergeCell(b.SheetName, fmt.Sprintf("D%d", mergeStartRow), fmt.Sprintf("D%d", mergeEndRow))
  165. b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("D%d", mergeEndRow), sf[0])
  166. b.Excel.MergeCell(b.SheetName, fmt.Sprintf("E%d", mergeStartRow), fmt.Sprintf("E%d", mergeEndRow))
  167. b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("E%d", mergeEndRow), sf[1])
  168. b.Excel.MergeCell(b.SheetName, fmt.Sprintf("F%d", mergeStartRow), fmt.Sprintf("F%d", mergeEndRow))
  169. b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("F%d", mergeEndRow), sf[2])
  170. }
  171. endRow := b.Row - 1
  172. // 组件名字
  173. startACell := fmt.Sprintf("%s%d", "C", startRow)
  174. endACell := fmt.Sprintf("%s%d", "C", endRow)
  175. b.Excel.MergeCell(b.SheetName, startACell, endACell)
  176. err := b.Excel.SetCellStyle(b.SheetName, startACell, endACell, b.AlignCenterStyle)
  177. if err != nil {
  178. return err
  179. }
  180. b.Excel.SetCellValue(b.SheetName, startACell, comp.Name)
  181. }
  182. }
  183. }
  184. // 序号
  185. planEndRow := b.Row
  186. planStartACell := fmt.Sprintf("%s%d", "A", planStartRow)
  187. planEndACell := fmt.Sprintf("%s%d", "A", planEndRow-1)
  188. b.Excel.MergeCell(b.SheetName, planStartACell, planEndACell)
  189. err := b.Excel.SetCellStyle(b.SheetName, planStartACell, planEndACell, b.AlignCenterStyle)
  190. if err != nil {
  191. return err
  192. }
  193. b.Excel.SetCellValue(b.SheetName, planStartACell, index)
  194. // 产品名
  195. planStartBCell := fmt.Sprintf("%s%d", "B", planStartRow)
  196. planEndBCell := fmt.Sprintf("%s%d", "B", planEndRow-1)
  197. b.Excel.MergeCell(b.SheetName, planStartBCell, planEndBCell)
  198. err = b.Excel.SetCellStyle(b.SheetName, planStartBCell, planEndBCell, b.AlignCenterStyle)
  199. if err != nil {
  200. return err
  201. }
  202. b.Excel.SetCellValue(b.SheetName, planStartBCell, plan.Name)
  203. // 备注
  204. planStartFCell := fmt.Sprintf("%s%d", "G", planStartRow)
  205. planEndFCell := fmt.Sprintf("%s%d", "G", planEndRow-1)
  206. b.Excel.MergeCell(b.SheetName, planStartFCell, planEndFCell)
  207. err = b.Excel.SetCellStyle(b.SheetName, planStartFCell, planEndFCell, b.AlignCenterStyle)
  208. if err != nil {
  209. return err
  210. }
  211. b.Excel.SetCellValue(b.SheetName, planStartFCell, "")
  212. }
  213. return nil
  214. }
  215. func (b *SummarySampleExcel) drawSupplierContent() error {
  216. b.Row += 2
  217. index := 0
  218. supplier := ""
  219. // summaryPlans
  220. for _, splan := range b.Content.Plans {
  221. index++
  222. planStartRow := b.Row
  223. plan := splan.Plan
  224. comps := plan.Pack.Components
  225. if len(comps) > 0 {
  226. for _, comp := range comps {
  227. if len(comp.Stages) > 0 {
  228. startRow := 0
  229. cates := map[string][]int{}
  230. for _, stage := range comp.Stages {
  231. if stage.SupplierInfo != nil {
  232. if b.Content.SupplierId == stage.SupplierInfo.Id {
  233. supplier = stage.SupplierInfo.Name
  234. // 材料
  235. if startRow == 0 {
  236. startRow = b.Row
  237. }
  238. // 状态
  239. stageStatus := ""
  240. statusMark := "【x】"
  241. // if len(stage.BillId) < 1 {
  242. // stageStatus = "未生成订单"
  243. // }
  244. // if splan.State[stage.BillId] == "created" {
  245. // stageStatus = "进行中"
  246. // }
  247. // // 审核状态
  248. // if splan.Reviewed[stage.BillId] == 1 {
  249. // stageStatus = "已审核"
  250. // } else {
  251. // stageStatus = "未审核"
  252. // }
  253. // // 接单状态
  254. // if splan.IsAck[stage.BillId] {
  255. // stageStatus = "已接单"
  256. // } else {
  257. // stageStatus = "未接单"
  258. // }
  259. // // 完成状态
  260. // if splan.State[stage.BillId] == "complete" {
  261. // stageStatus = "已完成"
  262. // statusMark = "【v】"
  263. // }
  264. if len(stage.BillId) < 1 {
  265. stageStatus = "未生成订单"
  266. } else {
  267. if splan.State[stage.BillId] == "created" {
  268. stageStatus = "进行中"
  269. // 审核状态
  270. if splan.Reviewed[stage.BillId] == 1 {
  271. stageStatus = "已审核"
  272. if splan.IsAck[stage.BillId] {
  273. stageStatus = "已接单"
  274. } else {
  275. stageStatus = "未接单"
  276. }
  277. } else {
  278. stageStatus = "未审核"
  279. }
  280. } else if splan.State[stage.BillId] == "complete" {
  281. stageStatus = "已完成"
  282. statusMark = "【v】"
  283. } else {
  284. stageStatus = "订单已销毁"
  285. }
  286. }
  287. fmt.Println(stageStatus)
  288. createTime := splan.CreateTimes[stage.BillId].Local().Format("2006-01-02")
  289. deliveryTime := stage.DeliveryTime.Local().Format("2006-01-02")
  290. stageNmae := fmt.Sprintf("%s %s", statusMark, stage.Name)
  291. b.drawRow(b.Row, "", "", "", createTime, deliveryTime, stageNmae, "")
  292. cates[fmt.Sprintf("%s,%s,%s", createTime, deliveryTime, stageNmae)] = append(cates[fmt.Sprintf("%s,%s,%s", createTime, deliveryTime, stageNmae)], b.Row)
  293. b.Row++
  294. }
  295. }
  296. }
  297. for stageInfo, cate := range cates {
  298. sf := strings.Split(stageInfo, ",")
  299. fmt.Println(sf)
  300. mergeStartRow := cate[0]
  301. mergeEndRow := cate[len(cate)-1]
  302. b.Excel.MergeCell(b.SheetName, fmt.Sprintf("D%d", mergeStartRow), fmt.Sprintf("D%d", mergeEndRow))
  303. b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("D%d", mergeEndRow), sf[0])
  304. b.Excel.MergeCell(b.SheetName, fmt.Sprintf("E%d", mergeStartRow), fmt.Sprintf("E%d", mergeEndRow))
  305. b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("E%d", mergeEndRow), sf[1])
  306. b.Excel.MergeCell(b.SheetName, fmt.Sprintf("F%d", mergeStartRow), fmt.Sprintf("F%d", mergeEndRow))
  307. b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("F%d", mergeEndRow), sf[2])
  308. }
  309. if startRow != 0 {
  310. endRow := b.Row - 1
  311. // 组件名字
  312. startACell := fmt.Sprintf("%s%d", "C", startRow)
  313. endACell := fmt.Sprintf("%s%d", "C", endRow)
  314. b.Excel.MergeCell(b.SheetName, startACell, endACell)
  315. err := b.Excel.SetCellStyle(b.SheetName, startACell, endACell, b.AlignCenterStyle)
  316. if err != nil {
  317. return err
  318. }
  319. b.Excel.SetCellValue(b.SheetName, startACell, comp.Name)
  320. }
  321. }
  322. }
  323. }
  324. // 序号
  325. planEndRow := b.Row
  326. planStartACell := fmt.Sprintf("%s%d", "A", planStartRow)
  327. planEndACell := fmt.Sprintf("%s%d", "A", planEndRow-1)
  328. b.Excel.MergeCell(b.SheetName, planStartACell, planEndACell)
  329. err := b.Excel.SetCellStyle(b.SheetName, planStartACell, planEndACell, b.AlignCenterStyle)
  330. if err != nil {
  331. return err
  332. }
  333. b.Excel.SetCellValue(b.SheetName, planStartACell, index)
  334. // 产品名
  335. planStartBCell := fmt.Sprintf("%s%d", "B", planStartRow)
  336. planEndBCell := fmt.Sprintf("%s%d", "B", planEndRow-1)
  337. b.Excel.MergeCell(b.SheetName, planStartBCell, planEndBCell)
  338. err = b.Excel.SetCellStyle(b.SheetName, planStartBCell, planEndBCell, b.AlignCenterStyle)
  339. if err != nil {
  340. return err
  341. }
  342. b.Excel.SetCellValue(b.SheetName, planStartBCell, plan.Name)
  343. // 备注
  344. planStartFCell := fmt.Sprintf("%s%d", "G", planStartRow)
  345. planEndFCell := fmt.Sprintf("%s%d", "G", planEndRow-1)
  346. b.Excel.MergeCell(b.SheetName, planStartFCell, planEndFCell)
  347. err = b.Excel.SetCellStyle(b.SheetName, planStartFCell, planEndFCell, b.AlignCenterStyle)
  348. if err != nil {
  349. return err
  350. }
  351. b.Excel.SetCellValue(b.SheetName, planStartFCell, "")
  352. }
  353. // 供应商名字标题
  354. style, err := b.Excel.NewStyle(&excelize.Style{
  355. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  356. })
  357. if err != nil {
  358. return err
  359. }
  360. err = b.Excel.SetCellStyle(b.SheetName, "A1", "G1", style)
  361. if err != nil {
  362. return err
  363. }
  364. b.Excel.SetRowHeight(b.SheetName, 1, 32)
  365. b.Excel.SetCellValue(b.SheetName, "A1", fmt.Sprintf("【%s】-追踪表", supplier))
  366. return nil
  367. }
  368. func (b *SummarySampleExcel) Draws() {
  369. b.drawTitle()
  370. b.drawTableTitle()
  371. if !b.Content.SupplierId.IsZero() {
  372. b.drawSupplierContent()
  373. } else {
  374. b.drawAllContent()
  375. }
  376. }
  377. func NewSummarySampleExcel(f *excelize.File) *SummarySampleExcel {
  378. border := []excelize.Border{
  379. {Type: "top", Style: 1, Color: "000000"},
  380. {Type: "left", Style: 1, Color: "000000"},
  381. {Type: "right", Style: 1, Color: "000000"},
  382. {Type: "bottom", Style: 1, Color: "000000"},
  383. }
  384. styleLeft, _ := f.NewStyle(&excelize.Style{
  385. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  386. Border: border,
  387. Font: &excelize.Font{Size: 10},
  388. })
  389. b := &SummarySampleExcel{
  390. Title: "生产成本表",
  391. SheetName: "Sheet1",
  392. Excel: f,
  393. AlignCenterStyle: styleLeft,
  394. }
  395. f.SetColWidth(b.SheetName, "A", "A", 6)
  396. f.SetColWidth(b.SheetName, "B", "E", 16)
  397. f.SetColWidth(b.SheetName, "F", "F", 20)
  398. f.SetColWidth(b.SheetName, "G", "G", 16)
  399. f.SetPageMargins(b.SheetName, excelize.PageMarginTop(0), excelize.PageMarginLeft(0), excelize.PageMarginRight(0))
  400. return b
  401. }
  402. func (b *SummarySampleExcel) FormatToEmpty(str *string) {
  403. if *str == "0" || *str == "0.000" {
  404. *str = ""
  405. }
  406. }