group.go 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401
  1. package front
  2. import (
  3. "crons"
  4. "dataValidation/util"
  5. "encoding/json"
  6. "fmt"
  7. "github.com/shopspring/decimal"
  8. "github.com/tealeg/xlsx"
  9. "go.mongodb.org/mongo-driver/bson"
  10. "io"
  11. qu "jygit.jydev.jianyu360.cn/data_processing/common_utils"
  12. "jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
  13. "math"
  14. "os"
  15. "qfw/util/redis"
  16. "sort"
  17. "strconv"
  18. "strings"
  19. "sync"
  20. "time"
  21. "util"
  22. )
  23. // GroupTaskListByGroup 用户组权限用户组任务列表
  24. func (f *Front) GroupTaskListByGroup() {
  25. defer qu.Catch()
  26. if f.Method() == "POST" {
  27. user := f.GetSession("user").(map[string]interface{})
  28. role := qu.ObjToString(user["i_role"])
  29. start, _ := f.GetInt("start")
  30. limit, _ := f.GetInt("length")
  31. draw, _ := f.GetInt("draw")
  32. status := f.GetString("s_status")
  33. searchStr := f.GetString("search[value]")
  34. search := strings.TrimSpace(searchStr)
  35. groupId := qu.ObjToString(user["s_groupid"])
  36. query := map[string]interface{}{
  37. "s_stype": "group", //检索用户组任务
  38. }
  39. if role != "0" {
  40. query["s_groupid"] = groupId
  41. }
  42. if status != "-1" { //任务状态
  43. query["s_status"] = status
  44. } else {
  45. query["s_status"] = map[string]interface{}{
  46. "$in": []string{"未开始", "进行中", "已完成"},
  47. }
  48. }
  49. if search != "" {
  50. query["$or"] = []interface{}{
  51. map[string]interface{}{"s_projectname": map[string]interface{}{"$regex": search}},
  52. }
  53. }
  54. qu.Debug("Query:", query)
  55. list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, map[string]interface{}{"_id": -1}, nil, false, int(start), int(limit))
  56. count := util.Mgo.Count(util.TASKCOLLNAME, query)
  57. for _, l := range *list {
  58. if status := qu.ObjToString(l["s_status"]); status == "进行中" { //更新任务进度
  59. //groupId := qu.ObjToString(l["s_groupid"])
  60. groupTaskId := mongodb.BsonIdToSId(l["_id"])
  61. giveNum := qu.IntAll(l["i_givenum"])
  62. sourceinfo := qu.ObjToString(l["s_sourceinfo"])
  63. //tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_isgivegroup": true, "s_grouptaskid": groupTaskId, "b_istag": true})
  64. tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": true})
  65. progressFloat := float64(tagNum) / float64(giveNum)
  66. value, _ := strconv.ParseFloat(fmt.Sprintf("%.4f", progressFloat), 64)
  67. decimalValue := decimal.NewFromFloat(value)
  68. decimalValue = decimalValue.Mul(decimal.NewFromInt(100))
  69. value, _ = decimalValue.Float64()
  70. progress := fmt.Sprint(value) + "%"
  71. l["s_progress"] = progress
  72. //同步数据库
  73. util.Mgo.UpdateById(util.TASKCOLLNAME, l["_id"], map[string]interface{}{"$set": map[string]interface{}{"s_progress": progress}})
  74. }
  75. }
  76. f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
  77. } else {
  78. _ = f.Render("project/task_group_list.html")
  79. }
  80. }
  81. // GroupTaskListByAdmin 系统管理员权限用户组任务列表
  82. func (f *Front) GroupTaskListByAdmin() {
  83. defer qu.Catch()
  84. if f.Method() == "POST" {
  85. start, _ := f.GetInt("start")
  86. limit, _ := f.GetInt("length")
  87. draw, _ := f.GetInt("draw")
  88. status := f.GetString("s_status")
  89. searchStr := f.GetString("search[value]")
  90. search := strings.TrimSpace(searchStr)
  91. starttime, _ := f.GetInt("i_starttime")
  92. completetime, _ := f.GetInt("i_completetime")
  93. query := map[string]interface{}{
  94. "s_stype": "group", //检索用户组任务
  95. }
  96. //if starttime > 0 {
  97. // query["i_starttime"] = map[string]interface{}{
  98. // "$gte": starttime,
  99. // }
  100. //}
  101. dataQ := make(map[string]interface{})
  102. if starttime > 0 {
  103. dataQ["$gte"] = starttime
  104. }
  105. if completetime > 0 {
  106. dataQ["$lte"] = completetime
  107. }
  108. if len(dataQ) > 0 {
  109. query["i_completetime"] = dataQ
  110. }
  111. if status != "-1" { //任务状态
  112. query["s_status"] = status
  113. } else {
  114. query["s_status"] = map[string]interface{}{
  115. "$in": []string{"未开始", "进行中", "已完成"},
  116. }
  117. }
  118. if search != "" {
  119. query["$or"] = []interface{}{
  120. map[string]interface{}{"s_projectname": map[string]interface{}{"$regex": search}},
  121. map[string]interface{}{"s_entname": map[string]interface{}{"$regex": search}},
  122. map[string]interface{}{"s_rulename": map[string]interface{}{"$regex": search}},
  123. map[string]interface{}{"s_departname": map[string]interface{}{"$regex": search}},
  124. map[string]interface{}{"s_groupname": map[string]interface{}{"$regex": search}},
  125. }
  126. }
  127. qu.Debug("Query:", query)
  128. count := util.Mgo.Count(util.TASKCOLLNAME, query)
  129. list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, map[string]interface{}{"_id": -1}, nil, false, int(start), int(limit))
  130. for _, l := range *list {
  131. if status := qu.ObjToString(l["s_status"]); status == "进行中" { //更新任务进度
  132. //groupId := qu.ObjToString(l["s_groupid"])
  133. groupTaskId := mongodb.BsonIdToSId(l["_id"])
  134. giveNum := qu.IntAll(l["i_givenum"])
  135. sourceinfo := qu.ObjToString(l["s_sourceinfo"])
  136. //tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_isgivegroup": true, "s_grouptaskid": groupTaskId, "b_istag": true})
  137. tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": true})
  138. progressFloat := float64(tagNum) / float64(giveNum)
  139. value, _ := strconv.ParseFloat(fmt.Sprintf("%.4f", progressFloat), 64)
  140. decimalValue := decimal.NewFromFloat(value)
  141. decimalValue = decimalValue.Mul(decimal.NewFromInt(100))
  142. value, _ = decimalValue.Float64()
  143. progress := fmt.Sprint(value) + "%"
  144. l["s_progress"] = progress
  145. //同步数据库
  146. util.Mgo.UpdateById(util.TASKCOLLNAME, l["_id"], map[string]interface{}{"$set": map[string]interface{}{"s_progress": progress}})
  147. }
  148. }
  149. f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
  150. } else {
  151. _ = f.Render("project/task_list.html")
  152. }
  153. }
  154. // GroupUserTaskList 用户任务分发列表
  155. func (f *Front) GroupUserTaskList() {
  156. defer qu.Catch()
  157. groupId := f.GetString("s_groupid") //用户组id
  158. pid := f.GetString("pid")
  159. groupTaskId := f.GetString("grouptaskid") //用户组任务id
  160. qu.Debug("groupTaskId:", groupTaskId)
  161. if f.Method() == "POST" {
  162. start, _ := f.GetInt("start")
  163. limit, _ := f.GetInt("length")
  164. draw, _ := f.GetInt("draw")
  165. status := f.GetString("s_status")
  166. login := f.GetString("s_login")
  167. searchStr := f.GetString("search[value]")
  168. search := strings.TrimSpace(searchStr)
  169. query := map[string]interface{}{
  170. "s_stype": "user",
  171. "s_parentid": groupTaskId,
  172. }
  173. if status != "-1" { //任务状态
  174. query["s_status"] = status
  175. }
  176. if login != "-1" { //用户账号
  177. query["s_login"] = login
  178. }
  179. if search != "" {
  180. query["$or"] = []interface{}{
  181. map[string]interface{}{"s_projectname": map[string]interface{}{"$regex": search}},
  182. }
  183. }
  184. qu.Debug("Query:", query)
  185. count := util.Mgo.Count(util.TASKCOLLNAME, query)
  186. list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, map[string]interface{}{"_id": -1}, nil, false, start, limit)
  187. for _, l := range *list {
  188. if status := qu.ObjToString(l["s_status"]); status == "进行中" { //更新任务进度
  189. giveNum := qu.IntAll(l["i_givenum"])
  190. sourceinfo := qu.ObjToString(l["s_sourceinfo"])
  191. tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": mongodb.BsonIdToSId(l["_id"]), "b_istag": true})
  192. progressFloat := float64(tagNum) / float64(giveNum)
  193. value, _ := strconv.ParseFloat(fmt.Sprintf("%.4f", progressFloat), 64)
  194. decimalValue := decimal.NewFromFloat(value)
  195. decimalValue = decimalValue.Mul(decimal.NewFromInt(100))
  196. value, _ = decimalValue.Float64()
  197. progress := fmt.Sprint(value) + "%"
  198. l["s_progress"] = progress
  199. //同步数据库
  200. util.Mgo.UpdateById(util.TASKCOLLNAME, l["_id"], map[string]interface{}{"$set": map[string]interface{}{"s_progress": progress}})
  201. }
  202. }
  203. f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
  204. } else {
  205. sourceinfo := f.GetString("s_sourceinfo")
  206. //统计数据量
  207. isGiveNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_isgiveuser": true}) //已分发量
  208. isNotGiveNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_isgiveuser": false}) //待分发量
  209. isTagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": true}) //已标注数量
  210. isNotTagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": false}) //未标注数量
  211. allNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId}) //数据总量
  212. qu.Debug("数据总量:", allNum, "已分发量:", isGiveNum, "待分发量:", isNotGiveNum, "已标注量:", isTagNum, "未标注量:", isNotTagNum)
  213. f.T["pid"] = pid
  214. f.T["gid"] = groupId
  215. f.T["grouptaskid"] = groupTaskId
  216. f.T["allNum"] = allNum
  217. f.T["isGiveNum"] = isGiveNum
  218. f.T["isNotGiveNum"] = isNotGiveNum
  219. f.T["isTagNum"] = isTagNum
  220. f.T["isNotTagNum"] = isNotTagNum
  221. if f.GetString("stype") == "jy" {
  222. f.T["jy"] = "jy"
  223. } else {
  224. f.T["group"] = "group"
  225. }
  226. _ = f.Render("project/task_detail.html", &f.T)
  227. }
  228. }
  229. // GroupTaskDeliver 用户组任务交付
  230. func (f *Front) GroupTaskDeliver() {
  231. defer qu.Catch()
  232. user := f.GetSession("user").(map[string]interface{})
  233. username := qu.ObjToString(user["s_login"]) //当前登录用户
  234. success := false
  235. msg := ""
  236. groupTaskId := f.GetString("taskid") //用户组任务id
  237. qu.Debug("Group Task ID:", groupTaskId)
  238. groupTask, _ := util.Mgo.FindById(util.TASKCOLLNAME, groupTaskId, map[string]interface{}{"v_sonids": 1, "s_sourceinfo": 1, "s_projectid": 1})
  239. if groupTask != nil && len(*groupTask) > 0 {
  240. sonUserIds := (*groupTask)["v_sonids"].([]interface{})
  241. if len(sonUserIds) > 0 {
  242. sourceInfo := qu.ObjToString((*groupTask)["s_sourceinfo"])
  243. dataCount := util.Mgo.Count(sourceInfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": false})
  244. taskCount := util.Mgo.Count(util.TASKCOLLNAME, map[string]interface{}{"s_parentid": groupTaskId, "s_status": map[string]interface{}{"$in": []string{"未开始", "进行中"}}})
  245. if dataCount == 0 && taskCount == 0 {
  246. success = util.Mgo.UpdateById(util.TASKCOLLNAME, groupTaskId, map[string]interface{}{
  247. "$set": map[string]interface{}{
  248. "i_completetime": time.Now().Unix(),
  249. "s_updateperson": username,
  250. "i_updatetime": time.Now().Unix(),
  251. "s_status": "已完成",
  252. "s_progress": "100%",
  253. },
  254. })
  255. if !success {
  256. msg = "更新任务信息失败"
  257. }
  258. } else {
  259. if taskCount != 0 {
  260. msg += "用户任务未全部完成;"
  261. }
  262. if dataCount != 0 {
  263. msg += "数据未全部标注;"
  264. }
  265. }
  266. } else {
  267. msg = "任务暂未分配"
  268. }
  269. } else {
  270. msg = "查询任务失败"
  271. }
  272. sourinfo := qu.ObjToString((*groupTask)["s_sourceinfo"])
  273. pid := qu.ObjToString((*groupTask)["s_projectid"])
  274. // 组任务交付 默认保存质检统计结果
  275. mp := make(map[string]interface{})
  276. mp["s_username"] = username
  277. mp["s_taskid"] = groupTaskId
  278. mp["i_createtime"] = time.Now().Unix()
  279. checkStat(sourinfo, groupTaskId, pid, mp)
  280. util.Mgo.Save("f_check_result", mp)
  281. // 项目下的数据全部完成,项目中打上标记b_iscomplete
  282. info, _ := util.Mgo.FindOneByField(sourinfo, map[string]interface{}{"b_istag": false}, map[string]interface{}{"s_status": 1})
  283. if len(*info) == 0 {
  284. util.Mgo.UpdateById(util.PROJECTCOLLNAME, pid, map[string]interface{}{"$set": map[string]interface{}{"b_iscomplete": true}})
  285. }
  286. f.ServeJson(map[string]interface{}{"success": success, "msg": msg})
  287. }
  288. func (f *Front) TaskSyncJy() {
  289. defer qu.Catch()
  290. pid := f.GetString("pid")
  291. sourceinfo := f.GetString("s_sourceinfo")
  292. groupTaskId := f.GetString("taskid")
  293. c := syncJyData(sourceinfo, groupTaskId, pid)
  294. qu.Debug(sourceinfo, groupTaskId)
  295. //info, _ := util.Mgo.FindById(util.TASKCOLLNAME, groupTaskId, bson.M{"i_givenum": 1})
  296. if c > 0 {
  297. util.Mgo.UpdateById(util.TASKCOLLNAME, groupTaskId, bson.M{"$set": bson.M{"sendflag": true}})
  298. f.ServeJson(map[string]interface{}{"success": true, "msg": "数据推送成功", "count": c})
  299. } else {
  300. f.ServeJson(map[string]interface{}{"success": false, "msg": "数据推送失败"})
  301. }
  302. }
  303. func syncJyData(source, tid, pid string) int {
  304. sess := util.Mgo.GetMgoConn()
  305. defer util.Mgo.DestoryMongoConn(sess)
  306. ch := make(chan bool, 5)
  307. wg := &sync.WaitGroup{}
  308. var q bson.M
  309. count := 0
  310. if pid == "650c310bc88c29b90a54b1c4" {
  311. // 联通中标数据 特殊处理
  312. q = bson.M{"s_grouptaskid": tid, "is_repeat": 1}
  313. query := sess.DB(util.Mgo.DbName).C(source).Find(q).Select(nil).Iter()
  314. for tmp := make(map[string]interface{}); query.Next(&tmp); count++ {
  315. ch <- true
  316. wg.Add(1)
  317. go func(tmp map[string]interface{}) {
  318. defer func() {
  319. <-ch
  320. wg.Done()
  321. }()
  322. info := tmp["v_baseinfo"].(map[string]interface{})
  323. info["createtime"] = time.Now().Unix()
  324. if qu.ObjToString(info["id"]) == "" {
  325. info["id"] = tmp["id"]
  326. }
  327. info["isOptimization"] = qu.IntAll(tmp["is_push"])
  328. info["ispanchong"] = 1
  329. info["earliestDay"] = qu.IntAll(tmp["earliestDay"])
  330. util.MgoJy.Save(util.JYPushColl, info)
  331. util.Mgo.UpdateById(source, tmp["_id"], bson.M{"$set": bson.M{"sendflag": true}})
  332. }(tmp)
  333. tmp = make(map[string]interface{})
  334. }
  335. wg.Wait()
  336. } else if pid == "676a624edadb2b5c6413bdee" || pid == "676a6230dadb2b5c6413b691" || pid == "676e01bddadb2b5c6470ffa9" ||
  337. pid == "677b52bddadb2b5c64c974c5" {
  338. // 江苏联通 招标/中标/运营商
  339. q = bson.M{"s_grouptaskid": tid, "is_repeat": 1}
  340. query := sess.DB(util.Mgo.DbName).C(source).Find(q).Select(nil).Iter()
  341. for tmp := make(map[string]interface{}); query.Next(&tmp); count++ {
  342. ch <- true
  343. wg.Add(1)
  344. go func(tmp map[string]interface{}) {
  345. defer func() {
  346. <-ch
  347. wg.Done()
  348. }()
  349. info := tmp["v_baseinfo"].(map[string]interface{})
  350. info["createtime"] = time.Now().Unix()
  351. if qu.ObjToString(info["id"]) == "" {
  352. info["id"] = tmp["id"]
  353. }
  354. info["isOptimization"] = qu.IntAll(tmp["is_push"])
  355. info["ispanchong"] = 1
  356. info["earliestDay"] = qu.IntAll(tmp["earliestDay"])
  357. //util.MgoJy.Save(util.JYPushColl, info)
  358. delete(info, "_id")
  359. util.MgoJy.Save("usermail_tmp_js", info)
  360. util.Mgo.UpdateById(source, tmp["_id"], bson.M{"$set": bson.M{"sendflag": true}})
  361. }(tmp)
  362. tmp = make(map[string]interface{})
  363. }
  364. wg.Wait()
  365. } else {
  366. q = bson.M{"s_grouptaskid": tid, "sendflag": nil}
  367. query := sess.DB(util.Mgo.DbName).C(source).Find(q).Select(nil).Iter()
  368. for tmp := make(map[string]interface{}); query.Next(&tmp); count++ {
  369. ch <- true
  370. wg.Add(1)
  371. go func(tmp map[string]interface{}) {
  372. defer func() {
  373. <-ch
  374. wg.Done()
  375. }()
  376. info := tmp["v_baseinfo"].(map[string]interface{})
  377. info["createtime"] = time.Now().Unix()
  378. if qu.ObjToString(info["id"]) == "" {
  379. info["id"] = tmp["id"]
  380. }
  381. util.MgoJy.Save(util.JYPushColl, info)
  382. util.Mgo.UpdateById(source, tmp["_id"], bson.M{"$set": bson.M{"sendflag": true}})
  383. }(tmp)
  384. tmp = make(map[string]interface{})
  385. }
  386. wg.Wait()
  387. }
  388. qu.Debug(fmt.Sprintf("推送数据成功,推送成功: %d条", count))
  389. return count
  390. }
  391. func checkStat(sourceinfo, groupTaskId, pid string, mp map[string]interface{}) {
  392. sess := util.Mgo.GetMgoConn()
  393. defer util.Mgo.DestoryMongoConn(sess)
  394. var allNum int
  395. markNum, checkNum, checkNumR := 0, 0, 0 // 标注数量, 审核数据量, 审核数据完全正确的数据量
  396. cmaps := make(map[string]int) // 标注字段整体准确率
  397. umaps := make(map[string]interface{}) // 按人员 字段准确率
  398. task, _ := util.Mgo.FindById(util.TASKCOLLNAME, groupTaskId, map[string]interface{}{"i_givenum": 1})
  399. allNum = qu.IntAll((*task)["i_givenum"])
  400. projcet, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, pid, map[string]interface{}{"v_fields": 1})
  401. query := map[string]interface{}{"s_grouptaskid": groupTaskId}
  402. result := sess.DB(util.Mgo.DbName).C(sourceinfo).Find(query).Iter()
  403. fields := qu.ObjArrToMapArr((*projcet)["v_fields"].([]interface{}))
  404. fs := make(map[string]string)
  405. for _, v := range fields {
  406. key := qu.ObjToString(v["key"])
  407. if key == "extend" && v["child"] != nil {
  408. for _, v1 := range qu.ObjArrToMapArr(v["child"].([]interface{})) {
  409. key1 := qu.ObjToString(v1["key"])
  410. fs[key1] = qu.ObjToString(v1["descript"])
  411. }
  412. } else {
  413. fs[key] = qu.ObjToString(v["descript"])
  414. }
  415. }
  416. purchasingTag := false // 标的物统计标识
  417. var strs []string
  418. if fs["purchasinglist"] != "" {
  419. purchasingTag = true
  420. delete(fs, "purchasinglist")
  421. }
  422. for k := range fs {
  423. strs = append(strs, k)
  424. }
  425. pNum, pEffNum := 0, 0 // 标的物数量, 标的物有效数量
  426. fieldNumMap := make(map[string]int) //字段总标注量,
  427. tagNumMap := make(map[string]int) //字段标注数据量(标的物有效)
  428. rightNumMap := make(map[string]int) //正确数据(标的物有效)
  429. for tmp := make(map[string]interface{}); result.Next(&tmp); markNum++ {
  430. user := qu.ObjToString(tmp["s_login"])
  431. var up map[string]int
  432. if umaps[user] == nil {
  433. up = make(map[string]int)
  434. } else {
  435. up = umaps[user].(map[string]int)
  436. }
  437. up["ck_count"] += 1
  438. umaps[user] = up
  439. if tmp["b_check"].(bool) {
  440. if f, ok := tmp["v_checkinfo"].(map[string]interface{}); ok {
  441. flag := true // 数据整体准确率
  442. // 按人员统计字段准备率
  443. var up map[string]int
  444. if umaps[user] == nil {
  445. up = make(map[string]int)
  446. } else {
  447. up = umaps[user].(map[string]int)
  448. }
  449. for k1 := range cmaps {
  450. if qu.IntAll(f[k1]) == 1 {
  451. cmaps[k1] += 1 // 字段整体正确率
  452. up[k1] += 1
  453. } else {
  454. flag = false
  455. }
  456. }
  457. up["re_count"] += 1
  458. umaps[user] = up
  459. if flag {
  460. checkNumR++
  461. up["re_rg_count"] += 1
  462. }
  463. }
  464. }
  465. if tmp["b_check"].(bool) && purchasingTag {
  466. info := tmp["v_baseinfo"].(map[string]interface{})
  467. checkInfo := tmp["v_checkinfo"].(map[string]interface{})
  468. if pList, o := info["purchasinglist"].([]interface{}); o {
  469. pNum += len(pList)
  470. if tmp["b_isEff"].(bool) {
  471. pEffNum += 1
  472. }
  473. for _, p := range pList {
  474. p1 := p.(map[string]interface{})
  475. for f := range purchasingField {
  476. if qu.ObjToString(p1[f]) != "" {
  477. fieldNumMap[f] += 1
  478. if b, o := p1["b_isEff"].(bool); b && o {
  479. tagNumMap[f] += 1
  480. }
  481. }
  482. }
  483. }
  484. }
  485. if cList, o := checkInfo["purchasinglist"].([]interface{}); o {
  486. for _, c := range cList {
  487. c1 := c.(map[string]interface{})
  488. for f := range purchasingField {
  489. if qu.IntAll(c1[f]) == 1 {
  490. rightNumMap[f] += 1
  491. }
  492. }
  493. }
  494. }
  495. }
  496. }
  497. qu.Debug(cmaps)
  498. qu.Debug(umaps)
  499. pResult := method(fieldNumMap, tagNumMap, rightNumMap)
  500. var userSelect []string
  501. var dataSelect []map[string]interface{}
  502. userSelect = append(userSelect, "全部")
  503. tmp := make(map[string]interface{})
  504. tmp["name"] = "全部"
  505. tmp["num1"] = allNum
  506. tmp["num2"] = checkNum
  507. tmp["num3"] = checkNumR
  508. tmp["num4"] = CountPr(checkNumR, checkNum)
  509. dataSelect = append(dataSelect, tmp)
  510. sort.Strings(strs)
  511. for _, v := range strs {
  512. tmp1 := make(map[string]interface{})
  513. tmp1["name"] = fs[v]
  514. tmp1["num1"] = markNum
  515. tmp1["num2"] = checkNum
  516. tmp1["num3"] = cmaps[v]
  517. tmp1["num4"] = CountPr(cmaps[v], checkNum)
  518. dataSelect = append(dataSelect, tmp1)
  519. }
  520. qu.Debug("字段统计---", dataSelect)
  521. qu.Debug("字段统计---", pResult)
  522. mp["taskNum"] = allNum
  523. mp["v_result"] = dataSelect
  524. mp["v_purchasing"] = pResult
  525. mp["taskCheckNum"] = checkNum
  526. mp["taskCheckRight"] = checkNumR
  527. mp["pNum"] = pNum
  528. mp["pEffNum"] = pEffNum
  529. }
  530. // 江苏联通 联合体、牵头人、牵头方
  531. func checkDetail(tmp map[string]interface{}) {
  532. if strings.Contains(qu.ObjToString(tmp["detail"]), "联合体") || strings.Contains(qu.ObjToString(tmp["detail"]), "牵头人") ||
  533. strings.Contains(qu.ObjToString(tmp["detail"]), "牵头方") {
  534. }
  535. }
  536. var modelpath string = "web/model/任务详情%d.xlsx"
  537. // GroupTaskExport 用户组任务导出
  538. func (f *Front) GroupTaskExport() {
  539. defer qu.Catch()
  540. starttime, _ := f.GetInt("i_starttime")
  541. completetime, _ := f.GetInt("i_completetime")
  542. status := f.GetString("s_status")
  543. searchStr := f.GetString("s_search")
  544. search := strings.TrimSpace(searchStr)
  545. query := map[string]interface{}{
  546. "s_stype": "group",
  547. }
  548. if status != "-1" { //任务状态
  549. query["s_status"] = status
  550. }
  551. if search != "" {
  552. query["$or"] = []interface{}{
  553. map[string]interface{}{"s_entname": map[string]interface{}{"$regex": search}},
  554. }
  555. }
  556. if starttime > 0 {
  557. query["i_starttime"] = map[string]interface{}{
  558. "$gte": starttime,
  559. }
  560. }
  561. if completetime > 0 {
  562. query["i_completetime"] = map[string]interface{}{
  563. "$lte": completetime,
  564. }
  565. }
  566. qu.Debug("Query:", query)
  567. count := util.Mgo.Count(util.TASKCOLLNAME, query)
  568. if count > 0 {
  569. file, err := xlsx.OpenFile("web/model/taskexportmodel.xlsx")
  570. if err != nil {
  571. qu.Debug("Load Excel Model Error")
  572. f.ServeJson("加载脚本失败")
  573. return
  574. }
  575. sheet := file.Sheets[0]
  576. fields := map[string]interface{}{
  577. "s_entname": 1,
  578. "s_departname": 1,
  579. "s_rulename": 1,
  580. "s_projectname": 1,
  581. "s_groupname": 1,
  582. "s_personname": 1,
  583. "i_givenum": 1,
  584. "s_status": 1,
  585. "i_starttime": 1,
  586. "i_completetime": 1,
  587. }
  588. list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, nil, fields, false, -1, -1)
  589. qu.Debug(len(*list))
  590. for _, l := range *list {
  591. row := sheet.AddRow()
  592. entname := qu.ObjToString(l["s_entname"])
  593. departname := qu.ObjToString(l["s_departname"])
  594. rulename := qu.ObjToString(l["s_rulename"])
  595. projectname := qu.ObjToString(l["s_projectname"])
  596. groupname := qu.ObjToString(l["s_groupname"])
  597. personname := qu.ObjToString(l["s_personname"])
  598. givenum := qu.IntAll(l["i_givenum"])
  599. status := qu.ObjToString(l["s_status"])
  600. starttimestr := ""
  601. if starttime := qu.Int64All(l["i_starttime"]); starttime != 0 {
  602. starttimestr = qu.FormatDateByInt64(&starttime, qu.Date_Full_Layout)
  603. }
  604. completetimestr := ""
  605. if completetime := qu.Int64All(l["i_completetime"]); completetime != 0 {
  606. completetimestr = qu.FormatDateByInt64(&completetime, qu.Date_Full_Layout)
  607. }
  608. row.AddCell().SetValue(entname)
  609. row.AddCell().SetValue(departname)
  610. row.AddCell().SetValue(rulename)
  611. row.AddCell().SetValue(projectname)
  612. row.AddCell().SetValue(groupname)
  613. row.AddCell().SetValue(personname)
  614. row.AddCell().SetValue(givenum)
  615. row.AddCell().SetValue(status)
  616. row.AddCell().SetValue(starttimestr)
  617. row.AddCell().SetValue(completetimestr)
  618. }
  619. fname := fmt.Sprintf(modelpath, time.Now().Unix())
  620. qu.Debug("File Name:", fname)
  621. err = file.Save(fname)
  622. if err != nil {
  623. qu.Debug("Save Excel" + fname + "Error")
  624. f.ServeJson("导出失败")
  625. return
  626. }
  627. arr := strings.Split(fname, "/")
  628. f.ResponseWriter.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", arr[len(arr)-1]))
  629. f.ServeFile(fname)
  630. go func(path string) {
  631. time.Sleep(time.Second * 30)
  632. os.Remove(path)
  633. }(fname)
  634. } else {
  635. f.ServeJson("没有数据")
  636. }
  637. }
  638. func (f *Front) GroupStatsTask() {
  639. defer qu.Catch()
  640. starttime, _ := f.GetInt("i_starttime")
  641. completetime, _ := f.GetInt("i_completetime")
  642. status := f.GetString("s_status")
  643. searchStr := f.GetString("s_search")
  644. search := strings.TrimSpace(searchStr)
  645. query := map[string]interface{}{
  646. "s_stype": "group",
  647. }
  648. if status != "-1" { //任务状态
  649. query["s_status"] = status
  650. }
  651. if search != "" {
  652. query["$or"] = []interface{}{
  653. map[string]interface{}{"s_entname": map[string]interface{}{"$regex": search}},
  654. }
  655. }
  656. if starttime > 0 {
  657. query["i_starttime"] = map[string]interface{}{
  658. "$gte": starttime,
  659. }
  660. }
  661. if completetime > 0 {
  662. query["i_completetime"] = map[string]interface{}{
  663. "$lte": completetime,
  664. }
  665. }
  666. qu.Debug("Query:", query)
  667. count := util.Mgo.Count(util.TASKCOLLNAME, query)
  668. if count > 0 {
  669. var ArrMap []map[string]interface{}
  670. list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, nil, nil, false, -1, -1)
  671. for i := 0; i < len(*list); i++ {
  672. if i == 0 {
  673. m, _ := Method(nil, (*list)[i])
  674. ArrMap = append(ArrMap, m)
  675. } else {
  676. m, b := Method((*list)[i-1], (*list)[i])
  677. if b {
  678. ArrMap = ArrMap[:len(ArrMap)-1] // 删除最后一个
  679. ArrMap = append(ArrMap, m)
  680. } else {
  681. ArrMap = append(ArrMap, m)
  682. }
  683. }
  684. }
  685. f.T["datasource"] = ArrMap
  686. }
  687. _ = f.Render("project/task_list_stats.html")
  688. }
  689. func (f *Front) GroupStatsTaskExport() {
  690. var data []map[string]interface{}
  691. dataStr := f.GetString("param")
  692. err := json.Unmarshal([]byte(dataStr), &data)
  693. if err != nil {
  694. qu.Debug("Json Unmarshal Error")
  695. f.ServeJson(map[string]interface{}{"success": false, "msg": "解析数据失败"})
  696. return
  697. }
  698. file, err := xlsx.OpenFile("web/model/taskstatsmodel.xlsx")
  699. if err != nil {
  700. qu.Debug("Load Excel Model Error")
  701. f.ServeJson(map[string]interface{}{"success": false, "msg": "加载脚本失败"})
  702. return
  703. }
  704. sheet := file.Sheets[0]
  705. for _, l := range data {
  706. row := sheet.AddRow()
  707. projectname := qu.ObjToString(l["s_projectname"])
  708. groupname := qu.ObjToString(l["s_groupname"])
  709. datatype := qu.ObjToString(l["s_datatype"])
  710. num := qu.IntAll(l["num"])
  711. row.AddCell().SetValue(projectname)
  712. row.AddCell().SetValue(groupname)
  713. row.AddCell().SetValue(datatype)
  714. row.AddCell().SetValue(num)
  715. }
  716. fname := fmt.Sprintf("%d.xlsx", time.Now().Unix())
  717. qu.Debug("File Name:", fname)
  718. err = file.Save(fname)
  719. if err != nil {
  720. qu.Debug("Save Excel" + fname + "Error")
  721. f.ServeJson(map[string]interface{}{"success": false, "msg": "文件保存失败"})
  722. return
  723. }
  724. arr := strings.Split(fname, "/")
  725. f.ResponseWriter.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", arr[len(arr)-1]))
  726. f.ServeFile(fname)
  727. go func(path string) {
  728. time.Sleep(time.Second * 30)
  729. os.Remove(path)
  730. }(fname)
  731. f.ServeJson(map[string]interface{}{"success": true})
  732. }
  733. func Method(lastTmp, tmp map[string]interface{}) (map[string]interface{}, bool) {
  734. if qu.ObjToString(tmp["s_datatype"]) == "招标公告" || qu.ObjToString(tmp["s_datatype"]) == "中标公告" {
  735. if lastTmp == nil {
  736. m := make(map[string]interface{})
  737. m["s_projectid"] = tmp["s_projectid"]
  738. m["s_projectname"] = tmp["s_projectname"]
  739. m["s_groupname"] = tmp["s_groupname"]
  740. m["s_datatype"] = tmp["s_datatype"]
  741. m["num"] = tmp["i_givenum"]
  742. return m, true
  743. } else {
  744. if qu.ObjToString(lastTmp["s_projectid"]) == qu.ObjToString(tmp["s_projectid"]) &&
  745. qu.ObjToString(lastTmp["s_groupname"]) == qu.ObjToString(tmp["s_groupname"]) {
  746. lastTmp["num"] = qu.IntAll(lastTmp["num"]) + qu.IntAll(tmp["num"])
  747. return lastTmp, false
  748. } else {
  749. m := make(map[string]interface{})
  750. m["s_projectid"] = tmp["s_projectid"]
  751. m["s_projectname"] = tmp["s_projectname"]
  752. m["s_groupname"] = tmp["s_groupname"]
  753. m["s_datatype"] = tmp["s_datatype"]
  754. m["num"] = tmp["i_givenum"]
  755. return m, true
  756. }
  757. }
  758. } else {
  759. // 标的物统计
  760. if lastTmp == nil {
  761. m := make(map[string]interface{})
  762. m["s_projectid"] = tmp["s_projectid"]
  763. m["s_projectname"] = tmp["s_projectname"]
  764. m["s_groupname"] = tmp["s_groupname"]
  765. m["s_datatype"] = tmp["s_datatype"]
  766. m["num"] = Method1(tmp)
  767. return m, true
  768. } else {
  769. if qu.ObjToString(lastTmp["s_projectid"]) == qu.ObjToString(tmp["s_projectid"]) &&
  770. qu.ObjToString(lastTmp["s_groupname"]) == qu.ObjToString(tmp["s_groupname"]) {
  771. lastTmp["num"] = qu.IntAll(lastTmp["num"]) + Method1(tmp)
  772. return lastTmp, false
  773. } else {
  774. m := make(map[string]interface{})
  775. m["s_projectid"] = tmp["s_projectid"]
  776. m["s_projectname"] = tmp["s_projectname"]
  777. m["s_groupname"] = tmp["s_groupname"]
  778. m["s_datatype"] = tmp["s_datatype"]
  779. m["num"] = Method1(tmp)
  780. return m, true
  781. }
  782. }
  783. }
  784. }
  785. func Method1(tmp map[string]interface{}) int {
  786. id := mongodb.BsonIdToSId(tmp["_id"])
  787. sourceinfo := qu.ObjToString(tmp["s_sourceinfo"])
  788. query := map[string]interface{}{"s_groupid": id, "b_isEff": true}
  789. data, _ := util.Mgo.Find(sourceinfo, query, nil, `{"v_baseinfo": 1}`, false, -1, -1)
  790. if len(*data) > 0 {
  791. count := 0
  792. for _, m := range *data {
  793. if m1, o := m["v_baseinfo"].(map[string]interface{}); o {
  794. if m2, o1 := m1["purchasinglist"].([]interface{}); o1 {
  795. for _, m3 := range qu.ObjArrToMapArr(m2) {
  796. if m3["b_isEff"].(bool) {
  797. count++
  798. }
  799. }
  800. }
  801. }
  802. }
  803. return count
  804. }
  805. return 0
  806. }
  807. func (f *Front) CheckResultWb() {
  808. defer qu.Catch()
  809. pid := f.GetString("pid")
  810. tid := f.GetString("tid")
  811. sourceinfo := f.GetString("s_sourceinfo")
  812. if f.Method() == "POST" {
  813. query := map[string]interface{}{"s_taskid": tid}
  814. info, _ := util.Mgo.FindOne("f_check_result", query)
  815. if len(*info) > 0 {
  816. f.ServeJson(map[string]interface{}{"success": true})
  817. } else {
  818. f.ServeJson(map[string]interface{}{"success": false, "msg": "用户组任务未交付"})
  819. }
  820. } else {
  821. query := map[string]interface{}{"s_taskid": tid}
  822. info, _ := util.Mgo.FindOne("f_check_result", query)
  823. var userSelect []string
  824. userSelect = append(userSelect, "全部")
  825. f.T["pid"] = pid
  826. f.T["tid"] = tid
  827. f.T["sourceinfo"] = sourceinfo
  828. f.T["taskNum"] = (*info)["taskNum"]
  829. f.T["taskTagNum"] = (*info)["taskNum"]
  830. f.T["taskCheckNum"] = (*info)["taskCheckNum"]
  831. f.T["taskCheckRight"] = (*info)["taskCheckRight"]
  832. f.T["pNum"] = (*info)["pNum"] // 标的物数量
  833. f.T["pEffNum"] = (*info)["pEffNum"] //标的物有效数据量
  834. f.T["tableData"] = map[string]interface{}{"全部": (*info)["v_result"]}
  835. f.T["pResult"] = (*info)["v_purchasing"]
  836. f.T["userSelect"] = userSelect
  837. _ = f.Render("project/check_result.html", &f.T)
  838. }
  839. }
  840. func (f *Front) GroupExportData() {
  841. defer qu.Catch()
  842. sourceinfo := f.GetString("s_sourceinfo")
  843. tid := f.GetString("taskid")
  844. q := bson.M{"s_grouptaskid": tid}
  845. count := util.Mgo.Count(sourceinfo, q)
  846. if count > 0 {
  847. file, err := xlsx.OpenFile("web/model/taskexportdata.xlsx")
  848. if err != nil {
  849. qu.Debug("Load Excel Model Error")
  850. f.ServeJson("加载脚本失败")
  851. return
  852. }
  853. sheet := file.Sheets[0]
  854. fields := map[string]interface{}{
  855. "id": 1,
  856. "v_baseinfo.package": 1,
  857. "v_baseinfo.s_winner": 1,
  858. "v_baseinfo.buyer": 1,
  859. "v_baseinfo.projectcode": 1,
  860. "v_baseinfo.projectname": 1,
  861. "v_baseinfo.title": 1,
  862. "v_baseinfo.bidamount": 1,
  863. "v_baseinfo.area": 1,
  864. "v_baseinfo.city": 1,
  865. "v_baseinfo.publishtime": 1,
  866. "v_baseinfo.href": 1,
  867. "v_baseinfo.jybxhref": 1,
  868. "v_baseinfo.multipackage": 1,
  869. "v_baseinfo.budget": 1,
  870. "v_baseinfo.toptype": 1,
  871. "v_baseinfo.subtype": 1,
  872. "tagname": 1,
  873. "tagname2": 1,
  874. "v_baseinfo.is_effective": 1,
  875. }
  876. list, _ := util.Mgo.Find(sourceinfo, q, nil, fields, false, -1, -1)
  877. for _, l := range *list {
  878. id := util.SE.EncodeString(mongodb.BsonIdToSId(l["_id"]))
  879. baseinfo := l["v_baseinfo"].(map[string]interface{})
  880. if baseinfo["package"] != nil {
  881. pkg := baseinfo["package"].(map[string]interface{})
  882. for _, p := range pkg {
  883. row := sheet.AddRow()
  884. p1 := p.(map[string]interface{})
  885. winner := []string{}
  886. bidamount := float64(0)
  887. if p1["winner_all"] != nil {
  888. if all := p1["winner_all"].([]interface{}); all != nil {
  889. if len(all) > 0 {
  890. for _, a := range all {
  891. a1 := a.(map[string]interface{})
  892. if qu.ObjToString(a1["winner"]) != "" {
  893. winner = append(winner, qu.ObjToString(a1["winner"]))
  894. }
  895. bidamount = qu.Float64All(a1["bidamount"])
  896. }
  897. }
  898. }
  899. }
  900. row.AddCell().SetValue(util.SE.EncodeString(qu.ObjToString(l["id"])))
  901. row.AddCell().SetValue(strings.Join(winner, ","))
  902. row.AddCell().SetValue(qu.ObjToString(baseinfo["buyer"]))
  903. row.AddCell().SetValue(qu.ObjToString(baseinfo["projectcode"]))
  904. row.AddCell().SetValue(qu.ObjToString(baseinfo["projectname"]))
  905. row.AddCell().SetValue(qu.ObjToString(baseinfo["title"]))
  906. row.AddCell().SetValue(baseinfo["budget"])
  907. row.AddCell().SetValue(bidamount)
  908. row.AddCell().SetValue(qu.ObjToString(baseinfo["area"]))
  909. row.AddCell().SetValue(qu.ObjToString(baseinfo["city"]))
  910. row.AddCell().SetValue(baseinfo["toptype"])
  911. row.AddCell().SetValue(baseinfo["subtype"])
  912. pb := qu.Int64All(baseinfo["publishtime"])
  913. row.AddCell().SetValue(qu.FormatDateByInt64(&pb, qu.Date_Short_Layout))
  914. row.AddCell().SetValue(qu.ObjToString(baseinfo["href"]))
  915. row.AddCell().SetValue(qu.ObjToString(baseinfo["jybxhref"]))
  916. row.AddCell().SetValue(qu.IntAll(baseinfo["multipackage"]))
  917. row.AddCell().SetValue(qu.ObjToString(l["tagname"]))
  918. row.AddCell().SetValue(qu.ObjToString(l["tagname2"]))
  919. row.AddCell().SetValue(qu.ObjToString(baseinfo["is_effective"]))
  920. if l["is_repeat"] != nil {
  921. row.AddCell().SetValue(l["is_repeat"])
  922. }
  923. }
  924. } else {
  925. row := sheet.AddRow()
  926. row.AddCell().SetValue(id)
  927. row.AddCell().SetValue(qu.ObjToString(baseinfo["s_winner"]))
  928. row.AddCell().SetValue(qu.ObjToString(baseinfo["buyer"]))
  929. row.AddCell().SetValue(qu.ObjToString(baseinfo["projectcode"]))
  930. row.AddCell().SetValue(qu.ObjToString(baseinfo["projectname"]))
  931. row.AddCell().SetValue(qu.ObjToString(baseinfo["title"]))
  932. row.AddCell().SetValue(baseinfo["budget"])
  933. row.AddCell().SetValue(baseinfo["bidamount"])
  934. row.AddCell().SetValue(qu.ObjToString(baseinfo["area"]))
  935. row.AddCell().SetValue(qu.ObjToString(baseinfo["city"]))
  936. row.AddCell().SetValue(baseinfo["toptype"])
  937. row.AddCell().SetValue(baseinfo["subtype"])
  938. pb := qu.Int64All(baseinfo["publishtime"])
  939. row.AddCell().SetValue(qu.FormatDateByInt64(&pb, qu.Date_Short_Layout))
  940. row.AddCell().SetValue(qu.ObjToString(baseinfo["href"]))
  941. row.AddCell().SetValue(qu.ObjToString(baseinfo["jybxhref"]))
  942. row.AddCell().SetValue(baseinfo["multipackage"])
  943. row.AddCell().SetValue(qu.ObjToString(l["tagname"]))
  944. row.AddCell().SetValue(qu.ObjToString(l["tagname2"]))
  945. row.AddCell().SetValue(qu.ObjToString(baseinfo["is_effective"]))
  946. if l["is_repeat"] != nil {
  947. row.AddCell().SetValue(l["is_repeat"])
  948. }
  949. }
  950. }
  951. fname := fmt.Sprintf(modelpath, time.Now().Unix())
  952. qu.Debug("File Name:", fname)
  953. err = file.Save(fname)
  954. if err != nil {
  955. qu.Debug("Save Excel" + fname + "Error")
  956. f.ServeJson("导出失败")
  957. return
  958. }
  959. arr := strings.Split(fname, "/")
  960. f.ResponseWriter.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", arr[len(arr)-1]))
  961. f.ServeFile(fname)
  962. go func(path string) {
  963. time.Sleep(time.Second * 30)
  964. os.Remove(path)
  965. }(fname)
  966. } else {
  967. f.ServeJson("没有数据")
  968. }
  969. }
  970. var FieldsMap = map[string]string{
  971. "最早优选": "earliestDay",
  972. "是否重复": "is_repeat",
  973. "是否优选": "is_push",
  974. "运营商中标标签": "tagname",
  975. "主体公司": "tagname2",
  976. "中标人": "s_winner",
  977. "招标人": "buyer",
  978. "中标金额": "bidamount",
  979. "多包标识": "multipackage",
  980. }
  981. func (f *Front) GroupImportData() {
  982. defer qu.Catch()
  983. sourceinfo := f.GetString("s_sourceinfo")
  984. mf, _, err := f.GetFile("xlsx")
  985. if err != nil {
  986. f.ServeJson(map[string]interface{}{"success": false, "msg": "数据导入失败"})
  987. }
  988. binary, _ := io.ReadAll(mf)
  989. xls, _ := xlsx.OpenBinary(binary)
  990. sheet := xls.Sheets[0]
  991. rows := sheet.Rows
  992. idcolnum := -1
  993. cellFieldName := map[int]string{}
  994. count := 0
  995. lastid := ""
  996. c1 := 0 // 多包第n条数据
  997. packageM := make(map[string]interface{}) // 记录多包信息,多行用到
  998. isPush := 0
  999. for rn, row := range rows {
  1000. update := make(map[string]interface{})
  1001. del := make(map[string]interface{})
  1002. if rn == 0 {
  1003. for index, cell := range row.Cells {
  1004. if cell.Value == "唯一标识" || cell.Value == "信息标识" { //id所在列
  1005. idcolnum = index
  1006. }
  1007. if v := FieldsMap[cell.Value]; v != "" {
  1008. cellFieldName[index] = v
  1009. }
  1010. }
  1011. if idcolnum == -1 {
  1012. break
  1013. }
  1014. continue
  1015. } else {
  1016. id := row.Cells[idcolnum].String()
  1017. id = util.SE.DecodeString(id)
  1018. for i, f1 := range cellFieldName {
  1019. if val := row.Cells[i].Value; val != "" {
  1020. if f1 == "is_push" || f1 == "is_repeat" || f1 == "earliestDay" {
  1021. update[f1] = qu.IntAll(val)
  1022. } else if f1 == "multipackage" {
  1023. update[fmt.Sprintf("v_baseinfo.%s", f1)] = qu.IntAll(val)
  1024. } else if f1 == "bidamount" {
  1025. update[fmt.Sprintf("v_baseinfo.%s", f1)] = qu.Float64All(val)
  1026. } else {
  1027. update[fmt.Sprintf("v_baseinfo.%s", f1)] = val
  1028. }
  1029. } else {
  1030. if f1 != "is_push" {
  1031. del[fmt.Sprintf("v_baseinfo.%s", f1)] = "1"
  1032. }
  1033. }
  1034. }
  1035. if qu.IntAll(update["v_baseinfo.multipackage"]) == 1 {
  1036. if c1 == 0 {
  1037. count++
  1038. }
  1039. if c1 > 0 && lastid == id {
  1040. info, _ := util.Mgo.FindById(sourceinfo, id, bson.M{"v_baseinfo.tagname": 1, "v_baseinfo.tagname2": 1, "v_baseinfo.s_winner": 1,
  1041. "v_baseinfo.bidamount": 1, "v_baseinfo.package": 1})
  1042. if len(*info) > 0 {
  1043. baseinfo := (*info)["v_baseinfo"].(map[string]interface{})
  1044. m := make(map[string]interface{})
  1045. if update["v_baseinfo.bidamount"] != nil {
  1046. m["bidamount"] = qu.Float64All(update["v_baseinfo.bidamount"])
  1047. }
  1048. if update["v_baseinfo.s_winner"] != nil {
  1049. m["winner"] = qu.ObjToString(update["v_baseinfo.s_winner"])
  1050. }
  1051. m["is_push"] = qu.IntAll(update["is_push"])
  1052. if qu.IntAll(update["is_push"]) == 1 {
  1053. isPush = 1
  1054. }
  1055. packageM[fmt.Sprint(c1)] = map[string]interface{}{"winner_all": append([]interface{}{}, m)}
  1056. update["v_baseinfo.package"] = packageM
  1057. if s := qu.ObjToString(baseinfo["tagname"]); s != "" && qu.ObjToString(update["v_baseinfo.tagname"]) != "" {
  1058. update["v_baseinfo.tagname"] = s + "," + qu.ObjToString(update["v_baseinfo.tagname"])
  1059. }
  1060. if s := qu.ObjToString(baseinfo["tagname2"]); s != "" && qu.ObjToString(update["v_baseinfo.tagname2"]) != "" {
  1061. update["v_baseinfo.tagname2"] = s + "," + qu.ObjToString(update["v_baseinfo.tagname2"])
  1062. }
  1063. if s := qu.ObjToString(baseinfo["s_winner"]); s != "" {
  1064. update["v_baseinfo.s_winner"] = s + "," + qu.ObjToString(update["v_baseinfo.s_winner"])
  1065. }
  1066. update["v_baseinfo.bidamount"] = math.Round(qu.Float64All(update["v_baseinfo.bidamount"]) + qu.Float64All(baseinfo["bidamount"]))
  1067. c1++
  1068. }
  1069. } else {
  1070. c1 = 0
  1071. packageM = make(map[string]interface{})
  1072. m := make(map[string]interface{})
  1073. if update["v_baseinfo.bidamount"] != nil {
  1074. m["bidamount"] = qu.Float64All(update["v_baseinfo.bidamount"])
  1075. }
  1076. if update["v_baseinfo.s_winner"] != nil {
  1077. m["winner"] = qu.ObjToString(update["v_baseinfo.s_winner"])
  1078. }
  1079. m["is_push"] = qu.IntAll(update["is_push"])
  1080. if qu.IntAll(update["is_push"]) == 1 {
  1081. isPush = 1
  1082. } else {
  1083. isPush = 0
  1084. }
  1085. packageM[fmt.Sprint(c1)] = map[string]interface{}{"winner_all": append([]interface{}{}, m)}
  1086. update["v_baseinfo.package"] = packageM
  1087. c1++
  1088. }
  1089. } else {
  1090. count++
  1091. c1 = 0
  1092. isPush = 0
  1093. }
  1094. if qu.IntAll(update["v_baseinfo.multipackage"]) == 1 && isPush == 1 {
  1095. update["is_push"] = 1
  1096. }
  1097. lastid = id
  1098. if len(del) > 0 {
  1099. util.Mgo.Update(sourceinfo, bson.M{"id": id}, bson.M{"$set": update, "$unset": del}, false, false)
  1100. } else {
  1101. util.Mgo.Update(sourceinfo, bson.M{"id": id}, bson.M{"$set": update}, false, false)
  1102. }
  1103. }
  1104. }
  1105. f.ServeJson(map[string]interface{}{"success": true, "msg": "数据导入成功", "count": count})
  1106. }
  1107. func (f *Front) StatsTasData() {
  1108. tid := f.GetString("tid")
  1109. sourceinfo := f.GetString("s_sourceinfo")
  1110. if f.Method() == "POST" {
  1111. stype := f.GetString("stype")
  1112. sctype := f.GetString("sctype")
  1113. n1, n2, n3 := countFuc(stype, sourceinfo, tid, sctype)
  1114. f.ServeJson(map[string]interface{}{"success": true, "data": bson.M{"num": n1, "pCount": n2, "cCount": n3}})
  1115. } else {
  1116. f.T["taskid"] = tid
  1117. f.T["s_sourceinfo"] = sourceinfo
  1118. if f.GetString("stype") == "user" {
  1119. f.T["user"] = "user"
  1120. isTagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": tid, "b_istag": true}) //已标注数量
  1121. allNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": tid}) //数据总量
  1122. effNum1 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": tid, "v_baseinfo.is_efficient": "是"}) // 有效数据 是
  1123. effNum2 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": tid, "v_baseinfo.is_efficient": "否"}) // 有效数据 否
  1124. effNum3 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": tid, "v_baseinfo.is_efficient": nil}) // 有效数据 空
  1125. qu.Debug("数据总量:", allNum, "已标注量:", isTagNum)
  1126. f.T["allNum"] = allNum
  1127. f.T["isTagNum"] = isTagNum
  1128. f.T["effNum1"] = effNum1
  1129. f.T["effNum2"] = effNum2
  1130. f.T["effNum3"] = effNum3
  1131. } else if f.GetString("stype") == "group" {
  1132. f.T["group"] = "group"
  1133. //统计数据量
  1134. isTagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "b_istag": true}) //已标注数量
  1135. allNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid}) //数据总量``
  1136. effNum1 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "v_baseinfo.is_efficient": "是"}) // 有效数据 是
  1137. effNum2 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "v_baseinfo.is_efficient": "否"}) // 有效数据 否
  1138. effNum3 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "v_baseinfo.is_efficient": nil}) // 有效数据 空
  1139. qu.Debug("数据总量:", allNum, "已标注量:", isTagNum)
  1140. f.T["allNum"] = allNum
  1141. f.T["isTagNum"] = isTagNum
  1142. f.T["effNum1"] = effNum1
  1143. f.T["effNum2"] = effNum2
  1144. f.T["effNum3"] = effNum3
  1145. } else {
  1146. f.T["project"] = "project"
  1147. //统计数据量
  1148. isTagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "b_istag": true}) //已标注数量
  1149. allNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid}) //数据总量
  1150. effNum1 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "v_baseinfo.is_efficient": "是"}) // 有效数据 是
  1151. effNum2 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "v_baseinfo.is_efficient": "否"}) // 有效数据 否
  1152. effNum3 := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "v_baseinfo.is_efficient": nil}) // 有效数据 空
  1153. qu.Debug("数据总量:", allNum, "已标注量:", isTagNum)
  1154. f.T["allNum"] = allNum
  1155. f.T["isTagNum"] = isTagNum
  1156. f.T["effNum1"] = effNum1
  1157. f.T["effNum2"] = effNum2
  1158. f.T["effNum3"] = effNum3
  1159. }
  1160. _ = f.Render("project/task_stats.html", &f.T)
  1161. }
  1162. }
  1163. func countFuc(stype, coll, tid, sctype string) (int, int, int) {
  1164. field := "" //
  1165. q := make(map[string]interface{})
  1166. f := make(map[string]interface{})
  1167. if sctype == "group" {
  1168. q["s_grouptaskid"] = tid
  1169. } else {
  1170. q["s_usertaskid"] = tid
  1171. }
  1172. q["b_istag"] = true
  1173. f["v_baseinfo.is_efficient"] = 1
  1174. if stype == "1" {
  1175. f["v_baseinfo.purchasinglist"] = 1
  1176. field = "purchasinglist"
  1177. } else if stype == "2" {
  1178. f["v_baseinfo.procurementlist"] = 1
  1179. field = "procurementlist"
  1180. } else if stype == "3" {
  1181. f["v_baseinfo.package"] = 1
  1182. field = "v_baseinfo.package"
  1183. }
  1184. sess := util.Mgo.GetMgoConn()
  1185. defer util.Mgo.DestoryMongoConn(sess)
  1186. qu.Debug(q)
  1187. query := sess.DB(util.Mgo.DbName).C(coll).Find(q).Select(f).Iter()
  1188. count := 0
  1189. size, pCount, cCount := 0, 0, 0 //标讯数量, 标的物/多包/意向 累加数量,有效数量
  1190. for tmp := make(map[string]interface{}); query.Next(tmp); count++ {
  1191. if count%2000 == 0 {
  1192. qu.Debug("current ---", count)
  1193. }
  1194. if binfo, ok := tmp["v_baseinfo"].(map[string]interface{}); ok {
  1195. if binfo["is_efficient"] == nil || qu.ObjToString(binfo["is_efficient"]) == "是" {
  1196. if binfo[field] != nil {
  1197. size++
  1198. if field == "package" {
  1199. pCount += len(binfo[field].(map[string]interface{}))
  1200. } else {
  1201. pCount += len(binfo[field].([]interface{}))
  1202. }
  1203. }
  1204. }
  1205. }
  1206. }
  1207. return size, pCount, cCount
  1208. }
  1209. func (f *Front) PushRepeatData() {
  1210. defer qu.Catch()
  1211. sourceinfo := f.GetString("s_sourceinfo")
  1212. mf, _, err := f.GetFile("xlsx")
  1213. if err != nil {
  1214. f.ServeJson(map[string]interface{}{"success": false, "msg": "数据导入失败"})
  1215. }
  1216. binary, _ := io.ReadAll(mf)
  1217. xls, _ := xlsx.OpenBinary(binary)
  1218. sheet := xls.Sheets[0]
  1219. rows := sheet.Rows
  1220. idcolnum := -1
  1221. cellFieldName := map[int]string{}
  1222. count := 0
  1223. for rn, row := range rows {
  1224. update := make(map[string]interface{})
  1225. del := make(map[string]interface{})
  1226. if rn == 0 {
  1227. for index, cell := range row.Cells {
  1228. if cell.Value == "唯一标识" || cell.Value == "信息标识" { //id所在列
  1229. idcolnum = index
  1230. }
  1231. if v := FieldsMap[cell.Value]; v != "" {
  1232. cellFieldName[index] = v
  1233. }
  1234. }
  1235. if idcolnum == -1 {
  1236. break
  1237. }
  1238. continue
  1239. } else {
  1240. id := row.Cells[idcolnum].String()
  1241. id = util.SE.DecodeString(id)
  1242. for i, f1 := range cellFieldName {
  1243. if val := row.Cells[i].Value; val != "" {
  1244. if f1 == "is_push" || f1 == "is_repeat" || f1 == "earliestDay" {
  1245. update[f1] = qu.IntAll(val)
  1246. } else if f1 == "multipackage" {
  1247. update[fmt.Sprintf("v_baseinfo.%s", f1)] = qu.IntAll(val)
  1248. } else if f1 == "bidamount" {
  1249. update[fmt.Sprintf("v_baseinfo.%s", f1)] = qu.Float64All(val)
  1250. } else {
  1251. update[fmt.Sprintf("v_baseinfo.%s", f1)] = val
  1252. }
  1253. } else {
  1254. if f1 != "is_push" {
  1255. del[fmt.Sprintf("v_baseinfo.%s", f1)] = "1"
  1256. }
  1257. }
  1258. }
  1259. if len(del) > 0 {
  1260. util.Mgo.UpdateById(sourceinfo, id, bson.M{"$set": update, "$unset": del})
  1261. } else {
  1262. util.Mgo.UpdateById(sourceinfo, bson.M{"id": id}, bson.M{"$set": update})
  1263. }
  1264. tmp, _ := util.Mgo.FindById(sourceinfo, id, nil)
  1265. if (*tmp)["v_baseinfo"] == nil {
  1266. qu.Debug("id------", id)
  1267. return
  1268. }
  1269. info := (*tmp)["v_baseinfo"].(map[string]interface{})
  1270. info["createtime"] = time.Now().Unix()
  1271. if qu.ObjToString(info["id"]) == "" {
  1272. info["id"] = id
  1273. }
  1274. delete(info, "_id")
  1275. info["isOptimization"] = qu.IntAll((*tmp)["is_push"])
  1276. info["ispanchong"] = 1
  1277. info["earliestDay"] = qu.IntAll((*tmp)["earliestDay"])
  1278. util.MgoJy.Save("usermail_tmp_js", info)
  1279. count++
  1280. }
  1281. }
  1282. f.ServeJson(map[string]interface{}{"success": true, "msg": "数据导入成功", "count": count})
  1283. }
  1284. func (f *Front) RepeatData() {
  1285. sourceinfo := f.GetString("s_sourceinfo")
  1286. groupTaskId := f.GetString("taskid")
  1287. sess := util.Mgo.GetMgoConn()
  1288. defer util.Mgo.DestoryMongoConn(sess)
  1289. if crons.Processing {
  1290. f.ServeJson(map[string]interface{}{"success": false, "msg": "定时任务保存数据中,请稍后执行"})
  1291. } else {
  1292. crons.RepeatData()
  1293. ch := make(chan bool, 5)
  1294. wg := &sync.WaitGroup{}
  1295. q := bson.M{"s_grouptaskid": groupTaskId}
  1296. count := 0
  1297. query := sess.DB(util.Mgo.DbName).C(sourceinfo).Find(q).Select(nil).Iter()
  1298. for tmp := make(map[string]interface{}); query.Next(&tmp); count++ {
  1299. ch <- true
  1300. wg.Add(1)
  1301. go func(tmp map[string]interface{}) {
  1302. defer func() {
  1303. <-ch
  1304. wg.Done()
  1305. }()
  1306. if getRepeat(tmp) {
  1307. util.Mgo.UpdateById(sourceinfo, tmp["_id"], bson.M{"$set": bson.M{"is_repeat": 0}})
  1308. }
  1309. }(tmp)
  1310. tmp = make(map[string]interface{})
  1311. }
  1312. wg.Wait()
  1313. f.ServeJson(map[string]interface{}{"success": true, "msg": "数据判重结束"})
  1314. }
  1315. }
  1316. func getRepeat(tmp map[string]interface{}) bool {
  1317. subtype := qu.ObjToString(tmp["subtype"])
  1318. pname := qu.ObjToString(tmp["projectname"])
  1319. pcode := qu.ObjToString(tmp["projectcode"])
  1320. city := qu.ObjToString(tmp["city"])
  1321. budget := qu.Float64All(tmp["budget"])
  1322. bidamount := qu.Float64All(tmp["bidamount"])
  1323. buyer := qu.ObjToString(tmp["buyer"])
  1324. winner := qu.ObjToString(tmp["s_winner"])
  1325. key := ""
  1326. if subtype == "采购意向" {
  1327. key = fmt.Sprintf(crons.CgKey, subtype, pname, budget, buyer)
  1328. } else if strings.Contains("招标、邀标、竞价、竞谈、询价", subtype) {
  1329. key = fmt.Sprintf(crons.ZbKey, subtype, city, pname, budget, buyer)
  1330. } else if strings.Contains("中标、成交、单一", subtype) {
  1331. title := qu.ObjToString(tmp["title"])
  1332. for _, vv := range crons.ItemArr {
  1333. if strings.Contains(title, vv) {
  1334. crons.ItemOk = true
  1335. break
  1336. }
  1337. }
  1338. if crons.ItemOk {
  1339. key = fmt.Sprintf(crons.ZgbKey, "候选人公式", city, pname, bidamount, pcode, winner, buyer)
  1340. } else {
  1341. key = fmt.Sprintf(crons.ZgbKey, "中标通知", city, pname, bidamount, pcode, winner, buyer)
  1342. }
  1343. }
  1344. if redis.Get("repeat", key) != nil {
  1345. return true
  1346. } else {
  1347. return false
  1348. }
  1349. }