SJA APS后端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

307 lines
9.9 KiB

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
}