plan.go 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. package controller
  2. import (
  3. "fmt"
  4. "github.com/gin-gonic/gin"
  5. "lims-extend/common"
  6. "lims-extend/model"
  7. "lims-extend/response"
  8. "lims-extend/util"
  9. "lims-extend/vo"
  10. )
  11. func ShowPlans(c *gin.Context) {
  12. db := common.GetDB()
  13. userId := c.Params.ByName("userId")
  14. var plans []model.Plan
  15. //db.Model(&model.Plan{}).Where("plan.delete <> 1").Find(&plans)
  16. db.Model(&model.Plan{}).Joins("left join plan_groups on plan.id = plan_id ").
  17. Joins("left join group_users on plan_groups.group_id = group_users.group_id").
  18. Where("user_id = ? and plan.delete <> 1", userId).Distinct().Find(&plans)
  19. planVos := make([]vo.PlanVo, len(plans))
  20. //for i, v := range plans {
  21. // planVos[i] = vo.PlanVo{
  22. // Plan: v,
  23. // IsJoined: IsJoinedInCurrentPlan(userId, v.Id),
  24. // }
  25. //}
  26. response.Success(c, gin.H{"planlists": planVos}, "success")
  27. }
  28. func ShowPlan(c *gin.Context) {
  29. planId := c.Params.ByName("planId")
  30. db := common.GetDB()
  31. var plan model.Plan
  32. if err := db.Model(&model.Plan{}).Where("id = ?", planId).First(&plan).Error; err != nil {
  33. response.Fail(c, nil, "结果不存在")
  34. return
  35. }
  36. if plan.Delete == 1 {
  37. response.Fail(c, nil, "当前计划已经被删除")
  38. return
  39. }
  40. planVo := vo.PlanVo{
  41. SendAmount: GetSendPacketAmount(planId),
  42. ReceiveAmount: GetRecvPacketAmount(planId),
  43. ReportAmount: GetPlanReportAmount(planId),
  44. }
  45. response.Success(c, gin.H{
  46. "plan": planVo,
  47. }, "success")
  48. }
  49. // TakePlan 领取测试计划并生成测试任务
  50. // 方法 POST
  51. // 传入参数 测试计划ID,提测人ID
  52. func TakePlan(c *gin.Context) {
  53. planId := c.Params.ByName("planId")
  54. username := c.Params.ByName("username")
  55. // 获取测试计划信息
  56. db := common.GetDB()
  57. var plan model.Plan
  58. if err := db.Model(&model.Plan{}).Where("id = ?", planId).First(&plan).Error; err != nil {
  59. response.Fail(c, nil, "测试计划不存在")
  60. return
  61. }
  62. // 判断测试计划是否被删除
  63. if plan.Delete == 1 {
  64. response.Fail(c, nil, "测试计划已被删除")
  65. return
  66. }
  67. // 获取说明文件信息
  68. var file model.File
  69. db.Model(&model.File{}).Where("id = ?", plan.StatementFile).First(&file)
  70. // 获取提测人信息
  71. var user model.User
  72. if err := db.Model(&model.User{}).Where("username = ?", username).First(&user).Error; err != nil {
  73. response.Fail(c, nil, "提测人不存在")
  74. return
  75. }
  76. // 准备任务信息
  77. task := model.Task{
  78. ID: util.GetNextId(db, "task"),
  79. Title: plan.Title + "_" + user.Username,
  80. State: 0,
  81. Description: plan.Description,
  82. StateFile: plan.StatementFile,
  83. CaseFile: "",
  84. CaseAll: 0,
  85. CaseNotExecute: 0,
  86. CaseSuccess: 0,
  87. CaseFail: 0,
  88. CreatedAt: model.Time{},
  89. UpdatedAt: model.Time{},
  90. Delete: 0,
  91. PlanId: plan.Id,
  92. ExecutorId: user.ID,
  93. }
  94. // 判断任务是否被重复领取
  95. var dupTask model.Task
  96. db.Model(&model.Task{}).Where("title = ?", task.Title).First(&dupTask)
  97. if dupTask.Title != "" {
  98. response.Fail(c, nil, user.Name+"已领取当前测试任务,请勿重复领取")
  99. return
  100. }
  101. // 从数据库中创建task信息
  102. if err := db.Create(&task).Error; err != nil {
  103. response.Fail(c, nil, "测试任务创建失败")
  104. return
  105. }
  106. response.Success(c, gin.H{"task": task}, "success")
  107. }
  108. // AssignPlan 分配指定Plan给GroupList
  109. // 方法 POST
  110. // 传入参数 测试计划ID、GroupIdList
  111. func AssignPlan(c *gin.Context) {
  112. // 获取planId 以及 groupIdList
  113. var groupVo vo.GroupVo
  114. c.ShouldBind(&groupVo)
  115. db := common.GetDB()
  116. // 检查plan是否存在
  117. var plan model.Plan
  118. if err := db.Model(&model.Plan{}).Where("id = ?", groupVo.PlanId).First(&plan).Error; err != nil {
  119. response.Fail(c, nil, "计划不存在")
  120. return
  121. }
  122. if plan.Delete == 1 {
  123. response.Fail(c, nil, "当前计划已经被删除")
  124. return
  125. }
  126. // 检查groupList中group是否存在/被删除
  127. for _, groupId := range groupVo.GroupIdList {
  128. var group model.Group
  129. if err := db.Model(&model.Group{}).Where("id = ?", groupId).First(&group).Error; err != nil {
  130. response.Fail(c, nil, fmt.Sprintf("团队ID[%s]不存在", groupId))
  131. return
  132. }
  133. // 判断group是否被删除
  134. if group.Delete == 1 {
  135. response.Fail(c, nil, fmt.Sprintf("团队ID[%s]已被删除", groupId))
  136. return
  137. }
  138. }
  139. // 错误信息列表
  140. var errorTaskLists []string
  141. // 向group分配plan
  142. for _, groupId := range groupVo.GroupIdList {
  143. plan2group := model.Plan2Group{
  144. PlanId: groupVo.PlanId,
  145. GroupId: groupId,
  146. }
  147. // 重复分配校验
  148. if err := db.Model(&model.Plan2Group{}).Where("group_id = ? and plan_id = ?", groupId, groupVo.PlanId).
  149. First(&model.Plan2Group{}).Error; err == nil {
  150. response.Fail(c, nil, "分配失败,小组已被该计划分配")
  151. return
  152. }
  153. if err := db.Model(&model.Plan2Group{}).Create(&plan2group).Error; err != nil {
  154. response.Fail(c, nil, "分配失败")
  155. return
  156. }
  157. // 向组内的人员分配Task实体
  158. // 获取组内人员ID列表
  159. var group2users []model.Group2Users
  160. db.Model(&model.Group2Users{}).Where("group_id = ?", groupId).Find(&group2users)
  161. for _, item := range group2users {
  162. // 准备任务信息
  163. task := model.Task{
  164. ID: util.GetNextId(db, "task"),
  165. Title: plan.Title,
  166. State: 3, //待领取状态
  167. Description: plan.Description,
  168. StateFile: plan.StatementFile,
  169. CaseFile: "",
  170. CaseAll: 0,
  171. CaseNotExecute: 0,
  172. CaseSuccess: 0,
  173. CaseFail: 0,
  174. CreatedAt: model.Time{},
  175. UpdatedAt: model.Time{},
  176. Delete: 0,
  177. PlanId: plan.Id,
  178. ExecutorId: item.UserId,
  179. }
  180. // 判断任务是否被重复分配, 同时生成分配失败的Task的错误列表及其错误信息
  181. var dupTask model.Task
  182. db.Model(&model.Task{}).Where("plan_id = ? and executor_id = ?", plan.Id, item.UserId).First(&dupTask)
  183. if dupTask.Title != "" {
  184. errorTaskLists = append(errorTaskLists, fmt.Sprintf("用户ID[%s]已被分配当前测试任务", item.UserId))
  185. continue
  186. }
  187. // 正式开始从数据库中创建Task表项, 并记录错误信息
  188. if err := db.Create(&task).Error; err != nil {
  189. errorTaskLists = append(errorTaskLists, fmt.Sprintf("用户ID为[%s]的测试任务创建失败,未知数据库错误", item.UserId))
  190. continue
  191. }
  192. }
  193. }
  194. response.Success(c, gin.H{
  195. "groupIdList": groupVo,
  196. "errorList": errorTaskLists,
  197. }, "分配成功")
  198. }
  199. // GetPlanAssignedGroups 获取指定Plan被分配的小组信息
  200. // 方法 GET
  201. // 传入参数 测试计划ID
  202. func GetPlanAssignedGroups(c *gin.Context) {
  203. db := common.GetDB()
  204. planId := c.Params.ByName("planId")
  205. var plan2groups []model.Plan2Group
  206. db.Model(&model.Plan2Group{}).Where("plan_id = ?", planId).Find(&plan2groups)
  207. var groupList []model.Group
  208. for _, group := range plan2groups {
  209. var singleGroup model.Group
  210. db.Model(&model.Group{}).Where("id = ?", group.GroupId).First(&singleGroup)
  211. groupList = append(groupList, singleGroup)
  212. }
  213. response.Success(c, gin.H{"groupList": groupList}, "success")
  214. }
  215. func Test(c *gin.Context) {
  216. response.Success(c, gin.H{"count": GetPlanReportAmount("TestLaboratory_V1_Plan_9")}, "success")
  217. }
  218. // GetPlanTotalUserAmount 获取当前计划总发包数
  219. // 需要参数planId
  220. func GetSendPacketAmount(planId string) int {
  221. db := common.GetDB()
  222. var amount int64
  223. db.Model(&model.Task{}).Where("plan_id = ?", planId).Count(&amount)
  224. return int(amount)
  225. }
  226. func GetRecvPacketAmount(planId string) int {
  227. db := common.GetDB()
  228. var amount int64
  229. db.Model(&model.Task{}).Where("plan_id = ? and state <> 3", planId).Count(&amount)
  230. return int(amount)
  231. }
  232. func GetPlanReportAmount(planId string) int {
  233. var count int64
  234. db := common.GetDB()
  235. db.Model(&model.Task{}).Where("plan_id = ? and state = 2", planId).Count(&count)
  236. return int(count)
  237. }
  238. func GetPlanTotalUserAmount(planId string) int {
  239. totalAmount := 0
  240. var plan2groups []model.Plan2Group
  241. db := common.GetDB()
  242. db.Model(&model.Plan2Group{}).Where("plan_id = ?", planId).Find(&plan2groups)
  243. for _, group := range plan2groups {
  244. totalAmount += GetGroupUserAmount(group.GroupId)
  245. }
  246. return totalAmount
  247. }
  248. // GetGroupUserAmount 获取当前组总用户数
  249. // 需要参数groupId
  250. func GetGroupUserAmount(groupId string) int {
  251. var count int64
  252. db := common.GetDB()
  253. db.Model(&model.Group2Users{}).Where("group_id = ?", groupId).Count(&count)
  254. return int(count)
  255. }
  256. // GetGroupUserAmount 获取指定计划对接包数量
  257. // 需要参数groupId
  258. //func GetPlanTaskAmount(planId string) int {
  259. // var count int64
  260. // db := common.GetDB()
  261. // db.Model(&model.Task{}).Where("plan_id = ?", planId).Count(&count)
  262. // return int(count)
  263. //}
  264. //
  265. //func IsJoinedInCurrentPlan(userId string, planId string) bool {
  266. // var count int64
  267. // db := common.GetDB()
  268. // db.Model(&model.Task{}).Where("plan_id = ? and executor_id = ?", planId, userId).Count(&count)
  269. // if count > 0 {
  270. // return true
  271. // } else {
  272. // return false
  273. // }
  274. //}