|
@@ -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");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|