|
@@ -0,0 +1,223 @@
|
|
|
+package nc.pubimpl.so.m30.pfxx;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+import nc.bs.framework.common.InvocationInfoProxy;
|
|
|
+import nc.bs.framework.common.NCLocator;
|
|
|
+import nc.bs.pub.taskmanager.SynTaskTree;
|
|
|
+import nc.impl.pubapp.pattern.data.bill.BillQuery;
|
|
|
+import nc.impl.pubapp.pattern.data.bill.tool.BillConcurrentTool;
|
|
|
+import nc.impl.pubapp.pattern.rule.IRule;
|
|
|
+import nc.impl.so.m30.action.main.InsertSaleOrderAction;
|
|
|
+import nc.impl.so.m30.action.main.UpdateSaleOrderAction;
|
|
|
+import nc.itf.uap.pf.IPFBusiAction;
|
|
|
+import nc.pubimpl.so.pfxx.AbstractSOPfxxPlugin;
|
|
|
+import nc.pubimpl.so.pfxx.check.BillFreeStatusCheckRule;
|
|
|
+import nc.pubimpl.so.pfxx.check.MnyTaxCheckRule;
|
|
|
+import nc.pubimpl.so.pfxx.check.WriteBackInfoCheckRule;
|
|
|
+import nc.pubitf.uapbd.CurrencyRateUtil;
|
|
|
+import nc.vo.pub.AggregatedValueObject;
|
|
|
+import nc.vo.pub.BusinessException;
|
|
|
+import nc.vo.pub.lang.UFDouble;
|
|
|
+import nc.vo.pub.pf.workflow.IPFActionName;
|
|
|
+import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
|
|
+import nc.vo.so.m30.entity.SaleOrderBVO;
|
|
|
+import nc.vo.so.m30.entity.SaleOrderHVO;
|
|
|
+import nc.vo.so.m30.entity.SaleOrderVO;
|
|
|
+import nc.vo.wfengine.pub.WFTask;
|
|
|
+
|
|
|
+public class M30PfxxPlugin extends AbstractSOPfxxPlugin {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<IRule<AggregatedValueObject>> getCheckers() {
|
|
|
+ List<IRule<AggregatedValueObject>> rules =
|
|
|
+ new ArrayList<IRule<AggregatedValueObject>>();
|
|
|
+ // 单据状态检查,非自由态不可以导入
|
|
|
+ rules.add(new BillFreeStatusCheckRule());
|
|
|
+ // 价税合计=无税金额+税额(本币)
|
|
|
+// rules.add(new MnyTaxCheckRule(SaleOrderBVO.NTAX, SaleOrderBVO.NMNY,
|
|
|
+// SaleOrderBVO.NTAXMNY));
|
|
|
+ // 累计数量字段
|
|
|
+ rules.add(new WriteBackInfoCheckRule(new String[] {
|
|
|
+ SaleOrderBVO.NTOTALSENDNUM,// 累计发货主数量
|
|
|
+ SaleOrderBVO.NTOTALINVOICENUM,// 累计开票主数量
|
|
|
+ SaleOrderBVO.NTOTALOUTNUM,// 累计出库主数量
|
|
|
+ SaleOrderBVO.NTOTALNOTOUTNUM,// 累计应发未出库主数量
|
|
|
+ SaleOrderBVO.NTOTALSIGNNUM,// 累计签收主数量
|
|
|
+ SaleOrderBVO.NTRANSLOSSNUM,// 累计途损主数量
|
|
|
+ SaleOrderBVO.NTOTALRUSHNUM,// 累计出库对冲主数量
|
|
|
+ SaleOrderBVO.NTOTALESTARNUM,// 累计暂估应收主数量
|
|
|
+ SaleOrderBVO.NTOTALARNUM,// 累计确认应收主数量
|
|
|
+ SaleOrderBVO.NTOTALCOSTNUM,// 累计成本结算主数量
|
|
|
+ SaleOrderBVO.NTOTALESTARMNY,// 累计暂估应收金额
|
|
|
+ SaleOrderBVO.NTOTALARMNY,// 累计确认应收金额
|
|
|
+ SaleOrderBVO.NTOTALPAYMNY,// 累计收款核销金额
|
|
|
+ SaleOrderBVO.NORIGSUBMNY,// 累计冲抵金额
|
|
|
+ SaleOrderBVO.NARRANGESCORNUM,// 累计安排委外订单主数量
|
|
|
+ SaleOrderBVO.NARRANGEPOAPPNUM,// 累计安排请购单主数量
|
|
|
+ SaleOrderBVO.NARRANGETOORNUM,// 累计安排调拨订单主数量
|
|
|
+ SaleOrderBVO.NARRANGETOAPPNUM,// 累计安排调拨申请主数量
|
|
|
+ SaleOrderBVO.NARRANGEMONUM,// 累计安排生产订单主数量
|
|
|
+ SaleOrderBVO.NARRANGEPONUM,// 累计安排采购订单主数量
|
|
|
+ SaleOrderBVO.NTOTALPLONUM,// 累计生成计划订单主数量
|
|
|
+ SaleOrderBVO.NTOTALRETURNNUM,// 累计退货主数量
|
|
|
+ SaleOrderBVO.NTOTALTRADENUM
|
|
|
+ // 累计发出商品主数量
|
|
|
+ }));
|
|
|
+ return rules;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected AggregatedValueObject insert(AggregatedValueObject vo) {
|
|
|
+
|
|
|
+ SaleOrderVO[] insertvo = new SaleOrderVO[] {
|
|
|
+ (SaleOrderVO) vo
|
|
|
+ };
|
|
|
+
|
|
|
+ /*异币种换算金额 */
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据源币种主键,目的币种主键,查询指定日期的汇率
|
|
|
+ *
|
|
|
+ * @param src_currency_pk
|
|
|
+ * 源币种主键
|
|
|
+ * @param dest_currency_pk
|
|
|
+ * 目的币种的主键,为null时则认为是默认目的币种主键
|
|
|
+ * @param date
|
|
|
+ * @return
|
|
|
+ * @throws BusinessException
|
|
|
+ */
|
|
|
+
|
|
|
+
|
|
|
+ SaleOrderHVO headvo=(SaleOrderHVO) vo.getParentVO();
|
|
|
+ // if( headvo.getNexchangerate().compareTo(UFDouble.ONE_DBL)!=0){
|
|
|
+ String corigcurrencyid= headvo.getCorigcurrencyid();
|
|
|
+ CurrencyRateUtil currRateUtil = CurrencyRateUtil
|
|
|
+ .getInstanceByOrg(headvo.getPk_org());
|
|
|
+ try {
|
|
|
+ SaleOrderBVO[] bodyvos= (SaleOrderBVO[]) vo.getChildrenVO();
|
|
|
+ for(SaleOrderBVO bodyvo:bodyvos){
|
|
|
+ String ccurrencyid= bodyvo.getCcurrencyid();
|
|
|
+
|
|
|
+ if(corigcurrencyid.equals(ccurrencyid)){
|
|
|
+ UFDouble nqtorigtaxprice = bodyvo.getNqtorigtaxprice();//含税单价
|
|
|
+ UFDouble nqtorigprice = bodyvo.getNqtorigprice();//无税单价
|
|
|
+ UFDouble norigmny = bodyvo.getNorigmny();//无税金额
|
|
|
+ UFDouble norigtaxmny = bodyvo.getNorigtaxmny();//价税合计
|
|
|
+ bodyvo.setNcaltaxmny(norigtaxmny);//计税金额
|
|
|
+ bodyvo.setNqttaxprice(nqtorigtaxprice);//本币含税单价
|
|
|
+ bodyvo.setNqtprice(nqtorigprice);//本币无税单价
|
|
|
+ bodyvo.setNqttaxnetprice(nqtorigtaxprice);//本币含税净价
|
|
|
+ bodyvo.setNqtnetprice(nqtorigprice);//本币无税净价
|
|
|
+ bodyvo.setNtaxprice(nqtorigtaxprice);//主本币含税单价
|
|
|
+ bodyvo.setNpiece(nqtorigprice);//主本币无税单价
|
|
|
+ bodyvo.setNtaxnetprice(nqtorigtaxprice);//主本币含税净价
|
|
|
+ bodyvo.setNnetprice(nqtorigprice);//主本币无税净价
|
|
|
+ bodyvo.setNmny(norigmny);//本币无税金额
|
|
|
+ bodyvo.setNtaxmny(norigtaxmny);//本币价税合计
|
|
|
+
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ UFDouble foreignrate = currRateUtil.getRate(corigcurrencyid,/*原币*/
|
|
|
+ ccurrencyid/*本币*/, headvo.getDbilldate());//汇率
|
|
|
+ bodyvo.setNexchangerate(foreignrate);
|
|
|
+ //norigprice 原币无税单价
|
|
|
+ UFDouble norigprice=bodyvo.getNorigtaxprice();//主原币含税单价
|
|
|
+ UFDouble foreignAmount= currRateUtil.getAmountByOpp(corigcurrencyid,
|
|
|
+ ccurrencyid, norigprice, foreignrate, headvo.getDbilldate());
|
|
|
+ bodyvo.setNtaxprice(foreignAmount);//主本币含税单价
|
|
|
+
|
|
|
+ UFDouble ngprice=currRateUtil.getAmountByOpp(corigcurrencyid,
|
|
|
+ ccurrencyid, bodyvo.getNorigprice()/*主原币无税单价*/, foreignrate, headvo.getDbilldate());
|
|
|
+
|
|
|
+ bodyvo.setNprice(ngprice); // 主本币无税单价
|
|
|
+
|
|
|
+ bodyvo.setNqtprice(ngprice); //报价本币无税单价
|
|
|
+
|
|
|
+ bodyvo.setNqttaxprice(foreignAmount);//报价本币含税单价
|
|
|
+
|
|
|
+
|
|
|
+ UFDouble nmny=currRateUtil.getAmountByOpp(corigcurrencyid,
|
|
|
+ ccurrencyid, bodyvo.getNorigmny()/*原币无税金额*/, foreignrate, headvo.getDbilldate());
|
|
|
+
|
|
|
+ bodyvo.setNmny(nmny);//本币无税金额
|
|
|
+
|
|
|
+ UFDouble ntaxmny=currRateUtil.getAmountByOpp(corigcurrencyid,
|
|
|
+ ccurrencyid, bodyvo.getNorigtaxmny()/*原币价税合计*/, foreignrate, headvo.getDbilldate());
|
|
|
+
|
|
|
+ bodyvo.setNtaxmny(ntaxmny);//ntaxmny 本币价税合计
|
|
|
+
|
|
|
+ bodyvo.setNcaltaxmny(nmny);//计税金额
|
|
|
+ bodyvo.setNqtnetprice(ngprice);//本币无税净价
|
|
|
+ bodyvo.setNnetprice(ngprice);//主本币无税净价
|
|
|
+
|
|
|
+ bodyvo.setNqttaxnetprice(foreignAmount);//本币含税净价
|
|
|
+ bodyvo.setNtaxnetprice(foreignAmount);//主本币含税净价
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ bodyvo.setNtax(ntaxmny.sub(nmny));//税额=价税合计-无税金额
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (BusinessException e1) {
|
|
|
+ ExceptionUtils.wrappException(e1);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ InsertSaleOrderAction insertact = new InsertSaleOrderAction();
|
|
|
+ SaleOrderVO[] retvos = insertact.insert(insertvo);
|
|
|
+ if (null == retvos || retvos.length == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ //add by ZTH 江门工玻 销售订单审批通过
|
|
|
+
|
|
|
+ String pk_org = retvos[0].getParentVO().getPk_org();
|
|
|
+ //0001V510000000002GEH 江门基地
|
|
|
+ if(pk_org != null && (pk_org.equals("0001V510000000002GDX"))){
|
|
|
+ IPFBusiAction service = NCLocator.getInstance().lookup(IPFBusiAction.class);
|
|
|
+ InvocationInfoProxy.getInstance().setUserId(retvos[0].getParentVO().getApprover());
|
|
|
+ try {
|
|
|
+ service.processAction(IPFActionName.APPROVE,
|
|
|
+ "30", null, retvos[0], null, null);
|
|
|
+ } catch (BusinessException e) {
|
|
|
+ // TODO 自动生成的 catch 块
|
|
|
+ ExceptionUtils.wrappBusinessException(e.getMessage());
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ return retvos[0];
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected AggregatedValueObject update(AggregatedValueObject vo, String vopk) {
|
|
|
+
|
|
|
+ SaleOrderVO[] updatevo = new SaleOrderVO[] {
|
|
|
+ (SaleOrderVO) vo
|
|
|
+ };
|
|
|
+ BillQuery<SaleOrderVO> billquery =
|
|
|
+ new BillQuery<SaleOrderVO>(SaleOrderVO.class);
|
|
|
+ SaleOrderVO[] origvos = billquery.query(new String[] {
|
|
|
+ vopk
|
|
|
+ });
|
|
|
+ BillConcurrentTool tool = new BillConcurrentTool();
|
|
|
+ tool.lockBill(origvos);
|
|
|
+ UpdateSaleOrderAction insertact = new UpdateSaleOrderAction();
|
|
|
+ SaleOrderVO[] retvos = insertact.update(updatevo, origvos);
|
|
|
+ if (null == retvos || retvos.length == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return retvos[0];
|
|
|
+ }
|
|
|
+
|
|
|
+}
|