rai_data_summary.go 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227
  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.RenewedContractMoney = fmt.Sprint(utils.SubFloatToString(renewedContractMoney, 2))
  803. item.ExpiredContractMoney = fmt.Sprint(renewedContractCompany)
  804. if renewedContractMoney == 0 || expiredContractMoney == 0 {
  805. item.RenewalRate = "0%"
  806. } else {
  807. item.RenewalRate = fmt.Sprint(utils.SubFloatToString(renewedContractMoney/expiredContractMoney*100, 2), "%")
  808. }
  809. listResp = append(listResp, item)
  810. item2 := new(statistic_report.RaiDataSummaryDetailResp)
  811. item2.RenewedContractMoney = fmt.Sprint(utils.SubFloatToString(expiredContractMoney, 2))
  812. item2.ExpiredContractMoney = fmt.Sprint(expiredContractCompany)
  813. if renewedContractCompany == 0 || expiredContractCompany == 0 {
  814. item2.RenewalRate = "0%"
  815. } else {
  816. item2.RenewalRate = fmt.Sprint(utils.SubFloatToString(renewedContractCompany/expiredContractCompany*100, 2), "%")
  817. }
  818. listResp = append(listResp, item2)
  819. case "确认不续约合同":
  820. noRenewedcompanyContractIds := services.GetCompanyContractNoRenewedAscribeListArr()
  821. condition += ` AND a.company_contract_id IN (` + utils.GetOrmInReplace(len(noRenewedcompanyContractIds)) + `) ` // 已确认
  822. pars = append(pars, noRenewedcompanyContractIds)
  823. if sellerId > 0 {
  824. condition += ` AND a.seller_id_last = ? `
  825. pars = append(pars, sellerId)
  826. }
  827. condition += ` AND a.product_id = 2 AND a.status = 1 AND a.start_date >= ? AND a.start_date <= ? `
  828. pars = append(pars, startDate, endDate)
  829. total, err := company.GetIncrementalNewCompanyProductMergeCount(condition, pars)
  830. if err != nil && err.Error() != utils.ErrNoRow() {
  831. br.Msg = "获取失败"
  832. br.ErrMsg = "获取失败,Err:" + err.Error()
  833. return
  834. }
  835. trialTotal = total
  836. //列表页数据
  837. tmpList, err := models.GetIncrementalCompanyMergeList(condition, pars, startSize, pageSize)
  838. if err != nil {
  839. br.Msg = "获取失败"
  840. br.ErrMsg = "获取失败,Err:" + err.Error()
  841. return
  842. }
  843. if len(tmpList) > 0 {
  844. var companyContractIds []int
  845. for _, v := range tmpList {
  846. companyContractIds = append(companyContractIds, v.CompanyContractId)
  847. }
  848. //合并合同所对应的权限
  849. mappermissionName, err := cygxService.GetCompanyContractPermissionNameMapById(companyContractIds)
  850. if err != nil {
  851. br.Msg = "获取失败"
  852. br.ErrMsg = "获取失败,Err:" + err.Error()
  853. return
  854. }
  855. for _, v := range tmpList {
  856. item := new(statistic_report.RaiDataSummaryDetailResp)
  857. item.CompanyName = v.CompanyName
  858. item.SellerName = v.SellerNameInit
  859. item.StartDate = v.StartDate
  860. item.EndDate = v.EndDate
  861. item.Money = v.Money
  862. item.PermissionName = mappermissionName[v.CompanyContractId]
  863. listResp = append(listResp, item)
  864. }
  865. listGroup, err = models.GetCompanyContractGroupList(condition, pars)
  866. if err != nil {
  867. br.Msg = "获取失败"
  868. br.ErrMsg = "获取失败,Err:" + err.Error()
  869. return
  870. }
  871. }
  872. case "确认不续约率":
  873. noRenewedcompanyContractIdsMap := services.GetCompanyContractNoRenewedAscribeListMap()
  874. if sellerId > 0 {
  875. condition += ` AND a.seller_id_last = ? `
  876. pars = append(pars, sellerId)
  877. }
  878. condition += " AND a.product_id = 2 AND a.status = 1 AND a.start_date >= ? AND a.start_date <= ? "
  879. pars = append(pars, startDate, endDate)
  880. listRaiData, err := statistic_report.GetRaiDataSummaryList(condition, pars)
  881. if err != nil {
  882. br.Msg = "获取数据信息失败"
  883. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  884. return
  885. }
  886. var norenewedContractMoney float64 // 不续约金额
  887. var norenewedContractCompany float64 // 不续约客户数
  888. mapnorenewedContractCompany := make(map[int]bool)
  889. var expiredContractMoney float64 //到期金额
  890. var expiredContractCompany float64 // 到期客户数
  891. mapexpiredContractCompany := make(map[int]bool)
  892. for _, v := range listRaiData {
  893. if noRenewedcompanyContractIdsMap[v.CompanyContractId] {
  894. norenewedContractMoney += v.Money
  895. if !mapnorenewedContractCompany[v.CompanyId] {
  896. norenewedContractCompany++
  897. mapnorenewedContractCompany[v.CompanyId] = true
  898. }
  899. startDateTime := utils.StrDateToDate(v.StartDate)
  900. if startDateTime.Before(time.Now().AddDate(0, 0, -1)) { //到期合同数据
  901. expiredContractMoney += v.Money
  902. if !mapexpiredContractCompany[v.CompanyId] {
  903. expiredContractCompany++
  904. mapexpiredContractCompany[v.CompanyId] = true
  905. }
  906. }
  907. }
  908. }
  909. item := new(statistic_report.RaiDataSummaryDetailResp)
  910. item.RenewedContractMoney = fmt.Sprint(utils.SubFloatToString(norenewedContractMoney, 2))
  911. item.ExpiredContractMoney = fmt.Sprint(norenewedContractCompany)
  912. if norenewedContractMoney == 0 || expiredContractMoney == 0 {
  913. item.RenewalRate = "0%"
  914. } else {
  915. item.RenewalRate = fmt.Sprint(utils.SubFloatToString(norenewedContractMoney/expiredContractMoney*100, 2), "%")
  916. }
  917. listResp = append(listResp, item)
  918. item2 := new(statistic_report.RaiDataSummaryDetailResp)
  919. item2.RenewedContractMoney = fmt.Sprint(utils.SubFloatToString(expiredContractMoney, 2))
  920. item2.ExpiredContractMoney = fmt.Sprint(expiredContractCompany)
  921. if norenewedContractCompany == 0 || expiredContractCompany == 0 {
  922. item2.RenewalRate = "0%"
  923. } else {
  924. item2.RenewalRate = fmt.Sprint(utils.SubFloatToString(norenewedContractCompany/expiredContractCompany*100, 2), "%")
  925. }
  926. listResp = append(listResp, item2)
  927. case "签约客户数量":
  928. if sellerId > 0 {
  929. condition += ` AND a.seller_id_last = ? `
  930. pars = append(pars, sellerId)
  931. }
  932. condition += " AND a.product_id = 2 AND a.status = 1 AND a.start_date >= ? AND a.start_date <= ? "
  933. pars = append(pars, startDate, endDate)
  934. listRaiData, err := statistic_report.GetRaiDataSummaryList(condition, pars)
  935. if err != nil {
  936. br.Msg = "获取数据信息失败"
  937. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  938. return
  939. }
  940. var renewedContractCompany int // 续约客户数
  941. var renewedContract int // 续约合同数
  942. maprenewedContractCompany := make(map[int]bool)
  943. var newContractCompany int // 新签客户数
  944. var newContract int // 新签合同数
  945. mapenewContractCompany := make(map[int]bool)
  946. for _, v := range listRaiData {
  947. if v.RaiContractType == "新签合同" {
  948. newContract++
  949. if !mapenewContractCompany[v.CompanyId] {
  950. newContractCompany++
  951. mapenewContractCompany[v.CompanyId] = true
  952. }
  953. } else if v.RaiContractType == "续约合同" {
  954. renewedContract++
  955. if !maprenewedContractCompany[v.CompanyId] {
  956. renewedContractCompany++
  957. maprenewedContractCompany[v.CompanyId] = true
  958. }
  959. }
  960. }
  961. item := new(statistic_report.RaiDataSummaryDetailResp)
  962. item.RenewedContractCompany = renewedContractCompany
  963. item.RenewedContract = renewedContract
  964. item.NewContractCompany = newContractCompany
  965. item.NewContract = newContract
  966. listResp = append(listResp, item)
  967. case "客单价":
  968. if sellerId > 0 {
  969. condition += ` AND a.seller_id_last = ? `
  970. pars = append(pars, sellerId)
  971. }
  972. condition += " AND a.product_id = 2 AND a.status = 1 AND a.start_date >= ? AND a.start_date <= ? "
  973. pars = append(pars, startDate, endDate)
  974. listRaiData, err := statistic_report.GetRaiDataSummaryList(condition, pars)
  975. if err != nil {
  976. br.Msg = "获取数据信息失败"
  977. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  978. return
  979. }
  980. var ontractMoney float64 // 签约总金额
  981. var contractNum int // 签约客户数
  982. for _, v := range listRaiData {
  983. ontractMoney += v.Money
  984. contractNum++
  985. }
  986. item := new(statistic_report.RaiDataSummaryDetailResp)
  987. item.ContractMoney = fmt.Sprint(utils.SubFloatToString(ontractMoney, 2))
  988. item.ContractNum = contractNum
  989. listResp = append(listResp, item)
  990. case "开票金额":
  991. if sellerId > 0 {
  992. condition += ` AND a.rai_seller_id = ? `
  993. pars = append(pars, sellerId)
  994. }
  995. condition += " AND a.is_deleted = 0 AND a.start_date >= ? AND a.start_date <= ? AND invoiced_amount > 0 AND product_ids LIKE '%2%' "
  996. pars = append(pars, startDate, endDate)
  997. listFmsData, err := fms.GetContractRegisterList(condition, pars, startSize, pageSize)
  998. if err != nil {
  999. br.Msg = "获取数据信息失败"
  1000. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  1001. return
  1002. }
  1003. for _, v := range listFmsData {
  1004. item := new(statistic_report.RaiDataSummaryDetailResp)
  1005. item.CompanyName = v.CompanyName
  1006. item.SellerName = v.RaiSellerName
  1007. item.ContractCode = v.ContractCode
  1008. item.InvoicedAmount = v.InvoicedAmount
  1009. item.CreateTime = v.CreateTime.Format(utils.FormatDate)
  1010. listResp = append(listResp, item)
  1011. }
  1012. case "到款金额":
  1013. if sellerId > 0 {
  1014. condition += ` AND a.rai_seller_id = ? `
  1015. pars = append(pars, sellerId)
  1016. }
  1017. condition += " AND a.is_deleted = 0 AND a.start_date >= ? AND a.start_date <= ? AND payment_amount > 0 AND product_ids LIKE '%2%' "
  1018. pars = append(pars, startDate, endDate)
  1019. listFmsData, err := fms.GetContractRegisterList(condition, pars, startSize, pageSize)
  1020. if err != nil {
  1021. br.Msg = "获取数据信息失败"
  1022. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  1023. return
  1024. }
  1025. for _, v := range listFmsData {
  1026. item := new(statistic_report.RaiDataSummaryDetailResp)
  1027. item.CompanyName = v.CompanyName
  1028. item.SellerName = v.RaiSellerName
  1029. item.ContractCode = v.ContractCode
  1030. item.PaymentAmount = v.PaymentAmount
  1031. item.CreateTime = v.CreateTime.Format(utils.FormatDate)
  1032. listResp = append(listResp, item)
  1033. }
  1034. case "未到款比例":
  1035. if sellerId > 0 {
  1036. condition += ` AND a.rai_seller_id = ? `
  1037. pars = append(pars, sellerId)
  1038. }
  1039. condition += " AND a.is_deleted = 0 AND a.start_date >= ? AND a.start_date <= ? AND product_ids LIKE '%2%' "
  1040. pars = append(pars, startDate, endDate)
  1041. listFmsData, err := fms.GetContractRegisterAmountList(condition, pars)
  1042. if err != nil {
  1043. br.Msg = "获取数据信息失败"
  1044. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  1045. return
  1046. }
  1047. for _, v := range listFmsData {
  1048. item := new(statistic_report.RaiDataSummaryDetailResp)
  1049. item.InvoicedAmount = v.InvoicedAmount
  1050. item.PaymentAmount = v.PaymentAmount
  1051. item.NotReceivedtAmount = v.InvoicedAmount - v.PaymentAmount
  1052. item.CreateTime = v.CreateTime.Format(utils.FormatDate)
  1053. listResp = append(listResp, item)
  1054. }
  1055. case "新客开票":
  1056. if sellerId > 0 {
  1057. condition += ` AND a.rai_seller_id = ? `
  1058. pars = append(pars, sellerId)
  1059. }
  1060. 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%' "
  1061. pars = append(pars, startDate, endDate)
  1062. listFmsData, err := fms.GetContractRegisterList(condition, pars, startSize, pageSize)
  1063. if err != nil {
  1064. br.Msg = "获取数据信息失败"
  1065. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  1066. return
  1067. }
  1068. for _, v := range listFmsData {
  1069. item := new(statistic_report.RaiDataSummaryDetailResp)
  1070. item.CompanyName = v.CompanyName
  1071. item.SellerName = v.RaiSellerName
  1072. item.ContractCode = v.ContractCode
  1073. item.PaymentAmount = v.PaymentAmount
  1074. item.CreateTime = v.CreateTime.Format(utils.FormatDate)
  1075. listResp = append(listResp, item)
  1076. }
  1077. case "新客到款":
  1078. if sellerId > 0 {
  1079. condition += ` AND a.rai_seller_id = ? `
  1080. pars = append(pars, sellerId)
  1081. }
  1082. 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%' "
  1083. pars = append(pars, startDate, endDate)
  1084. listFmsData, err := fms.GetContractRegisterList(condition, pars, startSize, pageSize)
  1085. if err != nil {
  1086. br.Msg = "获取数据信息失败"
  1087. br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
  1088. return
  1089. }
  1090. for _, v := range listFmsData {
  1091. item := new(statistic_report.RaiDataSummaryDetailResp)
  1092. item.CompanyName = v.CompanyName
  1093. item.SellerName = v.RaiSellerName
  1094. item.ContractCode = v.ContractCode
  1095. item.PaymentAmount = v.PaymentAmount
  1096. item.CreateTime = v.CreateTime.Format(utils.FormatDate)
  1097. listResp = append(listResp, item)
  1098. }
  1099. }
  1100. if len(listResp) == 0 {
  1101. listResp = make([]*statistic_report.RaiDataSummaryDetailResp, 0)
  1102. }
  1103. if len(listGroup) > 0 {
  1104. for _, v := range listGroup {
  1105. if v.CompanyCount > 1 {
  1106. resp.CompanyMultiple++
  1107. }
  1108. }
  1109. resp.CompanyNum = len(listGroup)
  1110. }
  1111. resp.List = listResp
  1112. page := paging.GetPaging(currentIndex, pageSize, trialTotal)
  1113. resp.Paging = page
  1114. br.Ret = 200
  1115. br.Success = true
  1116. br.Msg = "获取成功"
  1117. br.Data = resp
  1118. }