company_share.go 33 KB

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