Merge remote-tracking branch 'origin/main'
This commit is contained in:
commit
fa60206ce2
|
|
@ -0,0 +1,34 @@
|
||||||
|
//
|
||||||
|
// Source code recreated from a .class file by IntelliJ IDEA
|
||||||
|
// (powered by FernFlower decompiler)
|
||||||
|
//
|
||||||
|
|
||||||
|
package nc.impl.ic.m45.action;
|
||||||
|
|
||||||
|
import nc.bs.ic.m45.insert.InsertBP;
|
||||||
|
import nc.bs.pu.m23.plugin.ArriveActionPlugInPoint;
|
||||||
|
import nc.impl.ic.general.InsertActionTemplate;
|
||||||
|
import nc.impl.ic.m45.action.rule.XbPushTo45BeforeProcess;
|
||||||
|
import nc.impl.ic.m45.base.ActionPlugInPoint;
|
||||||
|
import nc.impl.pu.m23.maintain.rule.CheckBillDateRule;
|
||||||
|
import nc.impl.pubapp.pattern.rule.processer.AroundProcesser;
|
||||||
|
import nc.vo.ic.m45.entity.PurchaseInVO;
|
||||||
|
import nc.vo.pu.m23.entity.ArriveVO;
|
||||||
|
|
||||||
|
public class InsertAction {
|
||||||
|
public InsertAction() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public PurchaseInVO[] insert(PurchaseInVO[] bills) {
|
||||||
|
|
||||||
|
AroundProcesser<PurchaseInVO> processer = new AroundProcesser(ActionPlugInPoint.InsertAction);
|
||||||
|
addBeforeRule(processer);
|
||||||
|
InsertActionTemplate<PurchaseInVO> insertAction = new InsertActionTemplate(ActionPlugInPoint.InsertAction, new InsertBP());
|
||||||
|
|
||||||
|
return (PurchaseInVO[])insertAction.insert(bills);
|
||||||
|
}
|
||||||
|
private void addBeforeRule(AroundProcesser<PurchaseInVO> processer) {
|
||||||
|
processer.addBeforeRule(new XbPushTo45BeforeProcess());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
//
|
||||||
|
// Source code recreated from a .class file by IntelliJ IDEA
|
||||||
|
// (powered by FernFlower decompiler)
|
||||||
|
//
|
||||||
|
|
||||||
|
package nc.impl.ic.m45.action.rule;
|
||||||
|
|
||||||
|
import nc.impl.pubapp.pattern.rule.IFilterRule;
|
||||||
|
import nc.vo.ic.m45.entity.PurchaseInBodyVO;
|
||||||
|
import nc.vo.ic.m45.entity.PurchaseInVO;
|
||||||
|
import nc.vo.pub.BusinessException;
|
||||||
|
import nc.vo.pub.lang.UFDouble;
|
||||||
|
|
||||||
|
public class XbPushTo45BeforeProcess implements IFilterRule<PurchaseInVO> {
|
||||||
|
|
||||||
|
|
||||||
|
public XbPushTo45BeforeProcess() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public PurchaseInVO[] process(PurchaseInVO[] vos) {
|
||||||
|
PurchaseInVO[] retvos = vos;
|
||||||
|
if(retvos == null || retvos.length == 0){
|
||||||
|
return retvos;
|
||||||
|
}
|
||||||
|
for (PurchaseInVO vo : vos) {
|
||||||
|
if(vo.getHead().getPrimaryKey() == null){
|
||||||
|
for (PurchaseInBodyVO body:vo.getBodys()){
|
||||||
|
if(null!=body.getAttributeValue("vbdef33") && body.getNshouldnum().compareTo(new UFDouble(String.valueOf(body.getAttributeValue("vbdef33"))))>0){
|
||||||
|
try {
|
||||||
|
throw new BusinessException("入库数量大于最终需求数量不能生成采购入库!");
|
||||||
|
} catch (BusinessException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return retvos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -190,9 +190,9 @@ public class InboundPubServiceImpl implements IInboundPubService {
|
||||||
|
|
||||||
for(ArriveItemVO body : bodys) {
|
for(ArriveItemVO body : bodys) {
|
||||||
body.setTs((UFDateTime)Bid_ts1.get(body.getPk_arriveorder_b()));
|
body.setTs((UFDateTime)Bid_ts1.get(body.getPk_arriveorder_b()));
|
||||||
if(null!=body.getAttributeValue("vbdef33") && body.getNastnum().compareTo(body.getAttributeValue("vbdef33"))<0){
|
// if(null!=body.getAttributeValue("vbdef33") && body.getNastnum().compareTo(new UFDouble(String.valueOf(body.getAttributeValue("vbdef33"))))>0){
|
||||||
throw new BusinessException("入库数量大于最终需求数量不能生成采购入库!");
|
// throw new BusinessException("入库数量大于最终需求数量不能生成采购入库!");
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ import nc.vo.pub.BusinessException;
|
||||||
import nc.vo.pub.compiler.PfParameterVO;
|
import nc.vo.pub.compiler.PfParameterVO;
|
||||||
import nc.vo.pub.lang.UFBoolean;
|
import nc.vo.pub.lang.UFBoolean;
|
||||||
import nc.vo.pub.lang.UFDateTime;
|
import nc.vo.pub.lang.UFDateTime;
|
||||||
|
import nc.vo.pub.lang.UFDouble;
|
||||||
import nc.vo.scmpub.util.ArrayUtil;
|
import nc.vo.scmpub.util.ArrayUtil;
|
||||||
import nc.vo.scmpub.util.BillBodySortUtils;
|
import nc.vo.scmpub.util.BillBodySortUtils;
|
||||||
import nc.vo.scmpub.util.TransferSortUtil;
|
import nc.vo.scmpub.util.TransferSortUtil;
|
||||||
|
|
@ -163,9 +164,9 @@ public class TransferOrderAction implements ICommonAction {
|
||||||
|
|
||||||
for (OrderVO vo : sorceVOs) {
|
for (OrderVO vo : sorceVOs) {
|
||||||
for (OrderItemVO itemVO:vo.getBVO()){
|
for (OrderItemVO itemVO:vo.getBVO()){
|
||||||
if(null != itemVO.getAttributeValue("vbdef33") && itemVO.getNastnum().compareTo(itemVO.getAttributeValue("vbdef33"))<0){
|
// if(null != itemVO.getAttributeValue("vbdef33") && itemVO.getNastnum().compareTo(new UFDouble(String.valueOf(itemVO.getAttributeValue("vbdef33"))))>0){
|
||||||
throw new BusinessException("采购数量大于最终需求数量不能生成采购订单!");
|
// throw new BusinessException("采购数量大于最终需求数量不能生成采购订单!");
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AggregatedValueObject[] arrivos = service.runChangeDataAry("21", "23", sorceVOs, (PfParameterVO)null);
|
AggregatedValueObject[] arrivos = service.runChangeDataAry("21", "23", sorceVOs, (PfParameterVO)null);
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ import nc.vo.pub.CircularlyAccessibleValueObject;
|
||||||
import nc.vo.pub.compiler.PfParameterVO;
|
import nc.vo.pub.compiler.PfParameterVO;
|
||||||
import nc.vo.pub.lang.UFDate;
|
import nc.vo.pub.lang.UFDate;
|
||||||
import nc.vo.pub.lang.UFDateTime;
|
import nc.vo.pub.lang.UFDateTime;
|
||||||
|
import nc.vo.pub.lang.UFDouble;
|
||||||
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
||||||
import nc.vo.pubapp.pattern.model.entity.bill.AbstractBill;
|
import nc.vo.pubapp.pattern.model.entity.bill.AbstractBill;
|
||||||
import nc.vo.scmpub.res.billtype.POBillType;
|
import nc.vo.scmpub.res.billtype.POBillType;
|
||||||
|
|
@ -51,9 +52,9 @@ public class Transfer20To21Action extends AbstractTransferAction {
|
||||||
PraybillVO[] sorceVOs = this.getAggVO(read);
|
PraybillVO[] sorceVOs = this.getAggVO(read);
|
||||||
for (PraybillVO vo : sorceVOs) {
|
for (PraybillVO vo : sorceVOs) {
|
||||||
for (PraybillItemVO itemVO:vo.getBVO()){
|
for (PraybillItemVO itemVO:vo.getBVO()){
|
||||||
if(null!=itemVO.getAttributeValue("vbdef33") && itemVO.getNastnum().compareTo(itemVO.getAttributeValue("vbdef33"))<0){
|
// if(null!=itemVO.getAttributeValue("vbdef33") && itemVO.getNastnum().compareTo(new UFDouble(String.valueOf(itemVO.getAttributeValue("vbdef33"))))>0){
|
||||||
throw new BusinessException("采购数量大于最终需求数量不能生成采购订单!");
|
// throw new BusinessException("采购数量大于最终需求数量不能生成采购订单!");
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
IPfExchangeService service = (IPfExchangeService)ServiceLocator.find(IPfExchangeService.class);
|
IPfExchangeService service = (IPfExchangeService)ServiceLocator.find(IPfExchangeService.class);
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ public class ReWrite20ForOrderBP {
|
||||||
for(PraybillItemVO itemvo : itemvos) {
|
for(PraybillItemVO itemvo : itemvos) {
|
||||||
if (lbids.contains(itemvo.getPk_praybill_b())) {
|
if (lbids.contains(itemvo.getPk_praybill_b())) {
|
||||||
|
|
||||||
if (itemvo.getNaccumulatenum().compareTo(itemvo.getNnum()) < 0 && ( null != itemvo.getAttributeValue("vbdef33") && itemvo.getNaccumulatenum().compareTo(new UFDouble((BigDecimal)itemvo.getAttributeValue("vbdef33"))) == 0)) {
|
if (itemvo.getNaccumulatenum().compareTo(itemvo.getNnum()) < 0 && ( null != itemvo.getAttributeValue("vbdef33") && itemvo.getNaccumulatenum().compareTo(new UFDouble(new UFDouble(String.valueOf(itemvo.getAttributeValue("vbdef33"))))) == 0)) {
|
||||||
itemvo.setStatus(1);
|
itemvo.setStatus(1);
|
||||||
itemvo.setBrowclose(UFBoolean.FALSE);
|
itemvo.setBrowclose(UFBoolean.FALSE);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,150 @@
|
||||||
|
//
|
||||||
|
// Source code recreated from a .class file by IntelliJ IDEA
|
||||||
|
// (powered by FernFlower decompiler)
|
||||||
|
//
|
||||||
|
|
||||||
|
package nc.bs.pu.m21.maintain;
|
||||||
|
|
||||||
|
import nc.bs.pu.m21.maintain.rule.ATPBeforeUpdateRule;
|
||||||
|
import nc.bs.pu.m21.maintain.rule.ATPUpdateRule;
|
||||||
|
import nc.bs.pu.m21.maintain.rule.FeeGoodsMaterialBeforeRule;
|
||||||
|
import nc.bs.pu.m21.maintain.rule.MaintainMPPCtrlChkRule;
|
||||||
|
import nc.bs.pu.m21.maintain.rule.NumAndPriceCheckRule;
|
||||||
|
import nc.bs.pu.m21.maintain.rule.OrderScaleCheckRule;
|
||||||
|
import nc.bs.pu.m21.maintain.rule.PrayToPoLimitRule;
|
||||||
|
import nc.bs.pu.m21.maintain.rule.WriteBackSourceRule;
|
||||||
|
import nc.bs.pu.m21.maintain.rule.save.*;
|
||||||
|
import nc.bs.pu.m21.plugin.OrderPluginPoint;
|
||||||
|
import nc.bs.scmpub.rule.CrossRuleValidateRule;
|
||||||
|
import nc.bs.scmpub.rule.VOSagaFrozenValidateRule;
|
||||||
|
import nc.impl.pu.m21.action.rule.RowNoRule;
|
||||||
|
import nc.impl.pu.m21.action.rule.revise.DeleteRule;
|
||||||
|
import nc.impl.pubapp.bd.userdef.UserDefSaveRule;
|
||||||
|
import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser;
|
||||||
|
import nc.vo.pu.m21.context.OrderContext;
|
||||||
|
import nc.vo.pu.m21.entity.OrderHeaderVO;
|
||||||
|
import nc.vo.pu.m21.entity.OrderItemVO;
|
||||||
|
import nc.vo.pu.m21.entity.OrderVO;
|
||||||
|
import nc.vo.pu.pub.rule.NewestOrgVersionFillRule;
|
||||||
|
import nc.vo.pu.pub.rule.TrantypeNotNullCheckRule;
|
||||||
|
import nc.vo.pu.pub.rule.pf.NoPassUpdateRule;
|
||||||
|
import nc.vo.pu.pub.sagas.PUSagasOperationEnum;
|
||||||
|
import nc.vo.pu.pub.util.BillInsert;
|
||||||
|
import nc.vo.pu.pub.util.BillUpdate;
|
||||||
|
import nc.vo.pub.BusinessException;
|
||||||
|
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
||||||
|
import nc.vo.scmpub.msg.rule.UpdateMessageStatusRule;
|
||||||
|
import nc.vo.scmpub.res.billtype.POBillType;
|
||||||
|
import nc.vo.scmpub.rule.AutoMaterialAssignRule;
|
||||||
|
import nc.vo.scmpub.rule.PurchaseOrgEnableCheckRule;
|
||||||
|
|
||||||
|
public class OrderSaveBP {
|
||||||
|
private OrderContext ctx;
|
||||||
|
|
||||||
|
public OrderSaveBP(OrderContext ctx) {
|
||||||
|
this.ctx = ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderVO[] save(OrderVO[] clientVos, OrderVO[] originVos) {
|
||||||
|
OrderVO[] returnedVos = null;
|
||||||
|
if (clientVos[0].getHVO().getStatus() != 2) {
|
||||||
|
CompareAroundProcesser<OrderVO> processer = new CompareAroundProcesser(OrderPluginPoint.UPDATE);
|
||||||
|
this.addBeforeRule(processer, clientVos);
|
||||||
|
this.addAfterRule(processer);
|
||||||
|
processer.before(clientVos, originVos);
|
||||||
|
|
||||||
|
try {
|
||||||
|
returnedVos = (OrderVO[])(new BillUpdate()).update(clientVos, originVos, "pk_order");
|
||||||
|
} catch (BusinessException e) {
|
||||||
|
ExceptionUtils.wrappException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
processer.after(returnedVos, originVos);
|
||||||
|
} else {
|
||||||
|
CompareAroundProcesser<OrderVO> processer = new CompareAroundProcesser(OrderPluginPoint.INSERT);
|
||||||
|
this.addBeforeRule(processer, clientVos);
|
||||||
|
this.addAfterRule(processer);
|
||||||
|
processer.before(clientVos, originVos);
|
||||||
|
|
||||||
|
try {
|
||||||
|
returnedVos = (OrderVO[])(new BillInsert()).insert(clientVos, "pk_order");
|
||||||
|
} catch (BusinessException e) {
|
||||||
|
ExceptionUtils.wrappException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
processer.after(returnedVos, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnedVos;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addAfterRule(CompareAroundProcesser<OrderVO> processer) {
|
||||||
|
processer.addAfterRule(new BillCodeUniqueRule());
|
||||||
|
processer.addAfterRule(new OrderSagasForzenAndCompensateRule("Save", PUSagasOperationEnum.OREDERSAVE));
|
||||||
|
processer.addAfterRule(new PresentStocksChkRule(this.ctx));
|
||||||
|
processer.addAfterRule(new EffectdateValidateRule());
|
||||||
|
processer.addAfterRule(new DocVisibilityChkRule());
|
||||||
|
processer.addAfterRule(new TranTypeChkRule());
|
||||||
|
processer.addAfterRule(new CntPurMaterialChkRule());
|
||||||
|
processer.addAfterRule(new MaxPriceChkRule(this.ctx));
|
||||||
|
processer.addAfterRule(new WriteBackSourceRule(this.ctx));
|
||||||
|
processer.addAfterRule(new WriteBackPriceForET());
|
||||||
|
processer.addAfterRule(new ATPUpdateRule());
|
||||||
|
processer.addAfterRule(new MaxStocksChkRule(this.ctx));
|
||||||
|
processer.addAfterRule(new SaveEventAfterRule());
|
||||||
|
processer.addAfterRule(new SourceToOrderMsgRule());
|
||||||
|
processer.addAfterRule(new SaveTransferMsgRule());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addBeforeRule(CompareAroundProcesser<OrderVO> processer, OrderVO[] orgUpdateVos) {
|
||||||
|
if (orgUpdateVos[0].getHVO().getStatus() != 2) {
|
||||||
|
processer.addBeforeRule(new VOSagaFrozenValidateRule(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
processer.addBeforeRule(new CrossRuleValidateRule(POBillType.Order.getCode()));
|
||||||
|
processer.addBeforeRule(new SaveVOValidateRule());
|
||||||
|
processer.addBeforeRule(new AccrateCheckRule());
|
||||||
|
processer.addBeforeRule(new IsdepositCheckRule());
|
||||||
|
processer.addBeforeRule(new RowNoRule());
|
||||||
|
processer.addBeforeFinalRule(new NewestOrgVersionFillRule("pk_order"));
|
||||||
|
processer.addBeforeRule(new ItemEmptyRule());
|
||||||
|
processer.addBeforeRule(new OrderScaleCheckRule());
|
||||||
|
processer.addBeforeFinalRule(new TrantypeNotNullCheckRule());
|
||||||
|
processer.addBeforeFinalRule(new NoPassUpdateRule());
|
||||||
|
processer.addBeforeRule(new AutoMaterialAssignRule("pk_material", (String[])null, new String[]{"pk_org", "pk_apfinanceorg", "pk_apliabcenter", "pk_arrliabcenter", "pk_arrvstoorg", "pk_psfinanceorg", "pk_reqstoorg"}));
|
||||||
|
processer.addBeforeRule(new MaterialInStorckOrgRule());
|
||||||
|
processer.addBeforeFinalRule(new ArrliabCenterRule());
|
||||||
|
processer.addBeforeRule(new NumAndPriceCheckRule());
|
||||||
|
processer.addBeforeRule(new PurchaseOrgEnableCheckRule());
|
||||||
|
processer.addBeforeRule(new ArrvPlanChkRule(orgUpdateVos));
|
||||||
|
processer.addBeforeRule(new PlanArriveDateCheckRule());
|
||||||
|
processer.addBeforeRule(new DirectOrgCheckRule());
|
||||||
|
processer.addBeforeRule(new DeleteRule());
|
||||||
|
processer.addBeforeRule(new NecessaryFillRule());
|
||||||
|
processer.addBeforeRule(new OrderDirectPurchaseUpdateRule());
|
||||||
|
processer.addBeforeRule(new PrePayLimitCheckRule());
|
||||||
|
processer.addBeforeRule(new OrderCodeProceRule());
|
||||||
|
processer.addBeforeRule(new PrayToPoLimitRule());
|
||||||
|
processer.addBeforeRule(new ATPBeforeUpdateRule());
|
||||||
|
processer.addBeforeRule(new ConfirmOrderBiztypeRule());
|
||||||
|
processer.addBeforeRule(new MaintainMPPCtrlChkRule());
|
||||||
|
processer.addBeforeRule(new PurtypeSetterRule());
|
||||||
|
processer.addBeforeRule(new UserDefSaveRule(new Class[]{OrderHeaderVO.class, OrderItemVO.class}));
|
||||||
|
processer.addBeforeFinalRule(new BorrowpurSetterRule());
|
||||||
|
processer.addBeforeRule(new BatchCodeBeforeRule());
|
||||||
|
processer.addBeforeRule(new SaveEventBeforeRule());
|
||||||
|
processer.addBeforeRule(new IsBlistBeforeRule());
|
||||||
|
processer.addBeforeRule(new PaymentCheckDataBeforeRule());
|
||||||
|
processer.addBeforeRule(new AccountCheckBeforeRule());
|
||||||
|
processer.addBeforeRule(new UpdateMessageStatusRule("csourceid", "csourcebid"));
|
||||||
|
processer.addBeforeRule(new FeeGoodsMaterialBeforeRule());
|
||||||
|
processer.addBeforeRule(new PuCtExistCheckRule());
|
||||||
|
processer.addBeforeRule(new PUOrderChkNumAndMnyRule());
|
||||||
|
processer.addBeforeRule(new CheckMaterialOvidRule());
|
||||||
|
processer.addBeforeRule(new CheckMaterialSaleRule());
|
||||||
|
processer.addBeforeRule(new CheckFeeRule());
|
||||||
|
processer.addBeforeRule(new FillNfeetaxmnyRule());
|
||||||
|
processer.addBeforeRule(new FiterFeffdatetypeRule());
|
||||||
|
processer.addBeforeRule(new CheckOrderFinalNumRule());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
package nc.bs.pu.m21.maintain.rule.save;
|
||||||
|
|
||||||
|
import nc.impl.pubapp.pattern.rule.IRule;
|
||||||
|
import nc.vo.ml.NCLangRes4VoTransl;
|
||||||
|
import nc.vo.pu.m21.entity.OrderItemVO;
|
||||||
|
import nc.vo.pu.m21.entity.OrderVO;
|
||||||
|
import nc.vo.pub.BusinessException;
|
||||||
|
import nc.vo.pub.lang.UFDouble;
|
||||||
|
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
||||||
|
import nc.vo.scmpub.util.ArrayUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 采购订单最终需求数量校验
|
||||||
|
*/
|
||||||
|
public class CheckOrderFinalNumRule implements IRule<OrderVO> {
|
||||||
|
public CheckOrderFinalNumRule() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void process(OrderVO[] orderVOS) {
|
||||||
|
if (!ArrayUtil.isEmpty(orderVOS)) {
|
||||||
|
for (OrderVO vo : orderVOS) {
|
||||||
|
if(vo.getPrimaryKey()!=null){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (OrderItemVO itemVO:vo.getBVO()){
|
||||||
|
if(null != itemVO.getAttributeValue("vbdef33") && itemVO.getNastnum().compareTo(new UFDouble(String.valueOf(itemVO.getAttributeValue("vbdef33"))))>0){
|
||||||
|
try {
|
||||||
|
throw new BusinessException("采购数量大于最终需求数量不能生成采购订单!");
|
||||||
|
} catch (BusinessException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,6 +8,7 @@ package nc.impl.pu.m23.maintain.action;
|
||||||
import nc.bs.pu.m23.maintain.ArriveInsertBP;
|
import nc.bs.pu.m23.maintain.ArriveInsertBP;
|
||||||
import nc.bs.pu.m23.plugin.ArriveActionPlugInPoint;
|
import nc.bs.pu.m23.plugin.ArriveActionPlugInPoint;
|
||||||
import nc.impl.pu.m23.maintain.rule.CheckBillDateRule;
|
import nc.impl.pu.m23.maintain.rule.CheckBillDateRule;
|
||||||
|
import nc.impl.pu.m23.maintain.rule.CheckFinalNumRule;
|
||||||
import nc.impl.pubapp.pattern.rule.processer.AroundProcesser;
|
import nc.impl.pubapp.pattern.rule.processer.AroundProcesser;
|
||||||
import nc.vo.pu.m23.entity.ArriveVO;
|
import nc.vo.pu.m23.entity.ArriveVO;
|
||||||
import nc.vo.pu.m23.env.ArrivalUIToBSEnv;
|
import nc.vo.pu.m23.env.ArrivalUIToBSEnv;
|
||||||
|
|
@ -19,6 +20,7 @@ public class ArriveInsertAction {
|
||||||
public ArriveVO[] insertArrive(ArriveVO[] voArray, ArrivalUIToBSEnv env) {
|
public ArriveVO[] insertArrive(ArriveVO[] voArray, ArrivalUIToBSEnv env) {
|
||||||
AroundProcesser<ArriveVO> processer = new AroundProcesser(ArriveActionPlugInPoint.ArriveInsertAction);
|
AroundProcesser<ArriveVO> processer = new AroundProcesser(ArriveActionPlugInPoint.ArriveInsertAction);
|
||||||
addBeforeRule(processer);
|
addBeforeRule(processer);
|
||||||
|
|
||||||
processer.addBeforeRule(new CheckBillDateRule());
|
processer.addBeforeRule(new CheckBillDateRule());
|
||||||
processer.before(voArray);
|
processer.before(voArray);
|
||||||
ArriveInsertBP bp = new ArriveInsertBP(env);
|
ArriveInsertBP bp = new ArriveInsertBP(env);
|
||||||
|
|
@ -28,5 +30,6 @@ public class ArriveInsertAction {
|
||||||
}
|
}
|
||||||
private void addBeforeRule(AroundProcesser<ArriveVO> processer) {
|
private void addBeforeRule(AroundProcesser<ArriveVO> processer) {
|
||||||
processer.addBeforeFinalRule(new CheckBillDateRule());
|
processer.addBeforeFinalRule(new CheckBillDateRule());
|
||||||
|
processer.addBeforeRule(new CheckFinalNumRule());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
package nc.impl.pu.m23.maintain.rule;
|
package nc.impl.pu.m23.maintain.rule;
|
||||||
|
|
||||||
import nc.bs.framework.common.NCLocator;
|
import nc.bs.framework.common.NCLocator;
|
||||||
|
import nc.bs.trade.business.HYPubBO;
|
||||||
import nc.impl.pubapp.pattern.rule.IRule;
|
import nc.impl.pubapp.pattern.rule.IRule;
|
||||||
import nc.pubitf.so.m30.api.ISaleOrderQueryAPI;
|
import nc.pubitf.so.m30.api.ISaleOrderQueryAPI;
|
||||||
import nc.vo.pu.m21.entity.OrderItemVO;
|
import nc.vo.pu.m21.entity.OrderItemVO;
|
||||||
|
|
@ -18,6 +19,7 @@ import nc.vo.so.m30.entity.SaleOrderBVO;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
public class CheckBillDateRule implements IRule<ArriveVO> {
|
public class CheckBillDateRule implements IRule<ArriveVO> {
|
||||||
|
|
@ -30,112 +32,117 @@ public class CheckBillDateRule implements IRule<ArriveVO> {
|
||||||
|
|
||||||
|
|
||||||
// 提取API服务实例到循环外,提升性能
|
// 提取API服务实例到循环外,提升性能
|
||||||
try{for (ArriveVO vo : vos) {
|
try{for (ArriveVO vo : vos) {
|
||||||
// 校验到货单主信息是否存在
|
// 校验到货单主信息是否存在
|
||||||
if (vo == null || vo.getHVO() == null) {
|
if (vo == null || vo.getHVO() == null) {
|
||||||
throw new BusinessException("到货单主信息不能为空");
|
throw new BusinessException("到货单主信息不能为空");
|
||||||
}
|
}
|
||||||
|
// 只校验箱变
|
||||||
|
HYPubBO hybo = new HYPubBO();
|
||||||
|
String org = hybo.findColValue("org_adminorg", "pk_adminorg", " code = 'C030' ") + "";
|
||||||
|
if(!vo.getHVO().getPk_org().equals(org)){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Date arriveMakeDate = null != vo.getHVO().getDbilldate() ? vo.getHVO().getDbilldate().toDate(): new Date() ;
|
||||||
|
// 校验制单日期是否存在
|
||||||
|
if (arriveMakeDate == null) {
|
||||||
|
throw new BusinessException("到货单制单日期不能为空");
|
||||||
|
}
|
||||||
|
|
||||||
Date arriveMakeDate = null != vo.getHVO().getDmakedate() ? vo.getHVO().getDmakedate().toDate(): new Date() ;
|
// 遍历到货单明细
|
||||||
// 校验制单日期是否存在
|
ArriveItemVO[] itemVOs = vo.getBVO();
|
||||||
if (arriveMakeDate == null) {
|
if (itemVOs == null || itemVOs.length==0) {
|
||||||
throw new BusinessException("到货单制单日期不能为空");
|
continue; // 没有明细则跳过当前到货单处理
|
||||||
}
|
}
|
||||||
|
|
||||||
// 遍历到货单明细
|
for (ArriveItemVO itemVO : itemVOs) {
|
||||||
ArriveItemVO[] itemVOs = vo.getBVO();
|
// 校验明细必要字段
|
||||||
if (itemVOs == null || itemVOs.length==0) {
|
if (itemVO == null) {
|
||||||
continue; // 没有明细则跳过当前到货单处理
|
throw new BusinessException("到货单明细不能为空");
|
||||||
}
|
}
|
||||||
|
String pkOrder = itemVO.getPk_order();
|
||||||
|
String pkOrderB = itemVO.getPk_order_b();
|
||||||
|
if (StringUtils.isEmpty(pkOrder) || StringUtils.isEmpty(pkOrderB)) {
|
||||||
|
throw new BusinessException("采购订单ID或订单明细ID不能为空");
|
||||||
|
}
|
||||||
|
|
||||||
for (ArriveItemVO itemVO : itemVOs) {
|
try {
|
||||||
// 校验明细必要字段
|
// 查询对应的销售订单
|
||||||
if (itemVO == null) {
|
OrderVO[] orderVOs =new BillQuery<OrderVO>(OrderVO.class).query(new String[]{pkOrder});
|
||||||
throw new BusinessException("到货单明细不能为空");
|
if (orderVOs == null || orderVOs.length == 0) {
|
||||||
}
|
return;
|
||||||
String pkOrder = itemVO.getPk_order();
|
|
||||||
String pkOrderB = itemVO.getPk_order_b();
|
|
||||||
if (StringUtils.isEmpty(pkOrder) || StringUtils.isEmpty(pkOrderB)) {
|
|
||||||
throw new BusinessException("采购订单ID或订单明细ID不能为空");
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 查询对应的销售订单
|
|
||||||
OrderVO[] orderVOs =new BillQuery<OrderVO>(OrderVO.class).query(new String[]{pkOrder});
|
|
||||||
if (orderVOs == null || orderVOs.length == 0) {
|
|
||||||
return;
|
|
||||||
// throw new BusinessException("未找到ID为" + pkOrder + "的采购订单");
|
// throw new BusinessException("未找到ID为" + pkOrder + "的采购订单");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取订单明细
|
// 获取订单明细
|
||||||
OrderVO o = orderVOs[0];
|
OrderVO o = orderVOs[0];
|
||||||
OrderItemVO[] orderItemVOs = o.getBVO();
|
OrderItemVO[] orderItemVOs = o.getBVO();
|
||||||
if (orderItemVOs == null || orderItemVOs.length == 0) {
|
if (orderItemVOs == null || orderItemVOs.length == 0) {
|
||||||
return;
|
return;
|
||||||
// throw new BusinessException("采购订单" + pkOrder + "没有明细数据");
|
// throw new BusinessException("采购订单" + pkOrder + "没有明细数据");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查找匹配的订单明细
|
// 查找匹配的订单明细
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
for (OrderItemVO orderItem : orderItemVOs) {
|
for (OrderItemVO orderItem : orderItemVOs) {
|
||||||
if (orderItem != null && pkOrderB.equals(orderItem.getPk_order_b())) {
|
if (orderItem != null && pkOrderB.equals(orderItem.getPk_order_b())) {
|
||||||
found = true;
|
found = true;
|
||||||
Date expectArriveDate = orderItem.getDplanarrvdate().toDate();
|
Date expectArriveDate = orderItem.getDplanarrvdate().toDate();
|
||||||
if (expectArriveDate == null) {
|
if (expectArriveDate == null) {
|
||||||
throw new BusinessException("采购订单明细" + pkOrderB + "的计划到货时间不能为空");
|
throw new BusinessException("采购订单明细" + pkOrderB + "的计划到货时间不能为空");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 核心逻辑:只允许提前3天到货
|
// 核心逻辑:只允许提前3天到货
|
||||||
// 1. 计算预计到货时间前3天的日期(最早允许的制单日期)
|
// 1. 计算预计到货时间前3天的日期(最早允许的制单日期)
|
||||||
Date earliestAllowedDate = addDays(expectArriveDate, -3);
|
Date earliestAllowedDate = addDays(expectArriveDate, -3);
|
||||||
|
|
||||||
// 2. 判断规则
|
// 2. 判断规则
|
||||||
boolean isTooEarly = arriveMakeDate.before(earliestAllowedDate);
|
boolean isTooEarly =clearTime(arriveMakeDate).before(clearTime(earliestAllowedDate));
|
||||||
boolean isTooLate = arriveMakeDate.after(expectArriveDate);
|
// boolean isTooLate = arriveMakeDate.after(expectArriveDate);
|
||||||
|
|
||||||
if (isTooEarly || isTooLate) {
|
// if (isTooEarly || isTooLate) {
|
||||||
String errorMsg;
|
String errorMsg;
|
||||||
if (isTooEarly) {
|
if (isTooEarly) {
|
||||||
errorMsg = String.format(
|
errorMsg = String.format(
|
||||||
"到货单制单日期(%s)早于采购订单预计到货时间(%s)超过3天,不允许保存。最早允许制单日期为%s。订单编号:%s,明细行号:%s",
|
"到货单制单日期(%s)早于采购订单预计到货时间(%s)超过3天,不允许保存。最早允许制单日期为%s。订单编号:%s,明细行号:%s",
|
||||||
formatDate(arriveMakeDate),
|
formatDate(arriveMakeDate),
|
||||||
formatDate(expectArriveDate),
|
formatDate(expectArriveDate),
|
||||||
formatDate(earliestAllowedDate),
|
formatDate(earliestAllowedDate),
|
||||||
o.getHVO().getVbillcode(),
|
o.getHVO().getVbillcode(),
|
||||||
orderItem.getCrowno()
|
orderItem.getCrowno()
|
||||||
);
|
);
|
||||||
} else { // isTooLate
|
// } else { // isTooLate
|
||||||
errorMsg = String.format(
|
// errorMsg = String.format(
|
||||||
"到货单制单日期(%s)晚于采购订单预计到货时间(%s),不符合提前到货规则,不允许保存。订单编号:%s,明细行号:%s",
|
// "到货单制单日期(%s)晚于采购订单预计到货时间(%s),不符合提前到货规则,不允许保存。订单编号:%s,明细行号:%s",
|
||||||
formatDate(arriveMakeDate),
|
// formatDate(arriveMakeDate),
|
||||||
formatDate(expectArriveDate),
|
// formatDate(expectArriveDate),
|
||||||
o.getHVO().getVbillcode(),
|
// o.getHVO().getVbillcode(),
|
||||||
orderItem.getCrowno()
|
// orderItem.getCrowno()
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
throw new BusinessException(errorMsg);
|
throw new BusinessException(errorMsg);
|
||||||
}
|
}
|
||||||
break; // 找到匹配明细后退出循环
|
break; // 找到匹配明细后退出循环
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!found) {
|
if (!found) {
|
||||||
throw new BusinessException("未找到采购订单" + pkOrder + "中ID为" + pkOrderB + "的明细");
|
throw new BusinessException("未找到采购订单" + pkOrder + "中ID为" + pkOrderB + "的明细");
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (BusinessException e) {
|
} catch (BusinessException e) {
|
||||||
// 直接抛出业务异常,中断流程
|
// 直接抛出业务异常,中断流程
|
||||||
throw e;
|
throw e;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// 捕获其他异常并包装为业务异常
|
// 捕获其他异常并包装为业务异常
|
||||||
throw new BusinessException("校验采购订单与到货单时间关系时发生错误:" + e.getMessage(), e);
|
throw new BusinessException("校验采购订单与到货单时间关系时发生错误:" + e.getMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -160,6 +167,22 @@ public class CheckBillDateRule implements IRule<ArriveVO> {
|
||||||
return DATE_FORMATTER.format(date);
|
return DATE_FORMATTER.format(date);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 清除日期中的时间部分,只保留年月日
|
||||||
|
*/
|
||||||
|
private static Date clearTime(Date date) {
|
||||||
|
if (date == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(date);
|
||||||
|
// 将时间部分设置为0
|
||||||
|
calendar.set(Calendar.HOUR_OF_DAY, 0);
|
||||||
|
calendar.set(Calendar.MINUTE, 0);
|
||||||
|
calendar.set(Calendar.SECOND, 0);
|
||||||
|
calendar.set(Calendar.MILLISECOND, 0);
|
||||||
|
return calendar.getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
package nc.impl.pu.m23.maintain.rule;
|
||||||
|
|
||||||
|
import nc.vo.pu.m23.entity.ArriveItemVO;
|
||||||
|
import nc.vo.pu.m23.entity.ArriveVO;
|
||||||
|
import nc.impl.pubapp.pattern.rule.IRule;
|
||||||
|
import nc.vo.pub.BusinessException;
|
||||||
|
import nc.vo.pub.lang.UFDateTime;
|
||||||
|
import nc.vo.pub.lang.UFDouble;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最终需求数量校验
|
||||||
|
*/
|
||||||
|
public class CheckFinalNumRule implements IRule<ArriveVO> {
|
||||||
|
public CheckFinalNumRule() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void process(ArriveVO[] arriveVOS) {
|
||||||
|
for (ArriveVO vo : arriveVOS) {
|
||||||
|
if (vo.getPrimaryKey() != null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (vo == null || vo.getHVO() == null) {
|
||||||
|
try {
|
||||||
|
throw new BusinessException("到货单主信息不能为空");
|
||||||
|
} catch (BusinessException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ArriveItemVO[] bodys=vo.getBVO();
|
||||||
|
for(ArriveItemVO body : bodys) {
|
||||||
|
if(null!=body.getAttributeValue("vbdef33") && body.getNastnum().compareTo(new UFDouble(String.valueOf(body.getAttributeValue("vbdef33"))))>0){
|
||||||
|
try {
|
||||||
|
throw new BusinessException("数量大于最终需求数量不能生成到货单!");
|
||||||
|
} catch (BusinessException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue