Browse Source

Merge branch 'crm_17.0_ficc' of http://8.136.199.33:3000/hongze/hongze_mobile_admin

zhangchuanxing 2 weeks ago
parent
commit
b383010fd7

+ 85 - 0
controllers/company_seller.go

@@ -5,6 +5,7 @@ import (
 	"hongze/hongze_mobile_admin/models/tables/system"
 	"hongze/hongze_mobile_admin/models/tables/system"
 	"hongze/hongze_mobile_admin/services"
 	"hongze/hongze_mobile_admin/services"
 	"hongze/hongze_mobile_admin/utils"
 	"hongze/hongze_mobile_admin/utils"
+	"strings"
 )
 )
 
 
 // CompanySellerController 销售管理
 // CompanySellerController 销售管理
@@ -126,3 +127,87 @@ func (c *CompanySellerController) RoadshowFiccList() {
 
 
 	c.OkDetailed(resp, "获取成功")
 	c.OkDetailed(resp, "获取成功")
 }
 }
+
+// ActivityFiccList
+// @Title 活动FICC销售列表
+// @Description 活动FICC销售列表
+// @Success 200 {object} system.RoadshowGroupResp
+// @router /seller/activity_ficc/list [get]
+func (c *CompanySellerController) ActivityFiccList() {
+	sysUser := c.AdminWx
+
+	resp := new(system.RoadshowGroupResp)
+	productId := services.GetProductId(sysUser.RoleTypeCode)
+	if productId == utils.COMPANY_PRODUCT_RAI_ID {
+		c.OkDetailed(resp, "获取成功")
+		return
+	}
+
+	// 分组
+	departmentId := 2
+	groups, e := system.GetGroupByDepartmentId(departmentId)
+	if e != nil {
+		c.FailWithMessage("获取失败", "获取FICC分组失败, Err: "+e.Error())
+		return
+	}
+	teamGroupId := make(map[int]int, 0) // 小组ID对应的大组ID
+	var list []system.RoadshowGroups
+	for _, g := range groups {
+		if g.ParentId > 0 {
+			teamGroupId[g.GroupId] = g.ParentId
+			continue
+		}
+		if strings.Contains(g.GroupName, "离职") {
+			continue
+		}
+
+		// 大组
+		list = append(list, system.RoadshowGroups{
+			GroupId:   g.GroupId,
+			GroupName: g.GroupName,
+		})
+	}
+
+	// 销售
+	roleArr := []string{
+		utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_FICC_DEPARTMENT, utils.ROLE_TYPE_CODE_FICC_GROUP,
+		utils.ROLE_TYPE_CODE_FICC_TEAM, utils.ROLE_TYPE_CODE_FICC_SELLER,
+	}
+	cond := fmt.Sprintf(` AND role_type_code IN (%s)  AND enabled = 1 `, utils.GetOrmInReplace(len(roleArr)))
+	pars := make([]interface{}, 0)
+	pars = append(pars, roleArr)
+	sellers, e := system.GetSysUserItemsOrderByCreated(cond, pars)
+	if e != nil {
+		c.FailWithMessage("获取失败", "获取FICC销售失败, Err: "+e.Error())
+		return
+	}
+
+	groupIdChild := make(map[int][]system.RoadshowGroupSellers) // 大组ID对应的销售
+	for _, s := range sellers {
+		var seller system.RoadshowGroupSellers
+		seller.AdminId = s.AdminId
+		seller.AdminName = s.RealName
+
+		gid := teamGroupId[s.GroupId]
+		if gid > 0 {
+			// 小组
+			seller.GroupId = gid
+			seller.TeamId = s.GroupId
+		} else {
+			// 大组
+			seller.GroupId = s.GroupId
+		}
+		groupIdChild[seller.GroupId] = append(groupIdChild[seller.GroupId], seller)
+	}
+
+	// 根据当前角色过滤可选项
+
+	for _, v := range list {
+		child := groupIdChild[v.GroupId]
+		// 非以上两种情况, 可见该大组所有销售
+		v.Child = child
+		resp.List = append(resp.List, v)
+	}
+
+	c.OkDetailed(resp, "获取成功")
+}

+ 420 - 0
controllers/roadshow/activity.go

@@ -0,0 +1,420 @@
+package roadshow
+
+import (
+	"encoding/json"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hongze_mobile_admin/controllers"
+	"hongze/hongze_mobile_admin/models"
+	"hongze/hongze_mobile_admin/models/roadshow"
+	"hongze/hongze_mobile_admin/models/tables/admin"
+	"hongze/hongze_mobile_admin/models/tables/english_company"
+	"hongze/hongze_mobile_admin/models/tables/system"
+	"hongze/hongze_mobile_admin/services"
+	"hongze/hongze_mobile_admin/services/rs"
+	"hongze/hongze_mobile_admin/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// 日历
+type ActivityController struct {
+	controllers.BaseAuth
+}
+
+// @Title 新增路演活动接口
+// @Description 新增路演活动接口
+// @Param	request	body roadshow.AddActivityReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /add [post]
+func (this *ActivityController) Add() {
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+
+	deleteCache := true
+	cacheKey := "CACHE_RS_ACTIVITY_ADD_SELLER_" + strconv.Itoa(sysUser.AdminId)
+	defer func() {
+		if deleteCache {
+			utils.Rc.Delete(cacheKey)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 5*time.Second) {
+		deleteCache = false
+		this.FailWithMessage("系统处理中,请稍后重试!", "系统处理中,请稍后重试!"+sysUser.RealName+";data:"+string(this.Ctx.Input.RequestBody))
+		return
+	}
+	var req roadshow.AddActivitySellerReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		this.FailWithMessage("参数解析异常", "参数解析失败,Err:"+err.Error())
+		return
+	}
+
+	if len(req.SellerId) <= 0 {
+		this.FailWithMessage("请选择销售", "请选择销售")
+		return
+	}
+
+	//researcherMap := make(map[int]string)
+	var checkIsAdd []string
+
+	if req.SellerName == "" {
+		this.FailWithMessage("请选择销售!", "请选择销售!")
+		return
+	}
+	if req.StartDate == "" {
+		this.FailWithMessage("请选择开始日期!", "请选择开始日期!")
+		return
+	}
+	if req.EndDate == "" {
+		this.FailWithMessage("请选择结束日期!", "请选择结束日期!")
+		return
+	}
+	if req.StartTime == "" {
+		this.FailWithMessage("请选择开始时间!", "请选择开始时间!")
+		return
+	}
+	if req.EndTime == "" {
+		this.FailWithMessage("请选择结束时间!", "请选择结束时间!")
+		return
+	}
+	if req.StartWeek == "" {
+		this.FailWithMessage("请选择周!", "请选择周!")
+		return
+	}
+	if req.EndWeek == "" {
+		this.FailWithMessage("请选择销售!", "请选择销售!")
+		return
+	}
+
+	startDateTime := req.StartDate + " " + req.StartTime
+	endDateTime := req.EndDate + " " + req.EndTime
+
+	startP, _ := time.ParseInLocation(utils.FormatDateTime, startDateTime, time.Local)
+	endP, _ := time.ParseInLocation(utils.FormatDateTime, endDateTime, time.Local)
+
+	if endP.Before(startP) {
+		this.FailWithMessage("结束时间不得早于开始时间!", "结束时间不得早于开始时间!")
+		return
+	}
+
+	sellerList, err := admin.GetAdminListByIds(req.SellerId)
+	if err != nil {
+		this.FailWithMessage("保存失败!", "获取销售信息失败,Err:"+err.Error())
+		return
+	}
+	for _, v := range sellerList {
+		//校验销售活动时间冲突
+		{
+			activityCount, err := rs.CheckActivity(startDateTime, endDateTime, "1,2", v.AdminId)
+			if err != nil {
+				this.FailWithMessage("时间冲突检测失败!", "时间冲突检测失败-CheckActivity!Err:"+err.Error())
+				return
+			}
+			if activityCount > 0 && !utils.InArrayByStr(checkIsAdd, v.RealName) {
+				checkIsAdd = append(checkIsAdd, v.RealName)
+			}
+		}
+
+		//校验活动时间冲突
+		{
+			activityResearcherCount, err := rs.CheckResearcherBySysSserId(startDateTime, endDateTime, "1,2", v.AdminId)
+			if err != nil {
+				this.FailWithMessage("时间冲突检测失败!", "时间冲突检测失败-CheckCalendarSellerCount!Err:"+err.Error())
+				return
+			}
+			if activityResearcherCount > 0 && !utils.InArrayByStr(checkIsAdd, v.RealName) {
+				checkIsAdd = append(checkIsAdd, v.RealName)
+			}
+		}
+
+		//校验事项时间冲突
+		{
+			matterCount, err := rs.CheckMatters(startDateTime, endDateTime, v.AdminId, 0)
+			if err != nil {
+				this.FailWithMessage("时间冲突检测失败!", "时间冲突检测失败-CheckMattersCount!Err:"+err.Error())
+				return
+			}
+			if matterCount > 0 && !utils.InArrayByStr(checkIsAdd, v.RealName) {
+				checkIsAdd = append(checkIsAdd, v.AdminName)
+			}
+		}
+	}
+
+	if len(checkIsAdd) > 0 {
+		this.FailWithMessage(strings.Join(checkIsAdd, ",")+" 时间已被占用!", "时间冲突检测失败-CheckMattersCount!")
+		return
+	}
+
+	rsActivity := new(roadshow.RsActivity)
+	rsActivity.SysUserId = sysUser.AdminId
+	rsActivity.SysUserRealName = sysUser.RealName
+	rsActivity.ActivityType = req.ActivityType
+	rsActivity.CompanyId = req.CompanyId
+	rsActivity.CompanyName = req.CompanyName
+	rsActivity.Theme = req.Theme
+	rsActivity.CreateTime = time.Now()
+	rsActivity.ModifyTime = time.Now()
+
+	rsActivity.EnglishCompany = req.EnglishCompany
+	rsActivityId, err := roadshow.AddRsActivity(rsActivity)
+	if err != nil {
+		this.FailWithMessage("保存失败!", "保存日历活动信息失败!Err:"+err.Error())
+		return
+	}
+
+	for _, v := range sellerList {
+		researcher := new(roadshow.RsActivitySeller)
+		researcher.RsActivityId = int(rsActivityId)
+		researcher.SellerId = v.AdminId
+		researcher.SellerName = v.RealName
+		researcher.StartDate = req.StartDate
+		researcher.EndDate = req.EndDate
+		researcher.StartTime = req.StartTime
+		researcher.EndTime = req.EndTime
+		researcher.StartWeek = req.StartWeek
+		researcher.EndWeek = req.EndWeek
+		researcher.CreateTime = time.Now()
+		researcher.ModifyTime = time.Now()
+		researcher.Status = 2
+		_, err = roadshow.AddRsActivitySeller(researcher)
+		if err != nil {
+			this.FailWithMessage("保存失败!", "保存日历活动-销售路演信息失败!Err:"+err.Error())
+			return
+		}
+
+	}
+	openIdList := make([]*system.OpenIdList, 0)
+	sysAdmin, _ := admin.GetAdminWxById(sysUser.AdminId)
+	if sysAdmin != nil && sysAdmin.OpenId != "" {
+		openIdObj := &system.OpenIdList{
+			OpenId:  sysAdmin.OpenId,
+			AdminId: sysAdmin.AdminId,
+		}
+		openIdList = append(openIdList, openIdObj)
+	}
+	go services.SendWxMsgWithRoadshowSellerActivity(req.CompanyName, rsActivity.ActivityType, "已添加", time.Now().Format(utils.FormatDateTime), openIdList, int(rsActivityId))
+
+	this.OkDetailed(nil, "保存成功")
+}
+
+// @Title 删除路演活动接口
+// @Description 删除路演活动接口
+// @Param	request	body roadshow.AddActivityReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /delete [post]
+func (this *ActivityController) Delete() {
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+
+	var req roadshow.RsActivityIdReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		this.FailWithMessage("参数解析异常", "参数解析失败,Err:"+err.Error())
+		return
+	}
+	rsActivityId := req.RsActivityId
+
+	detail, err := roadshow.GetRsActivityByRsActivityId(rsActivityId)
+	if err != nil {
+		this.FailWithMessage("删除失败!", "获取信息失败!GetRsActivityByRsActivityId Err:"+err.Error())
+		return
+	}
+
+	if detail.SysUserId != sysUser.AdminId {
+		this.FailWithMessage("删除失败!", "删除失败,不是自己创建的活动信息")
+		return
+	}
+
+	err = roadshow.DeleteRsActivitySeller(rsActivityId)
+	if err != nil {
+		this.FailWithMessage("删除失败!", "删除失败!DeleteRsActivitySeller Err:"+err.Error())
+		return
+	}
+
+	openIdList := make([]*system.OpenIdList, 0)
+	sysAdmin, _ := admin.GetAdminWxById(sysUser.AdminId)
+	if sysAdmin != nil && sysAdmin.OpenId != "" {
+		openIdObj := &system.OpenIdList{
+			OpenId:  sysAdmin.OpenId,
+			AdminId: sysAdmin.AdminId,
+		}
+		openIdList = append(openIdList, openIdObj)
+	}
+	go services.SendWxMsgWithRoadshowSellerActivity(detail.CompanyName, detail.ActivityType, "已删除", time.Now().Format(utils.FormatDateTime), openIdList, rsActivityId)
+	this.OkDetailed(nil, "保存成功")
+}
+
+// 活动列表
+// @Title 活动列表
+// @Description 活动列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Success 200 {object} roadshow.ResearcherGroup
+// @router /list [get]
+func (this *ActivityController) List() {
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	var total int
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize10
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	var resp roadshow.RsActivitySellerListResp
+
+	var condition string
+	var pars []interface{}
+	condition = " AND b.sys_user_id = ?  AND a.status = 2  "
+	pars = append(pars, sysUser.AdminId)
+
+	total, err := roadshow.GetRsActivitySellerListCount(condition, pars)
+	if err != nil {
+		this.FailWithMessage("删除失败!", "获取数量失败!GetRsActivitySellerListCount Err:"+err.Error())
+		return
+	}
+	page := paging.GetPaging(currentIndex, pageSize, total)
+
+	dataList, err := roadshow.GetRsActivitySellerList(condition, pars, startSize, pageSize)
+	if err != nil {
+		this.FailWithMessage("删除失败!", "获取数据失败!GetRsActivitySellerList Err:"+err.Error())
+		return
+	}
+	var rsActivityIds []int
+	for _, v := range dataList {
+		rsActivityIds = append(rsActivityIds, v.RsActivityId)
+	}
+	//获取对应的多个销售信息
+	listSeller, err := roadshow.GetRsActivitySellerListByActivityIds(rsActivityIds)
+	if err != nil {
+		this.FailWithMessage("删除失败!", "获取数据失败!GetRsActivitySellerListByActivityIds Err:"+err.Error())
+		return
+	}
+	mapSeller := make(map[int][]string)
+	for _, v := range listSeller {
+		mapSeller[v.RsActivityId] = append(mapSeller[v.RsActivityId], v.SellerName)
+	}
+	for _, v := range dataList {
+		v.RsCalendarResearcherId = v.RsActivityId
+		v.SellerName = strings.Join(mapSeller[v.RsActivityId], ",")
+	}
+
+	resp.Paging = page
+	resp.List = dataList
+	this.OkDetailed(resp, "保存成功")
+}
+
+// @Title 活动详情
+// @Description 活动详情接口
+// @Param   RsActivityId   query   int  true       "活动销售id"
+// @Success 200 {object} rs.RsActivityDetailResp
+// @router /activity/detail [get]
+func (this *ActivityController) ActivityDetail() {
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+	rsActivityId, _ := this.GetInt("RsActivityId")
+	rsActivityItem, err := roadshow.GetRsActivityByRsActivityId(rsActivityId)
+	if err != nil {
+		this.FailWithMessage("获取数据失败", "获取数据失败!GetRsActivityByRsActivityId:"+err.Error())
+		return
+	}
+
+	//获取对应的多个销售信息
+	listSeller, err := roadshow.GetRsActivitySellerListByActivityIds([]int{rsActivityId})
+	if err != nil {
+		this.FailWithMessage("删除失败!", "获取数据失败!GetRsActivitySellerListByActivityIds Err:"+err.Error())
+		return
+	}
+	mapSeller := []string{}
+	var rsActivitySellerId int
+	for _, v := range listSeller {
+		mapSeller = append(mapSeller, v.SellerName)
+		rsActivitySellerId = v.RsActivitySellerId
+	}
+
+	if rsActivitySellerId <= 0 {
+		this.FailWithMessage("参数错误", "rsActivitySellerId 为零")
+		return
+	}
+
+	rsActivitySellerItem, err := roadshow.GetRsActivitySellerById(rsActivitySellerId)
+	if err != nil {
+		this.FailWithMessage("获取数据失败", "获取数据失败!GetRsActivitySellerById:"+err.Error())
+		return
+	}
+	rsActivitySellerItem.SellerName = strings.Join(mapSeller, ",")
+
+	companyDetailView := new(roadshow.CompanyDetailView)
+	productId := services.GetProductId(sysUser.RoleTypeCode)
+	if productId == 0 {
+		productId = 1
+	}
+	if rsActivityItem != nil && rsActivityItem.CompanyId > 0 {
+		// 中文客户
+		if rsActivityItem.EnglishCompany == 0 {
+			companyId := rsActivityItem.CompanyId
+			companyProductItem, err := models.GetCompanyProductByCompanyIdAndProductId(companyId, productId)
+			if err != nil {
+				this.FailWithMessage("获取数据失败", "获取数据失败!GetCompanyProductByCompanyIdAndProductId:"+err.Error())
+				return
+			}
+			permissionList, err := models.GetCompanyProductReportPermissionList(companyId, productId)
+			if err != nil {
+				this.FailWithMessage("搜索客户权限失败", "搜索客户权限失败!GetCompanyProductReportPermissionList:"+err.Error())
+				return
+			}
+			var permissionArr []string
+			for _, v := range permissionList {
+				permissionArr = append(permissionArr, v.PermissionName)
+			}
+
+			readNum := companyProductItem.ViewTotal
+			companyDetailView.CompanyId = companyProductItem.CompanyId
+			companyDetailView.CompanyName = companyProductItem.CompanyName
+			companyDetailView.Status = companyProductItem.Status
+			companyDetailView.IndustryId = companyProductItem.IndustryId
+			companyDetailView.IndustryName = companyProductItem.IndustryName
+			companyDetailView.PermissionName = strings.Join(permissionArr, "/")
+			companyDetailView.ReportReadTotal = readNum //ficc报告-累计阅读次数
+		}
+		// 英文客户
+		if rsActivityItem.EnglishCompany == 1 {
+			enItem, e := english_company.GetEnglishCompanyById(rsActivityItem.CompanyId)
+			if e != nil {
+				this.FailWithMessage("搜索客户失败!", "获取英文客户详情失败, GetEnglishCompanyById Err: "+e.Error())
+				return
+			}
+			companyDetailView.CompanyId = enItem.CompanyId
+			companyDetailView.CompanyName = enItem.CompanyName
+			companyDetailView.Status = "正常"
+			companyDetailView.EnglishCompany = 1
+			companyDetailView.EnglishCountry = enItem.Country
+			companyDetailView.EnglishViewTotal = enItem.ViewTotal
+		}
+	}
+	resp := new(roadshow.RsActivityDetailResp)
+	resp.RsActivityItem = rsActivityItem
+	resp.RsActivitySellerItem = rsActivitySellerItem
+	resp.CompanyDetail = companyDetailView
+	this.OkDetailed(resp, "获取成功")
+}

+ 83 - 0
controllers/roadshow/calendar.go

@@ -186,6 +186,18 @@ func (this *CalendarController) Add() {
 				checkIsAdd = append(checkIsAdd, v.ResearcherName)
 				checkIsAdd = append(checkIsAdd, v.ResearcherName)
 			}
 			}
 		}
 		}
+		//校验销售活动时间冲突
+		{
+			activityCount, err := rs.CheckActivity(startDateTime, endDateTime, "1,2", sysUser.AdminId)
+			if err != nil {
+				this.FailWithMessage("时间冲突检测失败!", "时间冲突检测失败-CheckActivity!Err:"+err.Error())
+				return
+			}
+			if activityCount > 0 {
+				checkIsAdd = append(checkIsAdd, sysUser.RealName)
+			}
+		}
+
 	}
 	}
 
 
 	if len(checkIsAdd) > 0 {
 	if len(checkIsAdd) > 0 {
@@ -962,6 +974,19 @@ func (this *CalendarController) MattersAdd() {
 		}
 		}
 	}
 	}
 
 
+	//校验销售活动时间冲突
+	{
+		activityCount, err := rs.CheckActivity(startDateTime, endDateTime, "1,2", sysUser.AdminId)
+		if err != nil {
+			this.FailWithMessage("时间冲突检测失败!", "时间冲突检测失败-CheckActivity!Err:"+err.Error())
+			return
+		}
+		if activityCount > 0 {
+			this.FailWithMessage("当前时间已被占用!", "时间冲突检测失败-CheckCalendarActivitySellerrCount!")
+			return
+		}
+	}
+
 	startP, _ := time.ParseInLocation(utils.FormatDateTime, startDateTime, time.Local)
 	startP, _ := time.ParseInLocation(utils.FormatDateTime, startDateTime, time.Local)
 	endP, _ := time.ParseInLocation(utils.FormatDateTime, endDateTime, time.Local)
 	endP, _ := time.ParseInLocation(utils.FormatDateTime, endDateTime, time.Local)
 
 
@@ -1178,6 +1203,19 @@ func (this *CalendarController) MattersUpdate() {
 		}
 		}
 	}
 	}
 
 
+	//校验销售活动时间冲突
+	{
+		activityCount, err := rs.CheckActivity(startDateTime, endDateTime, "1,2", sysUser.AdminId)
+		if err != nil {
+			this.FailWithMessage("时间冲突检测失败!", "时间冲突检测失败-CheckActivity!Err:"+err.Error())
+			return
+		}
+		if activityCount > 0 {
+			this.FailWithMessage("当前时间已被占用!", "时间冲突检测失败-CheckCalendarActivitySellerrCount!")
+			return
+		}
+	}
+
 	whereParams := make(map[string]interface{})
 	whereParams := make(map[string]interface{})
 
 
 	whereParams["rs_matters_id"] = req.RsMattersId
 	whereParams["rs_matters_id"] = req.RsMattersId
@@ -1445,6 +1483,19 @@ func (this *CalendarController) Edit() {
 		if calendarCount > 0 {
 		if calendarCount > 0 {
 			checkIsAdd = append(checkIsAdd, v.ResearcherName)
 			checkIsAdd = append(checkIsAdd, v.ResearcherName)
 		}
 		}
+
+		//校验销售活动时间冲突
+		{
+			activityCount, err := rs.CheckActivity(startDateTime, endDateTime, "1,2", sysUser.AdminId)
+			if err != nil {
+				this.FailWithMessage("时间冲突检测失败!", "时间冲突检测失败-CheckActivity!Err:"+err.Error())
+				return
+			}
+			if activityCount > 0 {
+				checkIsAdd = append(checkIsAdd, sysUser.RealName)
+				return
+			}
+		}
 	}
 	}
 
 
 	if len(checkIsAdd) > 0 {
 	if len(checkIsAdd) > 0 {
@@ -2397,10 +2448,26 @@ func (this *CalendarController) MyCalendarDetail() {
 		this.FailWithMessage("获取数据失败!", "获取数据失败,GetRsMattersList Err:"+err.Error())
 		this.FailWithMessage("获取数据失败!", "获取数据失败,GetRsMattersList Err:"+err.Error())
 		return
 		return
 	}
 	}
+	if matterList == nil {
+		matterList = make([]*roadshow.RsMatters, 0)
+	}
+	// 活动
+	condition = ` AND a.seller_id  IN (?) AND a.start_date >= ? AND a.end_date <= ? AND a.status = 2 `
+	pars = make([]interface{}, 0)
+	pars = append(pars, sysUser.AdminId, startDate, endDate)
+	sellerList, err := roadshow.GetRsActivitySellerList2(condition, pars)
+	if err != nil {
+		this.FailWithMessage("获取数据失败!", "获取数据失败,GetRsActivitySellerList2 Err:"+err.Error())
+		return
+	}
+	if sellerList == nil {
+		sellerList = make([]*roadshow.RsActivitySellerResp, 0)
+	}
 
 
 	resp := new(roadshow.CalendarPanelDetailResp)
 	resp := new(roadshow.CalendarPanelDetailResp)
 	resp.CalendarList = calendarList
 	resp.CalendarList = calendarList
 	resp.RsMattersList = matterList
 	resp.RsMattersList = matterList
+	resp.RsSellerList = sellerList
 	this.OkDetailed(resp, "删除成功")
 	this.OkDetailed(resp, "删除成功")
 }
 }
 
 
@@ -2429,9 +2496,11 @@ func (this *CalendarController) SellerCalendarDetail() {
 	if sellerId <= 0 {
 	if sellerId <= 0 {
 		calendarList := make([]*roadshow.CalendarListView, 0)
 		calendarList := make([]*roadshow.CalendarListView, 0)
 		matterList := make([]*roadshow.RsMatters, 0)
 		matterList := make([]*roadshow.RsMatters, 0)
+		sellerList := make([]*roadshow.RsActivitySellerResp, 0)
 		resp := new(roadshow.CalendarPanelDetailResp)
 		resp := new(roadshow.CalendarPanelDetailResp)
 		resp.CalendarList = calendarList
 		resp.CalendarList = calendarList
 		resp.RsMattersList = matterList
 		resp.RsMattersList = matterList
+		resp.RsSellerList = sellerList
 		this.OkDetailed(resp, "删除成功")
 		this.OkDetailed(resp, "删除成功")
 		return
 		return
 	}
 	}
@@ -2459,9 +2528,23 @@ func (this *CalendarController) SellerCalendarDetail() {
 		matterList = make([]*roadshow.RsMatters, 0)
 		matterList = make([]*roadshow.RsMatters, 0)
 	}
 	}
 
 
+	// 活动
+	condition = ` AND a.seller_id  IN (?) AND a.start_date >= ? AND a.end_date <= ? AND a.status = 2 `
+	pars = make([]interface{}, 0)
+	pars = append(pars, sellerId, startDate, endDate)
+	sellerList, err := roadshow.GetRsActivitySellerList2(condition, pars)
+	if err != nil {
+		this.FailWithMessage("获取数据失败", "获取数据失败, GetRsActivitySellerList2 Err:"+err.Error())
+		return
+	}
+	if sellerList == nil {
+		sellerList = make([]*roadshow.RsActivitySellerResp, 0)
+	}
+
 	resp := new(roadshow.CalendarPanelDetailResp)
 	resp := new(roadshow.CalendarPanelDetailResp)
 	resp.CalendarList = calendarList
 	resp.CalendarList = calendarList
 	resp.RsMattersList = matterList
 	resp.RsMattersList = matterList
+	resp.RsSellerList = sellerList
 	this.OkDetailed(resp, "删除成功")
 	this.OkDetailed(resp, "删除成功")
 }
 }
 
 

+ 2 - 0
models/db_init.go

@@ -121,6 +121,8 @@ func init() {
 		new(roadshow.RsMatters),
 		new(roadshow.RsMatters),
 		new(roadshow.RsCalendarRelation),
 		new(roadshow.RsCalendarRelation),
 		new(roadshow.RsCalendarApiLog),
 		new(roadshow.RsCalendarApiLog),
+		new(roadshow.RsActivity),
+		new(roadshow.RsActivitySeller),
 		new(company_product_update_log.CompanyProductUpdateLog),               //客户产品状态变更记录表
 		new(company_product_update_log.CompanyProductUpdateLog),               //客户产品状态变更记录表
 		new(user_template_record.UserTemplateRecord),                          //模版消息记录表
 		new(user_template_record.UserTemplateRecord),                          //模版消息记录表
 		new(chart_permission.ChartPermission),                                 // 品种权限表
 		new(chart_permission.ChartPermission),                                 // 品种权限表

+ 233 - 0
models/roadshow/activity.go

@@ -0,0 +1,233 @@
+package roadshow
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hongze_mobile_admin/utils"
+	"time"
+)
+
+type AddActivitySellerReq struct {
+	ActivityType     string `description:"活动类型"`
+	RoadshowType     string `description:"路演形式"`
+	RoadshowPlatform string `description:"路演平台"`
+	CompanyId        int    `description:"客户id"`
+	CompanyName      string `description:"客户名称"`
+	Theme            string `description:"会议主题"`
+	CooperationName  string `description:"合作方名称"`
+	ActivityCategory string `description:"活动类别"`
+	//SellerList       []*ActivitySellerReq
+	EnglishCompany int    `description:"是否为英文客户"`
+	SellerId       string `description:"销售id,多个用 ,隔开"`
+	SellerName     string `description:"销售名称"`
+	StartDate      string `description:"开始日期"`
+	EndDate        string `description:"结束日期"`
+	StartTime      string `description:"开始时间"`
+	EndTime        string `description:"开始时间"`
+	StartWeek      string `description:"开始日期对应周"`
+	EndWeek        string `description:"结束日期对应周"`
+}
+
+type RsActivityIdReq struct {
+	RsActivityId int `description:"活动id"`
+}
+
+type ActivitySellerReq struct {
+	SellerId   int    `description:"销售id"`
+	SellerName string `description:"销售名称"`
+	StartDate  string `description:"开始日期"`
+	EndDate    string `description:"结束日期"`
+	StartTime  string `description:"开始时间"`
+	EndTime    string `description:"结束时间"`
+	StartWeek  string `description:"开始日期对应周"`
+	EndWeek    string `description:"结束日期对应周"`
+}
+
+type RsActivity struct {
+	RsActivityId    int    `orm:"column(rs_activity_id);pk"`
+	SysUserId       int    `description:"创建人id"`
+	SysUserRealName string `description:"创建人名称"`
+	ActivityType    string `description:"活动类型"`
+	CompanyId       int    `description:"客户id"`
+	CompanyName     string `description:"客户名称"`
+	Theme           string `description:"会议主题"`
+	CreateTime      time.Time
+	ModifyTime      time.Time
+	EnglishCompany  int `description:"是否为英文客户: 0-否; 1-是"`
+}
+
+// 添加RsActivity
+func AddRsActivity(item *RsActivity) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+type RsActivitySeller struct {
+	RsActivitySellerId int    `orm:"column(rs_activity_seller_id);pk"`
+	RsActivityId       int    `description:"活动id"`
+	SellerId           int    `description:"销售id"`
+	SellerName         string `description:"销售id"`
+	StartDate          string `description:"开始日期"`
+	EndDate            string `description:"结束日期"`
+	StartTime          string `description:"开始时间"`
+	EndTime            string `description:"结束时间"`
+	StartWeek          string `description:"开始日期对应周"`
+	EndWeek            string `description:"结束日期对应周"`
+	CreateTime         time.Time
+	ModifyTime         time.Time
+	Status             int       `description:"状态:1:待接受,2:已接受,3:已拒绝,4:已删除,5:已撤回,6:已结束"`
+	DeleteReason       string    `description:"删除理由"`
+	DeleteTime         time.Time `description:"删除时间"`
+}
+
+// 添加 RsActivitySeller
+func AddRsActivitySeller(item *RsActivitySeller) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+type RsActivitySellerResp struct {
+	RsActivitySellerId     int    `orm:"column(rs_activity_seller_id);pk"`
+	CompanyId              int    `description:"客户id"`
+	CompanyName            string `description:"客户名称"`
+	RsActivityId           int    `description:"活动id"`
+	ActivityType           string `description:"活动类型"`
+	SellerName             string `description:"销售姓名"`
+	StartDate              string `description:"开始日期"`
+	EndDate                string `description:"结束日期"`
+	StartTime              string `description:"开始时间"`
+	EndTime                string `description:"结束时间"`
+	StartWeek              string `description:"开始日期对应周"`
+	EndWeek                string `description:"结束日期对应周"`
+	Theme                  string `description:"会议主题"`
+	CreateTime             string `description:"创建时间"`
+	SysUserRealName        string `description:"创建人名称"`
+	RoadshowType           string `description:"路演形式"`
+	RsCalendarResearcherId int    `description:"活动研究员id(映射供前端使用)"`
+	EnglishCompany         int    `description:"是否为英文客户: 0-否; 1-是"`
+}
+
+type RsActivitySellerListResp struct {
+	Paging *paging.PagingItem
+	List   []*RsActivitySellerResp
+}
+
+func GetRsActivitySellerList(condition string, pars []interface{}, startSize, pageSize int) (items []*RsActivitySellerResp, err error) {
+	sql := `SELECT
+			a.*,
+			b.sys_user_real_name,
+			b.theme,
+			b.activity_type,
+			b.company_id,
+			b.english_company,
+			b.company_name 
+		FROM
+			rs_activity_seller AS a
+			INNER JOIN rs_activity AS b ON a.rs_activity_id = b.rs_activity_id 
+		WHERE
+			1 = 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` GROUP BY a.rs_activity_id  ORDER BY b.create_time DESC LIMIT ?,? `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+func GetRsActivitySellerList2(condition string, pars []interface{}) (list []*RsActivitySellerResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			a.*,
+			b.sys_user_real_name,
+			b.theme,
+			b.activity_type,
+			b.company_id,
+			b.company_name 
+		FROM
+			rs_activity_seller AS a
+			INNER JOIN rs_activity AS b ON a.rs_activity_id = b.rs_activity_id 
+		WHERE
+			1 = 1`
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY a.create_time DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}
+
+// 根据活动ID获取销售列表
+func GetRsActivitySellerListByActivityIds(rsActivityIds []int) (items []*RsActivitySeller, err error) {
+	lenArr := len(rsActivityIds)
+	if lenArr == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `SELECT
+			 * 
+		FROM
+			rs_activity_seller AS a
+		WHERE
+			1 = 1  AND  rs_activity_id IN (` + utils.GetOrmInReplace(lenArr) + `) `
+	_, err = o.Raw(sql, rsActivityIds).QueryRows(&items)
+	return
+}
+
+func GetRsActivitySellerListCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			COUNT( * )  as  count   
+		FROM
+			(
+			SELECT
+				COUNT( * ) 
+			FROM
+				rs_activity AS b
+				INNER JOIN rs_activity_seller AS a ON a.rs_activity_id = b.rs_activity_id 
+			WHERE
+				1 = 1  ` + condition + ` GROUP BY a.rs_activity_id ) b  `
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+// 删除
+func DeleteRsActivitySeller(rsActivityId int) (err error) {
+	o := orm.NewOrm()
+	sql := ` UPDATE rs_activity_seller SET status=4   WHERE rs_activity_id = ?  `
+	_, err = o.Raw(sql, rsActivityId).Exec()
+	return
+}
+
+func GetRsActivityByRsActivityId(rsActivityId int) (item *RsActivity, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_activity WHERE rs_activity_id=? `
+	err = o.Raw(sql, rsActivityId).QueryRow(&item)
+	return
+}
+
+func CheckCalendarActivitySellerrCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM  rs_activity_seller AS a
+		WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func GetRsActivitySellerById(rsActivitySellerId int) (item *RsActivitySeller, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_activity_seller WHERE rs_activity_seller_id=? `
+	err = o.Raw(sql, rsActivitySellerId).QueryRow(&item)
+	return
+}
+
+type RsActivityDetailResp struct {
+	RsActivityItem       *RsActivity
+	RsActivitySellerItem *RsActivitySeller
+	CompanyDetail        *CompanyDetailView
+}

+ 13 - 0
models/roadshow/calendar.go

@@ -452,6 +452,18 @@ func CheckCalendarResearcherCount(condition string, pars []interface{}) (count i
 	return
 	return
 }
 }
 
 
+func CheckCalendarSellerCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM  rs_calendar_researcher AS a
+            INNER JOIN rs_calendar as  b  ON a.rs_calendar_id = b.rs_calendar_id             
+		WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
 func GetMattersById(rsMatters int) (item *RsMatters, err error) {
 func GetMattersById(rsMatters int) (item *RsMatters, err error) {
 	o := orm.NewOrm()
 	o := orm.NewOrm()
 	sql := `SELECT * FROM  rs_matters
 	sql := `SELECT * FROM  rs_matters
@@ -575,6 +587,7 @@ func GetActivityTypeListByActivityTypePId(pid int) (list []*ActivityTypeList, er
 type CalendarPanelDetailResp struct {
 type CalendarPanelDetailResp struct {
 	CalendarList  []*CalendarListView
 	CalendarList  []*CalendarListView
 	RsMattersList []*RsMatters
 	RsMattersList []*RsMatters
+	RsSellerList  []*RsActivitySellerResp
 }
 }
 
 
 func GetCalendarDetailList(condition string, pars []interface{}) (list []*CalendarListView, err error) {
 func GetCalendarDetailList(condition string, pars []interface{}) (list []*CalendarListView, err error) {

+ 2 - 2
models/roadshow/company.go

@@ -154,10 +154,10 @@ func CompanySearchV2(sellerId, groupId int, keyWord, roleTypeCode string) (list
 			     1=1 
 			     1=1 
 			     AND IF  ( b.product_id = 1 , b.status IN ('正式', '试用', '永续') ,1=1 )  
 			     AND IF  ( b.product_id = 1 , b.status IN ('正式', '试用', '永续') ,1=1 )  
 			     AND IF  ( b.product_id = 2 , b.status IN ('正式', '试用', '永续', '冻结', '流失') ,1=1 )  
 			     AND IF  ( b.product_id = 2 , b.status IN ('正式', '试用', '永续', '冻结', '流失') ,1=1 )  
-				 AND (b.seller_id = ? OR b.share_seller_id = ?  OR b.group_id = ? OR b.share_group_id = ?  ) AND a.company_name LIKE ?
+				 AND (b.seller_id = ? OR b.share_seller_id = ?  OR b.group_id = ? OR b.share_group_id = ?  ) AND ( a.company_name LIKE ?  OR a.credit_code LIKE  ? )
 			GROUP BY
 			GROUP BY
 				b.company_id `
 				b.company_id `
-		_, err = o.Raw(sql, sellerId, sellerId, groupId, groupId, keyWord).QueryRows(&companies)
+		_, err = o.Raw(sql, sellerId, sellerId, groupId, groupId, keyWord, keyWord).QueryRows(&companies)
 		if err != nil {
 		if err != nil {
 			return
 			return
 		}
 		}

+ 1 - 1
models/tables/admin/admin.go

@@ -188,7 +188,7 @@ func GetOpenIdListByMobile(mobile, openIdStr string) (items []*OpenIdList, err e
 	return
 	return
 }
 }
 
 
-func GetAdminWxByIdS(adminIdStr string) (items []*custom.AdminWx, err error) {
+func GetSysAdminByIds(adminIdStr string) (items []*custom.AdminWx, err error) {
 	sql := `SELECT * FROM admin WHERE admin_id IN(` + adminIdStr + `)`
 	sql := `SELECT * FROM admin WHERE admin_id IN(` + adminIdStr + `)`
 	o := orm.NewOrm()
 	o := orm.NewOrm()
 	_, err = o.Raw(sql).QueryRows(&items)
 	_, err = o.Raw(sql).QueryRows(&items)

+ 45 - 0
routers/commentsRouter.go

@@ -97,6 +97,42 @@ func init() {
             Filters: nil,
             Filters: nil,
             Params: nil})
             Params: nil})
 
 
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:ActivityController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:ActivityController"],
+        beego.ControllerComments{
+            Method: "ActivityDetail",
+            Router: `/activity/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:ActivityController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:ActivityController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:ActivityController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:ActivityController"],
+        beego.ControllerComments{
+            Method: "Delete",
+            Router: `/delete`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:ActivityController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:ActivityController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
     beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
         beego.ControllerComments{
         beego.ControllerComments{
             Method: "Accept",
             Method: "Accept",
@@ -520,6 +556,15 @@ func init() {
             Filters: nil,
             Filters: nil,
             Params: nil})
             Params: nil})
 
 
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:CompanySellerController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:CompanySellerController"],
+        beego.ControllerComments{
+            Method: "ActivityFiccList",
+            Router: `/seller/activity_ficc/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:CompanySellerController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:CompanySellerController"],
     beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:CompanySellerController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:CompanySellerController"],
         beego.ControllerComments{
         beego.ControllerComments{
             Method: "RoadshowFiccList",
             Method: "RoadshowFiccList",

+ 5 - 0
routers/router.go

@@ -88,6 +88,11 @@ func init() {
 				&roadshow.CalendarController{},
 				&roadshow.CalendarController{},
 			),
 			),
 		),
 		),
+		web.NSNamespace("/roadshow_seller",
+			web.NSInclude(
+				&roadshow.ActivityController{},
+			),
+		),
 		web.NSNamespace("/yb",
 		web.NSNamespace("/yb",
 			web.NSInclude(
 			web.NSInclude(
 				&yb.CommunityQuestionController{},
 				&yb.CommunityQuestionController{},

+ 38 - 0
services/rs/calendar_check.go

@@ -81,3 +81,41 @@ func CheckCalendar(startDateTime, endDateTime, status string, researcherId, rsCa
 	}
 	}
 	return
 	return
 }
 }
+
+func CheckActivity(startDateTime, endDateTime, status string, sellerId int) (calendarCount int, err error) {
+	var activityCondition string
+	var activityPars []interface{}
+
+	activityCondition += " AND seller_id = ? "
+	activityPars = append(activityPars, sellerId)
+
+	activityCondition += " AND status IN (" + status + ") "
+
+	activityCondition += ` AND (((? >=DATE_FORMAT(CONCAT(start_date," ",start_time),'%Y-%m-%d %H:%i:%S') AND ? <= DATE_FORMAT(CONCAT(end_date," ",end_time),'%Y-%m-%d %H:%i:%S')) OR (? >= DATE_FORMAT(CONCAT(start_date," ",start_time),'%Y-%m-%d %H:%i:%S') AND ? <= DATE_FORMAT(CONCAT(end_date," ",end_time),'%Y-%m-%d %H:%i:%S') )))`
+	activityPars = append(activityPars, startDateTime)
+	activityPars = append(activityPars, startDateTime)
+	activityPars = append(activityPars, endDateTime)
+	activityPars = append(activityPars, endDateTime)
+	calendarCount, err = roadshow.CheckCalendarActivitySellerrCount(activityCondition, activityPars)
+	return
+}
+
+func CheckResearcherBySysSserId(startDateTime, endDateTime, status string, sellerId int) (calendarCount int, err error) {
+
+	var researcherCondition string
+	var researcherMatterPars []interface{}
+
+	researcherCondition += " AND b.sys_user_id = ? "
+	researcherMatterPars = append(researcherMatterPars, sellerId)
+
+	researcherCondition += " AND a.status IN (" + status + ") "
+
+	researcherCondition += ` AND (((? >=DATE_FORMAT(CONCAT(start_date," ",start_time),'%Y-%m-%d %H:%i:%S') AND ? <= DATE_FORMAT(CONCAT(end_date," ",end_time),'%Y-%m-%d %H:%i:%S')) OR (? >= DATE_FORMAT(CONCAT(start_date," ",start_time),'%Y-%m-%d %H:%i:%S') AND ? <= DATE_FORMAT(CONCAT(end_date," ",end_time),'%Y-%m-%d %H:%i:%S') )))`
+	researcherMatterPars = append(researcherMatterPars, startDateTime)
+	researcherMatterPars = append(researcherMatterPars, startDateTime)
+	researcherMatterPars = append(researcherMatterPars, endDateTime)
+	researcherMatterPars = append(researcherMatterPars, endDateTime)
+	calendarCount, err = roadshow.CheckCalendarSellerCount(researcherCondition, researcherMatterPars)
+
+	return
+}

+ 75 - 9
services/wechat_send_msg.go

@@ -5,11 +5,14 @@ import (
 	"errors"
 	"errors"
 	"fmt"
 	"fmt"
 	"hongze/hongze_mobile_admin/models"
 	"hongze/hongze_mobile_admin/models"
+	"hongze/hongze_mobile_admin/models/roadshow"
 	"hongze/hongze_mobile_admin/models/tables/admin"
 	"hongze/hongze_mobile_admin/models/tables/admin"
+	"hongze/hongze_mobile_admin/models/tables/system"
 	"hongze/hongze_mobile_admin/services/alarm_msg"
 	"hongze/hongze_mobile_admin/services/alarm_msg"
 	"hongze/hongze_mobile_admin/utils"
 	"hongze/hongze_mobile_admin/utils"
 	"io/ioutil"
 	"io/ioutil"
 	"net/http"
 	"net/http"
+	"strconv"
 	"strings"
 	"strings"
 	"time"
 	"time"
 )
 )
@@ -600,16 +603,79 @@ func SendWxMsgWithRaiWangYang(keyword1, keyword2, keyword3, keyword4 string, ope
 }
 }
 
 
 type GetAccessTokenResp struct {
 type GetAccessTokenResp struct {
-		Ret         int
-		Msg         string
-		ErrMsg      string
-		ErrCode     string
-		Data        GetAccessTokenRespData
-		Success     bool `description:"true 执行成功,false 执行失败"`
-		IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
-		IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
+	Ret         int
+	Msg         string
+	ErrMsg      string
+	ErrCode     string
+	Data        GetAccessTokenRespData
+	Success     bool `description:"true 执行成功,false 执行失败"`
+	IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
+	IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
 }
 }
 
 
 type GetAccessTokenRespData struct {
 type GetAccessTokenRespData struct {
-	AccessToken string 
+	AccessToken string
+}
+
+// SendWxMsgWithRoadshowSellerActivity 销售创建或取消活动的时候,推送模板消息
+func SendWxMsgWithRoadshowSellerActivity(keyword1, keyword2, keyword3, keyword4 string, openIdList []*system.OpenIdList, rsActivityId int) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("客户研选行业转正时(王芳审批通过),模板消息提醒汪洋,Err:"+err.Error()+";msg:"+msg, 3)
+		}
+		if msg != "" {
+			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+		}
+	}()
+
+	//获取对应的多个销售信息
+	listSellerActivity, e := roadshow.GetRsActivitySellerListByActivityIds([]int{rsActivityId})
+	if e != nil {
+		err = errors.New("GetRsActivitySellerListByActivityIds, Err: " + e.Error())
+		return
+	}
+	var adminIds []string
+	for _, v := range listSellerActivity {
+		adminIds = append(adminIds, strconv.Itoa(v.SellerId))
+	}
+	sellerList, e := admin.GetSysAdminByIds(strings.Join(adminIds, ","))
+	if e != nil {
+		err = errors.New("GetSysAdminByIds, Err: " + e.Error())
+		return
+	}
+	for _, sysAdmin := range sellerList {
+		if sysAdmin.OpenId != "" {
+			openIdObj := &system.OpenIdList{
+				OpenId:  sysAdmin.OpenId,
+				AdminId: sysAdmin.AdminId,
+			}
+			openIdList = append(openIdList, openIdObj)
+		}
+	}
+
+	openIdArr := make([]string, len(openIdList))
+	for i, v := range openIdList {
+		openIdArr[i] = v.OpenId
+	}
+	var wxAppPath string
+	wxAppPath = utils.WX_MSG_PATH_SSBG_SELLER_ACTIVITY_DETAIL + strconv.Itoa(rsActivityId)
+	sendInfo := new(SendWxTemplate)
+	sendInfo.WxAppId = utils.AdminWxAppId
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.TemplateId = utils.WxMsgTemplateIdWithRoadshowActivityPending
+	if wxAppPath != "" && utils.RunMode == "release" {
+		sendInfo.RedirectUrl = wxAppPath
+	}
+	sendInfo.RedirectTarget = 2
+	sendInfo.Resource = wxAppPath
+	sendInfo.SendType = utils.TEMPLATE_MSG_ACTIVITY_APPOINTMENT
+	sendInfo.OpenIdArr = openIdArr
+
+	err = SendTemplateMsg(sendInfo)
+	return
 }
 }

+ 20 - 18
utils/config.go

@@ -12,7 +12,7 @@ var (
 	RunMode        string //运行模式
 	RunMode        string //运行模式
 	MYSQL_URL      string //数据库连接
 	MYSQL_URL      string //数据库连接
 	MYSQL_URL_RDDP string //数据库连接
 	MYSQL_URL_RDDP string //数据库连接
-	MYSQL_URL_CYGX         string // 查研观向
+	MYSQL_URL_CYGX string // 查研观向
 
 
 	REDIS_CACHE string       //缓存地址
 	REDIS_CACHE string       //缓存地址
 	Rc          *cache.Cache //redis缓存
 	Rc          *cache.Cache //redis缓存
@@ -42,14 +42,15 @@ var (
 
 
 	WxYbAppId string //弘则研报小程序APPID
 	WxYbAppId string //弘则研报小程序APPID
 
 
-	WxMsgTemplateIdWithRoadshowPending      string //路演->研究员收到待处理的申请
-	WxMsgTemplateIdWithRoadshowDetailResult string //路演->销售收到处理结果
-	WxMsgTemplateIdWithRoadshowDeleteNotice string //路演->研究员收到活动删除通知
-	WxMsgTemplateIdWithSealApplyFinished    string // 用印申请-已签回通知
-	WxMsgTemplateIdWithYbCommunityQuestion  string // 研报小程序->问答社区回复通知
-	SendWxTemplateMsgUrl                    string //模板消息推送
-	SendWxCategoryTemplateMsgUrl string
-	HongzePublicApiUrl string // 弘则公共api
+	WxMsgTemplateIdWithRoadshowPending         string //路演->研究员收到待处理的申请
+	WxMsgTemplateIdWithRoadshowDetailResult    string //路演->销售收到处理结果
+	WxMsgTemplateIdWithRoadshowDeleteNotice    string //路演->研究员收到活动删除通知
+	WxMsgTemplateIdWithSealApplyFinished       string // 用印申请-已签回通知
+	WxMsgTemplateIdWithRoadshowActivityPending string //路演->销售收到添加成功与删除通知
+	WxMsgTemplateIdWithYbCommunityQuestion     string // 研报小程序->问答社区回复通知
+	SendWxTemplateMsgUrl                       string //模板消息推送
+	SendWxCategoryTemplateMsgUrl               string
+	HongzePublicApiUrl                         string // 弘则公共api
 
 
 	//查研观向
 	//查研观向
 	WxMsgTemplateIdCompanyApprovalMessageRai string //权益销售签约成功通知查研观向小助手模版消息
 	WxMsgTemplateIdCompanyApprovalMessageRai string //权益销售签约成功通知查研观向小助手模版消息
@@ -197,9 +198,10 @@ func wxConfig() {
 		TemplateCompanyApplyRedirectUrl = "https://ficc.hzinsights.com/approval/approval/list"
 		TemplateCompanyApplyRedirectUrl = "https://ficc.hzinsights.com/approval/approval/list"
 
 
 		//路演
 		//路演
-		WxMsgTemplateIdWithRoadshowPending = "1JG9fvKx9o9B-wkZe_gBFQQzMBnp07-hvpZI9QiFcKQ"      //路演->研究员收到待处理的申请
-		WxMsgTemplateIdWithRoadshowDetailResult = "D6AFTJ7CbDDFBYg1R-HRir5bBXkIqGrwUtb2bjN-Wr4" //路演->销售收到处理结果
-		WxMsgTemplateIdWithRoadshowDeleteNotice = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450" //路演->研究员收到活动删除通知
+		WxMsgTemplateIdWithRoadshowPending = "1JG9fvKx9o9B-wkZe_gBFQQzMBnp07-hvpZI9QiFcKQ"         //路演->研究员收到待处理的申请
+		WxMsgTemplateIdWithRoadshowDetailResult = "D6AFTJ7CbDDFBYg1R-HRir5bBXkIqGrwUtb2bjN-Wr4"    //路演->销售收到处理结果
+		WxMsgTemplateIdWithRoadshowDeleteNotice = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450"    //路演->研究员收到活动删除通知
+		WxMsgTemplateIdWithRoadshowActivityPending = "f1bVCs2kaZsFB3S16El-gBcce3mqoUJzVeS03krtW-Q" //路演->销售收到添加成功与删除通知
 
 
 		WxMsgTemplateIdWithSealApplyFinished = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450" // 用印申请-已签回通知
 		WxMsgTemplateIdWithSealApplyFinished = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450" // 用印申请-已签回通知
 
 
@@ -209,7 +211,7 @@ func wxConfig() {
 		//查研观向小助手原有的模板ID
 		//查研观向小助手原有的模板ID
 		{
 		{
 			WxMsgTemplateIdCompanyApprovalMessageRai = "JlGx2rKZKIsolvkQ1ZbGSBDNzIIJAaF1bbwcdLuJwQ8" //权益销售签约成功通知查研观向小助手模版消息-模板ID
 			WxMsgTemplateIdCompanyApprovalMessageRai = "JlGx2rKZKIsolvkQ1ZbGSBDNzIIJAaF1bbwcdLuJwQ8" //权益销售签约成功通知查研观向小助手模版消息-模板ID
-			WxMsgTemplateIdActivityChangeApply = "dYg6iHooRq74PyCXmw_Ns7qdJZmbtLoKS2p2FKeaXl0" //查研观向活动变更通知-模板ID
+			WxMsgTemplateIdActivityChangeApply = "dYg6iHooRq74PyCXmw_Ns7qdJZmbtLoKS2p2FKeaXl0"       //查研观向活动变更通知-模板ID
 		}
 		}
 
 
 		//内部员工公众号(弘则部门)
 		//内部员工公众号(弘则部门)
@@ -219,7 +221,6 @@ func wxConfig() {
 		SendWxTemplateMsgUrl = "http://127.0.0.1:8086/v1/wechat/send_template_msg"
 		SendWxTemplateMsgUrl = "http://127.0.0.1:8086/v1/wechat/send_template_msg"
 		SendWxCategoryTemplateMsgUrl = "http://127.0.0.1:8086/v1/wechat/send_category_template_msg"
 		SendWxCategoryTemplateMsgUrl = "http://127.0.0.1:8086/v1/wechat/send_category_template_msg"
 
 
-
 		// 类目模版
 		// 类目模版
 		WxCategoryMsgTemplateIdApplyXzs = "HKD03oZfSv8LJgeoHz0pynai3G2Ls4h8zZ6BfOpZmIA"
 		WxCategoryMsgTemplateIdApplyXzs = "HKD03oZfSv8LJgeoHz0pynai3G2Ls4h8zZ6BfOpZmIA"
 		WxCategoryMsgTemplateIdActivitySign = "11rITVC5Gl8qwetxl92NqY887Uk14kg3nPtEA_i_zLo"
 		WxCategoryMsgTemplateIdActivitySign = "11rITVC5Gl8qwetxl92NqY887Uk14kg3nPtEA_i_zLo"
@@ -238,9 +239,10 @@ func wxConfig() {
 		TemplateCompanyApplyRedirectUrl = "http://advisoryadmin.brilliantstart.cn/approval/approval/list"
 		TemplateCompanyApplyRedirectUrl = "http://advisoryadmin.brilliantstart.cn/approval/approval/list"
 
 
 		//路演
 		//路演
-		WxMsgTemplateIdWithRoadshowPending = "1JG9fvKx9o9B-wkZe_gBFQQzMBnp07-hvpZI9QiFcKQ"      //路演->研究员收到待处理的申请
-		WxMsgTemplateIdWithRoadshowDetailResult = "D6AFTJ7CbDDFBYg1R-HRir5bBXkIqGrwUtb2bjN-Wr4" //路演->销售收到处理结果
-		WxMsgTemplateIdWithRoadshowDeleteNotice = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450" //路演->研究员收到活动删除通知
+		WxMsgTemplateIdWithRoadshowPending = "1JG9fvKx9o9B-wkZe_gBFQQzMBnp07-hvpZI9QiFcKQ"         //路演->研究员收到待处理的申请
+		WxMsgTemplateIdWithRoadshowDetailResult = "D6AFTJ7CbDDFBYg1R-HRir5bBXkIqGrwUtb2bjN-Wr4"    //路演->销售收到处理结果
+		WxMsgTemplateIdWithRoadshowDeleteNotice = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450"    //路演->研究员收到活动删除通知
+		WxMsgTemplateIdWithRoadshowActivityPending = "f1bVCs2kaZsFB3S16El-gBcce3mqoUJzVeS03krtW-Q" //路演->销售收到添加成功与删除通知
 
 
 		WxMsgTemplateIdWithSealApplyFinished = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450" // 用印申请-已签回通知
 		WxMsgTemplateIdWithSealApplyFinished = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450" // 用印申请-已签回通知
 
 
@@ -250,7 +252,7 @@ func wxConfig() {
 		//查研观向小助手原有的模板ID
 		//查研观向小助手原有的模板ID
 		{
 		{
 			WxMsgTemplateIdCompanyApprovalMessageRai = "RcV2uM5nFSiUtOHsq4SdYz2Fhk-OVfg5rutWz2IsSJQ" //权益销售签约成功通知查研观向小助手模版消息-模板ID
 			WxMsgTemplateIdCompanyApprovalMessageRai = "RcV2uM5nFSiUtOHsq4SdYz2Fhk-OVfg5rutWz2IsSJQ" //权益销售签约成功通知查研观向小助手模版消息-模板ID
-			WxMsgTemplateIdActivityChangeApply = "CB7bOl7f3viMG4s1uhRo7WM0Jbx3WvodKuIZ8A_z8fM" //查研观向活动变更通知-模板ID
+			WxMsgTemplateIdActivityChangeApply = "CB7bOl7f3viMG4s1uhRo7WM0Jbx3WvodKuIZ8A_z8fM"       //查研观向活动变更通知-模板ID
 		}
 		}
 
 
 		//测试内部员工公众号(弘则科技)
 		//测试内部员工公众号(弘则科技)

+ 7 - 2
utils/constants.go

@@ -171,9 +171,9 @@ const (
 	ZHI_ZAO_NAME                     string = "智造"
 	ZHI_ZAO_NAME                     string = "智造"
 	CHART_PERMISSION_NAME_MF_YANXUAN string = "研选订阅"
 	CHART_PERMISSION_NAME_MF_YANXUAN string = "研选订阅"
 	ZHUAN_JIA_ID                     int    = 29
 	ZHUAN_JIA_ID                     int    = 29
-	CHART_PERMISSION_NAME_70W               = "70w大套餐"                // 权益70w大套餐名称
+	CHART_PERMISSION_NAME_70W               = "70w大套餐"                   // 权益70w大套餐名称
 	CHART_PERMISSION_ID_70W                 = 2001                       // 权益70w大套餐表示的权限ID(自定义)
 	CHART_PERMISSION_ID_70W                 = 2001                       // 权益70w大套餐表示的权限ID(自定义)
-	CHART_PERMISSION_NAME_45W               = "45w大套餐"                // 权益45w大套餐名称
+	CHART_PERMISSION_NAME_45W               = "45w大套餐"                   // 权益45w大套餐名称
 	CHART_PERMISSION_ID_45W                 = 2002                       // 权益45w大套餐表示的权限ID(自定义)
 	CHART_PERMISSION_ID_45W                 = 2002                       // 权益45w大套餐表示的权限ID(自定义)
 	TPL_MSG_WANG_YANG                       = "tpl_msg_wang_yang"        //汪洋手机号地址参数
 	TPL_MSG_WANG_YANG                       = "tpl_msg_wang_yang"        //汪洋手机号地址参数
 	TPL_MSG_YANXAUN_APPROVAL                = "tpl_msg_yanxaun_approval" // 【研选订阅】和【研选扣点包】转正/续约审批通过后,给冯柯然和汪洋和沈涛发送模板消息
 	TPL_MSG_YANXAUN_APPROVAL                = "tpl_msg_yanxaun_approval" // 【研选订阅】和【研选扣点包】转正/续约审批通过后,给冯柯然和汪洋和沈涛发送模板消息
@@ -186,3 +186,8 @@ const (
 const (
 const (
 	ApproveUserId = 9 //戚明之-出差审批人
 	ApproveUserId = 9 //戚明之-出差审批人
 )
 )
+
+// 随手办公小程序 模版消息路由
+const (
+	WX_MSG_PATH_SSBG_SELLER_ACTIVITY_DETAIL = "/pages-approve/activity/ficcActivityDetail?TemplateMsg=true&RsActivityId=" //随手办公小程序,销售添加活动详情
+)