Эх сурвалжийг харах

1、预算报表编制,资金项目联查凭证。

wanghaiwu 2 долоо хоног өмнө
parent
commit
2d9b110861

+ 286 - 0
main/java/kd/cosmic/jkjt/epm/eb/formplugin/reportscheme/ReportPreparationCusListPlugin.java

@@ -0,0 +1,286 @@
+package kd.cosmic.jkjt.epm.eb.formplugin.reportscheme;
+
+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.form.ShowType;
+import kd.bos.form.control.Control;
+import kd.bos.form.control.events.BeforeItemClickEvent;
+import kd.bos.form.control.events.ItemClickEvent;
+import kd.bos.list.ListShowParameter;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.drp.mdr.common.StringUtils;
+import kd.epm.eb.formplugin.AbstractListPlugin;
+import kd.epm.eb.spread.utils.ReportEditHelper;
+import java.util.Arrays;
+import java.util.EventObject;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 处理联查凭证
+ * 报表编制:nckd_bgm_rptpreparati_ext
+ * @author wanghaiwu_kd
+ * @date 2025/09/19
+ */
+public class ReportPreparationCusListPlugin extends AbstractListPlugin {
+    private static Log logger = LogFactory.getLog(ReportPreparationCusListPlugin.class);
+
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+
+        this.getView().setVisible(true, "nckd_linkvoucher");
+    }
+
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+
+        this.addClickListeners(new String[]{"toolbaraprpt"});
+        this.addItemClickListeners(new String[]{"toolbaraprpt"});
+    }
+
+    @Override
+    public void itemClick(ItemClickEvent evt) {
+        super.itemClick(evt);
+
+        String itemKey = evt.getItemKey();
+
+        switch (itemKey) {
+            case "nckd_linkvoucher":
+                openVoucherList();
+                break;
+        }
+    }
+
+    public void openVoucherList(){
+        if(this.getPageCache().get("modelid") == null) {
+            this.getView().showTipNotification("当前预算体系为空");
+        }
+
+        ReportEditHelper reportEditHelper = new ReportEditHelper(this.getView());
+        List<String> selectedRange = reportEditHelper.getSelectedRange();
+        if (selectedRange != null && !selectedRange.isEmpty()) {
+            Map<String, String> members = reportEditHelper.getMemberMapByCell((String) selectedRange.get(0));
+
+            if(members == null){
+                this.getView().showTipNotification("单元格数据为空");
+            }
+            String bgmVersion = members.get("Version");
+            if(!"ACTUAL".equals(bgmVersion)){
+                this.getView().showTipNotification("请选择实际数单元格");
+                return;
+            }
+
+            //预算体系
+            Long bgmModelId = Long.valueOf(this.getPageCache().get("modelid"));
+            //预算组织 epm_entitymembertree
+            String bgmOrgNo = members.get("Entity");
+            //预算科目 epm_accountmembertree
+            String bgmAccountNo = members.get("Account");
+            //预算期间 epm_bperiodmembertree
+            String bgmPeriodNo = members.get("BudgetPeriod");
+
+            DynamicObject[] bgmOrgArray = loadEmpDynamicObjectArray("epm_entitymembertree", bgmOrgNo, bgmModelId);
+            DynamicObject[] bgmAccountArray = loadEmpDynamicObjectArray("epm_accountmembertree", bgmAccountNo, bgmModelId);
+            DynamicObject bgmPeriod = loadEmpDynamicObject("epm_bperiodmembertree", bgmPeriodNo, bgmModelId);
+
+            if(bgmOrgArray == null || bgmOrgArray.length == 0
+                    || bgmAccountArray == null || bgmAccountArray.length == 0
+                    || bgmPeriod == null){
+                this.getView().showTipNotification("组织、科目、期间为空");
+                return;
+            }
+
+            //获取组织
+            List<String> bgmOrgNos = (List)Arrays.stream(bgmOrgArray).map((o) -> {
+                return o.getString("number");
+            }).collect(Collectors.toList());
+
+//            QFilter qFilter = getMappingDefaultFilter(bgmModelId);
+            QFilter dimFilter = new QFilter("number", QCP.equals, "ZJ003-01");
+            dimFilter.and("entryentity.targetnumber", QCP.in, bgmOrgNos);
+
+
+            DynamicObjectCollection orgMapping = QueryServiceHelper.query("eb_integration_map", "entryentity.sourcenumber",new QFilter[]{dimFilter});
+            List<String> orgNos = (List)orgMapping.stream().map((x) -> {
+                return x.getString("entryentity.sourcenumber");
+            }).collect(Collectors.toList());
+
+
+            QFilter qFilter = new QFilter("number", QCP.in, orgNos);
+            List<Object> orgIds = QueryServiceHelper.queryPrimaryKeys("bos_org",  qFilter.toArray(), null, Integer.MAX_VALUE);
+            String orgIdStr = orgIds.stream().map(Object::toString).collect(Collectors.joining(","));
+
+
+            //获取资金用途
+            List<String> bgmAccountNos = (List)Arrays.stream(bgmAccountArray).map((o) -> {
+                return o.getString("number");
+            }).collect(Collectors.toList());
+            dimFilter = new QFilter("number", QCP.equals, "ZJ001-01");
+            dimFilter.and("entryentity.targetnumber", QCP.in, bgmAccountNos);
+
+
+            DynamicObjectCollection fundItemMapping = QueryServiceHelper.query("eb_integration_map", "entryentity.sourcenumber",new QFilter[]{dimFilter});
+            List<String> fundItemNos = (List)fundItemMapping.stream().map((x) -> {
+                return x.getString("entryentity.sourcenumber");
+            }).collect(Collectors.toList());
+
+            //资金用途ids
+            qFilter = new QFilter("number", QCP.in, fundItemNos);
+            List<Object> fundItemIds = QueryServiceHelper.queryPrimaryKeys("cas_fundflowitem",  qFilter.toArray(), null, Integer.MAX_VALUE);
+            String fundItemIdStr = fundItemIds.stream().map(Object::toString).collect(Collectors.joining(","));
+
+
+            //期间映射
+            dimFilter = new QFilter("number", QCP.equals, "ZJ002-01");
+            dimFilter.and("entryentity.targetnumber", QCP.equals, bgmPeriod.getString("number"));
+
+            DynamicObjectCollection periodMapping = QueryServiceHelper.query("eb_integration_map", "entryentity.sourcenumber",new QFilter[]{dimFilter});
+            List<String> periodNos = (List)periodMapping.stream().map((x) -> {
+                return x.getString("entryentity.sourcenumber");
+            }).collect(Collectors.toList());
+
+            //期间ids
+            qFilter = new QFilter("number", QCP.in, periodNos);
+            List<Object> periodIds = QueryServiceHelper.queryPrimaryKeys("bd_period",  qFilter.toArray(), null, Integer.MAX_VALUE);
+            String periodIdStr = periodIds.stream().map(Object::toString).collect(Collectors.joining(","));
+
+            if(StringUtils.isEmpty(periodIdStr) && !bgmPeriodNo.contains(".M") && bgmPeriodNo.contains("FY")){
+                String yearStr = bgmPeriodNo.replace("FY", "");
+                qFilter = new QFilter("number", QCP.like, yearStr + "%");
+
+                periodIds = QueryServiceHelper.queryPrimaryKeys("bd_period",  qFilter.toArray(), null, Integer.MAX_VALUE);
+                periodIdStr = periodIds.stream().map(Object::toString).collect(Collectors.joining(","));
+            }
+
+            if(StringUtils.isEmpty(orgIdStr)){
+                this.getView().showTipNotification("未匹配到组织");
+                return;
+            }
+            if(StringUtils.isEmpty(fundItemIdStr)){
+                this.getView().showTipNotification("未匹配到科目");
+                return;
+            }
+            if(StringUtils.isEmpty(periodIdStr)){
+                this.getView().showTipNotification("未匹配到期间");
+                return;
+            }
+
+            String voucherSearchSQL = buildVoucherSearchSQL(orgIdStr, periodIdStr, fundItemIdStr);
+
+            logger.info("资金项目联查凭证 search sql: " + voucherSearchSQL);
+
+            DataSet voucherDataSet = DB.queryDataSet(this.getClass().getName(), DBRoute.of("fi"), voucherSearchSQL, null);
+            if(voucherDataSet.isEmpty()){
+                this.getView().showTipNotification("未匹配到凭证");
+                return;
+            }
+
+            ListShowParameter listShowParameter = new ListShowParameter();
+            listShowParameter.setBillFormId("gl_voucher");
+            listShowParameter.getOpenStyle().setShowType(ShowType.MainNewTabPage);
+            listShowParameter.setShowFilter(false);
+            listShowParameter.setShowQuickFilter(false);
+
+            //联查凭证id
+            voucherDataSet.copy().iterator().forEachRemaining((v) -> {
+                listShowParameter.addLinkQueryPkId(v.getLong("fid"));
+            });
+
+            listShowParameter.getCustomParams().put("org", "");
+            listShowParameter.getCustomParams().put("booktype", "");
+            this.getView().showForm(listShowParameter);
+
+        } else {
+            this.getView().showTipNotification("请选择实际数单元格");
+        }
+    }
+
+    public String buildVoucherSearchSQL(String orgIdStr, String periodIdStr, String fundItemIdStr){
+        StringBuilder sql = new StringBuilder();
+        sql.append("/*dialect*/");
+        sql.append("select distinct bill.fid\n ");
+        sql.append("from t_gl_voucher bill\n ");
+        sql.append("join t_gl_voucherentry entry ON bill.fid = entry.fid\n ");
+        sql.append("join t_gl_assist_bd assit ON entry.fmaincfassgrpid = assit.fid AND assit.fflexfield = 'f000029' ");
+        sql.append("where (bill.fbillstatus = 'B' or bill.fbillstatus = 'C')  ");
+        sql.append("      and bill.fperiodid in (").append(periodIdStr).append(") ");//期间
+        sql.append("      and bill.forgid in (").append(orgIdStr).append(") ");//组织
+        sql.append("      and assit.fvalue in (").append(fundItemIdStr).append(")");//资金用途
+
+        return sql.toString();
+    }
+
+    public QFilter getMappingDefaultFilter(Long bgmModelId){
+        QFilter qFilter = new QFilter("enable", QCP.equals,true);
+        qFilter.and(new QFilter("model.id", QCP.equals, bgmModelId));
+        qFilter.and(new QFilter("bussmodel.number", QCP.equals, "AunnalBudget"));
+
+        return qFilter;
+    }
+
+    public DynamicObject loadEmpDynamicObject(String entityNmae, String number, Long modelId){
+        QFilter qFilter = new QFilter("model.id", QCP.equals, modelId);
+        qFilter.and(new QFilter("number", QCP.equals, number));
+
+        //如果是组织维度,需要查询所有下级组织
+        if("epm_entitymembertree".equals(entityNmae)){
+            DynamicObject org = BusinessDataServiceHelper.loadSingleFromCache(entityNmae, qFilter.toArray());
+            if(org == null){
+                return null;
+            }
+
+            String orgLongNumber = org.getString("longnumber");
+
+            qFilter = new QFilter("model.id", QCP.equals, modelId);
+            qFilter.and(new QFilter("longnumber", QCP.like, orgLongNumber + "%"));
+        }
+
+        return BusinessDataServiceHelper.loadSingleFromCache(entityNmae, qFilter.toArray());
+    }
+
+    public DynamicObject[] loadEmpDynamicObjectArray(String entityName, String number, Long modelId){
+        QFilter qFilter = new QFilter("model.id", QCP.equals, modelId);
+        qFilter.and(new QFilter("number", QCP.equals, number));
+
+        //如果是组织维度,需要查询所有下级组织
+        if("epm_entitymembertree".equals(entityName) || "epm_accountmembertree".equals(entityName)){
+            DynamicObject org = BusinessDataServiceHelper.loadSingleFromCache(entityName, qFilter.toArray());
+            if(org == null){
+                return null;
+            }
+
+            String orgLongNumber = org.getString("longnumber");
+
+            qFilter = new QFilter("model.id", QCP.equals, modelId);
+            qFilter.and(new QFilter("longnumber", QCP.like, orgLongNumber + "%"));
+        }
+
+        return BusinessDataServiceHelper.load(entityName, "id, number, name", qFilter.toArray());
+    }
+
+    @Override
+    public void beforeItemClick(BeforeItemClickEvent evt) {
+        super.beforeItemClick(evt);
+    }
+
+    @Override
+    public void click(EventObject evt) {
+        super.click(evt);
+
+        switch (((Control)evt.getSource()).getKey()) {
+            case "nckd_linkvoucher":
+                this.getView().showTipNotification("test click");
+        }
+    }
+}