home.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. package home
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "time"
  7. contDao "dashoo.cn/micro/app/dao/contract"
  8. custDao "dashoo.cn/micro/app/dao/cust"
  9. platDao "dashoo.cn/micro/app/dao/plat"
  10. projDao "dashoo.cn/micro/app/dao/proj"
  11. baseDao "dashoo.cn/micro/app/dao/base"
  12. "dashoo.cn/micro/app/model/home"
  13. "dashoo.cn/micro/app/model/plat"
  14. "dashoo.cn/micro/app/service"
  15. server "dashoo.cn/micro/app/service/plat"
  16. projSrv "dashoo.cn/micro/app/service/proj"
  17. "github.com/gogf/gf/frame/g"
  18. "github.com/gogf/gf/os/gtime"
  19. "github.com/gogf/gf/util/gconv"
  20. )
  21. type HomeService struct {
  22. *service.ContextService
  23. }
  24. func NewHomeService(ctx context.Context) (svc *HomeService, err error) {
  25. svc = new(HomeService)
  26. if svc.ContextService, err = svc.Init(ctx); err != nil {
  27. return nil, err
  28. }
  29. return svc, nil
  30. }
  31. func (s *HomeService) SetUpHomeReportConfig(param *home.SetUpHomeConfig) (err error) {
  32. svc, err := server.NewUserConfigService(s.Ctx)
  33. config, _ := svc.QueryByUserIdAndModelCode(s.GetCxtUserId(), param.ModuleCode)
  34. by, _ := json.Marshal(param)
  35. if config != nil {
  36. config.ConfigInfo = gconv.String(by)
  37. err = svc.Edit(config)
  38. } else {
  39. config := new(plat.PlatUserConfig)
  40. config.UserId = s.GetCxtUserId()
  41. config.ModuleCode = param.ModuleCode
  42. config.ConfigInfo = gconv.String(by)
  43. _, err = svc.Create(config)
  44. }
  45. return
  46. }
  47. func (s *HomeService) QueryHomeReportConfig(moduleCode string) (config *plat.PlatUserConfig, err error) {
  48. svc, err := server.NewUserConfigService(s.Ctx)
  49. config, err = svc.QueryByUserIdAndModelCode(s.GetCxtUserId(), moduleCode)
  50. return
  51. }
  52. func (s *HomeService) QueryHomeNumReportData(param *home.SearchNumReportData) (resp *home.NumReportResponses, err error) {
  53. resp = new(home.NumReportResponses)
  54. numConfig := make([]*home.NumReportResponse, 0)
  55. tempMap := map[int64]byte{}
  56. for _, v := range param.ReportId {
  57. l := len(tempMap)
  58. tempMap[v] = 0
  59. if len(tempMap) == l {
  60. continue
  61. }
  62. numReport := new(home.NumReportResponse)
  63. numReport.Id = v
  64. value, _ := s.getReportData(v, nil)
  65. numReport.Data = value
  66. numConfig = append(numConfig, numReport)
  67. }
  68. resp.NumReportResponse = numConfig
  69. return
  70. }
  71. func (s *HomeService) QueryHomeDataReportData(param *home.SearchDataReportData) (resp *home.DataReportResponse, err error) {
  72. resp = new(home.DataReportResponse)
  73. resp.Id = param.ReportId
  74. value, err := s.getReportData(param.ReportId, &param.Params)
  75. if err != nil {
  76. return nil, err
  77. }
  78. resp.Data = value
  79. return
  80. }
  81. // 10000-20000之间:个人看板数据 TODO 疑似与 sys_report 表对应?
  82. // 20000-30000之间:报表数据 TODO 疑似与 sys_report 表对应?
  83. func (s *HomeService) getReportData(id int64, params *map[string]interface{}) (interface{}, error) {
  84. switch id {
  85. case 10000, 10001, 10002, 10003, 10004, 10005, 10006, 10007, 10008, 10009, 10010, 10011, 10012, 10013, 10014, 10015, 10016, 10017, 10018:
  86. // 获取数值指标统计数据
  87. return s.getNumStatisticsData(id, params)
  88. case 20000:
  89. // 报表数据 个人销售金额
  90. return getPersonalContractReportData(s.ContextService.Ctx, "CONTRACT", params)
  91. case 20001:
  92. // 报表数据 个人销售回款
  93. return getPersonalContractReportData(s.ContextService.Ctx, "COLLECTION", params)
  94. case 20002:
  95. // 报表数据 总部销售金额
  96. return getCompanyContractReportData(s.ContextService.Ctx, "CONTRACT", params)
  97. case 20003:
  98. // 报表数据 总部销售回款
  99. return getCompanyContractReportData(s.ContextService.Ctx, "COLLECTION", params)
  100. case 20006:
  101. // 报表数据 季度销售指标
  102. return getQuarterGoalReportData(s.ContextService.Ctx, "10", params)
  103. case 20007:
  104. // 报表数据 季度回款指标
  105. return getQuarterGoalReportData(s.ContextService.Ctx, "20", params)
  106. case 20008:
  107. //报表数据 现场打卡频次
  108. return getClockfrequency(s.ContextService.Ctx, "20", params)
  109. case 20009:
  110. //表格数据 跟进记录频次
  111. return getFollowUpRecord(s.ContextService.Ctx, "20", params)
  112. case 20010:
  113. // 报表数据 三大产品线,新增以及转化项目(C转B、B转A、A转签约、C转A、C转签约、B转签约、储备转A/B/C/签约)数量, 按周和月
  114. return s.getNewAndConvertBusiness([]string{"10", "20", "30"}, params)
  115. case 20011:
  116. // 报表数据 三大产品线,AB类项目出货金额
  117. return s.getShipmentAmount([]string{"10", "20", "30"}, []string{projSrv.StatusA, projSrv.StatusB})
  118. case 20012:
  119. // 报表数据 三大产品线,当月和累计的签约、回款额
  120. return s.getProductLineSignedAndBackAmount([]string{"10", "20", "30"})
  121. default:
  122. return nil, nil
  123. }
  124. }
  125. // 获取数值指标统计数据
  126. func (s *HomeService) getNumStatisticsData(id int64, params *map[string]interface{}) (string, error) {
  127. customerDao := custDao.NewCustCustomerDao(s.Tenant)
  128. businessDao := projDao.NewProjBusinessDao(s.Tenant)
  129. busDynamicsDao := projDao.NewProjBusinessDynamicsDao(s.Tenant)
  130. contractDao := contDao.NewCtrContractDao(s.Tenant)
  131. distDao := baseDao.NewBaseDistributorDao(s.Tenant)
  132. taskDao := platDao.NewPlatTaskDao(s.Tenant)
  133. currentTime := gtime.Now()
  134. monthStart := currentTime.StartOfMonth()
  135. monthEnd := currentTime.EndOfMonth()
  136. yearStart := currentTime.StartOfYear()
  137. yearEnd := currentTime.EndOfYear()
  138. switch id {
  139. case 10001: //当前客户数量(维度:总数)
  140. count, err := customerDao.DataScope(s.Ctx, "sales_id").CountColumn("id")
  141. return gconv.String(count), err
  142. case 10002: //当前项目数量(维度:总数)
  143. count, err := businessDao.DataScope(s.Ctx, "sale_id").CountColumn("id")
  144. return gconv.String(count), err
  145. case 10003: //当前合同数量(维度:总数)
  146. count, err := contractDao.DataScope(s.Ctx, "incharge_id").CountColumn("id")
  147. return gconv.String(count), err
  148. case 10004: //当月新增客户数量(维度:月)
  149. count, err := customerDao.DataScope(s.Ctx, "sales_id").WhereGTE(customerDao.C.CreatedTime, monthStart).WhereLTE(customerDao.C.CreatedTime, monthEnd).CountColumn("id")
  150. return gconv.String(count), err
  151. case 10005: //当月新增项目数量(维度:月)
  152. count, err := businessDao.DataScope(s.Ctx, "sale_id").WhereGTE(businessDao.C.FilingTime, monthStart).WhereLTE(businessDao.C.FilingTime, monthEnd).CountColumn("id")
  153. return gconv.String(count), err
  154. case 10006: //当月新增合同数量(维度:月)
  155. count, err := contractDao.DataScope(s.Ctx, "incharge_id").WhereGTE(contractDao.C.ContractStartTime, monthStart).WhereLTE(contractDao.C.CreatedTime, monthEnd).CountColumn("id")
  156. return gconv.String(count), err
  157. case 10007: //当月签约合同金额(维度:月)
  158. count, err := contractDao.DataScope(s.Ctx, "incharge_id").WhereGTE(contractDao.C.ContractStartTime, monthStart).WhereLTE(contractDao.C.CreatedTime, monthEnd).
  159. Sum(contractDao.C.ContractAmount)
  160. return gconv.String(count), err
  161. case 10008: //当月回款金额(维度:月)
  162. count, err := contractDao.DataScope(s.Ctx, "incharge_id").WhereGTE(contractDao.C.ContractStartTime, monthStart).WhereLTE(contractDao.C.CreatedTime, monthEnd).
  163. Sum(contractDao.C.CollectedAmount)
  164. return gconv.String(count), err
  165. case 10009: //当年的签约金额(维度:年)
  166. count, err := contractDao.DataScope(s.Ctx, "incharge_id").WhereGTE(contractDao.C.ContractStartTime, yearStart).WhereLTE(contractDao.C.CreatedTime, yearEnd).
  167. Sum(contractDao.C.ContractAmount)
  168. return gconv.String(count), err
  169. case 10010: //当年的回款金额(维度:年)
  170. count, err := contractDao.DataScope(s.Ctx, "incharge_id").WhereGTE(contractDao.C.ContractStartTime, yearStart).WhereLTE(contractDao.C.CreatedTime, yearEnd).
  171. Sum(contractDao.C.CollectedAmount)
  172. return gconv.String(count), err
  173. case 10011: //我发起的督办
  174. count, err := taskDao.Where(taskDao.C.CreatedBy, s.GetCxtUserId()).CountColumn("id")
  175. return gconv.String(count), err
  176. case 10012: //我处理的督办
  177. count, err := taskDao.As("task").InnerJoin("plat_task_handle", "handle", "handle.task_id=task.id").
  178. Where(fmt.Sprintf("handle.task_status='20' AND handle.handle_user_id=%v", s.GetCxtUserId())).Distinct().CountColumn("task.id")
  179. return gconv.String(count), err
  180. case 10013: //当月项目转化数量(升级)
  181. count, err := busDynamicsDao.As("dynamics").LeftJoin(businessDao.Table, "bus", "bus.id=dynamics.bus_id").
  182. WhereGTE("dynamics."+busDynamicsDao.C.CreatedTime, monthStart).WhereLTE("dynamics."+busDynamicsDao.C.CreatedTime, monthEnd).
  183. Where(busDynamicsDao.C.OpnType, projSrv.OpnUpgradeApproval).
  184. Fields(busDynamicsDao.C.BusId).DataScope(s.Ctx, "sale_id", "bus").Distinct().Count()
  185. return gconv.String(count), err
  186. case 10014: //签约未回款总金额,数据=全部历史合同中未回款金额,过程中有实际回款时数据实时扣减
  187. count, err := contractDao.DataScope(s.Ctx, "incharge_id").Sum(contractDao.C.ContractAmount + " - " + contractDao.C.CollectedAmount)
  188. return gconv.String(count), err
  189. case 10015: //当年未开票金额,数据=2023年未开票金额
  190. count, err := contractDao.DataScope(s.Ctx, "incharge_id").
  191. Where("year(contract_sign_time) = ?", time.Now().Year()).
  192. Sum(contractDao.C.ContractAmount + " - " + contractDao.C.InvoiceAmount)
  193. return gconv.String(count), err
  194. case 10016: //当年签约未回款金额,数据=2023年合同中未回款金额,过程中有实际回款时数据
  195. count, err := contractDao.DataScope(s.Ctx, "incharge_id").
  196. Where("year(contract_sign_time) = ?", time.Now().Year()).
  197. Sum(contractDao.C.ContractAmount + " - " + contractDao.C.CollectedAmount)
  198. return gconv.String(count), err
  199. case 10017: //当月新增经销商数量:统计自然月当月新创建的经销商数量。
  200. count, err := distDao.Where("dist_type = '10'").Where("created_time >= ?",monthStart).Where("created_time <= ?",monthEnd).Count()
  201. return gconv.String(count), err
  202. case 10018: //进行中的督办:统计正在进行的督办数量。
  203. count, err := taskDao.Where("task_status = '20'").Count()
  204. return gconv.String(count), err
  205. }
  206. return "", nil
  207. }
  208. // QueryWechatHomeNumReportData 获取微信首页个人看板数据
  209. func (s *HomeService) QueryWechatHomeNumReportData(req *home.SearchWechatNumReportDataReq) (resp *home.SearchWechatNumReportDataRes, err error) {
  210. customerDao := custDao.NewCustCustomerDao(s.Tenant).DataScope(s.Ctx, "sales_id")
  211. businessDao := projDao.NewProjBusinessDao(s.Tenant).DataScope(s.Ctx, "sales_id")
  212. taskHandleDao := platDao.NewPlatTaskHandleDao(s.Tenant).M
  213. currentTime := gtime.Now()
  214. monthStart := currentTime.StartOfMonth()
  215. monthEnd := currentTime.EndOfMonth()
  216. weekStart := currentTime.StartOfWeek()
  217. weekEnd := currentTime.EndOfWeek()
  218. if req.ViewInterval == "week" {
  219. customerDao = customerDao.WhereGTE("created_time", weekStart).WhereLTE("created_time", weekEnd)
  220. businessDao = businessDao.WhereGTE("filing_time", weekStart).WhereLTE("filing_time", weekEnd)
  221. taskHandleDao = taskHandleDao.WhereGTE("created_time", weekStart).WhereLTE("created_time", weekEnd)
  222. }
  223. if req.ViewInterval == "month" {
  224. customerDao = customerDao.WhereGTE("created_time", monthStart).WhereLTE("created_time", monthEnd)
  225. businessDao = businessDao.WhereGTE("filing_time", monthStart).WhereLTE("filing_time", monthEnd)
  226. taskHandleDao = taskHandleDao.WhereGTE("created_time", monthStart).WhereLTE("created_time", monthEnd)
  227. }
  228. taskHandleDao = taskHandleDao.Where(platDao.PlatTaskHandle.C.TaskStatus, "10").
  229. Where(fmt.Sprintf("main_user_id=%v OR FIND_IN_SET(%v, owner_user_id)", s.GetCxtUserId(), s.GetCxtUserId()))
  230. // 新增客户数量
  231. newCustomerCount, err := customerDao.CountColumn("id")
  232. if err != nil {
  233. g.Log().Error(err)
  234. }
  235. // 新增项目数量
  236. newBusinessCount, err := businessDao.CountColumn("id")
  237. if err != nil {
  238. g.Log().Error(err)
  239. }
  240. // 未处理督办事项
  241. newTaskCount, err := taskHandleDao.CountColumn("task_id")
  242. if err != nil {
  243. g.Log().Error(err)
  244. }
  245. resp = new(home.SearchWechatNumReportDataRes)
  246. resp.NewCustomer = newCustomerCount
  247. resp.NewBusiness = newBusinessCount
  248. resp.NewTask = newTaskCount
  249. return resp, nil
  250. }