package service
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"github.com/go-xorm/xorm"
|
|
"leit.com/leit_seat_aps/common"
|
|
"leit.com/leit_seat_aps/db"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// 生产调度派工引擎
|
|
type SchedEngine struct {
|
|
PlanMode string
|
|
LineTypes []string
|
|
PickOrderSN string // 拣料单流水号SN
|
|
Wltablst []db.Workline
|
|
WorklineDict map[string]BL_Workline // 产线
|
|
PickingTmpDict map[string]BL_PickingTemplate // 拣料单模板
|
|
Projectdict map[string]BL_Project // 所有的项目主数据
|
|
}
|
|
|
|
// 根据指定的计划模式和产线类型加载产线
|
|
func (se *SchedEngine) LoadWorkLines() (err error) {
|
|
var (
|
|
bl_wl BL_Workline
|
|
i int
|
|
)
|
|
|
|
wltab := db.Workline{}
|
|
if se.Wltablst, err = wltab.GetByModeAndType(se.PlanMode, se.LineTypes); err != nil {
|
|
return
|
|
}
|
|
|
|
se.WorklineDict = make(map[string]BL_Workline)
|
|
for i = 0; i < len(se.Wltablst); i++ {
|
|
se.Wltablst[i].Clipped()
|
|
bl_wl = BL_Workline{}
|
|
bl_wl.PickTmpDict = make(map[string]BL_PickingTemplate)
|
|
bl_wl.WorklineId = se.Wltablst[i].Worklineid
|
|
bl_wl.SortMode = se.Wltablst[i].Taskqueuesortway
|
|
if se.Wltablst[i].Multiqueuemixsort == 1 {
|
|
bl_wl.MixSort = true
|
|
bl_wl.MixSortMode = se.Wltablst[i].Taskqueuemixsortway
|
|
bl_wl.MixSortRule = se.Wltablst[i].Mixsortlogic
|
|
} else {
|
|
bl_wl.MixSort = false
|
|
}
|
|
bl_wl.ReleaseMode = se.Wltablst[i].Taskreleaseway
|
|
bl_wl.ReleaseValue = se.Wltablst[i].Releaseparameter
|
|
bl_wl.Worklinetab = se.Wltablst[i]
|
|
se.WorklineDict[bl_wl.WorklineId] = bl_wl
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 加载拣料单模板
|
|
func (se *SchedEngine) LoadPickingTemplates() (err error) {
|
|
var (
|
|
pktmptab db.Pln_picktemplate
|
|
pktmptablst []db.Pln_picktemplate
|
|
bl_pktmp BL_PickingTemplate
|
|
bl_wl BL_Workline
|
|
i, j, k int
|
|
ok bool
|
|
)
|
|
|
|
// 加载拣料单模板
|
|
pktmptab = db.Pln_picktemplate{}
|
|
if pktmptablst, err = pktmptab.GetAllActive(); err != nil {
|
|
return
|
|
}
|
|
|
|
for i = 0; i < len(pktmptablst); i++ {
|
|
if strings.TrimSpace(pktmptablst[i].Worklineid) == "" {
|
|
// 如果没有指定产线则略过
|
|
continue
|
|
}
|
|
|
|
bl_pktmp = BL_PickingTemplate{}
|
|
bl_pktmp.TemplateId = pktmptablst[i].Picktemplateid
|
|
bl_pktmp.WorklineId = pktmptablst[i].Worklineid
|
|
bl_pktmp.PrinterId = pktmptablst[i].Printerid
|
|
bl_pktmp.AssignAttrDict = make(map[int]db.Pln_picktemplate_attrlst)
|
|
bl_pktmp.AssignPartDict = make(map[string]db.Pln_picktemplate_itemlst)
|
|
for j = 0; j < len(bl_pktmp.Picktemplatetab.Attrlst); j++ {
|
|
bl_pktmp.AssignAttrDict[bl_pktmp.Picktemplatetab.Attrlst[j].Attrcode] = bl_pktmp.Picktemplatetab.Attrlst[j]
|
|
}
|
|
for k = 0; k < len(bl_pktmp.Picktemplatetab.Itemlst); k++ {
|
|
bl_pktmp.AssignPartDict[bl_pktmp.Picktemplatetab.Itemlst[k].Partid] = bl_pktmp.Picktemplatetab.Itemlst[k]
|
|
}
|
|
|
|
// 获取产线并添加到产线的拣料单模板中
|
|
if bl_wl, ok = se.WorklineDict[bl_pktmp.WorklineId]; !ok {
|
|
err = errors.New(fmt.Sprintf("Picktemplate %s specified workline %s is not existing!", bl_pktmp.TemplateId, bl_pktmp.WorklineId))
|
|
return
|
|
}
|
|
bl_wl.PickTmpDict[bl_pktmp.TemplateId] = bl_pktmp
|
|
se.WorklineDict[bl_wl.WorklineId] = bl_wl
|
|
se.PickingTmpDict[bl_pktmp.TemplateId] = bl_pktmp
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// PK_LoadMasterData: 加载拣料单服务的主数据
|
|
func (se *SchedEngine) LoadMasterData() (err error) {
|
|
var (
|
|
projtab db.Me_project
|
|
projlsttab []db.Me_project
|
|
bl_proj BL_Project
|
|
i int
|
|
)
|
|
|
|
// 初始化
|
|
se.WorklineDict = make(map[string]BL_Workline)
|
|
se.PickingTmpDict = make(map[string]BL_PickingTemplate)
|
|
se.Projectdict = make(map[string]BL_Project)
|
|
|
|
// 加载产线
|
|
se.PlanMode = common.LINE_PLAN_IN_SEQ
|
|
if err = se.LoadWorkLines(); err != nil {
|
|
return
|
|
}
|
|
|
|
// 加载拣料单模板
|
|
if err = se.LoadPickingTemplates(); err != nil {
|
|
return
|
|
}
|
|
|
|
// 加载所有激活的项目主数据
|
|
projtab = db.Me_project{}
|
|
if projlsttab, err = projtab.GetAllActive(); err != nil {
|
|
return
|
|
}
|
|
for i = 0; i < len(projlsttab); i++ {
|
|
bl_proj = BL_Project{}
|
|
bl_proj.Projectid = projlsttab[i].Projectid
|
|
bl_proj.Projecttab = projlsttab[i]
|
|
if err = bl_proj.GetPartList(); err != nil {
|
|
return
|
|
}
|
|
if err = bl_proj.GetAttributeList(common.ATCOD_TYPE_PART); err != nil {
|
|
return
|
|
}
|
|
if err = bl_proj.GetPartFamilyList(); err != nil {
|
|
return
|
|
}
|
|
if err = bl_proj.GetSupplyGroupList(); err != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 基于拣料单模板创建拣料单
|
|
func (se *SchedEngine) CreatePickOrder(session *xorm.Session, picktmpid string) (bl_po BL_PickingOrder, err error) {
|
|
var (
|
|
pkordtab db.Pln_pickorder
|
|
bl_pktmp BL_PickingTemplate
|
|
ok bool
|
|
)
|
|
|
|
// 查找拣料单模板是否存在
|
|
if bl_pktmp, ok = se.PickingTmpDict[picktmpid]; !ok {
|
|
err = errors.New("The specified picking template: " + picktmpid + " is not existing in the global mdata!")
|
|
return
|
|
}
|
|
|
|
// 创建拣料单头
|
|
bl_po = BL_PickingOrder{}
|
|
if bl_po.OrderNr, err = SN_GetNextSnrBySession(se.PickOrderSN, session); err != nil {
|
|
return
|
|
}
|
|
pkordtab = db.Pln_pickorder{}
|
|
pkordtab.Finr = db.G_FINR
|
|
pkordtab.Pickorderid = bl_po.OrderNr
|
|
pkordtab.Picktemplateid = picktmpid
|
|
pkordtab.Status = common.PKO_STATUS_PLANNED
|
|
pkordtab.Worklineid = bl_pktmp.WorklineId
|
|
pkordtab.Printerid = bl_pktmp.PrinterId
|
|
pkordtab.Planqty = bl_pktmp.Picktemplatetab.Planqty
|
|
pkordtab.Lastuser = "service"
|
|
pkordtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
|
|
if err = pkordtab.Insert(session); err != nil {
|
|
return
|
|
}
|
|
|
|
bl_po.PlanQty = pkordtab.Planqty
|
|
bl_po.TemplateId = pkordtab.Picktemplateid
|
|
bl_po.Pickordertab = pkordtab
|
|
|
|
return
|
|
}
|