project.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  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, projectID string, 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 GetCreatingNumber(ctx context.Context, enterpriseID string) (*int64, error) {
  283. db := GetReadDB(ctx)
  284. var creatingNumber int64
  285. err := db.Model(gorm_model.ProjectInfo{}).Where("enterprise_id = ? and project_status = 1", enterpriseID).Count(&creatingNumber).Error
  286. if err != nil {
  287. logrus.WithContext(ctx).Errorf("[Project db] Update ProjectInfo error,err:%+v", err)
  288. return nil, err
  289. }
  290. return &creatingNumber, nil
  291. }