> 在有的使用场景下，需要依据外部数据来给予不属于项目成员的人员拥有项目下的权限，比如查看项目任务或者关联项目下任务。而直接在项目下设置比如负责人、参与人或共享人，无法实现动态地依据外部逻辑给与权限。这种情况下，项目在后端进行了二开埋点开口， 可以依据依据此二开口子，进行给指定人员在指定项目下动态赋权。

项目权限二开代码示例

```java

import cn.hutool.core.date.DateUtil;
import com.weaver.loom.context.annotation.WeaHookReg;
import com.weaver.loom.context.domain.AppInfo;
import com.weaver.loom.context.domain.WeaHookRequest;
import com.weaver.loom.context.domain.WeaHookResponse;
import com.weaver.loom.context.register.RegHookEvent;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 触发类，必须放到com.weaver.seconddev包下，否则可能无法触发到
 * 这里WeaHookReg中的code是这个二开埋点的固定标识，不能修改
 */
@Slf4j
@WeaHookReg(code = "PROJECT_DETAIL_PERMISSION_HOOK_001")
public class WeaHookRegDemo extends RegHookEvent {
    @Override
    public WeaHookResponse handle(WeaHookRequest request, WeaHookResponse response, AppInfo appInfo) throws Exception {
        //入参，修改入参并不会影响到埋点的原始数据
        Map<String, Object> params = request.getParams();
        String tenantKey = (String) params.get("tenantKey");
        String userId = (String) params.get("userId"); //人员id
        List<String> projectIdList = (List<String>) params.get("projectIdList"); //项目id列表

        //Todo 这里接入自定义的外部逻辑

        //赋值示例
        Map<Long, Integer> currentRegResult = new HashMap<>();
        for (String idStr : projectIdList) {
            currentRegResult.put(Long.parseLong(idStr), 3); // 给3，则表示给与参与人权限
            currentRegResult.put(Long.parseLong(idStr), 7); // 给7，则表示给与负责人权限
        }

        //前面同一埋点多个二开，前面链路节点二开代码执行的结果
        Map<Long, Integer> preRegResult = (Map<Long, Integer>) response.getResult();
        if (preRegResult != null) {
            //todo 处理params 与 传进来的前面链路的 result
            //如 未读取response 中的result数据 直接将新的数据写入response 会覆盖前面链路的返回值
            preRegResult.putAll(currentRegResult);
            response.setResult(preRegResult);
        } else {
            //todo 将结果写入response
            //如果没有实际的返回数据可以不设置result，不要自己插入不支持序列化的类型，不然会报错
            response.setResult(currentRegResult);
        }
        return response;//返回结果
    }

    @Override
    public void rollBack(WeaHookRequest request, WeaHookResponse response, AppInfo appInfo) throws Exception {
        //todo
        //自定义二开代码异常回滚逻辑
        log.info("执行事件回滚机制 => {}, {}", DateUtil.now(), appInfo.getAppName());
    }
}
```
