group.go 43 KB

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