// Copyright (c) Shenyang Leading Edge Intelligent Technology Co., Ltd. All rights reserved.
|
|
package mes
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/go-xorm/xorm"
|
|
"leit.com/leit_seat_aps/common"
|
|
"leit.com/leit_seat_aps/db"
|
|
"leit.com/leit_seat_aps/glog"
|
|
"leit.com/leit_seat_aps/service"
|
|
"time"
|
|
)
|
|
|
|
/******************************************************************************
|
|
*
|
|
* @Function Name : GenProductionPack()
|
|
*-----------------------------------------------------------------------------
|
|
*
|
|
* @Description : 基于派工下达计划生成生产包装
|
|
*
|
|
* @Function Parameters:
|
|
*
|
|
* @Return Value :
|
|
*
|
|
* @Author : Lou Wenzhi
|
|
*
|
|
* @Date : 2021/3/5 11:46
|
|
*
|
|
******************************************************************************/
|
|
|
|
func GenProductionPack() {
|
|
for {
|
|
var (
|
|
err error
|
|
i, m, n int
|
|
projtab db.Prod_project
|
|
projtablst []db.Prod_project
|
|
pproj service.ProdProject
|
|
wotab db.Pln_workorder
|
|
wotablst []db.Pln_workorder
|
|
sgid, sortway string
|
|
exist, ok, relstat bool
|
|
bl_pakordlst []service.BL_ProdPackOrder
|
|
bl_pakord service.BL_ProdPackOrder
|
|
session *xorm.Session
|
|
)
|
|
|
|
projtab = db.Prod_project{}
|
|
if projtablst, err = projtab.GetAllActive(); err != nil {
|
|
glog.Error("Failed to get project list!")
|
|
return
|
|
}
|
|
|
|
for i, _ = range projtablst {
|
|
pproj = service.ProdProject{}
|
|
pproj.Projecttab = projtablst[i]
|
|
pproj.Projectid = projtablst[i].Projectid
|
|
fmt.Println("Ready to load data for project:", projtablst[i].Projectid)
|
|
|
|
// 加载项目主数据
|
|
if err = pproj.LoadMasterData(); err != nil {
|
|
glog.ErrorExtln("mespack", "Failed to load project master data due to:", err)
|
|
return
|
|
}
|
|
|
|
// 从指定起始OEMSEQ获取未进行生产包装的工单列表
|
|
if wotablst, err = pproj.GetUnpackedWorkorderListByOemseq(); err != nil {
|
|
glog.ErrorExtln("mespack", "获取项目: 指定供应组的工单失败:", pproj.Projectid, sgid, err)
|
|
return
|
|
}
|
|
|
|
// 遍历工单
|
|
for _, wotab = range wotablst {
|
|
fmt.Println("==========匹配工单==>", wotab.Workordernr, "--OEMSEQ--", common.ValueToInt(wotab.Oemseq, 0), "--SupplyGroup--", wotab.Supplygroupid)
|
|
// 获取工单供应组对应的排序方式
|
|
sortway = pproj.GetSupplyGroupPackSortWay(wotab.Supplygroupid)
|
|
switch sortway {
|
|
case common.MESPACK_SORT_OEMSEQ:
|
|
// 基于OEMSEQ和工单的供应组ID查找包装单
|
|
if exist, bl_pakord, err = pproj.GetOpenPackOrderByOemseqSupplyGroup(wotab); err != nil {
|
|
glog.ErrorExtln("mespack", "无法获取工单的包装订单,原因是:", wotab.Workordernr, err)
|
|
return
|
|
}
|
|
case common.MESPACK_SORT_RELSEQ:
|
|
// 基于空包装单及supplygroup
|
|
if exist, bl_pakord, err = pproj.GetOpenPackOrderBySupplyGroup(wotab.Supplygroupid); err != nil {
|
|
glog.ErrorExtln("mespack", "无法获取工单的包装订单,原因是:", wotab.Workordernr, err)
|
|
return
|
|
}
|
|
}
|
|
|
|
session = db.G_DbEngine.NewSession()
|
|
defer session.Close()
|
|
if err = session.Begin(); err != nil {
|
|
return
|
|
}
|
|
// 不存在则新建包装单
|
|
if !exist {
|
|
if bl_pakordlst, err = pproj.CreatePackOrderByOemseq(session, wotab, sortway); err != nil {
|
|
fmt.Println("创建开口包装单失败,原因:", err)
|
|
session.Rollback()
|
|
continue
|
|
}
|
|
// 获取当前OEMSEQ 或 checksequence的包装单
|
|
ok = false
|
|
for m = 0; m < len(bl_pakordlst); m++ {
|
|
for n = 0; n < len(bl_pakordlst[m].Pkotab.Itemlst); n++ {
|
|
switch sortway {
|
|
case common.MESPACK_SORT_OEMSEQ:
|
|
if (bl_pakordlst[m].Pkotab.Itemlst[n].Supplygroupid == wotab.Supplygroupid) && bl_pakordlst[m].Pkotab.Itemlst[n].Oemseq == common.ValueToInt(wotab.Oemseq, 0) {
|
|
ok = true
|
|
bl_pakord = bl_pakordlst[m]
|
|
break
|
|
}
|
|
case common.MESPACK_SORT_RELSEQ:
|
|
if bl_pakordlst[m].Pkotab.Itemlst[n].Supplygroupid == wotab.Supplygroupid {
|
|
ok = true
|
|
bl_pakord = bl_pakordlst[m]
|
|
break
|
|
}
|
|
}
|
|
}
|
|
if ok {
|
|
break
|
|
}
|
|
}
|
|
if !ok {
|
|
fmt.Println("无法为当前工单找到包装单!")
|
|
session.Rollback()
|
|
continue
|
|
}
|
|
}
|
|
|
|
// 将工单加入到当前包装单并尝试下达包装单
|
|
if ok, err = pproj.AddWOToPackOrder(wotab, &bl_pakord, sortway, session); err != nil {
|
|
glog.ErrorExtln("mespack", "添加工单 : 到包装单 : 出错,原因是:", wotab.Workordernr, bl_pakord.PackorderId, err)
|
|
session.Rollback()
|
|
return
|
|
}
|
|
|
|
// 添加成功尝试下达生产包装单
|
|
if ok {
|
|
fmt.Println("成功添加工单", wotab.Workordernr, "到包装单", bl_pakord.PackorderId)
|
|
// 关闭当前包装
|
|
if relstat, err = pproj.ReleasePackOrder(session, bl_pakord); err != nil {
|
|
glog.ErrorExtln("mespack", "下达包装单 出错,原因是:", bl_pakord.PackorderId, err)
|
|
session.Rollback()
|
|
return
|
|
}
|
|
if relstat {
|
|
// 生成包装单消息
|
|
if err = pproj.CreatePackOrderRelMsg(bl_pakord.PackorderId, session); err != nil {
|
|
glog.ErrorExtln("mespack", "创建包装单下达消息 出错,原因是:", bl_pakord.PackorderId, err)
|
|
session.Rollback()
|
|
return
|
|
}
|
|
fmt.Println("成功下达包装单", bl_pakord.PackorderId)
|
|
}
|
|
} else {
|
|
fmt.Println("!!!无法添加工单", wotab.Workordernr, "到包装单", bl_pakord.PackorderId)
|
|
}
|
|
|
|
session.Commit()
|
|
}
|
|
}
|
|
time.Sleep(10 * time.Second)
|
|
}
|
|
}
|