|  | @@ -0,0 +1,173 @@
 | 
	
		
			
				|  |  | +package nc.ui.pu.m25.editor.card.afteredit.body;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import nc.itf.scmpub.reference.uap.bd.vat.BuySellFlagEnum;
 | 
	
		
			
				|  |  | +import nc.itf.scmpub.reference.uap.bd.vat.VATInfoQueryVO;
 | 
	
		
			
				|  |  | +import nc.itf.scmpub.reference.uap.bd.vat.VATInfoVO;
 | 
	
		
			
				|  |  | +import nc.ui.pu.m25.editor.utils.RelationCalculate;
 | 
	
		
			
				|  |  | +import nc.ui.pu.m25.editor.utils.TaxRateAndTypeUtil;
 | 
	
		
			
				|  |  | +import nc.ui.pu.m25.rule.InvoiceQueryPriceHandler;
 | 
	
		
			
				|  |  | +import nc.ui.pu.pub.editor.CardEditorHelper;
 | 
	
		
			
				|  |  | +import nc.ui.pu.pub.editor.card.listener.ICardBodyAfterEditEventListener;
 | 
	
		
			
				|  |  | +import nc.ui.pub.bill.BillCardPanel;
 | 
	
		
			
				|  |  | +import nc.ui.pubapp.uif2app.event.card.CardBodyAfterEditEvent;
 | 
	
		
			
				|  |  | +import nc.ui.pubapp.uif2app.view.util.RefMoreSelectedUtils;
 | 
	
		
			
				|  |  | +import nc.vo.pu.m25.entity.InvoiceHeaderVO;
 | 
	
		
			
				|  |  | +import nc.vo.pu.m25.entity.InvoiceItemVO;
 | 
	
		
			
				|  |  | +import nc.vo.pu.pub.enumeration.PricePriority;
 | 
	
		
			
				|  |  | +import nc.vo.pu.pub.rule.vat.BillItemVatTaxInfoSetter;
 | 
	
		
			
				|  |  | +import nc.vo.pu.pub.rule.vat.TaxValue;
 | 
	
		
			
				|  |  | +import nc.vo.pu.pub.util.ObjectUtil;
 | 
	
		
			
				|  |  | +import nc.vo.pu.pub.util.PUSysParamUtil;
 | 
	
		
			
				|  |  | +import nc.vo.pub.lang.UFBoolean;
 | 
	
		
			
				|  |  | +import nc.vo.pub.lang.UFDate;
 | 
	
		
			
				|  |  | +import nc.vo.pubapp.AppContext;
 | 
	
		
			
				|  |  | +import nc.vo.pubapp.pattern.data.ValueUtils;
 | 
	
		
			
				|  |  | +import nc.vo.pubapp.scale.ScaleUtils;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import org.apache.commons.lang.ArrayUtils;
 | 
	
		
			
				|  |  | +import org.apache.commons.lang.StringUtils;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * <p>
 | 
	
		
			
				|  |  | + * <b>本类主要完成以下功能:</b>
 | 
	
		
			
				|  |  | + * <ul>
 | 
	
		
			
				|  |  | + * <li>表体物料编辑后处理
 | 
	
		
			
				|  |  | + * </ul>
 | 
	
		
			
				|  |  | + * <p>
 | 
	
		
			
				|  |  | + * <p>
 | 
	
		
			
				|  |  | + * 
 | 
	
		
			
				|  |  | + * @version 6.0
 | 
	
		
			
				|  |  | + * @since 6.0
 | 
	
		
			
				|  |  | + * @author tianft
 | 
	
		
			
				|  |  | + * @time 2010-3-26 上午10:38:21
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +public class Material implements ICardBodyAfterEditEventListener {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  @Override
 | 
	
		
			
				|  |  | +  public void afterEdit(CardBodyAfterEditEvent event) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    RefMoreSelectedUtils utils =
 | 
	
		
			
				|  |  | +        new RefMoreSelectedUtils(event.getBillCardPanel());
 | 
	
		
			
				|  |  | +    event.getBillCardPanel().getBillModel().setNeedCalculate(false);
 | 
	
		
			
				|  |  | +    // 处理多选情况
 | 
	
		
			
				|  |  | +    int[] rows =
 | 
	
		
			
				|  |  | +        utils.refMoreSelected(event.getRow(), InvoiceItemVO.PK_MATERIAL, true);
 | 
	
		
			
				|  |  | +    // 清空物料
 | 
	
		
			
				|  |  | +    if (rows.length == 1 && ObjectUtil.isEmptyWithTrim(event.getValue())) {
 | 
	
		
			
				|  |  | +      event.getBillCardPanel().getBillModel().setNeedCalculate(true);
 | 
	
		
			
				|  |  | +      return;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    // 物料编辑时(已经有物料的情况下,单位可能被该动过)
 | 
	
		
			
				|  |  | +    this.calculateByNum(event.getBillCardPanel(), rows);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // ---------远程调用合并-------------------------------------
 | 
	
		
			
				|  |  | +    // 多选处理,询计划价,税率
 | 
	
		
			
				|  |  | +    TaxRateAndTypeUtil util =
 | 
	
		
			
				|  |  | +        new TaxRateAndTypeUtil(event.getBillCardPanel(), rows);
 | 
	
		
			
				|  |  | +    util.prepare();
 | 
	
		
			
				|  |  | +    // 询价远程调用合并
 | 
	
		
			
				|  |  | +    InvoiceQueryPriceHandler price =
 | 
	
		
			
				|  |  | +        new InvoiceQueryPriceHandler(event.getBillCardPanel(), rows);
 | 
	
		
			
				|  |  | +    price.prepareQueryPrice();
 | 
	
		
			
				|  |  | +    // VAT信息设置规则的远程调用
 | 
	
		
			
				|  |  | +    TaxValue taxvaluerule =
 | 
	
		
			
				|  |  | +        this.getVatValueRule(event.getBillCardPanel(), rows);
 | 
	
		
			
				|  |  | +    taxvaluerule.prepare();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // ---------远程调用合并执行真正的处理---------------------
 | 
	
		
			
				|  |  | +    // VAT信息设置
 | 
	
		
			
				|  |  | +    this.setVatVule(taxvaluerule, event.getBillCardPanel(), rows);
 | 
	
		
			
				|  |  | +    // 计划价
 | 
	
		
			
				|  |  | +    util.setPlanPrice();
 | 
	
		
			
				|  |  | +    // 触发询价,劳务折扣类物料不参与询价!!
 | 
	
		
			
				|  |  | +    price.handleQueryPrice();
 | 
	
		
			
				|  |  | +    event.getBillCardPanel().getBillModel().setNeedCalculate(true);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * 编辑物料时重新设置单位,并用主数量联动
 | 
	
		
			
				|  |  | +   * 
 | 
	
		
			
				|  |  | +   * @param event
 | 
	
		
			
				|  |  | +   * @param rows
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  private void calculateByNum(BillCardPanel panel, int[] rows) {
 | 
	
		
			
				|  |  | +    if (ArrayUtils.isEmpty(rows)) {
 | 
	
		
			
				|  |  | +      return;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    ScaleUtils scale = new ScaleUtils(AppContext.getInstance().getPkGroup());
 | 
	
		
			
				|  |  | +    for (int row : rows) {
 | 
	
		
			
				|  |  | +      panel.setBodyValueAt(scale.adjustHslScale("1.00/1.00"), row,
 | 
	
		
			
				|  |  | +          InvoiceItemVO.VCHANGERATE);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    RelationCalculate calc = new RelationCalculate();
 | 
	
		
			
				|  |  | +    calc.calculate(panel, rows, InvoiceItemVO.NNUM);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  private TaxValue getVatValueRule(BillCardPanel bcp, int[] rows) {
 | 
	
		
			
				|  |  | +    CardEditorHelper invoice = new CardEditorHelper(bcp);
 | 
	
		
			
				|  |  | +    String sendcountry =
 | 
	
		
			
				|  |  | +        invoice.getHeadStringValue(InvoiceHeaderVO.CSENDCOUNTRYID);
 | 
	
		
			
				|  |  | +    String rececountry =
 | 
	
		
			
				|  |  | +        invoice.getHeadStringValue(InvoiceHeaderVO.CRECECOUNTRYID);
 | 
	
		
			
				|  |  | +    String taxcountry =
 | 
	
		
			
				|  |  | +        invoice.getHeadStringValue(InvoiceHeaderVO.CTAXCOUNTRYID);
 | 
	
		
			
				|  |  | +    UFDate billdate = invoice.getHeadUFDateValue(InvoiceHeaderVO.DBILLDATE);
 | 
	
		
			
				|  |  | +    Integer fbsflag =
 | 
	
		
			
				|  |  | +        (Integer) invoice.getHeadValue(InvoiceHeaderVO.FBUYSELLFLAG);
 | 
	
		
			
				|  |  | +    String pk_supplier =
 | 
	
		
			
				|  |  | +        invoice.getHeadStringValue(InvoiceHeaderVO.PK_SUPPLIER);
 | 
	
		
			
				|  |  | +    UFBoolean triatrade =
 | 
	
		
			
				|  |  | +        ValueUtils.getUFBoolean(invoice
 | 
	
		
			
				|  |  | +            .getHeadValue(InvoiceHeaderVO.BTRIATRADEFLAG));
 | 
	
		
			
				|  |  | +    String pk_org = invoice.getHeadStringValue(InvoiceHeaderVO.PK_ORG);
 | 
	
		
			
				|  |  | +    VATInfoQueryVO[] vatqvos = new VATInfoQueryVO[rows.length];
 | 
	
		
			
				|  |  | +    for (int i = 0; i < rows.length; i++) {
 | 
	
		
			
				|  |  | +      if (StringUtils.isBlank(sendcountry) || StringUtils.isBlank(rececountry)
 | 
	
		
			
				|  |  | +          || StringUtils.isBlank(taxcountry)
 | 
	
		
			
				|  |  | +          || StringUtils.isBlank(pk_supplier) || null == billdate
 | 
	
		
			
				|  |  | +          || null == fbsflag) {
 | 
	
		
			
				|  |  | +        continue;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      String pk_material =
 | 
	
		
			
				|  |  | +          invoice.getBodyStringValue(rows[i], InvoiceItemVO.PK_MATERIAL);
 | 
	
		
			
				|  |  | +      vatqvos[i] =
 | 
	
		
			
				|  |  | +          new VATInfoQueryVO(taxcountry, BuySellFlagEnum.valueOf(fbsflag),
 | 
	
		
			
				|  |  | +              triatrade, sendcountry, rececountry, pk_supplier, pk_material,
 | 
	
		
			
				|  |  | +              billdate, pk_org);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    TaxValue tv = new TaxValue(vatqvos);
 | 
	
		
			
				|  |  | +    tv.prepare();
 | 
	
		
			
				|  |  | +    return tv;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  private void setVatVule(TaxValue tv, BillCardPanel bcp, int[] rows) {
 | 
	
		
			
				|  |  | +    CardEditorHelper invoice = new CardEditorHelper(bcp);
 | 
	
		
			
				|  |  | +    // VATValueSetProvider puorgbuysellGetter = new
 | 
	
		
			
				|  |  | +    // VATValueSetProvider(invoice);
 | 
	
		
			
				|  |  | +    // puorgbuysellGetter.setFbuysellflagPos(PosEnum.head);
 | 
	
		
			
				|  |  | +    BillItemVatTaxInfoSetter setter = new BillItemVatTaxInfoSetter(invoice);
 | 
	
		
			
				|  |  | +    RelationCalculate calc = new RelationCalculate();
 | 
	
		
			
				|  |  | +    tv.process();
 | 
	
		
			
				|  |  | +    VATInfoVO[] vatinfos = tv.getVatinfos();
 | 
	
		
			
				|  |  | +    String pk_purchaseorg =
 | 
	
		
			
				|  |  | +        invoice.getHeadStringValue(InvoiceHeaderVO.PK_PURCHASEORG);
 | 
	
		
			
				|  |  | +    PricePriority pricePriority =
 | 
	
		
			
				|  |  | +        PUSysParamUtil.getPO28For25(pk_purchaseorg) ? PricePriority.TAXPRICE_PRIOR_TO_PRICE
 | 
	
		
			
				|  |  | +            : PricePriority.PRICE_PRIOR_TO_TAXPRICE;
 | 
	
		
			
				|  |  | +    for (int i = 0; i < rows.length; i++) {
 | 
	
		
			
				|  |  | +      VATInfoVO vatvo = vatinfos[i];
 | 
	
		
			
				|  |  | +      if (null == vatvo) {
 | 
	
		
			
				|  |  | +        continue;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      String chgkey = setter.setVatTax(vatvo, rows[i], pricePriority);
 | 
	
		
			
				|  |  | +      if (null == chgkey) {
 | 
	
		
			
				|  |  | +        continue;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      calc.calculate(invoice.getEditor(), new int[] {
 | 
	
		
			
				|  |  | +        rows[i]
 | 
	
		
			
				|  |  | +      }, chgkey);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 |