diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsPayableWriteOffController.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsPayableWriteOffController.java index 47db7013..b399127a 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsPayableWriteOffController.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsPayableWriteOffController.java @@ -73,7 +73,7 @@ public class OmsPayableWriteOffController extends BaseController @PostMapping public AjaxResult add(@RequestBody WriteOffRequestDto writeOffRequestDto) { - Long writeOffId = omsPayableWriteOffService.insertOmsPayableWriteOff(writeOffRequestDto); + Long writeOffId = omsPayableWriteOffService.userWriteOff(writeOffRequestDto); return AjaxResult.success(); } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayablePaymentDetail.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayablePaymentDetail.java index 668ee6d6..5e41173d 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayablePaymentDetail.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayablePaymentDetail.java @@ -17,6 +17,7 @@ public class OmsPayablePaymentDetail extends BaseEntity { private Long payableBillId; private List payableBillIdList; private String payableDetailType; + private List writeOffIdList; private Date paymentTime; private BigDecimal paymentAmount; @@ -40,6 +41,7 @@ public class OmsPayablePaymentDetail extends BaseEntity { PREPAY_WRITE_OFF("2", "预付核销"), REFUND("3", "退款"), REFUND_WRITE_OFF("4", "反核销"), + WRITE_OFF("5", "核销"), ; diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableWriteOff.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableWriteOff.java index 4e2369c3..481a5185 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableWriteOff.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableWriteOff.java @@ -7,6 +7,7 @@ import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.sip.domain.dto.PaymentBillPayableDetailDTO; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -79,6 +80,8 @@ public class OmsPayableWriteOff extends BaseEntity /** 更新时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; + private List detailList; + private OmsPaymentBill paymentBill; @Getter public enum WriteOffTypeEnum { diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPaymentBill.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPaymentBill.java index 5856446d..7caa9049 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPaymentBill.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPaymentBill.java @@ -2,6 +2,8 @@ package com.ruoyi.sip.domain; import java.math.BigDecimal; import java.util.Date; +import java.util.List; + import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.Getter; @@ -27,6 +29,7 @@ public class OmsPaymentBill extends BaseEntity /** 付款单编号 */ @Excel(name = "付款单编号") private String paymentBillCode; + private List paymentBillCodeList; /** 付款单类型 (FROM_PAYABLE, PRE_PAYMENT) */ @Excel(name = "付款单类型 (FROM_PAYABLE, PRE_PAYMENT)") diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/PaymentBillPayableDetailDTO.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/PaymentBillPayableDetailDTO.java index ecab0f31..ad93c84f 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/PaymentBillPayableDetailDTO.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/PaymentBillPayableDetailDTO.java @@ -3,6 +3,7 @@ package com.ruoyi.sip.domain.dto; import lombok.Data; import java.math.BigDecimal; +import java.util.Date; /** * 付款单关联的应付单明细DTO @@ -31,4 +32,6 @@ public class PaymentBillPayableDetailDTO { /** 本次付款比例 */ private BigDecimal paymentRate; + private String vendorName; + private Date createTime; } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsFinAttachmentMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsFinAttachmentMapper.java index c1fd0477..83299e28 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsFinAttachmentMapper.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsFinAttachmentMapper.java @@ -2,6 +2,7 @@ package com.ruoyi.sip.mapper; import java.util.List; import com.ruoyi.sip.domain.OmsFinAttachment; +import org.apache.ibatis.annotations.Param; /** * 财务模块附件Mapper接口 @@ -58,4 +59,7 @@ public interface OmsFinAttachmentMapper * @return 结果 */ public int deleteOmsFinAttachmentByIds(Long[] ids); + + void deleteOmsFinAttachmentByPayment(@Param("list") List paymentBillCodeList,@Param("type") String type); + } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayablePaymentDetailMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayablePaymentDetailMapper.java index 2b609112..c21a6fb8 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayablePaymentDetailMapper.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayablePaymentDetailMapper.java @@ -16,4 +16,8 @@ public interface OmsPayablePaymentDetailMapper { List listPayableByPaymentCode(List paymentBillCodeList); List selectByPaymentPlanIds(@Param("paymentPlanIds") List paymentPlanIds); + + int deleteByWriteOffIds(@Param("ids") Long[] ids); + + List listPayableByWriteOffId(List writeOffIds); } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayableWriteOffMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayableWriteOffMapper.java index bf944ac3..886098d3 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayableWriteOffMapper.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayableWriteOffMapper.java @@ -58,4 +58,9 @@ public interface OmsPayableWriteOffMapper * @return 结果 */ public int deleteOmsPayableWriteOffByIds(Long[] ids); + + int selectMaxCodeByPrefix(String codePrefix); + + List listByIds(Long[] ids); + } \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPaymentBillMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPaymentBillMapper.java index 400bfe69..b59036cb 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPaymentBillMapper.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPaymentBillMapper.java @@ -95,4 +95,7 @@ public interface OmsPaymentBillMapper List listApprove(@Param("entity") OmsPaymentBill omsPaymentBill, @Param("tableName")String buTodo); void revoke(OmsPaymentBill paymentBill); + + void updateReturnWriteOffBatch(List updateBills); + } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsFinAttachmentService.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsFinAttachmentService.java index 37831d37..fa2b8415 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsFinAttachmentService.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsFinAttachmentService.java @@ -72,4 +72,6 @@ public interface IOmsFinAttachmentService public OmsFinAttachment uploadAttachment(MultipartFile file, Long invoiceReceiptBillId, OmsFinAttachment.RelatedBillTypeEnum type) throws Exception; List list(List ids, String type); + + void deleteOmsFinAttachmentByPayment(List relatedIdList,String type); } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPayablePaymentDetailService.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPayablePaymentDetailService.java index ebb0529e..1474e001 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPayablePaymentDetailService.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPayablePaymentDetailService.java @@ -14,12 +14,17 @@ public interface IOmsPayablePaymentDetailService { void applyRefund(String payableBillCode, String payableBillCode1); List listPayableByPaymentCode(String paymentBillCode); + List listPayableByWriteOffId(List writeOffIds); List selectByPaymentPlanIds(List paymentPlanIds); List listBypaymentCode(String paymentBillCode); + List listByWriteOffIds(Long[] ids); + void insertBatch(List detailList); + int deleteByWriteOffIds(Long[] ids); + // List listWriteOffByPaymentCode(List ); } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPayableWriteOffService.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPayableWriteOffService.java index ecb8b834..549fa832 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPayableWriteOffService.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPayableWriteOffService.java @@ -36,7 +36,7 @@ public interface IOmsPayableWriteOffService * @param writeOffRequestDto 核销请求数据 * @return 结果 */ - public Long insertOmsPayableWriteOff(WriteOffRequestDto writeOffRequestDto); + public Long userWriteOff(WriteOffRequestDto writeOffRequestDto); /** * 修改采购应付核销单 @@ -71,4 +71,6 @@ public interface IOmsPayableWriteOffService public List selectWriteOffDetailsByWriteOffId(Long writeOffId); List listByPaymentBillCodeList(List collect); + + void autoWriteOff(WriteOffRequestDto writeOffRequestDto); } \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPaymentBillService.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPaymentBillService.java index 266f9ebf..eb9262f1 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPaymentBillService.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPaymentBillService.java @@ -4,6 +4,7 @@ import java.util.List; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.sip.domain.OmsFinAttachment; +import com.ruoyi.sip.domain.OmsPayablePaymentDetail; import com.ruoyi.sip.domain.OmsPaymentBill; import com.ruoyi.sip.domain.dto.PaymentBillDetailDTO; import org.springframework.web.multipart.MultipartFile; @@ -105,4 +106,8 @@ public interface IOmsPaymentBillService AjaxResult applyRefundApprove(OmsPaymentBill paymentBill); List listWriteOff(OmsPaymentBill omsPaymentBill); + + void returnWriteOff(List collect,List omsPayablePaymentDetails); + + OmsPaymentBill selectOmsPaymentBillByCode(String paymentBillCode); } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsFinAttachmentServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsFinAttachmentServiceImpl.java index a1be2433..202c6075 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsFinAttachmentServiceImpl.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsFinAttachmentServiceImpl.java @@ -53,6 +53,11 @@ public class OmsFinAttachmentServiceImpl implements IOmsFinAttachmentService return omsFinAttachmentMapper.selectOmsFinAttachmentList(omsFinAttachment); } + @Override + public void deleteOmsFinAttachmentByPayment(List relatedIdList,String type) { + omsFinAttachmentMapper.deleteOmsFinAttachmentByPayment(relatedIdList,type); + } + /** * 查询财务模块附件 * diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableBillServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableBillServiceImpl.java index c6feb06a..c0077345 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableBillServiceImpl.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableBillServiceImpl.java @@ -276,6 +276,8 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService { detail.setPaymentPlanId(paymentPlanDto.getId()); detail.setPaymentBillCode(paymentBill.getPaymentBillCode()); detail.setPaymentAmount(paymentPlanDto.getPlanAmount()); + detail.setPaymentAmountWithoutTax(paymentPlanDto.getPlanAmount().divide(BigDecimal.ONE.add(paymentPlanDto.getPlanRate()), 2, java.math.RoundingMode.HALF_UP)); + detail.setPaymentAmountTax(detail.getPaymentAmount().subtract(detail.getPaymentAmountWithoutTax())); detail.setPaymentRate(paymentPlanDto.getPlanRate()); detail.setPaymentTime(paymentPlanDto.getPlanPaymentDate()); detail.setRemark(paymentPlanDto.getRemark()); diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayablePaymentDetailServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayablePaymentDetailServiceImpl.java index edf935a6..c5f5b108 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayablePaymentDetailServiceImpl.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayablePaymentDetailServiceImpl.java @@ -101,6 +101,20 @@ public class OmsPayablePaymentDetailServiceImpl implements IOmsPayablePaymentDet } + @Override + public List listPayableByWriteOffId(List writeOffIds) { + if (writeOffIds == null || writeOffIds.size() == 0){ + return Collections.emptyList(); + } + List paymentBillPayableDetailDTOS = omsPayablePaymentDetailMapper.listPayableByWriteOffId(writeOffIds); + for (PaymentBillPayableDetailDTO paymentBillPayableDetailDTO : paymentBillPayableDetailDTOS) { + paymentBillPayableDetailDTO.setPaymentRate(paymentBillPayableDetailDTO.getPaymentAmount() + .divide(paymentBillPayableDetailDTO.getTotalPriceWithTax(),4,java.math.RoundingMode.HALF_UP) + .multiply(new BigDecimal("100"))); + } + return paymentBillPayableDetailDTOS; + } + @Override public List selectByPaymentPlanIds(List paymentPlanIds) { return omsPayablePaymentDetailMapper.selectByPaymentPlanIds(paymentPlanIds); @@ -117,4 +131,22 @@ public class OmsPayablePaymentDetailServiceImpl implements IOmsPayablePaymentDet public void insertBatch(List detailList) { omsPayablePaymentDetailMapper.insertBatch(detailList); } + + @Override + public List listByWriteOffIds(Long[] ids) { + if (ids == null || ids.length == 0) { + return new ArrayList<>(); + } + OmsPayablePaymentDetail omsPayablePaymentDetail = new OmsPayablePaymentDetail(); + omsPayablePaymentDetail.setWriteOffIdList(java.util.Arrays.asList(ids)); + return omsPayablePaymentDetailMapper.list(omsPayablePaymentDetail); + } + + @Override + public int deleteByWriteOffIds(Long[] ids) { + if (ids == null || ids.length == 0) { + return 0; + } + return omsPayablePaymentDetailMapper.deleteByWriteOffIds(ids); + } } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableWriteOffServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableWriteOffServiceImpl.java index 32df57de..01b1a532 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableWriteOffServiceImpl.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableWriteOffServiceImpl.java @@ -1,6 +1,8 @@ package com.ruoyi.sip.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.ShiroUtils; @@ -8,6 +10,7 @@ import com.ruoyi.sip.domain.OmsPayablePaymentDetail; import com.ruoyi.sip.domain.OmsPayableWriteOff; import com.ruoyi.sip.domain.OmsPayableWriteOffDetail; import com.ruoyi.sip.domain.OmsPaymentBill; +import com.ruoyi.sip.domain.dto.PaymentBillPayableDetailDTO; import com.ruoyi.sip.dto.WriteOffDetailResultDto; import com.ruoyi.sip.dto.WriteOffRequestDto; import com.ruoyi.sip.mapper.OmsPayableWriteOffMapper; @@ -15,14 +18,13 @@ import com.ruoyi.sip.mapper.OmsPaymentBillMapper; import com.ruoyi.sip.service.IOmsPayableBillService; import com.ruoyi.sip.service.IOmsPayablePaymentDetailService; import com.ruoyi.sip.service.IOmsPayableWriteOffService; -import com.ruoyi.sip.utils.WriteOffCodeGenerator; +import com.ruoyi.sip.service.IOmsPaymentBillService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.util.Date; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; /** @@ -40,7 +42,7 @@ public class OmsPayableWriteOffServiceImpl implements IOmsPayableWriteOffService @Autowired - private OmsPaymentBillMapper omsPaymentBillMapper; + private IOmsPaymentBillService omsPaymentBillService; @Autowired private IOmsPayablePaymentDetailService omsPayablePaymentDetailService; @Autowired @@ -56,7 +58,12 @@ public class OmsPayableWriteOffServiceImpl implements IOmsPayableWriteOffService @Override public OmsPayableWriteOff selectOmsPayableWriteOffById(Long id) { - return omsPayableWriteOffMapper.selectOmsPayableWriteOffById(id); + OmsPayableWriteOff omsPayableWriteOff = omsPayableWriteOffMapper.selectOmsPayableWriteOffById(id); + OmsPaymentBill omsPaymentBill = omsPaymentBillService.selectOmsPaymentBillByCode(omsPayableWriteOff.getPaymentBillCode()); + omsPayableWriteOff.setPaymentBill(omsPaymentBill); + List detailDTOList = omsPayablePaymentDetailService.listPayableByWriteOffId(Collections.singletonList(id)); + omsPayableWriteOff.setDetailList(detailDTOList); + return omsPayableWriteOff; } /** @@ -79,20 +86,20 @@ public class OmsPayableWriteOffServiceImpl implements IOmsPayableWriteOffService */ @Override @Transactional - public Long insertOmsPayableWriteOff(WriteOffRequestDto writeOffRequestDto) + public Long userWriteOff(WriteOffRequestDto writeOffRequestDto) { if (CollUtil.isEmpty(writeOffRequestDto.getDetailList())){ throw new ServiceException("请选择核销明细"); } // 获取付款单信息 - OmsPaymentBill paymentBill = omsPaymentBillMapper.selectOmsPaymentBillById(writeOffRequestDto.getPaymentBillId()); + OmsPaymentBill paymentBill = omsPaymentBillService.selectOmsPaymentBillById(writeOffRequestDto.getPaymentBillId()); if (paymentBill == null) { throw new ServiceException("付款单不存在"); } // 创建核销主记录 OmsPayableWriteOff writeOff = new OmsPayableWriteOff(); - writeOff.setWriteOffCode(WriteOffCodeGenerator.generateWriteOffCode()); + writeOff.setWriteOffCode(generateWriteOffCode()); // 默认为用户手动核销 writeOff.setWriteOffType(OmsPayableWriteOff.WriteOffTypeEnum.USER.getCode()); writeOff.setPaymentBillCode(paymentBill.getPaymentBillCode()); @@ -123,7 +130,7 @@ public class OmsPayableWriteOffServiceImpl implements IOmsPayableWriteOffService } updateBill.setPreResidueAmount(decimal); updateBill.setId(paymentBill.getId()); - omsPaymentBillMapper.updateOmsPaymentBill(updateBill); + omsPaymentBillService.updateOmsPaymentBill(updateBill); // 设置创建时间 writeOff.setCreateTime(new Date()); writeOff.setCreateBy(ShiroUtils.getUserId().toString()); @@ -138,10 +145,22 @@ public class OmsPayableWriteOffServiceImpl implements IOmsPayableWriteOffService omsPayablePaymentDetail.setWriteOffId(writeOff.getId()); } omsPayablePaymentDetailService.insertBatch( writeOffRequestDto.getDetailList()); - payableBillService.updatePaymentAmount(writeOffRequestDto.getDetailList().stream().map(OmsPayablePaymentDetail::getPayableBillId).collect(Collectors.toList())); + payableBillService.updatePaymentAmount(writeOffRequestDto.getDetailList().stream().map(OmsPayablePaymentDetail::getPayableBillId).distinct().collect(Collectors.toList())); return writeOff.getId(); } + private String generateWriteOffCode() { + String prefix = "HX"; + // 查询当天已有的最大序列号 + String codePrefix = prefix + DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_PATTERN); + int maxSequence = omsPayableWriteOffMapper.selectMaxCodeByPrefix(codePrefix); + // 生成新的序列号 + int newSequence = maxSequence + 1; + // 序列号补零到4位 + String sequenceStr = String.format("%04d", newSequence); + return codePrefix + sequenceStr; + } + /** * 修改采购应付核销单 * @@ -164,12 +183,38 @@ public class OmsPayableWriteOffServiceImpl implements IOmsPayableWriteOffService @Transactional public int deleteOmsPayableWriteOffByIds(Long[] ids) { - //反核销逻辑 todo + // 反核销逻辑 + List omsPayableWriteOffs = omsPayableWriteOffMapper.listByIds(ids); + if (CollUtil.isEmpty(omsPayableWriteOffs)) { + return 0; + } + // 通过writeOffId获取对应的支付详情记录 + List omsPayablePaymentDetails = + omsPayablePaymentDetailService.listByWriteOffIds(ids); - // 先删除明细记录 -// omsPayablePaymentDetailService.deleteOmsPayableWriteOffDetailByWriteOffIds(ids); - // 再删除主记录 + // 处理付款单 + omsPaymentBillService.returnWriteOff(omsPayableWriteOffs.stream() + .map(OmsPayableWriteOff::getPaymentBillCode).collect(Collectors.toList()),omsPayablePaymentDetails); + + // 批量删除对应的支付详情记录 + if (ids != null && ids.length > 0) { + // 使用专门的方法删除 + omsPayablePaymentDetailService.deleteByWriteOffIds(ids); + } + + // 获取涉及的应付单ID,用于后续更新应付单的支付金额 + List payableBillIds = omsPayablePaymentDetails.stream() + .map(OmsPayablePaymentDetail::getPayableBillId) + .distinct() + .collect(Collectors.toList()); + + // 根据对应的应付单id更新对应的数据 + if (CollUtil.isNotEmpty(payableBillIds)) { + payableBillService.updatePaymentAmount(payableBillIds); + } + + // 最后删除主记录 return omsPayableWriteOffMapper.deleteOmsPayableWriteOffByIds(ids); } @@ -208,6 +253,60 @@ public class OmsPayableWriteOffServiceImpl implements IOmsPayableWriteOffService return omsPayableWriteOffMapper.selectOmsPayableWriteOffList(omsPayableWriteOff); } + @Override + public void autoWriteOff(WriteOffRequestDto writeOffRequestDto) { + if (CollUtil.isEmpty(writeOffRequestDto.getDetailList())){ + throw new ServiceException("请选择核销明细"); + } + // 获取付款单信息 + OmsPaymentBill paymentBill = omsPaymentBillService.selectOmsPaymentBillById(writeOffRequestDto.getPaymentBillId()); + if (paymentBill == null) { + throw new ServiceException("付款单不存在"); + } + + // 创建核销主记录 + OmsPayableWriteOff writeOff = new OmsPayableWriteOff(); + writeOff.setWriteOffCode(generateWriteOffCode()); + // 默认为用户手动核销 + writeOff.setWriteOffType(OmsPayableWriteOff.WriteOffTypeEnum.AUTO.getCode()); + writeOff.setPaymentBillCode(paymentBill.getPaymentBillCode()); + writeOff.setVendorCode(writeOffRequestDto.getVendorCode()); + writeOff.setWriteOffTime(new Date()); + writeOff.setRemark(writeOffRequestDto.getRemark()); + + // 计算总金额和相关税额 + BigDecimal totalAmount = BigDecimal.ZERO; + BigDecimal totalAmountWithoutTax = BigDecimal.ZERO; + BigDecimal totalTaxAmount = BigDecimal.ZERO; + + for (OmsPayablePaymentDetail item : writeOffRequestDto.getDetailList()) { + totalAmount = totalAmount.add(item.getPaymentAmount()); + totalAmountWithoutTax = totalAmountWithoutTax.add(item.getPaymentAmountWithoutTax()); + totalTaxAmount = totalTaxAmount.add(item.getPaymentAmountTax()); + } + + writeOff.setWriteOffAmount(totalAmount); + writeOff.setWriteOffAmountWithoutTax(totalAmountWithoutTax); + writeOff.setWriteOffTaxAmount(totalTaxAmount); + // 设置创建时间 + writeOff.setCreateTime(new Date()); + writeOff.setCreateBy(ShiroUtils.getUserId().toString()); + writeOff.setUpdateTime(new Date()); + // 保存核销主记录 + omsPayableWriteOffMapper.insertOmsPayableWriteOff(writeOff); + + // 保存核销明细 + for (OmsPayablePaymentDetail omsPayablePaymentDetail : writeOffRequestDto.getDetailList()) { + omsPayablePaymentDetail.setPayableDetailType(OmsPayablePaymentDetail.PayableDetailTypeEnum.WRITE_OFF.getCode()); + omsPayablePaymentDetail.setPaymentTime(DateUtils.getNowDate()); + omsPayablePaymentDetail.setCreateBy(ShiroUtils.getUserId().toString()); + omsPayablePaymentDetail.setWriteOffId(writeOff.getId()); + } + omsPayablePaymentDetailService.insertBatch( writeOffRequestDto.getDetailList()); + payableBillService.updatePaymentAmount(writeOffRequestDto.getDetailList().stream().map(OmsPayablePaymentDetail::getPayableBillId).distinct().collect(Collectors.toList())); + + } + /** * 将OmsPayableWriteOffDetail转换为WriteOffDetailResultDto * diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPaymentBillServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPaymentBillServiceImpl.java index 032e35bf..728dd6a8 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPaymentBillServiceImpl.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPaymentBillServiceImpl.java @@ -1,15 +1,13 @@ package com.ruoyi.sip.service.impl; import java.math.BigDecimal; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.config.flow.ProcessConfig; import com.ruoyi.common.core.domain.AjaxResult; @@ -21,6 +19,7 @@ import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.sip.domain.*; import com.ruoyi.sip.domain.dto.PaymentBillDetailDTO; import com.ruoyi.sip.domain.dto.PaymentBillPayableDetailDTO; +import com.ruoyi.sip.dto.WriteOffRequestDto; import com.ruoyi.sip.flowable.domain.Todo; import com.ruoyi.sip.flowable.service.DeleteFlowableProcessInstanceCmd; import com.ruoyi.sip.flowable.service.TodoCommonTemplate; @@ -342,7 +341,17 @@ public class OmsPaymentBillServiceImpl implements IOmsPaymentBillService , TodoC paymentBill.setActualPaymentTime(DateUtils.getNowDate()); paymentBill.setPaymentStatus(OmsPaymentBill.PaymentStatusEnum.PAYMENT.getCode()); updateOmsPaymentBill(paymentBill); + if (!paymentBill.getPaymentBillType().equals(OmsPaymentBill.PaymentBillTypeEnum.PRE_PAYMENT.getCode())) { + List omsPayablePaymentDetails = detailService.listBypaymentCode(paymentBill.getPaymentBillCode()); + WriteOffRequestDto writeOffRequestDto = new WriteOffRequestDto(); + writeOffRequestDto.setPaymentBillId(paymentBill.getId()); + writeOffRequestDto.setDetailList(omsPayablePaymentDetails); + writeOffRequestDto.setVendorCode(paymentBill.getVendorCode()); + writeOffRequestDto.setRemark(StrUtil.format("{}自动核销数据:{}", DateUtils.getTime(), paymentBill.getPaymentBillCode())); + // 新增核销记录 + writeOffService.autoWriteOff(writeOffRequestDto); + } return AjaxResult.success(attachment); } @@ -425,6 +434,17 @@ public class OmsPaymentBillServiceImpl implements IOmsPaymentBillService , TodoC paymentBill.setPaymentStatus(OmsPaymentBill.PaymentStatusEnum.PAYMENT.getCode()); paymentBill.setActualPaymentTime(DateUtils.getNowDate()); updateOmsPaymentBill(paymentBill); + if (!paymentBill.getPaymentBillType().equals(OmsPaymentBill.PaymentBillTypeEnum.PRE_PAYMENT.getCode())) { + List omsPayablePaymentDetails = detailService.listBypaymentCode(paymentBill.getPaymentBillCode()); + + WriteOffRequestDto writeOffRequestDto = new WriteOffRequestDto(); + writeOffRequestDto.setPaymentBillId(paymentBillId); + writeOffRequestDto.setDetailList(omsPayablePaymentDetails); + writeOffRequestDto.setVendorCode(paymentBill.getVendorCode()); + writeOffRequestDto.setRemark(StrUtil.format("{}自动核销数据:{}", DateUtils.getTime(), paymentBill.getPaymentBillCode())); + // 新增核销记录 + writeOffService.autoWriteOff(writeOffRequestDto); + } return AjaxResult.success(attachment); } @@ -495,4 +515,90 @@ public class OmsPaymentBillServiceImpl implements IOmsPaymentBillService , TodoC return omsPaymentBills; } + + @Override + public void returnWriteOff(List collect, List omsPayablePaymentDetails) { + OmsPaymentBill omsPaymentBill = new OmsPaymentBill(); + omsPaymentBill.setPaymentBillCodeList(collect); + List omsPaymentBills = selectOmsPaymentBillList(omsPaymentBill); + Map> listMap = omsPaymentBills.stream() + .collect(Collectors.groupingBy(OmsPaymentBill::getPaymentBillType)); + + // 处理预付 + List prePaymentBillList = listMap.remove(OmsPaymentBill.PaymentBillTypeEnum.PRE_PAYMENT.getCode()); + + // 预付处理逻辑 + // 1:通过omsPayablePaymentDetailService查询对应的详情,然后根据paymentBillCode分组, + // 将含税金额总和计算出来,加在预付单的剩余额度上 + if (CollUtil.isNotEmpty(prePaymentBillList)) { + // 按付款单code分组核销详情 + Map> groupedDetails = + omsPayablePaymentDetails.stream() + .filter(detail -> detail.getPaymentBillCode() != null) + .collect(Collectors.groupingBy(OmsPayablePaymentDetail::getPaymentBillCode)); + + // 计算每个付款单的核销金额合计 + Map paymentBillWriteOffAmountMap = groupedDetails.entrySet().stream() + .collect(Collectors.toMap( + Map.Entry::getKey, + entry -> entry.getValue().stream() + .map(OmsPayablePaymentDetail::getPaymentAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add) + )); + + // 更新预付单的剩余额度 - 批量操作 + List updateBills = prePaymentBillList.stream() + .map(prePaymentBill -> { + BigDecimal increaseAmount = paymentBillWriteOffAmountMap.getOrDefault( + prePaymentBill.getPaymentBillCode(), BigDecimal.ZERO); + + if (increaseAmount.compareTo(BigDecimal.ZERO) > 0) { + OmsPaymentBill updateBill = new OmsPaymentBill(); + updateBill.setId(prePaymentBill.getId()); + // 在原剩余额度基础上加回本次核销金额 + BigDecimal newResidueAmount = prePaymentBill.getPreResidueAmount() + .add(increaseAmount); + updateBill.setPreResidueAmount(newResidueAmount); + return updateBill; + } + return null; + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + if (CollUtil.isNotEmpty(updateBills)) { + for (OmsPaymentBill bill : updateBills) { + updateOmsPaymentBill(bill); + } + } + } + //处理其余数据 + if (CollUtil.isNotEmpty(listMap.values())) { + List updateBills = new ArrayList<>(); + + for (List omsPaymentBillList : listMap.values()) { + for (OmsPaymentBill paymentBill : omsPaymentBillList) { + + OmsPaymentBill updateBill = new OmsPaymentBill(); + updateBill.setId(paymentBill.getId()); + updateBill.setPaymentStatus(OmsPaymentBill.PaymentStatusEnum.WAIT_PAYMENT.getCode()); + updateBill.setActualPaymentTime(null); + updateBills.add(updateBill); + } + } + if (CollUtil.isNotEmpty(updateBills)) { + omsPaymentBillMapper.updateReturnWriteOffBatch(updateBills); + omsFinAttachmentService.deleteOmsFinAttachmentByPayment(updateBills.stream().map(OmsPaymentBill::getId).collect(Collectors.toList()), OmsFinAttachment.RelatedBillTypeEnum.PAYMENT.getCode()); + } + + } + + + } + + @Override + public OmsPaymentBill selectOmsPaymentBillByCode(String paymentBillCode) { + + return omsPaymentBillMapper.selectOmsPaymentBillByCode(paymentBillCode); + } } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/utils/WriteOffCodeGenerator.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/utils/WriteOffCodeGenerator.java deleted file mode 100644 index 45cddbee..00000000 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/utils/WriteOffCodeGenerator.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.ruoyi.sip.utils; - -import java.text.SimpleDateFormat; -import java.util.Date; - -/** - * 核销单号生成器 - * - * 生成规则:HX + YYMMDD + 四位序列号 - * - * @author zghz - * @date 2025-12-16 - */ -public class WriteOffCodeGenerator { - - private static final String PREFIX = "HX"; - private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyMMdd"); - - // 用于生成序列号的锁和计数器 - private static final Object lock = new Object(); - private static int sequenceNumber = 0; - - /** - * 生成核销单号 - * - * @return 核销单号 - */ - public static String generateWriteOffCode() { - synchronized (lock) { - // 获取当前日期 - String dateStr = DATE_FORMAT.format(new Date()); - - // 递增序列号 - sequenceNumber++; - - // 重置序列号 如果超过四位数则重置(实际使用中可能需要更复杂的逻辑来处理) - if (sequenceNumber > 9999) { - sequenceNumber = 1; - } - - // 格式化四位序列号 - String sequenceStr = String.format("%04d", sequenceNumber); - - return PREFIX + dateStr + sequenceStr; - } - } - - /** - * 重置序列号(可用于测试,或在每天开始时重置) - */ - public static void resetSequence() { - synchronized (lock) { - sequenceNumber = 0; - } - } - - /** - * 设置序列号(可用于测试) - * - * @param number 序列号 - */ - public static void setSequenceNumber(int number) { - synchronized (lock) { - sequenceNumber = number; - } - } -} \ No newline at end of file diff --git a/ruoyi-sip/src/main/resources/mapper/OmsPayableWriteOffMapper.xml b/ruoyi-sip/src/main/resources/mapper/OmsPayableWriteOffMapper.xml index 940e80bd..3b8828d2 100644 --- a/ruoyi-sip/src/main/resources/mapper/OmsPayableWriteOffMapper.xml +++ b/ruoyi-sip/src/main/resources/mapper/OmsPayableWriteOffMapper.xml @@ -33,23 +33,35 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + insert into oms_payable_write_off diff --git a/ruoyi-sip/src/main/resources/mapper/finance/OmsFinAttachmentMapper.xml b/ruoyi-sip/src/main/resources/mapper/finance/OmsFinAttachmentMapper.xml index 2d1c8ca4..525d8f98 100644 --- a/ruoyi-sip/src/main/resources/mapper/finance/OmsFinAttachmentMapper.xml +++ b/ruoyi-sip/src/main/resources/mapper/finance/OmsFinAttachmentMapper.xml @@ -112,5 +112,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id} + + update oms_fin_attachment set del_flag = 2 where related_bill_type = #{type} and del_flag=0 and + related_bill_id in + + #{id} + + \ No newline at end of file diff --git a/ruoyi-sip/src/main/resources/mapper/finance/OmsPayablePaymentDetailMapper.xml b/ruoyi-sip/src/main/resources/mapper/finance/OmsPayablePaymentDetailMapper.xml index ad8ff435..790e0892 100644 --- a/ruoyi-sip/src/main/resources/mapper/finance/OmsPayablePaymentDetailMapper.xml +++ b/ruoyi-sip/src/main/resources/mapper/finance/OmsPayablePaymentDetailMapper.xml @@ -86,6 +86,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{item} + + and t1.write_off_id in + + #{item} + + order by t1.create_time desc @@ -117,5 +123,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" left join project_order_info t3 on t2.order_code = t3.order_code left join project_info t4 on t3.project_id = t4.id + + + + DELETE FROM oms_payable_payment_detail WHERE write_off_id IN + + #{item} + + \ No newline at end of file diff --git a/ruoyi-sip/src/main/resources/mapper/finance/OmsPaymentBillMapper.xml b/ruoyi-sip/src/main/resources/mapper/finance/OmsPaymentBillMapper.xml index 2ce752a8..445ec210 100644 --- a/ruoyi-sip/src/main/resources/mapper/finance/OmsPaymentBillMapper.xml +++ b/ruoyi-sip/src/main/resources/mapper/finance/OmsPaymentBillMapper.xml @@ -114,6 +114,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and pb.payment_bill_code like concat('%', #{paymentBillCode}, '%') + and pb.payment_bill_code in + + #{item} + + and pb.payment_bill_type = #{paymentBillType} @@ -308,6 +313,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_time=now() where id = #{id} + + + update oms_payment_bill + set actual_payment_time=null, + payment_status=#{item.paymentStatus}, + update_time=now() + where id = #{item.id} + + + + delete from oms_payment_bill where id = #{id}