清账单反写收款单,基础资料接口更新masterid

This commit is contained in:
yuxueliang0813 2025-04-09 17:56:41 +08:00
parent 2b47345d72
commit 5c1146ffae
6 changed files with 179 additions and 35 deletions

View File

@ -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);//未核销金额

View File

@ -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<String, Object> 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<String, Object> 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("下推清账单异常,请稍后重试!");
}
}
}
}
}

View File

@ -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<Long> recebills = new HashSet<>();
//根据清账单id查找上游收款单分录行
List<Long> entryids = DB.query(DBRoute.of("fi"),queryRealtion,new Object[]{prinfo.getPkValue()},(rs) -> {
List<Long> 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<String, String> userBill = new HashMap<>();
String billno;
@ -609,6 +685,5 @@ public class ClearAccountBillOperation extends AbstractOperationServicePlugIn im
private void handleNotice(AfterOperationArgs e) {
//通知具体实现
//清账单的下游所有清账明细单实时通知被通知人进行清账发送邮件通知OA待办
}
}

View File

@ -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));//类型

View File

@ -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编号

View File

@ -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);
//处理禁用组织