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.

168 lines
5.5 KiB

// 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)
}
}