From 0c654cd10a0460ff019ffd2c947ad3f9f29af1ce Mon Sep 17 00:00:00 2001 From: yuxueliang0813 <407010292@qq.com> Date: Thu, 17 Jul 2025 19:38:11 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81sso=E4=BF=AE=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=8F=96=E8=B4=A6=E5=8F=B7=E4=BD=9C=E4=B8=BA=E5=8C=B9=E9=85=8D?= =?UTF-8?q?=202=E3=80=81=E5=A2=9E=E5=8A=A0=E6=94=B6=E6=AC=BE=E5=8D=95?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=B5=84=E9=87=91=E8=AE=A1=E5=88=92=E7=A7=91?= =?UTF-8?q?=E7=9B=AE=E7=9A=84=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jhzj7/fi/fi/common/JHSSOAuthHandler.java | 12 +- .../fi/plugin/task/NotSAPNumNoticeTask.java | 11 +- .../fi/fi/plugin/task/RecBillZjjhTask.java | 390 ++++++++++++++++++ 3 files changed, 407 insertions(+), 6 deletions(-) create mode 100644 main/java/shjh/jhzj7/fi/fi/plugin/task/RecBillZjjhTask.java diff --git a/main/java/shjh/jhzj7/fi/fi/common/JHSSOAuthHandler.java b/main/java/shjh/jhzj7/fi/fi/common/JHSSOAuthHandler.java index 73d4542..d354fac 100644 --- a/main/java/shjh/jhzj7/fi/fi/common/JHSSOAuthHandler.java +++ b/main/java/shjh/jhzj7/fi/fi/common/JHSSOAuthHandler.java @@ -25,7 +25,7 @@ public class JHSSOAuthHandler implements ThirdSSOAuthHandler { private String callBackUrl = System.getProperty("domain.contextUrl"); - private static final String[] projectgroups = new String[]{"mahongqiang","xujianbiao","anchenyuan","yuxueliang","weiyunlong","liguiqiang"}; + private static final String[] projectgroups = new String[]{"mahongqiang","xujianbiao","anchenyuan","yuxueliang","liguiqiang"}; @Override public void callTrdSSOLogin(HttpServletRequest hsrequest, HttpServletResponse hsresponse, String backUrl) { @@ -135,7 +135,15 @@ public class JHSSOAuthHandler implements ThirdSSOAuthHandler { logger.info("认证中心Userinfo result:"+linkPostjson); if (StringUtils.isNotEmpty(linkPostjson)) { jsonObject = JSONObject.parseObject(linkPostjson); - return jsonObject.getString("id"); + //修改成从account_no取值 yxl 20250717 + //派拉反馈:我们分几种用户类型,id会不同,所以才建议你们最好取account_no字段 + JSONObject resultJO = jsonObject.getJSONObject("attributes"); + if(resultJO == null) { + //如果没有attributes的对象,还返回id + return jsonObject.getString("id"); + }else { + return resultJO.getString("account_no"); + } } } } catch (Exception e) { diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/task/NotSAPNumNoticeTask.java b/main/java/shjh/jhzj7/fi/fi/plugin/task/NotSAPNumNoticeTask.java index 318cae8..5d1640e 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/task/NotSAPNumNoticeTask.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/task/NotSAPNumNoticeTask.java @@ -32,7 +32,7 @@ public class NotSAPNumNoticeTask extends AbstractTask implements Plugin { //fk_shjh_ispushsap 已推送sap标记 private static final String recesql = "select fopenorgid,fpayerid,fpayername,count(fid) from T_CAS_ReceivingBill where fk_shjh_ispushsap='0' and to_char(Fpayeedate,'yyyy-MM-DD')=? group by fopenorgid,fpayerid,fpayername"; - private static final String recbillName = "cas_recbill";//收款单 T_CAS_ReceivingBill +// private static final String recbillName = "cas_recbill";//收款单 T_CAS_ReceivingBill private static final String pzbName = "shjh_sfkwyltzb";//收付款未认领人员通知映射表 private static final Log logger = LogFactory.getLog(NotSAPNumNoticeTask.class); @@ -56,7 +56,6 @@ public class NotSAPNumNoticeTask extends AbstractTask implements Plugin { //遍历map处理消息发送 QFilter qFilter; - QFilter custFilter; DynamicObject[] pzbcoll; DynamicObject pzbinfo; DynamicObjectCollection users;//配置表中的被通知人集合 @@ -77,10 +76,14 @@ public class NotSAPNumNoticeTask extends AbstractTask implements Plugin { qFilter = new QFilter("shjh_biztype", QCP.equals, "sk");//业务类型为收款 qFilter.and("shjh_org", QCP.equals, Long.parseLong(orgid));//公司ID qFilter.and("enable", QCP.equals, "1");//使用状态 - custFilter = new QFilter("shjh_customer", QCP.equals, Long.parseLong(customerid));//客户 - pzbcoll = BusinessDataServiceHelper.load(pzbName,"id",new QFilter[]{qFilter,custFilter}); + qFilter.and("shjh_customer", QCP.equals, Long.parseLong(customerid));//客户 + pzbcoll = BusinessDataServiceHelper.load(pzbName,"id",qFilter.toArray()); if(pzbcoll == null || pzbcoll.length == 0){ //根据客户没有找到对应配置表,去掉客户再查找一次 + qFilter = new QFilter("shjh_biztype", QCP.equals, "sk");//业务类型为收款 + qFilter.and("shjh_org", QCP.equals, Long.parseLong(orgid));//公司ID + qFilter.and("enable", QCP.equals, "1");//使用状态 + qFilter.and("shjh_customer", QCP.equals, 0L);//客户为空 pzbcoll = BusinessDataServiceHelper.load(pzbName,"id",qFilter.toArray()); } if(pzbcoll != null && pzbcoll.length >= 1){ diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/task/RecBillZjjhTask.java b/main/java/shjh/jhzj7/fi/fi/plugin/task/RecBillZjjhTask.java new file mode 100644 index 0000000..b4a8c1a --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/task/RecBillZjjhTask.java @@ -0,0 +1,390 @@ +package shjh.jhzj7.fi.fi.plugin.task; + +import kd.bos.context.RequestContext; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.exception.KDException; +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.schedule.executor.AbstractTask; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.operation.SaveServiceHelper; +import kd.sdk.plugin.Plugin; + +import java.util.*; + +public class RecBillZjjhTask extends AbstractTask implements Plugin { + private static final Log logger = LogFactory.getLog(RecBillZjjhTask.class); + + private static final String recbillName = "cas_recbill";//收款单 T_CAS_ReceivingBill + + @Override + public void execute(RequestContext requestContext, Map map) throws KDException { + + DynamicObject[] recbills = BusinessDataServiceHelper.load(recbillName, "id", null); + logger.info("本次需要处理的收款单个数"+recbills.length); + ArrayList ids = new ArrayList<>(recbills.length); + for (DynamicObject doinfo : recbills) { + ids.add(doinfo.getLong("id")); + } + Map recBillMap = BusinessDataServiceHelper.loadFromCache(ids.toArray(), recbillName); + DynamicObject zjaccount;//资金计划科目 + for (DynamicObject recbill : recBillMap.values()) { + //根据配置表携带资金计划科目 + zjaccount = xdMembersubject(recbill); + recbill.set("shjh_planclass", zjaccount); + if(zjaccount == null){ + logger.info(recbill.getString("billno")+"对应资金计划科目为空"); + }else{ + logger.info(recbill.getString("billno")+"对应资金计划科目为"+zjaccount.getLong("id")); + } + SaveServiceHelper.save(new DynamicObject[]{recbill}); + } + } + + private DynamicObject xdMembersubject(DynamicObject bill) { + // 收款单,系统自动根据配置表(shjh_pay_account)带出资金计划科目 + Date bizDate = bill.getDate("bizdate"); + QFilter qFilter = new QFilter("shjh_biztype", QCP.equals, "B"); // 业务类型:收款 + qFilter.and(new QFilter("status", QCP.equals, "C")); // 审核状态 + qFilter.and(new QFilter("enable",QCP.equals,"1"));//启用状态 + qFilter.and(new QFilter("shjh_begindate", QCP.less_equals, bizDate)); + qFilter.and(new QFilter("shjh_enddate", QCP.large_equals, bizDate)); + + // 加载配置数据,并按优先级排序 + DynamicObject[] load = BusinessDataServiceHelper.load( + "shjh_pay_account", + "id,shjh_priority,shjh_companys,shjh_bbhzz,shjh_bizbig,shjh_bbhywdl,shjh_bizsmall,shjh_cc,shjh_yym,shjh_kjkm,shjh_bhkh,shjh_bbhkh,shjh_bhgys,shjh_bbhgys,shjh_bbhbz,shjh_khzw,shjh_membersubject", + qFilter.toArray(), + "shjh_priority" + ); + + if (load.length == 0) { + return null; // 无匹配配置,返回 null + } + // 转换为 List 以便支持 remove 操作 + List configList = new ArrayList<>(Arrays.asList(load)); + // 遍历并过滤配置 + Iterator iterator = configList.iterator(); + while (iterator.hasNext()) { + DynamicObject config = iterator.next(); + + // 1. 检查公司范围(包含) + if (checkDynamicDataMatch(config, bill, "shjh_companys", "openorg")) { + iterator.remove(); + continue; + } + + // 2. 检查不包含的公司范围(排除) + if (checkNotDynamicMatch(config, bill, "shjh_bbhzz", "openorg")) { + iterator.remove(); + continue; + } + + // 3. 检查业务大类(包含) + if (checkDynamicDataMatch(config, bill, "shjh_bizbig", "shjh_bizebig")) { + iterator.remove(); + continue; + } + + // 4. 检查不包含的业务大类(排除) + if (checkNotDynamicMatch(config, bill, "shjh_bbhywdl", "shjh_bizebig")) { + iterator.remove(); + continue; + } + + // 5. 检查业务小类(包含) + if (checkDynamicDataMatch(config, bill, "shjh_bizsmall", "shjh_bizsmall")) { + iterator.remove(); + continue; + } + + // 6. 检查成本中心(包含) + if (checkDynamicDataMatch(config, bill, "shjh_cc", "shjh_costcenter")) { + iterator.remove(); + continue; + } + + // 7. 检查原因码(包含) + if (checkDynamicDataMatch(config, bill, "entry", "shjh_yym", "shjh_yym")) { + iterator.remove(); + continue; + } + + // 8. 检查会计科目(包含) + if (checkDynamicDataMatch(config, bill, "entry", "shjh_kjkm", "shjh_accountsap")) { + iterator.remove(); + continue; + } + + // 9. 检查币种(不包含) + if (checkNotDynamicMatch(config, bill, "shjh_bbhbz", "currency")) { + iterator.remove(); + continue; + } + + //付款人类型 + String payerType = bill.getString("payertype"); + if (null!=payerType) { + switch (payerType) { + case "bd_customer": + // 10_1. 检查客户(包含) + if (checkCustomerOrSupplierMatch(config, bill, "shjh_bhkh", "payer")) { + iterator.remove(); + continue; + } + + // 10_2. 检查客户(不包含) + if (checkNotCustomerOrSupplierMatch(config, bill, "shjh_bbhkh", "payer")) { + iterator.remove(); + continue; + } + + // 10_3.检查客户组(包含) + if (checkCustomerGroup(config, bill)) { + iterator.remove(); + continue; + } + + break; + case "bd_supplier": + // 11_1. 检查供应商(包含) + if (checkCustomerOrSupplierMatch(config, bill, "shjh_bhgys", "payer")) { + iterator.remove(); + continue; + } + + // 11_2. 检查供应商(不包含) + if (checkNotCustomerOrSupplierMatch(config, bill, "shjh_bbhgys", "payer")) { + iterator.remove(); + continue; + } + + break; + default: + break; + } + } + } + + // 处理剩余数据 + if (configList.isEmpty()) { + return null; // 无匹配配置 + } else { + // 默认取优先级最高的第一条数据 + DynamicObject selectedConfig = configList.get(0); + return selectedConfig.getDynamicObject("shjh_membersubject"); + } + } + + /** + * 不包含某个多选基础资料 + * @param accountBill 资金计划科目表 + * @param recBill 收款处理 + * @param accountField 被匹配基础资料标识 + * @param recField 提供基础资料标识 + * @return 是否符合 + */ + private boolean checkNotDynamicMatch(DynamicObject accountBill, DynamicObject recBill ,String accountField,String recField) { + DynamicObjectCollection dynamicObjectCollection = accountBill.getDynamicObjectCollection(accountField); + if (dynamicObjectCollection.isEmpty()) { + return false; // 无排除限制则通过 + } + + DynamicObject dynamicObject = recBill.getDynamicObject(recField); + if (dynamicObject == null) { + return false; // 单据无信息,无法排除 + } + + Long bizBigId = dynamicObject.getLong("id"); + for (DynamicObject object : dynamicObjectCollection) { + if (bizBigId.compareTo(object.getLong("fbasedataid_id")) == 0) { + return true; // 匹配到 + } + } + return false; // 未匹配到 + } + + /** + * 包含某个多选基础资料-收款单表头取数 + * @param accountBill 资金计划科目表 + * @param recBill 收款处理 + * @param accountField 被匹配基础资料标识 + * @param recField 提供基础资料标识 + * @return 是否符合 + */ + private boolean checkDynamicDataMatch(DynamicObject accountBill, DynamicObject recBill ,String accountField,String recField){ + DynamicObjectCollection dynamicObjectCollection = accountBill.getDynamicObjectCollection(accountField); + if (dynamicObjectCollection.isEmpty()) { + return false; // 无限制-通过 + } + + DynamicObject dynamicObject = recBill.getDynamicObject(recField); + if (dynamicObject == null) { + return true; // 已经指定范围,但收款单无字段-移除 + } + + Long id = dynamicObject.getLong("id"); + for (DynamicObject object : dynamicObjectCollection) { + if (id.compareTo(object.getLong("fbasedataid_id")) == 0) { + return false; // 匹配到包含的基础资料-通过 + } + } + return true; // 未匹配到包含的多选基础资料 + } + + /** + * 包含某个多选基础资料-收款单分录取数 + * @param accountBill 资金计划科目表 + * @param recBill 收款处理 + * @param entryName 分录标识 + * @param accountField 被匹配基础资料标识 + * @param recField 提供基础资料标识 + * @return 是否符合 + */ + private boolean checkDynamicDataMatch(DynamicObject accountBill, DynamicObject recBill ,String entryName,String accountField,String recField){ + DynamicObjectCollection dynamicObjectCollection = accountBill.getDynamicObjectCollection(accountField); + if (dynamicObjectCollection.isEmpty()) { + return false; // 无限制则通过 + } + + DynamicObjectCollection entry = recBill.getDynamicObjectCollection(entryName); + if (entry.isEmpty()) { + return true; // 单据字段信息,不匹配 + } + + DynamicObject dynamicObject = entry.get(0).getDynamicObject(recField); + if (dynamicObject==null){ + return true;//放行 + } + Long orgId = dynamicObject.getLong("id"); + for (DynamicObject object : dynamicObjectCollection) { + if (orgId.compareTo(object.getLong("fbasedataid_id")) == 0) { + return false; // 匹配到包含的基础资料-放行 + } + } + return true; // 未匹配到包含的多选基础资料-移除 + } + + /** + * 针对包含客户||供应商 + * @param accountBill + * @param recBill + * @param accountField + * @param recField + * @return + */ + private boolean checkCustomerOrSupplierMatch(DynamicObject accountBill, DynamicObject recBill ,String accountField,String recField){ + DynamicObjectCollection dynamicObjectCollection = accountBill.getDynamicObjectCollection(accountField); + if (dynamicObjectCollection.isEmpty()) { + return false; // 无限制则通过 + } + + Long id = recBill.getLong(recField); + if (id == 0L) { + return true; // 单据字段信息,不匹配 + } + + for (DynamicObject object : dynamicObjectCollection) { + if (id.compareTo(object.getLong("fbasedataid_id")) == 0) { + return false; // 匹配到包含的基础资料 + } + } + return true; // 未匹配到包含的多选基础资料 + } + + /** + * 针对不包含客户||供应商 + * @param accountBill + * @param recBill + * @param accountField + * @param recField + * @return + */ + private boolean checkNotCustomerOrSupplierMatch(DynamicObject accountBill, DynamicObject recBill ,String accountField,String recField){ + DynamicObjectCollection dynamicObjectCollection = accountBill.getDynamicObjectCollection(accountField); + if (dynamicObjectCollection.isEmpty()) { + return false; // 无限制则通过 + } + + Long id = recBill.getLong(recField); + if (id == 0L) { + return false; // 单据字段信息,不匹配 + } + + for (DynamicObject object : dynamicObjectCollection) { + if (id.compareTo(object.getLong("fbasedataid_id")) == 0) { + return true; // 匹配到包含的基础资料 + } + } + return false; // 未匹配到包含的多选基础资料 + } + + /** + * 针对客户检查客户组,客户组为必填项 + * @param accountBill 资金计划科目表 + * @param recBill 收款处理 + * @return + */ + private boolean checkCustomerGroup(DynamicObject accountBill, DynamicObject recBill) { + // 1. 获取客户ID + Long id = recBill.getLong("payer"); + if (id == null) { + return false; // 无付款人信息,默认通过 + } + + // 2. 加载客户对象 + DynamicObject customer = BusinessDataServiceHelper.loadSingle(id, "bd_customer"); + if (customer == null) { + return false; // 客户不存在,默认通过 + } + + // 3. 获取客户的客户组列表(shjh_entry_five) + DynamicObjectCollection customerGroups = customer.getDynamicObjectCollection("shjh_entry_five"); + if (customerGroups.isEmpty()) { + return false; // 客户未关联任何客户组,默认通过 + } + + // 4. 获取配置表中允许的客户组列表(shjh_khzw) + DynamicObjectCollection allowedGroups = accountBill.getDynamicObjectCollection("shjh_khzw"); + if (allowedGroups.isEmpty()) { + return false; // 配置未限制客户组,默认通过 + } + + //获取收款单组织 + DynamicObject openorg = recBill.getDynamicObject("openorg"); + String orgNumber = ""; + if (null != openorg) { + orgNumber = openorg.getString("number"); + } + + // 5. 检查客户是否属于配置允许的客户组 + for (DynamicObject customerGroup : customerGroups) { + String customerGroupNumber = customerGroup.getString("shjh_entryfive_number"); + if (customerGroupNumber == null) { + continue; // 跳过无编号的客户组 + } + + String salecompanynum = customerGroup.getString("shjh_salecompanynum"); + if (salecompanynum == null) { + continue; // 跳过无销售公司编号的客户组 + } + + if (!salecompanynum.equals(orgNumber)) { + continue; // 跳过销售公司编号与收款单核算组织不匹配的客户组 + } + + for (DynamicObject allowedGroup : allowedGroups) { + DynamicObject baseDataObj = allowedGroup.getDynamicObject("fbasedataid"); + String number=baseDataObj.getString("number"); + if (customerGroupNumber.equals(number)) { + return false; // 匹配到允许的客户组 + } + } + } + + return true; // 客户不属于任何允许的客户组 + } +}