diff --git a/calloff/Callofftask.go b/calloff/Callofftask.go index b7404b8..bf25a54 100644 --- a/calloff/Callofftask.go +++ b/calloff/Callofftask.go @@ -1,8 +1,11 @@ package calloff import ( + "encoding/json" + "encoding/xml" "fmt" "github.com/go-xorm/xorm" + "io" "io/ioutil" "leit.com/leit_seat_aps/common" "leit.com/leit_seat_aps/db" @@ -11,6 +14,8 @@ import ( "leit.com/leit_seat_aps/service" "os" "regexp" + "strconv" + "strings" "time" ) @@ -554,6 +559,7 @@ func ParseCalloffOrder() { session.Close() etcd.G_jobLock.UnLock() time.Sleep(10 * time.Millisecond) + } } @@ -699,12 +705,127 @@ func GenerateDeliveryCar() { } } + fmt.Println("---------------------生成xmL_msg1") + //APS向WMS传递发运包装信息 + var o = PlnCalloffdataLandingXml{} + o.Packorderid = pkotablst[j].Packorderid + o.Packtemplateid = pkotablst[j].Packtemplateid + o.Projnr = pkotablst[j].Projnr + o.Status = strconv.Itoa(pkotablst[j].Status) + o.Shortpack = strconv.Itoa(pkotablst[j].Shortpack) + o.Orderinfo = pkotablst[j].Orderinfo + o.Boxsn = pkotablst[j].Boxsn + o.Packtypeid = pkotablst[j].Packtypeid + o.Printerid = pkotablst[j].Printerid + o.Templatefile = pkotablst[j].Templatefile + o.Planqty = strconv.Itoa(pkotablst[j].Planqty) + o.Actqty = strconv.Itoa(pkotablst[j].Actqty) + for _, info := range pkotablst[j].Itemlst{ + o.Details = append(o.Details, Pln_calloffdata_landing_Xml{ + Packorderid :info.Packorderid, + Pos :common.ValueToString(info.Pos,""), + Poscode :info.Poscode, + Oemseq : common.ValueToString(info.Oemseq, ""), + Checkseq :common.ValueToString(info.Seq,""), + Supplygroupid : info.Supplygroupid, + Workordernr : info.Workordernr, + Status : common.ValueToString(info.Status,""), + Planqty :common.ValueToString(info.Planqty,""), + Actqty :common.ValueToString(info.Actqty,""), + }) + } + + jsonBytes, err := json.Marshal(o) + if err != nil { + fmt.Println(err) + } + bl_xmlmsg := service.BL_Xmlmsg{MsgType: common.MSG_TYPE_SHIP, Msg: string(jsonBytes)} + fmt.Println("---------------------生成xmL_msg2") + if err = bl_xmlmsg.Create(session); err != nil { + fmt.Println(err) + } + err = session.Commit() if err != nil { + fmt.Println(err) return } } } + time.Sleep(10 * time.Second) } } + +func CallOffXmlTick(){ + timer := time.NewTicker(60 * time.Second) + for { + select { + case <-timer.C: + Xml_msg := db.Xml_msg{} + if xmllst, err := Xml_msg.GetUnXmlMessages(); err != nil { + glog.InfoExtln("Calloff包装单", "解析发运单消息失败: ", err) + }else{ + for _, xmlInfo := range xmllst{ + var xmlStruct PlnCalloffdataLandingXml + json.Unmarshal([]byte(xmlInfo.Msg), &xmlStruct) + + resXML, err := xml.MarshalIndent(xmlStruct, " ", " ") + if err != nil { + glog.InfoExtln("Calloff包装单", "Failed to create xml due to :",err) + } + timeS := time.Now().Format("20060102150405.999") + fileName := strings.Trim(timeS,".") + f, err := os.Create("./OutData/"+fileName +".xml") + if err != nil { + glog.InfoExtln("Calloff包装单", "Failed to create xml due to :",err) + } + io.WriteString(f, xml.Header) + io.WriteString(f, string(resXML)) + + Xml_msg.Msgid = xmlInfo.Msgid + Xml_msg.Status = common.MSG_STATUS_FINISHED + Xml_msg.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") + Xml_msg.Lastuser = "service" + if err = Xml_msg.UpdateFieldsWithoutSession("status,lastmodif,lastuser"); err != nil { + glog.InfoExtln("Calloff包装单", "Failed to create xml due to :",err) + } + } + } + } + } +} + + +type PlnCalloffdataLandingXml struct { + XMLName xml.Name `xml:"Content"` + Packorderid string `xml:"packorderid,attr"` + Packtemplateid string `xml:"packtemplateid,attr"` + Projnr string `xml:"projnr,attr"` + Status string `xml:"status,attr"` + Shortpack string `xml:"shortpack,attr"` + Orderinfo string `xml:"orderinfo,attr"` + Boxsn string `xml:"boxsn,attr"` + Packtypeid string `xml:"packtypeid,attr"` + Printerid string `xml:"printerid,attr"` + Templatefile string `xml:"templatefile,attr"` + Planqty string `xml:"planqty,attr"` + Actqty string `xml:"actqty,attr"` + + Details []Pln_calloffdata_landing_Xml `xml:"Details"` + Description string `xml:",innerxml"` +} + +type Pln_calloffdata_landing_Xml struct { + XMLName xml.Name `xml:"Details"` + Packorderid string `xml:"packorderid,attr"` + Pos string `xml:"pos,attr"` + Poscode string `xml:"poscode,attr"` + Oemseq string `xml:"oemseq,attr"` + Checkseq string `xml:"checkseq,attr"` + Supplygroupid string `xml:"supplygroupid,attr"` + Workordernr string `xml:"workordernr,attr"` + Status string `xml:"status,attr"` + Planqty string `xml:"planqty,attr"` + Actqty string `xml:"actqty,attr"` +} diff --git a/cmd/calloff/main.go b/cmd/calloff/main.go index 94643d6..029b112 100644 --- a/cmd/calloff/main.go +++ b/cmd/calloff/main.go @@ -145,4 +145,7 @@ func imain() { // 将26下达的包装单加载到发运车中,系统根据实际加载情况 calloff.GenerateDeliveryCar() + + // 异步监听包装单xml_msg,生成xml + go calloff.CallOffXmlTick() } diff --git a/db/Xml_msg.go b/db/Xml_msg.go new file mode 100644 index 0000000..6bf1723 --- /dev/null +++ b/db/Xml_msg.go @@ -0,0 +1,125 @@ +package db + +import ( + "errors" + "github.com/go-xorm/xorm" + "leit.com/leit_seat_aps/common" + "xorm.io/core" +) + +//订单消息表 +type Xml_msg struct { + Finr int `xorm:"pk"` + Msgid string `xorm:"pk"` + Msgtype string + Status int + Msg string + Lastmodif string + Lastuser string + Credatuz string +} + +func (t *Xml_msg) Clipped() { + common.TrimStruct(t, *t) +} +func (t *Xml_msg) TableName() string { + return "xml_msg" +} + +//增 +func (t *Xml_msg) Add() error { + e := G_DbEngine + xmlmsgtab := new(Xml_msg) + affw, err := e.Table("xml_msg").ID(core.PK{G_FINR, t.Msgid}).Count(xmlmsgtab) + if err != nil { + return err + } + if affw > 0 { + return errors.New("数据已经存在!") + } + _, err = e.Table("xml_msg").Insert(t) + + if err != nil { + return err + } + return nil +} + +//增 +func (t *Xml_msg) Insert(session *xorm.Session) error { + xmlmsgtab := new(Xml_msg) + affw, err := session.Table("xml_msg").ID(core.PK{G_FINR, t.Msgid}).Count(xmlmsgtab) + if err != nil { + return err + } + if affw > 0 { + return errors.New("数据已经存在!") + } + _, err = session.Table("xml_msg").Insert(t) + + if err != nil { + return err + } + return nil +} + +//删 +func (t *Xml_msg) Del() bool { + e := G_DbEngine + _, err := e.ID(core.PK{G_FINR, t.Msgid}).Delete(&Xml_msg{}) + if err != nil { + return false + } + return true +} + +//改 +func (t *Xml_msg) Update() bool { + e := G_DbEngine + _, err := e.ID(core.PK{G_FINR, t.Msgid}).Update(t) + if err != nil { + return false + } + return true +} + +//更新指定字段 +func (t *Xml_msg) UpdateFields(session *xorm.Session, fields string) (err error) { + if _, err = session.Table("xml_msg").ID(core.PK{G_FINR, t.Msgid}).Cols(fields).Update(t); err != nil { + return + } + return +} + +//更新指定字段 +func (t *Xml_msg) UpdateFieldsWithoutSession(fields string) (err error) { + e := G_DbEngine + if _, err = e.Table("xml_msg").ID(core.PK{G_FINR, t.Msgid}).Cols(fields).Update(t); err != nil { + return + } + return +} + +//查 +func (t *Xml_msg) SelectOne() (data Xml_msg, err error) { + e := G_DbEngine + _, err = e.ID(core.PK{G_FINR, t.Msgid}).Get(&data) + if err != nil { + return data, err + } + return data, nil +} + +//获取没有生成xml的消息 +func (t *Xml_msg) GetUnXmlMessages() (datalst []Xml_msg, err error) { + var i int + + e := G_DbEngine + if err = e.Where("finr = ? and msgtype = ? and status <= ?", G_FINR, common.MSG_TYPE_SHIP, common.MSG_STATUS_PLAN).OrderBy("credatuz").Find(&datalst); err != nil { + return + } + for i = 0; i < len(datalst); i++ { + datalst[i].Clipped() + } + return +} diff --git a/service/Xmlmsg.go b/service/Xmlmsg.go new file mode 100644 index 0000000..462c46c --- /dev/null +++ b/service/Xmlmsg.go @@ -0,0 +1,61 @@ +package service + +import ( + "github.com/go-xorm/xorm" + "leit.com/leit_seat_aps/common" + "leit.com/leit_seat_aps/db" + "time" +) + +// 订单消息服务,包括拣料单、包装单和发运单 +type BL_Xmlmsg struct { + MsgType string // 消息类型,PICK 拣料单 PACK 包装单 SHIP 发运单 + Msg string + Status int + Xmlmsgtab db.Xml_msg +} + +// 创建订单消息 +func (bl_xmlmsg *BL_Xmlmsg) Create(session *xorm.Session) (err error) { + var ( + //ordsn, prnsn string + msgid string + xmlmsgtab db.Xml_msg + ) + + //// 获取拣料单序列号 + //if ordsn, err = GetSysStringParameter(1, "*", "ORDERMSG_SN"); err != nil { + // return + //} + //if strings.TrimSpace(ordsn) == "" { + // ordsn = "ORDERMSG" // 默认流水ID + //} + // + //// 获取打印表单头流水号 + //if prnsn, err = GetSysStringParameter(1, "*", "PRNSHEETHEAD_SN"); err != nil { + // return + //} + //if strings.TrimSpace(prnsn) == "" { + // prnsn = "PRNSHEETHEAD" // 默认流水ID + //} + + // 获取消息号 + if msgid, err = SN_SyncGetNextSnr(""); err != nil { + return + } + + // 创建订单消息并返回 + xmlmsgtab = db.Xml_msg{} + xmlmsgtab.Finr = db.G_FINR + xmlmsgtab.Msgid = msgid + xmlmsgtab.Msgtype = bl_xmlmsg.MsgType + xmlmsgtab.Status = common.MSG_STATUS_PLAN + xmlmsgtab.Msg = bl_xmlmsg.Msg + xmlmsgtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") + xmlmsgtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") + xmlmsgtab.Lastuser = "service" + if err = xmlmsgtab.Insert(session); err != nil { + return + } + return +} \ No newline at end of file