package service import ( "errors" "github.com/go-xorm/xorm" "leit.com/leit_seat_aps/common" "leit.com/leit_seat_aps/db" "time" ) // 定义包装模板 type BL_Package struct { PackTmplId string PlanQty int Paktmpltab db.Jit_packtemplate SgDict map[string]int // 用于存储供应组的数量 OemseqCount int Oemseqordict map[int]int // 待包装的oemSEQ } // 包装订单 type BL_PackOrder struct { PackorderId string // 包装单号 PackTmplId string // 包装模板 PlanQty int // 包装计划数量 FillQty int // 已填充数量 OemseqCount int SeqCount int // 计划排序单(基于Oem订单)数量 Oemseqordict map[int]int // 已包装的oemSEQ Pkotab db.Jit_packorder } // 可选包装单 type BL_OptionalPackOrder struct { PackorderId string Pos int // 包装单选中位置号 Seq int // 人工指定顺序 Pkotab db.Jit_packorder // 可选包装单 Pkoitemtab db.Jit_packorder_itemlst // 可选包装单匹配子项 } // 获取包装单模板中的序数 func (bl_pak *BL_Package) GetSeqCount() (count int) { var ( i int seqdict map[int]int ) // 基于包装模板对应的序数更新包装单的序数 seqdict = make(map[int]int) for i = 0; i < len(bl_pak.Paktmpltab.Itemlst); i++ { seqdict[bl_pak.Paktmpltab.Itemlst[i].Seq] = bl_pak.Paktmpltab.Itemlst[i].Seq } count = len(seqdict) return } // 获取包装单中的已填充生产订单的OEMSEQ列表 func (bl_po *BL_PackOrder) GetFilledOemseqList() (oemseqlist []int) { var ( i, oemseq int oemseqdict map[int]int ) // 基于包装模板对应的序数更新包装单的序数 oemseqdict = make(map[int]int) oemseqlist = []int{} for i = 0; i < len(bl_po.Pkotab.Itemlst); i++ { if bl_po.Pkotab.Itemlst[i].Status >= common.PKO_STATUS_RELEASED && bl_po.Pkotab.Itemlst[i].Oemseq > 0 { oemseqdict[common.ValueToInt(bl_po.Pkotab.Itemlst[i].Oemseq, 0)] = common.ValueToInt(bl_po.Pkotab.Itemlst[i].Oemseq, 0) } } for _, oemseq = range oemseqdict { oemseqlist = append(oemseqlist, oemseq) } return } // 获取包装单已填充数 func (bl_po *BL_PackOrder) GetFilledItemQty() (filledqty int) { var i int filledqty = 0 for i = 0; i < len(bl_po.Pkotab.Itemlst); i++ { if bl_po.Pkotab.Itemlst[i].Status >= common.PKO_STATUS_RELEASED && bl_po.Pkotab.Itemlst[i].Oemseq > 0 { filledqty = filledqty + 1 } } return } // 获取包装单中的的供应组列表 func (bl_po *BL_PackOrder) GetSupplygroupList() (sglist []string) { var ( i int sgid string sgdict map[string]string ) // 基于包装模板对应的序数更新包装单的序数 sgdict = make(map[string]string) sglist = []string{} for i = 0; i < len(bl_po.Pkotab.Itemlst); i++ { sgdict[bl_po.Pkotab.Itemlst[i].Supplygroupid] = bl_po.Pkotab.Itemlst[i].Supplygroupid } for _, sgid = range sgdict { sglist = append(sglist, sgid) } return } // 基于实际填充内容计算填充的状态 func (bl_po *BL_PackOrder) RefreshFillStatus() (err error) { var ( i int seqdict map[int]int ) // 遍历包装单已包装内容 seqdict = make(map[int]int) bl_po.Oemseqordict = make(map[int]int) bl_po.FillQty = 0 for i = 0; i < len(bl_po.Pkotab.Itemlst); i++ { seqdict[bl_po.Pkotab.Itemlst[i].Seq] = bl_po.Pkotab.Itemlst[i].Seq if bl_po.Pkotab.Itemlst[i].Status >= common.PKO_STATUS_RELEASED && bl_po.Pkotab.Itemlst[i].Oemseq > 0 { bl_po.Oemseqordict[common.ValueToInt(bl_po.Pkotab.Itemlst[i].Oemseq,0)] = bl_po.Pkotab.Itemlst[i].Seq bl_po.FillQty = bl_po.FillQty + 1 } } bl_po.SeqCount = len(seqdict) bl_po.OemseqCount = len(bl_po.Oemseqordict) return } // 基于待填充内容计算填充的状态 func (bl_paktmp *BL_Package) RefreshFillStatus() (err error) { var ( i int ) // 遍历包装单待包装内容 bl_paktmp.Oemseqordict = make(map[int]int) for i = 0; i < len(bl_paktmp.Paktmpltab.Itemlst); i++ { bl_paktmp.Oemseqordict[bl_paktmp.Paktmpltab.Itemlst[i].Seq] = bl_paktmp.Paktmpltab.Itemlst[i].Seq } bl_paktmp.OemseqCount = len(bl_paktmp.Oemseqordict) return } // 判断非满包填充的包装单是否具备下达条件 func (bl_po *BL_PackOrder) IsUnfullfillPackorderReleasable(session *xorm.Session, cop *CalloffProject) (canrel bool, err error) { var ( wotab db.Pln_workorder wotablst []db.Pln_workorder oemseqlist []int sglist []string i int ) canrel = false if err = bl_po.RefreshFillStatus(); err != nil { return } // 检查包装项填充序数是否已达成,如果达成,则查找关联客户订单确认是否其所有待包装的生产订单已包装 if bl_po.SeqCount > len(bl_po.Oemseqordict) { return } // 获取包装单中序号对应OEMSEQ列表以及供应组列表 oemseqlist = bl_po.GetFilledOemseqList() sglist = bl_po.GetSupplygroupList() wotab = db.Pln_workorder{} if wotablst, err = wotab.GetListByOemseqAndSupplygroup(session, cop.Projectid, oemseqlist, sglist); err != nil { return } // 是否所有生产订单都已完成包装,是则关闭当前包装 canrel = true for i = 0; i < len(wotablst); i++ { if wotablst[i].Packstatus <= 0 { canrel = false break } } return } // 将生产订单添加到开口包装指定checkseq的位置,如果包装项都已填满,则释放包装 func (bl_pakord *BL_PackOrder) AddWorkOrder(session *xorm.Session, wotab db.Pln_workorder, cs int) (success bool, err error) { var ( pakordtab db.Jit_packorder i int ) // 获取包装单完整数据,检查包装单状态是否满足 pakordtab = db.Jit_packorder{Finr: db.G_FINR, Packorderid: bl_pakord.PackorderId} if bl_pakord.Pkotab, err = pakordtab.SelectOneBySession(session); err != nil { return } // 遍历包装单子项,基于Pos找到适配的子项 success = false for i = 0; i < len(bl_pakord.Pkotab.Itemlst); i++ { if bl_pakord.Pkotab.Itemlst[i].Seq == cs && bl_pakord.Pkotab.Itemlst[i].Supplygroupid == wotab.Supplygroupid { // 更新包装子项的计划包装信息 bl_pakord.Pkotab.Itemlst[i].Status = common.PKO_STATUS_RELEASED bl_pakord.Pkotab.Itemlst[i].Workordernr = wotab.Workordernr bl_pakord.Pkotab.Itemlst[i].Oemseq = wotab.Oemseq bl_pakord.Pkotab.Itemlst[i].Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") if !bl_pakord.Pkotab.Itemlst[i].UpdateBySession(session) { err = errors.New("Failed to update jit_packorder_itemlst!") return } // 更新生产订单的包装状态 wotab.Packstatus = 1 wotab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") if err = wotab.UpdateFields(session, "packstatus, lastmodif"); err != nil { err = errors.New("Failed to update pln_workorder!") return } success = true break } } return } // 下达包装单 func (bl_po *BL_PackOrder) Release(session *xorm.Session, relqty int) (err error) { var ( //i int bl_ordmsg BL_Ordmsg ) if bl_po.Pkotab.Status < common.PKO_STATUS_RELEASED { // 遍历子项查将未填充的OEMSEQ清空 /** for i = 0; i < len(bl_po.Pkotab.Itemlst); i++ { if bl_po.Pkotab.Itemlst[i].Status < common.PKO_STATUS_RELEASED { bl_po.Pkotab.Itemlst[i].Oemseq = 0 //bl_po.Pkotab.Itemlst[i].Seq = 0 bl_po.Pkotab.Itemlst[i].Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") if err = bl_po.Pkotab.Itemlst[i].UpdateFields(session, "oemseq, lastmodif"); err != nil { err = errors.New(fmt.Sprintf("无法更新包装单项,原因是%v",err)) return } } }**/ // 更新包装单头 bl_po.Pkotab.Actqty = relqty bl_po.Pkotab.Status = common.PKO_STATUS_RELEASED bl_po.Pkotab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") if err = bl_po.Pkotab.UpdateFields(session, "status, actqty, lastmodif"); err != nil { return } // 创建包装单消息 bl_ordmsg = BL_Ordmsg{MsgType: common.MSG_TYPE_PACK, MsgObjid: bl_po.Pkotab.Packorderid, MsgEvent: common.MSG_EVENT_PRINT} if err = bl_ordmsg.Create(session); err != nil { return } } return }