|
|
- 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
- }
|