Commit 9e3858aea70c16aa596f1b0c055c30e1359038cf
1 parent
0d551a44
✨ ERP:完成 payment 付款单的逻辑 100%
Showing
15 changed files
with
163 additions
and
21 deletions
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/CollectionUtils.java
| @@ -311,4 +311,8 @@ public class CollectionUtils { | @@ -311,4 +311,8 @@ public class CollectionUtils { | ||
| 311 | return obj == null ? Collections.emptyList() : Collections.singleton(obj); | 311 | return obj == null ? Collections.emptyList() : Collections.singleton(obj); |
| 312 | } | 312 | } |
| 313 | 313 | ||
| 314 | + public static <T> List<T> newArrayList(List<List<T>> list) { | ||
| 315 | + return list.stream().flatMap(Collection::stream).collect(Collectors.toList()); | ||
| 316 | + } | ||
| 317 | + | ||
| 314 | } | 318 | } |
yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java
| @@ -34,6 +34,8 @@ ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_00 | @@ -34,6 +34,8 @@ ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_00 | ||
| 34 | ErrorCode PURCHASE_IN_NO_EXISTS = new ErrorCode(1_030_102_004, "生成入库单失败,请重新提交"); | 34 | ErrorCode PURCHASE_IN_NO_EXISTS = new ErrorCode(1_030_102_004, "生成入库单失败,请重新提交"); |
| 35 | ErrorCode PURCHASE_IN_UPDATE_FAIL_APPROVE = new ErrorCode(1_030_102_005, "采购入库单({})已审核,无法修改"); | 35 | ErrorCode PURCHASE_IN_UPDATE_FAIL_APPROVE = new ErrorCode(1_030_102_005, "采购入库单({})已审核,无法修改"); |
| 36 | ErrorCode PURCHASE_IN_NOT_APPROVE = new ErrorCode(1_030_102_006, "采购入库单未审核,无法操作"); | 36 | ErrorCode PURCHASE_IN_NOT_APPROVE = new ErrorCode(1_030_102_006, "采购入库单未审核,无法操作"); |
| 37 | + ErrorCode PURCHASE_IN_FAIL_PAYMENT_PRICE_EXCEED = new ErrorCode(1_030_102_007, "付款金额({})超过采购入库单总金额({})"); | ||
| 38 | + ErrorCode PURCHASE_IN_PROCESS_FAIL_EXISTS_PAYMENT = new ErrorCode(1_030_102_008, "反审核失败,已存在对应的付款单"); | ||
| 37 | 39 | ||
| 38 | // ========== ERP 采购退货(1-030-103-000) ========== | 40 | // ========== ERP 采购退货(1-030-103-000) ========== |
| 39 | ErrorCode PURCHASE_RETURN_NOT_EXISTS = new ErrorCode(1_030_103_000, "采购退货单不存在"); | 41 | ErrorCode PURCHASE_RETURN_NOT_EXISTS = new ErrorCode(1_030_103_000, "采购退货单不存在"); |
| @@ -43,6 +45,8 @@ ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_00 | @@ -43,6 +45,8 @@ ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_00 | ||
| 43 | ErrorCode PURCHASE_RETURN_NO_EXISTS = new ErrorCode(1_030_103_004, "生成退货单失败,请重新提交"); | 45 | ErrorCode PURCHASE_RETURN_NO_EXISTS = new ErrorCode(1_030_103_004, "生成退货单失败,请重新提交"); |
| 44 | ErrorCode PURCHASE_RETURN_UPDATE_FAIL_APPROVE = new ErrorCode(1_030_103_005, "采购退货单({})已审核,无法修改"); | 46 | ErrorCode PURCHASE_RETURN_UPDATE_FAIL_APPROVE = new ErrorCode(1_030_103_005, "采购退货单({})已审核,无法修改"); |
| 45 | ErrorCode PURCHASE_RETURN_NOT_APPROVE = new ErrorCode(1_030_103_006, "采购退货单未审核,无法操作"); | 47 | ErrorCode PURCHASE_RETURN_NOT_APPROVE = new ErrorCode(1_030_103_006, "采购退货单未审核,无法操作"); |
| 48 | + ErrorCode PURCHASE_RETURN_FAIL_REFUND_PRICE_EXCEED = new ErrorCode(1_030_103_007, "退款金额({})超过采购退货单总金额({})"); | ||
| 49 | + ErrorCode PURCHASE_RETURN_PROCESS_FAIL_EXISTS_REFUND = new ErrorCode(1_030_103_008, "反审核失败,已存在对应的退款单"); | ||
| 46 | 50 | ||
| 47 | // ========== ERP 客户(1-030-200-000)========== | 51 | // ========== ERP 客户(1-030-200-000)========== |
| 48 | ErrorCode CUSTOMER_NOT_EXISTS = new ErrorCode(1_020_200_000, "客户不存在"); | 52 | ErrorCode CUSTOMER_NOT_EXISTS = new ErrorCode(1_020_200_000, "客户不存在"); |
| @@ -145,5 +149,6 @@ ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_00 | @@ -145,5 +149,6 @@ ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_00 | ||
| 145 | ErrorCode FINANCE_PAYMENT_PROCESS_FAIL = new ErrorCode(1_030_601_002, "反审核失败,只有已审核的付款单才能反审核"); | 149 | ErrorCode FINANCE_PAYMENT_PROCESS_FAIL = new ErrorCode(1_030_601_002, "反审核失败,只有已审核的付款单才能反审核"); |
| 146 | ErrorCode FINANCE_PAYMENT_APPROVE_FAIL = new ErrorCode(1_030_601_003, "审核失败,只有未审核的付款单才能审核"); | 150 | ErrorCode FINANCE_PAYMENT_APPROVE_FAIL = new ErrorCode(1_030_601_003, "审核失败,只有未审核的付款单才能审核"); |
| 147 | ErrorCode FINANCE_PAYMENT_NO_EXISTS = new ErrorCode(1_030_601_004, "生成付款单号失败,请重新提交"); | 151 | ErrorCode FINANCE_PAYMENT_NO_EXISTS = new ErrorCode(1_030_601_004, "生成付款单号失败,请重新提交"); |
| 152 | + ErrorCode FINANCE_PAYMENT_UPDATE_FAIL_APPROVE = new ErrorCode(1_030_601_005, "付款单({})已审核,无法修改"); | ||
| 148 | 153 | ||
| 149 | } | 154 | } |
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/ErpFinancePaymentController.java
| @@ -12,9 +12,11 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; | @@ -12,9 +12,11 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; | ||
| 12 | import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentPageReqVO; | 12 | import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentPageReqVO; |
| 13 | import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentRespVO; | 13 | import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentRespVO; |
| 14 | import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentSaveReqVO; | 14 | import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentSaveReqVO; |
| 15 | +import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpAccountDO; | ||
| 15 | import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentDO; | 16 | import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentDO; |
| 16 | import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentItemDO; | 17 | import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentItemDO; |
| 17 | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpSupplierDO; | 18 | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpSupplierDO; |
| 19 | +import cn.iocoder.yudao.module.erp.service.finance.ErpAccountService; | ||
| 18 | import cn.iocoder.yudao.module.erp.service.finance.ErpFinancePaymentService; | 20 | import cn.iocoder.yudao.module.erp.service.finance.ErpFinancePaymentService; |
| 19 | import cn.iocoder.yudao.module.erp.service.purchase.ErpSupplierService; | 21 | import cn.iocoder.yudao.module.erp.service.purchase.ErpSupplierService; |
| 20 | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | 22 | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| @@ -48,6 +50,8 @@ public class ErpFinancePaymentController { | @@ -48,6 +50,8 @@ public class ErpFinancePaymentController { | ||
| 48 | private ErpFinancePaymentService financePaymentService; | 50 | private ErpFinancePaymentService financePaymentService; |
| 49 | @Resource | 51 | @Resource |
| 50 | private ErpSupplierService supplierService; | 52 | private ErpSupplierService supplierService; |
| 53 | + @Resource | ||
| 54 | + private ErpAccountService accountService; | ||
| 51 | 55 | ||
| 52 | @Resource | 56 | @Resource |
| 53 | private AdminUserApi adminUserApi; | 57 | private AdminUserApi adminUserApi; |
| @@ -130,13 +134,17 @@ public class ErpFinancePaymentController { | @@ -130,13 +134,17 @@ public class ErpFinancePaymentController { | ||
| 130 | // 1.2 供应商信息 | 134 | // 1.2 供应商信息 |
| 131 | Map<Long, ErpSupplierDO> supplierMap = supplierService.getSupplierMap( | 135 | Map<Long, ErpSupplierDO> supplierMap = supplierService.getSupplierMap( |
| 132 | convertSet(pageResult.getList(), ErpFinancePaymentDO::getSupplierId)); | 136 | convertSet(pageResult.getList(), ErpFinancePaymentDO::getSupplierId)); |
| 133 | - // 1.3 管理员信息 | 137 | + // 1.3 结算账户信息 |
| 138 | + Map<Long, ErpAccountDO> accountMap = accountService.getAccountMap( | ||
| 139 | + convertSet(pageResult.getList(), ErpFinancePaymentDO::getAccountId)); | ||
| 140 | + // 1.4 管理员信息 | ||
| 134 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(pageResult.getList(), | 141 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(pageResult.getList(), |
| 135 | contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getFinanceUserId()))); | 142 | contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getFinanceUserId()))); |
| 136 | // 2. 开始拼接 | 143 | // 2. 开始拼接 |
| 137 | return BeanUtils.toBean(pageResult, ErpFinancePaymentRespVO.class, payment -> { | 144 | return BeanUtils.toBean(pageResult, ErpFinancePaymentRespVO.class, payment -> { |
| 138 | payment.setItems(BeanUtils.toBean(financePaymentItemMap.get(payment.getId()), ErpFinancePaymentRespVO.Item.class)); | 145 | payment.setItems(BeanUtils.toBean(financePaymentItemMap.get(payment.getId()), ErpFinancePaymentRespVO.Item.class)); |
| 139 | MapUtils.findAndThen(supplierMap, payment.getSupplierId(), supplier -> payment.setSupplierName(supplier.getName())); | 146 | MapUtils.findAndThen(supplierMap, payment.getSupplierId(), supplier -> payment.setSupplierName(supplier.getName())); |
| 147 | + MapUtils.findAndThen(accountMap, payment.getAccountId(), account -> payment.setAccountName(account.getName())); | ||
| 140 | MapUtils.findAndThen(userMap, Long.parseLong(payment.getCreator()), user -> payment.setCreatorName(user.getNickname())); | 148 | MapUtils.findAndThen(userMap, Long.parseLong(payment.getCreator()), user -> payment.setCreatorName(user.getNickname())); |
| 141 | MapUtils.findAndThen(userMap, payment.getFinanceUserId(), user -> payment.setFinanceUserName(user.getNickname())); | 149 | MapUtils.findAndThen(userMap, payment.getFinanceUserId(), user -> payment.setFinanceUserName(user.getNickname())); |
| 142 | }); | 150 | }); |
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/payment/ErpFinancePaymentRespVO.java
| @@ -37,6 +37,8 @@ public class ErpFinancePaymentRespVO { | @@ -37,6 +37,8 @@ public class ErpFinancePaymentRespVO { | ||
| 37 | 37 | ||
| 38 | @Schema(description = "付款账户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "28989") | 38 | @Schema(description = "付款账户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "28989") |
| 39 | private Long accountId; | 39 | private Long accountId; |
| 40 | + @Schema(description = "付款账户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") | ||
| 41 | + private String accountName; | ||
| 40 | 42 | ||
| 41 | @Schema(description = "合计价格,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "13832") | 43 | @Schema(description = "合计价格,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "13832") |
| 42 | private BigDecimal totalPrice; | 44 | private BigDecimal totalPrice; |
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/payment/ErpFinancePaymentSaveReqVO.java
| @@ -17,10 +17,6 @@ public class ErpFinancePaymentSaveReqVO { | @@ -17,10 +17,6 @@ public class ErpFinancePaymentSaveReqVO { | ||
| 17 | @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23752") | 17 | @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23752") |
| 18 | private Long id; | 18 | private Long id; |
| 19 | 19 | ||
| 20 | - @Schema(description = "付款单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "FKD888") | ||
| 21 | - @NotEmpty(message = "付款单号不能为空") | ||
| 22 | - private String no; | ||
| 23 | - | ||
| 24 | @Schema(description = "付款时间", requiredMode = Schema.RequiredMode.REQUIRED) | 20 | @Schema(description = "付款时间", requiredMode = Schema.RequiredMode.REQUIRED) |
| 25 | @NotNull(message = "付款时间不能为空") | 21 | @NotNull(message = "付款时间不能为空") |
| 26 | private LocalDateTime paymentTime; | 22 | private LocalDateTime paymentTime; |
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/finance/ErpFinancePaymentItemMapper.java
| 1 | package cn.iocoder.yudao.module.erp.dal.mysql.finance; | 1 | package cn.iocoder.yudao.module.erp.dal.mysql.finance; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.collection.CollUtil; | ||
| 4 | +import cn.hutool.core.map.MapUtil; | ||
| 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | 5 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 4 | import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentItemDO; | 6 | import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentItemDO; |
| 7 | +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | ||
| 5 | import org.apache.ibatis.annotations.Mapper; | 8 | import org.apache.ibatis.annotations.Mapper; |
| 6 | 9 | ||
| 10 | +import java.math.BigDecimal; | ||
| 7 | import java.util.Collection; | 11 | import java.util.Collection; |
| 8 | import java.util.List; | 12 | import java.util.List; |
| 13 | +import java.util.Map; | ||
| 9 | 14 | ||
| 10 | /** | 15 | /** |
| 11 | * ERP 付款单项 Mapper | 16 | * ERP 付款单项 Mapper |
| @@ -23,8 +28,17 @@ public interface ErpFinancePaymentItemMapper extends BaseMapperX<ErpFinancePayme | @@ -23,8 +28,17 @@ public interface ErpFinancePaymentItemMapper extends BaseMapperX<ErpFinancePayme | ||
| 23 | return selectList(ErpFinancePaymentItemDO::getPaymentId, paymentIds); | 28 | return selectList(ErpFinancePaymentItemDO::getPaymentId, paymentIds); |
| 24 | } | 29 | } |
| 25 | 30 | ||
| 26 | - default int deleteByPaymentId(Long paymentId) { | ||
| 27 | - return delete(ErpFinancePaymentItemDO::getPaymentId, paymentId); | 31 | + default BigDecimal selectPaymentPriceSumByBizIdAndBizType(Long bizId, Integer bizType) { |
| 32 | + // SQL sum 查询 | ||
| 33 | + List<Map<String, Object>> result = selectMaps(new QueryWrapper<ErpFinancePaymentItemDO>() | ||
| 34 | + .select("SUM(payment_price) AS paymentPriceSum") | ||
| 35 | + .eq("biz_id", bizId) | ||
| 36 | + .eq("biz_type", bizType)); | ||
| 37 | + // 获得数量 | ||
| 38 | + if (CollUtil.isEmpty(result)) { | ||
| 39 | + return BigDecimal.ZERO; | ||
| 40 | + } | ||
| 41 | + return BigDecimal.valueOf(MapUtil.getDouble(result.get(0), "paymentPriceSum", 0D)); | ||
| 28 | } | 42 | } |
| 29 | 43 | ||
| 30 | } | 44 | } |
| 31 | \ No newline at end of file | 45 | \ No newline at end of file |
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseInMapper.java
| @@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; | @@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; | ||
| 7 | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.in.ErpPurchaseInPageReqVO; | 7 | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.in.ErpPurchaseInPageReqVO; |
| 8 | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInDO; | 8 | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInDO; |
| 9 | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInItemDO; | 9 | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInItemDO; |
| 10 | +import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus; | ||
| 10 | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | 11 | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| 11 | import org.apache.ibatis.annotations.Mapper; | 12 | import org.apache.ibatis.annotations.Mapper; |
| 12 | 13 | ||
| @@ -41,7 +42,8 @@ public interface ErpPurchaseInMapper extends BaseMapperX<ErpPurchaseInDO> { | @@ -41,7 +42,8 @@ public interface ErpPurchaseInMapper extends BaseMapperX<ErpPurchaseInDO> { | ||
| 41 | query.apply("t.payment_price = t.total_price"); | 42 | query.apply("t.payment_price = t.total_price"); |
| 42 | } | 43 | } |
| 43 | if (Boolean.TRUE.equals(reqVO.getPaymentEnable())) { | 44 | if (Boolean.TRUE.equals(reqVO.getPaymentEnable())) { |
| 44 | - query.apply("t.payment_price < t.total_price"); | 45 | + query.eq(ErpPurchaseInDO::getStatus, ErpAuditStatus.APPROVE.getStatus()) |
| 46 | + .apply("t.payment_price < t.total_price"); | ||
| 45 | } | 47 | } |
| 46 | if (reqVO.getWarehouseId() != null || reqVO.getProductId() != null) { | 48 | if (reqVO.getWarehouseId() != null || reqVO.getProductId() != null) { |
| 47 | query.leftJoin(ErpPurchaseInItemDO.class, ErpPurchaseInItemDO::getInId, ErpPurchaseInDO::getId) | 49 | query.leftJoin(ErpPurchaseInItemDO.class, ErpPurchaseInItemDO::getInId, ErpPurchaseInDO::getId) |
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseReturnMapper.java
| @@ -4,8 +4,10 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | @@ -4,8 +4,10 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 4 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | 4 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 5 | import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; | 5 | import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; |
| 6 | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.returns.ErpPurchaseReturnPageReqVO; | 6 | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.returns.ErpPurchaseReturnPageReqVO; |
| 7 | +import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInDO; | ||
| 7 | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseReturnDO; | 8 | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseReturnDO; |
| 8 | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseReturnItemDO; | 9 | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseReturnItemDO; |
| 10 | +import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus; | ||
| 9 | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | 11 | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| 10 | import org.apache.ibatis.annotations.Mapper; | 12 | import org.apache.ibatis.annotations.Mapper; |
| 11 | 13 | ||
| @@ -40,7 +42,8 @@ public interface ErpPurchaseReturnMapper extends BaseMapperX<ErpPurchaseReturnDO | @@ -40,7 +42,8 @@ public interface ErpPurchaseReturnMapper extends BaseMapperX<ErpPurchaseReturnDO | ||
| 40 | query.apply("t.refund_price = t.total_price"); | 42 | query.apply("t.refund_price = t.total_price"); |
| 41 | } | 43 | } |
| 42 | if (Boolean.TRUE.equals(reqVO.getRefundEnable())) { | 44 | if (Boolean.TRUE.equals(reqVO.getRefundEnable())) { |
| 43 | - query.apply("t.refund_price < t.total_price"); | 45 | + query.eq(ErpPurchaseInDO::getStatus, ErpAuditStatus.APPROVE.getStatus()) |
| 46 | + .apply("t.refund_price < t.total_price"); | ||
| 44 | } | 47 | } |
| 45 | if (reqVO.getWarehouseId() != null || reqVO.getProductId() != null) { | 48 | if (reqVO.getWarehouseId() != null || reqVO.getProductId() != null) { |
| 46 | query.leftJoin(ErpPurchaseReturnItemDO.class, ErpPurchaseReturnItemDO::getReturnId, ErpPurchaseReturnDO::getId) | 49 | query.leftJoin(ErpPurchaseReturnItemDO.class, ErpPurchaseReturnItemDO::getReturnId, ErpPurchaseReturnDO::getId) |
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpAccountService.java
| @@ -6,7 +6,11 @@ import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.account.ErpAccoun | @@ -6,7 +6,11 @@ import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.account.ErpAccoun | ||
| 6 | import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpAccountDO; | 6 | import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpAccountDO; |
| 7 | import jakarta.validation.Valid; | 7 | import jakarta.validation.Valid; |
| 8 | 8 | ||
| 9 | +import java.util.Collection; | ||
| 9 | import java.util.List; | 10 | import java.util.List; |
| 11 | +import java.util.Map; | ||
| 12 | + | ||
| 13 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; | ||
| 10 | 14 | ||
| 11 | /** | 15 | /** |
| 12 | * ERP 结算账户 Service 接口 | 16 | * ERP 结算账户 Service 接口 |
| @@ -70,6 +74,24 @@ public interface ErpAccountService { | @@ -70,6 +74,24 @@ public interface ErpAccountService { | ||
| 70 | List<ErpAccountDO> getAccountListByStatus(Integer status); | 74 | List<ErpAccountDO> getAccountListByStatus(Integer status); |
| 71 | 75 | ||
| 72 | /** | 76 | /** |
| 77 | + * 获得结算账户列表 | ||
| 78 | + * | ||
| 79 | + * @param ids 编号数组 | ||
| 80 | + * @return 结算账户列表 | ||
| 81 | + */ | ||
| 82 | + List<ErpAccountDO> getAccountList(Collection<Long> ids); | ||
| 83 | + | ||
| 84 | + /** | ||
| 85 | + * 获得结算账户 Map | ||
| 86 | + * | ||
| 87 | + * @param ids 编号数组 | ||
| 88 | + * @return 结算账户 Map | ||
| 89 | + */ | ||
| 90 | + default Map<Long, ErpAccountDO> getAccountMap(Collection<Long> ids) { | ||
| 91 | + return convertMap(getAccountList(ids), ErpAccountDO::getId); | ||
| 92 | + } | ||
| 93 | + | ||
| 94 | + /** | ||
| 73 | * 获得结算账户分页 | 95 | * 获得结算账户分页 |
| 74 | * | 96 | * |
| 75 | * @param pageReqVO 分页查询 | 97 | * @param pageReqVO 分页查询 |
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpAccountServiceImpl.java
| @@ -11,6 +11,7 @@ import jakarta.annotation.Resource; | @@ -11,6 +11,7 @@ import jakarta.annotation.Resource; | ||
| 11 | import org.springframework.stereotype.Service; | 11 | import org.springframework.stereotype.Service; |
| 12 | import org.springframework.validation.annotation.Validated; | 12 | import org.springframework.validation.annotation.Validated; |
| 13 | 13 | ||
| 14 | +import java.util.Collection; | ||
| 14 | import java.util.List; | 15 | import java.util.List; |
| 15 | 16 | ||
| 16 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 17 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| @@ -99,6 +100,11 @@ public class ErpAccountServiceImpl implements ErpAccountService { | @@ -99,6 +100,11 @@ public class ErpAccountServiceImpl implements ErpAccountService { | ||
| 99 | } | 100 | } |
| 100 | 101 | ||
| 101 | @Override | 102 | @Override |
| 103 | + public List<ErpAccountDO> getAccountList(Collection<Long> ids) { | ||
| 104 | + return accountMapper.selectBatchIds(ids); | ||
| 105 | + } | ||
| 106 | + | ||
| 107 | + @Override | ||
| 102 | public PageResult<ErpAccountDO> getAccountPage(ErpAccountPageReqVO pageReqVO) { | 108 | public PageResult<ErpAccountDO> getAccountPage(ErpAccountPageReqVO pageReqVO) { |
| 103 | return accountMapper.selectPage(pageReqVO); | 109 | return accountMapper.selectPage(pageReqVO); |
| 104 | } | 110 | } |
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinancePaymentServiceImpl.java
| 1 | package cn.iocoder.yudao.module.erp.service.finance; | 1 | package cn.iocoder.yudao.module.erp.service.finance; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | +import cn.hutool.core.lang.Assert; | ||
| 4 | import cn.hutool.core.util.ObjectUtil; | 5 | import cn.hutool.core.util.ObjectUtil; |
| 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 7 | +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||
| 6 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 8 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 7 | import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentPageReqVO; | 9 | import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentPageReqVO; |
| 8 | import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentSaveReqVO; | 10 | import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentSaveReqVO; |
| @@ -68,7 +70,8 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService { | @@ -68,7 +70,8 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService { | ||
| 68 | @Transactional(rollbackFor = Exception.class) | 70 | @Transactional(rollbackFor = Exception.class) |
| 69 | public Long createFinancePayment(ErpFinancePaymentSaveReqVO createReqVO) { | 71 | public Long createFinancePayment(ErpFinancePaymentSaveReqVO createReqVO) { |
| 70 | // 1.1 校验订单项的有效性 | 72 | // 1.1 校验订单项的有效性 |
| 71 | - List<ErpFinancePaymentItemDO> paymentItems = validateFinancePaymentItems(createReqVO.getItems()); | 73 | + List<ErpFinancePaymentItemDO> paymentItems = validateFinancePaymentItems( |
| 74 | + createReqVO.getSupplierId(), createReqVO.getItems()); | ||
| 72 | // 1.2 校验供应商 | 75 | // 1.2 校验供应商 |
| 73 | supplierService.validateSupplier(createReqVO.getSupplierId()); | 76 | supplierService.validateSupplier(createReqVO.getSupplierId()); |
| 74 | // 1.3 校验结算账户 | 77 | // 1.3 校验结算账户 |
| @@ -102,7 +105,7 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService { | @@ -102,7 +105,7 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService { | ||
| 102 | // 1.1 校验存在 | 105 | // 1.1 校验存在 |
| 103 | ErpFinancePaymentDO payment = validateFinancePaymentExists(updateReqVO.getId()); | 106 | ErpFinancePaymentDO payment = validateFinancePaymentExists(updateReqVO.getId()); |
| 104 | if (ErpAuditStatus.APPROVE.getStatus().equals(payment.getStatus())) { | 107 | if (ErpAuditStatus.APPROVE.getStatus().equals(payment.getStatus())) { |
| 105 | - throw exception(SALE_ORDER_UPDATE_FAIL_APPROVE, payment.getNo()); | 108 | + throw exception(FINANCE_PAYMENT_UPDATE_FAIL_APPROVE, payment.getNo()); |
| 106 | } | 109 | } |
| 107 | // 1.2 校验供应商 | 110 | // 1.2 校验供应商 |
| 108 | supplierService.validateSupplier(updateReqVO.getSupplierId()); | 111 | supplierService.validateSupplier(updateReqVO.getSupplierId()); |
| @@ -115,7 +118,8 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService { | @@ -115,7 +118,8 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService { | ||
| 115 | adminUserApi.validateUser(updateReqVO.getFinanceUserId()); | 118 | adminUserApi.validateUser(updateReqVO.getFinanceUserId()); |
| 116 | } | 119 | } |
| 117 | // 1.5 校验付款单项的有效性 | 120 | // 1.5 校验付款单项的有效性 |
| 118 | - List<ErpFinancePaymentItemDO> paymentItems = validateFinancePaymentItems(updateReqVO.getItems()); | 121 | + List<ErpFinancePaymentItemDO> paymentItems = validateFinancePaymentItems( |
| 122 | + updateReqVO.getSupplierId(), updateReqVO.getItems()); | ||
| 119 | 123 | ||
| 120 | // 2.1 更新付款单 | 124 | // 2.1 更新付款单 |
| 121 | ErpFinancePaymentDO updateObj = BeanUtils.toBean(updateReqVO, ErpFinancePaymentDO.class); | 125 | ErpFinancePaymentDO updateObj = BeanUtils.toBean(updateReqVO, ErpFinancePaymentDO.class); |
| @@ -123,6 +127,9 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService { | @@ -123,6 +127,9 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService { | ||
| 123 | financePaymentMapper.updateById(updateObj); | 127 | financePaymentMapper.updateById(updateObj); |
| 124 | // 2.2 更新付款单项 | 128 | // 2.2 更新付款单项 |
| 125 | updateFinancePaymentItemList(updateReqVO.getId(), paymentItems); | 129 | updateFinancePaymentItemList(updateReqVO.getId(), paymentItems); |
| 130 | + | ||
| 131 | + // 3. 更新采购入库、退货的付款金额情况 | ||
| 132 | + updatePurchasePrice(paymentItems); | ||
| 126 | } | 133 | } |
| 127 | 134 | ||
| 128 | private void calculateTotalPrice(ErpFinancePaymentDO payment, List<ErpFinancePaymentItemDO> paymentItems) { | 135 | private void calculateTotalPrice(ErpFinancePaymentDO payment, List<ErpFinancePaymentItemDO> paymentItems) { |
| @@ -138,25 +145,29 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService { | @@ -138,25 +145,29 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService { | ||
| 138 | ErpFinancePaymentDO payment = validateFinancePaymentExists(id); | 145 | ErpFinancePaymentDO payment = validateFinancePaymentExists(id); |
| 139 | // 1.2 校验状态 | 146 | // 1.2 校验状态 |
| 140 | if (payment.getStatus().equals(status)) { | 147 | if (payment.getStatus().equals(status)) { |
| 141 | - throw exception(approve ? SALE_ORDER_APPROVE_FAIL : SALE_ORDER_PROCESS_FAIL); | 148 | + throw exception(approve ? FINANCE_PAYMENT_APPROVE_FAIL : FINANCE_PAYMENT_PROCESS_FAIL); |
| 142 | } | 149 | } |
| 143 | 150 | ||
| 144 | // 2. 更新状态 | 151 | // 2. 更新状态 |
| 145 | int updateCount = financePaymentMapper.updateByIdAndStatus(id, payment.getStatus(), | 152 | int updateCount = financePaymentMapper.updateByIdAndStatus(id, payment.getStatus(), |
| 146 | new ErpFinancePaymentDO().setStatus(status)); | 153 | new ErpFinancePaymentDO().setStatus(status)); |
| 147 | if (updateCount == 0) { | 154 | if (updateCount == 0) { |
| 148 | - throw exception(approve ? SALE_ORDER_APPROVE_FAIL : SALE_ORDER_PROCESS_FAIL); | 155 | + throw exception(approve ? FINANCE_PAYMENT_APPROVE_FAIL : FINANCE_PAYMENT_PROCESS_FAIL); |
| 149 | } | 156 | } |
| 150 | } | 157 | } |
| 151 | 158 | ||
| 152 | - private List<ErpFinancePaymentItemDO> validateFinancePaymentItems(List<ErpFinancePaymentSaveReqVO.Item> list) { | 159 | + private List<ErpFinancePaymentItemDO> validateFinancePaymentItems( |
| 160 | + Long supplierId, | ||
| 161 | + List<ErpFinancePaymentSaveReqVO.Item> list) { | ||
| 153 | return convertList(list, o -> BeanUtils.toBean(o, ErpFinancePaymentItemDO.class, item -> { | 162 | return convertList(list, o -> BeanUtils.toBean(o, ErpFinancePaymentItemDO.class, item -> { |
| 154 | if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.PURCHASE_IN.getType())) { | 163 | if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.PURCHASE_IN.getType())) { |
| 155 | ErpPurchaseInDO purchaseIn = purchaseInService.validatePurchaseIn(item.getBizId()); | 164 | ErpPurchaseInDO purchaseIn = purchaseInService.validatePurchaseIn(item.getBizId()); |
| 165 | + Assert.equals(purchaseIn.getSupplierId(), supplierId, "供应商必须相同"); | ||
| 156 | item.setTotalPrice(purchaseIn.getTotalPrice()).setBizNo(purchaseIn.getNo()); | 166 | item.setTotalPrice(purchaseIn.getTotalPrice()).setBizNo(purchaseIn.getNo()); |
| 157 | } else if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.PURCHASE_RETURN.getType())) { | 167 | } else if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.PURCHASE_RETURN.getType())) { |
| 158 | ErpPurchaseReturnDO purchaseReturn = purchaseReturnService.validatePurchaseReturn(item.getBizId()); | 168 | ErpPurchaseReturnDO purchaseReturn = purchaseReturnService.validatePurchaseReturn(item.getBizId()); |
| 159 | - item.setTotalPrice(purchaseReturn.getTotalPrice()).setBizNo(purchaseReturn.getNo()); | 169 | + Assert.equals(purchaseReturn.getSupplierId(), supplierId, "供应商必须相同"); |
| 170 | + item.setTotalPrice(purchaseReturn.getTotalPrice().negate()).setBizNo(purchaseReturn.getNo()); | ||
| 160 | } else { | 171 | } else { |
| 161 | throw new IllegalArgumentException("业务类型不正确:" + item.getBizType()); | 172 | throw new IllegalArgumentException("业务类型不正确:" + item.getBizType()); |
| 162 | } | 173 | } |
| @@ -180,6 +191,23 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService { | @@ -180,6 +191,23 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService { | ||
| 180 | if (CollUtil.isNotEmpty(diffList.get(2))) { | 191 | if (CollUtil.isNotEmpty(diffList.get(2))) { |
| 181 | financePaymentItemMapper.deleteBatchIds(convertList(diffList.get(2), ErpFinancePaymentItemDO::getId)); | 192 | financePaymentItemMapper.deleteBatchIds(convertList(diffList.get(2), ErpFinancePaymentItemDO::getId)); |
| 182 | } | 193 | } |
| 194 | + | ||
| 195 | + // 第三步,更新采购入库、退货的付款金额情况 | ||
| 196 | + updatePurchasePrice(CollectionUtils.newArrayList(diffList)); | ||
| 197 | + } | ||
| 198 | + | ||
| 199 | + private void updatePurchasePrice(List<ErpFinancePaymentItemDO> paymentItems) { | ||
| 200 | + paymentItems.forEach(paymentItem -> { | ||
| 201 | + BigDecimal totalPaymentPrice = financePaymentItemMapper.selectPaymentPriceSumByBizIdAndBizType( | ||
| 202 | + paymentItem.getBizId(), paymentItem.getBizType()); | ||
| 203 | + if (ErpBizTypeEnum.PURCHASE_IN.getType().equals(paymentItem.getBizType())) { | ||
| 204 | + purchaseInService.updatePurchaseInPaymentPrice(paymentItem.getBizId(), totalPaymentPrice); | ||
| 205 | + } else if (ErpBizTypeEnum.PURCHASE_RETURN.getType().equals(paymentItem.getBizType())) { | ||
| 206 | + purchaseReturnService.updatePurchaseReturnRefundPrice(paymentItem.getBizId(), totalPaymentPrice.negate()); | ||
| 207 | + } else { | ||
| 208 | + throw new IllegalArgumentException("业务类型不正确:" + paymentItem.getBizType()); | ||
| 209 | + } | ||
| 210 | + }); | ||
| 183 | } | 211 | } |
| 184 | 212 | ||
| 185 | @Override | 213 | @Override |
| @@ -192,7 +220,7 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService { | @@ -192,7 +220,7 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService { | ||
| 192 | } | 220 | } |
| 193 | payments.forEach(payment -> { | 221 | payments.forEach(payment -> { |
| 194 | if (ErpAuditStatus.APPROVE.getStatus().equals(payment.getStatus())) { | 222 | if (ErpAuditStatus.APPROVE.getStatus().equals(payment.getStatus())) { |
| 195 | - throw exception(SALE_ORDER_DELETE_FAIL_APPROVE, payment.getNo()); | 223 | + throw exception(FINANCE_PAYMENT_DELETE_FAIL_APPROVE, payment.getNo()); |
| 196 | } | 224 | } |
| 197 | }); | 225 | }); |
| 198 | 226 | ||
| @@ -201,14 +229,18 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService { | @@ -201,14 +229,18 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService { | ||
| 201 | // 2.1 删除付款单 | 229 | // 2.1 删除付款单 |
| 202 | financePaymentMapper.deleteById(payment.getId()); | 230 | financePaymentMapper.deleteById(payment.getId()); |
| 203 | // 2.2 删除付款单项 | 231 | // 2.2 删除付款单项 |
| 204 | - financePaymentItemMapper.deleteByPaymentId(payment.getId()); | 232 | + List<ErpFinancePaymentItemDO> paymentItems = financePaymentItemMapper.selectListByPaymentId(payment.getId()); |
| 233 | + financePaymentItemMapper.deleteBatchIds(convertSet(paymentItems, ErpFinancePaymentItemDO::getId)); | ||
| 234 | + | ||
| 235 | + // 2.3 更新采购入库、退货的付款金额情况 | ||
| 236 | + updatePurchasePrice(paymentItems); | ||
| 205 | }); | 237 | }); |
| 206 | } | 238 | } |
| 207 | 239 | ||
| 208 | private ErpFinancePaymentDO validateFinancePaymentExists(Long id) { | 240 | private ErpFinancePaymentDO validateFinancePaymentExists(Long id) { |
| 209 | ErpFinancePaymentDO payment = financePaymentMapper.selectById(id); | 241 | ErpFinancePaymentDO payment = financePaymentMapper.selectById(id); |
| 210 | if (payment == null) { | 242 | if (payment == null) { |
| 211 | - throw exception(SALE_ORDER_NOT_EXISTS); | 243 | + throw exception(FINANCE_PAYMENT_NOT_EXISTS); |
| 212 | } | 244 | } |
| 213 | return payment; | 245 | return payment; |
| 214 | } | 246 | } |
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInService.java
| @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInDO; | @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInDO; | ||
| 7 | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInItemDO; | 7 | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInItemDO; |
| 8 | import jakarta.validation.Valid; | 8 | import jakarta.validation.Valid; |
| 9 | 9 | ||
| 10 | +import java.math.BigDecimal; | ||
| 10 | import java.util.Collection; | 11 | import java.util.Collection; |
| 11 | import java.util.List; | 12 | import java.util.List; |
| 12 | 13 | ||
| @@ -41,6 +42,14 @@ public interface ErpPurchaseInService { | @@ -41,6 +42,14 @@ public interface ErpPurchaseInService { | ||
| 41 | void updatePurchaseInStatus(Long id, Integer status); | 42 | void updatePurchaseInStatus(Long id, Integer status); |
| 42 | 43 | ||
| 43 | /** | 44 | /** |
| 45 | + * 更新采购入库的付款金额 | ||
| 46 | + * | ||
| 47 | + * @param id 编号 | ||
| 48 | + * @param paymentPrice 付款金额 | ||
| 49 | + */ | ||
| 50 | + void updatePurchaseInPaymentPrice(Long id, BigDecimal paymentPrice); | ||
| 51 | + | ||
| 52 | + /** | ||
| 44 | * 删除采购入库 | 53 | * 删除采购入库 |
| 45 | * | 54 | * |
| 46 | * @param ids 编号数组 | 55 | * @param ids 编号数组 |
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInServiceImpl.java
| @@ -163,7 +163,10 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { | @@ -163,7 +163,10 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { | ||
| 163 | if (purchaseIn.getStatus().equals(status)) { | 163 | if (purchaseIn.getStatus().equals(status)) { |
| 164 | throw exception(approve ? PURCHASE_IN_APPROVE_FAIL : PURCHASE_IN_PROCESS_FAIL); | 164 | throw exception(approve ? PURCHASE_IN_APPROVE_FAIL : PURCHASE_IN_PROCESS_FAIL); |
| 165 | } | 165 | } |
| 166 | - // TODO 芋艿:稍后加下校验 | 166 | + // 1.3 校验已付款 |
| 167 | + if (approve && purchaseIn.getPaymentPrice().compareTo(BigDecimal.ZERO) > 0) { | ||
| 168 | + throw exception(PURCHASE_IN_PROCESS_FAIL_EXISTS_PAYMENT); | ||
| 169 | + } | ||
| 167 | 170 | ||
| 168 | // 2. 更新状态 | 171 | // 2. 更新状态 |
| 169 | int updateCount = purchaseInMapper.updateByIdAndStatus(id, purchaseIn.getStatus(), | 172 | int updateCount = purchaseInMapper.updateByIdAndStatus(id, purchaseIn.getStatus(), |
| @@ -184,6 +187,18 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { | @@ -184,6 +187,18 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { | ||
| 184 | }); | 187 | }); |
| 185 | } | 188 | } |
| 186 | 189 | ||
| 190 | + @Override | ||
| 191 | + public void updatePurchaseInPaymentPrice(Long id, BigDecimal paymentPrice) { | ||
| 192 | + ErpPurchaseInDO purchaseIn = purchaseInMapper.selectById(id); | ||
| 193 | + if (purchaseIn.getPaymentPrice().equals(paymentPrice)) { | ||
| 194 | + return; | ||
| 195 | + } | ||
| 196 | + if (paymentPrice.compareTo(purchaseIn.getTotalPrice()) > 0) { | ||
| 197 | + throw exception(PURCHASE_IN_FAIL_PAYMENT_PRICE_EXCEED, purchaseIn.getTotalPrice(), paymentPrice); | ||
| 198 | + } | ||
| 199 | + purchaseInMapper.updateById(new ErpPurchaseInDO().setId(id).setPaymentPrice(paymentPrice)); | ||
| 200 | + } | ||
| 201 | + | ||
| 187 | private List<ErpPurchaseInItemDO> validatePurchaseInItems(List<ErpPurchaseInSaveReqVO.Item> list) { | 202 | private List<ErpPurchaseInItemDO> validatePurchaseInItems(List<ErpPurchaseInSaveReqVO.Item> list) { |
| 188 | // 1. 校验产品存在 | 203 | // 1. 校验产品存在 |
| 189 | List<ErpProductDO> productList = productService.validProductList( | 204 | List<ErpProductDO> productList = productService.validProductList( |
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseReturnService.java
| @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseReturnDO; | @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseReturnDO; | ||
| 7 | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseReturnItemDO; | 7 | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseReturnItemDO; |
| 8 | import jakarta.validation.Valid; | 8 | import jakarta.validation.Valid; |
| 9 | 9 | ||
| 10 | +import java.math.BigDecimal; | ||
| 10 | import java.util.Collection; | 11 | import java.util.Collection; |
| 11 | import java.util.List; | 12 | import java.util.List; |
| 12 | 13 | ||
| @@ -41,6 +42,14 @@ public interface ErpPurchaseReturnService { | @@ -41,6 +42,14 @@ public interface ErpPurchaseReturnService { | ||
| 41 | void updatePurchaseReturnStatus(Long id, Integer status); | 42 | void updatePurchaseReturnStatus(Long id, Integer status); |
| 42 | 43 | ||
| 43 | /** | 44 | /** |
| 45 | + * 更新采购退货的退款金额 | ||
| 46 | + * | ||
| 47 | + * @param id 编号 | ||
| 48 | + * @param refundPrice 退款金额 | ||
| 49 | + */ | ||
| 50 | + void updatePurchaseReturnRefundPrice(Long id, BigDecimal refundPrice); | ||
| 51 | + | ||
| 52 | + /** | ||
| 44 | * 删除采购退货 | 53 | * 删除采购退货 |
| 45 | * | 54 | * |
| 46 | * @param ids 编号数组 | 55 | * @param ids 编号数组 |
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseReturnServiceImpl.java
| @@ -159,7 +159,10 @@ public class ErpPurchaseReturnServiceImpl implements ErpPurchaseReturnService { | @@ -159,7 +159,10 @@ public class ErpPurchaseReturnServiceImpl implements ErpPurchaseReturnService { | ||
| 159 | if (purchaseReturn.getStatus().equals(status)) { | 159 | if (purchaseReturn.getStatus().equals(status)) { |
| 160 | throw exception(approve ? PURCHASE_RETURN_APPROVE_FAIL : PURCHASE_RETURN_PROCESS_FAIL); | 160 | throw exception(approve ? PURCHASE_RETURN_APPROVE_FAIL : PURCHASE_RETURN_PROCESS_FAIL); |
| 161 | } | 161 | } |
| 162 | - // TODO 芋艿:稍后加下校验 | 162 | + // 1.3 校验已退款 |
| 163 | + if (approve && purchaseReturn.getRefundPrice().compareTo(BigDecimal.ZERO) > 0) { | ||
| 164 | + throw exception(PURCHASE_RETURN_PROCESS_FAIL_EXISTS_REFUND); | ||
| 165 | + } | ||
| 163 | 166 | ||
| 164 | // 2. 更新状态 | 167 | // 2. 更新状态 |
| 165 | int updateCount = purchaseReturnMapper.updateByIdAndStatus(id, purchaseReturn.getStatus(), | 168 | int updateCount = purchaseReturnMapper.updateByIdAndStatus(id, purchaseReturn.getStatus(), |
| @@ -180,6 +183,18 @@ public class ErpPurchaseReturnServiceImpl implements ErpPurchaseReturnService { | @@ -180,6 +183,18 @@ public class ErpPurchaseReturnServiceImpl implements ErpPurchaseReturnService { | ||
| 180 | }); | 183 | }); |
| 181 | } | 184 | } |
| 182 | 185 | ||
| 186 | + @Override | ||
| 187 | + public void updatePurchaseReturnRefundPrice(Long id, BigDecimal refundPrice) { | ||
| 188 | + ErpPurchaseReturnDO purchaseReturn = purchaseReturnMapper.selectById(id); | ||
| 189 | + if (purchaseReturn.getRefundPrice().equals(refundPrice)) { | ||
| 190 | + return; | ||
| 191 | + } | ||
| 192 | + if (refundPrice.compareTo(purchaseReturn.getTotalPrice()) > 0) { | ||
| 193 | + throw exception(PURCHASE_RETURN_FAIL_REFUND_PRICE_EXCEED, purchaseReturn.getTotalPrice(), refundPrice); | ||
| 194 | + } | ||
| 195 | + purchaseReturnMapper.updateById(new ErpPurchaseReturnDO().setId(id).setRefundPrice(refundPrice)); | ||
| 196 | + } | ||
| 197 | + | ||
| 183 | private List<ErpPurchaseReturnItemDO> validatePurchaseReturnItems(List<ErpPurchaseReturnSaveReqVO.Item> list) { | 198 | private List<ErpPurchaseReturnItemDO> validatePurchaseReturnItems(List<ErpPurchaseReturnSaveReqVO.Item> list) { |
| 184 | // 1. 校验产品存在 | 199 | // 1. 校验产品存在 |
| 185 | List<ErpProductDO> productList = productService.validProductList( | 200 | List<ErpProductDO> productList = productService.validProductList( |