diff --git a/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/common/AssistbalanceAutoData.java b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/common/AssistbalanceAutoData.java new file mode 100644 index 0000000..76cf8c5 --- /dev/null +++ b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/common/AssistbalanceAutoData.java @@ -0,0 +1,150 @@ +package zcgj.zcdev.zcdev.fs.plugin.common; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.db.DB; +import kd.bos.db.DBRoute; +import kd.bos.openapi.common.result.OpenApiResult; +import kd.bos.openapi.common.util.OpenApiSdkUtil; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.operation.SaveServiceHelper; +import zcgj.zcdev.zcdev.fs.utils.AccountRecord; +import zcgj.zcdev.zcdev.fs.utils.BalanceQueryParamApi; + +import java.lang.reflect.Type; +import java.util.*; + +public class AssistbalanceAutoData { + + public static void getData(){ + String[] selectorsArray = new String[]{"beginlocal", "endlocal", "yeardebitfor","yearcreditfor","debitlocal","creditlocal"}; + + QFilter filteraccountTable = new QFilter("number", QCP.equals, "0003"); + DynamicObject accountTableLoad = BusinessDataServiceHelper.loadSingle("bd_accounttable", "id", new QFilter[]{filteraccountTable}); + + QFilter number = new QFilter("fisaccounting", "=", "1"); + QFilter structure = new QFilter("structure.longnumber", QCP.like, "10000000!10006431%"); + QFilter isleaf = new QFilter("structure.isleaf", QCP.equals, true); + DynamicObject[] load = BusinessDataServiceHelper.load("bos_org", "id,structure.longnumber,structure.view", new QFilter[]{number, structure,isleaf}); + + DynamicObject[] accountConf = BusinessDataServiceHelper.load("zcgj_conf_balanceaccount", "zcgj_account", new QFilter[]{}); + Set accountNumber = new HashSet<>(); + for (DynamicObject dynamicObject : accountConf) { + accountNumber.add(dynamicObject.getDynamicObject("zcgj_account").getString("number")); + } + + List orgIds = new ArrayList<>(); + Map orgNumberMap = new HashMap<>(); + for (int i = 0; i < load.length; i++) { + DynamicObject dynamicObject = load[i]; + orgNumberMap.put(dynamicObject.getString("number"), dynamicObject); + orgIds.add(dynamicObject.getLong("id")); + } + + + //查询组织下对应的当前期间数据 + DynamicObject[] orgByCurperiod = BusinessDataServiceHelper.load("gl_accountbook", + "org,curperiod", + new QFilter[]{new QFilter("enable", QCP.equals, Boolean.TRUE). + and("status", QCP.equals, "C").and("org.id", QCP.in, orgIds)}); + /*Map orgByCurperiodMap = + Arrays.stream(orgByCurperiod).collect(Collectors.toMap( + i -> i.getLong("org.id"), + i -> i));*/ + Map orgByCurperiodMap = new HashMap<>(); + for (DynamicObject dynamicObject : orgByCurperiod) { + orgByCurperiodMap.put(dynamicObject.getLong("org.id"), dynamicObject); + } + + //清除数据 + //DeleteServiceHelper.delete("zcgj_rpt_assistbalance",new QFilter[]{}); + List sqlparams = new ArrayList<>(); + Object[] sqlparam = new Object[] { false }; + sqlparams.add(sqlparam); + DB.executeBatch(DBRoute.of("fi"), + "update tk_zcgj_rpt_assistbalance set fk_zcgj_isnew = ? ", sqlparams); + + for (String orgNumber : orgNumberMap.keySet()) { + BalanceQueryParamApi balanceQueryParamApi = new BalanceQueryParamApi(); + balanceQueryParamApi.setSelectors(Arrays.asList(selectorsArray)); + // balanceQueryParamApi.setOrgNumber("cw000102"); + balanceQueryParamApi.setOrgNumber(orgNumber); + balanceQueryParamApi.setBookTypeNumber("100002"); //账簿类型 + balanceQueryParamApi.setAccountTableNumber("0003");//科目表 + + DynamicObject orgObj = orgNumberMap.get(orgNumber); + DynamicObject periodObj = orgByCurperiodMap.get(orgObj.getLong("id")); + DynamicObject curperiod = null; + if(periodObj != null) { + curperiod = periodObj.getDynamicObject("curperiod"); + if( curperiod!= null) { + balanceQueryParamApi.setPeriodNumber(curperiod.getString("number")); // + }else{ + continue; + } + }else{ + continue; + } + + Map>> accountAssgrp = new HashMap<>(); + List> li = new ArrayList<>(); + Map map1 = new HashMap<>(); + map1.put("0001",""); + li.add(map1); + for (String accNum : accountNumber) { + accountAssgrp.put(accNum,li); + } + balanceQueryParamApi.setAccountAssgrp(accountAssgrp); + List groupBy = new ArrayList<>(); + groupBy.add("0001"); + groupBy.add("account"); + balanceQueryParamApi.setGroupBys(groupBy); + Gson gson = new Gson(); + String json = gson.toJson(balanceQueryParamApi); + Map params = gson.fromJson(json, + new TypeToken>(){}.getType()); + + OpenApiResult balanceData = OpenApiSdkUtil.invoke("/v2/gl/getBalanceApi", params); + + List addEntities = new ArrayList<>(); + if(balanceData.isStatus()){ + String data = (String) balanceData.getData(); + Type listType = new TypeToken>() {}.getType(); + List records = gson.fromJson(data, listType); + // 示例输出 + for (AccountRecord record : records) { + DynamicObject assistbalance + =BusinessDataServiceHelper.newDynamicObject("zcgj_rpt_assistbalance"); + assistbalance.set("zcgj_debitlocal", record.getDebitlocal()); + assistbalance.set("zcgj_creditlocal", record.getCreditlocal()); + assistbalance.set("zcgj_yeardebitfor", record.getYeardebitfor()); + assistbalance.set("zcgj_yearcreditfor", record.getYearcreditfor()); + assistbalance.set("zcgj_endlocal", record.getEndlocal()); + assistbalance.set("zcgj_org",orgNumberMap.get(orgNumber)); + assistbalance.set("zcgj_accounttable",accountTableLoad); + assistbalance.set("zcgj_account", record.getAccount()); + assistbalance.set("zcgj_period",curperiod); + assistbalance.set("zcgj_isnew",true); + Map assgrp = record.getAssgrp(); + if (assgrp.containsKey("0001")) { + assistbalance.set("zcgj_customernumber",assgrp.get("0001").getNumber()); + assistbalance.set("zcgj_customername",assgrp.get("0001").getName()); + } + addEntities.add(assistbalance); + } + + } + + if (!addEntities.isEmpty()) { + try { + SaveServiceHelper.save(addEntities.toArray(new DynamicObject[0])); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + } + } +} diff --git a/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/form/AssistbalancePlugin.java b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/form/AssistbalancePlugin.java index 89919de..737f29f 100644 --- a/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/form/AssistbalancePlugin.java +++ b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/form/AssistbalancePlugin.java @@ -1,24 +1,17 @@ package zcgj.zcdev.zcdev.fs.plugin.form; -import kd.bos.dataentity.entity.DynamicObject; import kd.bos.form.control.events.ItemClickEvent; import kd.bos.list.plugin.AbstractListPlugin; -import kd.bos.orm.query.QCP; -import kd.bos.orm.query.QFilter; -import kd.bos.servicehelper.BusinessDataServiceHelper; -import kd.bos.servicehelper.org.OrgUnitServiceHelper; -import kd.fi.gl.servicehelper.BalanceQueryParam; -import kd.fi.gl.servicehelper.BanlanceServiceHelper; +import kd.bos.logging.Log; +import kd.bos.logging.LogFactory; import kd.sdk.plugin.Plugin; - -import java.util.*; -import java.util.stream.Collectors; +import zcgj.zcdev.zcdev.fs.plugin.common.AssistbalanceAutoData; /** * 核算维度余额取数表(矿山二开) */ public class AssistbalancePlugin extends AbstractListPlugin implements Plugin { - + private static final Log log = LogFactory.getLog(AssistbalancePlugin.class); public static String ksNumberTop = "10006431"; //矿山总部组织编码 @Override @@ -26,67 +19,9 @@ public class AssistbalancePlugin extends AbstractListPlugin implements Plugin { super.itemClick(evt); String itemKey = evt.getItemKey(); if("zcgj_gatdata".equals(itemKey)) { - BalanceQueryParam balanceQueryParam = new BalanceQueryParam(); - String[] selectorsArray = new String[]{"beginlocal", "endlocal", "yeardebitfor","yearcreditfor","debitlocal","creditlocal"}; - Arrays.asList(selectorsArray).forEach(balanceQueryParam::addSelector); - - QFilter filterOrgId = new QFilter("number", QCP.equals,"100002");//主账簿 - DynamicObject accountbookstype = BusinessDataServiceHelper.loadSingle("bd_accountbookstype", "id,number", new QFilter[]{filterOrgId}); - balanceQueryParam.setBookTypeId(accountbookstype.getLong("id")); - - QFilter filterperiod = new QFilter("number", QCP.equals,"202501");//期间 - DynamicObject period = BusinessDataServiceHelper.loadSingle("bd_period", "id,number", new QFilter[]{filterperiod}); - balanceQueryParam.setPeriodId(period.getLong("id")); - - QFilter filtercurrency= new QFilter("number", QCP.equals,"CNY");//币别 - DynamicObject currency = BusinessDataServiceHelper.loadSingle("bd_currency", "id,number", new QFilter[]{filtercurrency}); - balanceQueryParam.setCurrencyId(currency.getLong("id")); - - QFilter filteraccount= new QFilter("number", QCP.equals,"112204");//会计科目 - DynamicObject account = BusinessDataServiceHelper.loadSingle("bd_accountview", "id,number", new QFilter[]{filteraccount}); - - List> paramMap = new ArrayList<>(); - Map map = new HashMap<>(); - map.put("0001",0L); - paramMap.add(map); - balanceQueryParam.setAccountAssgrp(account.getLong("id"),paramMap); - balanceQueryParam.addGroupBy("0001"); - balanceQueryParam.addGroupBy("account"); - for (Long orgId : getKsOrg()) { - balanceQueryParam.setOrgId(orgId); - List> balance = BanlanceServiceHelper.getBalance(balanceQueryParam); - System.out.println(); - } - - - - System.out.println(); - System.out.println(); - //balanceQueryParam.setAccountAssgrp(); - - - /* - private long orgId; - private long bookTypeId; .. - private long periodId; - private long currencyId; - private Map>> accountAssgrp = new HashMap(); - private List groupBys = new ArrayList(); - private boolean isSubstractPL = false;*/ - //BanlanceServiceHelper.getBalance(balanceQueryParam); + //科目余额表自动取数 + AssistbalanceAutoData.getData(); } } - - public Set getKsOrg(){ - QFilter filterOrgId = new QFilter("number", QCP.equals,ksNumberTop);//中材矿山建设有限公司 - DynamicObject adminOrg = BusinessDataServiceHelper.loadSingle("bos_org", "number,name,fullname", new QFilter[]{filterOrgId}); - long orgId = adminOrg.getLong("id"); - List orgIds = new ArrayList<>(1); - //orgIds.add(1692204547985902592L); - orgIds.add(orgId); - List subOrgIds = OrgUnitServiceHelper.getAllSubordinateOrgs(1L, orgIds, true); - return subOrgIds.stream().collect(Collectors.toSet()); - } - } diff --git a/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/operate/TravelItineraryTimeValidatorSubOp.java b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/operate/TravelItineraryTimeValidatorSubOp.java new file mode 100644 index 0000000..74378d6 --- /dev/null +++ b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/operate/TravelItineraryTimeValidatorSubOp.java @@ -0,0 +1,79 @@ +package zcgj.zcdev.zcdev.fs.plugin.operate; + +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.entity.ExtendedDataEntity; +import kd.bos.entity.plugin.AbstractOperationServicePlugIn; +import kd.bos.entity.plugin.AddValidatorsEventArgs; +import kd.bos.entity.plugin.PreparePropertysEventArgs; +import kd.bos.entity.validate.AbstractValidator; +import kd.bos.logging.Log; +import kd.bos.logging.LogFactory; +import zcgj.zcdev.zcdev.fs.utils.OrgCheckUtils; + +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +/** + * 单据注册位置:差旅报销单提交按钮 + * 说明:校验不同行程信息开始结束时间是否存在相同的日期 + */ +public class TravelItineraryTimeValidatorSubOp extends AbstractOperationServicePlugIn { + private static final Log logger = LogFactory.getLog(TravelItineraryTimeValidatorSubOp.class); + + @Override + public void onPreparePropertys(PreparePropertysEventArgs e) { + super.onPreparePropertys(e); + e.getFieldKeys().add("costcompany");//费用承担公司 + e.getFieldKeys().add("tripentry");//行程信息分录 + e.getFieldKeys().add("startdate");//行程开始时间 + e.getFieldKeys().add("enddate");//行程结束时间 + } + + @Override + public void onAddValidators(AddValidatorsEventArgs e) { + super.onAddValidators(e); + e.getValidators().add(new ValidatorExt()); + } + + class ValidatorExt extends AbstractValidator { + @Override + public void validate() { + ExtendedDataEntity[] extendedDataEntities = this.getDataEntities(); + for (ExtendedDataEntity extendedDataEntity : extendedDataEntities) { + DynamicObject dataEntity = extendedDataEntity.getDataEntity(); + DynamicObject costCompany = dataEntity.getDynamicObject("costcompany");//费用承担公司 + if (costCompany != null) { + Long companyId = costCompany.getLong("id"); + if (OrgCheckUtils.isKS(companyId)) { + //仅针对矿山下组织下的逻辑 + DynamicObjectCollection tripEntryCollection = dataEntity.getDynamicObjectCollection("tripentry");//行程信息 + Set startDateSet = new HashSet<>(); + Set endDateSet = new HashSet<>(); + for (DynamicObject tripEntry : tripEntryCollection) { + Date startDate = tripEntry.getDate("startdate");//开始日期 + Date endDate = tripEntry.getDate("enddate");//结束日期 + // 校验开始日期是否重复 + if (startDate != null) { + if (startDateSet.contains(startDate)) { + this.addFatalErrorMessage(extendedDataEntity, "存在相同的行程开始日期,请检查行程信息!"); + return; + } + startDateSet.add(startDate); + } + // 校验结束日期是否重复 + if (endDate != null) { + if (endDateSet.contains(endDate)) { + this.addFatalErrorMessage(extendedDataEntity, "存在相同的行程结束日期,请检查行程信息!"); + return; + } + endDateSet.add(endDate); + } + } + } + } + } + } + } +} diff --git a/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/task/AssistbalanceTask.java b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/task/AssistbalanceTask.java new file mode 100644 index 0000000..5d3a3f9 --- /dev/null +++ b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/task/AssistbalanceTask.java @@ -0,0 +1,27 @@ +package zcgj.zcdev.zcdev.fs.plugin.task; + +import kd.bos.context.RequestContext; +import kd.bos.entity.operate.result.OperationResult; +import kd.bos.exception.KDException; +import kd.bos.logging.Log; +import kd.bos.logging.LogFactory; +import kd.bos.schedule.executor.AbstractTask; +import kd.bos.servicehelper.operation.OperationServiceHelper; +import zcgj.zcdev.zcdev.fs.plugin.common.AssistbalanceAutoData; + +import java.util.Map; + +/** + * 科目余额取数表自动取数 + */ +public class AssistbalanceTask extends AbstractTask { + + private static final Log log = LogFactory.getLog(AssistbalanceTask.class); + + @Override + public void execute(RequestContext requestContext, Map map) throws KDException { + log.info("AssistbalanceTask,进入到后台任务中-开始"); + AssistbalanceAutoData.getData(); + log.info("AssistbalanceTask,进入到后台任务中-结束"); + } +} diff --git a/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/utils/AccountRecord.java b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/utils/AccountRecord.java new file mode 100644 index 0000000..7eba5fc --- /dev/null +++ b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/utils/AccountRecord.java @@ -0,0 +1,102 @@ +package zcgj.zcdev.zcdev.fs.utils; + +import java.math.BigDecimal; +import java.util.Map; + +public class AccountRecord { + private BigDecimal creditlocal; + private Map assgrp; + private BigDecimal yearcreditfor; + private BigDecimal debitlocal; + private BigDecimal yeardebitfor; + private BigDecimal beginlocal; + private long account; + private BigDecimal endlocal; + + // getters and setters + public BigDecimal getCreditlocal() { + return creditlocal; + } + + public void setCreditlocal(BigDecimal creditlocal) { + this.creditlocal = creditlocal; + } + + public Map getAssgrp() { + return assgrp; + } + + public void setAssgrp(Map assgrp) { + this.assgrp = assgrp; + } + + public BigDecimal getYearcreditfor() { + return yearcreditfor; + } + + public void setYearcreditfor(BigDecimal yearcreditfor) { + this.yearcreditfor = yearcreditfor; + } + + public BigDecimal getDebitlocal() { + return debitlocal; + } + + public void setDebitlocal(BigDecimal debitlocal) { + this.debitlocal = debitlocal; + } + + public BigDecimal getYeardebitfor() { + return yeardebitfor; + } + + public void setYeardebitfor(BigDecimal yeardebitfor) { + this.yeardebitfor = yeardebitfor; + } + + public BigDecimal getBeginlocal() { + return beginlocal; + } + + public void setBeginlocal(BigDecimal beginlocal) { + this.beginlocal = beginlocal; + } + + public long getAccount() { + return account; + } + + public void setAccount(long account) { + this.account = account; + } + + public BigDecimal getEndlocal() { + return endlocal; + } + + public void setEndlocal(BigDecimal endlocal) { + this.endlocal = endlocal; + } + + // 嵌套类 + public static class AssGrpItem { + private String number; + private String name; + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } +} diff --git a/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/utils/BalanceQueryParamApi.java b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/utils/BalanceQueryParamApi.java new file mode 100644 index 0000000..684d8fb --- /dev/null +++ b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/utils/BalanceQueryParamApi.java @@ -0,0 +1,125 @@ +package zcgj.zcdev.zcdev.fs.utils; + +import com.kingdee.bos.webapi.entity.KDException; +import kd.bos.exception.BosErrorCode; +import kd.bos.util.JSONUtils; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class BalanceQueryParamApi { + + //查询字段 + private List selectors = new ArrayList(); + //组织编码 + private String orgNumber; + //账簿类型编码 + private String bookTypeNumber; + //期间编码 + private String periodNumber; + //币别编码 + private String currencyNumber; + //科目表编码 + private String accountTableNumber; + //科目编码:多组核算维度编码 + //accountAssgrp的内部Map -> 核算维度类型编码:核算维度值的编码 + private Map>> accountAssgrp = new HashMap<>(); + //分组字段;只包含:余额表字段与查询的核算维度 + private List groupBys = new ArrayList(); + //是否扣减损益类金额 + private boolean isSubstractPL = false; + //指定科目查询 + private boolean isSpecialAccount = true; + + public List getSelectors() { + return selectors; + } + + public void setSelectors(List selectors) { + this.selectors = selectors; + } + + public String getOrgNumber() { + return orgNumber; + } + + public void setOrgNumber(String orgNumber) { + this.orgNumber = orgNumber; + } + + public String getBookTypeNumber() { + return bookTypeNumber; + } + + public void setBookTypeNumber(String bookTypeNumber) { + this.bookTypeNumber = bookTypeNumber; + } + + public String getPeriodNumber() { + return periodNumber; + } + + public void setPeriodNumber(String periodNumber) { + this.periodNumber = periodNumber; + } + + public String getCurrencyNumber() { + return currencyNumber; + } + + public void setCurrencyNumber(String currencyNumber) { + this.currencyNumber = currencyNumber; + } + + public String getAccountTableNumber() { + return accountTableNumber; + } + + public void setAccountTableNumber(String accountTableNumber) { + this.accountTableNumber = accountTableNumber; + } + + public Map>> getAccountAssgrp() { + return accountAssgrp; + } + + public void setAccountAssgrp(Map>> accountAssgrp) { + this.accountAssgrp = accountAssgrp; + } + + public List getGroupBys() { + return groupBys; + } + + public void setGroupBys(List groupBys) { + this.groupBys = groupBys; + } + + public boolean isSubstractPL() { + return isSubstractPL; + } + + public void setSubstractPL(boolean substractPL) { + isSubstractPL = substractPL; + } + + public boolean isSpecialAccount() { + return isSpecialAccount; + } + + public void setSpecialAccount(boolean specialAccount) { + isSpecialAccount = specialAccount; + } + + @Override + public String toString() { + try { + return JSONUtils.toString(this); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +}