package service
|
|
|
|
import (
|
|
"errors"
|
|
"github.com/go-xorm/xorm"
|
|
"leit.com/leit_seat_aps/common"
|
|
"leit.com/leit_seat_aps/db"
|
|
"time"
|
|
)
|
|
|
|
// 定义包装模板
|
|
type BL_ProdPackTmp struct {
|
|
PackTmplId string
|
|
Paktmpltab db.Prod_packtemplate
|
|
SgDict map[string]string // 用于存储供应组
|
|
OemseqCount int
|
|
Oemseqordict map[int]int // 待包装的OEMSEQ
|
|
}
|
|
|
|
// 包装订单
|
|
type BL_ProdPackOrder struct {
|
|
PackorderId string // 包装单号
|
|
PackTmplId string // 包装模板
|
|
PlanQty int // 包装计划数量
|
|
FillQty int // 已填充数量
|
|
OemseqCount int
|
|
SeqCount int // 计划排序单(基于Oem订单)数量
|
|
Oemseqordict map[int]int // 已包装的oemSEQ
|
|
Pkotab db.Prod_packorder
|
|
}
|
|
|
|
// 获取包装单模板中的序数
|
|
func (bl_pak *BL_ProdPackTmp) 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
|
|
}
|
|
|
|
// 获取包装单已填充数
|
|
func (bl_po *BL_ProdPackOrder) 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_ProdPackOrder) 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_ProdPackOrder) 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[bl_po.Pkotab.Itemlst[i].Oemseq] = 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_ProdPackTmp) 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
|
|
}
|
|
|
|
// 将生产订单添加到开口包装指定schedseq的位置,如果包装项都已填满,则释放包装
|
|
func (bl_pakord *BL_ProdPackOrder) AddWorkOrder(session *xorm.Session, wotab db.Pln_workorder, schedseq int) (success bool, err error) {
|
|
var (
|
|
pakordtab db.Prod_packorder
|
|
i int
|
|
)
|
|
|
|
// 获取包装单完整数据,检查包装单状态是否满足
|
|
pakordtab = db.Prod_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 == schedseq && 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 = common.ValueToInt(wotab.Oemseq,0)
|
|
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_ProdPackOrder) Release(session *xorm.Session, relqty int) (err error) {
|
|
var (
|
|
bl_ordmsg BL_Ordmsg
|
|
)
|
|
|
|
if bl_po.Pkotab.Status < common.PKO_STATUS_RELEASED {
|
|
// 更新包装单头
|
|
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
|
|
}
|
|
|