bill-produce.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. package api
  2. import (
  3. "box-cost/db/model"
  4. "box-cost/db/repo"
  5. "box-cost/log"
  6. "errors"
  7. "fmt"
  8. "time"
  9. "github.com/gin-gonic/gin"
  10. "github.com/xuri/excelize/v2"
  11. "go.mongodb.org/mongo-driver/bson"
  12. "go.mongodb.org/mongo-driver/bson/primitive"
  13. )
  14. // 单据管理
  15. func BillProduce(r *GinRouter) {
  16. // 创建单据
  17. r.POST("/bill/produce/create", CreateProduceBill)
  18. // 获取单据详情
  19. r.GET("/bill/produce/detail/:id", GetProduceBill)
  20. // 获取单据列表
  21. r.GET("/bill/produce/list", GetProduceBills)
  22. // 更新单据
  23. r.POST("/bill/produce/update", UpdateProduceBill)
  24. // 删除单据
  25. r.POST("/bill/produce/delete/:id", DelProduceBill)
  26. //下载单据
  27. r.GET("/bill/produce/download", DownProduceBill)
  28. }
  29. // 创建生产加工单据
  30. func CreateProduceBill(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  31. bill := &model.ProduceBill{}
  32. err := c.ShouldBindJSON(bill)
  33. if err != nil {
  34. fmt.Println(err)
  35. return nil, errors.New("参数错误!")
  36. }
  37. ctx := apictx.CreateRepoCtx()
  38. if bill.PackId.Hex() == "" {
  39. return nil, errors.New("包装产品id为空")
  40. }
  41. if bill.PlanId.Hex() == "" {
  42. return nil, errors.New("生产计划id为空")
  43. }
  44. if bill.Type == "" {
  45. return nil, errors.New("类型为空")
  46. }
  47. bill.SerialNumber, err = generateSerial(apictx, bill.Type)
  48. if err != nil {
  49. return nil, err
  50. }
  51. bill.Status = "created"
  52. bill.CreateTime = time.Now()
  53. bill.UpdateTime = time.Now()
  54. result, err := repo.RepoAddDoc(ctx, repo.CollectionBillProduce, &bill)
  55. return result, err
  56. }
  57. // 获取单据信息
  58. func GetProduceBill(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  59. billId := c.Param("id")
  60. id, err := primitive.ObjectIDFromHex(billId)
  61. if err != nil {
  62. return nil, errors.New("非法id")
  63. }
  64. var bill model.ProduceBill
  65. option := &repo.DocSearchOptions{
  66. CollectName: repo.CollectionBillProduce,
  67. Query: repo.Map{"_id": id},
  68. }
  69. found, err := repo.RepoSeachDoc(apictx.CreateRepoCtx(), option, &bill)
  70. if !found || err != nil {
  71. log.Info(err)
  72. return nil, errors.New("数据未找到")
  73. }
  74. return bill, nil
  75. }
  76. // 获取单据列表
  77. func GetProduceBills(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  78. page, size, query := UtilQueryPageSize(c)
  79. if query["packId"] != nil {
  80. query["packId"], _ = primitive.ObjectIDFromHex(query["packId"].(string))
  81. }
  82. if query["planId"] != nil {
  83. query["planId"], _ = primitive.ObjectIDFromHex(query["planId"].(string))
  84. }
  85. option := &repo.PageSearchOptions{
  86. CollectName: repo.CollectionBillProduce,
  87. Query: query,
  88. Page: page,
  89. Size: size,
  90. Sort: bson.M{"createTime": -1},
  91. }
  92. return repo.RepoPageSearch(apictx.CreateRepoCtx(), option)
  93. }
  94. // 更新单据
  95. func UpdateProduceBill(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  96. var bill model.ProduceBill
  97. err := c.ShouldBindJSON(&bill)
  98. if err != nil {
  99. return nil, errors.New("参数错误")
  100. }
  101. if bill.Id.Hex() == "" {
  102. return nil, errors.New("id的为空")
  103. }
  104. billType, err := searchBillTypeById(apictx, repo.CollectionBillProduce, bill.Id)
  105. if err != nil {
  106. return nil, err
  107. }
  108. // 如果更改类型
  109. if billType != bill.Type {
  110. bill.SerialNumber, err = generateSerial(apictx, bill.Type)
  111. if err != nil {
  112. return nil, err
  113. }
  114. }
  115. bill.UpdateTime = time.Now()
  116. return repo.RepoUpdateSetDoc(apictx.CreateRepoCtx(), repo.CollectionBillProduce, bill.Id.Hex(), &bill)
  117. }
  118. // 删除单据
  119. func DelProduceBill(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  120. billId := c.Param("id")
  121. if billId == "" {
  122. return nil, errors.New("id为空")
  123. }
  124. return repo.RepoDeleteDoc(apictx.CreateRepoCtx(), repo.CollectionBillProduce, billId)
  125. }
  126. func DownProduceBill(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  127. billId := c.Query("id")
  128. isPdf := c.Query("isPdf")
  129. if len(billId) < 1 {
  130. return nil, fmt.Errorf("id不能为空")
  131. }
  132. id, err := primitive.ObjectIDFromHex(billId)
  133. if err != nil {
  134. return nil, errors.New("非法id")
  135. }
  136. var bill model.ProduceBill
  137. option := &repo.DocSearchOptions{
  138. CollectName: repo.CollectionBillProduce,
  139. Query: repo.Map{"_id": id},
  140. }
  141. found, err := repo.RepoSeachDoc(apictx.CreateRepoCtx(), option, &bill)
  142. if !found || err != nil {
  143. log.Info(err)
  144. return nil, errors.New("数据未找到")
  145. }
  146. f := excelize.NewFile()
  147. // Create a new sheet.
  148. index := f.NewSheet("Sheet1")
  149. f.SetActiveSheet(index)
  150. f.SetDefaultFont("宋体")
  151. billExcel := NewProduceBill(f)
  152. billExcel.Content = &bill
  153. info := model.Setting{}
  154. repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
  155. CollectName: "infos",
  156. }, &info)
  157. billExcel.Title = fmt.Sprintf("%s加工单", info.CompanyName)
  158. //设置对应的数据
  159. billExcel.Draws()
  160. // 下载为pdf
  161. if isPdf == "true" {
  162. buf, _ := f.WriteToBuffer()
  163. res, err := excelToPdf(buf, apictx.Svc.Conf.PdfApiAddr)
  164. if err != nil {
  165. return nil, errors.New("转化pdf失败")
  166. }
  167. c.Header("Content-Type", "application/octet-stream")
  168. c.Header("Content-Disposition", "attachment; filename="+"bill.pdf")
  169. c.Header("Content-Transfer-Encoding", "binary")
  170. err = res.Write(c.Writer)
  171. if err != nil {
  172. return nil, err
  173. }
  174. return nil, nil
  175. }
  176. c.Header("Content-Type", "application/octet-stream")
  177. c.Header("Content-Disposition", "attachment; filename="+"bill.xlsx")
  178. c.Header("Content-Transfer-Encoding", "binary")
  179. err = f.Write(c.Writer)
  180. if err != nil {
  181. return nil, err
  182. }
  183. return nil, nil
  184. }