浏览代码

Merge branch 'CRM6.2' of hongze/hongze_mobile_admin into master

hongze 3 年之前
父节点
当前提交
f91792cf7f

+ 7 - 2
.gitignore

@@ -1,9 +1,14 @@
 /hongze_mobile_admin
 /lastupdate.tmp
-/swagger
 /binlog
 /rdlucklog
 /.idea
 .DS_Store
 /conf
-/tests
+/tests
+/hongze_mobile_admin.exe
+/*.exe
+go.mod
+go.sum
+/go.sum
+/go.mod

+ 1516 - 10
controllers/roadshow/calendar.go

@@ -2,13 +2,14 @@ package roadshow
 
 import (
 	"encoding/json"
+	"fmt"
 	"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/services"
-	roadshowService "hongze/hongze_mobile_admin/services/roadshow"
+	"hongze/hongze_mobile_admin/services/rs"
 	"hongze/hongze_mobile_admin/utils"
 	"strconv"
 	"strings"
@@ -20,13 +21,236 @@ type CalendarController struct {
 	controllers.BaseAuth
 }
 
+// @Title 新增路演活动接口
+// @Description 新增路演活动接口
+// @Param	request	body rs.AddActivityReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /add [post]
+func (this *CalendarController) Add() {
+
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+
+	deleteCache := true
+	cacheKey := "CACHE_RS_ACTIVITY_WX_ADD_" + 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.AddActivityReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		this.FailWithMessage("参数解析异常", "参数解析失败,Err:"+err.Error())
+		return
+	}
+
+	if len(req.ResearcherList) <= 0 {
+		this.FailWithMessage("请选择研究员!", "请选择研究员!")
+		return
+	}
+
+	researcherMap := make(map[int]string)
+	var checkIsAdd []string
+	//var tipMsg string
+	for _, v := range req.ResearcherList {
+		if v.ResearcherId <= 0 {
+			this.FailWithMessage("请选择研究员!", "请选择研究员!")
+			return
+		}
+		if v.ResearcherName == "" {
+			this.FailWithMessage("请选择研究员!", "请选择研究员!")
+			return
+		}
+		if v.StartDate == "" {
+			this.FailWithMessage("请选择开始日期!", "请选择开始日期!")
+			return
+		}
+		if v.EndDate == "" {
+			this.FailWithMessage("请选择结束日期!", "请选择结束日期!")
+			return
+		}
+		if v.StartTime == "" {
+			this.FailWithMessage("请选择开始时间!", "请选择开始时间!")
+			return
+		}
+		if v.EndTime == "" {
+			this.FailWithMessage("请选择结束时间!", "请选择结束时间!")
+			return
+		}
+		if v.StartWeek == "" {
+			this.FailWithMessage("请选择周!", "请选择周!")
+			return
+		}
+
+		if v.EndWeek == "" {
+			this.FailWithMessage("请选择周!", "请选择周!")
+			return
+		}
+
+		startDateTime := v.StartDate + " " + v.StartTime
+		endDateTime := v.EndDate + " " + v.EndTime
+
+		startP, _ := time.ParseInLocation(utils.FormatDateTime, startDateTime, time.Local)
+		endP, _ := time.ParseInLocation(utils.FormatDateTime, endDateTime, time.Local)
+
+		if startP.Before(time.Now()) || startP.Equal(time.Now()) {
+			this.FailWithMessage("活动开始时间不能小于当前时间!", "活动开始时间不能小于当前时间!")
+			return
+		}
+
+		if endP.Before(time.Now()) || endP.Equal(time.Now()) {
+			this.FailWithMessage("活动结束时间不能小于当前时间!", "活动结束时间不能小于当前时间!")
+			return
+		}
+
+		if startP.After(endP) || startP.Equal(endP) {
+			this.FailWithMessage("活动开始时间应小于结束时间!", "活动开始时间应小于结束时间!")
+			return
+		}
+
+		if realName, ok := researcherMap[v.ResearcherId]; ok {
+			this.FailWithMessage("研究员:"+realName+" 被重复选择", "研究员:"+realName+" 被重复选择")
+			return
+		}
+		researcherMap[v.ResearcherId] = v.ResearcherName
+
+		//同步上海数据
+		researcherInfo, err := admin.GetAdminWxById(v.ResearcherId)
+		if err != nil {
+			this.FailWithMessage("研究员异常", "获取研究员异常,Err:"+err.Error())
+			return
+		}
+		_ = rs.SyncCalendarFromShanghai(researcherInfo.Mobile, v.StartDate, v.EndDate)
+
+		//校验事项时间冲突
+		{
+			matterCount, err := rs.CheckMatters(startDateTime, endDateTime, v.ResearcherId, 0)
+			if err != nil {
+				this.FailWithMessage("时间冲突检测失败!", "时间冲突检测失败-CheckMattersCount!Err:"+err.Error())
+				return
+			}
+			if matterCount > 0 {
+				checkIsAdd = append(checkIsAdd, v.ResearcherName)
+			}
+		}
+
+		//校验活动时间冲突
+		{
+			calendarCount, err := rs.CheckCalendar(startDateTime, endDateTime, "1,2", v.ResearcherId, 0)
+			if err != nil {
+				this.FailWithMessage("时间冲突检测失败!", "时间冲突检测失败-CheckCalendar!Err:"+err.Error())
+				return
+			}
+			if calendarCount > 0 {
+				checkIsAdd = append(checkIsAdd, v.ResearcherName)
+			}
+		}
+	}
+
+	if len(checkIsAdd) > 0 {
+		this.FailWithMessage(strings.Join(checkIsAdd, ",")+" 时间已被占用!", "时间冲突检测失败-CheckMattersCount!")
+		return
+	}
+
+	rsCalendar := new(roadshow.RsCalendar)
+	rsCalendar.SysUserId = sysUser.AdminId
+	rsCalendar.SysUserRealName = sysUser.RealName
+	rsCalendar.ActivityType = req.ActivityType
+	rsCalendar.RoadshowType = req.RoadshowType
+	rsCalendar.RoadshowPlatform = req.RoadshowPlatform
+	rsCalendar.CompanyId = req.CompanyId
+	rsCalendar.CompanyName = req.CompanyName
+	rsCalendar.Province = req.Province
+	rsCalendar.ProvinceCode = req.ProvinceCode
+	rsCalendar.City = req.City
+	rsCalendar.CityCode = req.CityCode
+	rsCalendar.Theme = req.Theme
+	rsCalendar.CooperationName = req.CooperationName
+	rsCalendar.CreateTime = time.Now()
+	rsCalendar.ModifyTime = time.Now()
+	rsCalendar.ActivityCategory = req.ActivityCategory
+	rsCalendar.Source = 0
+	rsCalendar.Title = getTitle(req.ActivityType, req.RoadshowType, req.ActivityCategory, req.RoadshowPlatform, req.Province, req.City)
+	rsCalendarId, err := roadshow.AddRsCalendar(rsCalendar)
+	if err != nil {
+		this.FailWithMessage("保存失败", "保存日历活动信息失败!Err:"+err.Error())
+		return
+	}
+	//if researcherId != 99 {
+	for k, v := range req.ResearcherList {
+		researcher := new(roadshow.RsCalendarResearcher)
+		researcher.RsCalendarId = int(rsCalendarId)
+		researcher.ResearcherId = v.ResearcherId
+		researcher.ResearcherName = v.ResearcherName
+		researcher.StartDate = v.StartDate
+		researcher.EndDate = v.EndDate
+		researcher.StartTime = v.StartTime
+		researcher.EndTime = v.EndTime
+		researcher.StartWeek = v.StartWeek
+		researcher.EndWeek = v.EndWeek
+		researcher.CreateTime = time.Now()
+		researcher.ModifyTime = time.Now()
+		researcher.ResearcherSort = k + 1
+		if req.ActivityType == "路演" || req.ActivityType == "公开会议" {
+			researcher.Status = 1
+		} else {
+			researcher.Status = 2
+		}
+		rsCalendarResearcherId, err := roadshow.AddRsCalendarResearcher(researcher)
+		if err != nil {
+			this.FailWithMessage("保存失败", "保存日历活动-研究员信息失败!Err:"+err.Error())
+			return
+		}
+		rsCalendar.RsCalendarId = int(rsCalendarId)
+		researcher.RsCalendarResearcherId = int(rsCalendarResearcherId)
+		go rs.CalendarToSH(*rsCalendar, *researcher)
+
+		//模板消息通知
+		{
+			go func() {
+				sysAdmin, _ := admin.GetAdminWxById(v.ResearcherId)
+				if sysAdmin != nil && req.ActivityType != "内部会议" && req.ActivityType != "报告电话会" {
+					first := "您收到一个新的【" + req.ActivityType + "】申请,请及时处理"
+					keyword1 := sysUser.RealName
+					keyword2 := "--"
+					keyword3 := time.Now().Format(utils.FormatDateTime)
+					startDateSub := v.StartDate[5:]
+					startDateSub = strings.Replace(startDateSub, "-", ".", -1)
+					var keyword4 string
+					if req.ActivityType == "路演" {
+						keyword4 = startDateSub + "(" + v.StartWeek + ")" + " " + v.StartTime[:5] + "~" + v.EndTime[:5] + " ," + req.CompanyName + "(" + req.RoadshowType + req.ActivityType + ")"
+					} else {
+						keyword4 = startDateSub + "(" + v.StartWeek + ")" + " " + v.StartTime[:5] + "~" + v.EndTime[:5] + " ," + req.Theme + "(" + req.RoadshowType + req.ActivityType + ")"
+					}
+					remark := "请尽快完成审批"
+					wxAppPath := "pages-approve/activity/detail?RsCalendarId=" + strconv.Itoa(int(rsCalendarId)) + "&RsCalendarResearcherId=" + strconv.Itoa(int(rsCalendarResearcherId))
+					openIdList, _ := models.GetAdminOpenIdByMobile(sysAdmin.Mobile)
+					if len(openIdList) > 0 {
+						services.SendWxMsgWithRoadshowPending(first, keyword1, keyword2, keyword3, keyword4, remark, wxAppPath, sysAdmin.Mobile)
+					}
+				}
+			}()
+		}
+	}
+	this.OkDetailed(nil, "保存成功")
+}
+
 // CalendarList
 // @Title 我的日历列表
 // @Description 我的日历列表接口
 // @Param   PageSize   query   int  true       "每页数据条数"
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
-// @Param   Status   query   int  true       "1:待接受,2:包含,已接受,已拒绝,已删除"
-// @Success 200 {object} roadshow.CalendarListResp
+// @Param   Status   query   int  true       "1:待接受,2:包含,已接受,已拒绝,已删除,已撤回,已结束"
+// @Success 200 {object} rs.CalendarListResp
 // @router /calendar/list [get]
 func (this *CalendarController) CalendarList() {
 	adminItem := this.AdminWx
@@ -51,8 +275,31 @@ func (this *CalendarController) CalendarList() {
 	var condition string
 	var pars []interface{}
 
-	condition += ` AND b.researcher_id=?`
-	pars = append(pars, adminItem.AdminId)
+	roleTypeCode := adminItem.RoleTypeCode
+	//销售
+	if roleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+		condition += ` AND a.sys_user_id=?`
+		pars = append(pars, adminItem.AdminId)
+	}
+
+	if roleTypeCode == utils.ROLE_TYPE_CODE_FICC_RESEARCHR ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_RESEARCHR ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_RESEARCHR ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_FICC_DEPARTMENT ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_DEPARTMENT ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
+		condition += ` AND b.researcher_id=?`
+		pars = append(pars, adminItem.AdminId)
+	}
+
+	if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
+		condition += ` AND a.sys_user_id=?`
+		pars = append(pars, adminItem.AdminId)
+	}
 
 	condition += ` AND a.activity_type IN('路演','公开会议') `
 
@@ -60,7 +307,7 @@ func (this *CalendarController) CalendarList() {
 		condition += ` AND b.status=?`
 		pars = append(pars, 1)
 	} else {
-		condition += ` AND b.status IN(2,3,4)`
+		condition += ` AND b.status IN(2,3,4,5,6)`
 	}
 
 	resp := new(roadshow.CalendarListResp)
@@ -80,9 +327,68 @@ func (this *CalendarController) CalendarList() {
 	this.OkDetailed(resp, "获取成功")
 }
 
+
+// CalendarList
+// @Title 内部会议和报告电话会日历列表
+// @Description 内部会议和报告电话会日历列表
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   CalendarType   query   int  true       "1:内部会议,2:报告电话会"
+// @Success 200 {object} rs.CalendarListResp
+// @router /calendar/type/list [get]
+func (this *CalendarController) CalendarTypeList() {
+	adminItem := this.AdminWx
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	calendarType, _ := this.GetInt("CalendarType")
+
+	var total int
+	page := paging.GetPaging(currentIndex, pageSize, total)
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize10
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	var condition string
+	var pars []interface{}
+
+	if calendarType == 1 {
+		condition += ` AND a.activity_type='内部会议' `
+		condition += ` AND a.sys_user_id=?`
+		pars = append(pars, adminItem.AdminId)
+	}
+
+	if calendarType == 2 {
+		condition += ` AND a.activity_type='报告电话会' `
+	}
+
+	resp := new(roadshow.CalendarListResp)
+	total, err := roadshow.GetCalendarTypeListCount(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		this.FailWithMessage("获取信息失败!", "获取数据总数失败,GetCalendarTypeListCount,Err:"+err.Error())
+		return
+	}
+	page = paging.GetPaging(currentIndex, pageSize, total)
+	dataList, err := roadshow.GetCalendarTypeList(condition, pars, startSize, pageSize)
+	if err != nil {
+		this.FailWithMessage("获取信息失败!", "获取数据失败,GetCalendarTypeList,Err:"+err.Error())
+		return
+	}
+	resp.Paging = page
+	resp.List = dataList
+	this.OkDetailed(resp, "获取成功")
+}
+
 // Accept
 // @Description 接受路演活动接口
-// @Param	request	body roadshow.AcceptReq true "type json string"
+// @Param	request	body rs.AcceptReq true "type json string"
 // @Success Ret=200 保存成功
 // @router /accept [post]
 func (this *CalendarController) Accept() {
@@ -162,7 +468,7 @@ func (this *CalendarController) Accept() {
 
 // @Title 拒绝路演活动接口
 // @Description 拒绝路演活动接口
-// @Param	request	body roadshow.RefuseReq true "type json string"
+// @Param	request	body rs.RefuseReq true "type json string"
 // @Success Ret=200 保存成功
 // @router /refuse [post]
 func (this *CalendarController) Refuse() {
@@ -222,7 +528,7 @@ func (this *CalendarController) Refuse() {
 	}
 
 	// 拒绝后需要删除上海的日程
-	go roadshowService.DeleteSHCalendar(req.RsCalendarResearcherId)
+	go rs.DeleteSHCalendar(req.RsCalendarResearcherId)
 
 	//模板消息通知
 	{
@@ -250,7 +556,7 @@ func (this *CalendarController) Refuse() {
 // @Description 日历详情接口
 // @Param   RsCalendarId   query   int  true       "路演活动id"
 // @Param   RsCalendarResearcherId   query   int  true       "活动研究员id"
-// @Success 200 {object} roadshow.CalendarDetailResp
+// @Success 200 {object} rs.CalendarDetailResp
 // @router /calendar/detail [get]
 func (this *CalendarController) CalendarDetail() {
 	//adminItem:=this.AdminWx
@@ -310,3 +616,1203 @@ func (this *CalendarController) CalendarDetail() {
 	resp.CompanyDetail = companyDetailView
 	this.OkDetailed(resp, "获取成功")
 }
+
+// @Title 事项列表
+// @Description 事项列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Success 200 {object} rs.MattersListResp
+// @router /matters/list [get]
+func (this *CalendarController) MattersList() {
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	var total int
+	page := paging.GetPaging(currentIndex, pageSize, total)
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize10
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	var condition string
+	var pars []interface{}
+
+	condition += ` AND a.sys_user_id=?`
+	pars = append(pars, sysUser.AdminId)
+
+	resp := new(roadshow.MattersListResp)
+	total, err := roadshow.GetMattersListCount(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		this.FailWithMessage("获取事项信息失败", "获取事项信息失败,GetMattersListCount,Err:"+err.Error())
+		return
+	}
+	page = paging.GetPaging(currentIndex, pageSize, total)
+	dataList, err := roadshow.GetMattersList(condition, pars, startSize, pageSize)
+	if err != nil {
+		this.FailWithMessage("获取事项信息失败", "获取事项信息失败,GetMattersList,Err:"+err.Error())
+		return
+	}
+	resp.Paging = page
+	resp.List = dataList
+	this.OkDetailed(resp, "获取成功")
+}
+
+// @Title 新增事项接口
+// @Description 新增事项接口
+// @Param	request	body rs.AddMattersReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /matters/add [post]
+func (this *CalendarController) MattersAdd() {
+
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+
+	deleteCache := true
+	cacheKey := "CACHE_RS_MATTERS_ADD_" + strconv.Itoa(sysUser.AdminId)
+	defer func() {
+		if deleteCache {
+			utils.Rc.Delete(cacheKey)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
+		deleteCache = false
+		this.FailWithMessage("系统处理中,请稍后重试!", "系统处理中,请稍后重试!"+sysUser.RealName+";data:"+string(this.Ctx.Input.RequestBody))
+		return
+	}
+	var req roadshow.AddMattersReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		this.FailWithMessage("参数解析异常", "参数解析失败,Err:"+err.Error())
+		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
+	}
+	if req.MatterContent == "" {
+		this.FailWithMessage("请选择研究员!", "请选择研究员!")
+		return
+	}
+
+	startDateTime := req.StartDate + " " + req.StartTime
+	endDateTime := req.EndDate + " " + req.EndTime
+	//校验事项时间冲突
+	{
+		matterCount, err := rs.CheckMatters(startDateTime, endDateTime, sysUser.AdminId, 0)
+		if err != nil {
+			this.FailWithMessage("时间冲突检测失败!", "时间冲突检测失败-CheckMattersCount!Err:"+err.Error())
+			return
+		}
+		if matterCount > 0 {
+			this.FailWithMessage("当前时间已被占用!", "时间冲突检测失败-CheckMattersCount!")
+			return
+		}
+	}
+
+	//校验活动时间冲突--待接受
+	{
+		calendarCount, err := rs.CheckCalendar(startDateTime, endDateTime, "1", sysUser.AdminId, 0)
+		if err != nil {
+			this.FailWithMessage("时间冲突检测失败!", "时间冲突检测失败-CheckCalendarResearcherCount!Err:"+err.Error())
+			return
+		}
+		if calendarCount > 0 {
+			this.FailWithMessage("当前时间与待处理的申请有冲突,请与相关销售沟通!", "时间冲突检测失败-CheckCalendarResearcherCount!")
+			return
+		}
+	}
+
+	//校验活动时间冲突--已接受
+	{
+		calendarCount, err := rs.CheckCalendar(startDateTime, endDateTime, "2", sysUser.AdminId, 0)
+		if err != nil {
+			this.FailWithMessage("时间冲突检测失败!", "时间冲突检测失败-CheckCalendarResearcherCount!Err:"+err.Error())
+			return
+		}
+		if calendarCount > 0 {
+			this.FailWithMessage("当前时间已被占用!", "时间冲突检测失败-CheckCalendarResearcherCount!")
+			return
+		}
+	}
+
+	startP, _ := time.ParseInLocation(utils.FormatDateTime, startDateTime, time.Local)
+	endP, _ := time.ParseInLocation(utils.FormatDateTime, endDateTime, time.Local)
+
+	if startP.Before(time.Now()) || startP.Equal(time.Now()) {
+		this.FailWithMessage("事项开始时间不能小于当前时间!", "事项开始时间不能小于当前时间!")
+		return
+	}
+
+	if endP.Before(time.Now()) || endP.Equal(time.Now()) {
+		this.FailWithMessage("事项结束时间不能小于当前时间!", "事项结束时间不能小于当前时间!")
+		return
+	}
+
+	if startP.After(endP) || startP.Equal(endP) {
+		this.FailWithMessage("事项开始时间应小于结束时间!", "事项开始时间应小于结束时间!")
+		return
+	}
+
+	item := new(roadshow.RsMatters)
+	item.SysUserId = sysUser.AdminId
+	item.SysUserRealName = sysUser.RealName
+	item.StartDate = req.StartDate
+	item.EndDate = req.EndDate
+	item.StartTime = req.StartTime
+	item.EndTime = req.EndTime
+	item.StartWeek = req.StartWeek
+	item.EndWeek = req.EndWeek
+	item.MatterContent = req.MatterContent
+	item.Status = 1
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	id, err := roadshow.AddRsMatters(item)
+	if err != nil {
+		this.FailWithMessage("保存失败!", "保存失败,AddRsMatters Err:"+err.Error())
+		return
+	}
+	item.RsMattersId = int(id)
+	go rs.MatterToSH(*item)
+	this.OkDetailed(nil, "保存成功")
+}
+
+// @Title 修改事项接口
+// @Description 修改事项接口
+// @Param	request	body rs.UpdateMattersReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /matters/update [post]
+func (this *CalendarController) MattersUpdate() {
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+
+	deleteCache := true
+	cacheKey := "CACHE_RS_MATTERS_UPDATE_" + strconv.Itoa(sysUser.AdminId)
+	defer func() {
+		if deleteCache {
+			utils.Rc.Delete(cacheKey)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
+		deleteCache = false
+		this.FailWithMessage("系统处理中,请稍后重试!", "系统处理中,请稍后重试!")
+		return
+	}
+	var req roadshow.UpdateMattersReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		this.FailWithMessage("参数解析失败!", "参数解析失败,Err:"+err.Error())
+		return
+	}
+	updateParams := make(map[string]interface{})
+	if req.RsMattersId <= 0 {
+		this.FailWithMessage("参数错误!", "参数错误")
+		return
+	}
+
+	if req.StartDate == "" {
+		this.FailWithMessage("请选择开始日期!", "请选择开始日期")
+		return
+	} else {
+		updateParams["start_date"] = req.StartDate
+	}
+	if req.EndDate == "" {
+		this.FailWithMessage("请选择结束日期!", "请选择结束日期")
+		return
+	} else {
+		updateParams["end_date"] = req.EndDate
+	}
+	if req.StartTime == "" {
+		this.FailWithMessage("请选择开始时间!", "请选择开始时间")
+		return
+	} else {
+		updateParams["start_time"] = req.StartTime
+	}
+	if req.EndTime == "" {
+		this.FailWithMessage("请选择结束时间!", "请选择结束时间")
+		return
+	} else {
+		updateParams["end_time"] = req.EndTime
+	}
+	if req.StartWeek == "" {
+		this.FailWithMessage("请选择周!", "请选择周")
+		return
+	} else {
+		updateParams["start_week"] = req.StartWeek
+	}
+	if req.EndWeek == "" {
+		this.FailWithMessage("请选择周!", "请选择周")
+		return
+	} else {
+		updateParams["end_week"] = req.EndWeek
+	}
+	if req.MatterContent == "" {
+		this.FailWithMessage("请选择研究员!", "请选择研究员")
+		return
+	} else {
+		updateParams["matter_content"] = req.MatterContent
+	}
+
+	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 startP.Before(time.Now()) || startP.Equal(time.Now()) {
+		this.FailWithMessage("事项开始时间不能小于当前时间!", "事项开始时间不能小于当前时间!")
+		return
+	}
+
+	if endP.Before(time.Now()) || endP.Equal(time.Now()) {
+		this.FailWithMessage("事项结束时间不能小于当前时间!", "事项结束时间不能小于当前时间!")
+		return
+	}
+
+	if startP.After(endP) || startP.Equal(endP) {
+		this.FailWithMessage("事项开始时间应小于结束时间!", "事项开始时间应小于结束时间!")
+		return
+	}
+
+	matterItem, err := roadshow.GetMattersById(req.RsMattersId)
+	if err != nil {
+		this.FailWithMessage("保存失败!", "保存失败,GetMattersById,Err:"+err.Error())
+		return
+	}
+	//校验事项时间冲突
+	{
+		if matterItem != nil && (matterItem.StartDate != req.StartDate ||
+			matterItem.StartTime != req.StartTime ||
+			matterItem.EndDate != req.EndDate ||
+			matterItem.EndTime != req.EndTime) {
+
+			matterCount, err := rs.CheckMatters(startDateTime, endDateTime, sysUser.AdminId, matterItem.RsMattersId)
+			if err != nil {
+				this.FailWithMessage("时间冲突检测失败!", "时间冲突检测失败-CheckMattersCount!Err:"+err.Error())
+				return
+			}
+			if matterCount > 0 {
+				this.FailWithMessage("时间冲突,已存在时间段内的事项!", "时间冲突检测失败-CheckMattersCount!")
+				return
+			}
+		}
+	}
+
+	//校验活动时间冲突--待接受
+	{
+		calendarCount, err := rs.CheckCalendar(startDateTime, endDateTime, "1", sysUser.AdminId, 0)
+		if err != nil {
+			this.FailWithMessage("时间冲突检测失败!", "时间冲突检测失败-CheckCalendarResearcherCount!Err:"+err.Error())
+			return
+		}
+		if calendarCount > 0 {
+			this.FailWithMessage("当前时间与待处理的申请有冲突,请与相关销售沟通!", "时间冲突检测失败-CheckCalendarResearcherCount!")
+			return
+		}
+	}
+	//校验活动时间冲突--待接受
+	{
+		calendarCount, err := rs.CheckCalendar(startDateTime, endDateTime, "2", sysUser.AdminId, 0)
+		if err != nil {
+			this.FailWithMessage("时间冲突检测失败!", "时间冲突检测失败-CheckCalendarResearcherCount!Err:"+err.Error())
+			return
+		}
+		if calendarCount > 0 {
+			this.FailWithMessage("时间冲突,已存在时间段内的活动!", "时间冲突检测失败-CheckCalendarResearcherCount!")
+			return
+		}
+	}
+
+	whereParams := make(map[string]interface{})
+
+	whereParams["rs_matters_id"] = req.RsMattersId
+
+	updateParams["modify_time"] = time.Now()
+
+	err = roadshow.UpdateRsMatters(whereParams, updateParams)
+	if err != nil {
+		this.FailWithMessage("保存失败!", "保存失败!UpdateRsMatters:"+err.Error())
+		return
+	}
+	go rs.UpdateSHCalendarByMatter(req)
+	this.OkDetailed(nil, "保存成功")
+}
+
+// @Title 删除事项接口
+// @Description 删除事项接口
+// @Param	request	body rs.DeleteMattersReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /matters/delete [post]
+func (this *CalendarController) MattersDelete() {
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+
+	var req roadshow.DeleteMattersReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		this.FailWithMessage("参数解析失败", "参数解析失败,Err:"+err.Error())
+		return
+	}
+
+	if req.RsMattersId <= 0 {
+		this.FailWithMessage("参数错误", "参数错误")
+		return
+	}
+
+	err = roadshow.DeleteRsMatters(req.RsMattersId)
+	if err != nil {
+		this.FailWithMessage("保存失败", "保存失败!DeleteRsMatters:"+err.Error())
+		return
+	}
+	go rs.DeleteSHMatter(req.RsMattersId)
+	this.OkDetailed(nil, "删除成功")
+}
+
+func getTitle(activityType, roadshowType, activityCategory, roadshowPlatform, province, city string) string {
+	var title string
+	switch activityType {
+	case "内部会议":
+		title = "内部会议"
+	case "公开会议", "路演":
+		if roadshowType == "线上" {
+			title = roadshowType + activityType + roadshowPlatform
+		} else {
+			title = roadshowType + activityType + province + city
+		}
+	case "报告电话会":
+		title = activityCategory + "电话会"
+	}
+	return title
+}
+
+// @Title 编辑路演活动接口
+// @Description编辑路演活动接口
+// @Param	request	body rs.EditActivityReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /edit [post]
+func (this *CalendarController) Edit() {
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+
+	deleteCache := true
+	cacheKey := "CACHE_RS_ACTIVITY_EDIT_" + strconv.Itoa(sysUser.AdminId)
+	defer func() {
+		if deleteCache {
+			utils.Rc.Delete(cacheKey)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 3*time.Second) {
+		deleteCache = false
+		this.FailWithMessage("系统处理中,请稍后重试!", "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody))
+		return
+	}
+
+	var req roadshow.EditActivityReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		this.FailWithMessage("参数解析异常", "参数解析失败,Err:"+err.Error())
+		return
+	}
+
+	if req.RsCalendarId <= 0 {
+		this.FailWithMessage("参数错误", "RsCalendarId<=0")
+		return
+	}
+
+	if req.RsCalendarResearcherId <= 0 {
+		this.FailWithMessage("参数错误", "RsCalendarResearcherId<=0")
+		return
+	}
+
+	if req.ActivityType == "" {
+		this.FailWithMessage("请选择活动类型", "请选择活动类型")
+		return
+	}
+
+	if len(req.ResearcherList) <= 0 {
+		this.FailWithMessage("请选择研究员!", "请选择研究员!")
+		return
+	}
+	researcherMap := make(map[int]string)
+	var checkIsAdd []string
+	for _, v := range req.ResearcherList {
+		if v.ResearcherId <= 0 {
+			this.FailWithMessage("请选择研究员!", "请选择研究员!")
+			return
+		}
+		if v.ResearcherName == "" {
+			this.FailWithMessage("请选择研究员!", "请选择研究员!")
+			return
+		}
+		if v.StartDate == "" {
+			this.FailWithMessage("请选择开始日期!", "请选择开始日期!")
+			return
+		}
+		if v.EndDate == "" {
+			this.FailWithMessage("请选择结束日期!", "请选择结束日期!")
+			return
+		}
+		if v.StartTime == "" {
+			this.FailWithMessage("请选择开始时间!", "请选择开始时间!")
+			return
+		}
+		if v.EndTime == "" {
+			this.FailWithMessage("请选择结束时间!", "请选择结束时间!")
+			return
+		}
+		if v.StartWeek == "" {
+			this.FailWithMessage("请选择周!", "请选择周!")
+			return
+		}
+
+		if v.EndWeek == "" {
+			this.FailWithMessage("请选择周!", "请选择周!")
+			return
+		}
+
+		if realName, ok := researcherMap[v.ResearcherId]; ok {
+			this.FailWithMessage("研究员:" + realName + " 被重复选择", "研究员:" + realName + " 被重复选择")
+			return
+		}
+		researcherMap[v.ResearcherId] = v.ResearcherName
+
+		startDateTime := v.StartDate + " " + v.StartTime
+		endDateTime := v.EndDate + " " + v.EndTime
+
+		startP, _ := time.ParseInLocation(utils.FormatDateTime, startDateTime, time.Local)
+		endP, _ := time.ParseInLocation(utils.FormatDateTime, endDateTime, time.Local)
+
+		if startP.Before(time.Now()) || startP.Equal(time.Now()) {
+			this.FailWithMessage("活动开始时间不能小于当前时间!", "活动开始时间不能小于当前时间!")
+			return
+		}
+
+		if endP.Before(time.Now()) || endP.Equal(time.Now()) {
+			this.FailWithMessage("活动结束时间不能小于当前时间!", "活动结束时间不能小于当前时间!")
+			return
+		}
+
+		if startP.After(endP) || startP.Equal(endP) {
+			this.FailWithMessage("活动开始时间应小于结束时间!", "活动开始时间应小于结束时间!")
+			return
+		}
+
+		/*
+			时间冲突时,提示:xxx时间已被占用
+			当有任意一个研究员时间有冲突时,所有申请订单都不发送。
+		*/
+
+		rsCalendarResearcherItem, err := roadshow.GetRsCalendarResearcherByRsCalendarIdAndResearcherId(req.RsCalendarId, v.ResearcherId)
+		var isAdd bool
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				isAdd = true
+			} else {
+				this.FailWithMessage("获取数据失败!", "获取数据失败!GetRsCalendarResearcherByRsCalendarIdAndResearcherId:" + err.Error())
+				return
+			}
+		}
+		var rsCalendarResearcherId int
+		if rsCalendarResearcherItem == nil {
+			isAdd = true
+		} else {
+			rsCalendarResearcherId = rsCalendarResearcherItem.RsCalendarResearcherId
+		}
+
+		//同步上海数据
+		researcherInfo, err := admin.GetAdminById(v.ResearcherId)
+		if err != nil {
+			this.FailWithMessage("研究员异常!", "研究员异常,Err:" + err.Error())
+			return
+		}
+		_ = rs.SyncCalendarFromShanghai(researcherInfo.Mobile, v.StartDate, v.EndDate)
+
+		//校验事项时间冲突
+		{
+			if isAdd || (rsCalendarResearcherItem != nil && (rsCalendarResearcherItem.StartDate != v.StartDate ||
+				rsCalendarResearcherItem.StartTime != v.StartTime ||
+				rsCalendarResearcherItem.EndDate != v.EndDate ||
+				rsCalendarResearcherItem.EndTime != v.EndTime)) {
+
+				matterCount, err := rs.CheckMatters(startDateTime, endDateTime, v.ResearcherId, 0)
+				if err != nil {
+					this.FailWithMessage("时间冲突检测失败!", "时间冲突检测失败-CheckMattersCount!Err:" + err.Error())
+					return
+				}
+				if matterCount > 0 {
+					checkIsAdd = append(checkIsAdd, v.ResearcherName)
+				}
+			}
+		}
+
+		calendarCount, err := rs.CheckCalendar(startDateTime, endDateTime, "1,2", v.ResearcherId, rsCalendarResearcherId)
+		if err != nil {
+			this.FailWithMessage("时间冲突检测失败!", "时间冲突检测失败-CheckCalendarResearcherCount!Err:" + err.Error())
+			return
+		}
+		if calendarCount > 0 {
+			checkIsAdd = append(checkIsAdd, v.ResearcherName)
+		}
+	}
+
+	if len(checkIsAdd) > 0 {
+		this.FailWithMessage(strings.Join(checkIsAdd, ",") + "时间已被占用!", "时间冲突检测失败-CheckMattersCount!")
+		return
+	}
+
+	rsCalendarItem, err := roadshow.GetRsCalendarById(req.RsCalendarId)
+	if err != nil {
+		this.FailWithMessage("获取数据失败!", "获取数据失败!GetRsCalendarById:" + err.Error())
+		return
+	}
+
+	if rsCalendarItem == nil {
+		this.FailWithMessage("保存失败!","获取数据失败!GetRsCalendarById:" + err.Error())
+		return
+	}
+
+	calendarWhereParams := make(map[string]interface{})
+	calendarUpdateParams := make(map[string]interface{})
+
+	calendarWhereParams["rs_calendar_id"] = req.RsCalendarId
+
+	if req.ActivityType != "" {
+		calendarUpdateParams["activity_type"] = req.ActivityType
+	}
+
+	if req.RoadshowType != "" {
+		calendarUpdateParams["roadshow_type"] = req.RoadshowType
+	}
+
+	if req.RoadshowPlatform != "" {
+		calendarUpdateParams["roadshow_platform"] = req.RoadshowPlatform
+	}
+
+	if req.CompanyId > 0 {
+		calendarUpdateParams["company_id"] = req.CompanyId
+	}
+
+	if req.CompanyName != "" {
+		calendarUpdateParams["company_name"] = req.CompanyName
+	}
+
+	if req.ActivityCategory != "" {
+		calendarUpdateParams["activity_category"] = req.ActivityCategory
+	}
+
+	if req.Theme != "" {
+		calendarUpdateParams["theme"] = req.Theme
+	}
+
+	if req.CooperationName != "" {
+		calendarUpdateParams["cooperation_name"] = req.CooperationName
+	}
+
+	if req.Province != "" {
+		calendarUpdateParams["province"] = req.Province
+	}
+
+	if req.City != "" {
+		calendarUpdateParams["city"] = req.City
+	}
+
+	calendarUpdateParams["modify_time"] = time.Now()
+	calendarUpdateParams["title"] = getTitle(req.ActivityType, req.RoadshowType, req.ActivityCategory, req.RoadshowPlatform, req.Province, req.City)
+	err = roadshow.UpdateRsCalendar(calendarWhereParams, calendarUpdateParams)
+	if err != nil {
+		this.FailWithMessage("保存失败!","保存失败!UpdateRsCalendar:" + err.Error())
+		return
+	}
+	existList, err := roadshow.GetRsCalendarResearcherByCalendarId(req.RsCalendarId)
+	if err != nil {
+		this.FailWithMessage("保存失败!","保存失败!GetRsCalendarResearcherByCalendarId:" + err.Error())
+		return
+	}
+	existResearcherMap := make(map[int]string)
+	for _, ev := range existList {
+		existResearcherMap[ev.ResearcherId] = ev.ResearcherName
+	}
+
+	if rsCalendarItem.ActivityType == "路演" || rsCalendarItem.ActivityType == "公开会议" {
+		// 更新研究员信息
+		//go roadshowService.UpdateSHCalendar(req.RsCalendarId, req.RsCalendarResearcherId, req.ActivityType, req.RoadshowType, req.ActivityCategory, req.RoadshowPlatform, req.Province, req.City, req.ResearcherList)
+
+		for k, v := range req.ResearcherList {
+			rsCalendarResearcherItem, err := roadshow.GetRsCalendarResearcherById(req.RsCalendarResearcherId)
+			if err != nil {
+				this.FailWithMessage("获取数据失败!","获取数据失败!GetRsCalendarResearcherById:" + err.Error())
+				return
+			}
+
+			calendarResearcherWhereParams := make(map[string]interface{})
+			calendarResearcherUpdateParams := make(map[string]interface{})
+
+			calendarResearcherWhereParams["rs_calendar_researcher_id"] = req.RsCalendarResearcherId
+
+			calendarResearcherUpdateParams["researcher_id"] = v.ResearcherId
+			calendarResearcherUpdateParams["researcher_name"] = v.ResearcherName
+
+			if rsCalendarResearcherItem.Status == 3 || rsCalendarResearcherItem.Status == 5 {
+				calendarResearcherUpdateParams["status"] = 1
+			}
+			calendarResearcherUpdateParams["start_date"] = v.StartDate
+			calendarResearcherUpdateParams["end_date"] = v.EndDate
+			calendarResearcherUpdateParams["start_time"] = v.StartTime
+			calendarResearcherUpdateParams["end_time"] = v.EndTime
+			calendarResearcherUpdateParams["start_week"] = v.StartWeek
+			calendarResearcherUpdateParams["end_week"] = v.EndWeek
+			calendarResearcherUpdateParams["refuse_reason"] = ""
+			calendarResearcherUpdateParams["refuse_time"] = nil
+			calendarResearcherUpdateParams["delete_reason"] = ""
+			calendarResearcherUpdateParams["approve_time"] = nil
+			calendarResearcherUpdateParams["researcher_sort"] = k + 1
+			calendarResearcherUpdateParams["modify_time"] = time.Now()
+			calendarResearcherUpdateParams["create_time"] = time.Now()
+
+			err = roadshow.UpdateCalendarResearcher(calendarResearcherWhereParams, calendarResearcherUpdateParams)
+			if err != nil {
+				this.FailWithMessage("保存失败!","保存失败!UpdateCalendarResearcher:" + err.Error())
+				return
+			}
+			//上海新增(因为在驳回的时候,就把上海该时间段的日程给删除了,所以修改的时候,需要重新调用新增接口)
+			calendar := roadshow.RsCalendar{
+				RsCalendarId: req.RsCalendarId,
+				SysUserId:    sysUser.AdminId,
+				Title:        getTitle(req.ActivityType, req.RoadshowType, req.ActivityCategory, req.RoadshowPlatform, req.Province, req.City),
+			}
+			researcher := *rsCalendarResearcherItem
+			researcher.StartDate = v.StartDate
+			researcher.EndDate = v.EndDate
+			researcher.StartTime = v.StartTime
+			researcher.EndTime = v.EndTime
+			researcher.StartWeek = v.StartWeek
+			researcher.EndWeek = v.EndWeek
+			go rs.CalendarToSH(calendar, researcher)
+
+			if req.EditType == 2 {
+				//模板消息通知
+				go func() {
+					sysAdmin, _ := admin.GetAdminById(v.ResearcherId)
+					if sysAdmin != nil && req.ActivityType != "内部会议" && req.ActivityType != "报告电话会" {
+						first := "您收到一个新的【" + req.ActivityType + "】申请,请及时处理"
+						keyword1 := sysUser.RealName
+						keyword2 := "--"
+						keyword3 := time.Now().Format(utils.FormatDateTime)
+						startDateSub := v.StartDate[5:]
+						startDateSub = strings.Replace(startDateSub, "-", ".", -1)
+						var keyword4 string
+						if req.ActivityType == "路演" {
+							keyword4 = startDateSub + "(" + v.StartWeek + ")" + " " + v.StartTime[:5] + "~" + v.EndTime[:5] + " ," + req.CompanyName + "(" + req.RoadshowType + req.ActivityType + ")"
+						} else {
+							keyword4 = startDateSub + "(" + v.StartWeek + ")" + " " + v.StartTime[:5] + "~" + v.EndTime[:5] + " ," + req.Theme + "(" + req.RoadshowType + req.ActivityType + ")"
+						}
+						remark := "请尽快完成审批"
+						wxAppPath := "pages-approve/activity/detail?RsCalendarId=" + strconv.Itoa(req.RsCalendarId) + "&RsCalendarResearcherId=" + strconv.Itoa(rsCalendarResearcherItem.RsCalendarResearcherId)
+						openIdList, _ := models.GetAdminOpenIdByMobile(sysAdmin.Mobile)
+						if len(openIdList) > 0 {
+							services.SendWxMsgWithRoadshowPending(first, keyword1, keyword2, keyword3, keyword4, remark, wxAppPath, sysAdmin.Mobile)
+						}
+					}
+				}()
+			}
+		}
+	} else {
+		//先获取到所有的研究员日历表id
+		researchers, err := roadshow.GetRsCalendarResearcherByCalendarId(req.RsCalendarId)
+		if err != nil {
+			utils.FileLog.Info("GetRsCalendarResearcherByCalendarId err: ", err)
+			fmt.Println(err)
+			this.FailWithMessage("保存失败!","获取数据失败,GetRsCalendarResearcherByCalendarId:" + err.Error())
+			return
+		}
+		//先删后增
+		err = roadshow.DeleteRsCalendarResearcher(req.RsCalendarId)
+		if err != nil {
+			this.FailWithMessage("保存失败!","保存失败!DeleteRsCalendarResearcher:" + err.Error())
+			return
+		}
+
+		//删除上海
+		for _, researcher := range researchers {
+			rs.DeleteSHCalendar(researcher.RsCalendarResearcherId)
+		}
+		for k, v := range req.ResearcherList {
+			researcher := new(roadshow.RsCalendarResearcher)
+			researcher.RsCalendarId = req.RsCalendarId
+			researcher.ResearcherId = v.ResearcherId
+			researcher.ResearcherName = v.ResearcherName
+			researcher.StartDate = v.StartDate
+			researcher.EndDate = v.EndDate
+			researcher.StartTime = v.StartTime
+			researcher.EndTime = v.EndTime
+			researcher.StartWeek = v.StartWeek
+			researcher.EndWeek = v.EndWeek
+			researcher.CreateTime = time.Now()
+			researcher.ModifyTime = time.Now()
+			researcher.ResearcherSort = k + 1
+			if req.ActivityType == "路演" || req.ActivityType == "公开会议" {
+				researcher.Status = 1
+			} else {
+				researcher.Status = 2
+			}
+			rsCalendarResearcherId, err := roadshow.AddRsCalendarResearcher(researcher)
+			if err != nil {
+				this.FailWithMessage("保存失败!","保存日历活动-研究员信息失败!Err:" + err.Error())
+				return
+			}
+
+			//上海新增
+			calendar := roadshow.RsCalendar{
+				RsCalendarId: req.RsCalendarId,
+				SysUserId:    sysUser.AdminId,
+				Title:        getTitle(req.ActivityType, req.RoadshowType, req.ActivityCategory, req.RoadshowPlatform, req.Province, req.City),
+			}
+			researcher.RsCalendarResearcherId = int(rsCalendarResearcherId)
+			go rs.CalendarToSH(calendar, *researcher)
+
+			go func() {
+				sysAdmin, _ := admin.GetAdminById(v.ResearcherId)
+				if sysAdmin != nil && req.ActivityType != "内部会议" && req.ActivityType != "报告电话会" {
+					first := "您收到一个新的【" + req.ActivityType + "】申请,请及时处理"
+					keyword1 := sysUser.RealName
+					keyword2 := "--"
+					keyword3 := time.Now().Format(utils.FormatDateTime)
+					startDateSub := v.StartDate[5:]
+					startDateSub = strings.Replace(startDateSub, "-", ".", -1)
+					var keyword4 string
+					if req.ActivityType == "路演" {
+						keyword4 = startDateSub + "(" + v.StartWeek + ")" + " " + v.StartTime[:5] + "~" + v.EndTime[:5] + " ," + req.CompanyName + "(" + req.RoadshowType + req.ActivityType + ")"
+					} else {
+						keyword4 = startDateSub + "(" + v.StartWeek + ")" + " " + v.StartTime[:5] + "~" + v.EndTime[:5] + " ," + req.Theme + "(" + req.RoadshowType + req.ActivityType + ")"
+					}
+					remark := "请尽快完成审批"
+					wxAppPath := "pages-approve/activity/detail?RsCalendarId=" + strconv.Itoa(req.RsCalendarId) + "&RsCalendarResearcherId=" + strconv.Itoa(int(rsCalendarResearcherId))
+					openIdList, _ := models.GetAdminOpenIdByMobile(sysAdmin.Mobile)
+					if len(openIdList) > 0 {
+						services.SendWxMsgWithRoadshowPending(first, keyword1, keyword2, keyword3, keyword4, remark, wxAppPath, sysAdmin.Mobile)
+					}
+				}
+
+			}()
+		}
+	}
+	this.OkDetailed(nil, "保存成功")
+}
+
+// ResearcherList
+// @Title 研究员列表
+// @Description 研究员列表接口
+// @Success 200 {object} rs.ResearcherGroup
+// @router /researcher/list [get]
+func (this *CalendarController) ResearcherList() {
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+	group, err := roadshow.GetResearcherGroup()
+	if err != nil {
+		this.FailWithMessage("获取信息失败!", "获取分组信息失败!Err:"+err.Error())
+		return
+	}
+	researcherList, err := roadshow.GetResearcher()
+	groupMap := make(map[int][]*roadshow.Researcher)
+	for _, v := range researcherList {
+		if v.RoleTypeCode == "ficc_admin" {
+			findItems := groupMap[1]
+			findItems = append(findItems, v)
+			groupMap[1] = findItems
+		} else {
+			if findItems, ok := groupMap[v.GroupId]; ok {
+				findItems = append(findItems, v)
+				groupMap[v.GroupId] = findItems
+			} else {
+				findItems = append(findItems, v)
+				groupMap[v.GroupId] = findItems
+			}
+		}
+	}
+	for _, v := range group {
+		v.ResearcherList = groupMap[v.GroupId]
+	}
+	this.OkDetailed(group, "获取成功")
+}
+
+// @Title 撤回路演活动接口
+// @Description 撤回路演活动接口
+// @Param	request	body rs.AcceptReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /back [post]
+func (this *CalendarController) Back() {
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+
+	var req roadshow.AcceptReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		this.FailWithMessage("参数解析异常", "参数解析失败,Err:"+err.Error())
+		return
+	}
+
+	if req.RsCalendarId <= 0 || req.RsCalendarResearcherId <= 0 {
+		this.FailWithMessage("参数错误", "参数错误!RsCalendarId:"+strconv.Itoa(req.RsCalendarId)+";RsCalendarResearcherId:"+strconv.Itoa(req.RsCalendarResearcherId))
+		return
+	}
+	_, err = roadshow.GetRsCalendarById(req.RsCalendarId)
+	if err != nil {
+		this.FailWithMessage("获取数据失败", "获取数据失败!GetRsCalendarById:"+err.Error())
+		return
+	}
+	rsCalendarResearcher, err := roadshow.GetRsCalendarResearcherById(req.RsCalendarResearcherId)
+	if err != nil {
+		this.FailWithMessage("获取数据失败", "获取数据失败!GetRsCalendarResearcherById:"+err.Error())
+		return
+	}
+
+	if rsCalendarResearcher.Status == 2 {
+		this.FailWithMessage("已接受,不可进行撤回操作!", "已接受,不可进行撤回操作!")
+		return
+	} else if rsCalendarResearcher.Status == 3 {
+		this.FailWithMessage("已拒绝,不可进行撤回操作!", "已拒绝,不可进行撤回操作!")
+		return
+	} else if rsCalendarResearcher.Status == 4 {
+		this.FailWithMessage("已删除,不可进行撤回操作!", "已删除,不可进行撤回操作!")
+		return
+	} else if rsCalendarResearcher.Status == 5 {
+		this.FailWithMessage("已撤回,不可进行重复操作!", "已撤回,不可进行重复操作!")
+		return
+	}
+
+	whereParams := make(map[string]interface{})
+	updateParams := make(map[string]interface{})
+
+	whereParams["rs_calendar_researcher_id"] = req.RsCalendarResearcherId
+	whereParams["rs_calendar_id"] = req.RsCalendarId
+
+	updateParams["status"] = 5
+	updateParams["modify_time"] = time.Now()
+
+	err = roadshow.UpdateCalendarResearcher(whereParams, updateParams)
+
+	//撤回后,需要删除该日程
+	go rs.DeleteSHCalendar(req.RsCalendarResearcherId)
+
+	if err != nil {
+		this.FailWithMessage("保存失败", "保存失败!UpdateCalendarResearcher:"+err.Error())
+		return
+	}
+	this.OkDetailed(nil, "撤回成功")
+}
+
+// @Title 删除路演活动接口
+// @Description 删除路演活动接口
+// @Param	request	body rs.DeleteReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /delete [post]
+func (this *CalendarController) Delete() {
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+
+	var req roadshow.DeleteReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		this.FailWithMessage("参数解析异常!", "参数解析失败,Err:" + err.Error())
+		return
+	}
+
+	if req.RsCalendarId <= 0 || req.RsCalendarResearcherId <= 0 {
+		this.FailWithMessage("参数错误!", "参数错误!RsCalendarId:" + strconv.Itoa(req.RsCalendarId) + ";RsCalendarResearcherId:" + strconv.Itoa(req.RsCalendarResearcherId))
+		return
+	}
+	rsCalendarItem, err := roadshow.GetRsCalendarById(req.RsCalendarId)
+	if err != nil {
+		this.FailWithMessage("获取数据失败!", "获取数据失败!GetRsCalendarById:" + err.Error())
+		return
+	}
+
+	rsCalendarResearcherItem, err := roadshow.GetRsCalendarResearcherById(req.RsCalendarResearcherId)
+	if err != nil {
+		this.FailWithMessage("获取数据失败!", "获取数据失败!GetRsCalendarResearcherById:" + err.Error())
+		return
+	}
+
+	if rsCalendarItem.ActivityType == "报告电话会" || rsCalendarItem.ActivityType == "内部会议" {
+		err = roadshow.DeleteCalendar(req.RsCalendarId, req.RsCalendarResearcherId)
+		if err != nil {
+			this.FailWithMessage("删除失败!", "删除失败!DeleteCalendar:" + err.Error())
+			return
+		}
+	} else {
+		if req.DeleteReason=="" {
+			this.FailWithMessage("删除失败,请输入删除理由!", "删除失败!请输入删除理由")
+			return
+		}
+		whereParams := make(map[string]interface{})
+		updateParams := make(map[string]interface{})
+
+		whereParams["rs_calendar_researcher_id"] = req.RsCalendarResearcherId
+		whereParams["rs_calendar_id"] = req.RsCalendarId
+
+		updateParams["status"] = 4
+		updateParams["delete_reason"] = req.DeleteReason
+		updateParams["modify_time"] = time.Now()
+		updateParams["delete_time"] = time.Now()
+
+		err = roadshow.UpdateCalendarResearcher(whereParams, updateParams)
+		if err != nil {
+			this.FailWithMessage("删除失败!", "删除失败!UpdateCalendarResearcher:" + err.Error())
+			return
+		}
+	}
+	//`status` int(11) DEFAULT '0' COMMENT '1:待接受,2:已接受,3:已拒绝,4:已删除,5:已撤回,6:已结束',
+	//待接受、已接受的情况,需要同步删除上海那边的日程
+	if rsCalendarResearcherItem.Status == 1 || rsCalendarResearcherItem.Status == 2 {
+		go rs.DeleteSHCalendar(rsCalendarResearcherItem.RsCalendarResearcherId)
+	}
+	//模板消息通知
+	{
+		go func() {
+			if rsCalendarItem != nil && rsCalendarResearcherItem != nil {
+				sysAdmin, _ := admin.GetAdminById(rsCalendarResearcherItem.ResearcherId)
+				if sysAdmin != nil && sysAdmin.Mobile != "" {
+					first := "【" + sysUser.RealName + "】删除了你的【路演】安排"
+					var keyword1 string
+					if rsCalendarItem.ActivityType == "路演" {
+						keyword1 = rsCalendarItem.CompanyName + "," + rsCalendarItem.RoadshowType + rsCalendarItem.ActivityType
+					} else {
+						keyword1 = rsCalendarItem.Theme + "," + rsCalendarItem.RoadshowType + rsCalendarItem.ActivityType
+					}
+					keyword2 := "已删除"
+					remark := req.DeleteReason
+					wxAppPath := "pages-approve/activity/detail?RsCalendarId=" + strconv.Itoa(rsCalendarItem.RsCalendarId) + "&RsCalendarResearcherId=" + strconv.Itoa(rsCalendarResearcherItem.RsCalendarResearcherId)
+					go services.SendWxMsgWithRoadshowDeleteNotice(first, keyword1, keyword2, remark, wxAppPath, sysAdmin.Mobile)
+				}
+			}
+		}()
+	}
+	this.OkDetailed(nil, "删除成功")
+}
+
+// ResearcherList
+// @Title 获取报告电话会类型
+// @Description 获取报告电话会类型接口
+// @Success 200 {object} rs.ResearcherGroup
+// @router /activity/type/list [get]
+func (this *CalendarController) ActivityTypeList() {
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+	// 获取所有的分类
+
+	list, err := rs.GetAllActivityType()
+	if err != nil {
+		this.FailWithMessage("获取活动类型列表失败", "获取活动类型列表失败,Err:"+err.Error())
+		return
+	}
+	this.OkDetailed(list, "获取成功")
+}
+
+// @Title 路演-研究员日历详情
+// @Description 路演-研究员日历详情接口
+// @Param   StartDate   query   string  true       "开始日期"
+// @Param   EndDate   query   string  true       "结束日期日期"
+// @Param   ResearcherId   query   int  true       "研究员id"
+// @Success 200 {object} roadshow.CalendarDetailResp
+// @router /researcher/calendar/detail [get]
+func (this *CalendarController) ResearcherCalendarDetail() {
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	researcherId, _ := this.GetInt("ResearcherId")
+	if startDate == "" || endDate == "" {
+		this.FailWithMessage("参数错误!", "参数错误 StartDate"+startDate+" EndDate:"+endDate)
+		return
+	}
+	var condition string
+	var pars []interface{}
+
+	if researcherId <= 0 {
+		calendarList := make([]*roadshow.CalendarListView, 0)
+		matterList := make([]*roadshow.RsMatters, 0)
+		resp := new(roadshow.CalendarPanelDetailResp)
+		resp.CalendarList = calendarList
+		resp.RsMattersList = matterList
+		this.OkDetailed(resp, "删除成功")
+		return
+	} else {
+		condition += ` AND b.researcher_id =? `
+		pars = append(pars, researcherId)
+	}
+
+	//同步上海数据
+	researcherInfo, err := admin.GetAdminById(researcherId)
+	if err != nil {
+		this.FailWithMessage("研究员异常!", "研究员异常"+err.Error())
+		return
+	}
+	_ = rs.SyncCalendarFromShanghai(researcherInfo.Mobile, startDate, endDate)
+
+	condition += ` AND b.start_date>=?`
+	pars = append(pars, startDate)
+	condition += ` AND b.end_date<=?`
+	pars = append(pars, endDate)
+
+	condition += ` AND b.status IN(2) `
+	//pars = append(pars, 2)
+
+	calendarList, err := roadshow.GetCalendarDetailList(condition, pars)
+	if err != nil {
+		this.FailWithMessage("获取数据失败!", "获取数据失败,GetCalendarDetailList Err:" + err.Error())
+		return
+	}
+
+	matterList, err := roadshow.GetRsMattersList(startDate, endDate, researcherId)
+	if err != nil {
+		this.FailWithMessage("获取数据失败!","获取数据失败,GetRsMattersList Err:" + err.Error())
+		return
+	}
+
+	if calendarList == nil {
+		calendarList = make([]*roadshow.CalendarListView, 0)
+	}
+
+	if matterList == nil {
+		matterList = make([]*roadshow.RsMatters, 0)
+	}
+
+	resp := new(roadshow.CalendarPanelDetailResp)
+	resp.CalendarList = calendarList
+	resp.RsMattersList = matterList
+	this.OkDetailed(resp, "删除成功")
+}
+
+// @Title 路演-我的日历详情
+// @Description 路演-我的日历详情接口
+// @Param   StartDate   query   string  true       "开始日期"
+// @Param   EndDate   query   string  true       "结束日期日期"
+// @Success 200 {object} roadshow.CalendarDetailResp
+// @router /my/calendar/detail [get]
+func (this *CalendarController) MyCalendarDetail() {
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	if startDate == "" || endDate == "" {
+		this.FailWithMessage("参数错误!","参数错误 StartDate:"+startDate+" EndDate:"+endDate)
+		return
+	}
+	var condition string
+	var pars []interface{}
+
+	roleTypeCode := sysUser.RoleTypeCode
+	//销售
+	if roleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+		condition += ` AND a.sys_user_id=?`
+		pars = append(pars, sysUser.AdminId)
+
+		condition += ` AND a.activity_type IN('路演','公开会议') `
+	}
+
+	//研究员
+	if roleTypeCode == utils.ROLE_TYPE_CODE_FICC_RESEARCHR ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_RESEARCHR ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_RESEARCHR ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER {
+		condition += ` AND b.researcher_id=?`
+		pars = append(pars, sysUser.AdminId)
+	}
+
+	//中级/普通/admin 管理员
+	if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
+		condition += ` AND a.sys_user_id=?`
+		pars = append(pars, sysUser.AdminId)
+	}
+
+	condition += ` AND b.start_date>=?`
+	pars = append(pars, startDate)
+	condition += ` AND b.end_date<=?`
+	pars = append(pars, endDate)
+
+	condition += ` AND b.status IN(2) `
+	//pars = append(pars, 2)
+
+	calendarList, err := roadshow.GetCalendarDetailList(condition, pars)
+	if err != nil {
+		this.FailWithMessage("获取数据失败!","获取数据失败,GetCalendarDetailList Err:" + err.Error())
+		return
+	}
+
+	matterList, err := roadshow.GetRsMattersList(startDate, endDate, sysUser.AdminId)
+	if err != nil {
+		this.FailWithMessage("获取数据失败!","获取数据失败,GetRsMattersList Err:" + err.Error())
+		return
+	}
+
+	resp := new(roadshow.CalendarPanelDetailResp)
+	resp.CalendarList = calendarList
+	resp.RsMattersList = matterList
+	this.OkDetailed(resp, "删除成功")
+}

+ 89 - 0
controllers/roadshow/company.go

@@ -0,0 +1,89 @@
+package roadshow
+
+import (
+	"hongze/hongze_mobile_admin/models/roadshow"
+	"hongze/hongze_mobile_admin/services"
+	"hongze/hongze_mobile_admin/utils"
+	"strconv"
+	"strings"
+)
+
+// @Title 我的日历列表
+// @Description 我的日历列表接口
+// @Param   KeyWord   query   string  true       "搜索关键词"
+// @Success 200 {object} rs.CalendarListResp
+// @router /company/search [get]
+func (this *CalendarController) CompanySearch() {
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+
+	KeyWord := this.GetString("KeyWord")
+	if KeyWord == "" {
+		this.FailWithMessage("请输入搜索词!", "请输入搜索词!")
+		return
+	}
+	list, err := roadshow.CompanySearch(sysUser.AdminId, KeyWord)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		this.FailWithMessage("搜索客户失败!", "搜索客户失败!Err:"+err.Error())
+		return
+	}
+	if list == nil {
+		list = make([]*roadshow.CompanySearchView, 0)
+	}
+	this.OkDetailed(list, "获取成功")
+}
+
+// @Title 我的日历列表
+// @Description 我的日历列表接口
+// @Param   CompanyId   query   int  true       "公司id"
+// @Success 200 {object} rs.CompanyDetailView
+// @router /company/detail [get]
+func (this *CalendarController) CompanyDetail() {
+	sysUser := this.AdminWx
+	if sysUser == nil {
+		this.FailWithMessage("请登录", "请登录,SysUser Is Empty")
+		return
+	}
+	companyId, _ := this.GetInt("CompanyId")
+	if companyId <= 0 {
+		this.FailWithMessage("参数错误!", "参数错误!")
+		return
+	}
+	companyProductItem, err := roadshow.GetCompanyProductByCompanyIdAndProductId(companyId, 1)
+	if err != nil {
+		this.FailWithMessage("搜索客户失败!",  "搜索客户失败!Err:" + err.Error())
+		return
+	}
+	permissionList, err := roadshow.GetCompanyProductReportPermissionList(companyId, 1)
+	if err != nil {
+		this.FailWithMessage("搜索客户权限失败!",  "搜索客户权限失败!Err:" + err.Error())
+		return
+	}
+	var permissionArr []string
+	for _, v := range permissionList {
+		permissionArr = append(permissionArr, v.PermissionName)
+	}
+	readMap, err := services.GetFiccCountUserViewHistoryByCompanyIds(strconv.Itoa(companyId))
+	if err != nil {
+		this.FailWithMessage("获取阅读次数失败!",  "获取阅读次数失败!Err:" + err.Error())
+		return
+	}
+
+	readNum, ok := readMap[companyId]
+	if !ok {
+		readNum = 0
+	}
+
+	detailView := new(roadshow.CompanyDetailView)
+	detailView.CompanyId = companyProductItem.CompanyId
+	detailView.CompanyName = companyProductItem.CompanyName
+	detailView.Status = companyProductItem.Status
+	detailView.IndustryId = companyProductItem.IndustryId
+	detailView.IndustryName = companyProductItem.IndustryName
+	detailView.PermissionName = strings.Join(permissionArr, "/")
+	detailView.ReportReadTotal = readNum //ficc报告-累计阅读次数
+	this.OkDetailed(detailView, "获取成功")
+}

+ 0 - 36
go.mod

@@ -1,36 +0,0 @@
-module hongze/hongze_mobile_admin
-
-go 1.15
-
-require (
-	baliance.com/gooxml v1.0.1
-	github.com/SebastiaanKlippert/go-wkhtmltopdf v1.7.1
-	github.com/aliyun/aliyun-oss-go-sdk v2.1.9+incompatible
-	github.com/astaxie/beego v1.12.3 // indirect
-	github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect
-	github.com/beego/bee/v2 v2.0.2 // indirect
-	github.com/beego/beego/v2 v2.0.1
-	github.com/flosch/pongo2 v0.0.0-20200913210552-0d938eb266f3 // indirect
-	github.com/go-delve/delve v1.7.0 // indirect
-	github.com/go-sql-driver/mysql v1.6.0
-	github.com/mattn/go-colorable v0.1.8 // indirect
-	github.com/mattn/go-isatty v0.0.13 // indirect
-	github.com/mattn/go-runewidth v0.0.13 // indirect
-	github.com/medivhzhan/weapp/v2 v2.4.2
-	github.com/peterh/liner v1.2.1 // indirect
-	github.com/rdlucklib/rdluck_tools v1.0.2
-	github.com/satori/go.uuid v1.2.0 // indirect
-	github.com/shopspring/decimal v1.2.0
-	github.com/sirupsen/logrus v1.8.1 // indirect
-	github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect
-	github.com/smartystreets/goconvey v1.6.4
-	github.com/spf13/cast v1.4.0 // indirect
-	github.com/spf13/viper v1.8.1 // indirect
-	go.starlark.net v0.0.0-20210602144842-1cdb82c9e17a // indirect
-	golang.org/x/arch v0.0.0-20210727222714-28578f966459 // indirect
-	golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect
-	golang.org/x/text v0.3.6 // indirect
-	golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
-	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
-	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
-)

+ 0 - 1081
go.sum

@@ -1,1081 +0,0 @@
-baliance.com/gooxml v1.0.1 h1:fG5lmxmjEVFfbKQ2NuyCuU3hMuuOb5avh5a38SZNO1o=
-baliance.com/gooxml v1.0.1/go.mod h1:+gpUgmkAF4zCtwOFPNRLDAvpVRWoKs5EeQTSv/HYFnw=
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
-cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
-cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
-cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
-cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
-cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
-cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
-cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
-cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
-cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
-cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
-cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
-cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
-cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
-cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
-cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
-cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
-cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
-cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
-cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
-cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
-cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
-cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
-cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
-cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
-cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
-cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
-cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
-cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
-cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
-cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
-cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
-cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
-cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
-cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
-cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
-github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
-github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/SebastiaanKlippert/go-wkhtmltopdf v1.7.1 h1:U3c/t0AA0x1vx8aDIWAOBtqU000m5wSV7l6xBovk9P0=
-github.com/SebastiaanKlippert/go-wkhtmltopdf v1.7.1/go.mod h1:Yowiac2wF/l7oRlRrB12z11V7kYfUumM4dsacKNAfNo=
-github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
-github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
-github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
-github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
-github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
-github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
-github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk=
-github.com/aliyun/aliyun-oss-go-sdk v2.1.9+incompatible h1:mO8fA9l5cQ7r0D2v3WribTT1GGbNVtnVviKM51jH6lI=
-github.com/aliyun/aliyun-oss-go-sdk v2.1.9+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
-github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
-github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
-github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
-github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
-github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
-github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
-github.com/astaxie/beego v1.12.3 h1:SAQkdD2ePye+v8Gn1r4X6IKZM1wd28EyUOVQ3PDSOOQ=
-github.com/astaxie/beego v1.12.3/go.mod h1:p3qIm0Ryx7zeBHLljmd7omloyca1s4yu1a8kM1FkpIA=
-github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
-github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
-github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
-github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA=
-github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
-github.com/beego/bee v1.12.3 h1:9gCJRAhSWtUasJsX4p3BXH9QQf7MS09PdYP3xE6iD5Q=
-github.com/beego/bee/v2 v2.0.2 h1:xWARyIqdnnbNMDBDUdb6Gvr9S/yGXC6Ni43kKdS1/eg=
-github.com/beego/bee/v2 v2.0.2/go.mod h1:rfZa899qLAF8SYBRvE7mWNPZTU7/qysOBhaCLmZrMX4=
-github.com/beego/beego/v2 v2.0.1 h1:07a7Z0Ok5vbqyqh+q53sDPl9LdhKh0ZDy3gbyGrhFnE=
-github.com/beego/beego/v2 v2.0.1/go.mod h1:8zyHi1FnWO1mZLwTn62aKRIZF/aIKvkCBB2JYs+eqQI=
-github.com/beego/beego/v2 v2.0.2-0.20210724131843-a91aa0e96680 h1:mcyuTDD9Rg2AEanaDuS1TkEtAYGbVXb8mK+9NkIpj0g=
-github.com/beego/beego/v2 v2.0.2-0.20210724131843-a91aa0e96680/go.mod h1:K8GEOgUtJREYLt836aDjD6D7ymfHhKmvMcxf1aKWfAk=
-github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ=
-github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU=
-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
-github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
-github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
-github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
-github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
-github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
-github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
-github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
-github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA=
-github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE=
-github.com/casbin/casbin v1.9.1/go.mod h1:z8uPsfBJGUsnkagrt3G8QvjgTKFMBJ32UP8HpZllfog=
-github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
-github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
-github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
-github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
-github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
-github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
-github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
-github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
-github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
-github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
-github.com/coreos/etcd v3.3.25+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
-github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
-github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
-github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
-github.com/cosiner/argv v0.1.0 h1:BVDiEL32lwHukgJKP87btEPenzrrHUjajs/8yzaqcXg=
-github.com/cosiner/argv v0.1.0/go.mod h1:EusR6TucWKX+zFgtdUsKT2Cvg45K5rtpCcWz4hK06d8=
-github.com/couchbase/go-couchbase v0.0.0-20200519150804-63f3cdb75e0d/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U=
-github.com/couchbase/go-couchbase v0.1.0/go.mod h1:+/bddYDxXsf9qt0xpDUtRR47A2GjaXmGGAqQ/k3GJ8A=
-github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=
-github.com/couchbase/gomemcached v0.1.3/go.mod h1:mxliKQxOv84gQ0bJWbI+w9Wxdpt9HjDvgW9MjCym5Vo=
-github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=
-github.com/couchbase/goutils v0.1.0/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=
-github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
-github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY=
-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
-github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
-github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
-github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
-github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
-github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
-github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
-github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
-github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI=
-github.com/elastic/go-elasticsearch/v6 v6.8.10/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI=
-github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk=
-github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
-github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
-github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
-github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
-github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA=
-github.com/flosch/pongo2 v0.0.0-20200529170236-5abacdfa4915 h1:rNVrewdFbSujcoKZifC6cHJfqCTbCIR7XTLHW5TqUWU=
-github.com/flosch/pongo2 v0.0.0-20200529170236-5abacdfa4915/go.mod h1:fB4mx6dzqFinCxIf3a7Mf5yLk+18Bia9mPAnuejcvDA=
-github.com/flosch/pongo2 v0.0.0-20200913210552-0d938eb266f3 h1:fmFk0Wt3bBxxwZnu48jqMdaOR/IZ4vdtJFuaFV8MpIE=
-github.com/flosch/pongo2 v0.0.0-20200913210552-0d938eb266f3/go.mod h1:bJWSKrZyQvfTnb2OudyUjurSG4/edverV7n82+K3JiM=
-github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
-github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
-github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
-github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/garyburd/redigo v1.6.3 h1:HCeeRluvAgMusMomi1+6Y5dmFOdYV/JzoRrrbFlkGIc=
-github.com/garyburd/redigo v1.6.3/go.mod h1:rTb6epsqigu3kYKBnaF028A7Tf/Aw5s0cqA47doKKqw=
-github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw=
-github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
-github.com/go-delve/delve v1.5.0 h1:gQsRvFdR0BGk19NROQZsAv6iG4w5QIZoJlxJeEUBb0c=
-github.com/go-delve/delve v1.5.0/go.mod h1:c6b3a1Gry6x8a4LGCe/CWzrocrfaHvkUxCj3k4bvSUQ=
-github.com/go-delve/delve v1.7.0 h1:MaWAD3LtvjE/LL98urSHPjaMT+OubpQ2sqF3R2Uj1rc=
-github.com/go-delve/delve v1.7.0/go.mod h1:2DpgGoHOW7r7MXyykmT7axp9IEEIc8EV/swa5m8rkbo=
-github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
-github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
-github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
-github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
-github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
-github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
-github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
-github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
-github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
-github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
-github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
-github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
-github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
-github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
-github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
-github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
-github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
-github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
-github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
-github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
-github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
-github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
-github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
-github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
-github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
-github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
-github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
-github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-dap v0.2.0/go.mod h1:5q8aYQFnHOAZEMP+6vmq25HKYAEwE+LF5yh7JKrrhSQ=
-github.com/google/go-dap v0.5.0/go.mod h1:5q8aYQFnHOAZEMP+6vmq25HKYAEwE+LF5yh7JKrrhSQ=
-github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
-github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
-github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
-github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
-github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
-github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
-github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
-github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
-github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
-github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
-github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
-github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
-github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
-github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
-github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
-github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
-github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
-github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
-github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
-github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
-github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
-github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
-github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
-github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
-github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
-github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
-github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
-github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
-github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
-github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
-github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
-github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
-github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
-github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
-github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
-github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
-github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
-github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
-github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
-github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
-github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
-github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
-github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
-github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
-github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
-github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
-github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
-github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
-github.com/juju/errors v0.0.0-20190930114154-d42613fe1ab9/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
-github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U=
-github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA=
-github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
-github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
-github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
-github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
-github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
-github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
-github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
-github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6/go.mod h1:n931TsDuKuq+uX4v1fulaMbA/7ZLLhjc85h7chZGBCQ=
-github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
-github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-github.com/lib/pq v1.7.0 h1:h93mCPfUSkaul3Ka/VG8uZdmW1uMHDGxzu0NWHuJmHY=
-github.com/lib/pq v1.7.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
-github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8=
-github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
-github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk=
-github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
-github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
-github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
-github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
-github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
-github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
-github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
-github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
-github.com/mattn/go-colorable v0.0.0-20170327083344-ded68f7a9561/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
-github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4=
-github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
-github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
-github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
-github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI=
-github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA=
-github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
-github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4=
-github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
-github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
-github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
-github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
-github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
-github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
-github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
-github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
-github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
-github.com/medivhzhan/weapp/v2 v2.4.2 h1:A0Sdjs9Yhpreh+KIZfV2w+R9iB0hCsZ45SwSPqlTD+0=
-github.com/medivhzhan/weapp/v2 v2.4.2/go.mod h1:lcP2Go0ow4ElqGsEQwEeyTZiiEhr+lC5zMxGZGA7Bsc=
-github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
-github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
-github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
-github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
-github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
-github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8=
-github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
-github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
-github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
-github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
-github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
-github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
-github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
-github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
-github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
-github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
-github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
-github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
-github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
-github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
-github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
-github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
-github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
-github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
-github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
-github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
-github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
-github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
-github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
-github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
-github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
-github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
-github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM=
-github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
-github.com/pelletier/go-toml v1.9.2/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
-github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ=
-github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
-github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
-github.com/peterh/liner v0.0.0-20170317030525-88609521dc4b/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
-github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233 h1:jmJndGFBPjNWW+MAYarU/Nl8QrQVzbw4B/AYE0LzETo=
-github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
-github.com/peterh/liner v1.2.1 h1:O4BlKaq/LWu6VRWmol4ByWfzx6MfXc5Op5HETyIy5yg=
-github.com/peterh/liner v1.2.1/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0=
-github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
-github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
-github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
-github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
-github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
-github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
-github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
-github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
-github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
-github.com/prometheus/client_golang v1.7.0 h1:wCi7urQOGBsYcQROHqpUUX4ct84xp40t9R9JX0FuA/U=
-github.com/prometheus/client_golang v1.7.0/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
-github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
-github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ=
-github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
-github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
-github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
-github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc=
-github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
-github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ=
-github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
-github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
-github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
-github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
-github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=
-github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
-github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
-github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
-github.com/rdlucklib/rdluck_tools v1.0.2 h1:Xf1khfttpAh4D1jtMVE5OxLXhFUaDnvG74vZH7FSZQY=
-github.com/rdlucklib/rdluck_tools v1.0.2/go.mod h1:9Onw9o4w19C8KE5lxb8GyxgRBbZweRVkQSc79v38EaA=
-github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
-github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
-github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
-github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
-github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
-github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
-github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
-github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
-github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
-github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
-github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo=
-github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
-github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 h1:DAYUYH5869yV94zvCES9F51oYtN5oGlwjxJJz7ZCnik=
-github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
-github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
-github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
-github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
-github.com/siddontang/go v0.0.0-20170517070808-cb568a3e5cc0/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
-github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400/go.mod h1:DDcKzU3qCuvj/tPnimWSsZZzvk9qvkvrIL5naVBPh5s=
-github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA=
-github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
-github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
-github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
-github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
-github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
-github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0=
-github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=
-github.com/smartwalle/pongo2render v1.0.1 h1:rsPnDTu/+zIT5HEB5RbMjxKY5hisov26j0isZL/7YS0=
-github.com/smartwalle/pongo2render v1.0.1/go.mod h1:MGnTzND7nEMz7g194kjlnw8lx/V5JJlb1hr5kDXEO0I=
-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
-github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
-github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
-github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
-github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
-github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
-github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
-github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
-github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
-github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cast v1.4.0 h1:WhlbjwB9EGCc8W5Rxdkus+wmH2ASRwwTJk6tgHKwdqQ=
-github.com/spf13/cast v1.4.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cobra v0.0.0-20170417170307-b6cb39589372/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
-github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
-github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
-github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
-github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
-github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
-github.com/spf13/pflag v0.0.0-20170417173400-9e4c21054fa1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
-github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
-github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM=
-github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
-github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44=
-github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
-github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
-github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
-github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
-github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
-github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
-github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
-github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
-github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
-github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
-github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
-github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
-github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
-github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
-github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
-github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
-github.com/wendal/errors v0.0.0-20181209125328-7f31f4b264ec/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
-github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
-github.com/ylywyn/jpush-api-go-client v0.0.0-20190906031852-8c4466c6e369/go.mod h1:Nv7wKD2/bCdKUFNKcJRa99a+1+aSLlCRJFriFYdjz/I=
-github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU=
-go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
-go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
-go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
-go.etcd.io/etcd v3.3.25+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI=
-go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
-go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
-go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
-go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=
-go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
-go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
-go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
-go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
-go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
-go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
-go.starlark.net v0.0.0-20190702223751-32f345186213 h1:lkYv5AKwvvduv5XWP6szk/bvvgO6aDeUujhZQXIFTes=
-go.starlark.net v0.0.0-20190702223751-32f345186213/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg=
-go.starlark.net v0.0.0-20200821142938-949cc6f4b097/go.mod h1:f0znQkUKRrkk36XxWbGjMqQM8wGv/xHBVE2qc3B5oFU=
-go.starlark.net v0.0.0-20210602144842-1cdb82c9e17a h1:wDtSCWGrX9tusypq2Qq9xzaA3Tf/+4D2KaWO+HQvGZE=
-go.starlark.net v0.0.0-20210602144842-1cdb82c9e17a/go.mod h1:t3mmBBPzAVvK0L0n1drDmrQsJ8FoIx4INCqVMTr/Zo0=
-go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
-go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
-go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
-go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
-go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
-go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
-go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
-go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
-go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
-go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
-go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
-golang.org/x/arch v0.0.0-20190927153633-4e8777c89be4 h1:QlVATYS7JBoZMVaf+cNjb90WD/beKVHnIxFKT4QaHVI=
-golang.org/x/arch v0.0.0-20190927153633-4e8777c89be4/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=
-golang.org/x/arch v0.0.0-20210727222714-28578f966459 h1:ECTRghTMeoUryGydSc+nr1o4M2i73DwlP4LFEDJb3II=
-golang.org/x/arch v0.0.0-20210727222714-28578f966459/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
-golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc=
-golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
-golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
-golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
-golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
-golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
-golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
-golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
-golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
-golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
-golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
-golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
-golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI=
-golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
-golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=
-golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA=
-golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
-golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
-golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
-golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs=
-golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191127201027-ecd32218bd7f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
-golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
-golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58 h1:1Bs6RVeBFtLZ8Yi1Hk07DiOqzvwLD/4hln4iahvFlag=
-golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
-golang.org/x/tools v0.1.2 h1:kRBLX7v7Af8W7Gdbbc908OJcdgtK8bOz9Uaj8/F1ACA=
-golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
-google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
-google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
-google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
-google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
-google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
-google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
-google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
-google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
-google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
-google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
-google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
-google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
-google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
-google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
-google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
-google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
-google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
-google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
-google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
-google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
-google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
-google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
-google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
-google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
-google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
-google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
-google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
-google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
-gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
-gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U=
-gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
-gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
-gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
-gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
-gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
-gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
-gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
-gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
-gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
-gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
-gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
-gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
-honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
-rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
-rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
-rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
-sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
-sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
-sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=

+ 2 - 0
models/db_init.go

@@ -86,6 +86,8 @@ func init() {
 		new(seal.SealOperationRecord), // 用印操作记录表
 		new(roadshow.RsCalendar),
 		new(roadshow.RsCalendarResearcher),
+		new(roadshow.RsMatters),
+		new(roadshow.RsCalendarRelation),
 		new(company_product_update_log.CompanyProductUpdateLog), //客户产品状态变更记录表
 	)
 

+ 351 - 23
models/roadshow/calendar.go

@@ -3,6 +3,7 @@ package roadshow
 import (
 	"github.com/rdlucklib/rdluck_tools/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hongze_mobile_admin/models/tables/admin"
 	"time"
 )
 
@@ -48,9 +49,12 @@ type RsCalendar struct {
 	CityCode         string `description:"市编码"`
 	Theme            string `description:"会议主题"`
 	CooperationName  string `description:"合作方名称"`
+	Title            string `description:"展示在日历的标题"`
+	Source           int8   `description:"来源,0:自系统,1:上海方的"`
 	CreateTime       time.Time
 	ModifyTime       time.Time
 	ActivityCategory string `description:"活动类别"`
+	IsSynced         int    `description:"是否与上海同步 0:未同步 1:已同步"`
 }
 
 type RsCalendarResearcher struct {
@@ -64,14 +68,16 @@ type RsCalendarResearcher struct {
 	EndTime                string `description:"结束时间"`
 	StartWeek              string `description:"开始日期对应周"`
 	EndWeek                string `description:"结束日期对应周"`
-	Status                 int    `description:"状态:1:待接受,2:已接受,3:已拒绝,4:已删除,5:已撤回"`
-	RefuseReason           string `description:"拒绝理由"`
-	RefuseTime             string `description:"拒绝时间"`
-	ApproveTime            string `description:"审批时间"`
-	DeleteReason           string `description:"删除原因"`
-	DeleteTime             string `description:"删除时间"`
-	CreateTime             string
-	ModifyTime             string
+	CreateTime             time.Time
+	ModifyTime             time.Time
+	Status                 int       `description:"状态:1:待接受,2:已接受,3:已拒绝,4:已删除,5:已撤回,6:已结束"`
+	RefuseReason           string    `description:"拒绝理由"`
+	RefuseTime             time.Time `description:"拒绝时间"`
+	DeleteReason           string    `description:"删除理由"`
+	DeleteTime             time.Time `description:"删除时间"`
+	ApproveTime            time.Time `description:"接受时间"`
+	IsSynced               int       `description:"是否与上海同步 0:未同步 1:已同步"`
+	ResearcherSort         int       `description:"研究员新增排序"`
 }
 
 func GetRsCalendarById(rsCalendarId int) (item *RsCalendar, err error) {
@@ -111,8 +117,9 @@ type CalendarListView struct {
 	RoadshowPlatform       string `description:"路演平台"`
 	CompanyId              int    `description:"客户id"`
 	CompanyName            string `description:"客户名称"`
+	CompanyStatus          string `description:"客户状态"`
 	RsCalendarResearcherId int    `description:"活动研究员id"`
-	ResearcherId           int    `description:"研究员id"`
+	ResearcherId           string    `description:"研究员id"`
 	ResearcherName         string `description:"研究员名称"`
 	StartDate              string `description:"开始日期"`
 	EndDate                string `description:"结束日期"`
@@ -133,6 +140,8 @@ type CalendarListView struct {
 	Theme                  string    `description:"会议主题"`
 	CooperationName        string    `description:"合作方名称"`
 	ActivityCategory       string    `description:"活动类别"`
+	Source                 int       `description:"来源,0:自系统,1:上海方的"`
+	Title                  string    `description:"活动标题"`
 }
 
 type CalendarListResp struct {
@@ -160,10 +169,10 @@ func GetCalendarList(condition string, pars []interface{}, status int, pageLimit
 	if condition != "" {
 		sql += condition
 	}
-	if status==1 {
-		sql += ` ORDER BY a.create_time ASC LIMIT ?,? `
-	}else{
-		sql += ` ORDER BY a.create_time DESC LIMIT ?,? `
+	if status == 1 {
+		sql += ` ORDER BY b.create_time ASC LIMIT ?,? `
+	} else {
+		sql += ` ORDER BY b.create_time DESC LIMIT ?,? `
 	}
 	_, err = o.Raw(sql, pars, pageLimit).QueryRows(&list)
 	return
@@ -226,8 +235,10 @@ type RsMatters struct {
 	StartWeek       string    `description:"开始日期周"`
 	EndWeek         string    `description:"结束日期周"`
 	MatterContent   string    `description:"事项内容"`
+	Status          int8      `description:"状态:1:进行中,6:已结束"`
 	CreateTime      time.Time `description:"创建时间"`
 	ModifyTime      time.Time `description:"修改时间"`
+	IsSynced        int       `description:"是否与上海同步 0:未同步 1:已同步"`
 }
 
 type UpdateMattersReq struct {
@@ -241,18 +252,335 @@ type UpdateMattersReq struct {
 	MatterContent string `description:"事项内容"`
 }
 
-type CompanyDetailView struct {
-	CompanyId       int    `orm:"column(company_id);pk"`
-	CompanyName     string `description:"客户名称"`
-	Status          string `description:"客户状态"`
-	IndustryId      int    `description:"行业id"`
-	IndustryName    string `description:"行业名称"`
-	PermissionName  string `description:"开通品种"`
-	ReportReadTotal int    `description:"累计阅读次数"`
-}
-
 type CalendarDetailResp struct {
 	RsCalendarItem           *RsCalendar
 	RsCalendarResearcherItem *RsCalendarResearcher
 	CompanyDetail            *CompanyDetailView
 }
+
+type MattersListResp struct {
+	Paging *paging.PagingItem
+	List   []*RsMattersView
+}
+
+type RsMattersView struct {
+	RsMattersId     int    `orm:"column(rs_matters_id);pk"`
+	SysUserId       int    `description:"添加事项人id"`
+	SysUserRealName string `description:"创建人姓名"`
+	StartDate       string `description:"开始日期"`
+	EndDate         string `description:"结束日期"`
+	StartTime       string `description:"开始时间"`
+	EndTime         string `description:"结束时间"`
+	StartWeek       string `description:"开始日期周"`
+	EndWeek         string `description:"结束日期周"`
+	MatterContent   string `description:"事项内容"`
+	Status          int8   `description:"状态:1:进行中,6:已结束"`
+	CreateTime      string `description:"创建时间"`
+	ModifyTime      string `description:"修改时间"`
+	IsSynced        int    `description:"是否与上海同步 0:未同步 1:已同步"`
+}
+
+func GetMattersListCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM  rs_matters AS a
+		WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func GetMattersList(condition string, pars []interface{}, pageLimit ...int) (list []*RsMattersView, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM  rs_matters AS a
+		WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY a.create_time DESC LIMIT ?,? `
+	_, err = o.Raw(sql, pars, pageLimit).QueryRows(&list)
+	return
+}
+
+type DeleteMattersReq struct {
+	RsMattersId int `description:"事项id"`
+}
+
+// 删除事项
+func DeleteRsMatters(rsMattersId int) (err error) {
+	o := orm.NewOrm()
+	sql := ` DELETE FROM rs_matters WHERE rs_matters_id=? `
+	_, err = o.Raw(sql, rsMattersId).Exec()
+	return err
+}
+
+func CheckMattersCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM  rs_matters AS a
+		WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func GetResearcherFromAdmin(condition string, pars []interface{}) (lists []*admin.Admin, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM admin WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&lists)
+	return
+}
+
+// 更新活动信息
+func UpdateRsCalendar(where, updateParams map[string]interface{}) error {
+	o := orm.NewOrm()
+	ptrStructOrTableName := "rs_calendar"
+	qs := o.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range where {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err := qs.Update(updateParams)
+	return err
+}
+
+// 更新
+func UpdateRsMatters(where, updateParams map[string]interface{}) error {
+	o := orm.NewOrm()
+	ptrStructOrTableName := "rs_matters"
+	qs := o.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range where {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err := qs.Update(updateParams)
+	return err
+}
+
+type EditActivityReq struct {
+	EditType               int    `description:"修改方式: 1:修改,2:修改重提"`
+	RsCalendarId           int    `description:"路演活动id"`
+	RsCalendarResearcherId int    `description:"活动研究员id"`
+	ActivityType           string `description:"活动类型"`
+	RoadshowType           string `description:"路演形式"`
+	RoadshowPlatform       string `description:"路演平台"`
+	CompanyId              int    `description:"客户id"`
+	CompanyName            string `description:"客户名称"`
+	Province               string `description:"省"`
+	ProvinceCode           string `description:"省编码"`
+	City                   string `description:"市"`
+	CityCode               string `description:"市编码"`
+	Theme                  string `description:"会议主题"`
+	CooperationName        string `description:"合作方名称"`
+	ActivityCategory       string `description:"活动类别"`
+	ResearcherList         []*CalendarResearcher
+}
+
+// GetRsCalendarResearcherListByRsCalendarId 根据路演id获取路演研究员列表
+func GetRsCalendarResearcherListByRsCalendarId(rsCalendarId int) (items []*RsCalendarResearcher, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_calendar_researcher WHERE rs_calendar_id=? `
+	_, err = o.Raw(sql, rsCalendarId).QueryRows(&items)
+	return
+}
+
+func CheckCalendarResearcherCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM  rs_calendar_researcher AS a
+		WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func GetMattersById(rsMatters int) (item *RsMatters, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM  rs_matters
+		WHERE rs_matters_id=? `
+	err = o.Raw(sql, rsMatters).QueryRow(&item)
+	return
+}
+
+//添加RsCalendarResearcher
+func AddRsMatters(item *RsMatters) (id int64, err error) {
+	o := orm.NewOrm()
+	id, err = o.Insert(item)
+	return
+}
+
+//添加RsCalendar
+func AddRsCalendar(item *RsCalendar) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+//添加RsCalendarResearcher
+func AddRsCalendarResearcher(item *RsCalendarResearcher) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+func GetRsCalendarResearcherByRsCalendarIdAndResearcherId(rsCalendarId, researcherId int) (item *RsCalendarResearcher, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_calendar_researcher WHERE rs_calendar_id=? AND researcher_id=? `
+	err = o.Raw(sql, rsCalendarId, researcherId).QueryRow(&item)
+	return
+}
+
+func GetRsCalendarResearcherByCalendarId(rsCalendarId int) (item []*RsCalendarResearcher, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_calendar_researcher WHERE rs_calendar_id=? `
+	_, err = o.Raw(sql, rsCalendarId).QueryRows(&item)
+	return
+}
+
+// 删除
+func DeleteRsCalendarResearcher(rsCalendarId int) (err error) {
+	o := orm.NewOrm()
+	sql := ` DELETE FROM rs_calendar_researcher WHERE rs_calendar_id=? `
+	_, err = o.Raw(sql, rsCalendarId).Exec()
+	return err
+}
+
+func GetResearcherGroup() (list []*ResearcherGroup, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT group_id,group_name FROM admin AS a
+			WHERE a.role_type_code IN('researcher','ficc_researcher','ficc_admin')
+			AND a.enabled=1
+			AND a.group_id>0
+			AND a.group_name<>'无'
+			GROUP BY a.group_id 
+            ORDER BY a.group_id ASC `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+func GetResearcher() (list []*Researcher, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM admin AS a
+			WHERE a.role_type_code IN('researcher','rai_researcher','ficc_researcher','ficc_admin')
+			AND a.enabled=1 `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+
+// 删除
+func DeleteCalendar(rsCalendarId, rsCalendarResearcherId int) (err error) {
+	o := orm.NewOrm()
+	sql := ` DELETE FROM rs_calendar_researcher WHERE rs_calendar_researcher_id=? `
+	_, err = o.Raw(sql, rsCalendarResearcherId).Exec()
+	if err != nil {
+		return err
+	}
+	//var count int
+	//sql = ` SELECT COUNT(1) AS count FROM rs_calendar_researcher WHERE rs_calendar_id=? `
+	//err = o.Raw(sql, rsCalendarId).QueryRow(&count)
+	//if err != nil && err.Error() != utils.ErrNoRow() {
+	//	return err
+	//}
+	//if count <= 0 {
+	//	sql := ` DELETE FROM rs_calendar WHERE rs_calendar_id=? `
+	//	_, err = o.Raw(sql, rsCalendarId).Exec()
+	//	if err != nil {
+	//		return err
+	//	}
+	//}
+	sql = ` DELETE FROM rs_calendar WHERE rs_calendar_id=? `
+	_, err = o.Raw(sql, rsCalendarId).Exec()
+	if err != nil {
+		return err
+	}
+	return err
+}
+
+type ActivityTypeList struct {
+	ActivityTypeId   int                 `description:"活动类型ID"`
+	ActivityTypeName string              `description:"活动类型名称"`
+	Pid              int                 `description:"父级id,默认是:0"`
+	Sort             int                 `description:"排序字段"`
+	FrontIsShow      int8                `description:"是否在前台展示,0:不展示,1:展示"`
+	CreateTime       time.Time           `description:"创建时间"`
+	ChildList        []*ActivityTypeList `description:"下级活动类型列表"`
+}
+
+// GetActivityTypeListByActivityTypePId 根据上级id获取活动分类列表
+func GetActivityTypeListByActivityTypePId(pid int) (list []*ActivityTypeList, err error) {
+	o := orm.NewOrm()
+	sql := `select * from yb_activity_type where pid=? order by sort asc ,activity_type_id asc`
+	_, err = o.Raw(sql, pid).QueryRows(&list)
+	return
+}
+
+type CalendarPanelDetailResp struct {
+	CalendarList  []*CalendarListView
+	RsMattersList []*RsMatters
+}
+
+func GetCalendarDetailList(condition string, pars []interface{}) (list []*CalendarListView, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT a.*,b.*,c.status AS company_status FROM  rs_calendar AS a
+		INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id=b.rs_calendar_id
+        LEFT JOIN company_product AS c ON a.company_id=c.company_id AND c.product_id=1
+		WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY a.create_time DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}
+
+func GetRsMattersList(startDate, endDate string, researcherId int) (list []*RsMatters, err error) {
+	o := orm.NewOrm()
+	//sql := `SELECT * FROM  rs_matters AS a WHERE a.start_date>=? AND a.end_date<=? AND sys_user_id=? `
+	//sql := `SELECT * FROM  rs_matters AS a WHERE a.end_date>=? AND sys_user_id=? `
+	sql := `SELECT * FROM  rs_matters AS a WHERE sys_user_id=? `
+	sql += ` ORDER BY a.create_time DESC `
+	_, err = o.Raw(sql, researcherId).QueryRows(&list)
+	return
+}
+
+
+func GetCalendarTypeList(condition string, pars []interface{}, startSize, pageSize int) (list []*CalendarListView, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT a.rs_calendar_id,a.activity_type,a.roadshow_type,a.activity_category,a.roadshow_platform,b.create_time,
+				b.modify_time,GROUP_CONCAT(b.researcher_id ORDER BY researcher_sort ASC) AS researcher_id,GROUP_CONCAT(b.researcher_name ORDER BY researcher_sort ASC) AS 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,
+                b.delete_reason,a.sys_user_real_name,a.city,a.province,a.company_name,a.company_id,
+                a.cooperation_name,a.theme,a.activity_category
+				FROM  rs_calendar AS a
+				INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id=b.rs_calendar_id
+				WHERE 1=1
+ `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` GROUP BY a.rs_calendar_id
+				 ORDER BY b.create_time DESC LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	return
+}
+
+
+func GetCalendarTypeListCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM(SELECT COUNT(1) AS count
+				FROM  rs_calendar AS a
+				INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id=b.rs_calendar_id
+				WHERE 1=1  `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` GROUP BY a.rs_calendar_id ) AS t `
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}

+ 113 - 0
models/roadshow/company.go

@@ -0,0 +1,113 @@
+package roadshow
+
+import (
+	"github.com/rdlucklib/rdluck_tools/orm"
+	"time"
+)
+
+type CompanySearchView struct {
+	CompanyId   int    `orm:"column(company_id);pk"`
+	CompanyName string `description:"客户名称"`
+	CreditCode  string `description:"社会统一信用码"`
+	CompanyCode string `description:"客户编码"`
+}
+
+func CompanySearch(sellerId int, keyWord string) (list []*CompanySearchView, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT b.company_id,b.company_name FROM company AS a
+			INNER JOIN company_product AS b ON a.company_id=b.company_id
+			WHERE b.seller_id=?
+			AND b.status IN('正式','试用')
+            AND b.company_name LIKE '%` + keyWord + `%'
+			`
+	sql += ` GROUP BY b.company_id  `
+	_, err = o.Raw(sql, sellerId).QueryRows(&list)
+	return
+}
+
+type CompanyDetailView struct {
+	CompanyId       int    `orm:"column(company_id);pk"`
+	CompanyName     string `description:"客户名称"`
+	Status          string `description:"客户状态"`
+	IndustryId      int    `description:"行业id"`
+	IndustryName    string `description:"行业名称"`
+	PermissionName  string `description:"开通品种"`
+	ReportReadTotal int    `description:"累计阅读次数"`
+}
+
+
+type CompanyProduct struct {
+	CompanyProductId    int       `orm:"column(company_product_id);pk" description:"客户产品id"`
+	CompanyId           int       `description:"客户id"`
+	ProductId           int       `description:"产品id"`
+	ProductName         string    `description:"产品名称"`
+	CompanyName         string    `description:"客户名称"`
+	Source              string    `description:"来源"`
+	Reasons             string    `description:"新增理由"`
+	Status              string    `description:"客户状态"`
+	IndustryId          int       `description:"行业id"`
+	IndustryName        string    `description:"行业名称"`
+	SellerId            int       `description:"销售id"`
+	SellerName          string    `description:"销售名称"`
+	GroupId             int       `description:"销售分组id"`
+	DepartmentId        int       `description:"销售部门id"`
+	IsSuspend           int       `description:"1:暂停,0:启用"`
+	SuspendTime         time.Time `description:"暂停启用时间"`
+	TryOutTime          time.Time `description:"正式转试用时间"`
+	RenewalReason       string    `description:"正式转试用后的续约情况说明"`
+	LastDescriptionTime time.Time `description:"上次添加说明时间"`
+	RenewalIntention    int       `description:"是否勾选无续约意向,1:确认,0:未确认"`
+	ApproveStatus       string    `description:"审批状态:'审批中','通过','驳回'"`
+	FreezeTime          time.Time `description:"冻结时间"`
+	FreezeReason        time.Time `description:"冻结理由"`
+	Remark              string    `description:"备注信息"`
+	CreateTime          time.Time `description:"创建时间"`
+	ModifyTime          time.Time `description:"修改时间"`
+	StartDate           string    `description:"开始日期"`
+	EndDate             string    `description:"结束日期"`
+	ContractEndDate     time.Time `description:"合同结束日期"`
+	LoseReason          string    `description:"流失原因"`
+	LossTime            time.Time `description:"流失时间"`
+	CompanyType         string    `description:"客户类型"`
+	OpenCode            string    `description:"开放给第三方的编码,不让第三方定位我们的客户信息"`
+	ViewTotal           int       `description:"总阅读次数"`
+	LastViewTime        time.Time `description:"最后一次阅读时间"`
+	PackageType         int       `description:"套餐类型"`
+	Scale               string    `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。"`
+}
+
+func GetCompanyProductByCompanyIdAndProductId(companyId, productId int) (item *CompanyProduct, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT b.* FROM company AS a
+			INNER JOIN company_product AS b ON a.company_id=b.company_id
+			WHERE a.company_id=? AND b.product_id=? LIMIT 1 `
+	err = o.Raw(sql, companyId, productId).QueryRow(&item)
+	return
+}
+
+//客户授权产品结构体(包含产品名称)
+type CompanyReportPermissionAndName struct {
+	CompanyReportPermissionId int `description:"客户授权产品id"`
+	CompanyId                 int
+	ReportPermissionId        int
+	CreatedTime               time.Time
+	LastUpdatedTime           time.Time
+	ChartPermissionId         int
+	StartDate                 string    `description:"权限开始日期"`
+	EndDate                   string    `description:"权限结束日期"`
+	ProductId                 int       `description:"产品id"`
+	ProductName               string    `description:"产品名称"`
+	CompanyContractId         int       `description:"合同id"`
+	PermissionName            string    `description:"客户授权产品的名称"`
+	ClassifyName              string    `description:"客户授权产品的分类名称"`
+	Status                    string    `description:"'正式','试用','关闭'"`
+	ModifyTime                time.Time `description:"修改时间"`
+}
+
+//根据企业用户id和产品id获取所有正式的权限
+func GetCompanyProductReportPermissionList(companyId, productId int) (items []*CompanyReportPermissionAndName, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT a.*,b.permission_name,b.classify_name FROM company_report_permission a left join chart_permission b on a.chart_permission_id=b.chart_permission_id WHERE a.company_id = ? and a.product_id=? `
+	_, err = o.Raw(sql, companyId, productId).QueryRows(&items)
+	return
+}

+ 264 - 0
models/roadshow/rs_calendar_relation.go

@@ -2,6 +2,9 @@ package roadshow
 
 import (
 	"github.com/rdlucklib/rdluck_tools/orm"
+	"hongze/hongze_mobile_admin/models/tables/admin"
+	"hongze/hongze_mobile_admin/utils"
+	"strconv"
 	"time"
 )
 
@@ -42,6 +45,39 @@ func GetRelationByPars(condition string, pars []interface{}) (items *RsCalendarR
 	return
 }
 
+func GetPhoneFromResearcher(calendarResearcherId int) (items *string, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT mobile FROM admin AS a INNER JOIN rs_calendar_researcher AS b ON a.admin_id=b.researcher_id WHERE b.rs_calendar_researcher_id=?`
+	err = o.Raw(sql, calendarResearcherId).QueryRow(&items)
+	return
+}
+
+func GetPhoneFromRsCalendarById(rsCalendarId int) (item *string, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT mobile FROM admin AS a INNER JOIN rs_calendar AS b ON a.admin_id=b.sys_user_id WHERE b.rs_calendar_id=? `
+	err = o.Raw(sql, rsCalendarId).QueryRow(&item)
+	return
+}
+
+// GetRsCalendarRelationListByThirdIds 根据第三方id集合获取所有的关系列表
+func GetRsCalendarRelationListByThirdIds(thirdCalendarIds []int) (items []*RsCalendarRelation, err error) {
+	if len(thirdCalendarIds) <= 0 {
+		return
+	}
+	thirdCalendarIdStr := utils.Implode(thirdCalendarIds)
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_calendar_relation WHERE third_calendar_id in (` + thirdCalendarIdStr + `) `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// AddRsCalendarRelation 添加自系统路演与第三方路演关系
+func AddRsCalendarRelation(item *RsCalendarRelation) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
 // DeleteRsCalendarRelation 删除关联表
 func DeleteRsCalendarRelation(relationIdd int) (err error) {
 	sql := `DELETE FROM rs_calendar_relation WHERE relation_id=? `
@@ -49,3 +85,231 @@ func DeleteRsCalendarRelation(relationIdd int) (err error) {
 	_, err = o.Raw(sql, relationIdd).Exec()
 	return
 }
+
+// SyncRsCalendarRelation 同步自系统路演与第三方路演关系
+func SyncRsCalendarRelation(thirdUserCalendar UserCalendar, createUser admin.Admin, researcherList []admin.Admin) (err error) {
+	currentStartTimer := time.Unix(int64(thirdUserCalendar.StartTime), 0)
+	currentEndTimer := time.Unix(int64(thirdUserCalendar.EndTime), 0)
+
+	o := orm.NewOrm()
+	o.Begin()
+	defer func() {
+		if err != nil {
+			o.Rollback()
+		} else {
+			o.Commit()
+		}
+	}()
+
+	//路演活动表入库
+	rsCalendar := &RsCalendar{
+		SysUserId:        createUser.AdminId,
+		SysUserRealName:  createUser.RealName,
+		ActivityType:     "路演",
+		RoadshowType:     "",
+		RoadshowPlatform: "",
+		CompanyId:        0,
+		CompanyName:      thirdUserCalendar.CustomerName,
+		Province:         "",
+		ProvinceCode:     "",
+		City:             "",
+		CityCode:         "",
+		Theme:            "",
+		CooperationName:  "",
+		Title:            thirdUserCalendar.Title,
+		Source:           1, //来源,0:自系统,1:上海方的
+		CreateTime:       time.Now(),
+		ModifyTime:       time.Now(),
+		ActivityCategory: "",
+	}
+	rsCalendarId, err := o.Insert(rsCalendar)
+	if err != nil {
+		return
+	}
+	rsCalendar.RsCalendarId = int(rsCalendarId)
+
+	// 路演研究员入库
+	rsCalendarResearcherList := make([]*RsCalendarResearcher, 0)
+	for _, researcheInfo := range researcherList {
+		rsCalendarResearcher := &RsCalendarResearcher{
+			RsCalendarResearcherId: 0,
+			RsCalendarId:           rsCalendar.RsCalendarId,
+			ResearcherId:           researcheInfo.AdminId,
+			ResearcherName:         researcheInfo.RealName,
+			StartDate:              currentStartTimer.Format(utils.FormatDate),
+			EndDate:                currentEndTimer.Format(utils.FormatDate),
+			StartTime:              currentStartTimer.Format(utils.FormatTime),
+			EndTime:                currentEndTimer.Format(utils.FormatTime),
+			StartWeek:              utils.StrDateTimeToWeek(currentStartTimer.Weekday().String()),
+			EndWeek:                utils.StrDateTimeToWeek(currentEndTimer.Weekday().String()),
+			CreateTime:             time.Now(),
+			ModifyTime:             time.Now(),
+			Status:                 2, //1:待接受,2:已接受,3:已拒绝,4:已删除,5:已撤回,6:已结束
+			RefuseReason:           "",
+			//RefuseTime:             time.Time{},
+			DeleteReason: "",
+		}
+		rsCalendarResearcherId, tmpErr := o.Insert(rsCalendarResearcher)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		rsCalendarResearcher.RsCalendarResearcherId = int(rsCalendarResearcherId)
+		rsCalendarResearcherList = append(rsCalendarResearcherList, rsCalendarResearcher)
+	}
+
+	selfCalendarId := 0
+	if len(rsCalendarResearcherList) > 0 {
+		selfCalendarId = rsCalendarResearcherList[0].RsCalendarResearcherId
+	}
+	//关系入库
+	customerId, _ := strconv.Atoi(thirdUserCalendar.CustomerId)
+	rsCalendarRelation := &RsCalendarRelation{
+		//RelationId:       0,
+		CalendarType:     1,              //日历类型;1:路演;2:事项
+		SelfCalendarId:   selfCalendarId, //研究员与路演关系id;
+		ThirdCalendarId:  thirdUserCalendar.ID,
+		UserId:           thirdUserCalendar.UserId,
+		UserPhone:        thirdUserCalendar.UserPhone,
+		UserName:         thirdUserCalendar.UserName,
+		ProjectName:      thirdUserCalendar.ProjectName,
+		ProjectId:        thirdUserCalendar.ProjectId,
+		CustomerId:       customerId,
+		CustomerName:     thirdUserCalendar.CustomerName,
+		CustomerSocial:   thirdUserCalendar.CustomerSocial,
+		ProjectType:      thirdUserCalendar.ProjectType,
+		ProjectFormType:  thirdUserCalendar.ProjectType,
+		Room:             thirdUserCalendar.Room,
+		StartTime:        thirdUserCalendar.StartTime,
+		EndTime:          thirdUserCalendar.EndTime,
+		Content:          thirdUserCalendar.Content,
+		FeedExpert:       thirdUserCalendar.FeedExpert,
+		Title:            thirdUserCalendar.Title,
+		ResearcherMobile: thirdUserCalendar.ResearcherMobile,
+		ModifyTime:       time.Now(),
+		CreateTime:       time.Now(),
+	}
+	rsCalendarRelationId, err := o.Insert(rsCalendarRelation)
+	if err != nil {
+		return
+	}
+	rsCalendarRelation.RelationId = int(rsCalendarRelationId)
+
+	return
+}
+
+// UpdateSyncRsCalendarRelation 同步自系统路演与第三方路演关系
+func UpdateSyncRsCalendarRelation(thirdUserCalendar UserCalendar, rsCalendar *RsCalendar, rsCalendarRelation *RsCalendarRelation, updateRsCalendarResearcherList []*RsCalendarResearcher, delResearcherIdList []int, addResearcherList []admin.Admin) (err error) {
+	currentStartTimer := time.Unix(int64(thirdUserCalendar.StartTime), 0)
+	currentEndTimer := time.Unix(int64(thirdUserCalendar.EndTime), 0)
+
+	//新增研究员
+	//删除研究员
+	//更新研究员
+	o := orm.NewOrm()
+	o.Begin()
+	defer func() {
+		if err != nil {
+			o.Rollback()
+		} else {
+			o.Commit()
+		}
+	}()
+
+	// 路演活动表修改
+	rsCalendar.Title = thirdUserCalendar.Title
+	rsCalendar.ModifyTime = time.Now()
+	_, err = o.Update(rsCalendar, "Title", "ModifyTime")
+	if err != nil {
+		return
+	}
+
+	// 删除路演研究员
+	if len(delResearcherIdList) > 0 {
+		delResearcherIdStr := utils.Implode(delResearcherIdList)
+		sql := `DELETE FROM rs_calendar_researcher WHERE rs_calendar_researcher_id in (` + delResearcherIdStr + `) `
+		_, tmpErr := o.Raw(sql).Exec()
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+	}
+
+	// 修改路演研究员
+	for _, rsCalendarResearcher := range updateRsCalendarResearcherList {
+		rsCalendarResearcher.StartDate = currentStartTimer.Format(utils.FormatDate)
+		rsCalendarResearcher.EndDate = currentEndTimer.Format(utils.FormatDate)
+		rsCalendarResearcher.StartTime = currentStartTimer.Format(utils.FormatTime)
+		rsCalendarResearcher.EndTime = currentEndTimer.Format(utils.FormatTime)
+		rsCalendarResearcher.StartWeek = utils.StrDateTimeToWeek(currentStartTimer.Weekday().String())
+		rsCalendarResearcher.EndWeek = utils.StrDateTimeToWeek(currentEndTimer.Weekday().String())
+		rsCalendarResearcher.ModifyTime = time.Now()
+		_, tmpErr := o.Update(rsCalendar, "StartDate", "EndDate", "StartTime", "EndTime", "StartWeek", "EndWeek", "ModifyTime")
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+	}
+
+	// 路演研究员入库
+	rsCalendarResearcherList := make([]*RsCalendarResearcher, 0)
+	for _, researcheInfo := range addResearcherList {
+		rsCalendarResearcher := &RsCalendarResearcher{
+			RsCalendarResearcherId: 0,
+			RsCalendarId:           rsCalendar.RsCalendarId,
+			ResearcherId:           researcheInfo.AdminId,
+			ResearcherName:         researcheInfo.RealName,
+			StartDate:              currentStartTimer.Format(utils.FormatDate),
+			EndDate:                currentEndTimer.Format(utils.FormatDate),
+			StartTime:              currentStartTimer.Format(utils.FormatTime),
+			EndTime:                currentEndTimer.Format(utils.FormatTime),
+			StartWeek:              utils.StrDateTimeToWeek(currentStartTimer.Weekday().String()),
+			EndWeek:                utils.StrDateTimeToWeek(currentEndTimer.Weekday().String()),
+			CreateTime:             time.Now(),
+			ModifyTime:             time.Now(),
+			Status:                 2, //1:待接受,2:已接受,3:已拒绝,4:已删除,5:已撤回,6:已结束
+			RefuseReason:           "",
+			//RefuseTime:             time.Time{},
+			DeleteReason: "",
+		}
+		rsCalendarResearcherId, tmpErr := o.Insert(rsCalendarResearcher)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		rsCalendarResearcher.RsCalendarResearcherId = int(rsCalendarResearcherId)
+		rsCalendarResearcherList = append(rsCalendarResearcherList, rsCalendarResearcher)
+	}
+
+	// 关系表变更
+	selfCalendarId := rsCalendarRelation.SelfCalendarId
+	if len(updateRsCalendarResearcherList) > 0 {
+		selfCalendarId = updateRsCalendarResearcherList[0].RsCalendarResearcherId //更新的研究员关系表id
+	} else if len(rsCalendarResearcherList) > 0 {
+		selfCalendarId = rsCalendarResearcherList[0].RsCalendarResearcherId //新增的研究员关系表id
+	}
+
+	//关系入库
+	customerId, _ := strconv.Atoi(thirdUserCalendar.CustomerId)
+	rsCalendarRelation.SelfCalendarId = selfCalendarId
+	rsCalendarRelation.UserId = thirdUserCalendar.UserId
+	rsCalendarRelation.UserPhone = thirdUserCalendar.UserPhone
+	rsCalendarRelation.UserName = thirdUserCalendar.UserName
+	rsCalendarRelation.ProjectName = thirdUserCalendar.ProjectName
+	rsCalendarRelation.ProjectId = thirdUserCalendar.ProjectId
+	rsCalendarRelation.CustomerId = customerId
+	rsCalendarRelation.CustomerName = thirdUserCalendar.CustomerName
+	rsCalendarRelation.CustomerSocial = thirdUserCalendar.CustomerSocial
+	rsCalendarRelation.ProjectType = thirdUserCalendar.ProjectType
+	rsCalendarRelation.ProjectFormType = thirdUserCalendar.ProjectType
+	rsCalendarRelation.Room = thirdUserCalendar.Room
+	rsCalendarRelation.StartTime = thirdUserCalendar.StartTime
+	rsCalendarRelation.EndTime = thirdUserCalendar.EndTime
+	rsCalendarRelation.Content = thirdUserCalendar.Content
+	rsCalendarRelation.FeedExpert = thirdUserCalendar.FeedExpert
+	rsCalendarRelation.Title = thirdUserCalendar.Title
+	rsCalendarRelation.ResearcherMobile = thirdUserCalendar.ResearcherMobile
+	rsCalendarRelation.ModifyTime = time.Now()
+	_, err = o.Update(rsCalendarRelation, "SelfCalendarId", "UserId", "UserPhone", "UserName", "ProjectName", "ProjectId", "CustomerId", "CustomerName", "CustomerSocial", "ProjectType", "ProjectFormType", "Room", "StartTime", "EndTime", "Content", "FeedExpert", "Title", "ResearcherMobile", "ModifyTime")
+	return
+}

+ 11 - 0
models/tables/admin/admin.go

@@ -79,3 +79,14 @@ func GetAdminWxById(adminId int) (item *custom.AdminWx, err error) {
 	err = o.Raw(sql, adminId).QueryRow(&item)
 	return
 }
+
+func GetSysuserList(condition string, pars []interface{}, startSize, pageSize int) (items []*Admin, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM admin WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += `ORDER BY created_time DESC LIMIT ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}

+ 19 - 0
models/wechat_send_msg.go

@@ -0,0 +1,19 @@
+package models
+
+import (
+	"github.com/rdlucklib/rdluck_tools/orm"
+)
+
+type OpenIdList struct {
+	OpenId string
+	UserId int
+}
+
+func GetAdminOpenIdByMobile(mobile string) (items []*OpenIdList, err error) {
+	sql := `SELECT DISTINCT ur.open_id,wu.user_id FROM wx_user AS wu 
+          INNER JOIN company AS c ON c.company_id = wu.company_id 
+          INNER join user_record  as ur on wu.user_id=ur.user_id
+          WHERE ur.open_id != "" and ur.create_platform=1 AND wu.mobile=? `
+	_, err = orm.NewOrm().Raw(sql, mobile).QueryRows(&items)
+	return
+}

+ 135 - 0
routers/commentsRouter_controllers.go

@@ -16,6 +16,33 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "ActivityTypeList",
+            Router: "/activity/type/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.ControllerComments{
+            Method: "Add",
+            Router: "/add",
+            AllowHTTPMethods: []string{"post"},
+            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.ControllerComments{
+            Method: "Back",
+            Router: "/back",
+            AllowHTTPMethods: []string{"post"},
+            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.ControllerComments{
             Method: "CalendarDetail",
@@ -34,6 +61,96 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "CalendarTypeList",
+            Router: "/calendar/type/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.ControllerComments{
+            Method: "CompanyDetail",
+            Router: "/company/detail",
+            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.ControllerComments{
+            Method: "CompanySearch",
+            Router: "/company/search",
+            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.ControllerComments{
+            Method: "Delete",
+            Router: "/delete",
+            AllowHTTPMethods: []string{"post"},
+            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.ControllerComments{
+            Method: "Edit",
+            Router: "/edit",
+            AllowHTTPMethods: []string{"post"},
+            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.ControllerComments{
+            Method: "MattersAdd",
+            Router: "/matters/add",
+            AllowHTTPMethods: []string{"post"},
+            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.ControllerComments{
+            Method: "MattersDelete",
+            Router: "/matters/delete",
+            AllowHTTPMethods: []string{"post"},
+            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.ControllerComments{
+            Method: "MattersList",
+            Router: "/matters/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.ControllerComments{
+            Method: "MattersUpdate",
+            Router: "/matters/update",
+            AllowHTTPMethods: []string{"post"},
+            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.ControllerComments{
+            Method: "MyCalendarDetail",
+            Router: "/my/calendar/detail",
+            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.ControllerComments{
             Method: "Refuse",
@@ -43,6 +160,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "ResearcherCalendarDetail",
+            Router: "/researcher/calendar/detail",
+            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.ControllerComments{
+            Method: "ResearcherList",
+            Router: "/researcher/list",
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:AdminCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:AdminCommon"],
         beego.ControllerComments{
             Method: "Login",

+ 0 - 108
services/roadshow/calendar.go

@@ -1,108 +0,0 @@
-package roadshow
-
-import (
-	"encoding/json"
-	"errors"
-	"fmt"
-	"github.com/rdlucklib/rdluck_tools/http"
-	"hongze/hongze_mobile_admin/models/roadshow"
-	"hongze/hongze_mobile_admin/utils"
-	"io/ioutil"
-	netHttp "net/http"
-	"net/url"
-	"time"
-)
-
-// getAccessToken token内部请求接口
-func getAccessToken() (tokenData roadshow.TokenData, err error) {
-	getUrl := fmt.Sprintf(utils.CRM_OPEN_API_URL+"/v1/auth/getAccessToken?app_key=%s&app_secret=%s", utils.CRM_OPEN_API_APP_KEY, utils.CRM_OPEN_API_APP_SECRET)
-	body, err := http.Get(getUrl)
-	if err != nil {
-		err = errors.New("NewRequest Err:" + err.Error())
-		return
-	}
-
-	var tokenResp roadshow.GetTokenResp
-	err = json.Unmarshal(body, &tokenResp)
-	if err != nil {
-		err = errors.New("Unmarshal Err:" + err.Error())
-		return
-	}
-	if tokenResp.Code != 1 {
-		err = errors.New("getAccessToken err:" + tokenResp.Msg)
-		return
-	}
-	tokenData = tokenResp.TokenData
-	return
-	//return tokenResp.TokenData.AccessToken, err
-}
-
-// GetAccessToken 获取accessToken
-func GetAccessToken() (token string, err error) {
-	defer func() {
-		if err != nil {
-			go utils.SendEmail(utils.APPNAME+"获取上海的token失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
-		}
-	}()
-	token, err = utils.Rc.RedisString("SH_ACCESS_TOKEN")
-	//如果从redis中accessToken 获取失败或者token为空了,那么重新获取accessToken
-	if err != nil || token == `` {
-		tokenInfo, tmpErr := getAccessToken()
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-		token = tokenInfo.AccessToken
-		if !utils.Rc.SetNX("SH_ACCESS_TOKEN", token, time.Duration(tokenInfo.ExpireIn-600)*time.Second) {
-			err = errors.New("set Redis err")
-		}
-	}
-	return
-}
-
-// DeleteSHCalendar 删除上海日历活动
-func DeleteSHCalendar(rsCalendarResearcherId int) (err error) {
-	defer func() {
-		if err != nil {
-			go utils.SendEmail(utils.APPNAME+"删除上海日历活动失败:"+time.Now().Format("2006-01-02 15:04:05"), fmt.Sprint("关系id:", rsCalendarResearcherId, ";err:", err.Error()), utils.EmailSendToUsers)
-		}
-	}()
-	token, err := GetAccessToken()
-	finalUrl := utils.CRM_OPEN_API_URL + "/v1/Calendar/delete?access_token=" + token
-
-	var condition string
-	var pars []interface{}
-	condition = ` AND self_calendar_id = ? `
-	pars = append(pars, rsCalendarResearcherId)
-	relationItem, err := roadshow.GetRelationByPars(condition, pars)
-	if err != nil {
-		err = errors.New("GetRelationByPars err" + err.Error())
-		return
-	}
-	resp, err := netHttp.PostForm(finalUrl, url.Values{"user_phone": {relationItem.UserPhone}, "calendar_id": {fmt.Sprintf("%v", relationItem.ThirdCalendarId)}})
-	if err != nil {
-		err = errors.New("NewRequest Err:" + err.Error())
-		return
-	}
-	defer resp.Body.Close()
-
-	body, err := ioutil.ReadAll(resp.Body)
-	if err != nil {
-		fmt.Println("reponse error", err)
-		return
-	}
-	//解析resp判断请求结果是否成功
-	var calendarResp roadshow.CreatSHCalendarResp
-	err = json.Unmarshal(body, &calendarResp)
-	if calendarResp.Code != 1 {
-		err = errors.New("Update SHCalendar err:" + calendarResp.Msg)
-		return
-	}
-	//删除活动表及事项表
-	err = roadshow.DeleteRsCalendarRelation(relationItem.RelationId)
-	if err != nil {
-		err = errors.New("DeleteRsCalendarRelation err:" + err.Error())
-		return
-	}
-	return
-}

+ 824 - 0
services/rs/calendar.go

@@ -0,0 +1,824 @@
+package rs
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/http"
+	"hongze/hongze_mobile_admin/models/roadshow"
+	"hongze/hongze_mobile_admin/models/tables/admin"
+	"hongze/hongze_mobile_admin/utils"
+	"io/ioutil"
+	netHttp "net/http"
+	"net/url"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// getAccessToken token内部请求接口
+func getAccessToken() (tokenData roadshow.TokenData, err error) {
+	getUrl := fmt.Sprintf(utils.CRM_OPEN_API_URL+"/v1/auth/getAccessToken?app_key=%s&app_secret=%s", utils.CRM_OPEN_API_APP_KEY, utils.CRM_OPEN_API_APP_SECRET)
+	body, err := http.Get(getUrl)
+	if err != nil {
+		err = errors.New("NewRequest Err:" + err.Error())
+		return
+	}
+
+	var tokenResp roadshow.GetTokenResp
+	err = json.Unmarshal(body, &tokenResp)
+	if err != nil {
+		err = errors.New("Unmarshal Err:" + err.Error())
+		return
+	}
+	if tokenResp.Code != 1 {
+		err = errors.New("getAccessToken err:" + tokenResp.Msg)
+		return
+	}
+	tokenData = tokenResp.TokenData
+	return
+	//return tokenResp.TokenData.AccessToken, err
+}
+
+// GetAccessToken 获取accessToken
+func GetAccessToken() (token string, err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendEmail(utils.APPNAME+"获取上海的token失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+	token, err = utils.Rc.RedisString("SH_ACCESS_TOKEN")
+	//如果从redis中accessToken 获取失败或者token为空了,那么重新获取accessToken
+	if err != nil || token == `` {
+		tokenInfo, tmpErr := getAccessToken()
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		token = tokenInfo.AccessToken
+		if !utils.Rc.SetNX("SH_ACCESS_TOKEN", token, time.Duration(tokenInfo.ExpireIn-600)*time.Second) {
+			err = errors.New("set Redis err")
+		}
+	}
+	return
+}
+
+func getCalendarFrom(userPhone, startDate, endDate string) (list []roadshow.UserCalendar, err error) {
+	token, err := GetAccessToken()
+	if err != nil {
+		return
+	}
+	exUrl := utils.CRM_OPEN_API_URL + "/v1/calendar/userCalendarList?user_phone=%s&start_time=%s&end_time=%s&access_token=%s"
+	getUrl := fmt.Sprintf(exUrl, userPhone, startDate, endDate, token)
+
+	body, err := http.Get(getUrl)
+	if err != nil {
+		err = errors.New("NewRequest Err:" + err.Error())
+		return
+	}
+
+	var userCalendarList roadshow.UserCalendarList
+	err = json.Unmarshal(body, &userCalendarList)
+	if err != nil {
+		utils.FileLog.Info("getCalendarFrom Err:", "url:", getUrl, ";response:", string(body))
+		err = errors.New("Unmarshal Err:" + err.Error())
+		return
+	}
+
+	if userCalendarList.Code != 1 {
+		utils.FileLog.Info("getCalendarFrom:", "url:", getUrl, ";response:", string(body))
+		err = errors.New(userCalendarList.Msg)
+		return
+	}
+	list = userCalendarList.Data
+	//fmt.Println("userCalendarList", userCalendarList)
+	return
+}
+
+// CalendarToSH 创建活动时同步上海的前置函数
+func CalendarToSH(rsCalendar roadshow.RsCalendar, researcher roadshow.RsCalendarResearcher) {
+	//获取创建者及研究员的信息,长度应为2
+	var condition string
+	var err error
+	var pars []interface{}
+	if rsCalendar.SysUserId == researcher.ResearcherId {
+		condition = ` AND admin_id =? `
+		pars = append(pars, rsCalendar.SysUserId)
+	} else {
+		condition = ` AND admin_id IN (?,?) `
+		pars = append(pars, rsCalendar.SysUserId, researcher.ResearcherId)
+	}
+
+	lists, err := roadshow.GetResearcherFromAdmin(condition, pars)
+	if err != nil {
+		err = errors.New("GetResearcherFromAdmin err:" + err.Error())
+		fmt.Println(err)
+		return
+	}
+	var userPhone, toUserPhone string
+
+	if len(lists) > 0 {
+		//当研究员也是创建者时,lists长度为1 做兼容
+		if len(lists) == 1 && rsCalendar.SysUserId == researcher.ResearcherId {
+			userPhone = lists[0].Mobile
+			toUserPhone = lists[0].Mobile
+		} else if lists[0].AdminId == rsCalendar.SysUserId {
+			userPhone = lists[0].Mobile
+			toUserPhone = lists[1].Mobile
+		} else {
+			userPhone = lists[1].Mobile
+			toUserPhone = lists[0].Mobile
+		}
+		sTime, _ := time.ParseInLocation(utils.FormatDateTime, researcher.StartDate+" "+researcher.StartTime, time.Now().Location())
+		startTime := sTime.Format("2006-01-02 15:04")
+		eTime, _ := time.ParseInLocation(utils.FormatDateTime, researcher.EndDate+" "+researcher.EndTime, time.Now().Location())
+		endTime := eTime.Format("2006-01-02 15:04")
+		err = CreatSHCalendar(userPhone, toUserPhone, rsCalendar.Title, startTime, endTime, 1, researcher.RsCalendarResearcherId)
+		if err != nil {
+			return
+		}
+	} else {
+		err = errors.New("Parameter Err,未查询到创建者或研究员信息" + err.Error())
+		fmt.Println("Parameter Err: " + err.Error())
+		return
+	}
+	if err != nil {
+		utils.SendEmail("研究员日历同步失败:", "新建上海研究员日历失败 "+err.Error(), utils.EmailSendToUsers)
+	} else {
+		whereParams := make(map[string]interface{})
+		updateParams := make(map[string]interface{})
+
+		whereParams["rs_calendar_researcher_id"] = researcher.RsCalendarResearcherId
+
+		updateParams["is_synced"] = 1
+		err = roadshow.UpdateCalendarResearcher(whereParams, updateParams)
+		if err != nil {
+			utils.FileLog.Info("UpdateCalendarResearcher err: " + err.Error())
+			fmt.Println("UpdateCalendarResearcher err: " + err.Error())
+			return
+		}
+		calWhereParams := make(map[string]interface{})
+		calWhereParams["rs_calendar_id"] = rsCalendar.RsCalendarId
+		err = roadshow.UpdateRsCalendar(calWhereParams, updateParams)
+		if err != nil {
+			utils.FileLog.Info("UpdateRsCalendar err: " + err.Error())
+			fmt.Println("UpdateRsCalendar err: " + err.Error())
+			return
+		}
+	}
+}
+
+// MatterToSH 创建事项时同步上海的前置函数
+func MatterToSH(matter roadshow.RsMatters) {
+	var condition string
+	var pars []interface{}
+	condition = ` AND admin_id =? `
+	pars = append(pars, matter.SysUserId)
+	lists, err := roadshow.GetResearcherFromAdmin(condition, pars)
+	if err != nil || len(lists) == 0 {
+		err = errors.New("GetResearcherFromAdmin err:" + err.Error())
+		return
+	}
+	sTime, _ := time.ParseInLocation(utils.FormatDateTime, matter.StartDate+" "+matter.StartTime, time.Now().Location())
+	startTime := sTime.Format("2006-01-02 15:04")
+	eTime, _ := time.ParseInLocation(utils.FormatDateTime, matter.EndDate+" "+matter.EndTime, time.Now().Location())
+	endTime := eTime.Format("2006-01-02 15:04")
+	err = CreatSHCalendar(lists[0].Mobile, lists[0].Mobile, matter.MatterContent, startTime, endTime, 2, matter.RsMattersId)
+	if err != nil {
+		return
+	}
+	if err != nil {
+		utils.SendEmail("研究员日历同步失败:", "新建上海研究员日历事项失败 "+err.Error(), utils.EmailSendToUsers)
+	} else {
+		updateParams := make(map[string]interface{})
+		whereParams := make(map[string]interface{})
+		updateParams["is_synced"] = 1
+		whereParams["rs_matters_id"] = matter.RsMattersId
+		err = roadshow.UpdateRsMatters(whereParams, updateParams)
+		if err != nil {
+			utils.FileLog.Info("UpdateRsMatters err: " + err.Error())
+			fmt.Println("UpdateRsMatters err: " + err.Error())
+			return
+		}
+	}
+}
+
+// CreatSHCalendar 新增上海日历活动
+func CreatSHCalendar(userPhone, toUserPhone, content, startTime, endTime string, calendarType int8, selfCalendarId int) (err error) {
+	token, err := GetAccessToken()
+	finalUrl := utils.CRM_OPEN_API_URL + "/v1/Calendar/create?access_token=" + token
+
+	//creditCode, err := rs.GetCreditCodeFromCompany(rsCalendar.CompanyId)
+	//if err != nil {
+	//	err = errors.New("GetCreditCodeFromCompany err:" + err.Error())
+	//	return
+	//}
+	//发送创建请求
+	resp, err := netHttp.PostForm(finalUrl, url.Values{"user_phone": {userPhone}, "to_user_phone": {toUserPhone},
+		"content": {content}, "start_time": {startTime}, "end_time": {endTime}})
+	if err != nil {
+		err = errors.New("NewRequest Err:" + err.Error())
+		return
+	}
+
+	defer resp.Body.Close()
+
+	//解析resp并且存入关联表
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		fmt.Println("reponse error", err)
+		return
+	}
+	var calendarResp roadshow.CreatSHCalendarResp
+	err = json.Unmarshal(body, &calendarResp)
+	if calendarResp.Code != 1 {
+		err = errors.New("Create SHCalendar err:" + calendarResp.Msg)
+		return
+	}
+	sThirdId := calendarResp.Data.CalendarID
+	thirdId, err := strconv.Atoi(sThirdId)
+	if err != nil {
+		err = errors.New("string to int Err:" + err.Error())
+		return
+	}
+	relationItem := roadshow.RsCalendarRelation{
+		UserPhone:        userPhone,
+		CalendarType:     calendarType,
+		SelfCalendarId:   selfCalendarId,
+		ThirdCalendarId:  thirdId,
+		Title:            content,
+		ResearcherMobile: toUserPhone,
+		ModifyTime:       time.Now(),
+		CreateTime:       time.Now(),
+	}
+	_, err = roadshow.AddRsCalendarRelation(&relationItem)
+	if err != nil {
+		err = errors.New("AddRsCalendarRelation Err:" + err.Error())
+		return
+	}
+	return
+}
+
+// UpdateSHCalendar 更新上海日历活动
+func UpdateSHCalendar(req roadshow.EditActivityReq) {
+	var err error
+	//需要同时修改创建人及研究员的日历
+	for _, researcher := range req.ResearcherList {
+		//查询关联表获取信息
+		var condition string
+		var pars []interface{}
+		condition = ` AND self_calendar_id = ? `
+		pars = append(pars, req.RsCalendarResearcherId)
+		relationItem, err := roadshow.GetRelationByPars(condition, pars)
+		if err != nil {
+			err = errors.New("GetRelationByPars err:" + err.Error())
+			go utils.SendEmail(utils.APPNAME+"上海关联表查询失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
+			fmt.Println(err)
+			return
+		}
+
+		sTime, _ := time.ParseInLocation(utils.FormatDateTime, researcher.StartDate+" "+researcher.StartTime, time.Now().Location())
+		startTime := sTime.Format("2006-01-02 15:04")
+		eTime, _ := time.ParseInLocation(utils.FormatDateTime, researcher.EndDate+" "+researcher.EndTime, time.Now().Location())
+		endTime := eTime.Format("2006-01-02 15:04")
+		title := getTitle(req.ActivityType, req.RoadshowType, req.ActivityCategory, req.RoadshowPlatform, req.Province, req.City)
+		//发送更新请求
+		body, err := updateSHCalendar(fmt.Sprintf("%v", relationItem.ThirdCalendarId), relationItem.ResearcherMobile, title, startTime, endTime)
+		if err != nil {
+			fmt.Println(err)
+		}
+
+		//解析resp判断请求结果是否成功
+		var calendarResp roadshow.CreatSHCalendarResp
+		err = json.Unmarshal(body, &calendarResp)
+		if calendarResp.Code != 1 {
+			err = errors.New("Update SHCalendar err:" + calendarResp.Msg)
+			fmt.Println(err)
+		}
+	}
+	if err != nil {
+		fmt.Println(err)
+		utils.SendEmail("研究员日历同步失败:", "更新上海研究员日历失败 "+err.Error(), utils.EmailSendToUsers)
+	} else {
+		whereParams := make(map[string]interface{})
+		updateParams := make(map[string]interface{})
+		whereParams["rs_calendar_researcher_id"] = req.RsCalendarResearcherId
+		updateParams["is_synced"] = 1
+		err = roadshow.UpdateCalendarResearcher(whereParams, updateParams)
+		if err != nil {
+			fmt.Println("UpdateCalendarResearcher err: ", err.Error())
+			return
+		}
+		calWhereParams := make(map[string]interface{})
+		calWhereParams["rs_calendar_id"] = req.RsCalendarId
+		err = roadshow.UpdateRsCalendar(calWhereParams, updateParams)
+		if err != nil {
+			fmt.Println("UpdateRsCalendar err: ", err.Error())
+			return
+		}
+	}
+}
+
+// UpdateSHCalendarByMatter 更新上海日历活动
+func UpdateSHCalendarByMatter(req roadshow.UpdateMattersReq) {
+	token, err := GetAccessToken()
+	finalUrl := utils.CRM_OPEN_API_URL + "/v1/Calendar/update?access_token=" + token
+
+	//需要同时修改创建人及研究员的日历
+	//查询关联表获取信息
+	var condition string
+	var pars []interface{}
+	condition = ` AND self_calendar_id = ? `
+	pars = append(pars, req.RsMattersId)
+	relationItem, err := roadshow.GetRelationByPars(condition, pars)
+	if err != nil {
+		err = errors.New("GetRelationByPars err:" + err.Error())
+		go utils.SendEmail(utils.APPNAME+"上海关联表查询失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
+		fmt.Println(err)
+		return
+	}
+
+	sTime, _ := time.ParseInLocation(utils.FormatDateTime, req.StartDate+" "+req.StartTime, time.Now().Location())
+	startTime := sTime.Format("2006-01-02 15:04")
+	eTime, _ := time.ParseInLocation(utils.FormatDateTime, req.EndDate+" "+req.EndTime, time.Now().Location())
+	endTime := eTime.Format("2006-01-02 15:04")
+	//发送更新请求
+	resp, err := netHttp.PostForm(finalUrl, url.Values{"calendar_id": {fmt.Sprintf("%v", relationItem.ThirdCalendarId)},
+		"to_user_phone": {relationItem.ResearcherMobile}, "content": {relationItem.Content}, "start_time": {startTime}, "end_time": {endTime}})
+	if err != nil {
+		err = errors.New("NewRequest Err:" + err.Error())
+		return
+	}
+	defer resp.Body.Close()
+
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		fmt.Println("reponse error", err)
+		return
+	}
+
+	//解析resp判断请求结果是否成功
+	var calendarResp roadshow.CreatSHCalendarResp
+	err = json.Unmarshal(body, &calendarResp)
+	if calendarResp.Code != 1 {
+		err = errors.New("Update SHCalendar err:" + calendarResp.Msg)
+		fmt.Println(err)
+	}
+	if err != nil {
+		go utils.SendEmail("研究员日历同步失败:", "更新上海研究员日历失败 "+err.Error(), utils.EmailSendToUsers)
+	} else {
+		updateParams := make(map[string]interface{})
+		whereParams := make(map[string]interface{})
+		updateParams["is_synced"] = 1
+		whereParams["rs_matters_id"] = req.RsMattersId
+		err = roadshow.UpdateRsMatters(whereParams, updateParams)
+		if err != nil {
+			utils.FileLog.Info("UpdateRsMatters err: " + err.Error())
+			fmt.Println("UpdateRsMatters err: " + err.Error())
+			return
+		}
+	}
+}
+
+// updateSHCalendar 内部函数,只用于发送修改上海日历的http请求
+func updateSHCalendar(thirdCalendarId, researcherMobile, content, startTime, endTime string) (body []byte, err error) {
+	token, err := GetAccessToken()
+	finalUrl := utils.CRM_OPEN_API_URL + "/v1/Calendar/update?access_token=" + token
+	resp, respErr := netHttp.PostForm(finalUrl, url.Values{"calendar_id": {thirdCalendarId},
+		"to_user_phone": {researcherMobile}, "content": {content}, "start_time": {startTime}, "end_time": {endTime}})
+	if respErr != nil {
+		respErr = errors.New("NewRequest Err:" + respErr.Error())
+		return
+	}
+	defer resp.Body.Close()
+
+	body, bodyErr := ioutil.ReadAll(resp.Body)
+	if bodyErr != nil {
+		fmt.Println("reponse error", bodyErr)
+		return
+	}
+	return
+}
+
+// DeleteSHCalendar 删除上海日历活动
+func DeleteSHCalendar(rsCalendarResearcherId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			go utils.SendEmail(utils.APPNAME+"删除上海日历活动失败:"+time.Now().Format("2006-01-02 15:04:05"), fmt.Sprint("关系id:", rsCalendarResearcherId, ";err:", err.Error()), utils.EmailSendToUsers)
+		}
+	}()
+
+	token, err := GetAccessToken()
+	finalUrl := utils.CRM_OPEN_API_URL + "/v1/Calendar/delete?access_token=" + token
+
+	var condition string
+	var pars []interface{}
+	condition = ` AND self_calendar_id = ? `
+	pars = append(pars, rsCalendarResearcherId)
+	relationItem, err := roadshow.GetRelationByPars(condition, pars)
+	if err != nil {
+		err = errors.New("GetRelationByPars err" + err.Error())
+		go utils.SendEmail(utils.APPNAME+"上海关联表查询失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
+		return
+	}
+	resp, err := netHttp.PostForm(finalUrl, url.Values{"user_phone": {relationItem.UserPhone}, "calendar_id": {fmt.Sprintf("%v", relationItem.ThirdCalendarId)}})
+	if err != nil {
+		err = errors.New("NewRequest Err:" + err.Error())
+		return
+	}
+	defer resp.Body.Close()
+
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		fmt.Println("reponse error", err)
+		return
+	}
+	//解析resp判断请求结果是否成功
+	var calendarResp roadshow.CreatSHCalendarResp
+	err = json.Unmarshal(body, &calendarResp)
+	if calendarResp.Code != 1 {
+		err = errors.New("Update SHCalendar err:" + calendarResp.Msg)
+		return
+	}
+	//删除活动表及事项表
+	err = roadshow.DeleteRsCalendarRelation(relationItem.RelationId)
+	if err != nil {
+		err = errors.New("DeleteRsCalendarRelation err:" + err.Error())
+		return
+	}
+	if err != nil {
+		//发送邮件解决异常
+		utils.SendEmail("研究员日历同步失败:", "删除上海研究员日历失败 "+err.Error(), utils.EmailSendToUsers)
+		//fmt.Println("DeleteSHCalendar err:",err.Error())
+	}
+}
+
+// DeleteSHMatter 删除上海日历事项
+func DeleteSHMatter(matterId int) {
+	token, err := GetAccessToken()
+	finalUrl := utils.CRM_OPEN_API_URL + "/v1/Calendar/delete?access_token=" + token
+
+	var condition string
+	var pars []interface{}
+	condition = ` AND self_calendar_id = ? `
+	pars = append(pars, matterId)
+	relationItem, err := roadshow.GetRelationByPars(condition, pars)
+	if err != nil {
+		err = errors.New("GetRelationByPars err" + err.Error())
+		go utils.SendEmail(utils.APPNAME+"上海关联表查询失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
+		return
+	}
+	resp, err := netHttp.PostForm(finalUrl, url.Values{"user_phone": {relationItem.UserPhone}, "calendar_id": {fmt.Sprintf("%v", relationItem.ThirdCalendarId)}})
+	if err != nil {
+		err = errors.New("NewRequest Err:" + err.Error())
+		return
+	}
+	defer resp.Body.Close()
+
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		fmt.Println("reponse error", err)
+		return
+	}
+	//解析resp判断请求结果是否成功
+	var calendarResp roadshow.CreatSHCalendarResp
+	err = json.Unmarshal(body, &calendarResp)
+	if calendarResp.Code != 1 {
+		err = errors.New("Update SHCalendar err:" + calendarResp.Msg)
+		return
+	}
+	//删除活动表及事项表
+	err = roadshow.DeleteRsCalendarRelation(relationItem.RelationId)
+	if err != nil {
+		err = errors.New("DeleteRsCalendarRelation err:" + err.Error())
+		return
+	}
+	if err != nil {
+		//发送邮件解决异常
+		utils.SendEmail("研究员日历同步失败:", "删除上海研究员日历失败 "+err.Error(), utils.EmailSendToUsers)
+		//fmt.Println("DeleteSHCalendar err:",err.Error())
+	}
+}
+
+// SyncCalendarFromShanghai 上海路演数据同步到自系统
+func SyncCalendarFromShanghai(userPhone, startDate, endDate string) (err error) {
+	errMsg := ``
+	defer func() {
+		if errMsg != `` {
+			//fmt.Println("err:", errMsg)
+			go utils.SendEmail(utils.APPNAME+"上海路演数据同步到自系统失败:"+time.Now().Format("2006-01-02 15:04:05"), errMsg, utils.EmailSendToUsers)
+		}
+	}()
+	//fmt.Println(userPhone, startDate, endDate)
+	endDateTime, err := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
+	if err != nil {
+		errMsg = `结束日期转time类型失败,err:` + err.Error()
+		return
+	}
+	currDay := time.Now().Format(utils.FormatDate)
+	nowDateTime, _ := time.ParseInLocation(utils.FormatDate, currDay, time.Local)
+	//如果传入的结束日期早于当前日期,那么就不去查询了
+	if endDateTime.Before(nowDateTime) {
+		return
+	}
+	//以当前日期作为起始日期去同步
+	list, err := getCalendarFrom(userPhone, currDay, endDate)
+	if err != nil {
+		errMsg = "获取第三方路演日历数据失败,err:" + err.Error()
+		return
+	}
+	thirdIdList := make([]int, 0)
+	if len(list) > 0 {
+		for _, v := range list {
+			thirdIdList = append(thirdIdList, v.ID)
+		}
+		rsCalendarRelationList, tmpErr := roadshow.GetRsCalendarRelationListByThirdIds(thirdIdList)
+		if tmpErr != nil {
+			err = tmpErr
+			errMsg = "获取关联列表失败,err:" + tmpErr.Error()
+			return
+		}
+
+		rsCalendarRelationMap := make(map[int]*roadshow.RsCalendarRelation)
+		for _, rsCalendarRelation := range rsCalendarRelationList {
+			rsCalendarRelationMap[rsCalendarRelation.ThirdCalendarId] = rsCalendarRelation
+		}
+
+		for _, v := range list {
+			fmt.Println(v)
+			thirdIdList = append(thirdIdList, v.ID)
+			if rsCalendarRelation, ok := rsCalendarRelationMap[v.ID]; ok {
+				//存在的话,那么就去查找对应的信息
+				if rsCalendarRelation.CalendarType == 1 {
+					//路演
+					rsCalendarResearcherInfo, tmpErr := roadshow.GetRsCalendarResearcherById(rsCalendarRelation.SelfCalendarId)
+					if tmpErr != nil {
+						errMsg += fmt.Sprint("第三方日历ID:", v.ID, "获取路演研究员信息失败;err:"+tmpErr.Error(), ";")
+						continue
+					}
+					rsCalendarInfo, tmpErr := roadshow.GetRsCalendarById(rsCalendarResearcherInfo.RsCalendarId)
+					if tmpErr != nil {
+						errMsg += fmt.Sprint("第三方日历ID:", v.ID, "获取路演信息失败;err:"+tmpErr.Error(), ";")
+						continue
+					}
+					if rsCalendarInfo.Source == 0 { //自系统创建的路演活动,不需要依靠上海方来修改
+						continue
+					}
+
+					//是否去同步变更数据库
+					isUpdateSync := false
+
+					//是否变更
+					isUpdate := false
+					if v.StartTime != rsCalendarRelation.StartTime {
+						isUpdate = true
+					}
+					if v.EndTime != rsCalendarRelation.EndTime {
+						isUpdate = true
+					}
+					if v.Title != rsCalendarRelation.Title {
+						isUpdate = true
+					}
+
+					researcherList := make([]admin.Admin, 0)
+					researcherMap := make(map[int]admin.Admin)
+
+					addResearcherList := make([]admin.Admin, 0)                  // 需要新增的研究员
+					delResearcherIdList := make([]int, 0)                             //需要删除的路演活动与研究员的关系id
+					updateResearcherList := make([]*roadshow.RsCalendarResearcher, 0) //待更新的路演活动中研究员信息
+
+					if v.ResearcherMobile != rsCalendarRelation.ResearcherMobile {
+						//研究员变更了,需要去改表
+						isUpdateSync = true
+
+						researcherMobileList := strings.Split(v.ResearcherMobile, ",")
+						if len(researcherMobileList) > 0 {
+							for _, mobile := range researcherMobileList {
+								researcherInfo, tmpErr := getAdminInfo(mobile)
+								if tmpErr != nil {
+									errMsg += fmt.Sprint("第三方日历ID:", v.ID, "获取研究员失败,研究员手机号:", mobile, ";err:"+tmpErr.Error(), ";")
+									continue
+								}
+								if researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_RESEARCHR ||
+									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 {
+									researcherList = append(researcherList, researcherInfo)
+
+									researcherMap[researcherInfo.AdminId] = researcherInfo
+								}
+							}
+						}
+
+						//没有研究员
+						if len(researcherList) <= 0 {
+							errMsg += fmt.Sprint("第三方日历ID:", v.ID, ";对方研究员信息失败;")
+							continue
+						}
+
+						rsCalendarResearcherList, tmpErr := roadshow.GetRsCalendarResearcherListByRsCalendarId(rsCalendarInfo.RsCalendarId)
+						if tmpErr != nil {
+							errMsg += fmt.Sprint("第三方日历ID:", v.ID, "获取路演活动中的研究员列表失败,路演活动ID:", rsCalendarInfo.RsCalendarId, ";err:"+tmpErr.Error(), ";")
+							continue
+						}
+
+						//现有活动中的研究员
+						rsCalendarResearcherMap := make(map[int]*roadshow.RsCalendarResearcher)
+						for _, rsCalendarResearcher := range rsCalendarResearcherList {
+							if _, ok := researcherMap[rsCalendarResearcher.ResearcherId]; ok {
+								if isUpdate {
+									updateResearcherList = append(updateResearcherList, rsCalendarResearcher)
+								}
+							} else {
+								delResearcherIdList = append(delResearcherIdList, rsCalendarResearcher.RsCalendarResearcherId)
+							}
+
+							rsCalendarResearcherMap[rsCalendarResearcher.ResearcherId] = rsCalendarResearcher
+						}
+
+						//校验是否需要新增研究员
+						for adminId, researcherInfo := range researcherMap {
+							//如果
+							if _, ok := rsCalendarResearcherMap[adminId]; !ok {
+								addResearcherList = append(addResearcherList, researcherInfo)
+							}
+						}
+					} else if isUpdate { //如果有字段更新,那么需要将所有的研究员信息更新
+						isUpdateSync = true
+
+						rsCalendarResearcherList, tmpErr := roadshow.GetRsCalendarResearcherListByRsCalendarId(rsCalendarInfo.RsCalendarId)
+						if tmpErr != nil {
+							errMsg += fmt.Sprint("第三方日历ID:", v.ID, "获取路演活动中的研究员列表失败,路演活动ID:", rsCalendarInfo.RsCalendarId, ";err:"+tmpErr.Error(), ";")
+							continue
+						}
+						for _, rsCalendarResearcher := range rsCalendarResearcherList {
+							updateResearcherList = append(updateResearcherList, rsCalendarResearcher)
+						}
+					}
+
+					if isUpdateSync {
+						tmpErr = roadshow.UpdateSyncRsCalendarRelation(v, rsCalendarInfo, rsCalendarRelation, updateResearcherList, delResearcherIdList, addResearcherList)
+						if tmpErr != nil {
+							err = tmpErr
+							errMsg += fmt.Sprint("第三方日历ID:", v.ID, "修改关联关系失败;err:"+tmpErr.Error(), ";")
+							return
+						}
+					}
+				} else {
+					//事项
+					//事项都是由自系统创建的,不需要依靠上海方来修改
+				}
+			} else {
+				//数据不存在
+				createUser, tmpErr := getAdminInfo(v.UserPhone)
+				if tmpErr != nil {
+					errMsg += fmt.Sprint("第三方日历ID:", v.ID, "获取创建人失败,创建人手机号:", v.UserPhone, ";err:"+tmpErr.Error(), ";")
+					continue
+				}
+
+				//研究员列表
+				researcherList := make([]admin.Admin, 0)
+				researcherMobileList := strings.Split(v.ResearcherMobile, ",")
+				if len(researcherMobileList) > 0 {
+					for _, mobile := range researcherMobileList {
+						researcherInfo, tmpErr := getAdminInfo(mobile)
+						if tmpErr != nil {
+							errMsg += fmt.Sprint("第三方日历ID:", v.ID, "获取研究员失败,研究员手机号:", mobile, ";err:"+tmpErr.Error(), ";")
+							continue
+						}
+						if researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_RESEARCHR ||
+							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 {
+							researcherList = append(researcherList, researcherInfo)
+						}
+					}
+				}
+
+				//没有研究员
+				if len(researcherList) <= 0 {
+					continue
+				}
+				//数据入库
+				tmpErr = roadshow.SyncRsCalendarRelation(v, createUser, researcherList)
+				if tmpErr != nil {
+					err = tmpErr
+					errMsg += fmt.Sprint("第三方日历ID:", v.ID, "绑定关联关系失败;err:"+tmpErr.Error(), ";")
+					return
+				}
+				//fmt.Println("createUser:", createUser)
+			}
+
+		}
+	}
+	return
+}
+
+// CreateOaUser 新增系统用户
+func CreateOaUser(mobile, username string, groupId int) (err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendEmail(utils.APPNAME+"系统用户同步到上海失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+	token, err := GetAccessToken()
+	finalUrl := utils.CRM_OPEN_API_URL + "/v1/OaUser/create?access_token=" + token
+
+	//发送创建请求
+	form := url.Values{}
+	form.Add("mobile", mobile)
+	form.Add("username", username)
+	form.Add("group_id", fmt.Sprint(groupId))
+	resp, err := netHttp.PostForm(finalUrl, form)
+	fmt.Println("form:", form)
+
+	if err != nil {
+		err = errors.New("NewRequest Err:" + err.Error())
+		return
+	}
+
+	defer resp.Body.Close()
+
+	//解析resp并且存入关联表
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		fmt.Println("reponse error", err)
+		return
+	}
+	fmt.Println("body:", string(body))
+	var calendarResp roadshow.CreatSHCalendarResp
+	err = json.Unmarshal(body, &calendarResp)
+	if calendarResp.Code != 1 {
+		err = errors.New("Create SHCalendar err:" + calendarResp.Msg)
+		return
+	}
+	return
+}
+
+// getAdminInfo 通过手机号获取用户信息
+func getAdminInfo(mobile string) (adminInfo admin.Admin, err error) {
+	adminMap := make(map[string]admin.Admin)
+	redisAdminData, redisErr := utils.Rc.RedisString(utils.CACHE_KEY_ADMIN)
+	if redisErr != nil {
+		list, err := admin.GetSysuserList("", []interface{}{}, 0, 1000)
+		//	GetSysuserList
+		for _, tmpAdminInfo := range list {
+			adminMap[tmpAdminInfo.Mobile] = *tmpAdminInfo
+		}
+
+		//入缓存
+		redisJsonData, err := json.Marshal(adminMap)
+		if err == nil {
+			_ = utils.Rc.Put(utils.CACHE_KEY_ADMIN, string(redisJsonData), time.Minute*30)
+		}
+	} else {
+		err := json.Unmarshal([]byte(redisAdminData), &adminMap)
+		if err != nil {
+			fmt.Println("用户数据,json转换失败:", err)
+		}
+	}
+	adminInfo, ok := adminMap[mobile]
+	if !ok {
+		err = fmt.Errorf("找不到该手机号用户,mobile:" + mobile)
+	}
+
+	return
+}
+
+func getTitle(activityType, roadshowType, activityCategory, roadshowPlatform, province, city string) string {
+	var title string
+	switch activityType {
+	case "内部会议":
+		title = "内部会议"
+	case "公开会议", "路演":
+		if roadshowType == "线上" {
+			title = roadshowType + activityType + roadshowPlatform
+		} else {
+			title = roadshowType + activityType + province + city
+		}
+	case "报告电话会":
+		title = activityCategory + "电话会"
+	}
+	return title
+}
+
+// GetAllActivityType 获取全部的活动分类
+func GetAllActivityType() (list []*roadshow.ActivityTypeList, err error) {
+	list, err = roadshow.GetActivityTypeListByActivityTypePId(0)
+	if err != nil {
+		return
+	}
+
+	for _, v := range list {
+		tmpList, tmpErr := roadshow.GetActivityTypeListByActivityTypePId(v.ActivityTypeId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		v.ChildList = tmpList
+	}
+	return
+}

+ 83 - 0
services/rs/calendar_check.go

@@ -0,0 +1,83 @@
+package rs
+
+import "hongze/hongze_mobile_admin/models/roadshow"
+
+func CheckMatters(startDateTime, endDateTime string, researcherId, rsMattersId int) (matterCount int, err error) {
+	var matterCondition string
+	var matterPars []interface{}
+	if rsMattersId > 0 {
+		matterCondition += " AND rs_matters_id <> ? "
+		matterPars = append(matterPars, rsMattersId)
+	}
+	matterCondition += " AND sys_user_id = ? "
+	matterPars = append(matterPars, researcherId)
+
+	matterCondition += ` 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') )))`
+	matterPars = append(matterPars, startDateTime)
+	matterPars = append(matterPars, startDateTime)
+	matterPars = append(matterPars, endDateTime)
+	matterPars = append(matterPars, endDateTime)
+	matterCount, err = roadshow.CheckMattersCount(matterCondition, matterPars)
+
+	if matterCount <= 0 {
+		var matterCondition string
+		var matterPars []interface{}
+		if rsMattersId > 0 {
+			matterCondition += " AND rs_matters_id <> ? "
+			matterPars = append(matterPars, rsMattersId)
+		}
+		matterCondition += " AND sys_user_id = ? "
+		matterPars = append(matterPars, researcherId)
+
+		matterCondition += ` 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') `
+		matterPars = append(matterPars, startDateTime)
+		matterPars = append(matterPars, endDateTime)
+		matterCount, err = roadshow.CheckMattersCount(matterCondition, matterPars)
+	}
+
+	return
+}
+
+func CheckCalendar(startDateTime, endDateTime, status string, researcherId, rsCalendarResearcherId int) (calendarCount int, err error) {
+	var researcherCondition string
+	var researcherMatterPars []interface{}
+
+	if rsCalendarResearcherId > 0 {
+		researcherCondition += " AND rs_calendar_researcher_id <> ? "
+		researcherMatterPars = append(researcherMatterPars, rsCalendarResearcherId)
+	}
+
+	researcherCondition += " AND researcher_id = ? "
+	researcherMatterPars = append(researcherMatterPars, researcherId)
+
+	researcherCondition += " AND 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.CheckCalendarResearcherCount(researcherCondition, researcherMatterPars)
+	if calendarCount <= 0 {
+		var researcherCondition string
+		var researcherMatterPars []interface{}
+
+		if rsCalendarResearcherId > 0 {
+			researcherCondition += " AND rs_calendar_researcher_id <> ? "
+			researcherMatterPars = append(researcherMatterPars, rsCalendarResearcherId)
+		}
+
+		researcherCondition += " AND researcher_id = ? "
+		researcherMatterPars = append(researcherMatterPars, researcherId)
+
+		researcherCondition += " AND 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') `
+		researcherMatterPars = append(researcherMatterPars, startDateTime)
+		researcherMatterPars = append(researcherMatterPars, endDateTime)
+		calendarCount, err = roadshow.CheckCalendarResearcherCount(researcherCondition, researcherMatterPars)
+	}
+	return
+}

+ 122 - 3
services/wechat_send_msg.go

@@ -102,7 +102,7 @@ func sendTemplateMsg(sendUrl string, sendMap map[string]interface{}, items []*wx
 }
 
 func toSendTemplateMsg(sendUrl string, data []byte) (err error) {
-	utils.FileLog.Info("Send:%s", string(data))
+	utils.FileLog.Info("Send:"+string(data))
 	client := http.Client{}
 	resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
 	if err != nil {
@@ -111,7 +111,7 @@ func toSendTemplateMsg(sendUrl string, data []byte) (err error) {
 	defer resp.Body.Close()
 
 	body, _ := ioutil.ReadAll(resp.Body)
-	utils.FileLog.Info("SendResult:%s", string(body))
+	utils.FileLog.Info("SendResult:"+string(body))
 	var templateResponse SendTemplateResponse
 	err = json.Unmarshal(body, &templateResponse)
 	if err != nil {
@@ -267,4 +267,123 @@ func SendWxMsgWithRoadshowDetailResult(first, keyword1, keyword2, remark,mobile,
 	}
 	utils.FileLog.Info("send end")
 	return
-}
+}
+
+
+// 路演->研究员收到待处理的申请
+func SendWxMsgWithRoadshowPending(first, keyword1, keyword2, keyword3, keyword4, remark, wxAppPath,mobile string) (err error) {
+	//utils.WxMsgTemplateIdWithRoadshowPending
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			utils.FileLog.Info("发送模版消息失败,Err:"+err.Error()+msg)
+		}
+		if msg != "" {
+			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+		}
+	}()
+	utils.FileLog.Info("%s", "services SendMsg")
+
+	accessToken, err := WxGetAccessToken()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+
+	//获取openid列表
+	openIdStr := WxUsersGet()
+	openIdList, err := wx_user.GetOpenIdListByMobile(mobile, openIdStr)
+	if err != nil {
+		msg = "get openIdList err:" + err.Error()
+		return
+	}
+	utils.FileLog.Info("openIdListCount:%s", len(openIdList))
+	//fmt.Println("openIdListCount:", len(openIdList))
+	if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
+		utils.FileLog.Info("start send")
+		sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+		fmt.Println("send start")
+		utils.FileLog.Info("send start")
+		sendMap := make(map[string]interface{})
+		sendData := make(map[string]interface{})
+
+
+		sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+		sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
+		sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
+		sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
+		sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
+		sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
+
+		sendMap["template_id"] = utils.WxMsgTemplateIdWithRoadshowPending
+		sendMap["data"] = sendData
+		//小程序信息
+		if wxAppPath != "" {
+			sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId2, "pagepath": wxAppPath}
+		}
+		sendTemplateMsg(sendUrl, sendMap, openIdList)
+	}
+	utils.FileLog.Info("send end")
+	return
+}
+
+
+// 路演->研究员收到活动删除通知
+func SendWxMsgWithRoadshowDeleteNotice(first, keyword1, keyword2, remark, wxAppPath,mobile string) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
+		}
+		if msg != "" {
+			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+		}
+	}()
+	utils.FileLog.Info("%s", "services SendMsg")
+
+	accessToken, err := WxGetAccessToken()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+
+	//获取openid列表
+	openIdStr := WxUsersGet()
+	openIdList, err := wx_user.GetOpenIdListByMobile(mobile, openIdStr)
+	if err != nil {
+		msg = "get openIdList err:" + err.Error()
+		return
+	}
+	utils.FileLog.Info("openIdListCount:%s", len(openIdList))
+	//fmt.Println("openIdListCount:", len(openIdList))
+	if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
+		utils.FileLog.Info("start send")
+		sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+		sendMap := make(map[string]interface{})
+		sendData := make(map[string]interface{})
+
+		sendMap["template_id"] = utils.WxMsgTemplateIdWithRoadshowDeleteNotice
+		sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+		sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
+		sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
+		sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
+		//小程序信息
+		if wxAppPath != "" {
+			sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId2, "pagepath": wxAppPath}
+		}
+		sendMap["data"] = sendData
+		sendTemplateMsg(sendUrl, sendMap, openIdList)
+	}
+	utils.FileLog.Info("send end")
+	return
+}

+ 0 - 0
swagger.zip


二进制
swagger/favicon-16x16.png


二进制
swagger/favicon-32x32.png


+ 93 - 0
swagger/index.html

@@ -0,0 +1,93 @@
+<!-- HTML for static distribution bundle build -->
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <title>Swagger UI</title>
+  <link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700" rel="stylesheet">
+  <link rel="stylesheet" type="text/css" href="./swagger-ui.css" >
+  <link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32" />
+  <link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16" />
+  <style>
+    html
+    {
+        box-sizing: border-box;
+        overflow: -moz-scrollbars-vertical;
+        overflow-y: scroll;
+    }
+    *,
+    *:before,
+    *:after
+    {
+        box-sizing: inherit;
+    }
+
+    body {
+      margin:0;
+      background: #fafafa;
+    }
+  </style>
+</head>
+
+<body>
+
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position:absolute;width:0;height:0">
+  <defs>
+    <symbol viewBox="0 0 20 20" id="unlocked">
+          <path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z"></path>
+    </symbol>
+
+    <symbol viewBox="0 0 20 20" id="locked">
+      <path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z"/>
+    </symbol>
+
+    <symbol viewBox="0 0 20 20" id="close">
+      <path d="M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z"/>
+    </symbol>
+
+    <symbol viewBox="0 0 20 20" id="large-arrow">
+      <path d="M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z"/>
+    </symbol>
+
+    <symbol viewBox="0 0 20 20" id="large-arrow-down">
+      <path d="M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z"/>
+    </symbol>
+
+
+    <symbol viewBox="0 0 24 24" id="jump-to">
+      <path d="M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z"/>
+    </symbol>
+
+    <symbol viewBox="0 0 24 24" id="expand">
+      <path d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>
+    </symbol>
+
+  </defs>
+</svg>
+
+<div id="swagger-ui"></div>
+
+<script src="./swagger-ui-bundle.js"> </script>
+<script src="./swagger-ui-standalone-preset.js"> </script>
+<script>
+window.onload = function() {
+  // Build a system
+  const ui = SwaggerUIBundle({
+    url: "swagger.json",
+    dom_id: '#swagger-ui',
+    presets: [
+      SwaggerUIBundle.presets.apis,
+      SwaggerUIStandalonePreset
+    ],
+    plugins: [
+      SwaggerUIBundle.plugins.DownloadUrl
+    ],
+    layout: "StandaloneLayout"
+  })
+
+  window.ui = ui
+}
+</script>
+</body>
+
+</html>

+ 53 - 0
swagger/oauth2-redirect.html

@@ -0,0 +1,53 @@
+<!doctype html>
+<html lang="en-US">
+<body onload="run()">
+</body>
+</html>
+<script>
+    'use strict';
+    function run () {
+        var oauth2 = window.opener.swaggerUIRedirectOauth2;
+        var sentState = oauth2.state;
+        var isValid, qp, arr;
+
+        qp = (window.location.hash || location.search).substring(1);
+
+        arr = qp.split("&")
+        arr.forEach(function (v,i,_arr) { _arr[i] = '"' + v.replace('=', '":"') + '"';})
+        qp = qp ? JSON.parse('{' + arr.join() + '}',
+                function (key, value) {
+                    return key === "" ? value : decodeURIComponent(value)
+                }
+        ) : {}
+
+        isValid = qp.state === sentState
+
+        if (oauth2.auth.schema.get("flow") === "accessCode" && !oauth2.auth.code) {
+            if (!isValid) {
+                oauth2.errCb({
+                    authId: oauth2.auth.name,
+                    source: "auth",
+                    level: "warning",
+                    message: "Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"
+                });
+            }
+
+            if (qp.code) {
+                delete oauth2.state;
+                oauth2.auth.code = qp.code;
+                oauth2.callback(oauth2.auth);
+            } else {
+                oauth2.errCb({
+                    authId: oauth2.auth.name,
+                    source: "auth",
+                    level: "error",
+                    message: "Authorization failed: no accessCode received from the server"
+                });
+            }
+        } else {
+            oauth2.callback({auth: oauth2.auth, token: qp, isValid: isValid});
+        }
+        window.close();
+    }
+
+</script>

文件差异内容过多而无法显示
+ 0 - 0
swagger/swagger-ui-bundle.js


+ 1 - 0
swagger/swagger-ui-bundle.js.map

@@ -0,0 +1 @@
+{"version":3,"file":"swagger-ui-bundle.js","sources":["webpack:///swagger-ui-bundle.js"],"mappings":"AAAA;AAu/FA;AA6+FA;;;;;;;;;;;;;;;;;;;;;;;;;;AAyTA;;;;;;AAoIA;AAi7FA;AAmtCA;AAi0IA;AA0oJA;AAgwFA;AAyrGA;AA0lFA;AA4nFA;AA+9CA;AA+gDA;AAwrCA;AA60EA;;;;;AA6oCA;AAsyJA;;;;;;;;;;;;;;AA64EA;AA4mIA;AAquJA;AA2qHA;AA2mGA;AAiiEA;AAq4DA;AAg3DA;AAoPA;;;;;;AAk7FA;AA07FA;;;;;AAi8CA;AAgsFA;AAs2CA;AAglCA;AAu9CA;AAy8EA;AAsiCA;AA+yFA;;;;;;;;;AAgkDA;AA2zIA;AAu7FA;AAmrFA;AAu0EA","sourceRoot":""}

文件差异内容过多而无法显示
+ 0 - 0
swagger/swagger-ui-standalone-preset.js


文件差异内容过多而无法显示
+ 0 - 0
swagger/swagger-ui.css


+ 1 - 0
swagger/swagger-ui.css.map

@@ -0,0 +1 @@
+{"version":3,"file":"swagger-ui.css","sources":[],"mappings":"","sourceRoot":""}

文件差异内容过多而无法显示
+ 0 - 0
swagger/swagger-ui.js


+ 4574 - 0
swagger/swagger.json

@@ -0,0 +1,4574 @@
+{
+    "swagger": "2.0",
+    "info": {
+        "title": "弘则手机端管理后台接口",
+        "description": "这是弘则手机端管理后台接口api文档,统一出、入参;出参格式:{\"code\":200,\"data\":{},\"msg\":\"操作成功\",\"errMsg\":\"开发人员查看的错误信息\"},code是业务响应码,200 代表正常返回;400 代表业务处理失败,前端同学需要做额外逻辑处理;401 代表token异常,用户需要重新静默授权,获取最新的token;403代表用户需要进行绑定操作,需要跳转到输入账号密码绑定页面。同时如果出现其他返回值(没有在约定范围内),那么及时联系后端同事;msg是用来提示前端同学,一般只在code为 400 的情况下才会展示给用户去看;data是业务返回数据,给前端做逻辑处理。",
+        "version": "1.0.0",
+        "termsOfService": "http://beego.me/",
+        "contact": {
+            "email": "astaxie@gmail.com"
+        },
+        "license": {
+            "name": "Apache 2.0",
+            "url": "http://www.apache.org/licenses/LICENSE-2.0.html"
+        }
+    },
+    "basePath": "/h5adminapi",
+    "paths": {
+        "/admin/login": {
+            "post": {
+                "tags": [
+                    "admin"
+                ],
+                "description": "用户账号、密码登录接口",
+                "operationId": "AdminCommon.用户账号、密码登录接口",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/admin.LoginReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/admin.LoginResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/admin/logout": {
+            "post": {
+                "tags": [
+                    "admin"
+                ],
+                "description": "用户退出登录接口",
+                "operationId": "AdminCommon.用户退出登录接口",
+                "responses": {
+                    "Ret=200": {
+                        "description": "退出成功"
+                    }
+                }
+            }
+        },
+        "/approval/approve": {
+            "post": {
+                "tags": [
+                    "approval"
+                ],
+                "description": "审批接口",
+                "operationId": "ApprovalCommon.审批",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/approval.CompanyApplyApproveReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "审批成功"
+                    }
+                }
+            }
+        },
+        "/approval/approve_old": {
+            "post": {
+                "tags": [
+                    "approval"
+                ],
+                "description": "审批接口",
+                "operationId": "ApprovalCommon.审批",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/approval.CompanyApplyApproveReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "审批成功"
+                    }
+                }
+            }
+        },
+        "/approval/company_list": {
+            "get": {
+                "tags": [
+                    "approval"
+                ],
+                "description": "获取合同详情接口",
+                "operationId": "ApprovalCommon.根据客户名称获取已存在合同系统中客户名称列表",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "Keyword",
+                        "description": "搜索关键字:客户名称、组织社会信用码",
+                        "required": true,
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "type": "array",
+                            "items": {
+                                "type": "string"
+                            }
+                        }
+                    }
+                }
+            }
+        },
+        "/approval/detail": {
+            "get": {
+                "tags": [
+                    "approval"
+                ],
+                "description": "获取审批单详情接口",
+                "operationId": "ApprovalCommon.获取审批单详情接口",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "ApprovalId",
+                        "description": "审批单id",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/approval.CompanyApprovalDetailResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/approval/detail_old": {
+            "get": {
+                "tags": [
+                    "approval"
+                ],
+                "description": "获取审批单详情接口",
+                "operationId": "ApprovalCommon.获取审批单详情接口",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "ApprovalId",
+                        "description": "审批单id",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/approval.CompanyApprovalDetailResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/approval/flowDetail": {
+            "get": {
+                "tags": [
+                    "approval"
+                ],
+                "description": "获取审批流详情接口",
+                "operationId": "ApprovalCommon.获取审批流详情接口",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "FlowId",
+                        "description": "审批流程id;1:ficc客户审批;2:权益客户审批;3:ficc合同审批,4:权益合同审批,5:用印审批(合同章),6:用印审批(公章、法人章)",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/approval_flow.ApprovalFlowItem"
+                        }
+                    }
+                }
+            }
+        },
+        "/approval/getApprovalPermissionList": {
+            "get": {
+                "tags": [
+                    "approval"
+                ],
+                "description": "获取审批单中的权限列表接口",
+                "operationId": "ApprovalCommon.获取审批单中的权限列表",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "ApprovalId",
+                        "description": "审批单id",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/approval.CompanyPermissionResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/approval/list": {
+            "get": {
+                "tags": [
+                    "approval"
+                ],
+                "description": "获取审批列表接口",
+                "operationId": "ApprovalCommon.获取审批列表接口",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "PageSize",
+                        "description": "每页数据条数",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "CurrentIndex",
+                        "description": "当前页页码,从1开始",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Status",
+                        "description": "状态:'待审批','已审批','驳回','已撤回'",
+                        "required": true,
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "KeyWord",
+                        "description": "搜索关键词",
+                        "required": true,
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Keyword",
+                        "description": "搜索关键词",
+                        "required": true,
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "KeywordEq",
+                        "description": "搜索关键词(全等)",
+                        "required": true,
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/approval.CompanyApprovalListResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/approval/list_old": {
+            "get": {
+                "tags": [
+                    "approval"
+                ],
+                "description": "获取审批列表接口",
+                "operationId": "ApprovalCommon.获取审批列表接口",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "PageSize",
+                        "description": "每页数据条数",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "CurrentIndex",
+                        "description": "当前页页码,从1开始",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Status",
+                        "description": "状态:'待审批','已审批','驳回','已撤回'",
+                        "required": true,
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "KeyWord",
+                        "description": "搜索关键词",
+                        "required": true,
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Keyword",
+                        "description": "搜索关键词",
+                        "required": true,
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "KeywordEq",
+                        "description": "搜索关键词(全等)",
+                        "required": true,
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/approval.CompanyApprovalListResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/company_contract/detail": {
+            "get": {
+                "tags": [
+                    "company_contract"
+                ],
+                "description": "合同详情接口",
+                "operationId": "CompanyContractCommon.合同详情详情",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "CompanyId",
+                        "description": "客户ID",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "CompanyContractId",
+                        "description": "合同id",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/company_contract.CompanyContractDetailResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/contract/companyListBySeal": {
+            "get": {
+                "tags": [
+                    "contract"
+                ],
+                "description": "获取合同详情接口",
+                "operationId": "ContractCommon.根据客户名称获取已存在合同系统中客户名称列表",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "CompanyName",
+                        "description": "客户名称",
+                        "required": true,
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Keyword",
+                        "description": "关键字:客户名称、社会信用码",
+                        "required": true,
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Status",
+                        "description": "合同状态",
+                        "required": true,
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "type": "array",
+                            "items": {
+                                "type": "string"
+                            }
+                        }
+                    }
+                }
+            }
+        },
+        "/contract/company_list": {
+            "get": {
+                "tags": [
+                    "contract"
+                ],
+                "description": "获取合同详情接口",
+                "operationId": "ContractCommon.根据客户名称获取已存在合同系统中客户名称列表",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "CompanyName",
+                        "description": "客户名称",
+                        "required": true,
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Keyword",
+                        "description": "关键字:客户名称、社会信用码",
+                        "required": true,
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Status",
+                        "description": "合同状态",
+                        "required": true,
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "type": "array",
+                            "items": {
+                                "type": "string"
+                            }
+                        }
+                    }
+                }
+            }
+        },
+        "/contract/detail": {
+            "get": {
+                "tags": [
+                    "contract"
+                ],
+                "description": "获取合同详情接口",
+                "operationId": "ContractCommon.获取合同详情",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "ContractId",
+                        "description": "合同id",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/contract.ContractDetailResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/contract/invalid": {
+            "post": {
+                "tags": [
+                    "contract"
+                ],
+                "description": "作废合同接口",
+                "operationId": "ContractCommon.作废合同",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/contract.InvalidReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "作废成功"
+                    }
+                }
+            }
+        },
+        "/contract/list": {
+            "get": {
+                "tags": [
+                    "contract"
+                ],
+                "description": "合同列表接口",
+                "operationId": "ContractCommon.合同列表",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "ContractType",
+                        "description": "合同类型,枚举值:'新签合同','续约合同','补充协议'",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Status",
+                        "description": "合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废'",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ProductId",
+                        "description": "客户类型:传0或者不传为当前账号权限,1 代表是:ficc;2 代表是:权益",
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ModifyStartTime",
+                        "description": "服务更新时间的选择开始时间,格式:2021-05-23 00:00:00",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ModifyEndTime",
+                        "description": "服务更新时间的选择结束时间,格式:2021-05-26 23:59:59",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "SellerId",
+                        "description": "选择的销售id",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Keyword",
+                        "description": "搜索关键字",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "KeywordEq",
+                        "description": "搜索关键字(全等)",
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/contract.ContractListResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/contract/listBySeal": {
+            "get": {
+                "tags": [
+                    "contract"
+                ],
+                "description": "合同列表接口",
+                "operationId": "ContractCommon.合同列表",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "ContractType",
+                        "description": "合同类型,枚举值:'新签合同','续约合同','补充协议'",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Status",
+                        "description": "合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废'",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ProductId",
+                        "description": "客户类型:传0或者不传为当前账号权限,1 代表是:ficc;2 代表是:权益",
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ModifyStartTime",
+                        "description": "服务更新时间的选择开始时间,格式:2021-05-23 00:00:00",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ModifyEndTime",
+                        "description": "服务更新时间的选择结束时间,格式:2021-05-26 23:59:59",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "SellerId",
+                        "description": "选择的销售id",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Keyword",
+                        "description": "搜索关键字",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "KeywordEq",
+                        "description": "搜索关键字(全等)",
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/contract.ContractListResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/contract/listV2": {
+            "get": {
+                "tags": [
+                    "contract"
+                ],
+                "description": "合同列表接口(包含待提交的)",
+                "operationId": "ContractCommon.合同列表(包含待提交的)",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "ContractType",
+                        "description": "合同类型,枚举值:'新签合同','续约合同','补充协议'",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Status",
+                        "description": "合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废'",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ProductId",
+                        "description": "客户类型:传0或者不传为当前账号权限,1 代表是:ficc;2 代表是:权益",
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ModifyStartTime",
+                        "description": "服务更新时间的选择开始时间,格式:2021-05-23 00:00:00",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ModifyEndTime",
+                        "description": "服务更新时间的选择结束时间,格式:2021-05-26 23:59:59",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "SellerId",
+                        "description": "选择的销售id",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Keyword",
+                        "description": "搜索关键字",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "KeywordEq",
+                        "description": "搜索关键字(全等)",
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/contract.ContractListRespV2"
+                        }
+                    }
+                }
+            }
+        },
+        "/contract/upload_check_back_file": {
+            "post": {
+                "tags": [
+                    "contract"
+                ],
+                "description": "上传签回附件接口",
+                "operationId": "ContractCommon.上传签回附件",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/contract.UploadCheckBackFileReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "上传成功"
+                    }
+                }
+            }
+        },
+        "/contract_approval/approved": {
+            "post": {
+                "tags": [
+                    "contract_approval"
+                ],
+                "description": "处理审批单",
+                "operationId": "ContractApprovalCommon.处理审批单",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/contract.ApprovedReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "申请成功"
+                    }
+                }
+            }
+        },
+        "/contract_approval/detail": {
+            "get": {
+                "tags": [
+                    "contract_approval"
+                ],
+                "description": "审批单详情接口",
+                "operationId": "ContractApprovalCommon.审批单详情",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "ContractApprovalId",
+                        "description": "审批单id",
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ContractApprovalRecordId",
+                        "description": "审批流程单id",
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/contract.ContractDetailResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/contract_approval/list": {
+            "get": {
+                "tags": [
+                    "contract_approval"
+                ],
+                "description": "审批单列表接口",
+                "operationId": "ContractApprovalCommon.审批单列表",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "ContractType",
+                        "description": "合同类型,枚举值:'新签合同','续约合同','补充协议'",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Status",
+                        "description": "合同状态,枚举值:'待审批','已审批','已驳回','已撤回'",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ProductId",
+                        "description": "客户类型:传0或者不传为当前账号权限,1 代表是:ficc;2 代表是:权益",
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "SellerId",
+                        "description": "选择的销售id",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Keyword",
+                        "description": "搜索关键字",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "KeywordEq",
+                        "description": "搜索关键字(全等)",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ModifyStartTime",
+                        "description": "服务更新时间的选择开始时间,格式:2021-05-23 00:00:00",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ModifyEndTime",
+                        "description": "服务更新时间的选择结束时间,格式:2021-05-26 23:59:59",
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/contract.ContractApprovalListResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/contract_approval/reject": {
+            "post": {
+                "tags": [
+                    "contract_approval"
+                ],
+                "description": "驳回审批接口",
+                "operationId": "ContractApprovalCommon.驳回审批",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/contract.RejectReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "驳回成功"
+                    }
+                }
+            }
+        },
+        "/message/list": {
+            "get": {
+                "tags": [
+                    "message"
+                ],
+                "description": "消息列表接口",
+                "operationId": "MessageCommon.消息列表",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "SourceType",
+                        "description": "消息类型",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "CurrentIndex",
+                        "description": "当前页码",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "pageSize",
+                        "description": "每页数量",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/message.CompanyApprovalMessageListResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/message/read": {
+            "post": {
+                "tags": [
+                    "message"
+                ],
+                "description": "消息已读接口",
+                "operationId": "MessageCommon.消息已读",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/company.CompanyApprovalMessageReadReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "申请成功"
+                    }
+                }
+            }
+        },
+        "/message/summaryMessageList": {
+            "get": {
+                "tags": [
+                    "message"
+                ],
+                "description": "消息列表汇总页接口",
+                "operationId": "MessageCommon.消息列表汇总页",
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "type": "array",
+                            "items": {
+                                "$ref": "#/definitions/message.SummaryMessage"
+                            }
+                        }
+                    }
+                }
+            }
+        },
+        "/resource/upload": {
+            "post": {
+                "tags": [
+                    "resource"
+                ],
+                "description": "图片上传接口",
+                "operationId": "ResourceCommon.图片上传",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "file",
+                        "description": "文件",
+                        "required": true,
+                        "type": "file"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "新增成功"
+                    }
+                }
+            }
+        },
+        "/resource/upload_image_base64": {
+            "post": {
+                "tags": [
+                    "resource"
+                ],
+                "description": "上传图片",
+                "operationId": "ResourceCommon.上传图片",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "Image",
+                        "description": "图片,base64字符串",
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/models.ImageResponse"
+                        }
+                    }
+                }
+            }
+        },
+        "/roadshow/accept": {
+            "post": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "接受路演活动接口",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/rs.AcceptReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "保存成功"
+                    }
+                }
+            }
+        },
+        "/roadshow/activity/type/list": {
+            "get": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "获取报告电话会类型接口",
+                "operationId": "CalendarController.获取报告电话会类型",
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/rs.ResearcherGroup"
+                        }
+                    }
+                }
+            }
+        },
+        "/roadshow/add": {
+            "post": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "新增路演活动接口",
+                "operationId": "CalendarController.新增路演活动接口",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/rs.AddActivityReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "保存成功"
+                    }
+                }
+            }
+        },
+        "/roadshow/back": {
+            "post": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "撤回路演活动接口",
+                "operationId": "CalendarController.撤回路演活动接口",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/rs.AcceptReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "保存成功"
+                    }
+                }
+            }
+        },
+        "/roadshow/calendar/detail": {
+            "get": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "日历详情接口",
+                "operationId": "CalendarController.日历详情",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "RsCalendarId",
+                        "description": "路演活动id",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "RsCalendarResearcherId",
+                        "description": "活动研究员id",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/rs.CalendarDetailResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/roadshow/calendar/list": {
+            "get": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "我的日历列表接口",
+                "operationId": "CalendarController.我的日历列表",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "PageSize",
+                        "description": "每页数据条数",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "CurrentIndex",
+                        "description": "当前页页码,从1开始",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Status",
+                        "description": "1:待接受,2:包含,已接受,已拒绝,已删除,已撤回,已结束",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/rs.CalendarListResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/roadshow/calendar/type/list": {
+            "get": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "内部会议和报告电话会日历列表",
+                "operationId": "CalendarController.内部会议和报告电话会日历列表",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "PageSize",
+                        "description": "每页数据条数",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "CurrentIndex",
+                        "description": "当前页页码,从1开始",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "CalendarType",
+                        "description": "1:内部会议,2:报告电话会",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/rs.CalendarListResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/roadshow/company/detail": {
+            "get": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "我的日历列表接口",
+                "operationId": "CalendarController.我的日历列表",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "CompanyId",
+                        "description": "公司id",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/rs.CompanyDetailView"
+                        }
+                    }
+                }
+            }
+        },
+        "/roadshow/company/search": {
+            "get": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "我的日历列表接口",
+                "operationId": "CalendarController.我的日历列表",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "KeyWord",
+                        "description": "搜索关键词",
+                        "required": true,
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/rs.CalendarListResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/roadshow/delete": {
+            "post": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "删除路演活动接口",
+                "operationId": "CalendarController.删除路演活动接口",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/rs.DeleteReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "保存成功"
+                    }
+                }
+            }
+        },
+        "/roadshow/edit": {
+            "post": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "编辑路演活动接口",
+                "operationId": "CalendarController.编辑路演活动接口",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/rs.EditActivityReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "保存成功"
+                    }
+                }
+            }
+        },
+        "/roadshow/matters/add": {
+            "post": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "新增事项接口",
+                "operationId": "CalendarController.新增事项接口",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/rs.AddMattersReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "保存成功"
+                    }
+                }
+            }
+        },
+        "/roadshow/matters/delete": {
+            "post": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "删除事项接口",
+                "operationId": "CalendarController.删除事项接口",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/rs.DeleteMattersReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "保存成功"
+                    }
+                }
+            }
+        },
+        "/roadshow/matters/list": {
+            "get": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "事项列表接口",
+                "operationId": "CalendarController.事项列表",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "PageSize",
+                        "description": "每页数据条数",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "CurrentIndex",
+                        "description": "当前页页码,从1开始",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/rs.MattersListResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/roadshow/matters/update": {
+            "post": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "修改事项接口",
+                "operationId": "CalendarController.修改事项接口",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/rs.UpdateMattersReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "保存成功"
+                    }
+                }
+            }
+        },
+        "/roadshow/my/calendar/detail": {
+            "get": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "路演-我的日历详情接口",
+                "operationId": "CalendarController.路演-我的日历详情",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "StartDate",
+                        "description": "开始日期",
+                        "required": true,
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "EndDate",
+                        "description": "结束日期日期",
+                        "required": true,
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/roadshow.CalendarDetailResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/roadshow/refuse": {
+            "post": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "拒绝路演活动接口",
+                "operationId": "CalendarController.拒绝路演活动接口",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/rs.RefuseReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "保存成功"
+                    }
+                }
+            }
+        },
+        "/roadshow/researcher/calendar/detail": {
+            "get": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "路演-研究员日历详情接口",
+                "operationId": "CalendarController.路演-研究员日历详情",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "StartDate",
+                        "description": "开始日期",
+                        "required": true,
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "EndDate",
+                        "description": "结束日期日期",
+                        "required": true,
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ResearcherId",
+                        "description": "研究员id",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/roadshow.CalendarDetailResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/roadshow/researcher/list": {
+            "get": {
+                "tags": [
+                    "roadshow"
+                ],
+                "description": "研究员列表接口",
+                "operationId": "CalendarController.研究员列表",
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/rs.ResearcherGroup"
+                        }
+                    }
+                }
+            }
+        },
+        "/seal/add": {
+            "post": {
+                "tags": [
+                    "seal"
+                ],
+                "description": "新增用印接口",
+                "operationId": "SealCommon.新增用印",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/seal.AddReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "新增用印成功"
+                    }
+                }
+            }
+        },
+        "/seal/check_edit": {
+            "post": {
+                "tags": [
+                    "seal"
+                ],
+                "description": "审批者编辑用印接口",
+                "operationId": "SealCommon.审批者编辑用印",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/seal.CheckEditReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/seal.AddSealResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/seal/company_list": {
+            "get": {
+                "tags": [
+                    "seal"
+                ],
+                "description": "获取合同详情接口",
+                "operationId": "SealCommon.根据客户名称获取已存在系统中客户名称列表",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "Keyword",
+                        "description": "关键字:客户名称、组织社会信用码",
+                        "required": true,
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "type": "array",
+                            "items": {
+                                "type": "string"
+                            }
+                        }
+                    }
+                }
+            }
+        },
+        "/seal/detail": {
+            "get": {
+                "tags": [
+                    "seal"
+                ],
+                "description": "获取用印详情接口",
+                "operationId": "SealCommon.获取用印详情",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "SealId",
+                        "description": "用印id",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/seal.SealDetailResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/seal/edit": {
+            "post": {
+                "tags": [
+                    "seal"
+                ],
+                "description": "编辑用印接口",
+                "operationId": "SealCommon.编辑用印",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/seal.EditReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/seal.AddSealResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/seal/invalid": {
+            "post": {
+                "tags": [
+                    "seal"
+                ],
+                "description": "作废合同接口",
+                "operationId": "SealCommon.作废合同",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/seal.InvalidReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "作废成功"
+                    }
+                }
+            }
+        },
+        "/seal/list": {
+            "get": {
+                "tags": [
+                    "seal"
+                ],
+                "description": "用印列表接口",
+                "operationId": "SealCommon.用印列表",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "Status",
+                        "description": "合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废','已签回'",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ProductId",
+                        "description": "客户类型:传0或者不传为当前账号权限,1 代表是:ficc;2 代表是:权益",
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ModifyStartTime",
+                        "description": "服务更新时间的选择开始时间,格式:2021-05-23 00:00:00",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ModifyEndTime",
+                        "description": "服务更新时间的选择结束时间,格式:2021-05-26 23:59:59",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "AdminId",
+                        "description": "选择的用户id",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Keyword",
+                        "description": "搜索关键字",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "KeywordEq",
+                        "description": "搜索关键字(全匹配搜索)",
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/contract.ContractListResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/seal/upload_check_back_file": {
+            "post": {
+                "tags": [
+                    "seal"
+                ],
+                "description": "上传签回附件接口",
+                "operationId": "SealCommon.上传签回附件",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/seal.UploadCheckBackFileReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "上传成功"
+                    }
+                }
+            }
+        },
+        "/seal_approval/approved": {
+            "post": {
+                "tags": [
+                    "seal_approval"
+                ],
+                "description": "处理审批单",
+                "operationId": "SealApprovalCommon.处理审批单",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/seal.ApprovedReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "申请成功"
+                    }
+                }
+            }
+        },
+        "/seal_approval/cancelApply": {
+            "get": {
+                "tags": [
+                    "seal_approval"
+                ],
+                "description": "撤回审批申请接口",
+                "operationId": "SealApprovalCommon.撤回审批申请",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "SealId",
+                        "description": "用印id编号",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "撤回申请成功"
+                    }
+                }
+            }
+        },
+        "/seal_approval/detail": {
+            "get": {
+                "tags": [
+                    "seal_approval"
+                ],
+                "description": "审批单详情接口",
+                "operationId": "SealApprovalCommon.审批单详情",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "SealId",
+                        "description": "用印id",
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ContractApprovalId",
+                        "description": "审批单id",
+                        "type": "integer",
+                        "format": "int64"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ContractApprovalRecordId",
+                        "description": "审批流程单id",
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/seal.SealDetailResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/seal_approval/list": {
+            "get": {
+                "tags": [
+                    "seal_approval"
+                ],
+                "description": "审批单列表接口",
+                "operationId": "SealApprovalCommon.审批单列表",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "Use",
+                        "description": "用途,枚举值:销售合同, 渠道合同, 付款通知函, 招投标, 战略合作协议",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ServiceType",
+                        "description": "false",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "SealType",
+                        "description": "公章类型,枚举值:合同章, 公章, 法人章",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Status",
+                        "description": "合同状态,枚举值:'待审批','已审批','已驳回','已撤回','已签回'",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "UserId",
+                        "description": "选择的申请人id",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "Keyword",
+                        "description": "搜索关键字",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "KeywordEq",
+                        "description": "搜索关键字(全等)",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ModifyStartTime",
+                        "description": "服务更新时间的选择开始时间,格式:2021-05-23 00:00:00",
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "ModifyEndTime",
+                        "description": "服务更新时间的选择结束时间,格式:2021-05-26 23:59:59",
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/seal.SealApprovalListResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/seal_approval/reject": {
+            "post": {
+                "tags": [
+                    "seal_approval"
+                ],
+                "description": "驳回审批接口",
+                "operationId": "SealApprovalCommon.驳回审批",
+                "parameters": [
+                    {
+                        "in": "body",
+                        "name": "request",
+                        "description": "type json string",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/seal.RejectReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "驳回成功"
+                    }
+                }
+            }
+        },
+        "/wechat/login": {
+            "get": {
+                "tags": [
+                    "wechat"
+                ],
+                "description": "微信登录接口",
+                "operationId": "WeChatCommon.微信登录接口",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "Code",
+                        "description": "微信唯一编码code",
+                        "required": true,
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/wechat.WxLoginResp"
+                        }
+                    }
+                }
+            }
+        },
+        "/wechat/wxapp/login": {
+            "get": {
+                "tags": [
+                    "wechat"
+                ],
+                "description": "微信登录接口",
+                "operationId": "WeChatCommon.微信登录接口",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "Code",
+                        "description": "微信唯一编码code",
+                        "required": true,
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/wechat.WxLoginResp"
+                        }
+                    }
+                }
+            }
+        }
+    },
+    "definitions": {
+        "1635.\u003cnil\u003e.0xc00077c780": {
+            "title": "0xc00077c780",
+            "type": "object"
+        },
+        "645.\u003cnil\u003e.0xc00077c3d8": {
+            "title": "0xc00077c3d8",
+            "type": "object"
+        },
+        "722.\u003cnil\u003e.0xc00077cab0": {
+            "title": "0xc00077cab0",
+            "type": "object"
+        },
+        "admin.LoginReq": {
+            "title": "LoginReq",
+            "type": "object",
+            "properties": {
+                "Password": {
+                    "description": "密码",
+                    "type": "string"
+                },
+                "Username": {
+                    "description": "账号",
+                    "type": "string"
+                }
+            }
+        },
+        "admin.LoginResp": {
+            "title": "LoginResp",
+            "type": "object",
+            "properties": {
+                "AdminId": {
+                    "description": "系统用户id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "AdminName": {
+                    "description": "系统用户名称",
+                    "type": "string"
+                },
+                "Authority": {
+                    "description": "管理权限,0:无,1:部门负责人,2:小组负责人,3:超级管理员",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "DepartmentName": {
+                    "description": "所属部门",
+                    "type": "string"
+                },
+                "GroupName": {
+                    "description": "所属分组",
+                    "type": "string"
+                },
+                "Headimgurl": {
+                    "description": "用户头像",
+                    "type": "string"
+                },
+                "ProductName": {
+                    "description": "产品名称:admin,ficc,权益",
+                    "type": "string"
+                },
+                "RealName": {
+                    "description": "系统用户姓名",
+                    "type": "string"
+                },
+                "RoleName": {
+                    "description": "角色名称",
+                    "type": "string"
+                },
+                "RoleTypeCode": {
+                    "description": "角色类型编码",
+                    "type": "string"
+                }
+            }
+        },
+        "approval.CompanyApplyApproveReq": {
+            "title": "CompanyApplyApproveReq",
+            "type": "object",
+            "properties": {
+                "CompanyApprovalId": {
+                    "description": "审批单id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CompanyContractId": {
+                    "description": "合同id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CompanyId": {
+                    "description": "客户id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "Remark": {
+                    "description": "审批理由",
+                    "type": "string"
+                },
+                "Status": {
+                    "description": "审批状态,1:通过,2:拒绝",
+                    "type": "integer",
+                    "format": "int64"
+                }
+            }
+        },
+        "approval.CompanyApprovalDetailResp": {
+            "title": "CompanyApprovalDetailResp",
+            "type": "object",
+            "properties": {
+                "CompanyApprovalDetail": {
+                    "$ref": "#/definitions/company_approval.CompanyApprovalList",
+                    "description": "审批单详情"
+                },
+                "FiccPermissionList": {
+                    "description": "Ficc权限列表",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/company_report_permission.PermissionLookList"
+                    }
+                },
+                "FlowNodeList": {
+                    "description": "审批流",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/645.\u003cnil\u003e.0xc00077c3d8"
+                    }
+                },
+                "PermissionList": {
+                    "description": "权益权限列表",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/company_report_permission.PermissionLookList"
+                    }
+                }
+            }
+        },
+        "approval.CompanyApprovalListResp": {
+            "title": "CompanyApprovalListResp",
+            "type": "object",
+            "properties": {
+                "List": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/company_approval.CompanyApprovalList"
+                    }
+                },
+                "Paging": {
+                    "$ref": "#/definitions/paging.PagingItem"
+                }
+            }
+        },
+        "approval.CompanyPermissionResp": {
+            "title": "CompanyPermissionResp",
+            "type": "object",
+            "properties": {
+                "FiccPermissionList": {
+                    "description": "Ficc权限列表",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/company_report_permission.PermissionLookList"
+                    }
+                },
+                "PermissionList": {
+                    "description": "权益权限列表",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/company_report_permission.PermissionLookList"
+                    }
+                }
+            }
+        },
+        "approval_flow.ApprovalFlowItem": {
+            "title": "ApprovalFlowItem",
+            "type": "object",
+            "properties": {
+                "CreateTime": {
+                    "description": "创建时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "CurrVersion": {
+                    "description": "当前流程版本",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "FlowId": {
+                    "description": "流程id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "FlowName": {
+                    "description": "流程名称",
+                    "type": "string"
+                },
+                "ModifyTime": {
+                    "description": "最近一次修改时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "NodeList": {
+                    "description": "节点流程列表",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/approval_flow_node.ApprovalFlowNodeList"
+                    }
+                },
+                "ProductId": {
+                    "description": "所属类型,0代表通用,1:ficc部门,2:权益部门",
+                    "type": "integer",
+                    "format": "int64"
+                }
+            }
+        },
+        "approval_flow_node.ApprovalFlowNodeList": {
+            "title": "ApprovalFlowNodeList",
+            "type": "object",
+            "properties": {
+                "AuditType": {
+                    "description": "多人审批时,1:或签(一名审批人同意即可),2:会签(需所有审批人同意)",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CreateTime": {
+                    "description": "创建时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "FlowId": {
+                    "description": "流程id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "NextNodeId": {
+                    "description": "下级节点id,为0代表是结束节点",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "NodeId": {
+                    "description": "流程节点id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "NodeName": {
+                    "description": "流程节点名称",
+                    "type": "string"
+                },
+                "NodeType": {
+                    "description": "节点类型,审批人:check;抄送人:cc(Carbon Copy),默认是:check",
+                    "type": "string"
+                },
+                "PrevNodeId": {
+                    "description": "上级节点id,为0代表是开始节点",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "UserList": {
+                    "description": "审批人、抄送人列表信息",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/approval_flow_node.User"
+                    }
+                },
+                "Version": {
+                    "description": "所属流程版本",
+                    "type": "integer",
+                    "format": "int64"
+                }
+            }
+        },
+        "approval_flow_node.User": {
+            "title": "User",
+            "type": "object",
+            "properties": {
+                "AdminId": {
+                    "description": "人员id(审批人、抄送人)",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "Mobile": {
+                    "description": "手机号(审批人、抄送人)",
+                    "type": "string"
+                },
+                "Name": {
+                    "description": "人员名称(审批人、抄送人)",
+                    "type": "string"
+                },
+                "RoleTypeCode": {
+                    "description": "人员角色类型(审批人、抄送人)",
+                    "type": "string"
+                }
+            }
+        },
+        "company.CompanyApprovalMessageReadReq": {
+            "title": "CompanyApprovalMessageReadReq",
+            "type": "object"
+        },
+        "company_approval.CompanyApprovalList": {
+            "title": "CompanyApprovalList",
+            "type": "object",
+            "properties": {
+                "Address": {
+                    "description": "地址",
+                    "type": "string"
+                },
+                "ApplyContractType": {
+                    "description": "申请合同类型  0 非标  1 标准",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ApplyMethod": {
+                    "description": "申请类型:1:试用-\u003e正式,2:冻结—\u003e试用,3:试用延期,4:原销售申请领取流失客户,5:正式客户申请服务更新,6:正式客户补充协议",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ApplyRealName": {
+                    "description": "申请人姓名",
+                    "type": "string"
+                },
+                "ApplyReasons": {
+                    "description": "申请理由",
+                    "type": "string"
+                },
+                "ApprovalCount": {
+                    "description": "已延期审批次数",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ApprovalTime": {
+                    "description": "提交申请时间",
+                    "type": "string"
+                },
+                "ApproveContent": {
+                    "description": "待审内容",
+                    "type": "string"
+                },
+                "ApproveRemark": {
+                    "description": "驳回理由",
+                    "type": "string"
+                },
+                "ApproveStatus": {
+                    "description": "当前状态",
+                    "type": "string"
+                },
+                "ApproveTime": {
+                    "description": "审批时间",
+                    "type": "string"
+                },
+                "ApproveUserId": {
+                    "description": "审批人",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CompanyApprovalId": {
+                    "description": "审批记录ID",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CompanyContractId": {
+                    "description": "合同id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CompanyId": {
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CompanyName": {
+                    "description": "客户名称",
+                    "type": "string"
+                },
+                "CompanyType": {
+                    "description": "客户类型",
+                    "type": "string"
+                },
+                "CreateTime": {
+                    "description": "创建时间",
+                    "type": "string"
+                },
+                "CreditCode": {
+                    "description": "社会统一信用码",
+                    "type": "string"
+                },
+                "CurrNodeId": {
+                    "description": "当前审批操作节点",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "DelayPermission": {
+                    "description": "延期申请品种",
+                    "type": "string"
+                },
+                "EndDate": {
+                    "description": "结束日期",
+                    "type": "string"
+                },
+                "ExpireDay": {
+                    "description": "服务到期天数",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "FreezeEndDate": {
+                    "description": "冻结结束日期",
+                    "type": "string"
+                },
+                "FreezeExpireDays": {
+                    "description": "冻结到期天数",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "FreezeStartDate": {
+                    "description": "冻结开始日期",
+                    "type": "string"
+                },
+                "IndustryName": {
+                    "description": "行业名称",
+                    "type": "string"
+                },
+                "OpButton": {
+                    "description": "是否审批操作权限",
+                    "type": "boolean"
+                },
+                "ProductId": {
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "SellerName": {
+                    "description": "销售名称",
+                    "type": "string"
+                },
+                "Source": {
+                    "description": "客户来源",
+                    "type": "string"
+                },
+                "StartDate": {
+                    "description": "开始日期",
+                    "type": "string"
+                },
+                "Status": {
+                    "description": "客户状态",
+                    "type": "string"
+                }
+            }
+        },
+        "company_approval_message.ApprovalInfo": {
+            "title": "ApprovalInfo",
+            "type": "object",
+            "properties": {
+                "ApplyName": {
+                    "description": "申请人姓名",
+                    "type": "string"
+                },
+                "ApplyTime": {
+                    "description": "提交时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "ApprovalTime": {
+                    "description": "审批时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "Type": {
+                    "description": "类型",
+                    "type": "string"
+                }
+            }
+        },
+        "company_approval_message.CompanyApprovalMessageList": {
+            "title": "CompanyApprovalMessageList",
+            "type": "object",
+            "properties": {
+                "ApprovalInfo": {
+                    "$ref": "#/definitions/company_approval_message.ApprovalInfo",
+                    "description": "审批单信息"
+                },
+                "ApprovalStatus": {
+                    "description": "审批结果:1:待审批,2:已审批,3:已驳回",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CompanyApprovalId": {
+                    "description": "审批单id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CompanyName": {
+                    "description": "客户名称",
+                    "type": "string"
+                },
+                "Content": {
+                    "description": "消息内容",
+                    "type": "string"
+                },
+                "CreateTime": {
+                    "description": "创建时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "CreateUserId": {
+                    "description": "申请者id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "Id": {
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "MessageStatus": {
+                    "description": "消息状态:0未读,1:已读,2:作废",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "MessageType": {
+                    "description": "1:申请消息,2:审批结果,3:文字消息",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "RealName": {
+                    "description": "销售名称",
+                    "type": "string"
+                },
+                "Remark": {
+                    "description": "备注信息",
+                    "type": "string"
+                },
+                "SourceType": {
+                    "description": "消息来源类型,1:客户,2:合同,3:用印",
+                    "type": "integer",
+                    "format": "int64"
+                }
+            }
+        },
+        "company_contract.CompanyContractDetail": {
+            "title": "CompanyContractDetail",
+            "type": "object",
+            "properties": {
+                "CompanyContractId": {
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CompanyId": {
+                    "description": "客户id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ContractCode": {
+                    "description": "合同编码",
+                    "type": "string"
+                },
+                "ContractType": {
+                    "description": "合同类型:枚举值:'新签合同','续约合同','补充协议'",
+                    "type": "string"
+                },
+                "CreateTime": {
+                    "description": "合同创建时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "EndDate": {
+                    "description": "合同结束时间",
+                    "type": "string"
+                },
+                "ImgUrl": {
+                    "description": "合同图片,多个用#隔开",
+                    "type": "string"
+                },
+                "ModifyTime": {
+                    "description": "合同修改时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "Money": {
+                    "description": "合同金额",
+                    "type": "number",
+                    "format": "double"
+                },
+                "PackageType": {
+                    "description": "套餐类型,0:无,1:大套餐,2:小套餐",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "PayChannel": {
+                    "description": "支付渠道",
+                    "type": "string"
+                },
+                "PayMethod": {
+                    "description": "支付方式",
+                    "type": "string"
+                },
+                "PermissionList": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/company_report_permission.PermissionLookList"
+                    }
+                },
+                "StartDate": {
+                    "description": "合同开始时间",
+                    "type": "string"
+                },
+                "Status": {
+                    "description": "状态",
+                    "type": "integer",
+                    "format": "int64"
+                }
+            }
+        },
+        "company_contract.CompanyContractDetailResp": {
+            "title": "CompanyContractDetailResp",
+            "type": "object",
+            "properties": {
+                "CompanyContractId": {
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CompanyId": {
+                    "description": "客户id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ContractCode": {
+                    "description": "合同编码",
+                    "type": "string"
+                },
+                "ContractType": {
+                    "description": "合同类型:枚举值:'新签合同','续约合同','补充协议'",
+                    "type": "string"
+                },
+                "CreateTime": {
+                    "description": "合同创建时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "EndDate": {
+                    "description": "合同结束时间",
+                    "type": "string"
+                },
+                "ImgUrl": {
+                    "description": "合同图片,多个用#隔开",
+                    "type": "string"
+                },
+                "ModifyTime": {
+                    "description": "合同修改时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "Money": {
+                    "description": "合同金额",
+                    "type": "number",
+                    "format": "double"
+                },
+                "PackageType": {
+                    "description": "套餐类型,0:无,1:大套餐,2:小套餐",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "PayChannel": {
+                    "description": "支付渠道",
+                    "type": "string"
+                },
+                "PayMethod": {
+                    "description": "支付方式",
+                    "type": "string"
+                },
+                "PermissionList": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/company_report_permission.PermissionLookList"
+                    }
+                },
+                "StartDate": {
+                    "description": "合同开始时间",
+                    "type": "string"
+                },
+                "Status": {
+                    "description": "状态",
+                    "type": "integer",
+                    "format": "int64"
+                }
+            }
+        },
+        "company_report_permission.PermissionLookItem": {
+            "title": "PermissionLookItem",
+            "type": "object",
+            "properties": {
+                "ChartPermissionId": {
+                    "description": "权限id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ClassifyName": {
+                    "description": "分类",
+                    "type": "string"
+                },
+                "EndDate": {
+                    "description": "权限结束日期",
+                    "type": "string"
+                },
+                "ExpireDay": {
+                    "description": "到期天数",
+                    "type": "string"
+                },
+                "PermissionName": {
+                    "description": "权限名称",
+                    "type": "string"
+                },
+                "StartDate": {
+                    "description": "权限开始日期",
+                    "type": "string"
+                },
+                "Status": {
+                    "description": "'正式','试用','关闭'",
+                    "type": "string"
+                }
+            }
+        },
+        "company_report_permission.PermissionLookList": {
+            "title": "PermissionLookList",
+            "type": "object",
+            "properties": {
+                "CheckList": {
+                    "type": "array",
+                    "items": {
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                },
+                "ClassifyName": {
+                    "description": "分类",
+                    "type": "string"
+                },
+                "Items": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/company_report_permission.PermissionLookItem"
+                    }
+                }
+            }
+        },
+        "contract.ApprovedReq": {
+            "title": "ApprovedReq",
+            "type": "object",
+            "properties": {
+                "ContractId": {
+                    "description": "合同id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "Remark": {
+                    "description": "驳回理由",
+                    "type": "string"
+                }
+            }
+        },
+        "contract.ContractApprovalListResp": {
+            "title": "ContractApprovalListResp",
+            "type": "object",
+            "properties": {
+                "List": {
+                    "description": "列表数据",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/contract_approval.ContractApprovalList"
+                    }
+                },
+                "Paging": {
+                    "$ref": "#/definitions/paging.PagingItem"
+                }
+            }
+        },
+        "contract.ContractDetail": {
+            "title": "ContractDetail",
+            "type": "object",
+            "properties": {
+                "Address": {
+                    "description": "详细地址",
+                    "type": "string"
+                },
+                "ApprovalRemark": {
+                    "description": "审核备注",
+                    "type": "string"
+                },
+                "ApproveTime": {
+                    "description": "审批时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "ApproveTimeStr": {
+                    "description": "审批时间",
+                    "type": "string"
+                },
+                "CheckBackFileTime": {
+                    "description": "合同签回时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "CheckBackFileTimeStr": {
+                    "description": "合同签回时间",
+                    "type": "string"
+                },
+                "CheckBackFileUrl": {
+                    "description": "签回合同文件地址",
+                    "type": "string"
+                },
+                "City": {
+                    "description": "市级名称,长度32位",
+                    "type": "string"
+                },
+                "CityId": {
+                    "description": "市级id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CompanyName": {
+                    "description": "客户名称,甲方名称,长度32位",
+                    "type": "string"
+                },
+                "ContractBusinessType": {
+                    "description": "合同业务类型,枚举值:'业务合同','代付合同'",
+                    "type": "string"
+                },
+                "ContractCode": {
+                    "description": "合同编号,长度32位",
+                    "type": "string"
+                },
+                "ContractId": {
+                    "description": "合同唯一id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ContractType": {
+                    "description": "合同类型,枚举值:'新签合同','续约合同','补充协议'",
+                    "type": "string"
+                },
+                "CreateTime": {
+                    "description": "合同添加时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "CreateTimeStr": {
+                    "description": "合同添加时间",
+                    "type": "string"
+                },
+                "CreditCode": {
+                    "description": "社会统一信用代码,长度64位",
+                    "type": "string"
+                },
+                "EndDate": {
+                    "description": "合同结束日期",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "EndDateStr": {
+                    "description": "合同结束时间",
+                    "type": "string"
+                },
+                "Fax": {
+                    "description": "传真,长度32位",
+                    "type": "string"
+                },
+                "FileUrl": {
+                    "description": "合同文件地址",
+                    "type": "string"
+                },
+                "InvalidTime": {
+                    "description": "作废时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "InvalidTimeStr": {
+                    "description": "作废时间",
+                    "type": "string"
+                },
+                "ModifyContent": {
+                    "description": "修改内容",
+                    "type": "string"
+                },
+                "ModifyTime": {
+                    "description": "合同最近一次修改时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "ModifyTimeStr": {
+                    "description": "最近一次更新时间",
+                    "type": "string"
+                },
+                "OriginalPrice": {
+                    "description": "合同原金额,优惠前的金额",
+                    "type": "number",
+                    "format": "double"
+                },
+                "PayChannel": {
+                    "description": "付款渠道,长度255位",
+                    "type": "string"
+                },
+                "PayRemark": {
+                    "description": "付款方式说明,长度255位",
+                    "type": "string"
+                },
+                "PermissionLookList": {
+                    "description": "合同里面的权限列表",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/company_report_permission.PermissionLookList"
+                    }
+                },
+                "Phone": {
+                    "description": "电话,长度32位",
+                    "type": "string"
+                },
+                "Postcode": {
+                    "description": "邮编,长度16位",
+                    "type": "string"
+                },
+                "Price": {
+                    "description": "实际金额,优惠后的金额",
+                    "type": "number",
+                    "format": "double"
+                },
+                "ProductId": {
+                    "description": "产品id,1:ficc;2:权益",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "Province": {
+                    "description": "省级名称,长度16位",
+                    "type": "string"
+                },
+                "ProvinceId": {
+                    "description": "省级id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "RelationContractDetailList": {
+                    "description": "关联合同详情",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/contract.ContractDetail"
+                    }
+                },
+                "Remark": {
+                    "description": "补充内容,长度255位",
+                    "type": "string"
+                },
+                "RescindFileUrl": {
+                    "description": "解约合同文件地址",
+                    "type": "string"
+                },
+                "RescindTime": {
+                    "description": "解约时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "RescindTimeStr": {
+                    "description": "解约时间",
+                    "type": "string"
+                },
+                "SellerId": {
+                    "description": "所属销售id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "SellerName": {
+                    "description": "所属销售名称",
+                    "type": "string"
+                },
+                "SellerRemark": {
+                    "description": "销售备注,长度255位",
+                    "type": "string"
+                },
+                "Service": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/contract.ContractServiceAndDetail"
+                    }
+                },
+                "SourceId": {
+                    "description": "来源合同id,默认是0;如果是通过其他合同复制过来的,那么就是原合同的id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "StartDate": {
+                    "description": "合同开始日期",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "StartDateStr": {
+                    "description": "合同起始时间",
+                    "type": "string"
+                },
+                "Status": {
+                    "description": "合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废','已解约'",
+                    "type": "string"
+                },
+                "TemplateId": {
+                    "description": "模板id",
+                    "type": "integer",
+                    "format": "int64"
+                }
+            }
+        },
+        "contract.ContractDetailResp": {
+            "title": "ContractDetailResp",
+            "type": "object",
+            "properties": {
+                "ContractDetail": {
+                    "$ref": "#/definitions/contract.ContractDetail",
+                    "description": "审批单详情"
+                },
+                "FlowNodeList": {
+                    "description": "审批流",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/1635.\u003cnil\u003e.0xc00077c780"
+                    }
+                },
+                "OpButton": {
+                    "$ref": "#/definitions/contract.OpButton",
+                    "description": "操作权限"
+                }
+            }
+        },
+        "contract.ContractList": {
+            "title": "ContractList",
+            "type": "object",
+            "properties": {
+                "Address": {
+                    "description": "详细地址",
+                    "type": "string"
+                },
+                "ApprovalRemark": {
+                    "description": "审核备注",
+                    "type": "string"
+                },
+                "ApproveTime": {
+                    "description": "审批时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "ApproveTimeStr": {
+                    "description": "审批时间",
+                    "type": "string"
+                },
+                "CheckBackFileTime": {
+                    "description": "合同签回时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "CheckBackFileTimeStr": {
+                    "description": "合同签回时间",
+                    "type": "string"
+                },
+                "CheckBackFileUrl": {
+                    "description": "签回合同文件地址",
+                    "type": "string"
+                },
+                "City": {
+                    "description": "市级名称,长度32位",
+                    "type": "string"
+                },
+                "CityId": {
+                    "description": "市级id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CompanyName": {
+                    "description": "客户名称,甲方名称,长度32位",
+                    "type": "string"
+                },
+                "ContractBusinessType": {
+                    "description": "合同业务类型,枚举值:'业务合同','代付合同'",
+                    "type": "string"
+                },
+                "ContractCode": {
+                    "description": "合同编号,长度32位",
+                    "type": "string"
+                },
+                "ContractId": {
+                    "description": "合同唯一id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ContractType": {
+                    "description": "合同类型,枚举值:'新签合同','续约合同','补充协议'",
+                    "type": "string"
+                },
+                "CreateTime": {
+                    "description": "合同添加时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "CreateTimeStr": {
+                    "description": "合同添加时间",
+                    "type": "string"
+                },
+                "CreditCode": {
+                    "description": "社会统一信用代码,长度64位",
+                    "type": "string"
+                },
+                "EndDate": {
+                    "description": "合同结束日期",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "EndDateStr": {
+                    "description": "合同结束时间",
+                    "type": "string"
+                },
+                "Fax": {
+                    "description": "传真,长度32位",
+                    "type": "string"
+                },
+                "FileUrl": {
+                    "description": "合同文件地址",
+                    "type": "string"
+                },
+                "InvalidTime": {
+                    "description": "作废时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "InvalidTimeStr": {
+                    "description": "作废时间",
+                    "type": "string"
+                },
+                "ModifyContent": {
+                    "description": "修改内容",
+                    "type": "string"
+                },
+                "ModifyTime": {
+                    "description": "合同最近一次修改时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "ModifyTimeStr": {
+                    "description": "最近一次更新时间",
+                    "type": "string"
+                },
+                "OriginalPrice": {
+                    "description": "合同原金额,优惠前的金额",
+                    "type": "number",
+                    "format": "double"
+                },
+                "PayRemark": {
+                    "description": "付款方式说明,长度255位",
+                    "type": "string"
+                },
+                "Phone": {
+                    "description": "电话,长度32位",
+                    "type": "string"
+                },
+                "Postcode": {
+                    "description": "邮编,长度16位",
+                    "type": "string"
+                },
+                "Price": {
+                    "description": "实际金额,优惠后的金额",
+                    "type": "number",
+                    "format": "double"
+                },
+                "ProductId": {
+                    "description": "产品id,1:ficc;2:权益",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "Province": {
+                    "description": "省级名称,长度16位",
+                    "type": "string"
+                },
+                "ProvinceId": {
+                    "description": "省级id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "RescindTime": {
+                    "description": "解约时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "RescindTimeStr": {
+                    "description": "解约时间",
+                    "type": "string"
+                },
+                "SellerId": {
+                    "description": "所属销售id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "SellerName": {
+                    "description": "所属销售名称",
+                    "type": "string"
+                },
+                "SellerRemark": {
+                    "description": "销售备注,长度255位",
+                    "type": "string"
+                },
+                "Service": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/contract.ContractServiceAndDetail"
+                    }
+                },
+                "SourceId": {
+                    "description": "来源合同id,默认是0;如果是通过其他合同复制过来的,那么就是原合同的id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "StartDate": {
+                    "description": "合同开始日期",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "StartDateStr": {
+                    "description": "合同起始时间",
+                    "type": "string"
+                },
+                "Status": {
+                    "description": "合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废'",
+                    "type": "string"
+                },
+                "TemplateId": {
+                    "description": "模板id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "UseCompanyName": {
+                    "description": "使用方名称,长度32位",
+                    "type": "string"
+                }
+            }
+        },
+        "contract.ContractListResp": {
+            "title": "ContractListResp",
+            "type": "object",
+            "properties": {
+                "List": {
+                    "description": "列表数据",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/contract.ContractList"
+                    }
+                },
+                "Paging": {
+                    "$ref": "#/definitions/paging.PagingItem"
+                }
+            }
+        },
+        "contract.ContractListRespV2": {
+            "title": "ContractListRespV2",
+            "type": "object",
+            "properties": {
+                "List": {
+                    "description": "列表数据",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/contract_approval.ContractApprovalList"
+                    }
+                },
+                "Paging": {
+                    "$ref": "#/definitions/paging.PagingItem"
+                }
+            }
+        },
+        "contract.ContractServiceAndDetail": {
+            "title": "ContractServiceAndDetail",
+            "type": "object",
+            "properties": {
+                "ChartPermissionId": {
+                    "description": "权限id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ContractId": {
+                    "description": "合同id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ContractServiceId": {
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "DetailList": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/contract_service_detail.ContractServiceDetail"
+                    }
+                },
+                "HasDetail": {
+                    "description": "是否有详情,枚举值:是、否;默认:否",
+                    "type": "string"
+                },
+                "ProductId": {
+                    "description": "产品id,1:ficc;2:权益",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ServiceTemplateId": {
+                    "description": "合同服务模板id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "TableValue": {
+                    "description": "表格数据,用于word生成时的json数据",
+                    "type": "string"
+                },
+                "Title": {
+                    "description": "套餐标题",
+                    "type": "string"
+                },
+                "Value": {
+                    "description": "套餐的值",
+                    "type": "string"
+                }
+            }
+        },
+        "contract.InvalidReq": {
+            "title": "InvalidReq",
+            "type": "object",
+            "properties": {
+                "ContractId": {
+                    "description": "合同id",
+                    "type": "integer",
+                    "format": "int64"
+                }
+            }
+        },
+        "contract.OpButton": {
+            "title": "OpButton",
+            "type": "object",
+            "properties": {
+                "Approval": {
+                    "description": "是否有审批权限",
+                    "type": "boolean"
+                },
+                "Invalid": {
+                    "description": "是否有作废合同权限",
+                    "type": "boolean"
+                },
+                "UploadFile": {
+                    "description": "是否有上传签回文件权限",
+                    "type": "boolean"
+                }
+            }
+        },
+        "contract.RejectReq": {
+            "title": "RejectReq",
+            "type": "object",
+            "properties": {
+                "ContractId": {
+                    "description": "合同id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "Remark": {
+                    "description": "备注字段",
+                    "type": "string"
+                }
+            }
+        },
+        "contract.UploadCheckBackFileReq": {
+            "title": "UploadCheckBackFileReq",
+            "type": "object",
+            "properties": {
+                "ContractId": {
+                    "description": "合同id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "FileUrl": {
+                    "description": "签回合同url",
+                    "type": "string"
+                }
+            }
+        },
+        "contract_approval.ContractApprovalList": {
+            "title": "ContractApprovalList",
+            "type": "object",
+            "properties": {
+                "ApplyContent": {
+                    "description": "待审内容",
+                    "type": "string"
+                },
+                "ApproveRemark": {
+                    "description": "审核备注",
+                    "type": "string"
+                },
+                "ApproveTime": {
+                    "description": "审批时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "ApproveTimeStr": {
+                    "description": "审批时间(字符串类型)",
+                    "type": "string"
+                },
+                "CheckBackFileTime": {
+                    "description": "合同签回时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "CheckBackFileTimeStr": {
+                    "description": "合同签回时间(字符串类型)",
+                    "type": "string"
+                },
+                "CompanyName": {
+                    "description": "客户名称",
+                    "type": "string"
+                },
+                "ContractApprovalId": {
+                    "description": "审批单id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ContractApprovalRecordId": {
+                    "description": "审批流id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ContractBusinessType": {
+                    "description": "合同业务类型,枚举值:'业务合同','代付合同'",
+                    "type": "string"
+                },
+                "ContractCode": {
+                    "description": "合同编号",
+                    "type": "string"
+                },
+                "ContractId": {
+                    "description": "合同id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ContractType": {
+                    "description": "合同类型",
+                    "type": "string"
+                },
+                "CreateTime": {
+                    "description": "发起审批的时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "CreateTimeStr": {
+                    "description": "发起审批的时间(字符串类型)",
+                    "type": "string"
+                },
+                "CreditCode": {
+                    "description": "社会统一信用代码,长度64位",
+                    "type": "string"
+                },
+                "EndDate": {
+                    "description": "合同结束日期",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "EndDateStr": {
+                    "description": "合同结束日期(字符串类型)",
+                    "type": "string"
+                },
+                "FileUrl": {
+                    "description": "合同下载地址",
+                    "type": "string"
+                },
+                "InvalidTime": {
+                    "description": "作废时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "InvalidTimeStr": {
+                    "description": "作废时间(字符串类型)",
+                    "type": "string"
+                },
+                "ModifyTime": {
+                    "description": "最后一次修改的时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "ModifyTimeStr": {
+                    "description": "最后一次修改的时间(字符串类型)",
+                    "type": "string"
+                },
+                "Price": {
+                    "description": "合同金额",
+                    "type": "number",
+                    "format": "double"
+                },
+                "ProductId": {
+                    "description": "产品id,1:ficc;2:权益",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "RescindTime": {
+                    "description": "解约时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "RescindTimeStr": {
+                    "description": "解约时间(字符串类型)",
+                    "type": "string"
+                },
+                "SellerId": {
+                    "description": "销售id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "SellerName": {
+                    "description": "销售名称",
+                    "type": "string"
+                },
+                "StartDate": {
+                    "description": "合同开始日期",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "StartDateStr": {
+                    "description": "合同开始日期(字符串类型)",
+                    "type": "string"
+                },
+                "Status": {
+                    "description": "合同状态,枚举值:待审批','已审批','已驳回','已撤回',默认待审批",
+                    "type": "string"
+                }
+            }
+        },
+        "contract_approval.SealApprovalList": {
+            "title": "SealApprovalList",
+            "type": "object",
+            "properties": {
+                "ApplyContent": {
+                    "description": "待审内容",
+                    "type": "string"
+                },
+                "ApplyUserId": {
+                    "description": "待审内容",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ApplyUserName": {
+                    "description": "待审内容",
+                    "type": "string"
+                },
+                "ApproveRemark": {
+                    "description": "审核备注",
+                    "type": "string"
+                },
+                "ApproveTime": {
+                    "description": "审批时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "ApproveTimeStr": {
+                    "description": "审批时间(字符串类型)",
+                    "type": "string"
+                },
+                "CheckBackFileTime": {
+                    "description": "签回用印附件时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "CompanyName": {
+                    "description": "客户名称",
+                    "type": "string"
+                },
+                "ContractApprovalId": {
+                    "description": "审批单id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ContractApprovalRecordId": {
+                    "description": "审批流id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ContractCode": {
+                    "description": "合同编号",
+                    "type": "string"
+                },
+                "ContractId": {
+                    "description": "合同id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CreateTime": {
+                    "description": "发起审批的时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "CreateTimeStr": {
+                    "description": "发起审批的时间(字符串类型)",
+                    "type": "string"
+                },
+                "CurrNodeId": {
+                    "description": "当前审批节点id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "EndDateStr": {
+                    "description": "合同结束日期(字符串类型)",
+                    "type": "string"
+                },
+                "FileUrl": {
+                    "description": "合同下载地址",
+                    "type": "string"
+                },
+                "InvalidTime": {
+                    "description": "作废时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "InvalidTimeStr": {
+                    "description": "作废时间(字符串类型)",
+                    "type": "string"
+                },
+                "ModifyTime": {
+                    "description": "最后一次修改的时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "ModifyTimeStr": {
+                    "description": "最后一次修改的时间(字符串类型)",
+                    "type": "string"
+                },
+                "SealType": {
+                    "description": "用印类型",
+                    "type": "string"
+                },
+                "StartDateStr": {
+                    "description": "合同开始日期(字符串类型)",
+                    "type": "string"
+                },
+                "StartNodeId": {
+                    "description": "开始审批节点id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "Status": {
+                    "description": "合同状态,枚举值:待审批','已审批','已驳回','已撤回','已签回',默认待审批",
+                    "type": "string"
+                },
+                "UserId": {
+                    "description": "申请人id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "UserName": {
+                    "description": "申请人名称",
+                    "type": "string"
+                }
+            }
+        },
+        "contract_service_detail.ContractServiceDetail": {
+            "title": "ContractServiceDetail",
+            "type": "object",
+            "properties": {
+                "Col1": {
+                    "description": "第1列数据",
+                    "type": "string"
+                },
+                "Col2": {
+                    "description": "第2列数据",
+                    "type": "string"
+                },
+                "Col3": {
+                    "description": "第3列数据",
+                    "type": "string"
+                },
+                "Col4": {
+                    "description": "第4列数据",
+                    "type": "string"
+                },
+                "Col5": {
+                    "description": "第5列数据",
+                    "type": "string"
+                },
+                "Col6": {
+                    "description": "第6列数据",
+                    "type": "string"
+                },
+                "Col7": {
+                    "description": "第7列数据",
+                    "type": "string"
+                },
+                "ContractId": {
+                    "description": "合同id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ContractServiceId": {
+                    "description": "合同服务id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CreateTime": {
+                    "description": "数据添加时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "Id": {
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ServiceTemplateId": {
+                    "description": "服务模板id",
+                    "type": "integer",
+                    "format": "int64"
+                }
+            }
+        },
+        "message.CompanyApprovalMessageListResp": {
+            "title": "CompanyApprovalMessageListResp",
+            "type": "object",
+            "properties": {
+                "List": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/company_approval_message.CompanyApprovalMessageList"
+                    }
+                },
+                "Total": {
+                    "description": "总数据条数",
+                    "type": "integer",
+                    "format": "int64"
+                }
+            }
+        },
+        "message.SummaryMessage": {
+            "title": "SummaryMessage",
+            "type": "object",
+            "properties": {
+                "Message": {
+                    "description": "消息",
+                    "type": "string"
+                },
+                "SourceType": {
+                    "description": "消息来源类型,1:客户,2:合同,3:用印",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "Total": {
+                    "description": "未读数据数",
+                    "type": "integer",
+                    "format": "int64"
+                }
+            }
+        },
+        "models.ImageResponse": {
+            "title": "ImageResponse",
+            "type": "object"
+        },
+        "paging.PagingItem": {
+            "title": "PagingItem",
+            "type": "object"
+        },
+        "roadshow.CalendarDetailResp": {
+            "title": "CalendarDetailResp",
+            "type": "object",
+            "properties": {
+                "CompanyDetail": {
+                    "$ref": "#/definitions/roadshow.CompanyDetailView"
+                },
+                "RsCalendarItem": {
+                    "$ref": "#/definitions/roadshow.RsCalendar"
+                },
+                "RsCalendarResearcherItem": {
+                    "$ref": "#/definitions/roadshow.RsCalendarResearcher"
+                }
+            }
+        },
+        "roadshow.CompanyDetailView": {
+            "title": "CompanyDetailView",
+            "type": "object",
+            "properties": {
+                "CompanyId": {
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CompanyName": {
+                    "description": "客户名称",
+                    "type": "string"
+                },
+                "IndustryId": {
+                    "description": "行业id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "IndustryName": {
+                    "description": "行业名称",
+                    "type": "string"
+                },
+                "PermissionName": {
+                    "description": "开通品种",
+                    "type": "string"
+                },
+                "ReportReadTotal": {
+                    "description": "累计阅读次数",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "Status": {
+                    "description": "客户状态",
+                    "type": "string"
+                }
+            }
+        },
+        "roadshow.RsCalendar": {
+            "title": "RsCalendar",
+            "type": "object",
+            "properties": {
+                "ActivityCategory": {
+                    "description": "活动类别",
+                    "type": "string"
+                },
+                "ActivityType": {
+                    "description": "活动类型",
+                    "type": "string"
+                },
+                "City": {
+                    "description": "市",
+                    "type": "string"
+                },
+                "CityCode": {
+                    "description": "市编码",
+                    "type": "string"
+                },
+                "CompanyId": {
+                    "description": "客户id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CompanyName": {
+                    "description": "客户名称",
+                    "type": "string"
+                },
+                "CooperationName": {
+                    "description": "合作方名称",
+                    "type": "string"
+                },
+                "CreateTime": {
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "IsSynced": {
+                    "description": "是否与上海同步 0:未同步 1:已同步",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ModifyTime": {
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "Province": {
+                    "description": "省",
+                    "type": "string"
+                },
+                "ProvinceCode": {
+                    "description": "省编码",
+                    "type": "string"
+                },
+                "RoadshowPlatform": {
+                    "description": "路演平台",
+                    "type": "string"
+                },
+                "RoadshowType": {
+                    "description": "路演形式",
+                    "type": "string"
+                },
+                "RsCalendarId": {
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "Source": {
+                    "description": "来源,0:自系统,1:上海方的",
+                    "type": "integer",
+                    "format": "int32"
+                },
+                "SysUserId": {
+                    "description": "创建人id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "SysUserRealName": {
+                    "description": "创建人名称",
+                    "type": "string"
+                },
+                "Theme": {
+                    "description": "会议主题",
+                    "type": "string"
+                },
+                "Title": {
+                    "description": "展示在日历的标题",
+                    "type": "string"
+                }
+            }
+        },
+        "roadshow.RsCalendarResearcher": {
+            "title": "RsCalendarResearcher",
+            "type": "object",
+            "properties": {
+                "ApproveTime": {
+                    "description": "接受时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "CreateTime": {
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "DeleteReason": {
+                    "description": "删除理由",
+                    "type": "string"
+                },
+                "DeleteTime": {
+                    "description": "删除时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "EndDate": {
+                    "description": "结束日期",
+                    "type": "string"
+                },
+                "EndTime": {
+                    "description": "结束时间",
+                    "type": "string"
+                },
+                "EndWeek": {
+                    "description": "结束日期对应周",
+                    "type": "string"
+                },
+                "IsSynced": {
+                    "description": "是否与上海同步 0:未同步 1:已同步",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ModifyTime": {
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "RefuseReason": {
+                    "description": "拒绝理由",
+                    "type": "string"
+                },
+                "RefuseTime": {
+                    "description": "拒绝时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "ResearcherId": {
+                    "description": "研究员id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "ResearcherName": {
+                    "description": "研究员名称",
+                    "type": "string"
+                },
+                "ResearcherSort": {
+                    "description": "研究员新增排序",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "RsCalendarId": {
+                    "description": "日历活动id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "RsCalendarResearcherId": {
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "StartDate": {
+                    "description": "开始日期",
+                    "type": "string"
+                },
+                "StartTime": {
+                    "description": "开始时间",
+                    "type": "string"
+                },
+                "StartWeek": {
+                    "description": "开始日期对应周",
+                    "type": "string"
+                },
+                "Status": {
+                    "description": "状态:1:待接受,2:已接受,3:已拒绝,4:已删除,5:已撤回,6:已结束",
+                    "type": "integer",
+                    "format": "int64"
+                }
+            }
+        },
+        "rs.AcceptReq": {
+            "title": "AcceptReq",
+            "type": "object"
+        },
+        "rs.AddActivityReq": {
+            "title": "AddActivityReq",
+            "type": "object"
+        },
+        "rs.AddMattersReq": {
+            "title": "AddMattersReq",
+            "type": "object"
+        },
+        "rs.CalendarDetailResp": {
+            "title": "CalendarDetailResp",
+            "type": "object"
+        },
+        "rs.CalendarListResp": {
+            "title": "CalendarListResp",
+            "type": "object"
+        },
+        "rs.CompanyDetailView": {
+            "title": "CompanyDetailView",
+            "type": "object"
+        },
+        "rs.DeleteMattersReq": {
+            "title": "DeleteMattersReq",
+            "type": "object"
+        },
+        "rs.DeleteReq": {
+            "title": "DeleteReq",
+            "type": "object"
+        },
+        "rs.EditActivityReq": {
+            "title": "EditActivityReq",
+            "type": "object"
+        },
+        "rs.MattersListResp": {
+            "title": "MattersListResp",
+            "type": "object"
+        },
+        "rs.RefuseReq": {
+            "title": "RefuseReq",
+            "type": "object"
+        },
+        "rs.ResearcherGroup": {
+            "title": "ResearcherGroup",
+            "type": "object"
+        },
+        "rs.UpdateMattersReq": {
+            "title": "UpdateMattersReq",
+            "type": "object"
+        },
+        "seal.AddReq": {
+            "title": "AddReq",
+            "type": "object",
+            "properties": {
+                "CompanyName": {
+                    "description": "客户名称,甲方名称,长度32位",
+                    "type": "string"
+                },
+                "ContractId": {
+                    "description": "系统合同id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CreditCode": {
+                    "description": "社会统一信用代码,长度64位",
+                    "type": "string"
+                },
+                "FileNum": {
+                    "description": "文件份数",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "FileUrl": {
+                    "description": "文件附件地址",
+                    "type": "string"
+                },
+                "Remark": {
+                    "description": "备注,长度255位",
+                    "type": "string"
+                },
+                "SealType": {
+                    "description": "加盖印章类型,枚举值:'合同章', '公章', '法人章';默认:合同章",
+                    "type": "string"
+                },
+                "ServiceType": {
+                    "description": "业务类型,枚举值:'新签合同','续约合同','补充协议';默认:新签合同",
+                    "type": "string"
+                },
+                "Use": {
+                    "description": "用印用途,枚举值:'销售合同', '渠道合同', '付款通知函', '招投标', '战略合作协议';默认:销售合同",
+                    "type": "string"
+                },
+                "UseCompanyName": {
+                    "description": "实际适用方客户名称,长度32位",
+                    "type": "string"
+                }
+            }
+        },
+        "seal.AddSealResp": {
+            "title": "AddSealResp",
+            "type": "object",
+            "properties": {
+                "SealId": {
+                    "description": "用印id",
+                    "type": "integer",
+                    "format": "int64"
+                }
+            }
+        },
+        "seal.ApprovedReq": {
+            "title": "ApprovedReq",
+            "type": "object",
+            "properties": {
+                "Remark": {
+                    "description": "驳回理由",
+                    "type": "string"
+                },
+                "SealId": {
+                    "description": "用印id",
+                    "type": "integer",
+                    "format": "int64"
+                }
+            }
+        },
+        "seal.CheckEditReq": {
+            "title": "CheckEditReq",
+            "type": "object",
+            "properties": {
+                "FileNum": {
+                    "description": "文件份数",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "FileUrl": {
+                    "description": "文件附件地址",
+                    "type": "string"
+                },
+                "Remark": {
+                    "description": "备注,长度255位",
+                    "type": "string"
+                },
+                "SealId": {
+                    "description": "用印单id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "SealType": {
+                    "description": "加盖印章类型,枚举值:'合同章', '公章', '法人章';默认:合同章",
+                    "type": "string"
+                },
+                "Use": {
+                    "description": "用印用途,枚举值:'销售合同', '渠道合同', '付款通知函', '招投标', '战略合作协议';默认:销售合同",
+                    "type": "string"
+                }
+            }
+        },
+        "seal.EditReq": {
+            "title": "EditReq",
+            "type": "object",
+            "properties": {
+                "CompanyName": {
+                    "description": "客户名称,甲方名称,长度32位",
+                    "type": "string"
+                },
+                "ContractId": {
+                    "description": "系统合同id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CreditCode": {
+                    "description": "社会统一信用代码,长度64位",
+                    "type": "string"
+                },
+                "FileNum": {
+                    "description": "文件份数",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "FileUrl": {
+                    "description": "文件附件地址",
+                    "type": "string"
+                },
+                "Remark": {
+                    "description": "备注,长度255位",
+                    "type": "string"
+                },
+                "SealId": {
+                    "description": "用印id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "SealType": {
+                    "description": "加盖印章类型,枚举值:'合同章', '公章', '法人章';默认:合同章",
+                    "type": "string"
+                },
+                "ServiceType": {
+                    "description": "业务类型,枚举值:'新签合同','续约合同','补充协议';默认:新签合同",
+                    "type": "string"
+                },
+                "Use": {
+                    "description": "用印用途,枚举值:'销售合同', '渠道合同', '付款通知函', '招投标', '战略合作协议';默认:销售合同",
+                    "type": "string"
+                },
+                "UseCompanyName": {
+                    "description": "实际适用方客户名称,长度32位",
+                    "type": "string"
+                }
+            }
+        },
+        "seal.InvalidReq": {
+            "title": "InvalidReq",
+            "type": "object",
+            "properties": {
+                "IsInvalidContract": {
+                    "description": "是否同步作废合同,默认:false",
+                    "type": "boolean"
+                },
+                "SealId": {
+                    "description": "用印id",
+                    "type": "integer",
+                    "format": "int64"
+                }
+            }
+        },
+        "seal.OpButton": {
+            "title": "OpButton",
+            "type": "object",
+            "properties": {
+                "Approval": {
+                    "description": "是否有审批权限",
+                    "type": "boolean"
+                },
+                "Cancel": {
+                    "description": "是否有撤回用印权限",
+                    "type": "boolean"
+                },
+                "CheckEdit": {
+                    "description": "审核状态下是否有编辑用印权限",
+                    "type": "boolean"
+                },
+                "Edit": {
+                    "description": "是否有编辑用印权限",
+                    "type": "boolean"
+                },
+                "Invalid": {
+                    "description": "是否有作废用印权限",
+                    "type": "boolean"
+                },
+                "UploadFile": {
+                    "description": "是否有上传签回文件权限",
+                    "type": "boolean"
+                }
+            }
+        },
+        "seal.RejectReq": {
+            "title": "RejectReq",
+            "type": "object",
+            "properties": {
+                "Remark": {
+                    "description": "备注字段",
+                    "type": "string"
+                },
+                "SealId": {
+                    "description": "用印id",
+                    "type": "integer",
+                    "format": "int64"
+                }
+            }
+        },
+        "seal.Seal": {
+            "title": "Seal",
+            "type": "object",
+            "properties": {
+                "ApprovalRemark": {
+                    "description": "审核备注",
+                    "type": "string"
+                },
+                "ApproveTime": {
+                    "description": "审批时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "CheckBackFileTime": {
+                    "description": "签回用印附件时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "CheckBackFileUrl": {
+                    "description": "已签回的文件地址",
+                    "type": "string"
+                },
+                "Code": {
+                    "description": "用印编号,长度32位",
+                    "type": "string"
+                },
+                "CompanyName": {
+                    "description": "客户名称,甲方名称,长度32位",
+                    "type": "string"
+                },
+                "ContractId": {
+                    "description": "系统合同id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "CreateTime": {
+                    "description": "添加时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "CreditCode": {
+                    "description": "社会统一信用代码,长度64位",
+                    "type": "string"
+                },
+                "FileNum": {
+                    "description": "文件附件份数",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "FileUrl": {
+                    "description": "文件附件地址",
+                    "type": "string"
+                },
+                "InvalidTime": {
+                    "description": "作废时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "ModifyTime": {
+                    "description": "最近一次修改时间",
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "Remark": {
+                    "description": "补充内容,长度255位",
+                    "type": "string"
+                },
+                "SealId": {
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "SealType": {
+                    "description": "加盖印章类型,枚举值:'合同章', '公章', '法人章';默认:合同章",
+                    "type": "string"
+                },
+                "ServiceType": {
+                    "description": "业务类型,枚举值:'新签合同','续约合同','补充协议';默认:新签合同",
+                    "type": "string"
+                },
+                "Status": {
+                    "description": "合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废','已签回'",
+                    "type": "string"
+                },
+                "Use": {
+                    "description": "用印用途,枚举值:'销售合同', '渠道合同', '付款通知函', '招投标', '战略合作协议';默认:销售合同",
+                    "type": "string"
+                },
+                "UseCompanyName": {
+                    "description": "实际使用方客户名称,长度32位",
+                    "type": "string"
+                },
+                "UserId": {
+                    "description": "申请人id",
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "UserName": {
+                    "description": "申请人名称",
+                    "type": "string"
+                }
+            }
+        },
+        "seal.SealApprovalListResp": {
+            "title": "SealApprovalListResp",
+            "type": "object",
+            "properties": {
+                "List": {
+                    "description": "列表数据",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/contract_approval.SealApprovalList"
+                    }
+                },
+                "Paging": {
+                    "$ref": "#/definitions/paging.PagingItem"
+                }
+            }
+        },
+        "seal.SealDetailResp": {
+            "title": "SealDetailResp",
+            "type": "object",
+            "properties": {
+                "FlowNodeList": {
+                    "description": "审批流",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/722.\u003cnil\u003e.0xc00077cab0"
+                    }
+                },
+                "OpButton": {
+                    "$ref": "#/definitions/seal.OpButton",
+                    "description": "操作权限"
+                },
+                "SealDetail": {
+                    "$ref": "#/definitions/seal.Seal",
+                    "description": "审批单详情"
+                }
+            }
+        },
+        "seal.UploadCheckBackFileReq": {
+            "title": "UploadCheckBackFileReq",
+            "type": "object",
+            "properties": {
+                "FileUrl": {
+                    "description": "签回用印url",
+                    "type": "string"
+                },
+                "SealId": {
+                    "description": "用印id",
+                    "type": "integer",
+                    "format": "int64"
+                }
+            }
+        },
+        "wechat.WxLoginResp": {
+            "title": "WxLoginResp",
+            "type": "object",
+            "properties": {
+                "AdminId": {
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "Authorization": {
+                    "type": "string"
+                },
+                "Code": {
+                    "type": "integer",
+                    "format": "int64"
+                },
+                "Expires": {
+                    "type": "string",
+                    "format": "datetime"
+                },
+                "Headimgurl": {
+                    "description": "用户头像",
+                    "type": "string"
+                },
+                "RealName": {
+                    "description": "用户名称",
+                    "type": "string"
+                },
+                "UserInfo": {
+                    "$ref": "#/definitions/admin.LoginResp",
+                    "description": "用户信息"
+                }
+            }
+        }
+    },
+    "tags": [
+        {
+            "name": "approval",
+            "description": "客户审批列表\n"
+        },
+        {
+            "name": "message",
+            "description": "消息模块\n"
+        },
+        {
+            "name": "company_contract",
+            "description": "客户合同模块\n"
+        },
+        {
+            "name": "contract",
+            "description": "合同模块\n"
+        },
+        {
+            "name": "contract_approval",
+            "description": "合同审批模块\n"
+        },
+        {
+            "name": "seal",
+            "description": "SealCommon\n用印模块\n"
+        },
+        {
+            "name": "seal_approval",
+            "description": "SealApprovalCommon 用印审批模块\n"
+        },
+        {
+            "name": "resource",
+            "description": "资源管理-图片上传,合同上传等\n"
+        },
+        {
+            "name": "roadshow",
+            "description": "日历\n"
+        }
+    ]
+}

+ 3252 - 0
swagger/swagger.yml

@@ -0,0 +1,3252 @@
+swagger: "2.0"
+info:
+  title: 弘则手机端管理后台接口
+  description: 这是弘则手机端管理后台接口api文档,统一出、入参;出参格式:{"code":200,"data":{},"msg":"操作成功","errMsg":"开发人员查看的错误信息"},code是业务响应码,200
+    代表正常返回;400 代表业务处理失败,前端同学需要做额外逻辑处理;401 代表token异常,用户需要重新静默授权,获取最新的token;403代表用户需要进行绑定操作,需要跳转到输入账号密码绑定页面。同时如果出现其他返回值(没有在约定范围内),那么及时联系后端同事;msg是用来提示前端同学,一般只在code为
+    400 的情况下才会展示给用户去看;data是业务返回数据,给前端做逻辑处理。
+  version: 1.0.0
+  termsOfService: http://beego.me/
+  contact:
+    email: astaxie@gmail.com
+  license:
+    name: Apache 2.0
+    url: http://www.apache.org/licenses/LICENSE-2.0.html
+basePath: /h5adminapi
+paths:
+  /admin/login:
+    post:
+      tags:
+      - admin
+      description: 用户账号、密码登录接口
+      operationId: AdminCommon.用户账号、密码登录接口
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/admin.LoginReq'
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/admin.LoginResp'
+  /admin/logout:
+    post:
+      tags:
+      - admin
+      description: 用户退出登录接口
+      operationId: AdminCommon.用户退出登录接口
+      responses:
+        Ret=200:
+          description: 退出成功
+  /approval/approve:
+    post:
+      tags:
+      - approval
+      description: 审批接口
+      operationId: ApprovalCommon.审批
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/approval.CompanyApplyApproveReq'
+      responses:
+        Ret=200:
+          description: 审批成功
+  /approval/approve_old:
+    post:
+      tags:
+      - approval
+      description: 审批接口
+      operationId: ApprovalCommon.审批
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/approval.CompanyApplyApproveReq'
+      responses:
+        Ret=200:
+          description: 审批成功
+  /approval/company_list:
+    get:
+      tags:
+      - approval
+      description: 获取合同详情接口
+      operationId: ApprovalCommon.根据客户名称获取已存在合同系统中客户名称列表
+      parameters:
+      - in: query
+        name: Keyword
+        description: 搜索关键字:客户名称、组织社会信用码
+        required: true
+        type: string
+      responses:
+        "200":
+          description: ""
+          schema:
+            type: array
+            items:
+              type: string
+  /approval/detail:
+    get:
+      tags:
+      - approval
+      description: 获取审批单详情接口
+      operationId: ApprovalCommon.获取审批单详情接口
+      parameters:
+      - in: query
+        name: ApprovalId
+        description: 审批单id
+        required: true
+        type: integer
+        format: int64
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/approval.CompanyApprovalDetailResp'
+  /approval/detail_old:
+    get:
+      tags:
+      - approval
+      description: 获取审批单详情接口
+      operationId: ApprovalCommon.获取审批单详情接口
+      parameters:
+      - in: query
+        name: ApprovalId
+        description: 审批单id
+        required: true
+        type: integer
+        format: int64
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/approval.CompanyApprovalDetailResp'
+  /approval/flowDetail:
+    get:
+      tags:
+      - approval
+      description: 获取审批流详情接口
+      operationId: ApprovalCommon.获取审批流详情接口
+      parameters:
+      - in: query
+        name: FlowId
+        description: 审批流程id;1:ficc客户审批;2:权益客户审批;3:ficc合同审批,4:权益合同审批,5:用印审批(合同章),6:用印审批(公章、法人章)
+        required: true
+        type: integer
+        format: int64
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/approval_flow.ApprovalFlowItem'
+  /approval/getApprovalPermissionList:
+    get:
+      tags:
+      - approval
+      description: 获取审批单中的权限列表接口
+      operationId: ApprovalCommon.获取审批单中的权限列表
+      parameters:
+      - in: query
+        name: ApprovalId
+        description: 审批单id
+        required: true
+        type: integer
+        format: int64
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/approval.CompanyPermissionResp'
+  /approval/list:
+    get:
+      tags:
+      - approval
+      description: 获取审批列表接口
+      operationId: ApprovalCommon.获取审批列表接口
+      parameters:
+      - in: query
+        name: PageSize
+        description: 每页数据条数
+        required: true
+        type: integer
+        format: int64
+      - in: query
+        name: CurrentIndex
+        description: 当前页页码,从1开始
+        required: true
+        type: integer
+        format: int64
+      - in: query
+        name: Status
+        description: 状态:'待审批','已审批','驳回','已撤回'
+        required: true
+        type: string
+      - in: query
+        name: KeyWord
+        description: 搜索关键词
+        required: true
+        type: string
+      - in: query
+        name: Keyword
+        description: 搜索关键词
+        required: true
+        type: string
+      - in: query
+        name: KeywordEq
+        description: 搜索关键词(全等)
+        required: true
+        type: string
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/approval.CompanyApprovalListResp'
+  /approval/list_old:
+    get:
+      tags:
+      - approval
+      description: 获取审批列表接口
+      operationId: ApprovalCommon.获取审批列表接口
+      parameters:
+      - in: query
+        name: PageSize
+        description: 每页数据条数
+        required: true
+        type: integer
+        format: int64
+      - in: query
+        name: CurrentIndex
+        description: 当前页页码,从1开始
+        required: true
+        type: integer
+        format: int64
+      - in: query
+        name: Status
+        description: 状态:'待审批','已审批','驳回','已撤回'
+        required: true
+        type: string
+      - in: query
+        name: KeyWord
+        description: 搜索关键词
+        required: true
+        type: string
+      - in: query
+        name: Keyword
+        description: 搜索关键词
+        required: true
+        type: string
+      - in: query
+        name: KeywordEq
+        description: 搜索关键词(全等)
+        required: true
+        type: string
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/approval.CompanyApprovalListResp'
+  /company_contract/detail:
+    get:
+      tags:
+      - company_contract
+      description: 合同详情接口
+      operationId: CompanyContractCommon.合同详情详情
+      parameters:
+      - in: query
+        name: CompanyId
+        description: 客户ID
+        required: true
+        type: integer
+        format: int64
+      - in: query
+        name: CompanyContractId
+        description: 合同id
+        required: true
+        type: integer
+        format: int64
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/company_contract.CompanyContractDetailResp'
+  /contract/company_list:
+    get:
+      tags:
+      - contract
+      description: 获取合同详情接口
+      operationId: ContractCommon.根据客户名称获取已存在合同系统中客户名称列表
+      parameters:
+      - in: query
+        name: CompanyName
+        description: 客户名称
+        required: true
+        type: string
+      - in: query
+        name: Keyword
+        description: 关键字:客户名称、社会信用码
+        required: true
+        type: string
+      - in: query
+        name: Status
+        description: 合同状态
+        required: true
+        type: string
+      responses:
+        "200":
+          description: ""
+          schema:
+            type: array
+            items:
+              type: string
+  /contract/companyListBySeal:
+    get:
+      tags:
+      - contract
+      description: 获取合同详情接口
+      operationId: ContractCommon.根据客户名称获取已存在合同系统中客户名称列表
+      parameters:
+      - in: query
+        name: CompanyName
+        description: 客户名称
+        required: true
+        type: string
+      - in: query
+        name: Keyword
+        description: 关键字:客户名称、社会信用码
+        required: true
+        type: string
+      - in: query
+        name: Status
+        description: 合同状态
+        required: true
+        type: string
+      responses:
+        "200":
+          description: ""
+          schema:
+            type: array
+            items:
+              type: string
+  /contract/detail:
+    get:
+      tags:
+      - contract
+      description: 获取合同详情接口
+      operationId: ContractCommon.获取合同详情
+      parameters:
+      - in: query
+        name: ContractId
+        description: 合同id
+        required: true
+        type: integer
+        format: int64
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/contract.ContractDetailResp'
+  /contract/invalid:
+    post:
+      tags:
+      - contract
+      description: 作废合同接口
+      operationId: ContractCommon.作废合同
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/contract.InvalidReq'
+      responses:
+        Ret=200:
+          description: 作废成功
+  /contract/list:
+    get:
+      tags:
+      - contract
+      description: 合同列表接口
+      operationId: ContractCommon.合同列表
+      parameters:
+      - in: query
+        name: ContractType
+        description: 合同类型,枚举值:'新签合同','续约合同','补充协议'
+        type: string
+      - in: query
+        name: Status
+        description: 合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废'
+        type: string
+      - in: query
+        name: ProductId
+        description: 客户类型:传0或者不传为当前账号权限,1 代表是:ficc;2 代表是:权益
+        type: integer
+        format: int64
+      - in: query
+        name: ModifyStartTime
+        description: 服务更新时间的选择开始时间,格式:2021-05-23 00:00:00
+        type: string
+      - in: query
+        name: ModifyEndTime
+        description: 服务更新时间的选择结束时间,格式:2021-05-26 23:59:59
+        type: string
+      - in: query
+        name: SellerId
+        description: 选择的销售id
+        type: string
+      - in: query
+        name: Keyword
+        description: 搜索关键字
+        type: string
+      - in: query
+        name: KeywordEq
+        description: 搜索关键字(全等)
+        type: string
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/contract.ContractListResp'
+  /contract/listBySeal:
+    get:
+      tags:
+      - contract
+      description: 合同列表接口
+      operationId: ContractCommon.合同列表
+      parameters:
+      - in: query
+        name: ContractType
+        description: 合同类型,枚举值:'新签合同','续约合同','补充协议'
+        type: string
+      - in: query
+        name: Status
+        description: 合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废'
+        type: string
+      - in: query
+        name: ProductId
+        description: 客户类型:传0或者不传为当前账号权限,1 代表是:ficc;2 代表是:权益
+        type: integer
+        format: int64
+      - in: query
+        name: ModifyStartTime
+        description: 服务更新时间的选择开始时间,格式:2021-05-23 00:00:00
+        type: string
+      - in: query
+        name: ModifyEndTime
+        description: 服务更新时间的选择结束时间,格式:2021-05-26 23:59:59
+        type: string
+      - in: query
+        name: SellerId
+        description: 选择的销售id
+        type: string
+      - in: query
+        name: Keyword
+        description: 搜索关键字
+        type: string
+      - in: query
+        name: KeywordEq
+        description: 搜索关键字(全等)
+        type: string
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/contract.ContractListResp'
+  /contract/listV2:
+    get:
+      tags:
+      - contract
+      description: 合同列表接口(包含待提交的)
+      operationId: ContractCommon.合同列表(包含待提交的)
+      parameters:
+      - in: query
+        name: ContractType
+        description: 合同类型,枚举值:'新签合同','续约合同','补充协议'
+        type: string
+      - in: query
+        name: Status
+        description: 合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废'
+        type: string
+      - in: query
+        name: ProductId
+        description: 客户类型:传0或者不传为当前账号权限,1 代表是:ficc;2 代表是:权益
+        type: integer
+        format: int64
+      - in: query
+        name: ModifyStartTime
+        description: 服务更新时间的选择开始时间,格式:2021-05-23 00:00:00
+        type: string
+      - in: query
+        name: ModifyEndTime
+        description: 服务更新时间的选择结束时间,格式:2021-05-26 23:59:59
+        type: string
+      - in: query
+        name: SellerId
+        description: 选择的销售id
+        type: string
+      - in: query
+        name: Keyword
+        description: 搜索关键字
+        type: string
+      - in: query
+        name: KeywordEq
+        description: 搜索关键字(全等)
+        type: string
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/contract.ContractListRespV2'
+  /contract/upload_check_back_file:
+    post:
+      tags:
+      - contract
+      description: 上传签回附件接口
+      operationId: ContractCommon.上传签回附件
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/contract.UploadCheckBackFileReq'
+      responses:
+        Ret=200:
+          description: 上传成功
+  /contract_approval/approved:
+    post:
+      tags:
+      - contract_approval
+      description: 处理审批单
+      operationId: ContractApprovalCommon.处理审批单
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/contract.ApprovedReq'
+      responses:
+        Ret=200:
+          description: 申请成功
+  /contract_approval/detail:
+    get:
+      tags:
+      - contract_approval
+      description: 审批单详情接口
+      operationId: ContractApprovalCommon.审批单详情
+      parameters:
+      - in: query
+        name: ContractApprovalId
+        description: 审批单id
+        type: integer
+        format: int64
+      - in: query
+        name: ContractApprovalRecordId
+        description: 审批流程单id
+        type: integer
+        format: int64
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/contract.ContractDetailResp'
+  /contract_approval/list:
+    get:
+      tags:
+      - contract_approval
+      description: 审批单列表接口
+      operationId: ContractApprovalCommon.审批单列表
+      parameters:
+      - in: query
+        name: ContractType
+        description: 合同类型,枚举值:'新签合同','续约合同','补充协议'
+        type: string
+      - in: query
+        name: Status
+        description: 合同状态,枚举值:'待审批','已审批','已驳回','已撤回'
+        type: string
+      - in: query
+        name: ProductId
+        description: 客户类型:传0或者不传为当前账号权限,1 代表是:ficc;2 代表是:权益
+        type: integer
+        format: int64
+      - in: query
+        name: SellerId
+        description: 选择的销售id
+        type: string
+      - in: query
+        name: Keyword
+        description: 搜索关键字
+        type: string
+      - in: query
+        name: KeywordEq
+        description: 搜索关键字(全等)
+        type: string
+      - in: query
+        name: ModifyStartTime
+        description: 服务更新时间的选择开始时间,格式:2021-05-23 00:00:00
+        type: string
+      - in: query
+        name: ModifyEndTime
+        description: 服务更新时间的选择结束时间,格式:2021-05-26 23:59:59
+        type: string
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/contract.ContractApprovalListResp'
+  /contract_approval/reject:
+    post:
+      tags:
+      - contract_approval
+      description: 驳回审批接口
+      operationId: ContractApprovalCommon.驳回审批
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/contract.RejectReq'
+      responses:
+        Ret=200:
+          description: 驳回成功
+  /message/list:
+    get:
+      tags:
+      - message
+      description: 消息列表接口
+      operationId: MessageCommon.消息列表
+      parameters:
+      - in: query
+        name: SourceType
+        description: 消息类型
+        required: true
+        type: integer
+        format: int64
+      - in: query
+        name: CurrentIndex
+        description: 当前页码
+        required: true
+        type: integer
+        format: int64
+      - in: query
+        name: pageSize
+        description: 每页数量
+        required: true
+        type: integer
+        format: int64
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/message.CompanyApprovalMessageListResp'
+  /message/read:
+    post:
+      tags:
+      - message
+      description: 消息已读接口
+      operationId: MessageCommon.消息已读
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/company.CompanyApprovalMessageReadReq'
+      responses:
+        Ret=200:
+          description: 申请成功
+  /message/summaryMessageList:
+    get:
+      tags:
+      - message
+      description: 消息列表汇总页接口
+      operationId: MessageCommon.消息列表汇总页
+      responses:
+        "200":
+          description: ""
+          schema:
+            type: array
+            items:
+              $ref: '#/definitions/message.SummaryMessage'
+  /resource/upload:
+    post:
+      tags:
+      - resource
+      description: 图片上传接口
+      operationId: ResourceCommon.图片上传
+      parameters:
+      - in: query
+        name: file
+        description: 文件
+        required: true
+        type: file
+      responses:
+        "200":
+          description: 新增成功
+  /resource/upload_image_base64:
+    post:
+      tags:
+      - resource
+      description: 上传图片
+      operationId: ResourceCommon.上传图片
+      parameters:
+      - in: query
+        name: Image
+        description: 图片,base64字符串
+        type: string
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/models.ImageResponse'
+  /roadshow/accept:
+    post:
+      tags:
+      - roadshow
+      description: 接受路演活动接口
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/rs.AcceptReq'
+      responses:
+        Ret=200:
+          description: 保存成功
+  /roadshow/activity/type/list:
+    get:
+      tags:
+      - roadshow
+      description: 获取报告电话会类型接口
+      operationId: CalendarController.获取报告电话会类型
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/rs.ResearcherGroup'
+  /roadshow/add:
+    post:
+      tags:
+      - roadshow
+      description: 新增路演活动接口
+      operationId: CalendarController.新增路演活动接口
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/rs.AddActivityReq'
+      responses:
+        Ret=200:
+          description: 保存成功
+  /roadshow/back:
+    post:
+      tags:
+      - roadshow
+      description: 撤回路演活动接口
+      operationId: CalendarController.撤回路演活动接口
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/rs.AcceptReq'
+      responses:
+        Ret=200:
+          description: 保存成功
+  /roadshow/calendar/detail:
+    get:
+      tags:
+      - roadshow
+      description: 日历详情接口
+      operationId: CalendarController.日历详情
+      parameters:
+      - in: query
+        name: RsCalendarId
+        description: 路演活动id
+        required: true
+        type: integer
+        format: int64
+      - in: query
+        name: RsCalendarResearcherId
+        description: 活动研究员id
+        required: true
+        type: integer
+        format: int64
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/rs.CalendarDetailResp'
+  /roadshow/calendar/list:
+    get:
+      tags:
+      - roadshow
+      description: 我的日历列表接口
+      operationId: CalendarController.我的日历列表
+      parameters:
+      - in: query
+        name: PageSize
+        description: 每页数据条数
+        required: true
+        type: integer
+        format: int64
+      - in: query
+        name: CurrentIndex
+        description: 当前页页码,从1开始
+        required: true
+        type: integer
+        format: int64
+      - in: query
+        name: Status
+        description: 1:待接受,2:包含,已接受,已拒绝,已删除,已撤回,已结束
+        required: true
+        type: integer
+        format: int64
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/rs.CalendarListResp'
+  /roadshow/calendar/type/list:
+    get:
+      tags:
+      - roadshow
+      description: 内部会议和报告电话会日历列表
+      operationId: CalendarController.内部会议和报告电话会日历列表
+      parameters:
+      - in: query
+        name: PageSize
+        description: 每页数据条数
+        required: true
+        type: integer
+        format: int64
+      - in: query
+        name: CurrentIndex
+        description: 当前页页码,从1开始
+        required: true
+        type: integer
+        format: int64
+      - in: query
+        name: CalendarType
+        description: 1:内部会议,2:报告电话会
+        required: true
+        type: integer
+        format: int64
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/rs.CalendarListResp'
+  /roadshow/company/detail:
+    get:
+      tags:
+      - roadshow
+      description: 我的日历列表接口
+      operationId: CalendarController.我的日历列表
+      parameters:
+      - in: query
+        name: CompanyId
+        description: 公司id
+        required: true
+        type: integer
+        format: int64
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/rs.CompanyDetailView'
+  /roadshow/company/search:
+    get:
+      tags:
+      - roadshow
+      description: 我的日历列表接口
+      operationId: CalendarController.我的日历列表
+      parameters:
+      - in: query
+        name: KeyWord
+        description: 搜索关键词
+        required: true
+        type: string
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/rs.CalendarListResp'
+  /roadshow/delete:
+    post:
+      tags:
+      - roadshow
+      description: 删除路演活动接口
+      operationId: CalendarController.删除路演活动接口
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/rs.DeleteReq'
+      responses:
+        Ret=200:
+          description: 保存成功
+  /roadshow/edit:
+    post:
+      tags:
+      - roadshow
+      description: 编辑路演活动接口
+      operationId: CalendarController.编辑路演活动接口
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/rs.EditActivityReq'
+      responses:
+        Ret=200:
+          description: 保存成功
+  /roadshow/matters/add:
+    post:
+      tags:
+      - roadshow
+      description: 新增事项接口
+      operationId: CalendarController.新增事项接口
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/rs.AddMattersReq'
+      responses:
+        Ret=200:
+          description: 保存成功
+  /roadshow/matters/delete:
+    post:
+      tags:
+      - roadshow
+      description: 删除事项接口
+      operationId: CalendarController.删除事项接口
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/rs.DeleteMattersReq'
+      responses:
+        Ret=200:
+          description: 保存成功
+  /roadshow/matters/list:
+    get:
+      tags:
+      - roadshow
+      description: 事项列表接口
+      operationId: CalendarController.事项列表
+      parameters:
+      - in: query
+        name: PageSize
+        description: 每页数据条数
+        required: true
+        type: integer
+        format: int64
+      - in: query
+        name: CurrentIndex
+        description: 当前页页码,从1开始
+        required: true
+        type: integer
+        format: int64
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/rs.MattersListResp'
+  /roadshow/matters/update:
+    post:
+      tags:
+      - roadshow
+      description: 修改事项接口
+      operationId: CalendarController.修改事项接口
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/rs.UpdateMattersReq'
+      responses:
+        Ret=200:
+          description: 保存成功
+  /roadshow/my/calendar/detail:
+    get:
+      tags:
+      - roadshow
+      description: 路演-我的日历详情接口
+      operationId: CalendarController.路演-我的日历详情
+      parameters:
+      - in: query
+        name: StartDate
+        description: 开始日期
+        required: true
+        type: string
+      - in: query
+        name: EndDate
+        description: 结束日期日期
+        required: true
+        type: string
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/roadshow.CalendarDetailResp'
+  /roadshow/refuse:
+    post:
+      tags:
+      - roadshow
+      description: 拒绝路演活动接口
+      operationId: CalendarController.拒绝路演活动接口
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/rs.RefuseReq'
+      responses:
+        Ret=200:
+          description: 保存成功
+  /roadshow/researcher/calendar/detail:
+    get:
+      tags:
+      - roadshow
+      description: 路演-研究员日历详情接口
+      operationId: CalendarController.路演-研究员日历详情
+      parameters:
+      - in: query
+        name: StartDate
+        description: 开始日期
+        required: true
+        type: string
+      - in: query
+        name: EndDate
+        description: 结束日期日期
+        required: true
+        type: string
+      - in: query
+        name: ResearcherId
+        description: 研究员id
+        required: true
+        type: integer
+        format: int64
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/roadshow.CalendarDetailResp'
+  /roadshow/researcher/list:
+    get:
+      tags:
+      - roadshow
+      description: 研究员列表接口
+      operationId: CalendarController.研究员列表
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/rs.ResearcherGroup'
+  /seal/add:
+    post:
+      tags:
+      - seal
+      description: 新增用印接口
+      operationId: SealCommon.新增用印
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/seal.AddReq'
+      responses:
+        Ret=200:
+          description: 新增用印成功
+  /seal/check_edit:
+    post:
+      tags:
+      - seal
+      description: 审批者编辑用印接口
+      operationId: SealCommon.审批者编辑用印
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/seal.CheckEditReq'
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/seal.AddSealResp'
+  /seal/company_list:
+    get:
+      tags:
+      - seal
+      description: 获取合同详情接口
+      operationId: SealCommon.根据客户名称获取已存在系统中客户名称列表
+      parameters:
+      - in: query
+        name: Keyword
+        description: 关键字:客户名称、组织社会信用码
+        required: true
+        type: string
+      responses:
+        "200":
+          description: ""
+          schema:
+            type: array
+            items:
+              type: string
+  /seal/detail:
+    get:
+      tags:
+      - seal
+      description: 获取用印详情接口
+      operationId: SealCommon.获取用印详情
+      parameters:
+      - in: query
+        name: SealId
+        description: 用印id
+        required: true
+        type: integer
+        format: int64
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/seal.SealDetailResp'
+  /seal/edit:
+    post:
+      tags:
+      - seal
+      description: 编辑用印接口
+      operationId: SealCommon.编辑用印
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/seal.EditReq'
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/seal.AddSealResp'
+  /seal/invalid:
+    post:
+      tags:
+      - seal
+      description: 作废合同接口
+      operationId: SealCommon.作废合同
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/seal.InvalidReq'
+      responses:
+        Ret=200:
+          description: 作废成功
+  /seal/list:
+    get:
+      tags:
+      - seal
+      description: 用印列表接口
+      operationId: SealCommon.用印列表
+      parameters:
+      - in: query
+        name: Status
+        description: 合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废','已签回'
+        type: string
+      - in: query
+        name: ProductId
+        description: 客户类型:传0或者不传为当前账号权限,1 代表是:ficc;2 代表是:权益
+        type: integer
+        format: int64
+      - in: query
+        name: ModifyStartTime
+        description: 服务更新时间的选择开始时间,格式:2021-05-23 00:00:00
+        type: string
+      - in: query
+        name: ModifyEndTime
+        description: 服务更新时间的选择结束时间,格式:2021-05-26 23:59:59
+        type: string
+      - in: query
+        name: AdminId
+        description: 选择的用户id
+        type: string
+      - in: query
+        name: Keyword
+        description: 搜索关键字
+        type: string
+      - in: query
+        name: KeywordEq
+        description: 搜索关键字(全匹配搜索)
+        type: string
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/contract.ContractListResp'
+  /seal/upload_check_back_file:
+    post:
+      tags:
+      - seal
+      description: 上传签回附件接口
+      operationId: SealCommon.上传签回附件
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/seal.UploadCheckBackFileReq'
+      responses:
+        Ret=200:
+          description: 上传成功
+  /seal_approval/approved:
+    post:
+      tags:
+      - seal_approval
+      description: 处理审批单
+      operationId: SealApprovalCommon.处理审批单
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/seal.ApprovedReq'
+      responses:
+        Ret=200:
+          description: 申请成功
+  /seal_approval/cancelApply:
+    get:
+      tags:
+      - seal_approval
+      description: 撤回审批申请接口
+      operationId: SealApprovalCommon.撤回审批申请
+      parameters:
+      - in: query
+        name: SealId
+        description: 用印id编号
+        required: true
+        type: integer
+        format: int64
+      responses:
+        Ret=200:
+          description: 撤回申请成功
+  /seal_approval/detail:
+    get:
+      tags:
+      - seal_approval
+      description: 审批单详情接口
+      operationId: SealApprovalCommon.审批单详情
+      parameters:
+      - in: query
+        name: SealId
+        description: 用印id
+        type: integer
+        format: int64
+      - in: query
+        name: ContractApprovalId
+        description: 审批单id
+        type: integer
+        format: int64
+      - in: query
+        name: ContractApprovalRecordId
+        description: 审批流程单id
+        type: integer
+        format: int64
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/seal.SealDetailResp'
+  /seal_approval/list:
+    get:
+      tags:
+      - seal_approval
+      description: 审批单列表接口
+      operationId: SealApprovalCommon.审批单列表
+      parameters:
+      - in: query
+        name: Use
+        description: 用途,枚举值:销售合同, 渠道合同, 付款通知函, 招投标, 战略合作协议
+        type: string
+      - in: query
+        name: ServiceType
+        description: "false"
+        type: string
+      - in: query
+        name: SealType
+        description: 公章类型,枚举值:合同章, 公章, 法人章
+        type: string
+      - in: query
+        name: Status
+        description: 合同状态,枚举值:'待审批','已审批','已驳回','已撤回','已签回'
+        type: string
+      - in: query
+        name: UserId
+        description: 选择的申请人id
+        type: string
+      - in: query
+        name: Keyword
+        description: 搜索关键字
+        type: string
+      - in: query
+        name: KeywordEq
+        description: 搜索关键字(全等)
+        type: string
+      - in: query
+        name: ModifyStartTime
+        description: 服务更新时间的选择开始时间,格式:2021-05-23 00:00:00
+        type: string
+      - in: query
+        name: ModifyEndTime
+        description: 服务更新时间的选择结束时间,格式:2021-05-26 23:59:59
+        type: string
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/seal.SealApprovalListResp'
+  /seal_approval/reject:
+    post:
+      tags:
+      - seal_approval
+      description: 驳回审批接口
+      operationId: SealApprovalCommon.驳回审批
+      parameters:
+      - in: body
+        name: request
+        description: type json string
+        required: true
+        schema:
+          $ref: '#/definitions/seal.RejectReq'
+      responses:
+        Ret=200:
+          description: 驳回成功
+  /wechat/login:
+    get:
+      tags:
+      - wechat
+      description: 微信登录接口
+      operationId: WeChatCommon.微信登录接口
+      parameters:
+      - in: query
+        name: Code
+        description: 微信唯一编码code
+        required: true
+        type: string
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/wechat.WxLoginResp'
+  /wechat/wxapp/login:
+    get:
+      tags:
+      - wechat
+      description: 微信登录接口
+      operationId: WeChatCommon.微信登录接口
+      parameters:
+      - in: query
+        name: Code
+        description: 微信唯一编码code
+        required: true
+        type: string
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/wechat.WxLoginResp'
+definitions:
+  645.<nil>.0xc00077c3d8:
+    title: "0xc00077c3d8"
+    type: object
+  722.<nil>.0xc00077cab0:
+    title: "0xc00077cab0"
+    type: object
+  1635.<nil>.0xc00077c780:
+    title: "0xc00077c780"
+    type: object
+  admin.LoginReq:
+    title: LoginReq
+    type: object
+    properties:
+      Password:
+        description: 密码
+        type: string
+      Username:
+        description: 账号
+        type: string
+  admin.LoginResp:
+    title: LoginResp
+    type: object
+    properties:
+      AdminId:
+        description: 系统用户id
+        type: integer
+        format: int64
+      AdminName:
+        description: 系统用户名称
+        type: string
+      Authority:
+        description: 管理权限,0:无,1:部门负责人,2:小组负责人,3:超级管理员
+        type: integer
+        format: int64
+      DepartmentName:
+        description: 所属部门
+        type: string
+      GroupName:
+        description: 所属分组
+        type: string
+      Headimgurl:
+        description: 用户头像
+        type: string
+      ProductName:
+        description: 产品名称:admin,ficc,权益
+        type: string
+      RealName:
+        description: 系统用户姓名
+        type: string
+      RoleName:
+        description: 角色名称
+        type: string
+      RoleTypeCode:
+        description: 角色类型编码
+        type: string
+  approval.CompanyApplyApproveReq:
+    title: CompanyApplyApproveReq
+    type: object
+    properties:
+      CompanyApprovalId:
+        description: 审批单id
+        type: integer
+        format: int64
+      CompanyContractId:
+        description: 合同id
+        type: integer
+        format: int64
+      CompanyId:
+        description: 客户id
+        type: integer
+        format: int64
+      Remark:
+        description: 审批理由
+        type: string
+      Status:
+        description: 审批状态,1:通过,2:拒绝
+        type: integer
+        format: int64
+  approval.CompanyApprovalDetailResp:
+    title: CompanyApprovalDetailResp
+    type: object
+    properties:
+      CompanyApprovalDetail:
+        $ref: '#/definitions/company_approval.CompanyApprovalList'
+        description: 审批单详情
+      FiccPermissionList:
+        description: Ficc权限列表
+        type: array
+        items:
+          $ref: '#/definitions/company_report_permission.PermissionLookList'
+      FlowNodeList:
+        description: 审批流
+        type: array
+        items:
+          $ref: '#/definitions/645.<nil>.0xc00077c3d8'
+      PermissionList:
+        description: 权益权限列表
+        type: array
+        items:
+          $ref: '#/definitions/company_report_permission.PermissionLookList'
+  approval.CompanyApprovalListResp:
+    title: CompanyApprovalListResp
+    type: object
+    properties:
+      List:
+        type: array
+        items:
+          $ref: '#/definitions/company_approval.CompanyApprovalList'
+      Paging:
+        $ref: '#/definitions/paging.PagingItem'
+  approval.CompanyPermissionResp:
+    title: CompanyPermissionResp
+    type: object
+    properties:
+      FiccPermissionList:
+        description: Ficc权限列表
+        type: array
+        items:
+          $ref: '#/definitions/company_report_permission.PermissionLookList'
+      PermissionList:
+        description: 权益权限列表
+        type: array
+        items:
+          $ref: '#/definitions/company_report_permission.PermissionLookList'
+  approval_flow.ApprovalFlowItem:
+    title: ApprovalFlowItem
+    type: object
+    properties:
+      CreateTime:
+        description: 创建时间
+        type: string
+        format: datetime
+      CurrVersion:
+        description: 当前流程版本
+        type: integer
+        format: int64
+      FlowId:
+        description: 流程id
+        type: integer
+        format: int64
+      FlowName:
+        description: 流程名称
+        type: string
+      ModifyTime:
+        description: 最近一次修改时间
+        type: string
+        format: datetime
+      NodeList:
+        description: 节点流程列表
+        type: array
+        items:
+          $ref: '#/definitions/approval_flow_node.ApprovalFlowNodeList'
+      ProductId:
+        description: 所属类型,0代表通用,1:ficc部门,2:权益部门
+        type: integer
+        format: int64
+  approval_flow_node.ApprovalFlowNodeList:
+    title: ApprovalFlowNodeList
+    type: object
+    properties:
+      AuditType:
+        description: 多人审批时,1:或签(一名审批人同意即可),2:会签(需所有审批人同意)
+        type: integer
+        format: int64
+      CreateTime:
+        description: 创建时间
+        type: string
+        format: datetime
+      FlowId:
+        description: 流程id
+        type: integer
+        format: int64
+      NextNodeId:
+        description: 下级节点id,为0代表是结束节点
+        type: integer
+        format: int64
+      NodeId:
+        description: 流程节点id
+        type: integer
+        format: int64
+      NodeName:
+        description: 流程节点名称
+        type: string
+      NodeType:
+        description: 节点类型,审批人:check;抄送人:cc(Carbon Copy),默认是:check
+        type: string
+      PrevNodeId:
+        description: 上级节点id,为0代表是开始节点
+        type: integer
+        format: int64
+      UserList:
+        description: 审批人、抄送人列表信息
+        type: array
+        items:
+          $ref: '#/definitions/approval_flow_node.User'
+      Version:
+        description: 所属流程版本
+        type: integer
+        format: int64
+  approval_flow_node.User:
+    title: User
+    type: object
+    properties:
+      AdminId:
+        description: 人员id(审批人、抄送人)
+        type: integer
+        format: int64
+      Mobile:
+        description: 手机号(审批人、抄送人)
+        type: string
+      Name:
+        description: 人员名称(审批人、抄送人)
+        type: string
+      RoleTypeCode:
+        description: 人员角色类型(审批人、抄送人)
+        type: string
+  company.CompanyApprovalMessageReadReq:
+    title: CompanyApprovalMessageReadReq
+    type: object
+  company_approval.CompanyApprovalList:
+    title: CompanyApprovalList
+    type: object
+    properties:
+      Address:
+        description: 地址
+        type: string
+      ApplyContractType:
+        description: 申请合同类型  0 非标  1 标准
+        type: integer
+        format: int64
+      ApplyMethod:
+        description: 申请类型:1:试用->正式,2:冻结—>试用,3:试用延期,4:原销售申请领取流失客户,5:正式客户申请服务更新,6:正式客户补充协议
+        type: integer
+        format: int64
+      ApplyRealName:
+        description: 申请人姓名
+        type: string
+      ApplyReasons:
+        description: 申请理由
+        type: string
+      ApprovalCount:
+        description: 已延期审批次数
+        type: integer
+        format: int64
+      ApprovalTime:
+        description: 提交申请时间
+        type: string
+      ApproveContent:
+        description: 待审内容
+        type: string
+      ApproveRemark:
+        description: 驳回理由
+        type: string
+      ApproveStatus:
+        description: 当前状态
+        type: string
+      ApproveTime:
+        description: 审批时间
+        type: string
+      ApproveUserId:
+        description: 审批人
+        type: integer
+        format: int64
+      CompanyApprovalId:
+        description: 审批记录ID
+        type: integer
+        format: int64
+      CompanyContractId:
+        description: 合同id
+        type: integer
+        format: int64
+      CompanyId:
+        type: integer
+        format: int64
+      CompanyName:
+        description: 客户名称
+        type: string
+      CompanyType:
+        description: 客户类型
+        type: string
+      CreateTime:
+        description: 创建时间
+        type: string
+      CreditCode:
+        description: 社会统一信用码
+        type: string
+      CurrNodeId:
+        description: 当前审批操作节点
+        type: integer
+        format: int64
+      DelayPermission:
+        description: 延期申请品种
+        type: string
+      EndDate:
+        description: 结束日期
+        type: string
+      ExpireDay:
+        description: 服务到期天数
+        type: integer
+        format: int64
+      FreezeEndDate:
+        description: 冻结结束日期
+        type: string
+      FreezeExpireDays:
+        description: 冻结到期天数
+        type: integer
+        format: int64
+      FreezeStartDate:
+        description: 冻结开始日期
+        type: string
+      IndustryName:
+        description: 行业名称
+        type: string
+      OpButton:
+        description: 是否审批操作权限
+        type: boolean
+      ProductId:
+        type: integer
+        format: int64
+      SellerName:
+        description: 销售名称
+        type: string
+      Source:
+        description: 客户来源
+        type: string
+      StartDate:
+        description: 开始日期
+        type: string
+      Status:
+        description: 客户状态
+        type: string
+  company_approval_message.ApprovalInfo:
+    title: ApprovalInfo
+    type: object
+    properties:
+      ApplyName:
+        description: 申请人姓名
+        type: string
+      ApplyTime:
+        description: 提交时间
+        type: string
+        format: datetime
+      ApprovalTime:
+        description: 审批时间
+        type: string
+        format: datetime
+      Type:
+        description: 类型
+        type: string
+  company_approval_message.CompanyApprovalMessageList:
+    title: CompanyApprovalMessageList
+    type: object
+    properties:
+      ApprovalInfo:
+        $ref: '#/definitions/company_approval_message.ApprovalInfo'
+        description: 审批单信息
+      ApprovalStatus:
+        description: 审批结果:1:待审批,2:已审批,3:已驳回
+        type: integer
+        format: int64
+      CompanyApprovalId:
+        description: 审批单id
+        type: integer
+        format: int64
+      CompanyName:
+        description: 客户名称
+        type: string
+      Content:
+        description: 消息内容
+        type: string
+      CreateTime:
+        description: 创建时间
+        type: string
+        format: datetime
+      CreateUserId:
+        description: 申请者id
+        type: integer
+        format: int64
+      Id:
+        type: integer
+        format: int64
+      MessageStatus:
+        description: 消息状态:0未读,1:已读,2:作废
+        type: integer
+        format: int64
+      MessageType:
+        description: 1:申请消息,2:审批结果,3:文字消息
+        type: integer
+        format: int64
+      RealName:
+        description: 销售名称
+        type: string
+      Remark:
+        description: 备注信息
+        type: string
+      SourceType:
+        description: 消息来源类型,1:客户,2:合同,3:用印
+        type: integer
+        format: int64
+  company_contract.CompanyContractDetail:
+    title: CompanyContractDetail
+    type: object
+    properties:
+      CompanyContractId:
+        type: integer
+        format: int64
+      CompanyId:
+        description: 客户id
+        type: integer
+        format: int64
+      ContractCode:
+        description: 合同编码
+        type: string
+      ContractType:
+        description: 合同类型:枚举值:'新签合同','续约合同','补充协议'
+        type: string
+      CreateTime:
+        description: 合同创建时间
+        type: string
+        format: datetime
+      EndDate:
+        description: 合同结束时间
+        type: string
+      ImgUrl:
+        description: 合同图片,多个用#隔开
+        type: string
+      ModifyTime:
+        description: 合同修改时间
+        type: string
+        format: datetime
+      Money:
+        description: 合同金额
+        type: number
+        format: double
+      PackageType:
+        description: 套餐类型,0:无,1:大套餐,2:小套餐
+        type: integer
+        format: int64
+      PayChannel:
+        description: 支付渠道
+        type: string
+      PayMethod:
+        description: 支付方式
+        type: string
+      PermissionList:
+        type: array
+        items:
+          $ref: '#/definitions/company_report_permission.PermissionLookList'
+      StartDate:
+        description: 合同开始时间
+        type: string
+      Status:
+        description: 状态
+        type: integer
+        format: int64
+  company_contract.CompanyContractDetailResp:
+    title: CompanyContractDetailResp
+    type: object
+    properties:
+      CompanyContractId:
+        type: integer
+        format: int64
+      CompanyId:
+        description: 客户id
+        type: integer
+        format: int64
+      ContractCode:
+        description: 合同编码
+        type: string
+      ContractType:
+        description: 合同类型:枚举值:'新签合同','续约合同','补充协议'
+        type: string
+      CreateTime:
+        description: 合同创建时间
+        type: string
+        format: datetime
+      EndDate:
+        description: 合同结束时间
+        type: string
+      ImgUrl:
+        description: 合同图片,多个用#隔开
+        type: string
+      ModifyTime:
+        description: 合同修改时间
+        type: string
+        format: datetime
+      Money:
+        description: 合同金额
+        type: number
+        format: double
+      PackageType:
+        description: 套餐类型,0:无,1:大套餐,2:小套餐
+        type: integer
+        format: int64
+      PayChannel:
+        description: 支付渠道
+        type: string
+      PayMethod:
+        description: 支付方式
+        type: string
+      PermissionList:
+        type: array
+        items:
+          $ref: '#/definitions/company_report_permission.PermissionLookList'
+      StartDate:
+        description: 合同开始时间
+        type: string
+      Status:
+        description: 状态
+        type: integer
+        format: int64
+  company_report_permission.PermissionLookItem:
+    title: PermissionLookItem
+    type: object
+    properties:
+      ChartPermissionId:
+        description: 权限id
+        type: integer
+        format: int64
+      ClassifyName:
+        description: 分类
+        type: string
+      EndDate:
+        description: 权限结束日期
+        type: string
+      ExpireDay:
+        description: 到期天数
+        type: string
+      PermissionName:
+        description: 权限名称
+        type: string
+      StartDate:
+        description: 权限开始日期
+        type: string
+      Status:
+        description: '''正式'',''试用'',''关闭'''
+        type: string
+  company_report_permission.PermissionLookList:
+    title: PermissionLookList
+    type: object
+    properties:
+      CheckList:
+        type: array
+        items:
+          type: integer
+          format: int64
+      ClassifyName:
+        description: 分类
+        type: string
+      Items:
+        type: array
+        items:
+          $ref: '#/definitions/company_report_permission.PermissionLookItem'
+  contract.ApprovedReq:
+    title: ApprovedReq
+    type: object
+    properties:
+      ContractId:
+        description: 合同id
+        type: integer
+        format: int64
+      Remark:
+        description: 驳回理由
+        type: string
+  contract.ContractApprovalListResp:
+    title: ContractApprovalListResp
+    type: object
+    properties:
+      List:
+        description: 列表数据
+        type: array
+        items:
+          $ref: '#/definitions/contract_approval.ContractApprovalList'
+      Paging:
+        $ref: '#/definitions/paging.PagingItem'
+  contract.ContractDetail:
+    title: ContractDetail
+    type: object
+    properties:
+      Address:
+        description: 详细地址
+        type: string
+      ApprovalRemark:
+        description: 审核备注
+        type: string
+      ApproveTime:
+        description: 审批时间
+        type: string
+        format: datetime
+      ApproveTimeStr:
+        description: 审批时间
+        type: string
+      CheckBackFileTime:
+        description: 合同签回时间
+        type: string
+        format: datetime
+      CheckBackFileTimeStr:
+        description: 合同签回时间
+        type: string
+      CheckBackFileUrl:
+        description: 签回合同文件地址
+        type: string
+      City:
+        description: 市级名称,长度32位
+        type: string
+      CityId:
+        description: 市级id
+        type: integer
+        format: int64
+      CompanyName:
+        description: 客户名称,甲方名称,长度32位
+        type: string
+      ContractBusinessType:
+        description: 合同业务类型,枚举值:'业务合同','代付合同'
+        type: string
+      ContractCode:
+        description: 合同编号,长度32位
+        type: string
+      ContractId:
+        description: 合同唯一id
+        type: integer
+        format: int64
+      ContractType:
+        description: 合同类型,枚举值:'新签合同','续约合同','补充协议'
+        type: string
+      CreateTime:
+        description: 合同添加时间
+        type: string
+        format: datetime
+      CreateTimeStr:
+        description: 合同添加时间
+        type: string
+      CreditCode:
+        description: 社会统一信用代码,长度64位
+        type: string
+      EndDate:
+        description: 合同结束日期
+        type: string
+        format: datetime
+      EndDateStr:
+        description: 合同结束时间
+        type: string
+      Fax:
+        description: 传真,长度32位
+        type: string
+      FileUrl:
+        description: 合同文件地址
+        type: string
+      InvalidTime:
+        description: 作废时间
+        type: string
+        format: datetime
+      InvalidTimeStr:
+        description: 作废时间
+        type: string
+      ModifyContent:
+        description: 修改内容
+        type: string
+      ModifyTime:
+        description: 合同最近一次修改时间
+        type: string
+        format: datetime
+      ModifyTimeStr:
+        description: 最近一次更新时间
+        type: string
+      OriginalPrice:
+        description: 合同原金额,优惠前的金额
+        type: number
+        format: double
+      PayChannel:
+        description: 付款渠道,长度255位
+        type: string
+      PayRemark:
+        description: 付款方式说明,长度255位
+        type: string
+      PermissionLookList:
+        description: 合同里面的权限列表
+        type: array
+        items:
+          $ref: '#/definitions/company_report_permission.PermissionLookList'
+      Phone:
+        description: 电话,长度32位
+        type: string
+      Postcode:
+        description: 邮编,长度16位
+        type: string
+      Price:
+        description: 实际金额,优惠后的金额
+        type: number
+        format: double
+      ProductId:
+        description: 产品id,1:ficc;2:权益
+        type: integer
+        format: int64
+      Province:
+        description: 省级名称,长度16位
+        type: string
+      ProvinceId:
+        description: 省级id
+        type: integer
+        format: int64
+      RelationContractDetailList:
+        description: 关联合同详情
+        type: array
+        items:
+          $ref: '#/definitions/contract.ContractDetail'
+      Remark:
+        description: 补充内容,长度255位
+        type: string
+      RescindFileUrl:
+        description: 解约合同文件地址
+        type: string
+      RescindTime:
+        description: 解约时间
+        type: string
+        format: datetime
+      RescindTimeStr:
+        description: 解约时间
+        type: string
+      SellerId:
+        description: 所属销售id
+        type: integer
+        format: int64
+      SellerName:
+        description: 所属销售名称
+        type: string
+      SellerRemark:
+        description: 销售备注,长度255位
+        type: string
+      Service:
+        type: array
+        items:
+          $ref: '#/definitions/contract.ContractServiceAndDetail'
+      SourceId:
+        description: 来源合同id,默认是0;如果是通过其他合同复制过来的,那么就是原合同的id
+        type: integer
+        format: int64
+      StartDate:
+        description: 合同开始日期
+        type: string
+        format: datetime
+      StartDateStr:
+        description: 合同起始时间
+        type: string
+      Status:
+        description: 合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废','已解约'
+        type: string
+      TemplateId:
+        description: 模板id
+        type: integer
+        format: int64
+  contract.ContractDetailResp:
+    title: ContractDetailResp
+    type: object
+    properties:
+      ContractDetail:
+        $ref: '#/definitions/contract.ContractDetail'
+        description: 审批单详情
+      FlowNodeList:
+        description: 审批流
+        type: array
+        items:
+          $ref: '#/definitions/1635.<nil>.0xc00077c780'
+      OpButton:
+        $ref: '#/definitions/contract.OpButton'
+        description: 操作权限
+  contract.ContractList:
+    title: ContractList
+    type: object
+    properties:
+      Address:
+        description: 详细地址
+        type: string
+      ApprovalRemark:
+        description: 审核备注
+        type: string
+      ApproveTime:
+        description: 审批时间
+        type: string
+        format: datetime
+      ApproveTimeStr:
+        description: 审批时间
+        type: string
+      CheckBackFileTime:
+        description: 合同签回时间
+        type: string
+        format: datetime
+      CheckBackFileTimeStr:
+        description: 合同签回时间
+        type: string
+      CheckBackFileUrl:
+        description: 签回合同文件地址
+        type: string
+      City:
+        description: 市级名称,长度32位
+        type: string
+      CityId:
+        description: 市级id
+        type: integer
+        format: int64
+      CompanyName:
+        description: 客户名称,甲方名称,长度32位
+        type: string
+      ContractBusinessType:
+        description: 合同业务类型,枚举值:'业务合同','代付合同'
+        type: string
+      ContractCode:
+        description: 合同编号,长度32位
+        type: string
+      ContractId:
+        description: 合同唯一id
+        type: integer
+        format: int64
+      ContractType:
+        description: 合同类型,枚举值:'新签合同','续约合同','补充协议'
+        type: string
+      CreateTime:
+        description: 合同添加时间
+        type: string
+        format: datetime
+      CreateTimeStr:
+        description: 合同添加时间
+        type: string
+      CreditCode:
+        description: 社会统一信用代码,长度64位
+        type: string
+      EndDate:
+        description: 合同结束日期
+        type: string
+        format: datetime
+      EndDateStr:
+        description: 合同结束时间
+        type: string
+      Fax:
+        description: 传真,长度32位
+        type: string
+      FileUrl:
+        description: 合同文件地址
+        type: string
+      InvalidTime:
+        description: 作废时间
+        type: string
+        format: datetime
+      InvalidTimeStr:
+        description: 作废时间
+        type: string
+      ModifyContent:
+        description: 修改内容
+        type: string
+      ModifyTime:
+        description: 合同最近一次修改时间
+        type: string
+        format: datetime
+      ModifyTimeStr:
+        description: 最近一次更新时间
+        type: string
+      OriginalPrice:
+        description: 合同原金额,优惠前的金额
+        type: number
+        format: double
+      PayRemark:
+        description: 付款方式说明,长度255位
+        type: string
+      Phone:
+        description: 电话,长度32位
+        type: string
+      Postcode:
+        description: 邮编,长度16位
+        type: string
+      Price:
+        description: 实际金额,优惠后的金额
+        type: number
+        format: double
+      ProductId:
+        description: 产品id,1:ficc;2:权益
+        type: integer
+        format: int64
+      Province:
+        description: 省级名称,长度16位
+        type: string
+      ProvinceId:
+        description: 省级id
+        type: integer
+        format: int64
+      RescindTime:
+        description: 解约时间
+        type: string
+        format: datetime
+      RescindTimeStr:
+        description: 解约时间
+        type: string
+      SellerId:
+        description: 所属销售id
+        type: integer
+        format: int64
+      SellerName:
+        description: 所属销售名称
+        type: string
+      SellerRemark:
+        description: 销售备注,长度255位
+        type: string
+      Service:
+        type: array
+        items:
+          $ref: '#/definitions/contract.ContractServiceAndDetail'
+      SourceId:
+        description: 来源合同id,默认是0;如果是通过其他合同复制过来的,那么就是原合同的id
+        type: integer
+        format: int64
+      StartDate:
+        description: 合同开始日期
+        type: string
+        format: datetime
+      StartDateStr:
+        description: 合同起始时间
+        type: string
+      Status:
+        description: 合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废'
+        type: string
+      TemplateId:
+        description: 模板id
+        type: integer
+        format: int64
+      UseCompanyName:
+        description: 使用方名称,长度32位
+        type: string
+  contract.ContractListResp:
+    title: ContractListResp
+    type: object
+    properties:
+      List:
+        description: 列表数据
+        type: array
+        items:
+          $ref: '#/definitions/contract.ContractList'
+      Paging:
+        $ref: '#/definitions/paging.PagingItem'
+  contract.ContractListRespV2:
+    title: ContractListRespV2
+    type: object
+    properties:
+      List:
+        description: 列表数据
+        type: array
+        items:
+          $ref: '#/definitions/contract_approval.ContractApprovalList'
+      Paging:
+        $ref: '#/definitions/paging.PagingItem'
+  contract.ContractServiceAndDetail:
+    title: ContractServiceAndDetail
+    type: object
+    properties:
+      ChartPermissionId:
+        description: 权限id
+        type: integer
+        format: int64
+      ContractId:
+        description: 合同id
+        type: integer
+        format: int64
+      ContractServiceId:
+        type: integer
+        format: int64
+      DetailList:
+        type: array
+        items:
+          $ref: '#/definitions/contract_service_detail.ContractServiceDetail'
+      HasDetail:
+        description: 是否有详情,枚举值:是、否;默认:否
+        type: string
+      ProductId:
+        description: 产品id,1:ficc;2:权益
+        type: integer
+        format: int64
+      ServiceTemplateId:
+        description: 合同服务模板id
+        type: integer
+        format: int64
+      TableValue:
+        description: 表格数据,用于word生成时的json数据
+        type: string
+      Title:
+        description: 套餐标题
+        type: string
+      Value:
+        description: 套餐的值
+        type: string
+  contract.InvalidReq:
+    title: InvalidReq
+    type: object
+    properties:
+      ContractId:
+        description: 合同id
+        type: integer
+        format: int64
+  contract.OpButton:
+    title: OpButton
+    type: object
+    properties:
+      Approval:
+        description: 是否有审批权限
+        type: boolean
+      Invalid:
+        description: 是否有作废合同权限
+        type: boolean
+      UploadFile:
+        description: 是否有上传签回文件权限
+        type: boolean
+  contract.RejectReq:
+    title: RejectReq
+    type: object
+    properties:
+      ContractId:
+        description: 合同id
+        type: integer
+        format: int64
+      Remark:
+        description: 备注字段
+        type: string
+  contract.UploadCheckBackFileReq:
+    title: UploadCheckBackFileReq
+    type: object
+    properties:
+      ContractId:
+        description: 合同id
+        type: integer
+        format: int64
+      FileUrl:
+        description: 签回合同url
+        type: string
+  contract_approval.ContractApprovalList:
+    title: ContractApprovalList
+    type: object
+    properties:
+      ApplyContent:
+        description: 待审内容
+        type: string
+      ApproveRemark:
+        description: 审核备注
+        type: string
+      ApproveTime:
+        description: 审批时间
+        type: string
+        format: datetime
+      ApproveTimeStr:
+        description: 审批时间(字符串类型)
+        type: string
+      CheckBackFileTime:
+        description: 合同签回时间
+        type: string
+        format: datetime
+      CheckBackFileTimeStr:
+        description: 合同签回时间(字符串类型)
+        type: string
+      CompanyName:
+        description: 客户名称
+        type: string
+      ContractApprovalId:
+        description: 审批单id
+        type: integer
+        format: int64
+      ContractApprovalRecordId:
+        description: 审批流id
+        type: integer
+        format: int64
+      ContractBusinessType:
+        description: 合同业务类型,枚举值:'业务合同','代付合同'
+        type: string
+      ContractCode:
+        description: 合同编号
+        type: string
+      ContractId:
+        description: 合同id
+        type: integer
+        format: int64
+      ContractType:
+        description: 合同类型
+        type: string
+      CreateTime:
+        description: 发起审批的时间
+        type: string
+        format: datetime
+      CreateTimeStr:
+        description: 发起审批的时间(字符串类型)
+        type: string
+      CreditCode:
+        description: 社会统一信用代码,长度64位
+        type: string
+      EndDate:
+        description: 合同结束日期
+        type: string
+        format: datetime
+      EndDateStr:
+        description: 合同结束日期(字符串类型)
+        type: string
+      FileUrl:
+        description: 合同下载地址
+        type: string
+      InvalidTime:
+        description: 作废时间
+        type: string
+        format: datetime
+      InvalidTimeStr:
+        description: 作废时间(字符串类型)
+        type: string
+      ModifyTime:
+        description: 最后一次修改的时间
+        type: string
+        format: datetime
+      ModifyTimeStr:
+        description: 最后一次修改的时间(字符串类型)
+        type: string
+      Price:
+        description: 合同金额
+        type: number
+        format: double
+      ProductId:
+        description: 产品id,1:ficc;2:权益
+        type: integer
+        format: int64
+      RescindTime:
+        description: 解约时间
+        type: string
+        format: datetime
+      RescindTimeStr:
+        description: 解约时间(字符串类型)
+        type: string
+      SellerId:
+        description: 销售id
+        type: integer
+        format: int64
+      SellerName:
+        description: 销售名称
+        type: string
+      StartDate:
+        description: 合同开始日期
+        type: string
+        format: datetime
+      StartDateStr:
+        description: 合同开始日期(字符串类型)
+        type: string
+      Status:
+        description: 合同状态,枚举值:待审批','已审批','已驳回','已撤回',默认待审批
+        type: string
+  contract_approval.SealApprovalList:
+    title: SealApprovalList
+    type: object
+    properties:
+      ApplyContent:
+        description: 待审内容
+        type: string
+      ApplyUserId:
+        description: 待审内容
+        type: integer
+        format: int64
+      ApplyUserName:
+        description: 待审内容
+        type: string
+      ApproveRemark:
+        description: 审核备注
+        type: string
+      ApproveTime:
+        description: 审批时间
+        type: string
+        format: datetime
+      ApproveTimeStr:
+        description: 审批时间(字符串类型)
+        type: string
+      CheckBackFileTime:
+        description: 签回用印附件时间
+        type: string
+        format: datetime
+      CompanyName:
+        description: 客户名称
+        type: string
+      ContractApprovalId:
+        description: 审批单id
+        type: integer
+        format: int64
+      ContractApprovalRecordId:
+        description: 审批流id
+        type: integer
+        format: int64
+      ContractCode:
+        description: 合同编号
+        type: string
+      ContractId:
+        description: 合同id
+        type: integer
+        format: int64
+      CreateTime:
+        description: 发起审批的时间
+        type: string
+        format: datetime
+      CreateTimeStr:
+        description: 发起审批的时间(字符串类型)
+        type: string
+      CurrNodeId:
+        description: 当前审批节点id
+        type: integer
+        format: int64
+      EndDateStr:
+        description: 合同结束日期(字符串类型)
+        type: string
+      FileUrl:
+        description: 合同下载地址
+        type: string
+      InvalidTime:
+        description: 作废时间
+        type: string
+        format: datetime
+      InvalidTimeStr:
+        description: 作废时间(字符串类型)
+        type: string
+      ModifyTime:
+        description: 最后一次修改的时间
+        type: string
+        format: datetime
+      ModifyTimeStr:
+        description: 最后一次修改的时间(字符串类型)
+        type: string
+      SealType:
+        description: 用印类型
+        type: string
+      StartDateStr:
+        description: 合同开始日期(字符串类型)
+        type: string
+      StartNodeId:
+        description: 开始审批节点id
+        type: integer
+        format: int64
+      Status:
+        description: 合同状态,枚举值:待审批','已审批','已驳回','已撤回','已签回',默认待审批
+        type: string
+      UserId:
+        description: 申请人id
+        type: integer
+        format: int64
+      UserName:
+        description: 申请人名称
+        type: string
+  contract_service_detail.ContractServiceDetail:
+    title: ContractServiceDetail
+    type: object
+    properties:
+      Col1:
+        description: 第1列数据
+        type: string
+      Col2:
+        description: 第2列数据
+        type: string
+      Col3:
+        description: 第3列数据
+        type: string
+      Col4:
+        description: 第4列数据
+        type: string
+      Col5:
+        description: 第5列数据
+        type: string
+      Col6:
+        description: 第6列数据
+        type: string
+      Col7:
+        description: 第7列数据
+        type: string
+      ContractId:
+        description: 合同id
+        type: integer
+        format: int64
+      ContractServiceId:
+        description: 合同服务id
+        type: integer
+        format: int64
+      CreateTime:
+        description: 数据添加时间
+        type: string
+        format: datetime
+      Id:
+        type: integer
+        format: int64
+      ServiceTemplateId:
+        description: 服务模板id
+        type: integer
+        format: int64
+  message.CompanyApprovalMessageListResp:
+    title: CompanyApprovalMessageListResp
+    type: object
+    properties:
+      List:
+        type: array
+        items:
+          $ref: '#/definitions/company_approval_message.CompanyApprovalMessageList'
+      Total:
+        description: 总数据条数
+        type: integer
+        format: int64
+  message.SummaryMessage:
+    title: SummaryMessage
+    type: object
+    properties:
+      Message:
+        description: 消息
+        type: string
+      SourceType:
+        description: 消息来源类型,1:客户,2:合同,3:用印
+        type: integer
+        format: int64
+      Total:
+        description: 未读数据数
+        type: integer
+        format: int64
+  models.ImageResponse:
+    title: ImageResponse
+    type: object
+  paging.PagingItem:
+    title: PagingItem
+    type: object
+  roadshow.CalendarDetailResp:
+    title: CalendarDetailResp
+    type: object
+    properties:
+      CompanyDetail:
+        $ref: '#/definitions/roadshow.CompanyDetailView'
+      RsCalendarItem:
+        $ref: '#/definitions/roadshow.RsCalendar'
+      RsCalendarResearcherItem:
+        $ref: '#/definitions/roadshow.RsCalendarResearcher'
+  roadshow.CompanyDetailView:
+    title: CompanyDetailView
+    type: object
+    properties:
+      CompanyId:
+        type: integer
+        format: int64
+      CompanyName:
+        description: 客户名称
+        type: string
+      IndustryId:
+        description: 行业id
+        type: integer
+        format: int64
+      IndustryName:
+        description: 行业名称
+        type: string
+      PermissionName:
+        description: 开通品种
+        type: string
+      ReportReadTotal:
+        description: 累计阅读次数
+        type: integer
+        format: int64
+      Status:
+        description: 客户状态
+        type: string
+  roadshow.RsCalendar:
+    title: RsCalendar
+    type: object
+    properties:
+      ActivityCategory:
+        description: 活动类别
+        type: string
+      ActivityType:
+        description: 活动类型
+        type: string
+      City:
+        description: 市
+        type: string
+      CityCode:
+        description: 市编码
+        type: string
+      CompanyId:
+        description: 客户id
+        type: integer
+        format: int64
+      CompanyName:
+        description: 客户名称
+        type: string
+      CooperationName:
+        description: 合作方名称
+        type: string
+      CreateTime:
+        type: string
+        format: datetime
+      IsSynced:
+        description: 是否与上海同步 0:未同步 1:已同步
+        type: integer
+        format: int64
+      ModifyTime:
+        type: string
+        format: datetime
+      Province:
+        description: 省
+        type: string
+      ProvinceCode:
+        description: 省编码
+        type: string
+      RoadshowPlatform:
+        description: 路演平台
+        type: string
+      RoadshowType:
+        description: 路演形式
+        type: string
+      RsCalendarId:
+        type: integer
+        format: int64
+      Source:
+        description: 来源,0:自系统,1:上海方的
+        type: integer
+        format: int32
+      SysUserId:
+        description: 创建人id
+        type: integer
+        format: int64
+      SysUserRealName:
+        description: 创建人名称
+        type: string
+      Theme:
+        description: 会议主题
+        type: string
+      Title:
+        description: 展示在日历的标题
+        type: string
+  roadshow.RsCalendarResearcher:
+    title: RsCalendarResearcher
+    type: object
+    properties:
+      ApproveTime:
+        description: 接受时间
+        type: string
+        format: datetime
+      CreateTime:
+        type: string
+        format: datetime
+      DeleteReason:
+        description: 删除理由
+        type: string
+      DeleteTime:
+        description: 删除时间
+        type: string
+        format: datetime
+      EndDate:
+        description: 结束日期
+        type: string
+      EndTime:
+        description: 结束时间
+        type: string
+      EndWeek:
+        description: 结束日期对应周
+        type: string
+      IsSynced:
+        description: 是否与上海同步 0:未同步 1:已同步
+        type: integer
+        format: int64
+      ModifyTime:
+        type: string
+        format: datetime
+      RefuseReason:
+        description: 拒绝理由
+        type: string
+      RefuseTime:
+        description: 拒绝时间
+        type: string
+        format: datetime
+      ResearcherId:
+        description: 研究员id
+        type: integer
+        format: int64
+      ResearcherName:
+        description: 研究员名称
+        type: string
+      ResearcherSort:
+        description: 研究员新增排序
+        type: integer
+        format: int64
+      RsCalendarId:
+        description: 日历活动id
+        type: integer
+        format: int64
+      RsCalendarResearcherId:
+        type: integer
+        format: int64
+      StartDate:
+        description: 开始日期
+        type: string
+      StartTime:
+        description: 开始时间
+        type: string
+      StartWeek:
+        description: 开始日期对应周
+        type: string
+      Status:
+        description: 状态:1:待接受,2:已接受,3:已拒绝,4:已删除,5:已撤回,6:已结束
+        type: integer
+        format: int64
+  rs.AcceptReq:
+    title: AcceptReq
+    type: object
+  rs.AddActivityReq:
+    title: AddActivityReq
+    type: object
+  rs.AddMattersReq:
+    title: AddMattersReq
+    type: object
+  rs.CalendarDetailResp:
+    title: CalendarDetailResp
+    type: object
+  rs.CalendarListResp:
+    title: CalendarListResp
+    type: object
+  rs.CompanyDetailView:
+    title: CompanyDetailView
+    type: object
+  rs.DeleteMattersReq:
+    title: DeleteMattersReq
+    type: object
+  rs.DeleteReq:
+    title: DeleteReq
+    type: object
+  rs.EditActivityReq:
+    title: EditActivityReq
+    type: object
+  rs.MattersListResp:
+    title: MattersListResp
+    type: object
+  rs.RefuseReq:
+    title: RefuseReq
+    type: object
+  rs.ResearcherGroup:
+    title: ResearcherGroup
+    type: object
+  rs.UpdateMattersReq:
+    title: UpdateMattersReq
+    type: object
+  seal.AddReq:
+    title: AddReq
+    type: object
+    properties:
+      CompanyName:
+        description: 客户名称,甲方名称,长度32位
+        type: string
+      ContractId:
+        description: 系统合同id
+        type: integer
+        format: int64
+      CreditCode:
+        description: 社会统一信用代码,长度64位
+        type: string
+      FileNum:
+        description: 文件份数
+        type: integer
+        format: int64
+      FileUrl:
+        description: 文件附件地址
+        type: string
+      Remark:
+        description: 备注,长度255位
+        type: string
+      SealType:
+        description: 加盖印章类型,枚举值:'合同章', '公章', '法人章';默认:合同章
+        type: string
+      ServiceType:
+        description: 业务类型,枚举值:'新签合同','续约合同','补充协议';默认:新签合同
+        type: string
+      Use:
+        description: 用印用途,枚举值:'销售合同', '渠道合同', '付款通知函', '招投标', '战略合作协议';默认:销售合同
+        type: string
+      UseCompanyName:
+        description: 实际适用方客户名称,长度32位
+        type: string
+  seal.AddSealResp:
+    title: AddSealResp
+    type: object
+    properties:
+      SealId:
+        description: 用印id
+        type: integer
+        format: int64
+  seal.ApprovedReq:
+    title: ApprovedReq
+    type: object
+    properties:
+      Remark:
+        description: 驳回理由
+        type: string
+      SealId:
+        description: 用印id
+        type: integer
+        format: int64
+  seal.CheckEditReq:
+    title: CheckEditReq
+    type: object
+    properties:
+      FileNum:
+        description: 文件份数
+        type: integer
+        format: int64
+      FileUrl:
+        description: 文件附件地址
+        type: string
+      Remark:
+        description: 备注,长度255位
+        type: string
+      SealId:
+        description: 用印单id
+        type: integer
+        format: int64
+      SealType:
+        description: 加盖印章类型,枚举值:'合同章', '公章', '法人章';默认:合同章
+        type: string
+      Use:
+        description: 用印用途,枚举值:'销售合同', '渠道合同', '付款通知函', '招投标', '战略合作协议';默认:销售合同
+        type: string
+  seal.EditReq:
+    title: EditReq
+    type: object
+    properties:
+      CompanyName:
+        description: 客户名称,甲方名称,长度32位
+        type: string
+      ContractId:
+        description: 系统合同id
+        type: integer
+        format: int64
+      CreditCode:
+        description: 社会统一信用代码,长度64位
+        type: string
+      FileNum:
+        description: 文件份数
+        type: integer
+        format: int64
+      FileUrl:
+        description: 文件附件地址
+        type: string
+      Remark:
+        description: 备注,长度255位
+        type: string
+      SealId:
+        description: 用印id
+        type: integer
+        format: int64
+      SealType:
+        description: 加盖印章类型,枚举值:'合同章', '公章', '法人章';默认:合同章
+        type: string
+      ServiceType:
+        description: 业务类型,枚举值:'新签合同','续约合同','补充协议';默认:新签合同
+        type: string
+      Use:
+        description: 用印用途,枚举值:'销售合同', '渠道合同', '付款通知函', '招投标', '战略合作协议';默认:销售合同
+        type: string
+      UseCompanyName:
+        description: 实际适用方客户名称,长度32位
+        type: string
+  seal.InvalidReq:
+    title: InvalidReq
+    type: object
+    properties:
+      IsInvalidContract:
+        description: 是否同步作废合同,默认:false
+        type: boolean
+      SealId:
+        description: 用印id
+        type: integer
+        format: int64
+  seal.OpButton:
+    title: OpButton
+    type: object
+    properties:
+      Approval:
+        description: 是否有审批权限
+        type: boolean
+      Cancel:
+        description: 是否有撤回用印权限
+        type: boolean
+      CheckEdit:
+        description: 审核状态下是否有编辑用印权限
+        type: boolean
+      Edit:
+        description: 是否有编辑用印权限
+        type: boolean
+      Invalid:
+        description: 是否有作废用印权限
+        type: boolean
+      UploadFile:
+        description: 是否有上传签回文件权限
+        type: boolean
+  seal.RejectReq:
+    title: RejectReq
+    type: object
+    properties:
+      Remark:
+        description: 备注字段
+        type: string
+      SealId:
+        description: 用印id
+        type: integer
+        format: int64
+  seal.Seal:
+    title: Seal
+    type: object
+    properties:
+      ApprovalRemark:
+        description: 审核备注
+        type: string
+      ApproveTime:
+        description: 审批时间
+        type: string
+        format: datetime
+      CheckBackFileTime:
+        description: 签回用印附件时间
+        type: string
+        format: datetime
+      CheckBackFileUrl:
+        description: 已签回的文件地址
+        type: string
+      Code:
+        description: 用印编号,长度32位
+        type: string
+      CompanyName:
+        description: 客户名称,甲方名称,长度32位
+        type: string
+      ContractId:
+        description: 系统合同id
+        type: integer
+        format: int64
+      CreateTime:
+        description: 添加时间
+        type: string
+        format: datetime
+      CreditCode:
+        description: 社会统一信用代码,长度64位
+        type: string
+      FileNum:
+        description: 文件附件份数
+        type: integer
+        format: int64
+      FileUrl:
+        description: 文件附件地址
+        type: string
+      InvalidTime:
+        description: 作废时间
+        type: string
+        format: datetime
+      ModifyTime:
+        description: 最近一次修改时间
+        type: string
+        format: datetime
+      Remark:
+        description: 补充内容,长度255位
+        type: string
+      SealId:
+        type: integer
+        format: int64
+      SealType:
+        description: 加盖印章类型,枚举值:'合同章', '公章', '法人章';默认:合同章
+        type: string
+      ServiceType:
+        description: 业务类型,枚举值:'新签合同','续约合同','补充协议';默认:新签合同
+        type: string
+      Status:
+        description: 合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废','已签回'
+        type: string
+      Use:
+        description: 用印用途,枚举值:'销售合同', '渠道合同', '付款通知函', '招投标', '战略合作协议';默认:销售合同
+        type: string
+      UseCompanyName:
+        description: 实际使用方客户名称,长度32位
+        type: string
+      UserId:
+        description: 申请人id
+        type: integer
+        format: int64
+      UserName:
+        description: 申请人名称
+        type: string
+  seal.SealApprovalListResp:
+    title: SealApprovalListResp
+    type: object
+    properties:
+      List:
+        description: 列表数据
+        type: array
+        items:
+          $ref: '#/definitions/contract_approval.SealApprovalList'
+      Paging:
+        $ref: '#/definitions/paging.PagingItem'
+  seal.SealDetailResp:
+    title: SealDetailResp
+    type: object
+    properties:
+      FlowNodeList:
+        description: 审批流
+        type: array
+        items:
+          $ref: '#/definitions/722.<nil>.0xc00077cab0'
+      OpButton:
+        $ref: '#/definitions/seal.OpButton'
+        description: 操作权限
+      SealDetail:
+        $ref: '#/definitions/seal.Seal'
+        description: 审批单详情
+  seal.UploadCheckBackFileReq:
+    title: UploadCheckBackFileReq
+    type: object
+    properties:
+      FileUrl:
+        description: 签回用印url
+        type: string
+      SealId:
+        description: 用印id
+        type: integer
+        format: int64
+  wechat.WxLoginResp:
+    title: WxLoginResp
+    type: object
+    properties:
+      AdminId:
+        type: integer
+        format: int64
+      Authorization:
+        type: string
+      Code:
+        type: integer
+        format: int64
+      Expires:
+        type: string
+        format: datetime
+      Headimgurl:
+        description: 用户头像
+        type: string
+      RealName:
+        description: 用户名称
+        type: string
+      UserInfo:
+        $ref: '#/definitions/admin.LoginResp'
+        description: 用户信息
+tags:
+- name: approval
+  description: |
+    客户审批列表
+- name: message
+  description: |
+    消息模块
+- name: company_contract
+  description: |
+    客户合同模块
+- name: contract
+  description: |
+    合同模块
+- name: contract_approval
+  description: |
+    合同审批模块
+- name: seal
+  description: |
+    SealCommon
+    用印模块
+- name: seal_approval
+  description: |
+    SealApprovalCommon 用印审批模块
+- name: resource
+  description: |
+    资源管理-图片上传,合同上传等
+- name: roadshow
+  description: |
+    日历

+ 47 - 0
utils/common.go

@@ -13,6 +13,7 @@ import (
 	"image/png"
 	"math"
 	"math/rand"
+	"net"
 	"os"
 	"os/exec"
 	"regexp"
@@ -704,6 +705,27 @@ func FormatPrice(price float64) (str string) {
 	return strings.Join(arr, ".") //将一系列字符串连接为一个字符串,之间用sep来分隔。
 }
 
+func GetLocalIP() (ip string, err error) {
+	addrs, err := net.InterfaceAddrs()
+	if err != nil {
+		return
+	}
+	for _, addr := range addrs {
+		ipAddr, ok := addr.(*net.IPNet)
+		if !ok {
+			continue
+		}
+		if ipAddr.IP.IsLoopback() {
+			continue
+		}
+		if !ipAddr.IP.IsGlobalUnicast() {
+			continue
+		}
+		return ipAddr.IP.String(), nil
+	}
+	return
+}
+
 // Implode php中的implode(用来将int型的切片转为string)
 func Implode(idIntList []int) (str string) {
 	for _, id := range idIntList {
@@ -712,3 +734,28 @@ func Implode(idIntList []int) (str string) {
 	str = str[:len(str)-1]
 	return
 }
+
+//字符串类型时间转周几
+func StrDateTimeToWeek(strTime string) string {
+	var WeekDayMap = map[string]string{
+		"Monday":    "周一",
+		"Tuesday":   "周二",
+		"Wednesday": "周三",
+		"Thursday":  "周四",
+		"Friday":    "周五",
+		"Saturday":  "周六",
+		"Sunday":    "周日",
+	}
+	var ctime = StrTimeToTime(strTime).Format("2006-01-02")
+	startday, _ := time.Parse("2006-01-02", ctime)
+	staweek_int := startday.Weekday().String()
+	return WeekDayMap[staweek_int]
+}
+
+//字符串转换为time
+func StrTimeToTime(strTime string) time.Time {
+	timeLayout := "2006-01-02 15:04:05"  //转化所需模板
+	loc, _ := time.LoadLocation("Local") //重要:获取时区
+	resultTime, _ := time.ParseInLocation(timeLayout, strTime, loc)
+	return resultTime
+}

+ 16 - 5
utils/config.go

@@ -72,11 +72,22 @@ func init() {
 	}
 	RunMode = tmpRunMode
 	if RunMode == "" {
-		RunMode = "release"
+		localIp, tempErr := GetLocalIP()
+		if tempErr != nil {
+			fmt.Println("init GetLocalIP Err:" + tempErr.Error())
+		}
+		fmt.Println("localIp:", localIp)
+		if localIp == "10.0.0.123" {
+			RunMode = "debug"
+		} else {
+			RunMode = "release"
+		}
+		fmt.Println("RunMode:", RunMode)
+
 		configPath := `/home/code/config/hongze_mobile_admin/conf/app.conf`
-		err := web.LoadAppConfig("ini", configPath)
-		if err != nil {
-			fmt.Println("web.LoadAppConfig Err:" + err.Error())
+		tempErr = web.LoadAppConfig("ini", configPath)
+		if tempErr != nil {
+			fmt.Println("web.LoadAppConfig Err:" + tempErr.Error())
 		}
 	}
 
@@ -176,4 +187,4 @@ func CrmOpenApiConfig() {
 
 //http://webapi.brilliantstart.cn/api/
 //http://webapi.brilliantstart.cn/swagger/
-//http://139.196.122.219:8603/swagger/
+//http://8.136.199.33:8607/swagger/

+ 6 - 0
utils/constants.go

@@ -91,3 +91,9 @@ const (
 
 var PermissionFiccClassifyArr = [...]string{"宏观经济", "化工产业", "黑色产业", "有色产业"}
 var PermissionAllClassifyArr = [...]string{"宏观经济", "化工产业", "黑色产业", "有色产业", "权益"}
+
+//缓存key
+const (
+	CACHE_KEY_LOGS  = "HZ_ADMIN_CACHE_KEY_LOGS" //api用户操作日志队列
+	CACHE_KEY_ADMIN = "calendar:admin:list"     //系统用户列表缓存key
+)

+ 1 - 1
utils/logs.go

@@ -8,5 +8,5 @@ var FileLog *logs.BeeLogger
 
 func init() {
 	FileLog = logs.NewLogger(1000000)
-	FileLog.SetLogger(logs.AdapterFile, `{"filename":"./rdlucklog/hongze_task.log"}`)
+	FileLog.SetLogger(logs.AdapterFile, `{"filename":"./rdlucklog/hongze_mobile_admin.log"}`)
 }

部分文件因为文件数量过多而无法显示