package admin import ( . "code.hoteas.com/golang/hotime" . "code.hoteas.com/golang/hotime/common" "fmt" "github.com/Chain-Zhang/pinyin" "github.com/xuri/excelize/v2" "io" "os" "strings" "time" "unicode" ) func convertToTitle(columnNumber int) string { var res []byte for columnNumber > 0 { a := columnNumber % 26 if a == 0 { a = 26 } res = append(res, 'A'+byte(a-1)) columnNumber = (columnNumber - a) / 26 } // 上面输出的res是反着的,前后交换 for i, n := 0, len(res); i < n/2; i++ { res[i], res[n-1-i] = res[n-1-i], res[i] } return string(res) } var CompanyInOutCtr = Ctr{ //下载政企超链接里面填报的数据 "downloadQuestion": func(that *Context) { orgId := ObjToInt(that.Req.FormValue("org_id")) if orgId == 0 { that.Display(3, "参数错误") return } filePath := "temp/downloadQuestion" + ObjToStr(orgId) + ".xlsx" f, e := excelize.OpenFile(that.Config.GetString("tpt") + "/" + filePath) // 设置单元格的值 questions := that.Db.Query("SELECT user.name AS user_name,user.phone,company.name AS company_name,question_company.name,question_company.question_data,question_company.status,question_company.modify_time FROM question_company INNER JOIN `user` ON question_company.`user_id`=`user`.id INNER JOIN `company` ON question_company.`company_id`=`company`.id WHERE question_company.org_id=?", orgId) if e != nil { f = excelize.NewFile() } // 创建一个工作表 f.NewSheet("企业填报") f.DeleteSheet("Sheet1") //cs := append(NewCompanys{}, companys...) f.SetCellValue("企业填报", convertToTitle(1)+"1", "调查名") f.SetCellValue("企业填报", convertToTitle(2)+"1", "企业名") f.SetCellValue("企业填报", convertToTitle(3)+"1", "姓名") f.SetCellValue("企业填报", convertToTitle(4)+"1", "手机号") f.SetCellValue("企业填报", convertToTitle(5)+"1", "状态") f.SetCellValue("企业填报", convertToTitle(6)+"1", "修改时间") for k, question := range questions { //企业基础信息 f.SetCellValue("企业填报", convertToTitle(1)+ObjToStr(k+5), question.GetString("name")) f.SetCellValue("企业填报", convertToTitle(2)+ObjToStr(k+5), question.GetString("company_name")) f.SetCellValue("企业填报", convertToTitle(3)+ObjToStr(k+5), question.GetString("user_name")) f.SetCellValue("企业填报", convertToTitle(4)+ObjToStr(k+5), question.GetString("phone")) f.SetCellValue("企业填报", convertToTitle(5)+ObjToStr(k+5), question.GetString("status")) f.SetCellValue("企业填报", convertToTitle(6)+ObjToStr(k+5), time.Unix(question.GetCeilInt64("modify_time"), 0).Format("2006-01-02 15:04")) //企业问题信息基础信息 questionData := question.GetSlice("question_data") for k1, _ := range questionData { v1 := questionData.GetMap(k1) if k == 0 { f.SetCellValue("企业填报", convertToTitle(k1+7)+"1", v1.GetString("label")) f.SetCellValue("企业填报", convertToTitle(k1+7)+"2", v1.GetString("unit")) f.SetCellValue("企业填报", convertToTitle(k1+7)+"3", v1.GetString("remarks")) f.SetCellValue("企业填报", convertToTitle(k1+7)+"4", v1.GetString("type")) } value := v1.GetString("value") extend := v1.GetSlice("extend") if extend != nil && len(extend) > 0 { for k2, _ := range extend { v2 := extend.GetMap(k2) value = value + ";" + v2.GetString("value") } } f.SetCellValue("企业填报", convertToTitle(k1+7)+ObjToStr(k+5), value) } //break } os.MkdirAll(that.Config.GetString("tpt")+"/temp/", os.ModeDir) // 根据指定路径保存文件 if err := f.SaveAs(that.Config.GetString("tpt") + "/" + filePath); err != nil { fmt.Println(err) that.Display(4, "输出异常") return } //} f.Save() that.Resp.Header().Set("Location", "/"+filePath) that.Resp.WriteHeader(307) //关键在这里! that.Display(0, filePath) }, "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.Error()) 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.Error()) 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.Error()) return } _, e = io.Copy(newFile, fi) if e != nil { this.Display(3, e.Error()) 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.Error()) 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 { 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 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 > 2 { //整行数据 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["IEDCQYM"] == nil { fmt.Println("数据错误") } companyData := Map{ "name": rowData["IEDCQYM"], //"sn": rowData["IEDCTYSHXYDM"], //"address": rowData["IEDCQYDZ"], //"unit": rowData["IEDCSDMC"], "zdmj": rowData["IEDCZDMJ"], "yysr": rowData["IEDCYYSR1"], "lrze": rowData["IEDCLRZE1"], "yjsj": rowData["IEDCYJSJ"], "yfjf": rowData["IEDCNYFFY"], "zgrs": rowData["IEDCSBRS"], "zywrwpfdl": rowData["IEDCZYWRWPFZDL"], "zhnh": rowData["IEDCZNH"], "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.GetString("sn") != "暂无" && companyData.GetString("sn") != "" { company = this.Db.Get("company", "id", Map{"sn": companyData["sn"]}) } //没有则创建 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{"id": company.GetCeilInt("id")}) 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 }