认领处理单-新增字段-提交校验

This commit is contained in:
李贵强 2025-02-17 17:57:55 +08:00
parent 84380ba10a
commit 8d106789c5
4 changed files with 422 additions and 0 deletions

View File

@ -0,0 +1,190 @@
package shjh.jhzj7.fi.fi.plugin.form;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.entity.datamodel.events.PropertyChangedArgs;
import kd.bos.form.field.ComboEdit;
import kd.bos.form.plugin.AbstractFormPlugin;
import kd.sdk.plugin.Plugin;
import shjh.jhzj7.fi.fi.plugin.form.info.ClaimFieldsInfo;
import java.util.EventObject;
/**
* 动态表单插件-认领处理单
* @author LiGuiQiang
*/
public class ClaimBillFormPlugin extends AbstractFormPlugin implements Plugin {
@Override
public void afterBindData(EventObject e) {
super.afterBindData(e);
this.getView().setVisible(false,ClaimFieldsInfo.COST_CENTER);
this.getView().setVisible(false,ClaimFieldsInfo.REFUND_METHODS);
this.getView().setVisible(false,ClaimFieldsInfo.CUSTOMER);
this.getView().setVisible(false,ClaimFieldsInfo.REPAYMENT_METHOD);
this.getView().setVisible(false,ClaimFieldsInfo.CUSTOMER_SPLIT);
this.getView().setVisible(false,ClaimFieldsInfo.ENTRY_CUSTOMER);
hideEntryFields();
}
@Override
public void propertyChanged(PropertyChangedArgs e) {
super.propertyChanged(e);
String fieldKey = e.getProperty().getName();
if (StringUtils.equals(fieldKey, ClaimFieldsInfo.REC_PAY_TYPE)) {
handleReceivingTypeChange();
} else if (StringUtils.equals(fieldKey, ClaimFieldsInfo.REFUND_METHODS)) {
handleRefundMethodsChange();
} else if (StringUtils.equals(fieldKey, ClaimFieldsInfo.CUSTOMER_SPLIT)) {
handleCustomerSplit();
}
}
private void handleReceivingTypeChange() {
DynamicObject receivingType = (DynamicObject) this.getModel().getValue(ClaimFieldsInfo.RECEIVING_TYPE);
if (null!=receivingType){
String number = receivingType.getString("number");
if (null!=number){
clearFields();
switch (number) {
case "100":
showTopFieldsBySale();
break;
case "103":
showCostCenter();
showRefundMethods();
showEntryFieldsByRefund();
break;
case "109":
showCostCenter();
showRepaymentMethod();
showEntryFieldsByEmployee();
break;
default:
break;
}
}
}
}
private void handleRefundMethodsChange() {
String value = (String) this.getModel().getValue(ClaimFieldsInfo.REFUND_METHODS);
if (ClaimFieldsInfo.METHOD_C.equals(value) || ClaimFieldsInfo.METHOD_D.equals(value)) {
this.getView().setVisible(true, ClaimFieldsInfo.CUSTOMER);
} else {
this.getView().setVisible(false, ClaimFieldsInfo.CUSTOMER);
this.getModel().setValue(ClaimFieldsInfo.CUSTOMER, null);
}
}
private void handleCustomerSplit(){
Boolean split = (Boolean) this.getModel().getValue(ClaimFieldsInfo.CUSTOMER_SPLIT);
DynamicObjectCollection entry = this.getModel().getEntryEntity(ClaimFieldsInfo.ENTRY);
if (split){
this.getView().setVisible(true,ClaimFieldsInfo.ENTRY_CUSTOMER);
}else {
this.getView().setVisible(false,ClaimFieldsInfo.ENTRY_CUSTOMER);
for (int i = 0; i < entry.size(); i++) {
this.getModel().setValue(ClaimFieldsInfo.ENTRY_CUSTOMER,null,i);
}
}
}
private void showTopFieldsBySale(){
this.getView().setVisible(true, ClaimFieldsInfo.CUSTOMER_SPLIT);
}
private void showCostCenter() {
this.getView().setVisible(true, ClaimFieldsInfo.COST_CENTER);
}
private void showRefundMethods() {
this.getView().setVisible(true, ClaimFieldsInfo.REFUND_METHODS);
ComboEdit edit = this.getView().getControl(ClaimFieldsInfo.REFUND_METHODS);
edit.setMustInput(true);
}
private void showEntryFieldsByRefund() {
this.getView().setVisible(true, ClaimFieldsInfo.PREPAYMENT_NUMBER);
this.getView().setVisible(true,ClaimFieldsInfo.PURCHASE_NUMBER);
this.getView().setVisible(true,ClaimFieldsInfo.PURCHASE_LINE_NUMBER);
this.getView().setVisible(true,ClaimFieldsInfo.BILL_SUBJECT);
this.getView().setVisible(true,ClaimFieldsInfo.PREPAYMENT_DATE);
this.getView().setVisible(true,ClaimFieldsInfo.PAYMENT_AMOUNT);
this.getView().setVisible(true,ClaimFieldsInfo.DOCUMENT_AMOUNT);
this.getView().setVisible(true,ClaimFieldsInfo.REFUNDED_AMOUNT);
this.getView().setVisible(true,ClaimFieldsInfo.VERIFICATION_NUMBER);
this.getView().setVisible(true,ClaimFieldsInfo.FISCAL_YEAR);
}
private void showRepaymentMethod() {
this.getView().setVisible(true, ClaimFieldsInfo.REPAYMENT_METHOD);
}
private void showEntryFieldsByEmployee(){
this.getView().setVisible(true,ClaimFieldsInfo.LOAN_NUMBER);
this.getView().setVisible(true,ClaimFieldsInfo.LOAN_AMOUNT);
this.getView().setVisible(true,ClaimFieldsInfo.LOAN_BALANCE);
this.getView().setVisible(true,ClaimFieldsInfo.REPAYMENT_AMOUNT);
this.getView().setVisible(true,ClaimFieldsInfo.VERIFICATION_NUMBER);
this.getView().setVisible(true,ClaimFieldsInfo.FISCAL_YEAR);
}
private void clearFields() {
this.getModel().setValue(ClaimFieldsInfo.COST_CENTER, null);
this.getView().setVisible(false, ClaimFieldsInfo.COST_CENTER);
ComboEdit edit = this.getView().getControl(ClaimFieldsInfo.REFUND_METHODS);
edit.setMustInput(false);
this.getModel().setValue(ClaimFieldsInfo.REFUND_METHODS, null);
this.getView().setVisible(false, ClaimFieldsInfo.REFUND_METHODS);
this.getModel().setValue(ClaimFieldsInfo.CUSTOMER, null);
this.getView().setVisible(false, ClaimFieldsInfo.CUSTOMER);
this.getModel().setValue(ClaimFieldsInfo.REPAYMENT_METHOD, null);
this.getView().setVisible(false, ClaimFieldsInfo.REPAYMENT_METHOD);
this.getModel().setValue(ClaimFieldsInfo.CUSTOMER_SPLIT, null);
this.getView().setVisible(false, ClaimFieldsInfo.CUSTOMER_SPLIT);
DynamicObjectCollection entry = this.getModel().getEntryEntity(ClaimFieldsInfo.ENTRY);
if (null!=entry){
hideEntryFields();
for (int i = 0; i < entry.size(); i++) {
this.getModel().setValue(ClaimFieldsInfo.ENTRY_CUSTOMER, null,i);
this.getModel().setValue(ClaimFieldsInfo.PREPAYMENT_NUMBER, null,i);
this.getModel().setValue(ClaimFieldsInfo.PURCHASE_NUMBER, null,i);
this.getModel().setValue(ClaimFieldsInfo.PURCHASE_LINE_NUMBER, null,i);
this.getModel().setValue(ClaimFieldsInfo.BILL_SUBJECT, null,i);
this.getModel().setValue(ClaimFieldsInfo.PREPAYMENT_DATE, null,i);
this.getModel().setValue(ClaimFieldsInfo.PAYMENT_AMOUNT, null,i);
this.getModel().setValue(ClaimFieldsInfo.DOCUMENT_AMOUNT, null,i);
this.getModel().setValue(ClaimFieldsInfo.REFUNDED_AMOUNT, null,i);
this.getModel().setValue(ClaimFieldsInfo.LOAN_NUMBER, null,i);
this.getModel().setValue(ClaimFieldsInfo.LOAN_AMOUNT, null,i);
this.getModel().setValue(ClaimFieldsInfo.LOAN_BALANCE, null,i);
this.getModel().setValue(ClaimFieldsInfo.REPAYMENT_AMOUNT, null,i);
this.getModel().setValue(ClaimFieldsInfo.VERIFICATION_NUMBER, null,i);
this.getModel().setValue(ClaimFieldsInfo.FISCAL_YEAR, null,i);
}
}
}
private void hideEntryFields(){
this.getView().setVisible(false,ClaimFieldsInfo.PREPAYMENT_NUMBER);
this.getView().setVisible(false,ClaimFieldsInfo.PURCHASE_NUMBER);
this.getView().setVisible(false,ClaimFieldsInfo.PURCHASE_LINE_NUMBER);
this.getView().setVisible(false,ClaimFieldsInfo.BILL_SUBJECT);
this.getView().setVisible(false,ClaimFieldsInfo.PREPAYMENT_DATE);
this.getView().setVisible(false,ClaimFieldsInfo.PAYMENT_AMOUNT);
this.getView().setVisible(false,ClaimFieldsInfo.DOCUMENT_AMOUNT);
this.getView().setVisible(false,ClaimFieldsInfo.REFUNDED_AMOUNT);
this.getView().setVisible(false,ClaimFieldsInfo.LOAN_NUMBER);
this.getView().setVisible(false,ClaimFieldsInfo.LOAN_AMOUNT);
this.getView().setVisible(false,ClaimFieldsInfo.LOAN_BALANCE);
this.getView().setVisible(false,ClaimFieldsInfo.REPAYMENT_AMOUNT);
this.getView().setVisible(false,ClaimFieldsInfo.VERIFICATION_NUMBER);
this.getView().setVisible(false,ClaimFieldsInfo.FISCAL_YEAR);
}
}

View File

@ -0,0 +1,68 @@
package shjh.jhzj7.fi.fi.plugin.form.info;
/**
* @author LiGuiQiang
*/
public class ClaimFieldsInfo {
/**
* 单据标识
*/
public static final String RECEIVING_TYPE = "e_receivingtype";
/**
* Top:收款类型
*/
public static final String REC_PAY_TYPE = "recpaytype";
/**
* Top:成本中心
*/
public static final String COST_CENTER = "shjh_costcenter";
/**
* Top:退款方式
*/
public static final String REFUND_METHODS = "shjh_refundmethods";
/**
* Top:客户名称
*/
public static final String CUSTOMER = "shjh_customer";
/**
* Top:还款方式
*/
public static final String REPAYMENT_METHOD = "shjh_repaymentmethod";
/**
* Top:客户拆分
*/
public static final String CUSTOMER_SPLIT = "shjh_customersplit";
/**
* Top:收款金额
*/
public static final String RE_AMOUNT="reamount";
/**
* 分录标识
*/
public static final String ENTRY = "entryentity";
public static final String ENTRY_CUSTOMER = "shjh_entrycustomer";
public static final String PREPAYMENT_NUMBER = "shjh_prepaymentnum";
public static final String PURCHASE_NUMBER = "shjh_purchasenum";
public static final String PURCHASE_LINE_NUMBER = "shjh_purchaselinenum";
public static final String BILL_SUBJECT = "shjh_billsubject";
public static final String PREPAYMENT_DATE = "shjh_prepaymentdate";
public static final String PAYMENT_AMOUNT = "shjh_paymentamount";
public static final String DOCUMENT_AMOUNT = "shjh_documentamount";
public static final String REFUNDED_AMOUNT = "shjh_refundedamount";
public static final String LOAN_NUMBER = "shjh_loannum";
public static final String LOAN_AMOUNT = "shjh_loanamount";
public static final String LOAN_BALANCE = "shjh_loanbalance";
public static final String REPAYMENT_AMOUNT = "shjh_repaymentamount";
public static final String VERIFICATION_NUMBER = "shjh_verificationnum";
public static final String FISCAL_YEAR = "shjh_fiscalyear";
public static final String METHOD_C = "C";
public static final String METHOD_D = "D";
/**
* Entry:应收金额
*/
public static final String RECEIVABLE_AMOUNT = "e_receivableamt";
}

View File

@ -0,0 +1,64 @@
package shjh.jhzj7.fi.fi.plugin.task;
import kd.bos.context.RequestContext;
import kd.bos.dataentity.OperateOption;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.entity.operate.result.OperationResult;
import kd.bos.exception.KDException;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.schedule.api.MessageHandler;
import kd.bos.schedule.executor.AbstractTask;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.operation.OperationServiceHelper;
import kd.sdk.plugin.Plugin;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 收款入账中心-按规则自动生成收款单
*
* @author LiGuiQiang
*/
public class ReceiptGenerationTask extends AbstractTask implements Plugin {
@Override
public MessageHandler getMessageHandle() {
return super.getMessageHandle();
}
@Override
public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
//查询收款入账中心
//待确认receredtype
//收款金额不等于0creditamount
//收款认领通知为空claimnoticebillno
QFilter qFilter = new QFilter("receredtype", QCP.equals, "0");
qFilter.and("creditamount", QCP.not_equals, BigDecimal.ZERO);
qFilter.and("claimnoticebillno", QCP.equals, "");
qFilter.and("billno", QCP.equals, "20250211-0000000094");
DynamicObject[] collection = BusinessDataServiceHelper.load("bei_intelrec", "id", qFilter.toArray());
if (collection.length != 0) {
Object[] idArray = new Object[collection.length];
for (int i = 0; i < collection.length; i++) {
DynamicObject dynamicObject = collection[i];
Object id = dynamicObject.get("id");
idArray[i] = id;
}
for (Object o : idArray) {
DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(o, "bei_intelrec");
}
}
}
@Override
public boolean isSupportReSchedule() {
return super.isSupportReSchedule();
}
}

View File

@ -0,0 +1,100 @@
package shjh.jhzj7.fi.fi.plugin.validators;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.entity.ExtendedDataEntity;
import kd.bos.entity.validate.AbstractValidator;
import shjh.jhzj7.fi.fi.plugin.form.info.ClaimFieldsInfo;
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
* 认领处理单-提交操作校验
*
* @author LiGuiQiang
*/
public class ClaimSubmitValidator extends AbstractValidator {
@Override
public void validate() {
ExtendedDataEntity[] dataEntities = this.getDataEntities();
if (dataEntities != null && dataEntities.length >= 1) {
for (ExtendedDataEntity dataEntity : dataEntities) {
if (dataEntity != null) {
DynamicObject bill = dataEntity.getDataEntity();
DynamicObjectCollection entry = bill.getDynamicObjectCollection(ClaimFieldsInfo.ENTRY);
if (entry != null && !entry.isEmpty()) {
BigDecimal reAmount = bill.getBigDecimal(ClaimFieldsInfo.RE_AMOUNT);
BigDecimal receivableAll = BigDecimal.ZERO;
BigDecimal refundedAll = BigDecimal.ZERO;
BigDecimal repaymentAll = BigDecimal.ZERO;
// 计算所有金额的合计
for (DynamicObject dynamicObject : entry) {
receivableAll = receivableAll.add(dynamicObject.getBigDecimal(ClaimFieldsInfo.RECEIVABLE_AMOUNT));
refundedAll = refundedAll.add(dynamicObject.getBigDecimal(ClaimFieldsInfo.REFUNDED_AMOUNT));
repaymentAll = repaymentAll.add(dynamicObject.getBigDecimal(ClaimFieldsInfo.REPAYMENT_AMOUNT));
}
DynamicObject receivingType = bill.getDynamicObject(ClaimFieldsInfo.REC_PAY_TYPE);
if (null != receivingType) {
String type = receivingType.getString("number");
if (null != type) {
if (isAmountInvalid(type, reAmount, receivableAll, refundedAll, repaymentAll)) {
String errorMessage = getErrorMessage(type, reAmount, receivableAll, refundedAll, repaymentAll);
this.addErrorMessage(dataEntity, errorMessage);
}
}
}
}
}
}
}
}
/**
* 判断金额是否有效
*
* @param type 收款类型
* @param reAmount 收款金额
* @param receivableAll 应收金额合计
* @param refundedAll 退还金额合计
* @param repaymentAll 还款金额合计
* @return 布尔值
*/
private boolean isAmountInvalid(String type, BigDecimal reAmount, BigDecimal receivableAll, BigDecimal refundedAll, BigDecimal repaymentAll) {
switch (type) {
case "100":
return reAmount.compareTo(receivableAll) <= 0;
case "103":
return reAmount.compareTo(refundedAll) <= 0;
case "109":
return reAmount.compareTo(repaymentAll) <= 0;
default:
return false;
}
}
/**
* 获取错误信息
*
* @param type 收款类型
* @param reAmount 收款金额
* @param receivableAll 应收金额合计
* @param refundedAll 退还金额合计
* @param repaymentAll 还款金额合计
* @return 错误信息
*/
private String getErrorMessage(String type, BigDecimal reAmount, BigDecimal receivableAll, BigDecimal refundedAll, BigDecimal repaymentAll) {
switch (type) {
case "100":
return String.format("提交失败:分录应收金额合计(%.2f)应小于等于收款金额(%.2f)", receivableAll.setScale(2, RoundingMode.DOWN).doubleValue(), reAmount.setScale(2, RoundingMode.DOWN).doubleValue());
case "103":
return String.format("提交失败:分录本次退还本位币金额合计(%.2f)应小于等于收款金额(%.2f)", refundedAll.setScale(2, RoundingMode.DOWN).doubleValue(), reAmount.setScale(2, RoundingMode.DOWN).doubleValue());
case "109":
return String.format("提交失败:分录本次还款金额合计(%.2f)应小于等于收款金额(%.2f)", repaymentAll.setScale(2, RoundingMode.DOWN).doubleValue(), reAmount.setScale(2, RoundingMode.DOWN).doubleValue());
default:
return "";
}
}
}