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.

202 lines
7.6 KiB

package service
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/glog"
"strings"
"time"
)
type BL_Tier2ASN struct {
Asnheadtab db.Jit_asnhead_landing
Orderdict map[string]BL_Tier2Order
}
type BL_Tier2Order struct {
Ordernr string
Asnordertab db.Jit_asnorder_landing
Itemdict map[string]db.Jit_asnitem_landing
}
// 遍历asn数据,将客户订单号(OEM订单号-零件族-年份)的所有零件放到对应字典中
func (bt *BL_Tier2ASN) SortAsnByOrder() (err error) {
var (
i, j int
bl_t2ord BL_Tier2Order
ok bool
)
// 初始化
bt.Orderdict = make(map[string]BL_Tier2Order)
// 遍历零件
for i = 0; i < len(bt.Asnheadtab.Itemlst); i++ {
// 遍历客户订单
for j = 0; j < len(bt.Asnheadtab.Itemlst[i].Orderlst); j++ {
if bl_t2ord, ok = bt.Orderdict[bt.Asnheadtab.Itemlst[i].Orderlst[j].Ordernr]; !ok {
// 不存在则新添加
bl_t2ord = BL_Tier2Order{}
bl_t2ord.Itemdict = make(map[string]db.Jit_asnitem_landing)
bl_t2ord.Asnordertab = bt.Asnheadtab.Itemlst[i].Orderlst[j]
bl_t2ord.Ordernr = bt.Asnheadtab.Itemlst[i].Orderlst[j].Ordernr
}
bl_t2ord.Itemdict[bt.Asnheadtab.Itemlst[i].Partid] = bt.Asnheadtab.Itemlst[i]
bt.Orderdict[bl_t2ord.Ordernr] = bl_t2ord
}
}
return
}
// 遍历客户订单逐个关闭
func (bt *BL_Tier2ASN) CLoseTier2WorkOrder() (err error) {
var (
bl_t2ord BL_Tier2Order
cotab db.Pln_custorder
wotab db.Pln_workorder
mail db.Sendmailtab
i, j int
session *xorm.Session
exist, match bool
)
for _, bl_t2ord = range bt.Orderdict {
session = db.G_DbEngine.NewSession()
defer session.Close()
if err = session.Begin(); err != nil {
return
}
/*****
*逻辑:
*第一步:联查出jit_asnorder_cache表,每条成功更新状态
*第二步:检查每条更新后,对应的head头部是否全部更新完成,完成的话,更新head状态
***************/
cotab = db.Pln_custorder{Finr: db.G_FINR, Oemordernr: bl_t2ord.Asnordertab.Oemordernr, Partfamilyid: bl_t2ord.Asnordertab.Partfamilyid}
// 基于Oem订单号,零件族和年份获取最新的客户订单及其关联的零件族对应的生产订单
if exist, cotab, err = cotab.GetByAsnDataBySession(bl_t2ord.Asnordertab.Swetyear, session); err != nil {
session.Rollback()
return
}
if !exist {
err = errors.New(fmt.Sprintf("ASN 中指定的OEM客户订单%s 零件族%s 要货年份%s 不存在!", bl_t2ord.Asnordertab.Oemordernr, bl_t2ord.Asnordertab.Partfamilyid, bl_t2ord.Asnordertab.Swetyear))
session.Rollback()
return
}
// 如果客户订单没有对应零件族的生产订单,则报错返回
if len(cotab.Wotablst) < 0 {
err = errors.New(fmt.Sprintf("ASN 中指定的OEM客户订单%s 零件族%s 要货年份%s 的生产订单不存在!", bl_t2ord.Asnordertab.Oemordernr, bl_t2ord.Asnordertab.Partfamilyid, bl_t2ord.Asnordertab.Swetyear))
session.Rollback()
return
}
// 关闭生产订单
match = true
for i = 0; i < len(cotab.Wotablst); i++ {
if strings.TrimSpace(cotab.Wotablst[i].Supplygroupid) != strings.TrimSpace(bl_t2ord.Asnordertab.Supplygroupid) || strings.TrimSpace(cotab.Wotablst[i].Partfamilyid) != strings.TrimSpace(bl_t2ord.Asnordertab.Partfamilyid) {
continue
}
if cotab.Wotablst[i].Status < common.WO_STATUS_CLOSED && cotab.Wotablst[i].Status >= common.WO_STATUS_RELEASED {
// 验证订单的零件和ASN中的零件是否匹配,不匹配报错返回
for j = 0; j < len(cotab.Wotablst[i].Partlst); j++ {
if _, match = bl_t2ord.Itemdict[cotab.Wotablst[i].Partlst[j].Partid]; !match {
err = errors.New(fmt.Sprintf("扶手订单%s 的零件%s 在ASN %s的客户订单%s中缺失!", cotab.Wotablst[i].Workordernr,
cotab.Wotablst[i].Partlst[j].Partid, bt.Asnheadtab.Asnnr, bl_t2ord.Asnordertab.Ordernr))
project := new(db.Me_project)
project.Finr = db.G_FINR
project.Projectid = cotab.Wotablst[i].Projnr
projtab, _ := project.SelectOne()
projtab.Clipped()
//添加邮件预警
host := projtab.Emailserver_host + ":" + common.ValueToString(projtab.Emailserver_port, "")
body := "项目号: " + projtab.Projectid + "\r\nCustordernr 扶手订单: " + cotab.Wotablst[i].Custordernr + "\r\nErrorinfo :" + "零件缺失" + "\r\nPartfamilyid :" + cotab.Wotablst[i].Partfamilyid + "\r\nPartid :" + cotab.Wotablst[i].Partid
mail.Status = "waiting"
mail.Body = body
mail.Subject = "Reorder的消息的更新"
mail.Name = projtab.From_email
mail.Tomail = projtab.Tod_error_to_recievers
mail.Host = host
mail.Password = projtab.From_pwd
mail.Username = projtab.From_email
mail.Add()
session.Rollback()
return
}
}
// 验证通过,关闭生产订单
cotab.Wotablst[i].Status = common.WO_STATUS_CLOSED
cotab.Wotablst[i].Lastuser = "asn_service"
cotab.Wotablst[i].Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
res, err := cotab.Wotablst[i].UpdateFieldsWo(session, "status, lastmodif, lastuser")
if err != nil || res < 1 {
session.Rollback()
glog.InfoExtln("grammerasn", "err :", err)
continue
}
} else if cotab.Wotablst[i].Status == common.WO_STATUS_CLOSED {
err = errors.New(fmt.Sprintf("扶手订单%s 订单状态不符合!", cotab.Wotablst[i].Workordernr))
glog.InfoExtln("grammerasn", "err :", err)
continue
} else {
err = errors.New(fmt.Sprintf("扶手订单%s 订单状态不符合!", cotab.Wotablst[i].Workordernr))
glog.InfoExtln("grammerasn", "err :", err)
session.Rollback()
return
}
}
//验证是否是最后一个生产订单,如果是,更新对应的客户订单
if err = wotab.UpdateCustorderByWorkorder(session, cotab.Custordernr); err != nil {
session.Rollback()
glog.InfoExtln("grammerasn", "err :", err)
return
}
glog.InfoExtln("grammerasn", "err :", err)
//判断该客户订单是否有小于80的GRAMMEER订单,如果存在则不更新
ok := wotab.SelectByCustorder(session, cotab.Custordernr)
glog.InfoExtln("grammerasn", "ok :", ok)
if ok {
glog.InfoExtln("grammerasninfo", "bl_t2ord.Asnordertab.Asnnr :", bl_t2ord.Asnordertab.Asnnr)
glog.InfoExtln("grammerasninfo", "bl_t2ord.Asnordertab.Asnnr :", bl_t2ord.Asnordertab.Oemordernr)
//置位对应的工单
cache := new(db.Jit_asnorder_cache)
cache.Asnnr = bl_t2ord.Asnordertab.Asnnr
cache.Oemordernr = bl_t2ord.Asnordertab.Oemordernr
cache.Partfamilyid = bl_t2ord.Asnordertab.Partfamilyid
cache.Flag = 1
cache.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
cache.Lastuser = "asn_service"
if err = cache.UpdateFields(session, "flag,lastmodif,lastuser"); err != nil {
glog.InfoExtln("grammerasn", "err :", err)
session.Rollback()
return
}
} else {
glog.InfoExtln("grammerasn暂时不能置位的订单", "cotab.Custordernr :", cotab.Custordernr)
}
session.Commit()
}
return
}
// 遍历客户订单逐个关闭
func (bt *BL_Tier2ASN) SetParsedStatus() (err error) {
//判断该asn订单是否都被更新
cache := new(db.Jit_asnorder_cache)
cache.Asnnr = bt.Asnheadtab.Asnnr
result := cache.SelectInfo()
if !result {
return errors.New("该文件有未解析的订单")
}
// 设置ASN为已解析状态
bt.Asnheadtab.Parsed = 1
bt.Asnheadtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
bt.Asnheadtab.Lastuser = "asn_service"
if err = bt.Asnheadtab.UpdateFields("parsed, lastmodif, lastuser"); err != nil {
return
}
//删除文件对应的缓存
//cache.DelInfo()
return
}