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.

215 lines
8.4 KiB

package tod
import (
"errors"
"fmt"
"github.com/go-xorm/xorm"
"leit.com/leit_seat_aps/common"
"leit.com/leit_seat_aps/db"
"leit.com/leit_seat_aps/service"
"time"
)
// 解析TOD的Landing数据
func ParseTodLandData() {
var (
err error
projtab db.Me_project
projtablst []db.Me_project
todProj service.TodProject
covtab db.Pln_custorder_ver
vcovlst []db.VCustorderVer
bl_co service.BL_CustOrder
i, j int
bRet bool
session *xorm.Session
)
projtab = db.Me_project{}
if projtablst, err = projtab.GetAllActive(); err != nil {
err = errors.New(fmt.Sprintf("加载项目失败,原因是: %v", err))
return
}
for i, _ = range projtablst {
todProj = service.TodProject{}
todProj.Projecttab = projtablst[i]
todProj.Projectid = projtablst[i].Projectid
fmt.Println("Ready to load data for project:", projtablst[i].Projectid)
if err = todProj.GetAttributeList(common.ATCOD_TYPE_PART); err != nil {
err = errors.New(fmt.Sprintf("加载项目:%s的属性失败,原因是: %v", projtablst[i].Projectid, err))
return
}
if err = todProj.GetPartFamilyList(); err != nil {
err = errors.New(fmt.Sprintf("加载项目:%s的零件族失败,原因是: %v", projtablst[i].Projectid, err))
return
}
if err = todProj.GetSupplyGroupList(); err != nil {
err = errors.New(fmt.Sprintf("加载项目:%s的供应组失败,原因是: %v", projtablst[i].Projectid, err))
return
}
if err = todProj.GetPartList(); err != nil {
err = errors.New(fmt.Sprintf("加载项目:%s的零件清单失败,原因是: %v", projtablst[i].Projectid, err))
return
}
if err = todProj.GetCarModelList(); err != nil {
err = errors.New(fmt.Sprintf("加载项目:%s的Carmodel失败,原因是: %v", projtablst[i].Projectid, err))
return
}
if err = todProj.GetPartRuleList(); err != nil {
err = errors.New(fmt.Sprintf("加载项目:%s的共用件规则失败,原因是: %v", projtablst[i].Projectid, err))
return
}
fmt.Println("Finish loading the project master data!")
// 获取待解析的订单版本头数据
covtab = db.Pln_custorder_ver{}
if vcovlst, err = covtab.GetProjectUnparsedTOD(todProj.Projectid); err != nil {
err = errors.New(fmt.Sprintf("加载未解析的TOD Landing数据失败,原因是: %v", err))
return
}
// 加载客户订单进行校验
for j, _ = range vcovlst {
bl_co = service.BL_CustOrder{}
bl_co.Custordernr = vcovlst[j].Pln_custorder.Custordernr
bl_co.Oemordernr = vcovlst[j].Pln_custorder.Oemordernr
bl_co.Projnr = vcovlst[j].Pln_custorder.Projnr
bl_co.Partfamilyid = vcovlst[j].Pln_custorder_ver.Partfamilyid
bl_co.SeqType = vcovlst[j].Pln_custorder_ver.Seqmode
bl_co.Edifile = vcovlst[j].Pln_custorder_ver.Edifile
bl_co.Custordertab = vcovlst[j].Pln_custorder
// 初始化客户订单的错误清单
bl_co.Bl_verrdict = make(map[string]service.BL_VerifyError)
// 查询获得客户订单的供应组的零件清单
if err = bl_co.GetSupplyGroupPartList(&todProj); err != nil {
err = errors.New(fmt.Sprintf("加载客户订单: %s 的供应组零件清单失败,原因是: %v", bl_co.Custordernr, err))
return
}
// 用客户订单版本头中的零件数据替换已有的供应组零件
if err = bl_co.ReplaceSGPartListByCOVData(vcovlst[j].Pln_custorder_ver, &todProj); err != nil {
err = errors.New(fmt.Sprintf("替换客户订单: %s 的供应组零件清单失败,原因是: %v", bl_co.Custordernr, err))
return
}
// 将共用供应组的零件进行分配
if err = bl_co.AssignNeutralPart(&todProj); err != nil {
err = errors.New(fmt.Sprintf("分配客户订单: %s 的共用零件失败,原因是: %v", bl_co.Custordernr, err))
return
}
// 将不生成工单的供应组(例如头枕HR)的零件分配到指定供应组
if err = bl_co.AssignPartsToShippableSG(&todProj); err != nil {
err = errors.New(fmt.Sprintf("分配客户订单: %s 的共用零件到Shippable供应组失败,原因是: %v", bl_co.Custordernr, err))
return
}
// 基于供应组零件清单获取客户订单的完整零件清单
if err = bl_co.GetPartListFromSupplyGroup(&todProj); err != nil {
err = errors.New(fmt.Sprintf("基于供应组获取客户订单: %s 的完整零件清单失败,原因是: %v", bl_co.Custordernr, err))
return
}
// 基于客户订单的零件清单获取订单的属性清单
if err = bl_co.GetAtcodListFromPartList(&todProj); err != nil {
err = errors.New(fmt.Sprintf("基于客户订单: %s 的零件清单获取属性清单失败,原因是: %v", bl_co.Custordernr, err))
return
}
// 获取客户订单供应组的属性清单(不含共用件SG)
if err = bl_co.GenerateSupplyGroupAtcod(&todProj); err != nil {
err = errors.New(fmt.Sprintf("获取客户订单: %s 的供应组的零件清单失败,原因是: %v", bl_co.Custordernr, err))
return
}
// 验证客户订单零件
if err = bl_co.ValidatePartList(&todProj); err != nil {
err = errors.New(fmt.Sprintf("验证客户订单: %s 的零件清单失败,原因是: %v", bl_co.Custordernr, err))
return
}
// 验证客户订单属性(按SupplyGroup)
if todProj.Projecttab.Tod_verify_supplygroupattribute > 0 {
if err = bl_co.ValidateSupplyGroupAtcodList(&todProj); err != nil {
err = errors.New(fmt.Sprintf("按供应组验证客户订单: %s 的属性失败,原因是: %v", bl_co.Custordernr, err))
return
}
}
// 验证客户订单属性(按Part Family)
if todProj.Projecttab.Tod_verify_partfamilyattribute > 0 {
if err = bl_co.ValidatePartFamilyAtcodList(&todProj); err != nil {
err = errors.New(fmt.Sprintf("按零件族验证客户订单: %s 的属性失败,原因是: %v", bl_co.Custordernr, err))
return
}
}
// 生成客户订单的生产订单数据
if err = bl_co.GenerateWorkorderBySupplyGroup(&todProj); err != nil {
err = errors.New(fmt.Sprintf("生成客户订单: %s 的生产订单失败,原因是: %v", bl_co.Custordernr, err))
return
}
// 生成客户订单的生产订单属性数据
if err = bl_co.GenerateWorkorderAtcodlst(&todProj); err != nil {
err = errors.New(fmt.Sprintf("生成客户订单: %s 的生产订单属性清单失败,原因是: %v", bl_co.Custordernr, err))
return
}
// 保存客户订单的解析结果数据
session = db.G_DbEngine.NewSession()
defer session.Close()
if err := session.Begin(); err != nil {
return
}
bRet = true
// 保存客户订单的解析错误
// 如果有错误则不再更新后续其它数据
if len(bl_co.Bl_verrdict) > 0 {
if err = bl_co.SaveParseErrors(session); err != nil {
err = errors.New(fmt.Sprintf("保存客户订单: %s 的解析错误失败,原因是: %v", bl_co.Custordernr, err))
bRet = false
} else {
// 更新客户订单的处理状态为ER并返回继续
bl_co.Custordertab.Handlestatus = common.CO_PARSE_STATUS_ERROR
bl_co.Custordertab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
if err = bl_co.Custordertab.UpdateFields(session, "handlestatus,lastmodif"); err != nil {
bRet = false
}
//session.Commit()
//session.Close()
//continue
}
} else {
bl_co.Custordertab.Handlestatus = common.CO_PARSE_STATUS_OK
bl_co.Custordertab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
if err = bl_co.Custordertab.UpdateFields(session, "handlestatus,lastmodif"); err != nil {
bRet = false
}
// 更新COV头的解析状态
vcovlst[j].Pln_custorder_ver.Parsed = 1
vcovlst[j].Pln_custorder_ver.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
if err = vcovlst[j].Pln_custorder_ver.UpdateFields(session, "parsed, lastmodif"); err != nil {
bRet = false
}
}
// 保存客户订单的零件数据和属性数据
if bRet {
if err = bl_co.SavePartAndAtcodData(session, &todProj); err != nil {
err = errors.New(fmt.Sprintf("保存客户订单: %s 的零件和属性清单失败,原因是: %v", bl_co.Custordernr, err))
bRet = false
}
}
// 保存客户订单下的生产订单头和它的零件及属性数据
if bRet {
if err = bl_co.SaveWorkorderData(session, &todProj); err != nil {
err = errors.New(fmt.Sprintf("保存客户订单: %s 的生产订单数据失败,原因是: %v", bl_co.Custordernr, err))
bRet = false
}
}
if bRet {
session.Commit()
session.Close()
} else {
session.Rollback()
session.Close()
}
}
}
return
}