package admin import ( . "../../../hotime" . "../../common" "unicode" //"../../dri/baidu" "fmt" "github.com/chain-zhang/pinyin" "github.com/xuri/excelize" "io" "os" "strings" "time" ) var CompanyInOutCtr = Ctr{ "upload": func(this *Context) { //orgId := ObjToInt(this.Req.FormValue("org_id")) //if orgId == 0 { // this.Display(3, "参数错误") // return //} orgId := 1 //读取网络文件 fi, fheader, err := this.Req.FormFile("file") if err != nil { this.Display(3, err) return } filePath := this.Config.GetString("filePath") if filePath == "" { filePath = "excel/2006/01/02/" } path := time.Now().Format(filePath) e := os.MkdirAll(this.Config.GetString("tpt")+"/"+path, os.ModeDir) if e != nil { this.Display(3, e) return } filePath = path + Md5(ObjToStr(RandX(100000, 9999999))) + fheader.Filename[strings.LastIndex(fheader.Filename, "."):] newFile, e := os.Create(this.Config.GetString("tpt") + "/" + filePath) if e != nil { this.Display(3, e) return } _, e = io.Copy(newFile, fi) if e != nil { this.Display(3, e) return } //this.Display(0, filePath) //读取excel data := excel(this.Config.GetString("tpt") + "/" + filePath) if len(data) != 1 { this.Display(3, "表格不标准,请重新提交") return } err = decodeData2Sql(data[0], this, orgId) if err != nil { this.Display(4, err) return } this.Display(0, "上传成功") }, } func decodeData2Sql(table [][]string, this *Context, orgId int) error { tags := []Map{} //报错所有的tag记录 tagCtgs := []Map{} for k, v := range table { //第一排是指标分类,去除掉第一个参数,其存在合并所以,如果是合并的则删除 if k == 0 { for ck, cv := range v { cv = strings.Replace(cv, " ", "", -1) cv = strings.Replace(cv, "\r\t", "", -1) cv = strings.Replace(cv, "\r", "", -1) v[ck] = cv if ck == 0 { continue } if cv == "" { v[ck] = v[ck-1] cv = v[ck] } tagCtg := this.Db.Get("tag_ctg", "*", Map{"name": cv}) if tagCtg != nil { tagCtgs = append(tagCtgs, tagCtg) continue } tagCtg = Map{ "name": cv, "admin_id": this.Session("admin_id").ToInt(), "parent_id": 1, //上传分类为1 "create_time": time.Now().Unix(), "modify_time": time.Now().Unix(), } id := this.Db.Insert("tag_ctg", tagCtg) if id != 0 { tagCtg["id"] = id this.Db.Update("tag_ctg", Map{ "index": ",1," + ObjToStr(id) + ",", }, Map{"id": id}) tagCtgs = append(tagCtgs, tagCtg) } } } //第二排是指标项,去除掉第一个参数, //最重要的是参数tag生成,通过中文转拼音获取首字母实现,遇到同名的则最后加一位数字 if k == 1 { for ck, cv := range v { cv = strings.Replace(cv, " ", "", -1) cv = strings.Replace(cv, "\r\t", "", -1) cv = strings.Replace(cv, "\r", "", -1) v[ck] = cv if ck == 0 { continue } //补充分类 if ck >= len(table[0]) { tagCtgs = append(tagCtgs, tagCtgs[len(tagCtgs)-1]) } //补充说明 if ck >= len(table[3]) { table[3] = append(table[3], table[3][len(table[3])-1]) } //补充单位 if ck >= len(table[2]) { table[2] = append(table[2], "") } tag := this.Db.Get("tag", "*", Map{"name": cv}) if tag != nil { tags = append(tags, tag) continue } sn, err := pinyin.New(cv).Split(" ").Mode(pinyin.InitialsInCapitals).Convert() if err != nil { fmt.Println(err) sn = cv } else { sns := strings.Split(sn, " ") sn = "IEDC" for _, v1 := range sns { if v1 != "" && !unicode.IsPunct([]rune(v1)[0]) { sn = sn + string([]rune(v1)[:1]) fmt.Println(sn, v1) } } } //sn=strings.Replace(sn,"\ufffd","",-1) tagsn := this.Db.Get("tag", "id", Map{"sn": sn}) if tagsn != nil { for i := 0; i < 100; i++ { tagsn = this.Db.Get("tag", "id", Map{"sn": sn + ObjToStr(i)}) if tagsn == nil { sn = sn + ObjToStr(i) break } } } tag = Map{ "name": cv, "description": table[3][ck], //第三行对应位置为描述 "unit": table[2][ck], "admin_id": this.Session("admin_id").ToInt(), "type": 0, "sn": sn, "tag_ctg_id": tagCtgs[ck-1].GetCeilInt("id"), "create_time": time.Now().Unix(), "modify_time": time.Now().Unix(), } id := this.Db.Insert("tag", tag) tag["id"] = id tags = append(tags, tag) } } //第四排以后是数据项,去除掉第一个参数, //根据统一社会信用代码识别是否存在,同时将校验部分数字 if k > 3 { //整行数据 rowData := Map{} for ck, cv := range v { if ck == 0 { continue } cv = strings.Replace(cv, " ", "", -1) cv = strings.Replace(cv, "\r\t", "", -1) cv = strings.Replace(cv, "\r", "", -1) if cv == "" { cv = "暂无" //return errors.New("第" + ObjToStr(k+1) + "行," + ObjToStr(ck+1) + "列,数据为空请注意检查") } v[ck] = cv rowData[tags[ck-1].GetString("sn")] = cv } companyData := Map{ "name": rowData["IEDCQYMC"], "sn": rowData["IEDCTYSHXYDM"], "address": rowData["IEDCQYDZ"], "unit": rowData["IEDCSDMC"], "zdmj": rowData["IEDCYDMJ"], "yysr": rowData["IEDC2NYYSR"], "lrze": rowData["IEDC2NLRZE"], "yjsj": rowData["IEDCYNSJ"], "yfjf": rowData["IEDCNYFFY"], "zgrs": rowData["IEDCSBRS"], "zywrwpfdl": rowData["IEDCZYWRWPFDL"], "zhnh": rowData["IEDCZHNH"], "admin_id": this.Session("admin_id").ToInt(), "upload_data": rowData.ToJsonString(), "org_id": orgId, //"create_time": time.Now().Unix(), "modify_time": time.Now().Unix(), //"lat": lat, //"lng": lng, } //行业ID //org := this.Db.Get("org", "id,name", Map{"id": orgId}) //regin := "全国" //if org != nil { // regin = org.GetString("name") //} //baiduDataStr, _ := baidu.DefaultBaiDuMap.GetPosition(companyData.GetString("address"), regin) //baiduData := ObjToMap(baiduDataStr) //city := Map{} //if baiduData != nil && baiduData.GetCeilInt("status") == 0 { // address := baiduData.GetSlice("result") // if len(address) != 0 { // companyData["lat"] = address.GetMap(0).GetMap("location").GetFloat64("lat") // companyData["lng"] = address.GetMap(0).GetMap("location").GetFloat64("lng") // // city = this.Db.Get("city", "id", Map{"name[~]": address.GetMap(0).GetString("district"), "ORDER": "`level` DESC"}) // if city == nil { // city = this.Db.Get("city", "id", Map{"name[~]": address.GetMap(0).GetString("city"), "ORDER": "`level` DESC"}) // } // } //} //if city != nil { // companyData["city_id"] = city.GetCeilInt("id") //} //行业ID category := this.Db.Get("category", "id", Map{"code": rowData["IEDCSSXYXLDM"]}) if category != nil { companyData["category_id"] = category.GetCeilInt("id") } ////此处需要优化 //companyData["org_id"] = 3 //产业ID industry := this.Db.Get("industry", "id", Map{"name": rowData["IEDCCYLB"]}) if industry == nil { industry = Map{ "admin_id": this.Session("admin_id").ToInt(), "create_time": time.Now().Unix(), "modify_time": time.Now().Unix(), "name": rowData["IEDCCYLB"], } id := this.Db.Insert("industry", industry) industry["id"] = id } if industry.GetCeilInt("id") != 0 { //产业ID industryAnalyse := this.Db.Get("industry_analyse", "id", Map{"AND": Map{"industry_id": industry.GetCeilInt("id"), "org_id": orgId}}) if industryAnalyse == nil { industryAnalyse = Map{ "name": rowData["IEDCCYLB"], "create_time": time.Now().Unix(), "modify_time": time.Now().Unix(), "org_id": orgId, "industry_id": industry.GetCeilInt("id"), } //if city != nil { // industryAnalyse["city_id"] = city.GetCeilInt("id") //} this.Db.Insert("industry_analyse", industryAnalyse) } companyData["industry_id"] = industry.GetCeilInt("id") } company := this.Db.Get("company", "id", Map{"name": companyData["name"]}) //没有则创建 if company == nil { //更新两张表 companyData["create_time"] = time.Now().Unix() id := this.Db.Insert("company", companyData) companyData["company_id"] = id company = Map{"id": id} } else { //有则更新 this.Db.Update("company", companyData, Map{"name": companyData["name"]}) companyData["company_id"] = company.GetCeilInt("id") companyData["create_time"] = time.Now().Unix() } id := this.Db.Insert("company_history", companyData) //更新最新的企业信息 this.Db.Update("company", Map{"company_history_id": id}, Map{"id": company.GetCeilInt("id")}) } } return nil } func excel(filePath string) [][][]string { xlsx, err := excelize.OpenFile(filePath) if err != nil { fmt.Println(err) os.Exit(1) } list := xlsx.GetSheetList() var data [][][]string for _, v := range list { rows, e := xlsx.GetRows(v) if e != nil { fmt.Println(e) continue } data = append(data, rows) } return data }