WIP:寄单放单提交校验

This commit is contained in:
zzs 2025-01-04 16:10:48 +08:00
parent 3432942a58
commit 89cc1bca4e
2 changed files with 106 additions and 109 deletions

View File

@ -1,15 +1,21 @@
package com.yem.wm.es.exportpresent.validator;
import com.yem.wm.es.shippingdetails.util.PaymentControlUtil;
import com.yem.wm.utils.DynamicObjectUtil;
import com.yem.wm.utils.YEM;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.entity.ExtendedDataEntity;
import kd.bos.entity.validate.AbstractValidator;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import static com.yem.wm.es.contractamtlist.util.FunUtil.getPayBills;
import static com.yem.wm.es.contractamtlist.util.FunUtil.getShipBills;
@ -20,25 +26,112 @@ import static com.yem.wm.es.contractamtlist.util.FunUtil.getShipBills;
* @Created by ZZSLL
*/
public class ExportPresentSubmitValidator extends AbstractValidator
{
public class ExportPresentSubmitValidator extends AbstractValidator {
@Override
public void validate()
{
public void validate() {
ExtendedDataEntity[] dataEntities = this.getDataEntities();
for (ExtendedDataEntity data : dataEntities) {
DynamicObject dataEntity = data.getDataEntity();
// 款项类型
String paymenttype = dataEntity.getString("yem_paymenttype");
// 是否见提单
String isladingbill = dataEntity.getString("yem_isladingbill");
// 收汇信息
DynamicObjectCollection receiveC = dataEntity.getDynamicObjectCollection("yem_es_exportpre_erf");
DynamicObjectCollection detailC = dataEntity.getDynamicObjectCollection("yem_es_exportpre_el");
Set<String> salesOrder = new HashSet<>();
for (DynamicObject d : detailC) {
salesOrder.add(d.getString("yem_contractnum"));
}
String selectfields = DynamicObjectUtil.getSelectfields("yem_es_salesorder");
selectfields = DynamicObjectUtil.getEntrySelectfields(selectfields, "yem_es_salesorder", "yem_es_salescontrac_s");
Map<Object, DynamicObject> orders = BusinessDataServiceHelper.loadFromCache("yem_es_salesorder", selectfields, new QFilter[]{new QFilter("billno", "in", salesOrder)});
if ("A".equals(paymenttype)) {
arrearsVerification(dataEntity, data);
if ("A".equals(isladingbill)) {
prePayAmtValidator(data, orders, detailC, receiveC);
}
}
}
}
private void arrearsVerification(DynamicObject dataEntity, ExtendedDataEntity data)
{
DynamicObjectCollection collection = dataEntity.getDynamicObjectCollection("yem_es_exportpre_erf");
/**
* 0见提单并且100%L/C100%OA100%DP100%DA并且没有预收款判断预收款项是否认领完成
* 0见提单并且100%L/C100%OA100%DP100%DA并且有预收款只判断预收款项是否认领完成
* 通过或不进行1234校验
* 1见提单并且正常款项判断合同是否认领完成
* 2见提单并且特殊款项判断合同是否认领完成
* 1或2通过不进行后续校验
* 3未件提单并且正常款项判断合同是否认领完成
* 4未件提单并且特殊款项判断合同是否认领完成
* 3或4通过不进行后续校验
*
*/
private void prePayAmtValidator(ExtendedDataEntity data, Map<Object, DynamicObject> orders, DynamicObjectCollection detailC, DynamicObjectCollection receiveC) {
StringBuilder sb = new StringBuilder();
for (Map.Entry<Object, DynamicObject> entry : orders.entrySet()) {
DynamicObject order = entry.getValue();
BigDecimal shipPreRapRate = PaymentControlUtil.getShipPreRapRate(order);
BigDecimal procPreRapRate = PaymentControlUtil.getProcPreRapRate(order);
// 该合同是否包含预付
boolean isPre = shipPreRapRate.add(procPreRapRate).compareTo(BigDecimal.ZERO) > 0;
DynamicObjectCollection collection = order.getDynamicObjectCollection("yem_es_salescontrac_s");
boolean isSpecialRapStyle = false;
for (DynamicObject d : collection) {
DynamicObject rapstyle = d.getDynamicObject("yem_rapstyle_c");
if (YEM.isNotEmpty(rapstyle) && "D/A JSFS08 L/C OA D/A".contains(rapstyle.getString("number"))) {
isSpecialRapStyle = true;
}
}
// 合同金额
BigDecimal offeramount = order.getBigDecimal("yem_offeramount");
String billno = order.getString("billno");
// 合同已认领金额
BigDecimal climeAmt = PaymentControlUtil.getContractClimeAmt(order, "");
// 只判断预付款是否认领完成
if (isSpecialRapStyle && isPre) {
BigDecimal climeAmtShip = PaymentControlUtil.getContractClimeAmt(order, "D");
BigDecimal climeAmtProc = PaymentControlUtil.getContractClimeAmt(order, "E");
BigDecimal climePreAmt = climeAmtShip.add(climeAmtProc);
BigDecimal shipAmt = PaymentControlUtil.getAdvancePayment(shipPreRapRate, offeramount);
BigDecimal procAmt = PaymentControlUtil.getAdvancePayment(procPreRapRate, offeramount);
BigDecimal orderPreAmt = shipAmt.add(procAmt);
if (climePreAmt.compareTo(orderPreAmt) < 0) {
sb.append(String.format("合同 [ %s ] ,合同预收金额 [ %s ] 合同预收已认领金额合计 [ %s ]合同预收款未认领完成请核对后提交L/C、OA、DP、DA",
billno,
orderPreAmt.setScale(4, RoundingMode.HALF_UP).toPlainString(),
climePreAmt.setScale(4, RoundingMode.HALF_UP).toPlainString())).append("\r\n");
}
} else {
if (climeAmt.compareTo(offeramount) < 0) {
boolean passed = arrearsVerification(data.getDataEntity(), data, receiveC);
if (!passed) {
sb.append(String.format("合同 [ %s ] ,合同金额 [ %s ] 合同已认领金额合计 [ %s ],合同未认领完成,请核对后提交!",
billno,
offeramount.setScale(4, RoundingMode.HALF_UP).toPlainString(),
climeAmt.setScale(4, RoundingMode.HALF_UP).toPlainString())).append("\r\n");
}
}
}
}
if (sb.length() > 0) {
this.addErrorMessage(data, String.valueOf(sb));
}
}
/**
* 走储备申请或者走欠条申请但是款项未认领完成不允许提交寄单放单
*/
private boolean arrearsVerification(DynamicObject dataEntity, ExtendedDataEntity data, DynamicObjectCollection collection) {
StringBuilder sb = new StringBuilder();
for (DynamicObject dynamicObject : collection) {
DynamicObject saleOrder = dynamicObject.getDynamicObject("yem_saleorder");
@ -62,5 +155,7 @@ public class ExportPresentSubmitValidator extends AbstractValidator
if (sb.length() > 0) {
this.addErrorMessage(data, String.valueOf(sb));
}
return sb.length() == 0;
}
}

View File

@ -1,6 +1,5 @@
package com.yem.wm.es.exportpresent.validator;
import com.yem.wm.es.shippingdetails.util.PaymentControlUtil;
import com.yem.wm.utils.DynamicObjectUtil;
import com.yem.wm.utils.YEM;
import kd.bos.dataentity.entity.DynamicObject;
@ -12,8 +11,9 @@ import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author ljw
@ -29,110 +29,12 @@ public class ExportPresentSubmitsValidator extends AbstractValidator {
DynamicObject dataEntity = data.getDataEntity();
// 款项类型
String paymenttype = dataEntity.getString("yem_paymenttype");
// 是否见提单
String isladingbill = dataEntity.getString("yem_isladingbill");
Set<String> salesorder = new HashSet<>();
DynamicObjectCollection collection = dataEntity.getDynamicObjectCollection("yem_es_exportpre_erf");
for (DynamicObject d : collection) {
DynamicObject saleorder = d.getDynamicObject("yem_saleorder");
if (YEM.isNotEmpty(saleorder)) {
salesorder.add(saleorder.getString("billno"));
}
}
String selectfields = DynamicObjectUtil.getSelectfields("yem_es_salesorder");
selectfields = DynamicObjectUtil.getEntrySelectfields(selectfields, "yem_es_salesorder", "yem_es_salescontrac_s");
Map<Object, DynamicObject> map = BusinessDataServiceHelper.loadFromCache("yem_es_salesorder", selectfields, new QFilter[]{new QFilter("billno", "in", salesorder)});
if ("A".equals(isladingbill)) {
validatorSalesOrderClaim(data);
}
// 100%L/C100%OA100%DP100%DA
boolean isRequireValidator = false;
for (Map.Entry<Object, DynamicObject> salesoerderEntry : map.entrySet()) {
DynamicObject order = salesoerderEntry.getValue();
DynamicObjectCollection salescontrac = order.getDynamicObjectCollection("yem_es_salescontrac_s");
BigDecimal preAmt = BigDecimal.ZERO;//预收金额合计
for (DynamicObject d : salescontrac) {
DynamicObject rapstyle = d.getDynamicObject("yem_rapstyle_c");
BigDecimal raprate = d.getBigDecimal("yem_raprate");
boolean ispre = d.getBoolean("yem_ispre");
BigDecimal rapamt = d.getBigDecimal("yem_rapamt");
if (YEM.isNotEmpty(rapstyle)) {
String number = rapstyle.getString("number");
if ("D/A JSFS08 L/C OA D/A".contains(number) && raprate.compareTo(new BigDecimal("100")) == 0) {
if (ispre) {
preAmt = preAmt.add(rapamt);
}
}
}
}
validatorPreAmtClaimFinished(preAmt, order, data);
}
if ("A".equals(paymenttype)) {
arrearsVerification(dataEntity, data);
}
}
}
/**
* 校验订舱关联合同是否
*
* @param data
*/
private void validatorSalesOrderClaim(ExtendedDataEntity data) {
DynamicObject dataEntity = data.getDataEntity();
DynamicObjectCollection c = dataEntity.getDynamicObjectCollection("yem_es_exportpre_el");
Set<String> or = new HashSet<>();
for (DynamicObject d : c) {
or.add(d.getString("yem_contractnum"));
}
StringBuilder sb = new StringBuilder();
Map<Object, DynamicObject> map = BusinessDataServiceHelper.loadFromCache("yem_es_salesorder", "id, billno, yem_offeramount", new QFilter[]{new QFilter("billno", "in", or)});
for (Map.Entry<Object, DynamicObject> ors : map.entrySet()) {
DynamicObject order = ors.getValue();
BigDecimal climeAmt = PaymentControlUtil.getContractClimeAmt(order, null);
BigDecimal offeramount = order.getBigDecimal("yem_offeramount");
if (climeAmt.compareTo(offeramount) < 0) {
sb.append(String.format("合同号:%s合同金额%s 元,已认领金额:%s 元,请全部认领后提交单据!",
order.getString("billno"),
offeramount.setScale(4, RoundingMode.HALF_UP).toPlainString(),
climeAmt.setScale(4, RoundingMode.HALF_UP).toPlainString())
).append("\n\r");
}
}
if (sb.length() > 0) {
this.addMessage(data, sb.toString());
}
}
/**
* 校验合同预收部分金额是否认领完成
*
* @param preAmt 预收金额
* @param order 合同
* @param data
*/
private void validatorPreAmtClaimFinished(BigDecimal preAmt, DynamicObject order, ExtendedDataEntity data) {
if (preAmt.compareTo(BigDecimal.ZERO) == 0) {
return;
}
BigDecimal orderAmt = PaymentControlUtil.getContractClimeAmt(order, "D");
BigDecimal shipAmt = PaymentControlUtil.getContractClimeAmt(order, "F");
if (orderAmt.add(shipAmt).compareTo(preAmt) < 0) {
this.addMessage(data, String.format("合同 [ %s ] 预收合计 [ %s ] ,已经认领金额合计 [ %s ],未认领完成,请确认!",
order.getString("billno"),
preAmt.setScale(4, RoundingMode.HALF_UP).toPlainString(),
orderAmt.add(shipAmt).setScale(4, RoundingMode.HALF_UP).toPlainString()));
}
}
private void arrearsVerification(DynamicObject dataEntity, ExtendedDataEntity data) {
DynamicObject yemCustomer = dataEntity.getDynamicObject("yem_customer");
if (yemCustomer != null) {