project.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  1. package db
  2. import (
  3. "context"
  4. "fmt"
  5. "reflect"
  6. "strings"
  7. "time"
  8. "youngee_b_api/consts"
  9. "youngee_b_api/model/common_model"
  10. "youngee_b_api/model/gorm_model"
  11. "youngee_b_api/model/http_model"
  12. "youngee_b_api/pack"
  13. "youngee_b_api/util"
  14. "github.com/issue9/conv"
  15. "github.com/sirupsen/logrus"
  16. log "github.com/sirupsen/logrus"
  17. "gorm.io/gorm"
  18. )
  19. func CreateProject(ctx context.Context, projectInfo gorm_model.ProjectInfo) (*string, error) {
  20. db := GetWriteDB(ctx)
  21. err := db.Create(&projectInfo).Error
  22. if err != nil {
  23. return nil, err
  24. }
  25. return &projectInfo.ProjectID, nil
  26. }
  27. func UpdateProject(ctx context.Context, project gorm_model.ProjectInfo) (*string, error) {
  28. db := GetReadDB(ctx)
  29. err := db.Model(&project).Updates(project).Error
  30. if err != nil {
  31. return nil, err
  32. }
  33. return &project.ProjectID, nil
  34. }
  35. func DeleteProject(ctx context.Context, projectID string) (*string, error) {
  36. db := GetReadDB(ctx)
  37. err := db.Where("project_id = ?", projectID).Delete(&gorm_model.ProjectInfo{}).Error
  38. if err != nil {
  39. return nil, err
  40. }
  41. return &projectID, nil
  42. }
  43. func GetFullProjectList(ctx context.Context, enterpriseID string, pageSize, pageNum int32, condition *common_model.ProjectCondition) ([]*gorm_model.ProjectInfo, int64, error) {
  44. db := GetReadDB(ctx)
  45. // 根据企业id过滤
  46. db = db.Debug().Model(gorm_model.ProjectInfo{}).Where("enterprise_id = ? and project_status <> 1", enterpriseID)
  47. // 根据Project条件过滤
  48. conditionType := reflect.TypeOf(condition).Elem()
  49. conditionValue := reflect.ValueOf(condition).Elem()
  50. for i := 0; i < conditionType.NumField(); i++ {
  51. field := conditionType.Field(i)
  52. tag := field.Tag.Get("condition")
  53. value := conditionValue.FieldByName(field.Name)
  54. if (tag == "project_id" || tag == "project_name") && !util.IsBlank(value) {
  55. db = db.Where(fmt.Sprintf("project_id like '%%%v%%' or project_name like '%%%v%%'", value.Interface(), value.Interface()))
  56. } else if tag == "updated_at" && value.Interface() != "0" {
  57. //db = db.Where(fmt.Sprintf("%s > ?", tag), value.Interface())
  58. db = db.Where(fmt.Sprintf("updated_at like '%s%%'", value.Interface()))
  59. } else if !util.IsBlank(value) && tag != "updated_at" {
  60. db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
  61. }
  62. }
  63. // 查询总数
  64. var total int64
  65. var fullProjects []*gorm_model.ProjectInfo
  66. if err := db.Count(&total).Error; err != nil {
  67. logrus.WithContext(ctx).Errorf("[GetFullProjectList] error query mysql total, err:%+v", err)
  68. return nil, 0, err
  69. }
  70. // 查询该页数据
  71. limit := pageSize
  72. offset := pageSize * pageNum // assert pageNum start with 0
  73. err := db.Order("updated_at desc").Limit(int(limit)).Offset(int(offset)).Find(&fullProjects).Error
  74. if err != nil {
  75. logrus.WithContext(ctx).Errorf("[GetFullProjectList] error query mysql total, err:%+v", err)
  76. return nil, 0, err
  77. }
  78. return fullProjects, total, nil
  79. }
  80. func GetProjectDraftList(ctx context.Context, enterpriseID string, pageSize, pageNum int32, condition *common_model.ProjectCondition) ([]*gorm_model.ProjectInfo, int64, error) {
  81. db := GetReadDB(ctx)
  82. // 根据企业id过滤
  83. db = db.Debug().Model(gorm_model.ProjectInfo{}).Where("enterprise_id = ?", enterpriseID)
  84. // 根据Project条件过滤
  85. conditionType := reflect.TypeOf(condition).Elem()
  86. conditionValue := reflect.ValueOf(condition).Elem()
  87. for i := 0; i < conditionType.NumField(); i++ {
  88. field := conditionType.Field(i)
  89. tag := field.Tag.Get("condition")
  90. value := conditionValue.FieldByName(field.Name)
  91. if (tag == "project_id" || tag == "project_name") && !util.IsBlank(value) {
  92. db = db.Where(fmt.Sprintf("project_id like '%%%v%%' or project_name like '%%%v%%'", value.Interface(), value.Interface()))
  93. } else if tag == "updated_at" && value.Interface() != "0" {
  94. //db = db.Where(fmt.Sprintf("%s > ?", tag), value.Interface())
  95. db = db.Where(fmt.Sprintf("updated_at like '%s%%'", value.Interface()))
  96. } else if !util.IsBlank(value) && tag != "updated_at" {
  97. db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
  98. }
  99. }
  100. // 查询总数
  101. var total int64
  102. var projectDrafts []*gorm_model.ProjectInfo
  103. if err := db.Count(&total).Error; err != nil {
  104. logrus.WithContext(ctx).Errorf("[GetProjectDraftList] error query mysql total, err:%+v", err)
  105. return nil, 0, err
  106. }
  107. // 查询该页数据
  108. limit := pageSize
  109. offset := pageSize * pageNum // assert pageNum start with 0
  110. err := db.Order("updated_at desc").Limit(int(limit)).Offset(int(offset)).Find(&projectDrafts).Error
  111. if err != nil {
  112. logrus.WithContext(ctx).Errorf("[GetProjectDraftList] error query mysql total, err:%+v", err)
  113. return nil, 0, err
  114. }
  115. return projectDrafts, total, nil
  116. }
  117. func GetProjectTaskList(ctx context.Context, pageSize, pageNum int64, conditions *common_model.TaskConditions) ([]*http_model.ProjectTaskInfo, int64, error) {
  118. db := GetReadDB(ctx)
  119. // 查询task表信息
  120. db = db.Debug().Model(gorm_model.YoungeeTaskInfo{})
  121. // 根据Project条件过滤
  122. conditionType := reflect.TypeOf(conditions).Elem()
  123. conditionValue := reflect.ValueOf(conditions).Elem()
  124. var platform_nickname string = ""
  125. for i := 0; i < conditionType.NumField(); i++ {
  126. field := conditionType.Field(i)
  127. tag := field.Tag.Get("condition")
  128. value := conditionValue.FieldByName(field.Name)
  129. if !util.IsBlank(value) && tag != "platform_nickname" {
  130. db = db.Where(fmt.Sprintf("%s = ?", tag), value.Interface())
  131. } else if tag == "platform_nickname" {
  132. platform_nickname = fmt.Sprintf("%v", value.Interface())
  133. continue
  134. }
  135. }
  136. var taskInfos []gorm_model.YoungeeTaskInfo
  137. db = db.Model(gorm_model.YoungeeTaskInfo{})
  138. // 查询总数
  139. var totalTask int64
  140. if err := db.Count(&totalTask).Error; err != nil {
  141. logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
  142. return nil, 0, err
  143. }
  144. db.Order("task_id").Find(&taskInfos)
  145. // 查询该页数据
  146. limit := pageSize
  147. offset := pageSize * pageNum // assert pageNum start with 0
  148. err := db.Order("task_id").Limit(int(limit)).Offset(int(offset)).Error
  149. if err != nil {
  150. logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
  151. return nil, 0, err
  152. }
  153. var taskDatas []*http_model.ProjectTaskInfo
  154. var newTaskDatas []*http_model.ProjectTaskInfo
  155. taskDatas = pack.TaskAccountToTaskInfo(taskInfos)
  156. for _, v := range taskDatas {
  157. if platform_nickname == "" {
  158. newTaskDatas = append(newTaskDatas, v)
  159. } else if strings.Contains(v.PlatformNickname, platform_nickname) {
  160. newTaskDatas = append(newTaskDatas, v)
  161. } else if strings.Contains(v.TaskID, platform_nickname) {
  162. newTaskDatas = append(newTaskDatas, v)
  163. } else {
  164. totalTask--
  165. }
  166. }
  167. return newTaskDatas, totalTask, nil
  168. }
  169. func GetProjectDetail(ctx context.Context, projectID string) (*gorm_model.ProjectInfo, error) {
  170. db := GetReadDB(ctx)
  171. var ProjectDetail *gorm_model.ProjectInfo
  172. //fmt.Printf("项目ID:%+v", projectID)
  173. err := db.Where("project_id = ?", projectID).First(&ProjectDetail).Error
  174. if err != nil {
  175. if err == gorm.ErrRecordNotFound {
  176. return nil, nil
  177. } else {
  178. return nil, err
  179. }
  180. }
  181. //fmt.Printf("项目详情:%+v", ProjectDetail)
  182. return ProjectDetail, nil
  183. }
  184. func GetProjectPhoto(ctx context.Context, ProjectID string) ([]gorm_model.ProjectPhoto, error) {
  185. db := GetReadDB(ctx)
  186. ProjectPhoto := []gorm_model.ProjectPhoto{}
  187. err := db.Where("project_id=?", ProjectID).Find(&ProjectPhoto).Error
  188. if err != nil {
  189. return nil, err
  190. }
  191. return ProjectPhoto, nil
  192. }
  193. func GetRecruitStrategys(ctx context.Context, ProjectID string) ([]gorm_model.RecruitStrategy, error) {
  194. db := GetReadDB(ctx)
  195. RecruitStrategys := []gorm_model.RecruitStrategy{}
  196. err := db.Where("project_id=?", ProjectID).Find(&RecruitStrategys).Error
  197. if err != nil {
  198. return nil, err
  199. }
  200. return RecruitStrategys, nil
  201. }
  202. func UpdateProjectStatus(ctx context.Context, projectId string, status int64) error {
  203. db := GetReadDB(ctx)
  204. t := time.Now()
  205. err := db.Model(gorm_model.ProjectInfo{}).
  206. Where("project_id = ?", projectId).Updates(gorm_model.ProjectInfo{ProjectStatus: status, PayAt: &t}).Error
  207. if err != nil {
  208. log.Println("DB UpdateProjectStatus error :", err)
  209. return err
  210. }
  211. return nil
  212. }
  213. func GetFeeDetail(ctx context.Context, enterpriseID string, EndTime string) (*http_model.FeeDetailPreview, error) {
  214. db := GetReadDB(ctx)
  215. // 根据企业id过滤
  216. db = db.Debug().Model(gorm_model.ProjectInfo{}).Where("enterprise_id = ? AND project_status = 10", enterpriseID)
  217. if EndTime != "" {
  218. db = db.Where("updated_at like ?", EndTime+"%")
  219. }
  220. var projectInfos []gorm_model.ProjectInfo
  221. db = db.Order("updated_at desc").Find(&projectInfos)
  222. FeeDetailPreview := http_model.FeeDetailPreview{}
  223. for _, projectInfo := range projectInfos {
  224. FeeDetailData := new(http_model.FeeDetailData)
  225. FeeDetailData.ProjectID = projectInfo.ProjectID
  226. FeeDetailData.ProjectName = projectInfo.ProjectName
  227. FeeDetailData.ProjectType = consts.GetProjectType(projectInfo.ProjectType)
  228. FeeDetailData.Payment = conv.MustString(projectInfo.PaymentAmount, "")
  229. FeeDetailData.UpdatedAt = conv.MustString(projectInfo.UpdatedAt)[0:19]
  230. FeeDetailPreview.FeeDetailData = append(FeeDetailPreview.FeeDetailData, FeeDetailData)
  231. }
  232. return &FeeDetailPreview, nil
  233. }
  234. func SetProjectFinish(ctx context.Context, projectId string) error {
  235. db := GetReadDB(ctx)
  236. var finishedNum int64
  237. var unfinishedNum int64
  238. db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = 2 AND task_stage < 15", projectId).Count(&unfinishedNum)
  239. db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Count(&finishedNum)
  240. if unfinishedNum == 0 && finishedNum != 0 {
  241. // 2. 释放企业账户因项目冻结的资金
  242. // 1) 计算剩余资金
  243. db1 := GetReadDB(ctx)
  244. var allPayment float64
  245. var realPayment float64
  246. err := db1.Model(gorm_model.YoungeeTaskInfo{}).
  247. Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Pluck("COALESCE(SUM(all_payment), 0) as allPayment", &allPayment).Error
  248. if err != nil {
  249. log.Println("DB GetAutoCaseCloseTask error in data:", err)
  250. return err
  251. }
  252. err = db1.Model(gorm_model.YoungeeTaskInfo{}).Select("sum(real_payment) as realPayment").
  253. Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Pluck("COALESCE(SUM(real_payment), 0) as realPayment", &realPayment).Error
  254. if err != nil {
  255. log.Println("DB GetAutoCaseCloseTask error in data:", err)
  256. return err
  257. }
  258. fmt.Println("企业应支付金额总计:", allPayment, "实际支付总计:", realPayment)
  259. db2 := GetReadDB(ctx)
  260. var enterpriseID int64
  261. db2.Model(gorm_model.ProjectInfo{}).Select("enterprise_id").Where("project_id = ?", projectId).Find(&enterpriseID)
  262. // 2). 释放剩余资金
  263. err = db1.Model(gorm_model.Enterprise{}).Where("enterprise_id = ?", enterpriseID).Updates(
  264. map[string]interface{}{
  265. "frozen_balance": gorm.Expr("frozen_balance - ?", allPayment),
  266. "balance": gorm.Expr("balance - ?", realPayment),
  267. "available_balance": gorm.Expr("available_balance + ?", allPayment-realPayment)}).Error
  268. if err != nil {
  269. log.Println("DB GetAutoCaseCloseTask error in data:", err)
  270. return err
  271. }
  272. // 1. 更新项目状态为已结束
  273. t := time.Now()
  274. err = db.Model(gorm_model.ProjectInfo{}).Where("project_id = ?", projectId).Updates(gorm_model.ProjectInfo{ProjectStatus: 10, PaymentAmount: realPayment, FinishAt: &t}).Error
  275. if err != nil {
  276. logrus.WithContext(ctx).Errorf("[Project db] Update ProjectInfo error,err:%+v", err)
  277. return err
  278. }
  279. }
  280. return nil
  281. }
  282. func SetSpecialProjectFinish(ctx context.Context, projectId string) error {
  283. db := GetReadDB(ctx)
  284. var finishedNum int64
  285. var unfinishedNum int64
  286. db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = 2 AND task_stage < 15", projectId).Count(&unfinishedNum)
  287. db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Count(&finishedNum)
  288. if unfinishedNum == 0 && finishedNum != 0 {
  289. // 1. 更新项目状态为已结束
  290. t := time.Now()
  291. err := db.Model(gorm_model.ProjectInfo{}).Where("project_id = ?", projectId).Updates(gorm_model.ProjectInfo{ProjectStatus: 10, FinishAt: &t}).Error
  292. if err != nil {
  293. logrus.WithContext(ctx).Errorf("[Project db] Update ProjectInfo error,err:%+v", err)
  294. return err
  295. }
  296. }
  297. return nil
  298. }
  299. func GetCreatingNumber(ctx context.Context, enterpriseID string) (*int64, error) {
  300. db := GetReadDB(ctx)
  301. var creatingNumber int64
  302. err := db.Model(gorm_model.ProjectInfo{}).Where("enterprise_id = ? and project_status = 1", enterpriseID).Count(&creatingNumber).Error
  303. if err != nil {
  304. logrus.WithContext(ctx).Errorf("[Project db] Update ProjectInfo error,err:%+v", err)
  305. return nil, err
  306. }
  307. return &creatingNumber, nil
  308. }
  309. func GetProjectData(ctx context.Context, projectid string) (http_model.ProjectDataResponse, error) {
  310. db := GetReadDB(ctx)
  311. var projectInfo gorm_model.ProjectInfo
  312. // 查询项目基本信息
  313. if err := db.Where("project_id = ?", projectid).First(&projectInfo).Error; err != nil {
  314. logrus.WithContext(ctx).Errorf("[Project db] GetProjectData error, err: %+v", err)
  315. return http_model.ProjectDataResponse{}, err
  316. }
  317. var projectTasks []gorm_model.YoungeeTaskInfo
  318. if err := db.Where("project_id = ? AND task_status = ?", projectid, 2).Find(&projectTasks).Error; err != nil {
  319. return http_model.ProjectDataResponse{}, err
  320. }
  321. var totalTasks int64
  322. if err := db.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = ?", projectid, 2).Count(&totalTasks).Error; err != nil {
  323. return http_model.ProjectDataResponse{}, err
  324. }
  325. // 初始化统计数据
  326. dateStats := make(map[string]int)
  327. fansCounts := map[int64]int{0: 0, 1: 0, 2: 0, 3: 0}
  328. feeCounts := map[int]int{1: 0, 2: 0, 3: 0}
  329. startDate := *projectInfo.CreatedAt
  330. endDate := time.Now()
  331. // 填充日期统计
  332. for d := startDate; d.Before(endDate) || d.Equal(endDate); d = d.Add(24 * time.Hour) {
  333. dateStats[d.Format("2006-01-02")] = 0
  334. }
  335. var totalCost float64
  336. var totalFans int
  337. var serverTaskCount float64
  338. var maleCount int64
  339. // 处理每个任务
  340. for _, task := range projectTasks {
  341. totalCost += task.DraftFee
  342. var talentInfo gorm_model.YoungeeTalentInfo
  343. // 查询达人信息
  344. if err := db.Where("id = ?", task.TalentID).First(&talentInfo).Error; err != nil {
  345. logrus.WithContext(ctx).Errorf("[Project db] GetProjectData error, err: %+v", err)
  346. return http_model.ProjectDataResponse{}, err
  347. }
  348. // 统计性别
  349. if talentInfo.Sex == 1 {
  350. maleCount++
  351. }
  352. totalFans += task.FansNum
  353. // 统计来自服务商的任务
  354. if task.SupplierId != 0 && task.SupplierStatus == 2 {
  355. serverTaskCount++
  356. }
  357. // 稿费形式统计
  358. feeCounts[task.FeeForm]++
  359. // 统计粉丝数
  360. switch {
  361. case task.FansNum < 10000:
  362. fansCounts[0]++
  363. case task.FansNum < 100000:
  364. fansCounts[1]++
  365. case task.FansNum < 1000000:
  366. fansCounts[2]++
  367. default:
  368. fansCounts[3]++
  369. }
  370. SelectDate := task.SelectDate.Format("2006-01-02")
  371. if _, exists := dateStats[SelectDate]; exists {
  372. dateStats[SelectDate]++
  373. }
  374. }
  375. // 计算平均值
  376. var avgFansNum int
  377. if totalTasks > 0 {
  378. avgFansNum = totalFans / int(totalTasks)
  379. } else {
  380. avgFansNum = 0
  381. }
  382. var fromType float64
  383. if totalTasks > 0 {
  384. fromType = serverTaskCount / float64(totalTasks)
  385. } else {
  386. fromType = 0
  387. }
  388. var manRatio float64
  389. if totalTasks > 0 {
  390. manRatio = float64(maleCount) / float64(totalTasks)
  391. } else {
  392. manRatio = 0
  393. }
  394. // 构建响应
  395. res := http_model.ProjectDataResponse{
  396. Recruittime: *projectInfo.PassAt,
  397. RecruitDDl: *projectInfo.RecruitDdl,
  398. AgreeNum: projectInfo.RecruitNum,
  399. ApplyNum: projectInfo.ApplyNum,
  400. DraftFee: totalCost,
  401. AvgFansNum: avgFansNum,
  402. FromType: fromType,
  403. ManRatio: manRatio,
  404. DateStats: dateStats,
  405. FeeMap: feeCounts,
  406. FansMap: fansCounts,
  407. }
  408. return res, nil
  409. }
  410. func GetProjectExecuteData(ctx context.Context, projectid string) (http_model.ExecuteDataResponse, error) {
  411. db := GetReadDB(ctx)
  412. var projectData gorm_model.ProjectInfo
  413. // 查询项目基本信息
  414. err := db.Model(gorm_model.ProjectInfo{}).Where("project_id = ?", projectid).First(&projectData).Error
  415. if err != nil {
  416. logrus.WithContext(ctx).Errorf("[Project db] GetProjectData error, err: %+v", err)
  417. return http_model.ExecuteDataResponse{}, err
  418. }
  419. // 查询项目任务信息
  420. var projectTaskInfo []gorm_model.YoungeeTaskInfo
  421. query := db.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = ?", projectid, 2).Find(&projectTaskInfo)
  422. var total int64
  423. if err = query.Count(&total).Error; err != nil {
  424. return http_model.ExecuteDataResponse{}, err
  425. }
  426. var presketchnum int64 //代传初稿数
  427. var sketchnum int64 //待审
  428. var sketchaccnum int64 //通过
  429. var prelinknum, linknum, linkaccnum, predatanum, datanum int64 //待传连接数,待审,通过
  430. var duration time.Duration
  431. var accskecnt int
  432. var avgduration time.Duration
  433. var avgccreateduraion time.Duration
  434. var createduraion time.Duration
  435. var crecnt, submint, firacccnt int
  436. var firaccratio, firacclinkratio float64
  437. var linkaccduartion, avglinkduration, backduration, avgbackdurtion time.Duration
  438. var acclinkcnt, backcnt, submintcnt, firlinkacccnt int
  439. var defaultnum int64
  440. var defaultratio float64
  441. for _, task := range projectTaskInfo {
  442. switch task.TaskStage {
  443. case 9:
  444. presketchnum += 1
  445. case 10:
  446. sketchnum += 1
  447. case 11:
  448. prelinknum += 1
  449. case 12:
  450. linknum += 1
  451. case 13:
  452. predatanum += 1
  453. }
  454. if task.SketchStatus == 5 {
  455. sketchaccnum += 1
  456. }
  457. if task.LinkStatus == 5 {
  458. linkaccnum += 1
  459. }
  460. if task.CurDefaultType != 0 {
  461. defaultnum += 1
  462. }
  463. var sktchinfo gorm_model.YounggeeSketchInfo
  464. err = db.Model(gorm_model.YounggeeSketchInfo{}).Where("task_id = ? ", task.TaskID).First(&sktchinfo).Error
  465. if err != nil {
  466. return http_model.ExecuteDataResponse{}, err
  467. } else {
  468. if projectData.ProjectForm == 1 {
  469. if task.SignedTime.IsZero() {
  470. createduraion += sktchinfo.CreateAt.Sub(task.SignedTime)
  471. crecnt += 1
  472. }
  473. } else {
  474. if sktchinfo.IsSubmit == 1 {
  475. createduraion += sktchinfo.CreateAt.Sub(task.SelectDate)
  476. crecnt += 1
  477. }
  478. }
  479. if sktchinfo.IsOk == 1 {
  480. duration += sktchinfo.AgreeAt.Sub(sktchinfo.CreateAt)
  481. accskecnt += 1
  482. }
  483. if sktchinfo.IsSubmit == 1 {
  484. submint += 1
  485. if sktchinfo.RejectAt.IsZero() && sktchinfo.IsOk == 1 {
  486. firacccnt += 1
  487. }
  488. }
  489. }
  490. var linkinfo gorm_model.YounggeeLinkInfo
  491. err = db.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id = ? ", task.TaskID).First(&linkinfo).Error
  492. if err != nil {
  493. return http_model.ExecuteDataResponse{}, err
  494. } else {
  495. if linkinfo.IsOk == 1 {
  496. linkaccduartion += linkinfo.AgreeAt.Sub(linkinfo.CreateAt)
  497. acclinkcnt += 1
  498. }
  499. if linkinfo.IsSubmit == 1 {
  500. backduration += linkinfo.SubmitAt.Sub(sktchinfo.AgreeAt)
  501. backcnt += 1
  502. }
  503. if linkinfo.IsSubmit == 1 {
  504. submintcnt += 1
  505. if linkinfo.RejectAt.IsZero() && linkinfo.IsOk == 1 {
  506. firlinkacccnt += 1
  507. }
  508. }
  509. }
  510. //var datainfo gorm_model.YounggeeDataInfo
  511. //err = db.Model(gorm_model.YounggeeDataInfo{}).Where("task_id = ? ", task.TaskID).First(&datainfo).Error
  512. //if err != nil {
  513. // return http_model.ExecuteDataResponse{}, err
  514. //} else {
  515. // if datainfo
  516. //
  517. //}
  518. }
  519. if submint > 0 && firacccnt > 0 {
  520. firaccratio = float64(firacccnt) / float64(submint)
  521. } else {
  522. firaccratio = 0
  523. }
  524. if submintcnt > 0 && firlinkacccnt > 0 {
  525. firacclinkratio = float64(firlinkacccnt) / float64(submintcnt)
  526. } else {
  527. firacclinkratio = 0
  528. }
  529. if accskecnt > 0 {
  530. avgduration = duration / time.Duration(accskecnt)
  531. } else {
  532. avgduration = 0
  533. }
  534. if crecnt > 0 {
  535. avgccreateduraion = createduraion / time.Duration(crecnt)
  536. } else {
  537. avgccreateduraion = 0
  538. }
  539. if acclinkcnt > 0 {
  540. avglinkduration = linkaccduartion / time.Duration(acclinkcnt)
  541. } else {
  542. avglinkduration = 0
  543. }
  544. if backcnt > 0 {
  545. avgbackdurtion = backduration / time.Duration(backcnt)
  546. } else {
  547. avgbackdurtion = 0
  548. }
  549. if defaultnum > 0 {
  550. defaultratio = float64(defaultnum) / float64(total)
  551. } else {
  552. defaultratio = 0
  553. }
  554. res := http_model.ExecuteDataResponse{
  555. Excutetime: *projectData.PayAt,
  556. PreSketchNum: presketchnum,
  557. SketchNum: sketchnum,
  558. SketchAccNum: sketchaccnum,
  559. AvgAccTime: avgduration,
  560. AvgCreTime: avgccreateduraion,
  561. FirAccRatio: firaccratio,
  562. PreLinkNum: prelinknum,
  563. LinkNum: linknum,
  564. LinkAccNum: linkaccnum,
  565. AvgLinkAccTime: avglinkduration,
  566. AvgBackTime: avgbackdurtion,
  567. FirAccLinkRatio: firacclinkratio,
  568. PreDataNum: predatanum,
  569. DataNum: datanum,
  570. DefaultNum: defaultnum,
  571. DefaultRatio: defaultratio,
  572. }
  573. return res, nil
  574. }