Browse Source

feature(权限): 修复dataScope浅拷贝问题

ZZH-wl 2 years ago
parent
commit
12395aa3dd

+ 3 - 1
opms_parent/app/dao/contract/internal/ctr_contract_collection.go

@@ -708,7 +708,7 @@ func (d *CtrContractCollectionDao) Unscoped() *CtrContractCollectionDao {
 // DataScope enables the DataScope feature.
 func (d *CtrContractCollectionDao) DataScope(ctx context.Context, args ...interface{}) *CtrContractCollectionDao {
 	cs := ctx.Value("contextService")
-	dataScope := gconv.Map(cs)["dataScope"].(g.Map)
+	dataScope := gconv.Map(gconv.String(gconv.Map(cs)["dataScope"]))
 	if dataScope != nil {
 		var specialFlag bool
 		var tableAs string
@@ -738,6 +738,8 @@ func (d *CtrContractCollectionDao) DataScope(ctx context.Context, args ...interf
 		// 销售工程师判断
 		var salesEngineerFlag bool
 		if roles, ok := dataScope["roles"]; ok {
+			delete(dataScope, "roles")
+			delete(dataScope, "posts")
 			arr := garray.NewArrayFrom(roles.([]interface{}), true)
 			if arr.Len() == 1 && arr.Contains("SalesEngineer") {
 				salesEngineerFlag = true

+ 4 - 1
opms_parent/app/dao/contract/internal/ctr_contract_collection_plan.go

@@ -705,7 +705,8 @@ func (d *CtrContractCollectionPlanDao) Unscoped() *CtrContractCollectionPlanDao
 // DataScope enables the DataScope feature.
 func (d *CtrContractCollectionPlanDao) DataScope(ctx context.Context, args ...interface{}) *CtrContractCollectionPlanDao {
 	cs := ctx.Value("contextService")
-	dataScope := gconv.Map(cs)["dataScope"].(g.Map)
+	dataScope := gconv.Map(gconv.String(gconv.Map(cs)["dataScope"]))
+
 	if dataScope != nil {
 		var specialFlag bool
 		var tableAs string
@@ -735,6 +736,8 @@ func (d *CtrContractCollectionPlanDao) DataScope(ctx context.Context, args ...in
 		// 销售工程师判断
 		var salesEngineerFlag bool
 		if roles, ok := dataScope["roles"]; ok {
+			delete(dataScope, "roles")
+			delete(dataScope, "posts")
 			arr := garray.NewArrayFrom(roles.([]interface{}), true)
 			if arr.Len() == 1 && arr.Contains("SalesEngineer") {
 				salesEngineerFlag = true

+ 3 - 1
opms_parent/app/dao/contract/internal/ctr_contract_invoice.go

@@ -714,7 +714,7 @@ func (d *CtrContractInvoiceDao) Unscoped() *CtrContractInvoiceDao {
 // DataScope enables the DataScope feature.
 func (d *CtrContractInvoiceDao) DataScope(ctx context.Context, args ...interface{}) *CtrContractInvoiceDao {
 	cs := ctx.Value("contextService")
-	dataScope := gconv.Map(cs)["dataScope"].(g.Map)
+	dataScope := gconv.Map(gconv.String(gconv.Map(cs)["dataScope"]))
 	if dataScope != nil {
 		var specialFlag bool
 		var tableAs string
@@ -744,6 +744,8 @@ func (d *CtrContractInvoiceDao) DataScope(ctx context.Context, args ...interface
 		// 销售工程师判断
 		var salesEngineerFlag bool
 		if roles, ok := dataScope["roles"]; ok {
+			delete(dataScope, "roles")
+			delete(dataScope, "posts")
 			arr := garray.NewArrayFrom(roles.([]interface{}), true)
 			if arr.Len() == 1 && arr.Contains("SalesEngineer") {
 				salesEngineerFlag = true

+ 19 - 10
opms_parent/app/dao/proj/internal/proj_business_dynamics.go

@@ -694,13 +694,20 @@ func (d *ProjBusinessDynamicsDao) Unscoped() *ProjBusinessDynamicsDao {
 }
 
 // DataScope enables the DataScope feature.
-func (d *ProjBusinessDynamicsDao) DataScope(ctx context.Context, userCol ...string) *ProjBusinessDynamicsDao {
+func (d *ProjBusinessDynamicsDao) DataScope(ctx context.Context, args ...interface{}) *ProjBusinessDynamicsDao {
 	cs := ctx.Value("contextService")
-	dataScope := gconv.Map(cs)["dataScope"].(g.Map)
+	dataScope := gconv.Map(gconv.String(gconv.Map(cs)["dataScope"]))
 	if dataScope != nil {
-		tableAs := d.TableAs
-		if d.TableAs != "" {
-			tableAs += "."
+		var specialFlag bool
+		var tableAs string
+		if d.TableAs != "" && len(args) <= 1 {
+			tableAs = d.TableAs + "."
+		}
+		if len(args) > 1 {
+			specialFlag = true
+			if val, ok := args[1].(string); ok {
+				tableAs = val + "."
+			}
 		}
 		userIds, ok := dataScope["userIds"]
 		delete(dataScope, "userIds")
@@ -708,10 +715,10 @@ func (d *ProjBusinessDynamicsDao) DataScope(ctx context.Context, userCol ...stri
 		var orValues []interface{}
 		if ok && userIds != "-1" {
 			column := "created_by"
-			if len(userCol) == 1 {
-				column = userCol[0]
+			if len(args) > 0 {
+				column = args[0].(string)
 			}
-			if ok, _ := d.M.HasField(column); ok {
+			if ok, _ := d.M.HasField(column); ok || specialFlag {
 				orColumns = append(orColumns, tableAs+column+" IN (?) ")
 				orValues = append(orValues, userIds)
 			}
@@ -719,6 +726,8 @@ func (d *ProjBusinessDynamicsDao) DataScope(ctx context.Context, userCol ...stri
 		// 销售工程师判断
 		var salesEngineerFlag bool
 		if roles, ok := dataScope["roles"]; ok {
+			delete(dataScope, "roles")
+			delete(dataScope, "posts")
 			arr := garray.NewArrayFrom(roles.([]interface{}), true)
 			if arr.Len() == 1 && arr.Contains("SalesEngineer") {
 				salesEngineerFlag = true
@@ -727,7 +736,7 @@ func (d *ProjBusinessDynamicsDao) DataScope(ctx context.Context, userCol ...stri
 		// 非销售工程师权限加成
 		if !salesEngineerFlag {
 			bigColumns := "is_big"
-			if ok, _ := d.M.HasField("is_big"); ok {
+			if ok, _ := d.M.HasField("is_big"); ok || specialFlag {
 				if val, ok := dataScope[bigColumns]; ok && val != "" {
 					orColumns = append(orColumns, tableAs+bigColumns+" = ? ")
 					orValues = append(orValues, val)
@@ -737,7 +746,7 @@ func (d *ProjBusinessDynamicsDao) DataScope(ctx context.Context, userCol ...stri
 			var andColumns []string
 			var andValues []interface{}
 			for k, v := range dataScope {
-				if ok, _ := d.M.HasField(k); ok {
+				if ok, _ := d.M.HasField(k); ok || specialFlag {
 					andColumns = append(andColumns, tableAs+k+" IN (?) ")
 					andValues = append(andValues, v)
 				}

+ 4 - 4
opms_parent/app/service/home/home.go

@@ -180,15 +180,15 @@ func (s *HomeService) getNumStatisticsData(id int64, params *map[string]interfac
 		return gconv.String(count), err
 
 	case 10013: //当月项目转化数量(升级)
-		count, err := busDynamicsDao.LeftJoin(businessDao.Table, "bus", "bus.id=proj_business_dynamics.bus_id").
-			WhereGTE("proj_business_dynamics."+busDynamicsDao.C.CreatedTime, monthStart).WhereLTE("proj_business_dynamics."+busDynamicsDao.C.CreatedTime, monthEnd).
+		count, err := busDynamicsDao.As("dynamics").LeftJoin(businessDao.Table, "bus", "bus.id=dynamics.bus_id").
+			WhereGTE("dynamics."+busDynamicsDao.C.CreatedTime, monthStart).WhereLTE("dynamics."+busDynamicsDao.C.CreatedTime, monthEnd).
 			Where(busDynamicsDao.C.OpnType, projSrv.OpnDowngradeApproval).
-			Fields(busDynamicsDao.C.BusId).DataScope(s.Ctx, "sale_id").Distinct().Count()
+			Fields(busDynamicsDao.C.BusId).DataScope(s.Ctx, "sale_id", "bus").Distinct().Count()
 		return gconv.String(count), err
 
 	case 10014: //计划回款金额
 		count, err := collectionPlanDao.LeftJoin(contractDao.Table, "contract", "contract.id=ctr_contract_collection_plan.contract_id").
-			DataScope(s.Ctx, "incharge_id").Sum(collectionPlanDao.C.PlanAmount)
+			DataScope(s.Ctx, "incharge_id", "contract").Sum(collectionPlanDao.C.PlanAmount)
 		return gconv.String(count), err
 
 	case 10015: //未开票金额