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.

277 lines
8.0 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_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
}