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.

277 lines
8.0 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
  1. package service
  2. import (
  3. "errors"
  4. "github.com/go-xorm/xorm"
  5. "leit.com/leit_seat_aps/common"
  6. "leit.com/leit_seat_aps/db"
  7. "time"
  8. )
  9. // 定义包装模板
  10. type BL_Package struct {
  11. PackTmplId string
  12. PlanQty int
  13. Paktmpltab db.Jit_packtemplate
  14. SgDict map[string]int // 用于存储供应组的数量
  15. OemseqCount int
  16. Oemseqordict map[int]int // 待包装的oemSEQ
  17. }
  18. // 包装订单
  19. type BL_PackOrder struct {
  20. PackorderId string // 包装单号
  21. PackTmplId string // 包装模板
  22. PlanQty int // 包装计划数量
  23. FillQty int // 已填充数量
  24. OemseqCount int
  25. SeqCount int // 计划排序单(基于Oem订单)数量
  26. Oemseqordict map[int]int // 已包装的oemSEQ
  27. Pkotab db.Jit_packorder
  28. }
  29. // 可选包装单
  30. type BL_OptionalPackOrder struct {
  31. PackorderId string
  32. Pos int // 包装单选中位置号
  33. Seq int // 人工指定顺序
  34. Pkotab db.Jit_packorder // 可选包装单
  35. Pkoitemtab db.Jit_packorder_itemlst // 可选包装单匹配子项
  36. }
  37. // 获取包装单模板中的序数
  38. func (bl_pak *BL_Package) GetSeqCount() (count int) {
  39. var (
  40. i int
  41. seqdict map[int]int
  42. )
  43. // 基于包装模板对应的序数更新包装单的序数
  44. seqdict = make(map[int]int)
  45. for i = 0; i < len(bl_pak.Paktmpltab.Itemlst); i++ {
  46. seqdict[bl_pak.Paktmpltab.Itemlst[i].Seq] = bl_pak.Paktmpltab.Itemlst[i].Seq
  47. }
  48. count = len(seqdict)
  49. return
  50. }
  51. // 获取包装单中的已填充生产订单的OEMSEQ列表
  52. func (bl_po *BL_PackOrder) GetFilledOemseqList() (oemseqlist []int) {
  53. var (
  54. i, oemseq int
  55. oemseqdict map[int]int
  56. )
  57. // 基于包装模板对应的序数更新包装单的序数
  58. oemseqdict = make(map[int]int)
  59. oemseqlist = []int{}
  60. for i = 0; i < len(bl_po.Pkotab.Itemlst); i++ {
  61. if bl_po.Pkotab.Itemlst[i].Status >= common.PKO_STATUS_RELEASED && bl_po.Pkotab.Itemlst[i].Oemseq > 0 {
  62. oemseqdict[common.ValueToInt(bl_po.Pkotab.Itemlst[i].Oemseq, 0)] = common.ValueToInt(bl_po.Pkotab.Itemlst[i].Oemseq, 0)
  63. }
  64. }
  65. for _, oemseq = range oemseqdict {
  66. oemseqlist = append(oemseqlist, oemseq)
  67. }
  68. return
  69. }
  70. // 获取包装单已填充数
  71. func (bl_po *BL_PackOrder) GetFilledItemQty() (filledqty int) {
  72. var i int
  73. filledqty = 0
  74. for i = 0; i < len(bl_po.Pkotab.Itemlst); i++ {
  75. if bl_po.Pkotab.Itemlst[i].Status >= common.PKO_STATUS_RELEASED && bl_po.Pkotab.Itemlst[i].Oemseq > 0 {
  76. filledqty = filledqty + 1
  77. }
  78. }
  79. return
  80. }
  81. // 获取包装单中的的供应组列表
  82. func (bl_po *BL_PackOrder) GetSupplygroupList() (sglist []string) {
  83. var (
  84. i int
  85. sgid string
  86. sgdict map[string]string
  87. )
  88. // 基于包装模板对应的序数更新包装单的序数
  89. sgdict = make(map[string]string)
  90. sglist = []string{}
  91. for i = 0; i < len(bl_po.Pkotab.Itemlst); i++ {
  92. sgdict[bl_po.Pkotab.Itemlst[i].Supplygroupid] = bl_po.Pkotab.Itemlst[i].Supplygroupid
  93. }
  94. for _, sgid = range sgdict {
  95. sglist = append(sglist, sgid)
  96. }
  97. return
  98. }
  99. // 基于实际填充内容计算填充的状态
  100. func (bl_po *BL_PackOrder) RefreshFillStatus() (err error) {
  101. var (
  102. i int
  103. seqdict map[int]int
  104. )
  105. // 遍历包装单已包装内容
  106. seqdict = make(map[int]int)
  107. bl_po.Oemseqordict = make(map[int]int)
  108. bl_po.FillQty = 0
  109. for i = 0; i < len(bl_po.Pkotab.Itemlst); i++ {
  110. seqdict[bl_po.Pkotab.Itemlst[i].Seq] = bl_po.Pkotab.Itemlst[i].Seq
  111. if bl_po.Pkotab.Itemlst[i].Status >= common.PKO_STATUS_RELEASED && bl_po.Pkotab.Itemlst[i].Oemseq > 0 {
  112. bl_po.Oemseqordict[common.ValueToInt(bl_po.Pkotab.Itemlst[i].Oemseq,0)] = bl_po.Pkotab.Itemlst[i].Seq
  113. bl_po.FillQty = bl_po.FillQty + 1
  114. }
  115. }
  116. bl_po.SeqCount = len(seqdict)
  117. bl_po.OemseqCount = len(bl_po.Oemseqordict)
  118. return
  119. }
  120. // 基于待填充内容计算填充的状态
  121. func (bl_paktmp *BL_Package) RefreshFillStatus() (err error) {
  122. var (
  123. i int
  124. )
  125. // 遍历包装单待包装内容
  126. bl_paktmp.Oemseqordict = make(map[int]int)
  127. for i = 0; i < len(bl_paktmp.Paktmpltab.Itemlst); i++ {
  128. bl_paktmp.Oemseqordict[bl_paktmp.Paktmpltab.Itemlst[i].Seq] = bl_paktmp.Paktmpltab.Itemlst[i].Seq
  129. }
  130. bl_paktmp.OemseqCount = len(bl_paktmp.Oemseqordict)
  131. return
  132. }
  133. // 判断非满包填充的包装单是否具备下达条件
  134. func (bl_po *BL_PackOrder) IsUnfullfillPackorderReleasable(session *xorm.Session, cop *CalloffProject) (canrel bool, err error) {
  135. var (
  136. wotab db.Pln_workorder
  137. wotablst []db.Pln_workorder
  138. oemseqlist []int
  139. sglist []string
  140. i int
  141. )
  142. canrel = false
  143. if err = bl_po.RefreshFillStatus(); err != nil {
  144. return
  145. }
  146. // 检查包装项填充序数是否已达成,如果达成,则查找关联客户订单确认是否其所有待包装的生产订单已包装
  147. if bl_po.SeqCount > len(bl_po.Oemseqordict) {
  148. return
  149. }
  150. // 获取包装单中序号对应OEMSEQ列表以及供应组列表
  151. oemseqlist = bl_po.GetFilledOemseqList()
  152. sglist = bl_po.GetSupplygroupList()
  153. wotab = db.Pln_workorder{}
  154. if wotablst, err = wotab.GetListByOemseqAndSupplygroup(session, cop.Projectid, oemseqlist, sglist); err != nil {
  155. return
  156. }
  157. // 是否所有生产订单都已完成包装,是则关闭当前包装
  158. canrel = true
  159. for i = 0; i < len(wotablst); i++ {
  160. if wotablst[i].Packstatus <= 0 {
  161. canrel = false
  162. break
  163. }
  164. }
  165. return
  166. }
  167. // 将生产订单添加到开口包装指定checkseq的位置,如果包装项都已填满,则释放包装
  168. func (bl_pakord *BL_PackOrder) AddWorkOrder(session *xorm.Session, wotab db.Pln_workorder, cs int) (success bool, err error) {
  169. var (
  170. pakordtab db.Jit_packorder
  171. i int
  172. )
  173. // 获取包装单完整数据,检查包装单状态是否满足
  174. pakordtab = db.Jit_packorder{Finr: db.G_FINR, Packorderid: bl_pakord.PackorderId}
  175. if bl_pakord.Pkotab, err = pakordtab.SelectOneBySession(session); err != nil {
  176. return
  177. }
  178. // 遍历包装单子项,基于Pos找到适配的子项
  179. success = false
  180. for i = 0; i < len(bl_pakord.Pkotab.Itemlst); i++ {
  181. if bl_pakord.Pkotab.Itemlst[i].Seq == cs && bl_pakord.Pkotab.Itemlst[i].Supplygroupid == wotab.Supplygroupid {
  182. // 更新包装子项的计划包装信息
  183. bl_pakord.Pkotab.Itemlst[i].Status = common.PKO_STATUS_RELEASED
  184. bl_pakord.Pkotab.Itemlst[i].Workordernr = wotab.Workordernr
  185. bl_pakord.Pkotab.Itemlst[i].Oemseq = wotab.Oemseq
  186. bl_pakord.Pkotab.Itemlst[i].Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  187. if !bl_pakord.Pkotab.Itemlst[i].UpdateBySession(session) {
  188. err = errors.New("Failed to update jit_packorder_itemlst!")
  189. return
  190. }
  191. // 更新生产订单的包装状态
  192. wotab.Packstatus = 1
  193. wotab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  194. if err = wotab.UpdateFields(session, "packstatus, lastmodif"); err != nil {
  195. err = errors.New("Failed to update pln_workorder!")
  196. return
  197. }
  198. success = true
  199. break
  200. }
  201. }
  202. return
  203. }
  204. // 下达包装单
  205. func (bl_po *BL_PackOrder) Release(session *xorm.Session, relqty int) (err error) {
  206. var (
  207. //i int
  208. bl_ordmsg BL_Ordmsg
  209. )
  210. if bl_po.Pkotab.Status < common.PKO_STATUS_RELEASED {
  211. // 遍历子项查将未填充的OEMSEQ清空
  212. /**
  213. for i = 0; i < len(bl_po.Pkotab.Itemlst); i++ {
  214. if bl_po.Pkotab.Itemlst[i].Status < common.PKO_STATUS_RELEASED {
  215. bl_po.Pkotab.Itemlst[i].Oemseq = 0
  216. //bl_po.Pkotab.Itemlst[i].Seq = 0
  217. bl_po.Pkotab.Itemlst[i].Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  218. if err = bl_po.Pkotab.Itemlst[i].UpdateFields(session, "oemseq, lastmodif"); err != nil {
  219. err = errors.New(fmt.Sprintf("无法更新包装单项,原因是%v",err))
  220. return
  221. }
  222. }
  223. }**/
  224. // 更新包装单头
  225. bl_po.Pkotab.Actqty = relqty
  226. bl_po.Pkotab.Status = common.PKO_STATUS_RELEASED
  227. bl_po.Pkotab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  228. if err = bl_po.Pkotab.UpdateFields(session, "status, actqty, lastmodif"); err != nil {
  229. return
  230. }
  231. // 创建包装单消息
  232. bl_ordmsg = BL_Ordmsg{MsgType: common.MSG_TYPE_PACK, MsgObjid: bl_po.Pkotab.Packorderid, MsgEvent: common.MSG_EVENT_PRINT}
  233. if err = bl_ordmsg.Create(session); err != nil {
  234. return
  235. }
  236. }
  237. return
  238. }