清账单反写收款单,基础资料接口更新masterid
This commit is contained in:
parent
2b47345d72
commit
5c1146ffae
|
|
@ -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);//未核销金额
|
||||
|
|
|
|||
|
|
@ -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("下推清账单异常,请稍后重试!");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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待办。
|
||||
}
|
||||
}
|
||||
|
|
@ -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));//类型
|
||||
|
|
|
|||
|
|
@ -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编号
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
//处理禁用组织
|
||||
|
|
|
|||
Loading…
Reference in New Issue