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.

140 lines
4.0 KiB

  1. package tier2
  2. import (
  3. "fmt"
  4. "github.com/go-xorm/xorm"
  5. "leit.com/leit_seat_aps/common"
  6. "leit.com/leit_seat_aps/db"
  7. "leit.com/leit_seat_aps/service"
  8. "time"
  9. )
  10. func LoadMaterialData() (matdict map[string]db.Pln_material, err error) {
  11. var (
  12. mattab db.Pln_material
  13. mattablst []db.Pln_material
  14. i int
  15. )
  16. // 获取所有激活的物料数据
  17. mattab = db.Pln_material{}
  18. if mattablst, err = mattab.GetAll(); err != nil {
  19. return
  20. }
  21. // 加载物料数据到字典
  22. matdict = make(map[string]db.Pln_material)
  23. for i = 0; i < len(mattablst); i++ {
  24. matdict[mattablst[i].Materialid] = mattablst[i]
  25. }
  26. return
  27. }
  28. // 为指定的客户订单生成对应的需求
  29. func RunDemandCollector() (err error) {
  30. var (
  31. bl_ordmsg service.BL_Ordmsg
  32. matdict map[string]db.Pln_material
  33. msgtab db.Order_msg
  34. msgtablst []db.Order_msg
  35. cotab db.Pln_custorder
  36. wotablst []db.Pln_workorder
  37. materialtab db.Pln_material
  38. matdemandtab db.Pln_material_demand
  39. i, j, k int
  40. swet, t time.Time
  41. session *xorm.Session
  42. ok bool
  43. )
  44. // 加载所需物料主数据
  45. if matdict, err = LoadMaterialData(); err != nil {
  46. return
  47. }
  48. fmt.Println("加载物料:")
  49. for _, materialtab = range matdict {
  50. fmt.Println(" -->", materialtab.Materialid, materialtab.Descr2)
  51. }
  52. // 循环获取开口的模型解析消息
  53. for {
  54. fmt.Println("加载客户订单需求计算消息......")
  55. msgtab = db.Order_msg{}
  56. if msgtablst, err = msgtab.GetOpenDemandMessages(); err != nil {
  57. return
  58. }
  59. for i = 0; i < len(msgtablst); i++ {
  60. bl_ordmsg = service.BL_Ordmsg{Ordmsgtab: msgtablst[i]}
  61. fmt.Println(" 遍历客户订单:", msgtablst[i].Msgobjid)
  62. // 基于消息获取客户订单
  63. cotab = db.Pln_custorder{Finr: db.G_FINR, Custordernr: msgtablst[i].Msgobjid}
  64. if wotablst, err = cotab.GetWorkorderPartlst(); err != nil {
  65. return
  66. }
  67. fmt.Println(" 获取客户订单的生产订单:", len(wotablst))
  68. session = db.G_DbEngine.NewSession()
  69. defer session.Close()
  70. if err = session.Begin(); err != nil {
  71. return
  72. }
  73. // 遍历生产订单
  74. for j = 0; j < len(wotablst); j++ {
  75. // 遍历生产订单的零件清单
  76. for k = 0; k < len(wotablst[j].Partlst); k++ {
  77. if materialtab, ok = matdict[wotablst[j].Partlst[k].Partid]; !ok {
  78. continue
  79. }
  80. fmt.Println(wotablst[j].Partlst[k].Partid, "********** 适配成功!")
  81. // 创建新需求
  82. matdemandtab = db.Pln_material_demand{Finr: db.G_FINR}
  83. matdemandtab.Materialid = wotablst[j].Partlst[k].Partid
  84. matdemandtab.Workordernr = wotablst[j].Workordernr
  85. matdemandtab.Demandqty = wotablst[j].Partlst[k].Partqty
  86. // 获取物料的需求时间(扣除前置期)
  87. loc, _ := time.LoadLocation("UTC")
  88. swet, _ = common.DateParse(wotablst[j].Swet, "YmdHis")
  89. t = swet.In(loc).Add(time.Duration(materialtab.GetLeadTimeInSecond()) * time.Second * -1)
  90. if t.Unix() < time.Now().Unix() {
  91. t = time.Now()
  92. }
  93. matdemandtab.Demanddate = common.Date(t.Unix(), "YYYYMMDD")
  94. matdemandtab.Descr = materialtab.Descr2
  95. matdemandtab.Demandtype = common.DEMAND_TYPE_SEQ
  96. matdemandtab.Swet = common.Date(t.Unix(), "YYYYMMDDHHmmss")
  97. matdemandtab.Demandyear = t.Year()
  98. matdemandtab.Demandmonth = int(t.Month())
  99. _, matdemandtab.Demandweek = t.ISOWeek()
  100. matdemandtab.Demandday = t.Day()
  101. matdemandtab.Demandhour = t.Hour()
  102. matdemandtab.Usestatus = 0 // 默认未使用
  103. matdemandtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  104. matdemandtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  105. matdemandtab.Lastuser = "demand_service"
  106. // 存储(如果存在则更新)
  107. if err = matdemandtab.InsertAndUpdate(session); err != nil {
  108. session.Rollback()
  109. session.Close()
  110. return
  111. }
  112. }
  113. }
  114. // 关闭消息
  115. if err = bl_ordmsg.Close(); err != nil {
  116. session.Rollback()
  117. session.Close()
  118. return
  119. }
  120. session.Commit()
  121. session.Close()
  122. }
  123. time.Sleep(time.Duration(5) * time.Second)
  124. }
  125. return
  126. }