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