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
|
|
}
|
|
|