Forráskód Böngészése

Merge branch 'crm/crm_16.6'

317699326@qq.com 2 napja
szülő
commit
d75aa7b05b

+ 30 - 0
controllers/company_apply_v2.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/seal"
 	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services"
 	"hongze/hz_crm_api/services/company_apply"
@@ -664,6 +665,35 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 			br.ErrMsg = "生成合同编码失败,Err:" + err.Error()
 			return
 		}
+		//如果是权益的合同,合同编号另取
+		if productId == 2 {
+			sealCount, err := seal.GetCountByDateAndCompanyId(req.StartDate, req.EndDate, req.CompanyId)
+			if err != nil {
+				br.Msg = "生成合同编码失败"
+				br.ErrMsg = "获取用印合同数量信息失败,Err:" + err.Error()
+				return
+			}
+			crmConfig, err := company.GetConfigDetailByCode("rai_seal_check") //权益非标合同是否校验用印提交
+			if err != nil {
+				br.Msg = "获取配置失败"
+				br.ErrMsg = "获取配置失败,Err:" + err.Error()
+				return
+			}
+
+			if sealCount == 0 && crmConfig.ConfigValue == "1" {
+				br.Msg = "此合同暂未申请用印,请核对合同期限是否有误"
+				return
+			}
+			if sealCount > 0 {
+				sealInfo, err := seal.GetSealInfoByDateAndCompanyId(req.StartDate, req.EndDate, req.CompanyId)
+				if err != nil {
+					br.Msg = "生成合同编码失败"
+					br.ErrMsg = "获取用印合同信息失败,Err:" + err.Error()
+					return
+				}
+				contractCode = sealInfo.Code
+			}
+		}
 		//当前是否存在待审批的单子
 		nowCompanyApprovalInfo, err := company.GetCompanyApprovalById(req.CompanyId, productId)
 		if (err == nil || nowCompanyApprovalInfo != nil) || err != nil && err.Error() != utils.ErrNoRow() {

+ 44 - 0
controllers/roadshow/calendar.go

@@ -72,6 +72,17 @@ func (this *CalendarController) Add() {
 	researcherMap := make(map[int]string)
 	var checkIsAdd []string
 
+	var companyStatus string // 海外客户记录当时客户状态
+	if req.EnglishCompany == 1 {
+		englishCompany, err := models.GetEnglishCompanyById(req.CompanyId)
+		if err != nil {
+			br.Msg = "客户已被删除, 请刷新页面"
+			br.ErrMsg = "获取失败,GetEnglishCompanyById Err: " + err.Error()
+			return
+		}
+		companyStatus = englishCompany.OverseasStatus
+	}
+
 	//获取所有自定义的权益研究员
 	sysUserList, err := cygx.GetAskEmailListResearcher()
 	if err != nil {
@@ -228,6 +239,7 @@ func (this *CalendarController) Add() {
 	rsCalendar.ActivityCategory = req.ActivityCategory
 	rsCalendar.Source = 0
 	rsCalendar.EnglishCompany = req.EnglishCompany
+	rsCalendar.CompanyStatus = companyStatus //海外客户记录当时客户状态
 	rsCalendar.Title = getTitle(req.ActivityType, req.RoadshowType, req.ActivityCategory, req.RoadshowPlatform, req.Province, req.City)
 	if productItemRai != nil {
 		rsCalendar.SellerId = productItemRai.SellerId
@@ -1158,6 +1170,10 @@ func (this *CalendarController) ResearcherList() {
 // @Param   PageSize   query   int  true       "每页数据条数"
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   CalendarType   query   int  true       "1:待处理申请,2:已处理申请,3:内部会议,4:报告电话会"
+// @Param   Status   query   int  true       "1:待接受,2:已接受,3:已拒绝,4:已删除,5:已撤回,6:已结束"
+// @Param   StartDate   query   string  true       "开始日期"
+// @Param   EndDate   query   string  true       "结束日期"
+// @Param   Keyword			query	string	false	"关键词: 客户名称/社会信用码"
 // @Success 200 {object} roadshow.CalendarListResp
 // @router /calendar/list [get]
 func (this *CalendarController) CalendarList() {
@@ -1180,6 +1196,11 @@ func (this *CalendarController) CalendarList() {
 	pageSize, _ := this.GetInt("PageSize")
 	currentIndex, _ := this.GetInt("CurrentIndex")
 
+	status, _ := this.GetInt("Status")
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	keyword := this.GetString("Keyword")
+
 	var total int
 	page := paging.GetPaging(currentIndex, pageSize, total)
 
@@ -1256,6 +1277,29 @@ func (this *CalendarController) CalendarList() {
 		br.ErrMsg = "参数错误,calendarType:" + strconv.Itoa(calendarType)
 		return
 	}
+
+	if status > 0 {
+		condition += ` AND b.status = ?`
+		pars = append(pars, status)
+	}
+
+	if startDate != "" {
+		condition += ` AND b.start_date >= ?`
+		pars = append(pars, startDate)
+	}
+
+	if endDate != "" {
+		condition += ` AND b.start_date <= ?`
+		pars = append(pars, endDate)
+	}
+
+	keyword = strings.TrimSpace(keyword)
+	if keyword != "" {
+		kw := fmt.Sprint("%", keyword, "%")
+		condition += ` AND a.company_name LIKE ? `
+		pars = append(pars, kw)
+	}
+
 	fmt.Println(condition)
 	resp := new(roadshow.CalendarListResp)
 	total, err := roadshow.GetCalendarListCount(condition, pars, calendarType)

+ 416 - 0
controllers/roadshow/calendar_researcher_question.go

@@ -0,0 +1,416 @@
+package roadshow
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/roadshow"
+	"hongze/hz_crm_api/utils"
+	"os"
+	"path/filepath"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// @Title 路演客户问答保存接口
+// @Description 路演客户问答保存接口
+// @Param	request	body roadshow.RoadShowQuestionSaveReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /question/save [post]
+func (this *CalendarController) QuestionAdd() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	deleteCache := true
+	cacheKey := "CACHE_RS_ACTIVITY_QUESTION_SAVE_" + strconv.Itoa(sysUser.AdminId)
+	defer func() {
+		if deleteCache {
+			utils.Rc.Delete(cacheKey)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 5*time.Second) {
+		deleteCache = false
+		br.Msg = "系统处理中,请稍后重试!"
+		br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody)
+		return
+	}
+	var req roadshow.RoadShowQuestionSaveReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.RsCalendarId <= 0 || req.RsCalendarResearcherId <= 0 {
+		br.Msg = "参数错误!"
+		return
+	}
+
+	calendarResearcherItem, err := roadshow.GetRsCalendarResearcherById(req.RsCalendarResearcherId)
+	if err != nil {
+		br.Msg = "获取路演记录失败!"
+		br.ErrMsg = "获取路演记录失败,Err:" + err.Error()
+		return
+	}
+
+	if calendarResearcherItem.QuestionStatus == 1 {
+		br.Msg = "问答已填写,不可重复提交!"
+		return
+	}
+
+	err = roadshow.RoadShowQuestionSave(&req)
+	if err != nil {
+		br.Msg = "保存失败!"
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+	br.IsAddLog = true
+}
+
+// ResearcherList
+// @Title 获取路演客户问答信息接口
+// @Description 获取路演客户问答信息接口
+// @Param   RsCalendarId   query   int  true       "路演日历ID"
+// @Param   RsCalendarResearcherId   query   int  true       "路演研究员记录ID"
+// @Success 200 {object} roadshow.ResearcherGroup
+// @router /question/list [get]
+func (this *CalendarController) QuestionList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	rsCalendarId, _ := this.GetInt("RsCalendarId")
+
+	rsCalendarResearcherId, _ := this.GetInt("RsCalendarResearcherId")
+	if rsCalendarResearcherId <= 0 && rsCalendarId <= 0 {
+		br.Msg = "参数错误!"
+		return
+	}
+
+	var condition string
+	var pars []interface{}
+
+	if rsCalendarId > 0 {
+		condition += ` AND a.rs_calendar_id = ? `
+		pars = append(pars, rsCalendarId)
+	}
+
+	if rsCalendarResearcherId > 0 {
+		condition += ` AND a.rs_calendar_researcher_id = ? `
+		pars = append(pars, rsCalendarResearcherId)
+	}
+
+	list, err := roadshow.GetRoadShowQuestionList(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败!"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}
+
+// @Title 获取客户路演问题汇总
+// @Description 获取客户路演问题汇总
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   StartDate   query   string  true       "开始日期"
+// @Param   EndDate   query   string  true       "结束日期"
+// @Param   ResearcherId   query   string  true       "研究员id"
+// @Param   CompanyId   query   int  true       "客户ID"
+// @Param   CompanyIndustry			query	string	false	"客户行业"
+// @Param   CompanyClassify			query	string	false	"客户分类"
+// @Param   Keyword			query	string	false	"关键词: 客户名称/社会信用码"
+// @Success 200 {object} roadshow.QuestionSummaryListResp
+// @router /question/summary/list [get]
+func (this *CalendarController) CalendarSummaryList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	researcherId := this.GetString("ResearcherId")
+	companyIndustry := this.GetString("CompanyIndustry")
+	companyClassify := this.GetString("CompanyClassify")
+	keyword := this.GetString("Keyword")
+
+	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 b.question_status = 1 `
+
+	if startDate != "" {
+		condition += ` AND b.start_date >= ?`
+		pars = append(pars, startDate)
+	}
+
+	if endDate != "" {
+		condition += ` AND b.start_date <= ?`
+		pars = append(pars, endDate)
+	}
+
+	if researcherId != "" {
+		condition += ` AND b.researcher_id IN(` + researcherId + `)`
+	}
+
+	if companyIndustry != "" {
+		condition += ` AND b.company_industry = ?`
+		pars = append(pars, companyIndustry)
+	}
+
+	if companyClassify != "" {
+		condition += ` AND b.company_classify = ?`
+		pars = append(pars, companyClassify)
+	}
+
+	keyword = strings.TrimSpace(keyword)
+	if keyword != "" {
+		kw := fmt.Sprint("%", keyword, "%")
+		condition += ` AND a.company_name LIKE ? `
+		pars = append(pars, kw)
+	}
+
+	total, err := roadshow.GetQuestionSummaryListCount(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取数据总数失败,GetQuestionSummaryListCount,Err:" + err.Error()
+		return
+	}
+
+	dataList, err := roadshow.GetQuestionSummaryList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取指标信息失败"
+		br.ErrMsg = "获取数据失败,GetQuestionSummaryList,Err:" + err.Error()
+		return
+	}
+
+	page = paging.GetPaging(currentIndex, pageSize, total)
+
+	resp := new(roadshow.QuestionSummaryListResp)
+
+	resp.Paging = page
+	resp.List = dataList
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 导出客户路演问题汇总
+// @Description 导出客户路演问题汇总
+// @Param   StartDate   query   string  true       "开始日期"
+// @Param   EndDate   query   string  true       "结束日期"
+// @Param   ResearcherId   query   string  true       "研究员id"
+// @Param   CompanyId   query   int  true       "客户ID"
+// @Param   CompanyIndustry			query	string	false	"客户行业"
+// @Param   CompanyClassify			query	string	false	"客户分类"
+// @Param   Keyword			query	string	false	"关键词: 客户名称/社会信用码"
+// @Success 200 {object} roadshow.QuestionSummaryListResp
+// @router /question/summary/export [get]
+func (this *CalendarController) CalendarSummaryExport() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	researcherId := this.GetString("ResearcherId")
+	companyIndustry := this.GetString("CompanyIndustry")
+	companyClassify := this.GetString("CompanyClassify")
+	keyword := this.GetString("Keyword")
+
+	var condition string
+	var pars []interface{}
+
+	condition += ` AND b.question_status = 1 `
+
+	if startDate != "" {
+		condition += ` AND b.start_date >= ?`
+		pars = append(pars, startDate)
+	}
+
+	if endDate != "" {
+		condition += ` AND b.start_date <= ?`
+		pars = append(pars, endDate)
+	}
+
+	if researcherId != "" {
+		condition += ` AND b.researcher_id IN(` + researcherId + `)`
+	}
+
+	if companyIndustry != "" {
+		condition += ` AND b.company_industry = ?`
+		pars = append(pars, companyIndustry)
+	}
+
+	if companyClassify != "" {
+		condition += ` AND b.company_classify = ?`
+		pars = append(pars, companyClassify)
+	}
+
+	keyword = strings.TrimSpace(keyword)
+	if keyword != "" {
+		kw := fmt.Sprint("%", keyword, "%")
+		condition += ` AND a.company_name LIKE ? `
+		pars = append(pars, kw)
+	}
+
+	dataList, err := roadshow.GetQuestionSummaryExport(condition, pars)
+	if err != nil {
+		br.Msg = "获取指标信息失败"
+		br.ErrMsg = "获取数据失败,GetQuestionSummaryList,Err:" + err.Error()
+		return
+	}
+
+	var rsCalendarIdArr []string
+
+	for _, v := range dataList {
+		rsCalendarIdArr = append(rsCalendarIdArr, strconv.Itoa(v.RsCalendarId))
+	}
+
+	questionMap := make(map[int][]*roadshow.RsCalendarResearcherQuestionView)
+	var questionMax int
+
+	if len(rsCalendarIdArr) > 0 {
+		var questionCondition string
+		var questionPars []interface{}
+
+		condition += ` AND a.rs_calendar_id IN (` + strings.Join(rsCalendarIdArr, ",") + `) `
+
+		questionList, err := roadshow.GetRoadShowQuestionList(questionCondition, questionPars)
+		if err != nil {
+			br.Msg = "获取指标信息失败"
+			br.ErrMsg = "获取数据失败,GetRoadShowQuestionList,Err:" + err.Error()
+			return
+		}
+
+		for _, qv := range questionList {
+			if items, ok := questionMap[qv.RsCalendarId]; ok {
+				items = append(items, qv)
+				questionMap[qv.RsCalendarId] = items
+
+				if len(items) > questionMax {
+					questionMax = len(items)
+				}
+			} else {
+				items = make([]*roadshow.RsCalendarResearcherQuestionView, 0)
+				items = append(items, qv)
+				questionMap[qv.RsCalendarId] = items
+				if len(items) > questionMax {
+					questionMax = len(items)
+				}
+			}
+		}
+	}
+
+	dir, _ := os.Executable()
+	exPath := filepath.Dir(dir)
+	downloadPath := exPath + "/" + time.Now().Format(utils.FormatDateUnSpace) + "客户路演汇总" + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	sheet, e := xlsxFile.AddSheet("客户路演汇总")
+	if e != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败, Err: " + e.Error()
+		return
+	}
+
+	titleRow := sheet.AddRow()
+	titleRow.AddCell().SetString("路演时间")
+	titleRow.AddCell().SetString("客户名称")
+	titleRow.AddCell().SetString("发起人")
+	titleRow.AddCell().SetString("研究员")
+	titleRow.AddCell().SetString("客户行业")
+	titleRow.AddCell().SetString("客户分类")
+
+	for i := 1; i <= questionMax; i++ {
+		titleRow.AddCell().SetString("Q" + strconv.Itoa(i))
+		titleRow.AddCell().SetString("A" + strconv.Itoa(i))
+	}
+
+	for _, v := range dataList {
+		dataRow := sheet.AddRow()
+		dataRow.AddCell().SetString(v.StartDate + " " + v.StartTime)
+		dataRow.AddCell().SetString(v.CompanyName)
+		dataRow.AddCell().SetString(v.SysUserRealName)
+		dataRow.AddCell().SetString(v.ResearcherName)
+		dataRow.AddCell().SetString(v.CompanyIndustry)
+		dataRow.AddCell().SetString(v.CompanyClassify)
+		questionList := questionMap[v.RsCalendarId]
+		for _, qv := range questionList {
+			dataRow.AddCell().SetString(qv.QuestionContent)
+			dataRow.AddCell().SetString(qv.ReplyContent)
+		}
+	}
+
+	if e = xlsxFile.Save(downloadPath); e != nil {
+		br.Msg = "导出失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	fileName := time.Now().Format(utils.FormatDateUnSpace) + "客户路演汇总" + ".xlsx"
+	this.Ctx.Output.Download(downloadPath, fileName)
+	defer func() {
+		_ = os.Remove(downloadPath)
+	}()
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 32 - 1
controllers/roadshow/company.go

@@ -10,6 +10,7 @@ import (
 	"hongze/hz_crm_api/utils"
 	"strconv"
 	"strings"
+	"time"
 )
 
 // @Title 我的日历列表
@@ -65,6 +66,7 @@ func (this *CalendarController) CompanySearch() {
 // @Param   EnglishCompany   query   int  true       "是否为英文客户"
 // @Param   CompanyType   query   string  true       "客户类型:'ficc','权益',传空默认为ficc,"
 // @Param   RsReportRecordId   query   int	  true       "路演统计Id"
+// @Param   SellerId   query   int	  true       "销售ID"
 // @Success 200 {object} roadshow.CompanyDetailView
 // @router /company/detail [get]
 func (this *CalendarController) CompanyDetail() {
@@ -91,6 +93,8 @@ func (this *CalendarController) CompanyDetail() {
 	englishCompany, _ := this.GetInt("EnglishCompany")
 	companyType := this.GetString("CompanyType")
 	rsReportRecordId, _ := this.GetInt("RsReportRecordId")
+	sellerId, _ := this.GetInt("SellerId")
+
 	productId := services.GetProductId(sysUser.RoleTypeCode)
 	if productId == 0 {
 		productId = 1
@@ -99,6 +103,28 @@ func (this *CalendarController) CompanyDetail() {
 	if companyType == utils.COMPANY_CLASSIFY_RAI {
 		productId = 2
 	}
+
+	if sellerId > 0 {
+		ficcSellerMap := make(map[int]int)
+		//raiSellerMap := make(map[int]int)
+		_, groupIdRelationMap, err := services.GetFiccSystemGroup()
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取FICC销售信息失败!Err:" + err.Error()
+			return
+		}
+		ficcSellerList, err := services.GetFiccSeller(time.Now(), groupIdRelationMap)
+		for _, v := range ficcSellerList {
+			ficcSellerMap[v.AdminId] = v.AdminId
+		}
+
+		if _, ok := ficcSellerMap[sellerId]; ok {
+			productId = 1
+		} else {
+			productId = 2
+		}
+	}
+
 	detailView := new(roadshow.CompanyDetailView)
 	if englishCompany == 0 {
 		var companyStatus string
@@ -152,6 +178,11 @@ func (this *CalendarController) CompanyDetail() {
 			detailView.ReportReadTotal = viewTotal
 		}
 
+		if productId == 1 {
+			detailView.CompanyType = "FICC"
+		} else {
+			detailView.CompanyType = "权益"
+		}
 		br.Ret = 200
 		br.Success = true
 		br.Msg = "获取成功"
@@ -168,7 +199,7 @@ func (this *CalendarController) CompanyDetail() {
 	}
 	detailView.CompanyId = enItem.CompanyId
 	detailView.CompanyName = enItem.CompanyName
-	detailView.Status = "正常"
+	detailView.Status = enItem.OverseasStatus
 	detailView.EnglishCompany = 1
 	detailView.EnglishCountry = enItem.Country
 	detailView.EnglishViewTotal = enItem.ViewTotal

+ 257 - 2
controllers/roadshow/report.go

@@ -3,6 +3,7 @@ package roadshow
 import (
 	"encoding/json"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/cygx"
@@ -11,6 +12,8 @@ import (
 	"hongze/hz_crm_api/services"
 	roadshowService "hongze/hz_crm_api/services/roadshow"
 	"hongze/hz_crm_api/utils"
+	"os"
+	"path/filepath"
 	"strconv"
 	"strings"
 	"time"
@@ -19,7 +22,7 @@ import (
 // ResearcherReportList
 // @Title 研究员路演统计
 // @Description 研究员路演统计接口
-// @Param   DataType   query   string  true       "枚举值:week、month、time_interval"
+// @Param   DataType   query   string  true       "枚举值:week、month、time_interval、quarter(季度)"
 // @Param   StartDate   query   string  true       "开始日期,格式:2022-04-06"
 // @Param   EndDate   query   string  true       "结束日期,格式:2022-04-06"
 // @Param   CompanyType   query   string  true       "客户类型:'ficc','权益',传空默认为ficc,"
@@ -73,6 +76,18 @@ func (this *CalendarController) ResearcherReportList() {
 			br.ErrMsg = "数据异常,Err:" + err.Error()
 			return
 		}
+	case "quarter":
+		adminDataList, _, err = roadshowService.GetQuarterData("researcher", "company_status")
+		if err != nil {
+			br.Msg = "数据异常"
+			br.ErrMsg = "数据异常,Err:" + err.Error()
+			return
+		}
+		if err != nil {
+			br.Msg = "数据异常"
+			br.ErrMsg = "数据异常,Err:" + err.Error()
+			return
+		}
 	}
 
 	var group []*roadshow.ResearcherGroup
@@ -187,6 +202,7 @@ func (this *CalendarController) ResearcherReportList() {
 	tmpAllMeetingNumMap := make(map[int]int)
 	tmpAllRoadShowNumMap := make(map[int]int)
 	tmpAllSalonNumMap := make(map[int]int)
+	tmpAllAskNumMap := make(map[int]int)
 	for _, v := range group {
 		v.ResearcherList = groupMap[v.GroupId]
 		tmpGroupAdminReportRecord := make([]roadshow.AdminReportRecord, 0)
@@ -200,6 +216,7 @@ func (this *CalendarController) ResearcherReportList() {
 		tmpGroupMeetingNumMap := make(map[int]int)
 		tmpGroupRoadShowNumMap := make(map[int]int)
 		tmpGroupSalonMapNumMap := make(map[int]int)
+		tmpGroupAskMapNumMap := make(map[int]int)
 		for _, researcher := range groupMap[v.GroupId] {
 			//组内研究员数据
 			//每个区间的数据
@@ -208,7 +225,7 @@ func (this *CalendarController) ResearcherReportList() {
 				startDateIndexList[index] = adminData.StartDate
 				endDateIndexList[index] = adminData.EndDate
 
-				var tmpTryOutNum, tmpFormalNum, tmpMeetingNum, tmpRoadShowNum, tmpSalonNum int
+				var tmpTryOutNum, tmpFormalNum, tmpMeetingNum, tmpRoadShowNum, tmpSalonNum, tmpAskNum int
 				if num, ok := adminData.TryOutMap[researcher.AdminId]; ok {
 					tmpTryOutNum = num
 				}
@@ -225,12 +242,17 @@ func (this *CalendarController) ResearcherReportList() {
 					tmpSalonNum = num
 				}
 
+				if num, ok := adminData.AskMap[researcher.AdminId]; ok { //路演总次数
+					tmpAskNum = num
+				}
+
 				tmpAdminRsReportRecordNum := roadshow.RsReportRecordNum{
 					TryOutNum:   tmpTryOutNum,
 					FormalNum:   tmpFormalNum,
 					MeetingNum:  tmpMeetingNum,
 					RoadShowNum: tmpRoadShowNum,
 					SalonNum:    tmpSalonNum,
+					AskNum:      tmpAskNum,
 					StartDate:   adminData.StartDate,
 					EndDate:     adminData.EndDate,
 				}
@@ -252,11 +274,15 @@ func (this *CalendarController) ResearcherReportList() {
 				if _, ok := tmpGroupSalonMapNumMap[index]; !ok {
 					tmpGroupSalonMapNumMap[index] = 0
 				}
+				if _, ok := tmpGroupAskMapNumMap[index]; !ok {
+					tmpGroupAskMapNumMap[index] = 0
+				}
 				tmpGroupTryOutNumMap[index] += tmpTryOutNum
 				tmpGroupFormalNumMap[index] += tmpFormalNum
 				tmpGroupMeetingNumMap[index] += tmpMeetingNum
 				tmpGroupRoadShowNumMap[index] += tmpRoadShowNum
 				tmpGroupSalonMapNumMap[index] += tmpSalonNum
+				tmpGroupAskMapNumMap[index] += tmpAskNum
 
 				//总数据汇总
 				if _, ok := tmpAllTryOutNumMap[index]; !ok {
@@ -274,11 +300,15 @@ func (this *CalendarController) ResearcherReportList() {
 				if _, ok := tmpGroupSalonMapNumMap[index]; !ok {
 					tmpGroupSalonMapNumMap[index] = 0
 				}
+				if _, ok := tmpGroupAskMapNumMap[index]; !ok {
+					tmpGroupAskMapNumMap[index] = 0
+				}
 				tmpAllTryOutNumMap[index] += tmpTryOutNum
 				tmpAllFormalNumMap[index] += tmpFormalNum
 				tmpAllMeetingNumMap[index] += tmpMeetingNum
 				tmpAllRoadShowNumMap[index] += tmpRoadShowNum
 				tmpAllSalonNumMap[index] += tmpSalonNum
+				tmpAllAskNumMap[index] += tmpAskNum
 			}
 			tmpAdminReportRecord := roadshow.AdminReportRecord{
 				Name:                  researcher.RealName,
@@ -295,6 +325,7 @@ func (this *CalendarController) ResearcherReportList() {
 				MeetingNum:  tmpGroupMeetingNumMap[i],
 				RoadShowNum: tmpGroupRoadShowNumMap[i],
 				SalonNum:    tmpGroupSalonMapNumMap[i],
+				AskNum:      tmpGroupAskMapNumMap[i],
 				StartDate:   startDateIndexList[i],
 				EndDate:     endDateIndexList[i],
 			}
@@ -662,6 +693,8 @@ func (this *CalendarController) SellerReportList() {
 // @Param   AdminId   query   int  true       "用户id"
 // @Param   StartDate   query   string  true       "开始日期,格式:2022-04-06"
 // @Param   EndDate   query   string  true       "结束日期,格式:2022-04-06"
+// @Param   Status   query   int  true       "0:全部,1:已完成"
+// @Param   EnglishCompany   query   int  true       "-1:全部,0:国内,1:海外"
 // @Success 200 {object} []roadshow.RsReportRecordList
 // @router /report/calendar/list [get]
 func (this *CalendarController) ReportCalendarList() {
@@ -687,6 +720,10 @@ func (this *CalendarController) ReportCalendarList() {
 		return
 	}
 
+	status, _ := this.GetInt("Status")
+
+	englishCompany, _ := this.GetInt("EnglishCompany")
+
 	//正式客户
 	var condition string
 	var pars []interface{}
@@ -739,12 +776,43 @@ func (this *CalendarController) ReportCalendarList() {
 		return
 	}
 
+	if status == 1 {
+		condition += ` and c.question_status = ? `
+		pars = append(pars, 1)
+	}
+
+	if englishCompany > 0 {
+		condition += ` and b.english_company = ? `
+		pars = append(pars, englishCompany)
+	}
+
 	list, err := roadshow.GetRsReportRecordList(condition, pars)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,ERR:" + err.Error()
 		return
 	}
+
+	ficcSellerMap := make(map[int]int)
+	//raiSellerMap := make(map[int]int)
+	_, groupIdRelationMap, err := services.GetFiccSystemGroup()
+	if err != nil {
+		br.Msg = "获取信息失败!"
+		br.ErrMsg = "获取FICC销售信息失败!Err:" + err.Error()
+		return
+	}
+	ficcSellerList, err := services.GetFiccSeller(time.Now(), groupIdRelationMap)
+	for _, v := range ficcSellerList {
+		ficcSellerMap[v.AdminId] = v.AdminId
+	}
+
+	for _, v := range list {
+		if _, ok := ficcSellerMap[v.SellerId]; ok {
+			v.CompanyType = "FICC"
+		} else {
+			v.CompanyType = "权益"
+		}
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -1878,3 +1946,190 @@ func (this *CalendarController) OverseasCalendarList() {
 	br.Data = list
 	return
 }
+
+// @Title 导出研究员路演统计
+// @Description 导出研究员路演统计接口
+// @Param   DataType   query   string  true       "枚举值:week、month、time_interval"
+// @Param   StartDate   query   string  true       "开始日期,格式:2022-04-06"
+// @Param   EndDate   query   string  true       "结束日期,格式:2022-04-06"
+// @Param   CompanyType   query   string  true       "客户类型:'ficc','权益',传空默认为ficc,"
+// @Success 200 {object} roadshow.RsReportRecordResp
+// @router /report/researcher/export [get]
+func (this *CalendarController) ResearcherReportExport() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	dataType := this.GetString("DataType")
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	companyType := this.GetString("CompanyType", "ficc")
+
+	var err error
+	//获取列表
+	switch dataType {
+	case "week":
+		startDate = utils.GetNowWeekMonday().AddDate(0, 0, -7).Format(utils.FormatDate)
+		endDate = utils.GetNowWeekLastDay().AddDate(0, 0, 7).Format(utils.FormatDate)
+	case "month":
+		startDate = utils.GetNowMonthFirstDay().AddDate(0, -4, 0).Format(utils.FormatDate)
+		endDate = utils.GetNowMonthLastDay().Format(utils.FormatDate)
+	case "time_interval":
+		if startDate == `` || endDate == `` {
+			br.Msg = "开始日期或结束日期不能为空"
+			br.ErrMsg = "开始日期或结束日期不能为空,Err:" + err.Error()
+			return
+		}
+	}
+
+	var researcherIdArr []string
+	ficcSellerMap := make(map[int]int)
+	//raiSellerMap := make(map[int]int)
+	switch companyType {
+	case utils.COMPANY_CLASSIFY_FICC:
+		researcherList, err := roadshow.GetResearcherV2()
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取分组信息失败!,GetResearcherV2 Err:" + err.Error()
+			return
+		}
+		for _, v := range researcherList {
+			if v.AdminId > 0 {
+				researcherId := strconv.Itoa(v.AdminId)
+				researcherIdArr = append(researcherIdArr, researcherId)
+			}
+		}
+
+		_, groupIdRelationMap, err := services.GetFiccSystemGroup()
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取FICC销售信息失败!Err:" + err.Error()
+			return
+		}
+		ficcSellerList, err := services.GetFiccSeller(time.Now(), groupIdRelationMap)
+		for _, v := range ficcSellerList {
+			ficcSellerMap[v.AdminId] = v.AdminId
+		}
+	case utils.COMPANY_CLASSIFY_RAI:
+		askUserList, err := cygx.GetAskEmailListResearcher()
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetAskEmailListResearcher Err: " + err.Error()
+			return
+		}
+		for _, v := range askUserList {
+			if v.AdminId > 0 {
+				researcherId := strconv.Itoa(v.AdminId)
+				researcherIdArr = append(researcherIdArr, researcherId)
+			}
+		}
+
+		//_, groupIdRelationMap, err := services.GetRaiSystemGroup()
+		//if err != nil {
+		//	br.Msg = "获取信息失败!"
+		//	br.ErrMsg = "获取分组信息失败!Err:" + err.Error()
+		//	return
+		//}
+		//raiSellList, err := services.GetRaiSeller(groupIdRelationMap)
+		//if err != nil {
+		//	br.Msg = "获取信息失败!"
+		//	br.ErrMsg = "获取权益销售信息失败!Err:" + err.Error()
+		//	return
+		//}
+		//
+		//for _, v := range raiSellList {
+		//	raiSellerMap[v.AdminId] = v.AdminId
+		//}
+	}
+
+	var condition string
+	var pars []interface{}
+
+	condition += ` AND c.researcher_id IN(` + strings.Join(researcherIdArr, ",") + `) `
+
+	if startDate != "" {
+		condition += ` AND c.start_date >= ? `
+		pars = append(pars, startDate)
+	}
+
+	if endDate != "" {
+		condition += ` AND c.start_date <= ? `
+		pars = append(pars, endDate)
+	}
+
+	condition += ` AND b.activity_type = '路演' `
+	condition += ` AND b.roadshow_type <> '' `
+	condition += ` AND c.question_status = 1 `
+
+	list, err := roadshow.GetReportResearcherExport(condition, pars)
+	if err != nil {
+		br.Msg = "获取信息失败!"
+		br.ErrMsg = "获取数据失败!Err:" + err.Error()
+		return
+	}
+
+	dir, _ := os.Executable()
+	exPath := filepath.Dir(dir)
+	downloadPath := exPath + "/" + time.Now().Format(utils.FormatDateUnSpace) + "研究员已完成路演统计" + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	sheet, e := xlsxFile.AddSheet("已完成路演统计")
+	if e != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败, Err: " + e.Error()
+		return
+	}
+
+	titleRow := sheet.AddRow()
+	titleRow.AddCell().SetString("研究员")
+	titleRow.AddCell().SetString("路演时间")
+	titleRow.AddCell().SetString("客户名称")
+	titleRow.AddCell().SetString("路演形式")
+	titleRow.AddCell().SetString("发起人")
+	titleRow.AddCell().SetString("客户类型")
+	titleRow.AddCell().SetString("客户状态")
+	titleRow.AddCell().SetString("客户行业")
+	titleRow.AddCell().SetString("客户分类")
+	titleRow.AddCell().SetString("所属区域")
+
+	for _, v := range list {
+		dataRow := sheet.AddRow()
+		dataRow.AddCell().SetString(v.ResearcherName)
+		dataRow.AddCell().SetString(v.StartDate + " " + v.StartTime)
+		dataRow.AddCell().SetString(v.CompanyName)
+		dataRow.AddCell().SetString(v.RoadshowType)
+		dataRow.AddCell().SetString(v.SellerName)
+		if _, ok := ficcSellerMap[v.SellerId]; ok {
+			dataRow.AddCell().SetString("FICC")
+		} else {
+			dataRow.AddCell().SetString("权益")
+		}
+		dataRow.AddCell().SetString(v.CompanyStatus)
+		dataRow.AddCell().SetString(v.CompanyIndustry)
+		dataRow.AddCell().SetString(v.CompanyClassify)
+		if v.EnglishCompany == 0 {
+			dataRow.AddCell().SetString("国内")
+		} else {
+			dataRow.AddCell().SetString("海外")
+		}
+	}
+
+	if e = xlsxFile.Save(downloadPath); e != nil {
+		br.Msg = "导出失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	fileName := time.Now().Format(utils.FormatDateUnSpace) + "研究员已完成路演统计" + ".xlsx"
+	this.Ctx.Output.Download(downloadPath, fileName)
+	defer func() {
+		_ = os.Remove(downloadPath)
+	}()
+	return
+}

+ 1 - 1
controllers/seal/seal_approval.go

@@ -427,7 +427,7 @@ func ApprovalListExport(this *SealApprovalController, condition, joinCondition s
 		br.ErrMsg = "保存文件失败"
 		return
 	}
-	downloadFileName := "用印审批列表" + time.Now().Format("2006.01.02")+ ".xlsx"
+	downloadFileName := "用印审批列表" + time.Now().Format("2006.01.02") + ".xlsx"
 	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
 	defer func() {
 		os.Remove(downLoadnFilePath)

+ 1 - 1
go.mod

@@ -32,6 +32,7 @@ require (
 	github.com/tealeg/xlsx v1.0.5
 	github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.541
 	github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ses v1.0.541
+	github.com/wechatpay-apiv3/wechatpay-go v0.2.18
 	github.com/xuri/excelize/v2 v2.6.1
 	github.com/yidane/formula v0.0.0-20210902154546-0782e1736717
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
@@ -98,7 +99,6 @@ require (
 	github.com/tidwall/match v1.1.1 // indirect
 	github.com/tidwall/pretty v1.2.0 // indirect
 	github.com/tjfoc/gmsm v1.3.2 // indirect
-	github.com/wechatpay-apiv3/wechatpay-go v0.2.18 // indirect
 	github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect
 	github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect
 	golang.org/x/crypto v0.31.0 // indirect

+ 1 - 0
go.sum

@@ -13,6 +13,7 @@ github.com/SebastiaanKlippert/go-wkhtmltopdf v1.7.2 h1:LORAatv6KuKheYq8HXehiwx3f
 github.com/SebastiaanKlippert/go-wkhtmltopdf v1.7.2/go.mod h1:TY8r0gmwEL1c5Lbd66NgQCkL4ZjGDJCMVqvbbFvUx20=
 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/agiledragon/gomonkey v2.0.2+incompatible h1:eXKi9/piiC3cjJD1658mEE2o3NjkJ5vDLgYjCQu0Xlw=
 github.com/agiledragon/gomonkey v2.0.2+incompatible/go.mod h1:2NGfXu1a80LLr2cmWXGBDaHEjb1idR6+FVlX5T3D9hw=
 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=

+ 1 - 0
models/db.go

@@ -389,6 +389,7 @@ func initRoadShow() {
 		new(roadshow.RsCalendarMeetingLabelGroup), //路演参会名单关联的标签表
 		new(roadshow.RsCalendarApiLog),            //上海路演三方接口请求记录日志表
 		new(roadshow.RsReportRecordPermission),    //路演公司权限记录
+		new(roadshow.RsCalendarResearcherQuestion),
 	)
 }
 

+ 15 - 4
models/roadshow/calendar.go

@@ -66,6 +66,7 @@ type RsCalendar struct {
 	EnglishCompany   int    `description:"是否为英文客户: 0-否; 1-是"`
 	SellerId         int    `description:"销售id"`
 	ShareSellerId    int    `description:"共享销售员id"`
+	CompanyStatus    string `description:"客户状态:'试用','永续','冻结','流失','正式','潜在'"`
 }
 
 type RsCalendarResearcher struct {
@@ -90,6 +91,10 @@ type RsCalendarResearcher struct {
 	IsSynced               int       `description:"是否与上海同步 0:未同步 1:已同步"`
 	ResearcherSort         int       `description:"研究员新增排序"`
 	UnionCode              string    `description:"公开会议联合编码"`
+	CompanyIndustry        string    `description:"客户行业"`
+	CompanyClassify        string    `description:"客户分类"`
+	QuestionStatus         int       `description:"问答状态:0-未填写;1-已填写"`
+	QuestionMsgStatus      int       `description:"问答模板消息:0-未发送;1-已发送"`
 }
 
 func GetRsCalendarById(rsCalendarId int) (item *RsCalendar, err error) {
@@ -301,6 +306,10 @@ type CalendarListView struct {
 	SubmitButton           bool   `description:"提交按钮是否展示"`
 	ViewButton             bool   `description:"查看按钮是否展示"`
 	EditButton             bool   `description:"修改按钮是否展示"`
+	CompanyIndustry        string `description:"客户行业"`
+	CompanyClassify        string `description:"客户分类"`
+	QuestionStatus         int    `description:"问答状态:0-未填写;1-已填写"`
+	QuestionMsgStatus      int    `description:"问答模板消息:0-未发送;1-已发送"`
 }
 
 type CalendarListResp struct {
@@ -340,7 +349,8 @@ func GetCalendarList(condition string, pars []interface{}, startSize, pageSize,
 				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,a.english_company
+                a.cooperation_name,a.theme,a.activity_category,a.english_company,
+                b.company_industry,b.company_classify,b.question_status,b.question_msg_status
 				FROM  rs_calendar AS a
 				INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id=b.rs_calendar_id
 				WHERE 1=1
@@ -362,7 +372,8 @@ func GetCalendarList(condition string, pars []interface{}, startSize, pageSize,
 				b.modify_time,b.researcher_id,b.researcher_name,
 				b.rs_calendar_researcher_id,b.start_date,
 				b.end_date,b.start_time,b.end_time,b.start_week,b.end_week,b.status,b.refuse_reason,b.refuse_time,
-                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,a.english_company
+                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,a.english_company,
+                b.company_industry,b.company_classify,b.question_status,b.question_msg_status
         FROM  rs_calendar AS a
 		INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id=b.rs_calendar_id
 		WHERE 1=1 `
@@ -946,7 +957,7 @@ func GetOverseaCustomCalendarList2(sellerId, researcherId, startDate, endDate, c
 
 	pars := make([]interface{}, 0)
 
-	sql1 := `SELECT b.start_date,b.end_date,b.start_time,b.end_time,a.rs_calendar_id,b.seller_id,b.seller_name,b.researcher_name,b.company_name,b.company_id,d.overseas_status as company_status,b.roadshow_type,a.theme,a.roadshow_platform,a.province as province,a.city as city FROM  rs_calendar AS a
+	sql1 := `SELECT b.start_date,b.end_date,b.start_time,b.end_time,a.rs_calendar_id,b.seller_id,b.seller_name,b.researcher_name,b.company_name,b.company_id,d.overseas_status as company_status,b.roadshow_type,a.theme,a.roadshow_platform,a.province as province,a.city as city ,a.english_company FROM  rs_calendar AS a
     INNER JOIN rs_report_record  AS b ON a.rs_calendar_id=b.rs_calendar_id
          JOIN company_product AS c ON a.company_id=c.company_id AND c.product_id=1
          JOIN company AS d ON c.company_id=d.company_id 
@@ -971,7 +982,7 @@ func GetOverseaCustomCalendarList2(sellerId, researcherId, startDate, endDate, c
 	if researcherId != "" {
 		sql1 += fmt.Sprintf(` AND b.researcher_id in (%s) `, researcherId)
 	}
-	sql2 := fmt.Sprintf(`SELECT bb.start_date,bb.end_date,bb.start_time,bb.end_time,aa.rs_calendar_id,bb.seller_id,bb.seller_name,bb.researcher_name,aa.company_name,aa.company_id,cc.overseas_status as company_status,bb.roadshow_type,aa.theme,aa.roadshow_platform,aa.province as province,aa.city as city FROM  rs_calendar AS aa
+	sql2 := fmt.Sprintf(`SELECT bb.start_date,bb.end_date,bb.start_time,bb.end_time,aa.rs_calendar_id,bb.seller_id,bb.seller_name,bb.researcher_name,aa.company_name,aa.company_id,cc.overseas_status as company_status,bb.roadshow_type,aa.theme,aa.roadshow_platform,aa.province as province,aa.city as city ,aa.english_company FROM  rs_calendar AS aa
     INNER JOIN rs_report_record  AS bb ON aa.rs_calendar_id=bb.rs_calendar_id
     INNER JOIN %s.english_company AS cc ON aa.company_id=cc.company_id
 		where aa.english_company= 1 AND aa.source = 0 AND cc.is_deleted=0  AND bb.rs_calendar_researcher_status=2 AND bb.researcher_id != 0 `, databaseName)

+ 206 - 0
models/roadshow/calendar_researcher_question.go

@@ -0,0 +1,206 @@
+package roadshow
+
+import (
+	"context"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+type RsCalendarResearcherQuestion struct {
+	RsCalendarResearcherQuestionId int       `orm:"column(rs_calendar_researcher_question_id);pk"`
+	RsCalendarId                   int       `description:"路演日历ID"`
+	RsCalendarResearcherId         int       `description:"路演研究员记录ID"`
+	QuestionContent                string    `description:"提问内容"`
+	ReplyContent                   string    `description:"回复内容"`
+	CreateTime                     time.Time `description:"创建时间"`
+	ModifyTime                     time.Time `description:"更新时间"`
+}
+
+type RoadShowQuestionSaveReq struct {
+	RsCalendarId           int                                    `description:"路演ID"`
+	RsCalendarResearcherId int                                    `description:"路演研究员记录ID"`
+	CompanyIndustry        string                                 `description:"客户行业"`
+	CompanyClassify        string                                 `description:"客户分类"`
+	QuestionList           []*RsCalendarResearcherQuestionSaveReq `description:"问答列表"`
+}
+
+type RsCalendarResearcherQuestionSaveReq struct {
+	QuestionContent string `description:"提问内容"`
+	ReplyContent    string `description:"回复内容"`
+}
+
+func RoadShowQuestionSave(req *RoadShowQuestionSaveReq) (err error) {
+	o := orm.NewOrm()
+	tx, err := o.BeginWithCtx(context.Background())
+	if err != nil {
+		return err
+	}
+
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+		} else {
+			tx.Commit()
+		}
+	}()
+
+	sql := ` UPDATE rs_calendar_researcher SET company_industry = ?,company_classify = ?,question_status=1 WHERE rs_calendar_researcher_id = ? `
+	_, err = tx.Raw(sql, req.CompanyIndustry, req.CompanyClassify, req.RsCalendarResearcherId).Exec()
+	if err != nil {
+		return err
+	}
+	list := make([]*RsCalendarResearcherQuestion, 0)
+	for _, v := range req.QuestionList {
+		item := new(RsCalendarResearcherQuestion)
+		item.RsCalendarId = req.RsCalendarId
+		item.RsCalendarResearcherId = req.RsCalendarResearcherId
+		item.QuestionContent = v.QuestionContent
+		item.ReplyContent = v.ReplyContent
+		item.ModifyTime = time.Now()
+		item.CreateTime = time.Now()
+		list = append(list, item)
+	}
+	_, err = tx.InsertMulti(len(list), &list)
+	return err
+}
+
+type RsCalendarResearcherQuestionView struct {
+	RsCalendarResearcherQuestionId int    `orm:"column(rs_calendar_researcher_question_id);pk"`
+	RsCalendarId                   int    `description:"路演日历ID"`
+	RsCalendarResearcherId         int    `description:"路演研究员记录ID"`
+	QuestionContent                string `description:"提问内容"`
+	ReplyContent                   string `description:"回复内容"`
+	ResearcherId                   int    `description:"研究员ID"`
+	ResearcherName                 string `description:"研究员名称"`
+	CreateTime                     string `description:"创建时间"`
+	ModifyTime                     string `description:"更新时间"`
+}
+
+func GetRoadShowQuestionList(condition string, pars []interface{}) (item []*RsCalendarResearcherQuestionView, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT a.*,b.researcher_id,b.researcher_name FROM rs_calendar_researcher_question AS a
+         LEFT JOIN rs_calendar_researcher AS b ON a.rs_calendar_researcher_id=b.rs_calendar_researcher_id
+         WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY a.create_time DESC  `
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+type QuestionSummary struct {
+	RsCalendarId           int    `orm:"column(rs_calendar_id);pk"`
+	SysUserId              int    `description:"创建人id"`
+	SysUserRealName        string `description:"创建人名称"`
+	ActivityType           string `description:"活动类型"`
+	RoadshowType           string `description:"路演形式"`
+	RoadshowPlatform       string `description:"路演平台"`
+	CompanyId              int    `description:"客户id"`
+	CompanyName            string `description:"客户名称"`
+	RsCalendarResearcherId int    `description:"活动研究员id"`
+	ResearcherId           string `description:"研究员id"`
+	ResearcherName         string `description:"研究员名称"`
+	StartDate              string `description:"开始日期"`
+	EndDate                string `description:"结束日期"`
+	StartTime              string `description:"开始时间"`
+	EndTime                string `description:"结束时间"`
+	StartWeek              string `description:"开始日期对应周"`
+	EndWeek                string `description:"结束日期对应周"`
+	Status                 int    `description:"状态:1:待接受,2:已接受,3:已拒绝,4:已删除,5:已撤回,6:已结束"`
+	RefuseReason           string `description:"拒绝理由"`
+	RefuseTime             string `description:"拒绝时间"`
+	DeleteReason           string `description:"删除原因"`
+	Province               string `description:"省"`
+	ProvinceCode           string `description:"省编码"`
+	City                   string `description:"市"`
+	CityCode               string `description:"市编码"`
+	District               string `description:"区"`
+	Theme                  string `description:"会议主题"`
+	CooperationName        string `description:"合作方名称"`
+	ActivityCategory       string `description:"活动类别"`
+	Source                 int    `description:"来源,0:自系统,1:上海方的"`
+	Title                  string `description:"日历展示标题"`
+	CompanyStatus          string `description:"新增客户状态"`
+	UnionCode              string `description:"公开会议联合编码"`
+	EnglishCompany         int    `description:"是否为英文客户: 0-否; 1-是"`
+	EnglishCountry         string `description:"英文客户-国家"`
+	EnglishViewTotal       int    `description:"英文客户-累计点击量"`
+	SubmitButton           bool   `description:"提交按钮是否展示"`
+	ViewButton             bool   `description:"查看按钮是否展示"`
+	EditButton             bool   `description:"修改按钮是否展示"`
+	CompanyIndustry        string `description:"客户行业"`
+	CompanyClassify        string `description:"客户分类"`
+	QuestionStatus         int    `description:"问答状态:0-未填写;1-已填写"`
+	QuestionMsgStatus      int    `description:"问答模板消息:0-未发送;1-已发送"`
+}
+
+type QuestionSummaryListResp struct {
+	Paging *paging.PagingItem
+	List   []*QuestionSummary
+}
+
+func GetQuestionSummaryListCount(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
+}
+
+func GetQuestionSummaryList(condition string, pars []interface{}, startSize, pageSize int) (list []*QuestionSummary, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT a.sys_user_id,a.sys_user_real_name,a.rs_calendar_id,a.activity_type,a.roadshow_type,a.activity_category,a.roadshow_platform,a.english_company,b.create_time,a.district,
+				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,a.english_company,
+                b.question_status,b.question_msg_status,
+ 				GROUP_CONCAT(b.company_industry) AS company_industry,
+ 				GROUP_CONCAT(b.company_classify) AS company_classify
+				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 GetQuestionSummaryExport(condition string, pars []interface{}) (list []*QuestionSummary, 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,a.district,
+				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,a.english_company,
+                b.question_status,b.question_msg_status,
+ 				GROUP_CONCAT(b.company_industry) AS company_industry,
+ 				GROUP_CONCAT(b.company_classify) AS company_classify
+				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 `
+
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}

+ 1 - 0
models/roadshow/company.go

@@ -105,4 +105,5 @@ type CompanyDetailView struct {
 	EnglishCompany   int    `description:"是否为英文客户: 0-否; 1-是"`
 	EnglishCountry   string `description:"英文客户-国家"`
 	EnglishViewTotal int    `description:"英文客户-累计点击量"`
+	CompanyType      string `description:"客户类型"`
 }

+ 25 - 1
models/roadshow/report_record.go

@@ -66,6 +66,7 @@ type RsReportRecordNum struct {
 	OfflineNum  int    `description:"线上路演次数"`
 	RoadShowNum int    `description:"路演总次数"`
 	SalonNum    int    `description:"沙龙路演次数"`
+	AskNum      int    `description:"提交过问答的路演次数"`
 	StartDate   string `description:"开始日期"`
 	EndDate     string `description:"结束日期"`
 	IsLook      bool   `description:"是否可以查看详情"`
@@ -145,14 +146,21 @@ type RsReportRecordList struct {
 	Province                   string    `description:"省"`
 	City                       string    `description:"市"`
 	CooperationName            string    `description:"合作方名称"`
+	CompanyIndustry            string    `description:"客户行业"`
+	CompanyClassify            string    `description:"客户分类"`
+	QuestionStatus             int       `description:"问答状态:0-未填写;1-已填写"`
+	QuestionMsgStatus          int       `description:"问答模板消息:0-未发送;1-已发送"`
+	CompanyType                string    `description:"客户类型:FICC/权益"`
+	EnglishCompany             int       `description:"是否为英文客户: 0-否; 1-是"`
 }
 
 // GetRsReportRecordList 获取路演统计详情返回数据
 func GetRsReportRecordList(condition string, pars []interface{}) (list []*RsReportRecordList, err error) {
 	o := orm.NewOrm()
-	sql := ` SELECT a.*,b.theme,b.roadshow_platform,b.province,b.city,b.cooperation_name
+	sql := ` SELECT a.*,b.theme,b.roadshow_platform,b.province,b.city,b.cooperation_name,b.english_company,c.company_industry,c.company_classify,c.question_status,c.question_msg_status
 				FROM  rs_report_record a 
 				join rs_calendar b on a.rs_calendar_id=b.rs_calendar_id
+				inner join rs_calendar_researcher AS c ON a.rs_calendar_id=c.rs_calendar_id AND a.rs_calendar_researcher_id=c.rs_calendar_researcher_id
 				WHERE 1=1 and a.rs_calendar_researcher_status = 2 
  `
 	if condition != "" {
@@ -483,3 +491,19 @@ func UpdateRsReportRecordInteractionNumnMulti(items []*RsReportRecord) (err erro
 	}
 	return
 }
+
+func GetReportResearcherExport(condition string, pars []interface{}) (list []*RsReportRecordList, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT a.*,b.theme,b.roadshow_platform,b.province,b.city,b.cooperation_name,c.company_industry,c.company_classify,c.question_status,c.question_msg_status,b.english_company
+				FROM  rs_report_record a 
+				join rs_calendar b on a.rs_calendar_id=b.rs_calendar_id
+				inner join rs_calendar_researcher AS c ON a.rs_calendar_id=c.rs_calendar_id AND a.rs_calendar_researcher_id=c.rs_calendar_researcher_id
+				WHERE 1=1 and a.rs_calendar_researcher_status = 2 
+ `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` order BY a.start_date DESC,a.start_time DESC`
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}

+ 3 - 0
models/seal/request/seal_approval.go

@@ -13,6 +13,9 @@ type SealApprovalApplyReq struct {
 	FileUrls          []string `description:"多个文件附件地址"`
 	FileNum           int      `description:"文件份数"`
 	AffiliatedCompany string   `description:"归属公司"`
+	CompanyId         int      `description:"客户id"`
+	StartDate         string   `description:"开始日期"`
+	EndDate           string   `description:"结束日期"`
 }
 
 // 用印审批编辑请求

+ 16 - 0
models/seal/seal.go

@@ -57,6 +57,22 @@ func GetSealInfoByContractId(sealId int) (sealInfo *Seal, err error) {
 	return
 }
 
+// GetSealInfoByDateAndCompanyId 根据起始时间,公司ID获取合同信息
+func GetSealInfoByDateAndCompanyId(startDate, endDate string, companyId int) (sealInfo *Seal, err error) {
+	o := orm.NewOrm()
+	sql := `select * from seal where start_date = ? and end_date = ? AND company_id =?  AND  product_id = 2  order by seal_id asc limit 1 `
+	err = o.Raw(sql, startDate, endDate, companyId).QueryRow(&sealInfo)
+	return
+}
+
+// GetCountByDateAndCompanyId  根据起始时间,公司ID获取合同信息数量
+func GetCountByDateAndCompanyId(startDate, endDate string, companyId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := "select count(*) AS COUNT from seal   where start_date = ? and end_date = ? AND company_id =?  AND  product_id = 2   "
+	err = o.Raw(sql, startDate, endDate, companyId).QueryRow(&count)
+	return
+}
+
 // AddSeal 用印添加
 func AddSeal(sealInfo *Seal) (err error) {
 	o := orm.NewOrm()

+ 45 - 0
routers/commentsRouter.go

@@ -7810,6 +7810,42 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "QuestionList",
+            Router: `/question/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "QuestionAdd",
+            Router: `/question/save`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "CalendarSummaryExport",
+            Router: `/question/summary/export`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "CalendarSummaryList",
+            Router: `/question/summary/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
         beego.ControllerComments{
             Method: "Refuse",
@@ -7855,6 +7891,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "ResearcherReportExport",
+            Router: `/report/researcher/export`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
         beego.ControllerComments{
             Method: "ResearcherReportList",

+ 58 - 0
services/roadshow/report.go

@@ -137,6 +137,41 @@ func GetMonthData(adminType, dimensionType string) (adminDataMapList []AdminData
 	return
 }
 
+// GetQuarterData 季度数据
+func GetQuarterData(adminType, dimensionType string) (adminDataMapList []AdminDataMap, firstDate time.Time, err error) { //三个协程返回
+	nowQuarterFirstDay := utils.GetNowQuarterFirstDay()                            //本季度第一天
+	nowQuarterLastDay := nowQuarterFirstDay.AddDate(0, 3, 0).Add(-1 * time.Second) //本季度最后一天
+
+	lastQuarterFirstDay1 := nowQuarterFirstDay.AddDate(0, -3, 0)                       //上个季度第一天
+	lastQuarterLastDay1 := lastQuarterFirstDay1.AddDate(0, 1, 0).Add(-1 * time.Second) //上个季度最后一天
+
+	lastQuarterFirstDay2 := nowQuarterFirstDay.AddDate(0, -6, 0)                       //上上个季度第一天
+	lastQuarterLastDay2 := lastQuarterFirstDay2.AddDate(0, 1, 0).Add(-1 * time.Second) //上上个季度最后一天
+
+	ch1 := make(chan AdminDataMap, 0)
+	ch2 := make(chan AdminDataMap, 0)
+	ch3 := make(chan AdminDataMap, 0)
+
+	go getSectionData(nowQuarterFirstDay, nowQuarterLastDay, adminType, dimensionType, ch1)
+	go getSectionData(lastQuarterFirstDay1, lastQuarterLastDay1, adminType, dimensionType, ch2)
+	go getSectionData(lastQuarterFirstDay2, lastQuarterLastDay2, adminType, dimensionType, ch3)
+
+	var nowMonthAdminDataMap, lastMonthAdminDataMap1, lastMonthAdminDataMap2 AdminDataMap
+
+	nowMonthAdminDataMap = <-ch1
+	close(ch1)
+
+	lastMonthAdminDataMap1 = <-ch2
+	close(ch2)
+
+	lastMonthAdminDataMap2 = <-ch3
+	close(ch3)
+
+	adminDataMapList = make([]AdminDataMap, 0)
+	adminDataMapList = append(adminDataMapList, nowMonthAdminDataMap, lastMonthAdminDataMap1, lastMonthAdminDataMap2)
+	return
+}
+
 // GetMonthDataV2 月度数据
 func GetMonthDataV2(adminType, dimensionType string, dataNum int) (adminDataMapList []AdminDataMap, firstDate time.Time, err error) { //三个协程返回
 	nowMonthFirstDay := utils.GetNowMonthFirstDay() //本月第一天
@@ -197,6 +232,7 @@ type AdminDataMap struct {
 	OfflineMap  map[int]int `description:"线上路演次数"`
 	RoadShowMap map[int]int `description:"路演总次数"`
 	SalonMap    map[int]int `description:"沙龙路演次数"`
+	AskMap      map[int]int `description:"沙龙路演次数"`
 	StartDate   string      `description:"开始日期"`
 	EndDate     string      `description:"开始日期"`
 }
@@ -223,6 +259,7 @@ func getResearcherSectionData(startDate, endDate time.Time) (adminDataMap AdminD
 	meetingMap := make(map[int]int)
 	roadShowMap := make(map[int]int) // 路演总次数
 	salonMap := make(map[int]int)    //沙龙路演次数
+	askMap := make(map[int]int)      //填写过客户问答的路演次数
 	//正式客户
 	{
 		var condition string
@@ -237,6 +274,16 @@ func getResearcherSectionData(startDate, endDate time.Time) (adminDataMap AdminD
 		for _, v := range data {
 			formalMap[v.AdminId] = v.Num
 		}
+
+		condition += ` and  question_status = 1  `
+		dataAsk, tmpErr := roadshow.GetGroupResearcherRecordList(condition, pars)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range dataAsk {
+			askMap[v.AdminId] = v.Num
+		}
 	}
 
 	//试用客户
@@ -255,6 +302,16 @@ func getResearcherSectionData(startDate, endDate time.Time) (adminDataMap AdminD
 			//fmt.Println(v)
 			tryOutMap[v.AdminId] = v.Num
 		}
+
+		condition += ` and  question_status = 1  `
+		dataAsk, tmpErr := roadshow.GetGroupResearcherRecordList(condition, pars)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range dataAsk {
+			askMap[v.AdminId] = v.Num
+		}
 	}
 
 	//试用客户
@@ -314,6 +371,7 @@ func getResearcherSectionData(startDate, endDate time.Time) (adminDataMap AdminD
 		MeetingMap:  meetingMap,
 		RoadShowMap: roadShowMap,
 		SalonMap:    salonMap,
+		AskMap:      askMap,
 		StartDate:   startDate.Format(utils.FormatDate),
 		EndDate:     endDate.Format(utils.FormatDate),
 	}

+ 17 - 17
services/seal/seal.go

@@ -161,23 +161,23 @@ func addSeal(userId, contractId, fileNum int, userName, use, companyName, useCom
 		fileUrl = fileUrls[0]
 	}
 	sealInfo = &seal.Seal{
-		Code:           sealCode,
-		UserId:         userId,
-		UserName:       userName,
-		Use:            use,
-		CompanyName:    companyName,
-		UseCompanyName: useCompanyName,
-		CreditCode:     creditCode,
-		ServiceType:    serviceType,
-		SealType:       sealType,
-		Status:         "待提交",
-		Remark:         remark,
-		FileUrl:        fileUrl,
-		FileNum:        fileNum,
-		ContractId:     contractId,
-		ModifyTime:     now,
-		CreateTime:     now,
-		AffiliatedCompany:  affiliatedCompany,
+		Code:              sealCode,
+		UserId:            userId,
+		UserName:          userName,
+		Use:               use,
+		CompanyName:       companyName,
+		UseCompanyName:    useCompanyName,
+		CreditCode:        creditCode,
+		ServiceType:       serviceType,
+		SealType:          sealType,
+		Status:            "待提交",
+		Remark:            remark,
+		FileUrl:           fileUrl,
+		FileNum:           fileNum,
+		ContractId:        contractId,
+		ModifyTime:        now,
+		CreateTime:        now,
+		AffiliatedCompany: affiliatedCompany,
 	}
 	err = seal.AddSeal(sealInfo)
 	if err != nil {