diff --git a/cmd/msg/main.go b/cmd/msg/main.go index be4eb3f..1dbda60 100644 --- a/cmd/msg/main.go +++ b/cmd/msg/main.go @@ -110,6 +110,15 @@ func imain() { return } + //初始化数据库 + salvestring := fmt.Sprintf("server=%s;user id=%s;password=%s;database=%s;port=%d;encrypt=disable", + conf.SalveServer, conf.SalveUser, conf.SalvePassword, conf.SalveDbName, conf.SalvePort) + + if err := db.InitMssqlSalveDb(salvestring); err != nil { + glog.Infoln("初始化数据库", "InitMssqlDb return fail") + return + } + //创建snretcd连接 //if err = etcd.InitSnrJobLock(); err != nil { // glog.Infoln("初始化EtCD连接", "InitSnrJobLock return fail") diff --git a/db/Pln_workorder.go b/db/Pln_workorder.go index 17e260e..3070636 100644 --- a/db/Pln_workorder.go +++ b/db/Pln_workorder.go @@ -471,8 +471,8 @@ func (t *Pln_workorder) GetLineProjectUnfinishedTaskWorkorders(projnr string, li func (t *Pln_workorder) GetLineProjectUnfinishedTaskWorkordersBySwet(projnr string, lineid string, qty int) (wotabs []Pln_workorder, err error) { e := G_DbEngine - if err = e.Where("finr = ? and projnr = ? and worklineid = ? and status = ?", - G_FINR, projnr, lineid, common.WO_STATUS_PLANNED).Asc("preschedseq", "supplygroupid").Limit(qty).Find(&wotabs); err != nil { + if err = e.Where("finr = ? and projnr = ? and worklineid = ? and status = ? and oemseq < ?", + G_FINR, projnr, lineid, common.WO_STATUS_PLANNED, 9999999999).Asc("preschedseq", "supplygroupid").Limit(qty).Find(&wotabs); err != nil { return } diff --git a/db/Printheadtab.go b/db/Printheadtab.go index 5b222e3..7024474 100644 --- a/db/Printheadtab.go +++ b/db/Printheadtab.go @@ -71,6 +71,24 @@ func (t *Printheadtab) Insert(session *xorm.Session) error { return nil } +//增 +func (t *Printheadtab) Insertlab(session *xorm.Session) error { + printheadtab := new(Printheadtab) + affw, err := session.Table("printheadtab").ID(core.PK{G_FINR, t.Printheadid}).Count(printheadtab) + if err != nil { + return err + } + if affw > 0 { + return errors.New("数据已经存在!") + } + _, err = session.Table("printheadtab").Insert(t) + + if err != nil { + return err + } + return nil +} + //删 func (t *Printheadtab) Del() bool { e := G_DbEngine diff --git a/db/Printitemtab.go b/db/Printitemtab.go new file mode 100644 index 0000000..470c82e --- /dev/null +++ b/db/Printitemtab.go @@ -0,0 +1,47 @@ +package db + +import ( + "github.com/go-xorm/xorm" + "leit.com/leit_seat_aps/common" +) + +//打印记录明细表 +type Printitem struct { + Finr int `xorm:"pk"` + Printheadid string `xorm:"pk"` + Detail string + Lastmodif string + Lastuser string + Credatuz string +} + +//包装单 +type PackPrintItem struct { + HeadData map[string]interface{} `json:"HeadData"` + DetailData []map[string]interface{} `json:"DetailData"` +} + +//减料单 +type PickPrintItem struct { + HeadData map[string]interface{} `json:"HeadData"` + Color []string `json:"Color"` + PartIds []string `json:"PartIds"` + DetailData []map[string]interface{} `json:"DetailData"` +} + +func (t *Printitem) Clipped() { + common.TrimStruct(t, *t) +} +func (t *Printitem) TableName() string { + return "printitem" +} + +//增 +func (t *Printitem) Insertlab(session *xorm.Session) error { + _, err := session.Table("printitem").Insert(t) + + if err != nil { + return err + } + return nil +} diff --git a/msg/Msgparser.go b/msg/Msgparser.go index bed8afd..8b821ee 100644 --- a/msg/Msgparser.go +++ b/msg/Msgparser.go @@ -30,6 +30,7 @@ func ParseOpenPrintMsg(pe *service.BL_PrintEngine) (err error) { i int msgtypes []string session *xorm.Session + salvesession *xorm.Session ) ordmsgtab = db.Order_msg{} @@ -56,6 +57,7 @@ func ParseOpenPrintMsg(pe *service.BL_PrintEngine) (err error) { if err = session.Begin(); err != nil { return } + if err = bl_ordmsg.GeneratePrintDataForPickOrder(session, pickordtab, pe); err != nil { session.Rollback() session.Close() @@ -87,9 +89,39 @@ func ParseOpenPrintMsg(pe *service.BL_PrintEngine) (err error) { glog.InfoExtln("Msg解析", "解析打印消息失败:", err) return } - if err = bl_ordmsg.GeneratePrintDataForPackOrder(session, packordtab, pe); err != nil { + + salvesession = db.G_DbSalve.NewSession() + defer salvesession.Close() + if err = salvesession.Begin(); err != nil { + return + } + + //开启debug + db.G_DbSalve.ShowSQL(true) + err = bl_ordmsg.GeneratePrintDataForPackOrderToJson(session,salvesession, packordtab, pe) + + if err !=nil{ + glog.InfoExtln("Msg解析", "解析打印消息失败:", err) + session.Rollback() session.Close() + + salvesession.Rollback() + salvesession.Close() + // 更新订单消息的出错状态和出错消息 + if err = bl_ordmsg.Pending(err.Error()); err != nil { + glog.InfoExtln("Msg解析", "解析打印消息失败:", err) + return + } + } + + if err = bl_ordmsg.GeneratePrintDataForPackOrder(session,packordtab, pe); err != nil { + glog.InfoExtln("Msg解析", "解析打印消息失败:", err) + session.Rollback() + session.Close() + + salvesession.Rollback() + salvesession.Close() // 更新订单消息的出错状态和出错消息 if err = bl_ordmsg.Pending(err.Error()); err != nil { glog.InfoExtln("Msg解析", "解析打印消息失败:", err) @@ -98,6 +130,9 @@ func ParseOpenPrintMsg(pe *service.BL_PrintEngine) (err error) { } else { session.Commit() session.Close() + + salvesession.Commit() + salvesession.Close() // 关闭订单消息 if err = bl_ordmsg.Close(); err != nil { glog.InfoExtln("Msg解析", "解析打印消息失败:", err) @@ -328,7 +363,7 @@ func GenAsnFileForShipOrderByPartFamily(asnardpf *ASN_ARD_PF, shipordtab db.Jit_ session *xorm.Session bl_asnmsg service.BL_Ordmsg kvmap, binmap map[string]string - key,val string + key, val string ok bool ) @@ -444,16 +479,16 @@ func GenAsnFileForShipOrderByPartFamily(asnardpf *ASN_ARD_PF, shipordtab db.Jit_ } else { bbaasnitemtab.Calloffnr = vdata.Pln_custorder.Calloffnr } - bbaasnitemtab.Modelcode = vdata.Pln_custorder.Projnr - bbaasnitemtab.Oemordernr = vdata.Pln_custorder.Oemordernr - bbaasnitemtab.Partfamilyid = asnardpf.Pfid + bbaasnitemtab.Modelcode = vdata.Pln_custorder.Projnr + bbaasnitemtab.Oemordernr = vdata.Pln_custorder.Oemordernr + bbaasnitemtab.Partfamilyid = asnardpf.Pfid bbaasnitemtab.Supplygroupid = vdata.Pln_workorder.Supplygroupid - bbaasnitemtab.Packorderid = vdata.Jit_packorder.Packorderid - bbaasnitemtab.Swet = vdata.Pln_custorder.Calloffswet - bbaasnitemtab.Binnr = vdata.Jit_packorder.Boxsn - bbaasnitemtab.Lastuser = "bbaasn_service" - bbaasnitemtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") - bbaasnitemtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") + bbaasnitemtab.Packorderid = vdata.Jit_packorder.Packorderid + bbaasnitemtab.Swet = vdata.Pln_custorder.Calloffswet + bbaasnitemtab.Binnr = vdata.Jit_packorder.Boxsn + bbaasnitemtab.Lastuser = "bbaasn_service" + bbaasnitemtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") + bbaasnitemtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") bbaasntab.Itemlst = append(bbaasntab.Itemlst, bbaasnitemtab) // 统计包装数 diff --git a/service/Ordmsg.go b/service/Ordmsg.go index e71773a..1d63016 100644 --- a/service/Ordmsg.go +++ b/service/Ordmsg.go @@ -1,6 +1,7 @@ package service import ( + "encoding/json" "fmt" "github.com/go-xorm/xorm" "leit.com/leit_seat_aps/common" @@ -331,6 +332,7 @@ func (bl_ordmsg *BL_Ordmsg) GeneratePrintDataForPickOrder(session *xorm.Session, printdetailtab.Finr = db.G_FINR printdetailtab.Printheadid = printheadid printdetailtab.Varname = bl_picktmp.Picktemplatetab.Printlst[j].Varname + switch bl_picktmp.Picktemplatetab.Printlst[j].Vartype { case common.PRN_VAR_TYP_2DCOL: // 二维表列变量 // 获取拣料单项额外的内存数据,包括生产订单、客户订单和属性 @@ -663,9 +665,10 @@ func (bl_ordmsg *BL_Ordmsg) GeneratePrintDataForPackOrder(session *xorm.Session, if err = printheadtab.Insert(session); err != nil { return } + // 遍历打印设置条码 idx = 1 - detailmap := make(map[string]string) + for i = 0; i < len(bl_packtmp.Paktmpltab.Printlst); i++ { // 定义暂存数据的map bufdata := []interface{}{} @@ -678,9 +681,10 @@ func (bl_ordmsg *BL_Ordmsg) GeneratePrintDataForPackOrder(session *xorm.Session, Pos: idx, Varname: bl_packtmp.Paktmpltab.Printlst[i].Varname, Varpos: bl_packtmp.Paktmpltab.Printlst[i].Varpos} + val = "" - if len(packordtab.Itemlst) == 0{ - glog.InfoExtln("packordtab","packordtab.orderid",packordtab.Packorderid) + if len(packordtab.Itemlst) == 0 { + glog.InfoExtln("packordtab", "packordtab.orderid", packordtab.Packorderid) continue } if packordtab.Itemlst[0].Workordernr != "" { @@ -705,11 +709,6 @@ func (bl_ordmsg *BL_Ordmsg) GeneratePrintDataForPackOrder(session *xorm.Session, val = "" } case common.PRN_VAR_TYP_VARSET: // 动态变量集 - for k, v := range detailmap { - key := strings.TrimSpace(k) - value := strings.TrimSpace(v) - kvmap[key] = value - } // 获取变量集 varlst = strings.Split(bl_packtmp.Paktmpltab.Printlst[i].Varvalue, ";") if len(varlst) <= 0 { @@ -722,6 +721,7 @@ func (bl_ordmsg *BL_Ordmsg) GeneratePrintDataForPackOrder(session *xorm.Session, } } case common.PRN_VAR_TYP_LOOPVAR: // 循环变量 + for j = 0; j < len(packordtab.Itemlst); j++ { //加载模板 bufdata = append(bufdata, bl_packtmp.Paktmpltab) @@ -785,8 +785,10 @@ func (bl_ordmsg *BL_Ordmsg) GeneratePrintDataForPackOrder(session *xorm.Session, if err = printdetailtab.Insert(session); err != nil { return } + idx++ } + continue case common.PRN_VAR_TYP_SYSVAR: // 系统参数2 @@ -814,14 +816,205 @@ func (bl_ordmsg *BL_Ordmsg) GeneratePrintDataForPackOrder(session *xorm.Session, if err = printdetailtab.Insert(session); err != nil { return } - varname := strings.TrimSpace(bl_packtmp.Paktmpltab.Printlst[i].Varname) - detailmap[varname] = val idx++ } } return } +// 为包装单生成打印数据 +func (bl_ordmsg *BL_Ordmsg) GeneratePrintDataForPackOrderToJson(session *xorm.Session, salvesession *xorm.Session, packordtab db.Jit_packorder, pe *BL_PrintEngine) (err error) { + var ( + bl_packtmp BL_Package + salveprintheadtab db.Printheadtab + printitem db.Printitem + wotab db.Pln_workorder + cotab db.Pln_custorder + supplygroup db.Me_supplygroup + printheadid, val, tmp string + varlst []string + ok bool + i, j, icopy, icopies int + ) + + // 获取模板 + if bl_packtmp, ok = pe.PackTmpDict[packordtab.Packtemplateid]; !ok { + return + } + // 如果打印多份 + icopies = common.Max(bl_ordmsg.Ordmsgtab.Printcopies, bl_packtmp.Paktmpltab.Printqty, 1) + for icopy = 0; icopy < icopies; icopy++ { + // 获取打印头流水号 + if strings.TrimSpace(bl_ordmsg.Ordmsgtab.Printheadsn) != "" { + if printheadid, err = SN_GetNextSnrBySession(strings.TrimSpace(bl_ordmsg.Ordmsgtab.Printheadsn), session); err != nil { + return + } + } else { + if printheadid, err = SN_GetNextSnrBySession("PRNSHEETHEAD", session); err != nil { + return + } + } + // 创建打印头 + salveprintheadtab = db.Printheadtab{} + salveprintheadtab.Finr = db.G_FINR + salveprintheadtab.Printheadid = printheadid + salveprintheadtab.Status = common.PRN_HEAD_STATUS_NEW + salveprintheadtab.Printerid = bl_packtmp.Paktmpltab.Printerid + salveprintheadtab.Printobjtype = common.MSG_TYPE_PACK + salveprintheadtab.Printobjid = packordtab.Packorderid + salveprintheadtab.Printfiletype = "EXCEL" + if strings.TrimSpace(packordtab.Templatefile) == "" { + salveprintheadtab.Templatefile = bl_packtmp.Paktmpltab.Templatefile + } else { + salveprintheadtab.Templatefile = packordtab.Templatefile + } + salveprintheadtab.Orientation = bl_packtmp.Paktmpltab.Orientation + salveprintheadtab.Printcopies = common.Max(bl_ordmsg.Ordmsgtab.Printcopies, bl_packtmp.Paktmpltab.Printqty, 1) + salveprintheadtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") + salveprintheadtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") + salveprintheadtab.Lastuser = "service" + if err = salveprintheadtab.Insert(salvesession); err != nil { + return + } + + printitem = db.Printitem{ + Finr: db.G_FINR, + Printheadid: printheadid} + + dataMap := db.PackPrintItem{} + headMap := make(map[string]interface{}) + detailMap := make([]map[string]interface{}, 0) + + //获取常量设置信息 //构建headMap + for i = 0; i < len(bl_packtmp.Paktmpltab.Printlst); i++ { + + if bl_packtmp.Paktmpltab.Printlst[i].Vartype == common.PRN_VAR_TYP_LOOPVAR{ + continue + } + // 定义暂存数据的map + bufdata := []interface{}{} + bufdata = append(bufdata, packordtab) + kvmap := common.StructToMap(bufdata) + val = "" + if len(packordtab.Itemlst) == 0 { + glog.InfoExtln("packordtab", "packordtab.orderid", packordtab.Packorderid) + continue + } + if packordtab.Itemlst[0].Workordernr != "" { + wotab = db.Pln_workorder{Finr: db.G_FINR, Workordernr: packordtab.Itemlst[0].Workordernr} + if wotab, err = wotab.SelectOne(); err != nil { + return + } + bufdata = append(bufdata, wotab) + co := db.Pln_custorder{Finr: db.G_FINR, Custordernr: wotab.Custordernr} + if cotab, err = co.SelectOne(); err != nil { + return + } + bufdata = append(bufdata, cotab) + kvmap = common.StructToMap(bufdata) + } + switch bl_packtmp.Paktmpltab.Printlst[i].Vartype { + case common.PRN_VAR_TYP_VALUE: // 静态值 + val = bl_packtmp.Paktmpltab.Printlst[i].Varvalue + + case common.PRN_VAR_TYP_VARIABLE: // 动态变量 + if val, ok = kvmap[bl_packtmp.Paktmpltab.Printlst[i].Varvalue]; !ok { + val = "" + } + case common.PRN_VAR_TYP_VARSET: // 动态变量集 + // 获取变量集 + varlst = strings.Split(bl_packtmp.Paktmpltab.Printlst[i].Varvalue, ";") + if len(varlst) <= 0 { + continue + } else { + for j = 0; j < len(varlst); j++ { + if tmp, ok = kvmap[varlst[j]]; ok { + val = val + tmp + } + } + } + + case common.PRN_VAR_TYP_SYSVAR: // 系统参数2 + switch bl_packtmp.Paktmpltab.Printlst[i].Varvalue { + case "DATE()": + val = common.Date(time.Now().Unix(), "YYYYMMDD") + case "TIME()": + val = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") + case "COPY": + val = GetPrintSysCopyValue(icopy+1, bl_packtmp.Paktmpltab.Printlst[i].Picture) + } + + default: + continue + } + + if val, err = GetValueByPicture(val, bl_packtmp.Paktmpltab.Printlst[i].Picture, bl_packtmp.Paktmpltab.Printlst[i].Varpos); err != nil { + return + } + varname := strings.TrimSpace(bl_packtmp.Paktmpltab.Printlst[i].Varname) + headMap[varname] = val + } + + //构建detailMap + for j = 0; j < len(packordtab.Itemlst); j++ { + onedetailMap := make(map[string]interface{}) + + wotab = db.Pln_workorder{Finr: db.G_FINR, Workordernr: packordtab.Itemlst[j].Workordernr} + if wotab, err = wotab.SelectOne(); err != nil { + return + } + + glog.InfoExtln("pack打印消息", "wotab is:", wotab) + + supplygroup = db.Me_supplygroup{Finr: db.G_FINR, Supplygroupid: wotab.Supplygroupid} + if supplygroup, err = supplygroup.SelectOne(); err != nil { + return + } + + glog.InfoExtln("pack打印消息", "supplygroup is:", supplygroup) + + co := db.Pln_custorder{Finr: db.G_FINR, Custordernr: wotab.Custordernr} + if cotab, err = co.SelectOne(); err != nil { + return + } + + glog.InfoExtln("pack打印消息", "cotab is:", cotab) + + onedetailMap["pos"] = packordtab.Itemlst[j].Pos + onedetailMap["oemseq"] = common.ValueToInt(wotab.Oemseq,0) + if common.ValueIsEmpty(packordtab.Itemlst[j].Workordernr) { + onedetailMap["oemordernr"] = "" + } else { + onedetailMap["oemordernr"] = strings.TrimSpace(cotab.Oemordernr) + } + onedetailMap["description"] = strings.TrimSpace(supplygroup.Descr) + onedetailMap["swet"] = strings.TrimSpace(cotab.Calloffswet) + + fmt.Println(onedetailMap) + detailMap = append(detailMap, onedetailMap) + } + + dataMap.HeadData = headMap + dataMap.DetailData = detailMap + + fmt.Println(dataMap) + + glog.InfoExtln("pack打印消息", "dataMap is:", dataMap) + detailStrJson, _ := json.Marshal(dataMap) + printitem.Detail = string(detailStrJson) + + glog.InfoExtln("pack打印消息", "detailStrJson is:", detailStrJson) + + printitem.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") + printitem.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") + printitem.Lastuser = "service" + if err = printitem.Insertlab(salvesession); err != nil { + return + } + } + return +} + // 为发运单生成打印数据 func (bl_ordmsg *BL_Ordmsg) GeneratePrintDataForShipOrder(session *xorm.Session, shipordtab db.Jit_shiporder, pe *BL_PrintEngine) (err error) { var (