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.

123 lines
3.4 KiB

  1. package service
  2. import (
  3. "github.com/go-xorm/xorm"
  4. "leit.com/leit_seat_aps/common"
  5. "leit.com/leit_seat_aps/db"
  6. "strings"
  7. "time"
  8. )
  9. type BL_BomHead struct {
  10. Bomid string
  11. Materialid string
  12. bomheadtab db.Me_bomhead
  13. Bomitemlst []BL_BomItem
  14. }
  15. type BL_BomItem struct {
  16. Fmaterialid string // 父物料
  17. Fmatqty float32 // 父物料数量
  18. Cmaterialid string // 子物料
  19. Mattype string // 子物料类型:自制件 / 外购件
  20. Cmatqty float32 // 子物料数量
  21. Leadtime float32 // 前置时间
  22. Timeuom string // 时间单位:SEC MIN HOUR DAY
  23. bomitemtab db.Me_bomlst
  24. Bomitemlst []BL_BomItem // 子件的下级物料需求
  25. }
  26. // 获取物料以秒计算的生产提前期
  27. func (t *BL_BomItem) GetChildLeadTimeInSecond() (lt int) {
  28. switch strings.ToUpper(strings.TrimSpace(t.Timeuom)) {
  29. case "S":
  30. lt = int(t.Leadtime)
  31. case "SEC":
  32. lt = int(t.Leadtime)
  33. case "SECOND":
  34. lt = int(t.Leadtime)
  35. case "M":
  36. lt = int(t.Leadtime * 60)
  37. case "MIN":
  38. lt = int(t.Leadtime * 60)
  39. case "MINUTE":
  40. lt = int(t.Leadtime * 60)
  41. case "H":
  42. lt = int(t.Leadtime * 60 * 60)
  43. case "HOUR":
  44. lt = int(t.Leadtime * 60 * 60)
  45. case "D":
  46. lt = int(t.Leadtime * 60 * 60 * 24)
  47. case "DAY":
  48. lt = int(t.Leadtime * 60 * 60 * 24)
  49. default:
  50. lt = int(t.Leadtime)
  51. }
  52. return
  53. }
  54. // 计算自身需求,并向下继续调用
  55. func (bh *BL_BomHead) CalLowerLevelDemand(session *xorm.Session, adtabInlst []db.Pln_material_demand, matdict map[string]db.Pln_material) (err error) {
  56. var (
  57. i, j int
  58. mattab db.Pln_material
  59. adtab db.Pln_material_demand
  60. adtabLowlst []db.Pln_material_demand
  61. t time.Time
  62. ok bool
  63. )
  64. adtabLowlst = []db.Pln_material_demand{}
  65. for i = 0; i < len(adtabInlst); i++ {
  66. for j = 0; j < len(bh.Bomitemlst); j++ {
  67. if bh.Bomitemlst[j].Fmaterialid == adtabInlst[i].Materialid {
  68. // 判断子物料是否存在
  69. if mattab, ok = matdict[bh.Bomitemlst[i].Cmaterialid]; !ok {
  70. continue
  71. }
  72. if bh.Bomitemlst[i].Fmatqty <= 0 || bh.Bomitemlst[i].Cmatqty <= 0 {
  73. continue
  74. }
  75. // 存在则计算独立需求
  76. adtab = db.Pln_material_demand{}
  77. adtab.Finr = db.G_FINR
  78. adtab.Materialid = mattab.Materialid
  79. adtab.Workordernr = adtabInlst[i].Workordernr
  80. adtab.Demandqty = adtabInlst[i].Demandqty * int(bh.Bomitemlst[j].Cmatqty/bh.Bomitemlst[j].Fmatqty)
  81. // 获取物料的需求时间(扣除前置期)
  82. loc, _ := time.LoadLocation("UTC")
  83. t, _ = common.DateParse(adtabInlst[i].Swet, "YmdHis")
  84. t = t.In(loc).Add(time.Duration(bh.Bomitemlst[j].GetChildLeadTimeInSecond()) * time.Second * -1)
  85. if t.Unix() < time.Now().Unix() {
  86. t = time.Now()
  87. }
  88. adtab.Swet = common.Date(t.Unix(), "YYYYMMDDHHmmss")
  89. adtab.Demandyear = t.Year()
  90. adtab.Demandmonth = int(t.Month())
  91. _, adtab.Demandweek = t.ISOWeek()
  92. adtab.Demandday = t.Day()
  93. adtab.Demandhour = t.Hour()
  94. adtab.Usestatus = 0 // 默认未使用
  95. adtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  96. adtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  97. adtab.Lastuser = "service"
  98. // 插入需求
  99. if err = adtab.InsertAndUpdate(session); err != nil {
  100. return
  101. }
  102. // 添加到循环遍历
  103. adtabLowlst = append(adtabLowlst, adtab)
  104. }
  105. }
  106. }
  107. if len(adtabLowlst) > 0 {
  108. if err = bh.CalLowerLevelDemand(session, adtabLowlst, matdict); err != nil {
  109. return
  110. }
  111. }
  112. return
  113. }