领域驱动设计 用DDD重构会计凭证生成(下)( 六 )

depositDeductions = bill.getDepositDeductionPOList();if (!CollectionUtils.isEmpty(depositDeductions)) {BigDecimal depositDeductionAmount = BigDecimal.ZERO;for (DepositDeductionPO po : depositDeductions) {depositDeductionAmount = depositDeductionAmount.add(po.getDeductionAmount());}if (depositDeductionAmount.compareTo(BigDecimal.ZERO) != 0) {amount = this.buildAdCreateAmountRequestVO(AmountTypeEnum.DEDUCTIBLE_AMOUNT, depositDeductionAmount);amounts.add(amount);}}adRequest.setAmounts(amounts);}@Overridepublic String getBillTypeKind() {return BillConstants.BILL_TYPE_KIND_EXPENSE_NEW;}/*** 费用行** @param bill* @param adRequest TODO 后期优化时 将查询列表中已返回的信息的二次查询去掉*/private void buildAdCreateRequestFeesForFee(BillPO bill, AdCreateRequestVO adRequest) {List expenseFees = bill.getExpenseFeesPOList();if (CollectionUtils.isEmpty(expenseFees)) {return;}//单据对应的采购信息列表List expensePurchasePOList = null;if (!BooleanConstants.YES.equals(adRequest.getMakePairFlag())) {//非衍生单时 , 查询本单据费用行对应的采购信息行ExpensePurchaseQueryVO expensePurchaseQueryVO = new ExpensePurchaseQueryVO();expensePurchaseQueryVO.setBillId(bill.getId());expensePurchasePOList = expensePurchaseService.getListByParam(expensePurchaseQueryVO);}// 构建生成凭证需要的费用行feesList fees = new ArrayList();AdCreateFeeRequestVO fee;FeeItemsPO feeItem;DeptPO dept;ExpensePurchasePO expensePurchasePO;for (ExpenseFeesPO expenseFee : expenseFees) {fee = new AdCreateFeeRequestVO();try {feeItem = super.getFeeItems(expenseFee.getFeeItemId());fee.setFeeItemsCode(feeItem.getFeeItemsCode());fee.setFeeItemsName(feeItem.getFeeItemsName());fee.setGeneralAssitId(feeItem.getGeneralAssitId());//20191202 带发票的使用 发票占用金额计算应付凭证fee.setAmount(expenseFee.getOccupyAmount() == null ? expenseFee.getInvoiceAmount() : expenseFee.getOccupyAmount());fee.setPaymentAmount(expenseFee.getPaymentAmount());if (expenseFee.getDeptId() != null) {dept = super.getDept(expenseFee.getDeptId());fee.setDeptCode(dept.getDeptCode());fee.setDeptId(expenseFee.getDeptId());fee.setDeptType(dept.getDeptType());}//code可以不设置fee.setCostcenterCode("");fee.setCostcenterId(expenseFee.getCostCenterId());//成本中心长名称 added by yingliu58 20190226fee.setCostcenterNameLong(expenseFee.getCostCenterNameLong());//成本中心短名称 added by yingliu58 20190325fee.setCostcenterName(expenseFee.getCostCenterName());//code可以不设置fee.setProjectCode("");fee.setProjectId(expenseFee.getProjectId());//收益期 , 自定义辅助核算代码if (expenseFee.getBenefitStartDate() != null) {fee.setBenefitStartDate(DateUtils.date2StrDate(expenseFee.getBenefitStartDate(), "yyyyMMdd"));}if (expenseFee.getBenefitEndDate() != null) {fee.setBenefitEndDate(DateUtils.date2StrDate(expenseFee.getBenefitEndDate(), "yyyyMMdd"));}if (BooleanConstants.YES.equals(adRequest.getMakePairFlag())) {//衍生单固定为rc001fee.setActTypeAssisCode(AdConstants.ASST_ACC_GENERAL_DEFAULT_CODE);//辅助代码名称 added by yingliu58 20190226fee.setAsstAccName(AdConstants.ASST_ACC_GENERAL_DEFAULT_NAME);} else {//自定义辅助核算代码fee.setAsstAccId(expenseFee.getAsstAccId());//辅助代码名称 added by yingliu58 20190226fee.setAsstAccName(expenseFee.getAsstAccName());}//标识此类行为应付单据所有fee.setVoucherType(AmountTypeEnum.BILL_AMOUNT.getVoucherType());//根据采购信息页的费用行是否固资 , 设定当前(按照行id比较)固资属性expensePurchasePO = expensePurchaseService.getExpensePurchasePO(expenseFee.getPurchaseInfoId(), expensePurchasePOList);fee.setAssetFlag(expensePurchaseService.getAssetFlag(expensePurchasePO));//20190527 add WorkplaceAddressfee.setWorkplaceAddress(expensePurchasePO == null ? null : expensePurchasePO.getWorkplaceAddress());//20190603 发票占比fee.setInvoiceRatio(expenseFee.getInvoiceRatio());fee.setId(expenseFee.getId());fees.add(fee);} catch (Exception e) {log.error("凭证生成 , 费用行参数构建异常 , {}", e);throw new BizException("凭证生成异常 , 请稍后再试");}}List currFees = adRequest.getFees();if (!CollectionUtils.isEmpty(currFees)) {fees.addAll(currFees);}adRequest.setFees(fees);}/*** 发票行* 20190604** @param bill* @param adRequest*/private void buildAdCreateRequestFeesForInvoice(BillPO bill, AdCreateRequestVO adRequest) {//预付 , 没有发票 , 发票不生成凭证if (BooleanConstants.YES.equals(bill.getPrepayFlag())) {return;}List