Bläddra i källkod

feat(hr): 添加政策公告列表权限控制和后台下架任务

- 在AnnouncementsListPlugin中实现员工权限过滤功能
- 集成员工ID查询和组织架构权限验证逻辑
- 添加日志记录功能用于调试和监控
- 创建AnnouncementsTask类实现公告自动下架后台任务
- 优化AnnouncementsTplListPlugin中的过滤器逻辑
- 统一查询条件构建和排序规则处理
turborao 3 dagar sedan
förälder
incheckning
cb14c38bf1

+ 61 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/task/AnnouncementsTask.java

@@ -0,0 +1,61 @@
+package nckd.jxccl.hr.task;
+
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.exception.KDException;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.schedule.executor.AbstractTask;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.constant.FormConstant;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 政策公告下架后台任务插件
+ */
+@SuppressWarnings("unused")
+public class AnnouncementsTask extends AbstractTask implements Plugin {
+
+    @Override
+    public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
+
+        try {
+            // 获取今天的日期(不包含时间部分)
+            Calendar calendar = Calendar.getInstance();
+            calendar.set(Calendar.HOUR_OF_DAY, 23);
+            calendar.set(Calendar.MINUTE, 59);
+            calendar.set(Calendar.SECOND, 59);
+            Date today = calendar.getTime();
+
+            // 构建查询条件:nckd_downdate <= 今天的日期
+            QFilter filter = new QFilter("nckd_downdate", QCP.less_equals, today);
+
+            // 使用 BusinessDataServiceHelper.load 替代 QueryServiceHelper.query
+            String selectFields = "id,nckd_billstatus,nckd_downdate";
+            DynamicObject[] dyns = BusinessDataServiceHelper.load(
+                    FormConstant.NCKD_ANNOUNCEMENTS,
+                    selectFields,
+                    new QFilter[]{filter}
+            );
+
+            // 更新查询到的数据
+            if (dyns != null && dyns.length > 0) {
+                for (DynamicObject item : dyns) {
+                    // 设置 nckd_billstatus 为 D
+                    item.set("nckd_billstatus", "D");
+                }
+                // 保存更新
+                SaveServiceHelper.save(dyns);
+            }
+
+        } catch (Exception e) {
+            throw new KDException("更新公告状态失败:" + e.getMessage());
+        }
+    }
+}

+ 67 - 3
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/tsc/plugin/form/AnnouncementsListPlugin.java

@@ -1,7 +1,10 @@
 package nckd.jxccl.hr.tsc.plugin.form;
 
-import kd.bos.context.RequestContext;
+import kd.bos.algo.DataSet;
 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.entity.EntityMetadataCache;
 import kd.bos.entity.MainEntityType;
 import kd.bos.entity.datamodel.ListSelectedRowCollection;
@@ -9,16 +12,24 @@ 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.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.ORM;
+import kd.bos.orm.query.QCP;
 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.hr.hbp.common.util.HRStringUtils;
 import kd.sdk.plugin.Plugin;
 import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.swc.helper.SWCHelper;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 政策公告列表插件
@@ -28,6 +39,59 @@ import java.util.HashMap;
 @SuppressWarnings("unused")
 public class AnnouncementsListPlugin extends AbstractListPlugin implements Plugin {
 
+    private static final Log logger = LogFactory.getLog(AnnouncementsListPlugin.class);
+
+    @Override
+    public void setFilter(SetFilterEvent e) {
+        super.setFilter(e);
+        List<QFilter> qFilters = e.getQFilters();
+        List<QFilter> qFilterList = null;
+        if(qFilters.size()>0 && 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){
+            ///获取当前员工的行政组织长编码
+            Long companyId = empDyns[0].getLong("company.id");
+            logger.info("AnnouncementsListPlugin currEmpId:" + empId + " companyId:"+ companyId);
+            qFilter = new QFilter("nckd_hradminorg.id", QCP.equals, companyId);
+
+        }
+
+        if (qFilterList == null  && qFilter != null) {
+            //qFilter = new QFilter("number", QCP.equals, "在地愿为连理枝");
+            qFilters.add(qFilter);
+        }else{
+            //qFilter = new QFilter("number", QCP.equals, "在地愿为连理枝");
+            //qFilter = new QFilter("id", QCP.equals, 2392305707270548480L);
+            qFilter = new QFilter("id", QCP.equals, 10000000000000000L);
+            qFilters.add(qFilter);
+        }
+        e.setOrderBy("nckd_istop Desc,nckd_publishdate Desc");
+
+        logger.info("AnnouncementsListPlugin setFilters:" +  e.getQFilters().toString() );
+    }
+
     public void afterDoOperation(AfterDoOperationEventArgs args) {
         super.afterDoOperation(args);
         FormOperate formOperate = (FormOperate)args.getSource();

+ 20 - 12
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/tsc/plugin/form/AnnouncementsTplListPlugin.java

@@ -9,6 +9,8 @@ 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.logging.Log;
+import kd.bos.logging.LogFactory;
 import kd.bos.orm.ORM;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
@@ -17,6 +19,7 @@ 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 kd.tsc.tsirm.formplugin.web.advert.OpenAdvertFilterList;
 import nckd.jxccl.base.common.constant.FormConstant;
 import nckd.jxccl.base.swc.helper.SWCHelper;
 
@@ -31,6 +34,8 @@ import java.util.stream.Collectors;
 @SuppressWarnings("unused")
 public class AnnouncementsTplListPlugin extends AbstractListPlugin implements Plugin {
 
+    private static final Log logger = LogFactory.getLog(AnnouncementsTplListPlugin.class);
+
     @Override
     public void setFilter(SetFilterEvent e) {
         super.setFilter(e);
@@ -38,7 +43,7 @@ public class AnnouncementsTplListPlugin extends AbstractListPlugin implements Pl
         List<QFilter> qFilterList = null;
         if(qFilters.size()>0 && qFilters.get(0) != null) {
             qFilterList = (List) qFilters.stream().filter((qFilter) -> {
-                return HRStringUtils.equals(qFilter.getProperty(), "id");
+                return HRStringUtils.equals(qFilter.getProperty(), "nckd_hradminorg.id");
             }).collect(Collectors.toList());
         }
 
@@ -63,7 +68,7 @@ public class AnnouncementsTplListPlugin extends AbstractListPlugin implements Pl
         if(empDyns != null && empDyns.length > 0){
             ///获取当前员工的行政组织长编码
             String adminOrgStructnumber = empDyns[0].getString("adminorg.structlongnumber");
-            System.out.println("empId:"+ empId + " adminOrgStructnumber:"+ adminOrgStructnumber);
+            logger.info("AnnouncementsTplListPlugin currEmpId:" + empId + " AdminOrgStructnumber:"+ adminOrgStructnumber);
             ///查询符合条件的公告
             Map<Long, String> announcementsMap = queryAnnouncementsByBillStatus();
             ///组织结构编码匹配,返回符合条件的公告
@@ -75,21 +80,24 @@ public class AnnouncementsTplListPlugin extends AbstractListPlugin implements Pl
         }
 
         if (qFilterList == null  && qFilter != null) {
+            //qFilter = new QFilter("number", QCP.equals, "在地愿为连理枝");
             qFilters.add(qFilter);
         }else{
-            qFilter = new QFilter("id", QCP.equals, 10000000000000000L);
-            qFilters.add(qFilter);
+            if(qFilterList != null && qFilterList.size() > 0){
+                QFilter adminOrgFilter = (QFilter)qFilterList.get(0);
+                qFilters.remove(adminOrgFilter);
+                qFilters.add(qFilter);
+
+            }else {
+                qFilter = new QFilter("id", QCP.equals, 10000000000000000L);
+                qFilters.add(qFilter);
+            }
         }
-        QFilter adminOrgFilter = (QFilter)qFilterList.get(0);
-        System.out.println("qFilters:" + qFilters.toString() + " empId:"+ empId );
+        e.setOrderBy("nckd_istop Desc,nckd_publishdate Desc");
 
+        logger.info("AnnouncementsTplListPlugin setFilters:" +  e.getQFilters().toString() );
     }
 
-    @Override
-    public void filterColumnSetFilter(SetFilterEvent args) {
-
-        super.filterColumnSetFilter(args);
-    }
 
     @Override
     public void afterBindData(EventObject e) {
@@ -140,7 +148,7 @@ public class AnnouncementsTplListPlugin extends AbstractListPlugin implements Pl
         for (DynamicObject item : result) {
             Long id = item.getLong("fid");
             String structnumber = (String) item.get("fstructlongnumber");
-            if (id != null && structnumber != null) {
+            if (structnumber != null) {
                 resultMap.put(id, structnumber);
             }
         }