activity_meet.go 74 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552
  1. package cygx
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/rdlucklib/rdluck_tools/paging"
  6. "github.com/tealeg/xlsx"
  7. "hongze/hz_crm_api/controllers"
  8. "hongze/hz_crm_api/models"
  9. "hongze/hz_crm_api/models/company"
  10. "hongze/hz_crm_api/models/cygx"
  11. "hongze/hz_crm_api/models/system"
  12. "hongze/hz_crm_api/services/alarm_msg"
  13. cygxService "hongze/hz_crm_api/services/cygx"
  14. "hongze/hz_crm_api/utils"
  15. "os"
  16. "path/filepath"
  17. "strconv"
  18. "strings"
  19. "time"
  20. )
  21. // 到会管理
  22. type ActivityMeetCoAntroller struct {
  23. controllers.BaseAuthController
  24. }
  25. // @Title 到会管理列表
  26. // @Description 获取到会管理列表接口
  27. // @Param PageSize query int true "每页数据条数"
  28. // @Param CurrentIndex query int true "当前页页码,从1开始"
  29. // @Param ChartPermissionId query string false "行业id"
  30. // @Param ActivityTypeId query string false "活动类型id "
  31. // @Param StartDate query string false "开始时间 ,列如2021-03-06 "
  32. // @Param EndDate query string false "结束时间,列如2021-03-06 "
  33. // @Param KeyWord query string false "搜索关键词"
  34. // @Param MeetType query int true "会议类型 1线上、2线下"
  35. // @Param IsResearch query bool true "是否为研选"
  36. // @Success 200 {object} cygx.GetCygxMeetListRep
  37. // @router /activityMeet/list [get]
  38. func (this *ActivityMeetCoAntroller) MeetList() {
  39. br := new(models.BaseResponse).Init()
  40. defer func() {
  41. this.Data["json"] = br
  42. this.ServeJSON()
  43. }()
  44. sysUser := this.SysUser
  45. if sysUser == nil {
  46. br.Msg = "请登录"
  47. br.ErrMsg = "请登录,SysUser Is Empty"
  48. return
  49. }
  50. pageSize, _ := this.GetInt("PageSize")
  51. currentIndex, _ := this.GetInt("CurrentIndex")
  52. chartPermissionId, _ := this.GetInt("ChartPermissionId")
  53. ActivityTypeId := this.GetString("ActivityTypeId")
  54. startDate := this.GetString("StartDate")
  55. endDate := this.GetString("EndDate")
  56. keyWord := this.GetString("KeyWord")
  57. meetType, _ := this.GetInt("MeetType")
  58. isResearch, _ := this.GetBool("IsResearch", false) // 是否为研选 查研观向11.0 (研选活动独立显示)
  59. var startSize int
  60. if pageSize <= 0 {
  61. pageSize = utils.PageSize20
  62. }
  63. if currentIndex <= 0 {
  64. currentIndex = 1
  65. }
  66. startSize = utils.StartIndex(currentIndex, pageSize)
  67. activityIdArr := make([]int, 0)
  68. activityIdArrUpdateTime := make([]int, 0)
  69. var condition string
  70. var pars []interface{}
  71. condition += `AND a.active_state IN (2,3) AND a.publish_status = 1 `
  72. if keyWord != "" {
  73. condition += ` AND (a.activity_name LIKE '%` + keyWord + `%' ) `
  74. }
  75. if meetType == 1 {
  76. condition += ` AND a.activity_type_id IN (1,2,3,7) `
  77. } else {
  78. condition += ` AND a.activity_type_id IN (4,5,6,8) ` //默认
  79. }
  80. if ActivityTypeId != "" {
  81. condition += ` AND a.activity_type_id IN (` + ActivityTypeId + `) `
  82. }
  83. if isResearch {
  84. chartPermissionId = utils.CHART_PERMISSION_ID_YANXUAN
  85. } else {
  86. condition += ` AND a.chart_permission_id != '` + strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + `'`
  87. }
  88. //行业名称
  89. if chartPermissionId > 0 {
  90. condition += ` AND a.chart_permission_id = '` + strconv.Itoa(chartPermissionId) + `'`
  91. }
  92. if startDate != "" {
  93. condition += ` AND a.activity_time >= ` + "'" + startDate + " 00:00:00'"
  94. }
  95. if endDate != "" {
  96. condition += ` AND a.activity_time <= ` + "'" + endDate + " 23:59:59'"
  97. }
  98. total, err := cygx.GetCygxMeetCount(condition, pars)
  99. if err != nil {
  100. br.Msg = "获取失败"
  101. br.ErrMsg = "获取失败,Err:" + err.Error()
  102. return
  103. }
  104. condition += ` GROUP BY a.activity_id ORDER BY a.activity_time DESC `
  105. list, errList := cygx.GetCygxMeetListAll(condition, pars, startSize, pageSize)
  106. if errList != nil {
  107. br.Msg = "获取失败"
  108. br.ErrMsg = "获取失败,Err:" + errList.Error()
  109. return
  110. }
  111. page := paging.GetPaging(currentIndex, pageSize, total)
  112. resp := new(cygx.GetCygxMeetListRep)
  113. for k, v := range list {
  114. if v.IsSubmitMeeting == 1 {
  115. list[k].OperationStyle = 2
  116. } else {
  117. list[k].OperationStyle = 1
  118. }
  119. if meetType == 2 {
  120. list[k].MeetPeopleNum = v.OmeetPeopleNum
  121. }
  122. if v.ActivityTypeId == 7 {
  123. list[k].IsCClassMeeting = true
  124. }
  125. activityIdArrUpdateTime = append(activityIdArrUpdateTime, v.ActivityId)
  126. //到会列表按钮展示操作
  127. if v.IsSubmitMeeting == 1 {
  128. //list[k].IsShowAttendanceDetails = true
  129. if meetType == 1 && v.ActivityTypeId == 7 {
  130. //如果C类电话会是手动提交的报名信息,就展示 修改到会情况 按钮
  131. if v.SubmitMeetingType == 1 {
  132. list[k].IsShowUpdateMeeting = true
  133. }
  134. //C类强制展示
  135. list[k].IsShowAttendanceDetails = true
  136. }
  137. //已经提交到会的线下会议都展示 修改到会情况 按钮
  138. if meetType == 2 {
  139. list[k].IsShowUpdateMeeting = true
  140. }
  141. } else {
  142. if list[k].YidongActivityId != "" {
  143. //list[k].ActivityTypeName += utils.YI_DONG_NAME
  144. } else {
  145. //如果是线上
  146. if meetType == 1 {
  147. list[k].IsShowHandMovement = true
  148. //如果 是C类电话会则做下面的处理
  149. if v.ActivityTypeId == 7 {
  150. list[k].IsShowSubmitMeeting = true
  151. }
  152. } else {
  153. list[k].IsShowSubmitMeeting = true
  154. }
  155. }
  156. if v.IsYidongConduct == 1 {
  157. //v.ActivityTypeName += utils.YI_DONG_NAME_TWO
  158. list[k].IsShowSubmitMeeting = true
  159. list[k].IsShowHandMovement = false
  160. }
  161. }
  162. if v.YidongActivityId != "" {
  163. ydUpdateDetil, err := cygx.GetCygxActivityYiDongUpdateTime(v.YidongActivityId)
  164. if err != nil && err.Error() != utils.ErrNoRow() {
  165. br.Msg = "获取失败"
  166. br.ErrMsg = "获取失败,GetCygxActivityYiDongUpdateTime Err:" + err.Error()
  167. return
  168. }
  169. if ydUpdateDetil != nil {
  170. list[k].UpdateTime = ydUpdateDetil.CreateTime
  171. }
  172. activityIdArr = append(activityIdArr, v.ActivityId)
  173. //易懂的到会改为true
  174. if v.IsSubmitMeeting == 1 {
  175. list[k].IsShowAttendanceDetails = true
  176. }
  177. if v.ChartPermissionNameDeputy != "" && v.ChartPermissionNameDeputy != v.ChartPermissionName {
  178. v.ChartPermissionName = v.ChartPermissionNameDeputy // 易董同步过来的活动展示副权限 v11.0
  179. }
  180. }
  181. //判断是否是易董在易董举办的会议
  182. if v.IsYidongConduct == 1 {
  183. list[k].IsShowHandMovement = false
  184. list[k].IsShowSubmitMeeting = false
  185. list[k].IsShowUpdateMeeting = false
  186. }
  187. //是否展示签到码
  188. if (v.ActivityTypeId == 5 || v.ActivityTypeId == 6 || v.ActivityTypeId == 8) && v.SigninImg != "" {
  189. list[k].IsShowSigninButton = true
  190. }
  191. list[k].MeetPeopleNum += v.PotentialPeopleNum //加上潜在客户人数
  192. }
  193. mapUpdateTime, _ := cygxService.GetActivityMeetUpdateTime(activityIdArrUpdateTime) //获取线上活动到会更新时间
  194. //处理易董的活动到会数量
  195. mapYidongMeetNum := make(map[int]int)
  196. if len(activityIdArr) > 0 {
  197. yidongList, err := cygx.GetCygxActivityYiDongMeetNum(activityIdArr)
  198. if err != nil && err.Error() != utils.ErrNoRow() {
  199. br.Msg = "获取失败"
  200. br.ErrMsg = "获取失败,GetCygxActivityYiDongUpdateTime Err:" + err.Error()
  201. return
  202. }
  203. for _, v := range yidongList {
  204. mapYidongMeetNum[v.ActivityId] = v.Num
  205. }
  206. }
  207. for k, v := range list {
  208. if v.ChartPermissionNames != "" {
  209. list[k].ChartPermissionName = v.ChartPermissionNames
  210. }
  211. if v.YidongActivityId != "" {
  212. list[k].MeetPeopleNum = mapYidongMeetNum[v.ActivityId]
  213. list[k].ActivityTypeName += utils.YI_DONG_NAME
  214. }
  215. if v.IsYidongConduct == 1 {
  216. v.ActivityTypeName += utils.YI_DONG_NAME_TWO
  217. }
  218. v.UpdateTime = mapUpdateTime[v.ActivityId]
  219. }
  220. resp.List = list
  221. resp.Paging = page
  222. br.Ret = 200
  223. br.Success = true
  224. br.Msg = "获取成功"
  225. br.Data = resp
  226. }
  227. // @Title 线下报名详情列表
  228. // @Description 获取线下报名详情列表接口
  229. // @Param ActivityId query int true "活动ID"
  230. // @Success 200 {object} cygx.CygxActivitySignupListRep
  231. // @router /activityMeet/offlineListDetail [get]
  232. func (this *ActivityMeetCoAntroller) OfflineListDetail() {
  233. br := new(models.BaseResponse).Init()
  234. defer func() {
  235. this.Data["json"] = br
  236. this.ServeJSON()
  237. }()
  238. sysUser := this.SysUser
  239. if sysUser == nil {
  240. br.Msg = "请登录"
  241. br.ErrMsg = "请登录,SysUser Is Empty"
  242. return
  243. }
  244. activityId, _ := this.GetInt("ActivityId")
  245. activityInfo, _ := cygx.GetAddActivityInfoById(activityId)
  246. if activityInfo == nil {
  247. br.Msg = "活动不存在"
  248. br.ErrMsg = "活动ID错误,Err:activityId:" + strconv.Itoa(activityId)
  249. return
  250. }
  251. var condition string
  252. condition += ` AND s.is_cancel = 0 AND s.do_fail_type =0 AND s.activity_id = ` + strconv.Itoa(activityId)
  253. list, err := cygx.GetCygxActivitySignup(condition)
  254. if err != nil {
  255. br.Msg = "获取失败"
  256. br.ErrMsg = "获取失败,Err:" + err.Error()
  257. return
  258. }
  259. resp := new(cygx.CygxActivitySignupListRep)
  260. for k, v := range list {
  261. if v.IsMeeting == 1 {
  262. list[k].Operation = true
  263. }
  264. }
  265. resp.List = list
  266. resp.ActivityId = activityId
  267. br.Ret = 200
  268. br.Success = true
  269. br.Msg = "获取成功"
  270. br.Data = resp
  271. }
  272. // @Title 提交线下到会情况
  273. // @Description 提交线下到会情况接口
  274. // @Param request body cygx.MeetingDoRep true "type json string"
  275. // @Success 200 操作成功
  276. // @router /activityMeet/meetingDo [post]
  277. func (this *ActivityMeetCoAntroller) MeetingDo() {
  278. br := new(models.BaseResponse).Init()
  279. defer func() {
  280. this.Data["json"] = br
  281. this.ServeJSON()
  282. }()
  283. AdminUser := this.SysUser
  284. if AdminUser == nil {
  285. br.Msg = "请登录"
  286. br.ErrMsg = "请登录,用户信息为空"
  287. br.Ret = 408
  288. return
  289. }
  290. var req cygx.MeetingDoRep
  291. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  292. if err != nil {
  293. br.Msg = "参数解析异常!"
  294. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  295. return
  296. }
  297. mapMeetingUid := make(map[int]bool)
  298. var userIdArr []int
  299. meetingUids := req.Ids
  300. if len(meetingUids) == 0 {
  301. meetingUids = "0"
  302. } else {
  303. //过滤字段
  304. slice := strings.Split(meetingUids, ",")
  305. meetingUids = ""
  306. for _, v := range slice {
  307. if v != "" {
  308. meetingUids += v + ","
  309. userId, _ := strconv.Atoi(v)
  310. if userId > 0 {
  311. userIdArr = append(userIdArr, userId)
  312. }
  313. mapMeetingUid[userId] = true
  314. }
  315. }
  316. meetingUids = strings.TrimRight(meetingUids, ",")
  317. }
  318. activityId := req.ActivityId
  319. //加入缓存机制,避免同时提交到会信息
  320. redisKey := fmt.Sprint("cygx:activity_meet:batch:activityId:", req.ActivityId)
  321. isExist := utils.Rc.IsExist(redisKey)
  322. if isExist {
  323. br.Msg = "到会详情正在处理,请勿重复提交"
  324. return
  325. } else {
  326. //设置1分钟缓存
  327. utils.Rc.SetNX(redisKey, 1, time.Second*60)
  328. defer func() {
  329. utils.Rc.Delete(redisKey)
  330. }()
  331. }
  332. //加入缓存机制,避免创建同一个名称的指标 end
  333. activityInfo, errInfo := cygx.GetAddActivityInfoById(activityId)
  334. if activityInfo == nil {
  335. br.Msg = "操作失败"
  336. br.ErrMsg = "活动ID错误,不存在activityId:" + strconv.Itoa(activityId)
  337. return
  338. }
  339. if errInfo != nil {
  340. br.Msg = "操作失败"
  341. br.ErrMsg = "操作失败,Err:" + errInfo.Error()
  342. return
  343. }
  344. //校验活动后台管理员、销售是否有修改权限
  345. havePower, popupMsg, err := cygxService.CheckActivityUpdatePower(AdminUser.AdminId, activityInfo)
  346. if err != nil {
  347. br.Msg = "获取管理员身份信息失败"
  348. br.ErrMsg = "获取管理员身份信息失败,Err:" + err.Error()
  349. return
  350. }
  351. if !havePower {
  352. br.Msg = popupMsg
  353. return
  354. }
  355. noMeetingUids, err := cygx.GetSignupUserIds(activityId, meetingUids) //未到会的用户ID
  356. if err != nil {
  357. br.Msg = "获取信息失败"
  358. br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
  359. return
  360. }
  361. var allUids string
  362. if len(noMeetingUids) > 0 {
  363. allUids = noMeetingUids + "," + meetingUids
  364. } else {
  365. allUids = meetingUids
  366. }
  367. listUser, err := cygx.GetUserAndCompanyNameListByUids(allUids)
  368. if err != nil {
  369. br.Msg = "获取失败"
  370. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  371. return
  372. }
  373. var pars []interface{}
  374. var condition string
  375. condition = ` AND activity_id = ? ORDER BY create_time DESC `
  376. pars = append(pars, activityId)
  377. listSigin, err := cygx.GetCygxActivitySigninList(condition, pars)
  378. if err != nil && err.Error() != utils.ErrNoRow() {
  379. br.Msg = "获取失败"
  380. br.ErrMsg = "获取失败,Err:" + err.Error()
  381. return
  382. }
  383. siginMap := make(map[int]string)
  384. for _, v := range listSigin {
  385. siginMap[v.UserId] = v.CreateTime
  386. }
  387. var items []*cygx.CygxActivityOfflineMeetingDetail
  388. var itemDs []*cygx.CygxActivitySignupDetail
  389. for _, v := range listUser {
  390. var item = new(cygx.CygxActivityOfflineMeetingDetail)
  391. item.UserId = v.UserId
  392. item.ActivityId = activityId
  393. item.CreateTime = time.Now()
  394. item.Mobile = v.Mobile
  395. item.Email = v.Email
  396. item.CompanyId = v.CompanyId
  397. item.CompanyName = v.CompanyName
  398. if mapMeetingUid[v.UserId] {
  399. item.IsMeeting = 1
  400. }
  401. //保留扫码通过扫码签到人员的签到时间
  402. if siginMap[v.UserId] != "" {
  403. item.SigninTime = siginMap[v.UserId]
  404. } else {
  405. item.SigninTime = time.Now().Format(utils.FormatDateTime)
  406. }
  407. items = append(items, item)
  408. var itemD = new(cygx.CygxActivitySignupDetail)
  409. itemD.UserId = v.UserId
  410. itemD.RealName = v.RealName
  411. itemD.ActivityId = activityId
  412. itemD.CreateTime = time.Now()
  413. itemD.Mobile = v.Mobile
  414. itemD.CompanyId = v.CompanyId
  415. itemD.CompanyName = v.CompanyName
  416. if mapMeetingUid[v.UserId] {
  417. itemD.IsMeeting = 1
  418. }
  419. itemDs = append(itemDs, itemD)
  420. }
  421. err = cygx.MeetingDo(meetingUids, noMeetingUids, activityId, items)
  422. if err != nil {
  423. br.Msg = "操作失败"
  424. br.ErrMsg = "操作失败,Err:" + err.Error()
  425. return
  426. }
  427. go cygxService.AddCygxActivityRestrictSignupByAdmin(activityId) // 处理爽约记录黑名单限制
  428. go cygxService.AddCygxActivityMeetDetailLogOffline(meetingUids, activityId) // 处理个人以及机构到会数量
  429. go cygxService.AddctivitySignupDetailList(itemDs, activityId) // 处理个人以及机构到会数量
  430. go cygxService.ActivityUserLabelLogAdd(activityId, userIdArr) // 处理用户标签
  431. go cygxService.YanXuanActivityPointsBillSubmitMeeting(activityId, AdminUser.AdminId) // 处理用户到会研选扣点
  432. //添加操作日志记录
  433. br.Ret = 200
  434. br.Success = true
  435. br.Msg = "操作成功"
  436. br.IsAddLog = true
  437. }
  438. // @Title 线下报名到会详情列表
  439. // @Description 获取线下报名到会详情列表接口
  440. // @Param ActivityId query int true "活动ID"
  441. // @Success 200 {object} cygx.CygxActivitySignupListRep
  442. // @router /activityMeet/offlineMeetingList [get]
  443. func (this *ActivityMeetCoAntroller) OfflineMeetingList() {
  444. br := new(models.BaseResponse).Init()
  445. defer func() {
  446. this.Data["json"] = br
  447. this.ServeJSON()
  448. }()
  449. sysUser := this.SysUser
  450. if sysUser == nil {
  451. br.Msg = "请登录"
  452. br.ErrMsg = "请登录,SysUser Is Empty"
  453. return
  454. }
  455. activityId, _ := this.GetInt("ActivityId")
  456. activityInfo, _ := cygx.GetAddActivityInfoById(activityId)
  457. if activityInfo == nil {
  458. br.Msg = "活动不存在"
  459. br.ErrMsg = "活动ID错误,Err:activityId:" + strconv.Itoa(activityId)
  460. return
  461. }
  462. var condition string
  463. var err error
  464. var list []*cygx.CygxActivitySignupList
  465. condition += ` AND s.activity_id = ` + strconv.Itoa(activityId)
  466. if activityInfo.YidongActivityId != "" {
  467. listMeeting, errMeeting := cygx.GetOfflineMeetingListByYidong(condition)
  468. list = listMeeting
  469. err = errMeeting
  470. } else {
  471. if activityInfo.IsSubmitMeeting == 1 {
  472. condition += " ORDER BY is_meeting DESC ,signin_time DESC , id DESC "
  473. listMeeting, errMeeting := cygx.GetOfflineMeetingList(condition)
  474. list = listMeeting
  475. err = errMeeting
  476. } else {
  477. condition += ` AND s.do_fail_type = 0 `
  478. listNoMeeting, errNoMeeting := cygx.GetCygxActivitySignup(condition)
  479. if errNoMeeting != nil {
  480. br.Msg = "获取失败"
  481. br.ErrMsg = "获取失败,Err:" + errNoMeeting.Error()
  482. return
  483. }
  484. for k := range listNoMeeting {
  485. listNoMeeting[k].Channel = 1
  486. }
  487. list = listNoMeeting
  488. err = errNoMeeting
  489. }
  490. }
  491. if err != nil {
  492. br.Msg = "获取失败"
  493. br.ErrMsg = "获取失败,Err:" + err.Error()
  494. return
  495. }
  496. resp := new(cygx.CygxActivitySignupListRep)
  497. if len(list) == 0 {
  498. list = make([]*cygx.CygxActivitySignupList, 0)
  499. } else {
  500. for k, v := range list {
  501. if v.IsMeeting == 1 {
  502. list[k].Operation = true
  503. }
  504. if activityInfo.YidongActivityId != "" {
  505. list[k].Channel = 1
  506. }
  507. if list[k].Channel == 0 && list[k].IsMeeting == 1 {
  508. list[k].IsAirborne = 1
  509. }
  510. }
  511. }
  512. var pars []interface{}
  513. condition = ` AND activity_id = ? ORDER BY create_time DESC `
  514. pars = append(pars, activityId)
  515. listSigin, err := cygx.GetCygxActivitySigninList(condition, pars)
  516. if err != nil && err.Error() != utils.ErrNoRow() {
  517. br.Msg = "获取失败"
  518. br.ErrMsg = "获取失败,Err:" + err.Error()
  519. return
  520. }
  521. if len(listSigin) == 0 {
  522. resp.ListSignin = make([]*cygx.CygxActivitySignin, 0)
  523. } else {
  524. for _, v := range listSigin {
  525. if v.CompanyId <= 1 {
  526. if v.Mobile == "" {
  527. v.Mobile = v.Email
  528. }
  529. resp.ListSignin = append(resp.ListSignin, v)
  530. }
  531. }
  532. for _, v := range list {
  533. if v.IsMeeting == 0 {
  534. v.SigninTime = ""
  535. }
  536. }
  537. if len(resp.ListSignin) == 0 {
  538. resp.ListSignin = make([]*cygx.CygxActivitySignin, 0)
  539. }
  540. }
  541. resp.List = list
  542. resp.ActivityId = activityId
  543. br.Ret = 200
  544. br.Success = true
  545. br.Msg = "获取成功"
  546. br.Data = resp
  547. }
  548. // @Title 爽约记录
  549. // @Description 获取爽约记录接口
  550. // @Param PageSize query int true "每页数据条数"
  551. // @Param CurrentIndex query int true "当前页页码,从1开始"
  552. // @Param KeyWord query string false "搜索关键词"
  553. // @Param SellerName query string false "销售姓名"
  554. // @Success 200 {object} cygx.GetCygxBreakAppointmentListRep
  555. // @router /activityMeet/breakAppointment [get]
  556. func (this *ActivityMeetCoAntroller) BreakAppointment() {
  557. br := new(models.BaseResponse).Init()
  558. defer func() {
  559. this.Data["json"] = br
  560. this.ServeJSON()
  561. }()
  562. sysUser := this.SysUser
  563. if sysUser == nil {
  564. br.Msg = "请登录"
  565. br.ErrMsg = "请登录,SysUser Is Empty"
  566. return
  567. }
  568. var condition string
  569. pageSize, _ := this.GetInt("PageSize")
  570. currentIndex, _ := this.GetInt("CurrentIndex")
  571. keyWord := this.GetString("KeyWord")
  572. sellerName := this.GetString("SellerName")
  573. var startSize int
  574. if pageSize <= 0 {
  575. pageSize = utils.PageSize20
  576. }
  577. if currentIndex <= 0 {
  578. currentIndex = 1
  579. }
  580. startSize = utils.StartIndex(currentIndex, pageSize)
  581. var pars []interface{}
  582. //超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
  583. respDownload := new(cygx.CanDownload)
  584. adminInfo, errAdmin := system.GetSysUserById(sysUser.AdminId)
  585. if errAdmin != nil {
  586. br.Msg = "获取失败"
  587. br.ErrMsg = "获取失败,Err:" + errAdmin.Error()
  588. return
  589. }
  590. if adminInfo.Role == "admin" || adminInfo.Role == "researcher" {
  591. respDownload.IsCanDownload = true
  592. }
  593. var list []*cygx.CygxBreakAppointmentList
  594. var err error
  595. if respDownload.IsCanDownload == false {
  596. if adminInfo.RoleTypeCode == "rai_group" {
  597. //组长查看本组所有组员
  598. condition = ` AND s.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id IN (SELECT admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(sysUser.AdminId) + ` ) )) `
  599. } else {
  600. //组员查看自己
  601. condition = ` AND s.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id = ` + strconv.Itoa(sysUser.AdminId) + `) `
  602. }
  603. }
  604. if keyWord != "" {
  605. condition += ` AND (s.company_name LIKE '%` + keyWord + `%' OR s.mobile LIKE '%` + keyWord + `%') `
  606. }
  607. if sellerName != "" {
  608. condition += ` AND p.seller_name = '` + sellerName + `' `
  609. }
  610. condition += ` AND a.is_limit_people > 0 `
  611. total, err := cygx.GetCygxBreakAppointmentCount(condition, pars)
  612. if err != nil {
  613. br.Msg = "获取失败"
  614. br.ErrMsg = "获取失败,Err:" + err.Error()
  615. return
  616. }
  617. list, err = cygx.GetCygxBreakAppointmentList(condition, pars, startSize, pageSize)
  618. if err != nil {
  619. br.Msg = "获取失败"
  620. br.ErrMsg = "获取失败,Err:" + err.Error()
  621. return
  622. }
  623. for k, v := range list {
  624. if v.IsRestrict > 0 {
  625. list[k].Operation = true
  626. }
  627. sellerName, err := cygx.GetCompanySellerName(v.CompanyId)
  628. if err != nil {
  629. br.Msg = "获取信息失败"
  630. br.ErrMsg = "获取客户信息失败,Err:" + err.Error() + "CompanyId:" + strconv.Itoa(v.CompanyId)
  631. return
  632. }
  633. list[k].SellerName = sellerName
  634. }
  635. page := paging.GetPaging(currentIndex, pageSize, total)
  636. resp := new(cygx.GetCygxBreakAppointmentListRep)
  637. resp.List = list
  638. resp.Paging = page
  639. br.Ret = 200
  640. br.Success = true
  641. br.Msg = "获取成功"
  642. br.Data = resp
  643. }
  644. // @Title 销售姓名列表
  645. // @Description 获取销售姓名列表接口
  646. // @Success 200 {object} cygx.GetCygxSellerNameListRep
  647. // @router /activityMeet/sellerNameList [get]
  648. func (this *ActivityMeetCoAntroller) SellerName() {
  649. br := new(models.BaseResponse).Init()
  650. defer func() {
  651. this.Data["json"] = br
  652. this.ServeJSON()
  653. }()
  654. sysUser := this.SysUser
  655. if sysUser == nil {
  656. br.Msg = "请登录"
  657. br.ErrMsg = "请登录,SysUser Is Empty"
  658. return
  659. }
  660. list, err := cygx.GetCygxSellerNameList()
  661. if err != nil {
  662. br.Msg = "获取失败"
  663. br.ErrMsg = "获取失败,Err:" + err.Error()
  664. return
  665. }
  666. resp := new(cygx.GetCygxSellerNameListRep)
  667. resp.List = list
  668. br.Ret = 200
  669. br.Success = true
  670. br.Msg = "获取成功"
  671. br.Data = resp
  672. }
  673. // @Title 爽约详情
  674. // @Description 获取爽约详情列表接口
  675. // @Param UserId int string true "用户ID"
  676. // @Success 200 {object} cygx.GetCygxActivityBreakAppointmentRep
  677. // @router /activityMeet/breakAppointmentDetail [get]
  678. func (this *ActivityMeetCoAntroller) BreakAppointmentDetail() {
  679. br := new(models.BaseResponse).Init()
  680. defer func() {
  681. this.Data["json"] = br
  682. this.ServeJSON()
  683. }()
  684. sysUser := this.SysUser
  685. if sysUser == nil {
  686. br.Msg = "请登录"
  687. br.ErrMsg = "请登录,SysUser Is Empty"
  688. return
  689. }
  690. userId, _ := this.GetInt("UserId")
  691. detail, err := models.GetWxUserByUserId(userId)
  692. if err != nil {
  693. br.Msg = "操作失败"
  694. br.ErrMsg = "操作失败,Err:" + err.Error()
  695. return
  696. }
  697. list, err := cygx.GetCygxActivityBreakAppointmentList(detail.Mobile)
  698. if err != nil {
  699. br.Msg = "获取失败"
  700. br.ErrMsg = "获取失败,Err:" + err.Error()
  701. return
  702. }
  703. resp := new(cygx.GetCygxActivityBreakAppointmentRep)
  704. resp.List = list
  705. br.Ret = 200
  706. br.Success = true
  707. br.Msg = "获取成功"
  708. br.Data = resp
  709. }
  710. // @Title 报名限制操作
  711. // @Description 报名限制操作接口
  712. // @Param request body cygx.SignUpRestrictUid true "type json string"
  713. // @Success 200 操作成功
  714. // @router /activityMeet/signUpRestrictUid [post]
  715. func (this *ActivityMeetCoAntroller) SignUpRestrict() {
  716. br := new(models.BaseResponse).Init()
  717. defer func() {
  718. this.Data["json"] = br
  719. this.ServeJSON()
  720. }()
  721. AdminUser := this.SysUser
  722. if AdminUser == nil {
  723. br.Msg = "请登录"
  724. br.ErrMsg = "请登录,SysUser Is Empty"
  725. return
  726. }
  727. var req cygx.SignUpRestrictUid
  728. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  729. if err != nil {
  730. br.Msg = "参数解析异常!"
  731. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  732. return
  733. }
  734. uid := req.UserId
  735. total, errTotal := cygx.GetUserBreakAppointmentCount(uid)
  736. if errTotal != nil {
  737. br.Msg = "获取失败"
  738. br.ErrMsg = "获取失败,Err:" + errTotal.Error()
  739. return
  740. }
  741. if total == 0 {
  742. br.Msg = "该用户暂无爽约记录!"
  743. br.ErrMsg = "该用户暂无爽约记录,UserID:" + strconv.Itoa(uid)
  744. return
  745. }
  746. totalRestrictByUid, errRestrictByUid := cygx.GetCygxActivityRestrictSignupCount(uid)
  747. if errRestrictByUid != nil {
  748. br.Msg = "获取失败"
  749. br.ErrMsg = "获取失败,Err:" + errRestrictByUid.Error()
  750. return
  751. }
  752. if totalRestrictByUid == 0 {
  753. infoUser, err := cygx.GetUserAndCompanyNameList(uid)
  754. if err != nil {
  755. br.Msg = "获取失败"
  756. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  757. return
  758. }
  759. item := new(cygx.CygxActivityRestrictSignup)
  760. item.UserId = infoUser.UserId
  761. item.CreateTime = time.Now()
  762. item.Mobile = infoUser.Mobile
  763. item.Email = infoUser.Email
  764. item.CompanyId = infoUser.CompanyId
  765. item.CompanyName = infoUser.CompanyName
  766. item.IsRestrict = 1
  767. err = cygx.AddCygxActivityRestrictSignup(item)
  768. if err != nil {
  769. br.Msg = "操作失败"
  770. br.ErrMsg = "新增用户失败,Err:" + err.Error()
  771. return
  772. }
  773. } else {
  774. var newIsRestrict int
  775. detail, err := cygx.GetCygxActivityRestrictSignupInfo(uid)
  776. if err != nil {
  777. br.Msg = "操作失败"
  778. br.ErrMsg = "操作失败,Err:" + err.Error()
  779. return
  780. }
  781. if detail == nil {
  782. br.Msg = "操作失败"
  783. br.ErrMsg = "UserID错误,不存在UserID:"
  784. return
  785. }
  786. if detail.IsRestrict == 0 {
  787. newIsRestrict = 1
  788. } else {
  789. newIsRestrict = 0
  790. }
  791. err = cygx.UpdateCygxActivityRestrictSignup(newIsRestrict, uid)
  792. if err != nil {
  793. br.Msg = "操作失败"
  794. br.ErrMsg = "操作失败,Err:" + err.Error()
  795. return
  796. }
  797. }
  798. //添加操作日志记录
  799. br.Ret = 200
  800. br.Success = true
  801. br.Msg = "操作成功"
  802. br.IsAddLog = true
  803. }
  804. // @Title 线上到会管理详情
  805. // @Description 获取线上到会管理详情接口
  806. // @Param ActivityId query int true "活动ID"
  807. // @Success 200 {object} cygx.GetAppointmentListRep
  808. // @router /activityMeet/appointmentList [get]
  809. func (this *ActivityMeetCoAntroller) AppointmentList() {
  810. br := new(models.BaseResponse).Init()
  811. defer func() {
  812. this.Data["json"] = br
  813. this.ServeJSON()
  814. }()
  815. sysUser := this.SysUser
  816. if sysUser == nil {
  817. br.Msg = "请登录"
  818. br.ErrMsg = "请登录,SysUser Is Empty"
  819. return
  820. }
  821. activityId, _ := this.GetInt("ActivityId")
  822. if activityId < 1 {
  823. br.Msg = "活动不存在"
  824. return
  825. }
  826. activityInfo, _ := cygx.GetAddActivityInfoById(activityId)
  827. if activityInfo == nil {
  828. br.Msg = "活动不存在"
  829. br.ErrMsg = "活动ID错误,Err:activityId:" + strconv.Itoa(activityId)
  830. return
  831. }
  832. //超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
  833. resp := new(cygx.CanDownload)
  834. adminInfo, errAdmin := system.GetSysUserById(sysUser.AdminId)
  835. if errAdmin != nil {
  836. br.Msg = "获取失败"
  837. br.ErrMsg = "获取失败,Err:" + errAdmin.Error()
  838. return
  839. }
  840. if adminInfo.Role == "admin" || adminInfo.Role == "researcher" {
  841. resp.IsCanDownload = true
  842. }
  843. sqlStr := ` AND s.do_fail_type = 0`
  844. memberType := "Admin"
  845. list, err := cygx.GetCygxAppointmentList(activityId, sqlStr)
  846. if err != nil {
  847. br.Msg = "获取失败"
  848. br.ErrMsg = "获取失败,Err:" + err.Error()
  849. return
  850. }
  851. total, errtotal := cygx.GetCygxAppointmentCount(activityId, sqlStr)
  852. if errtotal != nil {
  853. br.Msg = "获取失败"
  854. br.ErrMsg = "客户总数获取失败,Err:" + errtotal.Error()
  855. return
  856. }
  857. myTotalsqlStr := `AND s.do_fail_type = 0 AND s.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id = ` + strconv.Itoa(sysUser.AdminId) + `) `
  858. myTotal, errmyTotal := cygx.GetCygxAppointmentCount(activityId, myTotalsqlStr)
  859. if errmyTotal != nil {
  860. br.Msg = "获取失败"
  861. br.ErrMsg = "我的客户总数获取失败,Err:" + errmyTotal.Error()
  862. return
  863. }
  864. for k, v := range list {
  865. list[k].SellerName = v.PsellerName
  866. }
  867. respList := new(cygx.GetAppointmentListRep)
  868. //销售查看自己客户,销售组长查看组员
  869. if resp.IsCanDownload == false {
  870. mapMobile, err := cygxService.GetAdminLookUserMobile(adminInfo)
  871. if err != nil {
  872. br.Msg = "获取失败"
  873. br.ErrMsg = "获取失败,销售对应权限,Err:" + err.Error()
  874. return
  875. }
  876. for _, v := range list {
  877. if _, ok := mapMobile[v.Mobile]; ok {
  878. respList.List = append(respList.List, v)
  879. }
  880. }
  881. } else {
  882. respList.List = list
  883. }
  884. if len(respList.List) == 0 {
  885. respList.List = make([]*cygx.CygxAppointmentList, 0)
  886. }
  887. respList.List = list
  888. respList.Total = total
  889. respList.MyTotal = myTotal
  890. respList.ActivityId = activityId
  891. respList.MemberType = memberType
  892. respList.IsLimitPeople = activityInfo.IsLimitPeople
  893. activityTypeId := activityInfo.ActivityTypeId
  894. if activityTypeId == 1 || activityTypeId == 2 {
  895. respList.ExcelType = "AppointmentCall"
  896. } else if activityTypeId == 5 || activityTypeId == 6 {
  897. respList.ExcelType = "ExpertSalon"
  898. } else if activityTypeId == 3 {
  899. respList.ExcelType = "Teleconference"
  900. } else if activityTypeId == 4 {
  901. respList.ExcelType = "OfflineResearch"
  902. } else if activityTypeId == 7 {
  903. respList.ExcelType = "CClass"
  904. }
  905. br.Ret = 200
  906. br.Success = true
  907. br.Msg = "获取成功"
  908. br.Data = respList
  909. }
  910. // @Title 客户参会记录下载
  911. // @Description 客户参会记录下载
  912. // @Success 200 导出成功
  913. // @router /activityMeet/meetingExport [get]
  914. func (this *ActivityMeetCoAntroller) SignupFailExport() {
  915. br := new(models.BaseResponse).Init()
  916. defer func() {
  917. this.Data["json"] = br
  918. this.ServeJSON()
  919. }()
  920. AdminUser := this.SysUser
  921. if AdminUser == nil {
  922. br.Msg = "请登录"
  923. br.ErrMsg = "请登录,SysUser Is Empty"
  924. return
  925. }
  926. //超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
  927. resp := new(cygx.CanDownload)
  928. adminInfo, errAdmin := system.GetSysUserById(AdminUser.AdminId)
  929. if errAdmin != nil {
  930. br.Msg = "获取失败"
  931. br.ErrMsg = "获取失败,Err:" + errAdmin.Error()
  932. return
  933. }
  934. if adminInfo.Role == "admin" || adminInfo.Role == "researcher" {
  935. resp.IsCanDownload = true
  936. }
  937. var err error
  938. var condition string
  939. var items []*cygx.MeetingExportRep
  940. list, err := cygx.GetMeetingExportAll(condition)
  941. if err != nil {
  942. br.Msg = "获取失败"
  943. br.ErrMsg = "获取失败,Err:" + err.Error()
  944. return
  945. }
  946. //销售查看自己客户,销售组长查看组员
  947. if resp.IsCanDownload == false {
  948. mapMobile, err := cygxService.GetAdminLookUserMobile(adminInfo)
  949. if err != nil {
  950. br.Msg = "获取失败"
  951. br.ErrMsg = "获取失败,销售对应权限,Err:" + err.Error()
  952. return
  953. }
  954. for _, v := range list {
  955. if _, ok := mapMobile[v.Mobile]; ok {
  956. items = append(items, v)
  957. }
  958. }
  959. } else {
  960. items = list
  961. }
  962. //创建excel
  963. dir, err := os.Executable()
  964. exPath := filepath.Dir(dir)
  965. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
  966. xlsxFile := xlsx.NewFile()
  967. if err != nil {
  968. br.Msg = "生成文件失败"
  969. br.ErrMsg = "生成文件失败"
  970. return
  971. }
  972. style := xlsx.NewStyle()
  973. alignment := xlsx.Alignment{
  974. Horizontal: "center",
  975. Vertical: "center",
  976. WrapText: true,
  977. }
  978. style.Alignment = alignment
  979. style.ApplyAlignment = true
  980. sheet, err := xlsxFile.AddSheet("到会管理名单")
  981. if err != nil {
  982. br.Msg = "新增Sheet失败"
  983. br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
  984. return
  985. }
  986. //标头
  987. rowTitle := sheet.AddRow()
  988. cellA := rowTitle.AddCell()
  989. cellA.Value = "公司名"
  990. cellB := rowTitle.AddCell()
  991. cellB.Value = "状态"
  992. cellC := rowTitle.AddCell()
  993. cellC.Value = "姓名"
  994. cellD := rowTitle.AddCell()
  995. cellD.Value = "手机号"
  996. cellE := rowTitle.AddCell()
  997. cellE.Value = "所属销售"
  998. cellF := rowTitle.AddCell()
  999. cellF.Value = "活动名称"
  1000. cellG := rowTitle.AddCell()
  1001. cellG.Value = "行业"
  1002. cellH := rowTitle.AddCell()
  1003. cellH.Value = "活动类型"
  1004. cellI := rowTitle.AddCell()
  1005. cellI.Value = "活动时间"
  1006. cellJ := rowTitle.AddCell()
  1007. cellJ.Value = "开通权限"
  1008. for _, item := range items {
  1009. row := sheet.AddRow()
  1010. cellA := row.AddCell()
  1011. cellA.Value = item.CompanyName
  1012. cellB := row.AddCell()
  1013. cellB.Value = item.Status
  1014. cellC := row.AddCell()
  1015. cellC.Value = item.RealName
  1016. cellD := row.AddCell()
  1017. cellD.Value = item.Mobile
  1018. cellE := row.AddCell()
  1019. cellE.Value = item.PsellerName
  1020. cellF := row.AddCell()
  1021. cellF.Value = item.ActivityName
  1022. cellG := row.AddCell()
  1023. cellG.Value = item.ChartPermissionName
  1024. cellH := row.AddCell()
  1025. cellH.Value = item.ActivityTypeName
  1026. cellI := row.AddCell()
  1027. cellI.Value = item.ActivityTimeText
  1028. cellJ := row.AddCell()
  1029. cellJ.Value = item.Permission
  1030. }
  1031. err = xlsxFile.Save(downLoadnFilePath)
  1032. if err != nil {
  1033. br.Msg = "保存文件失败"
  1034. br.ErrMsg = "保存文件失败"
  1035. return
  1036. }
  1037. randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
  1038. downloadFileName := "客户参会记录" + randStr + ".xlsx"
  1039. this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
  1040. defer func() {
  1041. os.Remove(downLoadnFilePath)
  1042. }()
  1043. //添加操作日志记录
  1044. br.Success = true
  1045. br.Ret = 200
  1046. br.Msg = "导出成功"
  1047. br.IsAddLog = true
  1048. }
  1049. // @Title 上传参会表格
  1050. // @Description 上传参会表格数据
  1051. // @Param File query file true "文件"
  1052. // @Param ActivityId query int true "活动ID"
  1053. // @Success 200 Ret=200 导入成功
  1054. // @router /activityMeet/import [post]
  1055. func (this *ActivityMeetCoAntroller) Import() {
  1056. br := new(models.BaseResponse).Init()
  1057. defer func() {
  1058. this.Data["json"] = br
  1059. this.ServeJSON()
  1060. }()
  1061. AdminUser := this.SysUser
  1062. if AdminUser == nil {
  1063. br.Msg = "请重新登录"
  1064. return
  1065. }
  1066. file, h, err := this.GetFile("File")
  1067. if err != nil {
  1068. br.Msg = "获取文件失败"
  1069. br.ErrMsg = "获取文件失败,Err:" + err.Error()
  1070. return
  1071. }
  1072. activityId, _ := this.GetInt("ActivityId")
  1073. if activityId <= 0 {
  1074. br.Msg = "参数错误"
  1075. br.ErrMsg = "活动id为0"
  1076. return
  1077. }
  1078. activityInfo, err := cygx.GetAddActivityInfoById(activityId)
  1079. if err != nil {
  1080. br.Msg = "活动不存在"
  1081. br.ErrMsg = "活动ID错误,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
  1082. return
  1083. }
  1084. //校验活动后台管理员、销售是否有修改权限
  1085. havePower, popupMsg, err := cygxService.CheckActivityUpdatePower(AdminUser.AdminId, activityInfo)
  1086. if err != nil {
  1087. br.Msg = "获取管理员身份信息失败"
  1088. br.ErrMsg = "获取管理员身份信息失败,Err:" + err.Error()
  1089. return
  1090. }
  1091. if !havePower {
  1092. br.Msg = popupMsg
  1093. return
  1094. }
  1095. if activityInfo.ActiveState != 3 && activityInfo.ActiveState != 2 {
  1096. br.Msg = "任务未开始,请稍后上传"
  1097. return
  1098. }
  1099. uploadDir := "static/xls"
  1100. err = os.MkdirAll(uploadDir, 766)
  1101. if err != nil {
  1102. br.Msg = "存储目录创建失败"
  1103. br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
  1104. return
  1105. }
  1106. path := uploadDir + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + h.Filename
  1107. defer file.Close()
  1108. err = this.SaveToFile("File", path)
  1109. if err != nil {
  1110. br.Msg = "文件保存失败"
  1111. br.ErrMsg = "文件保存失败,Err:" + err.Error()
  1112. return
  1113. }
  1114. xlFile, err := xlsx.OpenFile(path)
  1115. if err != nil {
  1116. br.Msg = "文件导入失败"
  1117. br.ErrMsg = "文件导入失败,Err:" + err.Error()
  1118. return
  1119. }
  1120. defer func() {
  1121. os.Remove(path)
  1122. }()
  1123. //允许添加的联系人
  1124. needAddAttendanc := make([]*cygx.CygxActivityAttendanceDetail, 0)
  1125. var mobileStr string
  1126. // 遍历sheet页读取
  1127. realNameKey, mobileKey, companyNameKey, positionKey, firstMeetingTimeKey, lastMeetingTimeKey, durationKey, meetingTypeStrKey, meetingAuthenticationKey, meetingStatusStrKey := -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
  1128. for _, sheet := range xlFile.Sheets {
  1129. //遍历行读取
  1130. maxRow := sheet.MaxRow
  1131. for i := 0; i < maxRow; i++ {
  1132. if i == 0 {
  1133. row := sheet.Row(i)
  1134. cells := row.Cells
  1135. for k, cell := range cells {
  1136. text := cell.String()
  1137. if text == "姓名" {
  1138. realNameKey = k
  1139. }
  1140. if text == "电话" {
  1141. mobileKey = k
  1142. }
  1143. if text == "公司" {
  1144. companyNameKey = k
  1145. }
  1146. if text == "职位" {
  1147. positionKey = k
  1148. }
  1149. if text == "首次入会时间" {
  1150. firstMeetingTimeKey = k
  1151. }
  1152. if text == "最后退出时间" {
  1153. lastMeetingTimeKey = k
  1154. }
  1155. if text == "参与总时长(分)" {
  1156. durationKey = k
  1157. }
  1158. if text == "参会方式" {
  1159. meetingTypeStrKey = k
  1160. }
  1161. if text == "参会鉴权" {
  1162. meetingAuthenticationKey = k
  1163. }
  1164. if text == "参会状态" {
  1165. meetingStatusStrKey = k
  1166. }
  1167. }
  1168. }
  1169. if i == 0 {
  1170. if mobileKey == -1 {
  1171. br.Msg = "模板格式错误,缺少:电话"
  1172. br.ErrMsg = "模板格式错误"
  1173. return
  1174. }
  1175. if firstMeetingTimeKey == -1 {
  1176. br.Msg = "模板格式错误,缺少:首次入会时间"
  1177. br.ErrMsg = "模板格式错误!"
  1178. return
  1179. }
  1180. if lastMeetingTimeKey == -1 {
  1181. br.Msg = "模板格式错误,缺少:最后退出时间"
  1182. br.ErrMsg = "模板格式错误!"
  1183. return
  1184. }
  1185. if durationKey == -1 {
  1186. br.Msg = "模板格式错误,缺少:参与总时长"
  1187. br.ErrMsg = "模板格式错误!"
  1188. return
  1189. }
  1190. }
  1191. if i >= 1 {
  1192. row := sheet.Row(i)
  1193. cells := row.Cells
  1194. var realName, mobile, companyName, position, sellerName, firstMeetingTime, lastMeetingTime, duration, meetingTypeStr, meetingAuthentication, meetingStatusStr string
  1195. for k, cell := range cells {
  1196. if k == realNameKey {
  1197. realName = cell.String()
  1198. }
  1199. if k == mobileKey {
  1200. mobile = cell.String()
  1201. //if mobile != "" {
  1202. // fmt.Println(mobile)
  1203. // _, err := strconv.ParseFloat(mobile, 64)
  1204. // if err != nil {
  1205. // br.Msg = "手机号存在非数字类字符!"
  1206. // br.ErrMsg = "手机号存在非数字类字符!err:" + err.Error() + mobile
  1207. // return
  1208. // }
  1209. //}
  1210. }
  1211. if k == companyNameKey {
  1212. companyName = cell.String()
  1213. }
  1214. if k == positionKey {
  1215. position = cell.String()
  1216. }
  1217. if k == firstMeetingTimeKey {
  1218. firstMeetingTime = cell.String()
  1219. }
  1220. if k == lastMeetingTimeKey {
  1221. lastMeetingTime = cell.String()
  1222. }
  1223. if k == durationKey {
  1224. duration = cell.String()
  1225. }
  1226. if k == meetingTypeStrKey {
  1227. meetingTypeStr = cell.String()
  1228. }
  1229. if k == meetingAuthenticationKey {
  1230. meetingAuthentication = cell.String()
  1231. }
  1232. if k == meetingStatusStrKey {
  1233. meetingStatusStr = cell.String()
  1234. }
  1235. }
  1236. //这些字段都没有的话,系统认为excel到底了
  1237. if duration == "" && mobile == "" && firstMeetingTime == "" {
  1238. break
  1239. }
  1240. item := new(cygx.CygxActivityAttendanceDetail)
  1241. item.ActivityId = activityId
  1242. item.RealName = realName
  1243. item.Mobile = mobile
  1244. item.CompanyName = companyName
  1245. item.SellerName = sellerName
  1246. item.FirstMeetingTime = firstMeetingTime
  1247. item.LastMeetingTime = lastMeetingTime
  1248. item.Duration = duration
  1249. item.MeetingTypeStr = meetingTypeStr
  1250. item.MeetingAuthentication = meetingAuthentication
  1251. item.MeetingStatusStr = meetingStatusStr
  1252. item.Position = position
  1253. item.CreateTime = time.Now()
  1254. if mobile != "" {
  1255. mobileStr += "'" + mobile + "'" + ","
  1256. needAddAttendanc = append(needAddAttendanc, item)
  1257. }
  1258. }
  1259. }
  1260. }
  1261. mobileStr = strings.TrimRight(mobileStr, ",")
  1262. if mobileStr == "" {
  1263. mobileStr = "1"
  1264. }
  1265. list, err := cygx.GetWxUserOutboundMobile(mobileStr)
  1266. if err != nil {
  1267. br.Msg = "上传失败"
  1268. br.ErrMsg = "获取用户信息失败,Err:" + err.Error()
  1269. return
  1270. }
  1271. for k, v := range needAddAttendanc {
  1272. for _, v2 := range list {
  1273. if v2.OutboundMobile == v.Mobile {
  1274. needAddAttendanc[k].CompanyId = v2.CompanyId
  1275. }
  1276. }
  1277. }
  1278. err = cygx.AddAttendancDetail(needAddAttendanc, activityId, mobileStr)
  1279. if err != nil {
  1280. br.Msg = "上传失败"
  1281. br.ErrMsg = "文件保存失败,Err:" + err.Error()
  1282. return
  1283. }
  1284. go cygxService.AddCygxActivityRestrictSignupByAdmin(activityId)
  1285. go cygx.AddCygxActivityMeetDetailLogOnline(needAddAttendanc, activityId)
  1286. //添加操作日志记录
  1287. br.Msg = "导入成功"
  1288. br.Ret = 200
  1289. br.Success = true
  1290. br.IsAddLog = true
  1291. }
  1292. // @Title 线上到会详情
  1293. // @Description 获取线上到会详情接口
  1294. // @Param ActivityId query int true "活动ID"
  1295. // @Success 200 {object} cygx.AttendanceDetailList
  1296. // @router /activityMeet/attendanceDetail [get]
  1297. func (this *ActivityMeetCoAntroller) AttendanceDetail() {
  1298. br := new(models.BaseResponse).Init()
  1299. defer func() {
  1300. this.Data["json"] = br
  1301. this.ServeJSON()
  1302. }()
  1303. sysUser := this.SysUser
  1304. if sysUser == nil {
  1305. br.Msg = "请登录"
  1306. br.ErrMsg = "请登录,SysUser Is Empty"
  1307. return
  1308. }
  1309. activityId, _ := this.GetInt("ActivityId")
  1310. if activityId < 1 {
  1311. br.Msg = "活动不存在"
  1312. return
  1313. }
  1314. activityInfo, _ := cygx.GetAddActivityInfoById(activityId)
  1315. if activityInfo == nil {
  1316. br.Msg = "活动不存在"
  1317. br.ErrMsg = "活动ID错误,Err:activityId:" + strconv.Itoa(activityId)
  1318. return
  1319. }
  1320. //超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
  1321. resp := new(cygx.CanDownload)
  1322. adminInfo, errAdmin := system.GetSysUserById(sysUser.AdminId)
  1323. if errAdmin != nil {
  1324. br.Msg = "获取失败"
  1325. br.ErrMsg = "获取失败,Err:" + errAdmin.Error()
  1326. return
  1327. }
  1328. if adminInfo.Role == "admin" || adminInfo.Role == "researcher" {
  1329. resp.IsCanDownload = true
  1330. }
  1331. var condition string
  1332. var condition2 string
  1333. //同一用户上传多次参会记录时,到会与未到会分开查询
  1334. list1, err := cygx.GetAttendanceDetailListGroup(activityId, condition+` AND s.is_meeting = 1 AND d.userid_entity != 3 GROUP BY s.user_id `)
  1335. if err != nil {
  1336. br.Msg = "获取失败"
  1337. br.ErrMsg = "获取失败,Err:" + err.Error()
  1338. return
  1339. }
  1340. listGroup, err := cygx.GetAttendanceDetailListGroup(activityId, condition+` AND s.is_meeting = 0 GROUP BY s.user_id `)
  1341. if err != nil {
  1342. br.Msg = "获取失败"
  1343. br.ErrMsg = "获取失败,Err:" + err.Error()
  1344. return
  1345. }
  1346. if len(listGroup) > 0 {
  1347. for _, v := range listGroup {
  1348. list1 = append(list1, v)
  1349. }
  1350. }
  1351. mobileStr := ""
  1352. for _, v := range list1 {
  1353. if v.OutboundMobile != "" {
  1354. mobileStr += v.OutboundMobile + ","
  1355. }
  1356. if v.Mobile != "" {
  1357. mobileStr += v.Mobile + ","
  1358. }
  1359. }
  1360. mobileStr = strings.TrimRight(mobileStr, ",")
  1361. if mobileStr == "" {
  1362. mobileStr = "1"
  1363. }
  1364. condition2 += ` AND d.mobile NOT IN ( ` + mobileStr + ` ) `
  1365. list2, err := cygx.GetAttendanceDetailList2(activityId, condition2+` AND u.company_id != 1 `)
  1366. if err != nil {
  1367. br.Msg = "获取失败"
  1368. br.ErrMsg = "获取失败,Err:" + err.Error()
  1369. return
  1370. }
  1371. listNoAppointment, err := cygx.GetAttendanceDetailList2(activityId, ` AND d.mobile NOT IN ( `+mobileStr+` ) `+` AND u.company_id != 1 `) //未预约 所有
  1372. if err != nil {
  1373. br.Msg = "获取失败"
  1374. br.ErrMsg = "获取失败,Err:" + err.Error()
  1375. return
  1376. }
  1377. for _, v := range listNoAppointment {
  1378. if v.Mobile != "" {
  1379. mobileStr += "," + v.Mobile
  1380. }
  1381. }
  1382. //不在公司客户体系里面的也算潜在客户,通过手机号来排除 潜在客户不做权限判断
  1383. mobileStr = strings.TrimLeft(mobileStr, ",")
  1384. condition2 = ` AND d.real_name NOT LIKE '%专家%' AND d.mobile NOT IN ( ` + mobileStr + ` ) `
  1385. var isBloneSell bool //是否属于销售添加
  1386. var isProhibit bool // 是否禁止展示
  1387. if activityInfo.AdminId > 0 {
  1388. adminInfoActivity, errAdmin := system.GetSysUserById(activityInfo.AdminId)
  1389. if errAdmin != nil && errAdmin.Error() != utils.ErrNoRow() {
  1390. br.Msg = "获取失败"
  1391. br.ErrMsg = "获取失败,Err:" + errAdmin.Error()
  1392. return
  1393. }
  1394. if adminInfoActivity != nil {
  1395. roleTypeCode := adminInfoActivity.RoleTypeCode
  1396. if roleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
  1397. isBloneSell = true
  1398. }
  1399. //如果这个活动属于销售创建,而且不是这个销售自己查看的,并且查看的角色不属于管理员或者权益管理员,那么就做限制处理
  1400. if isBloneSell && sysUser.AdminId != adminInfoActivity.AdminId && (sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN) {
  1401. //isProhibit = true //限制又取消了。2023-06-14
  1402. }
  1403. }
  1404. }
  1405. list3, err := cygx.GetAttendanceDetailList3(activityId, condition2)
  1406. if err != nil {
  1407. br.Msg = "获取失败"
  1408. br.ErrMsg = "获取失败,Err:" + err.Error()
  1409. return
  1410. }
  1411. for k, v := range list1 {
  1412. if v.FirstMeetingTime == "0000-00-00 00:00:00" {
  1413. list1[k].FirstMeetingTime = ""
  1414. list1[k].LastMeetingTime = ""
  1415. }
  1416. }
  1417. for k, v := range list2 {
  1418. if v.FirstMeetingTime == "0000-00-00 00:00:00" {
  1419. list2[k].FirstMeetingTime = ""
  1420. list2[k].LastMeetingTime = ""
  1421. }
  1422. }
  1423. mobileStr = ""
  1424. for k, v := range list3 {
  1425. if v.FirstMeetingTime == "0000-00-00 00:00:00" {
  1426. list3[k].FirstMeetingTime = ""
  1427. list3[k].LastMeetingTime = ""
  1428. }
  1429. if v.Mobile != "" {
  1430. mobileStr += v.Mobile + ","
  1431. }
  1432. }
  1433. mapRemark := make(map[string]string)
  1434. if isProhibit {
  1435. list3 = make([]*cygx.AttendanceDetail, 0)
  1436. } else {
  1437. mobileStr = strings.TrimRight(mobileStr, ",")
  1438. if mobileStr != "" {
  1439. listRemark, err := cygx.GetCygxActivityUserRemarksLlistByActivityId(mobileStr, activityId)
  1440. if err != nil && err.Error() != utils.ErrNoRow() {
  1441. br.Msg = "获取信息失败"
  1442. br.ErrMsg = "获取备注信息失败,Err:" + err.Error()
  1443. return
  1444. }
  1445. for _, v := range listRemark {
  1446. if mapRemark[v.Mobile] == "" {
  1447. mapRemark[v.Mobile] = v.Content
  1448. }
  1449. }
  1450. for k, v := range list3 {
  1451. if mapRemark[v.Mobile] != "" {
  1452. list3[k].Content = mapRemark[v.Mobile]
  1453. }
  1454. }
  1455. }
  1456. }
  1457. //添加浏览记录
  1458. item := new(cygx.CygxActivityMeetingHistory)
  1459. item.ActivityId = activityId
  1460. item.AdminId = sysUser.AdminId
  1461. item.RealName = sysUser.RealName
  1462. item.RoleTypeCode = sysUser.RoleTypeCode
  1463. item.CreateTime = time.Now()
  1464. err = cygx.AddCygxActivityMeetingHistory(item)
  1465. resplist := new(cygx.AttendanceDetailList)
  1466. if resp.IsCanDownload == false {
  1467. var conditionMobile string
  1468. if adminInfo.RoleTypeCode == "rai_group" {
  1469. //组长查看本组所有组员
  1470. conditionMobile = ` SELECT mobile FROM user_seller_relation WHERE seller_id IN (SELECT admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(sysUser.AdminId) + ` )) `
  1471. } else {
  1472. //组员查看自己
  1473. conditionMobile = ` SELECT mobile FROM user_seller_relation WHERE seller_id = ` + strconv.Itoa(sysUser.AdminId)
  1474. }
  1475. mobileList, err := cygx.GetSellerUserMobile(conditionMobile)
  1476. if err != nil {
  1477. br.Msg = "获取失败"
  1478. br.ErrMsg = "获取失败,GetSellerUserMobile Err:" + err.Error()
  1479. return
  1480. }
  1481. mapUserMobile := make(map[string]string)
  1482. for _, v := range mobileList {
  1483. mapUserMobile[v.Mobile] = v.Mobile
  1484. }
  1485. for _, v := range list1 {
  1486. if _, ok := mapUserMobile[v.Mobile]; ok {
  1487. resplist.List1 = append(resplist.List1, v)
  1488. }
  1489. }
  1490. for _, v := range list2 {
  1491. if _, ok := mapUserMobile[v.Mobile]; ok {
  1492. resplist.List2 = append(resplist.List2, v)
  1493. }
  1494. }
  1495. } else {
  1496. resplist.List1 = list1
  1497. resplist.List2 = list2
  1498. }
  1499. resplist.List3 = list3
  1500. br.Ret = 200
  1501. br.Success = true
  1502. br.Msg = "获取成功"
  1503. br.Data = resplist
  1504. }
  1505. // @Title 线上活动进门财经关联匹配列表
  1506. // @Description 获取线上活动进门财经关联匹配列表接口
  1507. // @Param KeyWord query string false "搜索关键词"
  1508. // @Success 200 {object} cygx.RoadshowDataTitleList
  1509. // @router /activityMeet/matchingList [get]
  1510. func (this *ActivityMeetCoAntroller) MatchingList() {
  1511. br := new(models.BaseResponse).Init()
  1512. defer func() {
  1513. this.Data["json"] = br
  1514. this.ServeJSON()
  1515. }()
  1516. sysUser := this.SysUser
  1517. if sysUser == nil {
  1518. br.Msg = "请登录"
  1519. br.ErrMsg = "请登录,SysUser Is Empty"
  1520. return
  1521. }
  1522. keyWord := this.GetString("KeyWord")
  1523. if keyWord == "" {
  1524. br.Msg = "请输入搜索内容"
  1525. return
  1526. }
  1527. list, err := cygx.GetRoadshowDataTitleList(keyWord)
  1528. if err != nil && err.Error() != utils.ErrNoRow() {
  1529. br.Msg = "获取信息失败"
  1530. br.ErrMsg = "获取信息失败,Err:" + err.Error()
  1531. return
  1532. }
  1533. resplist := new(cygx.RoadshowDataTitleList)
  1534. for k, v := range list {
  1535. list[k].ActivityTime = utils.StrTimeToTime(v.ActivityTime).Format(utils.FormatDate)
  1536. nameSlice := strings.Split(v.RoadshowTitle, "|")
  1537. var activityName string
  1538. if len(nameSlice) > 1 {
  1539. activityName = nameSlice[len(nameSlice)-1]
  1540. //activityName = strings.Replace(activityName, " ", "", -1)
  1541. }
  1542. if activityName != "" {
  1543. list[k].RoadshowTitle = activityName
  1544. }
  1545. }
  1546. resplist.List = list
  1547. br.Ret = 200
  1548. br.Success = true
  1549. br.Msg = "获取成功"
  1550. br.Data = resplist
  1551. }
  1552. // @Title 手动匹配线上客户参会记录
  1553. // @Description 手动匹配线上客户参会记录接口
  1554. // @Param request body cygx.RoadshowDataTitleResp true "type json string"
  1555. // @Success 200 操作成功
  1556. // @router /activityMeet/matchingByHand [post]
  1557. func (this *ActivityMeetCoAntroller) MatchingByHand() {
  1558. br := new(models.BaseResponse).Init()
  1559. defer func() {
  1560. this.Data["json"] = br
  1561. this.ServeJSON()
  1562. }()
  1563. AdminUser := this.SysUser
  1564. if AdminUser == nil {
  1565. br.Msg = "请登录"
  1566. br.ErrMsg = "请登录,SysUser Is Empty"
  1567. return
  1568. }
  1569. var req cygx.RoadshowDataTitleResp
  1570. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  1571. if err != nil {
  1572. br.Msg = "参数解析异常!"
  1573. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  1574. return
  1575. }
  1576. var mobileStr string
  1577. var userIdArr []int
  1578. activityId := req.ActivityId
  1579. keyWord := req.KeyWord
  1580. slice := strings.Split(keyWord, "{|}")
  1581. detail, err := cygx.GetAddActivityInfoById(activityId)
  1582. if err != nil {
  1583. br.Msg = "活动不存在"
  1584. br.ErrMsg = "活动ID错误,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
  1585. return
  1586. }
  1587. //校验活动后台管理员、销售是否有修改权限
  1588. havePower, popupMsg, err := cygxService.CheckActivityUpdatePower(AdminUser.AdminId, detail)
  1589. if err != nil {
  1590. br.Msg = "获取管理员身份信息失败"
  1591. br.ErrMsg = "获取管理员身份信息失败,Err:" + err.Error()
  1592. return
  1593. }
  1594. if !havePower {
  1595. br.Msg = popupMsg
  1596. return
  1597. }
  1598. var condition string
  1599. dateTime := detail.ActivityTime
  1600. dateTime = utils.TimeRemoveHms(dateTime)
  1601. condition += ` AND roadshow_begin_time >= ` + "'" + dateTime + " 00:00:00'"
  1602. condition += ` AND roadshow_begin_time <= ` + "'" + dateTime + " 23:59:59'"
  1603. if len(slice) > 0 {
  1604. keyWord = slice[0]
  1605. }
  1606. if keyWord != "" {
  1607. list, err := cygx.GetRoadshowDataList(keyWord, condition)
  1608. if err != nil {
  1609. br.Msg = "手动归类失败"
  1610. br.ErrMsg = "获取进门财经数据失败,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
  1611. return
  1612. }
  1613. var roadshowId string
  1614. for _, v := range list {
  1615. if v.RoadshowId != "" {
  1616. roadshowId = v.RoadshowId
  1617. break
  1618. }
  1619. }
  1620. needAddAttendanc := make([]*cygx.CygxActivityAttendanceDetail, 0)
  1621. if len(list) > 0 {
  1622. err = cygx.UpdateActivityRoadshowTitle(activityId, keyWord, roadshowId)
  1623. if err != nil {
  1624. br.Msg = "手动归类失败"
  1625. br.ErrMsg = "关联匹配类型失败,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
  1626. return
  1627. }
  1628. for _, v := range list {
  1629. if v.UserPhone != "" {
  1630. item := new(cygx.CygxActivityAttendanceDetail)
  1631. item.ActivityId = activityId
  1632. item.RealName = v.UserName
  1633. item.Mobile = v.UserPhone
  1634. item.CompanyName = v.Company
  1635. //item.SellerName = sellerName
  1636. item.FirstMeetingTime = v.FirstWatchTime
  1637. item.LastMeetingTime = v.LastWatchTime
  1638. item.Duration = utils.GetAttendanceDetailSeconds(v.JoinTime)
  1639. if v.JoinType == 1 {
  1640. item.MeetingTypeStr = "网络"
  1641. } else {
  1642. item.MeetingTypeStr = "电话"
  1643. }
  1644. item.MeetingAuthentication = v.AuthInfo
  1645. if v.DataType == 1 {
  1646. item.MeetingStatusStr = "直播"
  1647. } else {
  1648. item.MeetingStatusStr = "回放"
  1649. }
  1650. item.Position = v.Occupation
  1651. item.UseridEntity = v.UseridEntity
  1652. item.CrmCompanyMapStatusId = v.CrmCompanyMapStatusId
  1653. item.CreateTime = time.Now()
  1654. mobileStr += "'" + v.UserPhone + "'" + ","
  1655. needAddAttendanc = append(needAddAttendanc, item)
  1656. }
  1657. }
  1658. mobileStr = strings.TrimRight(mobileStr, ",")
  1659. if mobileStr == "" {
  1660. mobileStr = "1"
  1661. }
  1662. listUser, err := cygx.GetWxUserOutboundMobile(mobileStr)
  1663. if err != nil {
  1664. br.Msg = "手动归类失败!"
  1665. br.ErrMsg = "获取用户列表失败,Err:" + err.Error()
  1666. return
  1667. }
  1668. for _, v := range listUser {
  1669. userIdArr = append(userIdArr, v.UserId)
  1670. }
  1671. for k, v := range needAddAttendanc {
  1672. for _, v2 := range listUser {
  1673. if v2.OutboundMobile == v.Mobile {
  1674. needAddAttendanc[k].CompanyId = v2.CompanyId
  1675. needAddAttendanc[k].SellerName = v2.SellerName
  1676. needAddAttendanc[k].CompanyName = v2.CompanyName
  1677. needAddAttendanc[k].IsMeetingStr = 1
  1678. }
  1679. }
  1680. }
  1681. err = cygx.AddAttendancDetail(needAddAttendanc, activityId, mobileStr)
  1682. if err != nil {
  1683. br.Msg = "手动归类失败"
  1684. br.ErrMsg = "手动归类失败,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
  1685. return
  1686. }
  1687. go cygxService.AddCygxActivityRestrictSignupByAdmin(activityId)
  1688. go cygx.AddCygxActivityMeetDetailLogOnline(needAddAttendanc, activityId)
  1689. go cygxService.ActivityUserLabelLogAdd(activityId, userIdArr)
  1690. } else {
  1691. br.Msg = "手动归类失败"
  1692. br.ErrMsg = "暂未找到匹配数据!"
  1693. return
  1694. }
  1695. }
  1696. //添加操作日志记录
  1697. br.Ret = 200
  1698. br.Success = true
  1699. br.Msg = "操作成功"
  1700. br.IsAddLog = true
  1701. }
  1702. // @Title 下载客户参会记录
  1703. // @Description 下载客户参会记录接口
  1704. // @Param CompanyId query int true "公司ID"
  1705. // @Param MeetType query int true "参会方式 1线上,2线下 默认为线上"
  1706. // @Success Ret=200
  1707. // @router /activityMeet/companyHistory [get]
  1708. func (this *ActivityMeetCoAntroller) CompanyHisory() {
  1709. br := new(models.BaseResponse).Init()
  1710. var err error
  1711. defer func() {
  1712. this.Data["json"] = br
  1713. this.ServeJSON()
  1714. if err != nil {
  1715. go alarm_msg.SendAlarmMsg("URI:"+this.Ctx.Input.URI()+"<br/> "+"下载客户参会记录失败"+err.Error(), 3)
  1716. }
  1717. }()
  1718. sysUser := this.SysUser
  1719. if sysUser == nil {
  1720. br.Msg = "请登录"
  1721. br.ErrMsg = "请登录,SysUser Is Empty"
  1722. return
  1723. }
  1724. companyId, _ := this.GetInt("CompanyId")
  1725. meetType, _ := this.GetInt("MeetType")
  1726. if companyId < 1 {
  1727. br.Msg = "请输入公司ID"
  1728. return
  1729. }
  1730. //超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
  1731. var isCanDownload bool
  1732. adminInfo, err := system.GetSysUserById(sysUser.AdminId)
  1733. if err != nil {
  1734. br.Msg = "获取失败"
  1735. br.ErrMsg = "获取失败,Err:" + err.Error()
  1736. return
  1737. }
  1738. if adminInfo.Role == "admin" || strings.Index(adminInfo.RoleTypeCode, "rai") > -1 {
  1739. isCanDownload = true
  1740. }
  1741. if !isCanDownload {
  1742. br.Msg = "暂无下载权限"
  1743. return
  1744. }
  1745. //获取企业客户信息
  1746. companyInfo, err := company.GetCompanyById(companyId)
  1747. if err != nil {
  1748. br.Msg = "获取失败"
  1749. br.ErrMsg = "获取企业客户信息失败,Err:" + err.Error()
  1750. return
  1751. }
  1752. var list []*cygx.CompanyMeetRep
  1753. mobiles, err := models.GetCompanyUserMobilesByCompanyId(companyId)
  1754. if err != nil && err.Error() != utils.ErrNoRow() {
  1755. br.Msg = "获取信息失败"
  1756. br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
  1757. return
  1758. }
  1759. var meetTypeName string
  1760. if mobiles != "" {
  1761. mobiles = strings.Replace(mobiles, ",", "','", -1)
  1762. mobiles = "'" + mobiles + "'"
  1763. if meetType != 2 {
  1764. list, err = cygx.GetCygxActivityAttendanceDetailByCompanyId(mobiles)
  1765. meetTypeName = "线上"
  1766. } else {
  1767. list, err = cygx.GetCygxActivityOfflineMeetingDetailByCompanyId(mobiles)
  1768. meetTypeName = "线下"
  1769. }
  1770. }
  1771. if err != nil && err.Error() != utils.ErrNoRow() {
  1772. br.Msg = "获取信息失败"
  1773. br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
  1774. return
  1775. }
  1776. //创建excel
  1777. dir, err := os.Executable()
  1778. exPath := filepath.Dir(dir)
  1779. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
  1780. xlsxFile := xlsx.NewFile()
  1781. if err != nil {
  1782. br.Msg = "生成文件失败"
  1783. br.ErrMsg = "生成文件失败"
  1784. return
  1785. }
  1786. style := xlsx.NewStyle()
  1787. alignment := xlsx.Alignment{
  1788. Horizontal: "center",
  1789. Vertical: "center",
  1790. WrapText: true,
  1791. }
  1792. style.Alignment = alignment
  1793. style.ApplyAlignment = true
  1794. sheet, err := xlsxFile.AddSheet(meetTypeName + "参会记录统计")
  1795. if err != nil {
  1796. br.Msg = "新增Sheet失败"
  1797. br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
  1798. return
  1799. }
  1800. //标头
  1801. rowTitle := sheet.AddRow()
  1802. cellA := rowTitle.AddCell()
  1803. cellA.Value = "姓名"
  1804. cellB := rowTitle.AddCell()
  1805. cellB.Value = "手机号/邮箱"
  1806. cellC := rowTitle.AddCell()
  1807. cellC.Value = "活动名称"
  1808. cellD := rowTitle.AddCell()
  1809. cellD.Value = "所属行业"
  1810. cellE := rowTitle.AddCell()
  1811. cellE.Value = "活动类型"
  1812. cellF := rowTitle.AddCell()
  1813. cellF.Value = "活动主题"
  1814. cellG := rowTitle.AddCell()
  1815. cellG.Value = "活动时间"
  1816. if meetType != 2 {
  1817. cellH := rowTitle.AddCell()
  1818. cellH.Value = "首次入会时间"
  1819. cellI := rowTitle.AddCell()
  1820. cellI.Value = "最后退出时间"
  1821. cellJ := rowTitle.AddCell()
  1822. cellJ.Value = "参与总时长"
  1823. cellK := rowTitle.AddCell()
  1824. cellK.Value = "参会方式"
  1825. cellL := rowTitle.AddCell()
  1826. cellL.Value = "参会鉴权"
  1827. cellM := rowTitle.AddCell()
  1828. cellM.Value = "参会状态"
  1829. }
  1830. for _, item := range list {
  1831. row := sheet.AddRow()
  1832. cellA := row.AddCell()
  1833. cellA.Value = item.RealName
  1834. cellB := row.AddCell()
  1835. cellB.Value = item.Mobile
  1836. if item.Mobile == "" {
  1837. cellB.Value = item.Email
  1838. }
  1839. cellC := row.AddCell()
  1840. cellC.Value = item.ActivityName
  1841. cellD := row.AddCell()
  1842. cellD.Value = item.ChartPermissionName
  1843. cellE := row.AddCell()
  1844. cellE.Value = item.ActivityTypeName
  1845. cellF := row.AddCell()
  1846. cellF.Value = item.Label
  1847. cellG := row.AddCell()
  1848. cellG.Value = item.ActivityTime
  1849. cellH := row.AddCell()
  1850. if meetType != 2 {
  1851. cellH.Value = item.FirstMeetingTime
  1852. cellI := row.AddCell()
  1853. cellI.Value = item.LastMeetingTime
  1854. cellJ := row.AddCell()
  1855. cellJ.Value = item.Duration
  1856. cellK := row.AddCell()
  1857. cellK.Value = item.MeetingTypeStr
  1858. cellL := row.AddCell()
  1859. cellL.Value = item.MeetingAuthentication
  1860. cellM := row.AddCell()
  1861. cellM.Value = item.MeetingStatusStr
  1862. }
  1863. }
  1864. err = xlsxFile.Save(downLoadnFilePath)
  1865. if err != nil {
  1866. br.Msg = "保存文件失败"
  1867. br.ErrMsg = "保存文件失败"
  1868. return
  1869. }
  1870. randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
  1871. downloadFileName := companyInfo.CompanyName + meetTypeName + "参会记录" + randStr + ".xlsx"
  1872. this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
  1873. defer func() {
  1874. os.Remove(downLoadnFilePath)
  1875. }()
  1876. //添加操作日志记录
  1877. br.Ret = 200
  1878. br.Success = true
  1879. br.Msg = "导出成功"
  1880. br.IsAddLog = true
  1881. }
  1882. // @Title 下载客户参会月度统计记录
  1883. // @Description 下载客户参会月度统计记录接口
  1884. // @Param CompanyId query int true "公司ID"
  1885. // @Param MeetType query int true "参会方式 1线上,2线下 默认为线上"
  1886. // @Success Ret=200
  1887. // @router /activityMeet/companyCoount [get]
  1888. func (this *ActivityMeetCoAntroller) CompanyCoount() {
  1889. br := new(models.BaseResponse).Init()
  1890. defer func() {
  1891. this.Data["json"] = br
  1892. this.ServeJSON()
  1893. }()
  1894. sysUser := this.SysUser
  1895. if sysUser == nil {
  1896. br.Msg = "请登录"
  1897. br.ErrMsg = "请登录,SysUser Is Empty"
  1898. return
  1899. }
  1900. companyId, _ := this.GetInt("CompanyId")
  1901. meetType, _ := this.GetInt("MeetType")
  1902. if companyId < 1 {
  1903. br.Msg = "请输入公司ID"
  1904. return
  1905. }
  1906. //超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
  1907. var isCanDownload bool
  1908. adminInfo, err := system.GetSysUserById(sysUser.AdminId)
  1909. if err != nil {
  1910. br.Msg = "获取失败"
  1911. br.ErrMsg = "获取失败,Err:" + err.Error()
  1912. return
  1913. }
  1914. if adminInfo.Role == "admin" || strings.Index(adminInfo.RoleTypeCode, "rai") > -1 {
  1915. isCanDownload = true
  1916. }
  1917. if !isCanDownload {
  1918. br.Msg = "暂无下载权限"
  1919. return
  1920. }
  1921. //获取企业客户信息
  1922. companyInfo, err := company.GetCompanyById(companyId)
  1923. if err != nil {
  1924. br.Msg = "获取失败"
  1925. br.ErrMsg = "获取企业客户信息失败,Err:" + err.Error()
  1926. return
  1927. }
  1928. var list []*cygx.CompanyMeetRep
  1929. listDate, err := cygx.GetCompanyAciviytyGroupDate()
  1930. if err != nil {
  1931. br.Msg = "获取失败"
  1932. br.ErrMsg = "获取失败,Err:" + err.Error()
  1933. return
  1934. }
  1935. dateMap := make(map[string]int)
  1936. permissionNameMap := make(map[string]int)
  1937. var meetTypeName string
  1938. if meetType != 2 {
  1939. list, err = cygx.GetCompanyActivityCount(companyId)
  1940. meetTypeName = "线上"
  1941. } else {
  1942. list, err = cygx.GetCygxActivityOfflineMeetingCoount(companyId)
  1943. meetTypeName = "线下"
  1944. }
  1945. if err != nil {
  1946. br.Msg = "获取失败"
  1947. br.ErrMsg = "获取失败,Err:" + err.Error()
  1948. return
  1949. }
  1950. for _, v := range list {
  1951. if dateMap[v.ActivityTime] == 0 {
  1952. dateMap[v.ActivityTime] = 1
  1953. } else {
  1954. dateMap[v.ActivityTime] += 1
  1955. }
  1956. if permissionNameMap[v.ActivityTime+v.ChartPermissionName] == 0 {
  1957. permissionNameMap[v.ActivityTime+v.ChartPermissionName] = 1
  1958. } else {
  1959. permissionNameMap[v.ActivityTime+v.ChartPermissionName] += 1
  1960. }
  1961. }
  1962. //创建excel
  1963. dir, err := os.Executable()
  1964. exPath := filepath.Dir(dir)
  1965. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
  1966. xlsxFile := xlsx.NewFile()
  1967. if err != nil {
  1968. br.Msg = "生成文件失败"
  1969. br.ErrMsg = "生成文件失败"
  1970. return
  1971. }
  1972. style := xlsx.NewStyle()
  1973. alignment := xlsx.Alignment{
  1974. Horizontal: "center",
  1975. Vertical: "center",
  1976. WrapText: true,
  1977. }
  1978. style.Alignment = alignment
  1979. style.ApplyAlignment = true
  1980. sheet, err := xlsxFile.AddSheet("客户活动参与量月度统计")
  1981. if err != nil {
  1982. br.Msg = "新增Sheet失败"
  1983. br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
  1984. return
  1985. }
  1986. //标头
  1987. rowTitle := sheet.AddRow()
  1988. cellA := rowTitle.AddCell()
  1989. cellA.Value = "月份"
  1990. cellB := rowTitle.AddCell()
  1991. cellB.Value = "总参与量"
  1992. cellC := rowTitle.AddCell()
  1993. cellC.Value = "医药"
  1994. cellD := rowTitle.AddCell()
  1995. cellD.Value = "消费"
  1996. cellE := rowTitle.AddCell()
  1997. cellE.Value = "科技"
  1998. cellF := rowTitle.AddCell()
  1999. cellF.Value = "智造"
  2000. cellG := rowTitle.AddCell()
  2001. cellG.Value = "策略"
  2002. cellH := rowTitle.AddCell()
  2003. cellH.Value = "研选"
  2004. for _, item := range listDate {
  2005. row := sheet.AddRow()
  2006. cellA := row.AddCell()
  2007. cellA.Value = item.CreateTimes
  2008. cellB := row.AddCell()
  2009. cellB.Value = strconv.Itoa(dateMap[item.CreateTimes])
  2010. cellC := row.AddCell()
  2011. cellC.Value = strconv.Itoa(permissionNameMap[item.CreateTimes+"医药"])
  2012. cellD := row.AddCell()
  2013. cellD.Value = strconv.Itoa(permissionNameMap[item.CreateTimes+"消费"])
  2014. cellE := row.AddCell()
  2015. cellE.Value = strconv.Itoa(permissionNameMap[item.CreateTimes+"科技"])
  2016. cellF := row.AddCell()
  2017. cellF.Value = strconv.Itoa(permissionNameMap[item.CreateTimes+"智造"])
  2018. cellG := row.AddCell()
  2019. cellG.Value = strconv.Itoa(permissionNameMap[item.CreateTimes+"策略"])
  2020. cellH := row.AddCell()
  2021. cellH.Value = strconv.Itoa(permissionNameMap[item.CreateTimes+"研选"])
  2022. }
  2023. err = xlsxFile.Save(downLoadnFilePath)
  2024. if err != nil {
  2025. br.Msg = "保存文件失败"
  2026. br.ErrMsg = "保存文件失败"
  2027. return
  2028. }
  2029. randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
  2030. downloadFileName := companyInfo.CompanyName + "活动参与量月度统计(" + meetTypeName + ")" + randStr + ".xlsx"
  2031. this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
  2032. defer func() {
  2033. os.Remove(downLoadnFilePath)
  2034. }()
  2035. br.Ret = 200
  2036. br.Success = true
  2037. br.Msg = "导出成功"
  2038. br.IsAddLog = true
  2039. }
  2040. // @Title 新增备注接口
  2041. // @Description 新增备注
  2042. // @Param request body cygx.ActivityUserRemarksAddReq true "type json string"
  2043. // @Success 200 新增成功
  2044. // @router /activityMeet/addRemarks [post]
  2045. func (this *ActivityMeetCoAntroller) Add() {
  2046. br := new(models.BaseResponse).Init()
  2047. defer func() {
  2048. this.Data["json"] = br
  2049. this.ServeJSON()
  2050. }()
  2051. sysUser := this.SysUser
  2052. if sysUser == nil {
  2053. br.Msg = "请登录"
  2054. br.ErrMsg = "请登录,SysUser Is Empty"
  2055. br.Ret = 408
  2056. return
  2057. }
  2058. var req cygx.ActivityUserRemarksAddReq
  2059. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  2060. if err != nil {
  2061. br.Msg = "参数解析异常!"
  2062. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  2063. return
  2064. }
  2065. if req.Content == "" {
  2066. br.Msg = "请填写内容"
  2067. return
  2068. }
  2069. if req.ActivityId < 1 {
  2070. br.Msg = "请选择活动ID"
  2071. return
  2072. }
  2073. if req.Mobile == "" {
  2074. br.Msg = "手机号不能为空"
  2075. return
  2076. }
  2077. item := new(cygx.CygxActivityUserRemarks)
  2078. item.ActivityId = req.ActivityId
  2079. item.Mobile = req.Mobile
  2080. item.AdminId = sysUser.AdminId
  2081. item.RealName = sysUser.RealName
  2082. item.Content = req.Content
  2083. item.CreateTime = time.Now()
  2084. err = cygx.AddCygxActivityUserRemarks(item)
  2085. if err != nil {
  2086. br.Msg = "新增失败."
  2087. br.ErrMsg = "新增失败,Err:" + err.Error()
  2088. return
  2089. }
  2090. br.Ret = 200
  2091. br.Success = true
  2092. br.Msg = "新增成功"
  2093. }
  2094. // @Title 备注列表
  2095. // @Description 备注列表接口
  2096. // @Param Mobile query string true "手机号"
  2097. // @Success 200 {object} cygx.CygxActivityUserRemarksListResp
  2098. // @router /activityMeet/remark/list [get]
  2099. func (this *ActivityMeetCoAntroller) RemarkList() {
  2100. br := new(models.BaseResponse).Init()
  2101. defer func() {
  2102. this.Data["json"] = br
  2103. this.ServeJSON()
  2104. }()
  2105. sysUser := this.SysUser
  2106. if sysUser == nil {
  2107. br.Msg = "请登录"
  2108. br.ErrMsg = "请登录,SysUser Is Empty"
  2109. br.Ret = 408
  2110. return
  2111. }
  2112. mobile := this.GetString("Mobile")
  2113. if mobile == "" {
  2114. br.Msg = "请输入手机号"
  2115. return
  2116. }
  2117. list, err := cygx.GetCygxActivityUserRemarksLlist(mobile)
  2118. if err != nil && err.Error() != utils.ErrNoRow() {
  2119. br.Msg = "获取信息失败"
  2120. br.ErrMsg = "获取备注信息失败,Err:" + err.Error()
  2121. return
  2122. }
  2123. if len(list) == 0 {
  2124. list = make([]*cygx.CygxActivityUserRemarksResp, 0)
  2125. }
  2126. resp := new(cygx.CygxActivityUserRemarksListResp)
  2127. resp.List = list
  2128. br.Ret = 200
  2129. br.Success = true
  2130. br.Msg = "获取成功"
  2131. br.Data = resp
  2132. }
  2133. // @Title 上传停留时间
  2134. // @Description 上传停留时间
  2135. // @Param request body cygx.CygxActivityMeetingHistoryAddReq true "type json string"
  2136. // @Success 200 新增成功
  2137. // @router /activityMeet/addStopTime [post]
  2138. func (this *ActivityMeetCoAntroller) AddStopTime() {
  2139. br := new(models.BaseResponse).Init()
  2140. defer func() {
  2141. this.Data["json"] = br
  2142. this.ServeJSON()
  2143. }()
  2144. sysUser := this.SysUser
  2145. if sysUser == nil {
  2146. br.Msg = "请登录"
  2147. br.ErrMsg = "请登录,SysUser Is Empty"
  2148. br.Ret = 408
  2149. return
  2150. }
  2151. var req cygx.CygxActivityMeetingHistoryAddReq
  2152. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  2153. if err != nil {
  2154. br.Msg = "参数解析异常!"
  2155. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  2156. return
  2157. }
  2158. stopTime := req.StopTime
  2159. activityId := req.ActivityId
  2160. if stopTime > 0 {
  2161. detail, err := cygx.GetCygxActivityMeetingHistoryNew(activityId, sysUser.AdminId)
  2162. if err != nil && err.Error() != utils.ErrNoRow() {
  2163. br.Msg = "获取信息失败"
  2164. br.ErrMsg = "获取最新消息失败,Err:" + err.Error()
  2165. return
  2166. }
  2167. if detail != nil {
  2168. err = cygx.UpdateActivityMeetingHistoryTime(stopTime, detail.Id)
  2169. }
  2170. }
  2171. br.Ret = 200
  2172. br.Success = true
  2173. br.Msg = "新增成功"
  2174. }
  2175. // @Title 阅读记录列表
  2176. // @Description 阅读记录列表接口
  2177. // @Param ActivityId query int true "活动ID"
  2178. // @Success 200 {object} cygx.CygxActivityMeetingHistoryListResp
  2179. // @router /activityMeet/history/list [get]
  2180. func (this *ActivityMeetCoAntroller) HistoryList() {
  2181. br := new(models.BaseResponse).Init()
  2182. defer func() {
  2183. this.Data["json"] = br
  2184. this.ServeJSON()
  2185. }()
  2186. sysUser := this.SysUser
  2187. if sysUser == nil {
  2188. br.Msg = "请登录"
  2189. br.ErrMsg = "请登录,SysUser Is Empty"
  2190. br.Ret = 408
  2191. return
  2192. }
  2193. activityId, _ := this.GetInt("ActivityId")
  2194. if activityId < 1 {
  2195. br.Msg = "活动不存在"
  2196. return
  2197. }
  2198. list, err := cygx.GetCygxActivityMeetingHistoryLlist(activityId)
  2199. if err != nil && err.Error() != utils.ErrNoRow() {
  2200. br.Msg = "获取信息失败"
  2201. br.ErrMsg = "获取备注信息失败,Err:" + err.Error()
  2202. return
  2203. }
  2204. if len(list) == 0 {
  2205. list = make([]*cygx.CygxActivityMeetingHistoryResp, 0)
  2206. }
  2207. resp := new(cygx.CygxActivityMeetingHistoryListResp)
  2208. resp.List = list
  2209. br.Ret = 200
  2210. br.Success = true
  2211. br.Msg = "获取成功"
  2212. br.Data = resp
  2213. }
  2214. // @Title 上传参会表格(易董举办的活动)
  2215. // @Description 上传参会表格数据(易董举办的活动)
  2216. // @Param File query file true "文件"
  2217. // @Param ActivityId query int true "活动ID"
  2218. // @Success 200 Ret=200 导入成功
  2219. // @router /activityMeet/importYidong [post]
  2220. func (this *ActivityMeetCoAntroller) ImportYidongConduct() {
  2221. br := new(models.BaseResponse).Init()
  2222. defer func() {
  2223. this.Data["json"] = br
  2224. this.ServeJSON()
  2225. }()
  2226. AdminUser := this.SysUser
  2227. if AdminUser == nil {
  2228. br.Msg = "请重新登录"
  2229. return
  2230. }
  2231. file, h, err := this.GetFile("File")
  2232. if err != nil {
  2233. br.Msg = "获取文件失败"
  2234. br.ErrMsg = "获取文件失败,Err:" + err.Error()
  2235. return
  2236. }
  2237. activityId, _ := this.GetInt("ActivityId")
  2238. if activityId <= 0 {
  2239. br.Msg = "参数错误"
  2240. br.ErrMsg = "活动id为0"
  2241. return
  2242. }
  2243. activityInfo, err := cygx.GetAddActivityInfoById(activityId)
  2244. if err != nil {
  2245. br.Msg = "活动不存在"
  2246. br.ErrMsg = "活动ID错误,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
  2247. return
  2248. }
  2249. //校验活动后台管理员、销售是否有修改权限
  2250. havePower, popupMsg, err := cygxService.CheckActivityUpdatePower(AdminUser.AdminId, activityInfo)
  2251. if err != nil {
  2252. br.Msg = "获取管理员身份信息失败"
  2253. br.ErrMsg = "获取管理员身份信息失败,Err:" + err.Error()
  2254. return
  2255. }
  2256. if !havePower {
  2257. br.Msg = popupMsg
  2258. return
  2259. }
  2260. if activityInfo.ActiveState != 3 && activityInfo.ActiveState != 2 {
  2261. br.Msg = "任务未开始,请稍后上传"
  2262. return
  2263. }
  2264. if activityInfo.IsYidongConduct == 0 {
  2265. br.Msg = "不属于易董的活动无法上传参会信息!"
  2266. return
  2267. }
  2268. uploadDir := "static/xls"
  2269. err = os.MkdirAll(uploadDir, 766)
  2270. if err != nil {
  2271. br.Msg = "存储目录创建失败"
  2272. br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
  2273. return
  2274. }
  2275. path := uploadDir + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + h.Filename
  2276. defer file.Close()
  2277. err = this.SaveToFile("File", path)
  2278. if err != nil {
  2279. br.Msg = "文件保存失败"
  2280. br.ErrMsg = "文件保存失败,Err:" + err.Error()
  2281. return
  2282. }
  2283. xlFile, err := xlsx.OpenFile(path)
  2284. if err != nil {
  2285. br.Msg = "文件导入失败"
  2286. br.ErrMsg = "文件导入失败,Err:" + err.Error()
  2287. return
  2288. }
  2289. defer func() {
  2290. os.Remove(path)
  2291. }()
  2292. //允许添加的联系人
  2293. needAddAttendanc := make([]*cygx.CygxActivityAttendanceDetail, 0)
  2294. var mobileStr string
  2295. // 遍历sheet页读取
  2296. realNameKey, mobileKey, companyNameKey, positionKey, firstMeetingTimeKey, lastMeetingTimeKey, durationKey, meetingTypeStrKey, meetingAuthenticationKey, meetingStatusStrKey, meetNumKey := -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
  2297. for _, sheet := range xlFile.Sheets {
  2298. //遍历行读取
  2299. maxRow := sheet.MaxRow
  2300. for i := 0; i < maxRow; i++ {
  2301. if i == 0 {
  2302. row := sheet.Row(i)
  2303. cells := row.Cells
  2304. for k, cell := range cells {
  2305. text := cell.String()
  2306. if text == "姓名" {
  2307. realNameKey = k
  2308. }
  2309. if text == "公司" {
  2310. companyNameKey = k
  2311. }
  2312. if text == "职位" {
  2313. positionKey = k
  2314. }
  2315. if text == "手机" {
  2316. mobileKey = k
  2317. }
  2318. if text == "参会方式" {
  2319. meetingTypeStrKey = k
  2320. }
  2321. if text == "参会时长" {
  2322. durationKey = k
  2323. }
  2324. if text == "入会时间" {
  2325. firstMeetingTimeKey = k
  2326. }
  2327. if text == "离会时间" {
  2328. lastMeetingTimeKey = k
  2329. }
  2330. if text == "来源" {
  2331. meetingAuthenticationKey = k
  2332. }
  2333. if text == "参会状态" {
  2334. meetingStatusStrKey = k
  2335. }
  2336. if text == "入会次数" {
  2337. meetNumKey = k
  2338. }
  2339. }
  2340. }
  2341. if i == 0 {
  2342. if mobileKey == -1 {
  2343. br.Msg = "模板格式错误,缺少:电话"
  2344. br.ErrMsg = "模板格式错误"
  2345. return
  2346. }
  2347. if firstMeetingTimeKey == -1 {
  2348. br.Msg = "模板格式错误,缺少:首次入会时间"
  2349. br.ErrMsg = "模板格式错误!"
  2350. return
  2351. }
  2352. if lastMeetingTimeKey == -1 {
  2353. br.Msg = "模板格式错误,缺少:最后退出时间"
  2354. br.ErrMsg = "模板格式错误!"
  2355. return
  2356. }
  2357. if durationKey == -1 {
  2358. br.Msg = "模板格式错误,缺少:参与总时长"
  2359. br.ErrMsg = "模板格式错误!"
  2360. return
  2361. }
  2362. }
  2363. if i >= 1 {
  2364. row := sheet.Row(i)
  2365. cells := row.Cells
  2366. var realName, mobile, companyName, position, sellerName, firstMeetingTime, lastMeetingTime, duration, meetingTypeStr, meetingAuthentication, meetingStatusStr, meetNum string
  2367. for k, cell := range cells {
  2368. if k == realNameKey {
  2369. realName = cell.String()
  2370. }
  2371. if k == mobileKey {
  2372. mobile = cell.String()
  2373. }
  2374. if k == companyNameKey {
  2375. companyName = cell.String()
  2376. }
  2377. if k == positionKey {
  2378. position = cell.String()
  2379. }
  2380. if k == firstMeetingTimeKey {
  2381. firstMeetingTime = cell.String()
  2382. }
  2383. if k == lastMeetingTimeKey {
  2384. lastMeetingTime = cell.String()
  2385. }
  2386. if k == durationKey {
  2387. duration = cell.String()
  2388. }
  2389. if k == meetingTypeStrKey {
  2390. meetingTypeStr = cell.String()
  2391. }
  2392. if k == meetingAuthenticationKey {
  2393. meetingAuthentication = cell.String()
  2394. }
  2395. if k == meetingStatusStrKey {
  2396. meetingStatusStr = cell.String()
  2397. }
  2398. if k == meetNumKey {
  2399. meetNum = cell.String()
  2400. }
  2401. }
  2402. //这些字段都没有的话,系统认为excel到底了
  2403. if duration == "" && mobile == "" && firstMeetingTime == "" {
  2404. break
  2405. }
  2406. item := new(cygx.CygxActivityAttendanceDetail)
  2407. item.ActivityId = activityId
  2408. item.RealName = realName
  2409. item.Mobile = mobile
  2410. item.CompanyName = companyName
  2411. item.SellerName = sellerName
  2412. if meetNum == "1" {
  2413. item.FirstMeetingTime = firstMeetingTime
  2414. item.LastMeetingTime = lastMeetingTime
  2415. }
  2416. item.Duration = duration
  2417. item.MeetingTypeStr = meetingTypeStr
  2418. item.MeetingAuthentication = meetingAuthentication
  2419. item.MeetingStatusStr = meetingStatusStr
  2420. item.Position = position
  2421. item.CreateTime = time.Now()
  2422. if mobile != "" {
  2423. mobileStr += "'" + mobile + "'" + ","
  2424. needAddAttendanc = append(needAddAttendanc, item)
  2425. }
  2426. }
  2427. }
  2428. }
  2429. mobileStr = strings.TrimRight(mobileStr, ",")
  2430. if mobileStr == "" {
  2431. mobileStr = "1"
  2432. }
  2433. //外呼号
  2434. listUser, err := cygx.GetWxUserOutboundMobile(mobileStr)
  2435. if err != nil {
  2436. br.Msg = "手动归类失败!"
  2437. br.ErrMsg = "获取用户列表失败,Err:" + err.Error()
  2438. return
  2439. }
  2440. //手机号
  2441. listUserMobile, err := cygx.GetWxUserMobile(mobileStr)
  2442. if err != nil {
  2443. br.Msg = "手动归类失败!"
  2444. br.ErrMsg = "获取用户列表失败,Err:" + err.Error()
  2445. return
  2446. }
  2447. mapneedAddAttendanc := make(map[string]*cygx.WxUserOutboundMobile)
  2448. for _, v := range listUser {
  2449. mapneedAddAttendanc[v.OutboundMobile] = v
  2450. }
  2451. for _, v := range listUserMobile {
  2452. if mapneedAddAttendanc[v.Mobile] == nil {
  2453. mapneedAddAttendanc[v.Mobile] = v
  2454. }
  2455. }
  2456. for k, v := range needAddAttendanc {
  2457. if mapneedAddAttendanc[v.Mobile] != nil {
  2458. needAddAttendanc[k].CompanyId = mapneedAddAttendanc[v.Mobile].CompanyId
  2459. needAddAttendanc[k].SellerName = mapneedAddAttendanc[v.Mobile].SellerName
  2460. needAddAttendanc[k].CompanyName = mapneedAddAttendanc[v.Mobile].CompanyName
  2461. needAddAttendanc[k].IsMeetingStr = 1
  2462. }
  2463. }
  2464. err = cygx.AddAttendancDetail(needAddAttendanc, activityId, mobileStr)
  2465. if err != nil {
  2466. br.Msg = "手动归类失败"
  2467. br.ErrMsg = "手动归类失败,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
  2468. return
  2469. }
  2470. go cygxService.AddCygxActivityRestrictSignupByAdmin(activityId)
  2471. go cygx.AddCygxActivityMeetDetailLogOnline(needAddAttendanc, activityId)
  2472. br.Msg = "导入成功"
  2473. br.Ret = 200
  2474. br.Success = true
  2475. br.IsAddLog = true
  2476. }