Răsfoiți Sursa

同步接口

ziwen 1 an în urmă
părinte
comite
e8eb2793e8

+ 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
+}

Fișier diff suprimat deoarece este prea mare
+ 3 - 0
log/api/apilog.log


+ 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
+}

+ 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
+}

+ 36 - 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",

+ 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
+}

+ 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
+}

+ 4 - 1
utils/constants.go

@@ -367,4 +367,7 @@ const DIR_MOD fs.FileMode = 0766 // Unix permission bits
 const (
 	BusinessCodeSandbox = "E2023080700" // 试用平台
 	BusinessCodeRelease = "E2023080900" // 生产环境
-)
+)
+
+// BusinessCodeSalt 商家编码盐值
+const BusinessCodeSalt = "dr7WY0OZgGR7upw1"

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff