| | |
| | | private final ContractMapper contractMapper; |
| | | private final ContractPaymentScheduleProcessMapper scheduleProcessMapper; |
| | | private final ContractOutBoundMapper contractOutBoundMapper; |
| | | private final DeliveryOverdueMapper deliveryOverdueMapper; |
| | | |
| | | @Override |
| | | public R add(OutBoundAddDTO addDTO) { |
| | |
| | | .in(ContractSubjectMatter::getMaterialCode, addDTO.getSubjectMatterList().stream().map(item -> item.getSubjectMatterCode()).collect(Collectors.toList())) |
| | | .exists(Contract.class, contractQuery -> |
| | | contractQuery.select(ContractSubjectMatter::getId) |
| | | .eq(Contract::getContractStatus,2) |
| | | .eq(Contract::getId, ContractSubjectMatter::getContractId) |
| | | .eq(StrUtil.isNotBlank(addDTO.getBusGuestName()), Contract::getPartyA, addDTO.getBusGuestName()) |
| | | .eq(ObjUtil.isNotNull(addDTO.getBusGuestId()), Contract::getPartyAId, addDTO.getBusGuestId()) |
| | |
| | | return R.failed("没有查询到相关合同订单"); |
| | | } |
| | | List<String> erpCodeList = subjectMatterList.stream().map(ContractSubjectMatter::getMaterialCode).collect(Collectors.toList()); |
| | | BigDecimal orderNum = subjectMatterList.stream().filter(item ->item.getDeliveryStatus()!=2) |
| | | .map(item ->item.getDeliveryStatus()==0?item.getQuantity():item.getRemainingQuantity()) |
| | | BigDecimal orderNum = subjectMatterList.stream().filter(item -> item.getDeliveryStatus() != 2) |
| | | .map(item -> item.getDeliveryStatus() == 0 ? item.getQuantity() : item.getRemainingQuantity()) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | BigDecimal outTotal = addDTO.getSubjectMatterList().stream() |
| | | .filter(item->erpCodeList.contains(item.getSubjectMatterCode())) |
| | | .filter(item -> erpCodeList.contains(item.getSubjectMatterCode())) |
| | | .map(OutSubjectMatterAddDTO::getOutBoundNum) |
| | | .filter(num -> num != null) // 过滤掉 null 值,防止 NullPointerException |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | |
| | | if (subjectMatter.getDeliveredQuantity().compareTo(new BigDecimal("0")) > 0) { |
| | | remainNum = remainNum.subtract(subjectMatter.getRemainingQuantity()); |
| | | //部分交付状态下 全部出库 |
| | | if (remainNum.compareTo(new BigDecimal("0")) >= 0) { |
| | | if (remainNum.compareTo(new BigDecimal("0")) > 0) { |
| | | BigDecimal currentOut = subjectMatter.getRemainingQuantity(); |
| | | subjectMatter.setDeliveredQuantity(subjectMatter.getQuantity()); |
| | | subjectMatter.setRemainingQuantity(new BigDecimal("0")); |
| | |
| | | contractSubjectMatterMapper.updateById(subjectMatter); |
| | | currentOutMap.put(subjectMatter.getContractId(), subjectMatter); |
| | | //新增合同出库历史 |
| | | saveContractOutBound(contract, addDTO, subjectMatter,outBound.getId()); |
| | | saveContractOutBound(contract, addDTO, subjectMatter, outBound.getId()); |
| | | } else { |
| | | BigDecimal currentOut = remainNum.add(subjectMatter.getRemainingQuantity()); |
| | | subjectMatter.setDeliveredQuantity(subjectMatter.getQuantity().add(remainNum)); |
| | |
| | | contractSubjectMatterMapper.updateById(subjectMatter); |
| | | currentOutMap.put(subjectMatter.getContractId(), subjectMatter); |
| | | //新增合同出库历史 |
| | | saveContractOutBound(contract, addDTO, subjectMatter,outBound.getId()); |
| | | saveContractOutBound(contract, addDTO, subjectMatter, outBound.getId()); |
| | | break; |
| | | } |
| | | |
| | | } else { |
| | | //未交付状态下 |
| | | remainNum = remainNum.subtract(subjectMatter.getQuantity()); |
| | | if (remainNum.compareTo(new BigDecimal("0")) >= 0) { |
| | | if (remainNum.compareTo(new BigDecimal("0")) > 0) { |
| | | subjectMatter.setDeliveredQuantity(subjectMatter.getQuantity()); |
| | | subjectMatter.setRemainingQuantity(new BigDecimal("0")); |
| | | subjectMatter.setActualDeliveryDate(DateUtil.today()); |
| | |
| | | contractSubjectMatterMapper.updateById(subjectMatter); |
| | | currentOutMap.put(subjectMatter.getContractId(), subjectMatter); |
| | | //新增合同出库历史 |
| | | saveContractOutBound(contract, addDTO, subjectMatter,outBound.getId()); |
| | | saveContractOutBound(contract, addDTO, subjectMatter, outBound.getId()); |
| | | } else { |
| | | BigDecimal currentOut = remainNum.add(subjectMatter.getQuantity()); |
| | | subjectMatter.setDeliveredQuantity(subjectMatter.getQuantity().add(remainNum)); |
| | |
| | | contractSubjectMatterMapper.updateById(subjectMatter); |
| | | currentOutMap.put(subjectMatter.getContractId(), subjectMatter); |
| | | //新增合同出库历史 |
| | | saveContractOutBound(contract, addDTO, subjectMatter,outBound.getId()); |
| | | saveContractOutBound(contract, addDTO, subjectMatter, outBound.getId()); |
| | | break; |
| | | } |
| | | } |
| | |
| | | |
| | | //查询之前所有发货前应收 |
| | | List<PaymentConfirm> fhConfirmList = paymentConfirmMapper.selectList(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId, contract.getId()) |
| | | .eq(PaymentConfirm::getScheduleId,schedule.getId()).orderByDesc(PaymentConfirm::getCreateTime)); |
| | | BigDecimal fhTotalAmount = fhConfirmList.stream().map(item->item.getTransationAmount()).reduce(BigDecimal.ZERO,BigDecimal::add); |
| | | .eq(PaymentConfirm::getScheduleId, schedule.getId()).orderByDesc(PaymentConfirm::getCreateTime)); |
| | | BigDecimal fhTotalAmount = fhConfirmList.stream().map(item -> item.getTransationAmount()).reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | //本次发货前应收 出库总额 - 所有发货前应收 |
| | | paymentConfirm.setTransationAmount(paymentConfirm.getTransationAmount().subtract(fhTotalAmount)); |
| | | paymentConfirm.setReceivableAmount(paymentConfirm.getTransationAmount()); |
| | | paymentConfirm.setTotalAmount(lastConfirm.getTotalAmount().subtract(paymentConfirm.getTransationAmount())); |
| | | if(schedule.getPaymentRatio().compareTo(new BigDecimal("0"))>0) { |
| | | if (schedule.getPaymentRatio().compareTo(new BigDecimal("0")) > 0) { |
| | | paymentConfirmMapper.insert(paymentConfirm); |
| | | } |
| | | } else { |
| | | //不存在发货应收 出库总额 |
| | | paymentConfirm.setTotalAmount(lastConfirm.getTotalAmount().subtract(paymentConfirm.getTransationAmount())); |
| | | if(schedule.getPaymentRatio().compareTo(new BigDecimal("0"))>0) { |
| | | if (schedule.getPaymentRatio().compareTo(new BigDecimal("0")) > 0) { |
| | | paymentConfirmMapper.insert(paymentConfirm); |
| | | } |
| | | } |
| | | } else { |
| | | //无之前阶段应收 |
| | | paymentConfirm.setTotalAmount(paymentConfirm.getTransationAmount().multiply(new BigDecimal("-1"))); |
| | | if(schedule.getPaymentRatio().compareTo(new BigDecimal("0"))>0) { |
| | | if (schedule.getPaymentRatio().compareTo(new BigDecimal("0")) > 0) { |
| | | paymentConfirmMapper.insert(paymentConfirm); |
| | | //客户付款完成合同 |
| | | List<Contract> customerCompleteContractList = contractMapper.selectList(Wrappers.<Contract>lambdaQuery().eq(Contract::getPartyAId, contract.getPartyAId()) |
| | | .eq(Contract::getPartyBId, SecurityUtils.getUser().getCompId()).apply(" amount = paid_amount")); |
| | | if (ArrayUtil.isNotEmpty(customerCompleteContractList)){ |
| | | if (ArrayUtil.isNotEmpty(customerCompleteContractList)) { |
| | | List<BigDecimal> outAmountList = new ArrayList<>(); |
| | | for (Contract completeContract:customerCompleteContractList |
| | | for (Contract completeContract : customerCompleteContractList |
| | | ) { |
| | | PaymentConfirm contractLastConfirm = paymentConfirmMapper.selectOne(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId,completeContract.getId()) |
| | | PaymentConfirm contractLastConfirm = paymentConfirmMapper.selectOne(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId, completeContract.getId()) |
| | | .orderByDesc(PaymentConfirm::getCreateTime).last("limit 1")); |
| | | //查询客户付款完成合同中最后明细金额 有预收转入当前合同 |
| | | if (contractLastConfirm.getTotalAmount().compareTo(new BigDecimal("0"))>0){ |
| | | if (contractLastConfirm.getTotalAmount().compareTo(new BigDecimal("0")) > 0) { |
| | | //新增完成付款合同 资金转出 |
| | | PaymentConfirm outConfirm = BeanUtil.copyProperties(contractLastConfirm,PaymentConfirm.class,"id","transationAmount", |
| | | "advanceAmount","receivableAmount","overdueAmount","totalAmount"); |
| | | PaymentConfirm outConfirm = BeanUtil.copyProperties(contractLastConfirm, PaymentConfirm.class, "id", "transationAmount", |
| | | "advanceAmount", "receivableAmount", "overdueAmount", "totalAmount"); |
| | | outConfirm.setBusinessType("资金转出"); |
| | | outConfirm.setConfirmTime(new Date()); |
| | | outConfirm.setTransationAmount(contractLastConfirm.getTotalAmount()); |
| | |
| | | outAmountList.add(outConfirm.getTransationAmount()); |
| | | } |
| | | } |
| | | if (ArrayUtil.isNotEmpty(outAmountList.toArray())){ |
| | | BigDecimal currentSum = new BigDecimal("0"); |
| | | for (BigDecimal currentAmount:outAmountList |
| | | ) { |
| | | currentSum=currentSum.add(currentAmount); |
| | | //新增当前合同 资金转入 |
| | | PaymentConfirm inConfirm = BeanUtil.copyProperties(paymentConfirm,PaymentConfirm.class,"id","transationAmount", |
| | | "advanceAmount","receivableAmount","overdueAmount","totalAmount"); |
| | | inConfirm.setBusinessType("资金转入"); |
| | | inConfirm.setConfirmTime(new Date()); |
| | | inConfirm.setTransationAmount(currentSum.subtract(currentAmount)); |
| | | inConfirm.setTotalAmount(paymentConfirm.getTotalAmount().add(currentSum)); |
| | | if (inConfirm.getTotalAmount().compareTo(new BigDecimal("0"))>0){ |
| | | inConfirm.setAdvanceAmount(inConfirm.getTotalAmount()); |
| | | }else if (inConfirm.getTotalAmount().compareTo(new BigDecimal("0"))<0){ |
| | | inConfirm.setReceivableAmount(inConfirm.getTotalAmount().multiply(new BigDecimal("-1"))); |
| | | } |
| | | paymentConfirmMapper.insert(inConfirm); |
| | | if (ArrayUtil.isNotEmpty(outAmountList.toArray())) { |
| | | BigDecimal currentInSum = outAmountList.stream().reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | //新增当前合同 资金转入 |
| | | PaymentConfirm inConfirm = BeanUtil.copyProperties(paymentConfirm, PaymentConfirm.class, "id", "transationAmount", |
| | | "advanceAmount", "receivableAmount", "overdueAmount", "totalAmount"); |
| | | inConfirm.setBusinessType("资金转入"); |
| | | inConfirm.setConfirmTime(new Date()); |
| | | inConfirm.setTransationAmount(currentInSum); |
| | | inConfirm.setTotalAmount(paymentConfirm.getTotalAmount().add(currentInSum)); |
| | | //更新当前阶段实际收款 和 收款状态 |
| | | schedule.setActualAmount(inConfirm.getTransationAmount()); |
| | | schedule.setPaymentStatus(2); |
| | | if (inConfirm.getTotalAmount().compareTo(new BigDecimal("0")) > 0){ |
| | | inConfirm.setAdvanceAmount(inConfirm.getTotalAmount()); |
| | | }else if (inConfirm.getTotalAmount().compareTo(new BigDecimal("0")) < 0) { |
| | | inConfirm.setReceivableAmount(inConfirm.getTotalAmount().multiply(new BigDecimal("-1"))); |
| | | schedule.setActualAmount(paymentConfirm.getTotalAmount().subtract(currentInSum)); |
| | | schedule.setPaymentStatus(1); |
| | | } |
| | | paymentConfirmMapper.insert(inConfirm); |
| | | //更新当前阶段实际收款 和 收款状态 |
| | | scheduleMapper.updateById(schedule); |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | //更新发货前收款生效时间 |
| | | if (ObjUtil.isNull(schedule.getEffectiveDate())) { |
| | | schedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getOutBoundTime(), schedule.getAgreedDays())); |
| | | schedule.setEffectiveEndDate(DateUtil.offsetDay(addDTO.getOutBoundTime(), schedule.getAgreedDays())); |
| | | //查询是否有后续阶段 |
| | | List<ContractPaymentSchedule> afterSchedule = scheduleMapper.selectList(Wrappers.<ContractPaymentSchedule>lambdaQuery().eq(ContractPaymentSchedule::getContractId, contractId) |
| | | .gt(ContractPaymentSchedule::getStageOrder, schedule.getStageOrder())); |
| | | if (ArrayUtil.isEmpty(afterSchedule.toArray())) { |
| | | schedule.setEffectiveEndDate(contract.getExpirationDate()); |
| | | } |
| | | // List<ContractPaymentSchedule> afterSchedule = scheduleMapper.selectList(Wrappers.<ContractPaymentSchedule>lambdaQuery().eq(ContractPaymentSchedule::getContractId, contractId) |
| | | // .gt(ContractPaymentSchedule::getStageOrder, schedule.getStageOrder())); |
| | | // if (ArrayUtil.isEmpty(afterSchedule.toArray())) { |
| | | // schedule.setEffectiveEndDate(contract.getExpirationDate()); |
| | | // } |
| | | scheduleMapper.updateById(schedule); |
| | | //查询是否有之前阶段 |
| | | ContractPaymentSchedule beforeSchedule = scheduleMapper.selectOne(Wrappers.<ContractPaymentSchedule>lambdaQuery().eq(ContractPaymentSchedule::getContractId, schedule.getContractId()) |
| | | .lt(ContractPaymentSchedule::getStageOrder, schedule.getStageOrder()).orderByDesc(ContractPaymentSchedule::getCreateTime).last("limit 1")); |
| | | if (ObjUtil.isNotNull(beforeSchedule)) { |
| | | beforeSchedule.setEffectiveEndDate(schedule.getEffectiveDate()); |
| | | scheduleMapper.updateById(beforeSchedule); |
| | | } |
| | | // ContractPaymentSchedule beforeSchedule = scheduleMapper.selectOne(Wrappers.<ContractPaymentSchedule>lambdaQuery().eq(ContractPaymentSchedule::getContractId, schedule.getContractId()) |
| | | // .lt(ContractPaymentSchedule::getStageOrder, schedule.getStageOrder()).orderByDesc(ContractPaymentSchedule::getCreateTime).last("limit 1")); |
| | | // if (ObjUtil.isNotNull(beforeSchedule)) { |
| | | // beforeSchedule.setEffectiveEndDate(schedule.getEffectiveDate()); |
| | | // scheduleMapper.updateById(beforeSchedule); |
| | | // } |
| | | //更新履约 |
| | | ContractPaymentScheduleProcess contractPaymentScheduleProcess = new ContractPaymentScheduleProcess(); |
| | | contractPaymentScheduleProcess.setContractId(schedule.getContractId()); |
| | |
| | | contractPaymentScheduleProcess.setScheduleId(schedule.getId()); |
| | | contractPaymentScheduleProcess.setScheduleName(schedule.getStageName()); |
| | | contractPaymentScheduleProcess.setProcessDate(addDTO.getOutBoundTime()); |
| | | scheduleProcessMapper.insert(contractPaymentScheduleProcess); |
| | | ContractPaymentScheduleProcess lastProcess = scheduleProcessMapper.selectOne(Wrappers.<ContractPaymentScheduleProcess>lambdaQuery().eq(ContractPaymentScheduleProcess::getContractId, schedule.getContractId()) |
| | | .eq(ContractPaymentScheduleProcess::getScheduleId, schedule.getId()).last("limit 1")); |
| | | if (ObjUtil.isNull(lastProcess)) { |
| | | scheduleProcessMapper.insert(contractPaymentScheduleProcess); |
| | | } |
| | | } |
| | | |
| | | //查询是否有后续阶段 |
| | |
| | | //最后阶段生效时间 |
| | | ContractPaymentSchedule endSchedule = afterSchedule.get(0); |
| | | if (StrUtil.equals(endSchedule.getStageName(), "质保金")) { |
| | | endSchedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getOutBoundTime(), endSchedule.getAgreedDays())); |
| | | endSchedule.setEffectiveEndDate(contract.getExpirationDate()); |
| | | scheduleMapper.updateById(endSchedule); |
| | | // endSchedule.setEffectiveEndDate(DateUtil.offsetDay(addDTO.getOutBoundTime(), endSchedule.getAgreedDays())); |
| | | // scheduleMapper.updateById(endSchedule); |
| | | //当前阶段生效时间 |
| | | schedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getOutBoundTime(), schedule.getAgreedDays())); |
| | | schedule.setEffectiveEndDate(endSchedule.getEffectiveDate()); |
| | | scheduleMapper.updateById(schedule); |
| | | // schedule.setEffectiveEndDate(DateUtil.offsetDay(addDTO.getOutBoundTime(), schedule.getAgreedDays())); |
| | | // scheduleMapper.updateById(schedule); |
| | | //最后阶段应收 |
| | | PaymentConfirm newConfim = new PaymentConfirm(); |
| | | newConfim.setBusinessType(endSchedule.getStageName() + "应收"); |
| | |
| | | lastNewTotal = lastNewConfirm.getTotalAmount(); |
| | | } |
| | | newConfim.setTotalAmount(lastNewTotal.subtract(newConfim.getReceivableAmount())); |
| | | if(endSchedule.getPaymentRatio().compareTo(new BigDecimal("0"))>0) { |
| | | if (endSchedule.getPaymentRatio().compareTo(new BigDecimal("0")) > 0) { |
| | | paymentConfirmMapper.insert(newConfim); |
| | | } |
| | | } |
| | |
| | | contractMapper.updateById(contract); |
| | | } |
| | | if (ArrayUtil.isEmpty(afterSchedule.toArray())) { |
| | | schedule.setEffectiveEndDate(contract.getExpirationDate()); |
| | | scheduleMapper.updateById(schedule); |
| | | // schedule.setEffectiveEndDate(contract.getExpirationDate()); |
| | | // scheduleMapper.updateById(schedule); |
| | | //更新合同下个阶段 |
| | | contract.setNextScheduleName("无"); |
| | | contractMapper.updateById(contract); |
| | | //当前为合同最后阶段 |
| | | PaymentConfirm lastNewConfirm = paymentConfirmMapper.selectOne(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId,contract.getId()) |
| | | PaymentConfirm lastNewConfirm = paymentConfirmMapper.selectOne(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId, contract.getId()) |
| | | .orderByDesc(PaymentConfirm::getCreateTime).last("limit 1")); |
| | | if (lastNewConfirm.getTotalAmount().compareTo(new BigDecimal("0"))>=0){ |
| | | if (lastNewConfirm.getTotalAmount().compareTo(new BigDecimal("0")) >= 0) { |
| | | //有预付且超过应收 关闭合同状态 |
| | | contract.setContractStatus(3); |
| | | contractMapper.updateById(contract); |
| | |
| | | return R.ok(); |
| | | } |
| | | |
| | | private void saveContractOutBound(Contract contract, OutBoundAddDTO addDTO, ContractSubjectMatter subjectMatter,Long outBoundId) { |
| | | private void saveContractOutBound(Contract contract, OutBoundAddDTO addDTO, ContractSubjectMatter subjectMatter, Long outBoundId) { |
| | | ContractOutBound contractOutBound = new ContractOutBound(); |
| | | contractOutBound.setContractId(contract.getId()); |
| | | contractOutBound.setContractName(contract.getContractName()); |
| | |
| | | contractOutBound.setOutBoundAttNames(addDTO.getOutBoundAttNames()); |
| | | contractOutBound.setOutBoundAttPaths(addDTO.getOutBoundAttPaths()); |
| | | contractOutBound.setOutBoundId(outBoundId); |
| | | contractOutBound.setInvoiceStatus("0"); |
| | | contractOutBound.setInvoiceNum(new BigDecimal("0")); |
| | | contractOutBoundMapper.insert(contractOutBound); |
| | | if (StrUtil.isEmpty(contract.getContractCategory())){ |
| | | if (DateUtil.compare(addDTO.getOutBoundTime(),contract.getExpirationDate())>0){ |
| | | saveOverdueOutBound(contract, addDTO, subjectMatter); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void saveOverdueOutBound(Contract contract, OutBoundAddDTO addDTO, ContractSubjectMatter subjectMatter) { |
| | | DeliveryOverdue overdue = new DeliveryOverdue(); |
| | | overdue.setContractId(contract.getId()); |
| | | overdue.setContractName(contract.getContractName()); |
| | | overdue.setBusGuestId(contract.getPartyAId()); |
| | | overdue.setBusGuestName(contract.getPartyA()); |
| | | overdue.setMaterialName(subjectMatter.getMaterialName()); |
| | | overdue.setMaterialInternalName(subjectMatter.getMaterialInternalName()); |
| | | overdue.setMaterialCode(subjectMatter.getMaterialCode()); |
| | | overdue.setOverdueNum(subjectMatter.getLastDeliveredQuantity()); |
| | | overdue.setTotalAmount(subjectMatter.getUnitPrice().multiply(subjectMatter.getLastDeliveredQuantity())); |
| | | overdue.setOverdueDuration(new BigDecimal(DateUtil.betweenDay(addDTO.getOutBoundTime(),contract.getExpirationDate(),true))); |
| | | deliveryOverdueMapper.insert(overdue); |
| | | } |
| | | } |