rai_data_summary.go 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231
  1. package statistic
  2. import (
  3. "fmt"
  4. "github.com/rdlucklib/rdluck_tools/paging"
  5. "hongze/hz_crm_api/controllers"
  6. "hongze/hz_crm_api/models"
  7. "hongze/hz_crm_api/models/company"
  8. "hongze/hz_crm_api/models/fms"
  9. "hongze/hz_crm_api/models/statistic_report"
  10. "hongze/hz_crm_api/models/system"
  11. "hongze/hz_crm_api/services"
  12. cygxService "hongze/hz_crm_api/services/cygx"
  13. "hongze/hz_crm_api/utils"
  14. "strconv"
  15. "strings"
  16. "time"
  17. )
  18. // 权益数据汇总
  19. // StatisticRaiDataSummaryController 权益数据汇总基类
  20. type StatisticRaiDataSummaryController struct {
  21. controllers.BaseAuthController
  22. }
  23. // MergeCompanyList
  24. // @Title 权益数据汇总
  25. // @Description 权益数据汇总统计列表接口
  26. // @Param AdminId query string true "开拓组销售id,多个用英文逗号隔开,空字符串为全部"
  27. // @Param ServiceAdminId query string true "服务组销售id,多个用英文逗号隔开,空字符串为全部"
  28. // @Param StartYear query int false "开始日期(年份)"
  29. // @Param EndYear query int false "结束日期(年份)"
  30. // @Param DataType query string false "报表类型,枚举值:`季度`,`年度`,`半年度`"
  31. // @Param DevelopButton query int false "开拓组开关,枚举值:1:开启,0:关闭 ,默认关闭"
  32. // @Param ServerButton query int false "服务组开关,枚举值:1:开启,0:关闭 ,默认关闭"
  33. // @Param ContractButtonType query string false "开关类型,:`新签`,`续约`,`收入` 多个用英文逗号隔开, "
  34. // @Param IsExport query bool false "是否导出excel,默认是false"
  35. // @Success 200 {object} statistic_report.RaiDataSummaryListResp
  36. // @router /rai_data_summary/list [get]
  37. func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
  38. br := new(models.BaseResponse).Init()
  39. defer func() {
  40. this.Data["json"] = br
  41. this.ServeJSON()
  42. }()
  43. sysUser := this.SysUser
  44. if sysUser == nil {
  45. br.Msg = "请登录"
  46. br.ErrMsg = "请登录,SysUser Is Empty"
  47. br.Ret = 408
  48. return
  49. }
  50. //adminId := this.GetString("AdminId")
  51. dataType := this.GetString("DataType")
  52. adminId := this.GetString("AdminId")
  53. serviceAdminId := this.GetString("ServiceAdminId")
  54. startYear, _ := this.GetInt("StartYear")
  55. endYear, _ := this.GetInt("EndYear")
  56. developButton, _ := this.GetInt("DevelopButton")
  57. serverButton, _ := this.GetInt("ServerButton")
  58. dataTypeArr := []string{}
  59. //var dateIntervalArr []statistic_report.DateInterval //时间区间
  60. if dataType == "季度" {
  61. dataTypeArr = []string{"Q1", "Q2", "Q3", "Q4"}
  62. } else if dataType == "半年度" {
  63. dataTypeArr = []string{"H1", "H2"}
  64. } else {
  65. dataTypeArr = []string{""}
  66. }
  67. condition := " AND role_type_code IN ('rai_seller','rai_group') AND enabled = 1 AND rai_enabled = 1 "
  68. var pars []interface{}
  69. if adminId != "" {
  70. serviceAdminId = ""
  71. condition += " AND admin_id IN (" + adminId + ") "
  72. }
  73. if serviceAdminId != "" {
  74. condition += " AND admin_id IN (" + serviceAdminId + ") "
  75. }
  76. if developButton == 1 && serverButton == 0 && adminId == "" && serviceAdminId == "" { //开拓组筛选条件
  77. condition += " AND real_name NOT LIKE '%6%' "
  78. }
  79. if developButton == 0 && serverButton == 1 && adminId == "" && serviceAdminId == "" { //服务组筛选条件
  80. condition += " AND real_name LIKE '%6%' "
  81. }
  82. sellerList, err := system.GetSysUserItemsOrderByCreated(condition, pars)
  83. if err != nil {
  84. br.Msg = "获取管理账号失败"
  85. br.ErrMsg = "获取管理账号失败,Err:" + err.Error()
  86. return
  87. }
  88. var sellerDevelop []*system.AdminItem // 开拓组销售
  89. var sellerService []*system.AdminItem // 服务组销售
  90. var sellerDevelopIds = make(map[int]bool) // 开拓组销售的map
  91. for _, v := range sellerList {
  92. if strings.Contains(v.RealName, "6") {
  93. sellerService = append(sellerService, v)
  94. } else {
  95. sellerDevelop = append(sellerDevelop, v)
  96. sellerDevelopIds[v.AdminId] = true
  97. }
  98. }
  99. //拼接起始时间查询
  100. startDate := fmt.Sprintf("%d-01-01", startYear)
  101. endDate := fmt.Sprintf("%d-12-31", endYear)
  102. var conditionRai string
  103. var parsRai []interface{}
  104. conditionRai = " AND a.product_id = 2 AND a.status = 1 AND a.start_date >= ? AND a.start_date <= ? "
  105. parsRai = append(parsRai, startDate, endDate)
  106. listRaiData, err := statistic_report.GetRaiDataSummaryList(conditionRai, parsRai)
  107. if err != nil {
  108. br.Msg = "获取数据信息失败"
  109. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  110. return
  111. }
  112. var conditionConfirm string
  113. var parsConfirm []interface{}
  114. mapNoRenewedcompanyContractIds := make(map[int]bool) //已经确定未续约的合同ID
  115. conditionConfirm = " AND company_ascribe_id != 9 "
  116. companyConfirmList, err := company.GetCompanyContractNoRenewedAscribeList(conditionConfirm, parsConfirm, 0, 0)
  117. if err != nil && err.Error() != utils.ErrNoRow() {
  118. br.Msg = "获取失败"
  119. br.ErrMsg = "获取失败,GetCompanyNoRenewedAscribeList Err:" + err.Error()
  120. return
  121. }
  122. for _, v := range companyConfirmList {
  123. mapNoRenewedcompanyContractIds[v.CompanyContractId] = true
  124. }
  125. mapAddTrialNum := make(map[string]float64) // 新增试用-(数据)
  126. mapNewContractMoney := make(map[string]float64) // 新签合同(金额)
  127. mapNewContractNum := make(map[string]int) // 新签合同(数量)
  128. mapExpiredContractMoney := make(map[string]float64) // 到期合同(金额)
  129. mapExpiredContractNum := make(map[string]int) // 到期合同(数量)
  130. mapRenewedContractMoney := make(map[string]float64) // 续约合同(金额)
  131. mapRenewedContractNum := make(map[string]int) // 续约合同(数量)
  132. confirmedNoRenewalContractMoney := make(map[string]float64) // 确认不续约合同(金额)
  133. confirmedNoRenewalContractNum := make(map[string]int) // 确认不续约合同(数量)
  134. mapSignedClientNum := make(map[string]int) // 签约客户(数量)
  135. mapSignedClientMoney := make(map[string]float64) // 签约客户(金额)
  136. mapInvoiceAmountMoney := make(map[string]float64) // 财务系统开票金额(金额)
  137. mapPaymentAmountMoney := make(map[string]float64) // 财务系统到款金额(金额)
  138. mapNewCustomerInvoicingMoney := make(map[string]float64) // 财务系统新客开票金额(金额)
  139. mapNewCustomerPaymentsReceivedMoney := make(map[string]float64) // 财务系统新客到款金额(金额)
  140. var keyMap string
  141. var keyMapTtoal string
  142. var keyMapTtoalServer string
  143. for _, v := range listRaiData {
  144. startDateTime := utils.StrDateToDate(v.StartDate)
  145. monthNum := startDateTime.Month()
  146. yearStr := strconv.Itoa(startDateTime.Year())
  147. if dataType == "季度" {
  148. if monthNum < 4 {
  149. yearStr += "Q1"
  150. } else if monthNum > 3 && monthNum < 7 {
  151. yearStr += "Q2"
  152. } else if monthNum > 6 && monthNum < 10 {
  153. yearStr += "Q3"
  154. } else if monthNum > 9 {
  155. yearStr += "Q4"
  156. }
  157. } else if dataType == "半年度" {
  158. if monthNum < 7 {
  159. yearStr += "H1"
  160. } else {
  161. yearStr += "H2"
  162. }
  163. }
  164. keyMap = fmt.Sprint(yearStr, "_", v.SellerIdLast)
  165. if sellerDevelopIds[v.SellerIdLast] == true {
  166. keyMapTtoal = fmt.Sprint(yearStr, "_Develop")
  167. } else {
  168. keyMapTtoal = fmt.Sprint(yearStr, "_Service")
  169. }
  170. if v.RaiContractType == "新签合同" {
  171. mapNewContractMoney[keyMap] += v.Money
  172. mapNewContractNum[keyMap]++
  173. mapNewContractMoney[keyMapTtoal] += v.Money
  174. mapNewContractNum[keyMapTtoal]++
  175. } else if v.RaiContractType == "续约合同" {
  176. mapRenewedContractMoney[keyMap] += v.Money
  177. mapRenewedContractNum[keyMap]++
  178. mapRenewedContractMoney[keyMapTtoal] += v.Money
  179. mapRenewedContractNum[keyMapTtoal]++
  180. }
  181. if startDateTime.Before(time.Now().AddDate(0, 0, -1)) { //到期合同数据
  182. mapExpiredContractMoney[keyMap] += v.Money
  183. mapExpiredContractNum[keyMap]++
  184. mapExpiredContractMoney[keyMapTtoal] += v.Money
  185. mapExpiredContractNum[keyMapTtoal]++
  186. }
  187. if mapNoRenewedcompanyContractIds[v.CompanyContractId] { // 确认不续约合同
  188. confirmedNoRenewalContractMoney[keyMap] += v.Money
  189. confirmedNoRenewalContractNum[keyMap]++
  190. confirmedNoRenewalContractMoney[keyMapTtoal] += v.Money
  191. confirmedNoRenewalContractNum[keyMapTtoal]++
  192. }
  193. mapSignedClientMoney[keyMap] += v.Money
  194. mapSignedClientNum[keyMap]++
  195. mapSignedClientMoney[keyMapTtoal] += v.Money
  196. mapSignedClientNum[keyMapTtoal]++
  197. }
  198. listFmsData, err := fms.GetContractRegisterListByStartDate(startDate, endDate)
  199. if err != nil {
  200. br.Msg = "获取数据信息失败"
  201. br.ErrMsg = "获取财务系统数据信息失败,Err:" + err.Error()
  202. return
  203. }
  204. for _, v := range listFmsData {
  205. startDateTime := v.StartDate
  206. monthNum := startDateTime.Month()
  207. yearStr := strconv.Itoa(startDateTime.Year())
  208. if dataType == "季度" {
  209. if monthNum < 4 {
  210. yearStr += "Q1"
  211. } else if monthNum > 3 && monthNum < 7 {
  212. yearStr += "Q2"
  213. } else if monthNum > 6 && monthNum < 10 {
  214. yearStr += "Q3"
  215. } else if monthNum > 9 {
  216. yearStr += "Q4"
  217. }
  218. } else if dataType == "半年度" {
  219. if monthNum < 7 {
  220. yearStr += "H1"
  221. } else {
  222. yearStr += "H2"
  223. }
  224. }
  225. keyMap = fmt.Sprint(yearStr, "_", v.RaiSellerId)
  226. if sellerDevelopIds[v.RaiSellerId] == true {
  227. keyMapTtoal = fmt.Sprint(yearStr, "_Develop")
  228. } else {
  229. keyMapTtoal = fmt.Sprint(yearStr, "_Service")
  230. }
  231. mapInvoiceAmountMoney[keyMap] += v.InvoicedAmount
  232. mapPaymentAmountMoney[keyMap] += v.PaymentAmount
  233. mapInvoiceAmountMoney[keyMapTtoal] += v.InvoicedAmount
  234. mapPaymentAmountMoney[keyMapTtoal] += v.PaymentAmount
  235. if v.ContractType == 1 {
  236. mapNewCustomerInvoicingMoney[keyMapTtoal] += v.InvoicedAmount
  237. mapNewCustomerPaymentsReceivedMoney[keyMapTtoal] += v.PaymentAmount
  238. }
  239. }
  240. conditionTry := ` AND a.create_time >= ? AND a.create_time <= ? AND a.operation in ( "add","receive","apply_receive" ) AND a.sys_user_id IN ( SELECT admin_id FROM admin WHERE role_type_code IN ( 'rai_seller', 'rai_group' , 'rai_admin') ) `
  241. var parsTry []interface{}
  242. parsTry = append(parsTry, startDate, endDate)
  243. //列表页数据
  244. tryList, err := models.GetIncrementalCompanyListByOperationRecordRai(conditionTry, parsTry, 0, 9999)
  245. if err != nil {
  246. br.Msg = "获取失败"
  247. br.ErrMsg = "获取失败,Err:" + err.Error()
  248. return
  249. }
  250. for _, v := range tryList {
  251. startDateTime := utils.StrTimeToTime(v.CreateTime)
  252. monthNum := startDateTime.Month()
  253. yearStr := strconv.Itoa(startDateTime.Year())
  254. if dataType == "季度" {
  255. if monthNum < 4 {
  256. yearStr += "Q1"
  257. } else if monthNum > 3 && monthNum < 7 {
  258. yearStr += "Q2"
  259. } else if monthNum > 6 && monthNum < 10 {
  260. yearStr += "Q3"
  261. } else if monthNum > 9 {
  262. yearStr += "Q4"
  263. }
  264. } else if dataType == "半年度" {
  265. if monthNum < 7 {
  266. yearStr += "H1"
  267. } else {
  268. yearStr += "H2"
  269. }
  270. }
  271. keyMap = fmt.Sprint(yearStr, "_", v.SysUserId)
  272. mapAddTrialNum[keyMap]++
  273. //var keyMapTtoal string
  274. sysUserId, _ := strconv.Atoi(v.SysUserId)
  275. if sellerDevelopIds[sysUserId] == true {
  276. keyMapTtoal = fmt.Sprint(yearStr, "_Develop")
  277. } else {
  278. keyMapTtoal = fmt.Sprint(yearStr, "_Service")
  279. }
  280. mapAddTrialNum[keyMapTtoal]++
  281. }
  282. resp := new(statistic_report.RaiDataSummaryListResp)
  283. var items []*statistic_report.RaiDataSummaryResp
  284. for i := startYear; i <= endYear; i++ {
  285. //if len(dataTypeArr) > 0 {
  286. for _, Dv := range dataTypeArr {
  287. item := new(statistic_report.RaiDataSummaryResp)
  288. item.DataType = fmt.Sprint(i, Dv)
  289. keyMapTtoal = fmt.Sprint(item.DataType, "_Develop")
  290. keyMapTtoalServer = fmt.Sprint(item.DataType, "_Server")
  291. for _, vS := range sellerDevelop {
  292. keyMap = fmt.Sprint(item.DataType, "_", vS.AdminId)
  293. sellerItem := new(statistic_report.RaiDataSummaryDetail)
  294. sellerItem.SellerId = vS.AdminId
  295. sellerItem.SellerName = vS.RealName
  296. sellerItem.AddTrialCount = fmt.Sprint(mapAddTrialNum[keyMap])
  297. sellerItem.NewContractData = fmt.Sprint(utils.SubFloatToString(mapNewContractMoney[keyMap], 2), " / ", mapNewContractNum[keyMap]) // 新签合同(金额/数量)-(数据)
  298. sellerItem.ExpiredContractData = fmt.Sprint(utils.SubFloatToString(mapExpiredContractMoney[keyMap], 2), " / ", mapExpiredContractNum[keyMap]) //"到期合同(金额/数量)-(数据)"
  299. sellerItem.RenewedContractData = fmt.Sprint(utils.SubFloatToString(mapRenewedContractMoney[keyMap], 2), " / ", mapRenewedContractNum[keyMap]) // "续约合同(金额/数量)-(数据)"
  300. var renewalRateMoey string
  301. var renewalRateNum string
  302. if mapRenewedContractMoney[keyMap] == 0 || mapExpiredContractMoney[keyMap] == 0 {
  303. renewalRateMoey = "0%"
  304. } else {
  305. renewalRateMoey = utils.SubFloatToString(mapRenewedContractMoney[keyMap]/mapExpiredContractMoney[keyMap]*100, 2) + "%"
  306. }
  307. if mapRenewedContractNum[keyMap] == 0 || mapExpiredContractNum[keyMap] == 0 {
  308. renewalRateNum = "0%"
  309. } else {
  310. renewalRateNum = utils.SubFloatToString(float64(mapRenewedContractNum[keyMap])/float64(mapExpiredContractNum[keyMap])*100, 2) + "%"
  311. }
  312. sellerItem.RenewalRateData = fmt.Sprint(renewalRateMoey, " / ", renewalRateNum) //"续约率(金额/数量)-(数据)"
  313. sellerItem.ConfirmedNoRenewalContractData = fmt.Sprint(utils.SubFloatToString(confirmedNoRenewalContractMoney[keyMap], 2), " / ", confirmedNoRenewalContractNum[keyMap]) //"确认不续约合同(金额/数量)-(数据)"
  314. var confirmNonRenewalRateMoey string
  315. var confirmNonRenewalRateNum string
  316. if confirmedNoRenewalContractMoney[keyMap] == 0 || mapExpiredContractMoney[keyMap] == 0 {
  317. confirmNonRenewalRateMoey = "0%"
  318. } else {
  319. confirmNonRenewalRateMoey = utils.SubFloatToString(confirmedNoRenewalContractMoney[keyMap]/mapExpiredContractMoney[keyMap]*100, 2) + "%"
  320. }
  321. if confirmedNoRenewalContractNum[keyMap] == 0 || mapExpiredContractNum[keyMap] == 0 {
  322. confirmNonRenewalRateNum = "0%"
  323. } else {
  324. confirmNonRenewalRateNum = utils.SubFloatToString(float64(confirmedNoRenewalContractNum[keyMap])/float64(mapExpiredContractNum[keyMap])*100, 2) + "%"
  325. }
  326. sellerItem.ConfirmNonRenewalRateData = fmt.Sprint(confirmNonRenewalRateMoey, " / ", confirmNonRenewalRateNum) //确认不续约率(金额/数量)-(数据)"
  327. sellerItem.SignedClientCount = fmt.Sprint(mapSignedClientNum[keyMap]) // 签约客户数量
  328. if mapSignedClientNum[keyMap] == 0 || mapSignedClientMoney[keyMap] == 0 {
  329. sellerItem.AverageRevenueCount = "0"
  330. } else {
  331. sellerItem.AverageRevenueCount = utils.SubFloatToString(mapSignedClientMoney[keyMap]/float64(mapSignedClientNum[keyMap]), 2) //客单价
  332. }
  333. sellerItem.InvoiceAmountCount = utils.SubFloatToString(mapInvoiceAmountMoney[keyMap], 2) //"开票金额-(数据)"
  334. sellerItem.PaymentReceivedCount = utils.SubFloatToString(mapPaymentAmountMoney[keyMap], 2) //"开票金额-(数据)"
  335. if mapInvoiceAmountMoney[keyMap] == 0 || mapPaymentAmountMoney[keyMap] == 0 {
  336. sellerItem.UnpaidRatioCount = "0%"
  337. } else {
  338. sellerItem.UnpaidRatioCount = utils.SubFloatToString((mapInvoiceAmountMoney[keyMap]-mapPaymentAmountMoney[keyMap])/mapInvoiceAmountMoney[keyMap]*100, 2) + "%" //"未到款比例-(数据)"
  339. }
  340. sellerItem.NewCustomerInvoicingCount = utils.SubFloatToString(mapNewCustomerInvoicingMoney[keyMap], 2) // "新客开票-(数据)"
  341. sellerItem.NewCustomerPaymentsReceivedCount = utils.SubFloatToString(mapNewCustomerPaymentsReceivedMoney[keyMap], 2) // "新客到款-(数据)"
  342. item.DataList = append(item.DataList, sellerItem)
  343. }
  344. if len(sellerDevelop) > 0 {
  345. sellerItem := new(statistic_report.RaiDataSummaryDetail)
  346. sellerItem.SellerName = "开拓组合计"
  347. sellerItem.AddTrialCount = fmt.Sprint(mapAddTrialNum[keyMapTtoal])
  348. sellerItem.NewContractData = fmt.Sprint(utils.SubFloatToString(mapNewContractMoney[keyMapTtoal], 2), " / ", mapNewContractNum[keyMapTtoal]) // 新签合同(金额/数量)-(数据)
  349. sellerItem.ExpiredContractData = fmt.Sprint(utils.SubFloatToString(mapExpiredContractMoney[keyMapTtoal], 2), " / ", mapExpiredContractNum[keyMapTtoal]) //"到期合同(金额/数量)-(数据)"
  350. sellerItem.RenewedContractData = fmt.Sprint(utils.SubFloatToString(mapRenewedContractMoney[keyMapTtoal], 2), " / ", mapRenewedContractNum[keyMapTtoal]) // "续约合同(金额/数量)-(数据)"
  351. var renewalRateMoey string
  352. var renewalRateNum string
  353. if mapRenewedContractMoney[keyMapTtoal] == 0 || mapExpiredContractMoney[keyMapTtoal] == 0 {
  354. renewalRateMoey = "0%"
  355. } else {
  356. renewalRateMoey = utils.SubFloatToString(mapRenewedContractMoney[keyMapTtoal]/mapExpiredContractMoney[keyMapTtoal]*100, 2) + "%"
  357. }
  358. if mapRenewedContractNum[keyMapTtoal] == 0 || mapExpiredContractNum[keyMapTtoal] == 0 {
  359. renewalRateNum = "0%"
  360. } else {
  361. renewalRateNum = utils.SubFloatToString(float64(mapRenewedContractNum[keyMapTtoal])/float64(mapExpiredContractNum[keyMapTtoal])*100, 2) + "%"
  362. }
  363. sellerItem.RenewalRateData = fmt.Sprint(renewalRateMoey, " / ", renewalRateNum) //"续约率(金额/数量)-(数据)"
  364. sellerItem.ConfirmedNoRenewalContractData = fmt.Sprint(utils.SubFloatToString(confirmedNoRenewalContractMoney[keyMapTtoal], 2), " / ", confirmedNoRenewalContractNum[keyMapTtoal]) //"确认不续约合同(金额/数量)-(数据)"
  365. var confirmNonRenewalRateMoey string
  366. var confirmNonRenewalRateNum string
  367. if confirmedNoRenewalContractMoney[keyMapTtoal] == 0 || mapExpiredContractMoney[keyMapTtoal] == 0 {
  368. confirmNonRenewalRateMoey = "0%"
  369. } else {
  370. confirmNonRenewalRateMoey = utils.SubFloatToString(confirmedNoRenewalContractMoney[keyMapTtoal]/mapExpiredContractMoney[keyMapTtoal]*100, 2) + "%"
  371. }
  372. if confirmedNoRenewalContractNum[keyMapTtoal] == 0 || mapExpiredContractNum[keyMapTtoal] == 0 {
  373. confirmNonRenewalRateNum = "0%"
  374. } else {
  375. confirmNonRenewalRateNum = utils.SubFloatToString(float64(confirmedNoRenewalContractNum[keyMapTtoal])/float64(mapExpiredContractNum[keyMapTtoal])*100, 2) + "%"
  376. }
  377. sellerItem.ConfirmNonRenewalRateData = fmt.Sprint(confirmNonRenewalRateMoey, " / ", confirmNonRenewalRateNum) //确认不续约率(金额/数量)-(数据)"
  378. sellerItem.SignedClientCount = fmt.Sprint(mapSignedClientNum[keyMapTtoal]) // 签约客户数量
  379. if mapSignedClientNum[keyMapTtoal] == 0 || mapSignedClientMoney[keyMapTtoal] == 0 {
  380. sellerItem.AverageRevenueCount = "0"
  381. } else {
  382. sellerItem.AverageRevenueCount = utils.SubFloatToString(mapSignedClientMoney[keyMapTtoal]/float64(mapSignedClientNum[keyMapTtoal]), 2) //客单价
  383. }
  384. sellerItem.InvoiceAmountCount = utils.SubFloatToString(mapInvoiceAmountMoney[keyMapTtoal], 2) //"开票金额-(数据)"
  385. sellerItem.PaymentReceivedCount = utils.SubFloatToString(mapPaymentAmountMoney[keyMapTtoal], 2) //"开票金额-(数据)"
  386. if mapInvoiceAmountMoney[keyMapTtoal] == 0 || mapPaymentAmountMoney[keyMapTtoal] == 0 {
  387. sellerItem.UnpaidRatioCount = "0%"
  388. } else {
  389. sellerItem.UnpaidRatioCount = utils.SubFloatToString((mapInvoiceAmountMoney[keyMapTtoal]-mapPaymentAmountMoney[keyMapTtoal])/mapInvoiceAmountMoney[keyMapTtoal]*100, 2) + "%" //"未到款比例-(数据)"
  390. }
  391. sellerItem.NewCustomerInvoicingCount = utils.SubFloatToString(mapNewCustomerInvoicingMoney[keyMapTtoal], 2) // "新客开票-(数据)"
  392. sellerItem.NewCustomerPaymentsReceivedCount = utils.SubFloatToString(mapNewCustomerPaymentsReceivedMoney[keyMapTtoal], 2) // "新客到款-(数据)"
  393. item.DataList = append(item.DataList, sellerItem)
  394. }
  395. for _, vS := range sellerService {
  396. sellerItem := new(statistic_report.RaiDataSummaryDetail)
  397. sellerItem.SellerId = vS.AdminId
  398. sellerItem.SellerName = vS.RealName
  399. sellerItem.AddTrialCount = fmt.Sprint(mapAddTrialNum[keyMap])
  400. sellerItem.NewContractData = fmt.Sprint(utils.SubFloatToString(mapNewContractMoney[keyMap], 2), " / ", mapNewContractNum[keyMap]) // 新签合同(金额/数量)-(数据)
  401. sellerItem.ExpiredContractData = fmt.Sprint(utils.SubFloatToString(mapExpiredContractMoney[keyMap], 2), " / ", mapExpiredContractNum[keyMap]) //"到期合同(金额/数量)-(数据)"
  402. sellerItem.RenewedContractData = fmt.Sprint(utils.SubFloatToString(mapRenewedContractMoney[keyMap], 2), " / ", mapRenewedContractNum[keyMap]) // "续约合同(金额/数量)-(数据)"
  403. var renewalRateMoey string
  404. var renewalRateNum string
  405. if mapRenewedContractMoney[keyMap] == 0 || mapExpiredContractMoney[keyMap] == 0 {
  406. renewalRateMoey = "0%"
  407. } else {
  408. renewalRateMoey = utils.SubFloatToString(mapRenewedContractMoney[keyMap]/mapExpiredContractMoney[keyMap]*100, 2) + "%"
  409. }
  410. if mapRenewedContractNum[keyMap] == 0 || mapExpiredContractNum[keyMap] == 0 {
  411. renewalRateNum = "0%"
  412. } else {
  413. renewalRateNum = utils.SubFloatToString(float64(mapRenewedContractNum[keyMap])/float64(mapExpiredContractNum[keyMap])*100, 2) + "%"
  414. }
  415. sellerItem.RenewalRateData = fmt.Sprint(renewalRateMoey, " / ", renewalRateNum) //"续约率(金额/数量)-(数据)"
  416. sellerItem.ConfirmedNoRenewalContractData = fmt.Sprint(utils.SubFloatToString(confirmedNoRenewalContractMoney[keyMap], 2), " / ", confirmedNoRenewalContractNum[keyMap]) //"确认不续约合同(金额/数量)-(数据)"
  417. var confirmNonRenewalRateMoey string
  418. var confirmNonRenewalRateNum string
  419. if confirmedNoRenewalContractMoney[keyMap] == 0 || mapExpiredContractMoney[keyMap] == 0 {
  420. confirmNonRenewalRateMoey = "0%"
  421. } else {
  422. confirmNonRenewalRateMoey = utils.SubFloatToString(confirmedNoRenewalContractMoney[keyMap]/mapExpiredContractMoney[keyMap]*100, 2) + "%"
  423. }
  424. if confirmedNoRenewalContractNum[keyMap] == 0 || mapExpiredContractNum[keyMap] == 0 {
  425. confirmNonRenewalRateNum = "0%"
  426. } else {
  427. confirmNonRenewalRateNum = utils.SubFloatToString(float64(confirmedNoRenewalContractNum[keyMap])/float64(mapExpiredContractNum[keyMap])*100, 2) + "%"
  428. }
  429. sellerItem.ConfirmNonRenewalRateData = fmt.Sprint(confirmNonRenewalRateMoey, " / ", confirmNonRenewalRateNum) //确认不续约率(金额/数量)-(数据)"
  430. sellerItem.SignedClientCount = fmt.Sprint(mapSignedClientNum[keyMap]) // 签约客户数量
  431. if mapSignedClientNum[keyMap] == 0 || mapSignedClientMoney[keyMap] == 0 {
  432. sellerItem.AverageRevenueCount = "0"
  433. } else {
  434. sellerItem.AverageRevenueCount = utils.SubFloatToString(mapSignedClientMoney[keyMap]/float64(mapSignedClientNum[keyMap]), 2) //客单价
  435. }
  436. sellerItem.InvoiceAmountCount = utils.SubFloatToString(mapInvoiceAmountMoney[keyMap], 2) //"开票金额-(数据)"
  437. sellerItem.PaymentReceivedCount = utils.SubFloatToString(mapPaymentAmountMoney[keyMap], 2) //"开票金额-(数据)"
  438. if mapInvoiceAmountMoney[keyMap] == 0 || mapPaymentAmountMoney[keyMap] == 0 {
  439. sellerItem.UnpaidRatioCount = "0%"
  440. } else {
  441. sellerItem.UnpaidRatioCount = utils.SubFloatToString((mapInvoiceAmountMoney[keyMap]-mapPaymentAmountMoney[keyMap])/mapInvoiceAmountMoney[keyMap]*100, 2) + "%" //"未到款比例-(数据)"
  442. }
  443. sellerItem.NewCustomerInvoicingCount = utils.SubFloatToString(mapNewCustomerInvoicingMoney[keyMap], 2) // "新客开票-(数据)"
  444. sellerItem.NewCustomerPaymentsReceivedCount = utils.SubFloatToString(mapNewCustomerPaymentsReceivedMoney[keyMap], 2) // "新客到款-(数据)"
  445. item.DataList = append(item.DataList, sellerItem)
  446. }
  447. if len(sellerService) > 0 {
  448. sellerItem := new(statistic_report.RaiDataSummaryDetail)
  449. sellerItem.SellerName = "服务组合计"
  450. sellerItem.AddTrialCount = fmt.Sprint(mapAddTrialNum[keyMapTtoalServer])
  451. sellerItem.NewContractData = fmt.Sprint(utils.SubFloatToString(mapNewContractMoney[keyMapTtoalServer], 2), " / ", mapNewContractNum[keyMapTtoalServer]) // 新签合同(金额/数量)-(数据)
  452. sellerItem.ExpiredContractData = fmt.Sprint(utils.SubFloatToString(mapExpiredContractMoney[keyMapTtoalServer], 2), " / ", mapExpiredContractNum[keyMapTtoalServer]) //"到期合同(金额/数量)-(数据)"
  453. sellerItem.RenewedContractData = fmt.Sprint(utils.SubFloatToString(mapRenewedContractMoney[keyMapTtoalServer], 2), " / ", mapRenewedContractNum[keyMapTtoalServer]) // "续约合同(金额/数量)-(数据)"
  454. var renewalRateMoey string
  455. var renewalRateNum string
  456. if mapRenewedContractMoney[keyMapTtoalServer] == 0 || mapExpiredContractMoney[keyMapTtoalServer] == 0 {
  457. renewalRateMoey = "0%"
  458. } else {
  459. renewalRateMoey = utils.SubFloatToString(mapRenewedContractMoney[keyMapTtoalServer]/mapExpiredContractMoney[keyMapTtoalServer]*100, 2) + "%"
  460. }
  461. if mapRenewedContractNum[keyMapTtoalServer] == 0 || mapExpiredContractNum[keyMapTtoalServer] == 0 {
  462. renewalRateNum = "0%"
  463. } else {
  464. renewalRateNum = utils.SubFloatToString(float64(mapRenewedContractNum[keyMapTtoalServer])/float64(mapExpiredContractNum[keyMapTtoalServer])*100, 2) + "%"
  465. }
  466. sellerItem.RenewalRateData = fmt.Sprint(renewalRateMoey, " / ", renewalRateNum) //"续约率(金额/数量)-(数据)"
  467. sellerItem.ConfirmedNoRenewalContractData = fmt.Sprint(utils.SubFloatToString(confirmedNoRenewalContractMoney[keyMapTtoalServer], 2), " / ", confirmedNoRenewalContractNum[keyMapTtoalServer]) //"确认不续约合同(金额/数量)-(数据)"
  468. var confirmNonRenewalRateMoey string
  469. var confirmNonRenewalRateNum string
  470. if confirmedNoRenewalContractMoney[keyMapTtoalServer] == 0 || mapExpiredContractMoney[keyMapTtoalServer] == 0 {
  471. confirmNonRenewalRateMoey = "0%"
  472. } else {
  473. confirmNonRenewalRateMoey = utils.SubFloatToString(confirmedNoRenewalContractMoney[keyMapTtoalServer]/mapExpiredContractMoney[keyMapTtoalServer]*100, 2) + "%"
  474. }
  475. if confirmedNoRenewalContractNum[keyMapTtoalServer] == 0 || mapExpiredContractNum[keyMapTtoalServer] == 0 {
  476. confirmNonRenewalRateNum = "0%"
  477. } else {
  478. confirmNonRenewalRateNum = utils.SubFloatToString(float64(confirmedNoRenewalContractNum[keyMapTtoalServer])/float64(mapExpiredContractNum[keyMapTtoalServer])*100, 2) + "%"
  479. }
  480. sellerItem.ConfirmNonRenewalRateData = fmt.Sprint(confirmNonRenewalRateMoey, " / ", confirmNonRenewalRateNum) //确认不续约率(金额/数量)-(数据)"
  481. sellerItem.SignedClientCount = fmt.Sprint(mapSignedClientNum[keyMapTtoalServer]) // 签约客户数量
  482. if mapSignedClientNum[keyMapTtoalServer] == 0 || mapSignedClientMoney[keyMapTtoalServer] == 0 {
  483. sellerItem.AverageRevenueCount = "0"
  484. } else {
  485. sellerItem.AverageRevenueCount = utils.SubFloatToString(mapSignedClientMoney[keyMapTtoalServer]/float64(mapSignedClientNum[keyMapTtoalServer]), 2) //客单价
  486. }
  487. sellerItem.InvoiceAmountCount = utils.SubFloatToString(mapInvoiceAmountMoney[keyMapTtoalServer], 2) //"开票金额-(数据)"
  488. sellerItem.PaymentReceivedCount = utils.SubFloatToString(mapPaymentAmountMoney[keyMapTtoalServer], 2) //"开票金额-(数据)"
  489. if mapInvoiceAmountMoney[keyMapTtoalServer] == 0 || mapPaymentAmountMoney[keyMapTtoalServer] == 0 {
  490. sellerItem.UnpaidRatioCount = "0%"
  491. } else {
  492. sellerItem.UnpaidRatioCount = utils.SubFloatToString((mapInvoiceAmountMoney[keyMapTtoalServer]-mapPaymentAmountMoney[keyMapTtoalServer])/mapInvoiceAmountMoney[keyMapTtoalServer]*100, 2) + "%" //"未到款比例-(数据)"
  493. }
  494. sellerItem.NewCustomerInvoicingCount = utils.SubFloatToString(mapNewCustomerInvoicingMoney[keyMapTtoalServer], 2) // "新客开票-(数据)"
  495. sellerItem.NewCustomerPaymentsReceivedCount = utils.SubFloatToString(mapNewCustomerPaymentsReceivedMoney[keyMapTtoalServer], 2) // "新客到款-(数据)"
  496. item.DataList = append(item.DataList, sellerItem)
  497. }
  498. items = append(items, item)
  499. }
  500. }
  501. resp.List = items
  502. br.Ret = 200
  503. br.Success = true
  504. br.Msg = "获取成功"
  505. br.Data = resp
  506. }
  507. // MergeCompanyList
  508. // @Title 权益数据汇总弹窗详情
  509. // @Description 权益数据汇总弹窗详情接口
  510. // @Param SellerId query int true "销售ID"
  511. // @Param DataType query string false "报表类型,枚举值:`季度`,`年度`,`半年度`"
  512. // @Param PopupType query string false "弹窗数据类型,枚举值:"
  513. // @Param PageSize query int true "每页数据条数"
  514. // @Param CurrentIndex query int true "当前页页码,从1开始"
  515. // @Success 200 {object} statistic_report.RaiDataSummaryPopupTypeResp
  516. // @router /rai_data_summary/detail [get]
  517. func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
  518. br := new(models.BaseResponse).Init()
  519. defer func() {
  520. this.Data["json"] = br
  521. this.ServeJSON()
  522. }()
  523. sysUser := this.SysUser
  524. if sysUser == nil {
  525. br.Msg = "请登录"
  526. br.ErrMsg = "请登录,SysUser Is Empty"
  527. br.Ret = 408
  528. return
  529. }
  530. pageSize, _ := this.GetInt("PageSize")
  531. currentIndex, _ := this.GetInt("CurrentIndex")
  532. dataType := this.GetString("DataType")
  533. sellerId, _ := this.GetInt("SellerId")
  534. popupType := this.GetString("PopupType")
  535. var startSize int
  536. if pageSize <= 0 {
  537. pageSize = utils.PageSize20
  538. }
  539. if currentIndex <= 0 {
  540. currentIndex = 1
  541. }
  542. startSize = utils.StartIndex(currentIndex, pageSize)
  543. var startDate string
  544. var endDate string
  545. year := (dataType[:4])
  546. if strings.Contains(dataType, "Q1") {
  547. startDate = year + "-01-01"
  548. endDate = year + "-03-31"
  549. } else if strings.Contains(dataType, "Q2") {
  550. startDate = year + "-04-01"
  551. endDate = year + "-06-30"
  552. } else if strings.Contains(dataType, "Q3") {
  553. startDate = year + "-07-01"
  554. endDate = year + "-09-30"
  555. } else if strings.Contains(dataType, "Q4") {
  556. startDate = year + "-10-01"
  557. endDate = year + "-12-31"
  558. } else if strings.Contains(dataType, "H1") {
  559. startDate = year + "-01-01"
  560. endDate = year + "-06-31"
  561. } else if strings.Contains(dataType, "H2") {
  562. startDate = year + "-07-01"
  563. endDate = year + "-12-31"
  564. } else {
  565. startDate = year + "-01-01"
  566. endDate = year + "-12-31"
  567. }
  568. resp := new(statistic_report.RaiDataSummaryPopupTypeResp)
  569. var listResp []*statistic_report.RaiDataSummaryDetailResp
  570. var listGroup []*models.CompanyContractGroupList
  571. var trialTotal int
  572. var condition string
  573. var pars []interface{}
  574. switch popupType {
  575. case "新增试用":
  576. var parsTry []interface{}
  577. var conditionTry string
  578. if sellerId > 0 {
  579. conditionTry += ` AND a.sys_user_id = ? `
  580. parsTry = append(parsTry, sellerId)
  581. }
  582. conditionTry += ` AND a.create_time >= ? AND a.create_time <= ? AND a.operation in ( "add","receive","apply_receive" ) AND a.sys_user_id IN ( SELECT admin_id FROM admin WHERE role_type_code IN ( 'rai_seller', 'rai_group' , 'rai_admin') ) `
  583. parsTry = append(parsTry, startDate, endDate)
  584. total, err := models.GetIncrementalCompanyCountByOperationRecordRai(conditionTry, parsTry)
  585. if err != nil {
  586. br.Msg = "获取失败"
  587. br.ErrMsg = "获取新增试用客户数量失败,Err:" + err.Error()
  588. return
  589. }
  590. trialTotal = total
  591. //列表页数据
  592. tryList, err := models.GetIncrementalCompanyListByOperationRecordRai(conditionTry, parsTry, startSize, pageSize)
  593. if err != nil {
  594. br.Msg = "获取失败"
  595. br.ErrMsg = "获取失败,Err:" + err.Error()
  596. return
  597. }
  598. if len(tryList) > 0 {
  599. for _, v := range tryList {
  600. item := new(statistic_report.RaiDataSummaryDetailResp)
  601. v.SellerName = v.SysRealName
  602. if v.Operation == "add" {
  603. item.AddType = "新建"
  604. } else if v.Operation == "receive" || v.Operation == "apply_receive" {
  605. item.AddType = "领取"
  606. }
  607. item.CompanyName = v.CompanyName
  608. item.SellerName = v.SellerName
  609. item.CreateTime = v.CreateTime
  610. listResp = append(listResp, item)
  611. }
  612. }
  613. case "新签合同":
  614. if sellerId > 0 {
  615. condition += ` AND a.seller_id_init = ? `
  616. pars = append(pars, sellerId)
  617. }
  618. condition += ` AND a.status = 1 AND a.start_date >= ? AND a.start_date <= ? `
  619. pars = append(pars, startDate, endDate)
  620. condition += ` AND a.rai_contract_type = ? `
  621. pars = append(pars, "新签合同")
  622. total, err := company.GetIncrementalNewCompanyProductMergeCount(condition, pars)
  623. if err != nil && err.Error() != utils.ErrNoRow() {
  624. br.Msg = "获取失败"
  625. br.ErrMsg = "获取失败,Err:" + err.Error()
  626. return
  627. }
  628. trialTotal = total
  629. //列表页数据
  630. tmpList, err := models.GetIncrementalCompanyMergeList(condition, pars, startSize, pageSize)
  631. if err != nil {
  632. br.Msg = "获取失败"
  633. br.ErrMsg = "获取失败,Err:" + err.Error()
  634. return
  635. }
  636. if len(tmpList) > 0 {
  637. var companyContractIds []int
  638. for _, v := range tmpList {
  639. companyContractIds = append(companyContractIds, v.CompanyContractId)
  640. }
  641. //合并合同所对应的权限
  642. mappermissionName, err := cygxService.GetCompanyContractPermissionNameMapById(companyContractIds)
  643. if err != nil {
  644. br.Msg = "获取失败"
  645. br.ErrMsg = "获取失败,Err:" + err.Error()
  646. return
  647. }
  648. for _, v := range tmpList {
  649. item := new(statistic_report.RaiDataSummaryDetailResp)
  650. item.CompanyName = v.CompanyName
  651. item.SellerName = v.SellerNameInit
  652. item.StartDate = v.StartDate
  653. item.EndDate = v.EndDate
  654. item.Money = v.Money
  655. item.PermissionName = mappermissionName[v.CompanyContractId]
  656. listResp = append(listResp, item)
  657. }
  658. listGroup, err = models.GetCompanyContractGroupList(condition, pars)
  659. if err != nil {
  660. br.Msg = "获取失败"
  661. br.ErrMsg = "获取失败,Err:" + err.Error()
  662. return
  663. }
  664. }
  665. case "到期合同":
  666. if sellerId > 0 {
  667. condition += ` AND a.seller_id_last = ? `
  668. pars = append(pars, sellerId)
  669. }
  670. condition += ` AND a.status = 1 AND a.start_date >= ? AND a.start_date <= ? AND a.end_date < ? `
  671. pars = append(pars, startDate, endDate, time.Now().Format(utils.FormatDate))
  672. total, err := company.GetIncrementalNewCompanyProductMergeCount(condition, pars)
  673. if err != nil && err.Error() != utils.ErrNoRow() {
  674. br.Msg = "获取失败"
  675. br.ErrMsg = "获取失败,Err:" + err.Error()
  676. return
  677. }
  678. trialTotal = total
  679. //列表页数据
  680. tmpList, err := models.GetIncrementalCompanyMergeList(condition, pars, startSize, pageSize)
  681. if err != nil {
  682. br.Msg = "获取失败"
  683. br.ErrMsg = "获取失败,Err:" + err.Error()
  684. return
  685. }
  686. if len(tmpList) > 0 {
  687. var companyContractIds []int
  688. for _, v := range tmpList {
  689. companyContractIds = append(companyContractIds, v.CompanyContractId)
  690. }
  691. //合并合同所对应的权限
  692. mappermissionName, err := cygxService.GetCompanyContractPermissionNameMapById(companyContractIds)
  693. if err != nil {
  694. br.Msg = "获取失败"
  695. br.ErrMsg = "获取失败,Err:" + err.Error()
  696. return
  697. }
  698. for _, v := range tmpList {
  699. item := new(statistic_report.RaiDataSummaryDetailResp)
  700. item.CompanyName = v.CompanyName
  701. item.SellerName = v.SellerNameLast
  702. item.StartDate = v.StartDate
  703. item.EndDate = v.EndDate
  704. item.Money = v.Money
  705. item.PermissionName = mappermissionName[v.CompanyContractId]
  706. listResp = append(listResp, item)
  707. }
  708. listGroup, err = models.GetCompanyContractGroupList(condition, pars)
  709. if err != nil {
  710. br.Msg = "获取失败"
  711. br.ErrMsg = "获取失败,Err:" + err.Error()
  712. return
  713. }
  714. }
  715. case "续约合同":
  716. if sellerId > 0 {
  717. condition += ` AND a.seller_id_last = ? `
  718. pars = append(pars, sellerId)
  719. }
  720. condition += ` AND a.status = 1 AND a.start_date >= ? AND a.start_date <= ? `
  721. pars = append(pars, startDate, endDate)
  722. condition += ` AND a.rai_contract_type = ? `
  723. pars = append(pars, "续约合同")
  724. total, err := company.GetIncrementalNewCompanyProductMergeCount(condition, pars)
  725. if err != nil && err.Error() != utils.ErrNoRow() {
  726. br.Msg = "获取失败"
  727. br.ErrMsg = "获取失败,Err:" + err.Error()
  728. return
  729. }
  730. trialTotal = total
  731. //列表页数据
  732. tmpList, err := models.GetIncrementalCompanyMergeList(condition, pars, startSize, pageSize)
  733. if err != nil {
  734. br.Msg = "获取失败"
  735. br.ErrMsg = "获取失败,Err:" + err.Error()
  736. return
  737. }
  738. if len(tmpList) > 0 {
  739. var companyContractIds []int
  740. for _, v := range tmpList {
  741. companyContractIds = append(companyContractIds, v.CompanyContractId)
  742. }
  743. //合并合同所对应的权限
  744. mappermissionName, err := cygxService.GetCompanyContractPermissionNameMapById(companyContractIds)
  745. if err != nil {
  746. br.Msg = "获取失败"
  747. br.ErrMsg = "获取失败,Err:" + err.Error()
  748. return
  749. }
  750. for _, v := range tmpList {
  751. item := new(statistic_report.RaiDataSummaryDetailResp)
  752. item.CompanyName = v.CompanyName
  753. item.SellerName = v.SellerNameLast
  754. item.StartDate = v.StartDate
  755. item.EndDate = v.EndDate
  756. item.Money = v.Money
  757. item.PermissionName = mappermissionName[v.CompanyContractId]
  758. listResp = append(listResp, item)
  759. }
  760. listGroup, err = models.GetCompanyContractGroupList(condition, pars)
  761. if err != nil {
  762. br.Msg = "获取失败"
  763. br.ErrMsg = "获取失败,Err:" + err.Error()
  764. return
  765. }
  766. }
  767. case "续约率":
  768. if sellerId > 0 {
  769. condition += ` AND a.seller_id_last = ? `
  770. pars = append(pars, sellerId)
  771. }
  772. condition += " AND a.product_id = 2 AND a.status = 1 AND a.start_date >= ? AND a.start_date <= ? "
  773. pars = append(pars, startDate, endDate)
  774. listRaiData, err := statistic_report.GetRaiDataSummaryList(condition, pars)
  775. if err != nil {
  776. br.Msg = "获取数据信息失败"
  777. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  778. return
  779. }
  780. var renewedContractMoney float64 // 续约金额
  781. var renewedContractCompany float64 // 续约客户数
  782. maprenewedContractCompany := make(map[int]bool)
  783. var expiredContractMoney float64 //到期金额
  784. var expiredContractCompany float64 // 到期客户数
  785. mapexpiredContractCompany := make(map[int]bool)
  786. for _, v := range listRaiData {
  787. renewedContractMoney += v.Money
  788. if !maprenewedContractCompany[v.CompanyId] {
  789. renewedContractCompany++
  790. maprenewedContractCompany[v.CompanyId] = true
  791. }
  792. startDateTime := utils.StrDateToDate(v.StartDate)
  793. if startDateTime.Before(time.Now().AddDate(0, 0, -1)) { //到期合同数据
  794. expiredContractMoney += v.Money
  795. if !mapexpiredContractCompany[v.CompanyId] {
  796. expiredContractCompany++
  797. mapexpiredContractCompany[v.CompanyId] = true
  798. }
  799. }
  800. }
  801. item := new(statistic_report.RaiDataSummaryDetailResp)
  802. item.TbaleNameAText = "金额续约率"
  803. item.RenewedContractMoney = fmt.Sprint(utils.SubFloatToString(renewedContractMoney, 2))
  804. item.ExpiredContractMoney = fmt.Sprint(utils.SubFloatToString(expiredContractMoney, 2))
  805. if renewedContractMoney == 0 || expiredContractMoney == 0 {
  806. item.RenewalRate = "0%"
  807. } else {
  808. item.RenewalRate = fmt.Sprint(utils.SubFloatToString(renewedContractMoney/expiredContractMoney*100, 2), "%")
  809. }
  810. listResp = append(listResp, item)
  811. item2 := new(statistic_report.RaiDataSummaryDetailResp)
  812. item2.TbaleNameAText = "客户续约率"
  813. item2.RenewedContractMoney = fmt.Sprint(renewedContractCompany)
  814. item2.ExpiredContractMoney = fmt.Sprint(expiredContractCompany)
  815. if renewedContractCompany == 0 || expiredContractCompany == 0 {
  816. item2.RenewalRate = "0%"
  817. } else {
  818. item2.RenewalRate = fmt.Sprint(utils.SubFloatToString(renewedContractCompany/expiredContractCompany*100, 2), "%")
  819. }
  820. listResp = append(listResp, item2)
  821. case "确认不续约合同":
  822. noRenewedcompanyContractIds := services.GetCompanyContractNoRenewedAscribeListArr()
  823. condition += ` AND a.company_contract_id IN (` + utils.GetOrmInReplace(len(noRenewedcompanyContractIds)) + `) ` // 已确认
  824. pars = append(pars, noRenewedcompanyContractIds)
  825. if sellerId > 0 {
  826. condition += ` AND a.seller_id_last = ? `
  827. pars = append(pars, sellerId)
  828. }
  829. condition += ` AND a.product_id = 2 AND a.status = 1 AND a.start_date >= ? AND a.start_date <= ? `
  830. pars = append(pars, startDate, endDate)
  831. total, err := company.GetIncrementalNewCompanyProductMergeCount(condition, pars)
  832. if err != nil && err.Error() != utils.ErrNoRow() {
  833. br.Msg = "获取失败"
  834. br.ErrMsg = "获取失败,Err:" + err.Error()
  835. return
  836. }
  837. trialTotal = total
  838. //列表页数据
  839. tmpList, err := models.GetIncrementalCompanyMergeList(condition, pars, startSize, pageSize)
  840. if err != nil {
  841. br.Msg = "获取失败"
  842. br.ErrMsg = "获取失败,Err:" + err.Error()
  843. return
  844. }
  845. if len(tmpList) > 0 {
  846. var companyContractIds []int
  847. for _, v := range tmpList {
  848. companyContractIds = append(companyContractIds, v.CompanyContractId)
  849. }
  850. //合并合同所对应的权限
  851. mappermissionName, err := cygxService.GetCompanyContractPermissionNameMapById(companyContractIds)
  852. if err != nil {
  853. br.Msg = "获取失败"
  854. br.ErrMsg = "获取失败,Err:" + err.Error()
  855. return
  856. }
  857. for _, v := range tmpList {
  858. item := new(statistic_report.RaiDataSummaryDetailResp)
  859. item.CompanyName = v.CompanyName
  860. item.SellerName = v.SellerNameInit
  861. item.StartDate = v.StartDate
  862. item.EndDate = v.EndDate
  863. item.Money = v.Money
  864. item.PermissionName = mappermissionName[v.CompanyContractId]
  865. listResp = append(listResp, item)
  866. }
  867. listGroup, err = models.GetCompanyContractGroupList(condition, pars)
  868. if err != nil {
  869. br.Msg = "获取失败"
  870. br.ErrMsg = "获取失败,Err:" + err.Error()
  871. return
  872. }
  873. }
  874. case "确认不续约率":
  875. noRenewedcompanyContractIdsMap := services.GetCompanyContractNoRenewedAscribeListMap()
  876. if sellerId > 0 {
  877. condition += ` AND a.seller_id_last = ? `
  878. pars = append(pars, sellerId)
  879. }
  880. condition += " AND a.product_id = 2 AND a.status = 1 AND a.start_date >= ? AND a.start_date <= ? "
  881. pars = append(pars, startDate, endDate)
  882. listRaiData, err := statistic_report.GetRaiDataSummaryList(condition, pars)
  883. if err != nil {
  884. br.Msg = "获取数据信息失败"
  885. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  886. return
  887. }
  888. var norenewedContractMoney float64 // 不续约金额
  889. var norenewedContractCompany float64 // 不续约客户数
  890. mapnorenewedContractCompany := make(map[int]bool)
  891. var expiredContractMoney float64 //到期金额
  892. var expiredContractCompany float64 // 到期客户数
  893. mapexpiredContractCompany := make(map[int]bool)
  894. for _, v := range listRaiData {
  895. if noRenewedcompanyContractIdsMap[v.CompanyContractId] {
  896. norenewedContractMoney += v.Money
  897. if !mapnorenewedContractCompany[v.CompanyId] {
  898. norenewedContractCompany++
  899. mapnorenewedContractCompany[v.CompanyId] = true
  900. }
  901. startDateTime := utils.StrDateToDate(v.StartDate)
  902. if startDateTime.Before(time.Now().AddDate(0, 0, -1)) { //到期合同数据
  903. expiredContractMoney += v.Money
  904. if !mapexpiredContractCompany[v.CompanyId] {
  905. expiredContractCompany++
  906. mapexpiredContractCompany[v.CompanyId] = true
  907. }
  908. }
  909. }
  910. }
  911. item := new(statistic_report.RaiDataSummaryDetailResp)
  912. item.TbaleNameAText = "金额不续约率"
  913. item.RenewedContractMoney = fmt.Sprint(utils.SubFloatToString(norenewedContractMoney, 2))
  914. item.ExpiredContractMoney = fmt.Sprint(utils.SubFloatToString(expiredContractMoney, 2))
  915. if norenewedContractMoney == 0 || expiredContractMoney == 0 {
  916. item.RenewalRate = "0%"
  917. } else {
  918. item.RenewalRate = fmt.Sprint(utils.SubFloatToString(norenewedContractMoney/expiredContractMoney*100, 2), "%")
  919. }
  920. listResp = append(listResp, item)
  921. item2 := new(statistic_report.RaiDataSummaryDetailResp)
  922. item2.TbaleNameAText = "客户不续约率"
  923. item2.RenewedContractMoney = fmt.Sprint(norenewedContractCompany)
  924. item2.ExpiredContractMoney = fmt.Sprint(expiredContractCompany)
  925. if norenewedContractCompany == 0 || expiredContractCompany == 0 {
  926. item2.RenewalRate = "0%"
  927. } else {
  928. item2.RenewalRate = fmt.Sprint(utils.SubFloatToString(norenewedContractCompany/expiredContractCompany*100, 2), "%")
  929. }
  930. listResp = append(listResp, item2)
  931. case "签约客户数量":
  932. if sellerId > 0 {
  933. condition += ` AND a.seller_id_last = ? `
  934. pars = append(pars, sellerId)
  935. }
  936. condition += " AND a.product_id = 2 AND a.status = 1 AND a.start_date >= ? AND a.start_date <= ? "
  937. pars = append(pars, startDate, endDate)
  938. listRaiData, err := statistic_report.GetRaiDataSummaryList(condition, pars)
  939. if err != nil {
  940. br.Msg = "获取数据信息失败"
  941. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  942. return
  943. }
  944. var renewedContractCompany int // 续约客户数
  945. var renewedContract int // 续约合同数
  946. maprenewedContractCompany := make(map[int]bool)
  947. var newContractCompany int // 新签客户数
  948. var newContract int // 新签合同数
  949. mapenewContractCompany := make(map[int]bool)
  950. for _, v := range listRaiData {
  951. if v.RaiContractType == "新签合同" {
  952. newContract++
  953. if !mapenewContractCompany[v.CompanyId] {
  954. newContractCompany++
  955. mapenewContractCompany[v.CompanyId] = true
  956. }
  957. } else if v.RaiContractType == "续约合同" {
  958. renewedContract++
  959. if !maprenewedContractCompany[v.CompanyId] {
  960. renewedContractCompany++
  961. maprenewedContractCompany[v.CompanyId] = true
  962. }
  963. }
  964. }
  965. item := new(statistic_report.RaiDataSummaryDetailResp)
  966. item.RenewedContractCompany = renewedContractCompany
  967. item.RenewedContract = renewedContract
  968. item.NewContractCompany = newContractCompany
  969. item.NewContract = newContract
  970. listResp = append(listResp, item)
  971. case "客单价":
  972. if sellerId > 0 {
  973. condition += ` AND a.seller_id_last = ? `
  974. pars = append(pars, sellerId)
  975. }
  976. condition += " AND a.product_id = 2 AND a.status = 1 AND a.start_date >= ? AND a.start_date <= ? "
  977. pars = append(pars, startDate, endDate)
  978. listRaiData, err := statistic_report.GetRaiDataSummaryList(condition, pars)
  979. if err != nil {
  980. br.Msg = "获取数据信息失败"
  981. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  982. return
  983. }
  984. var ontractMoney float64 // 签约总金额
  985. var contractNum int // 签约客户数
  986. for _, v := range listRaiData {
  987. ontractMoney += v.Money
  988. contractNum++
  989. }
  990. item := new(statistic_report.RaiDataSummaryDetailResp)
  991. item.ContractMoney = fmt.Sprint(utils.SubFloatToString(ontractMoney, 2))
  992. item.ContractNum = contractNum
  993. listResp = append(listResp, item)
  994. case "开票金额":
  995. if sellerId > 0 {
  996. condition += ` AND a.rai_seller_id = ? `
  997. pars = append(pars, sellerId)
  998. }
  999. condition += " AND a.is_deleted = 0 AND a.start_date >= ? AND a.start_date <= ? AND invoiced_amount > 0 AND product_ids LIKE '%2%' "
  1000. pars = append(pars, startDate, endDate)
  1001. listFmsData, err := fms.GetContractRegisterList(condition, pars, startSize, pageSize)
  1002. if err != nil {
  1003. br.Msg = "获取数据信息失败"
  1004. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  1005. return
  1006. }
  1007. for _, v := range listFmsData {
  1008. item := new(statistic_report.RaiDataSummaryDetailResp)
  1009. item.CompanyName = v.CompanyName
  1010. item.SellerName = v.RaiSellerName
  1011. item.ContractCode = v.ContractCode
  1012. item.InvoicedAmount = v.InvoicedAmount
  1013. item.CreateTime = v.CreateTime.Format(utils.FormatDate)
  1014. listResp = append(listResp, item)
  1015. }
  1016. case "到款金额":
  1017. if sellerId > 0 {
  1018. condition += ` AND a.rai_seller_id = ? `
  1019. pars = append(pars, sellerId)
  1020. }
  1021. condition += " AND a.is_deleted = 0 AND a.start_date >= ? AND a.start_date <= ? AND payment_amount > 0 AND product_ids LIKE '%2%' "
  1022. pars = append(pars, startDate, endDate)
  1023. listFmsData, err := fms.GetContractRegisterList(condition, pars, startSize, pageSize)
  1024. if err != nil {
  1025. br.Msg = "获取数据信息失败"
  1026. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  1027. return
  1028. }
  1029. for _, v := range listFmsData {
  1030. item := new(statistic_report.RaiDataSummaryDetailResp)
  1031. item.CompanyName = v.CompanyName
  1032. item.SellerName = v.RaiSellerName
  1033. item.ContractCode = v.ContractCode
  1034. item.PaymentAmount = v.PaymentAmount
  1035. item.CreateTime = v.CreateTime.Format(utils.FormatDate)
  1036. listResp = append(listResp, item)
  1037. }
  1038. case "未到款比例":
  1039. if sellerId > 0 {
  1040. condition += ` AND a.rai_seller_id = ? `
  1041. pars = append(pars, sellerId)
  1042. }
  1043. condition += " AND a.is_deleted = 0 AND a.start_date >= ? AND a.start_date <= ? AND product_ids LIKE '%2%' "
  1044. pars = append(pars, startDate, endDate)
  1045. listFmsData, err := fms.GetContractRegisterAmountList(condition, pars)
  1046. if err != nil {
  1047. br.Msg = "获取数据信息失败"
  1048. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  1049. return
  1050. }
  1051. for _, v := range listFmsData {
  1052. item := new(statistic_report.RaiDataSummaryDetailResp)
  1053. item.InvoicedAmount = v.InvoicedAmount
  1054. item.PaymentAmount = v.PaymentAmount
  1055. item.NotReceivedtAmount = v.InvoicedAmount - v.PaymentAmount
  1056. item.CreateTime = v.CreateTime.Format(utils.FormatDate)
  1057. listResp = append(listResp, item)
  1058. }
  1059. case "新客开票":
  1060. if sellerId > 0 {
  1061. condition += ` AND a.rai_seller_id = ? `
  1062. pars = append(pars, sellerId)
  1063. }
  1064. condition += " AND a.is_deleted = 0 AND contract_type = 1 AND a.start_date >= ? AND a.start_date <= ? AND payment_amount > 0 AND product_ids LIKE '%2%' "
  1065. pars = append(pars, startDate, endDate)
  1066. listFmsData, err := fms.GetContractRegisterList(condition, pars, startSize, pageSize)
  1067. if err != nil {
  1068. br.Msg = "获取数据信息失败"
  1069. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  1070. return
  1071. }
  1072. for _, v := range listFmsData {
  1073. item := new(statistic_report.RaiDataSummaryDetailResp)
  1074. item.CompanyName = v.CompanyName
  1075. item.SellerName = v.RaiSellerName
  1076. item.ContractCode = v.ContractCode
  1077. item.PaymentAmount = v.PaymentAmount
  1078. item.CreateTime = v.CreateTime.Format(utils.FormatDate)
  1079. listResp = append(listResp, item)
  1080. }
  1081. case "新客到款":
  1082. if sellerId > 0 {
  1083. condition += ` AND a.rai_seller_id = ? `
  1084. pars = append(pars, sellerId)
  1085. }
  1086. condition += " AND a.is_deleted = 0 AND contract_type = 1 AND a.start_date >= ? AND a.start_date <= ? AND payment_amount > 0 AND product_ids LIKE '%2%' "
  1087. pars = append(pars, startDate, endDate)
  1088. listFmsData, err := fms.GetContractRegisterList(condition, pars, startSize, pageSize)
  1089. if err != nil {
  1090. br.Msg = "获取数据信息失败"
  1091. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  1092. return
  1093. }
  1094. for _, v := range listFmsData {
  1095. item := new(statistic_report.RaiDataSummaryDetailResp)
  1096. item.CompanyName = v.CompanyName
  1097. item.SellerName = v.RaiSellerName
  1098. item.ContractCode = v.ContractCode
  1099. item.PaymentAmount = v.PaymentAmount
  1100. item.CreateTime = v.CreateTime.Format(utils.FormatDate)
  1101. listResp = append(listResp, item)
  1102. }
  1103. }
  1104. if len(listResp) == 0 {
  1105. listResp = make([]*statistic_report.RaiDataSummaryDetailResp, 0)
  1106. }
  1107. if len(listGroup) > 0 {
  1108. for _, v := range listGroup {
  1109. if v.CompanyCount > 1 {
  1110. resp.CompanyMultiple++
  1111. }
  1112. }
  1113. resp.CompanyNum = len(listGroup)
  1114. }
  1115. resp.List = listResp
  1116. page := paging.GetPaging(currentIndex, pageSize, trialTotal)
  1117. resp.Paging = page
  1118. br.Ret = 200
  1119. br.Success = true
  1120. br.Msg = "获取成功"
  1121. br.Data = resp
  1122. }