SJA APS后端代码
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.

163 lines
4.6 KiB

  1. package service
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/go-xorm/xorm"
  6. "leit.com/leit_seat_aps/common"
  7. "leit.com/leit_seat_aps/db"
  8. "strings"
  9. "time"
  10. )
  11. // 生产订单业务对象
  12. type BL_WorkOrder struct {
  13. Workordernr string // 生产订单号
  14. Custordernr string // 客户订单号
  15. Projnr string
  16. Ordertype string // 生产订单类型
  17. Partfamilyid string // 零件族ID
  18. Supplygroupid string
  19. Status int
  20. Preschedseq int
  21. Schedseq int
  22. Oemseq int
  23. Shippable int
  24. Swet time.Time
  25. Worklineid string // 产线
  26. Bl_wopartdict map[string]BL_WorkOrder_Part // 订单零件清单
  27. Bl_ordattrdict map[int]BL_OrdAttribute // 订单属性字典
  28. Bl_verrlist []BL_VerifyError // 校验报错信息
  29. Workordertab db.Pln_workorder // 生产订单记录本身
  30. }
  31. type BL_WorkOrder_Part struct {
  32. Partid string
  33. Qty int
  34. Workordernr string
  35. Parttab db.Me_part // 零件自身
  36. Workordertab db.Pln_workorder // 生产订单记录本身
  37. }
  38. // 创建生产订单头
  39. func (bl_wo *BL_WorkOrder) CreateHead(session *xorm.Session, tp *TodProject) (err error) {
  40. var (
  41. wonr string
  42. wotab db.Pln_workorder
  43. woppakstatab db.Prod_wo_packstatus
  44. )
  45. // 填充生产订单信息
  46. if strings.TrimSpace(tp.Projecttab.Workorder_snr) != "" {
  47. if wonr, err = SN_GetNextSnrBySession(strings.TrimSpace(tp.Projecttab.Workorder_snr), session); err != nil {
  48. return
  49. }
  50. } else {
  51. if wonr, err = SN_GetNextSnrBySession("WORKORDER", session); err != nil {
  52. return
  53. }
  54. }
  55. wotab = db.Pln_workorder{}
  56. wotab.Finr = db.G_FINR
  57. wotab.Workordernr = wonr
  58. wotab.Projnr = bl_wo.Projnr
  59. wotab.Custordernr = bl_wo.Custordernr
  60. wotab.Supplygroupid = bl_wo.Supplygroupid
  61. wotab.Partfamilyid = bl_wo.Partfamilyid
  62. wotab.Status = common.WO_STATUS_UNPLANED
  63. wotab.Shippable = bl_wo.Shippable
  64. wotab.Worklineid = bl_wo.Worklineid
  65. wotab.Planqty = 1
  66. wotab.Ordertype = "SEQ"
  67. wotab.Lastuser = "service"
  68. wotab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  69. if err = wotab.Insert(session); err != nil {
  70. return err
  71. }
  72. bl_wo.Workordernr = wonr
  73. bl_wo.Workordertab = wotab
  74. // 创建生产工单的包装状态数据
  75. woppakstatab = db.Prod_wo_packstatus{}
  76. woppakstatab.Finr = db.G_FINR
  77. woppakstatab.Workordernr = wotab.Workordernr
  78. woppakstatab.Projnr = wotab.Projnr
  79. woppakstatab.Packstatus = 0
  80. woppakstatab.Lastuser = "tod_service"
  81. woppakstatab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  82. if err = woppakstatab.Insert(session); err != nil {
  83. return err
  84. }
  85. return
  86. }
  87. // 保存客户订单的零件和属性清单( 删除原有的)
  88. func (bl_wo *BL_WorkOrder) SavePartAndAtcodList(session *xorm.Session) (err error) {
  89. var (
  90. wotab db.Pln_workorder
  91. bl_wopt BL_WorkOrder_Part
  92. bl_ordattr BL_OrdAttribute
  93. woptlst db.Pln_workorder_partlst
  94. woatlst db.Pln_workorder_atcodlst
  95. attrval string
  96. idx int
  97. )
  98. // 删除原有的零件和属性清单
  99. wotab = db.Pln_workorder{Workordernr: bl_wo.Workordernr}
  100. if !wotab.DelPartlst(session) {
  101. err = errors.New(fmt.Sprintf("Failed to delete workorder: %s part list!", wotab.Workordernr))
  102. return
  103. }
  104. if !wotab.DelAttributelst(session) {
  105. err = errors.New(fmt.Sprintf("Failed to delete workorder: %s attribute list!", wotab.Workordernr))
  106. return
  107. }
  108. // 遍历生产订单零件列表
  109. for _, bl_wopt = range bl_wo.Bl_wopartdict {
  110. woptlst = db.Pln_workorder_partlst{}
  111. woptlst.Finr = db.G_FINR
  112. woptlst.Workordernr = bl_wo.Workordernr
  113. woptlst.Partid = bl_wopt.Partid
  114. woptlst.Partqty = bl_wopt.Qty
  115. woptlst.Lastuser = "service"
  116. woptlst.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  117. if err = woptlst.Insert(session); err != nil {
  118. return err
  119. }
  120. }
  121. // 遍历属性列表并存储
  122. idx = 0
  123. for _, bl_ordattr = range bl_wo.Bl_ordattrdict {
  124. woatlst = db.Pln_workorder_atcodlst{}
  125. woatlst.Finr = db.G_FINR
  126. woatlst.Workordernr = bl_wo.Workordernr
  127. woatlst.Attrcode = bl_ordattr.Attrcode
  128. for _, attrval = range bl_ordattr.Attrvaldict {
  129. idx++
  130. woatlst.Pos = idx
  131. woatlst.Attrvalue = attrval
  132. woatlst.Lastuser = "service"
  133. woatlst.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  134. if err = woatlst.Insert(session); err != nil {
  135. return err
  136. }
  137. }
  138. }
  139. return
  140. }
  141. // 更新工单的拣料状态
  142. func (bl_wo *BL_WorkOrder) SetPickingStatus(session *xorm.Session, picked int) (err error) {
  143. bl_wo.Workordertab.Pickstatus = picked
  144. bl_wo.Workordertab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  145. if err = bl_wo.Workordertab.UpdateFields(session, "pickstatus, lastmodif"); err != nil {
  146. return
  147. }
  148. return
  149. }