Blame view

service-user/src/main/java/com/java110/user/cmd/privilege/AddPrivilegePrivilegeGroupCmd.java 6.95 KB
88e030b7   王彪总   init project
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
  /**
   * 权限组添加命令类
   * 
   * 该命令类用于处理添加权限组到权限的关联关系请求
   * 主要功能包括验证请求参数的有效性,以及执行权限关联的批量添加操作
   * 
   * @author Java110
   * @version 1.0
   * @since 2023
   */
  package com.java110.user.cmd.privilege;
  
  import com.alibaba.fastjson.JSONArray;
  import com.alibaba.fastjson.JSONObject;
  import com.java110.core.annotation.Java110Cmd;
  import com.java110.core.context.ICmdDataFlowContext;
  import com.java110.core.event.cmd.Cmd;
  import com.java110.core.event.cmd.CmdEvent;
  import com.java110.dto.store.StoreDto;
  import com.java110.intf.order.IPrivilegeInnerServiceSMO;
  import com.java110.intf.store.IStoreV1InnerServiceSMO;
  import com.java110.intf.user.IPrivilegeRelV1InnerServiceSMO;
  import com.java110.po.privilege.PrivilegeRelPo;
  import com.java110.utils.exception.CmdException;
  import com.java110.utils.util.Assert;
  import com.java110.utils.util.BeanConvertUtil;
  import com.java110.vo.ResultVo;
  import org.springframework.beans.factory.annotation.Autowired;
  
  import java.text.ParseException;
  import java.util.List;
  
  /**
   * 添加权限组命令类
   * 
   * 该类继承自Cmd基类,用于处理权限组与权限的关联关系添加操作
   * 通过@Java110Cmd注解标识服务代码为"add.privilege.PrivilegeGroup"
   * 主要职责包括参数验证和批量添加权限关联关系
   */
  @Java110Cmd(serviceCode = "add.privilege.PrivilegeGroup")
  public class AddPrivilegePrivilegeGroupCmd extends Cmd {
  
      /**
       * 商户信息服务接口
       * 用于查询和验证商户信息
       */
      @Autowired
      private IStoreV1InnerServiceSMO storeV1InnerServiceSMOImpl;
  
      /**
       * 权限信息服务接口
       * 用于权限相关的业务操作
       */
      @Autowired
      private IPrivilegeInnerServiceSMO privilegeInnerServiceSMOImpl;
  
      /**
       * 权限关联关系服务接口
       * 用于保存权限与权限组的关联关系
       */
      @Autowired
      private IPrivilegeRelV1InnerServiceSMO privilegeRelV1InnerServiceSMOImpl;
  
      /**
       * 请求参数验证方法
       * 
       * 验证添加权限组请求的必需参数,包括角色ID和权限ID列表
       * 同时验证商户信息的有效性,并将商户信息添加到请求参数中供后续使用
       * 
       * @param event 命令事件对象,包含请求相关信息
       * @param context 命令数据流上下文,用于获取请求头信息和设置响应
       * @param reqJson 请求参数的JSON对象,包含权限组ID和权限ID列表
       * @throws CmdException 当参数验证失败时抛出异常,包括缺少必需参数或商户不存在等情况
       */
      @Override
      public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException {
          // 验证请求报文中必须包含角色ID(权限组ID)
          Assert.hasKeyAndValue(reqJson, "pgId", "请求报文中未包含角色");
  
          // 验证请求报文中必须包含权限ID列表
          if (!reqJson.containsKey("pIds")) {
              throw new CmdException("未包含权限");
          }
  
          // 获取权限ID数组并验证至少包含一个权限
          JSONArray pIds = reqJson.getJSONArray("pIds");
          if (pIds.size() < 1) {
              throw new CmdException("未包含权限");
          }
  
          // 从请求头中获取商户ID,用于后续商户信息验证
          String storeId = context.getReqHeaders().get("store-id");
  
          // 构建商户查询条件对象
          StoreDto storeDto = new StoreDto();
          storeDto.setStoreId(storeId);  // 设置商户ID
          storeDto.setPage(1);           // 设置查询页码
          storeDto.setRow(1);            // 设置每页记录数
          
          // 查询商户信息,验证商户是否存在
          List<StoreDto> storeDtos = storeV1InnerServiceSMOImpl.queryStores(storeDto);
  
          // 验证商户存在且唯一,如果不存在或存在多个则抛出异常
          Assert.listOnlyOne(storeDtos, "商户不存在");
  
          // 将商户信息添加到请求参数中,供后续处理使用
          reqJson.put("storeId", storeDtos.get(0).getStoreId());        // 设置商户ID
          reqJson.put("storeTypeCd", storeDtos.get(0).getStoreTypeCd()); // 设置商户类型编码
      }
  
      /**
       * 执行权限组添加命令
       * 
       * 批量添加权限与权限组的关联关系,并统计操作结果
       * 遍历权限ID列表,为每个权限创建与权限组的关联关系
       * 
       * @param event 命令事件对象,包含命令执行上下文信息
       * @param context 命令数据流上下文,用于设置响应结果
       * @param reqJson 请求参数的JSON对象,包含权限组ID和权限ID列表
       * @throws CmdException 当命令执行过程中发生错误时抛出
       * @throws ParseException 当数据解析异常时抛出
       */
      @Override
      public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
          // 获取权限ID列表,用于批量创建关联关系
          JSONArray pIds = reqJson.getJSONArray("pIds");
          int errorCount = 0; // 记录失败的操作数量
          JSONObject tmpPId = null; // 临时存储单个权限ID对象
          PrivilegeRelPo tmpPrivilegePo = null; // 临时存储权限关联对象
          int flag = 0; // 单次操作结果标志,用于判断保存操作是否成功
  
          // 遍历所有权限ID,逐个创建权限与权限组的关联关系
          for (int pIdIndex = 0; pIdIndex < pIds.size(); pIdIndex++) {
              // 获取当前权限ID对象
              tmpPId = pIds.getJSONObject(pIdIndex);
              // 将当前权限ID设置到请求参数中,用于后续对象转换
              reqJson.put("pId", tmpPId.getString("pId"));
              // 将请求参数转换为权限关联对象,准备保存到数据库
              tmpPrivilegePo = BeanConvertUtil.covertBean(reqJson, PrivilegeRelPo.class);
              
              // 注释掉的代码:生成关联关系ID
              // 如果需要自动生成关联关系ID,可以取消注释并使用以下代码
              //tmpPrivilegePo.setRelId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_relId));
              
              // 保存权限关联关系到数据库,flag表示影响的行数
              flag = privilegeRelV1InnerServiceSMOImpl.savePrivilegeRel(tmpPrivilegePo);
              // 统计失败的操作数量,如果影响行数小于1表示保存失败
              if (flag < 1) {
                  errorCount++;
              }
          }
  
          // 构建操作结果响应对象,包含成功和失败的数量统计
          JSONObject paramOut = new JSONObject();
          paramOut.put("success", pIds.size() - errorCount); // 计算成功数量:总数量减去失败数量
          paramOut.put("error", errorCount); // 记录失败数量
  
          // 设置响应实体,将操作结果返回给调用方
          context.setResponseEntity(ResultVo.createResponseEntity(paramOut.toJSONString()));
      }
  }