group.go 39 KB

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