rai_serve.go 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318
  1. package cygx
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "github.com/rdlucklib/rdluck_tools/paging"
  7. "github.com/tealeg/xlsx"
  8. "hongze/hz_crm_api/controllers"
  9. "hongze/hz_crm_api/models"
  10. "hongze/hz_crm_api/models/company"
  11. "hongze/hz_crm_api/models/cygx"
  12. "hongze/hz_crm_api/models/roadshow"
  13. cygxService "hongze/hz_crm_api/services/cygx"
  14. "hongze/hz_crm_api/utils"
  15. "os"
  16. "path/filepath"
  17. "strconv"
  18. "strings"
  19. "time"
  20. )
  21. // 权益服务类型
  22. type RaiServeCoAntroller struct {
  23. controllers.BaseAuthController
  24. }
  25. // @Title 服务类型列表
  26. // @Description 服务类型列表接口
  27. // @Success 200 {object} cygx.RaiServeTypeListResp
  28. // @router /rai_serve/type_list [get]
  29. func (this *RaiServeCoAntroller) TypeList() {
  30. br := new(models.BaseResponse).Init()
  31. defer func() {
  32. this.Data["json"] = br
  33. this.ServeJSON()
  34. }()
  35. sysUser := this.SysUser
  36. if sysUser == nil {
  37. br.Msg = "请登录"
  38. br.ErrMsg = "请登录,SysUser Is Empty"
  39. br.Ret = 408
  40. return
  41. }
  42. resp := new(cygx.RaiServeTypeListResp)
  43. var condition string
  44. list, err := cygx.GetRaiServeTypeRespList(condition)
  45. if err != nil {
  46. br.Msg = "获取失败"
  47. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  48. return
  49. }
  50. resp.List = list
  51. br.Ret = 200
  52. br.Success = true
  53. br.Msg = "获取成功"
  54. br.Data = resp
  55. }
  56. // @Title 标签搜索
  57. // @Description 标签搜索接口
  58. // @Param KeyWord query string false "搜索关键词"
  59. // @Success 200 {object} cygx.RaiServeTagListResp
  60. // @router /rai_serve/search_tag [get]
  61. func (this *RaiServeCoAntroller) SearchTag() {
  62. br := new(models.BaseResponse).Init()
  63. defer func() {
  64. this.Data["json"] = br
  65. this.ServeJSON()
  66. }()
  67. sysUser := this.SysUser
  68. if sysUser == nil {
  69. br.Msg = "请登录"
  70. br.ErrMsg = "请登录,SysUser Is Empty"
  71. br.Ret = 408
  72. return
  73. }
  74. keyWord := this.GetString("KeyWord")
  75. if keyWord == "" {
  76. br.Msg = "请输入搜索关键词"
  77. return
  78. }
  79. resp := new(cygx.RaiServeTagListResp)
  80. var chartPermissionId string
  81. if utils.RunMode == "release" {
  82. chartPermissionId = "19, 20, 21, 22 ,62 "
  83. } else {
  84. chartPermissionId = "19, 20, 21, 22 ,148 "
  85. }
  86. list, err := cygx.GetRaiServeSearchTagRespList(keyWord, chartPermissionId)
  87. if err != nil {
  88. br.Msg = "获取失败"
  89. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  90. return
  91. }
  92. //如果有固收或者策略就去查询行业表
  93. if strings.Contains("固收", keyWord) || strings.Contains("策略", keyWord) {
  94. var condition string
  95. var pars []interface{}
  96. keyWord = "%" + keyWord + "%"
  97. condition = ` AND product_id = 2 AND permission_name IN ('策略','固收') AND permission_name LIKE ? `
  98. pars = append(pars, keyWord)
  99. listChartPermission, err := models.GetChartPermissionListByCondition(condition, pars)
  100. if err != nil {
  101. br.Msg = "获取失败"
  102. br.ErrMsg = "获取数据失败,GetChartPermissionListByCondition Err:" + err.Error()
  103. return
  104. }
  105. for _, v := range listChartPermission {
  106. item := new(cygx.RaiServeTagResp)
  107. item.TagType = 3
  108. item.TagId = v.ChartPermissionId
  109. item.TagName = v.PermissionName
  110. list = append(list, item)
  111. }
  112. }
  113. if len(list) == 0 {
  114. list = make([]*cygx.RaiServeTagResp, 0)
  115. } else {
  116. mapUniqueKey := make(map[string]bool)
  117. for _, v := range list {
  118. uniqueKey := fmt.Sprintf("K_", v.TagType, "V_", v.TagName)
  119. if mapUniqueKey[uniqueKey] {
  120. continue
  121. }
  122. v.Md5Key = utils.MD5(fmt.Sprintf("K_", v.TagType, "V_", v.TagId))
  123. mapUniqueKey[uniqueKey] = true
  124. resp.List = append(resp.List, v)
  125. }
  126. }
  127. br.Ret = 200
  128. br.Success = true
  129. br.Msg = "获取成功"
  130. br.Data = resp
  131. }
  132. // @Title 标签搜索(研究员日历添加到会信息)
  133. // @Description 标签搜索接口
  134. // @Param KeyWord query string false "搜索关键词"
  135. // @Param ResearcherId query int false "研究员ID"
  136. // @Success 200 {object} cygx.RaiServeTagListResp
  137. // @router /rai_serve/search_tag_by_calendar [get]
  138. func (this *RaiServeCoAntroller) SearchTagCalendar() {
  139. br := new(models.BaseResponse).Init()
  140. defer func() {
  141. this.Data["json"] = br
  142. this.ServeJSON()
  143. }()
  144. sysUser := this.SysUser
  145. if sysUser == nil {
  146. br.Msg = "请登录"
  147. br.ErrMsg = "请登录,SysUser Is Empty"
  148. br.Ret = 408
  149. return
  150. }
  151. keyWord := this.GetString("KeyWord")
  152. researcherId := this.GetString("ResearcherId")
  153. askEmailList, err := cygx.GetAskEmailListByAdminIds(researcherId)
  154. if err != nil {
  155. br.Msg = "获取失败"
  156. br.ErrMsg = "GetAskEmailCountByCelue,Err:" + err.Error()
  157. return
  158. }
  159. var hasCelue bool
  160. var permissionName []string
  161. for _, v := range askEmailList {
  162. permissionName = append(permissionName, v.ChartPermissionName)
  163. if v.ChartPermissionName == "策略" || v.ChartPermissionName == "固收" {
  164. hasCelue = true
  165. }
  166. }
  167. permissionName = append(permissionName, utils.ZHOU_QI_NAME) //所有行业默认添加周期行业
  168. var permissionNameSql []string
  169. for _, v := range permissionName {
  170. permissionNameSql = append(permissionNameSql, "'"+v+"'")
  171. }
  172. chartList, err := models.GetChartPermissionByNamesByRai(permissionNameSql)
  173. if err != nil {
  174. br.Msg = "获取失败"
  175. br.ErrMsg = "获取数据失败,GetChartPermissionByNames Err:" + err.Error()
  176. return
  177. }
  178. var list []*cygx.RaiServeTagResp
  179. resp := new(cygx.RaiServeTagListResp)
  180. if hasCelue {
  181. for _, v := range chartList {
  182. item := new(cygx.RaiServeTagResp)
  183. item.TagType = 3
  184. item.TagId = v.ChartPermissionId
  185. item.TagName = v.PermissionName
  186. list = append(list, item)
  187. }
  188. } else {
  189. if keyWord == "" {
  190. br.Msg = "请输入搜索关键词"
  191. return
  192. }
  193. keyWordSlice := strings.Split(keyWord, ",")
  194. var conditionindustrial string
  195. var conditionsubject string
  196. for _, v := range keyWordSlice {
  197. conditionindustrial += ` OR i.industry_name LIKE '%` + v + `%' `
  198. conditionsubject += ` OR s.subject_name LIKE '%` + v + `%' `
  199. }
  200. var permissionId []string
  201. for _, v := range chartList {
  202. permissionId = append(permissionId, strconv.Itoa(v.ChartPermissionId))
  203. }
  204. list, err = cygx.GetRaiServeSearchTagRespListBycharId(keyWord, strings.Join(permissionId, ","), conditionindustrial, conditionsubject)
  205. if err != nil {
  206. br.Msg = "获取失败"
  207. br.ErrMsg = "获取数据失败,GetRaiServeSearchTagRespListBycharId Err:" + err.Error()
  208. return
  209. }
  210. }
  211. if len(list) == 0 {
  212. list = make([]*cygx.RaiServeTagResp, 0)
  213. } else {
  214. mapUniqueKey := make(map[string]bool)
  215. for _, v := range list {
  216. uniqueKey := fmt.Sprintf("K_", v.TagType, "V_", v.TagName)
  217. if mapUniqueKey[uniqueKey] {
  218. continue
  219. }
  220. v.Md5Key = utils.MD5(fmt.Sprintf("K_", v.TagType, "V_", v.TagId))
  221. mapUniqueKey[uniqueKey] = true
  222. resp.List = append(resp.List, v)
  223. }
  224. }
  225. br.Ret = 200
  226. br.Success = true
  227. br.Msg = "获取成功"
  228. br.Data = resp
  229. }
  230. // @Title 校验是否属于策略固收
  231. // @Description 校验是否属于策略固收接口
  232. // @Param ResearcherId query int false "研究员ID"
  233. // @Success 200 {object} cygx.RaiServeTagListResp
  234. // @router /rai_serve/chcck_PermissionName [get]
  235. func (this *RaiServeCoAntroller) ChcckPermissionName() {
  236. br := new(models.BaseResponse).Init()
  237. defer func() {
  238. this.Data["json"] = br
  239. this.ServeJSON()
  240. }()
  241. sysUser := this.SysUser
  242. if sysUser == nil {
  243. br.Msg = "请登录"
  244. br.ErrMsg = "请登录,SysUser Is Empty"
  245. br.Ret = 408
  246. return
  247. }
  248. researcherId := this.GetString("ResearcherId")
  249. askEmailList, err := cygx.GetAskEmailListByAdminIds(researcherId)
  250. if err != nil {
  251. br.Msg = "获取失败"
  252. br.ErrMsg = "GetAskEmailCountByCelue,Err:" + err.Error()
  253. return
  254. }
  255. var belong bool
  256. var permissionNameResp []string
  257. var permissionNames []string
  258. for _, v := range askEmailList {
  259. permissionNames = append(permissionNames, v.ChartPermissionName)
  260. if v.ChartPermissionName == "策略" || v.ChartPermissionName == "固收" {
  261. belong = true
  262. permissionNameResp = append(permissionNameResp, v.ChartPermissionName)
  263. }
  264. }
  265. var list []*cygx.RaiServeTagResp
  266. if belong {
  267. var permissionNameSql []string
  268. for _, v := range permissionNameResp {
  269. permissionNameSql = append(permissionNameSql, "'"+v+"'")
  270. }
  271. chartList, err := models.GetChartPermissionByNamesByRai(permissionNameSql)
  272. if err != nil {
  273. br.Msg = "获取失败"
  274. br.ErrMsg = "获取数据失败,GetChartPermissionByNames Err:" + err.Error()
  275. return
  276. }
  277. for _, v := range chartList {
  278. item := new(cygx.RaiServeTagResp)
  279. item.TagType = 3
  280. item.TagId = v.ChartPermissionId
  281. item.TagName = v.PermissionName
  282. item.Md5Key = utils.MD5(fmt.Sprintf("K_", item.TagType, "V_", item.TagId))
  283. list = append(list, item)
  284. }
  285. }
  286. resp := new(cygx.ChekChartPermissionNameResp)
  287. if len(list) == 0 {
  288. list = make([]*cygx.RaiServeTagResp, 0)
  289. }
  290. resp.List = list
  291. resp.Belong = belong
  292. resp.ChartPermissionName = strings.Join(permissionNameResp, ",")
  293. br.Ret = 200
  294. br.Success = true
  295. br.Msg = "获取成功"
  296. br.Data = resp
  297. }
  298. // @Title 权益服务统计列表
  299. // @Description 权益服务统计列表接口
  300. // @Param PageSize query int true "每页数据条数"
  301. // @Param CurrentIndex query int true "当前页页码,从1开始"
  302. // @Param SellerId query string false "销售id"
  303. // @Param ShareSellerId query string false "共享销售ID"
  304. // @Param ServeTypeId int int false "服务类型ID"
  305. // @Param TagType int string false "标签类型"
  306. // @Param TagId int string false "标签ID"
  307. // @Param Status query string false "客户状态,正式、未续约(除了正式之外的所有)"
  308. // @Param SortType query string true "如何排序,是正序还是倒序,枚举值:`asc 正序`,`desc 倒叙`"
  309. // @Param SortParam query string false "排序字段参数,用来排序的字段, 枚举值:'money':金额 、 'endDate':结束时间"
  310. // @Param KeyWord query string false "搜索关键词"
  311. // @Param IsExport query bool false "是否导出excel,默认是false"
  312. // @Success 200 {object} cygx.RaiServeTagListResp
  313. // @router /rai_serve/list [get]
  314. func (this *RaiServeCoAntroller) List() {
  315. br := new(models.BaseResponse).Init()
  316. defer func() {
  317. this.Data["json"] = br
  318. this.ServeJSON()
  319. }()
  320. sysUser := this.SysUser
  321. if sysUser == nil {
  322. br.Msg = "请登录"
  323. br.ErrMsg = "请登录,SysUser Is Empty"
  324. br.Ret = 408
  325. return
  326. }
  327. pageSize, _ := this.GetInt("PageSize")
  328. currentIndex, _ := this.GetInt("CurrentIndex")
  329. status := this.GetString("Status")
  330. sellerId := this.GetString("SellerId")
  331. shareSellerId := this.GetString("ShareSellerId")
  332. //排序参数
  333. sortParam := this.GetString("SortParam")
  334. sortType := this.GetString("SortType")
  335. tagType, _ := this.GetInt("TagType")
  336. tagId, _ := this.GetInt("TagId")
  337. serveTypeId, _ := this.GetInt("ServeTypeId")
  338. keyWord := this.GetString("KeyWord")
  339. isExport, _ := this.GetBool("IsExport")
  340. resp := new(cygx.CygxRaiServeCompanyListResp)
  341. if isExport {
  342. pageSize = 9999
  343. }
  344. var startSize int
  345. if pageSize <= 0 {
  346. pageSize = utils.PageSize20
  347. }
  348. if currentIndex <= 0 {
  349. currentIndex = 1
  350. }
  351. startSize = utils.StartIndex(currentIndex, pageSize)
  352. var condition string
  353. var sortStr string
  354. var pars []interface{}
  355. if status != "" {
  356. if status == "正式" {
  357. condition += " AND status = '正式' "
  358. } else {
  359. condition += " AND status != '正式' "
  360. }
  361. }
  362. if sellerId != "" {
  363. condition += " AND seller_id IN (" + sellerId + ") "
  364. //pars = append(pars, sellerId)
  365. }
  366. if shareSellerId != "" {
  367. condition += " AND share_seller_id IN (" + shareSellerId + ") "
  368. //pars = append(pars, shareSellerId)
  369. }
  370. if sortType != "" && sortParam != "" {
  371. if sortParam == "money" {
  372. sortStr = " ORDER BY money "
  373. }
  374. if sortParam == "endDate" {
  375. sortStr = " ORDER BY end_date "
  376. }
  377. if sortType == "asc" {
  378. sortStr += " ASC "
  379. } else {
  380. sortStr += " DESC "
  381. }
  382. } else {
  383. sortStr = " ORDER BY end_date DESC "
  384. }
  385. //如果不是权益管理员和admin、财务,就做可见权限限制
  386. if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_RESEARCHR {
  387. if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER {
  388. condition += " AND (seller_id = ? OR share_seller_id = ? ) "
  389. pars = append(pars, sysUser.AdminId, sysUser.AdminId)
  390. }
  391. if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
  392. condition += " AND ( seller_id = ? OR share_seller_id = ? OR group_id = ? OR share_group_id = ? ) "
  393. pars = append(pars, sysUser.AdminId, sysUser.AdminId, sysUser.GroupId, sysUser.GroupId)
  394. }
  395. }
  396. //公司名称搜索
  397. if keyWord != "" {
  398. keyWord = "%" + keyWord + "%"
  399. condition += ` AND company_name LIKE ? `
  400. pars = append(pars, keyWord)
  401. }
  402. total, err := cygx.GetCygxRaiServeCompanyCount(condition, pars)
  403. if err != nil {
  404. br.Msg = "获取失败"
  405. br.ErrMsg = "获取失败,GetCygxRaiServeCompanyCountErr:" + err.Error()
  406. return
  407. }
  408. listRaiServeCompany, err := cygx.GetCygxRaiServeCompanyList(condition+sortStr, pars, startSize, pageSize)
  409. if err != nil {
  410. br.Msg = "获取失败"
  411. br.ErrMsg = "获取失败,Err:" + err.Error()
  412. return
  413. }
  414. var companyIds []int
  415. for _, v := range listRaiServeCompany {
  416. companyIds = append(companyIds, v.CompanyId)
  417. }
  418. mapWeekAmount := make(map[string]float64) //周度服务量
  419. mapMonthAmount := make(map[string]float64) //月度服务量
  420. weeks := 4
  421. months := 3
  422. if isExport {
  423. weeks = 12 // 下载获取近12周的数据
  424. months = 6
  425. }
  426. lencompanyIds := len(companyIds)
  427. if lencompanyIds > 0 {
  428. var conditionBill string
  429. var parsBill []interface{}
  430. conditionBill, parsBill, err = getServeBillTag(tagType, tagId) // 标签ID搜索语句处理
  431. if err != nil {
  432. br.Msg = "获取信息失败!"
  433. br.ErrMsg = "获取用户信息失败-getServeBillTag!Err:" + err.Error()
  434. return
  435. }
  436. //服务类型筛选
  437. if serveTypeId > 0 {
  438. conditionBill += ` AND serve_type_id = ? `
  439. parsBill = append(parsBill, serveTypeId)
  440. }
  441. conditionBill += " AND company_id IN (" + utils.GetOrmInReplace(lencompanyIds) + ") "
  442. parsBill = append(parsBill, companyIds)
  443. listBill, err := cygx.GetCygxRaiServeBillListAll(conditionBill, parsBill)
  444. if err != nil {
  445. br.Msg = "获取信息失败!"
  446. br.ErrMsg = "获取用户信息失败-GetCygxRaiServeBillListAll!Err:" + err.Error()
  447. return
  448. }
  449. now := time.Now()
  450. for _, v := range listBill {
  451. for i := 0; i < weeks; i++ {
  452. // 计算当前周的周一
  453. monday := now.AddDate(0, 0, -int(now.Weekday()-time.Monday)-i*7)
  454. weekmonday := monday.Format(utils.FormatDate)
  455. if v.WeekStartDate == weekmonday {
  456. mapWeekAmount[fmt.Sprint("CID_", v.CompanyId, "WEEK_", i)] += v.ServeCount
  457. }
  458. }
  459. for i := 0; i < months; i++ {
  460. // 计算当前月的第一天
  461. monthday := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location()).AddDate(0, -i, 0)
  462. monthFirstDay := monthday.Format(utils.FormatDate)
  463. if v.MonthStartDate == monthFirstDay {
  464. mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", i)] += v.ServeCount
  465. }
  466. }
  467. }
  468. }
  469. for _, v := range listRaiServeCompany {
  470. item := new(cygx.CygxRaiServeCompanyResp)
  471. item.CompanyId = v.CompanyId
  472. item.CompanyName = v.CompanyName
  473. item.Money = v.Money
  474. item.ServeCoverageRate = v.ServeCoverageRate + "%"
  475. item.SellerId = v.SellerId
  476. item.SellerName = v.SellerName
  477. item.StartDate = v.StartDate
  478. item.StartDate = v.StartDate
  479. item.EndDate = v.EndDate
  480. item.ShareSeller = v.ShareSeller
  481. item.ShareSellerId = v.ShareSellerId
  482. item.Status = v.Status
  483. item.PermissionName = v.PermissionName
  484. item.IsUserMaker = v.IsUserMaker
  485. item.ThisWeekAmount = mapWeekAmount[fmt.Sprint("CID_", v.CompanyId, "WEEK_", 0)]
  486. item.LastWeekAmount = mapWeekAmount[fmt.Sprint("CID_", v.CompanyId, "WEEK_", 1)]
  487. item.TwoWeekAmount = mapWeekAmount[fmt.Sprint("CID_", v.CompanyId, "WEEK_", 2)]
  488. item.ThreeWeekAmount = mapWeekAmount[fmt.Sprint("CID_", v.CompanyId, "WEEK_", 3)]
  489. item.ThisMonthAmount = mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 0)]
  490. item.LastMonthAmount = mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 1)]
  491. item.TwoMonthAmount = mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 2)]
  492. if item.TwoMonthAmount == 0 || item.LastMonthAmount-item.TwoMonthAmount == 0 {
  493. item.LastMonthQoq = "0%" //上月环比=(上月服务量-上上月服务量)/上上月服务量,当数值≤-20%时,用红色字显示
  494. } else {
  495. item.LastMonthQoq = fmt.Sprint(utils.SubFloatToString((item.LastMonthAmount-item.TwoMonthAmount)/item.TwoMonthAmount*100, 2)) + "%"
  496. if (item.LastMonthAmount-item.TwoMonthAmount)/item.TwoMonthAmount <= -0.2 {
  497. item.LastMonthQoqIsRed = true
  498. }
  499. }
  500. resp.List = append(resp.List, item)
  501. }
  502. //导出excel
  503. if isExport {
  504. RaiServeListExport(this, resp, mapWeekAmount, mapMonthAmount, br)
  505. return
  506. }
  507. page := paging.GetPaging(currentIndex, pageSize, total)
  508. resp.Paging = page
  509. br.Ret = 200
  510. br.Success = true
  511. br.Msg = "获取成功"
  512. br.Data = resp
  513. }
  514. // EnterScoreScoreListExport 导出Excel
  515. func RaiServeListExport(this *RaiServeCoAntroller, resp *cygx.CygxRaiServeCompanyListResp, mapWeekAmount map[string]float64, mapMonthAmount map[string]float64, br *models.BaseResponse) {
  516. weeks := 12 // 下载获取近12周的数据
  517. months := 6 // 下载获取近6个月的数据
  518. mapWeekFormat := make(map[int]string)
  519. mapMonthFormat := make(map[int]string)
  520. now := time.Now()
  521. for i := 0; i < weeks; i++ {
  522. // 计算当前周的周一
  523. monday := now.AddDate(0, 0, -int(now.Weekday()-time.Monday)-i*7)
  524. sunday := monday.AddDate(0, 0, 6)
  525. weekmonday := monday.Format(utils.FormatMonthDayUnSpace2)
  526. weeksunday := sunday.Format(utils.FormatMonthDayUnSpace2)
  527. mapWeekFormat[i] = weekmonday + "~" + weeksunday
  528. }
  529. for i := 0; i < months; i++ {
  530. // 处理月份
  531. monthday := now.AddDate(0, -i, 0)
  532. mapMonthFormat[i] = fmt.Sprint(int(monthday.Month()), "月")
  533. }
  534. dir, err := os.Executable()
  535. exPath := filepath.Dir(dir)
  536. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
  537. xlsxFile := xlsx.NewFile()
  538. if err != nil {
  539. br.Msg = "生成文件失败"
  540. br.ErrMsg = "生成文件失败"
  541. return
  542. }
  543. style := xlsx.NewStyle()
  544. border := xlsx.NewBorder("thin", "thin", "thin", "thin")
  545. alignment := xlsx.Alignment{
  546. Horizontal: "center",
  547. Vertical: "center",
  548. WrapText: true,
  549. }
  550. redStyle := xlsx.NewStyle()
  551. redStyle.Alignment = alignment
  552. redStyle.ApplyAlignment = true
  553. redStyle.Font.Color = "ff0000"
  554. redStyle.Border = *border
  555. style.Alignment = alignment
  556. style.ApplyAlignment = true
  557. sheel, err := xlsxFile.AddSheet("权益服务统计")
  558. if err != nil {
  559. br.Msg = "新增Sheet失败"
  560. br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
  561. return
  562. }
  563. sheel.SetColWidth(0, 0, 30)
  564. sheel.SetColWidth(1, 1, 15)
  565. sheel.SetColWidth(2, 2, 15)
  566. sheel.SetColWidth(3, 3, 18)
  567. titleRow := sheel.AddRow()
  568. cellA := titleRow.AddCell()
  569. cellA.SetStyle(style)
  570. cellA.SetValue("客户名称")
  571. cellWeek := titleRow.AddCell()
  572. cellWeek.SetStyle(style)
  573. cellWeek.SetValue("近4周平均服务覆盖率")
  574. cellB := titleRow.AddCell()
  575. cellB.SetStyle(style)
  576. cellB.SetValue("当前状态")
  577. cellC := titleRow.AddCell()
  578. cellC.SetStyle(style)
  579. cellC.SetValue("所属销售")
  580. cellD := titleRow.AddCell()
  581. cellD.SetStyle(style)
  582. cellD.SetValue("服务销售")
  583. cellE := titleRow.AddCell()
  584. cellE.SetStyle(style)
  585. cellE.SetValue("合同期限")
  586. cellF := titleRow.AddCell()
  587. cellF.SetStyle(style)
  588. cellF.SetValue("合同金额")
  589. cellMonth1 := titleRow.AddCell()
  590. cellMonth1.SetStyle(style)
  591. cellMonth1.SetValue("本月服务量")
  592. cellMonthQoQ := titleRow.AddCell()
  593. cellMonthQoQ.SetStyle(style)
  594. cellMonthQoQ.SetValue("上月环比")
  595. cellMonth2 := titleRow.AddCell()
  596. cellMonth2.SetStyle(style)
  597. cellMonth2.SetValue("上月服务量")
  598. cellMonth3 := titleRow.AddCell()
  599. cellMonth3.SetStyle(style)
  600. cellMonth3.SetValue("上上月服务量")
  601. for i := 0; i < months; i++ {
  602. if i < 3 {
  603. continue
  604. }
  605. // 计算当前周的周一
  606. cellMonthi := titleRow.AddCell()
  607. cellMonthi.SetStyle(style)
  608. cellMonthi.SetValue(mapMonthFormat[i])
  609. }
  610. cellG := titleRow.AddCell()
  611. cellG.SetStyle(style)
  612. cellG.SetValue("签约套餐")
  613. cellWe1 := titleRow.AddCell()
  614. cellWe1.SetStyle(style)
  615. cellWe1.SetValue("本周服务量(" + mapWeekFormat[0] + ")")
  616. cellWe2 := titleRow.AddCell()
  617. cellWe2.SetStyle(style)
  618. cellWe2.SetValue("上周服务量(" + mapWeekFormat[1] + ")")
  619. cellWe3 := titleRow.AddCell()
  620. cellWe3.SetStyle(style)
  621. cellWe3.SetValue("上上周服务量(" + mapWeekFormat[2] + ")")
  622. cellWe4 := titleRow.AddCell()
  623. cellWe4.SetStyle(style)
  624. cellWe4.SetValue("上三周服务量(" + mapWeekFormat[3] + ")")
  625. for i := 0; i < weeks; i++ {
  626. if i < 4 {
  627. continue
  628. }
  629. // 计算当前周的周一
  630. cellWei := titleRow.AddCell()
  631. cellWei.SetStyle(style)
  632. cellWei.SetValue(mapWeekFormat[i])
  633. }
  634. for _, v := range resp.List {
  635. dataRow := sheel.AddRow()
  636. dataRow.SetHeight(20)
  637. cellAData := dataRow.AddCell()
  638. if v.IsUserMaker == -1 {
  639. cellAData.SetStyle(redStyle)
  640. } else {
  641. cellAData.SetStyle(style)
  642. }
  643. cellAData.SetValue(v.CompanyName)
  644. cellWeekData := dataRow.AddCell()
  645. cellWeekData.SetStyle(style)
  646. cellWeekData.SetValue(v.ServeCoverageRate)
  647. cellBData := dataRow.AddCell()
  648. cellBData.SetStyle(style)
  649. cellBData.SetValue(v.Status)
  650. cellCData := dataRow.AddCell()
  651. cellCData.SetStyle(style)
  652. cellCData.SetValue(v.SellerName)
  653. cellDData := dataRow.AddCell()
  654. cellDData.SetStyle(style)
  655. cellDData.SetValue(v.ShareSeller)
  656. cellEData := dataRow.AddCell()
  657. cellEData.SetStyle(style)
  658. cellEData.SetValue(v.StartDate + "~" + v.EndDate)
  659. cellFData := dataRow.AddCell()
  660. cellFData.SetStyle(style)
  661. cellFData.SetValue(v.Money)
  662. cellMonth1Data := dataRow.AddCell()
  663. cellMonth1Data.SetStyle(style)
  664. cellMonth1Data.SetValue(mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 0)])
  665. cellMonthQoQData := dataRow.AddCell()
  666. var cellMonthQoQStr string
  667. if mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 1)]-mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 2)] == 0 || mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 2)] == 0 {
  668. cellMonthQoQStr = "0%"
  669. } else {
  670. cellMonthQoQStr = fmt.Sprint(utils.SubFloatToString((mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 1)]-mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 2)])/mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 2)]*100, 2)) + "%"
  671. if (mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 1)]-mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 2)])/mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 2)] <= -0.2 {
  672. cellMonthQoQData.SetStyle(redStyle) //小于0.2做标红处理
  673. } else {
  674. cellMonthQoQData.SetStyle(style)
  675. }
  676. }
  677. cellMonthQoQData.SetValue(cellMonthQoQStr)
  678. for i := 0; i < months; i++ {
  679. if i == 0 {
  680. continue
  681. }
  682. cellMonthData := dataRow.AddCell()
  683. cellMonthData.SetStyle(style)
  684. cellMonthData.SetValue(mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", i)])
  685. }
  686. cellGData := dataRow.AddCell()
  687. cellGData.SetStyle(style)
  688. cellGData.SetValue(v.PermissionName)
  689. for i := 0; i < weeks; i++ {
  690. cellWeiData := dataRow.AddCell()
  691. cellWeiData.SetStyle(style)
  692. cellWeiData.SetValue(mapWeekAmount[fmt.Sprint("CID_", v.CompanyId, "WEEK_", i)])
  693. }
  694. }
  695. err = xlsxFile.Save(downLoadnFilePath)
  696. if err != nil {
  697. br.Msg = "保存文件失败"
  698. br.ErrMsg = "保存文件失败"
  699. return
  700. }
  701. randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
  702. downloadFileName := "权益服务统计导出数据_" + randStr + ".xlsx"
  703. this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
  704. defer func() {
  705. os.Remove(downLoadnFilePath)
  706. }()
  707. br.Ret = 200
  708. br.Success = true
  709. br.Msg = "导出成功"
  710. }
  711. // 标签搜索语句筛选
  712. func getServeBillTag(tagType, tagId int) (conditionBill string, parsBill []interface{}, err error) {
  713. if tagType == 0 {
  714. return
  715. }
  716. var activityIds []int
  717. var activitySpecialIds []int
  718. var articleIds []int
  719. var rsCalendarIds []int
  720. switch tagType {
  721. case 1:
  722. listGroupActivity, e := cygx.GetIndustrialActivityGroupManagementListByIndustriaId(tagId, 1) // 关联的活动
  723. if e != nil {
  724. err = errors.New("GetIndustrialActivityGroupManagementListByIndustriaId, Err: " + e.Error())
  725. return
  726. }
  727. for _, v := range listGroupActivity {
  728. activityIds = append(activityIds, v.ActivityId)
  729. }
  730. listGroupActivitySpecial, e := cygx.GetIndustrialActivityGroupManagementListByIndustriaId(tagId, 2) // 关联的产业
  731. if e != nil {
  732. err = errors.New("GetIndustrialActivityGroupManagementListByIndustriaId, Err: " + e.Error())
  733. return
  734. }
  735. for _, v := range listGroupActivitySpecial {
  736. activitySpecialIds = append(activitySpecialIds, v.ActivityId)
  737. }
  738. listGroupArticle, e := cygx.GetIndustrialArticleGroupManagementListByindustrialId(tagId) // 关联的产业
  739. if e != nil {
  740. err = errors.New("GetIndustrialArticleGroupManagementListByindustrialId, Err: " + e.Error())
  741. return
  742. }
  743. for _, v := range listGroupArticle {
  744. articleIds = append(articleIds, v.ArticleId)
  745. }
  746. listGroupRsCalendar, e := roadshow.GetRsCalendarMeetingLabelGroupDetailByTag(tagType, tagId)
  747. if e != nil {
  748. err = errors.New("GetRsCalendarMeetingLabelGroupDetailByTag, Err: " + e.Error())
  749. return
  750. }
  751. for _, v := range listGroupRsCalendar {
  752. rsCalendarIds = append(rsCalendarIds, v.RsCalendarId)
  753. }
  754. case 2:
  755. //通过ID获取标的名称
  756. detailSubjecj, e := cygx.GetIndustrialSubjectDetailById(tagId)
  757. if e != nil {
  758. err = errors.New("GetIndustrialSubjectDetailById, Err: " + e.Error())
  759. return
  760. }
  761. //通过名称获取所有相同名称的标的
  762. listSubject, e := cygx.GetListIndustrialSubjectDetailByName(detailSubjecj.SubjectName)
  763. if e != nil {
  764. err = errors.New("GetIndustrialSubjectDetailById, Err: " + e.Error())
  765. return
  766. }
  767. var industrialSubjectIds []int
  768. for _, v := range listSubject {
  769. industrialSubjectIds = append(industrialSubjectIds, v.IndustrialSubjectId)
  770. }
  771. listGroupActivity, e := cygx.GetSubjectActivityGroupManagementListBySubjectIds(industrialSubjectIds, 1) // 关联的活动
  772. if e != nil {
  773. err = errors.New("GetSubjectActivityGroupManagementListBySubjectId, Err: " + e.Error())
  774. return
  775. }
  776. for _, v := range listGroupActivity {
  777. activityIds = append(activityIds, v.ActivityId)
  778. }
  779. listGroupActivitySpecial, e := cygx.GetSubjectActivityGroupManagementListBySubjectIds(industrialSubjectIds, 2) // 关联的专项调研活动
  780. if e != nil {
  781. err = errors.New("GetSubjectActivityGroupManagementListBySubjectIds, Err: " + e.Error())
  782. return
  783. }
  784. for _, v := range listGroupActivitySpecial {
  785. activitySpecialIds = append(activitySpecialIds, v.ActivityId)
  786. }
  787. listGroupArticle, e := cygx.GetSubjectArticleGroupManagementListBysubjectIds(industrialSubjectIds) // 关联的报告
  788. if e != nil {
  789. err = errors.New("GetSubjectArticleGroupManagementListBysubjectIds, Err: " + e.Error())
  790. return
  791. }
  792. for _, v := range listGroupArticle {
  793. articleIds = append(articleIds, v.ArticleId)
  794. }
  795. listGroupRsCalendar, e := roadshow.GetRsCalendarMeetingLabelGroupDetailByTagIds(tagType, industrialSubjectIds)
  796. if e != nil {
  797. err = errors.New("GetRsCalendarMeetingLabelGroupDetailByTagIds, Err: " + e.Error())
  798. return
  799. }
  800. for _, v := range listGroupRsCalendar {
  801. rsCalendarIds = append(rsCalendarIds, v.RsCalendarId)
  802. }
  803. activityIds = append(activityIds, 0)
  804. lenactivityIds := len(activityIds)
  805. //if lenactivityIds > 0 {
  806. conditionBill += ` AND IF ( source = 'activity', source_id IN (` + utils.GetOrmInReplace(lenactivityIds) + `) , 1 = 1 ) `
  807. parsBill = append(parsBill, activityIds)
  808. //}
  809. activitySpecialIds = append(activitySpecialIds, 0)
  810. lenactivitySpecialIds := len(activitySpecialIds)
  811. //if lenactivitySpecialIds > 0 {
  812. conditionBill += ` AND IF ( source = 'activityspecial', source_id IN (` + utils.GetOrmInReplace(lenactivitySpecialIds) + `) , 1 = 1 ) `
  813. parsBill = append(parsBill, activitySpecialIds)
  814. //}
  815. articleIds = append(articleIds, 0)
  816. lenarticleIds := len(articleIds)
  817. //if lenarticleIds > 0 {
  818. conditionBill += ` AND IF ( source = 'article', source_id IN (` + utils.GetOrmInReplace(lenarticleIds) + `) , 1 = 1 ) `
  819. parsBill = append(parsBill, articleIds)
  820. //}
  821. rsCalendarIds = append(rsCalendarIds, 0)
  822. lenrsCalendarIds := len(rsCalendarIds)
  823. //if lenrsCalendarIds > 0 {
  824. conditionBill += ` AND IF ( source = 'rscalendar', source_id IN (` + utils.GetOrmInReplace(lenrsCalendarIds) + `) , 1 = 1 ) `
  825. parsBill = append(parsBill, rsCalendarIds)
  826. case 3:
  827. conditionBill += " AND chart_permission_id = ? "
  828. parsBill = append(parsBill, tagId)
  829. }
  830. //}
  831. conditionBill += ` AND source != 'yanxuanspecial' AND source != 'userfeedback' `
  832. return
  833. }
  834. // @Title 近四周覆盖率
  835. // @Description 近四周覆盖率接口
  836. // @Param CompanyId query int false "公司ID"
  837. // @Success 200 {object} cygx.RaiServeTagListResp
  838. // @router /rai_serve/coverage_rate [get]
  839. func (this *RaiServeCoAntroller) CoverageRate() {
  840. br := new(models.BaseResponse).Init()
  841. defer func() {
  842. this.Data["json"] = br
  843. this.ServeJSON()
  844. }()
  845. sysUser := this.SysUser
  846. if sysUser == nil {
  847. br.Msg = "请登录"
  848. br.ErrMsg = "请登录,SysUser Is Empty"
  849. br.Ret = 408
  850. return
  851. }
  852. companyId, _ := this.GetInt("CompanyId")
  853. listWeekBill, err := cygx.GetCygxRaiServeBillListWeek4(companyId)
  854. if err != nil {
  855. br.Msg = "获取信息失败!"
  856. br.ErrMsg = "获取用户信息失败-GetCygxRaiServeBillListWeek4!Err:" + err.Error()
  857. return
  858. }
  859. mapWeek := make(map[int]string)
  860. for k, v := range listWeekBill {
  861. mapWeek[k] = utils.SubFloatToString(v.CoverageRate, 2)
  862. }
  863. resp := new(cygx.RaiServeCoverageRateResp)
  864. resp.ThisWeekAmount = mapWeek[0] + "%"
  865. resp.LastWeekAmount = mapWeek[1] + "%"
  866. resp.TwoWeekAmount = mapWeek[2] + "%"
  867. resp.ThreeWeekAmount = mapWeek[3] + "%"
  868. br.Ret = 200
  869. br.Success = true
  870. br.Msg = "获取成功"
  871. br.Data = resp
  872. }
  873. // @Title 明细列表
  874. // @Description 明细列表接口
  875. // @Param PageSize query int true "每页数据条数"
  876. // @Param CurrentIndex query int true "当前页页码,从1开始"
  877. // @Param CompanyId query int false "公司ID"
  878. // @Param TagType query int false "标签类型"
  879. // @Param TagId query int false "标签ID"
  880. // @Param ServeTypeId int int false "服务类型ID"
  881. // @Param WhatWeek query int false "哪一周 ,1:本周、2:上周、3:上上周、4上三周"
  882. // @Param WhatMonth query int false "哪一月 ,1:本月、2:上月、3:上上月"
  883. // @Success 200 {object} cygx.RaiServeTagListResp
  884. // @router /rai_serve/bill_list [get]
  885. func (this *RaiServeCoAntroller) BillList() {
  886. br := new(models.BaseResponse).Init()
  887. defer func() {
  888. this.Data["json"] = br
  889. this.ServeJSON()
  890. }()
  891. sysUser := this.SysUser
  892. if sysUser == nil {
  893. br.Msg = "请登录"
  894. br.ErrMsg = "请登录,SysUser Is Empty"
  895. br.Ret = 408
  896. return
  897. }
  898. pageSize, _ := this.GetInt("PageSize")
  899. currentIndex, _ := this.GetInt("CurrentIndex")
  900. companyId, _ := this.GetInt("CompanyId")
  901. tagType, _ := this.GetInt("TagType")
  902. tagId, _ := this.GetInt("TagId")
  903. serveTypeId, _ := this.GetInt("ServeTypeId")
  904. whatWeek, _ := this.GetInt("WhatWeek")
  905. whatMonth, _ := this.GetInt("WhatMonth")
  906. var startSize int
  907. if pageSize <= 0 {
  908. pageSize = utils.PageSize20
  909. }
  910. if currentIndex <= 0 {
  911. currentIndex = 1
  912. }
  913. startSize = utils.StartIndex(currentIndex, pageSize)
  914. if companyId == 0 {
  915. br.Msg = "请选择对应公司ID"
  916. return
  917. }
  918. var condition string
  919. var pars []interface{}
  920. var err error
  921. condition, pars, err = getServeBillTag(tagType, tagId) // 标签ID搜索语句处理
  922. if err != nil {
  923. br.Msg = "获取信息失败!"
  924. br.ErrMsg = "获取用户信息失败-getServeBillTag!Err:" + err.Error()
  925. return
  926. }
  927. if whatWeek > 0 {
  928. now := time.Now()
  929. // 计算所选周的周一
  930. monday := now.AddDate(0, 0, -int(now.Weekday()-time.Monday)-(whatWeek-1)*7)
  931. condition += " AND week_start_date = ? "
  932. pars = append(pars, monday.Format(utils.FormatDate))
  933. }
  934. if whatMonth > 0 {
  935. now := time.Now()
  936. // 计算所选月份的第一天
  937. monthday := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location()).AddDate(0, -whatMonth+1, 0)
  938. condition += " AND month_start_date = ? "
  939. pars = append(pars, monthday.Format(utils.FormatDate))
  940. }
  941. condition += " AND company_id = ? "
  942. pars = append(pars, companyId)
  943. if serveTypeId > 0 {
  944. condition += " AND serve_type_id = ? "
  945. pars = append(pars, serveTypeId)
  946. }
  947. total, err := cygx.GetCygxRaiServeBillCount(condition, pars)
  948. if err != nil {
  949. br.Msg = "获取失败"
  950. br.ErrMsg = "获取失败,GetCygxRaiServeBillCount:" + err.Error()
  951. return
  952. }
  953. list, err := cygx.GetCygxRaiServeBillRespList(condition, pars, startSize, pageSize)
  954. if err != nil {
  955. br.Msg = "获取失败"
  956. br.ErrMsg = "获取失败,GetCygxRaiServeBillRespList:" + err.Error()
  957. return
  958. }
  959. page := paging.GetPaging(currentIndex, pageSize, total)
  960. resp := new(cygx.CygxRaiServeBillListResp)
  961. resp.Paging = page
  962. if len(list) == 0 {
  963. resp.List = make([]*cygx.CygxRaiServeBillResp, 0)
  964. } else {
  965. var activityIds []int
  966. var activitySpecialIds []int
  967. var articleIds []int
  968. var rsCalendarIds []int
  969. for _, v := range list {
  970. switch v.Source {
  971. case utils.CYGX_OBJ_ARTICLE:
  972. articleIds = append(articleIds, v.SourceId)
  973. case utils.CYGX_OBJ_ACTIVITY:
  974. activityIds = append(activityIds, v.SourceId)
  975. case utils.CYGX_OBJ_ACTIVITYSPECIAL:
  976. activitySpecialIds = append(activitySpecialIds, v.SourceId)
  977. case utils.CYGX_OBJ_RS_CALENDAR:
  978. rsCalendarIds = append(rsCalendarIds, v.SourceId)
  979. case utils.CYGX_OBJ_ACTIVITYVIDEO:
  980. activityIds = append(activityIds, v.ActivityId)
  981. case utils.CYGX_OBJ_ACTIVITYVOICE:
  982. activityIds = append(activityIds, v.ActivityId)
  983. }
  984. if v.ServeTypeName == "阅读uv" {
  985. v.ServeTypeName = "报告阅读uv" //服务类型名称做一下,映射修改
  986. }
  987. }
  988. maparticleIndustrialLabel := make(map[int][]string) //文章产业标签
  989. maparticleSubjectLabel := make(map[int][]string) // 文章行业标签
  990. if len(articleIds) > 0 {
  991. maparticleIndustrialLabel = cygxService.GetArticleIndustrialLabelByArticleId(articleIds) // 关联产业
  992. maparticleSubjectLabel = cygxService.GetArticleSubjectLabelByArticleId(articleIds) // 关联标的
  993. }
  994. mapActivityIndustrialLabel := make(map[int][]string) //活动产业标签
  995. mapActivitySubjectLabel := make(map[int][]string) //活动标的标签
  996. mapActivityIndustrialLabel = cygxService.GetActivityIndustrialLabelByActivityIds(activityIds, 1)
  997. mapActivitySubjectLabel = cygxService.GetActivitySubjectLabelByActivityIds(activityIds, 1)
  998. mapActivitySpeicalIndustrialLabel := make(map[int][]string) //活动产业标签
  999. mapActivitySpeicalSubjectLabel := make(map[int][]string) //活动标的标签
  1000. mapActivitySpeicalIndustrialLabel = cygxService.GetActivityIndustrialLabelByActivityIds(activityIds, 2)
  1001. mapActivitySpeicalSubjectLabel = cygxService.GetActivitySubjectLabelByActivityIds(activityIds, 2)
  1002. mapRsCalendarLabel := make(map[int][]string) //1v1 路演标签
  1003. mapRsCalendarLabel = cygxService.GetRsCalendarLabelByRsCalendarIds(rsCalendarIds)
  1004. for _, v := range list {
  1005. switch v.Source {
  1006. case utils.CYGX_OBJ_ARTICLE:
  1007. if v.ChartPermissionName == utils.GU_SHOU_NAME || v.ChartPermissionName == utils.CE_LUE_NAME {
  1008. v.Tag = v.ChartPermissionName
  1009. } else {
  1010. v.Tag = strings.Join(maparticleIndustrialLabel[v.SourceId], ",")
  1011. if len(maparticleSubjectLabel[v.SourceId]) > 0 {
  1012. v.Tag += "," + strings.Join(maparticleSubjectLabel[v.SourceId], ",")
  1013. }
  1014. }
  1015. case utils.CYGX_OBJ_ACTIVITY:
  1016. if v.ChartPermissionName == utils.GU_SHOU_NAME || v.ChartPermissionName == utils.CE_LUE_NAME {
  1017. v.Tag = v.ChartPermissionName
  1018. } else {
  1019. v.Tag = strings.Join(mapActivityIndustrialLabel[v.SourceId], ",")
  1020. if len(mapActivitySubjectLabel[v.SourceId]) > 0 {
  1021. v.Tag += "," + strings.Join(mapActivitySubjectLabel[v.SourceId], ",")
  1022. }
  1023. }
  1024. case utils.CYGX_OBJ_ACTIVITYSPECIAL:
  1025. if v.ChartPermissionName == utils.GU_SHOU_NAME || v.ChartPermissionName == utils.CE_LUE_NAME {
  1026. v.Tag = v.ChartPermissionName
  1027. } else {
  1028. v.Tag = strings.Join(mapActivitySpeicalIndustrialLabel[v.SourceId], ",")
  1029. if len(mapActivitySpeicalSubjectLabel[v.SourceId]) > 0 {
  1030. v.Tag += "," + strings.Join(mapActivitySpeicalSubjectLabel[v.SourceId], ",")
  1031. }
  1032. }
  1033. case utils.CYGX_OBJ_RS_CALENDAR:
  1034. if v.ChartPermissionName == utils.GU_SHOU_NAME || v.ChartPermissionName == utils.CE_LUE_NAME {
  1035. v.Tag = v.ChartPermissionName
  1036. } else {
  1037. v.Tag = strings.Join(mapRsCalendarLabel[v.SourceId], ",")
  1038. }
  1039. case utils.CYGX_OBJ_ACTIVITYVIDEO:
  1040. if v.ChartPermissionName == utils.GU_SHOU_NAME || v.ChartPermissionName == utils.CE_LUE_NAME {
  1041. v.Tag = v.ChartPermissionName
  1042. } else {
  1043. v.Tag = strings.Join(mapActivityIndustrialLabel[v.ActivityId], ",")
  1044. if len(mapActivitySubjectLabel[v.ActivityId]) > 0 {
  1045. v.Tag += "," + strings.Join(mapActivitySubjectLabel[v.ActivityId], ",")
  1046. }
  1047. }
  1048. case utils.CYGX_OBJ_ACTIVITYVOICE:
  1049. if v.ChartPermissionName == utils.GU_SHOU_NAME || v.ChartPermissionName == utils.CE_LUE_NAME {
  1050. v.Tag = v.ChartPermissionName
  1051. } else {
  1052. v.Tag = strings.Join(mapActivityIndustrialLabel[v.ActivityId], ",")
  1053. if len(mapActivitySubjectLabel[v.ActivityId]) > 0 {
  1054. v.Tag += "," + strings.Join(mapActivitySubjectLabel[v.ActivityId], ",")
  1055. }
  1056. }
  1057. }
  1058. }
  1059. resp.List = list
  1060. }
  1061. br.Ret = 200
  1062. br.Success = true
  1063. br.Msg = "获取成功"
  1064. br.Data = resp
  1065. }
  1066. // AddCompanyHistoryRemark
  1067. // @Title 新增历史备注
  1068. // @Description 新增历史备注
  1069. // @Param request body company.CompanyHistoryRemarkReq true "type json string"
  1070. // @Success 200 编辑成功
  1071. // @router /rai_serve/remark/add [post]
  1072. func (this *RaiServeCoAntroller) AddRemark() {
  1073. br := new(models.BaseResponse).Init()
  1074. defer func() {
  1075. this.Data["json"] = br
  1076. this.ServeJSON()
  1077. }()
  1078. sysUser := this.SysUser
  1079. if sysUser == nil {
  1080. br.Msg = "请登录"
  1081. br.ErrMsg = "请登录,SysUser Is Empty"
  1082. br.Ret = 408
  1083. return
  1084. }
  1085. var req company.CompanyHistoryRemarkReq
  1086. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  1087. if err != nil {
  1088. br.Msg = "参数解析异常!"
  1089. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  1090. return
  1091. }
  1092. if req.CompanyId <= 0 {
  1093. br.Msg = "参数缺失"
  1094. br.ErrMsg = "参数缺失,客户编号未传!"
  1095. return
  1096. }
  1097. if req.Content == "" {
  1098. br.Msg = "参数缺失"
  1099. br.ErrMsg = "参数缺失,备注说明未传!"
  1100. return
  1101. }
  1102. var productId int
  1103. //var productName string
  1104. if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_TEAM || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP {
  1105. br.Msg = "角色类型错误"
  1106. br.ErrMsg = "角色类型错误,该角色不能添加备注!"
  1107. return
  1108. }
  1109. productId = 2
  1110. item := new(company.CompanyHistoryRemark)
  1111. item.CompanyId = req.CompanyId
  1112. item.ProductId = productId
  1113. item.Content = req.Content
  1114. item.SysAdminId = sysUser.AdminId
  1115. item.SysAdminName = sysUser.RealName
  1116. item.CreateTime = time.Now()
  1117. item.ModifyTime = time.Now()
  1118. item.ShowTime = time.Now()
  1119. item.TableName = "company_history_remark"
  1120. err = company.AddCompanyHistoryRemark(item)
  1121. //{
  1122. // approveContent := req.Remark
  1123. // remark := "新增备注"
  1124. // operation := "add_remark"
  1125. // services.AddCompanyOperationRecord(req.CompanyId, companyProduct.SellerId, sysUser.AdminId, companyProduct.ProductId, sysUser.AdminId, companyProduct.CompanyName,
  1126. // companyProduct.ProductName, sysUser.RealName, remark, operation, approveContent, sysUser.RealName, "", companyProduct.Status)
  1127. //}
  1128. if err != nil {
  1129. br.Msg = "编辑失败"
  1130. br.ErrMsg = "编辑失败,Err:" + err.Error()
  1131. }
  1132. br.Ret = 200
  1133. br.Success = true
  1134. br.Msg = "编辑成功"
  1135. }
  1136. // RemarkList 备注列表
  1137. // @Title 备注列表
  1138. // @Description 备注列表
  1139. // @Param CompanyId query string true "客户id"
  1140. // @Success 200 {object} company.RemarkResp
  1141. // @router /rai_serve/remark/list [get]
  1142. func (this *RaiServeCoAntroller) RemarkList() {
  1143. br := new(models.BaseResponse).Init()
  1144. defer func() {
  1145. this.Data["json"] = br
  1146. this.ServeJSON()
  1147. }()
  1148. sysUser := this.SysUser
  1149. if sysUser == nil {
  1150. br.Msg = "请登录"
  1151. br.ErrMsg = "请登录,SysUser Is Empty"
  1152. br.Ret = 408
  1153. return
  1154. }
  1155. companyId := this.GetString("CompanyId")
  1156. var remarkList []*company.CompanyHistoryRemark
  1157. var err error
  1158. groupFicc := []string{
  1159. utils.ROLE_TYPE_CODE_FICC_SELLER, utils.ROLE_TYPE_CODE_FICC_TEAM, utils.ROLE_TYPE_CODE_FICC_GROUP,
  1160. utils.ROLE_TYPE_CODE_FICC_DEPARTMENT, utils.ROLE_TYPE_CODE_FICC_ADMIN,
  1161. }
  1162. if utils.InArrayByStr(groupFicc, sysUser.RoleTypeCode) {
  1163. br.Msg = "角色类型错误"
  1164. br.ErrMsg = "角色类型错误,该角色不能添加备注!"
  1165. return
  1166. }
  1167. remarkList, err = company.GetCompanyHistoryRemarkList(companyId, "2")
  1168. if err != nil {
  1169. br.Msg = "获取失败"
  1170. br.ErrMsg = "获取失败,Err:" + err.Error()
  1171. return
  1172. }
  1173. resp := new(company.CompanyHistoryRemarkListResp)
  1174. for _, v := range remarkList {
  1175. item := new(company.CompanyHistoryRemarkResp)
  1176. item.CompanyId = v.CompanyId
  1177. item.Content = v.Content
  1178. item.SysAdminName = v.SysAdminName
  1179. item.CreateTime = v.ShowTime.Format(utils.FormatDateTime)
  1180. switch v.TableName {
  1181. case "company_service_record":
  1182. item.RemarkType = "沟通记录"
  1183. case "company_product_remark":
  1184. item.RemarkType = "备注"
  1185. case "company_no_renewed_note":
  1186. item.RemarkType = "未续约备注"
  1187. case "company_renewal_reason":
  1188. item.RemarkType = "未续约说明"
  1189. case "cygx_user_feedback":
  1190. item.RemarkType = "交流反馈(" + v.RealName + ")"
  1191. default:
  1192. item.RemarkType = "备注"
  1193. }
  1194. resp.List = append(resp.List, item)
  1195. }
  1196. br.Ret = 200
  1197. br.Success = true
  1198. br.Msg = "获取成功"
  1199. br.Data = resp
  1200. }