Преглед изворни кода

Merge branch 'feature/forum4.1_ai_predict_model' into debug

xyxie пре 3 дана
родитељ
комит
717ccdb23c

+ 220 - 1
controllers/eta_business/eta_business.go

@@ -10,11 +10,12 @@ import (
 	etaBusinessService "eta/eta_forum_admin/services/eta_business"
 	"eta/eta_forum_admin/utils"
 	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"sort"
 	"strconv"
 	"strings"
 	"time"
+
+	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
 // EtaBusinessController ETA商家
@@ -2037,3 +2038,221 @@ func (this *EtaBusinessController) AddReportPermission() {
 	br.IsAddLog = true
 	br.Msg = "操作成功"
 }
+
+// @Title 设置社区AI预测模型分类权限
+// @Description 设置社区AI预测模型分类权限
+// @Param	request	body eta_business.AddBusinessAiPredictModelPermissionReq true "type json string"
+// @Success 200 {object} system.SysRoleListResp
+// @router /add_ai_predict_model_permission [post]
+func (this *EtaBusinessController) AddAiPredictModelPermission() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		return
+	}
+	var req eta_business.AddBusinessAiPredictModelPermissionReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EtaBusinessId <= 0 {
+		br.Msg = "请选择商户"
+		return
+	}
+
+	// 权限校验
+	ok, e := etaBusinessService.CheckEtaBusinessOperateAuth(sysUser.RoleTypeCode)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作权限校验失败, ErrMsg: " + e.Error()
+		return
+	}
+	if !ok {
+		br.Msg = "无权操作"
+		return
+	}
+
+	ob := new(eta_business.EtaBusiness)
+	businessInfo, e := ob.GetItemById(req.EtaBusinessId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "商家不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "获取商家信息失败"
+		br.ErrMsg = "获取商家信息失败, Err: " + e.Error()
+		return
+	}
+	classifyIds := strings.Split(req.AiPredictModelClassifyIds, ",")
+	addList := make([]*eta_business.BusinessAiPredictModelPermission, 0)
+	for _, v := range classifyIds {
+		if v == "" {
+			continue
+		}
+		classifyId, e := strconv.Atoi(v)
+		if e != nil {
+			br.Msg = "设置AI预测模型权限失败"
+			br.ErrMsg = "classifyId 解析失败,Err:" + e.Error()
+			return
+		}
+		item := new(eta_business.BusinessAiPredictModelPermission)
+		item.AiPredictModelClassifyId = classifyId
+		item.BusinessCode = businessInfo.BusinessCode
+		item.EtaBusinessId = req.EtaBusinessId
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+		item.AdminId = sysUser.AdminId
+		addList = append(addList, item)
+	}
+
+	err = eta_business.AddBusinessAiPredictModelPermission(addList, businessInfo.BusinessCode)
+	if err != nil {
+		br.Msg = "设置AI预测模型权限失败"
+		br.ErrMsg = "设置AI预测模型权限失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "设置成功"
+}
+
+// @Title 获取社区AI预测模型分类权限
+// @Description 获取社区AI预测模型分类权限
+// @Param	request	body eta_business.AddBusinessAiPredictModelPermissionReq true "type json string"
+// @Success 200 {object} system.SysRoleListResp
+// @router /get_ai_predict_model_permission [get]
+func (this *EtaBusinessController) GetAiPredictModelPermission() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		return
+	}
+	keyword := this.GetString("Keyword")
+	etaBusinessId, _ := this.GetInt("EtaBusinessId")
+	if etaBusinessId <= 0 {
+		br.Msg = "请选择商户"
+		return
+	}
+	// 权限校验
+	ok, e := etaBusinessService.CheckEtaBusinessOperateAuth(sysUser.RoleTypeCode)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作权限校验失败, ErrMsg: " + e.Error()
+		return
+	}
+	if !ok {
+		br.Msg = "无权操作"
+		return
+	}
+
+	ob := new(eta_business.EtaBusiness)
+	businessInfo, e := ob.GetItemById(etaBusinessId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "商家不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "获取商家信息失败"
+		br.ErrMsg = "获取商家信息失败, Err: " + e.Error()
+		return
+	}
+	permissionList, err := eta_business.GetBusinessAiPredictModelPermission(businessInfo.EtaBusinessId)
+	if err != nil {
+		br.Msg = "获取AI预测模型权限失败"
+		br.ErrMsg = "获取AI预测模型权限失败,Err:" + err.Error()
+		return
+	}
+	permissionClassifyIdsMap := make(map[int]struct{})
+	checkList := make([]int, 0)
+	for _, v := range permissionList {
+		if _, ok1 := permissionClassifyIdsMap[v.AiPredictModelClassifyId]; !ok1 {
+			permissionClassifyIdsMap[v.AiPredictModelClassifyId] = struct{}{}
+			checkList = append(checkList, v.AiPredictModelClassifyId)
+		}
+	}
+	allList := make([]*models.AiPredictModelClassifyItems, 0)
+	keywordClassifyIdMap := make(map[int]struct{})
+	keywordClassifyIds := make([]int, 0)
+	if keyword != "" {
+		keywordList, e := models.GetAiPredictModelClassifyListByKeyword(keyword)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + e.Error()
+			return
+		}
+		for _, v := range keywordList {
+			if _, ok1 := keywordClassifyIdMap[v.AiPredictModelClassifyId]; !ok1 {
+				keywordClassifyIdMap[v.AiPredictModelClassifyId] = struct{}{}
+				// 解析当前的父级路径,找到路径下的所有分类
+				if v.LevelPath == "" {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取失败,Err: 分类的父级路径为空"
+					return
+				}
+				paths := strings.Split(v.LevelPath, ",")
+				for _, path := range paths {
+					if path != "" {
+						pathInt, _ := strconv.Atoi(path)
+						if _, ok2 := keywordClassifyIdMap[pathInt]; !ok2 {
+							keywordClassifyIdMap[pathInt] = struct{}{}
+						}
+					}
+				}
+			}
+		}
+		for k := range keywordClassifyIdMap {
+			keywordClassifyIds = append(keywordClassifyIds, k)
+		}
+		if len(keywordClassifyIds) > 0 {
+			allList, err = models.GetAiPredictModelClassifyItemsByIdList(keywordClassifyIds)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取数据失败,Err:" + err.Error()
+				return
+			}
+		}
+	} else {
+		allList, err = models.GetAiPredictModelClassify()
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取数据失败,Err:" + err.Error()
+			return
+		}
+	}
+
+	nodeAll := make([]*models.AiPredictModelClassifyItems, 0)
+	list := make([]*models.AiPredictModelClassifyItems, 0)
+	var sortList models.AiPredictModelClassifyItemList
+
+	if len(allList) > 0 {
+		nodeAll = services.GetAiPredictModelClassifyTreeRecursive(allList, 0)
+		//根据sort值排序
+		sortList = nodeAll
+		sort.Sort(sortList)
+	}
+
+	list = append(list, sortList...)
+	resp := new(models.BusinessAiPredictModelClassifyResp)
+	resp.List = list
+	resp.CheckList = checkList
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 57 - 0
models/ai_predict_model_classify.go

@@ -0,0 +1,57 @@
+package models
+
+import (
+	"eta/eta_forum_admin/utils"
+
+	"github.com/beego/beego/v2/client/orm"
+)
+
+// AI预测模型分类项
+type AiPredictModelClassifyItems struct {
+	AiPredictModelClassifyId int    `json:"ai_predict_model_classify_id" orm:"column(ai_predict_model_classify_id)"`
+	ClassifyName             string `json:"classify_name"`             // 分类名称
+	ParentId                 int    `json:"parent_id"`               // 父级ID
+	LevelPath               string `json:"level_path"`              // 层级路径
+	Sort                    int    `json:"sort"`                    // 排序
+}
+
+// AI预测模型分类列表
+type AiPredictModelClassifyItemList []*AiPredictModelClassifyItems
+
+// 实现sort.Interface接口
+func (s AiPredictModelClassifyItemList) Len() int           { return len(s) }
+func (s AiPredictModelClassifyItemList) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
+func (s AiPredictModelClassifyItemList) Less(i, j int) bool { return s[i].Sort < s[j].Sort }
+
+// 商家AI预测模型分类响应
+type BusinessAiPredictModelClassifyResp struct {
+	List      []*AiPredictModelClassifyItems `json:"list"`       // 分类列表
+	CheckList []int                          `json:"check_list"` // 已选中的分类ID列表
+}
+
+// 根据关键字获取AI预测模型分类列表
+func GetAiPredictModelClassifyListByKeyword(keyword string) (list []*AiPredictModelClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM ai_predict_model_classify WHERE classify_name LIKE ?`
+	_, err = o.Raw(sql, "%"+keyword+"%").QueryRows(&list)
+	return
+}
+
+// 根据ID列表获取AI预测模型分类列表
+func GetAiPredictModelClassifyItemsByIdList(ids []int) (list []*AiPredictModelClassifyItems, err error) {
+	if len(ids) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM ai_predict_model_classify WHERE ai_predict_model_classify_id IN (`+utils.GetOrmInReplace(len(ids))+`)`
+	_, err = o.Raw(sql, ids).QueryRows(&list)
+	return
+}
+
+// 获取所有AI预测模型分类
+func GetAiPredictModelClassify() (list []*AiPredictModelClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM ai_predict_model_classify ORDER BY sort ASC, ai_predict_model_classify_id ASC`
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}

+ 7 - 0
models/db.go

@@ -28,6 +28,12 @@ func init() {
 	weeklyDb, _ := orm.GetDB("weekly")
 	weeklyDb.SetConnMaxLifetime(10 * time.Minute)
 
+	_ = orm.RegisterDataBase("data", "mysql", utils.MYSQL_URL_DATA)
+	orm.SetMaxIdleConns("data", 50)
+	orm.SetMaxOpenConns("data", 100)
+	
+	
+
 	orm.Debug = true
 	orm.DebugLog = orm.NewLog(utils.Binlog)
 
@@ -100,6 +106,7 @@ func initEtaBusiness() {
 		new(User),                                         // 商家用户表
 		new(eta_business.BusinessChartClassifyPermission), //商家图表权限表
 		new(eta_business.BusinessReportPermission),        // 商家报告权限表
+		new(eta_business.BusinessAiPredictModelPermission), // 商家AI预测模型权限表
 	)
 }
 

+ 57 - 0
models/eta_business/business_ai_predict_model_permission.go

@@ -0,0 +1,57 @@
+package eta_business
+
+import (
+	"time"
+
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type BusinessAiPredictModelPermission struct {
+	AiPredictModelPermissionId int       `orm:"column(ai_predict_model_permission_permission_id);pk"`
+	AiPredictModelClassifyId   int       `description:"AI预测模型分类ID"`
+	BusinessCode              string    `description:"商户号"`
+	EtaBusinessId             int       `description:"商家ID"`
+	AdminId                   int       `description:"系统用户Id"`
+	ModifyTime                time.Time `description:"变更时间"`
+	CreateTime                time.Time `description:"关系建立时间"`
+}
+
+func AddBusinessAiPredictModelPermission(list []*BusinessAiPredictModelPermission, businessCode string) (err error) {
+	// 事务,先执行删除,再新增
+	o := orm.NewOrm()
+
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	sql := `DELETE FROM business_ai_predict_model_permission WHERE business_code = ?`
+	_, err = to.Raw(sql, businessCode).Exec()
+	if err != nil {
+		return
+	}
+	if len(list) > 0 {
+		_, err = o.InsertMulti(len(list), list)
+		return
+	}
+	return
+}
+
+type AddBusinessAiPredictModelPermissionReq struct {
+	EtaBusinessId             int    `description:"商家ID"`
+	AiPredictModelClassifyIds string `description:"AI预测模型分类ID,多个用英文逗号隔开"`
+}
+
+// 获取商家AI预测模型权限
+func GetBusinessAiPredictModelPermission(businessId int) (list []*BusinessAiPredictModelPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM business_ai_predict_model_permission WHERE eta_business_id = ?`
+	_, err = o.Raw(sql, businessId).QueryRows(&list)
+	return
+} 

+ 18 - 0
routers/commentsRouter.go

@@ -16,6 +16,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_forum_admin/controllers/eta_business:EtaBusinessController"] = append(beego.GlobalControllerRouter["eta/eta_forum_admin/controllers/eta_business:EtaBusinessController"],
+        beego.ControllerComments{
+            Method: "AddAiPredictModelPermission",
+            Router: `/add_ai_predict_model_permission`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_forum_admin/controllers/eta_business:EtaBusinessController"] = append(beego.GlobalControllerRouter["eta/eta_forum_admin/controllers/eta_business:EtaBusinessController"],
         beego.ControllerComments{
             Method: "AddChartPermission",
@@ -79,6 +88,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_forum_admin/controllers/eta_business:EtaBusinessController"] = append(beego.GlobalControllerRouter["eta/eta_forum_admin/controllers/eta_business:EtaBusinessController"],
+        beego.ControllerComments{
+            Method: "GetAiPredictModelPermission",
+            Router: `/get_ai_predict_model_permission`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_forum_admin/controllers/eta_business:EtaBusinessController"] = append(beego.GlobalControllerRouter["eta/eta_forum_admin/controllers/eta_business:EtaBusinessController"],
         beego.ControllerComments{
             Method: "GetChartPermission",

+ 24 - 0
services/ai_predict_model_classify_service.go

@@ -0,0 +1,24 @@
+package services
+
+import (
+	"eta/eta_forum_admin/models"
+)
+
+// 递归获取AI预测模型分类树
+func GetAiPredictModelClassifyTreeRecursive(allList []*models.AiPredictModelClassifyItems, parentId int) []*models.AiPredictModelClassifyItems {
+	result := make([]*models.AiPredictModelClassifyItems, 0)
+	for _, item := range allList {
+		if item.ParentId == parentId {
+			children := GetAiPredictModelClassifyTreeRecursive(allList, item.AiPredictModelClassifyId)
+			if len(children) > 0 {
+				// 如果有子节点,将子节点添加到当前节点
+				result = append(result, item)
+				result = append(result, children...)
+			} else {
+				// 如果没有子节点,直接添加当前节点
+				result = append(result, item)
+			}
+		}
+	}
+	return result
+} 

+ 2 - 1
utils/config.go

@@ -13,6 +13,7 @@ var (
 	APP_NAME_CN      string
 	MYSQL_URL        string        //数据库连接
 	MYSQL_WEEKLY_URL string        //用户主库
+	MYSQL_URL_DATA   string        //数据主库
 	Re               error         //redis错误
 	Rc               RedisClient   //redis缓存
 	MgoUrlData       string        // mongodb数据库连接配置
@@ -168,7 +169,7 @@ func init() {
 	APP_NAME_CN = appNameCn
 	MYSQL_URL = config["mysql_url"]
 	MYSQL_WEEKLY_URL = config["mysql_url_weekly"]
-
+	MYSQL_URL_DATA = config["mysql_url_data"]
 	// mongodb数据库连接配置
 	MgoUrlData = config["mgo_url_data"]
 	//日志配置