Procházet zdrojové kódy

feat(hr): 添加政策公告权限控制和布局功能

- 在AnnouncementsListPlugin中集成数据权限规则过滤
- 新增AnnouncementsTplListPlugin实现公告布局列表功能
- 添加HomePageApplyExtFormPlugin支持应聘页面展示
- 扩展SWCHelper查询字段以支持组织结构权限控制
- 实现基于用户组织架构的公告数据过滤机制
- 集成HR权限服务进行公告访问权限验证
turborao před 3 dny
rodič
revize
79231e4598

+ 1 - 1
code/base/nckd-jxccl-base-helper/src/main/java/nckd/jxccl/base/swc/helper/SWCHelper.java

@@ -244,7 +244,7 @@ public class SWCHelper {
         QFilter filter = new QFilter("iscurrentdata", QCP.equals, "1"); // 启用
         filter.and(new QFilter("employee.id", QCP.in, employeeId));
 
-        String selectFields1 = "employee.id,adminorg.id,adminorg.belongcompany.id,company.id";
+        String selectFields1 = "employee.id,adminorg.id,adminorg.belongcompany.id,company.id,adminorg.structlongnumber";
         DynamicObject[] empposorgreDyns = BusinessDataServiceHelper.load("hrpi_empposorgrel", selectFields1, filter.toArray());
 
         return empposorgreDyns;

+ 16 - 1
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/tsc/plugin/form/AnnouncementsListPlugin.java

@@ -1,18 +1,25 @@
 package nckd.jxccl.hr.tsc.plugin.form;
 
+import kd.bos.context.RequestContext;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.entity.EntityMetadataCache;
 import kd.bos.entity.MainEntityType;
 import kd.bos.entity.datamodel.ListSelectedRowCollection;
 import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.SetFilterEvent;
 import kd.bos.form.operate.FormOperate;
 import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.model.PermissionStatus;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
 import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.sdk.hr.hbp.business.helper.permission.HRPermissionServiceHelper;
 import kd.sdk.plugin.Plugin;
 import nckd.jxccl.base.common.constant.FormConstant;
 
+import java.util.HashMap;
+
 /**
  * 政策公告列表插件
  * @author turborao
@@ -57,7 +64,6 @@ public class AnnouncementsListPlugin extends AbstractListPlugin implements Plugi
         MainEntityType entityType= EntityMetadataCache.getDataEntityType(FormConstant.NCKD_ANNOUNCEMENTS);
         DynamicObject[] billDyns = BusinessDataServiceHelper.load(selectedRows.getPrimaryKeyValues(), entityType);
         for (DynamicObject billDyn : billDyns){
-            String billno = billDyn.getString("billno");
             if(operateKey.equals("takedown") ){
                 billDyn.set("nckd_billstatus", billStatus);
             }
@@ -86,4 +92,13 @@ public class AnnouncementsListPlugin extends AbstractListPlugin implements Plugi
 
     }
 
+    @Override
+    public void setFilter(SetFilterEvent e) {
+        super.setFilter(e);
+
+        QFilter dataRule = HRPermissionServiceHelper.getDataRule(
+                RequestContext.get().getCurrUserId(), "tsirm", FormConstant.NCKD_ANNOUNCEMENTS, PermissionStatus.View, new HashMap<>());
+        e.getQFilters().add(dataRule);
+    }
+
 }

+ 159 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/tsc/plugin/form/AnnouncementsTplListPlugin.java

@@ -0,0 +1,159 @@
+package nckd.jxccl.hr.tsc.plugin.form;
+
+import kd.bos.algo.DataSet;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.db.DB;
+import kd.bos.db.DBRoute;
+import kd.bos.form.events.FilterContainerInitArgs;
+import kd.bos.form.events.SetFilterEvent;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.orm.ORM;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.model.PermissionStatus;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.hr.hbp.common.util.HRStringUtils;
+import kd.sdk.hr.hbp.business.helper.permission.HRPermissionServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.swc.helper.SWCHelper;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 政策公告布局列表插件
+ * @author turborao
+ * 时间 2026/1/13 16:05
+ */
+@SuppressWarnings("unused")
+public class AnnouncementsTplListPlugin extends AbstractListPlugin implements Plugin {
+
+    @Override
+    public void setFilter(SetFilterEvent e) {
+        super.setFilter(e);
+        e.setMainOrgQFilter((QFilter)null);
+        List<QFilter> qFilters = e.getQFilters();
+        List<QFilter> qFilterList = null;
+        if(qFilters.get(0) != null) {
+            qFilterList = (List) qFilters.stream().filter((qFilter) -> {
+                return HRStringUtils.equals(qFilter.getProperty(), "id");
+            }).collect(Collectors.toList());
+        }
+
+        QFilter qFilter = null;
+        Long userId = UserServiceHelper.getCurrentUserId();
+        DynamicObject personUserDyn = SWCHelper.queryOne(FormConstant.HRPI_PERSONUSERREL, "employee.id","user",userId);
+
+        Long empId = 0L;
+        if(personUserDyn == null){
+            /**
+             * 没有员工信息时,返回常量,用于测试
+             */
+            //empId = 2313784485549715456L;
+            this.getView().showMessage("未找到员工!");
+            return;
+        }else {
+            empId = personUserDyn.getLong("employee.id");
+        }
+        List<Long> employeeIds = new java.util.ArrayList<>();
+        employeeIds.add(empId);
+        DynamicObject[] empDyns = SWCHelper.queryEmpPosOrgRelDyns(employeeIds);
+        if(empDyns != null && empDyns.length > 0){
+            ///获取当前员工的行政组织长编码
+            String adminOrgStructnumber = empDyns[0].getString("adminorg.structlongnumber");
+            ///查询符合条件的公告
+            Map<Long, String> announcementsMap = queryAnnouncementsByBillStatus();
+            ///组织结构编码匹配,返回符合条件的公告
+            List<Long> ids = getMatchingAnnouncementIds(announcementsMap, adminOrgStructnumber);
+            if(ids.size() > 0){
+                qFilter = new QFilter("id", QCP.in, ids);
+            }
+
+        }
+
+        if (qFilterList != null && qFilterList.size() == 0 && qFilter != null) {
+            qFilters.add(qFilter);
+        }else{
+            qFilter = new QFilter("id", QCP.equals, 10000000000000000L);
+            qFilters.add(qFilter);
+        }
+
+    }
+
+    @Override
+    public void filterColumnSetFilter(SetFilterEvent args) {
+        super.filterColumnSetFilter(args);
+    }
+
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+    }
+
+    /**
+     * 根据组织结构编码匹配,返回符合条件的公告ID列表
+     * @param announcementsMap Map<id, structnumber> 公告ID与组织结构编码的映射
+     * @param adminOrgStructnumber 当前用户的行政组织结构编码
+     * @return 匹配成功的公告ID列表
+     */
+    public List<Long> getMatchingAnnouncementIds(Map<Long, String> announcementsMap, String adminOrgStructnumber) {
+        List<Long> matchingIds = new ArrayList<>();
+
+        // 循环遍历 announcementsMap
+        for (Map.Entry<Long, String> entry : announcementsMap.entrySet()) {
+            Long id = entry.getKey();
+            String structnumber = entry.getValue();
+
+            // 检查 adminOrgStructnumber 是否包含 structnumber 中的字符
+            if (adminOrgStructnumber != null && structnumber != null &&
+                    adminOrgStructnumber.contains(structnumber)) {
+                matchingIds.add(id);
+            }
+        }
+
+        return matchingIds;
+    }
+
+
+
+    /**
+     * 根据 billstatus 查询公告信息并返回 Map 结构
+     * @return Map<id, structnumber>
+     */
+    public  Map<Long, String> queryAnnouncementsByBillStatus() {
+        // 设置查询条件
+        QFilter filter = new QFilter("nckd_billstatus", QCP.equals, "C");
+
+        // 执行查询
+        StringBuilder sb = getBillDetailSql();
+        DataSet dataSet = DB.queryDataSet(this.getClass().getName(), DBRoute.of("hr"), sb.toString());
+        DynamicObjectCollection result = ORM.create().toPlainDynamicObjectCollection(dataSet);
+
+        // 将结果转换为 Map<Long, String>
+        Map<Long, String> resultMap = new HashMap<>();
+        for (DynamicObject item : result) {
+            Long id = item.getLong("fid");
+            String structnumber = (String) item.get("fstructlongnumber");
+            if (id != null && structnumber != null) {
+                resultMap.put(id, structnumber);
+            }
+        }
+        return resultMap;
+    }
+
+    public  StringBuilder getBillDetailSql() {
+
+        StringBuilder sb = new StringBuilder();
+        sb.append("/*dialect*/ SELECT  a.fid, \n")
+                .append("e.fstructlongnumber \n")
+                .append("from tk_nckd_announcements a \n")
+                .append("left join tk_nckd_announcesentry b on a.fid = b.fid \n")
+                .append("left join t_haos_adminstruct e on e.fadminorgid = b.fk_nckd_adminorg and e.fiscurrentdata = '1' \n")
+                .append("where 1 = 1 and e.fstructprojectid = 1010 \n")
+                .append("and a.fk_nckd_billstatus in ('C') \n");
+        return sb;
+    }
+}

+ 32 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/tsc/plugin/form/HomePageApplyExtFormPlugin.java

@@ -0,0 +1,32 @@
+package nckd.jxccl.hr.tsc.plugin.form;
+
+import kd.bos.form.ShowType;
+import kd.bos.form.container.Tab;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.list.ListShowParameter;
+import kd.sdk.plugin.Plugin;
+
+import java.util.EventObject;
+
+/**
+ * 我要应聘动态表单插件
+ * @author turborao
+ * 时间 2026/1/13 16:05
+ */
+@SuppressWarnings("unused")
+public class HomePageApplyExtFormPlugin extends AbstractFormPlugin implements Plugin {
+
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+        setAnnouncementPage();
+    }
+
+    private void setAnnouncementPage() {
+        ListShowParameter lsp = new ListShowParameter();
+        lsp.setBillFormId("nckd_announcement_p");
+        lsp.getOpenStyle().setShowType(ShowType.InContainer);
+        lsp.getOpenStyle().setTargetKey("nckd_flexpanelap");
+        this.getView().showForm(lsp);
+    }
+}