Ver código fonte

Merge branch 'ETA_1.2.4'

ziwen 1 ano atrás
pai
commit
8d090c72bf
47 arquivos alterados com 2496 adições e 1506 exclusões
  1. 227 0
      controllers/business_conf.go
  2. 206 0
      controllers/english_report/english_company.go
  3. 104 35
      controllers/report.go
  4. 2 2
      controllers/semantic_analysis/sa_compare.go
  5. 55 0
      controllers/sys_role.go
  6. 14 6
      go.mod
  7. 29 6
      go.sum
  8. 3 0
      log/api/apilog.log
  9. 167 0
      models/business_conf.go
  10. 108 0
      models/business_conf_operation_record.go
  11. 124 0
      models/company/company_permission.go
  12. 0 321
      models/data_manage/edb_data_gl.go
  13. 0 528
      models/data_manage/edb_data_quarter.go
  14. 0 135
      models/data_manage/gl_data.go
  15. 32 6
      models/db.go
  16. 231 0
      models/english_company.go
  17. 258 0
      models/english_company_todo.go
  18. 4 4
      models/permission.go
  19. 3 263
      models/report.go
  20. 7 4
      models/report_chapter.go
  21. 1 1
      models/report_chapter_ticker.go
  22. 7 7
      models/report_chapter_type.go
  23. 1 1
      models/report_chapter_type_permission.go
  24. 2 2
      models/sandbox/sandbox.go
  25. 2 2
      models/search_key_word.go
  26. 8 8
      models/semantic_analysis/sa_compare.go
  27. 4 4
      models/system/sys_admin.go
  28. 7 2
      models/system/sys_menu.go
  29. 1 0
      models/system/sys_role_admin.go
  30. 6 6
      models/system/sys_session.go
  31. 8 4
      models/user_view_history.go
  32. 2 2
      models/wechat_send_msg.go
  33. 45 0
      routers/commentsRouter.go
  34. 13 0
      routers/router.go
  35. 119 0
      services/english_company_todo.go
  36. 346 0
      services/minio.go
  37. 12 2
      services/oss.go
  38. 0 49
      services/ppt2img/ppt2img.go
  39. 93 0
      services/public_api/base_public_api.go
  40. 23 9
      services/report.go
  41. 56 0
      services/system.go
  42. 29 8
      services/user_login.go
  43. 43 6
      services/video.go
  44. 4 0
      services/wechat_send_msg.go
  45. 11 5
      services/xfyun.go
  46. 63 78
      utils/config.go
  47. 16 0
      utils/constants.go

+ 227 - 0
controllers/business_conf.go

@@ -0,0 +1,227 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta/eta_mobile/models"
+	"eta/eta_mobile/utils"
+	"fmt"
+	"html"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// BusinessConfController 商家配置
+type BusinessConfController struct {
+	BaseAuthController
+}
+
+type BusinessConfOpenController struct {
+	BaseCommonController
+}
+
+// Save
+// @Title 保存配置
+// @Description 保存配置
+// @Param	request	body map[string]interface{} true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /save [post]
+func (this *BusinessConfController) Save() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req map[string]interface{}
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+
+	// 获取配置信息
+	confOb := new(models.BusinessConf)
+	list, e := confOb.GetItemsByCondition("", make([]interface{}, 0), []string{}, "")
+	if e != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "获取配置列表失败, Err: " + e.Error()
+		return
+	}
+	confMap := make(map[string]*models.BusinessConf)
+	for _, c := range list {
+		confMap[c.ConfKey] = c
+	}
+
+	// 根据配置类型取值
+	updates := make([]models.BusinessConfUpdate, 0)
+	for k, v := range req {
+		// 过滤掉表中没有的key
+		conf := confMap[k]
+		if conf == nil {
+			continue
+		}
+
+		switch conf.ValType {
+		case 1: // 字符串
+			str, ok := v.(string)
+			if !ok {
+				continue
+			}
+			str = strings.TrimSpace(str)
+			if conf.Necessary == 1 && str == "" {
+				br.Msg = conf.Remark + "不可为空"
+				return
+			}
+			updates = append(updates, models.BusinessConfUpdate{
+				ConfKey: k,
+				ConfVal: str,
+			})
+		case 2: // 数值
+			num, ok := v.(float64)
+			if !ok {
+				continue
+			}
+			if conf.Necessary == 1 && num <= 0 {
+				br.Msg = conf.Remark + "不可为空"
+				return
+			}
+			val := strconv.FormatFloat(num, 'f', 0, 64)
+			updates = append(updates, models.BusinessConfUpdate{
+				ConfKey: k,
+				ConfVal: val,
+			})
+		case 3: // 字符串数组
+			arr, ok := v.([]interface{})
+			if !ok {
+				continue
+			}
+			if conf.Necessary == 1 && len(arr) == 0 {
+				br.Msg = conf.Remark + "不可为空"
+				return
+			}
+			strArr := make([]string, 0)
+			for _, a := range arr {
+				if s, ok2 := a.(string); ok2 {
+					strArr = append(strArr, s)
+				}
+			}
+			val := strings.Join(strArr, ",")
+			updates = append(updates, models.BusinessConfUpdate{
+				ConfKey: k,
+				ConfVal: val,
+			})
+		case 4: // 富文本
+			content, ok := v.(string)
+			if !ok {
+				continue
+			}
+			content = strings.TrimSpace(content)
+			if conf.Necessary == 1 && content == "" {
+				br.Msg = conf.Remark + "不可为空"
+				return
+			}
+			content = html.EscapeString(content)
+			updates = append(updates, models.BusinessConfUpdate{
+				ConfKey: k,
+				ConfVal: content,
+			})
+		}
+	}
+
+	if len(updates) > 0 {
+		if e = models.UpdateBusinessConfMulti(updates); e != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "保存商家配置失败, Err: " + e.Error()
+			return
+		}
+	}
+
+	// 操作日志
+	go func() {
+		b, e := json.Marshal(req)
+		if e != nil {
+			return
+		}
+		recordOb := new(models.BusinessConfOperationRecord)
+		recordOb.SysUserId = sysUser.AdminId
+		recordOb.SysRealName = sysUser.RealName
+		recordOb.Content = string(b)
+		recordOb.CreateTime = time.Now().Local()
+		_ = recordOb.Create()
+	}()
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// Fetch
+// @Title 获取配置
+// @Description 获取配置
+// @Success 200 Ret=200 获取成功
+// @router /fetch [get]
+func (this *BusinessConfController) Fetch() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	list, e := models.GetBusinessConf()
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取商家配置失败, Err: " + e.Error()
+		return
+	}
+
+	br.Data = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// CodeEncrypt
+// @Title 商家编码加密
+// @Description 商家编码加密
+// @Success 200 Ret=200 获取成功
+// @router /code_encrypt [get]
+func (this *BusinessConfOpenController) CodeEncrypt() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	res := ""
+	if utils.BusinessCode != "" {
+		res = utils.MD5(fmt.Sprintf("%s%s", utils.BusinessCode, utils.BusinessCodeSalt))
+	}
+
+	br.Data = res
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 206 - 0
controllers/english_report/english_company.go

@@ -0,0 +1,206 @@
+package english_report
+
+import (
+	"eta/eta_mobile/controllers"
+	"eta/eta_mobile/models"
+	"eta/eta_mobile/services"
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strconv"
+	"strings"
+)
+
+// EnglishCompanyController 英文客户
+type EnglishCompanyController struct {
+	controllers.BaseAuthController
+}
+
+// List
+// @Title 英文客户列表
+// @Description 英文客户列表
+// @Param   Keywords	query	string	false	"关键词:客户名称/联系人邮箱/联系人手机号"
+// @Param   SortType	query	int		false	"点击量排序:1-降序; 2-升序"
+// @Param   EnPermissionIds		query	string		false	"品种权限IDs(字符串)"
+// @Success 200 {object} models.EnglishCompanyPageListResp
+// @router /company/list [get]
+func (this *EnglishCompanyController) List() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var startSize int
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	keywords := this.GetString("Keywords", "")
+	sortType, _ := this.GetInt("SortType", 0)
+	sortParam := this.GetString("SortParam", "")
+	strPermissionIds := this.GetString("EnPermissionIds", "")
+
+	var cond, order string
+	var pars []interface{}
+	if keywords != "" {
+		k := "%" + keywords + "%"
+		companyIds, e := models.GetEnCompanyIdsByKeyword(k)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "关键词获取英文客户IDs失败, Err: " + e.Error()
+			return
+		}
+		if len(companyIds) == 0 {
+			page := paging.GetPaging(currentIndex, pageSize, 0)
+			resp := &models.EnglishCompanyPageListResp{
+				Paging: page,
+				List:   make([]*models.EnglishCompanyResp, 0),
+			}
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "获取成功"
+			br.Data = resp
+			return
+		}
+		cond += fmt.Sprintf(` AND c.company_id IN (%s) `, utils.GetOrmInReplace(len(companyIds)))
+		pars = append(pars, companyIds)
+	}
+	// 品种权限
+	if strPermissionIds != "" {
+		permissionIdArr := strings.Split(strPermissionIds, ",")
+		permissionIds := make([]int, 0)
+		for _, s := range permissionIdArr {
+			p, e := strconv.Atoi(s)
+			if e != nil {
+				br.Msg = "品种权限有误"
+				br.ErrMsg = "品种权限筛选有误"
+				return
+			}
+			permissionIds = append(permissionIds, p)
+		}
+		if len(permissionIds) == 0 {
+			br.Msg = "品种权限有误"
+			br.ErrMsg = "品种权限筛选ID为空"
+			return
+		}
+		queryCond := fmt.Sprintf(` AND %s IN (%s)`, models.EnCompanyPermissionColumns.EnPermissionId, utils.GetOrmInReplace(len(permissionIds)))
+		queryPars := make([]interface{}, 0)
+		queryPars = append(queryPars, permissionIds)
+		queryOB := new(models.EnCompanyPermission)
+		queryList, e := queryOB.GetItemsByCondition(queryCond, queryPars, []string{"DISTINCT en_company_id"}, "")
+		if e != nil {
+			br.Msg = "品种筛选有误"
+			br.ErrMsg = "品种筛选失败, Err: " + e.Error()
+			return
+		}
+		companyIds := make([]int, 0)
+		for _, q := range queryList {
+			companyIds = append(companyIds, q.EnCompanyId)
+		}
+		if len(companyIds) == 0 {
+			page := paging.GetPaging(currentIndex, pageSize, 0)
+			resp := &models.EnglishCompanyPageListResp{
+				Paging: page,
+				List:   make([]*models.EnglishCompanyResp, 0),
+			}
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "获取成功"
+			br.Data = resp
+			return
+		}
+		cond += fmt.Sprintf(` AND c.company_id IN (%s) `, utils.GetOrmInReplace(len(companyIds)))
+		pars = append(pars, companyIds)
+	}
+
+	if sortParam == "" {
+		if sortType == 1 {
+			order = ` ORDER BY c.view_total DESC`
+		}
+		if sortType == 2 {
+			order = ` ORDER BY c.view_total ASC`
+		}
+	} else if sortParam == "deadLine" {
+		order = ` ORDER BY todo_end_time asc, c.view_total desc, c.company_id desc`
+	} else if sortParam == "todoStatusStr" {
+		order = ` ORDER BY FIELD (todo_status_str,'进行中','已完成','无任务'), c.view_total desc, c.company_id desc`
+	}
+
+	total, list, e := models.GetEnglishCompanyPageList(cond, pars, order, startSize, pageSize)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取英文客户列表失败, Err: " + e.Error()
+		return
+	}
+	// 客户列表TODO信息
+	todoMap := services.GetEnglishCompanyListTodoMap(list, sysUser)
+
+	// 品种权限
+	permissionMap := make(map[int][]int)
+	{
+		companyIds := make([]int, 0)
+		for _, v := range list {
+			companyIds = append(companyIds, v.CompanyId)
+		}
+		if len(companyIds) > 0 {
+			cond := fmt.Sprintf(` AND %s IN (%s)`, models.EnCompanyPermissionColumns.EnCompanyId, utils.GetOrmInReplace(len(companyIds)))
+			pars := make([]interface{}, 0)
+			pars = append(pars, companyIds)
+			ob := new(models.EnCompanyPermission)
+			items, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取客户权限列表失败, Err: " + e.Error()
+				return
+			}
+			for _, v := range items {
+				if permissionMap[v.EnCompanyId] == nil {
+					permissionMap[v.EnCompanyId] = make([]int, 0)
+				}
+				permissionMap[v.EnCompanyId] = append(permissionMap[v.EnCompanyId], v.EnPermissionId)
+			}
+		}
+	}
+
+	respList := make([]*models.EnglishCompanyResp, 0)
+	for i := range list {
+		respList = append(respList, &models.EnglishCompanyResp{
+			CompanyId:     list[i].CompanyId,
+			CompanyName:   list[i].CompanyName,
+			CountryCode:   list[i].CountryCode,
+			Country:       list[i].Country,
+			SellerId:      list[i].SellerId,
+			SellerName:    list[i].SellerName,
+			ViewTotal:     list[i].ViewTotal,
+			CreateTime:    list[i].CreateTime.Format(utils.FormatDateTime),
+			Enabled:       list[i].Enabled,
+			TodoInfo:      todoMap[list[i].CompanyId],
+			EnPermissions: permissionMap[list[i].CompanyId],
+		})
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := &models.EnglishCompanyPageListResp{
+		Paging: page,
+		List:   respList,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 104 - 35
controllers/report.go

@@ -142,14 +142,12 @@ func (this *ReportController) ListReport() {
 				syncReportIdArr = append(syncReportIdArr, strconv.Itoa(list[i].OldReportId))
 			}
 		}
-		reportIds := strings.Join(reportIdArr, ",")
-		syncReportIds := strings.Join(syncReportIdArr, ",")
 
 		// 查询同步过来的报告对应的老报告PV+UV
 		pvMap := make(map[int]int, 0)
 		uvMap := make(map[int]int, 0)
-		if syncReportIds != "" {
-			puvList, e := models.GetPUVByResearchReportIds(syncReportIds)
+		if len(syncReportIdArr) > 0 {
+			puvList, e := models.GetPUVByResearchReportIds(syncReportIdArr)
 			if e != nil {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取同步报告对应的PV、UV失败, Err: " + e.Error()
@@ -162,7 +160,7 @@ func (this *ReportController) ListReport() {
 			}
 		}
 		// 晨周报音频列表
-		videoList, err := models.GetReportChapterVideoListByReportIds(reportIds)
+		videoList, err := models.GetReportChapterVideoListByReportIds(reportIdArr)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取报告音频文件失败,Err:" + err.Error()
@@ -481,21 +479,25 @@ func (this *ReportController) Add() {
 		br.ErrMsg = "保存失败,Err:" + err.Error()
 		return
 	}
-	//处理权限
-	{
-		permissionItems, err := models.GetPermission(req.ClassifyNameSecond)
-		if err != nil {
-			go alarm_msg.SendAlarmMsg("获取权限失败,Err:"+err.Error(), 3)
-			//utils.SendEmail(utils.APPNAME+"失败提醒", "获取权限失败,Err:"+err.Error(), utils.EmailSendToUsers)
-		}
-		for _, v := range permissionItems {
-			err = models.AddChartPermissionChapterMapping(v.ChartPermissionId, newReportId)
-			if err != nil {
-				go alarm_msg.SendAlarmMsg("新增权限失败,Err:"+err.Error(), 3)
-				//utils.SendEmail(utils.APPNAME+"失败提醒", "新增权限失败,Err:"+err.Error()+strconv.FormatInt(newReportId, 10), utils.EmailSendToUsers)
+
+	// 处理权限
+	if utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox {
+		go func() {
+			permissionItems, e := models.GetPermission(req.ClassifyNameSecond)
+			if e != nil {
+				alarm_msg.SendAlarmMsg("获取权限失败,Err:"+e.Error(), 3)
+				return
 			}
-		}
+			for _, v := range permissionItems {
+				e = models.AddChartPermissionChapterMapping(v.ChartPermissionId, newReportId)
+				if e != nil {
+					alarm_msg.SendAlarmMsg("新增权限失败,Err:"+e.Error(), 3)
+					return
+				}
+			}
+		}()
 	}
+
 	reportCode := utils.MD5(strconv.Itoa(int(newReportId)))
 	//修改唯一编码
 	{
@@ -601,26 +603,30 @@ func (this *ReportController) Edit() {
 		br.ErrMsg = "保存失败,Err:" + err.Error()
 		return
 	}
+
 	//处理权限
-	{
-		err = models.RemoveChartPermissionChapterMapping(req.ReportId)
-		if err != nil {
-			go alarm_msg.SendAlarmMsg("修改删除报告权限失败,Err:"+err.Error(), 3)
-			//utils.SendEmail(utils.APPNAME+"失败提醒", "修改删除报告权限失败,Err:"+err.Error(), utils.EmailSendToUsers)
-		}
-		permissionItems, err := models.GetPermission(req.ClassifyNameSecond)
-		if err != nil {
-			go alarm_msg.SendAlarmMsg("获取权限失败,Err:"+err.Error(), 3)
-			//utils.SendEmail(utils.APPNAME+"失败提醒", "获取权限失败,Err:"+err.Error(), utils.EmailSendToUsers)
-		}
-		for _, v := range permissionItems {
-			err = models.AddChartPermissionChapterMapping(v.ChartPermissionId, req.ReportId)
-			if err != nil {
-				go alarm_msg.SendAlarmMsg("新增权限失败,Err:"+err.Error(), 3)
-				//utils.SendEmail(utils.APPNAME+"失败提醒", "新增权限失败,Err:"+err.Error()+strconv.FormatInt(req.ReportId, 10), utils.EmailSendToUsers)
+	if utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox {
+		go func() {
+			e := models.RemoveChartPermissionChapterMapping(req.ReportId)
+			if e != nil {
+				alarm_msg.SendAlarmMsg("修改删除报告权限失败,Err:"+e.Error(), 3)
+				return
 			}
-		}
+			permissionItems, e := models.GetPermission(req.ClassifyNameSecond)
+			if e != nil {
+				alarm_msg.SendAlarmMsg("获取权限失败,Err:"+e.Error(), 3)
+				return
+			}
+			for _, v := range permissionItems {
+				e = models.AddChartPermissionChapterMapping(v.ChartPermissionId, req.ReportId)
+				if e != nil {
+					alarm_msg.SendAlarmMsg("新增权限失败,Err:"+e.Error(), 3)
+					return
+				}
+			}
+		}()
 	}
+
 	reportCode := utils.MD5(strconv.Itoa(int(req.ReportId)))
 	resp := new(models.EditResp)
 	resp.ReportId = req.ReportId
@@ -1637,6 +1643,12 @@ func (this *ReportController) GetChapterTrendTag() {
 		br.Ret = 408
 		return
 	}
+	if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "操作成功"
+		return
+	}
 
 	list, err := models.GetKeyWordListByFrom("trend")
 	if err != nil {
@@ -1670,6 +1682,12 @@ func (this *ReportController) EditChapterTrendTag() {
 		br.Ret = 408
 		return
 	}
+	if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "操作成功"
+		return
+	}
 
 	var req models.EditChapterTrendTagReq
 	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
@@ -1834,6 +1852,12 @@ func (this *ReportController) IsLastDayWeekReportChapter() {
 		br.Ret = 408
 		return
 	}
+	if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "操作成功"
+		return
+	}
 
 	reportChapterId, _ := this.GetInt("ReportChapterId")
 	if reportChapterId <= 0 {
@@ -1890,6 +1914,12 @@ func (this *ReportController) PublishDayWeekReportChapter() {
 		br.Ret = 408
 		return
 	}
+	if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "操作成功"
+		return
+	}
 
 	var req models.PublishReportChapterReq
 	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
@@ -1930,6 +1960,11 @@ func (this *ReportController) PublishDayWeekReportChapter() {
 		br.ErrMsg = "查询报告信息失败, Err: " + err.Error()
 		return
 	}
+	if reportInfo.State == 2 {
+		br.Msg = "该报告已发布,不允许编辑"
+		br.ErrMsg = "该报告已发布,不允许编辑"
+		return
+	}
 
 	// 获取规则配置
 	reportChapterTypeRule, err := models.GetReportChapterTypeById(chapterInfo.TypeId)
@@ -1948,6 +1983,7 @@ func (this *ReportController) PublishDayWeekReportChapter() {
 	updateCols := make([]string, 0)
 	updateCols = append(updateCols, "Title", "AddType", "Author", "Content", "ContentSub", "IsEdit", "CreateTime", "PublishState", "PublishTime")
 
+	var needHandleVideo bool // 是否需要处理音频文件
 	nowTime := time.Now()
 	var publishTime time.Time
 	if reportInfo.MsgIsSend == 1 && reportInfo.PublishTime != "" { //如果报告曾经发布过,并且已经发送过模版消息,则章节的发布时间为报告的发布时间
@@ -1963,6 +1999,9 @@ func (this *ReportController) PublishDayWeekReportChapter() {
 		chapterInfo.VideoKind = 1
 
 		updateCols = append(updateCols, "VideoUrl", "VideoName", "VideoSize", "VideoPlaySeconds", "VideoKind")
+
+		// 手动上传的音频需要处理音频文件
+		needHandleVideo = true
 	} else {
 		if chapterInfo.VideoUrl == "" {
 			// 生成video
@@ -2041,6 +2080,11 @@ func (this *ReportController) PublishDayWeekReportChapter() {
 		}
 	}
 
+	// 处理报告中的音频文件分贝
+	if needHandleVideo {
+		go services.HandleVideoDecibel(chapterInfo)
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -2064,6 +2108,12 @@ func (this *ReportController) PublishDayWeekReport() {
 		br.Ret = 408
 		return
 	}
+	if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "操作成功"
+		return
+	}
 
 	var req models.PublishDayWeekReportReq
 	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
@@ -2123,6 +2173,13 @@ func (this *ReportController) GetSunCode() {
 		br.Ret = 408
 		return
 	}
+	if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "操作成功"
+		return
+	}
+
 	var req models.SunCodeReq
 	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
 	if err != nil {
@@ -2177,6 +2234,12 @@ func (this *ReportController) GetStopDayWeekReportChapterTypeList() {
 		br.Ret = 408
 		return
 	}
+	if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "操作成功"
+		return
+	}
 
 	stopDay := make([]*models.ReportChapterType, 0)
 	stopWeek := make([]*models.ReportChapterType, 0)
@@ -2388,6 +2451,12 @@ func (this *ReportController) CheckDayWeekReportChapterVideo() {
 		br.Ret = 408
 		return
 	}
+	if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "操作成功"
+		return
+	}
 
 	reqReportId := this.GetString("ReportId")
 	reportId, _ := strconv.Atoi(reqReportId)

+ 2 - 2
controllers/semantic_analysis/sa_compare.go

@@ -1,12 +1,12 @@
 package semantic_analysis
 
 import (
-	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"eta/eta_mobile/controllers"
 	"eta/eta_mobile/models"
 	saModel "eta/eta_mobile/models/semantic_analysis"
 	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
 // SaCompareController 语义分析-文档比对

+ 55 - 0
controllers/sys_role.go

@@ -3,6 +3,7 @@ package controllers
 import (
 	"eta/eta_mobile/models"
 	"eta/eta_mobile/models/system"
+	"eta/eta_mobile/utils"
 )
 
 type SysRoleController struct {
@@ -56,3 +57,57 @@ func (this *SysRoleController) ButtonList() {
 	br.Success = true
 	br.Msg = "获取成功"
 }
+
+// SystemConfig
+// @Title 系统配置列表
+// @Description 系统配置列表
+// @Success 200 {object} []system.BusinessConf
+// @router /config [get]
+func (this *SysRoleController) SystemConfig() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	list := make([]system.BusinessConf, 0)
+
+	// 获取基础配置, 若未配置则直接返回
+	conf, e := models.GetBusinessConf()
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取基础配置失败, Err: " + e.Error()
+		return
+	}
+
+	list = append(list, system.BusinessConf{
+		ConfKey: "ReportViewUrl",
+		ConfVal: conf["ReportViewUrl"],
+	}, system.BusinessConf{
+		ConfKey: "ChartViewUrl",
+		ConfVal: conf["ChartViewUrl"],
+	})
+
+	osc := system.BusinessConf{
+		ConfKey: "ObjectStorageClient",
+		ConfVal: utils.ObjectStorageClient,
+	}
+	if osc.ConfVal == "" {
+		osc.ConfVal = "oss"
+	}
+	list = append(list, osc)
+
+	br.Data = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 14 - 6
go.mod

@@ -16,13 +16,14 @@ require (
 	github.com/gonum/stat v0.0.0-20181125101827-41a0da705a5b
 	github.com/gorilla/websocket v1.4.2
 	github.com/kgiannakakis/mp3duration v0.0.0-20191013070830-d834f8d5ed53
+	github.com/minio/minio-go/v7 v7.0.63
 	github.com/mojocn/base64Captcha v1.3.5
 	github.com/nosixtools/solarlunar v0.0.0-20211112060703-1b6dea7b4a19
 	github.com/olivere/elastic/v7 v7.0.30
 	github.com/rdlucklib/rdluck_tools v1.0.3
 	github.com/shopspring/decimal v1.3.1
 	github.com/silenceper/wechat/v2 v2.1.4
-	github.com/sirupsen/logrus v1.9.0
+	github.com/sirupsen/logrus v1.9.3
 	github.com/tealeg/xlsx v1.0.5
 	github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.655
 	github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ses v1.0.655
@@ -46,6 +47,7 @@ require (
 	github.com/cespare/xxhash/v2 v2.1.2 // indirect
 	github.com/clbanning/mxj/v2 v2.5.5 // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
+	github.com/dustin/go-humanize v1.0.1 // indirect
 	github.com/fatih/structs v1.1.0 // indirect
 	github.com/garyburd/redigo v1.6.3 // indirect
 	github.com/go-redis/redis/v8 v8.11.5 // indirect
@@ -57,13 +59,18 @@ require (
 	github.com/gonum/internal v0.0.0-20181124074243-f884aa714029 // indirect
 	github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9 // indirect
 	github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9 // indirect
+	github.com/google/uuid v1.3.0 // indirect
 	github.com/hashicorp/golang-lru v0.5.4 // indirect
 	github.com/jmespath/go-jmespath v0.4.0 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/klauspost/compress v1.16.7 // indirect
+	github.com/klauspost/cpuid/v2 v2.2.5 // indirect
 	github.com/kr/text v0.2.0 // indirect
 	github.com/mailru/easyjson v0.7.7 // indirect
 	github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
+	github.com/minio/md5-simd v1.1.2 // indirect
+	github.com/minio/sha256-simd v1.0.1 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
@@ -76,6 +83,7 @@ require (
 	github.com/prometheus/procfs v0.8.0 // indirect
 	github.com/richardlehane/mscfb v1.0.4 // indirect
 	github.com/richardlehane/msoleps v1.0.3 // indirect
+	github.com/rs/xid v1.5.0 // indirect
 	github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
 	github.com/spf13/cast v1.4.1 // indirect
 	github.com/tidwall/gjson v1.14.1 // indirect
@@ -84,15 +92,15 @@ require (
 	github.com/tjfoc/gmsm v1.3.2 // 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.8.0 // indirect
+	golang.org/x/crypto v0.12.0 // indirect
 	golang.org/x/image v0.5.0 // indirect
-	golang.org/x/net v0.9.0 // indirect
-	golang.org/x/sys v0.7.0 // indirect
-	golang.org/x/text v0.9.0 // indirect
+	golang.org/x/net v0.14.0 // indirect
+	golang.org/x/sys v0.11.0 // indirect
+	golang.org/x/text v0.12.0 // indirect
 	golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 // indirect
 	google.golang.org/protobuf v1.28.1 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
-	gopkg.in/ini.v1 v1.66.2 // indirect
+	gopkg.in/ini.v1 v1.67.0 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 	xorm.io/builder v0.3.6 // indirect

+ 29 - 6
go.sum

@@ -128,6 +128,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumC
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
+github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
+github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
 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=
@@ -253,6 +255,8 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf
 github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.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/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
@@ -294,6 +298,11 @@ github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8
 github.com/kgiannakakis/mp3duration v0.0.0-20191013070830-d834f8d5ed53 h1:+8X3HMX8A2QhvNg3dImiQTCiVUt6BQXz1mW+/DrWI+k=
 github.com/kgiannakakis/mp3duration v0.0.0-20191013070830-d834f8d5ed53/go.mod h1:E61jD6q4yJ6Cu9uDGRAfiENM1G5TVZhOog0Y3+GgTpQ=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
+github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
+github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
+github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
+github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
 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/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
@@ -313,6 +322,12 @@ github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJK
 github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 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/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
+github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
+github.com/minio/minio-go/v7 v7.0.63 h1:GbZ2oCvaUdgT5640WJOpyDhhDxvknAJU2/T3yurwcbQ=
+github.com/minio/minio-go/v7 v7.0.63/go.mod h1:Q6X7Qjb7WMhvG65qKf4gUgA5XaiSox74kR1uAEjxRS4=
+github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
+github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
 github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
 github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -406,6 +421,8 @@ github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTK
 github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM=
 github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
+github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
 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=
@@ -420,8 +437,9 @@ github.com/silenceper/wechat/v2 v2.1.4/go.mod h1:F0PKqImb15THnwoqRNrZO1z3vpwyWui
 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/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
-github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
 github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
+github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
 github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
@@ -504,8 +522,9 @@ golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPh
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
 golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
+golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
+golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
 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=
@@ -585,8 +604,9 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
 golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
+golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
+golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
 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=
@@ -656,8 +676,9 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
 golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
+golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
@@ -670,8 +691,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
+golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 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=
@@ -824,8 +846,9 @@ gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkp
 gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY=
 gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0=
 gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI=
 gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
+gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
 gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
 gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=

Diferenças do arquivo suprimidas por serem muito extensas
+ 3 - 0
log/api/apilog.log


+ 167 - 0
models/business_conf.go

@@ -0,0 +1,167 @@
+package models
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"html"
+	"strings"
+	"time"
+)
+
+const (
+	BusinessConfUseXf          = "UseXf"
+	BusinessConfXfAppid        = "XfAppid"
+	BusinessConfXfApiKey       = "XfApiKey"
+	BusinessConfXfApiSecret    = "XfApiSecret"
+	BusinessConfXfVcn          = "XfVcn"
+	BusinessConfEnPptCoverImgs = "EnPptCoverImgs"
+)
+
+// BusinessConf 商户配置表
+type BusinessConf struct {
+	Id         int    `orm:"column(id);pk"`
+	ConfKey    string `description:"配置Key"`
+	ConfVal    string `description:"配置值"`
+	ValType    int    `description:"1-字符串;2-数值;3-字符串数组;4-富文本;"`
+	Necessary  int    `description:"是否必填:0-否;1-是"`
+	Remark     string `description:"备注"`
+	CreateTime time.Time
+}
+
+func (m *BusinessConf) TableName() string {
+	return "business_conf"
+}
+
+func (m *BusinessConf) PrimaryId() string {
+	return "id"
+}
+
+func (m *BusinessConf) Create() (err error) {
+	o := orm.NewOrm()
+	id, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.Id = int(id)
+	return
+}
+
+func (m *BusinessConf) CreateMulti(items []*BusinessConf) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+func (m *BusinessConf) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func (m *BusinessConf) Del() (err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	_, err = o.Raw(sql, m.Id).Exec()
+	return
+}
+
+func (m *BusinessConf) GetItemById(id int) (item *BusinessConf, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func (m *BusinessConf) GetItemByCondition(condition string, pars []interface{}) (item *BusinessConf, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s LIMIT 1`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+func (m *BusinessConf) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func (m *BusinessConf) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BusinessConf, err error) {
+	o := orm.NewOrm()
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func (m *BusinessConf) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*BusinessConf, err error) {
+	o := orm.NewOrm()
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// GetBusinessConf 获取商家配置
+func GetBusinessConf() (list map[string]string, err error) {
+	list = make(map[string]string)
+
+	var items []*BusinessConf
+	o := orm.NewOrm()
+	sql := `SELECT * FROM business_conf`
+	_, err = o.Raw(sql).QueryRows(&items)
+	if err != nil {
+		return
+	}
+
+	for _, v := range items {
+		if v.ValType == 4 {
+			list[v.ConfKey] = html.UnescapeString(v.ConfVal)
+			continue
+		}
+		list[v.ConfKey] = v.ConfVal
+	}
+	return
+}
+
+// BusinessConfUpdate 更新配置
+type BusinessConfUpdate struct {
+	ConfKey string
+	ConfVal string
+}
+
+// UpdateBusinessConfMulti 批量修改配置
+func UpdateBusinessConfMulti(items []BusinessConfUpdate) (err error) {
+	o := orm.NewOrm()
+	p, err := o.Raw("UPDATE business_conf SET conf_val = ? WHERE conf_key = ?").Prepare()
+	if err != nil {
+		return
+	}
+	defer func() {
+		_ = p.Close()
+	}()
+	for _, v := range items {
+		_, err = p.Exec(v.ConfVal, v.ConfKey)
+		if err != nil {
+			return
+		}
+	}
+	return
+}

+ 108 - 0
models/business_conf_operation_record.go

@@ -0,0 +1,108 @@
+package models
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+	"time"
+)
+
+// BusinessConfOperationRecord 商户配置操作记录表
+type BusinessConfOperationRecord struct {
+	Id          int       `orm:"column(id);pk"`
+	SysUserId   int       `description:"操作人ID"`
+	SysRealName string    `description:"操作人姓名"`
+	Content     string    `description:"操作数据"`
+	CreateTime  time.Time `description:"操作时间"`
+}
+
+func (m *BusinessConfOperationRecord) TableName() string {
+	return "business_conf_operation_record"
+}
+
+func (m *BusinessConfOperationRecord) PrimaryId() string {
+	return "id"
+}
+
+func (m *BusinessConfOperationRecord) Create() (err error) {
+	o := orm.NewOrm()
+	id, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.Id = int(id)
+	return
+}
+
+func (m *BusinessConfOperationRecord) CreateMulti(items []*BusinessConfOperationRecord) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+func (m *BusinessConfOperationRecord) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func (m *BusinessConfOperationRecord) Del() (err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	_, err = o.Raw(sql, m.Id).Exec()
+	return
+}
+
+func (m *BusinessConfOperationRecord) GetItemById(id int) (item *BusinessConfOperationRecord, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func (m *BusinessConfOperationRecord) GetItemByCondition(condition string, pars []interface{}) (item *BusinessConfOperationRecord, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s LIMIT 1`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+func (m *BusinessConfOperationRecord) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func (m *BusinessConfOperationRecord) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BusinessConfOperationRecord, err error) {
+	o := orm.NewOrm()
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func (m *BusinessConfOperationRecord) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*BusinessConfOperationRecord, err error) {
+	o := orm.NewOrm()
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}

+ 124 - 0
models/company/company_permission.go

@@ -0,0 +1,124 @@
+package company
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type ChartPermission struct {
+	ChartPermissionId   int       `description:"权限id"`
+	ChartPermissionName string    `description:"权限名称(旧)"`
+	PermissionName      string    `description:"权限名称"`
+	Sort                int       `description:"排序"`
+	Enabled             int       `description:"是否可用"`
+	CreatedTime         time.Time `description:"创建时间"`
+	LastUpdatedTime     time.Time `description:"最后更新时间"`
+	TeleconferenceSort  int       `description:"电话会排序"`
+	Remark              string    `description:"备注"`
+	ClassifyName        string    `description:"分类"`
+	PermissionType      int       `description:"1主观,2客观"`
+	Checked             bool      `description:"选中状态"`
+}
+
+type PermissionSetItem struct {
+	ChartPermissionId int                  `description:"权限id"`
+	PermissionName    string               `description:"权限名称"`
+	PermissionType    int                  `description:"1主观,2客观"`
+	Checked           bool                 `description:"选中状态"`
+	Child             []*PermissionSetItem `description:"具体的主客观-方便前端的排版用的"`
+}
+
+type PermissionSetItemType struct {
+	PermissionName string `description:"权限名称"`
+	Checked        bool   `description:"选中状态"`
+	CheckedMinate  bool   `description:"不确定状态"`
+	NoClicking     bool   `description:"是否禁止点击"`
+	Items          []*PermissionLookItem
+}
+
+type PermissionSetList struct {
+	ClassifyName string `description:"分类"`
+	Items        []*PermissionSetItem
+	CheckList    []int
+}
+
+type PermissionSetListType struct {
+	ClassifyName string `description:"分类"`
+	Items        []*PermissionSetItemType
+	CheckList    []int
+}
+
+type PermissionSetResp struct {
+	List []*PermissionSetList
+	//ListUpgrade []*PermissionSetList     `description:"升级权限列表"`
+	ListType []*PermissionSetListType `description:"主观客观列表"`
+}
+
+func GetPermissionSetItems(productId int, classifyName string) (items []*PermissionSetItem, err error) {
+	o := orm.NewOrmUsingDB("weekly")
+	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND classify_name=?  AND permission_type=0 ORDER BY sort ASC `
+	_, err = o.Raw(sql, productId, classifyName).QueryRows(&items)
+	return
+}
+
+type PermissionLookItem struct {
+	ChartPermissionId  int                   `description:"权限id"`
+	PermissionName     string                `description:"权限名称"`
+	StartDate          string                `description:"权限开始日期"`
+	EndDate            string                `description:"权限结束日期"`
+	Status             string                `description:"'正式','试用','关闭'"`
+	ExpireDay          string                `description:"到期天数"`
+	ClassifyName       string                `description:"分类"`
+	PermissionType     int                   `description:"1主观,2客观"`
+	PermissionTypeName string                `description:"主观、客观"`
+	Checked            bool                  `description:"选中状态"`
+	Remark             string                `description:"备注"`
+	IsMerge            bool                  `description:"是否合并行业, 给前端的标识, 暂时仅权益使用"`
+	RaiBothHas         bool                  `description:"权益-是否主客观都有"`
+	IsUpgrade          int                   `description:"是否升级,1是,0否"`
+	Child              []*PermissionLookItem `description:"子权限"`
+}
+
+type PermissionVarietyResp struct {
+	List []*PermissionVarietyList
+}
+
+type PermissionVarietyItem struct {
+	ChartPermissionId int    `description:"权限id"`
+	ClassifyName      string `orm:"column(permission_name)" description:"权限名称"`
+}
+
+type PermissionVarietyList struct {
+	ChartPermissionId int    `description:"父级id"`
+	ClassifyName      string `description:"分类"`
+	Items             []*PermissionVarietyItem
+}
+
+func GetPermissionVarietyItems(productId int, classifyName string) (items []*PermissionVarietyItem, err error) {
+	o := orm.NewOrmUsingDB("weekly")
+	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND classify_name=? GROUP BY permission_name ORDER BY sort ASC `
+	_, err = o.Raw(sql, productId, classifyName).QueryRows(&items)
+	return
+}
+
+// GetChartPermissionListById 根据权限id获取产品权限详情
+func GetChartPermissionListById(chartPermissionId int) (item *ChartPermission, err error) {
+	o := orm.NewOrmUsingDB("weekly")
+	sql := `SELECT * FROM chart_permission WHERE chart_permission_id =? `
+	err = o.Raw(sql, chartPermissionId).QueryRow(&item)
+	return
+}
+
+func GetParentIdFromGroup(gid int) (items *int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT parent_id FROM sys_group WHERE group_id=? `
+	err = o.Raw(sql, gid).QueryRow(&items)
+	return
+}
+
+func GetGroupNamesById(gid int) (items *string, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT group_name FROM sys_group WHERE group_id=? `
+	err = o.Raw(sql, gid).QueryRow(&items)
+	return
+}

+ 0 - 321
models/data_manage/edb_data_gl.go

@@ -1,333 +1,12 @@
 package data_manage
 
 import (
-	"eta/eta_mobile/utils"
-	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"strconv"
-	"strings"
-	"time"
 )
 
-func AddEdbDataGlBySql(sqlStr string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sqlStr).Exec()
-	return
-}
-
-func GetEdbDataGlByEdbCode(edbCode string) (items []*EdbInfoSearchData, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_data_gl WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
-	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
-	return
-}
-
 func GetEdbDataGlMaxOrMinDate(edbCode string) (min_date, max_date string, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_gl WHERE edb_code=? `
 	err = o.Raw(sql, edbCode).QueryRow(&min_date, &max_date)
 	return
 }
-
-type GlData struct {
-	InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
-	DataTime   string `orm:"column(DATA_DATE)" description:"值"`
-}
-
-func GetGlDataByTradeCode(condition string, pars []interface{}) (item []*GlData, err error) {
-	condition += " AND IS_DELETE=0 "
-	sql := ` SELECT * FROM mb_index_main_data WHERE 1=1 `
-	o := orm.NewOrmUsingDB("gl")
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY PUBLISH_TIME DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
-	return
-}
-
-func GetEdbDataGlByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_data_gl WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
-	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
-	return
-}
-
-func GetEdbDataByGl(edbCode, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
-
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND INDEX_CODE=? "
-		pars = append(pars, edbCode)
-	}
-
-	glDataList, err := GetGlDataByTradeCode(condition, pars)
-	if err != nil {
-		return
-	}
-	searchItem = new(EdbInfoSearch)
-	searchItem.EdbCode = edbCode
-	dataLen := len(glDataList)
-
-	existMap := make(map[string]string)
-	if dataLen > 0 {
-		var isAdd bool
-		addSql := ` INSERT INTO edb_data_gl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-		dataList := make([]*EdbInfoSearchData, 0)
-		for i := 0; i < dataLen; i++ {
-			item := glDataList[i]
-			eDate := item.DataTime
-			sValue := item.InputValue
-			if sValue != "" {
-				if _, ok := existMap[eDate]; !ok {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return nil, err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql("0", edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			}
-			existMap[eDate] = eDate
-		}
-		fmt.Println("isAdd:", isAdd)
-		if isAdd {
-			//addSql = strings.TrimRight(addSql, ",")
-			//fmt.Println("addSql:exec start")
-			//_, err = o.Raw(addSql).Exec()
-			//if err != nil {
-			//	utils.FileLogData.Info("GetEdbDataByGl Err:%s", err.Error())
-			//	return
-			//}
-			//fmt.Println("addSql:exec end")
-			addSql = strings.TrimRight(addSql, ",")
-			utils.FileLog.Info(addSql)
-			err = AddEdbDataGlBySql(addSql)
-			if err != nil {
-				utils.FileLogData.Info("AddEdbDataGlBySql Err:%s", err.Error())
-				return
-			}
-		}
-		dataList, err := GetEdbDataGlByCode(edbCode)
-		if err != nil {
-			utils.FileLogData.Info("GetEdbDataGlByCode Err:%s", err.Error())
-			return searchItem, err
-		}
-		minDate, maxDate, err := GetEdbDataGlMaxOrMinDate(edbCode)
-		if err != nil {
-			return searchItem, err
-		}
-		searchItem.DataList = dataList
-		searchItem.StartDate = minDate
-		searchItem.EndDate = maxDate
-	}
-	if searchItem.DataList == nil {
-		searchItem.DataList = make([]*EdbInfoSearchData, 0)
-	}
-	return
-}
-
-func ModifyEdbDataGlStatus(edbInfoId int64, edbCode string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_gl SET edb_info_id=?, status=1,modify_time=NOW() WHERE edb_code=? `
-	_, err = o.Raw(sql, edbInfoId, edbCode).Exec()
-	return
-}
-
-func GetEdbDataGlByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_gl WHERE edb_code=? AND data_time=? `
-	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
-	return
-}
-
-func ModifyEdbDataGl(edbInfoId int64, dataTime, value string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_gl SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
-	return
-}
-
-// 刷新钢联指标数据
-func RefreshEdbDataByGl(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND INDEX_CODE=? "
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND DATA_DATE>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND DATA_DATE<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := GetGlDataByTradeCode(condition, pars)
-
-	addSql := ` INSERT INTO edb_data_gl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		item := v
-		if _, ok := existMap[v.DataTime]; !ok {
-			count, err := GetEdbDataGlByCodeAndDate(edbCode, v.DataTime)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				return err
-			}
-			if count <= 0 {
-				eDate := item.DataTime
-				sValue := item.InputValue
-				if sValue != "" {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			} else {
-				err = ModifyEdbDataGl(int64(edbInfoId), v.DataTime, v.InputValue)
-				if err != nil {
-					return err
-				}
-			}
-		}
-		existMap[v.DataTime] = v.InputValue
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-// 全部刷新隆众数据
-func RefreshAllEdbDataByGl(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND INDEX_CODE=? "
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND DATA_DATE>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND DATA_DATE<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := GetGlDataByTradeCode(condition, pars)
-
-	//获取指标所有数据
-	dataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
-	if err != nil {
-		return err
-	}
-	dataMap := make(map[string]string)
-	for _, v := range dataList {
-		dataMap[v.DataTime] = v.Value
-	}
-
-	addSql := ` INSERT INTO edb_data_gl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		item := v
-		if _, ok := existMap[v.DataTime]; !ok {
-			eDate := item.DataTime
-			sValue := item.InputValue
-			if sValue != "" {
-				dataTime, err := time.Parse(utils.FormatDate, eDate)
-				if err != nil {
-					return err
-				}
-				timestamp := dataTime.UnixNano() / 1e6
-				timeStr := fmt.Sprintf("%d", timestamp)
-				saveValue := sValue
-
-				if existVal, ok := dataMap[eDate]; !ok {
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
-					isAdd = true
-				} else {
-					if existVal != saveValue {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						_, err = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
-						if err != nil {
-							return err
-						}
-					}
-				}
-			}
-		}
-		existMap[v.DataTime] = v.DataTime
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}

+ 0 - 528
models/data_manage/edb_data_quarter.go

@@ -1,216 +1,14 @@
 package data_manage
 
 import (
-	"encoding/json"
 	"eta/eta_mobile/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
-	"sort"
 	"strconv"
-	"strings"
 	"time"
 
 	"github.com/nosixtools/solarlunar"
 )
 
-func GetEdbDataQuarterCount(edbInfoId int) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	hsql := `SELECT COUNT(1) AS count FROM edb_data_quarter WHERE edb_info_id=? `
-	err = o.Raw(hsql, edbInfoId).QueryRow(&count)
-	return
-}
-
-// 指标季度数据计算(公历转农历)
-func AddCalculateQuarterV2(edbInfoId, source int, edbCode string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			fmt.Println("Err:", err)
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	fmt.Println(edbInfoIdStr)
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, edbInfoId)
-	dataList, err := GetEdbDataListAll(condition, pars, source, 0)
-	if err != nil {
-		return err
-	}
-
-	var yearArr []int
-	yearMap := make(map[int]int)
-	dataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range dataList {
-		//日其中获取年
-		itemDate, err := time.Parse(utils.FormatDate, v.DataTime)
-		if err != nil {
-			return err
-		}
-		year := itemDate.Year()
-		if _, ok := yearMap[year]; !ok {
-			yearArr = append(yearArr, year)
-			yearMap[year] = year
-		}
-		dataMap[v.DataTime] = v
-	}
-	sort.Sort(sort.Reverse(sort.IntSlice(yearArr)))
-	addSql := ` INSERT INTO edb_data_quarter(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	//yearLen := len(yearArr)
-
-	fmt.Println(yearArr)
-
-	for _, yv := range yearArr {
-		fmt.Println(yv)
-	}
-	fmt.Println("isAdd", isAdd)
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		utils.FileLog.Info(addSql)
-		_, err = to.Raw(addSql).Exec()
-		fmt.Println("err:", err)
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-// 指标季度数据计算(公历转农历)
-func AddCalculateQuarterV3(edbInfoId, source int, edbCode string, list []*EdbDataList) (err error) {
-	var errMsg string
-	defer func() {
-		if errMsg != "" {
-			fmt.Println("errMsg:", errMsg)
-		}
-	}()
-	lunarDate := "2017-01-01" //农历
-	fmt.Println(solarlunar.LunarToSolar(lunarDate, false))
-
-	dataList, err := GetHzTestEdbdata()
-	var yearArr []int
-	yearMap := make(map[int]int)
-	var cureentDate time.Time
-	for k, v := range dataList {
-		if k == 0 {
-			cureentDate = v.Dt
-		}
-		year := v.Dt.Year()
-		if _, ok := yearMap[year]; !ok {
-			yearArr = append(yearArr, year)
-		}
-		yearMap[year] = year
-	}
-	//排序
-	fmt.Println(yearArr)
-	thisYear := cureentDate.Year()
-	thisMonth := int(cureentDate.Month())
-
-	sort.Ints(yearArr)
-	fmt.Println("thisYear:", thisYear)
-
-	result := new(HzTestEdbdataResult)
-	for ky, vy := range yearArr {
-		if thisMonth < 11 {
-			currentYearCjnl := strconv.Itoa(thisYear) + "-01-01"               //当前年份春节农历
-			currentYearCjgl := solarlunar.LunarToSolar(currentYearCjnl, false) //当前年份春节公历
-			currentYearCjglDate, err := time.Parse(utils.FormatDate, currentYearCjgl)
-			if err != nil {
-				errMsg = "生成当前春节失败,Err:" + err.Error()
-				return err
-			}
-
-			fmt.Println(ky, vy)
-			preYear := vy
-			preYearCjnl := strconv.Itoa(preYear) + "-01-01"            //之前年份春节农历
-			preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历
-			preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl)
-			if err != nil {
-				errMsg = "生成历史年份春节失败,Err:" + err.Error()
-				return err
-			}
-			day := currentYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24)
-			fmt.Println("day:", day)
-			items := new(HzTestEdbdataItems)
-			dataLen := len(dataList)
-			for i := dataLen - 1; i >= 0; i-- {
-				v := dataList[i]
-				newDate := v.Dt.AddDate(0, 0, int(day))
-				selectDateStr := strconv.Itoa(thisYear) + "-11" + "-30"
-				selectDate, _ := time.Parse(utils.FormatDate, selectDateStr)
-
-				if newDate.Before(selectDate) {
-					item := new(HzTestEdbdata)
-					item.TtradeCode = v.TtradeCode
-					item.Dt = newDate
-					item.Close = v.Close
-					timestamp := item.Dt.UnixNano() / 1e6
-					item.DataTimestamp = timestamp
-					items.Items = append(items.Items, item)
-				}
-			}
-			result.List = append(result.List, items)
-		} else {
-			fmt.Println(ky, vy)
-			nextYear := thisYear + 1
-			nextYearCjnl := strconv.Itoa(nextYear) + "-01-01"            //当前年份春节农历
-			nextYearCjgl := solarlunar.LunarToSolar(nextYearCjnl, false) //当前年份春节公历
-
-			nextYearCjglDate, err := time.Parse(utils.FormatDate, nextYearCjgl)
-			if err != nil {
-				errMsg = "生成当前春节失败,Err:" + err.Error()
-				return err
-			}
-
-			preYear := vy
-			preYearCjnl := strconv.Itoa(preYear) + "-01-01"            //之前年份春节农历
-			preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历
-			preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl)
-			if err != nil {
-				errMsg = "生成历史年份春节失败,Err:" + err.Error()
-				return err
-			}
-			day := nextYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24)
-
-			fmt.Println("day:", day)
-			items := new(HzTestEdbdataItems)
-			dataLen := len(dataList)
-			for i := dataLen - 1; i >= 0; i-- {
-				v := dataList[i]
-				newDate := v.Dt.AddDate(0, 0, int(day))
-				selectDateStr := strconv.Itoa(nextYear) + "-05" + "-31"
-				selectDate, _ := time.Parse(utils.FormatDate, selectDateStr)
-
-				if newDate.Before(selectDate) {
-					item := new(HzTestEdbdata)
-					item.TtradeCode = v.TtradeCode
-					item.Dt = newDate
-					item.Close = v.Close
-					timestamp := item.Dt.UnixNano() / 1e6
-					item.DataTimestamp = timestamp
-					items.Items = append(items.Items, item)
-				}
-			}
-			result.List = append(result.List, items)
-		}
-
-	}
-	resultJson, err := json.Marshal(result)
-	utils.FileLog.Info(string(resultJson))
-	return
-}
-
 // 指标季度数据计算(公历转农历)
 func AddCalculateQuarterV4(dataList []*EdbDataList) (result *EdbDataResult, err error) {
 	var errMsg string
@@ -387,203 +185,6 @@ func AddCalculateQuarterV4(dataList []*EdbDataList) (result *EdbDataResult, err
 	return
 }
 
-// AddCalculateQuarterV4ByUniqueCode 指标季度数据计算(公历转农历)
-func AddCalculateQuarterV4ByUniqueCode(dataList []*EdbDataListByUniqueCode) (result *EdbDataResult, err error) {
-	var errMsg string
-	defer func() {
-		if errMsg != "" {
-			fmt.Println("errMsg:", errMsg)
-		}
-	}()
-
-	endDate := dataList[len(dataList)-1].DataTime
-	endDateForm, err := time.Parse(utils.FormatDate, endDate)
-	if err != nil {
-		return result, err
-	}
-	thisMonth := int(endDateForm.Month())
-
-	result = new(EdbDataResult)
-	var yearArr []int
-	yearMap := make(map[int]int)
-	var cureentDate time.Time
-	if thisMonth < 11 {
-		for k, v := range dataList {
-			dateTime, err := time.Parse(utils.FormatDate, v.DataTime)
-			if err != nil {
-				errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime
-				return result, err
-			}
-			if k == len(dataList)-1 {
-				cureentDate = dateTime
-			}
-			year := dateTime.Year()
-			if _, ok := yearMap[year]; !ok {
-				yearArr = append(yearArr, year)
-			}
-			yearMap[year] = year
-		}
-	} else {
-		for k, v := range dataList {
-			dateTime, err := time.Parse(utils.FormatDate, v.DataTime)
-			if err != nil {
-				errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime
-				return result, err
-			}
-			if k == len(dataList)-1 {
-				cureentDate = dateTime
-			}
-			year := dateTime.Year() + 1
-			if _, ok := yearMap[year]; !ok {
-				yearArr = append(yearArr, year)
-			}
-			yearMap[year] = year
-		}
-	}
-	//排序
-	fmt.Println("yearArr:", yearArr)
-	thisYear := cureentDate.Year()
-	//thisMonth := int(cureentDate.Month())
-
-	fmt.Println("thisMonth:", thisMonth)
-	for ky, vy := range yearArr {
-		fmt.Println("line 432:", ky, vy, thisYear, thisMonth)
-		if thisMonth < 11 {
-			currentYearCjnl := strconv.Itoa(thisYear) + "-01-01"               //当前年份春节农历
-			currentYearCjgl := solarlunar.LunarToSolar(currentYearCjnl, false) //当前年份春节公历
-			currentYearCjglDate, err := time.Parse(utils.FormatDate, currentYearCjgl)
-			if err != nil {
-				errMsg = "生成当前春节失败,Err:" + err.Error()
-				return result, err
-			}
-
-			preYear := vy
-			preYearCjnl := strconv.Itoa(preYear) + "-01-01"            //之前年份春节农历
-			preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历
-			preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl)
-			if err != nil {
-				errMsg = "生成历史年份春节失败,Err:" + err.Error()
-				return result, err
-			}
-			day := currentYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24)
-
-			items := new(EdbDataItems)
-			items.Year = preYear
-			for _, v := range dataList {
-				dateTime, err := time.Parse(utils.FormatDate, v.DataTime)
-				if err != nil {
-					errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime
-					return result, err
-				}
-				newDate := dateTime.AddDate(0, 0, int(day))
-				selectDateStr := strconv.Itoa(thisYear) + "-11" + "-30"
-				selectDate, _ := time.Parse(utils.FormatDate, selectDateStr)
-				if newDate.Before(selectDate) || newDate == selectDate {
-					timestamp := newDate.UnixNano() / 1e6
-					item := new(EdbDataList)
-					item.DataTime = newDate.Format(utils.FormatDate)
-					item.EdbInfoId = v.EdbInfoId
-					item.Value = v.Value
-					item.EdbDataId = v.EdbDataId
-					item.DataTimestamp = timestamp
-					items.Items = append(items.Items, item)
-				}
-			}
-			result.List = append(result.List, items)
-		} else {
-			nextYear := thisYear + 1
-			nextYearCjnl := strconv.Itoa(nextYear) + "-01-01"            //当前年份春节农历
-			nextYearCjgl := solarlunar.LunarToSolar(nextYearCjnl, false) //当前年份春节公历
-
-			nextYearCjglDate, err := time.Parse(utils.FormatDate, nextYearCjgl)
-			if err != nil {
-				errMsg = "生成当前春节失败,Err:" + err.Error()
-				return result, err
-			}
-			preYear := vy
-			preYearCjnl := strconv.Itoa(preYear) + "-01-01"            //之前年份春节农历
-			preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历
-			preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl)
-			if err != nil {
-				errMsg = "生成历史年份春节失败,Err:" + err.Error()
-				return result, err
-			}
-			day := nextYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24)
-
-			fmt.Println("day:", day, nextYearCjglDate, preYearCjglDate)
-
-			items := new(EdbDataItems)
-			items.Year = preYear - 1
-			fmt.Println("preYear:", preYear, "ky:", ky, "yearArrLen:", len(yearArr))
-			if ky+1 < len(yearArr) {
-				for _, v := range dataList {
-					dateTime, err := time.Parse(utils.FormatDate, v.DataTime)
-					if err != nil {
-						errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime
-						return result, err
-					}
-					newDate := dateTime.AddDate(0, 0, int(day))
-					selectDateStr := strconv.Itoa(nextYear) + "-05" + "-31"
-					selectDate, _ := time.Parse(utils.FormatDate, selectDateStr)
-
-					if newDate.Before(selectDate) || newDate == selectDate {
-						timestamp := newDate.UnixNano() / 1e6
-						item := new(EdbDataList)
-						item.DataTime = newDate.Format(utils.FormatDate)
-						item.EdbInfoId = v.EdbInfoId
-						item.Value = v.Value
-						item.EdbDataId = v.EdbDataId
-						item.DataTimestamp = timestamp
-						items.Items = append(items.Items, item)
-					}
-				}
-				result.List = append(result.List, items)
-			} else {
-				for _, v := range dataList {
-					dateTime, err := time.Parse(utils.FormatDate, v.DataTime)
-					if err != nil {
-						errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime
-						return result, err
-					}
-					timestamp := dateTime.UnixNano() / 1e6
-					item := new(EdbDataList)
-					item.DataTime = dateTime.Format(utils.FormatDate)
-					item.EdbInfoId = v.EdbInfoId
-					item.Value = v.Value
-					item.EdbDataId = v.EdbDataId
-					item.DataTimestamp = timestamp
-					items.Items = append(items.Items, item)
-				}
-				result.List = append(result.List, items)
-			}
-		}
-	}
-	return
-}
-
-type HzTestEdbdataResult struct {
-	List []*HzTestEdbdataItems
-}
-
-type HzTestEdbdataItems struct {
-	Items []*HzTestEdbdata
-}
-
-type HzTestEdbdata struct {
-	TtradeCode    string    `orm:"column(TRADE_CODE)"`
-	Dt            time.Time `orm:"column(DT)"`
-	Close         float64   `orm:"column(CLOSE)"`
-	ModifyTime    time.Time `orm:"column(modify_time)"`
-	DataTimestamp int64
-}
-
-func GetHzTestEdbdata() (list []*HzTestEdbdata, err error) {
-	o := orm.NewOrm()
-	sql := ` SELECT * FROM hz_test_edbdata WHERE TRADE_CODE=? ORDER BY DT DESC `
-	_, err = o.Raw(sql, "ST_0000577845").QueryRows(&list)
-	return
-}
-
 type EdbDataItems struct {
 	Items                []*EdbDataList
 	Year                 int
@@ -594,132 +195,3 @@ type EdbDataItems struct {
 type EdbDataResult struct {
 	List []*EdbDataItems
 }
-
-func AddCalculateQuarterV5(dataList []*EdbDataList) (result *EdbDataResult, err error) {
-	var errMsg string
-	defer func() {
-		if errMsg != "" {
-			fmt.Println("errMsg:", errMsg)
-		}
-	}()
-	result = new(EdbDataResult)
-	thisYear := time.Now().Year()
-
-	endDate := dataList[len(dataList)-1].DataTime
-	endDateForm, err := time.Parse(utils.FormatDate, endDate)
-	if err != nil {
-		return result, err
-	}
-	thisMonth := int(endDateForm.Month())
-
-	fmt.Println(thisMonth)
-	for i := 4; i > 0; i-- {
-		if thisMonth < 11 {
-			nextYear := thisYear
-			nextYearCjnl := strconv.Itoa(nextYear) + "-01-01"            //当前年份春节农历
-			nextYearCjgl := solarlunar.LunarToSolar(nextYearCjnl, false) //当前年份春节公历
-			nextYearCjglDate, err := time.Parse(utils.FormatDate, nextYearCjgl)
-			if err != nil {
-				errMsg = "生成当前春节失败,Err:" + err.Error()
-				return result, err
-			}
-			preYearCjnl := strconv.Itoa(nextYear-i) + "-01-01"         //之前年份春节农历
-			preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历
-			preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl)
-			if err != nil {
-				errMsg = "生成历史年份春节失败,Err:" + err.Error()
-				return result, err
-			}
-			day := nextYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24)
-			items := new(EdbDataItems)
-			for _, v := range dataList {
-				dataDate := v.DataTime
-				dataDateForm, err := time.Parse(utils.FormatDate, dataDate)
-				if err != nil {
-					return result, err
-				}
-				newDate := dataDateForm.AddDate(0, 0, int(day))
-				selectDateStr := strconv.Itoa(nextYear) + "-11" + "-30"
-				selectDate, _ := time.Parse(utils.FormatDate, selectDateStr)
-				if newDate.Before(selectDate) {
-					timestamp := newDate.UnixNano() / 1e6
-					item := new(EdbDataList)
-					item.DataTime = newDate.Format(utils.FormatDate)
-					item.EdbInfoId = v.EdbInfoId
-					item.Value = v.Value
-					item.EdbDataId = v.EdbDataId
-					item.DataTimestamp = timestamp
-					items.Items = append(items.Items, item)
-				}
-			}
-			fmt.Println(nextYear, "年春节阳历", nextYearCjgl)
-			fmt.Println(i, "年前春节", preYearCjnl)
-			fmt.Println(i, "年前春节阳历", preYearCjgl)
-			fmt.Println("与", nextYear, "年春节相差天数", day, "____________")
-			result.List = append(result.List, items)
-		} else {
-			nextYear := thisYear + 1
-			nextYearCjnl := strconv.Itoa(nextYear) + "-01-01"            //当前年份春节农历
-			nextYearCjgl := solarlunar.LunarToSolar(nextYearCjnl, false) //当前年份春节公历
-			nextYearCjglDate, err := time.Parse(utils.FormatDate, nextYearCjgl)
-			if err != nil {
-				errMsg = "生成当前春节失败,Err:" + err.Error()
-				return result, err
-			}
-			preYearCjnl := strconv.Itoa(nextYear-i) + "-01-01"         //之前年份春节农历
-			preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历
-			preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl)
-			if err != nil {
-				errMsg = "生成历史年份春节失败,Err:" + err.Error()
-				return result, err
-			}
-			day := nextYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24)
-			items := new(EdbDataItems)
-			for _, v := range dataList {
-				dataDate := v.DataTime
-				dataDateForm, err := time.Parse(utils.FormatDate, dataDate)
-				if err != nil {
-					return result, err
-				}
-
-				newDate := dataDateForm.AddDate(0, 0, int(day))
-				selectDateStr := strconv.Itoa(nextYear) + "-05" + "-31"
-				selectDate, _ := time.Parse(utils.FormatDate, selectDateStr)
-				if newDate.Before(selectDate) {
-					timestamp := newDate.UnixNano() / 1e6
-					item := new(EdbDataList)
-					item.DataTime = newDate.Format(utils.FormatDate)
-					item.EdbInfoId = v.EdbInfoId
-					item.Value = v.Value
-					item.EdbDataId = v.EdbDataId
-					item.DataTimestamp = timestamp
-					items.Items = append(items.Items, item)
-				}
-			}
-			fmt.Println(nextYear, "年春节阳历", nextYearCjgl)
-			fmt.Println(i, "年前春节", preYearCjnl)
-			fmt.Println(i, "年前春节阳历", preYearCjgl)
-			fmt.Println("与", nextYear, "年春节相差天数", day, "____________")
-			result.List = append(result.List, items)
-		}
-	}
-	//合并第五组数据
-	items := new(EdbDataItems)
-	for _, v := range dataList {
-		dataDate := v.DataTime
-		dataDateForm, err := time.Parse(utils.FormatDate, dataDate)
-		if err != nil {
-			return result, err
-		}
-		timestamp := dataDateForm.UnixNano() / 1e6
-		item := new(EdbDataList)
-		item.DataTime = v.DataTime
-		item.EdbInfoId = v.EdbInfoId
-		item.Value = v.Value
-		item.EdbDataId = v.EdbDataId
-		item.DataTimestamp = timestamp
-		items.Items = append(items.Items, item)
-	}
-	result.List = append(result.List, items)
-	return
-}

+ 0 - 135
models/data_manage/gl_data.go

@@ -2,37 +2,8 @@ package data_manage
 
 import (
 	"github.com/beego/beego/v2/client/orm"
-	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
-type GlClassify struct {
-	BreedShortName string `orm:"column(BREED_SHORT_NAME)" description:"分类名称"`
-}
-
-func GetGlSurveyClassify() (items []*GlClassify, err error) {
-	sql := ` SELECT CASE WHEN BREED_SHORT_NAME IS NULL THEN '无' ELSE BREED_SHORT_NAME END BREED_SHORT_NAME  FROM mb_index_main_info GROUP BY BREED_SHORT_NAME ORDER BY BREED_SHORT_NAME ASC `
-	o := orm.NewOrmUsingDB("gl")
-	o.Raw(sql).QueryRows(&items)
-	return
-}
-
-type GlFrequency struct {
-	Frequency string `description:"频度:1-日度 2-周度 3-月度 4-季度 5-年度 99-无固定频率"`
-}
-
-func GetGlFrequencyByClassifyId(breedShortName string) (items []*GlFrequency, err error) {
-	o := orm.NewOrmUsingDB("gl")
-	if breedShortName == "无" {
-		sql := ` SELECT FREQUENCY_NAME AS frequency FROM mb_index_main_info WHERE BREED_SHORT_NAME IS NULL GROUP BY FREQUENCY_CODE ORDER BY FREQUENCY_CODE ASC `
-		_, err = o.Raw(sql).QueryRows(&items)
-		return
-	} else {
-		sql := ` SELECT FREQUENCY_NAME AS frequency FROM mb_index_main_info WHERE BREED_SHORT_NAME=? GROUP BY FREQUENCY_CODE ORDER BY FREQUENCY_CODE ASC `
-		_, err = o.Raw(sql, breedShortName).QueryRows(&items)
-		return
-	}
-}
-
 type GlIndex struct {
 	Id            int    `orm:"column(ID)"`
 	IndexCode     string `orm:"column(INDEX_CODE)"`
@@ -42,115 +13,9 @@ type GlIndex struct {
 	UpdateTime    string `orm:"column(UPDATE_TIME)"`
 }
 
-func GetGlIndex(breedShortName, frequency string) (items []*GlIndex, err error) {
-	o := orm.NewOrmUsingDB("gl")
-	if breedShortName == "无" {
-		sql := ` SELECT * FROM mb_index_main_info WHERE BREED_SHORT_NAME IS NULL AND FREQUENCY_NAME=? ORDER BY INDEX_CODE ASC `
-		_, err = o.Raw(sql, frequency).QueryRows(&items)
-		return
-	} else {
-		sql := ` SELECT * FROM mb_index_main_info WHERE BREED_SHORT_NAME=? AND FREQUENCY_NAME=? ORDER BY INDEX_CODE ASC `
-		_, err = o.Raw(sql, breedShortName, frequency).QueryRows(&items)
-		return
-	}
-}
-
-func GetGlFrequency(productName string) (items []*string, err error) {
-	sql := `SELECT DISTINCT FREQUENCY_NAME FROM mb_index_main_info WHERE BREED_SHORT_NAME=? ORDER BY FIELD(FREQUENCY_NAME,'日度','周度','旬度','月度','季度','半年','年度') `
-	o := orm.NewOrmUsingDB("gl")
-	_, err = o.Raw(sql, productName).QueryRows(&items)
-	return
-}
-
-type GlIndexList struct {
-	Id            int                `orm:"column(ID)"`
-	IndexCode     string             `orm:"column(INDEX_CODE)"`
-	IndexName     string             `orm:"column(INDEX_NAME)"`
-	UnitName      string             `orm:"column(UNIT_NAME)"`
-	FrequencyName string             `orm:"column(FREQUENCY_NAME)"`
-	UpdateTime    string             `orm:"column(UPDATE_TIME)"`
-	Paging        *paging.PagingItem `description:"分页数据"`
-	DataList      []*GlIndexData
-}
-
-type GlIndexData struct {
-	InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
-	DataTime   string `orm:"column(DATA_DATE)" description:"值"`
-}
-
-func GetGlIndexData(indexCode string, startSize, pageSize int) (items []*GlIndexData, err error) {
-	//sql := ` SELECT *  FROM mb_index_main_data WHERE INDEX_CODE=? ORDER BY DATA_DATE DESC,PUBLISH_TIME DESC LIMIT ?,?`
-	sql := ` SELECT * FROM (
-	SELECT DISTINCT a.INDEX_CODE,a.DATA_VALUE,a.DATA_DATE FROM mb_index_main_data AS a WHERE INDEX_CODE=? AND IS_DELETE=0
-	ORDER BY DATA_DATE DESC,PUBLISH_TIME DESC 
-	)AS t
-	GROUP BY t.DATA_DATE
-	ORDER BY t.DATA_DATE DESC LIMIT ?,? `
-	o := orm.NewOrmUsingDB("gl")
-	_, err = o.Raw(sql, indexCode, startSize, pageSize).QueryRows(&items)
-	return
-}
-
 func GetGlIndexByCode(indexCode string) (items *GlIndex, err error) {
 	sql := ` SELECT *  FROM mb_index_main_info WHERE INDEX_CODE=? `
 	o := orm.NewOrmUsingDB("gl")
 	err = o.Raw(sql, indexCode).QueryRow(&items)
 	return
 }
-
-func GetGlIndexDataCount(indexCode string) (count int, err error) {
-	o := orm.NewOrmUsingDB("gl")
-	sql := `SELECT COUNT(1) AS count FROM (
-			SELECT * FROM (
-				SELECT DISTINCT a.INDEX_CODE,a.DATA_VALUE,a.DATA_DATE FROM mb_index_main_data AS a WHERE INDEX_CODE=? AND IS_DELETE=0
-				ORDER BY DATA_DATE DESC,PUBLISH_TIME DESC 
-				)AS t
-				GROUP BY t.DATA_DATE
-				ORDER BY t.DATA_DATE DESC
-			)AS n `
-	err = o.Raw(sql, indexCode).QueryRow(&count)
-	return
-}
-
-type GlSearchIndex struct {
-	Id             int    `orm:"column(ID)"`
-	IndexCode      string `orm:"column(INDEX_CODE)"`
-	IndexName      string `orm:"column(INDEX_NAME)"`
-	UnitName       string `orm:"column(UNIT_NAME)"`
-	FrequencyName  string `orm:"column(FREQUENCY_NAME)"`
-	UpdateTime     string `orm:"column(UPDATE_TIME)"`
-	BreedShortName string `orm:"column(BREED_SHORT_NAME)"`
-}
-
-// GetGlItemList 模糊查询隆众数据库指标列表
-func GetGlItemList(keyword string) (items []*GlSearchIndex, err error) {
-	o := orm.NewOrmUsingDB("gl")
-	sql := "SELECT * FROM mb_index_main_info WHERE CONCAT(INDEX_NAME,INDEX_CODE) LIKE '%" + keyword + "%'"
-	_, err = o.Raw(sql).QueryRows(&items)
-	return
-
-}
-
-func GetGlDataMaxCount(classifyName string) (count int, err error) {
-	o := orm.NewOrmUsingDB("gl")
-	sql := `SELECT MAX(t.num) AS count FROM (
-				SELECT COUNT(1) AS num  FROM mb_index_main_info AS a
-				INNER JOIN mb_index_main_data AS b ON a.INDEX_CODE=b.INDEX_CODE
-				WHERE a.BREED_SHORT_NAME=?
-				GROUP BY a.INDEX_CODE
-			)AS t `
-	err = o.Raw(sql, classifyName).QueryRow(&count)
-	return
-}
-
-func GetGlDataByCode(indexCode string) (items []*GlIndexData, err error) {
-	o := orm.NewOrmUsingDB("gl")
-	sql := `SELECT
-	* 
-FROM
-	( SELECT * FROM mb_index_main_data WHERE INDEX_CODE = ? GROUP BY UPDATE_TIME DESC, DATA_DATE DESC ) a 
-GROUP BY
-	a.DATA_DATE DESC `
-	_, err = o.Raw(sql, indexCode).QueryRows(&items)
-	return
-}

+ 32 - 6
models/db.go

@@ -43,12 +43,22 @@ func init() {
 	data_db, _ := orm.GetDB("data")
 	data_db.SetConnMaxLifetime(10 * time.Minute)
 
-	_ = orm.RegisterDataBase("eta", "mysql", utils.MYSQL_URL_ETA)
-	orm.SetMaxIdleConns("eta", 50)
-	orm.SetMaxOpenConns("eta", 100)
+	_ = orm.RegisterDataBase("gl", "mysql", utils.MYSQL_URL_GL)
+	orm.SetMaxIdleConns("gl", 50)
+	orm.SetMaxOpenConns("gl", 100)
 
-	etaDb, _ := orm.GetDB("eta")
-	etaDb.SetConnMaxLifetime(10 * time.Minute)
+	gl, _ := orm.GetDB("gl")
+	gl.SetConnMaxLifetime(10 * time.Minute)
+
+	// 用户主库
+	if utils.MYSQL_WEEKLY_URL != `` && (utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox) {
+		_ = orm.RegisterDataBase("weekly", "mysql", utils.MYSQL_WEEKLY_URL)
+		orm.SetMaxIdleConns("weekly", 50)
+		orm.SetMaxOpenConns("weekly", 100)
+
+		weeklyDb, _ := orm.GetDB("weekly")
+		weeklyDb.SetConnMaxLifetime(10 * time.Minute)
+	}
 
 	orm.Debug = true
 	orm.DebugLog = orm.NewLog(utils.Binlog)
@@ -92,6 +102,9 @@ func init() {
 
 	// 文档对比
 	initSaCompare()
+
+	// 商家配置
+	initBusinessConf()
 }
 
 // initSystem 系统表 数据表
@@ -203,7 +216,12 @@ func initEnglishReport() {
 		new(EnglishReportEmail),
 		new(EnglishReportEmailLog),
 		new(EnglishClassify),
-		new(EnglishVideo), // 英文研报线上路演
+		new(EnglishCompany),           // 英文客户
+		new(EnglishCompanyTodo),       // 英文客户TODO任务
+		new(EnglishVideo),             // 英文研报线上路演
+		new(EnPermission),             // 英文品种权限表
+		new(EnCompanyPermission),      // 英文客户品种权限关联表
+		new(EnClassifyPermission),     // 英文分类品种权限关联表
 	)
 }
 
@@ -220,3 +238,11 @@ func initSaCompare() {
 		new(saModel.SaCompare), //文档对比
 	)
 }
+
+// initBusinessConf 商家配置
+func initBusinessConf() {
+	orm.RegisterModel(
+		new(BusinessConf),                // 商家配置表
+		new(BusinessConfOperationRecord), // 商家配置操作记录表
+	)
+}

+ 231 - 0
models/english_company.go

@@ -0,0 +1,231 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+const (
+	EnglishCompanyDisabled = iota
+	EnglishCompanyEnabled
+	EnglishCompanyHalfEnabled
+)
+
+// EnglishCompany 英文客户
+type EnglishCompany struct {
+	CompanyId   int       `orm:"column(company_id);pk" description:"英文客户ID"`
+	CompanyName string    `description:"客户名称"`
+	CountryCode string    `description:"国家Code"`
+	Country     string    `description:"国家"`
+	SellerId    int       `description:"销售ID"`
+	SellerName  string    `description:"销售姓名"`
+	ViewTotal   int       `description:"累计点击量/阅读量"`
+	IsDeleted   int       `description:"删除状态:0-正常;1-已删除"`
+	CreateTime  time.Time `description:"创建时间"`
+	ModifyTime  time.Time `description:"更新时间"`
+	Enabled     int       `description:"0-禁用; 1-启用; 2-部分禁用"`
+	Status      int       `description:"1:正式,2:临时,3:终止"`
+}
+
+type EnglishCompanyListItem struct {
+	EnglishCompany
+	TodoStatusStr string
+	TodoEndTime   time.Time
+	TodoSellerId  int
+}
+
+func (item *EnglishCompany) TableName() string {
+	return "english_company"
+}
+
+func (item *EnglishCompany) Create() (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	id, err := o.Insert(item)
+	if err != nil {
+		return
+	}
+	item.CompanyId = int(id)
+	return
+}
+
+// EnglishCompanySaveReq 英文客户-保存请求体
+type EnglishCompanySaveReq struct {
+	CompanyId     int    `description:"客户ID"`
+	CompanyName   string `description:"客户名称"`
+	CountryCode   string `description:"国家代码"`
+	Country       string `description:"国家"`
+	SellerId      int    `description:"销售ID"`
+	EnPermissions []int  `description:"英文权限IDs"`
+}
+
+func (item *EnglishCompany) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	_, err = o.Update(item, cols...)
+	return
+}
+
+// GetEnglishCompanyById 主键获取客户
+func GetEnglishCompanyById(id int) (item *EnglishCompany, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM english_company WHERE is_deleted = 0 AND company_id = ? LIMIT 1`
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+// GetEnglishCompanyByName 名称获取客户
+func GetEnglishCompanyByName(companyName string) (item *EnglishCompany, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM english_company WHERE is_deleted = 0 AND company_name = ? LIMIT 1`
+	err = o.Raw(sql, companyName).QueryRow(&item)
+	return
+}
+
+// EnglishCompanyDelReq 英文客户-删除请求体
+type EnglishCompanyDelReq struct {
+	CompanyId int `description:"客户ID"`
+}
+
+// DeleteEnglishCompanyAndEmails 删除英文客户及联系人
+func DeleteEnglishCompanyAndEmails(companyId int) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	tx, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+		} else {
+			_ = tx.Commit()
+		}
+	}()
+
+	// 删除客户
+	sql := `UPDATE english_company SET is_deleted = 1,modify_time = NOW() WHERE company_id = ? LIMIT 1`
+	_, err = tx.Raw(sql, companyId).Exec()
+	if err != nil {
+		return
+	}
+
+	// 删除联系人
+	sql = `UPDATE english_report_email SET is_deleted = 1,modify_time = NOW() WHERE company_id = ?`
+	_, err = tx.Raw(sql, companyId).Exec()
+	return
+}
+
+// EnglishCompanyPageListResp 英文客户-分页列表响应体
+type EnglishCompanyPageListResp struct {
+	List   []*EnglishCompanyResp
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+// EnglishCompanyResp 英文客户-列表响应体
+type EnglishCompanyResp struct {
+	CompanyId     int                     `description:"客户ID"`
+	CompanyName   string                  `description:"客户名称"`
+	CountryCode   string                  `description:"国家代码"`
+	Country       string                  `description:"国家"`
+	SellerId      int                     `description:"销售ID"`
+	SellerName    string                  `description:"销售姓名"`
+	ViewTotal     int                     `description:"累计点击量"`
+	CreateTime    string                  `description:"创建时间"`
+	Enabled       int                     `description:"0-禁用; 1-启用; 2-部分禁用"`
+	TodoInfo      *EnglishCompanyListTodo `description:"TODO任务信息"`
+	EnPermissions []int                   `description:"英文权限"`
+}
+
+// EnglishCompanyListTodo 英文客户列表-TODO任务信息
+type EnglishCompanyListTodo struct {
+	Deadline       string `description:"未完成的todo任务的截止日期,截止目前还剩余的天数"`
+	TodoEndTimeStr string `description:"未完成的todo任务的截止日期拼接格式"`
+	//TodoEndTime     time.Time `description:"未完成的todo任务的截止日期"`
+	TodoStatus      bool   `description:"是否存在进行中任务"`
+	CanConfirm      bool   `description:"是否允许完成任务"`
+	HiddenConfirm   bool   `description:"是否隐藏完成任务按钮"`
+	HiddenCreate    bool   `description:"是否隐藏新增/编辑按钮"`
+	TodoButtonColor string `description:"任务按钮颜色: red; green; gray"`
+}
+
+// GetEnglishCompanyPageList 获取客户列表-分页
+func GetEnglishCompanyPageList(condition string, pars []interface{}, order string, startSize, pageSize int) (total int, list []*EnglishCompanyListItem, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT
+	c.*,
+IF
+	( ct.status IS NULL, "无任务", ct.status ) AS todo_status_str,
+	ct.seller_id as todo_seller_id,
+IF
+	( ct.end_time IS NULL or ct.status !="进行中", "9999-01-01", ct.end_time) AS todo_end_time
+FROM
+	english_company AS c
+	LEFT JOIN (
+SELECT
+	b.* 
+FROM
+	(
+SELECT
+	company_id,
+	MAX( create_time ) AS ct 
+FROM
+	english_company_todo 
+WHERE
+	is_delete = 0 
+	AND STATUS != "已作废"
+GROUP BY
+	company_id 
+	) AS a
+	LEFT JOIN english_company_todo AS b ON b.company_id = a.company_id 
+	AND b.create_time = a.ct 
+	) AS ct ON c.company_id = ct.company_id 
+WHERE
+	c.is_deleted = 0 AND c.status = 1`
+	sql += condition
+	if order != "" {
+		sql += order
+	} else {
+		sql += ` ORDER BY c.create_time DESC, c.company_id DESC`
+	}
+	totalSQl := `SELECT COUNT(1) total FROM (` + sql + `) z`
+	if err = o.Raw(totalSQl, pars).QueryRow(&total); err != nil {
+		return
+	}
+	sql += ` LIMIT ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	return
+}
+
+// GetEnglishCompanyViewPageListResp 英文客户-点击量分页列表响应体
+type GetEnglishCompanyViewPageListResp struct {
+	List   []*EnglishCompanyViewResp
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+// EnglishCompanyViewResp 英文客户-点击量响应体
+type EnglishCompanyViewResp struct {
+	EmailId      int    `description:"联系人ID"`
+	UserName     string `description:"联系人姓名"`
+	Email        string `description:"邮箱地址"`
+	ViewTotal    int    `description:"累计点击量"`
+	LastViewTime string `description:"创建时间"`
+}
+
+// GetEnglishCompanyList 获取英文客户列表
+func GetEnglishCompanyList(condition string, pars []interface{}, order string) (list []*EnglishCompany, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM english_company WHERE is_deleted = 0 `
+	sql += condition
+	if order != "" {
+		sql += order
+	} else {
+		sql += ` ORDER BY create_time DESC`
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}
+
+// EnglishCompanyEditEnabledReq 禁启用请求体
+type EnglishCompanyEditEnabledReq struct {
+	CompanyId int `description:"公司ID"`
+	Enabled   int `description:"1:有效,0:禁用"`
+}

+ 258 - 0
models/english_company_todo.go

@@ -0,0 +1,258 @@
+package models
+
+import (
+	"eta/eta_mobile/utils"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+// 英文客户Todo状态枚举值
+const (
+	EnglishCompanyTodoStatusDoing     = "进行中"
+	EnglishCompanyTodoStatusCompleted = "已完成"
+	EnglishCompanyTodoStatusVoided    = "已作废"
+	EnglishCompanyTodoStatusNull      = "无任务"
+)
+
+// EnglishCompanyTodo 英文客户TODO任务
+type EnglishCompanyTodo struct {
+	Id                 int       `orm:"column(id);pk"`
+	CompanyId          int       `description:"客户id"`
+	Content            string    `description:"任务描述"`
+	SellerId           int       `description:"客户所属销售id"`
+	SellerName         string    `description:"客户所属销售名称"`
+	CreateUserId       int       `description:"创建人用户id"`
+	CreateUserName     string    `description:"创建人用户姓名"`
+	ApproveUserId      int       `description:"审批人用户id"`
+	ApproveUserName    string    `description:"审批人用户姓名"`
+	ApprovedSellerId   int       `description:"审批时,客户所属销售id"`
+	ApprovedSellerName string    `description:"审批时,客户所属销售名称"`
+	Status             string    `description:"任务状态: 枚举值:进行中,已完成,已作废"`
+	ModifyTime         time.Time `description:"修改时间"`
+	ApproveTime        time.Time `description:"审核时间"`
+	CreateTime         time.Time `description:"创建时间"`
+	EndTime            time.Time `description:"截止时间"`
+	IsDelete           int       `json:"-" description:"是否已经删除,0:未删除,1:已删除;默认:0"`
+	Remark             string    `description:"审批备注"`
+}
+
+// EnglishCompanyTodoResp 英文客户TODO响应体
+type EnglishCompanyTodoResp struct {
+	Id              int    `orm:"column(id);pk"`
+	CompanyId       int    `description:"客户id"`
+	Content         string `description:"任务描述"`
+	SellerId        int    `description:"客户所属销售id"`
+	SellerName      string `description:"客户所属销售名称"`
+	CreateUserId    int    `description:"创建人用户id"`
+	CreateUserName  string `description:"创建人用户姓名"`
+	ApproveUserId   int    `description:"审批人用户id"`
+	ApproveUserName string `description:"审批人用户姓名"`
+	Status          string `description:"任务状态: 枚举值:进行中,已完成,已作废"`
+	CreateTime      string `description:"创建时间"`
+	EndTime         string `description:"截止时间"`
+	ApproveTime     string `description:"审核时间"`
+	EndTimeStr      string `description:"格式化后的截止时间"`
+	Remark          string `description:"审批备注"`
+}
+
+func (item *EnglishCompanyTodo) Create() (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	id, err := o.Insert(item)
+	if err != nil {
+		return
+	}
+	item.CompanyId = int(id)
+	return
+}
+
+func (item *EnglishCompanyTodo) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	_, err = o.Update(item, cols...)
+	return
+}
+
+// EnglishCompanyTodoAddReq 新增任务请求
+type EnglishCompanyTodoAddReq struct {
+	CompanyId   int    `description:"客户id"`
+	Description string `description:"任务描述"`
+	EndTime     string `description:"截止时间"`
+}
+
+// EnglishCompanyTodoEditReq 编辑任务请求
+type EnglishCompanyTodoEditReq struct {
+	Id          int    `description:"客户任务记录id"`
+	CompanyId   int    `description:"客户id"`
+	Description string `description:"任务描述"`
+	EndTime     string `description:"截止时间"`
+}
+
+// EnglishCompanyTodoApproveReq 审批任务请求
+type EnglishCompanyTodoApproveReq struct {
+	Id     int    `description:"客户任务记录id"`
+	Remark string `description:"审批备注"`
+}
+
+// GetEnglishCompanyTodoById 根据任务ID获取客户任务
+func GetEnglishCompanyTodoById(id int) (item *EnglishCompanyTodo, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM english_company_todo WHERE id = ? LIMIT 1 `
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+// GetCountDoingEnglishCompanyTodo 获取正在进行中的任务数量
+func GetCountDoingEnglishCompanyTodo(companyId int) (total int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT count(1) AS total FROM english_company_todo WHERE status = "进行中" AND company_id = ? AND is_delete = 0 `
+	err = o.Raw(sql, companyId).QueryRow(&total)
+	return
+}
+
+// GetEnglishCompanyTodoPageListResp 英文客户TODO-分页列表
+type GetEnglishCompanyTodoPageListResp struct {
+	List   []*EnglishCompanyTodoResp
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+// GetEnglishCompanyTodoList 获取客户任务列表
+func GetEnglishCompanyTodoList(companyId, startSize, pageSize int, order string) (total int, items []*EnglishCompanyTodo, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT
+				a.*
+			FROM
+				english_company_todo a
+			JOIN english_company b ON a.company_id = b.company_id
+			WHERE
+				a.company_id = ? AND a.status != "已作废" AND a.is_delete = 0 `
+	totalSQl := `SELECT COUNT(1) total FROM (` + sql + `) z`
+	if err = o.Raw(totalSQl, companyId).QueryRow(&total); err != nil {
+		return
+	}
+	if order != `` {
+		sql += order
+	} else {
+		sql += ` ORDER BY a.create_time DESC`
+	}
+	sql += ` LIMIT ?,?`
+	_, err = o.Raw(sql, companyId, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// GetDoingEnglishCompanyTodoList 获取客户的进行中任务列表
+func GetDoingEnglishCompanyTodoList(companyId int) (items []*EnglishCompanyTodo, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT
+				a.*
+			FROM
+				english_company_todo a
+			JOIN english_company b ON a.company_id = b.company_id
+			WHERE
+				a.company_id = ? AND a.status = "进行中" AND a.is_delete = 0
+			ORDER BY
+				a.create_time ASC`
+	_, err = o.Raw(sql, companyId).QueryRows(&items)
+	return
+}
+
+// GetEnglishCompanyLatestTodoByCompanyIds 获取英文客户最新的一条TODO任务
+func GetEnglishCompanyLatestTodoByCompanyIds(companyIds []int) (items []*EnglishCompanyTodo, err error) {
+	itemsLen := len(companyIds)
+	if itemsLen == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT b.* FROM 
+			(
+				SELECT
+					company_id,
+					MAX(create_time) AS ct
+				FROM
+					english_company_todo
+				WHERE
+					is_delete = 0 AND status != "已作废" AND company_id IN (` + utils.GetOrmInReplace(itemsLen) + `)
+				GROUP BY
+					company_id
+			) AS a
+			LEFT JOIN english_company_todo AS b ON b.company_id = a.company_id AND b.create_time = a.ct `
+	_, err = o.Raw(sql, companyIds).QueryRows(&items)
+	return
+}
+
+type EnglishCompanyTodoDoing struct {
+	Id                 int       `description:"待办ID"`
+	CompanyId          int       `description:"客户id"`
+	CompanyName        string    `description:"客户名称"`
+	Content            string    `description:"任务描述"`
+	SellerId           int       `description:"客户所属销售id"`
+	SellerName         string    `description:"客户所属销售名称"`
+	CreateUserId       int       `description:"创建人用户id"`
+	CreateUserName     string    `description:"创建人用户姓名"`
+	ApproveUserId      int       `description:"审批人用户id"`
+	ApproveUserName    string    `description:"审批人用户姓名"`
+	ApprovedSellerId   int       `description:"审批时,客户所属销售id"`
+	ApprovedSellerName string    `description:"审批时,客户所属销售名称"`
+	Status             string    `description:"任务状态: 枚举值:进行中,已完成,已作废"`
+	ModifyTime         time.Time `description:"修改时间"`
+	ApproveTime        time.Time `description:"审核时间"`
+	CreateTime         time.Time `description:"创建时间"`
+	EndTime            time.Time `description:"截止时间"`
+	Remark             string    `description:"审批备注"`
+}
+
+type EnglishCompanyTodoDoingResp struct {
+	Id              int    `description:"待办ID"`
+	CompanyId       int    `description:"客户id"`
+	CompanyName     string `description:"客户名称"`
+	Content         string `description:"任务描述"`
+	SellerId        int    `description:"客户所属销售id"`
+	SellerName      string `description:"客户所属销售名称"`
+	CreateUserId    int    `description:"创建人用户id"`
+	CreateUserName  string `description:"创建人用户姓名"`
+	ApproveUserId   int    `description:"审批人用户id"`
+	ApproveUserName string `description:"审批人用户姓名"`
+	Status          string `description:"任务状态: 枚举值:进行中,已完成,已作废"`
+	CreateTime      string `description:"创建时间"`
+	EndTime         string `description:"截止时间"`
+	ApproveTime     string `description:"审核时间"`
+	Remark          string `description:"审批备注"`
+}
+
+// GetEnglishCompanyTodoDoingPageListResp 英文客户未完成TODO-分页列表
+type GetEnglishCompanyTodoDoingPageListResp struct {
+	List   []*EnglishCompanyTodoDoingResp
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+// GetEnglishCompanyTodoDoingList 获取客户任务未完成列表
+func GetEnglishCompanyTodoDoingList(startSize, pageSize int, order string) (total int, items []*EnglishCompanyTodoDoing, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT
+				a.*,
+				b.company_name
+			FROM
+				english_company_todo a
+			JOIN english_company b ON a.company_id = b.company_id
+			WHERE
+				a.status = "进行中" AND a.is_delete = 0 `
+	totalSQl := `SELECT COUNT(1) total FROM (` + sql + `) z`
+	if err = o.Raw(totalSQl).QueryRow(&total); err != nil {
+		return
+	}
+	if order != `` {
+		sql += order
+	} else {
+		sql += ` ORDER BY a.end_time ASC`
+	}
+	sql += ` LIMIT ?,?`
+	_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// DeleteEnglishCompanyTodoByCompanyId (软)删除英文客户TODO
+func DeleteEnglishCompanyTodoByCompanyId(companyId int) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `UPDATE english_company_todo SET is_delete = 1 WHERE company_id = ?`
+	_, err = o.Raw(sql, companyId).Exec()
+	return
+}

+ 4 - 4
models/permission.go

@@ -13,7 +13,7 @@ type ChartPermissionSearchKeyWordMapping struct {
 }
 
 func GetPermission(classifyNameSecond string) (items []*ChartPermissionSearchKeyWordMapping, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	sql := `SELECT * FROM chart_permission_search_key_word_mapping AS a WHERE a.from='rddp' AND a.key_word=? `
 	_, err = o.Raw(sql, classifyNameSecond).QueryRows(&items)
 	return
@@ -22,14 +22,14 @@ func GetPermission(classifyNameSecond string) (items []*ChartPermissionSearchKey
 func AddChartPermissionChapterMapping(chartPermissionId int, reportId int64) (err error) {
 	sql := `INSERT INTO chart_permission_chapter_mapping (chart_permission_id, report_chapter_type_id,research_type)
            VALUES(?,?,?)`
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	_, err = o.Raw(sql, chartPermissionId, reportId, "rddp").Exec()
 	return
 }
 
 func RemoveChartPermissionChapterMapping(reportId int64) (err error) {
 	sql := ` DELETE FROM chart_permission_chapter_mapping WHERE research_type=? AND report_chapter_type_id=? `
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	_, err = o.Raw(sql, "rddp", reportId).Exec()
 	return
 }
@@ -40,7 +40,7 @@ type ChartPermissionMappingIdName struct {
 }
 
 func GetChartPermissionNameFromMappingByKeyword(keyword string, source string) (list []*ChartPermissionMappingIdName, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	sql := " SELECT b.chart_permission_id AS permission_id,b.permission_name FROM chart_permission_search_key_word_mapping AS a INNER JOIN chart_permission AS b ON a.chart_permission_id = b.chart_permission_id WHERE a.`from` = ? AND a.key_word = ? "
 	_, err = o.Raw(sql, source, keyword).QueryRows(&list)
 

+ 3 - 263
models/report.go

@@ -191,21 +191,6 @@ func GetReportById(reportId int) (item *ReportDetail, err error) {
 	return
 }
 
-func GetReportByIds(reportIds string) (list []*ReportDetail, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT * FROM report WHERE id in ` + reportIds
-	_, err = o.Raw(sql).QueryRows(&list)
-	return
-}
-
-// GetSimpleReportByIds 根据报告ID查询报告基本信息
-func GetSimpleReportByIds(reportIds string) (list []*ReportDetail, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT id, title FROM report WHERE id IN (` + reportIds + `)`
-	_, err = o.Raw(sql).QueryRows(&list)
-	return
-}
-
 func GetReportStage(classifyIdFirst, classifyIdSecond int) (count int, err error) {
 	o := orm.NewOrmUsingDB("rddp")
 	sql := ``
@@ -522,14 +507,6 @@ func GetReportByReportId(reportId int) (item *Report, err error) {
 	return
 }
 
-// GetReportByOldReportId 根据老报告id主键获取报告
-func GetReportByOldReportId(reportId int) (item *Report, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT * FROM report WHERE old_report_id = ?`
-	err = o.Raw(sql, reportId).QueryRow(&item)
-	return
-}
-
 // DeleteDayWeekReportAndChapter 删除晨周报及章节
 func DeleteDayWeekReportAndChapter(reportId int) (err error) {
 	o := orm.NewOrmUsingDB("rddp")
@@ -571,26 +548,6 @@ type ReportDetailView struct {
 	ChapterList []*ReportChapter
 }
 
-func GetUnPublishDayReport(startTime time.Time, endTime time.Time) (item *Report, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := ` SELECT
-				*
-			FROM
-				report AS a
-			WHERE
-				a.has_chapter = 1
-			AND a.chapter_type = "day"
-			AND a.state = 1
-			AND (
-				a.create_time BETWEEN ? AND ?
-			)
-			ORDER BY
-				a.create_time DESC
-			LIMIT 1 `
-	err = o.Raw(sql, startTime, endTime).QueryRow(&item)
-	return
-}
-
 type ElasticReportDetail struct {
 	ReportId           int    `description:"报告ID"`
 	ReportChapterId    int    `description:"报告章节ID"`
@@ -617,15 +574,6 @@ func GetLastPublishDayWeekReport(chapterType string) (item *Report, err error) {
 	return
 }
 
-// GetNewReportExist
-func GetNewReportExist(oldReportId int) (item *Report, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := ` SELECT id FROM report WHERE old_report_id = ? LIMIT 1 `
-	err = o.Raw(sql, oldReportId).QueryRow(&item)
-
-	return
-}
-
 // PublishReportAndChapter 发布报告及章节
 func PublishReportAndChapter(reportInfo *Report, publishIds string, unPublishIds string, isPublishReport bool, cols []string) (err error) {
 	o := orm.NewOrmUsingDB("rddp")
@@ -658,15 +606,6 @@ func PublishReportAndChapter(reportInfo *Report, publishIds string, unPublishIds
 	return
 }
 
-func GetSyncEmptyVideoReport() (list []*Report, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := ` SELECT id FROM report WHERE old_report_id > 0 AND state = 2 AND chapter_type = "" AND (video_size = "" OR video_play_seconds = "")
-UNION ALL
-SELECT DISTINCT report_id FROM report_chapter WHERE publish_state = 2 AND (video_size = "" OR video_play_seconds = "") `
-	_, err = o.Raw(sql).QueryRows(&list)
-	return
-}
-
 // 发布报告
 func PublishReportById(reportId int, publishTime time.Time) (err error) {
 	o := orm.NewOrmUsingDB("rddp")
@@ -675,181 +614,6 @@ func PublishReportById(reportId int, publishTime time.Time) (err error) {
 	return
 }
 
-// GetCommentReportByReportId 查询有留言的报告列表
-func GetCommentReportByReportId(condition string, pars []interface{}, startSize, pageSize int) (list []*Report, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT
-	id,
-	create_time,
-	title,
-	classify_name_first,
-	classify_id_first,
-	classify_name_second,
-	classify_id_second,
-	state,
-IF
-	( publish_time, publish_time, create_time ) AS publish_time 
-FROM
-	report 
-WHERE
-	1=1
-  `
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY  publish_time DESC , title ASC LIMIT ?,?`
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
-	return
-}
-
-// GetCommentReportByReportIdOrderBy 查询有留言的报告列表(指定排序)
-func GetCommentReportByReportIdOrderBy(condition string, pars []interface{}, startSize, pageSize int, orderBy string) (list []*Report, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT
-	id,
-	create_time,
-	title,
-	classify_name_first,
-	classify_id_first,
-	classify_name_second,
-	classify_id_second,
-	state,
-IF
-	( publish_time, publish_time, create_time ) AS publish_time 
-FROM
-	report 
-WHERE
-	1=1
-  `
-	if condition != "" {
-		sql += condition
-	}
-	if orderBy == `` {
-		sql += ` ORDER BY  publish_time DESC , title ASC `
-	} else {
-		sql += orderBy
-	}
-	sql += ` LIMIT ?,? `
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
-	return
-}
-
-// GetCommentReportTotalByReportId 查询有留言的报告列表总数
-func GetCommentReportTotalByReportId(condition string, pars []interface{}) (total int64, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT count(*)
-        FROM report WHERE 1=1`
-	if condition != "" {
-		sql += condition
-	}
-	err = o.Raw(sql, pars).QueryRow(&total)
-	return
-}
-
-// 点赞相关的报告列表
-type LikeReportItem struct {
-	ReportId              int       `description:"报告Id"`
-	ReportChapterId       int       `description:"报告章节Id"`
-	ClassifyIdFirst       int       `description:"一级分类id"`
-	ClassifyNameFirst     string    `description:"一级分类名称"`
-	ClassifyIdSecond      int       `description:"二级分类id"`
-	ClassifyNameSecond    string    `description:"二级分类名称"`
-	ReportChapterTypeId   int       `description:"章节类型"`
-	ReportChapterTypeName string    `description:"品种名称"`
-	PublishTime           time.Time `description:"发布时间" `
-	Title                 string    `description:"标题"`
-}
-
-// GetLikeReportByReportIdReportChapterId 获取有被点赞的报告列表
-func GetLikeReportByReportIdReportChapterId(reportIds string, chapterIds string, orderStr string, startSize, pageSize int) (list []*LikeReportItem, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `( SELECT
-id AS report_id,
-0 AS report_chapter_id,
-classify_id_first,
-classify_id_second,
-classify_name_first,
-classify_name_second,
-0 as report_chapter_type_id,
-"" as report_chapter_type_name,
-publish_time,
-title
-FROM
-	report
-WHERE
-	classify_name_first != "晨报" 
-	AND classify_name_first != "周报"
-	AND id in (` + reportIds + `)
-	)
-UNION
-	
-( SELECT
-report_id,
-report_chapter_id,
-classify_id_first,
-0 as classify_id_second,
-classify_name_first,
-null as classify_name_second,
-type_id as report_chapter_type_id,
-type_name as report_chapter_type_name,
-publish_time,
-title
-FROM
-	report_chapter
-WHERE
-	 report_chapter_id in (` + chapterIds + `)
-	)`
-	if orderStr != "" {
-		sql += ` ORDER BY FIELD(CONCAT(report_id, "-",report_chapter_id),` + orderStr + `)`
-	} else {
-		sql += ` ORDER BY  publish_time DESC, report_id Desc`
-	}
-	sql += ` LIMIT ?,?`
-	_, err = o.Raw(sql, startSize, pageSize).QueryRows(&list)
-	return
-}
-
-// GetLikeReportTotalByReportIdReportChapterId 获取有被点赞的报告列表总数
-func GetLikeReportTotalByReportIdReportChapterId(reportIds string, chapterIds string) (total int64, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `select count(*) from (( SELECT
-id AS report_id,
-0 AS report_chapter_id,
-classify_id_first,
-classify_id_second,
-classify_name_first,
-classify_name_second,
-0 as report_chapter_type_id,
-publish_time,
-title
-FROM
-	report
-WHERE
-	classify_name_first != "晨报" 
-	AND classify_name_first != "周报"
-	AND id in (` + reportIds + `)
-	)
-UNION
-	
-( SELECT
-report_id,
-report_chapter_id,
-classify_id_first,
-0 as classify_id_second,
-classify_name_first,
-null as classify_name_second,
-type_id as report_chapter_type_id,
-publish_time,
-title
-FROM
-	report_chapter
-WHERE
-report_chapter_id in (` + chapterIds + `)
-	)) r`
-	err = o.Raw(sql).QueryRow(&total)
-	return
-}
-
 // GetPageReportList 分页获取报告列表
 func GetPageReportList(condition string, pars []interface{}, startSize, pageSize int) (total int, items []*ReportList, err error) {
 	o := orm.NewOrmUsingDB("rddp")
@@ -884,14 +648,14 @@ type YbPcSuncode struct {
 
 // GetYbPcSunCode 获取太阳码
 func GetYbPcSunCode(scene, page string) (item *YbPcSuncode, err error) {
-	o := orm.NewOrmUsingDB("default")
+	o := orm.NewOrmUsingDB("weekly")
 	sql := `SELECT * FROM yb_pc_suncode WHERE scene = ? AND code_page = ? `
 	err = o.Raw(sql, scene, page).QueryRow(&item)
 	return
 }
 
 func AddYbPcSunCode(item *YbPcSuncode) (err error) {
-	o := orm.NewOrmUsingDB("default")
+	o := orm.NewOrmUsingDB("weekly")
 	_, err = o.Insert(item)
 	return
 }
@@ -905,35 +669,11 @@ type YbSuncodePars struct {
 }
 
 func AddYbSuncodePars(item *YbSuncodePars) (err error) {
-	o := orm.NewOrmUsingDB("default")
+	o := orm.NewOrmUsingDB("weekly")
 	_, err = o.Insert(item)
 	return
 }
 
-// UpdateReportSecondClassifyNameByClassifyId 更新报告分类名称字段
-func UpdateReportSecondClassifyNameByClassifyId(classifyId int, classifyName string) (err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := " UPDATE report SET classify_name_second = ? WHERE classify_id_second = ? "
-	_, err = o.Raw(sql, classifyName, classifyId).Exec()
-	return
-}
-
-// UpdateReportFirstClassifyNameByClassifyId 更新报告分类一级名称字段
-func UpdateReportFirstClassifyNameByClassifyId(classifyId int, classifyName string) (err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := " UPDATE report SET classify_name_first = ? WHERE classify_id_first = ? "
-	_, err = o.Raw(sql, classifyName, classifyId).Exec()
-	return
-}
-
-// UpdateReportSecondClassifyFirstNameByClassifyId 更新报告二级分类的一级分类名称和id
-func UpdateReportSecondClassifyFirstNameByClassifyId(classifyId, newClassifyId int, classifyName string) (err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := " UPDATE report SET classify_name_first = ?, classify_id_first = ? WHERE classify_id_second = ? "
-	_, err = o.Raw(sql, classifyName, newClassifyId, classifyId).Exec()
-	return
-}
-
 // GetEmptyContentSubPPTReport 获取前两章为空的PPT报告
 func GetEmptyContentSubPPTReport() (list []*Report, err error) {
 	sql := `SELECT

+ 7 - 4
models/report_chapter.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	"eta/eta_mobile/utils"
 	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
@@ -199,7 +200,10 @@ func GetReportChapterVideoList(reportId int) (list []*ReportChapterVideoList, er
 }
 
 // GetReportChapterVideoListByReportIds 根据报告ID集合获取报告章节音频列表
-func GetReportChapterVideoListByReportIds(reportIds string) (list []*ReportChapterVideoList, err error) {
+func GetReportChapterVideoListByReportIds(reportIds []string) (list []*ReportChapterVideoList, err error) {
+	if len(reportIds) == 0 {
+		return
+	}
 	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT
 				report_id,
@@ -210,11 +214,10 @@ func GetReportChapterVideoListByReportIds(reportIds string) (list []*ReportChapt
 			FROM
 				report_chapter
 			WHERE
-				report_id IN (` + reportIds + `) AND publish_state = 2 AND video_url != ""
+				report_id IN (` + utils.GetOrmInReplace(len(reportIds)) + `) AND publish_state = 2 AND video_url != ""
 			ORDER BY
 				report_chapter_id ASC `
-	_, err = o.Raw(sql).QueryRows(&list)
-
+	_, err = o.Raw(sql, reportIds).QueryRows(&list)
 	return
 }
 

+ 1 - 1
models/report_chapter_ticker.go

@@ -57,7 +57,7 @@ type DailyBaseColumn struct {
 
 // GetDailyBaseColumnList 获取基础列列表
 func GetDailyBaseColumnList(keyword string, typeId int) (list []*DailyBaseColumn, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	sql := ` SELECT * FROM daily_base_column WHERE 1 = 1 `
 	pars := make([]interface{}, 0)
 	if keyword != "" {

+ 7 - 7
models/report_chapter_type.go

@@ -33,7 +33,7 @@ type ReportChapterType struct {
 
 // GetReportChapterTypeById 获取章节类型
 func GetReportChapterTypeById(reportChapterTypeId int) (item *ReportChapterType, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	sql := ` SELECT * FROM report_chapter_type WHERE report_chapter_type_id = ? `
 	err = o.Raw(sql, reportChapterTypeId).QueryRow(&item)
 	return
@@ -41,7 +41,7 @@ func GetReportChapterTypeById(reportChapterTypeId int) (item *ReportChapterType,
 
 // GetReportChapterTypeList 获取章节类型列表
 func GetReportChapterTypeList() (list []*ReportChapterType, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	sql := ` SELECT * FROM report_chapter_type WHERE enabled = 1 `
 	_, err = o.Raw(sql).QueryRows(&list)
 	return
@@ -49,7 +49,7 @@ func GetReportChapterTypeList() (list []*ReportChapterType, err error) {
 
 // GetReportChapterTypeListByResearchType 通过报告类型获取章节类型列表
 func GetReportChapterTypeListByResearchType(researchType string) (list []*ReportChapterType, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	sql := ` SELECT * FROM report_chapter_type WHERE research_type = ? AND enabled = 1`
 	_, err = o.Raw(sql, researchType).QueryRows(&list)
 	return
@@ -57,7 +57,7 @@ func GetReportChapterTypeListByResearchType(researchType string) (list []*Report
 
 // GetAllReportChapterTypeListByResearchType 通过报告类型获取章节类型列表
 func GetAllReportChapterTypeListByResearchType(researchType string) (list []*ReportChapterType, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	sql := ` SELECT * FROM report_chapter_type WHERE research_type = ?`
 	_, err = o.Raw(sql, researchType).QueryRows(&list)
 	return
@@ -65,7 +65,7 @@ func GetAllReportChapterTypeListByResearchType(researchType string) (list []*Rep
 
 // GetEnableReportChapterTypeList 获取未暂停的章节类型列表
 func GetEnableReportChapterTypeList(researchType string) (list []*ReportChapterType, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	sql := ` SELECT
 				*
 			FROM
@@ -95,7 +95,7 @@ type StopUpdateReportChapterTypeResp struct {
 
 // GetStopUpdateReportChapterTypeListByResearchType 获取暂停更新章节类型列表
 func GetStopUpdateReportChapterTypeListByResearchType() (list []*ReportChapterType, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	sql := ` SELECT * FROM report_chapter_type WHERE is_set = 1 AND pause_end_time >= ? AND enabled = 1 `
 	_, err = o.Raw(sql, time.Now().Format(utils.FormatDate)).QueryRows(&list)
 	return
@@ -103,7 +103,7 @@ func GetStopUpdateReportChapterTypeListByResearchType() (list []*ReportChapterTy
 
 // GetDisableUpdateReportChapterTypeListByResearchType 获取停止更新的章节类型列表
 func GetDisableUpdateReportChapterTypeListByResearchType() (list []*ReportChapterType, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	sql := ` SELECT * FROM report_chapter_type WHERE enabled = 0`
 	_, err = o.Raw(sql).QueryRows(&list)
 	return

+ 1 - 1
models/report_chapter_type_permission.go

@@ -17,7 +17,7 @@ type ReportChapterTypePermission struct {
 
 // GetChapterTypePermissionByTypeIdAndResearchType 根据章节类型ID及研报类型获取章节类型权限列表
 func GetChapterTypePermissionByTypeIdAndResearchType(typeId int, researchType string) (list []*ReportChapterTypePermission, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	sql := ` SELECT * FROM report_chapter_type_permission WHERE report_chapter_type_id = ? AND research_type = ? ORDER BY chart_permission_id ASC `
 	_, err = o.Raw(sql, typeId, researchType).QueryRows(&list)
 	return

+ 2 - 2
models/sandbox/sandbox.go

@@ -24,7 +24,7 @@ type Sandbox struct {
 
 // Update 沙盘字段变更
 func (sandbox *Sandbox) Update(cols []string) (err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("data")
 	_, err = o.Update(sandbox, cols...)
 	return
 }
@@ -52,7 +52,7 @@ type SandboxListItem struct {
 
 // GetList 获取沙盘列表页
 func GetList(condition string, pars []interface{}, startSize, pageSize int) (total int, list []*SandboxListItem, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("data")
 	sql := "select a.sandbox_id,a.name,a.chart_permission_id,a.chart_permission_name,a.curr_version,a.code,a.pic_url,a.op_user_id,a.op_user_name,a.modify_time,a.create_time,b.version_code from sandbox as a join sandbox_version b on a.sandbox_id=b.sandbox_id and a.curr_version=b.curr_version where 1=1 AND a.is_delete = 0 "
 	sql += condition
 	sql += ` order by a.modify_time desc,a.sandbox_id desc`

+ 2 - 2
models/search_key_word.go

@@ -18,7 +18,7 @@ type SearchKeyWord struct {
 
 // AddTrendTagKeyWord 新增趋势标签关键词
 func AddTrendTagKeyWord(trend string) (err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	sql := " REPLACE INTO search_key_word (`key_word`,`from`) values (?,'trend') "
 	_, err = o.Raw(sql, trend).Exec()
 
@@ -27,7 +27,7 @@ func AddTrendTagKeyWord(trend string) (err error) {
 
 // GetKeyWordListByFrom 根据来源获取搜索关键词列表
 func GetKeyWordListByFrom(from string) (list []*SearchKeyWord, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	sql := " SELECT * FROM search_key_word WHERE `from` = ? ORDER BY created_time ASC "
 	_, err = o.Raw(sql, from).QueryRows(&list)
 

+ 8 - 8
models/semantic_analysis/sa_compare.go

@@ -50,7 +50,7 @@ func (m *SaCompare) TableName() string {
 }
 
 func (m *SaCompare) Create() (err error) {
-	o := orm.NewOrmUsingDB("eta")
+	o := orm.NewOrm()
 	id, err := o.Insert(m)
 	if err != nil {
 		return
@@ -60,27 +60,27 @@ func (m *SaCompare) Create() (err error) {
 }
 
 func (m *SaCompare) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("eta")
+	o := orm.NewOrm()
 	_, err = o.Update(m, cols...)
 	return
 }
 
 func (m *SaCompare) Del() (err error) {
-	o := orm.NewOrmUsingDB("eta")
+	o := orm.NewOrm()
 	sql := `DELETE FROM sa_compare WHERE sa_compare_id = ? LIMIT 1`
 	_, err = o.Raw(sql, m.SaCompareId).Exec()
 	return
 }
 
 func (m *SaCompare) GetItemById(id int) (err error) {
-	o := orm.NewOrmUsingDB("eta")
+	o := orm.NewOrm()
 	sql := `SELECT * FROM sa_compare WHERE sa_compare_id = ? LIMIT 1`
 	err = o.Raw(sql, id).QueryRow(&m)
 	return
 }
 
 func (m *SaCompare) GetItemByCondition(condition string, pars []interface{}) (err error) {
-	o := orm.NewOrmUsingDB("eta")
+	o := orm.NewOrm()
 	sql := `SELECT * FROM sa_compare WHERE 1=1 `
 	sql += condition
 	sql += ` LIMIT 1`
@@ -89,14 +89,14 @@ func (m *SaCompare) GetItemByCondition(condition string, pars []interface{}) (er
 }
 
 func (m *SaCompare) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
-	o := orm.NewOrmUsingDB("eta")
+	o := orm.NewOrm()
 	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
 	err = o.Raw(sql, pars).QueryRow(&count)
 	return
 }
 
 func (m *SaCompare) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*SaCompare, err error) {
-	o := orm.NewOrmUsingDB("eta")
+	o := orm.NewOrm()
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -111,7 +111,7 @@ func (m *SaCompare) GetItemsByCondition(condition string, pars []interface{}, fi
 }
 
 func (m *SaCompare) GetPageItemsByCondition(startSize, pageSize int, condition string, pars []interface{}, fieldArr []string, orderRule string) (total int, items []*SaCompare, err error) {
-	o := orm.NewOrmUsingDB("eta")
+	o := orm.NewOrm()
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`

+ 4 - 4
models/system/sys_admin.go

@@ -42,14 +42,14 @@ type AdminItem struct {
 
 func GetSysAdminByName(adminName string) (item *Admin, err error) {
 	sql := `SELECT * FROM admin WHERE admin_name=? `
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	err = o.Raw(sql, adminName).QueryRow(&item)
 	return
 }
 
 func GetSysAdminById(adminId int) (item *Admin, err error) {
 	sql := `SELECT * FROM admin WHERE admin_id=? `
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	err = o.Raw(sql, adminId).QueryRow(&item)
 	return
 }
@@ -60,13 +60,13 @@ func GetSysAdminByIdSlice(adminIdList []string) (items []*Admin, err error) {
 		return
 	}
 	sql := `SELECT * FROM admin WHERE admin_id in (` + strings.Join(adminIdList, ",") + `) `
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
 
 func GetAdminByGroupId(groupId int) (items []*AdminItem, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("weekly")
 	sql := `SELECT * FROM admin WHERE group_id=? ORDER BY created_time DESC`
 	_, err = o.Raw(sql, groupId).QueryRows(&items)
 	return

+ 7 - 2
models/system/sys_menu.go

@@ -95,7 +95,6 @@ type SysMenu struct {
 
 // GetMenuButtonsByRoleId 获取角色按钮菜单
 func GetMenuButtonsByRoleId(roleId int) (items []*SysMenu, err error) {
-	o := orm.NewOrmUsingDB("eta")
 	sql := `SELECT
 				r.*
 			FROM
@@ -106,7 +105,7 @@ func GetMenuButtonsByRoleId(roleId int) (items []*SysMenu, err error) {
 			ORDER BY
 				r.sort ASC,
 				r.create_time DESC`
-	_, err = o.Raw(sql, roleId).QueryRows(&items)
+	_, err = orm.NewOrm().Raw(sql, roleId).QueryRows(&items)
 	return
 }
 
@@ -118,3 +117,9 @@ type SysMenuButtonResp struct {
 	MenuType   int    `description:"菜单类型: 0-菜单; 1-按钮"`
 	ButtonCode string `description:"按钮唯一标识"`
 }
+
+// BusinessConf 商户配置表
+type BusinessConf struct {
+	ConfKey string `description:"配置Key"`
+	ConfVal string `description:"配置值"`
+}

+ 1 - 0
models/system/sys_role_admin.go

@@ -22,3 +22,4 @@ func GetRoleIdsByAdminId(adminId int) (items []*SysRoleAdmin, err error) {
 	_, err = orm.NewOrm().Raw(sql, adminId).QueryRows(&items)
 	return
 }
+

+ 6 - 6
models/system/sys_session.go

@@ -16,9 +16,9 @@ type SysSession struct {
 	LastUpdatedTime time.Time
 }
 
-//新增用户登录session信息
+// 新增用户登录session信息
 func AddSysSession(item *SysSession) (err error) {
-	o := orm.NewOrmUsingDB("rddp")
+	o := orm.NewOrm()
 	lastId, err := o.Insert(item)
 	if err != nil {
 		return
@@ -29,22 +29,22 @@ func AddSysSession(item *SysSession) (err error) {
 
 func GetSysSessionBySysUserId(sysUserId int) (item *SysSession, err error) {
 	sql := `SELECT * FROM sys_session WHERE sys_user_id=? AND expired_time> NOW() ORDER BY expired_time DESC LIMIT 1 `
-	o := orm.NewOrmUsingDB("rddp")
+	o := orm.NewOrm()
 	err = o.Raw(sql, sysUserId).QueryRow(&item)
 	return
 }
 
 func GetSysSessionByToken(token string) (item *SysSession, err error) {
 	sql := `SELECT * FROM sys_session WHERE access_token=? AND expired_time> NOW() ORDER BY expired_time DESC LIMIT 1 `
-	o := orm.NewOrmUsingDB("rddp")
+	o := orm.NewOrm()
 	err = o.Raw(sql, token).QueryRow(&item)
 	return
 }
 
-//过期掉用户token
+// 过期掉用户token
 func ExpiredSysSessionByAdminId(adminId int) (err error) {
 	sql := `update sys_session set expired_time = NOW()  WHERE sys_user_id=? `
-	o := orm.NewOrmUsingDB("rddp")
+	o := orm.NewOrm()
 	_, err = o.Raw(sql, adminId).Exec()
 	return
 }

+ 8 - 4
models/user_view_history.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	"eta/eta_mobile/utils"
 	"github.com/beego/beego/v2/client/orm"
 )
 
@@ -11,8 +12,11 @@ type ResearchReportViewPUV struct {
 }
 
 // GetPUVByResearchReportIds 通过报告IDs获取老报告PV、UV
-func GetPUVByResearchReportIds(reportIds string) (list []*ResearchReportViewPUV, err error) {
-	o := orm.NewOrm()
+func GetPUVByResearchReportIds(reportIds []string) (list []*ResearchReportViewPUV, err error) {
+	if len(reportIds) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("weekly")
 	sql := `SELECT
 				research_report_id,
 				COUNT(1) AS pv,
@@ -20,9 +24,9 @@ func GetPUVByResearchReportIds(reportIds string) (list []*ResearchReportViewPUV,
 			FROM
 				user_view_history
 			WHERE
-				research_report_id IN (` + reportIds + `)
+				research_report_id IN (` + utils.GetOrmInReplace(len(reportIds)) + `)
 			GROUP BY
 				research_report_id`
-	_, err = o.Raw(sql).QueryRows(&list)
+	_, err = o.Raw(sql, reportIds).QueryRows(&list)
 	return
 }

+ 2 - 2
models/wechat_send_msg.go

@@ -11,7 +11,7 @@ func GetOpenIdArr() (items []string, err error) {
 		INNER JOIN user_record  AS ur ON wu.user_id=ur.user_id
           WHERE ur.open_id != "" AND ur.subscribe=1 AND ur.create_platform=1 AND  d.status IN('正式','试用','永续')
          ORDER BY FIELD(c.company_id, 16) desc, ur.user_record_id asc`
-	_, err = orm.NewOrm().Raw(sql).QueryRows(&items)
+	_, err = orm.NewOrmUsingDB("weekly").Raw(sql).QueryRows(&items)
 	return
 }
 
@@ -27,6 +27,6 @@ func GetOpenIdArrByClassifyNameSecond(classifyNameSecond string) (items []string
 			AND g.from='rddp'
 			AND g.key_word=?
 			ORDER BY FIELD(c.company_id, 16) DESC, ur.user_record_id ASC  `
-	_, err = orm.NewOrm().Raw(sql, classifyNameSecond).QueryRows(&items)
+	_, err = orm.NewOrmUsingDB("weekly").Raw(sql, classifyNameSecond).QueryRows(&items)
 	return
 }

+ 45 - 0
routers/commentsRouter.go

@@ -979,6 +979,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/english_report:EnglishCompanyController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/english_report:EnglishCompanyController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/company/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mobile/controllers/english_report:EnglishReportController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/english_report:EnglishReportController"],
         beego.ControllerComments{
             Method: "Add",
@@ -1168,6 +1177,33 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers:BusinessConfController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers:BusinessConfController"],
+        beego.ControllerComments{
+            Method: "Fetch",
+            Router: `/fetch`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers:BusinessConfController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers:BusinessConfController"],
+        beego.ControllerComments{
+            Method: "Save",
+            Router: `/save`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers:BusinessConfOpenController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers:BusinessConfOpenController"],
+        beego.ControllerComments{
+            Method: "CodeEncrypt",
+            Router: `/code_encrypt`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mobile/controllers:ClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers:ClassifyController"],
         beego.ControllerComments{
             Method: "ListClassify",
@@ -2140,6 +2176,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers:SysRoleController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers:SysRoleController"],
+        beego.ControllerComments{
+            Method: "SystemConfig",
+            Router: `/config`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mobile/controllers:SysRoleController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers:SysRoleController"],
         beego.ControllerComments{
             Method: "ButtonList",

+ 13 - 0
routers/router.go

@@ -163,6 +163,19 @@ func init() {
 				&semantic_analysis.SaCompareController{},
 			),
 		),
+		web.NSNamespace("/business_conf",
+			web.NSInclude(
+				&controllers.BusinessConfController{},
+				&controllers.BusinessConfOpenController{},
+			),
+		),
+		web.NSNamespace("/english_report",
+			web.NSInclude(
+				&english_report.EnglishReportController{},
+				&english_report.EnglishReportEmailController{},
+				&english_report.EnglishCompanyController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 119 - 0
services/english_company_todo.go

@@ -0,0 +1,119 @@
+package services
+
+import (
+	"errors"
+	"eta/eta_mobile/models"
+	"eta/eta_mobile/models/system"
+	"eta/eta_mobile/utils"
+	"strconv"
+	"time"
+)
+
+const (
+	TodoButtonColorDoing     = "red"
+	TodoButtonColorDefault   = "gray"
+	TodoButtonColorCompleted = "green"
+)
+
+// GetEnglishCompanyTodoAuthRole 获取可操作英文客户TODO的角色列表
+func GetEnglishCompanyTodoAuthRole() []string {
+	return []string{
+		utils.ROLE_TYPE_CODE_ADMIN,           // 管理员
+		utils.ROLE_TYPE_CODE_FICC_ADMIN,      // FICC管理员
+		utils.ROLE_TYPE_CODE_FICC_DEPARTMENT, // FICC部门经理
+		utils.ROLE_TYPE_CODE_FICC_GROUP,      // FICC销售主管
+		utils.ROLE_TYPE_CODE_FICC_TEAM,       // FICC销售组长
+		utils.ROLE_TYPE_CODE_FICC_SELLER,     // FICC销售
+		utils.ROLE_TYPE_CODE_FICC_RESEARCHR,  // ficc研究员
+	}
+}
+
+// CheckEnglishCompanyTodoAuth 校验当前用户对客户的操作(新增/编辑)权限
+func CheckEnglishCompanyTodoAuth(sysUser *system.Admin, sellerInfo *system.Admin) (ok bool, errMsg string, err error) {
+	// 是否有权限添加/编辑任务
+	roleCode := sysUser.RoleTypeCode
+	authList := GetEnglishCompanyTodoAuthRole()
+	if !utils.InArrayByStr(authList, roleCode) {
+		errMsg = "账号角色异常,不允许操作"
+		return
+	}
+
+	// 销售仅能操作自己的客户
+	if roleCode == utils.ROLE_TYPE_CODE_FICC_SELLER && sellerInfo.AdminId != sysUser.AdminId {
+		errMsg = "该客户不是当前账号所属,不允许操作"
+		return
+	}
+
+	// 判断销售主管、组长权限, 其余管理员角色不做限制
+	switch roleCode {
+	case utils.ROLE_TYPE_CODE_FICC_GROUP:
+		same, e := CheckAdminIsSameBigGroup(sysUser, sellerInfo)
+		if e != nil {
+			errMsg = "保存失败"
+			err = errors.New("判断主管与客户所属销售是否属于同一大组失败, Err: " + e.Error())
+			return
+		}
+		if !same {
+			errMsg = "该客户销售不是当前账号所属组员,不允许操作"
+			return
+		}
+	case utils.ROLE_TYPE_CODE_FICC_TEAM:
+		if sellerInfo.GroupId != sysUser.GroupId {
+			errMsg = "该客户销售不是当前账号所属组员,不允许操作"
+			return
+		}
+	}
+	ok = true
+	return
+}
+
+// GetEnglishCompanyListTodoMap 获取英文客户列表TODO相关信息
+func GetEnglishCompanyListTodoMap(companyList []*models.EnglishCompanyListItem, sysUser *system.Admin) (todoMap map[int]*models.EnglishCompanyListTodo) {
+	todoMap = make(map[int]*models.EnglishCompanyListTodo, 0)
+	if len(companyList) == 0 || sysUser == nil {
+		return
+	}
+	nowTime := time.Now().Local()
+	todayTime := time.Date(nowTime.Year(), nowTime.Month(), nowTime.Day(), 0, 0, 0, 0, time.Local)
+	for i := range companyList {
+		c := companyList[i]
+		v := new(models.EnglishCompanyListTodo)
+		v.TodoButtonColor = TodoButtonColorDefault
+		v.HiddenConfirm = true // 默认隐藏完成按钮
+		if c.TodoStatusStr != models.EnglishCompanyTodoStatusNull {
+			// 已完成
+			if c.TodoStatusStr == models.EnglishCompanyTodoStatusCompleted {
+				v.TodoButtonColor = TodoButtonColorCompleted
+			}
+			// 进行中
+			if c.TodoStatusStr == models.EnglishCompanyTodoStatusDoing {
+				v.TodoStatus = true
+				v.TodoButtonColor = TodoButtonColorDoing
+				//v.TodoEndTime = td.EndTime
+				v.TodoEndTimeStr = c.TodoEndTime.Format(utils.FormatDate)
+				// 截止目前还剩余的天数
+				todoEndTime := time.Date(c.TodoEndTime.Year(), c.TodoEndTime.Month(), c.TodoEndTime.Day(), 0, 0, 0, 0, time.Local)
+				deadline := int(todoEndTime.Sub(todayTime).Hours() / 24)
+				v.Deadline = strconv.Itoa(deadline)
+			}
+			// 根据当前角色判断按钮权限
+			switch sysUser.RoleTypeCode {
+			case utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_FICC_DEPARTMENT, utils.ROLE_TYPE_CODE_FICC_GROUP, utils.ROLE_TYPE_CODE_FICC_RESEARCHR:
+				v.HiddenConfirm = false
+				if c.TodoStatusStr == models.EnglishCompanyTodoStatusDoing {
+					v.CanConfirm = true
+				}
+			case utils.ROLE_TYPE_CODE_FICC_TEAM:
+				// 组长不是自己的客户则展示完成按钮
+				if c.SellerId != sysUser.AdminId {
+					v.HiddenConfirm = false
+				}
+				if c.TodoStatusStr == models.EnglishCompanyTodoStatusDoing {
+					v.CanConfirm = true
+				}
+			}
+		}
+		todoMap[c.CompanyId] = v
+	}
+	return
+}

+ 346 - 0
services/minio.go

@@ -0,0 +1,346 @@
+package services
+
+import (
+	"context"
+	"errors"
+	"eta/eta_mobile/utils"
+	"github.com/minio/minio-go/v7"
+	"github.com/minio/minio-go/v7/pkg/credentials"
+	"log"
+	"os"
+	"time"
+)
+
+func GetMinIOSTSToken() (item *Token, err error) {
+	// MinIO服务的访问信息
+	item = new(Token)
+	//useSSL := false
+	//if utils.MinIoUseSSL == "true" {
+	//	useSSL = true
+	//}
+	// 创建MinIO客户端
+	//minioClient, err := minio.New(utils.MinIoEndpoint, &minio.Options{
+	//	Creds:  credentials.NewStaticV4(utils.MinIoAccessKeyId, utils.MinIoAccessKeySecret, ""),
+	//	Secure: useSSL,
+	//})
+	//if err != nil {
+	//	return nil, err
+	//}
+	// 设置STS凭证请求参数
+	//policy := `{
+	//    "Version": "2012-10-17",
+	//    "Statement": [
+	//        {
+	//            "Sid": "",
+	//            "Effect": "Allow",
+	//            "Principal": {"AWS": "arn:aws:iam::1234567890:root"},
+	//            "Action": "s3:GetObject",
+	//            "Resource": "arn:aws:s3:::<YourBucketName>/*"
+	//        }
+	//    ]
+	//}`
+	//expiry := time.Hour * 24 // STS凭证的过期时间
+	//获取STS凭证
+	//stsCredentials, err := minioClient.PresignedPutObject(context.Background(), "etastatic", "myobject", expiry)
+	//if err != nil {
+	//	return
+	//}
+	item.AccessKeyId = utils.MinIoAccessKeyId
+	item.SecretKeyId = utils.MinIoAccessKeySecret
+	item.Endpoint = utils.MinIoEndpoint
+	item.ImgHost = utils.MinIoImghost
+	item.Bucketname = utils.MinIoBucketname
+	item.UseSSL = utils.MinIoUseSSL
+	item.RegionId = utils.MinIoRegion
+	item.Port = utils.MinIoPort
+	return
+}
+
+type Token struct {
+	AccessKeyId string
+	SecretKeyId string
+	RegionId    string
+	Bucketname  string
+	Endpoint    string
+	ImgHost     string
+	UseSSL      string
+	Port        string
+}
+
+func UploadMinIo() {
+	ctx := context.Background()
+	endpoint := "8.136.199.33:9000/"
+	accessKeyID := "LfQ8uiJiLP7vLxjRrmNW"
+	secretAccessKey := "IszGVHsNicJMQxHC46cYFtbrOiapo0ynwOIJ6c2R"
+	useSSL := false
+
+	// Initialize minio client object.
+	minioClient, err := minio.New(endpoint, &minio.Options{
+		Creds:  credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
+		Secure: useSSL,
+	})
+	if err != nil {
+		log.Fatalln(err)
+	}
+
+	// Make a new bucket called mymusic.
+	bucketName := "etastatic"
+	location := "/"
+
+	err = minioClient.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{Region: location})
+	if err != nil {
+		// Check to see if we already own this bucket (which happens if you run this twice)
+		exists, errBucketExists := minioClient.BucketExists(ctx, bucketName)
+		if errBucketExists == nil && exists {
+			log.Printf("We already own %s\n", bucketName)
+		} else {
+			log.Fatalln(err)
+		}
+	} else {
+		log.Printf("Successfully created %s\n", bucketName)
+	}
+	//buckets, err := minioClient.ListBuckets(ctx)
+	//for _, bucket := range buckets {
+	//	fmt.Println(bucket)
+	//}
+	// Upload the zip file
+	objectName := "1111.xlsx"
+	filePath := "/Users/xi/Desktop/1111.xlsx"
+	contentType := "application/xlsx"
+
+	// Upload the zip file with FPutObject
+	info, err := minioClient.FPutObject(ctx, bucketName, objectName, filePath, minio.PutObjectOptions{ContentType: contentType})
+	if err != nil {
+		log.Fatalln(err)
+	}
+
+	log.Printf("Successfully uploaded %s of size %d\n", objectName, info.Size)
+}
+
+// UploadImgToMinIo 图片上传
+func UploadImgToMinIo(fileName, filePath string) (string, error) {
+	if utils.MinIoAccessKeyId == `` || utils.MinIoAccessKeySecret == `` {
+		return "0", errors.New("MinIo信息未配置")
+	}
+
+	ctx := context.Background()
+	endpoint := utils.MinIoEndpoint
+	accessKeyID := utils.MinIoAccessKeyId
+	secretAccessKey := utils.MinIoAccessKeySecret
+	useSSL := false
+	if utils.MinIoUseSSL == "true" {
+		useSSL = true
+	}
+	minioClient, err := minio.New(endpoint, &minio.Options{
+		Creds:  credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
+		Secure: useSSL,
+	})
+	if err != nil {
+		log.Fatalln(err)
+	}
+	bucketName := utils.MinIoBucketname
+	// Check to see if we already own this bucket (which happens if you run this twice)
+	exists, errBucketExists := minioClient.BucketExists(ctx, bucketName)
+	if errBucketExists == nil && exists {
+		log.Printf("We already own %s\n", bucketName)
+	} else {
+		log.Fatalln(err)
+	}
+	path := utils.MinIoUpload_Audio_Dir + time.Now().Format("200601/20060102/")
+	path += fileName
+	// Upload the zip file with FPutObject
+	//contentType := "application/xlsx"
+	_, err = minioClient.FPutObject(ctx, bucketName, path, filePath, minio.PutObjectOptions{})
+	if err != nil {
+		log.Fatalln(err)
+	}
+
+	path = utils.MinIoImghost + path
+	return path, err
+}
+
+// UploadAudioToMinIo 音频上传
+func UploadAudioToMinIo(fileName, filePath string) (string, error) {
+	if utils.MinIoAccessKeyId == `` || utils.MinIoAccessKeySecret == `` {
+		return "0", errors.New("MinIo信息未配置")
+	}
+
+	ctx := context.Background()
+	endpoint := utils.MinIoEndpoint
+	accessKeyID := utils.MinIoAccessKeyId
+	secretAccessKey := utils.MinIoAccessKeySecret
+	useSSL := false
+	if utils.MinIoUseSSL == "true" {
+		useSSL = true
+	}
+	minioClient, err := minio.New(endpoint, &minio.Options{
+		Creds:  credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
+		Secure: useSSL,
+	})
+	if err != nil {
+		log.Fatalln(err)
+		return "1", err
+	}
+	bucketName := utils.MinIoBucketname
+	// Check to see if we already own this bucket (which happens if you run this twice)
+	exists, errBucketExists := minioClient.BucketExists(ctx, bucketName)
+	if errBucketExists == nil && exists {
+		log.Printf("We already own %s\n", bucketName)
+	} else {
+		log.Fatalln(err)
+		return "2", err
+	}
+
+	path := utils.MinIoUpload_Audio_Dir + time.Now().Format("200601/20060102/")
+	path += fileName
+
+	// Upload the zip file with FPutObject
+	//contentType := "application/xlsx"
+	_, err = minioClient.FPutObject(ctx, bucketName, path, filePath, minio.PutObjectOptions{})
+	if err != nil {
+		log.Fatalln(err)
+		return "3", err
+	}
+
+	path = utils.MinIoImghost + path
+	return path, err
+}
+
+// UploadVideoToMinIo 视频上传
+func UploadVideoToMinIo(filename, filePath, savePath string) error {
+	if utils.MinIoAccessKeyId == `` || utils.MinIoAccessKeySecret == `` {
+		return errors.New("MinIo信息未配置")
+	}
+	defer func() {
+		os.Remove(filePath)
+	}()
+
+	ctx := context.Background()
+	endpoint := utils.MinIoEndpoint
+	accessKeyID := utils.MinIoAccessKeyId
+	secretAccessKey := utils.MinIoAccessKeySecret
+	useSSL := false
+	if utils.MinIoUseSSL == "true" {
+		useSSL = true
+	}
+	minioClient, err := minio.New(endpoint, &minio.Options{
+		Creds:  credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
+		Secure: useSSL,
+	})
+	if err != nil {
+		log.Fatalln(err)
+		return err
+	}
+	bucketName := utils.MinIoBucketname
+	// Check to see if we already own this bucket (which happens if you run this twice)
+	exists, errBucketExists := minioClient.BucketExists(ctx, bucketName)
+	if errBucketExists == nil && exists {
+		log.Printf("We already own %s\n", bucketName)
+	} else {
+		log.Fatalln(err)
+		return err
+	}
+
+	//path := utils.Upload_Audio_Dir + time.Now().Format("200601/20060102/")
+	//path += filename
+	_, err = minioClient.FPutObject(ctx, bucketName, savePath, filePath, minio.PutObjectOptions{})
+	if err != nil {
+		log.Fatalln(err)
+		return err
+	}
+	//path = utils.Imghost + path
+	//return path,err
+	return err
+}
+
+// UploadFileToMinIo 上传文件
+func UploadFileToMinIo(filename, filePath, savePath string) error {
+	if utils.MinIoAccessKeyId == `` || utils.MinIoAccessKeySecret == `` {
+		return errors.New("MinIo信息未配置")
+	}
+	defer func() {
+		os.Remove(filePath)
+	}()
+	ctx := context.Background()
+	endpoint := utils.MinIoEndpoint
+	accessKeyID := utils.MinIoAccessKeyId
+	secretAccessKey := utils.MinIoAccessKeySecret
+	useSSL := false
+	if utils.MinIoUseSSL == "true" {
+		useSSL = true
+	}
+	minioClient, err := minio.New(endpoint, &minio.Options{
+		Creds:  credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
+		Secure: useSSL,
+	})
+	if err != nil {
+		log.Fatalln(err)
+		return err
+	}
+	bucketName := utils.MinIoBucketname
+	// Check to see if we already own this bucket (which happens if you run this twice)
+	exists, errBucketExists := minioClient.BucketExists(ctx, bucketName)
+	if errBucketExists == nil && exists {
+		log.Printf("We already own %s\n", bucketName)
+	} else {
+		log.Fatalln(err)
+		return err
+	}
+	//path := utils.Upload_Audio_Dir + time.Now().Format("200601/20060102/")
+	//path += filename
+	_, err = minioClient.FPutObject(ctx, bucketName, savePath, filePath, minio.PutObjectOptions{})
+	if err != nil {
+		log.Fatalln(err)
+		return err
+	}
+	//path = utils.Imghost + path
+	//return path,err
+	return err
+}
+
+// UploadMinIoToDir 上传至hzchart
+func UploadMinIoToDir(filename, filePath, uploadDir, fileDir string) (string, error) {
+	if utils.MinIoAccessKeyId == `` || utils.MinIoAccessKeySecret == `` {
+		return "0", errors.New("MinIo信息未配置")
+	}
+	ctx := context.Background()
+	endpoint := utils.MinIoEndpoint
+	accessKeyID := utils.MinIoAccessKeyId
+	secretAccessKey := utils.MinIoAccessKeySecret
+	useSSL := false
+	if utils.MinIoUseSSL == "true" {
+		useSSL = true
+	}
+	minioClient, err := minio.New(endpoint, &minio.Options{
+		Creds:  credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
+		Secure: useSSL,
+	})
+	if err != nil {
+		log.Fatalln(err)
+		return "1", err
+	}
+	bucketName := utils.MinIoBucketname
+	// Check to see if we already own this bucket (which happens if you run this twice)
+	exists, errBucketExists := minioClient.BucketExists(ctx, bucketName)
+	if errBucketExists == nil && exists {
+		log.Printf("We already own %s\n", bucketName)
+	} else {
+		log.Fatalln(err)
+		return "2", err
+	}
+	if uploadDir == "" {
+		uploadDir = utils.MinIoUploadDir
+	}
+	if fileDir == "" {
+		fileDir = time.Now().Format("200601/20060102/")
+	}
+	path := uploadDir + fileDir
+	path += filename
+	_, err = minioClient.FPutObject(ctx, bucketName, path, filePath, minio.PutObjectOptions{})
+	if err != nil {
+		log.Fatalln(err)
+		return "3", err
+	}
+	path = utils.MinIoImghost + path
+	return path, err
+}

+ 12 - 2
services/oss.go

@@ -148,6 +148,10 @@ type STSToken struct {
 	AccessKeySecret string
 	SecurityToken   string
 	ExpiredTime     string
+	RegionId        string
+	Bucketname      string
+	Endpoint        string
+	Imghost         string
 }
 
 // GetOssSTSToken 获取STSToken
@@ -210,18 +214,20 @@ func NewSTSToken() (item *STSToken, err error) {
 		}
 	}()
 	item = new(STSToken)
-	client, e := sts.NewClientWithAccessKey(utils.RegionId, utils.RAMAccessKeyId, utils.RAMAccessKeySecret)
+	client, e := sts.NewClientWithAccessKey("cn-shanghai", utils.RAMAccessKeyId, utils.RAMAccessKeySecret)
 	if e != nil {
 		err = errors.New("NewSTSToken NewClient Err: " + e.Error())
 		return
 	}
 	request := sts.CreateAssumeRoleRequest()
-	request.Scheme = "https"
+	request.Scheme = utils.AliStsScheme
 	request.RegionId = utils.RegionId
 	request.RoleArn = utils.RoleArn
 	now := time.Now().Format(utils.FormatDateTimeUnSpace)
 	request.RoleSessionName = utils.RoleSessionName + now
 	request.DurationSeconds = "3600"
+	request.ConnectTimeout = 300 * time.Second
+	request.ReadTimeout = 300 * time.Second
 
 	response, e := client.AssumeRole(request)
 	if e != nil {
@@ -235,6 +241,10 @@ func NewSTSToken() (item *STSToken, err error) {
 		t, _ := time.Parse(time.RFC3339, response.Credentials.Expiration)
 		expiration := t.In(time.Local)
 		item.ExpiredTime = expiration.Format(utils.FormatDateTime)
+		item.RegionId = utils.RegionId
+		item.Bucketname = utils.Bucketname
+		item.Endpoint = utils.Imghost
+		item.Imghost = utils.Imghost
 	}
 	return
 }

+ 0 - 49
services/ppt2img/ppt2img.go

@@ -1,49 +0,0 @@
-package ppt2img
-
-import (
-	"encoding/json"
-	"errors"
-	"eta/eta_mobile/utils"
-	"fmt"
-	"github.com/rdlucklib/rdluck_tools/http"
-<<<<<<< HEAD
-	"eta/eta_mobile/utils"
-=======
->>>>>>> eta/1.4
-)
-
-type Ppt2ImgResponse struct {
-	Ret         int
-	Msg         string
-	ErrMsg      string
-	ErrCode     string
-	Data        []string
-	Success     bool `description:"true 执行成功,false 执行失败"`
-	IsSendEmail bool `description:"true 发送邮件,false 不发送邮件"`
-}
-
-// Ppt2Img ppt转图片
-// @params pptUrl ppt的在线url
-func Ppt2Img(pptUrl string) (resourceUrlList []string, err error) {
-	params := make(map[string]interface{})
-	params["PptUrl"] = pptUrl
-	param, err := json.Marshal(params)
-	if err != nil {
-		utils.FileLog.Info("Ppt2Img json.Marshal Err:" + err.Error())
-		return
-	}
-
-	body, err := http.Post(utils.Ppt2ImageUrl, string(param))
-	var result Ppt2ImgResponse
-	err = json.Unmarshal(body, &result)
-	if err != nil {
-		fmt.Println("err:" + err.Error())
-		return
-	}
-	if result.Ret != 200 {
-		err = errors.New("获取token失败,Err:" + result.Msg)
-		return
-	}
-	resourceUrlList = result.Data
-	return
-}

+ 93 - 0
services/public_api/base_public_api.go

@@ -0,0 +1,93 @@
+package public_api
+
+import (
+	"encoding/json"
+	"errors"
+	"eta/eta_mobile/models"
+	"eta/eta_mobile/services/alarm_msg"
+	"eta/eta_mobile/utils"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"strings"
+)
+
+// SendTemplateMsg 发送微信模板消息
+func SendTemplateMsg(postData string) (err error) {
+	_, err = post(utils.SendWxTemplateMsgUrl, postData)
+	if err != nil {
+		alarm_msg.SendAlarmMsg("SendTemplateMsg http.NewRequest Err:"+err.Error(), 1)
+		return
+	}
+	return
+}
+
+// ReportChapterReq 报告章节id
+type ReportChapterReq struct {
+	ReportChapterId int `description:"报告章节ID"`
+}
+
+// HandleVideoDecibel 处理音频
+func HandleVideoDecibel(reportChapterId int) (err error) {
+	if utils.HandleVideoDecibelUrl == `` {
+		// 处理音频的地址未配置的话,直接返回
+		return
+	}
+	postData := ReportChapterReq{
+		ReportChapterId: reportChapterId,
+	}
+	postDataByte, err := json.Marshal(postData)
+	if err != nil {
+		alarm_msg.SendAlarmMsg("HandleVideoDecibel json.Marshal Err:"+err.Error(), 1)
+		return err
+	}
+	_, err = post(utils.HandleVideoDecibelUrl, string(postDataByte))
+	if err != nil {
+		alarm_msg.SendAlarmMsg("HandleVideoDecibel json.Marshal Err:"+err.Error(), 1)
+		return err
+	}
+	return
+}
+
+type BaseResponse struct {
+	Ret         int
+	Msg         string
+	ErrMsg      string
+	ErrCode     string
+	Data        interface{}
+	Success     bool `description:"true 执行成功,false 执行失败"`
+	IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
+	IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
+}
+
+func post(postUrl, postData string) (result *models.BaseResponse, err error) {
+	body := ioutil.NopCloser(strings.NewReader(postData))
+	client := &http.Client{}
+	req, err := http.NewRequest("POST", postUrl, body)
+	if err != nil {
+		alarm_msg.SendAlarmMsg("post public_api http.NewRequest Err:"+err.Error(), 1)
+		return
+	}
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("Authorization", utils.SendTemplateMsgAuthorization)
+	resp, err := client.Do(req)
+	if err != nil {
+		fmt.Println("http client.Do Err:" + err.Error())
+		return
+	}
+	defer resp.Body.Close()
+	b, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return
+	}
+	result = new(models.BaseResponse)
+	err = json.Unmarshal(b, &result)
+	if err != nil {
+		return
+	}
+	if result.Ret != 200 {
+		err = errors.New(string(b))
+	}
+	return
+}

+ 23 - 9
services/report.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_mobile/models/company"
 	"eta/eta_mobile/models/system"
 	"eta/eta_mobile/services/alarm_msg"
+	"eta/eta_mobile/services/public_api"
 	"eta/eta_mobile/utils"
 	"fmt"
 	"github.com/PuerkitoBio/goquery"
@@ -45,6 +46,10 @@ func GetReportContentSub(content string) (contentSub string, err error) {
 
 // PublishDayWeekReport 发布晨周报
 func PublishDayWeekReport(reportId int) (tips string, err error) {
+	if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox {
+		return
+	}
+
 	report, err := models.GetReportByReportId(reportId)
 	if err != nil {
 		return
@@ -222,16 +227,18 @@ func UpdateReportEs(reportId int, publishState int) (err error) {
 			}
 		}
 	} else {
-		permissionList, tmpErr := models.GetChartPermissionNameFromMappingByKeyword(reportInfo.ClassifyNameSecond, "rddp")
-		if tmpErr != nil {
-			return
-		}
-		categoryArr := make([]string, 0)
-		for i := 0; i < len(permissionList); i++ {
-			categoryArr = append(categoryArr, permissionList[i].PermissionName)
+		if utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox {
+			permissionList, tmpErr := models.GetChartPermissionNameFromMappingByKeyword(reportInfo.ClassifyNameSecond, "rddp")
+			if tmpErr != nil {
+				return
+			}
+			categoryArr := make([]string, 0)
+			for i := 0; i < len(permissionList); i++ {
+				categoryArr = append(categoryArr, permissionList[i].PermissionName)
+			}
+			aliasArr, _ := addCategoryAliasToArr(categoryArr)
+			categories = strings.Join(aliasArr, ",")
 		}
-		aliasArr, _ := addCategoryAliasToArr(categoryArr)
-		categories = strings.Join(aliasArr, ",")
 	}
 
 	// 新增报告ES
@@ -732,3 +739,10 @@ func SaveReportLogs(item *models.Report, chapters []*models.ReportChapter, admin
 	}
 	return
 }
+
+// HandleVideoDecibel 处理报告中的音频文件
+func HandleVideoDecibel(chapterInfo *models.ReportChapter) {
+	public_api.HandleVideoDecibel(chapterInfo.ReportChapterId)
+
+	return
+}

+ 56 - 0
services/system.go

@@ -0,0 +1,56 @@
+package services
+
+import (
+	"eta/eta_mobile/models/company"
+	"eta/eta_mobile/models/system"
+)
+
+// CheckAdminIsSameBigGroup 判断是否两个系统用户是否同一个大组内
+func CheckAdminIsSameBigGroup(adminInfo1, adminInfo2 *system.Admin) (isSame bool, err error) {
+	// 如果销售和创建人是同一个小组
+	if adminInfo1.GroupId == adminInfo2.GroupId {
+		isSame = true
+		return
+	}
+	var admin1BigGroupId, admin2BigGroupId int
+
+	//获取第一个系统用户的大组id
+	{
+		//获取该账号的大组id
+		pid, tmpErr := company.GetParentIdFromGroup(adminInfo1.GroupId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		if pid != nil && *pid > 0 {
+			//该账号放在了三级分组下
+			admin1BigGroupId = *pid
+		} else {
+			//该账号放在了二级分组下
+			admin1BigGroupId = adminInfo1.GroupId
+		}
+	}
+
+	//获取第二个系统用户的大组id
+	{
+		//获取该账号的大组id
+		pid, tmpErr := company.GetParentIdFromGroup(adminInfo2.GroupId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		if pid != nil && *pid > 0 {
+			//该账号放在了三级分组下
+			admin2BigGroupId = *pid
+		} else {
+			//该账号放在了二级分组下
+			admin2BigGroupId = adminInfo2.GroupId
+		}
+	}
+
+	if admin1BigGroupId == admin2BigGroupId {
+		isSame = true
+		return
+	}
+	return
+}

+ 29 - 8
services/user_login.go

@@ -79,24 +79,45 @@ func SendAdminEmailVerifyCode(source int, email string) (ok bool, err error) {
 	}
 
 	// 获取邮箱模板
-	confKey := "admin_verify_code_email_tmp"
-	confTmp, e := company.GetConfigDetailByCode(confKey)
+	// 获取配置好的短信模版
+	cond := ` AND (conf_key = ? OR conf_key = ?)`
+	pars := make([]interface{}, 0)
+	pars = append(pars, "LoginEmailTemplateSubject", "LoginEmailTemplateContent")
+	busiConf := new(models.BusinessConf)
+	emailConfList, e := busiConf.GetItemsByCondition(cond, pars, []string{"conf_key, conf_val"}, "")
 	if e != nil {
-		err = fmt.Errorf("获取邮件模板失败, Err: %s", e.Error())
+		if e.Error() == utils.ErrNoRow() {
+			err = fmt.Errorf("请先配置邮件模版")
+			return
+		}
+		err = fmt.Errorf("获取邮件模版失败, Err: %s", e.Error())
 		return
 	}
-	if confTmp.ConfigValue == `` {
-		err = fmt.Errorf("邮件模板为空, 不可推送")
+	var emaiContent, emailSubject string
+	for _, v := range emailConfList {
+		if v.ConfKey == "LoginEmailTemplateContent" {
+			emaiContent = v.ConfVal
+		} else if v.ConfKey == "LoginEmailTemplateSubject" {
+			emailSubject = v.ConfVal
+		}
+	}
+	if emailSubject == "" {
+		err = fmt.Errorf("请先配置邮件模版主题")
+		return
+	}
+	if emaiContent == "" {
+		err = fmt.Errorf("请先配置邮件模版内容")
 		return
 	}
 
 	req := new(EnglishReportSendEmailRequest)
-	req.Subject = "弘则研究登录验证"
+	req.Subject = emailSubject
 	req.Email = email
+	// todo 发信人昵称
 	req.FromAlias = conf.FromAlias
 	// 填充模板
 	t := time.Now().Format("2006年01月02日")
-	ct := confTmp.ConfigValue
+	ct := emaiContent
 	ct = strings.Replace(ct, "{{VERIFY_CODE}}", verifyCode, 1)
 	ct = strings.Replace(ct, "{{EXPIRED_MINUTE}}", strconv.Itoa(utils.VerifyCodeExpireMinute), 1)
 	ct = strings.Replace(ct, "{{DATE_TIME}}", t, 1)
@@ -120,4 +141,4 @@ func SendAdminEmailVerifyCode(source int, email string) (ok bool, err error) {
 		err = fmt.Errorf("更新验证码记录失败, Err: %s", e.Error())
 	}
 	return
-}
+}

+ 43 - 6
services/video.go

@@ -9,6 +9,7 @@ import (
 	"eta/eta_mobile/models"
 	"eta/eta_mobile/services/alarm_msg"
 	"eta/eta_mobile/utils"
+	"fmt"
 	"github.com/PuerkitoBio/goquery"
 	"github.com/kgiannakakis/mp3duration/src/mp3duration"
 	"html"
@@ -28,6 +29,24 @@ func CreateVideo(report *models.ReportDetail) (err error) {
 			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "Err:"+err.Error(), utils.EmailSendToUsers)
 		}
 	}()
+
+	// 获取基础配置, 若未配置则直接返回
+	conf, e := models.GetBusinessConf()
+	if e != nil {
+		err = fmt.Errorf("获取基础配置失败, Err: " + e.Error())
+		return
+	}
+	if conf[models.BusinessConfUseXf] != "true" {
+		return
+	}
+	if conf[models.BusinessConfXfAppid] == "" || conf[models.BusinessConfXfApiKey] == "" || conf[models.BusinessConfXfApiSecret] == "" || conf[models.BusinessConfXfVcn] == "" {
+		return
+	}
+	var xfReq XfParams
+	xfReq.XfAPPID = conf[models.BusinessConfXfAppid]
+	xfReq.XfAPIKey = conf[models.BusinessConfXfApiKey]
+	xfReq.XfAPISecret = conf[models.BusinessConfXfApiSecret]
+
 	ct, err := time.Parse(utils.FormatDateTime, report.CreateTime)
 	createTime := ct.Format("0102")
 	videoName := report.Title + "(" + createTime + ")"
@@ -42,11 +61,11 @@ func CreateVideo(report *models.ReportDetail) (err error) {
 	}
 
 	param := new(models.XfSendParam)
-	param.Common.AppId = utils.XfAPPID
+	param.Common.AppId = conf[models.BusinessConfXfAppid]
 	param.Business.Aue = "lame"
 	param.Business.Sfl = 1
 	param.Business.Auf = "audio/L16;rate=16000"
-	param.Business.Vcn = utils.XfVcn
+	param.Business.Vcn = conf[models.BusinessConfXfVcn]
 	param.Business.Speed = 50
 	param.Business.Volume = 100
 	param.Business.Pitch = 50
@@ -70,7 +89,7 @@ func CreateVideo(report *models.ReportDetail) (err error) {
 		if err != nil {
 			return err
 		}
-		err = GetXfVideo(result, savePath)
+		err = GetXfVideo(result, savePath, xfReq)
 		if err != nil {
 			err = errors.New("GetXfVideo Err:" + err.Error())
 			utils.FileLog.Error("GetXfVideo err", err.Error())
@@ -198,6 +217,24 @@ func CreateReportVideo(reportTitle, reportContent, reportTime string) (uploadUrl
 	if reportContent == "" {
 		return
 	}
+
+	// 获取基础配置, 若未配置则直接返回
+	conf, e := models.GetBusinessConf()
+	if e != nil {
+		err = fmt.Errorf("获取基础配置失败, Err: " + e.Error())
+		return
+	}
+	if conf[models.BusinessConfUseXf] != "true" {
+		return
+	}
+	if conf[models.BusinessConfXfAppid] == "" || conf[models.BusinessConfXfApiKey] == "" || conf[models.BusinessConfXfApiSecret] == "" || conf[models.BusinessConfXfVcn] == "" {
+		return
+	}
+	var xfReq XfParams
+	xfReq.XfAPPID = conf[models.BusinessConfXfAppid]
+	xfReq.XfAPIKey = conf[models.BusinessConfXfApiKey]
+	xfReq.XfAPISecret = conf[models.BusinessConfXfApiSecret]
+
 	ct, err := time.Parse(utils.FormatDateTime, reportTime)
 	if err != nil {
 		return
@@ -215,11 +252,11 @@ func CreateReportVideo(reportTitle, reportContent, reportTime string) (uploadUrl
 	}
 
 	param := new(models.XfSendParam)
-	param.Common.AppId = utils.XfAPPID
+	param.Common.AppId = conf[models.BusinessConfXfAppid]
 	param.Business.Aue = "lame"
 	param.Business.Sfl = 1
 	param.Business.Auf = "audio/L16;rate=16000"
-	param.Business.Vcn = utils.XfVcn
+	param.Business.Vcn = conf[models.BusinessConfXfVcn]
 	param.Business.Speed = 50
 	param.Business.Volume = 100
 	param.Business.Pitch = 50
@@ -243,7 +280,7 @@ func CreateReportVideo(reportTitle, reportContent, reportTime string) (uploadUrl
 		if tmpErr != nil {
 			return
 		}
-		err = GetXfVideo(result, savePath)
+		err = GetXfVideo(result, savePath, xfReq)
 		if err != nil {
 			err = errors.New("GetXfVideo Err:" + err.Error())
 			utils.FileLog.Error("GetXfVideo err", err.Error())

+ 4 - 0
services/wechat_send_msg.go

@@ -15,6 +15,10 @@ import (
 
 // SendMiniProgramReportWxMsg 推送报告微信模板消息-小程序链接
 func SendMiniProgramReportWxMsg(reportId int) (err error) {
+	if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox {
+		return
+	}
+
 	var msg string
 	reportIdStr := strconv.Itoa(reportId)
 	defer func() {

+ 11 - 5
services/xfyun.go

@@ -14,9 +14,15 @@ import (
 	"github.com/gorilla/websocket"
 )
 
+type XfParams struct {
+	XfAPPID     string
+	XfAPIKey    string
+	XfAPISecret string
+}
+
 // 科大讯飞,语音合成
-func GetXfVideo(body []byte, savePath string) (err error) {
-	path, err := assembleAuthUrl()
+func GetXfVideo(body []byte, savePath string, req XfParams) (err error) {
+	path, err := assembleAuthUrl(req)
 	if err != nil {
 		return
 	}
@@ -79,7 +85,7 @@ webSocketClose:
 // @hosturl :  like  wss://iat-api.xfyun.cn/v2/iat
 // @apikey : apiKey
 // @apiSecret : apiSecret
-func assembleAuthUrl() (callUrl string, err error) {
+func assembleAuthUrl(req XfParams) (callUrl string, err error) {
 	ul, err := url.Parse(utils.XfHostUrl)
 	if err != nil {
 		return
@@ -92,9 +98,9 @@ func assembleAuthUrl() (callUrl string, err error) {
 	sign := strings.Join(signString, "\n")
 	fmt.Println("sign:", sign)
 	//签名结果
-	sha := crypt.HmacSha256EncryptToBase64([]byte(sign), []byte(utils.XfAPISecret))
+	sha := crypt.HmacSha256EncryptToBase64([]byte(sign), []byte(req.XfAPISecret))
 	//构建请求参数 此时不需要urlencoding
-	authUrl := fmt.Sprintf("api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"", utils.XfAPIKey,
+	authUrl := fmt.Sprintf("api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"", req.XfAPIKey,
 		"hmac-sha256", "host date request-line", sha)
 	//将请求参数使用base64编码
 	authorization := base64.StdEncoding.EncodeToString([]byte(authUrl))

+ 63 - 78
utils/config.go

@@ -9,32 +9,26 @@ import (
 )
 
 var (
-	RunMode               string //运行模式
-	MYSQL_URL             string //数据库连接
-	MYSQL_URL_RDDP        string //数据库连接
-	MYSQL_URL_EDB         string
-	MYSQL_URL_DATA        string
-	MYSQL_URL_GL          string
-	MYSQL_LOG_URL         string
-	MYSQL_URL_COMEIN_DATA string // 路演记录数据库
-	MYSQL_URL_ETA         string
+	RunMode          string //运行模式
+	MYSQL_URL        string //数据库连接
+	MYSQL_URL_RDDP   string //数据库连接
+	MYSQL_URL_EDB    string
+	MYSQL_URL_DATA   string
+	MYSQL_URL_GL     string
+	MYSQL_LOG_URL    string
+	MYSQL_WEEKLY_URL string //用户主库
 
 	REDIS_CACHE string       //缓存地址
 	Rc          *cache.Cache //redis缓存
 	Re          error        //redis错误
 )
 
-// SystemType 系统类型; hz:弘则;trial:试用平台;custom:客户
-var SystemType string
-
 // 基础配置
 var (
 	STATIC_DIR       string
 	DesKey           string // 接口返回加密KEY
 	APPNAME          string //项目中文名称
 	EmailSendToUsers string // 邮件提醒人员
-	// LibreOfficePath LibreOfficePath的地址
-	LibreOfficePath string
 )
 
 // 公共api内部服务调用
@@ -56,9 +50,6 @@ var (
 	// HandleVideoDecibelUrl 处理音频分贝的url
 	HandleVideoDecibelUrl string
 
-	// Ppt2ImageUrl ppt转图片服务的地址
-	Ppt2ImageUrl string
-
 	// EnglishShareUrl 英文研报群发邮件分享地址
 	EnglishShareUrl string
 
@@ -70,9 +61,7 @@ var (
 var (
 	TemplateIdByProduct string //产品运行报告通知-模板ID
 	WxYbAppId           string // 研报小程序appid
-	WxYbId              string // 研报小程序微信原始ID
 	WxYbAppSecret       string // 研报小程序秘钥
-	WxYbPlatform        int    //弘则研报来源
 )
 
 // ES配置
@@ -91,6 +80,11 @@ var (
 	MY_CHART_INDEX_NAME      string //研究图库(MY ETA)索引
 )
 
+// 科大讯飞--语音合成
+var (
+	XfHostUrl string
+)
+
 // 阿里云配置
 var (
 	Bucketname       string
@@ -113,35 +107,17 @@ var (
 	STSTokenCacheKey   string
 )
 
-// 科大讯飞--语音合成
-var (
-	XfSTATUS_FIRST_FRAME    = 0 //第一帧标识
-	XfSTATUS_CONTINUE_FRAME = 1 //中间帧标识
-	XfSTATUS_LAST_FRAME     = 2 //最后一帧标识
-	XfHost                  = "tts-api.xfyun.cn"
-	XfMaxFontSize           = 8000
-	XfAPPID                 string
-	XfAPIKey                string
-	XfAPISecret             string
-	XfHostUrl               string
-	XfOrigin                string
-	XfVcn                   string //发言人
-)
-
 // 阿里云邮箱配置
 var (
-	AliyunEmailAccountName       string
-	AliyunEmailAccessKeyId       string
-	AliyunEmailAccessKeySecret   string
-	AliyunEmailReplyAddress      string
-	AliyunEmailReplyAddressAlias string
+	AliyunEmailAccountName     string
+	AliyunEmailAccessKeyId     string
+	AliyunEmailAccessKeySecret string
 )
 
 // 腾讯云邮箱配置
 var (
-	TencentSDKSecretId  string // 腾讯云主账号SecretId
-	TencentSDKSecretKey string // 腾讯云主账号SecretKey
-
+	TencentSDKSecretId           string // 腾讯云主账号SecretId
+	TencentSDKSecretKey          string // 腾讯云主账号SecretKey
 	TencentEmailFromEmailAddress string // 腾讯云邮件发信地址
 	TencentEmailTemplateID       uint64 // 云邮件模板ID
 )
@@ -159,6 +135,28 @@ var (
 	LogMaxDays  int //日志最大保留天数
 )
 
+// BusinessCode 商家编码
+var BusinessCode string
+
+// MinIo配置
+var (
+	MinIoBucketname       string
+	MinIoEndpoint         string
+	MinIoImghost          string
+	MinIoUploadDir        string
+	MinIoUpload_Audio_Dir string
+	MinIoAccessKeyId      string
+	MinIoAccessKeySecret  string
+	MinIoUseSSL           string
+	MinIoPort             string
+	MinIoRegion           string
+)
+
+// 对象存储客户端
+var (
+	ObjectStorageClient string       // 目前有oss minio,默认oss
+)
+
 func init() {
 	tmpRunMode, err := web.AppConfig.String("run_mode")
 	if err != nil {
@@ -194,8 +192,7 @@ func init() {
 	MYSQL_URL_DATA = config["mysql_url_data"]
 	MYSQL_URL_GL = config["mysql_url_gl"]
 	MYSQL_LOG_URL = config["mysql_url_log"]
-	MYSQL_URL_COMEIN_DATA = config["mysql_url_comein_data"]
-	MYSQL_URL_ETA = config["mysql_url_eta"]
+	MYSQL_WEEKLY_URL = config["mysql_url_weekly"]
 
 	REDIS_CACHE = config["beego_cache"]
 	if len(REDIS_CACHE) <= 0 {
@@ -207,13 +204,6 @@ func init() {
 		panic(Re)
 	}
 
-	// 系统类型
-	systemType, err := web.AppConfig.String("system_type")
-	if err != nil {
-		panic(any("配置文件读取system_type错误 " + err.Error()))
-	}
-	SystemType = systemType
-
 	// 项目中文名称
 	appNameCn, err := web.AppConfig.String("app_name_cn")
 	if err != nil {
@@ -226,14 +216,11 @@ func init() {
 	// 接口返回加密KEY
 	DesKey = config["des_key"]
 
-	// 服务基本配置
-	{
-		// 邮件提醒人员
-		EmailSendToUsers = config["email_send_to_users"]
+	// 邮件提醒人员
+	EmailSendToUsers = config["email_send_to_users"]
 
-		// 静态文件目录
-		STATIC_DIR = config["static_dir"]
-	}
+	// 静态文件目录
+	STATIC_DIR = config["static_dir"]
 
 	// 系统内部服务地址
 	{
@@ -259,9 +246,6 @@ func init() {
 
 		// 报警服务地址
 		AlarmMsgUrl = config["alarm_msg_url"]
-
-		// ppt 转图片服务地址
-		Ppt2ImageUrl = config["ppt2_image_url"]
 	}
 	//日志配置
 	{
@@ -298,17 +282,12 @@ func init() {
 		//模板消息
 		TemplateIdByProduct = config["template_id_by_product"]
 		WxYbAppId = config["wx_yb_appid"]          //弘则研报小程序
-		WxYbId = config["wx_yb_id"]                // 研报小程序微信原始ID
 		WxYbAppSecret = config["wx_yb_app_secret"] // 研报小程序秘钥
-		wxYbPlatformStr := config["wx_yb_platform"]
-		if wxYbPlatformStr != `` {
-			WxYbPlatform, err = strconv.Atoi(wxYbPlatformStr) //弘则研报来源
-			if err != nil {
-				panic(any("配置文件读取wx_yb_platform错误 " + err.Error()))
-			}
-		}
 	}
 
+	// 对象存储客户端
+	ObjectStorageClient = config["object_storage_client"]
+
 	// OSS相关
 	{
 		Endpoint = config["endpoint"]
@@ -336,8 +315,6 @@ func init() {
 		AliyunEmailAccountName = config["aliyun_email_account_name"]
 		AliyunEmailAccessKeyId = config["aliyun_email_access_key_id"]
 		AliyunEmailAccessKeySecret = config["aliyun_email_access_key_secret"]
-		AliyunEmailReplyAddress = config["aliyun_email_reply_address"]
-		AliyunEmailReplyAddressAlias = config["aliyun_email_reply_address_alias"]
 	}
 
 	// 腾讯云邮箱配置
@@ -358,16 +335,24 @@ func init() {
 
 	// 科大讯飞
 	{
-
-		XfAPPID = config["xf_appid"]
-		XfAPIKey = config["xf_api_key"]
-		XfAPISecret = config["xf_api_secret"]
 		XfHostUrl = config["xf_host_url"]
-		XfOrigin = config["xf_origin"]
-		XfVcn = config["xf_vcn"]
 	}
 
-	LibreOfficePath = config["libre_office_path"]
+	// MinIo相关
+	{
+		MinIoEndpoint = config["minio_endpoint"]
+		MinIoBucketname = config["minio_bucket_name"]
+		MinIoImghost = config["minio_img_host"]
+		MinIoUploadDir = config["minio_upload_dir"]
+		MinIoUpload_Audio_Dir = config["minio_upload_audio_dir"]
+		MinIoAccessKeyId = config["minio_access_key_id"]
+		MinIoAccessKeySecret = config["minio_access_key_secret"]
+		MinIoUseSSL = config["minio_use_ssl"]
+		MinIoPort = config["minio_port"]
+		MinIoRegion = config["minio_region"]
+	}
+	// 商家编码
+	BusinessCode = config["business_code"]
 
 	// 初始化ES
 	initEs()

+ 16 - 0
utils/constants.go

@@ -351,6 +351,7 @@ const (
 	SmsNewLoginTplId       = "254663"            // 【弘则研究】您的验证码是XXX,有效期15分钟
 )
 
+// TODO:2023-0915 聚合短信相关配置在ETA1.0.6版本中被改成了商家配置, 还未上线, 上线后这里也改成配置
 // 聚合短信
 var (
 	JhGnAppKey = "4c8504c49dd335e99cfd7b6a3a9e2415" //聚合国内AppKey
@@ -361,3 +362,18 @@ const LoginCacheTime = 60 // 登录缓存时长, 分钟
 
 // DIR_MOD 目录创建权限
 const DIR_MOD fs.FileMode = 0766 // Unix permission bits
+
+// 自用商户号
+const (
+	BusinessCodeSandbox = "E2023080700" // 试用平台
+	BusinessCodeRelease = "E2023080900" // 生产环境
+)
+
+// BusinessCodeSalt 商家编码盐值
+const BusinessCodeSalt = "dr7WY0OZgGR7upw1"
+
+// 对象存储客户端
+const (
+	STORAGESOURCE_OSS   = 1 //阿里云OSS
+	STORAGESOURCE_MINIO = 2 //MinIo
+)

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff