package service import ( "errors" "fmt" "github.com/go-xorm/xorm" "leit.com/leit_seat_aps/common" "leit.com/leit_seat_aps/db" "strconv" "strings" "time" ) // MES消息服务,包括生产包装单 type BL_Mesmsg struct { Msgid string MsgType string // 消息类型,PACK 包装单 MsgObjid string // 消息对象ID MsgEvent string // 消息事件 MsgiPara1 int MsgiPara2 int MsgcPara1 string MsgcPara2 string Msgtab db.Mes_msg } type BL_MesMsgParser struct { PackTmpDict map[string]BL_ProdPackTmp // 生产包装单模板 } // 创建生产包装单消息 func (bl_msg *BL_Mesmsg) CreateProdPackMsg(session *xorm.Session) (err error) { var ( packsn, prnsn string msgid string msgtab db.Mes_msg ) // 获取拣料单序列号 if packsn, err = GetSysStringParameter(1, "*", "PRODPACKMSG_SN"); err != nil { return } if strings.TrimSpace(packsn) == "" { packsn = "PRODPACKMSG" // 默认流水ID } // 获取打印表单头流水号 if prnsn, err = GetSysStringParameter(1, "*", "PRNSHEETHEAD_SN"); err != nil { return } if strings.TrimSpace(prnsn) == "" { prnsn = "PRNSHEETHEAD" // 默认流水ID } // 获取消息号 if msgid, err = SN_GetNextSnrBySession(strings.TrimSpace(packsn), session); err != nil { return } // 创建订单消息并返回 msgtab = db.Mes_msg{} msgtab.Finr = db.G_FINR msgtab.Msgid = msgid msgtab.Status = common.MESMSG_STATUS_PLAN msgtab.Printheadsn = prnsn msgtab.Msgtype = bl_msg.MsgType msgtab.Msgobjid = bl_msg.MsgObjid msgtab.Msgevent = bl_msg.MsgEvent msgtab.Msg_cpara1 = bl_msg.MsgcPara1 msgtab.Msg_cpara2 = bl_msg.MsgcPara2 msgtab.Msg_ipara1 = bl_msg.MsgiPara1 msgtab.Msg_ipara2 = bl_msg.MsgiPara2 msgtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") msgtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") msgtab.Lastuser = "mes_service" if err = msgtab.Insert(session); err != nil { return } return } // 解析生产包装单生成打印数据 func (bl_msg *BL_Mesmsg) GeneratePrintDataForPackOrder(packordtab db.Prod_packorder, pe *BL_MESPrintEngine) (printheadtab db.Printheadtab, err error) { var ( bl_packtmp BL_ProdPackTmp printdetailtab db.Printdetailtab wotab db.Pln_workorder cotab db.Pln_custorder supplygroup db.Me_supplygroup printheadid, val, tmp, col string kv, varlst []string ok bool i, j, ibeg, iend, idx, istep, iloop, icopy, icopies int ) // 获取模板 if bl_packtmp, ok = pe.PackTmpDict[packordtab.Packtemplateid]; !ok { err = errors.New(fmt.Sprintf("无法获取生产包装单%s的包装模板%s,错误原因:%v",packordtab.Packorderid, packordtab.Packtemplateid, err)) return } // 如果打印多份 icopies = common.Max(bl_msg.Msgtab.Printcopies, bl_packtmp.Paktmpltab.Printqty, 1) for icopy = 0; icopy < icopies; icopy++ { // 获取打印头流水号 if strings.TrimSpace(bl_msg.Msgtab.Printheadsn) != "" { if printheadid, err = SN_GetNextSnr(strings.TrimSpace(bl_msg.Msgtab.Printheadsn)); err != nil { return } } else { if printheadid, err = SN_GetNextSnr("PRNSHEETHEAD"); err != nil { return } } // 创建打印头 printheadtab = db.Printheadtab{} printheadtab.Finr = db.G_FINR printheadtab.Printheadid = printheadid printheadtab.Status = common.PRN_HEAD_STATUS_NEW printheadtab.Printerid = bl_packtmp.Paktmpltab.Printerid printheadtab.Printobjtype = common.MESMSG_TYPE_PACK printheadtab.Printobjid = packordtab.Packorderid printheadtab.Printfiletype = "EXCEL" printheadtab.Templatefile = bl_packtmp.Paktmpltab.Templatefile printheadtab.Orientation = bl_packtmp.Paktmpltab.Orientation printheadtab.Printcopies = common.Max(bl_msg.Msgtab.Printcopies, bl_packtmp.Paktmpltab.Printqty, 1) printheadtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") printheadtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") printheadtab.Lastuser = "mes_service" // 遍历打印设置条码 idx = 1 detailmap := make(map[string]string) for i = 0; i < len(bl_packtmp.Paktmpltab.Printlst); i++ { // 定义暂存数据的map bufdata := []interface{}{} bufdata = append(bufdata, packordtab) kvmap := common.StructToMap(bufdata) // 初始化打印明细数据对象 printdetailtab = db.Printdetailtab{ Finr: db.G_FINR, Printheadid: printheadid, Pos: idx, Varname: bl_packtmp.Paktmpltab.Printlst[i].Varname, Varpos: bl_packtmp.Paktmpltab.Printlst[i].Varpos} val = "" 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) 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: // 动态变量集 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 { continue } else { for j = 0; j < len(varlst); j++ { if tmp, ok = kvmap[varlst[j]]; ok { val = val + tmp } } } case common.PRN_VAR_TYP_LOOPVAR: // 循环变量 for j = 0; j < len(packordtab.Itemlst); j++ { //加载模板 bufdata = append(bufdata, bl_packtmp.Paktmpltab) // 将拣料单行数据写入缓存数据 bufdata = append(bufdata, packordtab.Itemlst[j]) wotab = db.Pln_workorder{Finr: db.G_FINR, Workordernr: packordtab.Itemlst[j].Workordernr} if wotab, err = wotab.SelectOne(); err != nil { return } bufdata = append(bufdata, wotab) supplygroup = db.Me_supplygroup{Finr: db.G_FINR, Supplygroupid: wotab.Supplygroupid} if supplygroup, err = supplygroup.SelectOne(); err != nil { return } bufdata = append(bufdata, supplygroup) 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) if common.ValueIsEmpty(packordtab.Itemlst[j].Workordernr) { kvmap["pln_workorder.oemseq"] = "" } /**for k, v := range kvmap { fmt.Println("KV value:", k, "==>", v) }**/ // 获取起始坐标 kv = strings.Split(bl_packtmp.Paktmpltab.Printlst[i].Varpos, ":") if len(kv) >= 3 { ibeg, _ = strconv.Atoi(kv[1]) iend, _ = strconv.Atoi(kv[2]) } if len(kv) >= 4 { istep, _ = strconv.Atoi(kv[3]) } else { istep = 0 } if j > (iend - ibeg) { if istep <= 0 { break } else { iloop = (j) / (iend - ibeg + 1) col = common.AddExcelColLen(kv[0], istep*iloop) + strconv.Itoa(ibeg+j-iloop*(iend-ibeg+1)) } } else { col = kv[0] + strconv.Itoa(ibeg+j) } printdetailtab.Varpos = col if val, ok = kvmap[bl_packtmp.Paktmpltab.Printlst[i].Varvalue]; !ok { val = "" } if val, err = GetValueByPicture(val, bl_packtmp.Paktmpltab.Printlst[i].Picture, bl_packtmp.Paktmpltab.Printlst[i].Varpos); err != nil { return } printdetailtab.Pos = idx printdetailtab.Varvalue = val printdetailtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") printdetailtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") printdetailtab.Lastuser = "mes_service" printheadtab.Itemlst = append(printheadtab.Itemlst, printdetailtab) idx++ } continue 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 } printdetailtab.Varvalue = val printdetailtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") printdetailtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") printdetailtab.Lastuser = "mes_service" printheadtab.Itemlst = append(printheadtab.Itemlst, printdetailtab) varname := strings.TrimSpace(bl_packtmp.Paktmpltab.Printlst[i].Varname) detailmap[varname] = val idx++ } } return } // 关闭订单消息 func (bl_msg *BL_Mesmsg) Close() (err error) { bl_msg.Msgtab.Status = common.MESMSG_STATUS_FINISHED bl_msg.Msgtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") bl_msg.Msgtab.Lastuser = "mes_service" if err = bl_msg.Msgtab.UpdateFieldsWithoutSession("status,lastmodif,lastuser"); err != nil { return } return } // 挂起订单消息 func (bl_msg *BL_Mesmsg) Pending(errinfo string) (err error) { bl_msg.Msgtab.Status = common.MSG_STATUS_PENDING bl_msg.Msgtab.Errinfo = errinfo bl_msg.Msgtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") bl_msg.Msgtab.Lastuser = "mes_service" if err = bl_msg.Msgtab.UpdateFieldsWithoutSession("status,errinfo,lastmodif,lastuser"); err != nil { return } return }