home.go 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  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/frame/g"
  16. "github.com/gogf/gf/os/gtime"
  17. "github.com/gogf/gf/util/gconv"
  18. )
  19. type HomeService struct {
  20. *service.ContextService
  21. }
  22. func NewHomeService(ctx context.Context) (svc *HomeService, err error) {
  23. svc = new(HomeService)
  24. if svc.ContextService, err = svc.Init(ctx); err != nil {
  25. return nil, err
  26. }
  27. return svc, nil
  28. }
  29. func (s *HomeService) SetUpHomeReportConfig(param *home.SetUpHomeConfig) (err error) {
  30. svc, err := server.NewUserConfigService(s.Ctx)
  31. config, _ := svc.QueryByUserIdAndModelCode(s.GetCxtUserId(), param.ModuleCode)
  32. by, _ := json.Marshal(param)
  33. if config != nil {
  34. config.ConfigInfo = gconv.String(by)
  35. err = svc.Edit(config)
  36. } else {
  37. config := new(plat.PlatUserConfig)
  38. config.UserId = s.GetCxtUserId()
  39. config.ModuleCode = param.ModuleCode
  40. config.ConfigInfo = gconv.String(by)
  41. _, err = svc.Create(config)
  42. }
  43. return
  44. }
  45. func (s *HomeService) QueryHomeReportConfig(moduleCode string) (config *plat.PlatUserConfig, err error) {
  46. svc, err := server.NewUserConfigService(s.Ctx)
  47. config, err = svc.QueryByUserIdAndModelCode(s.GetCxtUserId(), moduleCode)
  48. return
  49. }
  50. func (s *HomeService) QueryHomeNumReportData(param *home.SearchNumReportData) (resp *home.NumReportResponses, err error) {
  51. resp = new(home.NumReportResponses)
  52. numConfig := make([]*home.NumReportResponse, 0)
  53. tempMap := map[int64]byte{}
  54. for _, v := range param.ReportId {
  55. l := len(tempMap)
  56. tempMap[v] = 0
  57. if len(tempMap) == l {
  58. continue
  59. }
  60. numReport := new(home.NumReportResponse)
  61. numReport.Id = v
  62. value, _ := s.getReportData(v, nil)
  63. numReport.Data = value
  64. numConfig = append(numConfig, numReport)
  65. }
  66. resp.NumReportResponse = numConfig
  67. return
  68. }
  69. func (s *HomeService) QueryHomeDataReportData(param *home.SearchDataReportData) (resp *home.DataReportResponse, err error) {
  70. resp = new(home.DataReportResponse)
  71. resp.Id = param.ReportId
  72. value, err := s.getReportData(param.ReportId, &param.Params)
  73. if err != nil {
  74. return nil, err
  75. }
  76. resp.Data = value
  77. return
  78. }
  79. // 10000-20000之间:个人看板数据 TODO 疑似与 sys_report 表对应?
  80. // 20000-30000之间:报表数据 TODO 疑似与 sys_report 表对应?
  81. func (s *HomeService) getReportData(id int64, params *map[string]interface{}) (interface{}, error) {
  82. switch id {
  83. case 10000, 10001, 10002, 10003, 10004, 10005, 10006, 10007, 10008, 10009, 10010, 10011, 10012, 10013, 10014, 10015, 10016:
  84. // 获取数值指标统计数据
  85. return s.getNumStatisticsData(id, params)
  86. case 20000:
  87. // 报表数据 个人销售金额
  88. return getPersonalContractReportData(s.ContextService.Ctx, "CONTRACT", params)
  89. case 20001:
  90. // 报表数据 个人销售回款
  91. return getPersonalContractReportData(s.ContextService.Ctx, "COLLECTION", params)
  92. case 20002:
  93. // 报表数据 总部销售金额
  94. return getCompanyContractReportData(s.ContextService.Ctx, "CONTRACT", params)
  95. case 20003:
  96. // 报表数据 总部销售回款
  97. return getCompanyContractReportData(s.ContextService.Ctx, "COLLECTION", params)
  98. default:
  99. return nil, nil
  100. }
  101. }
  102. // 获取数值指标统计数据
  103. func (s *HomeService) getNumStatisticsData(id int64, params *map[string]interface{}) (string, error) {
  104. customerDao := custDao.NewCustCustomerDao(s.Tenant)
  105. businessDao := projDao.NewProjBusinessDao(s.Tenant)
  106. busDynamicsDao := projDao.NewProjBusinessDynamicsDao(s.Tenant)
  107. contractDao := contDao.NewCtrContractDao(s.Tenant)
  108. collectionPlanDao := contDao.NewCtrContractCollectionPlanDao(s.Tenant)
  109. taskDao := platDao.NewPlatTaskDao(s.Tenant)
  110. currentTime := gtime.Now()
  111. monthStart := currentTime.StartOfMonth()
  112. monthEnd := currentTime.EndOfMonth()
  113. yearStart := currentTime.StartOfYear()
  114. yearEnd := currentTime.EndOfYear()
  115. switch id {
  116. case 10001: //当前客户数量(维度:总数)
  117. count, err := customerDao.DataScope(s.Ctx, "sales_id").CountColumn("id")
  118. return gconv.String(count), err
  119. case 10002: //当前项目数量(维度:总数)
  120. count, err := businessDao.DataScope(s.Ctx, "sale_id").CountColumn("id")
  121. return gconv.String(count), err
  122. case 10003: //当前合同数量(维度:总数)
  123. count, err := contractDao.DataScope(s.Ctx, "incharge_id").CountColumn("id")
  124. return gconv.String(count), err
  125. case 10004: //当月新增客户数量(维度:月)
  126. count, err := customerDao.DataScope(s.Ctx, "sales_id").WhereGTE(customerDao.C.CreatedTime, monthStart).WhereLTE(customerDao.C.CreatedTime, monthEnd).CountColumn("id")
  127. return gconv.String(count), err
  128. case 10005: //当月新增项目数量(维度:月)
  129. count, err := businessDao.DataScope(s.Ctx, "sale_id").WhereGTE(businessDao.C.FilingTime, monthStart).WhereLTE(businessDao.C.FilingTime, monthEnd).CountColumn("id")
  130. return gconv.String(count), err
  131. case 10006: //当月新增合同数量(维度:月)
  132. count, err := contractDao.DataScope(s.Ctx, "incharge_id").WhereGTE(contractDao.C.CreatedTime, monthStart).WhereLTE(contractDao.C.CreatedTime, monthEnd).CountColumn("id")
  133. return gconv.String(count), err
  134. case 10007: //当月签约合同金额(维度:月)
  135. count, err := contractDao.DataScope(s.Ctx, "incharge_id").WhereGTE(contractDao.C.CreatedTime, monthStart).WhereLTE(contractDao.C.CreatedTime, monthEnd).
  136. Sum(contractDao.C.ContractAmount)
  137. return gconv.String(count), err
  138. case 10008: //当月回款金额(维度:月)
  139. count, err := contractDao.DataScope(s.Ctx, "incharge_id").WhereGTE(contractDao.C.CreatedTime, monthStart).WhereLTE(contractDao.C.CreatedTime, monthEnd).
  140. Sum(contractDao.C.CollectedAmount)
  141. return gconv.String(count), err
  142. case 10009: //当年的签约金额(维度:年)
  143. count, err := contractDao.DataScope(s.Ctx, "incharge_id").WhereGTE(contractDao.C.CreatedTime, yearStart).WhereLTE(contractDao.C.CreatedTime, yearEnd).
  144. Sum(contractDao.C.ContractAmount)
  145. return gconv.String(count), err
  146. case 10010: //当年的回款金额(维度:年)
  147. count, err := contractDao.DataScope(s.Ctx, "incharge_id").WhereGTE(contractDao.C.CreatedTime, yearStart).WhereLTE(contractDao.C.CreatedTime, yearEnd).
  148. Sum(contractDao.C.CollectedAmount)
  149. return gconv.String(count), err
  150. case 10011: //我发起的督办
  151. count, err := taskDao.Where(taskDao.C.CreatedBy, s.GetCxtUserId()).CountColumn("id")
  152. return gconv.String(count), err
  153. case 10012: //我处理的督办
  154. count, err := taskDao.As("task").InnerJoin("plat_task_handle", "handle", "handle.task_id=task.id").
  155. Where(fmt.Sprintf("handle.task_status='20' AND handle.handle_user_id=%v", s.GetCxtUserId())).Distinct().CountColumn("task.id")
  156. return gconv.String(count), err
  157. case 10013: //当月项目转化数量(升级)
  158. count, err := busDynamicsDao.LeftJoin(businessDao.Table, "bus", "bus.id=proj_business_dynamics.bus_id").
  159. WhereGTE("proj_business_dynamics."+busDynamicsDao.C.CreatedTime, monthStart).WhereLTE("proj_business_dynamics."+busDynamicsDao.C.CreatedTime, monthEnd).
  160. Where(busDynamicsDao.C.OpnType, projSrv.OpnDowngradeApproval).
  161. Fields(busDynamicsDao.C.BusId).DataScope(s.Ctx, "sale_id").Distinct().Count()
  162. return gconv.String(count), err
  163. case 10014: //计划回款金额
  164. count, err := collectionPlanDao.LeftJoin(contractDao.Table, "contract", "contract.id=ctr_contract_collection_plan.contract_id").
  165. DataScope(s.Ctx, "incharge_id").Sum(collectionPlanDao.C.PlanAmount)
  166. return gconv.String(count), err
  167. case 10015: //未开票金额
  168. count, err := contractDao.DataScope(s.Ctx, "incharge_id").Sum(contractDao.C.ContractAmount + " - " + contractDao.C.InvoiceAmount)
  169. return gconv.String(count), err
  170. case 10016: //未回款金额
  171. count, err := contractDao.DataScope(s.Ctx, "incharge_id").Sum(contractDao.C.ContractAmount + " - " + contractDao.C.CollectedAmount)
  172. return gconv.String(count), err
  173. }
  174. return "", nil
  175. }
  176. // QueryWechatHomeNumReportData 获取微信首页个人看板数据
  177. func (s *HomeService) QueryWechatHomeNumReportData(req *home.SearchWechatNumReportDataReq) (resp *home.SearchWechatNumReportDataRes, err error) {
  178. customerDao := custDao.NewCustCustomerDao(s.Tenant).DataScope(s.Ctx, "sales_id")
  179. businessDao := projDao.NewProjBusinessDao(s.Tenant).DataScope(s.Ctx, "sales_id")
  180. taskHandleDao := platDao.NewPlatTaskHandleDao(s.Tenant).M
  181. currentTime := gtime.Now()
  182. monthStart := currentTime.StartOfMonth()
  183. monthEnd := currentTime.EndOfMonth()
  184. weekStart := currentTime.StartOfWeek()
  185. weekEnd := currentTime.EndOfWeek()
  186. if req.ViewInterval == "week" {
  187. customerDao = customerDao.WhereGTE("created_time", weekStart).WhereLTE("created_time", weekEnd)
  188. businessDao = businessDao.WhereGTE("filing_time", weekStart).WhereLTE("filing_time", weekEnd)
  189. taskHandleDao = taskHandleDao.WhereGTE("created_time", weekStart).WhereLTE("created_time", weekEnd)
  190. }
  191. if req.ViewInterval == "month" {
  192. customerDao = customerDao.WhereGTE("created_time", monthStart).WhereLTE("created_time", monthEnd)
  193. businessDao = businessDao.WhereGTE("filing_time", monthStart).WhereLTE("filing_time", monthEnd)
  194. taskHandleDao = taskHandleDao.WhereGTE("created_time", monthStart).WhereLTE("created_time", monthEnd)
  195. }
  196. taskHandleDao = taskHandleDao.Where(platDao.PlatTaskHandle.C.TaskStatus, "10").
  197. Where(fmt.Sprintf("main_user_id=%v OR FIND_IN_SET(%v, owner_user_id)", s.GetCxtUserId(), s.GetCxtUserId()))
  198. // 新增客户数量
  199. newCustomerCount, err := customerDao.CountColumn("id")
  200. if err != nil {
  201. g.Log().Error(err)
  202. }
  203. // 新增项目数量
  204. newBusinessCount, err := businessDao.CountColumn("id")
  205. if err != nil {
  206. g.Log().Error(err)
  207. }
  208. // 未处理督办事项
  209. newTaskCount, err := taskHandleDao.CountColumn("task_id")
  210. if err != nil {
  211. g.Log().Error(err)
  212. }
  213. resp = new(home.SearchWechatNumReportDataRes)
  214. resp.NewCustomer = newCustomerCount
  215. resp.NewBusiness = newBusinessCount
  216. resp.NewTask = newTaskCount
  217. return resp, nil
  218. }