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.

166 lines
4.8 KiB

package service
import (
"errors"
"fmt"
"github.com/go-xorm/xorm"
"leit.com/leit_seat_aps/common"
"leit.com/leit_seat_aps/db"
"time"
)
// 定义发运车
type BL_Shipcar struct {
ShipTmplId string
Paktypdict map[string]db.Jit_shiptemplate_itemlst
Shipcartab db.Jit_shiptemplate
}
// 定义发运车订单
type BL_ShipcarOrder struct {
Shiporderid string
ShipTmplId string
Workloaddict map[string]BL_ShipcarWorkload
Spordtab db.Jit_shiporder
}
// 发运车装载负荷情况
type BL_ShipcarWorkload struct {
Packtypeid string // 包装类型
Maxqty int // 该包装类型最多可装载量
Planqty int // 计划装载量
Fillqty int // 实际已装载
}
// 检查包装单是否适配当前发运车,将包装单对应的包装类型的最大数量和实际数量进行比对
func (bl_sco *BL_ShipcarOrder) CanFillPackOrder(pkotab db.Jit_packorder) (can bool) {
var (
bl_scwl BL_ShipcarWorkload
i int
ok bool
)
// 对于未适配模板的发运单(未计划)则基于可适配最大数进行匹配
// 对于适配模板的发运单(已计划)则基于指定包装项的计划数和已填充数来进行匹配
if bl_sco.Spordtab.Status < common.SPO_STATUS_PLANNED {
// 获取发运单对应包装类型的负载对象
if bl_scwl, ok = bl_sco.Workloaddict[pkotab.Packtypeid]; !ok {
can = false
return
}
// 将负载对象的可填充数与最大可填充数进行比较,如果到达最大可填充数,则不再可填充
if bl_scwl.Fillqty >= bl_scwl.Maxqty {
can = false
} else {
can = true
}
} else {
can = false
for i = 0; i < len(bl_sco.Spordtab.Itemlst); i++ {
if bl_sco.Spordtab.Itemlst[i].Packtypeid == pkotab.Packtypeid {
if bl_sco.Spordtab.Itemlst[i].Shortship > 0 {
if bl_sco.Spordtab.Itemlst[i].Fillqty < bl_sco.Spordtab.Itemlst[i].Shortshipqty && bl_sco.Spordtab.Itemlst[i].Status < common.SPO_STATUS_RELEASED {
can = true
break
}
} else {
if bl_sco.Spordtab.Itemlst[i].Fillqty < bl_sco.Spordtab.Itemlst[i].Planqty && bl_sco.Spordtab.Itemlst[i].Status < common.SPO_STATUS_RELEASED {
can = true
break
}
}
} else {
continue
}
}
}
return
}
// 将包装订单插入到当前发运车
func (bl_sco *BL_ShipcarOrder) AddPackOrder(session *xorm.Session, pkotab db.Jit_packorder) (err error) {
var (
spoitemtab_match, spoitemtab db.Jit_shiporder_itemlst
spodatatab db.Jit_shiporder_datalst
i int
found bool
)
// 获取发运车数据
if err = bl_sco.GetOrderDataBySession(session); err != nil {
return
}
// 找到发运车对应的发运子项
found = false
for i = 0; i < len(bl_sco.Spordtab.Itemlst); i++ {
if pkotab.Packtypeid == bl_sco.Spordtab.Itemlst[i].Packtypeid {
found = true
break
}
}
if !found {
err = errors.New(fmt.Sprintf("The packorder %s packtype not match shipcar order %s",
pkotab.Packorderid, pkotab.Packtypeid, bl_sco.Shiporderid))
return
} else {
spoitemtab_match = bl_sco.Spordtab.Itemlst[i]
}
// 更新包装的装载状态
pkotab.Loadstatus = common.PKO_STATUS_LOADED
pkotab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
if err = pkotab.UpdateFields(session, "loadstatus, lastmodif"); err != nil {
return
}
// 插入包装行数据
spodatatab = db.Jit_shiporder_datalst{}
spodatatab.Finr = db.G_FINR
spodatatab.Shiporderid = bl_sco.Spordtab.Shiporderid
spodatatab.Packtypeid = pkotab.Packtypeid
spodatatab.Packorderid = pkotab.Packorderid
spodatatab.Planqty = 1
spodatatab.Actqty = 0
spodatatab.Status = common.SPO_STATUS_RELEASED
spodatatab.Lastuser = "service"
spodatatab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
if err = spodatatab.Insert(session); err != nil {
return
}
// 更新包装子项的实际已装运数 Fillqty
if spoitemtab, err = spoitemtab_match.SelectOneBySession(session); err != nil {
return
}
spoitemtab.Fillqty = len(spoitemtab.Itemlst)
// 对于未计划的发运单不更新发运单项的状态
if bl_sco.Spordtab.Status > common.SPO_STATUS_UNPLANNED {
if spoitemtab.Shortship > 0 && spoitemtab.Fillqty >= spoitemtab.Shortshipqty {
spoitemtab.Status = common.Max(spoitemtab.Status, common.SPO_STATUS_RELEASED)
}
if spoitemtab.Shortship <= 0 && spoitemtab.Fillqty >= spoitemtab.Planqty {
spoitemtab.Status = common.Max(spoitemtab.Status, common.SPO_STATUS_RELEASED)
}
}
spoitemtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
if err = spoitemtab.UpdateFields(session, "fillqty, status, lastmodif"); err != nil {
return
}
return
}
// 获取发运单数据
func (bl_sco *BL_ShipcarOrder) GetOrderDataBySession(session *xorm.Session) (err error) {
bl_sco.Spordtab.Shiporderid = bl_sco.Shiporderid
if bl_sco.Spordtab, err = bl_sco.Spordtab.SelectOneBySession(session); err != nil {
return
}
return
}