group.go 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013
  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. groupTaskId := f.GetString("taskid")
  281. c := syncJyData(groupTaskId, pid)
  282. qu.Debug(util.DATACOLLNAME, groupTaskId)
  283. //info, _ := util.Mgo.FindById(util.TASKCOLLNAME, groupTaskId, bson.M{"i_givenum": 1})
  284. if c > 0 {
  285. util.Mgo.UpdateById(util.TASKCOLLNAME, groupTaskId, bson.M{"$set": bson.M{"sendflag": true}})
  286. f.ServeJson(map[string]interface{}{"success": true, "msg": "数据推送成功", "count": c})
  287. } else {
  288. f.ServeJson(map[string]interface{}{"success": false, "msg": "数据推送失败"})
  289. }
  290. }
  291. func syncJyData(tid, pid string) int {
  292. sess := util.Mgo.GetMgoConn()
  293. defer util.Mgo.DestoryMongoConn(sess)
  294. ch := make(chan bool, 5)
  295. wg := &sync.WaitGroup{}
  296. var q bson.M
  297. if pid == "650c310bc88c29b90a54b1c4" {
  298. // 联通中标数据 特殊处理
  299. q = bson.M{"s_grouptaskid": tid, "is_push": 1}
  300. } else {
  301. q = bson.M{"s_grouptaskid": tid, "sendflag": nil}
  302. }
  303. query := sess.DB(util.Mgo.DbName).C(util.DATACOLLNAME).Find(q).Select(nil).Iter()
  304. count := 0
  305. for tmp := make(map[string]interface{}); query.Next(&tmp); count++ {
  306. ch <- true
  307. wg.Add(1)
  308. go func(tmp map[string]interface{}) {
  309. defer func() {
  310. <-ch
  311. wg.Done()
  312. }()
  313. info := tmp["v_baseinfo"].(map[string]interface{})
  314. info["createtime"] = time.Now().Unix()
  315. if qu.ObjToString(info["id"]) == "" {
  316. info["id"] = tmp["id"]
  317. }
  318. info["isOptimization"] = 1
  319. util.MgoJy.Save(util.JYPushColl, info)
  320. util.Mgo.UpdateById(util.DATACOLLNAME, tmp["_id"], bson.M{"$set": bson.M{"sendflag": true}})
  321. }(tmp)
  322. tmp = make(map[string]interface{})
  323. }
  324. wg.Wait()
  325. qu.Debug(fmt.Sprintf("推送数据成功,推送成功: %d条", count))
  326. return count
  327. }
  328. func checkStat(groupTaskId, pid string, mp map[string]interface{}) {
  329. sess := util.Mgo.GetMgoConn()
  330. defer util.Mgo.DestoryMongoConn(sess)
  331. var allNum int
  332. markNum, checkNum, checkNumR := 0, 0, 0 // 标注数量, 审核数据量, 审核数据完全正确的数据量
  333. cmaps := make(map[string]int) // 标注字段整体准确率
  334. umaps := make(map[string]interface{}) // 按人员 字段准确率
  335. task, _ := util.Mgo.FindById(util.TASKCOLLNAME, groupTaskId, map[string]interface{}{"i_givenum": 1})
  336. allNum = qu.IntAll((*task)["i_givenum"])
  337. projcet, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, pid, map[string]interface{}{"v_fields": 1})
  338. query := map[string]interface{}{"s_grouptaskid": groupTaskId}
  339. result := sess.DB(util.Mgo.DbName).C(util.DATACOLLNAME).Find(query).Iter()
  340. fields := qu.ObjArrToMapArr((*projcet)["v_fields"].([]interface{}))
  341. fs := make(map[string]string)
  342. for _, v := range fields {
  343. key := qu.ObjToString(v["key"])
  344. if key == "extend" && v["child"] != nil {
  345. for _, v1 := range qu.ObjArrToMapArr(v["child"].([]interface{})) {
  346. key1 := qu.ObjToString(v1["key"])
  347. fs[key1] = qu.ObjToString(v1["descript"])
  348. }
  349. } else {
  350. fs[key] = qu.ObjToString(v["descript"])
  351. }
  352. }
  353. purchasingTag := false // 标的物统计标识
  354. var strs []string
  355. if fs["purchasinglist"] != "" {
  356. purchasingTag = true
  357. delete(fs, "purchasinglist")
  358. }
  359. for k := range fs {
  360. strs = append(strs, k)
  361. }
  362. pNum, pEffNum := 0, 0 // 标的物数量, 标的物有效数量
  363. fieldNumMap := make(map[string]int) //字段总标注量,
  364. tagNumMap := make(map[string]int) //字段标注数据量(标的物有效)
  365. rightNumMap := make(map[string]int) //正确数据(标的物有效)
  366. for tmp := make(map[string]interface{}); result.Next(&tmp); markNum++ {
  367. user := qu.ObjToString(tmp["s_login"])
  368. var up map[string]int
  369. if umaps[user] == nil {
  370. up = make(map[string]int)
  371. } else {
  372. up = umaps[user].(map[string]int)
  373. }
  374. up["ck_count"] += 1
  375. umaps[user] = up
  376. if tmp["b_check"].(bool) {
  377. if f, ok := tmp["v_checkinfo"].(map[string]interface{}); ok {
  378. flag := true // 数据整体准确率
  379. // 按人员统计字段准备率
  380. var up map[string]int
  381. if umaps[user] == nil {
  382. up = make(map[string]int)
  383. } else {
  384. up = umaps[user].(map[string]int)
  385. }
  386. for k1 := range cmaps {
  387. if qu.IntAll(f[k1]) == 1 {
  388. cmaps[k1] += 1 // 字段整体正确率
  389. up[k1] += 1
  390. } else {
  391. flag = false
  392. }
  393. }
  394. up["re_count"] += 1
  395. umaps[user] = up
  396. if flag {
  397. checkNumR++
  398. up["re_rg_count"] += 1
  399. }
  400. }
  401. }
  402. if tmp["b_check"].(bool) && purchasingTag {
  403. info := tmp["v_baseinfo"].(map[string]interface{})
  404. checkInfo := tmp["v_checkinfo"].(map[string]interface{})
  405. if pList, o := info["purchasinglist"].([]interface{}); o {
  406. pNum += len(pList)
  407. if tmp["b_isEff"].(bool) {
  408. pEffNum += 1
  409. }
  410. for _, p := range pList {
  411. p1 := p.(map[string]interface{})
  412. for f := range purchasingField {
  413. if qu.ObjToString(p1[f]) != "" {
  414. fieldNumMap[f] += 1
  415. if b, o := p1["b_isEff"].(bool); b && o {
  416. tagNumMap[f] += 1
  417. }
  418. }
  419. }
  420. }
  421. }
  422. if cList, o := checkInfo["purchasinglist"].([]interface{}); o {
  423. for _, c := range cList {
  424. c1 := c.(map[string]interface{})
  425. for f := range purchasingField {
  426. if qu.IntAll(c1[f]) == 1 {
  427. rightNumMap[f] += 1
  428. }
  429. }
  430. }
  431. }
  432. }
  433. }
  434. qu.Debug(cmaps)
  435. qu.Debug(umaps)
  436. pResult := method(fieldNumMap, tagNumMap, rightNumMap)
  437. var userSelect []string
  438. var dataSelect []map[string]interface{}
  439. userSelect = append(userSelect, "全部")
  440. tmp := make(map[string]interface{})
  441. tmp["name"] = "全部"
  442. tmp["num1"] = allNum
  443. tmp["num2"] = checkNum
  444. tmp["num3"] = checkNumR
  445. tmp["num4"] = CountPr(checkNumR, checkNum)
  446. dataSelect = append(dataSelect, tmp)
  447. sort.Strings(strs)
  448. for _, v := range strs {
  449. tmp1 := make(map[string]interface{})
  450. tmp1["name"] = fs[v]
  451. tmp1["num1"] = markNum
  452. tmp1["num2"] = checkNum
  453. tmp1["num3"] = cmaps[v]
  454. tmp1["num4"] = CountPr(cmaps[v], checkNum)
  455. dataSelect = append(dataSelect, tmp1)
  456. }
  457. qu.Debug("字段统计---", dataSelect)
  458. qu.Debug("字段统计---", pResult)
  459. mp["taskNum"] = allNum
  460. mp["v_result"] = dataSelect
  461. mp["v_purchasing"] = pResult
  462. mp["taskCheckNum"] = checkNum
  463. mp["taskCheckRight"] = checkNumR
  464. mp["pNum"] = pNum
  465. mp["pEffNum"] = pEffNum
  466. }
  467. var modelpath string = "web/model/任务详情%d.xlsx"
  468. // GroupTaskExport 用户组任务导出
  469. func (f *Front) GroupTaskExport() {
  470. defer qu.Catch()
  471. starttime, _ := f.GetInt("i_starttime")
  472. completetime, _ := f.GetInt("i_completetime")
  473. status := f.GetString("s_status")
  474. searchStr := f.GetString("s_search")
  475. search := strings.TrimSpace(searchStr)
  476. query := map[string]interface{}{
  477. "s_stype": "group",
  478. }
  479. if status != "-1" { //任务状态
  480. query["s_status"] = status
  481. }
  482. if search != "" {
  483. query["$or"] = []interface{}{
  484. map[string]interface{}{"s_entname": map[string]interface{}{"$regex": search}},
  485. }
  486. }
  487. if starttime > 0 {
  488. query["i_starttime"] = map[string]interface{}{
  489. "$gte": starttime,
  490. }
  491. }
  492. if completetime > 0 {
  493. query["i_completetime"] = map[string]interface{}{
  494. "$lte": completetime,
  495. }
  496. }
  497. qu.Debug("Query:", query)
  498. count := util.Mgo.Count(util.TASKCOLLNAME, query)
  499. if count > 0 {
  500. file, err := xlsx.OpenFile("web/model/taskexportmodel.xlsx")
  501. if err != nil {
  502. qu.Debug("Load Excel Model Error")
  503. f.ServeJson("加载脚本失败")
  504. return
  505. }
  506. sheet := file.Sheets[0]
  507. fields := map[string]interface{}{
  508. "s_entname": 1,
  509. "s_departname": 1,
  510. "s_rulename": 1,
  511. "s_projectname": 1,
  512. "s_groupname": 1,
  513. "s_personname": 1,
  514. "i_givenum": 1,
  515. "s_status": 1,
  516. "i_starttime": 1,
  517. "i_completetime": 1,
  518. }
  519. list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, nil, fields, false, -1, -1)
  520. qu.Debug(len(*list))
  521. for _, l := range *list {
  522. row := sheet.AddRow()
  523. entname := qu.ObjToString(l["s_entname"])
  524. departname := qu.ObjToString(l["s_departname"])
  525. rulename := qu.ObjToString(l["s_rulename"])
  526. projectname := qu.ObjToString(l["s_projectname"])
  527. groupname := qu.ObjToString(l["s_groupname"])
  528. personname := qu.ObjToString(l["s_personname"])
  529. givenum := qu.IntAll(l["i_givenum"])
  530. status := qu.ObjToString(l["s_status"])
  531. starttimestr := ""
  532. if starttime := qu.Int64All(l["i_starttime"]); starttime != 0 {
  533. starttimestr = qu.FormatDateByInt64(&starttime, qu.Date_Full_Layout)
  534. }
  535. completetimestr := ""
  536. if completetime := qu.Int64All(l["i_completetime"]); completetime != 0 {
  537. completetimestr = qu.FormatDateByInt64(&completetime, qu.Date_Full_Layout)
  538. }
  539. row.AddCell().SetValue(entname)
  540. row.AddCell().SetValue(departname)
  541. row.AddCell().SetValue(rulename)
  542. row.AddCell().SetValue(projectname)
  543. row.AddCell().SetValue(groupname)
  544. row.AddCell().SetValue(personname)
  545. row.AddCell().SetValue(givenum)
  546. row.AddCell().SetValue(status)
  547. row.AddCell().SetValue(starttimestr)
  548. row.AddCell().SetValue(completetimestr)
  549. }
  550. fname := fmt.Sprintf(modelpath, time.Now().Unix())
  551. qu.Debug("File Name:", fname)
  552. err = file.Save(fname)
  553. if err != nil {
  554. qu.Debug("Save Excel" + fname + "Error")
  555. f.ServeJson("导出失败")
  556. return
  557. }
  558. arr := strings.Split(fname, "/")
  559. f.ResponseWriter.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", arr[len(arr)-1]))
  560. f.ServeFile(fname)
  561. go func(path string) {
  562. time.Sleep(time.Second * 30)
  563. os.Remove(path)
  564. }(fname)
  565. } else {
  566. f.ServeJson("没有数据")
  567. }
  568. }
  569. func (f *Front) GroupStatsTask() {
  570. defer qu.Catch()
  571. starttime, _ := f.GetInt("i_starttime")
  572. completetime, _ := f.GetInt("i_completetime")
  573. status := f.GetString("s_status")
  574. searchStr := f.GetString("s_search")
  575. search := strings.TrimSpace(searchStr)
  576. query := map[string]interface{}{
  577. "s_stype": "group",
  578. }
  579. if status != "-1" { //任务状态
  580. query["s_status"] = status
  581. }
  582. if search != "" {
  583. query["$or"] = []interface{}{
  584. map[string]interface{}{"s_entname": map[string]interface{}{"$regex": search}},
  585. }
  586. }
  587. if starttime > 0 {
  588. query["i_starttime"] = map[string]interface{}{
  589. "$gte": starttime,
  590. }
  591. }
  592. if completetime > 0 {
  593. query["i_completetime"] = map[string]interface{}{
  594. "$lte": completetime,
  595. }
  596. }
  597. qu.Debug("Query:", query)
  598. count := util.Mgo.Count(util.TASKCOLLNAME, query)
  599. if count > 0 {
  600. var ArrMap []map[string]interface{}
  601. list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, nil, nil, false, -1, -1)
  602. for i := 0; i < len(*list); i++ {
  603. if i == 0 {
  604. m, _ := Method(nil, (*list)[i])
  605. ArrMap = append(ArrMap, m)
  606. } else {
  607. m, b := Method((*list)[i-1], (*list)[i])
  608. if b {
  609. ArrMap = ArrMap[:len(ArrMap)-1] // 删除最后一个
  610. ArrMap = append(ArrMap, m)
  611. } else {
  612. ArrMap = append(ArrMap, m)
  613. }
  614. }
  615. }
  616. f.T["datasource"] = ArrMap
  617. }
  618. _ = f.Render("project/task_list_stats.html")
  619. }
  620. func (f *Front) GroupStatsTaskExport() {
  621. var data []map[string]interface{}
  622. dataStr := f.GetString("param")
  623. err := json.Unmarshal([]byte(dataStr), &data)
  624. if err != nil {
  625. qu.Debug("Json Unmarshal Error")
  626. f.ServeJson(map[string]interface{}{"success": false, "msg": "解析数据失败"})
  627. return
  628. }
  629. file, err := xlsx.OpenFile("web/model/taskstatsmodel.xlsx")
  630. if err != nil {
  631. qu.Debug("Load Excel Model Error")
  632. f.ServeJson(map[string]interface{}{"success": false, "msg": "加载脚本失败"})
  633. return
  634. }
  635. sheet := file.Sheets[0]
  636. for _, l := range data {
  637. row := sheet.AddRow()
  638. projectname := qu.ObjToString(l["s_projectname"])
  639. groupname := qu.ObjToString(l["s_groupname"])
  640. datatype := qu.ObjToString(l["s_datatype"])
  641. num := qu.IntAll(l["num"])
  642. row.AddCell().SetValue(projectname)
  643. row.AddCell().SetValue(groupname)
  644. row.AddCell().SetValue(datatype)
  645. row.AddCell().SetValue(num)
  646. }
  647. fname := fmt.Sprintf("%d.xlsx", time.Now().Unix())
  648. qu.Debug("File Name:", fname)
  649. err = file.Save(fname)
  650. if err != nil {
  651. qu.Debug("Save Excel" + fname + "Error")
  652. f.ServeJson(map[string]interface{}{"success": false, "msg": "文件保存失败"})
  653. return
  654. }
  655. arr := strings.Split(fname, "/")
  656. f.ResponseWriter.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", arr[len(arr)-1]))
  657. f.ServeFile(fname)
  658. go func(path string) {
  659. time.Sleep(time.Second * 30)
  660. os.Remove(path)
  661. }(fname)
  662. f.ServeJson(map[string]interface{}{"success": true})
  663. }
  664. func Method(lastTmp, tmp map[string]interface{}) (map[string]interface{}, bool) {
  665. if qu.ObjToString(tmp["s_datatype"]) == "招标公告" || qu.ObjToString(tmp["s_datatype"]) == "中标公告" {
  666. if lastTmp == nil {
  667. m := make(map[string]interface{})
  668. m["s_projectid"] = tmp["s_projectid"]
  669. m["s_projectname"] = tmp["s_projectname"]
  670. m["s_groupname"] = tmp["s_groupname"]
  671. m["s_datatype"] = tmp["s_datatype"]
  672. m["num"] = tmp["i_givenum"]
  673. return m, true
  674. } else {
  675. if qu.ObjToString(lastTmp["s_projectid"]) == qu.ObjToString(tmp["s_projectid"]) &&
  676. qu.ObjToString(lastTmp["s_groupname"]) == qu.ObjToString(tmp["s_groupname"]) {
  677. lastTmp["num"] = qu.IntAll(lastTmp["num"]) + qu.IntAll(tmp["num"])
  678. return lastTmp, false
  679. } else {
  680. m := make(map[string]interface{})
  681. m["s_projectid"] = tmp["s_projectid"]
  682. m["s_projectname"] = tmp["s_projectname"]
  683. m["s_groupname"] = tmp["s_groupname"]
  684. m["s_datatype"] = tmp["s_datatype"]
  685. m["num"] = tmp["i_givenum"]
  686. return m, true
  687. }
  688. }
  689. } else {
  690. // 标的物统计
  691. if lastTmp == nil {
  692. m := make(map[string]interface{})
  693. m["s_projectid"] = tmp["s_projectid"]
  694. m["s_projectname"] = tmp["s_projectname"]
  695. m["s_groupname"] = tmp["s_groupname"]
  696. m["s_datatype"] = tmp["s_datatype"]
  697. m["num"] = Method1(tmp)
  698. return m, true
  699. } else {
  700. if qu.ObjToString(lastTmp["s_projectid"]) == qu.ObjToString(tmp["s_projectid"]) &&
  701. qu.ObjToString(lastTmp["s_groupname"]) == qu.ObjToString(tmp["s_groupname"]) {
  702. lastTmp["num"] = qu.IntAll(lastTmp["num"]) + Method1(tmp)
  703. return lastTmp, false
  704. } else {
  705. m := make(map[string]interface{})
  706. m["s_projectid"] = tmp["s_projectid"]
  707. m["s_projectname"] = tmp["s_projectname"]
  708. m["s_groupname"] = tmp["s_groupname"]
  709. m["s_datatype"] = tmp["s_datatype"]
  710. m["num"] = Method1(tmp)
  711. return m, true
  712. }
  713. }
  714. }
  715. }
  716. func Method1(tmp map[string]interface{}) int {
  717. id := mongodb.BsonIdToSId(tmp["_id"])
  718. query := map[string]interface{}{"s_groupid": id, "b_isEff": true}
  719. data, _ := util.Mgo.Find(util.DATACOLLNAME, query, nil, `{"v_baseinfo": 1}`, false, -1, -1)
  720. if len(*data) > 0 {
  721. count := 0
  722. for _, m := range *data {
  723. if m1, o := m["v_baseinfo"].(map[string]interface{}); o {
  724. if m2, o1 := m1["purchasinglist"].([]interface{}); o1 {
  725. for _, m3 := range qu.ObjArrToMapArr(m2) {
  726. if m3["b_isEff"].(bool) {
  727. count++
  728. }
  729. }
  730. }
  731. }
  732. }
  733. return count
  734. }
  735. return 0
  736. }
  737. func (f *Front) CheckResultWb() {
  738. defer qu.Catch()
  739. pid := f.GetString("pid")
  740. tid := f.GetString("tid")
  741. if f.Method() == "POST" {
  742. query := map[string]interface{}{"s_taskid": tid}
  743. info, _ := util.Mgo.FindOne("f_check_result", query)
  744. if len(*info) > 0 {
  745. f.ServeJson(map[string]interface{}{"success": true})
  746. } else {
  747. f.ServeJson(map[string]interface{}{"success": false, "msg": "用户组任务未交付"})
  748. }
  749. } else {
  750. query := map[string]interface{}{"s_taskid": tid}
  751. info, _ := util.Mgo.FindOne("f_check_result", query)
  752. var userSelect []string
  753. userSelect = append(userSelect, "全部")
  754. f.T["pid"] = pid
  755. f.T["tid"] = tid
  756. f.T["taskNum"] = (*info)["taskNum"]
  757. f.T["taskTagNum"] = (*info)["taskNum"]
  758. f.T["taskCheckNum"] = (*info)["taskCheckNum"]
  759. f.T["taskCheckRight"] = (*info)["taskCheckRight"]
  760. f.T["pNum"] = (*info)["pNum"] // 标的物数量
  761. f.T["pEffNum"] = (*info)["pEffNum"] //标的物有效数据量
  762. f.T["tableData"] = map[string]interface{}{"全部": (*info)["v_result"]}
  763. f.T["pResult"] = (*info)["v_purchasing"]
  764. f.T["userSelect"] = userSelect
  765. _ = f.Render("project/check_result.html", &f.T)
  766. }
  767. }
  768. func (f *Front) GroupExportData() {
  769. defer qu.Catch()
  770. tid := f.GetString("taskid")
  771. q := bson.M{"s_grouptaskid": tid}
  772. count := util.Mgo.Count(util.DATACOLLNAME, q)
  773. if count > 0 {
  774. file, err := xlsx.OpenFile("web/model/taskexportdata.xlsx")
  775. if err != nil {
  776. qu.Debug("Load Excel Model Error")
  777. f.ServeJson("加载脚本失败")
  778. return
  779. }
  780. sheet := file.Sheets[0]
  781. fields := map[string]interface{}{
  782. "id": 1,
  783. "v_baseinfo.package": 1,
  784. "v_baseinfo.s_winner": 1,
  785. "v_baseinfo.buyer": 1,
  786. "v_baseinfo.projectcode": 1,
  787. "v_baseinfo.projectname": 1,
  788. "v_baseinfo.title": 1,
  789. "v_baseinfo.bidamount": 1,
  790. "v_baseinfo.area": 1,
  791. "v_baseinfo.city": 1,
  792. "tagname": 1,
  793. "tagname2": 1,
  794. "v_baseinfo.is_effective": 1,
  795. }
  796. list, _ := util.Mgo.Find(util.DATACOLLNAME, q, nil, fields, false, -1, -1)
  797. for _, l := range *list {
  798. baseinfo := l["v_baseinfo"].(map[string]interface{})
  799. if baseinfo["package"] != nil {
  800. pkg := baseinfo["package"].(map[string]interface{})
  801. for _, p := range pkg {
  802. row := sheet.AddRow()
  803. p1 := p.(map[string]interface{})
  804. winner := []string{}
  805. bidamount := float64(0)
  806. if p1["winner_all"] != nil {
  807. if all := p1["winner_all"].([]interface{}); all != nil {
  808. if len(all) > 0 {
  809. for _, a := range all {
  810. a1 := a.(map[string]interface{})
  811. if qu.ObjToString(a1["winner"]) != "" {
  812. winner = append(winner, qu.ObjToString(a1["winner"]))
  813. }
  814. bidamount = qu.Float64All(a1["bidamount"])
  815. }
  816. }
  817. }
  818. }
  819. row.AddCell().SetValue(util.SE.EncodeString(qu.ObjToString(l["id"])))
  820. row.AddCell().SetValue(strings.Join(winner, ","))
  821. row.AddCell().SetValue(qu.ObjToString(baseinfo["buyer"]))
  822. row.AddCell().SetValue(qu.ObjToString(baseinfo["projectcode"]))
  823. row.AddCell().SetValue(qu.ObjToString(baseinfo["projectname"]))
  824. row.AddCell().SetValue(qu.ObjToString(baseinfo["title"]))
  825. row.AddCell().SetValue(bidamount)
  826. row.AddCell().SetValue(qu.ObjToString(baseinfo["area"]))
  827. row.AddCell().SetValue(qu.ObjToString(baseinfo["city"]))
  828. row.AddCell().SetValue(qu.ObjToString(l["tagname"]))
  829. row.AddCell().SetValue(qu.ObjToString(l["tagname2"]))
  830. row.AddCell().SetValue(qu.ObjToString(baseinfo["is_effective"]))
  831. }
  832. } else {
  833. row := sheet.AddRow()
  834. row.AddCell().SetValue(util.SE.EncodeString(qu.ObjToString(l["id"])))
  835. row.AddCell().SetValue(qu.ObjToString(baseinfo["s_winner"]))
  836. row.AddCell().SetValue(qu.ObjToString(baseinfo["buyer"]))
  837. row.AddCell().SetValue(qu.ObjToString(baseinfo["projectcode"]))
  838. row.AddCell().SetValue(qu.ObjToString(baseinfo["projectname"]))
  839. row.AddCell().SetValue(qu.ObjToString(baseinfo["title"]))
  840. row.AddCell().SetValue(baseinfo["bidamount"])
  841. row.AddCell().SetValue(qu.ObjToString(baseinfo["area"]))
  842. row.AddCell().SetValue(qu.ObjToString(baseinfo["city"]))
  843. row.AddCell().SetValue(qu.ObjToString(l["tagname"]))
  844. row.AddCell().SetValue(qu.ObjToString(l["tagname2"]))
  845. row.AddCell().SetValue(qu.ObjToString(baseinfo["is_effective"]))
  846. }
  847. }
  848. fname := fmt.Sprintf(modelpath, time.Now().Unix())
  849. qu.Debug("File Name:", fname)
  850. err = file.Save(fname)
  851. if err != nil {
  852. qu.Debug("Save Excel" + fname + "Error")
  853. f.ServeJson("导出失败")
  854. return
  855. }
  856. arr := strings.Split(fname, "/")
  857. f.ResponseWriter.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", arr[len(arr)-1]))
  858. f.ServeFile(fname)
  859. go func(path string) {
  860. time.Sleep(time.Second * 30)
  861. os.Remove(path)
  862. }(fname)
  863. } else {
  864. f.ServeJson("没有数据")
  865. }
  866. }
  867. var FieldsMap = map[string]string{
  868. "是否优选": "is_push",
  869. "运营商中标标签": "tagname",
  870. "主体公司": "tagname2",
  871. "中标人": "s_winner",
  872. "招标人": "buyer",
  873. "中标金额": "bidamount",
  874. }
  875. func (f *Front) GroupImportData() {
  876. defer qu.Catch()
  877. mf, _, err := f.GetFile("xlsx")
  878. if err != nil {
  879. f.ServeJson(map[string]interface{}{"success": false, "msg": "数据导入失败"})
  880. }
  881. binary, _ := io.ReadAll(mf)
  882. xls, _ := xlsx.OpenBinary(binary)
  883. sheet := xls.Sheets[0]
  884. rows := sheet.Rows
  885. idcolnum := -1
  886. cellFieldName := map[int]string{}
  887. update := make(map[string]interface{})
  888. count := 0
  889. lastid := ""
  890. c1 := 0 // 多包第n条数据
  891. for rn, row := range rows {
  892. if rn == 0 {
  893. for index, cell := range row.Cells {
  894. if cell.Value == "唯一标识" || cell.Value == "信息标识" { //id所在列
  895. idcolnum = index
  896. }
  897. if v := FieldsMap[cell.Value]; v != "" {
  898. cellFieldName[index] = v
  899. }
  900. }
  901. if idcolnum == -1 {
  902. break
  903. }
  904. continue
  905. } else {
  906. id := row.Cells[idcolnum].String()
  907. id = util.SE.DecodeString(id)
  908. for i, f := range cellFieldName {
  909. if val := row.Cells[i].Value; val != "" {
  910. if f == "is_push" {
  911. update[f] = qu.IntAll(val)
  912. } else if f == "multipackage" {
  913. update[fmt.Sprintf("v_baseinfo.%s", f)] = qu.IntAll(val)
  914. } else if f == "bidamount" {
  915. update[fmt.Sprintf("v_baseinfo.%s", f)] = qu.Float64All(val)
  916. } else {
  917. update[fmt.Sprintf("v_baseinfo.%s", f)] = val
  918. }
  919. }
  920. }
  921. if qu.IntAll(update["v_baseinfo.multipackage"]) == 1 {
  922. if c1 == 0 {
  923. count++
  924. }
  925. if c1 > 0 && lastid == id {
  926. info, _ := util.Mgo.FindById(util.DATACOLLNAME, id, bson.M{"v_baseinfo.tagname": 1, "v_baseinfo.tagname2": 1, "v_baseinfo.s_winner": 1,
  927. "v_baseinfo.bidamount": 1, "v_baseinfo.package": 1})
  928. if len(*info) > 0 {
  929. baseinfo := (*info)["v_baseinfo"].(map[string]interface{})
  930. if baseinfo["package"] != nil {
  931. packageM := baseinfo["package"].(map[string]interface{})
  932. m := make(map[string]interface{})
  933. if update["v_baseinfo.bidamount"] != nil {
  934. m["bidamount"] = qu.Float64All(update["v_baseinfo.bidamount"])
  935. }
  936. if update["v_baseinfo.s_winner"] != nil {
  937. m["s_winner"] = qu.ObjToString(update["v_baseinfo.s_winner"])
  938. }
  939. packageM[fmt.Sprint(c1)] = map[string]interface{}{"winner_all": append([]interface{}{}, m)}
  940. update["v_baseinfo.package"] = packageM
  941. }
  942. if s := qu.ObjToString(baseinfo["tagname"]); s != "" {
  943. update["v_baseinfo.tagname"] = s + "," + qu.ObjToString(update["v_baseinfo.tagname"])
  944. }
  945. if s := qu.ObjToString(baseinfo["tagname2"]); s != "" {
  946. update["v_baseinfo.tagname2"] = s + "," + qu.ObjToString(update["v_baseinfo.tagname2"])
  947. }
  948. if s := qu.ObjToString(baseinfo["s_winner"]); s != "" {
  949. update["v_baseinfo.s_winner"] = s + "," + qu.ObjToString(update["v_baseinfo.s_winner"])
  950. }
  951. update["v_baseinfo.bidamount"] = qu.Float64All(update["v_baseinfo.bidamount"]) + qu.Float64All(baseinfo["bidamount"])
  952. c1++
  953. }
  954. } else {
  955. c1 = 0
  956. packageM := make(map[string]interface{})
  957. m := make(map[string]interface{})
  958. if update["v_baseinfo.bidamount"] != nil {
  959. m["bidamount"] = qu.Float64All(update["v_baseinfo.bidamount"])
  960. }
  961. if update["v_baseinfo.s_winner"] != nil {
  962. m["s_winner"] = qu.ObjToString(update["v_baseinfo.s_winner"])
  963. }
  964. packageM[fmt.Sprint(c1)] = map[string]interface{}{"winner_all": append([]interface{}{}, m)}
  965. update["v_baseinfo.package"] = packageM
  966. c1++
  967. }
  968. } else {
  969. count++
  970. c1 = 0
  971. }
  972. // 临时
  973. update["tag"] = "临时"
  974. lastid = id
  975. util.Mgo.UpdateById(util.DATACOLLNAME, id, bson.M{"$set": update})
  976. }
  977. }
  978. f.ServeJson(map[string]interface{}{"success": true, "msg": "数据导入成功", "count": count})
  979. }