project.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672
  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. fmt.Println("projectInfo---", projectInfo.ProjectID)
  318. var projectTasks []gorm_model.YoungeeTaskInfo
  319. if err := db.Where("project_id = ? AND task_status = ?", projectid, 2).Find(&projectTasks).Error; err != nil {
  320. return http_model.ProjectDataResponse{}, err
  321. }
  322. var totalTasks int64
  323. if err := db.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = ?", projectid, 2).Count(&totalTasks).Error; err != nil {
  324. return http_model.ProjectDataResponse{}, err
  325. }
  326. // 初始化统计数据
  327. dateStats := make(map[string]int)
  328. fansCounts := map[int64]int{0: 0, 1: 0, 2: 0, 3: 0}
  329. feeCounts := map[int]int{1: 0, 2: 0, 3: 0}
  330. startDate := *projectInfo.CreatedAt
  331. endDate := time.Now()
  332. // 填充日期统计
  333. for d := startDate; d.Before(endDate) || d.Equal(endDate); d = d.Add(24 * time.Hour) {
  334. dateStats[d.Format("2006-01-02")] = 0
  335. }
  336. var totalCost float64
  337. var totalFans int
  338. var serverTaskCount float64
  339. var maleCount int64
  340. // 处理每个任务
  341. for _, task := range projectTasks {
  342. totalCost += task.DraftFee
  343. var talentInfo gorm_model.YoungeeTalentInfo
  344. // 查询达人信息
  345. if err := db.Where("id = ?", task.TalentID).First(&talentInfo).Error; err != nil {
  346. logrus.WithContext(ctx).Errorf("[Project db] GetProjectData error, err: %+v", err)
  347. return http_model.ProjectDataResponse{}, err
  348. }
  349. // 统计性别
  350. if talentInfo.Sex == 1 {
  351. maleCount++
  352. }
  353. totalFans += task.FansNum
  354. // 统计来自服务商的任务
  355. if task.SupplierId != 0 && task.SupplierStatus == 2 {
  356. serverTaskCount++
  357. }
  358. // 稿费形式统计
  359. feeCounts[task.FeeForm]++
  360. // 统计粉丝数
  361. switch {
  362. case task.FansNum < 10000:
  363. fansCounts[0]++
  364. case task.FansNum < 100000:
  365. fansCounts[1]++
  366. case task.FansNum < 1000000:
  367. fansCounts[2]++
  368. default:
  369. fansCounts[3]++
  370. }
  371. SelectDate := task.SelectDate.Format("2006-01-02")
  372. if _, exists := dateStats[SelectDate]; exists {
  373. dateStats[SelectDate]++
  374. }
  375. }
  376. // 计算平均值
  377. var avgFansNum int
  378. if totalTasks > 0 {
  379. avgFansNum = totalFans / int(totalTasks)
  380. } else {
  381. avgFansNum = 0
  382. }
  383. var fromType float64
  384. if totalTasks > 0 {
  385. fromType = serverTaskCount / float64(totalTasks)
  386. } else {
  387. fromType = 0
  388. }
  389. var manRatio float64
  390. if totalTasks > 0 {
  391. manRatio = float64(maleCount) / float64(totalTasks)
  392. } else {
  393. manRatio = 0
  394. }
  395. // 构建响应
  396. res := http_model.ProjectDataResponse{
  397. Recruittime: *projectInfo.PassAt,
  398. RecruitDDl: *projectInfo.RecruitDdl,
  399. AgreeNum: projectInfo.RecruitNum,
  400. ApplyNum: projectInfo.ApplyNum,
  401. DraftFee: totalCost,
  402. AvgFansNum: avgFansNum,
  403. FromType: fromType,
  404. ManRatio: manRatio,
  405. DateStats: dateStats,
  406. FeeMap: feeCounts,
  407. FansMap: fansCounts,
  408. }
  409. return res, nil
  410. }
  411. func GetProjectExecuteData(ctx context.Context, projectid string) (http_model.ExecuteDataResponse, error) {
  412. db := GetReadDB(ctx)
  413. var projectData gorm_model.ProjectInfo
  414. // 查询项目基本信息
  415. err := db.Model(gorm_model.ProjectInfo{}).Where("project_id = ?", projectid).First(&projectData).Error
  416. if err != nil {
  417. logrus.WithContext(ctx).Errorf("[Project db] GetProjectData error, err: %+v", err)
  418. return http_model.ExecuteDataResponse{}, err
  419. }
  420. // 查询项目任务信息
  421. var projectTaskInfo []gorm_model.YoungeeTaskInfo
  422. query := db.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = ?", projectid, 2).Find(&projectTaskInfo)
  423. var total int64
  424. if err = query.Count(&total).Error; err != nil {
  425. return http_model.ExecuteDataResponse{}, err
  426. }
  427. // 初始化统计数据
  428. skedateStats := make(map[string]int)
  429. linkdateStatics := make(map[string]int)
  430. startDate := *projectData.CreatedAt
  431. endDate := time.Now()
  432. // 填充日期统计
  433. for d := startDate; d.Before(endDate) || d.Equal(endDate); d = d.Add(24 * time.Hour) {
  434. skedateStats[d.Format("2006-01-02")] = 0
  435. linkdateStatics[d.Format("2006-01-02")] = 0
  436. }
  437. var presketchnum int64 //代传初稿数
  438. var sketchnum int64 //待审
  439. var sketchaccnum int64 //通过
  440. var prelinknum, linknum, linkaccnum, predatanum, datanum int64 //待传连接数,待审,通过
  441. var duration time.Duration
  442. var accskecnt int
  443. var avgduration time.Duration
  444. var avgccreateduraion time.Duration
  445. var createduraion time.Duration
  446. var crecnt, submint, firacccnt int
  447. var firaccratio, firacclinkratio float64
  448. var linkaccduartion, avglinkduration, backduration, avgbackdurtion time.Duration
  449. var acclinkcnt, backcnt, submintcnt, firlinkacccnt int
  450. var defaultnum int64
  451. var defaultratio float64
  452. var sktchinfo gorm_model.YounggeeSketchInfo
  453. var draftee, settle_amount float64
  454. for _, task := range projectTaskInfo {
  455. draftee += task.DraftFee
  456. switch task.TaskStage {
  457. case 9:
  458. presketchnum += 1
  459. case 10:
  460. sketchnum += 1
  461. case 11:
  462. prelinknum += 1
  463. case 12:
  464. linknum += 1
  465. case 13:
  466. predatanum += 1
  467. }
  468. if task.SketchStatus == 5 {
  469. sketchaccnum += 1
  470. }
  471. if task.LinkStatus == 5 {
  472. linkaccnum += 1
  473. }
  474. if task.CurDefaultType != 0 {
  475. defaultnum += 1
  476. }
  477. if task.TaskStage == 15 {
  478. settle_amount += task.SettleAmount
  479. }
  480. if task.TaskStage > 9 {
  481. //初稿
  482. //err = db.Model(gorm_model.YounggeeSketchInfo{}).Where("task_id = ? ", task.TaskID).First(&sktchinfo).Error
  483. err = db.Model(gorm_model.YounggeeSketchInfo{}).Where("task_id = ?", task.TaskID).Order("create_at ASC").First(&sktchinfo).Error
  484. if err != nil {
  485. return http_model.ExecuteDataResponse{}, err
  486. } else {
  487. if projectData.ProjectForm == 1 {
  488. if !task.SignedTime.IsZero() {
  489. createduraion += sktchinfo.CreateAt.Sub(task.SignedTime)
  490. crecnt += 1
  491. }
  492. } else {
  493. if sktchinfo.IsSubmit == 1 {
  494. createduraion += sktchinfo.CreateAt.Sub(task.SelectDate)
  495. crecnt += 1
  496. }
  497. } //平均创作耗时
  498. var sktchaccinfo gorm_model.YounggeeSketchInfo
  499. err = db.Model(gorm_model.YounggeeSketchInfo{}).Where("task_id = ?", task.TaskID).Order("create_at ASC").Last(&sktchaccinfo).Error
  500. if err != nil {
  501. return http_model.ExecuteDataResponse{}, err
  502. }
  503. if sktchaccinfo.IsOk == 1 {
  504. duration += sktchaccinfo.AgreeAt.Sub(sktchinfo.CreateAt)
  505. accskecnt += 1 //审稿耗时
  506. submint += 1
  507. if sktchaccinfo.SketchID == sktchinfo.SketchID {
  508. firacccnt += 1
  509. } //首次通过
  510. AgreeDate := sktchaccinfo.AgreeAt.Format("2006-01-02")
  511. if _, exists := skedateStats[AgreeDate]; exists {
  512. skedateStats[AgreeDate]++
  513. }
  514. }
  515. }
  516. }
  517. if task.TaskStage > 11 {
  518. var linkinfo gorm_model.YounggeeLinkInfo //最后一次上传link
  519. err = db.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id = ? ", task.TaskID).Order("create_at ASC").Last(&linkinfo).Error
  520. if err != nil {
  521. continue
  522. } else {
  523. if linkinfo.IsOk == 1 {
  524. linkaccduartion += linkinfo.AgreeAt.Sub(linkinfo.CreateAt)
  525. acclinkcnt += 1
  526. } //平均质检时间
  527. var linkfirinfo gorm_model.YounggeeLinkInfo //最后一次上传link
  528. err = db.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id = ? ", task.TaskID).Order("create_at ASC").First(&linkfirinfo).Error
  529. if err != nil {
  530. return http_model.ExecuteDataResponse{}, err
  531. } else {
  532. backduration += linkinfo.CreateAt.Sub(sktchinfo.AgreeAt)
  533. backcnt += 1
  534. var linklasinfo gorm_model.YounggeeLinkInfo //最后一次上传link
  535. err = db.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id = ? ", task.TaskID).Order("create_at ASC").Last(&linklasinfo).Error
  536. if err != nil {
  537. return http_model.ExecuteDataResponse{}, err
  538. }
  539. if linklasinfo.IsOk == 1 {
  540. submintcnt += 1
  541. if linklasinfo.LinkID == linkfirinfo.LinkID {
  542. firlinkacccnt += 1
  543. } //首次通过
  544. AgreeDate := linklasinfo.AgreeAt.Format("2006-01-02")
  545. if _, exists := linkdateStatics[AgreeDate]; exists {
  546. linkdateStatics[AgreeDate]++
  547. }
  548. }
  549. }
  550. }
  551. }
  552. }
  553. if submint > 0 && firacccnt > 0 {
  554. firaccratio = float64(firacccnt) / float64(submint)
  555. } else {
  556. firaccratio = 0
  557. }
  558. if submintcnt > 0 && firlinkacccnt > 0 {
  559. firacclinkratio = float64(firlinkacccnt) / float64(submintcnt)
  560. } else {
  561. firacclinkratio = 0
  562. }
  563. if accskecnt > 0 {
  564. avgduration = duration / time.Duration(accskecnt)
  565. } else {
  566. avgduration = 0
  567. }
  568. if crecnt > 0 {
  569. avgccreateduraion = createduraion / time.Duration(crecnt)
  570. } else {
  571. avgccreateduraion = 0
  572. }
  573. if acclinkcnt > 0 {
  574. avglinkduration = linkaccduartion / time.Duration(acclinkcnt)
  575. } else {
  576. avglinkduration = 0
  577. }
  578. if backcnt > 0 {
  579. avgbackdurtion = backduration / time.Duration(backcnt)
  580. } else {
  581. avgbackdurtion = 0
  582. }
  583. if defaultnum > 0 {
  584. defaultratio = float64(defaultnum) / float64(total)
  585. } else {
  586. defaultratio = 0
  587. }
  588. res := http_model.ExecuteDataResponse{
  589. Excutetime: *projectData.PayAt,
  590. PreSketchNum: presketchnum,
  591. SketchNum: sketchnum,
  592. SketchAccNum: sketchaccnum,
  593. AvgAccTime: avgduration,
  594. AvgCreTime: avgccreateduraion,
  595. FirAccRatio: firaccratio,
  596. PreLinkNum: prelinknum,
  597. LinkNum: linknum,
  598. LinkAccNum: linkaccnum,
  599. AvgLinkAccTime: avglinkduration,
  600. AvgBackTime: avgbackdurtion,
  601. FirAccLinkRatio: firacclinkratio,
  602. PreDataNum: predatanum,
  603. DataNum: datanum,
  604. DefaultNum: defaultnum,
  605. DefaultRatio: defaultratio,
  606. DraftFee: draftee,
  607. Settle_Amount: settle_amount,
  608. }
  609. return res, nil
  610. }
  611. func GetProjecdata(ctx context.Context, projectid string) (http_model.ProjectdataResponse, error) {
  612. db := GetReadDB(ctx)
  613. var projectInfo gorm_model.ProjectInfo
  614. // 查询项目基本信息
  615. if err := db.Where("project_id = ?", projectid).First(&projectInfo).Error; err != nil {
  616. logrus.WithContext(ctx).Errorf("[Project db] GetProjectData error, err: %+v", err)
  617. return http_model.ProjectdataResponse{}, err
  618. }
  619. res := http_model.ProjectdataResponse{}
  620. return res, nil
  621. }