home.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package home
  2. import (
  3. "context"
  4. contDao "dashoo.cn/micro/app/dao/contract"
  5. custDao "dashoo.cn/micro/app/dao/cust"
  6. platDao "dashoo.cn/micro/app/dao/plat"
  7. projDao "dashoo.cn/micro/app/dao/proj"
  8. "dashoo.cn/micro/app/model/home"
  9. "dashoo.cn/micro/app/model/plat"
  10. "dashoo.cn/micro/app/service"
  11. server "dashoo.cn/micro/app/service/plat"
  12. projSrv "dashoo.cn/micro/app/service/proj"
  13. "encoding/json"
  14. "fmt"
  15. "github.com/gogf/gf/os/gtime"
  16. "github.com/gogf/gf/util/gconv"
  17. )
  18. type HomeService struct {
  19. *service.ContextService
  20. }
  21. func NewHomeService(ctx context.Context) (svc *HomeService, err error) {
  22. svc = new(HomeService)
  23. if svc.ContextService, err = svc.Init(ctx); err != nil {
  24. return nil, err
  25. }
  26. return svc, nil
  27. }
  28. func (s *HomeService) SetUpHomeReportConfig(param *home.SetUpHomeConfig) (err error) {
  29. svc, err := server.NewUserConfigService(s.Ctx)
  30. config, _ := svc.QueryByUserIdAndModelCode(s.GetCxtUserId(), param.ModuleCode)
  31. by, _ := json.Marshal(param)
  32. if config != nil {
  33. config.ConfigInfo = gconv.String(by)
  34. err = svc.Edit(config)
  35. } else {
  36. config := new(plat.PlatUserConfig)
  37. config.UserId = s.GetCxtUserId()
  38. config.ModuleCode = param.ModuleCode
  39. config.ConfigInfo = gconv.String(by)
  40. _, err = svc.Create(config)
  41. }
  42. return
  43. }
  44. func (s *HomeService) QueryHomeReportConfig(moduleCode string) (config *plat.PlatUserConfig, err error) {
  45. svc, err := server.NewUserConfigService(s.Ctx)
  46. config, err = svc.QueryByUserIdAndModelCode(s.GetCxtUserId(), moduleCode)
  47. return
  48. }
  49. func (s *HomeService) QueryHomeNumReportData(param *home.SearchNumReportData) (resp *home.NumReportResponses, err error) {
  50. resp = new(home.NumReportResponses)
  51. numConfig := make([]*home.NumReportResponse, 0)
  52. for _, v := range param.ReportId {
  53. numReport := new(home.NumReportResponse)
  54. numReport.Id = v
  55. value, _ := s.getReportData(v, nil)
  56. numReport.Data = value
  57. numConfig = append(numConfig, numReport)
  58. }
  59. resp.NumReportResponse = numConfig
  60. return
  61. }
  62. func (s *HomeService) QueryHomeDataReportData(param *home.SearchDataReportData) (resp *home.DataReportResponse, err error) {
  63. resp = new(home.DataReportResponse)
  64. resp.Id = param.ReportId
  65. value, err := s.getReportData(param.ReportId, &param.Params)
  66. if err != nil {
  67. return nil, err
  68. }
  69. resp.Data = value
  70. return
  71. }
  72. // 10000-20000之间:个人看板数据 TODO 疑似与 sys_report 表对应?
  73. // 20000-30000之间:报表数据 TODO 疑似与 sys_report 表对应?
  74. func (s *HomeService) getReportData(id int64, params *map[string]interface{}) (interface{}, error) {
  75. switch id {
  76. case 10000, 10001, 10002, 10003, 10004, 10005, 10006, 10007, 10008, 10009, 10010, 10011, 10012, 10013, 10014, 10015, 10016:
  77. // 获取数值指标统计数据
  78. return s.getNumStatisticsData(id, params)
  79. case 20000:
  80. // 报表数据 个人销售金额
  81. return getPersonalContractReportData(s.ContextService.Ctx, "CONTRACT", params)
  82. case 20001:
  83. // 报表数据 个人销售回款
  84. return getPersonalContractReportData(s.ContextService.Ctx, "COLLECTION", params)
  85. case 20002:
  86. // 报表数据 总部销售金额
  87. return getCompanyContractReportData(s.ContextService.Ctx, "CONTRACT", params)
  88. case 20003:
  89. // 报表数据 总部销售回款
  90. return getCompanyContractReportData(s.ContextService.Ctx, "COLLECTION", params)
  91. default:
  92. return nil, nil
  93. }
  94. }
  95. // 获取数值指标统计数据
  96. func (s *HomeService) getNumStatisticsData(id int64, params *map[string]interface{}) (string, error) {
  97. customerDao := custDao.NewCustCustomerDao(s.Tenant)
  98. businessDao := projDao.NewProjBusinessDao(s.Tenant)
  99. busDynamicsDao := projDao.NewProjBusinessDynamicsDao(s.Tenant)
  100. contractDao := contDao.NewCtrContractDao(s.Tenant)
  101. collectionPlanDao := contDao.NewCtrContractCollectionPlanDao(s.Tenant)
  102. taskDao := platDao.NewPlatTaskDao(s.Tenant)
  103. currentTime := gtime.Now()
  104. monthStart := currentTime.StartOfMonth()
  105. monthEnd := currentTime.EndOfMonth()
  106. yearStart := currentTime.StartOfYear()
  107. yearEnd := currentTime.EndOfYear()
  108. switch id {
  109. case 10001: //当前客户数量(维度:总数)
  110. count, err := customerDao.DataScope(s.Ctx, "sales_id").CountColumn("id")
  111. return gconv.String(count), err
  112. case 10002: //当前项目数量(维度:总数)
  113. count, err := businessDao.DataScope(s.Ctx, "sale_id").CountColumn("id")
  114. return gconv.String(count), err
  115. case 10003: //当前合同数量(维度:总数)
  116. count, err := contractDao.DataScope(s.Ctx, "incharge_id").CountColumn("id")
  117. return gconv.String(count), err
  118. case 10004: //当月新增客户数量(维度:月)
  119. count, err := customerDao.DataScope(s.Ctx, "sales_id").WhereGTE(customerDao.C.CreatedTime, monthStart).WhereLTE(customerDao.C.CreatedTime, monthEnd).Count("id")
  120. return gconv.String(count), err
  121. case 10005: //当月新增项目数量(维度:月)
  122. count, err := businessDao.DataScope(s.Ctx, "sale_id").WhereGTE(businessDao.C.CreatedTime, monthStart).WhereLTE(businessDao.C.CreatedTime, monthEnd).Count("id")
  123. return gconv.String(count), err
  124. case 10006: //当月新增合同数量(维度:月)
  125. count, err := contractDao.DataScope(s.Ctx, "incharge_id").WhereGTE(contractDao.C.CreatedTime, monthStart).WhereLTE(contractDao.C.CreatedTime, monthEnd).Count("id")
  126. return gconv.String(count), err
  127. case 10007: //当月签约合同金额(维度:月)
  128. count, err := contractDao.DataScope(s.Ctx, "incharge_id").WhereGTE(contractDao.C.CreatedTime, monthStart).WhereLTE(contractDao.C.CreatedTime, monthEnd).
  129. Sum(contractDao.C.ContractAmount)
  130. return gconv.String(count), err
  131. case 10008: //当月回款金额(维度:月)
  132. count, err := contractDao.DataScope(s.Ctx, "incharge_id").WhereGTE(contractDao.C.CreatedTime, monthStart).WhereLTE(contractDao.C.CreatedTime, monthEnd).
  133. Sum(contractDao.C.CollectedAmount)
  134. return gconv.String(count), err
  135. case 10009: //当年的签约金额(维度:年)
  136. count, err := contractDao.DataScope(s.Ctx, "incharge_id").WhereGTE(contractDao.C.CreatedTime, yearStart).WhereLTE(contractDao.C.CreatedTime, yearEnd).
  137. Sum(contractDao.C.ContractAmount)
  138. return gconv.String(count), err
  139. case 10010: //当年的回款金额(维度:年)
  140. count, err := contractDao.DataScope(s.Ctx, "incharge_id").WhereGTE(contractDao.C.CreatedTime, yearStart).WhereLTE(contractDao.C.CreatedTime, yearEnd).
  141. Sum(contractDao.C.CollectedAmount)
  142. return gconv.String(count), err
  143. case 10011: //我发起的督办
  144. count, err := taskDao.Where(taskDao.C.CreatedBy, s.GetCxtUserId()).CountColumn("id")
  145. return gconv.String(count), err
  146. case 10012: //我处理的督办
  147. count, err := taskDao.As("task").InnerJoin("plat_task_handle", "handle", "handle.task_id=task.id").
  148. Where(fmt.Sprintf("handle.task_status='20' AND handle.handle_user_id=%v", s.GetCxtUserId())).CountColumn("task.id")
  149. return gconv.String(count), err
  150. case 10013: //当月项目转化数量(升级)
  151. count, err := busDynamicsDao.LeftJoin(businessDao.Table, "bus", "bus.id=proj_business_dynamics.bus_id").
  152. WhereGTE("proj_business_dynamics."+busDynamicsDao.C.CreatedTime, monthStart).WhereLTE("proj_business_dynamics."+busDynamicsDao.C.CreatedTime, monthEnd).
  153. Where(busDynamicsDao.C.OpnType, projSrv.OpnDowngradeApproval).
  154. Fields(busDynamicsDao.C.BusId).DataScope(s.Ctx, "sale_id").Distinct().Count()
  155. return gconv.String(count), err
  156. case 10014: //计划回款金额
  157. count, err := collectionPlanDao.LeftJoin(contractDao.Table, "contract", "contract.id=ctr_contract_collection_plan.contract_id").
  158. DataScope(s.Ctx, "incharge_id").Sum(collectionPlanDao.C.PlanAmount)
  159. return gconv.String(count), err
  160. case 10015: //未开票金额
  161. count, err := contractDao.DataScope(s.Ctx, "incharge_id").Sum(contractDao.C.ContractAmount + " - " + contractDao.C.InvoiceAmount)
  162. return gconv.String(count), err
  163. case 10016: //未回款金额
  164. count, err := contractDao.DataScope(s.Ctx, "incharge_id").Sum(contractDao.C.ContractAmount + " - " + contractDao.C.CollectedAmount)
  165. return gconv.String(count), err
  166. }
  167. return "", nil
  168. }