company_share.go 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/rdlucklib/rdluck_tools/paging"
  6. "hongze/hz_crm_api/models"
  7. "hongze/hz_crm_api/models/company"
  8. "hongze/hz_crm_api/models/system"
  9. "hongze/hz_crm_api/services"
  10. "hongze/hz_crm_api/utils"
  11. "strconv"
  12. "strings"
  13. "time"
  14. )
  15. // @Title 设置共享客户
  16. // @Description 设置共享客户接口
  17. // @Param request body company.CompanyShareReq true "type json string"
  18. // @Success Ret=200 设置成功
  19. // @router /share [post]
  20. func (this *CompanyController) CompanyShare() {
  21. br := new(models.BaseResponse).Init()
  22. defer func() {
  23. this.Data["json"] = br
  24. this.ServeJSON()
  25. }()
  26. sysUser := this.SysUser
  27. if sysUser == nil {
  28. br.Msg = "请登录"
  29. br.ErrMsg = "请登录,SysUser Is Empty"
  30. br.Ret = 408
  31. return
  32. }
  33. var req company.CompanyShareReq
  34. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  35. if err != nil {
  36. br.Msg = "参数解析异常!"
  37. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  38. return
  39. }
  40. if req.CompanyId <= 0 {
  41. br.Msg = "参数异常!"
  42. br.ErrMsg = "CompanyId:" + strconv.Itoa(req.CompanyId)
  43. return
  44. }
  45. if req.IsShare < 0 {
  46. br.Msg = "参数异常!"
  47. br.ErrMsg = "IsShare:" + strconv.Itoa(req.IsShare)
  48. return
  49. }
  50. //查询该客户
  51. companyItem, err := company.GetCompanyById(req.CompanyId)
  52. if err != nil {
  53. br.Msg = "查找客户失败"
  54. br.ErrMsg = "查找客户失败,Err:" + err.Error()
  55. return
  56. }
  57. //待更新字段
  58. updateCol := make([]string, 0)
  59. companyItem.IsShare = req.IsShare
  60. updateCol = append(updateCol, "IsShare")
  61. if req.IsShare == 0 {
  62. companyItem.ShareSeller = ""
  63. companyItem.ShareSellerId = 0
  64. updateCol = append(updateCol, "ShareSeller", "ShareSellerId")
  65. }
  66. err = companyItem.Update(updateCol)
  67. if err != nil {
  68. br.Msg = "修改客户信息失败"
  69. br.ErrMsg = "修改客户信息失败,Err:" + err.Error()
  70. return
  71. }
  72. //新增操作记录
  73. //{
  74. // remark := "移动到:" + seller.RealName
  75. // operation := "move_seller"
  76. // services.AddCompanyOperationRecord(req.CompanyId, seller.AdminId, sysUser.AdminId, productId, sysUser.AdminId, cp.CompanyName,
  77. // cp.ProductName, sysUser.RealName, remark, operation, "", sysUser.RealName, "", cp.Status)
  78. //}
  79. br.Ret = 200
  80. br.Success = true
  81. br.Msg = "设置成功"
  82. }
  83. // @Title 共享客户列表
  84. // @Description 共享客户列表接口
  85. // @Param SellerId query string false "选择的销售id"
  86. // @Param Keyword query string true "搜索关键词"
  87. // @Param ListParam query int false "筛选字段参数,用来筛选的字段, 枚举值:0:全部 、 1:已分配 、 2:未分配 "
  88. // @Param SortParam query string false "排序字段参数,用来排序的字段, 枚举值:'viewTotal':总阅读次数 、 'viewTime':阅读时间 、 'roadShowTotal':累计路演次数 、`expireDay:到期时间` 、 `createTime:创建时间` 、 'formalTime': 转正时间 、 'freezeTime':冻结时间 、'lossTime':流失时间 、'tryOutDay':试用天数"
  89. // @Param SortType query string true "如何排序,是正序还是倒序,枚举值:`asc 正序`,`desc 倒叙`"
  90. // @Param PageSize query int true "每页数据条数"
  91. // @Param CurrentIndex query int true "当前页页码,从1开始"
  92. // @Success Ret=200 设置成功
  93. // @router /share/list [get]
  94. func (this *CompanyController) CompanyShareList() {
  95. br := new(models.BaseResponse).Init()
  96. defer func() {
  97. this.Data["json"] = br
  98. this.ServeJSON()
  99. }()
  100. sysUser := this.SysUser
  101. if sysUser == nil {
  102. br.Msg = "请登录"
  103. br.ErrMsg = "请登录,SysUser Is Empty"
  104. br.Ret = 408
  105. return
  106. }
  107. pageSize, _ := this.GetInt("PageSize")
  108. currentIndex, _ := this.GetInt("CurrentIndex")
  109. sellerIds := this.GetString("SellerId")
  110. keyword := this.GetString("Keyword")
  111. //排序参数
  112. sortParam := this.GetString("SortParam")
  113. listParam, _ := this.GetInt("ListParam")
  114. sortType := this.GetString("SortType")
  115. var total int
  116. page := paging.GetPaging(currentIndex, pageSize, total)
  117. var startSize int
  118. if pageSize <= 0 {
  119. pageSize = utils.PageSize20
  120. }
  121. if currentIndex <= 0 {
  122. currentIndex = 1
  123. }
  124. startSize = paging.StartIndex(currentIndex, pageSize)
  125. var condition string
  126. var pars []interface{}
  127. if keyword != "" {
  128. companyIdStr, err := company.GetCompanyIdByKeyWord(keyword)
  129. if err != nil {
  130. br.Msg = "获取客户信息失败"
  131. br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
  132. return
  133. }
  134. if companyIdStr != "" {
  135. condition += ` AND (a.company_name LIKE '%` + keyword + `%' OR a.credit_code LIKE '%` + keyword + `%' OR a.company_id IN(` + companyIdStr + `)) `
  136. } else {
  137. condition += ` AND (a.company_name LIKE '%` + keyword + `%' OR a.credit_code LIKE '%` + keyword + `%' ) `
  138. }
  139. }
  140. roleTypeCode := sysUser.RoleTypeCode
  141. productId := services.GetProductId(roleTypeCode)
  142. //权限控制
  143. {
  144. //如果不是超级管理员或者财务
  145. if roleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && roleTypeCode != utils.ROLE_TYPE_CODE_FINANCE {
  146. //如果是部门管理员
  147. if roleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
  148. condition += ` AND b.product_id=? `
  149. pars = append(pars, productId)
  150. } else {
  151. condition += ` AND b.product_id=? `
  152. pars = append(pars, productId)
  153. }
  154. if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.AdminId != 66 && sysUser.AdminId != 15 {
  155. condition += ` AND a.share_seller_id=? `
  156. pars = append(pars, sysUser.AdminId)
  157. }
  158. }
  159. }
  160. if listParam == 1 {
  161. condition += ` AND a.share_seller <> '' AND a.is_share=1 `
  162. } else if listParam == 2 {
  163. condition += ` AND a.share_seller = '' AND a.is_share=1 `
  164. } else {
  165. condition += ` AND a.is_share=1 `
  166. }
  167. if sellerIds != "" {
  168. condition += ` AND a.share_seller_id IN (` + sellerIds + `) `
  169. }
  170. total, err := company.GetShareCompanyListCount(condition, pars)
  171. if err != nil {
  172. br.Msg = "获取失败"
  173. br.ErrMsg = "获取数据总数失败,Err:" + err.Error()
  174. return
  175. }
  176. sortStr := ``
  177. if sortParam != "" && sortType != "" {
  178. if sortParam == "expireDay" {
  179. if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
  180. if sortType == "asc" {
  181. sortStr = " ORDER BY min_end_date"
  182. } else {
  183. sortStr = " ORDER BY max_end_date"
  184. }
  185. } else {
  186. sortStr = " ORDER BY b.end_date "
  187. }
  188. } else if sortParam == "createTime" {
  189. sortStr = " ORDER BY a.created_time "
  190. } else if sortParam == "viewTotal" {
  191. if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
  192. sortStr = " ORDER BY all_view_total"
  193. } else {
  194. sortStr = " ORDER BY b.view_total "
  195. }
  196. } else if sortParam == "viewTime" {
  197. if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
  198. if sortType == "asc" {
  199. sortStr = " ORDER BY min_last_view_time"
  200. } else {
  201. sortStr = " ORDER BY max_last_view_time"
  202. }
  203. } else {
  204. sortStr = " ORDER BY b.last_view_time "
  205. }
  206. } else if sortParam == "roadShowTotal" {
  207. sortStr = " ORDER BY b.road_show_total "
  208. } else if sortParam == "formalTime" {
  209. sortStr = " ORDER BY b.formal_time "
  210. } else if sortParam == "freezeTime" {
  211. sortStr = " ORDER BY b.freeze_time "
  212. } else if sortParam == "lossTime" {
  213. sortStr = " ORDER BY b.loss_time "
  214. } else if sortParam == "todoCreateTime" {
  215. sortStr = " ORDER BY b.todo_create_time "
  216. } else if sortParam == "todoApproveTime" {
  217. sortStr = " ORDER BY b.todo_approve_time "
  218. } else if sortParam == "tryOutDay" {
  219. if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
  220. sortStr = " ORDER BY all_try_out_day_total "
  221. } else {
  222. sortStr = " ORDER BY b.try_out_day_total "
  223. }
  224. } else if sortParam == "lastServiceTime" {
  225. // 最新服务时间
  226. sortStr = ` ORDER BY last_service_time `
  227. } else if sortParam == "serviceTimes" {
  228. // 服务次数
  229. sortStr = ` ORDER BY service_times `
  230. } else {
  231. br.Msg = "获取失败"
  232. br.ErrMsg = "排序字段传入数据异常:" + sortParam
  233. return
  234. }
  235. sortStr += fmt.Sprintf(` %s`, sortType)
  236. } else {
  237. if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
  238. sortStr = " ORDER BY sort_status asc, all_view_total desc, a.created_time "
  239. } else {
  240. sortStr = " ORDER BY sort_status asc, b.view_total desc, a.created_time "
  241. }
  242. sortStr += " DESC "
  243. }
  244. list, err := company.GetShareCompanyList(condition, sortStr, pars, startSize, pageSize)
  245. if err != nil {
  246. br.Msg = "获取失败"
  247. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  248. return
  249. }
  250. //企业用户数组切片
  251. companyIds := make([]int, 0)
  252. companyIdSlice := make([]string, 0)
  253. for _, v := range list {
  254. companyIds = append(companyIds, v.CompanyId)
  255. companyIdSlice = append(companyIdSlice, strconv.Itoa(v.CompanyId))
  256. }
  257. //企业用户产品开通数
  258. companyIdStr := strings.Join(companyIdSlice, ",")
  259. companyProductTotalList, _ := company.GetCountProductByCompanyIds(companyIdStr)
  260. companyProductTotalMap := make(map[int]*company.CompanyProductTotalSlice)
  261. for _, companyProductTotal := range companyProductTotalList {
  262. companyProductTotalMap[companyProductTotal.CompanyId] = companyProductTotal
  263. }
  264. lenList := len(list)
  265. // 客户产品详细信息
  266. companyProductMap := make(map[string]*company.CompanyProduct)
  267. var companyProductCondition string
  268. var companyProductPars []interface{}
  269. companyProductList, err := company.GetCompanyProductsByCompanyIds(companyIdStr, companyProductCondition, companyProductPars)
  270. if err != nil {
  271. br.Msg = "获取失败"
  272. br.ErrMsg = "获取客户产品数据失败,Err:" + err.Error()
  273. return
  274. }
  275. for _, companyProduct := range companyProductList {
  276. key := fmt.Sprint(companyProduct.CompanyId, "_", companyProduct.ProductId)
  277. companyProductMap[key] = companyProduct
  278. }
  279. // 查询当前销售是否有领取客户的权限
  280. //receiveEnabled, _ := services.CheckCompanyReceiveButton(sysUser.AdminId)
  281. for i := 0; i < lenList; i++ {
  282. item := list[i]
  283. //校验该客户是否存在多个产品,如果是,那么代表是共享客户
  284. if companyProductTotal, ok := companyProductTotalMap[int(item.CompanyId)]; ok {
  285. if companyProductTotal.Total > 1 {
  286. list[i].IsShared = true
  287. }
  288. }
  289. var expireDay string
  290. itemStatus := item.Status
  291. if itemStatus != "" {
  292. if !strings.Contains(item.Status, "/") {
  293. if itemStatus == utils.COMPANY_STATUS_FOREVER { //永续
  294. expireDay = "-"
  295. } else if itemStatus == utils.COMPANY_STATUS_TRY_OUT || itemStatus == utils.COMPANY_STATUS_FORMAL { //试用/正式
  296. if item.StartDate != "" && item.EndDate != "" {
  297. endDateTime, _ := time.Parse(utils.FormatDate, item.EndDate)
  298. endDateTime = endDateTime.AddDate(0, 0, 1)
  299. sub := endDateTime.Sub(time.Now())
  300. if sub < 0 {
  301. sub = 0
  302. }
  303. expireDay = fmt.Sprintf("%v", int(sub.Hours()/24))
  304. } else {
  305. expireDay = "-"
  306. }
  307. } else if itemStatus == utils.COMPANY_STATUS_LOSE {
  308. expireDay = "-"
  309. } else if itemStatus == utils.COMPANY_STATUS_FREEZE {
  310. if item.StartDate != "" && item.EndDate != "" {
  311. endDateTime, _ := time.Parse(utils.FormatDate, item.EndDate)
  312. endDateTime = endDateTime.AddDate(0, 0, 0)
  313. sub := endDateTime.Sub(time.Now())
  314. if sub < 0 {
  315. sub = 0
  316. }
  317. expireDay = fmt.Sprintf("%v", int(sub.Hours()/24))
  318. } else {
  319. expireDay = "-"
  320. }
  321. } else {
  322. expireDay = "-"
  323. }
  324. } else {
  325. tmpStatusArr := strings.Split(item.Status, "/")
  326. ficcStatus := tmpStatusArr[0]
  327. raiStatus := tmpStatusArr[1]
  328. var ficcEndDate, tryEndDate string
  329. var ficcExpireDay, tryExpireDay string
  330. if item.EndDate != "" {
  331. endDateArr := strings.Split(item.EndDate, "/")
  332. if len(endDateArr) == 1 {
  333. ficcEndDate = endDateArr[0]
  334. } else if len(endDateArr) > 1 {
  335. ficcEndDate = endDateArr[0]
  336. tryEndDate = endDateArr[1]
  337. }
  338. if ficcStatus == utils.COMPANY_STATUS_FOREVER { //永续
  339. ficcExpireDay = "-"
  340. } else if ficcStatus == utils.COMPANY_STATUS_TRY_OUT || ficcStatus == utils.COMPANY_STATUS_FORMAL { //试用/正式
  341. if ficcEndDate != "" {
  342. endDateTime, _ := time.Parse(utils.FormatDate, ficcEndDate)
  343. endDateTime = endDateTime.AddDate(0, 0, 1)
  344. sub := endDateTime.Sub(time.Now())
  345. if sub < 0 {
  346. sub = 0
  347. }
  348. ficcExpireDay = fmt.Sprintf("%v", int(sub.Hours()/24))
  349. } else {
  350. ficcExpireDay = "-"
  351. }
  352. } else if ficcStatus == utils.COMPANY_STATUS_LOSE { //流失
  353. ficcExpireDay = "-"
  354. } else if ficcStatus == utils.COMPANY_STATUS_FREEZE { //冻结
  355. if item.StartDate != "" && item.EndDate != "" {
  356. endDateTime, _ := time.Parse(utils.FormatDate, ficcEndDate)
  357. endDateTime = endDateTime.AddDate(0, 0, 0)
  358. sub := endDateTime.Sub(time.Now())
  359. if sub < 0 {
  360. sub = 0
  361. }
  362. ficcExpireDay = fmt.Sprintf("%v", int(sub.Hours()/24))
  363. } else {
  364. ficcExpireDay = "-"
  365. }
  366. } else {
  367. ficcExpireDay = "-"
  368. }
  369. if raiStatus == utils.COMPANY_STATUS_FOREVER { //永续
  370. tryExpireDay = "-"
  371. } else if raiStatus == utils.COMPANY_STATUS_TRY_OUT || raiStatus == utils.COMPANY_STATUS_FORMAL { //试用/正式
  372. if tryEndDate != "" {
  373. endDateTime, _ := time.Parse(utils.FormatDate, tryEndDate)
  374. endDateTime = endDateTime.AddDate(0, 0, 1)
  375. sub := endDateTime.Sub(time.Now())
  376. if sub < 0 {
  377. sub = 0
  378. }
  379. tryExpireDay = fmt.Sprintf("%v", int(sub.Hours()/24))
  380. } else {
  381. tryExpireDay = "-"
  382. }
  383. } else if raiStatus == utils.COMPANY_STATUS_LOSE { //流失
  384. tryExpireDay = "-"
  385. } else if raiStatus == utils.COMPANY_STATUS_FREEZE { //冻结
  386. if item.StartDate != "" && item.EndDate != "" {
  387. endDateTime, _ := time.Parse(utils.FormatDate, tryEndDate)
  388. endDateTime = endDateTime.AddDate(0, 0, 0)
  389. sub := endDateTime.Sub(time.Now())
  390. if sub < 0 {
  391. sub = 0
  392. }
  393. tryExpireDay = fmt.Sprintf("%v", int(sub.Hours()/24))
  394. } else {
  395. tryExpireDay = "-"
  396. }
  397. } else {
  398. tryExpireDay = "-"
  399. }
  400. }
  401. expireDay = ficcExpireDay + "/" + tryExpireDay
  402. }
  403. }
  404. list[i].ExpireDay = expireDay
  405. //按钮显示控制
  406. btnItem := new(company.ButtonPermission)
  407. if item.CompanyId != 1 {
  408. //*btnItem = services.GetCompanyPermissionButton(roleTypeCode, itemStatus, item.GroupIds, item.GroupIds, item.GroupId, sysUser.GroupId, item.SellerId, sysUser.AdminId, sysUser.Authority, item.ProductId, item.ShareSellerId)
  409. //根据销售"领取客户"的权限对部分按钮做限制
  410. //btnItem = services.GetCompanyPermissionButtonByReceiveEnabled(btnItem, receiveEnabled)
  411. // 13.6正式客户共享按钮显示控制
  412. btnItem = services.GetShareCompanyPermissionButton(roleTypeCode, itemStatus, item.ProductId)
  413. }
  414. list[i].BtnItem = btnItem
  415. if item.FreezeStartDate != "" && item.FreezeEndDate != "" && item.Status == utils.COMPANY_STATUS_FREEZE {
  416. freezeEndDate, _ := time.Parse(utils.FormatDate, item.FreezeEndDate)
  417. if time.Now().Before(freezeEndDate) {
  418. expireDays := freezeEndDate.Sub(time.Now()).Hours() / 24
  419. list[i].FreezeExpireDays = int(expireDays) + 1
  420. }
  421. }
  422. ficcKey := fmt.Sprint(item.CompanyId, "_", 1)
  423. //ficc
  424. if tmpCompanyProduct, ok := companyProductMap[ficcKey]; ok {
  425. //套餐类型
  426. item.FiccPackageType = tmpCompanyProduct.PackageType
  427. //总试用天数
  428. item.FiccTryOutDay = tmpCompanyProduct.TryOutDayTotal
  429. //总阅读次数
  430. item.FiccView = tmpCompanyProduct.ViewTotal
  431. if !tmpCompanyProduct.LastViewTime.IsZero() {
  432. //最近一次阅读时间
  433. item.FiccLastViewTime = tmpCompanyProduct.LastViewTime.Format(utils.FormatDateTime)
  434. }
  435. }
  436. //权益
  437. raiKey := fmt.Sprint(item.CompanyId, "_", 2)
  438. if tmpCompanyProduct, ok := companyProductMap[raiKey]; ok {
  439. //总阅读次数
  440. item.RaiView = tmpCompanyProduct.ViewTotal
  441. //总试用天数
  442. item.RaiTryOutDay = tmpCompanyProduct.TryOutDayTotal
  443. if !tmpCompanyProduct.LastViewTime.IsZero() {
  444. //最近一次阅读时间
  445. item.RaiLastViewTime = tmpCompanyProduct.LastViewTime.Format(utils.FormatDateTime)
  446. }
  447. }
  448. }
  449. companyLists := make([]*company.CompanyListItem, 0)
  450. //查询阅读次数
  451. if list == nil {
  452. companyLists = make([]*company.CompanyListItem, 0)
  453. } else {
  454. for _, v := range list {
  455. //viewTotal:=GetviewTotal(v.CompanyId)
  456. //活跃(客户状态)
  457. tmpStatus := v.Status
  458. if v.IsShare == 1 {
  459. tmpStatus = v.Status + "(共享)"
  460. }
  461. companyList := &company.CompanyListItem{
  462. CompanyId: v.CompanyId,
  463. CompanyName: v.CompanyName,
  464. CreditCode: v.CreditCode,
  465. CompanyCode: v.CompanyCode,
  466. StartDate: v.StartDate,
  467. EndDate: v.EndDate,
  468. LoseReason: v.LoseReason,
  469. RenewalReason: v.RenewalReason,
  470. FreezeReason: v.FreezeReason,
  471. LossTime: v.LossTime,
  472. Status: tmpStatus,
  473. CompanyType: v.CompanyType,
  474. ApproveStatus: v.ApproveStatus,
  475. SellerName: v.SellerName,
  476. SellerId: v.SellerId,
  477. SellerIds: v.SellerIds,
  478. ExpireDay: v.ExpireDay,
  479. FreezeTime: v.FreezeTime,
  480. GroupId: v.GroupId,
  481. GroupIds: v.GroupIds,
  482. DepartmentId: v.DepartmentId,
  483. IndustryName: v.IndustryName,
  484. IsSuspend: v.IsSuspend,
  485. CreatedTime: v.CreatedTime,
  486. Source: v.Source,
  487. Province: v.Province,
  488. City: v.City,
  489. Address: v.Address,
  490. Reasons: v.Reasons,
  491. FreezeStartDate: v.FreezeStartDate,
  492. FreezeEndDate: v.FreezeEndDate,
  493. FreezeExpireDays: v.FreezeExpireDays,
  494. BtnItem: v.BtnItem,
  495. ProductId: v.ProductId,
  496. FormalTime: v.FormalTime,
  497. IsShared: v.IsShared,
  498. RegionType: v.RegionType,
  499. FiccPackageType: v.FiccPackageType,
  500. FiccLastViewTime: v.FiccLastViewTime,
  501. RaiLastViewTime: v.RaiLastViewTime,
  502. //FiccView: viewTotal[0],
  503. //RaiView: viewTotal[1],
  504. //FiccView: ficcViewTotal,
  505. //RaiView: raiViewTotal,
  506. FiccView: v.FiccView,
  507. RaiView: v.RaiView,
  508. FiccTryOutDay: v.FiccTryOutDay,
  509. RaiTryOutDay: v.RaiTryOutDay,
  510. AllViewTotal: v.AllViewTotal,
  511. RoadShowTotal: v.RoadShowTotal,
  512. TryStageSlice: v.TryStageSlice,
  513. Deadline: v.Deadline,
  514. WeekViewActive: v.WeekViewActive,
  515. IsShare: v.IsShare,
  516. ShareSeller: v.ShareSeller,
  517. ShareSellerId: v.ShareSellerId,
  518. LastServiceTime: v.LastServiceTime,
  519. ServiceTimes: v.ServiceTimes,
  520. }
  521. companyLists = append(companyLists, companyList)
  522. }
  523. }
  524. if companyLists == nil {
  525. companyLists = make([]*company.CompanyListItem, 0)
  526. }
  527. page = paging.GetPaging(currentIndex, pageSize, total)
  528. resp := new(company.CompanyListResp)
  529. resp.List = companyLists
  530. resp.Paging = page
  531. br.Ret = 200
  532. br.Success = true
  533. br.Msg = "获取成功"
  534. br.Data = resp
  535. }
  536. // @Title 分配共享销售
  537. // @Description 分配共享销售接口
  538. // @Param request body company.MoveShareSellerReq true "type json string"
  539. // @Success Ret=200 分配成功
  540. // @router /share/moveSeller [post]
  541. func (this *CompanyController) MoveShareSeller() {
  542. br := new(models.BaseResponse).Init()
  543. defer func() {
  544. this.Data["json"] = br
  545. this.ServeJSON()
  546. }()
  547. sysUser := this.SysUser
  548. if sysUser == nil {
  549. br.Msg = "请登录"
  550. br.ErrMsg = "请登录,SysUser Is Empty"
  551. br.Ret = 408
  552. return
  553. }
  554. var req company.MoveShareSellerReq
  555. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  556. if err != nil {
  557. br.Msg = "参数解析异常!"
  558. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  559. return
  560. }
  561. if req.CompanyId <= 0 {
  562. br.Msg = "参数异常!"
  563. br.ErrMsg = "CompanyId:" + strconv.Itoa(req.CompanyId)
  564. return
  565. }
  566. if req.SellsId <= 0 {
  567. br.Msg = "参数异常!"
  568. br.ErrMsg = "SellsId:" + strconv.Itoa(req.SellsId)
  569. return
  570. }
  571. seller, err := system.GetSysAdminById(req.SellsId)
  572. if err != nil {
  573. br.Msg = "获取销售信息失败"
  574. br.ErrMsg = "获取销售信息失败,Err:" + err.Error()
  575. return
  576. }
  577. //查询该客户
  578. companyItem, err := company.GetCompanyById(req.CompanyId)
  579. if err != nil {
  580. br.Msg = "查找客户失败"
  581. br.ErrMsg = "查找客户失败,Err:" + err.Error()
  582. return
  583. }
  584. //待更新字段
  585. updateCol := make([]string, 0)
  586. companyItem.ShareSeller = seller.RealName
  587. companyItem.ShareSellerId = seller.AdminId
  588. updateCol = append(updateCol, "ShareSeller", "ShareSellerId")
  589. err = companyItem.Update(updateCol)
  590. if err != nil {
  591. br.Msg = "修改客户信息失败"
  592. br.ErrMsg = "修改客户信息失败,Err:" + err.Error()
  593. return
  594. }
  595. //新增操作记录
  596. //{
  597. // remark := "移动到:" + seller.RealName
  598. // operation := "move_seller"
  599. // services.AddCompanyOperationRecord(req.CompanyId, seller.AdminId, sysUser.AdminId, productId, sysUser.AdminId, cp.CompanyName,
  600. // cp.ProductName, sysUser.RealName, remark, operation, "", sysUser.RealName, "", cp.Status)
  601. //}
  602. //变更销售员与联系人关系
  603. //_ = models.UpdateUserSellerRelationByCompanyId(req.CompanyId, productId, seller.AdminId, seller.RealName)
  604. br.Ret = 200
  605. br.Success = true
  606. br.Msg = "分配成功"
  607. }
  608. // CompanyShareAddRemark
  609. // @Title 新增客户备注
  610. // @Description 新增客户备注
  611. // @Param request body company.RemarkReq true "type json string"
  612. // @Success 200 编辑成功
  613. // @router /share/remark/add [post]
  614. func (this *CompanyController) CompanyShareAddRemark() {
  615. br := new(models.BaseResponse).Init()
  616. defer func() {
  617. this.Data["json"] = br
  618. this.ServeJSON()
  619. }()
  620. sysUser := this.SysUser
  621. if sysUser == nil {
  622. br.Msg = "请登录"
  623. br.ErrMsg = "请登录,SysUser Is Empty"
  624. br.Ret = 408
  625. return
  626. }
  627. var req company.RemarkReq
  628. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  629. if err != nil {
  630. br.Msg = "参数解析异常!"
  631. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  632. return
  633. }
  634. if req.CompanyId <= 0 {
  635. br.Msg = "参数缺失"
  636. br.ErrMsg = "参数缺失,客户编号未传!"
  637. return
  638. }
  639. if req.Remark == "" {
  640. br.Msg = "参数缺失"
  641. br.ErrMsg = "参数缺失,备注说明未传!"
  642. return
  643. }
  644. var productId int
  645. groupFicc := []string{
  646. utils.ROLE_TYPE_CODE_FICC_SELLER, utils.ROLE_TYPE_CODE_FICC_TEAM, utils.ROLE_TYPE_CODE_FICC_GROUP,
  647. utils.ROLE_TYPE_CODE_FICC_DEPARTMENT, utils.ROLE_TYPE_CODE_FICC_ADMIN,
  648. }
  649. groupRai := []string{
  650. utils.ROLE_TYPE_CODE_RAI_SELLER, utils.ROLE_TYPE_CODE_RAI_GROUP, utils.ROLE_TYPE_CODE_RAI_GROUP,
  651. utils.ROLE_TYPE_CODE_RAI_DEPARTMENT, utils.ROLE_TYPE_CODE_RAI_ADMIN,
  652. }
  653. if utils.InArrayByStr(groupFicc, sysUser.RoleTypeCode) {
  654. productId = 1
  655. }
  656. if utils.InArrayByStr(groupRai, sysUser.RoleTypeCode) {
  657. productId = 2
  658. }
  659. if productId == 0 {
  660. br.Msg = "该角色不可添加备注"
  661. return
  662. }
  663. companyProduct, err := company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, productId)
  664. if err != nil {
  665. br.Msg = "查询客户异常"
  666. br.ErrMsg = "查询客户异常,Err:" + err.Error()
  667. }
  668. remark := company.CompanyProductRemark{
  669. CompanyId: companyProduct.CompanyId,
  670. ProductId: companyProduct.ProductId,
  671. ProductName: companyProduct.ProductName,
  672. Remark: req.Remark,
  673. CreateTime: time.Now(),
  674. SysUserId: sysUser.AdminId,
  675. SysRealName: sysUser.RealName,
  676. }
  677. err = company.AddCompanyRemark(&remark)
  678. if err != nil {
  679. br.Msg = "操作失败"
  680. br.ErrMsg = "新增共享客户备注失败, Err: " + err.Error()
  681. return
  682. }
  683. go func() {
  684. approveContent := req.Remark
  685. remark := "新增备注"
  686. operation := "add_remark"
  687. _ = services.AddCompanyOperationRecord(req.CompanyId, companyProduct.SellerId, sysUser.AdminId, companyProduct.ProductId, sysUser.AdminId, companyProduct.CompanyName,
  688. companyProduct.ProductName, sysUser.RealName, remark, operation, approveContent, sysUser.RealName, "", companyProduct.Status)
  689. }()
  690. br.Ret = 200
  691. br.Success = true
  692. br.Msg = "编辑成功"
  693. }
  694. // CompanyShareMark
  695. // @Title 新增客户标记
  696. // @Description 新增客户标记
  697. // @Param request body company.CompanyMarkReq true "type json string"
  698. // @Success 200 编辑成功
  699. // @router /share/mark [post]
  700. func (this *CompanyController) CompanyShareMark() {
  701. br := new(models.BaseResponse).Init()
  702. defer func() {
  703. this.Data["json"] = br
  704. this.ServeJSON()
  705. }()
  706. sysUser := this.SysUser
  707. if sysUser == nil {
  708. br.Msg = "请登录"
  709. br.ErrMsg = "请登录,SysUser Is Empty"
  710. br.Ret = 408
  711. return
  712. }
  713. var req company.CompanyMarkReq
  714. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  715. if err != nil {
  716. br.Msg = "参数解析异常!"
  717. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  718. return
  719. }
  720. if req.CompanyProductRemakrId <= 0 {
  721. br.Msg = "参数缺失"
  722. br.ErrMsg = "参数缺失,备注ID未传!"
  723. return
  724. }
  725. if req.CompanyProductRemakrId < 0 {
  726. br.Msg = "参数异常"
  727. br.ErrMsg = "参数异常,备注id错误!"
  728. return
  729. }
  730. err = company.UpdateCompanyProductRemark(req.CompanyProductRemakrId, req.Status)
  731. if err != nil {
  732. br.Msg = "操作失败"
  733. br.ErrMsg = "新增共享客户备注失败, Err: " + err.Error()
  734. return
  735. }
  736. br.Ret = 200
  737. br.Success = true
  738. br.Msg = "编辑成功"
  739. }
  740. // @Title 共享客户列表-同城
  741. // @Description 共享客户列表接口
  742. // @Param Keyword query string true "搜索关键词"
  743. // @Param ListParam query int false "筛选字段参数,用来筛选的字段, 枚举值:0:全部 、 1:已分配 、 2:未分配 "
  744. // @Param SortParam query string false "排序字段参数,用来排序的字段, 枚举值:'viewTotal':总阅读次数 、 'viewTime':阅读时间 、 'roadShowTotal':累计路演次数 、`expireDay:到期时间` 、 `createTime:创建时间` 、 'formalTime': 转正时间 、 'freezeTime':冻结时间 、'lossTime':流失时间 、'tryOutDay':试用天数"
  745. // @Param SortType query string true "如何排序,是正序还是倒序,枚举值:`asc 正序`,`desc 倒叙`"
  746. // @Param PageSize query int true "每页数据条数"
  747. // @Param CurrentIndex query int true "当前页页码,从1开始"
  748. // @Success Ret=200 设置成功
  749. // @router /share/list/city [get]
  750. func (this *CompanyController) CompanyShareListByCity() {
  751. br := new(models.BaseResponse).Init()
  752. defer func() {
  753. this.Data["json"] = br
  754. this.ServeJSON()
  755. }()
  756. sysUser := this.SysUser
  757. if sysUser == nil {
  758. br.Msg = "请登录"
  759. br.ErrMsg = "请登录,SysUser Is Empty"
  760. br.Ret = 408
  761. return
  762. }
  763. pageSize, _ := this.GetInt("PageSize")
  764. currentIndex, _ := this.GetInt("CurrentIndex")
  765. keyword := this.GetString("Keyword")
  766. province := this.GetString("Province")
  767. city := this.GetString("City")
  768. //排序参数
  769. //sortParam := this.GetString("SortParam")
  770. //listParam, _ := this.GetInt("ListParam")
  771. //sortType := this.GetString("SortType")
  772. var total int
  773. page := paging.GetPaging(currentIndex, pageSize, total)
  774. var startSize int
  775. if pageSize <= 0 {
  776. pageSize = utils.PageSize20
  777. }
  778. if currentIndex <= 0 {
  779. currentIndex = 1
  780. }
  781. startSize = paging.StartIndex(currentIndex, pageSize)
  782. var condition string
  783. var pars []interface{}
  784. if keyword != "" {
  785. companyIdStr, err := company.GetCompanyIdByKeyWord(keyword)
  786. if err != nil {
  787. br.Msg = "获取客户信息失败"
  788. br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
  789. return
  790. }
  791. if companyIdStr != "" {
  792. condition += ` AND (a.company_name LIKE '%` + keyword + `%' OR a.credit_code LIKE '%` + keyword + `%' OR a.company_id IN(` + companyIdStr + `)) `
  793. } else {
  794. condition += ` AND (a.company_name LIKE '%` + keyword + `%' OR a.credit_code LIKE '%` + keyword + `%' ) `
  795. }
  796. }
  797. condition += ` AND a.is_share=1 `
  798. if province != "" {
  799. var provinceSql string
  800. slice := strings.Split(province, ",")
  801. for _, v := range slice {
  802. provinceSql += "'" + v + "'" + ","
  803. }
  804. provinceSql = strings.TrimRight(provinceSql, ",")
  805. condition += ` AND a.province IN (` + provinceSql + `) `
  806. }
  807. if city != "" {
  808. var citySql string
  809. slice := strings.Split(city, ",")
  810. for _, v := range slice {
  811. citySql += "'" + v + "'" + ","
  812. }
  813. citySql = strings.TrimRight(citySql, ",")
  814. condition += ` AND a.city IN (` + citySql + `) `
  815. }
  816. total, err := company.GetShareCompanyListCount(condition, pars)
  817. if err != nil {
  818. br.Msg = "获取失败"
  819. br.ErrMsg = "获取数据总数失败,Err:" + err.Error()
  820. return
  821. }
  822. sortStr := ` `
  823. //if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
  824. // sortStr = " ORDER BY sort_status asc, all_view_total desc, a.created_time "
  825. //} else {
  826. // sortStr = " ORDER BY sort_status asc, b.view_total desc, a.created_time "
  827. //}
  828. list, err := company.GetShareCompanyList(condition, sortStr, pars, startSize, pageSize)
  829. if err != nil {
  830. br.Msg = "获取失败"
  831. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  832. return
  833. }
  834. //企业用户数组切片
  835. companyIds := make([]int, 0)
  836. companyIdSlice := make([]string, 0)
  837. for _, v := range list {
  838. companyIds = append(companyIds, v.CompanyId)
  839. companyIdSlice = append(companyIdSlice, strconv.Itoa(v.CompanyId))
  840. }
  841. //企业用户产品开通数
  842. companyIdStr := strings.Join(companyIdSlice, ",")
  843. companyProductTotalList, _ := company.GetCountProductByCompanyIds(companyIdStr)
  844. companyProductTotalMap := make(map[int]*company.CompanyProductTotalSlice)
  845. for _, companyProductTotal := range companyProductTotalList {
  846. companyProductTotalMap[companyProductTotal.CompanyId] = companyProductTotal
  847. }
  848. // 客户产品详细信息
  849. companyProductMap := make(map[string]*company.CompanyProduct)
  850. var companyProductCondition string
  851. var companyProductPars []interface{}
  852. companyProductList, err := company.GetCompanyProductsByCompanyIds(companyIdStr, companyProductCondition, companyProductPars)
  853. if err != nil {
  854. br.Msg = "获取失败"
  855. br.ErrMsg = "获取客户产品数据失败,Err:" + err.Error()
  856. return
  857. }
  858. for _, companyProduct := range companyProductList {
  859. key := fmt.Sprint(companyProduct.CompanyId, "_", companyProduct.ProductId)
  860. companyProductMap[key] = companyProduct
  861. }
  862. companyLists := make([]*company.CompanyListItem, 0)
  863. //查询阅读次数
  864. if list == nil {
  865. companyLists = make([]*company.CompanyListItem, 0)
  866. } else {
  867. for _, v := range list {
  868. //viewTotal:=GetviewTotal(v.CompanyId)
  869. //活跃(客户状态)
  870. tmpStatus := v.Status
  871. if v.IsShare == 1 {
  872. tmpStatus = v.Status + "(共享)"
  873. }
  874. companyList := &company.CompanyListItem{
  875. CompanyId: v.CompanyId,
  876. CompanyName: v.CompanyName,
  877. CreditCode: v.CreditCode,
  878. CompanyCode: v.CompanyCode,
  879. StartDate: v.StartDate,
  880. EndDate: v.EndDate,
  881. LoseReason: v.LoseReason,
  882. RenewalReason: v.RenewalReason,
  883. FreezeReason: v.FreezeReason,
  884. LossTime: v.LossTime,
  885. Status: tmpStatus,
  886. CompanyType: v.CompanyType,
  887. ApproveStatus: v.ApproveStatus,
  888. SellerName: v.SellerName,
  889. SellerId: v.SellerId,
  890. SellerIds: v.SellerIds,
  891. ExpireDay: v.ExpireDay,
  892. FreezeTime: v.FreezeTime,
  893. GroupId: v.GroupId,
  894. GroupIds: v.GroupIds,
  895. DepartmentId: v.DepartmentId,
  896. IndustryName: v.IndustryName,
  897. IsSuspend: v.IsSuspend,
  898. CreatedTime: v.CreatedTime,
  899. Source: v.Source,
  900. Province: v.Province,
  901. City: v.City,
  902. Address: v.Address,
  903. Reasons: v.Reasons,
  904. FreezeStartDate: v.FreezeStartDate,
  905. FreezeEndDate: v.FreezeEndDate,
  906. FreezeExpireDays: v.FreezeExpireDays,
  907. BtnItem: v.BtnItem,
  908. ProductId: v.ProductId,
  909. FormalTime: v.FormalTime,
  910. IsShared: v.IsShared,
  911. RegionType: v.RegionType,
  912. FiccPackageType: v.FiccPackageType,
  913. FiccLastViewTime: v.FiccLastViewTime,
  914. RaiLastViewTime: v.RaiLastViewTime,
  915. //FiccView: viewTotal[0],
  916. //RaiView: viewTotal[1],
  917. //FiccView: ficcViewTotal,
  918. //RaiView: raiViewTotal,
  919. FiccView: v.FiccView,
  920. RaiView: v.RaiView,
  921. FiccTryOutDay: v.FiccTryOutDay,
  922. RaiTryOutDay: v.RaiTryOutDay,
  923. AllViewTotal: v.AllViewTotal,
  924. RoadShowTotal: v.RoadShowTotal,
  925. TryStageSlice: v.TryStageSlice,
  926. Deadline: v.Deadline,
  927. WeekViewActive: v.WeekViewActive,
  928. IsShare: v.IsShare,
  929. ShareSeller: v.ShareSeller,
  930. ShareSellerId: v.ShareSellerId,
  931. LastServiceTime: v.LastServiceTime,
  932. ServiceTimes: v.ServiceTimes,
  933. }
  934. companyLists = append(companyLists, companyList)
  935. }
  936. }
  937. if companyLists == nil {
  938. companyLists = make([]*company.CompanyListItem, 0)
  939. }
  940. page = paging.GetPaging(currentIndex, pageSize, total)
  941. resp := new(company.CompanyListResp)
  942. resp.List = companyLists
  943. resp.Paging = page
  944. br.Ret = 200
  945. br.Success = true
  946. br.Msg = "获取成功"
  947. br.Data = resp
  948. }