From 5c1146ffae43a814ab0db23ce42acf62770b3d3c Mon Sep 17 00:00:00 2001 From: yuxueliang0813 <407010292@qq.com> Date: Wed, 9 Apr 2025 17:56:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=85=E8=B4=A6=E5=8D=95=E5=8F=8D=E5=86=99?= =?UTF-8?q?=E6=94=B6=E6=AC=BE=E5=8D=95=EF=BC=8C=E5=9F=BA=E7=A1=80=E8=B5=84?= =?UTF-8?q?=E6=96=99=E6=8E=A5=E5=8F=A3=E6=9B=B4=E6=96=B0masterid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fi/plugin/form/ASParbillFormPlugin.java | 8 +- .../form/RecBillAddEntryPushPlugin.java | 104 +++++++++++++----- .../operate/ClearAccountBillOperation.java | 87 ++++++++++++++- .../fi/fi/webapi/CostCenterControler.java | 5 + .../fi/fi/webapi/CustomerFiveControler.java | 5 + .../fi/fi/webapi/ProfitCenterControler.java | 5 + 6 files changed, 179 insertions(+), 35 deletions(-) diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/form/ASParbillFormPlugin.java b/main/java/shjh/jhzj7/fi/fi/plugin/form/ASParbillFormPlugin.java index 7e2e07c..6dfdac7 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/form/ASParbillFormPlugin.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/form/ASParbillFormPlugin.java @@ -247,13 +247,13 @@ public class ASParbillFormPlugin extends AbstractFormPlugin { this.getModel().setValue("shjh_e_pzh",detail.getString("BELNR"), i);//凭证号 this.getModel().setValue("shjh_e_pzlx",detail.getString("BLART"), i);//凭证类型 this.getModel().setValue("shjh_e_pzhh",detail.getString("BUZEI"), i);//凭证行项目号 - this.getModel().setValue("shjh_e_fph",detail.getString("XREF1"), i);//发票号 + this.getModel().setValue("shjh_e_fph",detail.getString("AWKEY"), i);//发票号 // this.getModel().setValue("shjh_e_fpdate",detail.getDate(""), i);//发票日期 this.getModel().setValue("shjh_e_account",detail.getString("HKONT"), i);// 总账科目 // this.getModel().setValue("shjh_e_fenpei",detail.getString(""), i);// 分配 - this.getModel().setValue("shjh_e_canzhao",detail.getString("AWKEY"), i);// 参照 - this.getModel().setValue("shjh_e_ckdm1",detail.getString("XREF2"), i);//参考代码1 - this.getModel().setValue("shjh_e_ckdm2",detail.getString("XREF3"), i);// 参考代码2 + this.getModel().setValue("shjh_e_canzhao",detail.getString("XBLNR"), i);// 参照 + this.getModel().setValue("shjh_e_ckdm1",detail.getString("XREF1"), i);//参考代码1 + this.getModel().setValue("shjh_e_ckdm2",detail.getString("XREF2"), i);// 参考代码2 // this.getModel().setValue("shjh_e_text",detail.getString(""), i);// 文本 this.getModel().setValue("shjh_e_gzdate",detail.getDate("BUDAT"), i);// 过账日期 this.getModel().setValue("shjh_e_unsettle",detail.getBigDecimal("DMBTR"), i);//未核销金额 diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/form/RecBillAddEntryPushPlugin.java b/main/java/shjh/jhzj7/fi/fi/plugin/form/RecBillAddEntryPushPlugin.java index a80b9de..2b432f4 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/form/RecBillAddEntryPushPlugin.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/form/RecBillAddEntryPushPlugin.java @@ -5,19 +5,11 @@ import kd.bos.dataentity.OperateOption; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.dataentity.utils.StringUtils; -import kd.bos.entity.datamodel.ListSelectedRow; -import kd.bos.entity.datamodel.ListSelectedRowCollection; import kd.bos.entity.operate.OperateOptionConst; import kd.bos.entity.operate.result.OperationResult; -import kd.bos.form.CloseCallBack; -import kd.bos.form.FormShowParameter; -import kd.bos.form.ShowType; -import kd.bos.form.container.Tab; import kd.bos.form.control.EntryGrid; -import kd.bos.form.control.Label; import kd.bos.form.control.events.BeforeItemClickEvent; import kd.bos.form.control.events.ItemClickEvent; -import kd.bos.form.control.events.RowClickEvent; import kd.bos.form.control.events.RowClickEventListener; import kd.bos.form.events.ClosedCallBackEvent; import kd.bos.logging.Log; @@ -29,10 +21,7 @@ import kd.sdk.plugin.Plugin; import shjh.jhzj7.fi.fi.plugin.form.info.RecFieldsInfo; import java.math.BigDecimal; -import java.util.ArrayList; import java.util.EventObject; -import java.util.HashMap; -import java.util.List; /** * 单据界面插件 @@ -92,6 +81,11 @@ public class RecBillAddEntryPushPlugin extends AbstractBillPlugIn implements Row if (actAmount.compareTo(BigDecimal.ZERO) <= 0) { errorMessage.append("收款金额>0\r\n"); } + // 校验收款单上的被通知人是否有值 yxl 20250409 + if(this.getModel().getValue(FIELD_NOTICE_USER) == null){ + errorMessage.append("未选择被通知人\r\n"); + } + if (errorMessage.length() > 0) { errorMessage.insert(0,"不符合补推条件:\r\n"); this.getView().showMessage(errorMessage.toString()); @@ -105,20 +99,80 @@ public class RecBillAddEntryPushPlugin extends AbstractBillPlugIn implements Row super.itemClick(evt); // 判断点击的是否为指定的按钮 if (StringUtils.equals(RecFieldsInfo.BUTTON_ADD_ENTRY_PUSH, evt.getItemKey())) { - //传参 - HashMap map = new HashMap<>(3); - //按钮区分标识 - map.put("buttonKey","addEntryPush"); - FormShowParameter showParameter = new FormShowParameter(); - //需要打开单据的标识 - showParameter.setFormId(TARGET_NAME); - //打开方式 - showParameter.getOpenStyle().setShowType(ShowType.Modal); - //传到子页面参数 - showParameter.setCustomParams(map); - //回调方法 - showParameter.setCloseCallBack(new CloseCallBack(this,"addEntryPush")); - this.getView().showForm(showParameter); +// //传参 +// HashMap map = new HashMap<>(3); +// //按钮区分标识 +// map.put("buttonKey","addEntryPush"); +// FormShowParameter showParameter = new FormShowParameter(); +// //需要打开单据的标识 +// showParameter.setFormId(TARGET_NAME); +// //打开方式 +// showParameter.getOpenStyle().setShowType(ShowType.Modal); +// //传到子页面参数 +// showParameter.setCustomParams(map); +// //回调方法 +// showParameter.setCloseCallBack(new CloseCallBack(this,"addEntryPush")); +// this.getView().showForm(showParameter); + + // 获取表单的主键值 + Object pkValue = this.getModel().getValue("id"); + + // 获取分录表格控件 + EntryGrid entryGrid = this.getControl(ENTRY); + + // 获取选中的行索引 + int[] selectRows = entryGrid.getSelectRows(); + + // 如果没有选中任何行,提示用户并返回 + if (selectRows.length == 0) { + this.getView().showMessage("请选择需要补推的分录数据。"); + return; + } + + // 根据主键值加载单据数据 + DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkValue, ENTITY_REC_BILL); + if (dynamicObject != null) { + dynamicObject.set(FIELD_NOTICE_USER, this.getModel().getValue(FIELD_NOTICE_USER)); + // 获取分录数据集合 + DynamicObjectCollection collection = dynamicObject.getDynamicObjectCollection(ENTRY); + + if (collection != null && collection.size() > 0) { + // 遍历选中的行索引 + for (int rowIndex : selectRows) { + // 确保选中的行索引在有效范围内 + if (rowIndex >= 0 && rowIndex < collection.size()) { + // 获取对应的分录数据 + DynamicObject entry = collection.get(rowIndex); + // 在这里对选中的分录数据进行处理 + boolean isNeedPush = entry.getBoolean(RecFieldsInfo.NEED_PUSH_BILL); + if (!isNeedPush){ + entry.set(RecFieldsInfo.NEED_PUSH_BILL, true); + } + } + } + SaveServiceHelper.update(dynamicObject); + OperateOption operateOption = OperateOption.create(); + operateOption.setVariableValue(OperateOptionConst.IGNOREWARN, String.valueOf(true)); // 不执行警告级别校验器 + operateOption.setVariableValue(OperateOptionConst.IGNOREINTERACTION, String.valueOf(true)); // 不显示交互提示 + operateOption.setVariableValue(OperateOptionConst.STRICTVALIDATION, String.valueOf(true)); // 全部校验通过才保存 + operateOption.setVariableValue(OperateOptionConst.MUTEX_ISSTRICT, String.valueOf(true)); // 严格互斥 + try { + OperationResult operationResult = OperationServiceHelper.executeOperate( + OPERATION_PUSH_CLEAR, ENTITY_REC_BILL, new DynamicObject[]{dynamicObject}, operateOption + ); + + if (!operationResult.isSuccess()) { + logger.error("下推清账单失败: " + operationResult.getMessage()); + this.getView().showMessage("下推清账单失败,请检查数据后重试!"); + }else { + this.getView().showMessage("下推成功!"); + } + } catch (Exception e) { + logger.error("下推清账单异常", e); + this.getView().showMessage("下推清账单异常,请稍后重试!"); + } + } + } } } diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/ClearAccountBillOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/ClearAccountBillOperation.java index 1fc08ca..3f69535 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/operate/ClearAccountBillOperation.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/ClearAccountBillOperation.java @@ -45,6 +45,8 @@ public class ClearAccountBillOperation extends AbstractOperationServicePlugIn im private static final String queryRealtion = "select fsid,fsbillid from tk_shjh_clear_account_tc where ftbillid=?;";//查看清账单与收款单的关联关系表 + private static final String updateReceivBill = "update T_CAS_ReceivingBill set fk_shjh_qzzt=? where fid=?;";//收款单表头清账状态 + private static final String entityName = "shjh_clear_acctdetail";//清账明细单 private static final String userName = "bos_user";//用户 private static final String recbillName = "cas_recbill";//收款单 @@ -142,12 +144,13 @@ public class ClearAccountBillOperation extends AbstractOperationServicePlugIn im } private boolean reWriteCeceBill(DynamicObject prinfo, String closingstatus){ - //TODO 反写收款单分录行 表头清账状态如何标记? + Set recebills = new HashSet<>(); //根据清账单id查找上游收款单分录行 List entryids = DB.query(DBRoute.of("fi"),queryRealtion,new Object[]{prinfo.getPkValue()},(rs) -> { List entryidList = new ArrayList<>(); while(rs.next()) { entryidList.add(rs.getLong(1)); + recebills.add(rs.getLong(2)); } return entryidList; }); @@ -160,13 +163,86 @@ public class ClearAccountBillOperation extends AbstractOperationServicePlugIn im } sqlsb.setLength(sqlsb.length()-1); sqlsb.append(");"); - //更新反清账日期和反清后处理方式 + //更新收款单分录的清账状态字段 DB.update(DBRoute.of("fi"), sqlsb.toString(), new Object[]{closingstatus}); + + //处理收款单表头的清账状态字段 + DynamicObject billinfo; + DynamicObjectCollection docs; + String headerStatus; + for (Long recebill : recebills) { + billinfo = BusinessDataServiceHelper.loadSingle(recebill, recbillName,"id,billno,shjh_qzzt,entry.id,entry.shjh_closingstatus"); + docs = billinfo.getDynamicObjectCollection("entry");//收款分录明细 + headerStatus = getClosingStatus(docs); + if(headerStatus != null){ + DB.update(DBRoute.of("fi"), updateReceivBill, new Object[]{headerStatus,billinfo.getPkValue()}); + } + } return true; } return false; } + //判断收款单表头清账状态的计算逻辑 + private String getClosingStatus(DynamicObjectCollection entry) { + // 是否包含待清账 + boolean hasPendingClear = false; + // 是否包含已清账 + boolean hasCleared = false; + // 是否包含反清账 + boolean hasReversedClear = false; + // 是否包含无需金蝶清账 + boolean hasNoClear = false; + // 是否所有分录行都是已清账 + boolean allCleared = true; + // 是否所有分录行都是反清账 + boolean allReversedCleared = true; + + //遍历分录行,判断每行清账状态 + for (int i = 0; i < entry.size(); i++) { + switch (entry.get(i).getString("shjh_closingstatus")) { + case "A": + hasNoClear = true; + break; + case "B": + hasPendingClear = true; + break; + case "C": + hasCleared = true; + // 如果有不是“已清账”的,就说明不是全部“已清账” + allCleared = false; + break; + case "D": + hasReversedClear = true; + // 如果有不是“反清账”的,就说明不是全部“反清账” + allReversedCleared = false; + break; + default: + break; + } + } + // 根据分录行状态来设置表头清账状态 + String headerStatus; + if (hasNoClear && !hasPendingClear && !hasCleared && !hasReversedClear) { + headerStatus = "A"; + } else if (hasPendingClear && !hasCleared && !hasReversedClear) { + headerStatus = "B"; + } else if (hasCleared && !hasReversedClear && !hasPendingClear) { + headerStatus = "C"; + } else if (hasReversedClear && !hasPendingClear && !hasCleared) { + headerStatus = "D"; + } else if (hasCleared && !allCleared && !hasReversedClear) { + // 判断部分清账的条件:包含已清账但不全是已清账,并且不包含反清账 + headerStatus = "E"; + } else if (hasReversedClear && !allReversedCleared) { + // 判断部分反清账的条件:包含反清账但不全是反清账 + headerStatus = "F"; + }else { + headerStatus = null; + } + return headerStatus; + } + private void handleUpdateStatus(AfterOperationArgs e) { //清账单清账状态支持手工修改,可由待清账转为已清账状态并填写清账原因 DynamicObject[] dos = e.getDataEntities(); @@ -174,7 +250,7 @@ public class ClearAccountBillOperation extends AbstractOperationServicePlugIn im for (int i = 0; i < dos.length; i++) { prinfo = dos[i]; DB.update(DBRoute.of("fi"), hadleClearStatusByID, new Object[]{prinfo.getPkValue()}); - //TODO 反写上游收款单,分录行【清账状态】=已清账 C 反清账是D。 + //反写上游收款单,分录行【清账状态】=已清账 C 反清账是D。 if(reWriteCeceBill(prinfo,"C")){ //下游清账明细单,【单据状态】=作废。若清账信息有误,需在SAP反清账后修改。 DB.update(DBRoute.of("fi"), updateDetailStatusByBill, new Object[]{prinfo.getString("id")}); @@ -485,7 +561,7 @@ public class ClearAccountBillOperation extends AbstractOperationServicePlugIn im clear.put("BELNR",recebill.getString("shjh_vouchernum"));//收款sap凭证编号 clear.put("GJAHR",recebill.getString("shjh_sapfiscalyear"));//收款sap会计年度 clear.put("BUZEI",recebill.getString("shjh_sapline"));//收款sap凭证行号 - clear.put("HKONT",getAccountNumber(entry.getValue()));//TODO 总账科目-如何取值? + clear.put("HKONT",getAccountNumber(entry.getValue()));//总账科目-从对应收款单的凭证上取值 clear.put("DMBTR1",receentry.getString("e_actamt"));//清账金额-收款单分录的实收金额 IT_CLEAR.add(clear); break; @@ -568,7 +644,7 @@ public class ClearAccountBillOperation extends AbstractOperationServicePlugIn im //处理完成提示 this.operationResult.addSuccessPkId(prinfo.getPkValue()); } - //TODO 如果清账明细单【单据状态】=已审核,发送审核通过的邮件通知,企微通知。 + //如果清账明细单【单据状态】=已审核,发送审核通过的邮件通知。 if (!detailList.isEmpty()) { Map userBill = new HashMap<>(); String billno; @@ -609,6 +685,5 @@ public class ClearAccountBillOperation extends AbstractOperationServicePlugIn im private void handleNotice(AfterOperationArgs e) { //通知具体实现 - //清账单的下游所有清账明细单实时通知被通知人进行清账。发送邮件通知、OA待办。 } } \ No newline at end of file diff --git a/main/java/shjh/jhzj7/fi/fi/webapi/CostCenterControler.java b/main/java/shjh/jhzj7/fi/fi/webapi/CostCenterControler.java index 886ff8f..523a91b 100644 --- a/main/java/shjh/jhzj7/fi/fi/webapi/CostCenterControler.java +++ b/main/java/shjh/jhzj7/fi/fi/webapi/CostCenterControler.java @@ -8,6 +8,7 @@ import com.drew.lang.annotations.NotNull; import kd.bos.api.client.ApiResult; import kd.bos.context.RequestContext; import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.id.ID; import kd.bos.logging.Log; import kd.bos.logging.LogFactory; import kd.bos.openapi.common.custom.annotation.ApiController; @@ -122,6 +123,10 @@ public class CostCenterControler { }else{ currentOrg.set("longnumber",orgNumber); } + //处理masterid,不然凭证辅助帐无法选择 + Long currentId = ID.genLongId(); + currentOrg.set("id", currentId); + currentOrg.set("masterid",currentId); } currentOrg.set("name",orgName); currentOrg.set("orgduty",getDuty(typeNum));//类型 diff --git a/main/java/shjh/jhzj7/fi/fi/webapi/CustomerFiveControler.java b/main/java/shjh/jhzj7/fi/fi/webapi/CustomerFiveControler.java index e58fcf6..1a77be4 100644 --- a/main/java/shjh/jhzj7/fi/fi/webapi/CustomerFiveControler.java +++ b/main/java/shjh/jhzj7/fi/fi/webapi/CustomerFiveControler.java @@ -8,6 +8,7 @@ import com.drew.lang.annotations.NotNull; import kd.bos.api.client.ApiResult; import kd.bos.context.RequestContext; import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.id.ID; import kd.bos.logging.Log; import kd.bos.logging.LogFactory; import kd.bos.openapi.common.custom.annotation.ApiController; @@ -93,6 +94,10 @@ public class CustomerFiveControler { currentOrg.set("status","C");//数据状态 currentOrg.set("creator", RequestContext.get().getCurrUserId());//创建人 currentOrg.set("enable",1);//默认可用 + //处理masterid,不然凭证辅助帐无法选择 + Long currentId = ID.genLongId(); + currentOrg.set("id", currentId); + currentOrg.set("masterid",currentId); } currentOrg.set("name",orgName); currentOrg.set("shjh_bunum",bunum);//BU编号 diff --git a/main/java/shjh/jhzj7/fi/fi/webapi/ProfitCenterControler.java b/main/java/shjh/jhzj7/fi/fi/webapi/ProfitCenterControler.java index c4c8699..6ab8c67 100644 --- a/main/java/shjh/jhzj7/fi/fi/webapi/ProfitCenterControler.java +++ b/main/java/shjh/jhzj7/fi/fi/webapi/ProfitCenterControler.java @@ -8,6 +8,7 @@ import com.drew.lang.annotations.NotNull; import kd.bos.api.client.ApiResult; import kd.bos.context.RequestContext; import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.id.ID; import kd.bos.logging.Log; import kd.bos.logging.LogFactory; import kd.bos.openapi.common.custom.annotation.ApiController; @@ -75,6 +76,10 @@ public class ProfitCenterControler { currentOrg.set("status","C");//数据状态 currentOrg.set("creator", RequestContext.get().getCurrUserId());//创建人 currentOrg.set("enable",1);//默认可用 + //处理masterid,不然凭证辅助帐无法选择 + Long currentId = ID.genLongId(); + currentOrg.set("id", currentId); + currentOrg.set("masterid",currentId); } currentOrg.set("name",orgName); //处理禁用组织