company_share.go 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011
  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.CompanyServiceRecordId <= 0 {
  721. br.Msg = "参数缺失"
  722. br.ErrMsg = "参数缺失,备注ID未传!"
  723. return
  724. }
  725. err = company.UpdateCompanyServiceRecordMark(req.CompanyServiceRecordId, req.Status)
  726. if err != nil {
  727. br.Msg = "操作失败"
  728. br.ErrMsg = "新增共享客户备注失败, Err: " + err.Error()
  729. return
  730. }
  731. br.Ret = 200
  732. br.Success = true
  733. br.Msg = "编辑成功"
  734. }
  735. // @Title 共享客户列表-同城
  736. // @Description 共享客户列表接口
  737. // @Param Keyword query string true "搜索关键词"
  738. // @Param ListParam query int false "筛选字段参数,用来筛选的字段, 枚举值:0:全部 、 1:已分配 、 2:未分配 "
  739. // @Param SortParam query string false "排序字段参数,用来排序的字段, 枚举值:'viewTotal':总阅读次数 、 'viewTime':阅读时间 、 'roadShowTotal':累计路演次数 、`expireDay:到期时间` 、 `createTime:创建时间` 、 'formalTime': 转正时间 、 'freezeTime':冻结时间 、'lossTime':流失时间 、'tryOutDay':试用天数"
  740. // @Param SortType query string true "如何排序,是正序还是倒序,枚举值:`asc 正序`,`desc 倒叙`"
  741. // @Param PageSize query int true "每页数据条数"
  742. // @Param CurrentIndex query int true "当前页页码,从1开始"
  743. // @Success Ret=200 设置成功
  744. // @router /share/list/city [get]
  745. func (this *CompanyController) CompanyShareListByCity() {
  746. br := new(models.BaseResponse).Init()
  747. defer func() {
  748. this.Data["json"] = br
  749. this.ServeJSON()
  750. }()
  751. sysUser := this.SysUser
  752. if sysUser == nil {
  753. br.Msg = "请登录"
  754. br.ErrMsg = "请登录,SysUser Is Empty"
  755. br.Ret = 408
  756. return
  757. }
  758. pageSize, _ := this.GetInt("PageSize")
  759. currentIndex, _ := this.GetInt("CurrentIndex")
  760. keyword := this.GetString("Keyword")
  761. province := this.GetString("Province")
  762. city := this.GetString("City")
  763. //排序参数
  764. //sortParam := this.GetString("SortParam")
  765. //listParam, _ := this.GetInt("ListParam")
  766. //sortType := this.GetString("SortType")
  767. var total int
  768. page := paging.GetPaging(currentIndex, pageSize, total)
  769. var startSize int
  770. if pageSize <= 0 {
  771. pageSize = utils.PageSize20
  772. }
  773. if currentIndex <= 0 {
  774. currentIndex = 1
  775. }
  776. startSize = paging.StartIndex(currentIndex, pageSize)
  777. var condition string
  778. var pars []interface{}
  779. if keyword != "" {
  780. companyIdStr, err := company.GetCompanyIdByKeyWord(keyword)
  781. if err != nil {
  782. br.Msg = "获取客户信息失败"
  783. br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
  784. return
  785. }
  786. if companyIdStr != "" {
  787. condition += ` AND (a.company_name LIKE '%` + keyword + `%' OR a.credit_code LIKE '%` + keyword + `%' OR a.company_id IN(` + companyIdStr + `)) `
  788. } else {
  789. condition += ` AND (a.company_name LIKE '%` + keyword + `%' OR a.credit_code LIKE '%` + keyword + `%' ) `
  790. }
  791. }
  792. condition += ` AND a.is_share=1 `
  793. if province != "" {
  794. var provinceSql string
  795. slice := strings.Split(province, ",")
  796. for _, v := range slice {
  797. provinceSql += "'" + v + "'" + ","
  798. }
  799. provinceSql = strings.TrimRight(provinceSql, ",")
  800. condition += ` AND a.province IN (` + provinceSql + `) `
  801. }
  802. if city != "" {
  803. var citySql string
  804. slice := strings.Split(city, ",")
  805. for _, v := range slice {
  806. citySql += "'" + v + "'" + ","
  807. }
  808. citySql = strings.TrimRight(citySql, ",")
  809. condition += ` AND a.city IN (` + citySql + `) `
  810. }
  811. total, err := company.GetShareCompanyListCount(condition, pars)
  812. if err != nil {
  813. br.Msg = "获取失败"
  814. br.ErrMsg = "获取数据总数失败,Err:" + err.Error()
  815. return
  816. }
  817. sortStr := ` `
  818. //if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
  819. // sortStr = " ORDER BY sort_status asc, all_view_total desc, a.created_time "
  820. //} else {
  821. // sortStr = " ORDER BY sort_status asc, b.view_total desc, a.created_time "
  822. //}
  823. list, err := company.GetShareCompanyList(condition, sortStr, pars, startSize, pageSize)
  824. if err != nil {
  825. br.Msg = "获取失败"
  826. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  827. return
  828. }
  829. //企业用户数组切片
  830. companyIds := make([]int, 0)
  831. companyIdSlice := make([]string, 0)
  832. for _, v := range list {
  833. companyIds = append(companyIds, v.CompanyId)
  834. companyIdSlice = append(companyIdSlice, strconv.Itoa(v.CompanyId))
  835. }
  836. //企业用户产品开通数
  837. companyIdStr := strings.Join(companyIdSlice, ",")
  838. companyProductTotalList, _ := company.GetCountProductByCompanyIds(companyIdStr)
  839. companyProductTotalMap := make(map[int]*company.CompanyProductTotalSlice)
  840. for _, companyProductTotal := range companyProductTotalList {
  841. companyProductTotalMap[companyProductTotal.CompanyId] = companyProductTotal
  842. }
  843. // 客户产品详细信息
  844. companyProductMap := make(map[string]*company.CompanyProduct)
  845. var companyProductCondition string
  846. var companyProductPars []interface{}
  847. companyProductList, err := company.GetCompanyProductsByCompanyIds(companyIdStr, companyProductCondition, companyProductPars)
  848. if err != nil {
  849. br.Msg = "获取失败"
  850. br.ErrMsg = "获取客户产品数据失败,Err:" + err.Error()
  851. return
  852. }
  853. for _, companyProduct := range companyProductList {
  854. key := fmt.Sprint(companyProduct.CompanyId, "_", companyProduct.ProductId)
  855. companyProductMap[key] = companyProduct
  856. }
  857. companyLists := make([]*company.CompanyListItem, 0)
  858. //查询阅读次数
  859. if list == nil {
  860. companyLists = make([]*company.CompanyListItem, 0)
  861. } else {
  862. for _, v := range list {
  863. //viewTotal:=GetviewTotal(v.CompanyId)
  864. //活跃(客户状态)
  865. tmpStatus := v.Status
  866. if v.IsShare == 1 {
  867. tmpStatus = v.Status + "(共享)"
  868. }
  869. companyList := &company.CompanyListItem{
  870. CompanyId: v.CompanyId,
  871. CompanyName: v.CompanyName,
  872. CreditCode: v.CreditCode,
  873. CompanyCode: v.CompanyCode,
  874. StartDate: v.StartDate,
  875. EndDate: v.EndDate,
  876. LoseReason: v.LoseReason,
  877. RenewalReason: v.RenewalReason,
  878. FreezeReason: v.FreezeReason,
  879. LossTime: v.LossTime,
  880. Status: tmpStatus,
  881. CompanyType: v.CompanyType,
  882. ApproveStatus: v.ApproveStatus,
  883. SellerName: v.SellerName,
  884. SellerId: v.SellerId,
  885. SellerIds: v.SellerIds,
  886. ExpireDay: v.ExpireDay,
  887. FreezeTime: v.FreezeTime,
  888. GroupId: v.GroupId,
  889. GroupIds: v.GroupIds,
  890. DepartmentId: v.DepartmentId,
  891. IndustryName: v.IndustryName,
  892. IsSuspend: v.IsSuspend,
  893. CreatedTime: v.CreatedTime,
  894. Source: v.Source,
  895. Province: v.Province,
  896. City: v.City,
  897. Address: v.Address,
  898. Reasons: v.Reasons,
  899. FreezeStartDate: v.FreezeStartDate,
  900. FreezeEndDate: v.FreezeEndDate,
  901. FreezeExpireDays: v.FreezeExpireDays,
  902. BtnItem: v.BtnItem,
  903. ProductId: v.ProductId,
  904. FormalTime: v.FormalTime,
  905. IsShared: v.IsShared,
  906. RegionType: v.RegionType,
  907. FiccPackageType: v.FiccPackageType,
  908. FiccLastViewTime: v.FiccLastViewTime,
  909. RaiLastViewTime: v.RaiLastViewTime,
  910. //FiccView: viewTotal[0],
  911. //RaiView: viewTotal[1],
  912. //FiccView: ficcViewTotal,
  913. //RaiView: raiViewTotal,
  914. FiccView: v.FiccView,
  915. RaiView: v.RaiView,
  916. FiccTryOutDay: v.FiccTryOutDay,
  917. RaiTryOutDay: v.RaiTryOutDay,
  918. AllViewTotal: v.AllViewTotal,
  919. RoadShowTotal: v.RoadShowTotal,
  920. TryStageSlice: v.TryStageSlice,
  921. Deadline: v.Deadline,
  922. WeekViewActive: v.WeekViewActive,
  923. IsShare: v.IsShare,
  924. ShareSeller: v.ShareSeller,
  925. ShareSellerId: v.ShareSellerId,
  926. LastServiceTime: v.LastServiceTime,
  927. ServiceTimes: v.ServiceTimes,
  928. }
  929. companyLists = append(companyLists, companyList)
  930. }
  931. }
  932. if companyLists == nil {
  933. companyLists = make([]*company.CompanyListItem, 0)
  934. }
  935. page = paging.GetPaging(currentIndex, pageSize, total)
  936. resp := new(company.CompanyListResp)
  937. resp.List = companyLists
  938. resp.Paging = page
  939. br.Ret = 200
  940. br.Success = true
  941. br.Msg = "获取成功"
  942. br.Data = resp
  943. }