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.

193 lines
5.4 KiB

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
}