project.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  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, pageSize, pageNum int32, condition *common_model.ProjectCondition) ([]*gorm_model.ProjectInfo, int64, error) {
  44. db := GetReadDB(ctx)
  45. // 根据带货任务状态过滤
  46. db = db.Debug().Model(gorm_model.ProjectInfo{}).Where("project_status = 4")
  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, orderBy []string, orderDesc []int, 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. // 动态排序逻辑
  137. if len(orderBy) > 0 && len(orderDesc) > 0 && len(orderBy) == len(orderDesc) {
  138. for i := 0; i < len(orderBy); i++ {
  139. orderField := orderBy[i]
  140. isDesc := orderDesc[i] == 1 // 1=降序,其他值=升序
  141. switch orderField {
  142. case "fans_num":
  143. if isDesc {
  144. db = db.Order("fans_num desc")
  145. } else {
  146. db = db.Order("fans_num asc")
  147. }
  148. case "vote_avg":
  149. if isDesc {
  150. db = db.Order("vote_avg desc")
  151. } else {
  152. db = db.Order("vote_avg asc")
  153. }
  154. case "commit_avg":
  155. if isDesc {
  156. db = db.Order("commit_avg desc")
  157. } else {
  158. db = db.Order("commit_avg asc")
  159. }
  160. case "collect_avg":
  161. if isDesc {
  162. db = db.Order("collect_avg desc")
  163. } else {
  164. db = db.Order("collect_avg asc")
  165. }
  166. }
  167. }
  168. } else {
  169. // 默认排序
  170. db = db.Order("task_id desc")
  171. }
  172. var taskInfos []gorm_model.YoungeeTaskInfo
  173. // 查询总数
  174. var totalTask int64
  175. if err := db.Model(gorm_model.YoungeeTaskInfo{}).Count(&totalTask).Error; err != nil {
  176. logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
  177. return nil, 0, err
  178. }
  179. // 查询该页数据
  180. limit := pageSize
  181. offset := pageSize * pageNum // assert pageNum start with 0
  182. if err := db.Limit(int(limit)).Offset(int(offset)).Find(&taskInfos).Error; err != nil {
  183. logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql data, err:%+v", err)
  184. return nil, 0, err
  185. }
  186. var taskDatas []*http_model.ProjectTaskInfo
  187. var newTaskDatas []*http_model.ProjectTaskInfo
  188. taskDatas = pack.TaskAccountToTaskInfo(taskInfos)
  189. for _, v := range taskDatas {
  190. if platform_nickname == "" {
  191. newTaskDatas = append(newTaskDatas, v)
  192. } else if strings.Contains(v.PlatformNickname, platform_nickname) {
  193. newTaskDatas = append(newTaskDatas, v)
  194. } else if strings.Contains(v.TaskID, platform_nickname) {
  195. newTaskDatas = append(newTaskDatas, v)
  196. } else {
  197. totalTask--
  198. }
  199. }
  200. return newTaskDatas, totalTask, nil
  201. }
  202. func GetProjectDetail(ctx context.Context, projectID string) (*gorm_model.ProjectInfo, error) {
  203. db := GetReadDB(ctx)
  204. var ProjectDetail *gorm_model.ProjectInfo
  205. //fmt.Printf("项目ID:%+v", projectID)
  206. err := db.Where("project_id = ?", projectID).First(&ProjectDetail).Error
  207. if err != nil {
  208. if err == gorm.ErrRecordNotFound {
  209. return nil, nil
  210. } else {
  211. return nil, err
  212. }
  213. }
  214. //fmt.Printf("项目详情:%+v", ProjectDetail)
  215. return ProjectDetail, nil
  216. }
  217. func GetProjectPhoto(ctx context.Context, ProjectID string) ([]gorm_model.ProjectPhoto, error) {
  218. db := GetReadDB(ctx)
  219. ProjectPhoto := []gorm_model.ProjectPhoto{}
  220. err := db.Where("project_id=?", ProjectID).Find(&ProjectPhoto).Error
  221. if err != nil {
  222. return nil, err
  223. }
  224. return ProjectPhoto, nil
  225. }
  226. func GetRecruitStrategys(ctx context.Context, ProjectID string) ([]gorm_model.RecruitStrategy, error) {
  227. db := GetReadDB(ctx)
  228. RecruitStrategys := []gorm_model.RecruitStrategy{}
  229. err := db.Where("project_id=?", ProjectID).Find(&RecruitStrategys).Error
  230. if err != nil {
  231. return nil, err
  232. }
  233. return RecruitStrategys, nil
  234. }
  235. func UpdateProjectStatus(ctx context.Context, projectId string, status int64) error {
  236. db := GetReadDB(ctx)
  237. t := time.Now()
  238. err := db.Model(gorm_model.ProjectInfo{}).
  239. Where("project_id = ?", projectId).Updates(gorm_model.ProjectInfo{ProjectStatus: status, PayAt: &t}).Error
  240. if err != nil {
  241. log.Println("DB UpdateProjectStatus error :", err)
  242. return err
  243. }
  244. return nil
  245. }
  246. func GetFeeDetail(ctx context.Context, enterpriseID string, EndTime string) (*http_model.FeeDetailPreview, error) {
  247. db := GetReadDB(ctx)
  248. // 根据企业id过滤
  249. db = db.Debug().Model(gorm_model.ProjectInfo{}).Where("enterprise_id = ? AND project_status = 10", enterpriseID)
  250. if EndTime != "" {
  251. db = db.Where("updated_at like ?", EndTime+"%")
  252. }
  253. var projectInfos []gorm_model.ProjectInfo
  254. db = db.Order("updated_at desc").Find(&projectInfos)
  255. FeeDetailPreview := http_model.FeeDetailPreview{}
  256. for _, projectInfo := range projectInfos {
  257. FeeDetailData := new(http_model.FeeDetailData)
  258. FeeDetailData.ProjectID = projectInfo.ProjectID
  259. FeeDetailData.ProjectName = projectInfo.ProjectName
  260. FeeDetailData.ProjectType = consts.GetProjectType(projectInfo.ProjectType)
  261. FeeDetailData.Payment = conv.MustString(projectInfo.PaymentAmount, "")
  262. FeeDetailData.UpdatedAt = conv.MustString(projectInfo.UpdatedAt)[0:19]
  263. FeeDetailPreview.FeeDetailData = append(FeeDetailPreview.FeeDetailData, FeeDetailData)
  264. }
  265. return &FeeDetailPreview, nil
  266. }
  267. func SetProjectFinish(ctx context.Context, projectId string) error {
  268. db := GetReadDB(ctx)
  269. var finishedNum int64
  270. var unfinishedNum int64
  271. db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = 2 AND task_stage < 15", projectId).Count(&unfinishedNum)
  272. db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Count(&finishedNum)
  273. if unfinishedNum == 0 && finishedNum != 0 {
  274. // 2. 释放企业账户因项目冻结的资金
  275. // 1) 计算剩余资金
  276. db1 := GetReadDB(ctx)
  277. var allPayment float64
  278. var realPayment float64
  279. err := db1.Model(gorm_model.YoungeeTaskInfo{}).
  280. Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Pluck("COALESCE(SUM(all_payment), 0) as allPayment", &allPayment).Error
  281. if err != nil {
  282. log.Println("DB GetAutoCaseCloseTask error in data:", err)
  283. return err
  284. }
  285. err = db1.Model(gorm_model.YoungeeTaskInfo{}).Select("sum(real_payment) as realPayment").
  286. Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Pluck("COALESCE(SUM(real_payment), 0) as realPayment", &realPayment).Error
  287. if err != nil {
  288. log.Println("DB GetAutoCaseCloseTask error in data:", err)
  289. return err
  290. }
  291. fmt.Println("企业应支付金额总计:", allPayment, "实际支付总计:", realPayment)
  292. db2 := GetReadDB(ctx)
  293. var enterpriseID int64
  294. db2.Model(gorm_model.ProjectInfo{}).Select("enterprise_id").Where("project_id = ?", projectId).Find(&enterpriseID)
  295. // 2). 释放剩余资金
  296. err = db1.Model(gorm_model.Enterprise{}).Where("enterprise_id = ?", enterpriseID).Updates(
  297. map[string]interface{}{
  298. "frozen_balance": gorm.Expr("frozen_balance - ?", allPayment),
  299. "balance": gorm.Expr("balance - ?", realPayment),
  300. "available_balance": gorm.Expr("available_balance + ?", allPayment-realPayment)}).Error
  301. if err != nil {
  302. log.Println("DB GetAutoCaseCloseTask error in data:", err)
  303. return err
  304. }
  305. // 1. 更新项目状态为已结束
  306. t := time.Now()
  307. err = db.Model(gorm_model.ProjectInfo{}).Where("project_id = ?", projectId).Updates(gorm_model.ProjectInfo{ProjectStatus: 10, PaymentAmount: realPayment, FinishAt: &t}).Error
  308. if err != nil {
  309. logrus.WithContext(ctx).Errorf("[Project db] Update ProjectInfo error,err:%+v", err)
  310. return err
  311. }
  312. }
  313. return nil
  314. }
  315. func SetSpecialProjectFinish(ctx context.Context, projectId string) error {
  316. db := GetReadDB(ctx)
  317. var finishedNum int64
  318. var unfinishedNum int64
  319. db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = 2 AND task_stage < 15", projectId).Count(&unfinishedNum)
  320. db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Count(&finishedNum)
  321. if unfinishedNum == 0 && finishedNum != 0 {
  322. // 1. 更新项目状态为已结束
  323. t := time.Now()
  324. err := db.Model(gorm_model.ProjectInfo{}).Where("project_id = ?", projectId).Updates(gorm_model.ProjectInfo{ProjectStatus: 10, FinishAt: &t}).Error
  325. if err != nil {
  326. logrus.WithContext(ctx).Errorf("[Project db] Update ProjectInfo error,err:%+v", err)
  327. return err
  328. }
  329. }
  330. return nil
  331. }
  332. func GetCreatingNumber(ctx context.Context, enterpriseID string) (*int64, error) {
  333. db := GetReadDB(ctx)
  334. var creatingNumber int64
  335. err := db.Model(gorm_model.ProjectInfo{}).Where("enterprise_id = ? and project_status = 1", enterpriseID).Count(&creatingNumber).Error
  336. if err != nil {
  337. logrus.WithContext(ctx).Errorf("[Project db] Update ProjectInfo error,err:%+v", err)
  338. return nil, err
  339. }
  340. return &creatingNumber, nil
  341. }