activity_attendance_detail.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. package cygx
  2. import (
  3. "fmt"
  4. "github.com/beego/beego/v2/client/orm"
  5. "time"
  6. )
  7. // 报名
  8. type CygxActivityAttendanceDetail struct {
  9. AttendanceId int `orm:"column(attendance_id);pk;"description:"主键ID"`
  10. ActivityId int `description:"活动ID"`
  11. RealName string `description:"姓名"`
  12. Mobile string `description:"手机号"`
  13. CompanyName string `description:"公司名称"`
  14. CompanyId int `description:"公司id 不在数据库的用户为0"`
  15. SellerName string `description:"销售姓名"`
  16. //IsMeetingStr string `description:"是否到会"`
  17. FirstMeetingTime string `description:"首次入会时间"`
  18. LastMeetingTime string `description:"最后退出时间"`
  19. Duration string `description:"参会时长"`
  20. MeetingTypeStr string `description:"参会方式"`
  21. MeetingAuthentication string `description:"参会权鉴"`
  22. MeetingStatusStr string `description:"参会状态"`
  23. CreateTime time.Time `description:"创建时间"`
  24. Position string `description:"职位"`
  25. IsMeetingStr int `description:"是否到会,1到会,0未到会"`
  26. UseridEntity int `description:"参会者身份. 1:主讲人, 2:主持人, 3:嘉宾, 4:普通参会者, 5:联席主讲人, 6:会议助理"`
  27. CrmCompanyMapStatusId int `description:"转换后的对应状态信息:1=正式客户, 2=曾使用客户, 3=其他"`
  28. ActivityTime string `description:"活动时间"`
  29. }
  30. // 报名
  31. type AttendanceDetail struct {
  32. ActivityId int `description:"活动ID"`
  33. RealName string `description:"姓名"`
  34. Mobile string `description:"手机号"`
  35. CompanyName string `description:"公司名称"`
  36. SellerName string `orm:"column(pseller_name);"description:"销售姓名"`
  37. IsMeeting int `description:"是否到会"`
  38. FirstMeetingTime string `description:"首次入会时间"`
  39. LastMeetingTime string `description:"最后退出时间"`
  40. Duration string `description:"参会时长"`
  41. MeetingTypeStr string `description:"参会方式"`
  42. MeetingAuthentication string `description:"参会权鉴"`
  43. MeetingStatusStr string `description:"参会状态"`
  44. Position string `description:"职位"`
  45. OutboundMobile string `description:"外呼手机号"`
  46. CountryCode string `description:"手机国家区号"`
  47. UseridEntity int `description:"参会者身份. 1:主讲人, 2:主持人, 3:嘉宾, 4:普通参会者, 5:联席主讲人, 6:会议助理"`
  48. Content string `description:"备注信息"`
  49. ActivityTimeText string `description:"活动时间带文字"`
  50. ActivityName string `description:"活动名称"`
  51. }
  52. func AddAttendancDetail(items []*CygxActivityAttendanceDetail, activityId int, mobileStr string) (err error) {
  53. o := orm.NewOrm()
  54. to, err := o.Begin()
  55. if err != nil {
  56. return
  57. }
  58. defer func() {
  59. if err != nil {
  60. fmt.Println(err)
  61. _ = to.Rollback()
  62. } else {
  63. _ = to.Commit()
  64. }
  65. }()
  66. //修改活动是否上传到会信息字段
  67. sql := `UPDATE cygx_activity SET is_submit_meeting=1 WHERE activity_id=? `
  68. _, err = to.Raw(sql, activityId).Exec()
  69. if err != nil {
  70. return
  71. }
  72. //修改单个报名信息是否到会
  73. sql = `UPDATE cygx_activity_signup SET is_meeting=0 WHERE activity_id=? `
  74. _, err = to.Raw(sql, activityId).Exec()
  75. if err != nil {
  76. return
  77. }
  78. sql = `UPDATE cygx_activity_signup SET is_meeting=1 WHERE activity_id=? AND outbound_mobile IN (` + mobileStr + `)`
  79. _, err = to.Raw(sql, activityId).Exec()
  80. if err != nil {
  81. return
  82. }
  83. sql = `UPDATE cygx_activity_signup SET is_meeting=1 WHERE activity_id=? AND mobile IN (` + mobileStr + `)`
  84. _, err = to.Raw(sql, activityId).Exec()
  85. if err != nil {
  86. return
  87. }
  88. //二次上传时删除原有数据
  89. sql = ` DELETE FROM cygx_activity_attendance_detail WHERE activity_id = ?`
  90. _, err = to.Raw(sql, activityId).Exec()
  91. if err != nil {
  92. return
  93. }
  94. //插入提交信息
  95. for _, v := range items {
  96. _, err = to.Insert(v)
  97. if err != nil {
  98. return
  99. }
  100. }
  101. return
  102. }
  103. func GetAttendanceDetailList(activityId int, sqlStr string) (item []*AttendanceDetail, err error) {
  104. o := orm.NewOrm()
  105. sql := `SELECT s.id,s.activity_id,p.company_name,s.mobile,s.is_meeting,s.outbound_mobile,s.country_code,u.real_name,d.first_meeting_time,d.last_meeting_time,d.meeting_type_str,d.meeting_authentication,d.meeting_status_str,d.duration,d.userid_entity,
  106. GROUP_CONCAT( DISTINCT p.seller_name SEPARATOR '/' ) AS pseller_name
  107. FROM
  108. cygx_activity_signup AS s
  109. INNER JOIN wx_user AS u ON u.user_id = s.user_id
  110. INNER JOIN cygx_activity AS a ON a.activity_id = s.activity_id
  111. INNER JOIN company_product AS p ON p.company_id = s.company_id
  112. LEFT JOIN cygx_activity_attendance_detail AS d ON d.mobile = s.outbound_mobile AND s.activity_id = d.activity_id
  113. WHERE 1 = 1
  114. AND s.fail_type = 0
  115. AND s.is_cancel = 0
  116. AND d.userid_entity != 3
  117. AND u.mobile != ''
  118. AND s.activity_id = ?` + sqlStr + ` GROUP BY s.id ORDER BY s.is_meeting DESC`
  119. _, err = o.Raw(sql, activityId).QueryRows(&item)
  120. return
  121. }
  122. func GetAttendanceDetailListGroup(activityId int, sqlStr string) (item []*AttendanceDetail, err error) {
  123. o := orm.NewOrm()
  124. sql := `SELECT s.id,s.activity_id,p.company_name,s.mobile,s.is_meeting,s.outbound_mobile,s.country_code,s.real_name,d.first_meeting_time,d.last_meeting_time,d.meeting_type_str,d.meeting_authentication,d.meeting_status_str,d.duration,d.userid_entity,d.userid_entity,
  125. GROUP_CONCAT( DISTINCT p.seller_name SEPARATOR '/' ) AS pseller_name
  126. FROM
  127. cygx_activity_signup AS s
  128. INNER JOIN wx_user AS u ON u.user_id = s.user_id
  129. LEFT JOIN cygx_activity AS a ON a.activity_id = s.activity_id
  130. LEFT JOIN company_product AS p ON p.company_id = s.company_id
  131. LEFT JOIN cygx_activity_attendance_detail AS d ON ( d.mobile = s.outbound_mobile OR d.mobile = s.mobile ) AND s.activity_id = d.activity_id
  132. WHERE 1 = 1
  133. AND s.do_fail_type = 0
  134. AND s.is_cancel = 0
  135. AND s.activity_id = ?` + sqlStr + ` ORDER BY s.is_meeting DESC`
  136. _, err = o.Raw(sql, activityId).QueryRows(&item)
  137. return
  138. }
  139. func GetAttendanceDetailListGroupByUser(mobile, sqlStr string) (item []*AttendanceDetail, err error) {
  140. o := orm.NewOrm()
  141. sql := `SELECT s.id,s.activity_id,p.company_name,s.mobile,s.is_meeting,s.outbound_mobile,s.country_code,s.real_name,s.first_meeting_time,s.last_meeting_time,s.meeting_type_str,s.meeting_authentication,s.meeting_status_str,s.duration,s.userid_entity,s.userid_entity,a.activity_name,a.activity_time_text
  142. FROM
  143. cygx_activity_signup_detail AS s
  144. INNER JOIN wx_user AS u ON u.mobile = s.mobile
  145. INNER JOIN cygx_activity AS a ON a.activity_id = s.activity_id
  146. LEFT JOIN company_product AS p ON p.company_id = s.company_id
  147. WHERE 1 = 1
  148. AND s.do_fail_type = 0
  149. AND s.is_cancel = 0
  150. AND s.mobile = ?` + sqlStr + ` ORDER BY a.activity_time ASC `
  151. _, err = o.Raw(sql, mobile).QueryRows(&item)
  152. return
  153. }
  154. func GetAttendanceDetailList2(activityId int, sqlStr string) (item []*AttendanceDetail, err error) {
  155. o := orm.NewOrm()
  156. sql := `SELECT u.user_id,d.activity_id,u.real_name,u.company_id,d.first_meeting_time,d.last_meeting_time,d.meeting_type_str,d.meeting_authentication,d.meeting_status_str,d.mobile,d.duration,p.company_name,d.position,d.userid_entity,
  157. GROUP_CONCAT( DISTINCT p.seller_name SEPARATOR '/' ) AS pseller_name
  158. FROM
  159. cygx_activity_attendance_detail AS d
  160. INNER JOIN wx_user AS u ON u.mobile = d.mobile
  161. INNER JOIN company_product AS p ON p.company_id = u.company_id
  162. WHERE 1 = 1 AND d.activity_id = ? AND is_meeting_str = 1 AND d.userid_entity != 3 AND u.mobile != '' ` + sqlStr + ` GROUP BY d.mobile`
  163. _, err = o.Raw(sql, activityId).QueryRows(&item)
  164. return
  165. }
  166. func GetAttendanceDetailList3(activityId int, sqlStr string) (item []*AttendanceDetail, err error) {
  167. o := orm.NewOrm()
  168. sql := `SELECT u.user_id,d.activity_id,d.real_name,u.company_id,d.first_meeting_time,d.last_meeting_time,d.meeting_type_str,d.meeting_authentication,d.meeting_status_str,d.mobile,d.duration,d.company_name,d.position,d.userid_entity,
  169. GROUP_CONCAT( DISTINCT p.seller_name SEPARATOR '/' ) AS pseller_name
  170. FROM
  171. cygx_activity_attendance_detail AS d
  172. LEFT JOIN wx_user AS u ON u.mobile = d.mobile
  173. LEFT JOIN company_product AS p ON p.company_id = u.company_id
  174. WHERE 1 = 1 AND d.activity_id = ? AND d.userid_entity != 3 AND d.crm_company_map_status_id != 1 ` + sqlStr + ` GROUP BY d.mobile`
  175. //fmt.Println(sql)
  176. _, err = o.Raw(sql, activityId).QueryRows(&item)
  177. return
  178. }
  179. type AttendanceDetailList struct {
  180. List1 []*AttendanceDetail `description:"预约客户"`
  181. List2 []*AttendanceDetail `description:"未预约客户"`
  182. List3 []*AttendanceDetail `description:"潜在客户"`
  183. }
  184. type WxUserOutboundMobile struct {
  185. RealName string `description:"姓名"`
  186. Mobile string `description:"手机号"`
  187. OutboundMobile string `description:"外呼手机号"`
  188. CompanyId int `description:"公司ID"`
  189. CompanyName string `description:"公司名称"`
  190. SellerName string `description:"所属销售"`
  191. UserId int `description:"用户ID"`
  192. }
  193. func GetWxUserOutboundMobile(mobileStr string) (item []*WxUserOutboundMobile, err error) {
  194. o := orm.NewOrm()
  195. sql := `SELECT u.real_name,u.mobile,u.outbound_mobile,u.company_id,p.company_name ,GROUP_CONCAT( DISTINCT p.seller_name SEPARATOR '/' ) AS seller_name
  196. FROM wx_user as u
  197. INNER JOIN company_product AS p ON p.company_id = u.company_id
  198. WHERE outbound_mobile IN (` + mobileStr + `) GROUP BY u.user_id`
  199. _, err = o.Raw(sql).QueryRows(&item)
  200. return
  201. }
  202. func GetWxUserMobile(mobileStr string) (item []*WxUserOutboundMobile, err error) {
  203. o := orm.NewOrm()
  204. sql := `SELECT u.real_name,u.mobile,u.outbound_mobile,u.company_id,p.company_name ,GROUP_CONCAT( DISTINCT p.seller_name SEPARATOR '/' ) AS seller_name
  205. FROM wx_user as u
  206. INNER JOIN company_product AS p ON p.company_id = u.company_id
  207. WHERE mobile IN (` + mobileStr + `) GROUP BY u.user_id`
  208. _, err = o.Raw(sql).QueryRows(&item)
  209. return
  210. }
  211. type RoadshowData struct {
  212. Id int `orm:"column(id);pk;"description:"主键ID"`
  213. Company string `description:"公司名称"`
  214. UserName string `description:"用户名"`
  215. UserPhone string `description:"手机号"`
  216. UserinfoUource string `description:"用户来源"`
  217. AuthInfo string `description:"用户参会鉴权"`
  218. GuestUsername string `description:"嘉宾名称, 多个用,隔开"`
  219. FirstWatchTime string `description:"首次观看时间"`
  220. LastWatchTime string `description:"最后观看时间"`
  221. RoadshowId string `description:"路演ID"`
  222. RoadshowTitle string `description:"路演标题"`
  223. RoadshowBeginTime time.Time `description:"路演开始时间"`
  224. RoadshowEndTime time.Time `description:"路演结束时间"`
  225. JoinTime int `description:"参与时长"`
  226. JoinType int `description:"参与方式, 1网络, 2电话"`
  227. DataType int `description:"数据类型: 1直播, 2回放"`
  228. Occupation string `description:"职位"`
  229. UseridEntity int `description:"参会者身份. 1:主讲人, 2:主持人, 3:嘉宾, 4:普通参会者, 5:联席主讲人, 6:会议助理"`
  230. CrmCompanyMapStatusId int `description:"转换后的对应状态信息:1=正式客户, 2=曾使用客户, 3=其他"`
  231. }
  232. type RoadshowDataTitle struct {
  233. RoadshowTitle string `description:"路演标题"`
  234. ActivityTime string `description:"活动时间"`
  235. }
  236. type RoadshowDataTitleList struct {
  237. List []*RoadshowDataTitle
  238. }
  239. type RoadshowDataTitleResp struct {
  240. KeyWord string `description:"关键词"`
  241. ActivityId int `description:"活动ID"`
  242. }
  243. func GetRoadshowDataTitleList(title string) (list []*RoadshowDataTitle, err error) {
  244. o := orm.NewOrmUsingDB("comein_data")
  245. sql := `SELECT roadshow_title, roadshow_begin_time as activity_time FROM roadshow_data WHERE roadshow_title LIKE '%` + title + `%' GROUP BY roadshow_id `
  246. _, err = o.Raw(sql).QueryRows(&list)
  247. return
  248. }
  249. func GetRoadshowDataList(title, condition string) (list []*RoadshowData, err error) {
  250. o := orm.NewOrmUsingDB("comein_data")
  251. sql := `SELECT * FROM roadshow_data WHERE roadshow_title LIKE '%` + title + `%'` + condition
  252. _, err = o.Raw(sql).QueryRows(&list)
  253. return
  254. }
  255. // 客户参会记录
  256. type CompanyMeetRep struct {
  257. ActivityId int `description:"活动Id"`
  258. RealName string `description:"姓名"`
  259. Mobile string `description:"手机号"`
  260. Email string `description:"邮箱"`
  261. ActivityName string `description:"活动名称"`
  262. ChartPermissionName string `description:"行业名称"`
  263. ActivityTypeName string `description:"活动类型名称"`
  264. Label string `description:"标签"`
  265. ActivityTime string `description:"活动时间"`
  266. FirstMeetingTime string `description:"首次入会时间"`
  267. LastMeetingTime string `description:"最后退出时间"`
  268. Duration string `description:"参会时长"`
  269. MeetingTypeStr string `description:"参会方式"`
  270. MeetingAuthentication string `description:"参会权鉴"`
  271. MeetingStatusStr string `description:"参会状态"`
  272. }
  273. func GetCygxActivityAttendanceDetailByCompanyId(mobiles string) (list []*CompanyMeetRep, err error) {
  274. o := orm.NewOrm()
  275. sql := `SELECT
  276. a.*,
  277. s.mobile,
  278. s.real_name,
  279. d.first_meeting_time,
  280. d.last_meeting_time,
  281. d.duration,
  282. d.meeting_type_str,
  283. d.meeting_authentication,
  284. d.meeting_status_str
  285. FROM
  286. cygx_activity_signup AS s
  287. INNER JOIN cygx_activity AS a ON a.activity_id = s.activity_id
  288. INNER JOIN cygx_activity_attendance_detail AS d ON d.activity_id = s.activity_id
  289. INNER JOIN cygx_activity_type as t ON t.activity_type_id = a.activity_type_id
  290. WHERE
  291. 1 = 1
  292. AND s.do_fail_type = 0
  293. AND s.is_cancel = 0
  294. AND s.is_meeting = 1
  295. AND s.mobile IN (` + mobiles + `)
  296. AND a.is_submit_meeting = 1
  297. AND t.activity_type = 1
  298. GROUP BY
  299. s.id
  300. ORDER BY
  301. a.activity_time DESC `
  302. _, err = o.Raw(sql).QueryRows(&list)
  303. return
  304. }
  305. func GetCygxActivityOfflineMeetingDetailByCompanyId(mobiles string) (list []*CompanyMeetRep, err error) {
  306. o := orm.NewOrm()
  307. sql := `SELECT
  308. a.*,s.mobile,s.email,s.real_name
  309. FROM
  310. cygx_activity_signup AS s
  311. INNER JOIN cygx_activity AS a ON a.activity_id = s.activity_id
  312. INNER JOIN cygx_activity_type as t ON t.activity_type_id = a.activity_type_id
  313. WHERE
  314. 1 = 1
  315. AND s.do_fail_type = 0
  316. AND s.is_cancel = 0
  317. AND s.is_meeting = 1
  318. AND s.mobile IN (` + mobiles + `)
  319. AND a.is_submit_meeting = 1
  320. AND t.activity_type = 0
  321. GROUP BY
  322. s.id
  323. ORDER BY
  324. a.activity_time DESC `
  325. _, err = o.Raw(sql).QueryRows(&list)
  326. return
  327. }
  328. func GetCompanyActivityCount(companyId int) (list []*CompanyMeetRep, err error) {
  329. o := orm.NewOrm()
  330. sql := `SELECT
  331. a.chart_permission_name,
  332. date_format( a.activity_time, '%Y-%m' ) AS activity_time
  333. FROM
  334. cygx_activity_attendance_detail AS r
  335. INNER JOIN cygx_activity AS a ON a.activity_id = r.activity_id
  336. WHERE
  337. r.company_id = ?
  338. AND is_meeting_str = 1
  339. ORDER BY
  340. a.activity_time DESC`
  341. _, err = o.Raw(sql, companyId).QueryRows(&list)
  342. return
  343. }
  344. func GetCygxActivityOfflineMeetingCoount(companyId int) (list []*CompanyMeetRep, err error) {
  345. o := orm.NewOrm()
  346. sql := `SELECT
  347. a.chart_permission_name,
  348. date_format( a.activity_time, '%Y-%m' ) AS activity_time
  349. FROM
  350. cygx_activity_offline_meeting_detail as r
  351. INNER JOIN cygx_activity as a On a.activity_id = r.activity_id
  352. WHERE
  353. r.company_id =? AND r.is_meeting = 1 ORDER BY a.activity_time DESC`
  354. _, err = o.Raw(sql, companyId).QueryRows(&list)
  355. return
  356. }
  357. // 列表
  358. func GetCygxActivityAttendanceDetailList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxActivityAttendanceDetail, err error) {
  359. o := orm.NewOrm()
  360. sql := `SELECT * FROM cygx_activity_attendance_detail as a WHERE 1= 1 `
  361. if condition != "" {
  362. sql += condition
  363. }
  364. sql += ` LIMIT ?,? `
  365. _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
  366. return
  367. }