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 }