bill-produce.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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. if len(billId) < 1 {
  129. return nil, fmt.Errorf("id不能为空")
  130. }
  131. id, err := primitive.ObjectIDFromHex(billId)
  132. if err != nil {
  133. return nil, errors.New("非法id")
  134. }
  135. var bill model.ProduceBill
  136. option := &repo.DocSearchOptions{
  137. CollectName: repo.CollectionBillProduce,
  138. Query: repo.Map{"_id": id},
  139. }
  140. found, err := repo.RepoSeachDoc(apictx.CreateRepoCtx(), option, &bill)
  141. if !found || err != nil {
  142. log.Info(err)
  143. return nil, errors.New("数据未找到")
  144. }
  145. f := excelize.NewFile()
  146. // Create a new sheet.
  147. index := f.NewSheet("Sheet1")
  148. f.SetActiveSheet(index)
  149. f.SetDefaultFont("宋体")
  150. billExcel := NewProduceBill(f)
  151. billExcel.Content = &bill
  152. info := model.Setting{}
  153. repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
  154. CollectName: "infos",
  155. }, &info)
  156. billExcel.Title = fmt.Sprintf("%s加工单", info.CompanyName)
  157. //设置对应的数据
  158. billExcel.Draws()
  159. c.Header("Content-Type", "application/octet-stream")
  160. c.Header("Content-Disposition", "attachment; filename="+"bill.xlsx")
  161. c.Header("Content-Transfer-Encoding", "binary")
  162. err = f.Write(c.Writer)
  163. if err != nil {
  164. return nil, err
  165. }
  166. return nil, nil
  167. }