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.

202 lines
7.6 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  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. "leit.com/leit_seat_aps/glog"
  9. "strings"
  10. "time"
  11. )
  12. type BL_Tier2ASN struct {
  13. Asnheadtab db.Jit_asnhead_landing
  14. Orderdict map[string]BL_Tier2Order
  15. }
  16. type BL_Tier2Order struct {
  17. Ordernr string
  18. Asnordertab db.Jit_asnorder_landing
  19. Itemdict map[string]db.Jit_asnitem_landing
  20. }
  21. // 遍历asn数据,将客户订单号(OEM订单号-零件族-年份)的所有零件放到对应字典中
  22. func (bt *BL_Tier2ASN) SortAsnByOrder() (err error) {
  23. var (
  24. i, j int
  25. bl_t2ord BL_Tier2Order
  26. ok bool
  27. )
  28. // 初始化
  29. bt.Orderdict = make(map[string]BL_Tier2Order)
  30. // 遍历零件
  31. for i = 0; i < len(bt.Asnheadtab.Itemlst); i++ {
  32. // 遍历客户订单
  33. for j = 0; j < len(bt.Asnheadtab.Itemlst[i].Orderlst); j++ {
  34. if bl_t2ord, ok = bt.Orderdict[bt.Asnheadtab.Itemlst[i].Orderlst[j].Ordernr]; !ok {
  35. // 不存在则新添加
  36. bl_t2ord = BL_Tier2Order{}
  37. bl_t2ord.Itemdict = make(map[string]db.Jit_asnitem_landing)
  38. bl_t2ord.Asnordertab = bt.Asnheadtab.Itemlst[i].Orderlst[j]
  39. bl_t2ord.Ordernr = bt.Asnheadtab.Itemlst[i].Orderlst[j].Ordernr
  40. }
  41. bl_t2ord.Itemdict[bt.Asnheadtab.Itemlst[i].Partid] = bt.Asnheadtab.Itemlst[i]
  42. bt.Orderdict[bl_t2ord.Ordernr] = bl_t2ord
  43. }
  44. }
  45. return
  46. }
  47. // 遍历客户订单逐个关闭
  48. func (bt *BL_Tier2ASN) CLoseTier2WorkOrder() (err error) {
  49. var (
  50. bl_t2ord BL_Tier2Order
  51. cotab db.Pln_custorder
  52. wotab db.Pln_workorder
  53. mail db.Sendmailtab
  54. i, j int
  55. session *xorm.Session
  56. exist, match bool
  57. )
  58. for _, bl_t2ord = range bt.Orderdict {
  59. session = db.G_DbEngine.NewSession()
  60. defer session.Close()
  61. if err = session.Begin(); err != nil {
  62. return
  63. }
  64. /*****
  65. *逻辑
  66. *第一步:联查出jit_asnorder_cache表,每条成功更新状态
  67. *第二步检查每条更新后对应的head头部是否全部更新完成完成的话更新head状态
  68. ***************/
  69. cotab = db.Pln_custorder{Finr: db.G_FINR, Oemordernr: bl_t2ord.Asnordertab.Oemordernr, Partfamilyid: bl_t2ord.Asnordertab.Partfamilyid}
  70. // 基于Oem订单号,零件族和年份获取最新的客户订单及其关联的零件族对应的生产订单
  71. if exist, cotab, err = cotab.GetByAsnDataBySession(bl_t2ord.Asnordertab.Swetyear, session); err != nil {
  72. session.Rollback()
  73. return
  74. }
  75. if !exist {
  76. err = errors.New(fmt.Sprintf("ASN 中指定的OEM客户订单%s 零件族%s 要货年份%s 不存在!", bl_t2ord.Asnordertab.Oemordernr, bl_t2ord.Asnordertab.Partfamilyid, bl_t2ord.Asnordertab.Swetyear))
  77. session.Rollback()
  78. return
  79. }
  80. // 如果客户订单没有对应零件族的生产订单,则报错返回
  81. if len(cotab.Wotablst) < 0 {
  82. err = errors.New(fmt.Sprintf("ASN 中指定的OEM客户订单%s 零件族%s 要货年份%s 的生产订单不存在!", bl_t2ord.Asnordertab.Oemordernr, bl_t2ord.Asnordertab.Partfamilyid, bl_t2ord.Asnordertab.Swetyear))
  83. session.Rollback()
  84. return
  85. }
  86. // 关闭生产订单
  87. match = true
  88. for i = 0; i < len(cotab.Wotablst); i++ {
  89. if strings.TrimSpace(cotab.Wotablst[i].Supplygroupid) != strings.TrimSpace(bl_t2ord.Asnordertab.Supplygroupid) || strings.TrimSpace(cotab.Wotablst[i].Partfamilyid) != strings.TrimSpace(bl_t2ord.Asnordertab.Partfamilyid) {
  90. continue
  91. }
  92. if cotab.Wotablst[i].Status < common.WO_STATUS_CLOSED && cotab.Wotablst[i].Status >= common.WO_STATUS_RELEASED {
  93. // 验证订单的零件和ASN中的零件是否匹配,不匹配报错返回
  94. for j = 0; j < len(cotab.Wotablst[i].Partlst); j++ {
  95. if _, match = bl_t2ord.Itemdict[cotab.Wotablst[i].Partlst[j].Partid]; !match {
  96. err = errors.New(fmt.Sprintf("扶手订单%s 的零件%s 在ASN %s的客户订单%s中缺失!", cotab.Wotablst[i].Workordernr,
  97. cotab.Wotablst[i].Partlst[j].Partid, bt.Asnheadtab.Asnnr, bl_t2ord.Asnordertab.Ordernr))
  98. project := new(db.Me_project)
  99. project.Finr = db.G_FINR
  100. project.Projectid = cotab.Wotablst[i].Projnr
  101. projtab, _ := project.SelectOne()
  102. projtab.Clipped()
  103. //添加邮件预警
  104. host := projtab.Emailserver_host + ":" + common.ValueToString(projtab.Emailserver_port, "")
  105. body := "项目号: " + projtab.Projectid + "\r\nCustordernr 扶手订单: " + cotab.Wotablst[i].Custordernr + "\r\nErrorinfo :" + "零件缺失" + "\r\nPartfamilyid :" + cotab.Wotablst[i].Partfamilyid + "\r\nPartid :" + cotab.Wotablst[i].Partid
  106. mail.Status = "waiting"
  107. mail.Body = body
  108. mail.Subject = "Reorder的消息的更新"
  109. mail.Name = projtab.From_email
  110. mail.Tomail = projtab.Tod_error_to_recievers
  111. mail.Host = host
  112. mail.Password = projtab.From_pwd
  113. mail.Username = projtab.From_email
  114. mail.Add()
  115. session.Rollback()
  116. return
  117. }
  118. }
  119. // 验证通过,关闭生产订单
  120. cotab.Wotablst[i].Status = common.WO_STATUS_CLOSED
  121. cotab.Wotablst[i].Lastuser = "asn_service"
  122. cotab.Wotablst[i].Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  123. res, err := cotab.Wotablst[i].UpdateFieldsWo(session, "status, lastmodif, lastuser")
  124. if err != nil || res < 1 {
  125. session.Rollback()
  126. glog.InfoExtln("grammerasn", "err :", err)
  127. continue
  128. }
  129. } else if cotab.Wotablst[i].Status == common.WO_STATUS_CLOSED {
  130. err = errors.New(fmt.Sprintf("扶手订单%s 订单状态不符合!", cotab.Wotablst[i].Workordernr))
  131. glog.InfoExtln("grammerasn", "err :", err)
  132. continue
  133. } else {
  134. err = errors.New(fmt.Sprintf("扶手订单%s 订单状态不符合!", cotab.Wotablst[i].Workordernr))
  135. glog.InfoExtln("grammerasn", "err :", err)
  136. session.Rollback()
  137. return
  138. }
  139. }
  140. //验证是否是最后一个生产订单,如果是,更新对应的客户订单
  141. if err = wotab.UpdateCustorderByWorkorder(session, cotab.Custordernr); err != nil {
  142. session.Rollback()
  143. glog.InfoExtln("grammerasn", "err :", err)
  144. return
  145. }
  146. glog.InfoExtln("grammerasn", "err :", err)
  147. //判断该客户订单是否有小于80的GRAMMEER订单,如果存在则不更新
  148. ok := wotab.SelectByCustorder(session, cotab.Custordernr)
  149. glog.InfoExtln("grammerasn", "ok :", ok)
  150. if ok {
  151. glog.InfoExtln("grammerasninfo", "bl_t2ord.Asnordertab.Asnnr :", bl_t2ord.Asnordertab.Asnnr)
  152. glog.InfoExtln("grammerasninfo", "bl_t2ord.Asnordertab.Asnnr :", bl_t2ord.Asnordertab.Oemordernr)
  153. //置位对应的工单
  154. cache := new(db.Jit_asnorder_cache)
  155. cache.Asnnr = bl_t2ord.Asnordertab.Asnnr
  156. cache.Oemordernr = bl_t2ord.Asnordertab.Oemordernr
  157. cache.Partfamilyid = bl_t2ord.Asnordertab.Partfamilyid
  158. cache.Flag = 1
  159. cache.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  160. cache.Lastuser = "asn_service"
  161. if err = cache.UpdateFields(session, "flag,lastmodif,lastuser"); err != nil {
  162. glog.InfoExtln("grammerasn", "err :", err)
  163. session.Rollback()
  164. return
  165. }
  166. } else {
  167. glog.InfoExtln("grammerasn暂时不能置位的订单", "cotab.Custordernr :", cotab.Custordernr)
  168. }
  169. session.Commit()
  170. }
  171. return
  172. }
  173. // 遍历客户订单逐个关闭
  174. func (bt *BL_Tier2ASN) SetParsedStatus() (err error) {
  175. //判断该asn订单是否都被更新
  176. cache := new(db.Jit_asnorder_cache)
  177. cache.Asnnr = bt.Asnheadtab.Asnnr
  178. result := cache.SelectInfo()
  179. if !result {
  180. return errors.New("该文件有未解析的订单")
  181. }
  182. // 设置ASN为已解析状态
  183. bt.Asnheadtab.Parsed = 1
  184. bt.Asnheadtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  185. bt.Asnheadtab.Lastuser = "asn_service"
  186. if err = bt.Asnheadtab.UpdateFields("parsed, lastmodif, lastuser"); err != nil {
  187. return
  188. }
  189. //删除文件对应的缓存
  190. //cache.DelInfo()
  191. return
  192. }