package service
|
|
|
|
import (
|
|
"errors"
|
|
"leit.com/leit_seat_aps/common"
|
|
"leit.com/leit_seat_aps/db"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type BL_PrintEngine struct {
|
|
PickingTmpDict map[string]BL_PickingTemplate // 拣料单模板
|
|
PackTmpDict map[string]BL_Package // 包装单模板
|
|
ShipTmpDict map[string]BL_Shipcar // 发运单模板
|
|
BbaasnTmpDict map[string]db.Jit_bbaasntemplate // BBA ASN 模板
|
|
AtcodDict map[int]db.Me_attribute // 属性列表
|
|
}
|
|
|
|
// 用于暂存2D表中行列KEY信息
|
|
type BL_2DSheet struct {
|
|
idxcol string // 索引列变量
|
|
colbeg string // 索引列起始值
|
|
colend string // 索引列结束值
|
|
idxrow string // 索引行变量
|
|
rowbeg int // 索引行起始值
|
|
rowend int // 索引行结束值
|
|
colkeylist map[string]BL_2DSheetKey
|
|
rowkeylist map[string]BL_2DSheetKey
|
|
colvarvallist map[string]string
|
|
rowvarvallist map[string]string
|
|
}
|
|
|
|
// 用于暂存2D表中行列及单元格数据
|
|
type BL_2DSheetKey struct {
|
|
keyval string // 索引值
|
|
rowpos int // 当前位置行
|
|
colpos string // 当前位置列
|
|
}
|
|
|
|
// 加载拣料单模板
|
|
func (pe *BL_PrintEngine) LoadPickingTemplates() (err error) {
|
|
var (
|
|
pktmptab db.Pln_picktemplate
|
|
pktmptablst []db.Pln_picktemplate
|
|
bl_pktmp BL_PickingTemplate
|
|
i, j, k int
|
|
)
|
|
|
|
// 初始化
|
|
pe.PickingTmpDict = make(map[string]BL_PickingTemplate)
|
|
pktmptab = db.Pln_picktemplate{}
|
|
|
|
// 加载拣料单模板
|
|
if pktmptablst, err = pktmptab.GetAllActive(); err != nil {
|
|
return
|
|
}
|
|
|
|
for i = 0; i < len(pktmptablst); i++ {
|
|
bl_pktmp = BL_PickingTemplate{}
|
|
bl_pktmp.TemplateId = pktmptablst[i].Picktemplateid
|
|
bl_pktmp.WorklineId = pktmptablst[i].Worklineid
|
|
bl_pktmp.PrinterId = pktmptablst[i].Printerid
|
|
bl_pktmp.Picktemplatetab = pktmptablst[i]
|
|
bl_pktmp.AssignAttrDict = make(map[int]db.Pln_picktemplate_attrlst)
|
|
bl_pktmp.AssignPartDict = make(map[string]db.Pln_picktemplate_itemlst)
|
|
|
|
for j = 0; j < len(pktmptablst[i].Attrlst); j++ {
|
|
bl_pktmp.AssignAttrDict[pktmptablst[i].Attrlst[j].Attrcode] = pktmptablst[i].Attrlst[j]
|
|
}
|
|
|
|
for k = 0; k < len(pktmptablst[i].Itemlst); k++ {
|
|
bl_pktmp.AssignPartDict[pktmptablst[i].Itemlst[k].Partid] = pktmptablst[i].Itemlst[k]
|
|
}
|
|
|
|
pe.PickingTmpDict[bl_pktmp.TemplateId] = bl_pktmp
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 加载发运包装模板
|
|
func (pe *BL_PrintEngine) LoadPackageTemplate() (err error) {
|
|
var (
|
|
paktmpltab db.Jit_packtemplate
|
|
paktmpltablst []db.Jit_packtemplate
|
|
bl_sp BL_Package
|
|
i int
|
|
)
|
|
|
|
// 初始化
|
|
pe.PackTmpDict = make(map[string]BL_Package)
|
|
paktmpltab = db.Jit_packtemplate{}
|
|
// 读取项目发运包装模板数据
|
|
if paktmpltablst, err = paktmpltab.GetAll(); err != nil {
|
|
return
|
|
}
|
|
|
|
for i = 0; i < len(paktmpltablst); i++ {
|
|
bl_sp = BL_Package{}
|
|
bl_sp.PackTmplId = paktmpltablst[i].Packtemplateid
|
|
bl_sp.Paktmpltab = paktmpltablst[i]
|
|
pe.PackTmpDict[bl_sp.PackTmplId] = bl_sp
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 加载发运车模板
|
|
func (pe *BL_PrintEngine) LoadShipCarTemplate() (err error) {
|
|
var (
|
|
cartmpltab db.Jit_shiptemplate
|
|
cartmpltablst []db.Jit_shiptemplate
|
|
bl_scar BL_Shipcar
|
|
i, j int
|
|
)
|
|
|
|
// 初始化
|
|
pe.ShipTmpDict = make(map[string]BL_Shipcar)
|
|
cartmpltab = db.Jit_shiptemplate{}
|
|
|
|
// 读取项目发运车模板数据
|
|
if cartmpltablst, err = cartmpltab.GetAll(); err != nil {
|
|
return
|
|
}
|
|
|
|
for i = 0; i < len(cartmpltablst); i++ {
|
|
bl_scar = BL_Shipcar{}
|
|
bl_scar.ShipTmplId = cartmpltablst[i].Shiptemplateid
|
|
bl_scar.Shipcartab = cartmpltablst[i]
|
|
bl_scar.Paktypdict = make(map[string]db.Jit_shiptemplate_itemlst)
|
|
for j = 0; j < len(cartmpltablst[i].Itemlst); j++ {
|
|
bl_scar.Paktypdict[cartmpltablst[i].Itemlst[j].Packtypeid] = cartmpltablst[i].Itemlst[j]
|
|
}
|
|
|
|
pe.ShipTmpDict[bl_scar.ShipTmplId] = bl_scar
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 加载零件属性
|
|
func (pe *BL_PrintEngine) LoadAttributes() (err error) {
|
|
var (
|
|
atcodtab db.Me_attribute
|
|
atcodlst []db.Me_attribute
|
|
i int
|
|
)
|
|
|
|
pe.AtcodDict = make(map[int]db.Me_attribute)
|
|
atcodtab = db.Me_attribute{}
|
|
if atcodlst, err = atcodtab.GetTypeAttributes(common.ATCOD_TYPE_PART); err != nil {
|
|
return
|
|
}
|
|
for i = 0; i < len(atcodlst); i++ {
|
|
pe.AtcodDict[atcodlst[i].Attrcode] = atcodlst[i]
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 加载BBA ASN模板
|
|
func (pe *BL_PrintEngine) LoadBbaasnTemplates() (err error) {
|
|
var (
|
|
bbaasntmptab db.Jit_bbaasntemplate
|
|
bbaasntmptablst []db.Jit_bbaasntemplate
|
|
i int
|
|
)
|
|
|
|
// 初始化
|
|
pe.BbaasnTmpDict = make(map[string]db.Jit_bbaasntemplate)
|
|
bbaasntmptab = db.Jit_bbaasntemplate{}
|
|
|
|
// 加载所有BBA ASN模板
|
|
if bbaasntmptablst, err = bbaasntmptab.GetAll(); err != nil {
|
|
return
|
|
}
|
|
|
|
for i = 0; i < len(bbaasntmptablst); i++ {
|
|
pe.BbaasnTmpDict[bbaasntmptablst[i].Asntemplateid] = bbaasntmptablst[i]
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 加载拣料单内存变量
|
|
func (pe *BL_PrintEngine) GetPickOrderItemAttributeData(pktmprinttab *db.Pln_picktemplate_printlst,
|
|
wotab *db.Pln_workorder) (atcodtab db.Me_attribute, atvaltab db.Me_attribute_valst) {
|
|
var (
|
|
kv []string
|
|
ipos, jpos int
|
|
ok bool
|
|
)
|
|
|
|
atcodtab = db.Me_attribute{}
|
|
atvaltab = db.Me_attribute_valst{}
|
|
|
|
// 判断是否有键值,如果有根据需要继续向下钻取
|
|
if strings.TrimSpace(pktmprinttab.Keyval) != "" {
|
|
kv = strings.Split(pktmprinttab.Keyval, ":")
|
|
if len(kv) >= 2 {
|
|
switch kv[0] {
|
|
case "pln_workorder_atcodlst.attrcode": // 生产订单属性,则获取它对应的值
|
|
iattrcode, _ := strconv.Atoi(kv[1])
|
|
ipos = wotab.GetAttributePos(iattrcode)
|
|
if ipos >= 0 {
|
|
if atcodtab, ok = pe.AtcodDict[iattrcode]; ok {
|
|
if jpos = atcodtab.GetValuePos(wotab.Attrlst[ipos].Attrvalue); jpos >= 0 {
|
|
return atcodtab, atcodtab.Valst[jpos]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 基于值的格式将指定值转义并返回
|
|
func GetValueByPicture(val string, picture string, varpos string) (retval string, err error) {
|
|
var (
|
|
kv []string
|
|
ibeg, iend int
|
|
t time.Time
|
|
)
|
|
|
|
switch picture {
|
|
case "BARCODE":
|
|
retval = "*" + val + "*"
|
|
case "MM.DD":
|
|
if len(val) == 4 {
|
|
if t, err = common.DateParse(val, "YmdHis"); err != nil {
|
|
return
|
|
}
|
|
retval = common.Date(t.Unix(), "MM.DD")
|
|
} else {
|
|
retval = val
|
|
}
|
|
case "YYYY.MM.DD":
|
|
if len(val) == 8 {
|
|
if t, err = common.DateParse(val, "YmdHis"); err != nil {
|
|
return
|
|
}
|
|
retval = common.Date(t.Unix(), "YYYY.MM.DD")
|
|
} else {
|
|
retval = val
|
|
}
|
|
case "YYYY/MM/DD":
|
|
if len(val) == 8 {
|
|
if t, err = common.TimeParseyyyyMMdd(val); err != nil {
|
|
return
|
|
}
|
|
retval = common.TimeFormat(t, "yyyy/MM/dd")
|
|
} else {
|
|
retval = val
|
|
}
|
|
case "YYYY.MM.DD hh:mm:ss":
|
|
if len(val) == 14 {
|
|
if t, err = common.DateParse(val, "YmdHis"); err != nil {
|
|
return
|
|
}
|
|
retval = common.Date(t.Unix(), "YYYY.MM.DD HH:mm:ss")
|
|
} else {
|
|
retval = val
|
|
}
|
|
case "YY/MM/DD hh:mm:ss":
|
|
if len(val) == 14 {
|
|
if t, err = common.DateParse(val, "YmdHis"); err != nil {
|
|
return
|
|
}
|
|
retval = common.Date(t.Unix(), "YY/MM/DD HH:mm:ss")
|
|
} else {
|
|
retval = val
|
|
}
|
|
case "YYYY.MM.DD hh:mm":
|
|
if len(val) == 10 {
|
|
if t, err = common.DateParse(val, "YmdHis"); err != nil {
|
|
return
|
|
}
|
|
retval = common.Date(t.Unix(), "YYYY.MM.DD HH:mm")
|
|
} else {
|
|
retval = val
|
|
}
|
|
case "hh:mm:ss":
|
|
if len(val) == 6 {
|
|
if t, err = common.TimeParseHHmmss(val); err != nil {
|
|
return
|
|
}
|
|
retval = common.TimeFormat(t, "HH:mm:ss")
|
|
} else {
|
|
retval = val
|
|
}
|
|
case "SUBSTRING":
|
|
kv = strings.Split(varpos, ":")
|
|
if len(kv) != 2 {
|
|
err = errors.New("指定值的PICTURE是SUBSTRING,但未提供合法的截取起始位置!")
|
|
return
|
|
}
|
|
ibeg, _ = strconv.Atoi(kv[0])
|
|
iend, _ = strconv.Atoi(kv[1])
|
|
if iend > len(val) {
|
|
err = errors.New("指定值的PICTURE是SUBSTRING,但给定的截取位置超出了值的长度!")
|
|
return
|
|
}
|
|
retval = val[ibeg-1 : iend-1]
|
|
|
|
default:
|
|
retval = val
|
|
}
|
|
return
|
|
}
|
|
|
|
// 基于指定的Index解析系统COPY变量值,获取指定索引对应的值
|
|
func GetPrintSysCopyValue(idx int, copyval string) (retval string) {
|
|
var (
|
|
kv, kvlst []string
|
|
)
|
|
|
|
retval = ""
|
|
kvlst = strings.Split(copyval, ";")
|
|
if len(kvlst) >= idx {
|
|
kv = strings.Split(kvlst[idx-1], ":")
|
|
if len(kv) >= 2 {
|
|
retval = kv[1]
|
|
return
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 获取拣料单模板的行列索引项
|
|
func (bl_sheet *BL_2DSheet) GetColRowKeyData(bl_picktmp *BL_PickingTemplate) (err error) {
|
|
var (
|
|
i int
|
|
colflag, rowflag bool
|
|
kv []string
|
|
)
|
|
// 遍历打印设置行
|
|
colflag = false
|
|
rowflag = false
|
|
for i = 0; i < len(bl_picktmp.Picktemplatetab.Printlst); i++ {
|
|
switch bl_picktmp.Picktemplatetab.Printlst[i].Vartype {
|
|
case common.PRN_VAR_TYP_2DCOL:
|
|
if bl_picktmp.Picktemplatetab.Printlst[i].Isidx > 0 {
|
|
bl_sheet.idxcol = bl_picktmp.Picktemplatetab.Printlst[i].Varvalue
|
|
kv = strings.Split(bl_picktmp.Picktemplatetab.Printlst[i].Varpos, ":")
|
|
if len(kv) >= 3 {
|
|
bl_sheet.rowbeg, _ = strconv.Atoi(kv[1])
|
|
bl_sheet.rowend, _ = strconv.Atoi(kv[2])
|
|
}
|
|
colflag = true
|
|
}
|
|
continue
|
|
|
|
case common.PRN_VAR_TYP_2DROW:
|
|
if bl_picktmp.Picktemplatetab.Printlst[i].Isidx > 0 {
|
|
bl_sheet.idxrow = bl_picktmp.Picktemplatetab.Printlst[i].Varvalue
|
|
kv = strings.Split(bl_picktmp.Picktemplatetab.Printlst[i].Varpos, ":")
|
|
if len(kv) >= 3 {
|
|
bl_sheet.colbeg = kv[1]
|
|
bl_sheet.colend = kv[2]
|
|
}
|
|
rowflag = true
|
|
}
|
|
continue
|
|
}
|
|
}
|
|
|
|
if !colflag || !rowflag {
|
|
err = errors.New("拣料单模板:" + bl_picktmp.Picktemplatetab.Picktemplateid + "没有行列索引!")
|
|
}
|
|
return
|
|
}
|
|
|
|
// 获取列主键当前位置列
|
|
func (bl_sheet *BL_2DSheet) GetKeyColCurrPos(keyval string) (rowpos int) {
|
|
var (
|
|
bl_sheetkey BL_2DSheetKey
|
|
ok bool
|
|
)
|
|
if bl_sheetkey, ok = bl_sheet.colkeylist[keyval]; !ok {
|
|
rowpos = bl_sheet.rowbeg
|
|
return
|
|
}
|
|
|
|
rowpos = bl_sheetkey.rowpos
|
|
return
|
|
}
|
|
|
|
// 获取列主键当前位置行
|
|
func (bl_sheet *BL_2DSheet) GetKeyRowCurrPos(keyval string) (colpos string) {
|
|
var (
|
|
bl_sheetkey BL_2DSheetKey
|
|
ok bool
|
|
)
|
|
if bl_sheetkey, ok = bl_sheet.rowkeylist[keyval]; !ok {
|
|
colpos = bl_sheet.colbeg
|
|
return
|
|
}
|
|
|
|
colpos = bl_sheetkey.colpos
|
|
return
|
|
}
|
|
|
|
// 获取指定列的位置行
|
|
func (bl_sheet *BL_2DSheet) GetColCurrRowPos(pktmprntab *db.Pln_picktemplate_printlst, kvmap map[string]string) (success bool, rowpos int, val string) {
|
|
var (
|
|
kv []string
|
|
ibeg, iend int
|
|
colkeyval string
|
|
ok bool
|
|
bl_sheetkey BL_2DSheetKey
|
|
)
|
|
// 获取起始坐标
|
|
kv = strings.Split(pktmprntab.Varpos, ":")
|
|
if len(kv) >= 3 {
|
|
ibeg, _ = strconv.Atoi(kv[1])
|
|
iend, _ = strconv.Atoi(kv[2])
|
|
}
|
|
|
|
// 基于索引列获取当前列键值行位置
|
|
if colkeyval, ok = kvmap[bl_sheet.idxcol]; !ok {
|
|
colkeyval = ""
|
|
}
|
|
if val, ok = kvmap[pktmprntab.Varvalue]; !ok {
|
|
val = ""
|
|
}
|
|
if pktmprntab.Varvalue != bl_sheet.idxcol {
|
|
// 不是索引列
|
|
rowpos = bl_sheet.GetKeyColCurrPos(colkeyval)
|
|
} else {
|
|
// 索引列
|
|
if bl_sheetkey, ok = bl_sheet.colkeylist[colkeyval]; !ok {
|
|
rowpos = ibeg + len(bl_sheet.colkeylist)
|
|
bl_sheetkey = BL_2DSheetKey{keyval: val, rowpos: rowpos}
|
|
bl_sheet.colkeylist[bl_sheetkey.keyval] = bl_sheetkey
|
|
} else {
|
|
rowpos = bl_sheetkey.rowpos
|
|
}
|
|
}
|
|
|
|
// 行数是否越界
|
|
if rowpos > iend {
|
|
success = false
|
|
} else {
|
|
success = true
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 获取指定行的位置列
|
|
func (bl_sheet *BL_2DSheet) GetRowCurrColPos(pktmprntab *db.Pln_picktemplate_printlst, kvmap map[string]string) (success bool, colpos string, val string) {
|
|
var (
|
|
kv []string
|
|
sbeg, send string
|
|
rowkeyval string
|
|
ok bool
|
|
bl_sheetkey BL_2DSheetKey
|
|
)
|
|
// 获取起始坐标
|
|
kv = strings.Split(pktmprntab.Varpos, ":")
|
|
if len(kv) >= 3 {
|
|
sbeg = kv[1]
|
|
send = kv[2]
|
|
}
|
|
|
|
// 基于索引列获取当前列键值行位置
|
|
if rowkeyval, ok = kvmap[bl_sheet.idxrow]; !ok {
|
|
rowkeyval = ""
|
|
}
|
|
|
|
if val, ok = kvmap[pktmprntab.Varvalue]; !ok {
|
|
val = ""
|
|
}
|
|
if pktmprntab.Varvalue != bl_sheet.idxrow {
|
|
// 不是索引行
|
|
colpos = bl_sheet.GetKeyRowCurrPos(rowkeyval)
|
|
} else {
|
|
// 索引行
|
|
if bl_sheetkey, ok = bl_sheet.rowkeylist[rowkeyval]; !ok {
|
|
colpos = common.AddExcelColLen(sbeg, len(bl_sheet.rowkeylist))
|
|
bl_sheetkey = BL_2DSheetKey{keyval: val, colpos: colpos}
|
|
bl_sheet.rowkeylist[bl_sheetkey.keyval] = bl_sheetkey
|
|
} else {
|
|
colpos = bl_sheetkey.colpos
|
|
}
|
|
}
|
|
|
|
// 列数是否越界
|
|
if colpos > send {
|
|
success = false
|
|
} else {
|
|
success = true
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 获取指定CELL的位置
|
|
func (bl_sheet *BL_2DSheet) GetCellCurrPos(pktmprntab *db.Pln_picktemplate_printlst, kvmap map[string]string) (colpos string, rowpos int, val string) {
|
|
var (
|
|
rowkeyval, colkeyval string
|
|
ok bool
|
|
)
|
|
|
|
// 获取单元格行索引的值而后获取位置
|
|
if rowkeyval, ok = kvmap[bl_sheet.idxrow]; !ok {
|
|
rowkeyval = ""
|
|
}
|
|
colpos = bl_sheet.GetKeyRowCurrPos(rowkeyval)
|
|
// 获取单元格对应列缩影的值而后获取位置
|
|
if colkeyval, ok = kvmap[bl_sheet.idxcol]; !ok {
|
|
colkeyval = ""
|
|
}
|
|
rowpos = bl_sheet.GetKeyColCurrPos(colkeyval)
|
|
// 获取单元格值
|
|
if val, ok = kvmap[pktmprntab.Varvalue]; !ok {
|
|
val = ""
|
|
}
|
|
|
|
return
|
|
}
|