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