package asn import ( "fmt" "github.com/tealeg/xlsx" "io/ioutil" "leit.com/leit_seat_aps/common" "leit.com/leit_seat_aps/db" "leit.com/leit_seat_aps/glog" "leit.com/leit_seat_aps/service" "os" "strings" "time" ) func LoadAsnToLandingData() { for { var ( ald AsnLandData projtab db.Me_project projtablst []db.Me_project rd []os.FileInfo fi os.FileInfo edi_file string //matched bool err error ) projtab = db.Me_project{} if projtablst, err = projtab.GetAllActive(); err != nil { glog.InfoExtln("Asn解析", "Failed to get project list!") return } for i, _ := range projtablst { // 加载项目数据 if !common.IsExists(projtablst[i].Tier2_folder) { glog.InfoExtln("Asn解析", "读取ASN失败:", projtablst[i].Projectid, projtablst[i].Tier2_folder, err) continue } // 读取文件夹内的文件并解析 if rd, err = ioutil.ReadDir(projtablst[i].Tier2_folder + "/inbox"); err != nil { glog.InfoExtln("Asn解析", "读取ASN失败:", projtablst[i].Projectid, projtablst[i].Tier2_folder, err) return } rds := common.SortByTime(rd) for _, fi = range rds { if fi.IsDir() { glog.InfoExtln("Asn解析", "读取ASN失败:", err) continue } edi_file = projtablst[i].Tier2_folder + "/inbox" + "/" + fi.Name() fmt.Println(edi_file) // 判断文件的合规性 //if matched, err = regexp.MatchString(projtablst[i].Asn_file_prefix, fi.Name()); err != nil { // glog.InfoExtln("Asn解析", "Failed to match EDI file name: due to: ", fi.Name(), err) // return //} //if !matched { // glog.InfoExtln("Asn解析", "The specified EDI file: doesn't match the required name specification!", fi.Name()) // os.Rename(edi_file, projtablst[i].Asn_folder+"/errbox"+"/"+fi.Name()) // return //} ald = AsnLandData{} if err = ald.ReadAsnData(edi_file); err != nil { glog.InfoExtln("Asn解析", "读取ASN失败:", err) return } if err = ald.SaveAsnData(); err != nil { glog.InfoExtln("Asn解析", "保存ASN失败:", err) return } // 将文件移到outbox os.Rename(edi_file, projtablst[i].Tier2_folder+"/outbox"+"/"+fi.Name()) } } time.Sleep(10 * time.Second) } } // 基于ASN数据更新对应生产订单 func ParseAsnLandingData() { for { var ( asnheadtab db.Jit_asnhead_landing asnheadtablst []db.Jit_asnhead_landing i int bt service.BL_Tier2ASN err error ) // 获取未解析的ASN数据 asnheadtab = db.Jit_asnhead_landing{} if asnheadtablst, err = asnheadtab.GetUnparsedAsnLandingData(); err != nil { glog.InfoExtln("RecieveAsn解析", "获取ASN解析数据失败,原因:", err) return } // 基于ASN数据更新扶手相关订单状态 for i = 0; i < len(asnheadtablst); i++ { bt = service.BL_Tier2ASN{} bt.Asnheadtab = asnheadtablst[i] if err = bt.SortAsnByOrder(); err != nil { glog.InfoExtln("RecieveAsn解析", "获取ASN解析数据失败,原因:", err) continue } if err = bt.CLoseTier2WorkOrder(); err != nil { glog.InfoExtln("RecieveAsn解析", "获取ASN解析数据失败,原因:", err) continue } if err = bt.SetParsedStatus(); err != nil { glog.InfoExtln("RecieveAsn解析", "SetParsedStatus失败,原因:", err) continue } } time.Sleep(60 * time.Second) } } type AsnData struct { Bol string Asn string Oemordernr string Partid string Partqty int } //生成发运单 func CreateAsnFile() { for { var ( projtab db.Me_project projtablst []db.Me_project data []db.Jit_bbaasn err error ) // 加载项目数据 //第一步:查询5条asn的文件 e := db.G_DbEngine projtab = db.Me_project{} if projtablst, err = projtab.GetAllActive(); err != nil { glog.InfoExtln("Asn解析", "Failed to get project list!") return } for i, _ := range projtablst { err = e.Table("jit_bbaasn").Where("finr =? and shipfileflag != ? and projnr = ?", db.G_FINR, 1, projtablst[i].Projectid).Asc("asn").Limit(5).Find(&data) if err != nil { glog.InfoExtln("jit_bbaasn 发运单", "jit_bbaasn err :", err) return } for _, v := range data { bbaasn_itemlst := make([]db.Jit_bbaasn_itemlst, 0) packorder_itemlst := make([]db.Jit_packorderJit_packorder_itemlst, 0) workorder_partlst := make([]db.VWorkorderCustorderPartlst, 0) temData := make([]AsnData, 0) //1. 基于bbaasn消息提供的asn号检索到jit_bbaasn的行记录,获取bol和asn栏位信息; bol := v.Bol asn := v.Asn //2. 基于asn号遍历jit_bbaasn_itemlst, 获取所有packorderid err = e.Table("jit_bbaasn_itemlst").Select("packorderid").Where("finr = ? and asn = ?", db.G_FINR, asn).Find(&bbaasn_itemlst) if err != nil { glog.InfoExtln("jit_bbaasn 发运单", "jit_bbaasn err :", err) continue } var Packorderids []string for _, v := range bbaasn_itemlst { Packorderids = append(Packorderids, v.Packorderid) } //3. 基于packordered 查询表jit_packorder和jit_packorder_itemlst err = e.Table("jit_packorder").Select("jit_packorder_itemlst.workordernr").Join("INNER", "jit_packorder_itemlst", "jit_packorder.finr = jit_packorder_itemlst.finr and jit_packorder.packorderid = jit_packorder_itemlst.packorderid").In("jit_packorder.packorderid", Packorderids).Where("jit_packorder.finr = ? and jit_packorder.projnr = ?", db.G_FINR, projtablst[i].Projectid).Find(&packorder_itemlst) if err != nil { glog.InfoExtln("jit_bbaasn 发运单", "jit_bbaasn err :", err) continue } var workordernrs []string for _, itemlst := range packorder_itemlst { workordernrs = append(workordernrs, itemlst.Workordernr) } //4. 基于jit_packorder_itemlst.workordernr 查询表pln_workorder 和表pln_workorder_partlst err = e.Table("pln_workorder").Join("INNER", "pln_custorder", "pln_workorder.finr = pln_custorder.finr and pln_workorder.custordernr = pln_custorder.custordernr").Join("INNER", "pln_workorder_partlst", "pln_workorder.finr = pln_workorder_partlst.finr and pln_workorder.workordernr = pln_workorder_partlst.workordernr").In("pln_workorder.workordernr", workordernrs).Where("pln_workorder.finr = ? and pln_workorder.projnr = ?", db.G_FINR, projtablst[i].Projectid).Find(&workorder_partlst) if err != nil { glog.InfoExtln("jit_bbaasn 发运单", "jit_bbaasn err :", err) continue } //基于jit_packorder_itemlst.workordernr 查询表pln_workorder 获取它的partfamilyid 和当前的jit_bbaasn的零件族匹配 //如果不相等,则取出该工单客户订单对应零件族的通用件供应组的零件清单,将属于该供应组的零件从当前工单的零件清单中排除即可 //查询出sg共用件的集合,根据pln_custorder_supplygroup_partst和me_supplygroup联查出共用件 sgtypePartid := make(map[string]int) sgPartid := make(map[string]int) for _, vv := range workorder_partlst { if strings.TrimSpace(vv.Pln_workorder.Partfamilyid) != strings.TrimSpace(v.Partfamilyid) { sgtype_partlst := make([]db.CustorderSupplyPartlst, 0) e.Table("pln_custorder_supplygroup_partlst").Join("INNER", "pln_custorder", "pln_custorder_supplygroup_partlst.finr = pln_custorder.finr and pln_custorder_supplygroup_partlst.custordernr = pln_custorder.custordernr").Join("INNER", "me_supplygroup", "pln_custorder_supplygroup_partlst.finr = me_supplygroup.finr and pln_custorder_supplygroup_partlst.supplygroupid = me_supplygroup.supplygroupid").Where("pln_custorder_supplygroup_partlst.finr = ? and me_supplygroup.sgtype = ? and pln_custorder_supplygroup_partlst.custordernr = ? and pln_custorder.projnr = ?", db.G_FINR, "N", vv.Pln_custorder.Custordernr,projtablst[i].Projectid).Find(&sgtype_partlst) for _, sg := range sgtype_partlst { sg.Pln_custorder_supplygroup_partlst.Clipped() sg.Pln_custorder.Clipped() key := sg.Pln_custorder.Oemordernr + ";" + sg.Pln_custorder_supplygroup_partlst.Partid sgtypePartid[key] = sg.Pln_custorder_supplygroup_partlst.Partqty } } else { sgtype_partlst := make([]db.CustorderSupplyPartlst, 0) e.Table("pln_custorder_supplygroup_partlst").Join("INNER", "pln_custorder", "pln_custorder_supplygroup_partlst.finr = pln_custorder.finr and pln_custorder_supplygroup_partlst.custordernr = pln_custorder.custordernr").Join("INNER", "me_supplygroup", "pln_custorder_supplygroup_partlst.finr = me_supplygroup.finr and pln_custorder_supplygroup_partlst.supplygroupid = me_supplygroup.supplygroupid").Where("pln_custorder_supplygroup_partlst.finr = ? and me_supplygroup.sgtype = ? and pln_custorder_supplygroup_partlst.custordernr = ? and pln_custorder.projnr = ?", db.G_FINR, "N", vv.Pln_custorder.Custordernr,projtablst[i].Projectid).Find(&sgtype_partlst) for _, sg := range sgtype_partlst { sg.Pln_custorder_supplygroup_partlst.Clipped() sg.Pln_custorder.Clipped() key := sg.Pln_custorder.Oemordernr + ";" + sg.Pln_custorder_supplygroup_partlst.Partid sgPartid[key] = sg.Pln_custorder_supplygroup_partlst.Partqty } } } //6.构造零件字典 partids := make(map[string]int) for _, vst := range workorder_partlst { vst.Pln_workorder_partlst.Clipped() vst.Pln_custorder.Clipped() key := vst.Pln_custorder.Oemordernr + ";" + vst.Pln_workorder_partlst.Partid _, ok := sgtypePartid[key] if ok { continue } partqty := vst.Pln_workorder_partlst.Partqty val, ok := partids[key] if ok { //存在的话,数量叠加 partids[key] = partqty + val } else { //不存在的话,添加 partids[key] = partqty } } //融合两个map for key, val := range sgPartid { _, ok := partids[key] if !ok { partids[key] = val } } //5. 对照上面前3个栏位,对应的字段分别是:pln_workorder.custordernr / pln_workorder_partlst.partid / pln_workorder_partlst.partqty 信息 for key, val := range partids { keys := strings.Split(key, ";") if len(keys) >= 2 { one := AsnData{} one.Asn = asn one.Bol = bol one.Partid = keys[1] one.Oemordernr = keys[0] one.Partqty = val temData = append(temData, one) } } //第三步:生成发运单 //Asnflushnr, err := service.SN_GetNextSnr(projtablst[i].Shipfile_snr) Asnflushnr := strings.TrimSpace(v.Asn) if err != nil { glog.InfoExtln("jit_bbaasn 发运单", "jit_bbaasn err :", err) continue } var pln db.Jit_bbaasn pln.Finr = db.G_FINR pln.Shipfileflag = 1 _, err = e.Table("jit_bbaasn").Cols("shipfileflag").Where("finr = ? and asn =?", db.G_FINR, asn).Update(&pln) if err != nil { glog.InfoExtln("jit_bbaasn 发运单", "jit_bbaasn err :", err) continue } //4.生产对应的excel文件 var file *xlsx.File var sheet *xlsx.Sheet var row *xlsx.Row var cell *xlsx.Cell file = xlsx.NewFile() sheet, err = file.AddSheet("Sheet1") if err != nil { return } tableHead := true for _, val := range temData { if tableHead { //添加表头 row = sheet.AddRow() cell = row.AddCell() cell.Value = "ORDER NUMBER" cell = row.AddCell() cell.Value = "PART NUMBER" cell = row.AddCell() cell.Value = "TRANSFER QTY" cell = row.AddCell() cell.Value = "BOL" cell = row.AddCell() cell.Value = "ASN" tableHead = false } row = sheet.AddRow() cell = row.AddCell() cell.Value = common.ValueToString(val.Oemordernr, "") cell = row.AddCell() cell.Value = common.ValueToString(val.Partid, "") cell = row.AddCell() cell.Value = common.ValueToString(val.Partqty, "") cell = row.AddCell() cell.Value = common.ValueToString(val.Bol, "") cell = row.AddCell() cell.Value = common.ValueToString(val.Asn, "") } filename := Asnflushnr + ".xlsx" //文件名 exceldir := strings.TrimSpace(projtablst[i].Shipfile_folder) // 目录+文件名 excelfile := exceldir + "/" + filename err = file.Save(excelfile) } time.Sleep(5 * time.Second) } } }