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.

167 lines
5.6 KiB

  1. package service
  2. import (
  3. "leit.com/leit_seat_aps/db"
  4. "strconv"
  5. )
  6. // 零件业务对象
  7. type BL_Part struct {
  8. Partid string // 零件号
  9. Projnr string // 项目号
  10. AtcodDict map[int]BL_PartAttribute
  11. Parttab db.Me_part // 零件元数据对象
  12. }
  13. // 零件属性业务对象
  14. type BL_PartAttribute struct {
  15. Partid string // 零件号
  16. Projnr string // 项目号
  17. Attrcode int // 属性ID
  18. Attrvalue string // 属性值
  19. Partattrtab db.Me_part_atcodlst // 零件元数据对象
  20. }
  21. // 共用件分配规则
  22. type BL_PartAssignRule struct {
  23. Partid string
  24. Partfamilyid string
  25. Ruleid string
  26. Qty int // 待分配数量
  27. Partruletab db.Me_partrule
  28. Assignnruledict map[string]db.Me_partrule_qtyassign // 零件数量分配字典,Key = Supplygroupid
  29. }
  30. // 获取零件列表
  31. func GetParttabList() (partlist []db.Me_part, err error) {
  32. if err = db.G_DbEngine.Where("finr = ?", db.G_FINR).Find(&partlist); err != nil {
  33. return
  34. }
  35. return
  36. }
  37. // 获取零件列表
  38. func GetPartAtcodtabList() (partatcodlist []db.Me_part_atcodlst, err error) {
  39. if err = db.G_DbEngine.Table("me_part_atcodlst").Join("left", "me_part_atcodver", "me_part_atcodlst.finr = me_part_atcodver.finr and me_part_atcodlst.version = me_part_atcodver.version").Where("me_part_atcodlst.finr = ? and me_part_atcodver.version = ?", db.G_FINR, 1).Find(&partatcodlist); err != nil {
  40. return
  41. }
  42. return
  43. }
  44. // 获取项目的零件列表
  45. func GetProjectParttabList(projnr string) (partlist []db.Me_part, err error) {
  46. if err = db.G_DbEngine.Where("finr = ? AND projnr = ?", db.G_FINR, projnr).Find(&partlist); err != nil {
  47. return
  48. }
  49. return
  50. }
  51. // 获取项目的零件列表
  52. func GetProjectPartAtcodtabList(projnr string) (partatcodlist []db.Me_part_atcodlst, err error) {
  53. if err = db.G_DbEngine.Table("me_part_atcodlst").Join("left", "me_part_atcodver", "me_part_atcodlst.finr = me_part_atcodver.finr and me_part_atcodlst.version = me_part_atcodver.version").Where("me_part_atcodlst.finr = ? AND me_part_atcodlst.projnr = ? and me_part_atcodver.version = ?", db.G_FINR, projnr, 1).Find(&partatcodlist); err != nil {
  54. return
  55. }
  56. return
  57. }
  58. // 获取项目的零件分配规则列表
  59. func GetProjectPartRuletabList(projnr string) (partrulelist []db.Me_partrule, err error) {
  60. if err = db.G_DbEngine.Where("finr = ? AND projnr = ?", db.G_FINR, projnr).Find(&partrulelist); err != nil {
  61. return
  62. }
  63. return
  64. }
  65. // 获取项目零件的分配规则明细数据
  66. func GetProjectPartRuleDatatabList(partid, projnr, ruleid string) (partruledatalist []db.Me_partrule_qtyassign, err error) {
  67. if err = db.G_DbEngine.Where("finr = ? AND partid = ? AND projnr = ? AND ruleid = ?", 100, partid, projnr, ruleid).Asc("pos").Find(&partruledatalist); err != nil {
  68. return
  69. }
  70. return
  71. }
  72. // 获取指定项目的零件主数据字典,包括零件分配的属性
  73. func GetProjectPartListDict(projnr string) (partDict map[string]BL_Part, err error) {
  74. var (
  75. ptlst []db.Me_part
  76. ptatlst []db.Me_part_atcodlst
  77. bl_pt BL_Part
  78. bl_partattr BL_PartAttribute
  79. i int
  80. ok bool
  81. )
  82. partDict = make(map[string]BL_Part)
  83. if ptlst, err = GetProjectParttabList(projnr); err != nil {
  84. return
  85. }
  86. if ptatlst, err = GetProjectPartAtcodtabList(projnr); err != nil {
  87. return
  88. }
  89. //fmt.Println("Read ",len(ptlst)," parts with ",len(ptatlst)," attributes!")
  90. // 遍历零件列表并写入零件字典
  91. for i = 0; i < len(ptlst); i++ {
  92. ptlst[i].Clipped()
  93. bl_pt = BL_Part{}
  94. bl_pt.Partid = ptlst[i].Partid
  95. bl_pt.AtcodDict = make(map[int]BL_PartAttribute)
  96. bl_pt.Parttab = ptlst[i]
  97. partDict[bl_pt.Partid] = bl_pt
  98. }
  99. // 遍历零件属性列表
  100. for i = 0; i < len(ptatlst); i++ {
  101. ptatlst[i].Clipped()
  102. if bl_pt, ok = partDict[ptatlst[i].Partid]; !ok {
  103. continue
  104. }
  105. bl_partattr = BL_PartAttribute{}
  106. bl_partattr.Attrcode = ptatlst[i].Attrcode
  107. bl_partattr.Attrvalue = ptatlst[i].Attrvalue
  108. bl_partattr.Partid = ptatlst[i].Partid
  109. bl_partattr.Partattrtab = ptatlst[i]
  110. bl_pt.AtcodDict[bl_partattr.Attrcode] = bl_partattr
  111. // 更新回零件字典
  112. partDict[bl_pt.Partid] = bl_pt
  113. }
  114. return
  115. }
  116. // 获取指定项目的零件分配规则集字典
  117. func GetProjectPartRuleListDict(projnr string) (part_rule_dict map[string]BL_PartAssignRule, err error) {
  118. var (
  119. partrulelist []db.Me_partrule
  120. partruledatalist []db.Me_partrule_qtyassign
  121. bl_part_rule BL_PartAssignRule
  122. i, j int
  123. key string
  124. )
  125. // 初始化字典
  126. part_rule_dict = make(map[string]BL_PartAssignRule)
  127. if partrulelist, err = GetProjectPartRuletabList(projnr); err != nil {
  128. return
  129. }
  130. // 遍历项目零件规则加载明细数据
  131. for i = 0; i < len(partrulelist); i++ {
  132. partrulelist[i].Clipped()
  133. if partrulelist[i].Partrule_iprecond <= 0 {
  134. continue
  135. }
  136. if partruledatalist, err = GetProjectPartRuleDatatabList(partrulelist[i].Partid, partrulelist[i].Projnr, partrulelist[i].Ruleid); err != nil {
  137. return
  138. }
  139. bl_part_rule = BL_PartAssignRule{}
  140. bl_part_rule.Ruleid = partrulelist[i].Ruleid
  141. bl_part_rule.Partid = partrulelist[i].Partid
  142. bl_part_rule.Partfamilyid = partrulelist[i].Partrule_cprecond
  143. bl_part_rule.Qty = partrulelist[i].Partrule_iprecond
  144. bl_part_rule.Partruletab = partrulelist[i]
  145. bl_part_rule.Assignnruledict = make(map[string]db.Me_partrule_qtyassign)
  146. for j = 0; j < len(partruledatalist); j++ {
  147. partruledatalist[j].Clipped()
  148. bl_part_rule.Assignnruledict[partruledatalist[j].Supplygroupid] = partruledatalist[j]
  149. }
  150. // 项目零件分配规则Key = 零件ID+数量
  151. key = bl_part_rule.Partid + "+" + strconv.Itoa(bl_part_rule.Qty)
  152. part_rule_dict[key] = bl_part_rule
  153. }
  154. return
  155. }