package front import ( "crons" "dataValidation/util" "encoding/json" "fmt" "github.com/shopspring/decimal" "github.com/tealeg/xlsx" "go.mongodb.org/mongo-driver/bson" "io" qu "jygit.jydev.jianyu360.cn/data_processing/common_utils" "jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb" "math" "os" "qfw/util/redis" "sort" "strconv" "strings" "sync" "time" "util" ) // GroupTaskListByGroup 用户组权限用户组任务列表 func (f *Front) GroupTaskListByGroup() { defer qu.Catch() if f.Method() == "POST" { user := f.GetSession("user").(map[string]interface{}) role := qu.ObjToString(user["i_role"]) start, _ := f.GetInt("start") limit, _ := f.GetInt("length") draw, _ := f.GetInt("draw") status := f.GetString("s_status") searchStr := f.GetString("search[value]") search := strings.TrimSpace(searchStr) groupId := qu.ObjToString(user["s_groupid"]) query := map[string]interface{}{ "s_stype": "group", //检索用户组任务 } if role != "0" { query["s_groupid"] = groupId } if status != "-1" { //任务状态 query["s_status"] = status } else { query["s_status"] = map[string]interface{}{ "$in": []string{"未开始", "进行中", "已完成"}, } } if search != "" { query["$or"] = []interface{}{ map[string]interface{}{"s_projectname": map[string]interface{}{"$regex": search}}, } } qu.Debug("Query:", query) list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, map[string]interface{}{"_id": -1}, nil, false, int(start), int(limit)) count := util.Mgo.Count(util.TASKCOLLNAME, query) for _, l := range *list { if status := qu.ObjToString(l["s_status"]); status == "进行中" { //更新任务进度 //groupId := qu.ObjToString(l["s_groupid"]) groupTaskId := mongodb.BsonIdToSId(l["_id"]) giveNum := qu.IntAll(l["i_givenum"]) sourceinfo := qu.ObjToString(l["s_sourceinfo"]) //tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_isgivegroup": true, "s_grouptaskid": groupTaskId, "b_istag": true}) tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": true}) progressFloat := float64(tagNum) / float64(giveNum) value, _ := strconv.ParseFloat(fmt.Sprintf("%.4f", progressFloat), 64) decimalValue := decimal.NewFromFloat(value) decimalValue = decimalValue.Mul(decimal.NewFromInt(100)) value, _ = decimalValue.Float64() progress := fmt.Sprint(value) + "%" l["s_progress"] = progress //同步数据库 util.Mgo.UpdateById(util.TASKCOLLNAME, l["_id"], map[string]interface{}{"$set": map[string]interface{}{"s_progress": progress}}) } } f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count}) } else { _ = f.Render("project/task_group_list.html") } } // GroupTaskListByAdmin 系统管理员权限用户组任务列表 func (f *Front) GroupTaskListByAdmin() { defer qu.Catch() if f.Method() == "POST" { start, _ := f.GetInt("start") limit, _ := f.GetInt("length") draw, _ := f.GetInt("draw") status := f.GetString("s_status") searchStr := f.GetString("search[value]") search := strings.TrimSpace(searchStr) starttime, _ := f.GetInt("i_starttime") completetime, _ := f.GetInt("i_completetime") query := map[string]interface{}{ "s_stype": "group", //检索用户组任务 } //if starttime > 0 { // query["i_starttime"] = map[string]interface{}{ // "$gte": starttime, // } //} dataQ := make(map[string]interface{}) if starttime > 0 { dataQ["$gte"] = starttime } if completetime > 0 { dataQ["$lte"] = completetime } if len(dataQ) > 0 { query["i_completetime"] = dataQ } if status != "-1" { //任务状态 query["s_status"] = status } else { query["s_status"] = map[string]interface{}{ "$in": []string{"未开始", "进行中", "已完成"}, } } if search != "" { query["$or"] = []interface{}{ map[string]interface{}{"s_projectname": map[string]interface{}{"$regex": search}}, map[string]interface{}{"s_entname": map[string]interface{}{"$regex": search}}, map[string]interface{}{"s_rulename": map[string]interface{}{"$regex": search}}, map[string]interface{}{"s_departname": map[string]interface{}{"$regex": search}}, map[string]interface{}{"s_groupname": map[string]interface{}{"$regex": search}}, } } qu.Debug("Query:", query) count := util.Mgo.Count(util.TASKCOLLNAME, query) list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, map[string]interface{}{"_id": -1}, nil, false, int(start), int(limit)) for _, l := range *list { if status := qu.ObjToString(l["s_status"]); status == "进行中" { //更新任务进度 //groupId := qu.ObjToString(l["s_groupid"]) groupTaskId := mongodb.BsonIdToSId(l["_id"]) giveNum := qu.IntAll(l["i_givenum"]) sourceinfo := qu.ObjToString(l["s_sourceinfo"]) //tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_isgivegroup": true, "s_grouptaskid": groupTaskId, "b_istag": true}) tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": true}) progressFloat := float64(tagNum) / float64(giveNum) value, _ := strconv.ParseFloat(fmt.Sprintf("%.4f", progressFloat), 64) decimalValue := decimal.NewFromFloat(value) decimalValue = decimalValue.Mul(decimal.NewFromInt(100)) value, _ = decimalValue.Float64() progress := fmt.Sprint(value) + "%" l["s_progress"] = progress //同步数据库 util.Mgo.UpdateById(util.TASKCOLLNAME, l["_id"], map[string]interface{}{"$set": map[string]interface{}{"s_progress": progress}}) } } f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count}) } else { _ = f.Render("project/task_list.html") } } // GroupUserTaskList 用户任务分发列表 func (f *Front) GroupUserTaskList() { defer qu.Catch() groupId := f.GetString("s_groupid") //用户组id pid := f.GetString("pid") groupTaskId := f.GetString("grouptaskid") //用户组任务id qu.Debug("groupTaskId:", groupTaskId) if f.Method() == "POST" { start, _ := f.GetInt("start") limit, _ := f.GetInt("length") draw, _ := f.GetInt("draw") status := f.GetString("s_status") login := f.GetString("s_login") searchStr := f.GetString("search[value]") search := strings.TrimSpace(searchStr) query := map[string]interface{}{ "s_stype": "user", "s_parentid": groupTaskId, } if status != "-1" { //任务状态 query["s_status"] = status } if login != "-1" { //用户账号 query["s_login"] = login } if search != "" { query["$or"] = []interface{}{ map[string]interface{}{"s_projectname": map[string]interface{}{"$regex": search}}, } } qu.Debug("Query:", query) count := util.Mgo.Count(util.TASKCOLLNAME, query) list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, map[string]interface{}{"_id": -1}, nil, false, start, limit) for _, l := range *list { if status := qu.ObjToString(l["s_status"]); status == "进行中" { //更新任务进度 giveNum := qu.IntAll(l["i_givenum"]) sourceinfo := qu.ObjToString(l["s_sourceinfo"]) tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": mongodb.BsonIdToSId(l["_id"]), "b_istag": true}) progressFloat := float64(tagNum) / float64(giveNum) value, _ := strconv.ParseFloat(fmt.Sprintf("%.4f", progressFloat), 64) decimalValue := decimal.NewFromFloat(value) decimalValue = decimalValue.Mul(decimal.NewFromInt(100)) value, _ = decimalValue.Float64() progress := fmt.Sprint(value) + "%" l["s_progress"] = progress //同步数据库 util.Mgo.UpdateById(util.TASKCOLLNAME, l["_id"], map[string]interface{}{"$set": map[string]interface{}{"s_progress": progress}}) } } f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count}) } else { sourceinfo := f.GetString("s_sourceinfo") //统计数据量 isGiveNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_isgiveuser": true}) //已分发量 isNotGiveNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_isgiveuser": false}) //待分发量 isTagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": true}) //已标注数量 isNotTagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": false}) //未标注数量 allNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId}) //数据总量 qu.Debug("数据总量:", allNum, "已分发量:", isGiveNum, "待分发量:", isNotGiveNum, "已标注量:", isTagNum, "未标注量:", isNotTagNum) f.T["pid"] = pid f.T["gid"] = groupId f.T["grouptaskid"] = groupTaskId f.T["allNum"] = allNum f.T["isGiveNum"] = isGiveNum f.T["isNotGiveNum"] = isNotGiveNum f.T["isTagNum"] = isTagNum f.T["isNotTagNum"] = isNotTagNum if f.GetString("stype") == "jy" { f.T["jy"] = "jy" } else { f.T["group"] = "group" } _ = f.Render("project/task_detail.html", &f.T) } } // GroupTaskDeliver 用户组任务交付 func (f *Front) GroupTaskDeliver() { defer qu.Catch() user := f.GetSession("user").(map[string]interface{}) username := qu.ObjToString(user["s_login"]) //当前登录用户 success := false msg := "" groupTaskId := f.GetString("taskid") //用户组任务id qu.Debug("Group Task ID:", groupTaskId) groupTask, _ := util.Mgo.FindById(util.TASKCOLLNAME, groupTaskId, map[string]interface{}{"v_sonids": 1, "s_sourceinfo": 1, "s_projectid": 1}) if groupTask != nil && len(*groupTask) > 0 { sonUserIds := (*groupTask)["v_sonids"].([]interface{}) if len(sonUserIds) > 0 { sourceInfo := qu.ObjToString((*groupTask)["s_sourceinfo"]) dataCount := util.Mgo.Count(sourceInfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": false}) taskCount := util.Mgo.Count(util.TASKCOLLNAME, map[string]interface{}{"s_parentid": groupTaskId, "s_status": map[string]interface{}{"$in": []string{"未开始", "进行中"}}}) if dataCount == 0 && taskCount == 0 { success = util.Mgo.UpdateById(util.TASKCOLLNAME, groupTaskId, map[string]interface{}{ "$set": map[string]interface{}{ "i_completetime": time.Now().Unix(), "s_updateperson": username, "i_updatetime": time.Now().Unix(), "s_status": "已完成", "s_progress": "100%", }, }) if !success { msg = "更新任务信息失败" } } else { if taskCount != 0 { msg += "用户任务未全部完成;" } if dataCount != 0 { msg += "数据未全部标注;" } } } else { msg = "任务暂未分配" } } else { msg = "查询任务失败" } sourinfo := qu.ObjToString((*groupTask)["s_sourceinfo"]) pid := qu.ObjToString((*groupTask)["s_projectid"]) // 组任务交付 默认保存质检统计结果 mp := make(map[string]interface{}) mp["s_username"] = username mp["s_taskid"] = groupTaskId mp["i_createtime"] = time.Now().Unix() checkStat(sourinfo, groupTaskId, pid, mp) util.Mgo.Save("f_check_result", mp) // 项目下的数据全部完成,项目中打上标记b_iscomplete info, _ := util.Mgo.FindOneByField(sourinfo, map[string]interface{}{"b_istag": false}, map[string]interface{}{"s_status": 1}) if len(*info) == 0 { util.Mgo.UpdateById(util.PROJECTCOLLNAME, pid, map[string]interface{}{"$set": map[string]interface{}{"b_iscomplete": true}}) } f.ServeJson(map[string]interface{}{"success": success, "msg": msg}) } func (f *Front) TaskSyncJy() { defer qu.Catch() pid := f.GetString("pid") sourceinfo := f.GetString("s_sourceinfo") groupTaskId := f.GetString("taskid") c := syncJyData(sourceinfo, groupTaskId, pid) qu.Debug(sourceinfo, groupTaskId) //info, _ := util.Mgo.FindById(util.TASKCOLLNAME, groupTaskId, bson.M{"i_givenum": 1}) if c > 0 { util.Mgo.UpdateById(util.TASKCOLLNAME, groupTaskId, bson.M{"$set": bson.M{"sendflag": true}}) f.ServeJson(map[string]interface{}{"success": true, "msg": "数据推送成功", "count": c}) } else { f.ServeJson(map[string]interface{}{"success": false, "msg": "数据推送失败"}) } } func syncJyData(source, tid, pid string) int { sess := util.Mgo.GetMgoConn() defer util.Mgo.DestoryMongoConn(sess) ch := make(chan bool, 5) wg := &sync.WaitGroup{} var q bson.M count := 0 if pid == "650c310bc88c29b90a54b1c4" { // 联通中标数据 特殊处理 q = bson.M{"s_grouptaskid": tid, "is_repeat": 1} query := sess.DB(util.Mgo.DbName).C(source).Find(q).Select(nil).Iter() for tmp := make(map[string]interface{}); query.Next(&tmp); count++ { ch <- true wg.Add(1) go func(tmp map[string]interface{}) { defer func() { <-ch wg.Done() }() info := tmp["v_baseinfo"].(map[string]interface{}) info["createtime"] = time.Now().Unix() if qu.ObjToString(info["id"]) == "" { info["id"] = tmp["id"] } info["isOptimization"] = qu.IntAll(tmp["is_push"]) info["ispanchong"] = 1 info["earliestDay"] = qu.IntAll(tmp["earliestDay"]) util.MgoJy.Save(util.JYPushColl, info) util.Mgo.UpdateById(source, tmp["_id"], bson.M{"$set": bson.M{"sendflag": true}}) }(tmp) tmp = make(map[string]interface{}) } wg.Wait() } else if pid == "676a624edadb2b5c6413bdee" || pid == "676a6230dadb2b5c6413b691" || pid == "676e01bddadb2b5c6470ffa9" || pid == "677b52bddadb2b5c64c974c5" { // 江苏联通 招标/中标/运营商 q = bson.M{"s_grouptaskid": tid, "is_repeat": 1} query := sess.DB(util.Mgo.DbName).C(source).Find(q).Select(nil).Iter() for tmp := make(map[string]interface{}); query.Next(&tmp); count++ { ch <- true wg.Add(1) go func(tmp map[string]interface{}) { defer func() { <-ch wg.Done() }() info := tmp["v_baseinfo"].(map[string]interface{}) info["createtime"] = time.Now().Unix() if qu.ObjToString(info["id"]) == "" { info["id"] = tmp["id"] } info["isOptimization"] = qu.IntAll(tmp["is_push"]) info["ispanchong"] = 1 info["earliestDay"] = qu.IntAll(tmp["earliestDay"]) //util.MgoJy.Save(util.JYPushColl, info) delete(info, "_id") util.MgoJy.Save("usermail_tmp_js", info) util.Mgo.UpdateById(source, tmp["_id"], bson.M{"$set": bson.M{"sendflag": true}}) }(tmp) tmp = make(map[string]interface{}) } wg.Wait() } else { q = bson.M{"s_grouptaskid": tid, "sendflag": nil} query := sess.DB(util.Mgo.DbName).C(source).Find(q).Select(nil).Iter() for tmp := make(map[string]interface{}); query.Next(&tmp); count++ { ch <- true wg.Add(1) go func(tmp map[string]interface{}) { defer func() { <-ch wg.Done() }() info := tmp["v_baseinfo"].(map[string]interface{}) info["createtime"] = time.Now().Unix() if qu.ObjToString(info["id"]) == "" { info["id"] = tmp["id"] } util.MgoJy.Save(util.JYPushColl, info) util.Mgo.UpdateById(source, tmp["_id"], bson.M{"$set": bson.M{"sendflag": true}}) }(tmp) tmp = make(map[string]interface{}) } wg.Wait() } qu.Debug(fmt.Sprintf("推送数据成功,推送成功: %d条", count)) return count } func checkStat(sourceinfo, groupTaskId, pid string, mp map[string]interface{}) { sess := util.Mgo.GetMgoConn() defer util.Mgo.DestoryMongoConn(sess) var allNum int markNum, checkNum, checkNumR := 0, 0, 0 // 标注数量, 审核数据量, 审核数据完全正确的数据量 cmaps := make(map[string]int) // 标注字段整体准确率 umaps := make(map[string]interface{}) // 按人员 字段准确率 task, _ := util.Mgo.FindById(util.TASKCOLLNAME, groupTaskId, map[string]interface{}{"i_givenum": 1}) allNum = qu.IntAll((*task)["i_givenum"]) projcet, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, pid, map[string]interface{}{"v_fields": 1}) query := map[string]interface{}{"s_grouptaskid": groupTaskId} result := sess.DB(util.Mgo.DbName).C(sourceinfo).Find(query).Iter() fields := qu.ObjArrToMapArr((*projcet)["v_fields"].([]interface{})) fs := make(map[string]string) for _, v := range fields { key := qu.ObjToString(v["key"]) if key == "extend" && v["child"] != nil { for _, v1 := range qu.ObjArrToMapArr(v["child"].([]interface{})) { key1 := qu.ObjToString(v1["key"]) fs[key1] = qu.ObjToString(v1["descript"]) } } else { fs[key] = qu.ObjToString(v["descript"]) } } purchasingTag := false // 标的物统计标识 var strs []string if fs["purchasinglist"] != "" { purchasingTag = true delete(fs, "purchasinglist") } for k := range fs { strs = append(strs, k) } pNum, pEffNum := 0, 0 // 标的物数量, 标的物有效数量 fieldNumMap := make(map[string]int) //字段总标注量, tagNumMap := make(map[string]int) //字段标注数据量(标的物有效) rightNumMap := make(map[string]int) //正确数据(标的物有效) for tmp := make(map[string]interface{}); result.Next(&tmp); markNum++ { user := qu.ObjToString(tmp["s_login"]) var up map[string]int if umaps[user] == nil { up = make(map[string]int) } else { up = umaps[user].(map[string]int) } up["ck_count"] += 1 umaps[user] = up if tmp["b_check"].(bool) { if f, ok := tmp["v_checkinfo"].(map[string]interface{}); ok { flag := true // 数据整体准确率 // 按人员统计字段准备率 var up map[string]int if umaps[user] == nil { up = make(map[string]int) } else { up = umaps[user].(map[string]int) } for k1 := range cmaps { if qu.IntAll(f[k1]) == 1 { cmaps[k1] += 1 // 字段整体正确率 up[k1] += 1 } else { flag = false } } up["re_count"] += 1 umaps[user] = up if flag { checkNumR++ up["re_rg_count"] += 1 } } } if tmp["b_check"].(bool) && purchasingTag { info := tmp["v_baseinfo"].(map[string]interface{}) checkInfo := tmp["v_checkinfo"].(map[string]interface{}) if pList, o := info["purchasinglist"].([]interface{}); o { pNum += len(pList) if tmp["b_isEff"].(bool) { pEffNum += 1 } for _, p := range pList { p1 := p.(map[string]interface{}) for f := range purchasingField { if qu.ObjToString(p1[f]) != "" { fieldNumMap[f] += 1 if b, o := p1["b_isEff"].(bool); b && o { tagNumMap[f] += 1 } } } } } if cList, o := checkInfo["purchasinglist"].([]interface{}); o { for _, c := range cList { c1 := c.(map[string]interface{}) for f := range purchasingField { if qu.IntAll(c1[f]) == 1 { rightNumMap[f] += 1 } } } } } } qu.Debug(cmaps) qu.Debug(umaps) pResult := method(fieldNumMap, tagNumMap, rightNumMap) var userSelect []string var dataSelect []map[string]interface{} userSelect = append(userSelect, "全部") tmp := make(map[string]interface{}) tmp["name"] = "全部" tmp["num1"] = allNum tmp["num2"] = checkNum tmp["num3"] = checkNumR tmp["num4"] = CountPr(checkNumR, checkNum) dataSelect = append(dataSelect, tmp) sort.Strings(strs) for _, v := range strs { tmp1 := make(map[string]interface{}) tmp1["name"] = fs[v] tmp1["num1"] = markNum tmp1["num2"] = checkNum tmp1["num3"] = cmaps[v] tmp1["num4"] = CountPr(cmaps[v], checkNum) dataSelect = append(dataSelect, tmp1) } qu.Debug("字段统计---", dataSelect) qu.Debug("字段统计---", pResult) mp["taskNum"] = allNum mp["v_result"] = dataSelect mp["v_purchasing"] = pResult mp["taskCheckNum"] = checkNum mp["taskCheckRight"] = checkNumR mp["pNum"] = pNum mp["pEffNum"] = pEffNum } // 江苏联通 联合体、牵头人、牵头方 func checkDetail(tmp map[string]interface{}) { if strings.Contains(qu.ObjToString(tmp["detail"]), "联合体") || strings.Contains(qu.ObjToString(tmp["detail"]), "牵头人") || strings.Contains(qu.ObjToString(tmp["detail"]), "牵头方") { } } var modelpath string = "web/model/任务详情%d.xlsx" // GroupTaskExport 用户组任务导出 func (f *Front) GroupTaskExport() { defer qu.Catch() starttime, _ := f.GetInt("i_starttime") completetime, _ := f.GetInt("i_completetime") status := f.GetString("s_status") searchStr := f.GetString("s_search") search := strings.TrimSpace(searchStr) query := map[string]interface{}{ "s_stype": "group", } if status != "-1" { //任务状态 query["s_status"] = status } if search != "" { query["$or"] = []interface{}{ map[string]interface{}{"s_entname": map[string]interface{}{"$regex": search}}, } } if starttime > 0 { query["i_starttime"] = map[string]interface{}{ "$gte": starttime, } } if completetime > 0 { query["i_completetime"] = map[string]interface{}{ "$lte": completetime, } } qu.Debug("Query:", query) count := util.Mgo.Count(util.TASKCOLLNAME, query) if count > 0 { file, err := xlsx.OpenFile("web/model/taskexportmodel.xlsx") if err != nil { qu.Debug("Load Excel Model Error") f.ServeJson("加载脚本失败") return } sheet := file.Sheets[0] fields := map[string]interface{}{ "s_entname": 1, "s_departname": 1, "s_rulename": 1, "s_projectname": 1, "s_groupname": 1, "s_personname": 1, "i_givenum": 1, "s_status": 1, "i_starttime": 1, "i_completetime": 1, } list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, nil, fields, false, -1, -1) qu.Debug(len(*list)) for _, l := range *list { row := sheet.AddRow() entname := qu.ObjToString(l["s_entname"]) departname := qu.ObjToString(l["s_departname"]) rulename := qu.ObjToString(l["s_rulename"]) projectname := qu.ObjToString(l["s_projectname"]) groupname := qu.ObjToString(l["s_groupname"]) personname := qu.ObjToString(l["s_personname"]) givenum := qu.IntAll(l["i_givenum"]) status := qu.ObjToString(l["s_status"]) starttimestr := "" if starttime := qu.Int64All(l["i_starttime"]); starttime != 0 { starttimestr = qu.FormatDateByInt64(&starttime, qu.Date_Full_Layout) } completetimestr := "" if completetime := qu.Int64All(l["i_completetime"]); completetime != 0 { completetimestr = qu.FormatDateByInt64(&completetime, qu.Date_Full_Layout) } row.AddCell().SetValue(entname) row.AddCell().SetValue(departname) row.AddCell().SetValue(rulename) row.AddCell().SetValue(projectname) row.AddCell().SetValue(groupname) row.AddCell().SetValue(personname) row.AddCell().SetValue(givenum) row.AddCell().SetValue(status) row.AddCell().SetValue(starttimestr) row.AddCell().SetValue(completetimestr) } fname := fmt.Sprintf(modelpath, time.Now().Unix()) qu.Debug("File Name:", fname) err = file.Save(fname) if err != nil { qu.Debug("Save Excel" + fname + "Error") f.ServeJson("导出失败") return } arr := strings.Split(fname, "/") f.ResponseWriter.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", arr[len(arr)-1])) f.ServeFile(fname) go func(path string) { time.Sleep(time.Second * 30) os.Remove(path) }(fname) } else { f.ServeJson("没有数据") } } func (f *Front) GroupStatsTask() { defer qu.Catch() starttime, _ := f.GetInt("i_starttime") completetime, _ := f.GetInt("i_completetime") status := f.GetString("s_status") searchStr := f.GetString("s_search") search := strings.TrimSpace(searchStr) query := map[string]interface{}{ "s_stype": "group", } if status != "-1" { //任务状态 query["s_status"] = status } if search != "" { query["$or"] = []interface{}{ map[string]interface{}{"s_entname": map[string]interface{}{"$regex": search}}, } } if starttime > 0 { query["i_starttime"] = map[string]interface{}{ "$gte": starttime, } } if completetime > 0 { query["i_completetime"] = map[string]interface{}{ "$lte": completetime, } } qu.Debug("Query:", query) count := util.Mgo.Count(util.TASKCOLLNAME, query) if count > 0 { var ArrMap []map[string]interface{} list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, nil, nil, false, -1, -1) for i := 0; i < len(*list); i++ { if i == 0 { m, _ := Method(nil, (*list)[i]) ArrMap = append(ArrMap, m) } else { m, b := Method((*list)[i-1], (*list)[i]) if b { ArrMap = ArrMap[:len(ArrMap)-1] // 删除最后一个 ArrMap = append(ArrMap, m) } else { ArrMap = append(ArrMap, m) } } } f.T["datasource"] = ArrMap } _ = f.Render("project/task_list_stats.html") } func (f *Front) GroupStatsTaskExport() { var data []map[string]interface{} dataStr := f.GetString("param") err := json.Unmarshal([]byte(dataStr), &data) if err != nil { qu.Debug("Json Unmarshal Error") f.ServeJson(map[string]interface{}{"success": false, "msg": "解析数据失败"}) return } file, err := xlsx.OpenFile("web/model/taskstatsmodel.xlsx") if err != nil { qu.Debug("Load Excel Model Error") f.ServeJson(map[string]interface{}{"success": false, "msg": "加载脚本失败"}) return } sheet := file.Sheets[0] for _, l := range data { row := sheet.AddRow() projectname := qu.ObjToString(l["s_projectname"]) groupname := qu.ObjToString(l["s_groupname"]) datatype := qu.ObjToString(l["s_datatype"]) num := qu.IntAll(l["num"]) row.AddCell().SetValue(projectname) row.AddCell().SetValue(groupname) row.AddCell().SetValue(datatype) row.AddCell().SetValue(num) } fname := fmt.Sprintf("%d.xlsx", time.Now().Unix()) qu.Debug("File Name:", fname) err = file.Save(fname) if err != nil { qu.Debug("Save Excel" + fname + "Error") f.ServeJson(map[string]interface{}{"success": false, "msg": "文件保存失败"}) return } arr := strings.Split(fname, "/") f.ResponseWriter.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", arr[len(arr)-1])) f.ServeFile(fname) go func(path string) { time.Sleep(time.Second * 30) os.Remove(path) }(fname) f.ServeJson(map[string]interface{}{"success": true}) } func Method(lastTmp, tmp map[string]interface{}) (map[string]interface{}, bool) { if qu.ObjToString(tmp["s_datatype"]) == "招标公告" || qu.ObjToString(tmp["s_datatype"]) == "中标公告" { if lastTmp == nil { m := make(map[string]interface{}) m["s_projectid"] = tmp["s_projectid"] m["s_projectname"] = tmp["s_projectname"] m["s_groupname"] = tmp["s_groupname"] m["s_datatype"] = tmp["s_datatype"] m["num"] = tmp["i_givenum"] return m, true } else { if qu.ObjToString(lastTmp["s_projectid"]) == qu.ObjToString(tmp["s_projectid"]) && qu.ObjToString(lastTmp["s_groupname"]) == qu.ObjToString(tmp["s_groupname"]) { lastTmp["num"] = qu.IntAll(lastTmp["num"]) + qu.IntAll(tmp["num"]) return lastTmp, false } else { m := make(map[string]interface{}) m["s_projectid"] = tmp["s_projectid"] m["s_projectname"] = tmp["s_projectname"] m["s_groupname"] = tmp["s_groupname"] m["s_datatype"] = tmp["s_datatype"] m["num"] = tmp["i_givenum"] return m, true } } } else { // 标的物统计 if lastTmp == nil { m := make(map[string]interface{}) m["s_projectid"] = tmp["s_projectid"] m["s_projectname"] = tmp["s_projectname"] m["s_groupname"] = tmp["s_groupname"] m["s_datatype"] = tmp["s_datatype"] m["num"] = Method1(tmp) return m, true } else { if qu.ObjToString(lastTmp["s_projectid"]) == qu.ObjToString(tmp["s_projectid"]) && qu.ObjToString(lastTmp["s_groupname"]) == qu.ObjToString(tmp["s_groupname"]) { lastTmp["num"] = qu.IntAll(lastTmp["num"]) + Method1(tmp) return lastTmp, false } else { m := make(map[string]interface{}) m["s_projectid"] = tmp["s_projectid"] m["s_projectname"] = tmp["s_projectname"] m["s_groupname"] = tmp["s_groupname"] m["s_datatype"] = tmp["s_datatype"] m["num"] = Method1(tmp) return m, true } } } } func Method1(tmp map[string]interface{}) int { id := mongodb.BsonIdToSId(tmp["_id"]) sourceinfo := qu.ObjToString(tmp["s_sourceinfo"]) query := map[string]interface{}{"s_groupid": id, "b_isEff": true} data, _ := util.Mgo.Find(sourceinfo, query, nil, `{"v_baseinfo": 1}`, false, -1, -1) if len(*data) > 0 { count := 0 for _, m := range *data { if m1, o := m["v_baseinfo"].(map[string]interface{}); o { if m2, o1 := m1["purchasinglist"].([]interface{}); o1 { for _, m3 := range qu.ObjArrToMapArr(m2) { if m3["b_isEff"].(bool) { count++ } } } } } return count } return 0 } func (f *Front) CheckResultWb() { defer qu.Catch() pid := f.GetString("pid") tid := f.GetString("tid") sourceinfo := f.GetString("s_sourceinfo") if f.Method() == "POST" { query := map[string]interface{}{"s_taskid": tid} info, _ := util.Mgo.FindOne("f_check_result", query) if len(*info) > 0 { f.ServeJson(map[string]interface{}{"success": true}) } else { f.ServeJson(map[string]interface{}{"success": false, "msg": "用户组任务未交付"}) } } else { query := map[string]interface{}{"s_taskid": tid} info, _ := util.Mgo.FindOne("f_check_result", query) var userSelect []string userSelect = append(userSelect, "全部") f.T["pid"] = pid f.T["tid"] = tid f.T["sourceinfo"] = sourceinfo f.T["taskNum"] = (*info)["taskNum"] f.T["taskTagNum"] = (*info)["taskNum"] f.T["taskCheckNum"] = (*info)["taskCheckNum"] f.T["taskCheckRight"] = (*info)["taskCheckRight"] f.T["pNum"] = (*info)["pNum"] // 标的物数量 f.T["pEffNum"] = (*info)["pEffNum"] //标的物有效数据量 f.T["tableData"] = map[string]interface{}{"全部": (*info)["v_result"]} f.T["pResult"] = (*info)["v_purchasing"] f.T["userSelect"] = userSelect _ = f.Render("project/check_result.html", &f.T) } } func (f *Front) GroupExportData() { defer qu.Catch() sourceinfo := f.GetString("s_sourceinfo") tid := f.GetString("taskid") q := bson.M{"s_grouptaskid": tid} count := util.Mgo.Count(sourceinfo, q) if count > 0 { file, err := xlsx.OpenFile("web/model/taskexportdata.xlsx") if err != nil { qu.Debug("Load Excel Model Error") f.ServeJson("加载脚本失败") return } sheet := file.Sheets[0] fields := map[string]interface{}{ "id": 1, "v_baseinfo.package": 1, "v_baseinfo.s_winner": 1, "v_baseinfo.buyer": 1, "v_baseinfo.projectcode": 1, "v_baseinfo.projectname": 1, "v_baseinfo.title": 1, "v_baseinfo.bidamount": 1, "v_baseinfo.area": 1, "v_baseinfo.city": 1, "v_baseinfo.publishtime": 1, "v_baseinfo.href": 1, "v_baseinfo.jybxhref": 1, "v_baseinfo.multipackage": 1, "v_baseinfo.budget": 1, "v_baseinfo.toptype": 1, "v_baseinfo.subtype": 1, "tagname": 1, "tagname2": 1, "v_baseinfo.is_effective": 1, } list, _ := util.Mgo.Find(sourceinfo, q, nil, fields, false, -1, -1) for _, l := range *list { id := util.SE.EncodeString(mongodb.BsonIdToSId(l["_id"])) baseinfo := l["v_baseinfo"].(map[string]interface{}) if baseinfo["package"] != nil { pkg := baseinfo["package"].(map[string]interface{}) for _, p := range pkg { row := sheet.AddRow() p1 := p.(map[string]interface{}) winner := []string{} bidamount := float64(0) if p1["winner_all"] != nil { if all := p1["winner_all"].([]interface{}); all != nil { if len(all) > 0 { for _, a := range all { a1 := a.(map[string]interface{}) if qu.ObjToString(a1["winner"]) != "" { winner = append(winner, qu.ObjToString(a1["winner"])) } bidamount = qu.Float64All(a1["bidamount"]) } } } } row.AddCell().SetValue(util.SE.EncodeString(qu.ObjToString(l["id"]))) row.AddCell().SetValue(strings.Join(winner, ",")) row.AddCell().SetValue(qu.ObjToString(baseinfo["buyer"])) row.AddCell().SetValue(qu.ObjToString(baseinfo["projectcode"])) row.AddCell().SetValue(qu.ObjToString(baseinfo["projectname"])) row.AddCell().SetValue(qu.ObjToString(baseinfo["title"])) row.AddCell().SetValue(baseinfo["budget"]) row.AddCell().SetValue(bidamount) row.AddCell().SetValue(qu.ObjToString(baseinfo["area"])) row.AddCell().SetValue(qu.ObjToString(baseinfo["city"])) row.AddCell().SetValue(baseinfo["toptype"]) row.AddCell().SetValue(baseinfo["subtype"]) pb := qu.Int64All(baseinfo["publishtime"]) row.AddCell().SetValue(qu.FormatDateByInt64(&pb, qu.Date_Short_Layout)) row.AddCell().SetValue(qu.ObjToString(baseinfo["href"])) row.AddCell().SetValue(qu.ObjToString(baseinfo["jybxhref"])) row.AddCell().SetValue(qu.IntAll(baseinfo["multipackage"])) row.AddCell().SetValue(qu.ObjToString(l["tagname"])) row.AddCell().SetValue(qu.ObjToString(l["tagname2"])) row.AddCell().SetValue(qu.ObjToString(baseinfo["is_effective"])) if l["is_repeat"] != nil { row.AddCell().SetValue(l["is_repeat"]) } } } else { row := sheet.AddRow() row.AddCell().SetValue(id) row.AddCell().SetValue(qu.ObjToString(baseinfo["s_winner"])) row.AddCell().SetValue(qu.ObjToString(baseinfo["buyer"])) row.AddCell().SetValue(qu.ObjToString(baseinfo["projectcode"])) row.AddCell().SetValue(qu.ObjToString(baseinfo["projectname"])) row.AddCell().SetValue(qu.ObjToString(baseinfo["title"])) row.AddCell().SetValue(baseinfo["budget"]) row.AddCell().SetValue(baseinfo["bidamount"]) row.AddCell().SetValue(qu.ObjToString(baseinfo["area"])) row.AddCell().SetValue(qu.ObjToString(baseinfo["city"])) row.AddCell().SetValue(baseinfo["toptype"]) row.AddCell().SetValue(baseinfo["subtype"]) pb := qu.Int64All(baseinfo["publishtime"]) row.AddCell().SetValue(qu.FormatDateByInt64(&pb, qu.Date_Short_Layout)) row.AddCell().SetValue(qu.ObjToString(baseinfo["href"])) row.AddCell().SetValue(qu.ObjToString(baseinfo["jybxhref"])) row.AddCell().SetValue(baseinfo["multipackage"]) row.AddCell().SetValue(qu.ObjToString(l["tagname"])) row.AddCell().SetValue(qu.ObjToString(l["tagname2"])) row.AddCell().SetValue(qu.ObjToString(baseinfo["is_effective"])) if l["is_repeat"] != nil { row.AddCell().SetValue(l["is_repeat"]) } } } fname := fmt.Sprintf(modelpath, time.Now().Unix()) qu.Debug("File Name:", fname) err = file.Save(fname) if err != nil { qu.Debug("Save Excel" + fname + "Error") f.ServeJson("导出失败") return } arr := strings.Split(fname, "/") f.ResponseWriter.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", arr[len(arr)-1])) f.ServeFile(fname) go func(path string) { time.Sleep(time.Second * 30) os.Remove(path) }(fname) } else { f.ServeJson("没有数据") } } var FieldsMap = map[string]string{ "最早优选": "earliestDay", "是否重复": "is_repeat", "是否优选": "is_push", "运营商中标标签": "tagname", "主体公司": "tagname2", "中标人": "s_winner", "招标人": "buyer", "中标金额": "bidamount", "多包标识": "multipackage", } func (f *Front) GroupImportData() { defer qu.Catch() sourceinfo := f.GetString("s_sourceinfo") mf, _, err := f.GetFile("xlsx") if err != nil { f.ServeJson(map[string]interface{}{"success": false, "msg": "数据导入失败"}) } binary, _ := io.ReadAll(mf) xls, _ := xlsx.OpenBinary(binary) sheet := xls.Sheets[0] rows := sheet.Rows idcolnum := -1 cellFieldName := map[int]string{} count := 0 lastid := "" c1 := 0 // 多包第n条数据 packageM := make(map[string]interface{}) // 记录多包信息,多行用到 isPush := 0 for rn, row := range rows { update := make(map[string]interface{}) del := make(map[string]interface{}) if rn == 0 { for index, cell := range row.Cells { if cell.Value == "唯一标识" || cell.Value == "信息标识" { //id所在列 idcolnum = index } if v := FieldsMap[cell.Value]; v != "" { cellFieldName[index] = v } } if idcolnum == -1 { break } continue } else { id := row.Cells[idcolnum].String() id = util.SE.DecodeString(id) for i, f1 := range cellFieldName { if val := row.Cells[i].Value; val != "" { if f1 == "is_push" || f1 == "is_repeat" || f1 == "earliestDay" { update[f1] = qu.IntAll(val) } else if f1 == "multipackage" { update[fmt.Sprintf("v_baseinfo.%s", f1)] = qu.IntAll(val) } else if f1 == "bidamount" { update[fmt.Sprintf("v_baseinfo.%s", f1)] = qu.Float64All(val) } else { update[fmt.Sprintf("v_baseinfo.%s", f1)] = val } } else { if f1 != "is_push" { del[fmt.Sprintf("v_baseinfo.%s", f1)] = "1" } } } if qu.IntAll(update["v_baseinfo.multipackage"]) == 1 { if c1 == 0 { count++ } if c1 > 0 && lastid == id { info, _ := util.Mgo.FindById(sourceinfo, id, bson.M{"v_baseinfo.tagname": 1, "v_baseinfo.tagname2": 1, "v_baseinfo.s_winner": 1, "v_baseinfo.bidamount": 1, "v_baseinfo.package": 1}) if len(*info) > 0 { baseinfo := (*info)["v_baseinfo"].(map[string]interface{}) m := make(map[string]interface{}) if update["v_baseinfo.bidamount"] != nil { m["bidamount"] = qu.Float64All(update["v_baseinfo.bidamount"]) } if update["v_baseinfo.s_winner"] != nil { m["winner"] = qu.ObjToString(update["v_baseinfo.s_winner"]) } m["is_push"] = qu.IntAll(update["is_push"]) if qu.IntAll(update["is_push"]) == 1 { isPush = 1 } packageM[fmt.Sprint(c1)] = map[string]interface{}{"winner_all": append([]interface{}{}, m)} update["v_baseinfo.package"] = packageM if s := qu.ObjToString(baseinfo["tagname"]); s != "" && qu.ObjToString(update["v_baseinfo.tagname"]) != "" { update["v_baseinfo.tagname"] = s + "," + qu.ObjToString(update["v_baseinfo.tagname"]) } if s := qu.ObjToString(baseinfo["tagname2"]); s != "" && qu.ObjToString(update["v_baseinfo.tagname2"]) != "" { update["v_baseinfo.tagname2"] = s + "," + qu.ObjToString(update["v_baseinfo.tagname2"]) } if s := qu.ObjToString(baseinfo["s_winner"]); s != "" { update["v_baseinfo.s_winner"] = s + "," + qu.ObjToString(update["v_baseinfo.s_winner"]) } update["v_baseinfo.bidamount"] = math.Round(qu.Float64All(update["v_baseinfo.bidamount"]) + qu.Float64All(baseinfo["bidamount"])) c1++ } } else { c1 = 0 packageM = make(map[string]interface{}) m := make(map[string]interface{}) if update["v_baseinfo.bidamount"] != nil { m["bidamount"] = qu.Float64All(update["v_baseinfo.bidamount"]) } if update["v_baseinfo.s_winner"] != nil { m["winner"] = qu.ObjToString(update["v_baseinfo.s_winner"]) } m["is_push"] = qu.IntAll(update["is_push"]) if qu.IntAll(update["is_push"]) == 1 { isPush = 1 } else { isPush = 0 } packageM[fmt.Sprint(c1)] = map[string]interface{}{"winner_all": append([]interface{}{}, m)} update["v_baseinfo.package"] = packageM c1++ } } else { count++ c1 = 0 isPush = 0 } if qu.IntAll(update["v_baseinfo.multipackage"]) == 1 && isPush == 1 { update["is_push"] = 1 } lastid = id if len(del) > 0 { util.Mgo.Update(sourceinfo, bson.M{"id": id}, bson.M{"$set": update, "$unset": del}, false, false) } else { util.Mgo.Update(sourceinfo, bson.M{"id": id}, bson.M{"$set": update}, false, false) } } } f.ServeJson(map[string]interface{}{"success": true, "msg": "数据导入成功", "count": count}) } func (f *Front) StatsTasData() { tid := f.GetString("tid") sourceinfo := f.GetString("s_sourceinfo") if f.Method() == "POST" { stype := f.GetString("stype") sctype := f.GetString("sctype") n1, n2, n3 := countFuc(stype, sourceinfo, tid, sctype) f.ServeJson(map[string]interface{}{"success": true, "data": bson.M{"num": n1, "pCount": n2, "cCount": n3}}) } else { f.T["taskid"] = tid f.T["s_sourceinfo"] = sourceinfo if f.GetString("stype") == "user" { f.T["user"] = "user" isTagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": tid, "b_istag": true}) //已标注数量 allNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": tid}) //数据总量 effNum1 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": tid, "v_baseinfo.is_efficient": "是"}) // 有效数据 是 effNum2 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": tid, "v_baseinfo.is_efficient": "否"}) // 有效数据 否 effNum3 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": tid, "v_baseinfo.is_efficient": nil}) // 有效数据 空 qu.Debug("数据总量:", allNum, "已标注量:", isTagNum) f.T["allNum"] = allNum f.T["isTagNum"] = isTagNum f.T["effNum1"] = effNum1 f.T["effNum2"] = effNum2 f.T["effNum3"] = effNum3 } else if f.GetString("stype") == "group" { f.T["group"] = "group" //统计数据量 isTagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "b_istag": true}) //已标注数量 allNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid}) //数据总量`` effNum1 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "v_baseinfo.is_efficient": "是"}) // 有效数据 是 effNum2 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "v_baseinfo.is_efficient": "否"}) // 有效数据 否 effNum3 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "v_baseinfo.is_efficient": nil}) // 有效数据 空 qu.Debug("数据总量:", allNum, "已标注量:", isTagNum) f.T["allNum"] = allNum f.T["isTagNum"] = isTagNum f.T["effNum1"] = effNum1 f.T["effNum2"] = effNum2 f.T["effNum3"] = effNum3 } else { f.T["project"] = "project" //统计数据量 isTagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "b_istag": true}) //已标注数量 allNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid}) //数据总量 effNum1 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "v_baseinfo.is_efficient": "是"}) // 有效数据 是 effNum2 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "v_baseinfo.is_efficient": "否"}) // 有效数据 否 effNum3 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "v_baseinfo.is_efficient": nil}) // 有效数据 空 qu.Debug("数据总量:", allNum, "已标注量:", isTagNum) f.T["allNum"] = allNum f.T["isTagNum"] = isTagNum f.T["effNum1"] = effNum1 f.T["effNum2"] = effNum2 f.T["effNum3"] = effNum3 } _ = f.Render("project/task_stats.html", &f.T) } } func countFuc(stype, coll, tid, sctype string) (int, int, int) { field := "" // q := make(map[string]interface{}) f := make(map[string]interface{}) if sctype == "group" { q["s_grouptaskid"] = tid } else { q["s_usertaskid"] = tid } q["b_istag"] = true f["v_baseinfo.is_efficient"] = 1 if stype == "1" { f["v_baseinfo.purchasinglist"] = 1 field = "purchasinglist" } else if stype == "2" { f["v_baseinfo.procurementlist"] = 1 field = "procurementlist" } else if stype == "3" { f["v_baseinfo.package"] = 1 field = "v_baseinfo.package" } sess := util.Mgo.GetMgoConn() defer util.Mgo.DestoryMongoConn(sess) qu.Debug(q) query := sess.DB(util.Mgo.DbName).C(coll).Find(q).Select(f).Iter() count := 0 size, pCount, cCount := 0, 0, 0 //标讯数量, 标的物/多包/意向 累加数量,有效数量 for tmp := make(map[string]interface{}); query.Next(tmp); count++ { if count%2000 == 0 { qu.Debug("current ---", count) } if binfo, ok := tmp["v_baseinfo"].(map[string]interface{}); ok { if binfo["is_efficient"] == nil || qu.ObjToString(binfo["is_efficient"]) == "是" { if binfo[field] != nil { size++ if field == "package" { pCount += len(binfo[field].(map[string]interface{})) } else { pCount += len(binfo[field].([]interface{})) } } } } } return size, pCount, cCount } func (f *Front) PushRepeatData() { defer qu.Catch() sourceinfo := f.GetString("s_sourceinfo") mf, _, err := f.GetFile("xlsx") if err != nil { f.ServeJson(map[string]interface{}{"success": false, "msg": "数据导入失败"}) } binary, _ := io.ReadAll(mf) xls, _ := xlsx.OpenBinary(binary) sheet := xls.Sheets[0] rows := sheet.Rows idcolnum := -1 cellFieldName := map[int]string{} count := 0 for rn, row := range rows { update := make(map[string]interface{}) del := make(map[string]interface{}) if rn == 0 { for index, cell := range row.Cells { if cell.Value == "唯一标识" || cell.Value == "信息标识" { //id所在列 idcolnum = index } if v := FieldsMap[cell.Value]; v != "" { cellFieldName[index] = v } } if idcolnum == -1 { break } continue } else { id := row.Cells[idcolnum].String() id = util.SE.DecodeString(id) for i, f1 := range cellFieldName { if val := row.Cells[i].Value; val != "" { if f1 == "is_push" || f1 == "is_repeat" || f1 == "earliestDay" { update[f1] = qu.IntAll(val) } else if f1 == "multipackage" { update[fmt.Sprintf("v_baseinfo.%s", f1)] = qu.IntAll(val) } else if f1 == "bidamount" { update[fmt.Sprintf("v_baseinfo.%s", f1)] = qu.Float64All(val) } else { update[fmt.Sprintf("v_baseinfo.%s", f1)] = val } } else { if f1 != "is_push" { del[fmt.Sprintf("v_baseinfo.%s", f1)] = "1" } } } if len(del) > 0 { util.Mgo.UpdateById(sourceinfo, id, bson.M{"$set": update, "$unset": del}) } else { util.Mgo.UpdateById(sourceinfo, bson.M{"id": id}, bson.M{"$set": update}) } tmp, _ := util.Mgo.FindById(sourceinfo, id, nil) if (*tmp)["v_baseinfo"] == nil { qu.Debug("id------", id) return } info := (*tmp)["v_baseinfo"].(map[string]interface{}) info["createtime"] = time.Now().Unix() if qu.ObjToString(info["id"]) == "" { info["id"] = id } delete(info, "_id") info["isOptimization"] = qu.IntAll((*tmp)["is_push"]) info["ispanchong"] = 1 info["earliestDay"] = qu.IntAll((*tmp)["earliestDay"]) util.MgoJy.Save("usermail_tmp_js", info) count++ } } f.ServeJson(map[string]interface{}{"success": true, "msg": "数据导入成功", "count": count}) } func (f *Front) RepeatData() { sourceinfo := f.GetString("s_sourceinfo") groupTaskId := f.GetString("taskid") sess := util.Mgo.GetMgoConn() defer util.Mgo.DestoryMongoConn(sess) if crons.Processing { f.ServeJson(map[string]interface{}{"success": false, "msg": "定时任务保存数据中,请稍后执行"}) } else { crons.RepeatData() ch := make(chan bool, 5) wg := &sync.WaitGroup{} q := bson.M{"s_grouptaskid": groupTaskId} count := 0 query := sess.DB(util.Mgo.DbName).C(sourceinfo).Find(q).Select(nil).Iter() for tmp := make(map[string]interface{}); query.Next(&tmp); count++ { ch <- true wg.Add(1) go func(tmp map[string]interface{}) { defer func() { <-ch wg.Done() }() if getRepeat(tmp) { util.Mgo.UpdateById(sourceinfo, tmp["_id"], bson.M{"$set": bson.M{"is_repeat": 0}}) } }(tmp) tmp = make(map[string]interface{}) } wg.Wait() f.ServeJson(map[string]interface{}{"success": true, "msg": "数据判重结束"}) } } func getRepeat(tmp map[string]interface{}) bool { subtype := qu.ObjToString(tmp["subtype"]) pname := qu.ObjToString(tmp["projectname"]) pcode := qu.ObjToString(tmp["projectcode"]) city := qu.ObjToString(tmp["city"]) budget := qu.Float64All(tmp["budget"]) bidamount := qu.Float64All(tmp["bidamount"]) buyer := qu.ObjToString(tmp["buyer"]) winner := qu.ObjToString(tmp["s_winner"]) key := "" if subtype == "采购意向" { key = fmt.Sprintf(crons.CgKey, subtype, pname, budget, buyer) } else if strings.Contains("招标、邀标、竞价、竞谈、询价", subtype) { key = fmt.Sprintf(crons.ZbKey, subtype, city, pname, budget, buyer) } else if strings.Contains("中标、成交、单一", subtype) { title := qu.ObjToString(tmp["title"]) for _, vv := range crons.ItemArr { if strings.Contains(title, vv) { crons.ItemOk = true break } } if crons.ItemOk { key = fmt.Sprintf(crons.ZgbKey, "候选人公式", city, pname, bidamount, pcode, winner, buyer) } else { key = fmt.Sprintf(crons.ZgbKey, "中标通知", city, pname, bidamount, pcode, winner, buyer) } } if redis.Get("repeat", key) != nil { return true } else { return false } }