Browse Source

Merge remote-tracking branch 'origin/debug' into debug

Roc 9 months ago
parent
commit
6c3c3a47bc

+ 8 - 8
controllers/company_apply_v2.go

@@ -101,9 +101,9 @@ func (this *CompanyApplyController) ApplyServiceUpdate() {
 		//权益的新签合同重新定义,如果合同起始时间在新签合同起始日期 1年之内的,仍为新签合同。
 		raicontractType = req.ContractType
 		if raicontractType != "新签合同" {
-			startDateTime, _ := time.Parse(utils.FormatDate, req.StartDate)
-			startDateTime = startDateTime.AddDate(-1, 0, 0)
-			totalLastYear, err := company.GetCompanyContractCountRaiByLastYear(req.CompanyId, startDateTime.Format(utils.FormatDate))
+			//startDateTime, _ := time.Parse(utils.FormatDate, req.StartDate)
+			//startDateTime = startDateTime.AddDate(-1, 0, 0)
+			totalLastYear, err := contractService.GetCompanyContractCountRaiByLastYear(req.CompanyId, req.StartDate)
 			if err != nil {
 				br.Msg = "获取合同信息失败"
 				br.ErrMsg = "获取合同信息失败,Err:" + err.Error()
@@ -617,9 +617,9 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 			//权益的新签合同重新定义,如果合同起始时间在新签合同起始日期 1年之内的,仍为新签合同。
 			raicontractType = contractType
 			if raicontractType != "新签合同" {
-				startDateTime, _ := time.Parse(utils.FormatDate, req.StartDate)
-				startDateTime = startDateTime.AddDate(-1, 0, 0)
-				totalLastYear, err := company.GetCompanyContractCountRaiByLastYear(req.CompanyId, startDateTime.Format(utils.FormatDate))
+				//startDateTime, _ := time.Parse(utils.FormatDate, req.StartDate)
+				//startDateTime = startDateTime.AddDate(-1, 0, 0)
+				totalLastYear, err := contractService.GetCompanyContractCountRaiByLastYear(req.CompanyId, req.StartDate)
 				if err != nil {
 					br.Msg = "获取合同信息失败"
 					br.ErrMsg = "获取合同信息失败,Err:" + err.Error()
@@ -1142,8 +1142,8 @@ func (this *CompanyApplyController) ApplyBySystemContract() {
 		//权益的新签合同重新定义,如果合同起始时间在新签合同起始日期 1年之内的,仍为新签合同。
 		raicontractType = contractType
 		if raicontractType != "新签合同" {
-			startDateTime := contractDetail.StartDate.AddDate(-1, 0, 0)
-			totalLastYear, err := company.GetCompanyContractCountRaiByLastYear(req.CompanyId, startDateTime.Format(utils.FormatDate))
+			//startDateTime := contractDetail.StartDate.AddDate(-1, 0, 0)
+			totalLastYear, err := contractService.GetCompanyContractCountRaiByLastYear(req.CompanyId, contractDetail.StartDate.Format(utils.FormatDate))
 			if err != nil {
 				br.Msg = "获取合同信息失败"
 				br.ErrMsg = "获取合同信息失败,Err:" + err.Error()

+ 5 - 5
controllers/cygx/enter_score.go

@@ -59,7 +59,7 @@ func (this *EnterScoreController) CompanySearchList() {
 	}
 
 	//权益申请销售只能看到自己名下的客户的申请
-	companyIds, err := cygxService.GetAdminLookUserCompanyIdsBySelf(sysUser)
+	companyIds, err := cygxService.GetAdminLookUserCompanyIdsByResearcher(sysUser)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
@@ -169,7 +169,7 @@ func (this *EnterScoreController) EnterScoreDetail() {
 			mapFiccUser[v.GroupName] = append(mapFiccUser[v.GroupName], item)
 		}
 
-		permissionFiccNameArr := []string{"宏观组", "建材组", "有色组", "能化组"}
+		permissionFiccNameArr := []string{"宏观组", "建材组", "有色组", "能化组", "海外组"}
 		for _, v := range permissionFiccNameArr {
 			item := new(cygx.EnterScorePermissionListResp)
 			item.ChartPermissionName = v
@@ -584,7 +584,7 @@ func (this *EnterScoreController) EnterScoreList() {
 	var condition string
 	var pars []interface{}
 	//如果不是权益管理员和admin,就做可见权限限制
-	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_RESEARCHR {
 		var conditionAdmin string
 		var parsAdmin []interface{}
 		conditionAdmin = "  AND product_id = 2  AND   status = '永续'  AND seller_id =  ?  "
@@ -869,7 +869,7 @@ func (this *EnterScoreController) EnterScoreScoreOverview() {
 	}
 
 	//权益申请销售只能看到自己名下的客户的申请
-	companyIds, err := cygxService.GetAdminLookUserCompanyIdsBySelf(AdminUser)
+	companyIds, err := cygxService.GetAdminLookUserCompanyIdsByResearcher(AdminUser)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
@@ -1390,7 +1390,7 @@ func (this *EnterScoreController) EnterScoreRankingOverview() {
 	}
 
 	//权益申请销售只能看到自己名下的客户的申请
-	companyIds, err := cygxService.GetAdminLookUserCompanyIdsBySelf(AdminUser)
+	companyIds, err := cygxService.GetAdminLookUserCompanyIdsByResearcher(AdminUser)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,GetAdminLookUserCompanyIdsBySelf Err:" + err.Error()

+ 40 - 1
controllers/roadshow/calendar.go

@@ -1040,7 +1040,6 @@ func (this *CalendarController) ResearcherList() {
 	ficcGroup.GroupName = "ficc"
 	ficcGroup.ResearcherList = group
 
-
 	sysUserList, err := system.GetAdminList()
 	if err != nil {
 		br.Msg = "获取失败"
@@ -1216,10 +1215,17 @@ func (this *CalendarController) CalendarList() {
 
 	// 英文客户的国家以及点击量
 	englishIds := make([]int, 0)
+	adminIds := make([]int, 0)     // 管理员ID
+	rsCalendarId := make([]int, 0) //路演ID
 	for i := range dataList {
 		if dataList[i].EnglishCompany == 1 {
 			englishIds = append(englishIds, dataList[i].CompanyId)
 		}
+
+		if calendarType == 2 {
+			adminIds = append(adminIds, dataList[i].SysUserId)
+			rsCalendarId = append(rsCalendarId, dataList[i].RsCalendarId)
+		}
 	}
 	englishMap := make(map[int]*models.EnglishCompany)
 	if len(englishIds) > 0 {
@@ -1236,6 +1242,31 @@ func (this *CalendarController) CalendarList() {
 			englishMap[englishList[i].CompanyId] = englishList[i]
 		}
 	}
+	mapRaiSllerId := make(map[int]bool)  // 是否为权益销售
+	mapMeetingCount := make(map[int]int) // 路演参会人员数量
+	if len(adminIds) > 0 {
+		listAdmin, e := system.GetAdminListByIdListWithoutEnable(adminIds)
+		if e != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取管理员信息失败, Err:" + e.Error()
+			return
+		}
+		for _, v := range listAdmin { //权益销售与权益销售组长
+			if v.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER || v.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+				mapRaiSllerId[v.AdminId] = true
+			}
+		}
+		listMeetingCount, e := roadshow.GetRsCalendarMeetingUserListCount(rsCalendarId)
+		if e != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取路演参会人员数量信息失败, Err:" + e.Error()
+			return
+		}
+		for _, v := range listMeetingCount {
+			mapMeetingCount[v.RsCalendarId] = v.Total
+		}
+	}
+
 	for i := range dataList {
 		if dataList[i].EnglishCompany == 1 {
 			en := englishMap[dataList[i].CompanyId]
@@ -1244,6 +1275,14 @@ func (this *CalendarController) CalendarList() {
 				dataList[i].EnglishViewTotal = en.ViewTotal
 			}
 		}
+		//如果是已结束的权益销售添加的活动,就行进行按钮展示
+		if mapRaiSllerId[dataList[i].SysUserId] && utils.InArrayByInt([]int{2, 6}, dataList[i].Status) {
+			if mapMeetingCount[dataList[i].RsCalendarId] == 0 {
+				dataList[i].SubmitButton = true
+			} else {
+				dataList[i].ViewButton = true
+			}
+		}
 	}
 
 	resp.Paging = page

+ 173 - 0
controllers/roadshow/calendar_meeting_user.go

@@ -0,0 +1,173 @@
+package roadshow
+
+import (
+	"encoding/json"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/roadshow"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// 日历参会名单
+type CalendarMeetingUserController struct {
+	controllers.BaseAuthController
+}
+
+// @Title 新增路演活动参会名单接口
+// @Description 新增路演活动参会名单接口
+// @Param	request	body roadshow.AddRsCalendarMeetingUserReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /rs_calendar_meeting_user/add [post]
+func (this *CalendarMeetingUserController) Add() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req roadshow.AddRsCalendarMeetingUserReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	rsCalendarId := req.RsCalendarId
+	userIds := req.UserId
+
+	if rsCalendarId == 0 {
+		br.Msg = "路演信息错误!"
+		return
+	}
+	if len(userIds) == 0 {
+		br.Msg = "参会人不能为空!"
+		return
+	}
+	var userIdsStr []string
+	for _, v := range userIds {
+		userIdsStr = append(userIdsStr, strconv.Itoa(v))
+	}
+
+	listUser, err := models.GetWxUserListByUserIdsHaveCompany(strings.Join(userIdsStr, ","))
+	if err != nil {
+		br.Msg = "获取用户信息失败!"
+		br.ErrMsg = "获取用户信息失败-GetWxUserListByUserIdsHaveCompany!Err:" + err.Error()
+		return
+	}
+
+	var items []*roadshow.RsCalendarMeetingUser
+	for _, v := range listUser {
+		item := new(roadshow.RsCalendarMeetingUser)
+		item.RsCalendarId = rsCalendarId
+		item.UserId = v.UserId
+		item.Mobile = v.Mobile
+		item.Email = v.Email
+		item.CompanyId = v.CompanyId
+		item.CompanyName = v.CompanyName
+		item.RealName = v.RealName
+		item.Position = v.Position
+		item.AdminId = sysUser.AdminId
+		item.AdminName = sysUser.RealName
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+		items = append(items, item)
+	}
+	err = roadshow.MultiAddRsCalendarMeetingUser(items)
+	if err != nil {
+		br.Msg = "操作失败!"
+		br.ErrMsg = "操作失败-MultiAddRsCalendarMeetingUser!Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "添加成功"
+	br.IsAddLog = true
+}
+
+// @Title 路演活动参会名单列表接口
+// @Description 路演活动参会名单列表接口
+// @Param   RsCalendarId   query   int  true       "路演活动id"
+// @Success 200 {object} roadshow.CalendarListResp
+// @router /rs_calendar_meeting_user/list [get]
+func (this *CalendarMeetingUserController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	rsCalendarId, _ := this.GetInt("RsCalendarId")
+	resp := new(roadshow.RsCalendarMeetingUserListResp)
+	list, err := roadshow.GetRsCalendarMeetingUserListByRsCalendarId(rsCalendarId)
+	if err != nil {
+		br.Msg = "获取失败!"
+		br.ErrMsg = "操作失败-GetRsCalendarMeetingUserListByRsCalendarId!Err:" + err.Error()
+		return
+	}
+	if len(list) == 0 {
+		list = make([]*roadshow.RsCalendarMeetingUserResp, 0)
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Data = resp
+	br.Msg = "获取成功"
+}
+
+// @Title 路演活动参会删除接口
+// @Description 路演活动参会删除接口
+// @Param   RsCalendarMeetingUserId   query   int  true       "参会名单主键ID"
+// @Success Ret=200 删除成功
+// @router /rs_calendar_meeting_user/delete [post]
+func (this *CalendarMeetingUserController) Delete() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req roadshow.DeleteRsCalendarMeetingUserReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	rsCalendarMeetingUserId := req.RsCalendarMeetingUserId
+	err = roadshow.DeleteRsCalendarMeetingUser(rsCalendarMeetingUserId)
+	if err != nil {
+		br.Msg = "删除失败!"
+		br.ErrMsg = "删除失败-DeleteRsCalendarMeetingUser!Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "删除成功"
+	br.IsAddLog = true
+}

+ 8 - 0
models/company/company_contract.go

@@ -338,3 +338,11 @@ func UpdateCompanyContractCompanyAscribeId(companyAscribId, companyContractId in
 	_, err = o.Raw(sql, companyAscribId, companyContractId).Exec()
 	return
 }
+
+// GetFirstContractRai 权益获取第一份合同
+func GetFirstContractRai(companyId int) (item *CompanyContract, err error) {
+	o := orm.NewOrm()
+	sql := " SELECT * FROM company_contract WHERE company_id = ?  AND product_id= 2  AND status = 1   ORDER BY   start_date  ASC  LIMIT  1  "
+	err = o.Raw(sql, companyId).QueryRow(&item)
+	return
+}

+ 1 - 1
models/company/company_product.go

@@ -102,8 +102,8 @@ type CompanyProductDetail struct {
 	IsShare          int       `description:"0:非共享用户,1:共享客户"`
 	ShareSeller      string    `description:"共享销售员"`
 	ShareSellerId    int       `description:"共享销售员id"`
-	ViewTotal        int       `description:"总阅读次数"`
 	PermissionList   []*PermissionLookList
+	ViewTotal        int `description:"总阅读次数"`
 }
 
 func GetCompanyProductsByCompanyId(companyId int) (items []*CompanyProductDetail, err error) {

+ 18 - 0
models/cygx/activity_appointment.go

@@ -197,3 +197,21 @@ func GetActivityAppointmentOpenIdList(activityId int) (items []*OpenIdList, err
 	_, err = o.Raw(sql, activityId).QueryRows(&items)
 	return
 }
+
+
+// 获取预约活动纪要的的用户的openID
+func GetMfyxActivityAppointmentOpenIdList(activityId int) (items []*OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	var sql string
+	sql = `SELECT DISTINCT
+				u.open_id,
+				u.cygx_user_id AS user_id 
+			FROM
+				cygx_activity_appointment AS m
+				INNER JOIN cygx_mfyx_gzh_user_record AS u ON u.cygx_bind_account = m.mobile 
+				AND u.cygx_user_id = m.user_id 
+			WHERE
+				m.activity_id = ? `
+	_, err = o.Raw(sql, activityId).QueryRows(&items)
+	return
+}

+ 1 - 1
models/cygx/activity_ask_email.go

@@ -30,7 +30,7 @@ func GetAskEmailList() (item []*AskEmailRep, err error) {
 func UpdateAskEmail(item *AskEmailRep) (err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `UPDATE cygx_activity_ask_email SET admin_id=? where mobile=?`
-	_, err = o.Raw(sql,item.AdminId,item.Mobile).Exec()
+	_, err = o.Raw(sql, item.AdminId, item.Mobile).Exec()
 	return
 }
 

+ 17 - 0
models/cygx/activity_help_ask.go

@@ -46,3 +46,20 @@ func GetActivityHelpAskOpenIdList(activityId int) (items []*OpenIdList, err erro
 	_, err = o.Raw(sql, activityId).QueryRows(&items)
 	return
 }
+
+// 获取活动带问的用户的openID
+func GetMfyxActivityHelpAskOpenIdList(activityId int) (items []*OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	var sql string
+	sql = `SELECT DISTINCT
+				u.open_id,
+				u.cygx_user_id AS user_id 
+			FROM
+				cygx_activity_help_ask AS m
+				INNER JOIN cygx_mfyx_gzh_user_record AS u ON u.cygx_bind_account = m.mobile 
+				AND u.cygx_user_id = m.user_id 
+			WHERE
+				m.activity_id = ? `
+	_, err = o.Raw(sql, activityId).QueryRows(&items)
+	return
+}

+ 3 - 3
models/cygx/chart_permission.go

@@ -113,9 +113,9 @@ func GetCategoryInfoById(chartPermissionId int) (item *ChartPermission, err erro
 
 // 通过名称获取分类详情
 func GetCategoryInfoByName(name string) (item *ChartPermission, err error) {
-	if name == "宏观" {
-		name = "宏观经济"
-	}
+	//if name == "宏观" {
+	//	name = "宏观经济"
+	//}
 	o := orm.NewOrm()
 	sql := `SELECT * FROM chart_permission WHERE permission_name=? AND parent_id>0`
 	err = o.Raw(sql, name).QueryRow(&item)

+ 46 - 0
models/cygx/cygx_user_record.go

@@ -465,3 +465,49 @@ func GetCygxUserIndustryFllowOpneidByActivityIds(activityId int) (items []*OpenI
 	_, err = o.Raw(sql, activityId).QueryRows(&items)
 	return
 }
+
+// 获取预约活动的用户的openID
+func GetMfyxActivityOpenIdList(activityId int) (items []*OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT DISTINCT cr.open_id,cr.cygx_user_id as  user_id
+			FROM
+			cygx_my_schedule AS m
+			INNER JOIN cygx_mfyx_gzh_user_record AS cr ON cr.cygx_bind_account = m.mobile 
+			WHERE m.activity_id = ?  `
+	_, err = o.Raw(sql, activityId).QueryRows(&items)
+	return
+}
+
+
+// 根据手机号获取用户的openid
+func GetMfyxUserRecordListByMobileArr(bindAccount []string) (items []*OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	lenarr := len(bindAccount)
+	if lenarr == 0 {
+		return
+	}
+	var condition string
+	var pars []interface{}
+	condition = ` AND u.cygx_bind_account IN (` + utils.GetOrmInReplace(lenarr) + `)`
+	pars = append(pars, bindAccount)
+	sql := `SELECT
+			u.open_id,
+			u.cygx_user_id AS user_id 
+		FROM
+			cygx_mfyx_gzh_user_record AS u 
+		WHERE
+			1 = 1  ` + condition
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// 获取单个用户openid
+func GetMfyxUserRecordOpenidByMobile(bindAccount string) (item *OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	var sql string
+	sql = `SELECT cr.open_id,cr.cygx_user_id as  user_id
+			FROM cygx_mfyx_gzh_user_record AS cr 
+			WHERE cr.cygx_bind_account = ?`
+	err = o.Raw(sql, bindAccount).QueryRow(&item)
+	return
+}

+ 6 - 5
models/db.go

@@ -378,11 +378,12 @@ func initYb() {
 func initRoadShow() {
 	//注册对象
 	orm.RegisterModel(
-		new(roadshow.RsCalendar),           //路演主表
-		new(roadshow.RsCalendarResearcher), //路演研究员信息表
-		new(roadshow.RsMatters),            //公开会议表
-		new(roadshow.RsCalendarRelation),   //路演关系表(与上海的路演日历关系)
-		new(roadshow.RsReportRecord),       //路演统计表
+		new(roadshow.RsCalendar),            //路演主表
+		new(roadshow.RsCalendarResearcher),  //路演研究员信息表
+		new(roadshow.RsMatters),             //公开会议表
+		new(roadshow.RsCalendarRelation),    //路演关系表(与上海的路演日历关系)
+		new(roadshow.RsReportRecord),        //路演统计表
+		new(roadshow.RsCalendarMeetingUser), //路演参会名单表
 	)
 }
 

+ 3 - 1
models/roadshow/calendar.go

@@ -286,6 +286,8 @@ type CalendarListView struct {
 	EnglishCompany         int    `description:"是否为英文客户: 0-否; 1-是"`
 	EnglishCountry         string `description:"英文客户-国家"`
 	EnglishViewTotal       int    `description:"英文客户-累计点击量"`
+	SubmitButton           bool   `description:"提交按钮是否展示"`
+	ViewButton             bool   `description:"查看按钮是否展示"`
 }
 
 type CalendarListResp struct {
@@ -343,7 +345,7 @@ func GetCalendarList(condition string, pars []interface{}, startSize, pageSize,
 
 		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
 	} else {
-		sql := `SELECT a.rs_calendar_id,a.activity_type,a.roadshow_type,a.activity_category,a.roadshow_platform,b.create_time,a.district,
+		sql := `SELECT a.rs_calendar_id,a.activity_type,a.roadshow_type,a.activity_category,a.roadshow_platform,b.create_time,a.district,a.sys_user_id,
 				b.modify_time,b.researcher_id,b.researcher_name,
 				b.rs_calendar_researcher_id,b.start_date,
 				b.end_date,b.start_time,b.end_time,b.start_week,b.end_week,b.status,b.refuse_reason,b.refuse_time,

+ 96 - 0
models/roadshow/rs_calendar_meeting_user.go

@@ -0,0 +1,96 @@
+package roadshow
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+type AddRsCalendarMeetingUserReq struct {
+	RsCalendarId int   `description:"日程ID"`
+	UserId       []int // 用户ID
+}
+
+type RsCalendarMeetingUser struct {
+	RsCalendarMeetingUserId int       `orm:"column(rs_calendar_meeting_user_id);pk" description:"主键ID"`
+	RsCalendarId            int       `description:"日程ID"`
+	UserId                  int       `description:"用户ID"`
+	Mobile                  string    `description:"手机号"`
+	Email                   string    `description:"邮箱"`
+	CompanyId               int       `description:"公司ID"`
+	CompanyName             string    `description:"公司名称"`
+	RealName                string    `description:"用户实际名称"`
+	Position                string    `description:"职位"`
+	AdminId                 int       `description:"管理员ID"`
+	AdminName               string    `description:"管理员姓名"`
+	CreateTime              time.Time `description:"创建时间"`
+	ModifyTime              time.Time `description:"修改时间"`
+}
+
+type RsCalendarMeetingUserResp struct {
+	RsCalendarMeetingUserId int    `description:"参会名单主键ID"`
+	RealName                string `description:"用户实际名称"`
+	Position                string `description:"职位"`
+}
+
+type DeleteRsCalendarMeetingUserReq struct {
+	RsCalendarMeetingUserId int `description:"参会名单主键ID"`
+}
+
+type RsCalendarMeetingUserListResp struct {
+	List []*RsCalendarMeetingUserResp
+}
+
+// MultiAddRsCalendarMeetingUser 批量添加RsCalendarMeetingUser
+func MultiAddRsCalendarMeetingUser(items []*RsCalendarMeetingUser) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+// 删除
+func DeleteRsCalendarMeetingUser(rsCalendarMeetingUserID int) (err error) {
+	o := orm.NewOrm()
+	sql := ` DELETE FROM rs_calendar_meeting_user WHERE rs_calendar_meeting_user_id=? `
+	_, err = o.Raw(sql, rsCalendarMeetingUserID).Exec()
+	return err
+}
+
+// 列表
+func GetRsCalendarMeetingUserList(condition string, pars []interface{}) (items *RsCalendarMeetingUserResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_calendar_meeting_user WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&items)
+	return
+}
+
+// 通过路演ID获取参会人员列表
+func GetRsCalendarMeetingUserListByRsCalendarId(rsCalendarId int) (items []*RsCalendarMeetingUserResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_calendar_meeting_user WHERE  rs_calendar_id = ?  `
+	_, err = o.Raw(sql, rsCalendarId).QueryRows(&items)
+	return
+}
+
+type RsCalendarMeetingUserCountResp struct {
+	RsCalendarId int `description:"日程ID"`
+	Total        int `description:"数量"`
+}
+
+// 路演参会人员数量
+func GetRsCalendarMeetingUserListCount(rsCalendarIds []int) (items []*RsCalendarMeetingUserCountResp, err error) {
+	lenNum := len(rsCalendarIds)
+	if lenNum <= 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `SELECT  rs_calendar_id ,COUNT(1) as total  FROM rs_calendar_meeting_user WHERE  rs_calendar_id IN ( ` + utils.GetOrmInReplace(lenNum) + `)   GROUP BY rs_calendar_id  `
+	_, err = o.Raw(sql, rsCalendarIds).QueryRows(&items)
+	return
+}

+ 1 - 1
models/system/sys_admin.go

@@ -515,7 +515,7 @@ func GetRaiAdmin() (items []*AdminItem, err error) {
 // GetFiccEnterScoreAdmin 获取Ficc需要录分的研究员
 func GetFiccEnterScoreAdmin() (items []*AdminItem, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT   *  FROM admin WHERE group_name  IN('宏观组','建材组','有色组','能化组')  AND enabled = 1 `
+	sql := `SELECT   *  FROM admin_cygx WHERE group_name  IN('宏观组','建材组','有色组','能化组','海外组')  AND enabled = 1 `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }

+ 1 - 0
models/wx_user.go

@@ -460,6 +460,7 @@ type WxUserItem struct {
 	IsMsgOutboundMobile int       `description:"是否弹窗过绑定外呼手机号区号"`
 	IsMaker             int       `description:"是否是决策人"`
 	Source              int
+	Position            string `description:"职位"`
 }
 
 // GetWxUserListByUserIds 根据用户ID集合获取用户有公司名称

+ 27 - 0
routers/commentsRouter.go

@@ -7720,6 +7720,33 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarMeetingUserController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarMeetingUserController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/rs_calendar_meeting_user/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarMeetingUserController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarMeetingUserController"],
+        beego.ControllerComments{
+            Method: "Delete",
+            Router: `/rs_calendar_meeting_user/delete`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarMeetingUserController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarMeetingUserController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/rs_calendar_meeting_user/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/seal:SealApprovalController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/seal:SealApprovalController"],
         beego.ControllerComments{
             Method: "Apply",

+ 1 - 0
routers/router.go

@@ -233,6 +233,7 @@ func init() {
 		web.NSNamespace("/roadshow",
 			web.NSInclude(
 				&roadshow.CalendarController{},
+				&roadshow.CalendarMeetingUserController{},
 			),
 		),
 		web.NSNamespace("/taglib",

+ 61 - 0
services/contract/contract.go

@@ -1763,3 +1763,64 @@ func handleRaiContractModifyContentByServices(originService []*contract.Contract
 	tips = fmt.Sprint("原服务内容:", oldStr, "</n>现服务内容:", newStr)
 	return
 }
+
+// 获取权益近一年是否有新签合同
+func GetCompanyContractCountRaiByLastYear(companyId int, startDate string) (total int, err error) {
+	firstContractRai, err := company.GetFirstContractRai(companyId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	//没有合同这第一份合同就属于新签合同
+	if firstContractRai == nil {
+		err = nil
+		total = 1
+		return
+	}
+	//判断是否是在一年以内
+	startDateTime, _ := time.Parse(utils.FormatDate, startDate)
+	startDateTime = startDateTime.AddDate(-1, 0, 0)
+	startDateTimeFirst, _ := time.Parse(utils.FormatDate, firstContractRai.StartDate)
+	if startDateTime.Before(startDateTimeFirst) {
+		total = 1
+	}
+	return
+}
+
+func initCRM15_5() {
+	var condition string
+	var pars []interface{}
+
+	condition = " AND  rai_contract_type  = '新签合同'  AND  product_id = 2 "
+	companyContractList, e := company.GetCompanyContractList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		fmt.Println(e)
+		return
+	}
+	var CompanyContractIdS []int
+	for k, v := range companyContractList {
+		fmt.Println(k)
+		firstContractRai, err := company.GetFirstContractRai(v.CompanyId)
+		if err != nil {
+			fmt.Println(err)
+			continue
+		}
+
+		if firstContractRai.CompanyContractId == v.CompanyContractId {
+			continue
+		}
+		//判断是否是在一年以内
+		startDateTime, _ := time.Parse(utils.FormatDate, v.StartDate)
+		startDateTime = startDateTime.AddDate(-1, 0, 0)
+		startDateTimeFirst, _ := time.Parse(utils.FormatDate, firstContractRai.StartDate)
+		if !startDateTime.Before(startDateTimeFirst) {
+			CompanyContractIdS = append(CompanyContractIdS, v.CompanyContractId)
+		}
+	}
+	fmt.Println("companyContractIds", len(CompanyContractIdS))
+	fmt.Println("companyContractIds", (CompanyContractIdS))
+	//
+	//fmt.Println(strings.Join(companyContractIds, ","))
+	//err := company.UpdateCompanyContractRaiContractTypeInit(strings.Join(companyContractIds, ","))
+	//fmt.Println(err)
+	return
+}

+ 2 - 0
services/cygx/activity_power_check.go

@@ -282,6 +282,8 @@ func GetActivityDetailUserPower(user *models.WxUser, adminInfo *system.Admin, ac
 	//如果权限不包含那么直接返回
 	if !strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
 		return
+	} else {
+		havePower = true
 	}
 
 	//处理决策人可见权限

+ 26 - 0
services/cygx/admin_power.go

@@ -141,3 +141,29 @@ func GetAdminLookUserCompanyIdsBySelf(sysUser *system.Admin) (companyIds []int,
 	}
 	return
 }
+
+// 获取这个销售所能查看的公司权限(研究员)
+func GetAdminLookUserCompanyIdsByResearcher(sysUser *system.Admin) (companyIds []int, err error) {
+	//如果不是管理员,权益管理员那么就对可见权限范围做处理
+	adminIds := make([]int, 0)
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_RESEARCHR {
+
+		adminIds = append(adminIds, sysUser.AdminId)
+		var adminIdGroup string
+		for _, v := range adminIds {
+			adminIdGroup += strconv.Itoa(v) + ","
+		}
+		adminIdGroup = strings.TrimRight(adminIdGroup, ",")
+		companyProductList, e := company.GetCompanyProductsBySellerId(adminIdGroup)
+		if e != nil {
+			err = errors.New("GetCompanyProductsBySellerId , Err: " + e.Error())
+			return
+		}
+
+		for _, v := range companyProductList {
+			companyIds = append(companyIds, v.CompanyId)
+		}
+		companyIds = append(companyIds, 0) //添加潜在客户
+	}
+	return
+}

+ 4 - 0
services/cygx/research_summary.go

@@ -356,6 +356,10 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 							if err != nil && err.Error() != utils.ErrNoRow() {
 								return err
 							}
+							//mfyxOpenIditem, err := cygx.GetMfyxUserRecordOpenidByMobile(k)
+							if err != nil && err.Error() != utils.ErrNoRow() {
+								return err
+							}
 							//如果没有权限或者没有获取到 openID的就不推送
 							if openIditem == nil || mapOpenidPower[openIditem.UserId] == "" {
 								continue

+ 11 - 1
services/roadshow/calendar.go

@@ -709,6 +709,12 @@ func SyncCalendarFromShanghai(userPhone, startDate, endDate string) (err error)
 		}
 
 		for _, v := range list {
+			//展示优先级:1、customer_name 2、project_name 3、title 需求池953
+			if v.CustomerName != "" {
+				v.Title = v.CustomerName
+			} else if v.ProjectName != "" {
+				v.Title = v.ProjectName
+			}
 			if rsCalendarRelation, ok := rsCalendarRelationMap[v.ID]; ok {
 				//存在的话,那么就去查找对应的信息
 				if rsCalendarRelation.CalendarType == 1 {
@@ -768,7 +774,9 @@ func SyncCalendarFromShanghai(userPhone, startDate, endDate string) (err error)
 									researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RESEARCHR ||
 									researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_RESEARCHR ||
 									researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_DEPARTMENT ||
-									researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_DEPARTMENT {
+									researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_DEPARTMENT ||
+									researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER ||
+									researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
 
 									researcherList = append(researcherList, researcherInfo)
 									researcherMap[researcherInfo.AdminId] = researcherInfo
@@ -857,6 +865,8 @@ func SyncCalendarFromShanghai(userPhone, startDate, endDate string) (err error)
 							researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_RESEARCHR ||
 							researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_DEPARTMENT ||
 							researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_DEPARTMENT ||
+							researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER ||
+							researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN ||
 							researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
 							researcherList = append(researcherList, researcherInfo)
 						}

+ 6 - 6
services/wechat_send_category_template_msg.go

@@ -91,7 +91,7 @@ func SendWxCategoryMsgWithCygxActivityUpdateTime(activityId int, oldStr, newStr,
 
 	var openIdList []*cygx.OpenIdList
 
-	openIdList, err = cygx.GetActivityOpenIdList(activityId)
+	openIdList, err = cygx.GetMfyxActivityOpenIdList(activityId)
 	if err != nil {
 		msg = "get openIdList err:" + err.Error()
 		return
@@ -102,7 +102,7 @@ func SendWxCategoryMsgWithCygxActivityUpdateTime(activityId int, oldStr, newStr,
 		mapOpenid[v.UserId] = v.OpenId
 	}
 	//添加预约纪要的openid
-	openIdListAppointment, err := cygx.GetActivityAppointmentOpenIdList(activityId)
+	openIdListAppointment, err := cygx.GetMfyxActivityAppointmentOpenIdList(activityId)
 	if err != nil {
 		msg = "GetActivityAppointmentOpenIdList err:" + err.Error()
 		return
@@ -121,7 +121,7 @@ func SendWxCategoryMsgWithCygxActivityUpdateTime(activityId int, oldStr, newStr,
 	}
 
 	//添加带问的openid
-	openIdListActivityHelpAsk, err := cygx.GetActivityHelpAskOpenIdList(activityId)
+	openIdListActivityHelpAsk, err := cygx.GetMfyxActivityHelpAskOpenIdList(activityId)
 	if err != nil {
 		msg = "openIdListActivityHelpAsk err:" + err.Error()
 		return
@@ -216,7 +216,7 @@ func SendWxCategoryMsgWithCygxActivity(activityId int) (err error) {
 		return
 	}
 	var openIdList []*cygx.OpenIdList
-	openIdList, err = cygx.GetActivityOpenIdList(activityId)
+	openIdList, err = cygx.GetMfyxActivityOpenIdList(activityId)
 	if err != nil {
 		msg = "get GetActivityOpenIdList err:" + err.Error()
 		return
@@ -245,7 +245,7 @@ func SendWxCategoryMsgWithCygxActivity(activityId int) (err error) {
 	}
 
 	//添加带问的openid
-	openIdListActivityHelpAsk, err := cygx.GetActivityHelpAskOpenIdList(activityId)
+	openIdListActivityHelpAsk, err := cygx.GetMfyxActivityHelpAskOpenIdList(activityId)
 	if err != nil {
 		msg = "openIdListActivityHelpAsk err:" + err.Error()
 		return
@@ -340,7 +340,7 @@ func SendWxCategoryMsgWithCygxActivityUpdateLimitPeople(activityId int) (err err
 	//condition += ` AND u.mobile IN (` + utils.GetOrmInReplace(mobileLen) + `)`
 	//pars = append(pars, mobileArr)
 
-	openIdList, e := cygx.GetUserRecordListByMobileArr(mobileArr)
+	openIdList, e := cygx.GetMfyxUserRecordListByMobileArr(mobileArr)
 	if e != nil {
 		err = errors.New("GetWxOpenIdBList, Err: " + e.Error())
 		return