package admin import ( . "../../../hotime" . "../../common" "fmt" "github.com/chain-zhang/pinyin" "github.com/xuri/excelize" "io" "os" "strings" "time" "unicode" ) 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 //fmt.Println(Org[orgId],OrgId) 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, "上传成功") }, "analyse": func(this *Context) { orgId := ObjToInt(this.Req.FormValue("org_id")) if orgId == 0 { this.Display(3, "参数错误") return } companys := this.Db.Select("company", "*", Map{"org_id": orgId}) for _, v := range companys { data := Org[orgId].analyse(v.GetMap("upload_data")) for k, _ := range data { data[k] = data.GetFloat64(k) } v["analyse"] = data } cs := Org[orgId].analyseSort(companys) for _, v := range cs { as := v.GetMap("analyse") //v["analyse"] = as.ToJsonString() switch as.GetString("PJ") { case "A": v["level"] = 0 case "B": v["level"] = 1 case "C": v["level"] = 2 case "D": v["level"] = 3 } v["score"] = as.GetFloat64("ZDF") this.Db.Update("company", Map{"analyse": as.ToJsonString(), "level": v["level"], "score": v["score"]}, Map{"id": v.GetCeilInt("id")}) this.Db.Update("company_history", Map{"analyse": as.ToJsonString(), "level": v["level"], "score": v["score"]}, Map{"id": v.GetCeilInt("company_history_id")}) } this.Display(0, len(companys)) }, "total_analyse": func(this *Context) { orgId := ObjToInt(this.Req.FormValue("org_id")) if orgId == 0 { this.Display(3, "参数错误") return } companys := this.Db.Select("company", "*", Map{"AND": Map{"org_id": orgId}}) home_data, six_item_data, three_item_data, n_item_data := totalAnalyse(companys) org := this.Db.Get("org", "*", Map{"id": orgId}) fmt.Println(six_item_data) data := Map{ "name": org.GetString("name"), "home_data": home_data.ToJsonString(), "six_item_data": six_item_data.ToJsonString(), "three_item_data": three_item_data.ToJsonString(), "n_item_data": n_item_data.ToJsonString(), "modify_time": time.Now().Unix(), } org_analyse := this.Db.Get("org_analyse", "id", Map{"org_id": orgId}) if org_analyse == nil { //data["name"] = time.Now().Format("2006-01-02 15:04") + "创建" data["name"] = org.GetString("name") data["org_id"] = orgId data["create_time"] = time.Now().Unix() id := this.Db.Insert("org_analyse", data) data["id"] = id } else { this.Db.Update("org_analyse", data, Map{"org_id": orgId}) } this.Display(0, data) }, // //"category_analyse": func(this *Context) { // // orgId := 1 // org := this.Db.Get("org", "*", Map{"id": orgId}) // categoryIDS := []int{ // 1369, //电子行业 // 799, //航空航天 // 481, //生物医药 // 990, //绿色能源 // 972, //机械制造 // 1021, //建材制造 // 717, //化工类 // 170, //轻工类 // 260, //纺织类 // 1088, //商贸类 // 1424, //投资管理 // 903, //配套类 // 959, //其他 // } // totalAnalyse := this.Db.Get("org_analyse", "*", Map{"org_id": orgId}) // // for _, id := range categoryIDS { // // companys := this.Db.Select("company", Map{"[><]category": "company.category_id=category.id"}, // "company.id,company.gs,company.level,company.score,company.upload_data,company.analyse,company.category_id", Map{"category.index[~]": "," + ObjToStr(id) + ","}) // ctgAn := ctgAnalyse(companys, totalAnalyse) // data := Map{ // "name": org.GetString("name"), // "modify_time": time.Now().Unix(), // "data": ctgAn.ToJsonString(), // } // ctgAnalyse := this.Db.Get("category_analyse", "id", Map{"AND": Map{"org_id": orgId, "category_id": id}}) // if ctgAnalyse == nil { // data["name"] = time.Now().Format("2006-01-02 15:04") + "创建" // data["name"] = org.GetString("name") // data["org_id"] = orgId // data["category_id"] = id // data["create_time"] = time.Now().Unix() // id := this.Db.Insert("category_analyse", data) // data["id"] = id // } else { // this.Db.Update("category_analyse", data, Map{"AND": Map{"org_id": orgId, "category_id": id}}) // } // // } // this.Display(0, categoryIDS) //}, // "industry_analyse": func(this *Context) { orgId := ObjToInt(this.Req.FormValue("org_id")) if orgId == 0 { this.Display(3, "参数错误") return } industrys := this.Db.Select("industry_analyse", "id,name,industry_id", Map{"org_id": orgId}) totalAnalyse := this.Db.Get("org_analyse", "*", Map{"org_id": orgId}) for _, industry := range industrys { id := industry.GetCeilInt("industry_id") companys := this.Db.Select("industry", Map{"[><]company": "company.industry_id=industry.id"}, "company.id,company.gs,company.level,company.score,company.upload_data,company.analyse,company.industry_id", Map{"AND": Map{"industry.id": id, "company.org_id": orgId}}) ctgAn := ctgAnalyse(companys, totalAnalyse) data := Map{ "modify_time": time.Now().Unix(), "data": ctgAn.ToJsonString(), } this.Db.Update("industry_analyse", data, Map{"AND": Map{"org_id": orgId, "industry_id": id}}) } this.Display(0, industrys) }, } 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{"AND": Map{"name": cv, "org_id": orgId}}) if tagCtg != nil { tagCtgs = append(tagCtgs, tagCtg) continue } tagCtg = Map{ "name": cv, "admin_id": this.Session("admin_id").ToInt(), "parent_id": 1, //上传分类为1 "org_id": orgId, "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{"AND": Map{"name": cv, "type": "0", "org_id": orgId}}) 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{"AND": Map{"sn": sn, "type": "0", "org_id": orgId}}) if tagsn != nil { for i := 0; i < 100; i++ { tagsn = this.Db.Get("tag", "id", Map{"AND": Map{"sn": sn + ObjToStr(i), "type": "0", "org_id": orgId}}) 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(), "org_id": orgId, "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 if ck-1 >= len(tags) { fmt.Println(cv, "表格错误") continue } rowData[tags[ck-1].GetString("sn")] = cv } if rowData["IEDCQYMC"] == nil { fmt.Println("数据错误") } 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 }