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.

525 lines
13 KiB

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
}