diff --git a/asn/Asntask.go b/asn/Asntask.go index 25fa51c..eea9dea 100644 --- a/asn/Asntask.go +++ b/asn/Asntask.go @@ -117,7 +117,7 @@ func ParseAsnLandingData() { continue } } - time.Sleep(10 * time.Second) + time.Sleep(60 * time.Second) } } diff --git a/db/Me_part.go b/db/Me_part.go index 36e5d87..6114e29 100644 --- a/db/Me_part.go +++ b/db/Me_part.go @@ -84,7 +84,7 @@ func (t *Me_part) SelectOne() (data Me_part, err error) { data.Clipped() // 获取值列表 - if err = e.Table("me_part_atcodlst").Join("left", "me_part_atcodver", "me_part_atcodlst.finr = me_part_atcodver.finr and me_part_atcodlst.version = me_part_atcodver.version").Where("me_part_atcodlst.finr = ? and me_part_atcodlst.partid = ? and me_part_atcodlst.projnr = ? and me_part_atcodver.version = ?", + if err = e.Table("me_part_atcodlst").Join("left", "me_part_atcodver", "me_part_atcodlst.finr = me_part_atcodver.finr and me_part_atcodlst.version = me_part_atcodver.version").Where("me_part_atcodlst.finr = ? and me_part_atcodlst.partid = ? and me_part_atcodlst.projnr = ? and me_part_atcodver.released = ?", G_FINR, data.Partid, data.Projnr, 1).OrderBy("me_part_atcodlst.attrcode").Find(&attrlst); err != nil { return } @@ -110,7 +110,7 @@ func (t *Me_part) GetProjectAll(projnr string) (datalst []Me_part, err error) { datalst[i].Clipped() datalst[i].Attrlst = []Me_part_atcodlst{} // 获取值列表 - if err = e.Table("me_part_atcodlst").Join("left", "me_part_atcodver", "me_part_atcodlst.finr = me_part_atcodver.finr and me_part_atcodlst.version = me_part_atcodver.version").Where("me_part_atcodlst.finr = ? and me_part_atcodlst.partid = ? and me_part_atcodlst.projnr = ? and me_part_atcodver.version = ?", + if err = e.Table("me_part_atcodlst").Join("left", "me_part_atcodver", "me_part_atcodlst.finr = me_part_atcodver.finr and me_part_atcodlst.version = me_part_atcodver.version").Where("me_part_atcodlst.finr = ? and me_part_atcodlst.partid = ? and me_part_atcodlst.projnr = ? and me_part_atcodver.released = ?", G_FINR, datalst[i].Partid, datalst[i].Projnr, 1).OrderBy("me_part_atcodlst.attrcode").Find(&datalst[i].Attrlst); err != nil { return } diff --git a/seq/Picker.go b/seq/Picker.go index fcd0500..46469fb 100644 --- a/seq/Picker.go +++ b/seq/Picker.go @@ -100,7 +100,7 @@ func PickLineWorkorder(bl_wline *service.BL_Workline, bl_wo *service.BL_WorkOrde bl_ordmsg service.BL_Ordmsg pktmpattrtab db.Pln_picktemplate_attrlst pktmpparttab db.Pln_picktemplate_itemlst - attrcode int + i,attrcode int pickorderid, picktmpid, partid, wonr string ok, bflag, matched, exist, released bool pkodict map[string]service.BL_PickingTemplate @@ -120,13 +120,16 @@ func PickLineWorkorder(bl_wline *service.BL_Workline, bl_wo *service.BL_WorkOrde // 遍历订单零件列表 bflag = true pkodict = make(map[string]service.BL_PickingTemplate) - for _, bl_wopart = range bl_wo.Bl_wopartdict { + for i = 0; i < len(bl_wo.Workordertab.Partlst); i++ { // 如果遍历零件不能存在则跳过 - if bl_part, ok = pe.Projectdict[bl_wo.Projnr].Partdict[bl_wopart.Partid]; !ok { + if bl_part, ok = pe.Projectdict[bl_wo.Projnr].Partdict[bl_wo.Workordertab.Partlst[i].Partid]; !ok { continue } - bl_wopart.Workordertab = bl_wo.Workordertab - bl_wopart.Parttab = bl_part.Parttab + if bl_wopart, ok = bl_wo.Bl_wopartdict[bl_wo.Workordertab.Partlst[i].Partid]; !ok { + continue + } + bl_wopart.Workordertab = bl_wo.Workordertab + bl_wopart.Parttab = bl_part.Parttab // 获取零件在当前产线的拣料单模板,如果适配 matched = false // 零件只能进入到一个匹配模板,因此要遍历产线上的所有拣料单模板,一旦适配则返回 @@ -136,20 +139,20 @@ func PickLineWorkorder(bl_wline *service.BL_Workline, bl_wo *service.BL_WorkOrde case common.PKT_ADAPT_BY_ATTR: // 比对零件属性是否在模板分配的属性中 for _, pktmpattrtab = range bl_pktmp.AssignAttrDict { if _, ok = bl_part.AtcodDict[pktmpattrtab.Attrcode]; ok { - matched = true - wonr = bl_wo.Workordertab.Workordernr - attrcode = pktmpattrtab.Attrcode - picktmpid = bl_pktmp.TemplateId + matched = true + wonr = bl_wo.Workordertab.Workordernr + attrcode = pktmpattrtab.Attrcode + picktmpid = bl_pktmp.TemplateId break } } case common.PKT_ADAPT_BY_PART: // 比对订单零件和模板分配零件是否相同 for _, pktmpparttab = range bl_pktmp.AssignPartDict { if bl_wopart.Partid == pktmpparttab.Partid { - matched = true - wonr = bl_wo.Workordertab.Workordernr - partid = bl_wopart.Partid - picktmpid = bl_pktmp.TemplateId + matched = true + wonr = bl_wo.Workordertab.Workordernr + partid = bl_wo.Workordertab.Partlst[i].Partid + picktmpid = bl_pktmp.TemplateId break } } diff --git a/seq/Scheduler.go b/seq/Scheduler.go index 317df1e..5518c38 100644 --- a/seq/Scheduler.go +++ b/seq/Scheduler.go @@ -26,7 +26,7 @@ func RunScheduler() (err error) { se = service.SchedEngine{} se.PlanMode = common.LINE_PLAN_IN_SEQ - se.LineTypes = append(se.LineTypes, "A", "M") + se.LineTypes = append(se.LineTypes, "A", "M", "V") // 加载排序产线 if err = se.LoadMasterData(); err != nil { @@ -89,7 +89,7 @@ func ScheduleTaskToRelease(bl_wl service.BL_Workline, se *service.SchedEngine) { return } bl_wl.ReleaseValue = workline.Releaseparameter - bl_wl.Worklinetab = workline + bl_wl.Worklinetab = workline // 基于产线的派工策略获取派工订单 bl_wolst = []service.BL_WorkOrder{} switch bl_wl.ReleaseMode { @@ -151,7 +151,6 @@ func ScheduleTaskToRelease(bl_wl service.BL_Workline, se *service.SchedEngine) { } } - time.Sleep(5 * time.Second) } } diff --git a/seq/Scheduler_test.go b/seq/Scheduler_test.go index 09539e9..dd4bcd6 100644 --- a/seq/Scheduler_test.go +++ b/seq/Scheduler_test.go @@ -48,7 +48,7 @@ func TestScheduler(t *testing.T) { //return se = service.SchedEngine{} se.PlanMode = common.LINE_PLAN_IN_SEQ - se.LineTypes = append(se.LineTypes, "A", "M") + se.LineTypes = append(se.LineTypes, "A", "M", "V") // 加载排序产线 if err = se.LoadMasterData(); err != nil { diff --git a/seq/Seqtask.go b/seq/Seqtask.go index ffd12ec..1d37fa2 100644 --- a/seq/Seqtask.go +++ b/seq/Seqtask.go @@ -283,7 +283,7 @@ func Scheduler() { se = service.SchedEngine{} se.PlanMode = common.LINE_PLAN_IN_SEQ - se.LineTypes = append(se.LineTypes, "A", "M") + se.LineTypes = append(se.LineTypes, "A", "M", "V") // 加载排序产线 if err = se.LoadMasterData(); err != nil { diff --git a/service/Asn.go b/service/Asn.go index 810db09..edbbd44 100644 --- a/service/Asn.go +++ b/service/Asn.go @@ -91,7 +91,7 @@ func (bt *BL_Tier2ASN) CLoseTier2WorkOrder() (err error) { 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 { + if cotab.Wotablst[i].Status < common.WO_STATUS_CLOSED && cotab.Wotablst[i].Status >= common.CO_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 { @@ -126,6 +126,10 @@ func (bt *BL_Tier2ASN) CLoseTier2WorkOrder() (err error) { session.Rollback() return } + }else{ + err = errors.New(fmt.Sprintf("扶手订单%s 订单状态不符合!", cotab.Wotablst[i].Workordernr)) + session.Rollback() + return } } //验证是否是最后一个生产订单,如果是,更新对应的客户订单 diff --git a/tod/Todtask.go b/tod/Todtask.go index 217b41f..9f11c46 100644 --- a/tod/Todtask.go +++ b/tod/Todtask.go @@ -152,12 +152,10 @@ func ParseTodCustorderNew() { vcovlst []db.VCustorderVer bl_co service.BL_CustOrder cust db.Pln_custorder - errlst db.Pln_custorder_errorlst - mail db.Sendmailtab + mailsubject, mailbody string verr service.BL_VerifyError i, j int bRet bool - todrule string session *xorm.Session ) @@ -255,68 +253,16 @@ func ParseTodCustorderNew() { bl_co.Bl_verrdict[verr.GetDictKey()] = verr //添加邮件预警 - host := projtablst[i].Emailserver_host + ":" + common.ValueToString(projtablst[i].Emailserver_port, "") - body := "项目号: " + todProj.Projectid + "\r\nCustordernr 订单号: " + errlst.Custordernr + "\r\nErrorinfo :" + errlst.Errorinfo + "\r\nPartfamilyid :" + errlst.Partfamilyid + "\r\nPartid :" + errlst.Partid - mail.Status = "waiting" - mail.Body = body - mail.Subject = "Reorder的消息的更新" - mail.Name = projtablst[i].From_email - mail.Tomail = projtablst[i].Tod_error_to_recievers - mail.Host = host - mail.Password = projtablst[i].From_pwd - mail.Username = projtablst[i].From_email - err = mail.Add() - if err != nil { + mailsubject = "客户订单号重复错误" + mailbody = "项目号: " + todProj.Projectid + "\r\n客户订单号: " + bl_co.Oemordernr + "\r\nErrorinfo : 半年内重复!" + if err = SendTodErrorEmail(projtablst[i],mailsubject, mailbody); err != nil { glog.InfoExtln("发送邮件", "err is :", err) } } } // 如果是指定供应组的SEQ+1发邮件预警 - if todrule, err = service.GetSysStringParameter(2, bl_co.Projnr, "TOD_EMAIL_RULE"); err != nil { - return - } - kvlst := strings.Split(todrule, ";") - if len(kvlst) > 0 { - for idx, _ := range kvlst { - rulelst := strings.Split(kvlst[idx], ":") - // 蒋rulest[0]转化为整型与bl_co.SeqType 比较,如果相等,则比较1开始的供应组 - seqtype := common.ValueToInt(rulelst[0], 0) - if seqtype == 1 { - supplygroups := make(map[string]string) //去除第一个元素 - for k, v := range rulelst { - if k > 0 { - key := v - supplygroups[key] = v - } - } - //Pln_custorder_ver_partlst - for _, jdv := range vcovlst[j].Pln_custorder_ver.Partlst { - key := jdv.Supplygroupid - _, ok := supplygroups[key] - if ok { - //添加邮件预警 - host := projtablst[i].Emailserver_host + ":" + common.ValueToString(projtablst[i].Emailserver_port, "") - body := "项目号: " + todProj.Projectid + "\r\nErrorinfo : TOD SEQ+1更新订单" + "\r\nOemordernr :" + vcovlst[j].Pln_custorder_ver.Oemordernr - mail.Status = "waiting" - mail.Body = body - mail.Subject = "SEQ+1的消息的更新" - mail.Name = projtablst[i].From_email - mail.Tomail = projtablst[i].Tod_error_to_recievers - mail.Host = host - mail.Password = projtablst[i].From_pwd - mail.Username = projtablst[i].From_email - err = mail.Add() - if err != nil { - glog.InfoExtln("发送邮件", "err is :", err) - } - - } - } - - } - } - } + AlertForCustOrderUpdateTodByRule(projtablst[i], bl_co, vcovlst[j] ) // 查询获得客户订单的供应组的零件清单 if err = bl_co.GetSupplyGroupPartList(&todProj); err != nil { @@ -412,17 +358,8 @@ func ParseTodCustorderNew() { if bl_co.SeqType == 1 && bl_co.Custordertab.Status >= common.CO_STATUS_RELEASED { //添加邮件预警 - host := projtablst[i].Emailserver_host + ":" + common.ValueToString(projtablst[i].Emailserver_port, "") - body := "项目号: " + todProj.Projectid + "\r\nErrorinfo : TOD SEQ+1更新订单" + "\r\nOemordernr :" + vcovlst[j].Pln_custorder_ver.Oemordernr + "状态>=26(已下达)" - mail.Status = "waiting" - mail.Body = body - mail.Subject = "SEQ+1 更新报警" - mail.Name = projtablst[i].From_email - mail.Tomail = projtablst[i].Tod_error_to_recievers - mail.Host = host - mail.Password = projtablst[i].From_pwd - mail.Username = projtablst[i].From_email - err = mail.Add() + mailsubject = "SEQ+1的客户订单已下达" + mailbody = "项目号: " + todProj.Projectid + "\r\n客户订单号: " + bl_co.Oemordernr + "\r\nErrorinfo : 已下达,SEQ+1更新出错!" if err != nil { glog.InfoExtln("发送邮件", "err is :", err) } @@ -441,18 +378,9 @@ func ParseTodCustorderNew() { } //添加邮件预警 - host := projtablst[i].Emailserver_host + ":" + common.ValueToString(projtablst[i].Emailserver_port, "") - body := "项目号: " + todProj.Projectid + "\r\nCustordernr 订单号: " + vcovlst[j].Pln_custorder_ver.Custordernr + "\r\nErrorinfo : TOD SEQ+2更新订单" + "\r\nPartfamilyid :" + vcovlst[j].Pln_custorder_ver.Partfamilyid + "\r\nOemordernr :" + vcovlst[j].Pln_custorder_ver.Oemordernr - mail.Status = "waiting" - mail.Body = body - mail.Subject = "Reorder的消息的更新" - mail.Name = projtablst[i].From_email - mail.Tomail = projtablst[i].Tod_error_to_recievers - mail.Host = host - mail.Password = projtablst[i].From_pwd - mail.Username = projtablst[i].From_email - err = mail.Add() - if err != nil { + mailsubject = "客户订单取消" + mailbody = "项目号: " + todProj.Projectid + "\r\n客户订单号: " + bl_co.Oemordernr + "\r\n提示信息 : 客户订单接收到+2请求,取消!" + if err = SendTodErrorEmail(projtablst[i], mailsubject, mailbody); err != nil { glog.InfoExtln("发送邮件", "err is :", err) } } @@ -708,3 +636,69 @@ func ReadTodXlsx() { time.Sleep(10 * time.Second) } } + +// 发送TOD解析错误或警示邮件 +func SendTodErrorEmail(projtab db.Me_project, subject, errinfo string)(err error){ + var mail db.Sendmailtab + + mail.Status = "waiting" + mail.Body = errinfo + mail.Subject = projtab.Projectid + "-->" + subject + mail.Name = projtab.From_email + mail.Tomail = projtab.Tod_error_to_recievers + mail.Host = projtab.Emailserver_host + ":" + common.ValueToString(projtab.Emailserver_port, "") + mail.Password = projtab.From_pwd + mail.Username = projtab.From_email + err = mail.Add() + if err != nil { + glog.InfoExtln("发送邮件", "err is :", err) + } + return +} + +// 为项目指定的供应组发送SEQ+1的预警邮件(基于指定供应组) +func AlertForCustOrderUpdateTodByRule(projtab db.Me_project, bl_co service.BL_CustOrder, vcov db.VCustorderVer ){ + var( + err error + idx,seqtype,k int + todrule,v,mailsubject,mailbody string + kvlst,rulelst []string + sgdict map[string]string + exist bool + ) + + // 获取项目指定的TOD邮件规则 + if todrule, err = service.GetSysStringParameter(2, bl_co.Projnr, "TOD_EMAIL_RULE"); err != nil { + return + } + kvlst = strings.Split(todrule, ";") + if len(kvlst) > 0 { + for idx, _ = range kvlst { + rulelst = strings.Split(kvlst[idx], ":") + // 蒋rulest[0]转化为整型与bl_co.SeqType 比较,如果相等,则比较1开始的供应组 + seqtype = common.ValueToInt(rulelst[0], 0) + if seqtype == 1 { + sgdict = make(map[string]string) //去除第一个元素 + for k, v = range rulelst { + if k > 0 { + sgdict[v] = v + } + } + // 遍历客户订单的 Pln_custorder_ver_partlst 获取供应组 + exist = false + for _, jdv := range vcov.Pln_custorder_ver.Partlst { + if _, exist = sgdict[jdv.Supplygroupid]; exist { + break + } + } + if exist { + mailsubject = "SEQ+1提醒" + mailbody = "项目号: " + bl_co.Custordertab.Projnr + "\r\n客户订单号: " + bl_co.Oemordernr + "\r\n提示信息 : 客户订单接收到+1请求,取消!" + if err = SendTodErrorEmail(projtab, mailsubject, mailbody); err != nil { + glog.InfoExtln("发送邮件", "err is :", err) + } + } + } + } + } +}