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.

171 lines
5.0 KiB

3 years ago
  1. package seq
  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/glog"
  8. "leit.com/leit_seat_aps/service"
  9. "time"
  10. )
  11. // 从消息表获取 类型为 CARMODEl的开口消息,基于消息对象ID (OEM订单号)解析OEM订单对应的车型
  12. // 解析成功则关闭该消息,并将OEM订单对应的解析车型信息进行记录
  13. func RunCarmodelParser(projnr string) (err error) {
  14. var (
  15. bl_proj service.BL_Project
  16. bl_cm service.BL_Carmodel
  17. bl_ordmsg service.BL_Ordmsg
  18. bl_cmspec service.BL_Carmodel_Spec
  19. msgtab db.Order_msg
  20. msgtablst []db.Order_msg
  21. cotab db.Pln_custorder
  22. cotablst []db.Pln_custorder
  23. cocmvtab, delmvtab db.Pln_custorder_carmodelver
  24. i int
  25. ok, match, isnew, alert bool
  26. cmid, alertinfo string
  27. version int
  28. createtime time.Time
  29. dura time.Duration
  30. session *xorm.Session
  31. )
  32. bl_proj.Projectid = projnr
  33. // 第一步:加载项目的相关数据和已有车型规格
  34. if err = bl_proj.GetCarModelList(); err != nil {
  35. glog.InfoExtln("解析车型", "GetCarModelList is:", err)
  36. return
  37. }
  38. fmt.Println("加载项目:", projnr, "的车型主数据成功!")
  39. glog.InfoExtln("解析车型", "加载项目:", projnr)
  40. // 第二步:加载项目的零件数据
  41. if err = bl_proj.GetPartList(); err != nil {
  42. return
  43. }
  44. fmt.Println("加载项目:", projnr, "的零件主数据成功!")
  45. // 第三步:加载项目的属性数据
  46. if err = bl_proj.GetAttributeList(common.ATCOD_TYPE_PART); err != nil {
  47. return
  48. }
  49. fmt.Println("加载项目:", projnr, "的属性主数据成功!")
  50. fmt.Println("加载项目的开口车型消息......")
  51. msgtab = db.Order_msg{}
  52. if msgtablst, err = msgtab.GetProjectOpenCarmodelMessages(projnr); err != nil {
  53. return
  54. }
  55. for i = 0; i < len(msgtablst); i++ {
  56. // 消息创建时间超过10分钟以上再处理(等客户订单的多个SEQ文件凑齐)
  57. if createtime, err = common.DateParse(msgtablst[i].Credatuz, "YmdHis"); err != nil {
  58. fmt.Println("消息", msgtablst[i].Msgid, "的创建时间无法解析!")
  59. continue
  60. }
  61. dura = time.Now().Sub(createtime)
  62. if dura.Seconds() < 10*60 {
  63. // 只处理创建时间超过10分钟的消息
  64. continue
  65. }
  66. bl_ordmsg = service.BL_Ordmsg{Ordmsgtab: msgtablst[i]}
  67. // 基于消息对象ID获取OEM订单完整数据
  68. cotab = db.Pln_custorder{}
  69. if cotablst, err = cotab.GetDataForCarmodelByOemorder(msgtablst[i].Msgobjid, msgtablst[i].Msg_cpara1); err != nil {
  70. return
  71. }
  72. // 如果客户订单有报错不处理
  73. ok = true
  74. for _, cotab = range cotablst {
  75. if cotab.Handlestatus != common.CO_PARSE_STATUS_OK {
  76. ok = false
  77. break
  78. }
  79. }
  80. if !ok {
  81. continue
  82. }
  83. // 是否满足车型要求
  84. if match, cmid = bl_proj.IsMatchWithCarModel(cotablst); !match {
  85. // 判断消息开口是否超过指定时长,超过则报警
  86. if alert, alertinfo, err = bl_ordmsg.IsNeedToAlert(3600 * 24); err != nil {
  87. return
  88. }
  89. if alert {
  90. // 报警
  91. fmt.Println(alertinfo)
  92. }
  93. continue
  94. }
  95. if bl_cm, ok = bl_proj.Carmodeldict[cmid]; !ok {
  96. // 判断消息开口是否超过指定时长,超过则报警
  97. if alert, alertinfo, err = bl_ordmsg.IsNeedToAlert(3600 * 24); err != nil {
  98. return
  99. }
  100. if alert {
  101. // 报警
  102. fmt.Println(alertinfo)
  103. }
  104. //continue
  105. }
  106. session = db.G_DbEngine.NewSession()
  107. defer session.Close()
  108. if err = session.Begin(); err != nil {
  109. return
  110. }
  111. // 满足车型要求,查看是否是已存在规格
  112. if isnew, version = bl_cm.IsNewSpecToThisModel(cotablst); isnew {
  113. // 新版本,新增
  114. if bl_cmspec, err = bl_cm.CreateNewCarmodel(cotablst, &bl_proj, session); err != nil {
  115. session.Rollback()
  116. session.Close()
  117. return
  118. } else {
  119. // 更新项目的车型规格库
  120. bl_cm.SpecDict[bl_cmspec.Version] = bl_cmspec
  121. bl_proj.Carmodeldict[bl_cm.Carmodelid] = bl_cm
  122. version = bl_cmspec.Version
  123. }
  124. }
  125. //删掉对应的车型
  126. delmvtab = db.Pln_custorder_carmodelver{Finr: db.G_FINR}
  127. delmvtab.Oemordernr = msgtablst[i].Msgobjid
  128. delmvtab.Projnr = msgtablst[i].Msg_cpara1
  129. res := delmvtab.DelSession(session)
  130. if !res {
  131. session.Rollback()
  132. session.Close()
  133. return
  134. }
  135. // 更新OEM订单的车型规格表
  136. cocmvtab = db.Pln_custorder_carmodelver{Finr: db.G_FINR}
  137. cocmvtab.Carmodelid = bl_cm.Carmodelid
  138. cocmvtab.Version = version
  139. cocmvtab.Oemordernr = msgtablst[i].Msgobjid
  140. cocmvtab.Projnr = msgtablst[i].Msg_cpara1
  141. cocmvtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  142. cocmvtab.Lastuser = "cm_service"
  143. if err = cocmvtab.Insert(session); err != nil {
  144. session.Rollback()
  145. session.Close()
  146. return
  147. }
  148. // 关闭消息
  149. if err = bl_ordmsg.Close(); err != nil {
  150. session.Rollback()
  151. session.Close()
  152. return
  153. }
  154. session.Commit()
  155. session.Close()
  156. }
  157. return
  158. }