group.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. package front
  2. import (
  3. "fmt"
  4. "github.com/tealeg/xlsx"
  5. "mongodb"
  6. "os"
  7. qu "qfw/util"
  8. "strconv"
  9. "strings"
  10. "time"
  11. "util"
  12. )
  13. // GroupTaskListByGroup 用户组权限用户组任务列表
  14. func (f *Front) GroupTaskListByGroup() {
  15. defer qu.Catch()
  16. if f.Method() == "POST" {
  17. user := f.GetSession("user").(map[string]interface{})
  18. role := qu.ObjToString(user["i_role"])
  19. start, _ := f.GetInteger("start")
  20. limit, _ := f.GetInteger("length")
  21. draw, _ := f.GetInteger("draw")
  22. status := f.GetString("s_status")
  23. searchStr := f.GetString("search[value]")
  24. search := strings.TrimSpace(searchStr)
  25. groupId := qu.ObjToString(user["s_groupid"])
  26. query := map[string]interface{}{
  27. "s_stype": "group", //检索用户组任务
  28. }
  29. if role != "0" {
  30. query["s_groupid"] = groupId
  31. }
  32. if status != "-1" { //任务状态
  33. query["s_status"] = status
  34. }
  35. if search != "" {
  36. query["$or"] = []interface{}{
  37. map[string]interface{}{"s_projectname": map[string]interface{}{"$regex": search}},
  38. }
  39. }
  40. qu.Debug("Query:", query)
  41. list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, map[string]interface{}{"_id": -1}, nil, false, start, limit)
  42. count := util.Mgo.Count(util.TASKCOLLNAME, query)
  43. for _, l := range *list {
  44. if status := qu.ObjToString(l["s_status"]); status == "进行中" { //更新任务进度
  45. //groupId := qu.ObjToString(l["s_groupid"])
  46. groupTaskId := mongodb.BsonIdToSId(l["_id"])
  47. giveNum := qu.IntAll(l["i_givenum"])
  48. sourceinfo := qu.ObjToString(l["s_sourceinfo"])
  49. //tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_isgivegroup": true, "s_grouptaskid": groupTaskId, "b_istag": true})
  50. tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": true})
  51. progressFloat := float64(tagNum) / float64(giveNum)
  52. value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", progressFloat), 64)
  53. progress := fmt.Sprint(value*100) + "%"
  54. l["s_progress"] = progress
  55. //同步数据库
  56. util.Mgo.UpdateById(util.TASKCOLLNAME, l["_id"], map[string]interface{}{"$set": map[string]interface{}{"s_progress": progress}})
  57. }
  58. }
  59. f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
  60. } else {
  61. _ = f.Render("project/task_group_list.html")
  62. }
  63. }
  64. // GroupTaskListByAdmin 系统管理员权限用户组任务列表
  65. func (f *Front) GroupTaskListByAdmin() {
  66. defer qu.Catch()
  67. if f.Method() == "POST" {
  68. start, _ := f.GetInteger("start")
  69. limit, _ := f.GetInteger("length")
  70. draw, _ := f.GetInteger("draw")
  71. status := f.GetString("s_status")
  72. searchStr := f.GetString("search[value]")
  73. search := strings.TrimSpace(searchStr)
  74. starttime := f.GetString("starttime")
  75. endtime := f.GetString("endtime")
  76. query := map[string]interface{}{
  77. "s_stype": "group", //检索用户组任务
  78. }
  79. timeQ := make(map[string]interface{})
  80. if starttime != "" {
  81. timeQ["$gte"], _ = strconv.Atoi(starttime)
  82. }
  83. if endtime != "" {
  84. timeQ["$lte"], _ = strconv.Atoi(endtime)
  85. }
  86. if len(timeQ) > 0 {
  87. query["i_createtime"] = timeQ
  88. }
  89. if status != "-1" { //任务状态
  90. query["s_status"] = status
  91. }
  92. if search != "" {
  93. query["$or"] = []interface{}{
  94. map[string]interface{}{"s_projectname": map[string]interface{}{"$regex": search}},
  95. map[string]interface{}{"s_entname": map[string]interface{}{"$regex": search}},
  96. map[string]interface{}{"s_rulename": map[string]interface{}{"$regex": search}},
  97. map[string]interface{}{"s_departname": map[string]interface{}{"$regex": search}},
  98. }
  99. }
  100. qu.Debug("Query:", query)
  101. count := util.Mgo.Count(util.TASKCOLLNAME, query)
  102. list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, map[string]interface{}{"_id": -1}, nil, false, start, limit)
  103. for _, l := range *list {
  104. if status := qu.ObjToString(l["s_status"]); status == "进行中" { //更新任务进度
  105. //groupId := qu.ObjToString(l["s_groupid"])
  106. groupTaskId := mongodb.BsonIdToSId(l["_id"])
  107. giveNum := qu.IntAll(l["i_givenum"])
  108. sourceinfo := qu.ObjToString(l["s_sourceinfo"])
  109. //tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_isgivegroup": true, "s_grouptaskid": groupTaskId, "b_istag": true})
  110. tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": true})
  111. progressFloat := float64(tagNum) / float64(giveNum)
  112. value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", progressFloat), 64)
  113. progress := fmt.Sprint(value*100) + "%"
  114. l["s_progress"] = progress
  115. //同步数据库
  116. util.Mgo.UpdateById(util.TASKCOLLNAME, l["_id"], map[string]interface{}{"$set": map[string]interface{}{"s_progress": progress}})
  117. }
  118. }
  119. f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
  120. } else {
  121. _ = f.Render("project/task_list.html")
  122. }
  123. }
  124. // GroupUserTaskList 用户任务分发列表
  125. func (f *Front) GroupUserTaskList() {
  126. defer qu.Catch()
  127. //groupId := f.GetString("s_groupid") //用户组id
  128. pid := f.GetString("pid")
  129. groupTaskId := f.GetString("grouptaskid") //用户组任务id
  130. qu.Debug("groupTaskId:", groupTaskId)
  131. if f.Method() == "POST" {
  132. start, _ := f.GetInteger("start")
  133. limit, _ := f.GetInteger("length")
  134. draw, _ := f.GetInteger("draw")
  135. status := f.GetString("s_status")
  136. login := f.GetString("s_login")
  137. searchStr := f.GetString("search[value]")
  138. search := strings.TrimSpace(searchStr)
  139. query := map[string]interface{}{
  140. "s_stype": "user",
  141. "s_parentid": groupTaskId,
  142. }
  143. if status != "-1" { //任务状态
  144. query["s_status"] = status
  145. }
  146. if login != "-1" { //用户账号
  147. query["s_login"] = login
  148. }
  149. if search != "" {
  150. query["$or"] = []interface{}{
  151. map[string]interface{}{"s_projectname": map[string]interface{}{"$regex": search}},
  152. }
  153. }
  154. qu.Debug("Query:", query)
  155. count := util.Mgo.Count(util.TASKCOLLNAME, query)
  156. list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, map[string]interface{}{"_id": -1}, nil, false, start, limit)
  157. for _, l := range *list {
  158. if status := qu.ObjToString(l["s_status"]); status == "进行中" { //更新任务进度
  159. giveNum := qu.IntAll(l["i_givenum"])
  160. sourceinfo := qu.ObjToString(l["s_sourceinfo"])
  161. tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": mongodb.BsonIdToSId(l["_id"]), "b_istag": true})
  162. progressFloat := float64(tagNum) / float64(giveNum)
  163. value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", progressFloat), 64)
  164. progress := fmt.Sprint(value*100) + "%"
  165. l["s_progress"] = progress
  166. //同步数据库
  167. util.Mgo.UpdateById(util.TASKCOLLNAME, l["_id"], map[string]interface{}{"$set": map[string]interface{}{"s_progress": progress}})
  168. }
  169. }
  170. f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
  171. } else {
  172. sourceinfo := f.GetString("s_sourceinfo")
  173. qu.Debug(sourceinfo)
  174. //统计数据量
  175. isGiveNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_isgiveuser": true}) //已分发量
  176. isNotGiveNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_isgiveuser": false}) //待分发量
  177. isTagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": true}) //已标注数量
  178. isNotTagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": false}) //未标注数量
  179. allNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId}) //数据总量
  180. qu.Debug("数据总量:", allNum, "已分发量:", isGiveNum, "待分发量:", isNotGiveNum, "已标注量:", isTagNum, "未标注量:", isNotTagNum)
  181. f.T["pid"] = pid
  182. f.T["grouptaskid"] = groupTaskId
  183. f.T["allNum"] = allNum
  184. f.T["isGiveNum"] = isGiveNum
  185. f.T["isNotGiveNum"] = isNotGiveNum
  186. f.T["isTagNum"] = isTagNum
  187. f.T["isNotTagNum"] = isNotTagNum
  188. _ = f.Render("project/task_detail.html", &f.T)
  189. }
  190. }
  191. // GroupTaskDeliver 用户组任务交付
  192. func (f *Front) GroupTaskDeliver() {
  193. defer qu.Catch()
  194. user := f.GetSession("user").(map[string]interface{})
  195. username := qu.ObjToString(user["s_login"]) //当前登录用户
  196. success := false
  197. msg := ""
  198. groupTaskId := f.GetString("taskid") //用户组任务id
  199. qu.Debug("Group Task ID:", groupTaskId)
  200. groupTask, _ := util.Mgo.FindById(util.TASKCOLLNAME, groupTaskId, map[string]interface{}{"v_sonids": 1, "s_sourceinfo": 1})
  201. if groupTask != nil && len(*groupTask) > 0 {
  202. sonUserIds := (*groupTask)["v_sonids"].([]interface{})
  203. if len(sonUserIds) > 0 {
  204. sourceInfo := qu.ObjToString((*groupTask)["s_sourceinfo"])
  205. dataCount := util.Mgo.Count(sourceInfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": false})
  206. taskCount := util.Mgo.Count(util.TASKCOLLNAME, map[string]interface{}{"s_parentid": groupTaskId, "s_status": map[string]interface{}{"$in": []string{"未开始", "进行中"}}})
  207. if dataCount == 0 && taskCount == 0 {
  208. success = util.Mgo.UpdateById(util.TASKCOLLNAME, groupTaskId, map[string]interface{}{
  209. "$set": map[string]interface{}{
  210. "i_completetime": time.Now().Unix(),
  211. "s_updateperson": username,
  212. "i_updatetime": time.Now().Unix(),
  213. "s_status": "已完成",
  214. "s_progress": "100%",
  215. },
  216. })
  217. if !success {
  218. msg = "更新任务信息失败"
  219. }
  220. } else {
  221. if taskCount != 0 {
  222. msg += "用户任务未全部完成;"
  223. }
  224. if dataCount != 0 {
  225. msg += "数据未全部标注;"
  226. }
  227. }
  228. } else {
  229. msg = "任务暂未分配"
  230. }
  231. } else {
  232. msg = "查询任务失败"
  233. }
  234. f.ServeJson(map[string]interface{}{"success": success, "msg": msg})
  235. }
  236. var modelpath string = "web/model/任务详情%d.xlsx"
  237. // GroupTaskExport 用户组任务导出
  238. func (f *Front) GroupTaskExport() {
  239. defer qu.Catch()
  240. starttime, _ := f.GetInt("i_starttime")
  241. completetime, _ := f.GetInt("i_completetime")
  242. status := f.GetString("s_status")
  243. searchStr := f.GetString("s_search")
  244. search := strings.TrimSpace(searchStr)
  245. query := map[string]interface{}{
  246. "s_stype": "group",
  247. }
  248. if status != "-1" { //任务状态
  249. query["s_status"] = status
  250. }
  251. if search != "" {
  252. query["$or"] = []interface{}{
  253. map[string]interface{}{"s_entname": map[string]interface{}{"$regex": search}},
  254. }
  255. }
  256. if starttime > 0 {
  257. query["i_starttime"] = map[string]interface{}{
  258. "$gte": starttime,
  259. }
  260. }
  261. if completetime > 0 {
  262. query["i_completetime"] = map[string]interface{}{
  263. "$lte": completetime,
  264. }
  265. }
  266. qu.Debug("Query:", query)
  267. count := util.Mgo.Count(util.TASKCOLLNAME, query)
  268. if count > 0 {
  269. file, err := xlsx.OpenFile("web/model/taskexportmodel.xlsx")
  270. if err != nil {
  271. qu.Debug("Load Excel Model Error")
  272. f.ServeJson("加载脚本失败")
  273. return
  274. }
  275. sheet := file.Sheets[0]
  276. fields := map[string]interface{}{
  277. "s_entname": 1,
  278. "s_departname": 1,
  279. "s_rulename": 1,
  280. "s_projectname": 1,
  281. "s_groupname": 1,
  282. "s_personname": 1,
  283. "i_givenum": 1,
  284. "s_status": 1,
  285. "i_starttime": 1,
  286. "i_completetime": 1,
  287. }
  288. list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, nil, fields, false, -1, -1)
  289. for _, l := range *list {
  290. row := sheet.AddRow()
  291. entname := qu.ObjToString(l["s_entname"])
  292. departname := qu.ObjToString(l["s_departname"])
  293. rulename := qu.ObjToString(l["s_rulename"])
  294. projectname := qu.ObjToString(l["s_projectname"])
  295. groupname := qu.ObjToString(l["s_groupname"])
  296. personname := qu.ObjToString(l["s_personname"])
  297. givenum := qu.IntAll(l["i_givenum"])
  298. status := qu.ObjToString(l["s_status"])
  299. starttimestr := ""
  300. if starttime := qu.Int64All(l["i_starttime"]); starttime != 0 {
  301. starttimestr = qu.FormatDateByInt64(&starttime, qu.Date_Full_Layout)
  302. }
  303. completetimestr := ""
  304. if completetime := qu.Int64All(l["i_completetime"]); completetime != 0 {
  305. completetimestr = qu.FormatDateByInt64(&completetime, qu.Date_Full_Layout)
  306. }
  307. row.AddCell().SetValue(entname)
  308. row.AddCell().SetValue(departname)
  309. row.AddCell().SetValue(rulename)
  310. row.AddCell().SetValue(projectname)
  311. row.AddCell().SetValue(groupname)
  312. row.AddCell().SetValue(personname)
  313. row.AddCell().SetValue(givenum)
  314. row.AddCell().SetValue(status)
  315. row.AddCell().SetValue(starttimestr)
  316. row.AddCell().SetValue(completetimestr)
  317. }
  318. fname := fmt.Sprintf(modelpath, time.Now().Unix())
  319. qu.Debug("File Name:", fname)
  320. err = file.Save(fname)
  321. if err != nil {
  322. qu.Debug("Save Excel" + fname + "Error")
  323. f.ServeJson("导出失败")
  324. return
  325. }
  326. arr := strings.Split(fname, "/")
  327. f.ResponseWriter.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", arr[len(arr)-1]))
  328. f.ServeFile(fname)
  329. go func(path string) {
  330. time.Sleep(time.Second * 30)
  331. os.Remove(path)
  332. }(fname)
  333. } else {
  334. f.ServeJson("没有数据")
  335. }
  336. }