Commit 0d551a440850fae4f61de062a56ef5411e1b43f5

Authored by YunaiV
1 parent 2d43c1f9

✨ ERP:初始化 payment 付款单的逻辑 30%

Showing 44 changed files with 1063 additions and 702 deletions
yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java
@@ -33,6 +33,7 @@ ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_00 @@ -33,6 +33,7 @@ ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_00
33 ErrorCode PURCHASE_IN_APPROVE_FAIL = new ErrorCode(1_030_102_003, "审核失败,只有未审核的入库单才能审核"); 33 ErrorCode PURCHASE_IN_APPROVE_FAIL = new ErrorCode(1_030_102_003, "审核失败,只有未审核的入库单才能审核");
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 37
37 // ========== ERP 采购退货(1-030-103-000) ========== 38 // ========== ERP 采购退货(1-030-103-000) ==========
38 ErrorCode PURCHASE_RETURN_NOT_EXISTS = new ErrorCode(1_030_103_000, "采购退货单不存在"); 39 ErrorCode PURCHASE_RETURN_NOT_EXISTS = new ErrorCode(1_030_103_000, "采购退货单不存在");
@@ -41,6 +42,7 @@ ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_00 @@ -41,6 +42,7 @@ ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_00
41 ErrorCode PURCHASE_RETURN_APPROVE_FAIL = new ErrorCode(1_030_103_003, "审核失败,只有未审核的退货单才能审核"); 42 ErrorCode PURCHASE_RETURN_APPROVE_FAIL = new ErrorCode(1_030_103_003, "审核失败,只有未审核的退货单才能审核");
42 ErrorCode PURCHASE_RETURN_NO_EXISTS = new ErrorCode(1_030_103_004, "生成退货单失败,请重新提交"); 43 ErrorCode PURCHASE_RETURN_NO_EXISTS = new ErrorCode(1_030_103_004, "生成退货单失败,请重新提交");
43 ErrorCode PURCHASE_RETURN_UPDATE_FAIL_APPROVE = new ErrorCode(1_030_103_005, "采购退货单({})已审核,无法修改"); 44 ErrorCode PURCHASE_RETURN_UPDATE_FAIL_APPROVE = new ErrorCode(1_030_103_005, "采购退货单({})已审核,无法修改");
  45 + ErrorCode PURCHASE_RETURN_NOT_APPROVE = new ErrorCode(1_030_103_006, "采购退货单未审核,无法操作");
44 46
45 // ========== ERP 客户(1-030-200-000)========== 47 // ========== ERP 客户(1-030-200-000)==========
46 ErrorCode CUSTOMER_NOT_EXISTS = new ErrorCode(1_020_200_000, "客户不存在"); 48 ErrorCode CUSTOMER_NOT_EXISTS = new ErrorCode(1_020_200_000, "客户不存在");
@@ -137,4 +139,11 @@ ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_00 @@ -137,4 +139,11 @@ ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_00
137 ErrorCode ACCOUNT_NOT_EXISTS = new ErrorCode(1_030_600_000, "结算账户不存在"); 139 ErrorCode ACCOUNT_NOT_EXISTS = new ErrorCode(1_030_600_000, "结算账户不存在");
138 ErrorCode ACCOUNT_NOT_ENABLE = new ErrorCode(1_030_600_001, "结算账户({})未启用"); 140 ErrorCode ACCOUNT_NOT_ENABLE = new ErrorCode(1_030_600_001, "结算账户({})未启用");
139 141
  142 + // ========== ERP 付款单 1-030-601-000 ==========
  143 + ErrorCode FINANCE_PAYMENT_NOT_EXISTS = new ErrorCode(1_030_601_000, "付款单不存在");
  144 + ErrorCode FINANCE_PAYMENT_DELETE_FAIL_APPROVE = new ErrorCode(1_030_601_001, "付款单({})已审核,无法删除");
  145 + ErrorCode FINANCE_PAYMENT_PROCESS_FAIL = new ErrorCode(1_030_601_002, "反审核失败,只有已审核的付款单才能反审核");
  146 + ErrorCode FINANCE_PAYMENT_APPROVE_FAIL = new ErrorCode(1_030_601_003, "审核失败,只有未审核的付款单才能审核");
  147 + ErrorCode FINANCE_PAYMENT_NO_EXISTS = new ErrorCode(1_030_601_004, "生成付款单号失败,请重新提交");
  148 +
140 } 149 }
yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/common/ErpBizTypeEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.erp.enums.common;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
  4 +import lombok.Getter;
  5 +import lombok.RequiredArgsConstructor;
  6 +
  7 +import java.util.Arrays;
  8 +
  9 +/**
  10 + * ERP 业务类型枚举
  11 + *
  12 + * @author HUIHUI
  13 + */
  14 +@RequiredArgsConstructor
  15 +@Getter
  16 +public enum ErpBizTypeEnum implements IntArrayValuable {
  17 +
  18 + PURCHASE_ORDER(10, "采购订单"),
  19 + PURCHASE_IN(11, "采购入库"),
  20 + PURCHASE_RETURN(12, "采购退货"),
  21 +
  22 + SALE_ORDER(20, "销售订单"),
  23 + SALE_OUT(21, "销售订单"),
  24 + SALE_RETURN(22, "销售退货"),
  25 + ;
  26 +
  27 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ErpBizTypeEnum::getType).toArray();
  28 +
  29 + /**
  30 + * 类型
  31 + */
  32 + private final Integer type;
  33 + /**
  34 + * 名称
  35 + */
  36 + private final String name;
  37 +
  38 + @Override
  39 + public int[] array() {
  40 + return ARRAYS;
  41 + }
  42 +
  43 +}
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/ErpAccountController.java
@@ -7,9 +7,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -7,9 +7,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
8 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; 8 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
9 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; 9 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
10 -import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.ErpAccountPageReqVO;  
11 -import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.ErpAccountRespVO;  
12 -import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.ErpAccountSaveReqVO; 10 +import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.account.ErpAccountPageReqVO;
  11 +import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.account.ErpAccountRespVO;
  12 +import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.account.ErpAccountSaveReqVO;
13 import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpAccountDO; 13 import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpAccountDO;
14 import cn.iocoder.yudao.module.erp.service.finance.ErpAccountService; 14 import cn.iocoder.yudao.module.erp.service.finance.ErpAccountService;
15 import io.swagger.v3.oas.annotations.Operation; 15 import io.swagger.v3.oas.annotations.Operation;
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/ErpFinancePaymentController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.erp.controller.admin.finance;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
  8 +import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
  9 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  10 +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  11 +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
  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;
  14 +import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentSaveReqVO;
  15 +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.purchase.ErpSupplierDO;
  18 +import cn.iocoder.yudao.module.erp.service.finance.ErpFinancePaymentService;
  19 +import cn.iocoder.yudao.module.erp.service.purchase.ErpSupplierService;
  20 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  21 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
  22 +import io.swagger.v3.oas.annotations.Operation;
  23 +import io.swagger.v3.oas.annotations.Parameter;
  24 +import io.swagger.v3.oas.annotations.tags.Tag;
  25 +import jakarta.annotation.Resource;
  26 +import jakarta.servlet.http.HttpServletResponse;
  27 +import jakarta.validation.Valid;
  28 +import org.springframework.security.access.prepost.PreAuthorize;
  29 +import org.springframework.validation.annotation.Validated;
  30 +import org.springframework.web.bind.annotation.*;
  31 +
  32 +import java.io.IOException;
  33 +import java.util.List;
  34 +import java.util.Map;
  35 +import java.util.stream.Stream;
  36 +
  37 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  38 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
  39 +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
  40 +
  41 +@Tag(name = "管理后台 - ERP 付款单")
  42 +@RestController
  43 +@RequestMapping("/erp/finance-payment")
  44 +@Validated
  45 +public class ErpFinancePaymentController {
  46 +
  47 + @Resource
  48 + private ErpFinancePaymentService financePaymentService;
  49 + @Resource
  50 + private ErpSupplierService supplierService;
  51 +
  52 + @Resource
  53 + private AdminUserApi adminUserApi;
  54 +
  55 + @PostMapping("/create")
  56 + @Operation(summary = "创建付款单")
  57 + @PreAuthorize("@ss.hasPermission('erp:finance-payment:create')")
  58 + public CommonResult<Long> createFinancePayment(@Valid @RequestBody ErpFinancePaymentSaveReqVO createReqVO) {
  59 + return success(financePaymentService.createFinancePayment(createReqVO));
  60 + }
  61 +
  62 + @PutMapping("/update")
  63 + @Operation(summary = "更新付款单")
  64 + @PreAuthorize("@ss.hasPermission('erp:finance-payment:update')")
  65 + public CommonResult<Boolean> updateFinancePayment(@Valid @RequestBody ErpFinancePaymentSaveReqVO updateReqVO) {
  66 + financePaymentService.updateFinancePayment(updateReqVO);
  67 + return success(true);
  68 + }
  69 +
  70 + @PutMapping("/update-status")
  71 + @Operation(summary = "更新付款单的状态")
  72 + @PreAuthorize("@ss.hasPermission('erp:finance-payment:update-status')")
  73 + public CommonResult<Boolean> updateFinancePaymentStatus(@RequestParam("id") Long id,
  74 + @RequestParam("status") Integer status) {
  75 + financePaymentService.updateFinancePaymentStatus(id, status);
  76 + return success(true);
  77 + }
  78 +
  79 + @DeleteMapping("/delete")
  80 + @Operation(summary = "删除付款单")
  81 + @Parameter(name = "ids", description = "编号数组", required = true)
  82 + @PreAuthorize("@ss.hasPermission('erp:finance-payment:delete')")
  83 + public CommonResult<Boolean> deleteFinancePayment(@RequestParam("ids") List<Long> ids) {
  84 + financePaymentService.deleteFinancePayment(ids);
  85 + return success(true);
  86 + }
  87 +
  88 + @GetMapping("/get")
  89 + @Operation(summary = "获得付款单")
  90 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  91 + @PreAuthorize("@ss.hasPermission('erp:finance-payment:query')")
  92 + public CommonResult<ErpFinancePaymentRespVO> getFinancePayment(@RequestParam("id") Long id) {
  93 + ErpFinancePaymentDO payment = financePaymentService.getFinancePayment(id);
  94 + if (payment == null) {
  95 + return success(null);
  96 + }
  97 + List<ErpFinancePaymentItemDO> paymentItemList = financePaymentService.getFinancePaymentItemListByPaymentId(id);
  98 + return success(BeanUtils.toBean(payment, ErpFinancePaymentRespVO.class, financePaymentVO ->
  99 + financePaymentVO.setItems(BeanUtils.toBean(paymentItemList, ErpFinancePaymentRespVO.Item.class))));
  100 + }
  101 +
  102 + @GetMapping("/page")
  103 + @Operation(summary = "获得付款单分页")
  104 + @PreAuthorize("@ss.hasPermission('erp:finance-payment:query')")
  105 + public CommonResult<PageResult<ErpFinancePaymentRespVO>> getFinancePaymentPage(@Valid ErpFinancePaymentPageReqVO pageReqVO) {
  106 + PageResult<ErpFinancePaymentDO> pageResult = financePaymentService.getFinancePaymentPage(pageReqVO);
  107 + return success(buildFinancePaymentVOPageResult(pageResult));
  108 + }
  109 +
  110 + @GetMapping("/export-excel")
  111 + @Operation(summary = "导出付款单 Excel")
  112 + @PreAuthorize("@ss.hasPermission('erp:finance-payment:export')")
  113 + @OperateLog(type = EXPORT)
  114 + public void exportFinancePaymentExcel(@Valid ErpFinancePaymentPageReqVO pageReqVO,
  115 + HttpServletResponse response) throws IOException {
  116 + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
  117 + List<ErpFinancePaymentRespVO> list = buildFinancePaymentVOPageResult(financePaymentService.getFinancePaymentPage(pageReqVO)).getList();
  118 + // 导出 Excel
  119 + ExcelUtils.write(response, "付款单.xls", "数据", ErpFinancePaymentRespVO.class, list);
  120 + }
  121 +
  122 + private PageResult<ErpFinancePaymentRespVO> buildFinancePaymentVOPageResult(PageResult<ErpFinancePaymentDO> pageResult) {
  123 + if (CollUtil.isEmpty(pageResult.getList())) {
  124 + return PageResult.empty(pageResult.getTotal());
  125 + }
  126 + // 1.1 付款项
  127 + List<ErpFinancePaymentItemDO> paymentItemList = financePaymentService.getFinancePaymentItemListByPaymentIds(
  128 + convertSet(pageResult.getList(), ErpFinancePaymentDO::getId));
  129 + Map<Long, List<ErpFinancePaymentItemDO>> financePaymentItemMap = convertMultiMap(paymentItemList, ErpFinancePaymentItemDO::getPaymentId);
  130 + // 1.2 供应商信息
  131 + Map<Long, ErpSupplierDO> supplierMap = supplierService.getSupplierMap(
  132 + convertSet(pageResult.getList(), ErpFinancePaymentDO::getSupplierId));
  133 + // 1.3 管理员信息
  134 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(pageResult.getList(),
  135 + contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getFinanceUserId())));
  136 + // 2. 开始拼接
  137 + return BeanUtils.toBean(pageResult, ErpFinancePaymentRespVO.class, payment -> {
  138 + payment.setItems(BeanUtils.toBean(financePaymentItemMap.get(payment.getId()), ErpFinancePaymentRespVO.Item.class));
  139 + MapUtils.findAndThen(supplierMap, payment.getSupplierId(), supplier -> payment.setSupplierName(supplier.getName()));
  140 + MapUtils.findAndThen(userMap, Long.parseLong(payment.getCreator()), user -> payment.setCreatorName(user.getNickname()));
  141 + MapUtils.findAndThen(userMap, payment.getFinanceUserId(), user -> payment.setFinanceUserName(user.getNickname()));
  142 + });
  143 + }
  144 +
  145 +}
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/ErpAccountPageReqVO.java renamed to yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/account/ErpAccountPageReqVO.java
1 -package cn.iocoder.yudao.module.erp.controller.admin.finance.vo; 1 +package cn.iocoder.yudao.module.erp.controller.admin.finance.vo.account;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/ErpAccountRespVO.java renamed to yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/account/ErpAccountRespVO.java
1 -package cn.iocoder.yudao.module.erp.controller.admin.finance.vo; 1 +package cn.iocoder.yudao.module.erp.controller.admin.finance.vo.account;
2 2
3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 import cn.iocoder.yudao.module.system.enums.DictTypeConstants; 4 import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/ErpAccountSaveReqVO.java renamed to yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/account/ErpAccountSaveReqVO.java
1 -package cn.iocoder.yudao.module.erp.controller.admin.finance.vo; 1 +package cn.iocoder.yudao.module.erp.controller.admin.finance.vo.account;
2 2
3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 import cn.iocoder.yudao.framework.common.validation.InEnum; 4 import cn.iocoder.yudao.framework.common.validation.InEnum;
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/payment/ErpFinancePaymentPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +import org.springframework.format.annotation.DateTimeFormat;
  9 +
  10 +import java.time.LocalDateTime;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  13 +
  14 +@Schema(description = "管理后台 - ERP 付款单分页 Request VO")
  15 +@Data
  16 +@EqualsAndHashCode(callSuper = true)
  17 +@ToString(callSuper = true)
  18 +public class ErpFinancePaymentPageReqVO extends PageParam {
  19 +
  20 + @Schema(description = "采购单编号", example = "XS001")
  21 + private String no;
  22 +
  23 + @Schema(description = "付款时间")
  24 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  25 + private LocalDateTime[] paymentTime;
  26 +
  27 + @Schema(description = "供应商编号", example = "1724")
  28 + private Long supplierId;
  29 +
  30 + @Schema(description = "创建者", example = "666")
  31 + private String creator;
  32 +
  33 + @Schema(description = "财务人员编号", example = "888")
  34 + private String financeUserId;
  35 +
  36 + @Schema(description = "结算账户编号", example = "31189")
  37 + private Long accountId;
  38 +
  39 + @Schema(description = "付款状态", example = "2")
  40 + private Integer status;
  41 +
  42 + @Schema(description = "备注", example = "你猜")
  43 + private String remark;
  44 +
  45 + @Schema(description = "业务编号", example = "123")
  46 + private String bizNo;
  47 +
  48 +}
0 \ No newline at end of file 49 \ No newline at end of file
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/payment/ErpFinancePaymentRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment;
  2 +
  3 +import com.alibaba.excel.annotation.ExcelProperty;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import jakarta.validation.constraints.NotNull;
  6 +import lombok.Data;
  7 +
  8 +import java.math.BigDecimal;
  9 +import java.time.LocalDateTime;
  10 +import java.util.List;
  11 +
  12 +@Schema(description = "管理后台 - ERP 付款单 Response VO")
  13 +@Data
  14 +public class ErpFinancePaymentRespVO {
  15 +
  16 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23752")
  17 + private Long id;
  18 +
  19 + @Schema(description = "付款单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "FKD888")
  20 + private String no;
  21 +
  22 + @Schema(description = "付款状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  23 + private Integer status;
  24 +
  25 + @Schema(description = "付款时间", requiredMode = Schema.RequiredMode.REQUIRED)
  26 + private LocalDateTime paymentTime;
  27 +
  28 + @Schema(description = "财务人员编号", example = "19690")
  29 + private Long financeUserId;
  30 + @Schema(description = "财务人员名称", example = "张三")
  31 + private String financeUserName;
  32 +
  33 + @Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "29399")
  34 + private Long supplierId;
  35 + @Schema(description = "供应商名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小番茄公司")
  36 + private String supplierName;
  37 +
  38 + @Schema(description = "付款账户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "28989")
  39 + private Long accountId;
  40 +
  41 + @Schema(description = "合计价格,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "13832")
  42 + private BigDecimal totalPrice;
  43 +
  44 + @Schema(description = "优惠金额,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "11600")
  45 + private BigDecimal discountPrice;
  46 +
  47 + @Schema(description = "实际价格,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000")
  48 + private BigDecimal paymentPrice;
  49 +
  50 + @Schema(description = "备注", example = "你猜")
  51 + private String remark;
  52 +
  53 + @Schema(description = "创建人", example = "芋道")
  54 + private String creator;
  55 + @Schema(description = "创建人名称", example = "芋道")
  56 + private String creatorName;
  57 +
  58 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  59 + @ExcelProperty("创建时间")
  60 + private LocalDateTime createTime;
  61 +
  62 + @Schema(description = "付款项列表", requiredMode = Schema.RequiredMode.REQUIRED)
  63 + private List<Item> items;
  64 +
  65 + @Data
  66 + public static class Item {
  67 +
  68 + @Schema(description = "付款项编号", example = "11756")
  69 + private Long id;
  70 +
  71 + @Schema(description = "业务类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  72 + private Integer bizType;
  73 +
  74 + @Schema(description = "业务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11756")
  75 + private Long bizId;
  76 +
  77 + @Schema(description = "业务单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11756")
  78 + private String bizNo;
  79 +
  80 + @Schema(description = "应付欠款,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000")
  81 + private BigDecimal totalPrice;
  82 +
  83 + @Schema(description = "已付欠款,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000")
  84 + private BigDecimal paidPrice;
  85 +
  86 + @Schema(description = "本次付款,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000")
  87 + @NotNull(message = "本次付款不能为空")
  88 + private BigDecimal paymentPrice;
  89 +
  90 + @Schema(description = "备注", example = "随便")
  91 + private String remark;
  92 +
  93 + }
  94 +
  95 +}
0 \ No newline at end of file 96 \ No newline at end of file
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/payment/ErpFinancePaymentSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.Valid;
  5 +import jakarta.validation.constraints.NotEmpty;
  6 +import jakarta.validation.constraints.NotNull;
  7 +import lombok.Data;
  8 +
  9 +import java.math.BigDecimal;
  10 +import java.time.LocalDateTime;
  11 +import java.util.List;
  12 +
  13 +@Schema(description = "管理后台 - ERP 付款单新增/修改 Request VO")
  14 +@Data
  15 +public class ErpFinancePaymentSaveReqVO {
  16 +
  17 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23752")
  18 + private Long id;
  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)
  25 + @NotNull(message = "付款时间不能为空")
  26 + private LocalDateTime paymentTime;
  27 +
  28 + @Schema(description = "财务人员编号", example = "19690")
  29 + private Long financeUserId;
  30 +
  31 + @Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "29399")
  32 + @NotNull(message = "供应商编号不能为空")
  33 + private Long supplierId;
  34 +
  35 + @Schema(description = "付款账户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "28989")
  36 + @NotNull(message = "付款账户编号不能为空")
  37 + private Long accountId;
  38 +
  39 + @Schema(description = "优惠金额,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "11600")
  40 + @NotNull(message = "优惠金额不能为空")
  41 + private BigDecimal discountPrice;
  42 +
  43 + @Schema(description = "备注", example = "你猜")
  44 + private String remark;
  45 +
  46 + @Schema(description = "付款项列表", requiredMode = Schema.RequiredMode.REQUIRED)
  47 + @NotEmpty(message = "付款项列表不能为空")
  48 + @Valid
  49 + private List<Item> items;
  50 +
  51 + @Data
  52 + public static class Item {
  53 +
  54 + @Schema(description = "付款项编号", example = "11756")
  55 + private Long id;
  56 +
  57 + @Schema(description = "业务类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  58 + @NotNull(message = "业务类型不能为空")
  59 + private Integer bizType;
  60 +
  61 + @Schema(description = "业务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11756")
  62 + @NotNull(message = "业务编号不能为空")
  63 + private Long bizId;
  64 +
  65 + @Schema(description = "已付欠款,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000")
  66 + @NotNull(message = "已付欠款不能为空")
  67 + private BigDecimal paidPrice;
  68 +
  69 + @Schema(description = "本次付款,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000")
  70 + @NotNull(message = "本次付款不能为空")
  71 + private BigDecimal paymentPrice;
  72 +
  73 + @Schema(description = "备注", example = "随便")
  74 + private String remark;
  75 +
  76 + }
  77 +
  78 +}
0 \ No newline at end of file 79 \ No newline at end of file
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseInController.java
@@ -138,7 +138,7 @@ public class ErpPurchaseInController { @@ -138,7 +138,7 @@ public class ErpPurchaseInController {
138 if (CollUtil.isEmpty(pageResult.getList())) { 138 if (CollUtil.isEmpty(pageResult.getList())) {
139 return PageResult.empty(pageResult.getTotal()); 139 return PageResult.empty(pageResult.getTotal());
140 } 140 }
141 - // 1.1 出库项 141 + // 1.1 入库项
142 List<ErpPurchaseInItemDO> purchaseInItemList = purchaseInService.getPurchaseInItemListByInIds( 142 List<ErpPurchaseInItemDO> purchaseInItemList = purchaseInService.getPurchaseInItemListByInIds(
143 convertSet(pageResult.getList(), ErpPurchaseInDO::getId)); 143 convertSet(pageResult.getList(), ErpPurchaseInDO::getId));
144 Map<Long, List<ErpPurchaseInItemDO>> purchaseInItemMap = convertMultiMap(purchaseInItemList, ErpPurchaseInItemDO::getInId); 144 Map<Long, List<ErpPurchaseInItemDO>> purchaseInItemMap = convertMultiMap(purchaseInItemList, ErpPurchaseInItemDO::getInId);
@@ -150,7 +150,7 @@ public class ErpPurchaseInController { @@ -150,7 +150,7 @@ public class ErpPurchaseInController {
150 convertSet(pageResult.getList(), ErpPurchaseInDO::getSupplierId)); 150 convertSet(pageResult.getList(), ErpPurchaseInDO::getSupplierId));
151 // 1.4 管理员信息 151 // 1.4 管理员信息
152 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( 152 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
153 - convertSet(pageResult.getList(), erpStockRecordDO -> Long.parseLong(erpStockRecordDO.getCreator()))); 153 + convertSet(pageResult.getList(), purchaseIn -> Long.parseLong(purchaseIn.getCreator())));
154 // 2. 开始拼接 154 // 2. 开始拼接
155 return BeanUtils.toBean(pageResult, ErpPurchaseInRespVO.class, purchaseIn -> { 155 return BeanUtils.toBean(pageResult, ErpPurchaseInRespVO.class, purchaseIn -> {
156 purchaseIn.setItems(BeanUtils.toBean(purchaseInItemMap.get(purchaseIn.getId()), ErpPurchaseInRespVO.Item.class, 156 purchaseIn.setItems(BeanUtils.toBean(purchaseInItemMap.get(purchaseIn.getId()), ErpPurchaseInRespVO.Item.class,
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseOrderController.java
@@ -41,7 +41,6 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. @@ -41,7 +41,6 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
41 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; 41 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
42 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; 42 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
43 43
44 -  
45 @Tag(name = "管理后台 - ERP 采购订单") 44 @Tag(name = "管理后台 - ERP 采购订单")
46 @RestController 45 @RestController
47 @RequestMapping("/erp/purchase-order") 46 @RequestMapping("/erp/purchase-order")
@@ -62,14 +61,14 @@ public class ErpPurchaseOrderController { @@ -62,14 +61,14 @@ public class ErpPurchaseOrderController {
62 61
63 @PostMapping("/create") 62 @PostMapping("/create")
64 @Operation(summary = "创建采购订单") 63 @Operation(summary = "创建采购订单")
65 - @PreAuthorize("@ss.hasPermission('erp:purchase-out:create')") 64 + @PreAuthorize("@ss.hasPermission('erp:purchase-create:create')")
66 public CommonResult<Long> createPurchaseOrder(@Valid @RequestBody ErpPurchaseOrderSaveReqVO createReqVO) { 65 public CommonResult<Long> createPurchaseOrder(@Valid @RequestBody ErpPurchaseOrderSaveReqVO createReqVO) {
67 return success(purchaseOrderService.createPurchaseOrder(createReqVO)); 66 return success(purchaseOrderService.createPurchaseOrder(createReqVO));
68 } 67 }
69 68
70 @PutMapping("/update") 69 @PutMapping("/update")
71 @Operation(summary = "更新采购订单") 70 @Operation(summary = "更新采购订单")
72 - @PreAuthorize("@ss.hasPermission('erp:purchase-out:update')") 71 + @PreAuthorize("@ss.hasPermission('erp:purchase-create:update')")
73 public CommonResult<Boolean> updatePurchaseOrder(@Valid @RequestBody ErpPurchaseOrderSaveReqVO updateReqVO) { 72 public CommonResult<Boolean> updatePurchaseOrder(@Valid @RequestBody ErpPurchaseOrderSaveReqVO updateReqVO) {
74 purchaseOrderService.updatePurchaseOrder(updateReqVO); 73 purchaseOrderService.updatePurchaseOrder(updateReqVO);
75 return success(true); 74 return success(true);
@@ -77,7 +76,7 @@ public class ErpPurchaseOrderController { @@ -77,7 +76,7 @@ public class ErpPurchaseOrderController {
77 76
78 @PutMapping("/update-status") 77 @PutMapping("/update-status")
79 @Operation(summary = "更新采购订单的状态") 78 @Operation(summary = "更新采购订单的状态")
80 - @PreAuthorize("@ss.hasPermission('erp:purchase-out:update-status')") 79 + @PreAuthorize("@ss.hasPermission('erp:purchase-create:update-status')")
81 public CommonResult<Boolean> updatePurchaseOrderStatus(@RequestParam("id") Long id, 80 public CommonResult<Boolean> updatePurchaseOrderStatus(@RequestParam("id") Long id,
82 @RequestParam("status") Integer status) { 81 @RequestParam("status") Integer status) {
83 purchaseOrderService.updatePurchaseOrderStatus(id, status); 82 purchaseOrderService.updatePurchaseOrderStatus(id, status);
@@ -87,7 +86,7 @@ public class ErpPurchaseOrderController { @@ -87,7 +86,7 @@ public class ErpPurchaseOrderController {
87 @DeleteMapping("/delete") 86 @DeleteMapping("/delete")
88 @Operation(summary = "删除采购订单") 87 @Operation(summary = "删除采购订单")
89 @Parameter(name = "ids", description = "编号数组", required = true) 88 @Parameter(name = "ids", description = "编号数组", required = true)
90 - @PreAuthorize("@ss.hasPermission('erp:purchase-out:delete')") 89 + @PreAuthorize("@ss.hasPermission('erp:purchase-create:delete')")
91 public CommonResult<Boolean> deletePurchaseOrder(@RequestParam("ids") List<Long> ids) { 90 public CommonResult<Boolean> deletePurchaseOrder(@RequestParam("ids") List<Long> ids) {
92 purchaseOrderService.deletePurchaseOrder(ids); 91 purchaseOrderService.deletePurchaseOrder(ids);
93 return success(true); 92 return success(true);
@@ -96,7 +95,7 @@ public class ErpPurchaseOrderController { @@ -96,7 +95,7 @@ public class ErpPurchaseOrderController {
96 @GetMapping("/get") 95 @GetMapping("/get")
97 @Operation(summary = "获得采购订单") 96 @Operation(summary = "获得采购订单")
98 @Parameter(name = "id", description = "编号", required = true, example = "1024") 97 @Parameter(name = "id", description = "编号", required = true, example = "1024")
99 - @PreAuthorize("@ss.hasPermission('erp:purchase-out:query')") 98 + @PreAuthorize("@ss.hasPermission('erp:purchase-create:query')")
100 public CommonResult<ErpPurchaseOrderRespVO> getPurchaseOrder(@RequestParam("id") Long id) { 99 public CommonResult<ErpPurchaseOrderRespVO> getPurchaseOrder(@RequestParam("id") Long id) {
101 ErpPurchaseOrderDO purchaseOrder = purchaseOrderService.getPurchaseOrder(id); 100 ErpPurchaseOrderDO purchaseOrder = purchaseOrderService.getPurchaseOrder(id);
102 if (purchaseOrder == null) { 101 if (purchaseOrder == null) {
@@ -116,7 +115,7 @@ public class ErpPurchaseOrderController { @@ -116,7 +115,7 @@ public class ErpPurchaseOrderController {
116 115
117 @GetMapping("/page") 116 @GetMapping("/page")
118 @Operation(summary = "获得采购订单分页") 117 @Operation(summary = "获得采购订单分页")
119 - @PreAuthorize("@ss.hasPermission('erp:purchase-out:query')") 118 + @PreAuthorize("@ss.hasPermission('erp:purchase-create:query')")
120 public CommonResult<PageResult<ErpPurchaseOrderRespVO>> getPurchaseOrderPage(@Valid ErpPurchaseOrderPageReqVO pageReqVO) { 119 public CommonResult<PageResult<ErpPurchaseOrderRespVO>> getPurchaseOrderPage(@Valid ErpPurchaseOrderPageReqVO pageReqVO) {
121 PageResult<ErpPurchaseOrderDO> pageResult = purchaseOrderService.getPurchaseOrderPage(pageReqVO); 120 PageResult<ErpPurchaseOrderDO> pageResult = purchaseOrderService.getPurchaseOrderPage(pageReqVO);
122 return success(buildPurchaseOrderVOPageResult(pageResult)); 121 return success(buildPurchaseOrderVOPageResult(pageResult));
@@ -124,7 +123,7 @@ public class ErpPurchaseOrderController { @@ -124,7 +123,7 @@ public class ErpPurchaseOrderController {
124 123
125 @GetMapping("/export-excel") 124 @GetMapping("/export-excel")
126 @Operation(summary = "导出采购订单 Excel") 125 @Operation(summary = "导出采购订单 Excel")
127 - @PreAuthorize("@ss.hasPermission('erp:purchase-out:export')") 126 + @PreAuthorize("@ss.hasPermission('erp:purchase-create:export')")
128 @OperateLog(type = EXPORT) 127 @OperateLog(type = EXPORT)
129 public void exportPurchaseOrderExcel(@Valid ErpPurchaseOrderPageReqVO pageReqVO, 128 public void exportPurchaseOrderExcel(@Valid ErpPurchaseOrderPageReqVO pageReqVO,
130 HttpServletResponse response) throws IOException { 129 HttpServletResponse response) throws IOException {
@@ -138,7 +137,7 @@ public class ErpPurchaseOrderController { @@ -138,7 +137,7 @@ public class ErpPurchaseOrderController {
138 if (CollUtil.isEmpty(pageResult.getList())) { 137 if (CollUtil.isEmpty(pageResult.getList())) {
139 return PageResult.empty(pageResult.getTotal()); 138 return PageResult.empty(pageResult.getTotal());
140 } 139 }
141 - // 1.1 出库项 140 + // 1.1 订单项
142 List<ErpPurchaseOrderItemDO> purchaseOrderItemList = purchaseOrderService.getPurchaseOrderItemListByOrderIds( 141 List<ErpPurchaseOrderItemDO> purchaseOrderItemList = purchaseOrderService.getPurchaseOrderItemListByOrderIds(
143 convertSet(pageResult.getList(), ErpPurchaseOrderDO::getId)); 142 convertSet(pageResult.getList(), ErpPurchaseOrderDO::getId));
144 Map<Long, List<ErpPurchaseOrderItemDO>> purchaseOrderItemMap = convertMultiMap(purchaseOrderItemList, ErpPurchaseOrderItemDO::getOrderId); 143 Map<Long, List<ErpPurchaseOrderItemDO>> purchaseOrderItemMap = convertMultiMap(purchaseOrderItemList, ErpPurchaseOrderItemDO::getOrderId);
@@ -150,7 +149,7 @@ public class ErpPurchaseOrderController { @@ -150,7 +149,7 @@ public class ErpPurchaseOrderController {
150 convertSet(pageResult.getList(), ErpPurchaseOrderDO::getSupplierId)); 149 convertSet(pageResult.getList(), ErpPurchaseOrderDO::getSupplierId));
151 // 1.4 管理员信息 150 // 1.4 管理员信息
152 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( 151 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
153 - convertSet(pageResult.getList(), erpStockRecordDO -> Long.parseLong(erpStockRecordDO.getCreator()))); 152 + convertSet(pageResult.getList(), purchaseOrder -> Long.parseLong(purchaseOrder.getCreator())));
154 // 2. 开始拼接 153 // 2. 开始拼接
155 return BeanUtils.toBean(pageResult, ErpPurchaseOrderRespVO.class, purchaseOrder -> { 154 return BeanUtils.toBean(pageResult, ErpPurchaseOrderRespVO.class, purchaseOrder -> {
156 purchaseOrder.setItems(BeanUtils.toBean(purchaseOrderItemMap.get(purchaseOrder.getId()), ErpPurchaseOrderRespVO.Item.class, 155 purchaseOrder.setItems(BeanUtils.toBean(purchaseOrderItemMap.get(purchaseOrder.getId()), ErpPurchaseOrderRespVO.Item.class,
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseReturnController.java
@@ -150,7 +150,7 @@ public class ErpPurchaseReturnController { @@ -150,7 +150,7 @@ public class ErpPurchaseReturnController {
150 convertSet(pageResult.getList(), ErpPurchaseReturnDO::getSupplierId)); 150 convertSet(pageResult.getList(), ErpPurchaseReturnDO::getSupplierId));
151 // 1.4 管理员信息 151 // 1.4 管理员信息
152 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( 152 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
153 - convertSet(pageResult.getList(), erpStockRecordDO -> Long.parseLong(erpStockRecordDO.getCreator()))); 153 + convertSet(pageResult.getList(), purchaseReturn -> Long.parseLong(purchaseReturn.getCreator())));
154 // 2. 开始拼接 154 // 2. 开始拼接
155 return BeanUtils.toBean(pageResult, ErpPurchaseReturnRespVO.class, purchaseReturn -> { 155 return BeanUtils.toBean(pageResult, ErpPurchaseReturnRespVO.class, purchaseReturn -> {
156 purchaseReturn.setItems(BeanUtils.toBean(purchaseReturnItemMap.get(purchaseReturn.getId()), ErpPurchaseReturnRespVO.Item.class, 156 purchaseReturn.setItems(BeanUtils.toBean(purchaseReturnItemMap.get(purchaseReturn.getId()), ErpPurchaseReturnRespVO.Item.class,
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleOrderController.java
@@ -138,7 +138,7 @@ public class ErpSaleOrderController { @@ -138,7 +138,7 @@ public class ErpSaleOrderController {
138 if (CollUtil.isEmpty(pageResult.getList())) { 138 if (CollUtil.isEmpty(pageResult.getList())) {
139 return PageResult.empty(pageResult.getTotal()); 139 return PageResult.empty(pageResult.getTotal());
140 } 140 }
141 - // 1.1 出库项 141 + // 1.1 订单项
142 List<ErpSaleOrderItemDO> saleOrderItemList = saleOrderService.getSaleOrderItemListByOrderIds( 142 List<ErpSaleOrderItemDO> saleOrderItemList = saleOrderService.getSaleOrderItemListByOrderIds(
143 convertSet(pageResult.getList(), ErpSaleOrderDO::getId)); 143 convertSet(pageResult.getList(), ErpSaleOrderDO::getId));
144 Map<Long, List<ErpSaleOrderItemDO>> saleOrderItemMap = convertMultiMap(saleOrderItemList, ErpSaleOrderItemDO::getOrderId); 144 Map<Long, List<ErpSaleOrderItemDO>> saleOrderItemMap = convertMultiMap(saleOrderItemList, ErpSaleOrderItemDO::getOrderId);
@@ -150,7 +150,7 @@ public class ErpSaleOrderController { @@ -150,7 +150,7 @@ public class ErpSaleOrderController {
150 convertSet(pageResult.getList(), ErpSaleOrderDO::getCustomerId)); 150 convertSet(pageResult.getList(), ErpSaleOrderDO::getCustomerId));
151 // 1.4 管理员信息 151 // 1.4 管理员信息
152 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( 152 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
153 - convertSet(pageResult.getList(), erpStockRecordDO -> Long.parseLong(erpStockRecordDO.getCreator()))); 153 + convertSet(pageResult.getList(), saleOrder -> Long.parseLong(saleOrder.getCreator())));
154 // 2. 开始拼接 154 // 2. 开始拼接
155 return BeanUtils.toBean(pageResult, ErpSaleOrderRespVO.class, saleOrder -> { 155 return BeanUtils.toBean(pageResult, ErpSaleOrderRespVO.class, saleOrder -> {
156 saleOrder.setItems(BeanUtils.toBean(saleOrderItemMap.get(saleOrder.getId()), ErpSaleOrderRespVO.Item.class, 156 saleOrder.setItems(BeanUtils.toBean(saleOrderItemMap.get(saleOrder.getId()), ErpSaleOrderRespVO.Item.class,
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleOutController.java
@@ -150,7 +150,7 @@ public class ErpSaleOutController { @@ -150,7 +150,7 @@ public class ErpSaleOutController {
150 convertSet(pageResult.getList(), ErpSaleOutDO::getCustomerId)); 150 convertSet(pageResult.getList(), ErpSaleOutDO::getCustomerId));
151 // 1.4 管理员信息 151 // 1.4 管理员信息
152 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( 152 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
153 - convertSet(pageResult.getList(), erpStockRecordDO -> Long.parseLong(erpStockRecordDO.getCreator()))); 153 + convertSet(pageResult.getList(), stockOut -> Long.parseLong(stockOut.getCreator())));
154 // 2. 开始拼接 154 // 2. 开始拼接
155 return BeanUtils.toBean(pageResult, ErpSaleOutRespVO.class, saleOut -> { 155 return BeanUtils.toBean(pageResult, ErpSaleOutRespVO.class, saleOut -> {
156 saleOut.setItems(BeanUtils.toBean(saleOutItemMap.get(saleOut.getId()), ErpSaleOutRespVO.Item.class, 156 saleOut.setItems(BeanUtils.toBean(saleOutItemMap.get(saleOut.getId()), ErpSaleOutRespVO.Item.class,
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleReturnController.java
@@ -150,7 +150,7 @@ public class ErpSaleReturnController { @@ -150,7 +150,7 @@ public class ErpSaleReturnController {
150 convertSet(pageResult.getList(), ErpSaleReturnDO::getCustomerId)); 150 convertSet(pageResult.getList(), ErpSaleReturnDO::getCustomerId));
151 // 1.4 管理员信息 151 // 1.4 管理员信息
152 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( 152 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
153 - convertSet(pageResult.getList(), erpStockRecordDO -> Long.parseLong(erpStockRecordDO.getCreator()))); 153 + convertSet(pageResult.getList(), saleReturn -> Long.parseLong(saleReturn.getCreator())));
154 // 2. 开始拼接 154 // 2. 开始拼接
155 return BeanUtils.toBean(pageResult, ErpSaleReturnRespVO.class, saleReturn -> { 155 return BeanUtils.toBean(pageResult, ErpSaleReturnRespVO.class, saleReturn -> {
156 saleReturn.setItems(BeanUtils.toBean(saleReturnItemMap.get(saleReturn.getId()), ErpSaleReturnRespVO.Item.class, 156 saleReturn.setItems(BeanUtils.toBean(saleReturnItemMap.get(saleReturn.getId()), ErpSaleReturnRespVO.Item.class,
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockCheckController.java
@@ -126,7 +126,7 @@ public class ErpStockCheckController { @@ -126,7 +126,7 @@ public class ErpStockCheckController {
126 if (CollUtil.isEmpty(pageResult.getList())) { 126 if (CollUtil.isEmpty(pageResult.getList())) {
127 return PageResult.empty(pageResult.getTotal()); 127 return PageResult.empty(pageResult.getTotal());
128 } 128 }
129 - // 1.1 出库项 129 + // 1.1 盘点项
130 List<ErpStockCheckItemDO> stockCheckItemList = stockCheckService.getStockCheckItemListByCheckIds( 130 List<ErpStockCheckItemDO> stockCheckItemList = stockCheckService.getStockCheckItemListByCheckIds(
131 convertSet(pageResult.getList(), ErpStockCheckDO::getId)); 131 convertSet(pageResult.getList(), ErpStockCheckDO::getId));
132 Map<Long, List<ErpStockCheckItemDO>> stockCheckItemMap = convertMultiMap(stockCheckItemList, ErpStockCheckItemDO::getCheckId); 132 Map<Long, List<ErpStockCheckItemDO>> stockCheckItemMap = convertMultiMap(stockCheckItemList, ErpStockCheckItemDO::getCheckId);
@@ -135,7 +135,7 @@ public class ErpStockCheckController { @@ -135,7 +135,7 @@ public class ErpStockCheckController {
135 convertSet(stockCheckItemList, ErpStockCheckItemDO::getProductId)); 135 convertSet(stockCheckItemList, ErpStockCheckItemDO::getProductId));
136 // 1.3 管理员信息 136 // 1.3 管理员信息
137 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( 137 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
138 - convertSet(pageResult.getList(), erpStockRecordDO -> Long.parseLong(erpStockRecordDO.getCreator()))); 138 + convertSet(pageResult.getList(), stockCheck -> Long.parseLong(stockCheck.getCreator())));
139 // 2. 开始拼接 139 // 2. 开始拼接
140 return BeanUtils.toBean(pageResult, ErpStockCheckRespVO.class, stockCheck -> { 140 return BeanUtils.toBean(pageResult, ErpStockCheckRespVO.class, stockCheck -> {
141 stockCheck.setItems(BeanUtils.toBean(stockCheckItemMap.get(stockCheck.getId()), ErpStockCheckRespVO.Item.class, 141 stockCheck.setItems(BeanUtils.toBean(stockCheckItemMap.get(stockCheck.getId()), ErpStockCheckRespVO.Item.class,
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockInController.java
@@ -150,7 +150,7 @@ public class ErpStockInController { @@ -150,7 +150,7 @@ public class ErpStockInController {
150 convertSet(pageResult.getList(), ErpStockInDO::getSupplierId)); 150 convertSet(pageResult.getList(), ErpStockInDO::getSupplierId));
151 // 1.4 管理员信息 151 // 1.4 管理员信息
152 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( 152 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
153 - convertSet(pageResult.getList(), erpStockRecordDO -> Long.parseLong(erpStockRecordDO.getCreator()))); 153 + convertSet(pageResult.getList(), stockIn -> Long.parseLong(stockIn.getCreator())));
154 // 2. 开始拼接 154 // 2. 开始拼接
155 return BeanUtils.toBean(pageResult, ErpStockInRespVO.class, stockIn -> { 155 return BeanUtils.toBean(pageResult, ErpStockInRespVO.class, stockIn -> {
156 stockIn.setItems(BeanUtils.toBean(stockInItemMap.get(stockIn.getId()), ErpStockInRespVO.Item.class, 156 stockIn.setItems(BeanUtils.toBean(stockInItemMap.get(stockIn.getId()), ErpStockInRespVO.Item.class,
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockMoveController.java
@@ -134,7 +134,7 @@ public class ErpStockMoveController { @@ -134,7 +134,7 @@ public class ErpStockMoveController {
134 if (CollUtil.isEmpty(pageResult.getList())) { 134 if (CollUtil.isEmpty(pageResult.getList())) {
135 return PageResult.empty(pageResult.getTotal()); 135 return PageResult.empty(pageResult.getTotal());
136 } 136 }
137 - // 1.1 出库项 137 + // 1.1 调拨项
138 List<ErpStockMoveItemDO> stockMoveItemList = stockMoveService.getStockMoveItemListByMoveIds( 138 List<ErpStockMoveItemDO> stockMoveItemList = stockMoveService.getStockMoveItemListByMoveIds(
139 convertSet(pageResult.getList(), ErpStockMoveDO::getId)); 139 convertSet(pageResult.getList(), ErpStockMoveDO::getId));
140 Map<Long, List<ErpStockMoveItemDO>> stockMoveItemMap = convertMultiMap(stockMoveItemList, ErpStockMoveItemDO::getMoveId); 140 Map<Long, List<ErpStockMoveItemDO>> stockMoveItemMap = convertMultiMap(stockMoveItemList, ErpStockMoveItemDO::getMoveId);
@@ -144,7 +144,7 @@ public class ErpStockMoveController { @@ -144,7 +144,7 @@ public class ErpStockMoveController {
144 // 1.3 TODO 芋艿:搞仓库信息 144 // 1.3 TODO 芋艿:搞仓库信息
145 // 1.4 管理员信息 145 // 1.4 管理员信息
146 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( 146 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
147 - convertSet(pageResult.getList(), erpStockRecordDO -> Long.parseLong(erpStockRecordDO.getCreator()))); 147 + convertSet(pageResult.getList(), stockMove -> Long.parseLong(stockMove.getCreator())));
148 // 2. 开始拼接 148 // 2. 开始拼接
149 return BeanUtils.toBean(pageResult, ErpStockMoveRespVO.class, stockMove -> { 149 return BeanUtils.toBean(pageResult, ErpStockMoveRespVO.class, stockMove -> {
150 stockMove.setItems(BeanUtils.toBean(stockMoveItemMap.get(stockMove.getId()), ErpStockMoveRespVO.Item.class, 150 stockMove.setItems(BeanUtils.toBean(stockMoveItemMap.get(stockMove.getId()), ErpStockMoveRespVO.Item.class,
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockOutController.java
@@ -150,7 +150,7 @@ public class ErpStockOutController { @@ -150,7 +150,7 @@ public class ErpStockOutController {
150 convertSet(pageResult.getList(), ErpStockOutDO::getCustomerId)); 150 convertSet(pageResult.getList(), ErpStockOutDO::getCustomerId));
151 // 1.4 管理员信息 151 // 1.4 管理员信息
152 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( 152 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
153 - convertSet(pageResult.getList(), erpStockRecordDO -> Long.parseLong(erpStockRecordDO.getCreator()))); 153 + convertSet(pageResult.getList(), stockOut -> Long.parseLong(stockOut.getCreator())));
154 // 2. 开始拼接 154 // 2. 开始拼接
155 return BeanUtils.toBean(pageResult, ErpStockOutRespVO.class, stockOut -> { 155 return BeanUtils.toBean(pageResult, ErpStockOutRespVO.class, stockOut -> {
156 stockOut.setItems(BeanUtils.toBean(stockOutItemMap.get(stockOut.getId()), ErpStockOutRespVO.Item.class, 156 stockOut.setItems(BeanUtils.toBean(stockOutItemMap.get(stockOut.getId()), ErpStockOutRespVO.Item.class,
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockRecordController.java
@@ -93,7 +93,7 @@ public class ErpStockRecordController { @@ -93,7 +93,7 @@ public class ErpStockRecordController {
93 Map<Long, ErpWarehouseDO> warehouseMap = warehouseService.getWarehouseMap( 93 Map<Long, ErpWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
94 convertSet(pageResult.getList(), ErpStockRecordDO::getWarehouseId)); 94 convertSet(pageResult.getList(), ErpStockRecordDO::getWarehouseId));
95 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( 95 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
96 - convertSet(pageResult.getList(), erpStockRecordDO -> Long.parseLong(erpStockRecordDO.getCreator()))); 96 + convertSet(pageResult.getList(), record -> Long.parseLong(record.getCreator())));
97 return BeanUtils.toBean(pageResult, ErpStockRecordRespVO.class, stock -> { 97 return BeanUtils.toBean(pageResult, ErpStockRecordRespVO.class, stock -> {
98 MapUtils.findAndThen(productMap, stock.getProductId(), product -> stock.setProductName(product.getName()) 98 MapUtils.findAndThen(productMap, stock.getProductId(), product -> stock.setProductName(product.getName())
99 .setCategoryName(product.getCategoryName()).setUnitName(product.getUnitName())); 99 .setCategoryName(product.getCategoryName()).setUnitName(product.getUnitName()));
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/finance/ErpFinancePaymentDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.erp.dal.dataobject.finance;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpSupplierDO;
  5 +import com.baomidou.mybatisplus.annotation.KeySequence;
  6 +import com.baomidou.mybatisplus.annotation.TableId;
  7 +import com.baomidou.mybatisplus.annotation.TableName;
  8 +import lombok.*;
  9 +
  10 +import java.math.BigDecimal;
  11 +import java.time.LocalDateTime;
  12 +
  13 +/**
  14 + * ERP 付款单 DO
  15 + *
  16 + * @author 芋道源码
  17 + */
  18 +@TableName("erp_finance_payment")
  19 +@KeySequence("erp_finance_payment_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
  20 +@Data
  21 +@EqualsAndHashCode(callSuper = true)
  22 +@ToString(callSuper = true)
  23 +@Builder
  24 +@NoArgsConstructor
  25 +@AllArgsConstructor
  26 +public class ErpFinancePaymentDO extends BaseDO {
  27 +
  28 + /**
  29 + * 编号
  30 + */
  31 + @TableId
  32 + private Long id;
  33 + /**
  34 + * 付款单号
  35 + */
  36 + private String no;
  37 + /**
  38 + * 付款状态
  39 + *
  40 + * 枚举 {@link cn.iocoder.yudao.module.erp.enums.ErpAuditStatus}
  41 + */
  42 + private Integer status;
  43 + /**
  44 + * 付款时间
  45 + */
  46 + private LocalDateTime paymentTime;
  47 + /**
  48 + * 财务人员编号
  49 + *
  50 + * 关联 AdminUserDO 的 id 字段
  51 + */
  52 + private Long financeUserId;
  53 + /**
  54 + * 供应商编号
  55 + *
  56 + * 关联 {@link ErpSupplierDO#getId()}
  57 + */
  58 + private Long supplierId;
  59 + /**
  60 + * 付款账户编号
  61 + *
  62 + * 关联 {@link ErpAccountDO#getId()}
  63 + */
  64 + private Long accountId;
  65 +
  66 + /**
  67 + * 合计价格,单位:元
  68 + */
  69 + private BigDecimal totalPrice;
  70 + /**
  71 + * 优惠金额,单位:元
  72 + */
  73 + private BigDecimal discountPrice;
  74 + /**
  75 + * 实付金额,单位:分
  76 + *
  77 + * paymentPrice = totalPrice - discountPrice
  78 + */
  79 + private BigDecimal paymentPrice;
  80 +
  81 + /**
  82 + * 备注
  83 + */
  84 + private String remark;
  85 +
  86 +}
0 \ No newline at end of file 87 \ No newline at end of file
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/finance/ErpFinancePaymentItemDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.erp.dal.dataobject.finance;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInDO;
  5 +import com.baomidou.mybatisplus.annotation.KeySequence;
  6 +import com.baomidou.mybatisplus.annotation.TableId;
  7 +import com.baomidou.mybatisplus.annotation.TableName;
  8 +import lombok.*;
  9 +
  10 +import java.math.BigDecimal;
  11 +
  12 +/**
  13 + * ERP 付款项 DO
  14 + *
  15 + * @author 芋道源码
  16 + */
  17 +@TableName("erp_finance_payment_item")
  18 +@KeySequence("erp_finance_payment_item_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
  19 +@Data
  20 +@EqualsAndHashCode(callSuper = true)
  21 +@ToString(callSuper = true)
  22 +@Builder
  23 +@NoArgsConstructor
  24 +@AllArgsConstructor
  25 +public class ErpFinancePaymentItemDO extends BaseDO {
  26 +
  27 + /**
  28 + * 入库项编号
  29 + */
  30 + @TableId
  31 + private Long id;
  32 + /**
  33 + * 付款单编号
  34 + *
  35 + * 关联 {@link ErpFinancePaymentDO#getId()}
  36 + */
  37 + private Long paymentId;
  38 +
  39 + /**
  40 + * 业务类型
  41 + *
  42 + * 枚举 {@link cn.iocoder.yudao.module.erp.enums.common.ErpBizTypeEnum} 的采购入库、退货
  43 + */
  44 + private Integer bizType;
  45 + /**
  46 + * 业务编号
  47 + *
  48 + * 例如说:{@link ErpPurchaseInDO#getId()}
  49 + */
  50 + private Long bizId;
  51 + /**
  52 + * 业务单号
  53 + *
  54 + * 例如说:{@link ErpPurchaseInDO#getNo()}
  55 + */
  56 + private String bizNo;
  57 +
  58 + /**
  59 + * 应付欠款,单位:分
  60 + */
  61 + private BigDecimal totalPrice;
  62 + /**
  63 + * 已付欠款,单位:分
  64 + */
  65 + private BigDecimal paidPrice;
  66 + /**
  67 + * 本次付款,单位:分
  68 + */
  69 + private BigDecimal paymentPrice;
  70 + /**
  71 + * 备注
  72 + */
  73 + private String remark;
  74 +
  75 +}
0 \ No newline at end of file 76 \ No newline at end of file
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/finance/ErpAccountMapper.java
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.erp.dal.mysql.finance; @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.erp.dal.mysql.finance;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 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.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 -import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.ErpAccountPageReqVO; 6 +import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.account.ErpAccountPageReqVO;
7 import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpAccountDO; 7 import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpAccountDO;
8 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
9 9
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/finance/ErpFinancePaymentItemMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.erp.dal.mysql.finance;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentItemDO;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +
  7 +import java.util.Collection;
  8 +import java.util.List;
  9 +
  10 +/**
  11 + * ERP 付款单项 Mapper
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +@Mapper
  16 +public interface ErpFinancePaymentItemMapper extends BaseMapperX<ErpFinancePaymentItemDO> {
  17 +
  18 + default List<ErpFinancePaymentItemDO> selectListByPaymentId(Long paymentId) {
  19 + return selectList(ErpFinancePaymentItemDO::getPaymentId, paymentId);
  20 + }
  21 +
  22 + default List<ErpFinancePaymentItemDO> selectListByPaymentIds(Collection<Long> paymentIds) {
  23 + return selectList(ErpFinancePaymentItemDO::getPaymentId, paymentIds);
  24 + }
  25 +
  26 + default int deleteByPaymentId(Long paymentId) {
  27 + return delete(ErpFinancePaymentItemDO::getPaymentId, paymentId);
  28 + }
  29 +
  30 +}
0 \ No newline at end of file 31 \ No newline at end of file
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/finance/ErpFinancePaymentMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.erp.dal.mysql.finance;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
  6 +import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentPageReqVO;
  7 +import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentDO;
  8 +import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentItemDO;
  9 +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  10 +import org.apache.ibatis.annotations.Mapper;
  11 +
  12 +/**
  13 + * ERP 付款单 Mapper
  14 + *
  15 + * @author 芋道源码
  16 + */
  17 +@Mapper
  18 +public interface ErpFinancePaymentMapper extends BaseMapperX<ErpFinancePaymentDO> {
  19 +
  20 + default PageResult<ErpFinancePaymentDO> selectPage(ErpFinancePaymentPageReqVO reqVO) {
  21 + MPJLambdaWrapperX<ErpFinancePaymentDO> query = new MPJLambdaWrapperX<ErpFinancePaymentDO>()
  22 + .likeIfPresent(ErpFinancePaymentDO::getNo, reqVO.getNo())
  23 + .betweenIfPresent(ErpFinancePaymentDO::getPaymentTime, reqVO.getPaymentTime())
  24 + .eqIfPresent(ErpFinancePaymentDO::getSupplierId, reqVO.getSupplierId())
  25 + .eqIfPresent(ErpFinancePaymentDO::getCreator, reqVO.getCreator())
  26 + .eqIfPresent(ErpFinancePaymentDO::getFinanceUserId, reqVO.getFinanceUserId())
  27 + .eqIfPresent(ErpFinancePaymentDO::getAccountId, reqVO.getAccountId())
  28 + .eqIfPresent(ErpFinancePaymentDO::getStatus, reqVO.getStatus())
  29 + .likeIfPresent(ErpFinancePaymentDO::getRemark, reqVO.getRemark())
  30 + .orderByDesc(ErpFinancePaymentDO::getId);
  31 + if (reqVO.getBizNo() != null) {
  32 + query.leftJoin(ErpFinancePaymentItemDO.class, ErpFinancePaymentItemDO::getPaymentId, ErpFinancePaymentDO::getId)
  33 + .eq(reqVO.getBizNo() != null, ErpFinancePaymentItemDO::getBizNo, reqVO.getBizNo())
  34 + .groupBy(ErpFinancePaymentDO::getId); // 避免 1 对多查询,产生相同的 1
  35 + }
  36 + return selectJoinPage(reqVO, ErpFinancePaymentDO.class, query);
  37 + }
  38 +
  39 + default int updateByIdAndStatus(Long id, Integer status, ErpFinancePaymentDO updateObj) {
  40 + return update(updateObj, new LambdaUpdateWrapper<ErpFinancePaymentDO>()
  41 + .eq(ErpFinancePaymentDO::getId, id).eq(ErpFinancePaymentDO::getStatus, status));
  42 + }
  43 +
  44 + default ErpFinancePaymentDO selectByNo(String no) {
  45 + return selectOne(ErpFinancePaymentDO::getNo, no);
  46 + }
  47 +
  48 +}
0 \ No newline at end of file 49 \ No newline at end of file
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/redis/no/ErpNoRedisDAO.java
@@ -64,6 +64,11 @@ public class ErpNoRedisDAO { @@ -64,6 +64,11 @@ public class ErpNoRedisDAO {
64 */ 64 */
65 public static final String PURCHASE_RETURN_NO_PREFIX = "CGTH"; 65 public static final String PURCHASE_RETURN_NO_PREFIX = "CGTH";
66 66
  67 + /**
  68 + * 付款单 {@link cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentDO}
  69 + */
  70 + public static final String FINANCE_PAYMENT_NO_PREFIX = "FKD";
  71 +
67 @Resource 72 @Resource
68 private StringRedisTemplate stringRedisTemplate; 73 private StringRedisTemplate stringRedisTemplate;
69 74
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpAccountService.java
1 package cn.iocoder.yudao.module.erp.service.finance; 1 package cn.iocoder.yudao.module.erp.service.finance;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 -import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.ErpAccountPageReqVO;  
5 -import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.ErpAccountSaveReqVO; 4 +import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.account.ErpAccountPageReqVO;
  5 +import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.account.ErpAccountSaveReqVO;
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
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpAccountServiceImpl.java
@@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.erp.service.finance; @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.erp.service.finance;
3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 -import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.ErpAccountPageReqVO;  
7 -import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.ErpAccountSaveReqVO; 6 +import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.account.ErpAccountPageReqVO;
  7 +import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.account.ErpAccountSaveReqVO;
8 import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpAccountDO; 8 import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpAccountDO;
9 import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpAccountMapper; 9 import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpAccountMapper;
10 import jakarta.annotation.Resource; 10 import jakarta.annotation.Resource;
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinancePaymentService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.erp.service.finance;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentPageReqVO;
  5 +import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentSaveReqVO;
  6 +import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentDO;
  7 +import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentItemDO;
  8 +import jakarta.validation.Valid;
  9 +
  10 +import java.util.Collection;
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * ERP 付款单 Service 接口
  15 + *
  16 + * @author 芋道源码
  17 + */
  18 +public interface ErpFinancePaymentService {
  19 +
  20 + /**
  21 + * 创建付款单
  22 + *
  23 + * @param createReqVO 创建信息
  24 + * @return 编号
  25 + */
  26 + Long createFinancePayment(@Valid ErpFinancePaymentSaveReqVO createReqVO);
  27 +
  28 + /**
  29 + * 更新付款单
  30 + *
  31 + * @param updateReqVO 更新信息
  32 + */
  33 + void updateFinancePayment(@Valid ErpFinancePaymentSaveReqVO updateReqVO);
  34 +
  35 + /**
  36 + * 更新付款单的状态
  37 + *
  38 + * @param id 编号
  39 + * @param status 状态
  40 + */
  41 + void updateFinancePaymentStatus(Long id, Integer status);
  42 +
  43 + /**
  44 + * 删除付款单
  45 + *
  46 + * @param ids 编号数组
  47 + */
  48 + void deleteFinancePayment(List<Long> ids);
  49 +
  50 + /**
  51 + * 获得付款单
  52 + *
  53 + * @param id 编号
  54 + * @return 付款单
  55 + */
  56 + ErpFinancePaymentDO getFinancePayment(Long id);
  57 +
  58 + /**
  59 + * 获得付款单分页
  60 + *
  61 + * @param pageReqVO 分页查询
  62 + * @return 付款单分页
  63 + */
  64 + PageResult<ErpFinancePaymentDO> getFinancePaymentPage(ErpFinancePaymentPageReqVO pageReqVO);
  65 +
  66 + // ==================== 付款单项 ====================
  67 +
  68 + /**
  69 + * 获得付款单项列表
  70 + *
  71 + * @param paymentId 付款单编号
  72 + * @return 付款单项列表
  73 + */
  74 + List<ErpFinancePaymentItemDO> getFinancePaymentItemListByPaymentId(Long paymentId);
  75 +
  76 + /**
  77 + * 获得付款单项 List
  78 + *
  79 + * @param paymentIds 付款单编号数组
  80 + * @return 付款单项 List
  81 + */
  82 + List<ErpFinancePaymentItemDO> getFinancePaymentItemListByPaymentIds(Collection<Long> paymentIds);
  83 +
  84 +}
0 \ No newline at end of file 85 \ No newline at end of file
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinancePaymentServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.erp.service.finance;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.ObjectUtil;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  7 +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;
  9 +import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentDO;
  10 +import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentItemDO;
  11 +import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInDO;
  12 +import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseReturnDO;
  13 +import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpFinancePaymentItemMapper;
  14 +import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpFinancePaymentMapper;
  15 +import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO;
  16 +import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
  17 +import cn.iocoder.yudao.module.erp.enums.common.ErpBizTypeEnum;
  18 +import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseInService;
  19 +import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseReturnService;
  20 +import cn.iocoder.yudao.module.erp.service.purchase.ErpSupplierService;
  21 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  22 +import jakarta.annotation.Resource;
  23 +import org.springframework.stereotype.Service;
  24 +import org.springframework.transaction.annotation.Transactional;
  25 +import org.springframework.validation.annotation.Validated;
  26 +
  27 +import java.math.BigDecimal;
  28 +import java.util.Collection;
  29 +import java.util.Collections;
  30 +import java.util.List;
  31 +
  32 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  33 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
  34 +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*;
  35 +
  36 +// TODO 芋艿:记录操作日志
  37 +
  38 +/**
  39 + * ERP 付款单 Service 实现类
  40 + *
  41 + * @author 芋道源码
  42 + */
  43 +@Service
  44 +@Validated
  45 +public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService {
  46 +
  47 + @Resource
  48 + private ErpFinancePaymentMapper financePaymentMapper;
  49 + @Resource
  50 + private ErpFinancePaymentItemMapper financePaymentItemMapper;
  51 +
  52 + @Resource
  53 + private ErpNoRedisDAO noRedisDAO;
  54 +
  55 + @Resource
  56 + private ErpSupplierService supplierService;
  57 + @Resource
  58 + private ErpAccountService accountService;
  59 + @Resource
  60 + private ErpPurchaseInService purchaseInService;
  61 + @Resource
  62 + private ErpPurchaseReturnService purchaseReturnService;
  63 +
  64 + @Resource
  65 + private AdminUserApi adminUserApi;
  66 +
  67 + @Override
  68 + @Transactional(rollbackFor = Exception.class)
  69 + public Long createFinancePayment(ErpFinancePaymentSaveReqVO createReqVO) {
  70 + // 1.1 校验订单项的有效性
  71 + List<ErpFinancePaymentItemDO> paymentItems = validateFinancePaymentItems(createReqVO.getItems());
  72 + // 1.2 校验供应商
  73 + supplierService.validateSupplier(createReqVO.getSupplierId());
  74 + // 1.3 校验结算账户
  75 + if (createReqVO.getAccountId() != null) {
  76 + accountService.validateAccount(createReqVO.getAccountId());
  77 + }
  78 + // 1.4 校验财务人员
  79 + if (createReqVO.getFinanceUserId() != null) {
  80 + adminUserApi.validateUser(createReqVO.getFinanceUserId());
  81 + }
  82 + // 1.5 生成付款单号,并校验唯一性
  83 + String no = noRedisDAO.generate(ErpNoRedisDAO.FINANCE_PAYMENT_NO_PREFIX);
  84 + if (financePaymentMapper.selectByNo(no) != null) {
  85 + throw exception(FINANCE_PAYMENT_NO_EXISTS);
  86 + }
  87 +
  88 + // 2.1 插入付款单
  89 + ErpFinancePaymentDO payment = BeanUtils.toBean(createReqVO, ErpFinancePaymentDO.class, in -> in
  90 + .setNo(no).setStatus(ErpAuditStatus.PROCESS.getStatus()));
  91 + calculateTotalPrice(payment, paymentItems);
  92 + financePaymentMapper.insert(payment);
  93 + // 2.2 插入付款单项
  94 + paymentItems.forEach(o -> o.setPaymentId(payment.getId()));
  95 + financePaymentItemMapper.insertBatch(paymentItems);
  96 + return payment.getId();
  97 + }
  98 +
  99 + @Override
  100 + @Transactional(rollbackFor = Exception.class)
  101 + public void updateFinancePayment(ErpFinancePaymentSaveReqVO updateReqVO) {
  102 + // 1.1 校验存在
  103 + ErpFinancePaymentDO payment = validateFinancePaymentExists(updateReqVO.getId());
  104 + if (ErpAuditStatus.APPROVE.getStatus().equals(payment.getStatus())) {
  105 + throw exception(SALE_ORDER_UPDATE_FAIL_APPROVE, payment.getNo());
  106 + }
  107 + // 1.2 校验供应商
  108 + supplierService.validateSupplier(updateReqVO.getSupplierId());
  109 + // 1.3 校验结算账户
  110 + if (updateReqVO.getAccountId() != null) {
  111 + accountService.validateAccount(updateReqVO.getAccountId());
  112 + }
  113 + // 1.4 校验财务人员
  114 + if (updateReqVO.getFinanceUserId() != null) {
  115 + adminUserApi.validateUser(updateReqVO.getFinanceUserId());
  116 + }
  117 + // 1.5 校验付款单项的有效性
  118 + List<ErpFinancePaymentItemDO> paymentItems = validateFinancePaymentItems(updateReqVO.getItems());
  119 +
  120 + // 2.1 更新付款单
  121 + ErpFinancePaymentDO updateObj = BeanUtils.toBean(updateReqVO, ErpFinancePaymentDO.class);
  122 + calculateTotalPrice(updateObj, paymentItems);
  123 + financePaymentMapper.updateById(updateObj);
  124 + // 2.2 更新付款单项
  125 + updateFinancePaymentItemList(updateReqVO.getId(), paymentItems);
  126 + }
  127 +
  128 + private void calculateTotalPrice(ErpFinancePaymentDO payment, List<ErpFinancePaymentItemDO> paymentItems) {
  129 + payment.setTotalPrice(getSumValue(paymentItems, ErpFinancePaymentItemDO::getPaymentPrice, BigDecimal::add, BigDecimal.ZERO));
  130 + payment.setPaymentPrice(payment.getTotalPrice().subtract(payment.getDiscountPrice()));
  131 + }
  132 +
  133 + @Override
  134 + @Transactional(rollbackFor = Exception.class)
  135 + public void updateFinancePaymentStatus(Long id, Integer status) {
  136 + boolean approve = ErpAuditStatus.APPROVE.getStatus().equals(status);
  137 + // 1.1 校验存在
  138 + ErpFinancePaymentDO payment = validateFinancePaymentExists(id);
  139 + // 1.2 校验状态
  140 + if (payment.getStatus().equals(status)) {
  141 + throw exception(approve ? SALE_ORDER_APPROVE_FAIL : SALE_ORDER_PROCESS_FAIL);
  142 + }
  143 +
  144 + // 2. 更新状态
  145 + int updateCount = financePaymentMapper.updateByIdAndStatus(id, payment.getStatus(),
  146 + new ErpFinancePaymentDO().setStatus(status));
  147 + if (updateCount == 0) {
  148 + throw exception(approve ? SALE_ORDER_APPROVE_FAIL : SALE_ORDER_PROCESS_FAIL);
  149 + }
  150 + }
  151 +
  152 + private List<ErpFinancePaymentItemDO> validateFinancePaymentItems(List<ErpFinancePaymentSaveReqVO.Item> list) {
  153 + return convertList(list, o -> BeanUtils.toBean(o, ErpFinancePaymentItemDO.class, item -> {
  154 + if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.PURCHASE_IN.getType())) {
  155 + ErpPurchaseInDO purchaseIn = purchaseInService.validatePurchaseIn(item.getBizId());
  156 + item.setTotalPrice(purchaseIn.getTotalPrice()).setBizNo(purchaseIn.getNo());
  157 + } else if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.PURCHASE_RETURN.getType())) {
  158 + ErpPurchaseReturnDO purchaseReturn = purchaseReturnService.validatePurchaseReturn(item.getBizId());
  159 + item.setTotalPrice(purchaseReturn.getTotalPrice()).setBizNo(purchaseReturn.getNo());
  160 + } else {
  161 + throw new IllegalArgumentException("业务类型不正确:" + item.getBizType());
  162 + }
  163 + }));
  164 + }
  165 +
  166 + private void updateFinancePaymentItemList(Long id, List<ErpFinancePaymentItemDO> newList) {
  167 + // 第一步,对比新老数据,获得添加、修改、删除的列表
  168 + List<ErpFinancePaymentItemDO> oldList = financePaymentItemMapper.selectListByPaymentId(id);
  169 + List<List<ErpFinancePaymentItemDO>> diffList = diffList(oldList, newList, // id 不同,就认为是不同的记录
  170 + (oldVal, newVal) -> oldVal.getId().equals(newVal.getId()));
  171 +
  172 + // 第二步,批量添加、修改、删除
  173 + if (CollUtil.isNotEmpty(diffList.get(0))) {
  174 + diffList.get(0).forEach(o -> o.setPaymentId(id));
  175 + financePaymentItemMapper.insertBatch(diffList.get(0));
  176 + }
  177 + if (CollUtil.isNotEmpty(diffList.get(1))) {
  178 + financePaymentItemMapper.updateBatch(diffList.get(1));
  179 + }
  180 + if (CollUtil.isNotEmpty(diffList.get(2))) {
  181 + financePaymentItemMapper.deleteBatchIds(convertList(diffList.get(2), ErpFinancePaymentItemDO::getId));
  182 + }
  183 + }
  184 +
  185 + @Override
  186 + @Transactional(rollbackFor = Exception.class)
  187 + public void deleteFinancePayment(List<Long> ids) {
  188 + // 1. 校验不处于已审批
  189 + List<ErpFinancePaymentDO> payments = financePaymentMapper.selectBatchIds(ids);
  190 + if (CollUtil.isEmpty(payments)) {
  191 + return;
  192 + }
  193 + payments.forEach(payment -> {
  194 + if (ErpAuditStatus.APPROVE.getStatus().equals(payment.getStatus())) {
  195 + throw exception(SALE_ORDER_DELETE_FAIL_APPROVE, payment.getNo());
  196 + }
  197 + });
  198 +
  199 + // 2. 遍历删除,并记录操作日志
  200 + payments.forEach(payment -> {
  201 + // 2.1 删除付款单
  202 + financePaymentMapper.deleteById(payment.getId());
  203 + // 2.2 删除付款单项
  204 + financePaymentItemMapper.deleteByPaymentId(payment.getId());
  205 + });
  206 + }
  207 +
  208 + private ErpFinancePaymentDO validateFinancePaymentExists(Long id) {
  209 + ErpFinancePaymentDO payment = financePaymentMapper.selectById(id);
  210 + if (payment == null) {
  211 + throw exception(SALE_ORDER_NOT_EXISTS);
  212 + }
  213 + return payment;
  214 + }
  215 +
  216 + @Override
  217 + public ErpFinancePaymentDO getFinancePayment(Long id) {
  218 + return financePaymentMapper.selectById(id);
  219 + }
  220 +
  221 + @Override
  222 + public PageResult<ErpFinancePaymentDO> getFinancePaymentPage(ErpFinancePaymentPageReqVO pageReqVO) {
  223 + return financePaymentMapper.selectPage(pageReqVO);
  224 + }
  225 +
  226 + // ==================== 付款单项 ====================
  227 +
  228 + @Override
  229 + public List<ErpFinancePaymentItemDO> getFinancePaymentItemListByPaymentId(Long paymentId) {
  230 + return financePaymentItemMapper.selectListByPaymentId(paymentId);
  231 + }
  232 +
  233 + @Override
  234 + public List<ErpFinancePaymentItemDO> getFinancePaymentItemListByPaymentIds(Collection<Long> paymentIds) {
  235 + if (CollUtil.isEmpty(paymentIds)) {
  236 + return Collections.emptyList();
  237 + }
  238 + return financePaymentItemMapper.selectListByPaymentIds(paymentIds);
  239 + }
  240 +
  241 +}
0 \ No newline at end of file 242 \ No newline at end of file
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInService.java
@@ -56,6 +56,14 @@ public interface ErpPurchaseInService { @@ -56,6 +56,14 @@ public interface ErpPurchaseInService {
56 ErpPurchaseInDO getPurchaseIn(Long id); 56 ErpPurchaseInDO getPurchaseIn(Long id);
57 57
58 /** 58 /**
  59 + * 校验采购入库,已经审核通过
  60 + *
  61 + * @param id 编号
  62 + * @return 采购入库
  63 + */
  64 + ErpPurchaseInDO validatePurchaseIn(Long id);
  65 +
  66 + /**
59 * 获得采购入库分页 67 * 获得采购入库分页
60 * 68 *
61 * @param pageReqVO 分页查询 69 * @param pageReqVO 分页查询
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInServiceImpl.java
@@ -78,7 +78,7 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { @@ -78,7 +78,7 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
78 List<ErpPurchaseInItemDO> purchaseInItems = validatePurchaseInItems(createReqVO.getItems()); 78 List<ErpPurchaseInItemDO> purchaseInItems = validatePurchaseInItems(createReqVO.getItems());
79 // 1.3 校验结算账户 79 // 1.3 校验结算账户
80 accountService.validateAccount(createReqVO.getAccountId()); 80 accountService.validateAccount(createReqVO.getAccountId());
81 - // 1.4 生成调拨单号,并校验唯一性 81 + // 1.4 生成入库单号,并校验唯一性
82 String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_IN_NO_PREFIX); 82 String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_IN_NO_PREFIX);
83 if (purchaseInMapper.selectByNo(no) != null) { 83 if (purchaseInMapper.selectByNo(no) != null) {
84 throw exception(PURCHASE_IN_NO_EXISTS); 84 throw exception(PURCHASE_IN_NO_EXISTS);
@@ -163,6 +163,7 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { @@ -163,6 +163,7 @@ 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 167
167 // 2. 更新状态 168 // 2. 更新状态
168 int updateCount = purchaseInMapper.updateByIdAndStatus(id, purchaseIn.getStatus(), 169 int updateCount = purchaseInMapper.updateByIdAndStatus(id, purchaseIn.getStatus(),
@@ -261,6 +262,15 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { @@ -261,6 +262,15 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
261 } 262 }
262 263
263 @Override 264 @Override
  265 + public ErpPurchaseInDO validatePurchaseIn(Long id) {
  266 + ErpPurchaseInDO purchaseIn = validatePurchaseInExists(id);
  267 + if (ObjectUtil.notEqual(purchaseIn.getStatus(), ErpAuditStatus.APPROVE.getStatus())) {
  268 + throw exception(PURCHASE_IN_NOT_APPROVE);
  269 + }
  270 + return purchaseIn;
  271 + }
  272 +
  273 + @Override
264 public PageResult<ErpPurchaseInDO> getPurchaseInPage(ErpPurchaseInPageReqVO pageReqVO) { 274 public PageResult<ErpPurchaseInDO> getPurchaseInPage(ErpPurchaseInPageReqVO pageReqVO) {
265 return purchaseInMapper.selectPage(pageReqVO); 275 return purchaseInMapper.selectPage(pageReqVO);
266 } 276 }
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
@@ -68,7 +68,7 @@ public class ErpPurchaseOrderServiceImpl implements ErpPurchaseOrderService { @@ -68,7 +68,7 @@ public class ErpPurchaseOrderServiceImpl implements ErpPurchaseOrderService {
68 if (createReqVO.getAccountId() != null) { 68 if (createReqVO.getAccountId() != null) {
69 accountService.validateAccount(createReqVO.getAccountId()); 69 accountService.validateAccount(createReqVO.getAccountId());
70 } 70 }
71 - // 1.4 生成调拨单号,并校验唯一性 71 + // 1.4 生成订单号,并校验唯一性
72 String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_ORDER_NO_PREFIX); 72 String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_ORDER_NO_PREFIX);
73 if (purchaseOrderMapper.selectByNo(no) != null) { 73 if (purchaseOrderMapper.selectByNo(no) != null) {
74 throw exception(PURCHASE_ORDER_NO_EXISTS); 74 throw exception(PURCHASE_ORDER_NO_EXISTS);
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseReturnService.java
@@ -56,6 +56,14 @@ public interface ErpPurchaseReturnService { @@ -56,6 +56,14 @@ public interface ErpPurchaseReturnService {
56 ErpPurchaseReturnDO getPurchaseReturn(Long id); 56 ErpPurchaseReturnDO getPurchaseReturn(Long id);
57 57
58 /** 58 /**
  59 + * 校验采购退货,已经审核通过
  60 + *
  61 + * @param id 编号
  62 + * @return 采购退货
  63 + */
  64 + ErpPurchaseReturnDO validatePurchaseReturn(Long id);
  65 +
  66 + /**
59 * 获得采购退货分页 67 * 获得采购退货分页
60 * 68 *
61 * @param pageReqVO 分页查询 69 * @param pageReqVO 分页查询
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseReturnServiceImpl.java
@@ -74,7 +74,7 @@ public class ErpPurchaseReturnServiceImpl implements ErpPurchaseReturnService { @@ -74,7 +74,7 @@ public class ErpPurchaseReturnServiceImpl implements ErpPurchaseReturnService {
74 List<ErpPurchaseReturnItemDO> purchaseReturnItems = validatePurchaseReturnItems(createReqVO.getItems()); 74 List<ErpPurchaseReturnItemDO> purchaseReturnItems = validatePurchaseReturnItems(createReqVO.getItems());
75 // 1.3 校验结算账户 75 // 1.3 校验结算账户
76 accountService.validateAccount(createReqVO.getAccountId()); 76 accountService.validateAccount(createReqVO.getAccountId());
77 - // 1.4 生成调拨单号,并校验唯一性 77 + // 1.4 生成退货单号,并校验唯一性
78 String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_RETURN_NO_PREFIX); 78 String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_RETURN_NO_PREFIX);
79 if (purchaseReturnMapper.selectByNo(no) != null) { 79 if (purchaseReturnMapper.selectByNo(no) != null) {
80 throw exception(PURCHASE_RETURN_NO_EXISTS); 80 throw exception(PURCHASE_RETURN_NO_EXISTS);
@@ -159,6 +159,7 @@ public class ErpPurchaseReturnServiceImpl implements ErpPurchaseReturnService { @@ -159,6 +159,7 @@ 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 163
163 // 2. 更新状态 164 // 2. 更新状态
164 int updateCount = purchaseReturnMapper.updateByIdAndStatus(id, purchaseReturn.getStatus(), 165 int updateCount = purchaseReturnMapper.updateByIdAndStatus(id, purchaseReturn.getStatus(),
@@ -257,6 +258,15 @@ public class ErpPurchaseReturnServiceImpl implements ErpPurchaseReturnService { @@ -257,6 +258,15 @@ public class ErpPurchaseReturnServiceImpl implements ErpPurchaseReturnService {
257 } 258 }
258 259
259 @Override 260 @Override
  261 + public ErpPurchaseReturnDO validatePurchaseReturn(Long id) {
  262 + ErpPurchaseReturnDO purchaseReturn = getPurchaseReturn(id);
  263 + if (ObjectUtil.notEqual(purchaseReturn.getStatus(), ErpAuditStatus.APPROVE.getStatus())) {
  264 + throw exception(PURCHASE_RETURN_NOT_APPROVE);
  265 + }
  266 + return purchaseReturn;
  267 + }
  268 +
  269 + @Override
260 public PageResult<ErpPurchaseReturnDO> getPurchaseReturnPage(ErpPurchaseReturnPageReqVO pageReqVO) { 270 public PageResult<ErpPurchaseReturnDO> getPurchaseReturnPage(ErpPurchaseReturnPageReqVO pageReqVO) {
261 return purchaseReturnMapper.selectPage(pageReqVO); 271 return purchaseReturnMapper.selectPage(pageReqVO);
262 } 272 }
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
@@ -76,7 +76,7 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService { @@ -76,7 +76,7 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
76 if (createReqVO.getSaleUserId() != null) { 76 if (createReqVO.getSaleUserId() != null) {
77 adminUserApi.validateUser(createReqVO.getSaleUserId()); 77 adminUserApi.validateUser(createReqVO.getSaleUserId());
78 } 78 }
79 - // 1.5 生成调拨单号,并校验唯一性 79 + // 1.5 生成订单号,并校验唯一性
80 String no = noRedisDAO.generate(ErpNoRedisDAO.SALE_ORDER_NO_PREFIX); 80 String no = noRedisDAO.generate(ErpNoRedisDAO.SALE_ORDER_NO_PREFIX);
81 if (saleOrderMapper.selectByNo(no) != null) { 81 if (saleOrderMapper.selectByNo(no) != null) {
82 throw exception(SALE_ORDER_NO_EXISTS); 82 throw exception(SALE_ORDER_NO_EXISTS);
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOutServiceImpl.java
@@ -82,7 +82,7 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService { @@ -82,7 +82,7 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
82 if (createReqVO.getSaleUserId() != null) { 82 if (createReqVO.getSaleUserId() != null) {
83 adminUserApi.validateUser(createReqVO.getSaleUserId()); 83 adminUserApi.validateUser(createReqVO.getSaleUserId());
84 } 84 }
85 - // 1.5 生成调拨单号,并校验唯一性 85 + // 1.5 生成出库单号,并校验唯一性
86 String no = noRedisDAO.generate(ErpNoRedisDAO.SALE_OUT_NO_PREFIX); 86 String no = noRedisDAO.generate(ErpNoRedisDAO.SALE_OUT_NO_PREFIX);
87 if (saleOutMapper.selectByNo(no) != null) { 87 if (saleOutMapper.selectByNo(no) != null) {
88 throw exception(SALE_OUT_NO_EXISTS); 88 throw exception(SALE_OUT_NO_EXISTS);
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleReturnServiceImpl.java
@@ -82,7 +82,7 @@ public class ErpSaleReturnServiceImpl implements ErpSaleReturnService { @@ -82,7 +82,7 @@ public class ErpSaleReturnServiceImpl implements ErpSaleReturnService {
82 if (createReqVO.getSaleUserId() != null) { 82 if (createReqVO.getSaleUserId() != null) {
83 adminUserApi.validateUser(createReqVO.getSaleUserId()); 83 adminUserApi.validateUser(createReqVO.getSaleUserId());
84 } 84 }
85 - // 1.5 生成调拨单号,并校验唯一性 85 + // 1.5 生成退货单号,并校验唯一性
86 String no = noRedisDAO.generate(ErpNoRedisDAO.SALE_RETURN_NO_PREFIX); 86 String no = noRedisDAO.generate(ErpNoRedisDAO.SALE_RETURN_NO_PREFIX);
87 if (saleReturnMapper.selectByNo(no) != null) { 87 if (saleReturnMapper.selectByNo(no) != null) {
88 throw exception(SALE_RETURN_NO_EXISTS); 88 throw exception(SALE_RETURN_NO_EXISTS);
yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/finance/ErpAccountServiceImplTest.java deleted
1 -package cn.iocoder.yudao.module.erp.service.finance;  
2 -  
3 -import org.junit.jupiter.api.Disabled;  
4 -import org.junit.jupiter.api.Test;  
5 -import org.springframework.boot.test.mock.mockito.MockBean;  
6 -  
7 -import jakarta.annotation.Resource;  
8 -  
9 -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;  
10 -  
11 -import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.*;  
12 -import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpAccountDO;  
13 -import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpAccountMapper;  
14 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
15 -  
16 -import jakarta.annotation.Resource;  
17 -import org.springframework.context.annotation.Import;  
18 -import java.util.*;  
19 -import java.time.LocalDateTime;  
20 -  
21 -import static cn.hutool.core.util.RandomUtil.*;  
22 -import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*;  
23 -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;  
24 -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;  
25 -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*;  
26 -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;  
27 -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*;  
28 -import static org.junit.jupiter.api.Assertions.*;  
29 -import static org.mockito.Mockito.*;  
30 -  
31 -/**  
32 - * {@link ErpAccountServiceImpl} 的单元测试类  
33 - *  
34 - * @author 芋道源码  
35 - */  
36 -@Import(ErpAccountServiceImpl.class)  
37 -public class ErpAccountServiceImplTest extends BaseDbUnitTest {  
38 -  
39 - @Resource  
40 - private ErpAccountServiceImpl accountService;  
41 -  
42 - @Resource  
43 - private ErpAccountMapper accountMapper;  
44 -  
45 - @Test  
46 - public void testCreateAccount_success() {  
47 - // 准备参数  
48 - ErpAccountSaveReqVO createReqVO = randomPojo(ErpAccountSaveReqVO.class).setId(null);  
49 -  
50 - // 调用  
51 - Long accountId = accountService.createAccount(createReqVO);  
52 - // 断言  
53 - assertNotNull(accountId);  
54 - // 校验记录的属性是否正确  
55 - ErpAccountDO account = accountMapper.selectById(accountId);  
56 - assertPojoEquals(createReqVO, account, "id");  
57 - }  
58 -  
59 - @Test  
60 - public void testUpdateAccount_success() {  
61 - // mock 数据  
62 - ErpAccountDO dbAccount = randomPojo(ErpAccountDO.class);  
63 - accountMapper.insert(dbAccount);// @Sql: 先插入出一条存在的数据  
64 - // 准备参数  
65 - ErpAccountSaveReqVO updateReqVO = randomPojo(ErpAccountSaveReqVO.class, o -> {  
66 - o.setId(dbAccount.getId()); // 设置更新的 ID  
67 - });  
68 -  
69 - // 调用  
70 - accountService.updateAccount(updateReqVO);  
71 - // 校验是否更新正确  
72 - ErpAccountDO account = accountMapper.selectById(updateReqVO.getId()); // 获取最新的  
73 - assertPojoEquals(updateReqVO, account);  
74 - }  
75 -  
76 - @Test  
77 - public void testUpdateAccount_notExists() {  
78 - // 准备参数  
79 - ErpAccountSaveReqVO updateReqVO = randomPojo(ErpAccountSaveReqVO.class);  
80 -  
81 - // 调用, 并断言异常  
82 - assertServiceException(() -> accountService.updateAccount(updateReqVO), ACCOUNT_NOT_EXISTS);  
83 - }  
84 -  
85 - @Test  
86 - public void testDeleteAccount_success() {  
87 - // mock 数据  
88 - ErpAccountDO dbAccount = randomPojo(ErpAccountDO.class);  
89 - accountMapper.insert(dbAccount);// @Sql: 先插入出一条存在的数据  
90 - // 准备参数  
91 - Long id = dbAccount.getId();  
92 -  
93 - // 调用  
94 - accountService.deleteAccount(id);  
95 - // 校验数据不存在了  
96 - assertNull(accountMapper.selectById(id));  
97 - }  
98 -  
99 - @Test  
100 - public void testDeleteAccount_notExists() {  
101 - // 准备参数  
102 - Long id = randomLongId();  
103 -  
104 - // 调用, 并断言异常  
105 - assertServiceException(() -> accountService.deleteAccount(id), ACCOUNT_NOT_EXISTS);  
106 - }  
107 -  
108 - @Test  
109 - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解  
110 - public void testGetAccountPage() {  
111 - // mock 数据  
112 - ErpAccountDO dbAccount = randomPojo(ErpAccountDO.class, o -> { // 等会查询到  
113 - o.setNo(null);  
114 - o.setRemark(null);  
115 - o.setStatus(null);  
116 - o.setName(null);  
117 - });  
118 - accountMapper.insert(dbAccount);  
119 - // 测试 no 不匹配  
120 - accountMapper.insert(cloneIgnoreId(dbAccount, o -> o.setNo(null)));  
121 - // 测试 remark 不匹配  
122 - accountMapper.insert(cloneIgnoreId(dbAccount, o -> o.setRemark(null)));  
123 - // 测试 status 不匹配  
124 - accountMapper.insert(cloneIgnoreId(dbAccount, o -> o.setStatus(null)));  
125 - // 测试 name 不匹配  
126 - accountMapper.insert(cloneIgnoreId(dbAccount, o -> o.setName(null)));  
127 - // 准备参数  
128 - ErpAccountPageReqVO reqVO = new ErpAccountPageReqVO();  
129 - reqVO.setNo(null);  
130 - reqVO.setRemark(null);  
131 - reqVO.setStatus(null);  
132 - reqVO.setName(null);  
133 -  
134 - // 调用  
135 - PageResult<ErpAccountDO> pageResult = accountService.getAccountPage(reqVO);  
136 - // 断言  
137 - assertEquals(1, pageResult.getTotal());  
138 - assertEquals(1, pageResult.getList().size());  
139 - assertPojoEquals(dbAccount, pageResult.getList().get(0));  
140 - }  
141 -  
142 -}  
143 \ No newline at end of file 0 \ No newline at end of file
yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/product/ErpProductUnitServiceImplTest.java deleted
1 -package cn.iocoder.yudao.module.erp.service.product;  
2 -  
3 -import cn.iocoder.yudao.module.erp.controller.admin.product.vo.unit.ErpProductUnitPageReqVO;  
4 -import cn.iocoder.yudao.module.erp.controller.admin.product.vo.unit.ErpProductUnitSaveReqVO;  
5 -import org.junit.jupiter.api.Disabled;  
6 -import org.junit.jupiter.api.Test;  
7 -  
8 -import jakarta.annotation.Resource;  
9 -  
10 -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;  
11 -  
12 -import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO;  
13 -import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductUnitMapper;  
14 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
15 -  
16 -import org.springframework.context.annotation.Import;  
17 -  
18 -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;  
19 -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;  
20 -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*;  
21 -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;  
22 -import static org.junit.jupiter.api.Assertions.*;  
23 -  
24 -/**  
25 - * {@link ErpProductUnitServiceImpl} 的单元测试类  
26 - *  
27 - * @author 芋道源码  
28 - */  
29 -@Import(ErpProductUnitServiceImpl.class)  
30 -public class ErpProductUnitServiceImplTest extends BaseDbUnitTest {  
31 -  
32 - @Resource  
33 - private ErpProductUnitServiceImpl productUnitService;  
34 -  
35 - @Resource  
36 - private ErpProductUnitMapper productUnitMapper;  
37 -  
38 - @Test  
39 - public void testCreateProductUnit_success() {  
40 - // 准备参数  
41 - ErpProductUnitSaveReqVO createReqVO = randomPojo(ErpProductUnitSaveReqVO.class).setId(null);  
42 -  
43 - // 调用  
44 - Long productUnitId = productUnitService.createProductUnit(createReqVO);  
45 - // 断言  
46 - assertNotNull(productUnitId);  
47 - // 校验记录的属性是否正确  
48 - ErpProductUnitDO productUnit = productUnitMapper.selectById(productUnitId);  
49 - assertPojoEquals(createReqVO, productUnit, "id");  
50 - }  
51 -  
52 - @Test  
53 - public void testUpdateProductUnit_success() {  
54 - // mock 数据  
55 - ErpProductUnitDO dbProductUnit = randomPojo(ErpProductUnitDO.class);  
56 - productUnitMapper.insert(dbProductUnit);// @Sql: 先插入出一条存在的数据  
57 - // 准备参数  
58 - ErpProductUnitSaveReqVO updateReqVO = randomPojo(ErpProductUnitSaveReqVO.class, o -> {  
59 - o.setId(dbProductUnit.getId()); // 设置更新的 ID  
60 - });  
61 -  
62 - // 调用  
63 - productUnitService.updateProductUnit(updateReqVO);  
64 - // 校验是否更新正确  
65 - ErpProductUnitDO productUnit = productUnitMapper.selectById(updateReqVO.getId()); // 获取最新的  
66 - assertPojoEquals(updateReqVO, productUnit);  
67 - }  
68 -  
69 - @Test  
70 - public void testUpdateProductUnit_notExists() {  
71 - // 准备参数  
72 - ErpProductUnitSaveReqVO updateReqVO = randomPojo(ErpProductUnitSaveReqVO.class);  
73 -  
74 - // 调用, 并断言异常  
75 - assertServiceException(() -> productUnitService.updateProductUnit(updateReqVO), PRODUCT_UNIT_NOT_EXISTS);  
76 - }  
77 -  
78 - @Test  
79 - public void testDeleteProductUnit_success() {  
80 - // mock 数据  
81 - ErpProductUnitDO dbProductUnit = randomPojo(ErpProductUnitDO.class);  
82 - productUnitMapper.insert(dbProductUnit);// @Sql: 先插入出一条存在的数据  
83 - // 准备参数  
84 - Long id = dbProductUnit.getId();  
85 -  
86 - // 调用  
87 - productUnitService.deleteProductUnit(id);  
88 - // 校验数据不存在了  
89 - assertNull(productUnitMapper.selectById(id));  
90 - }  
91 -  
92 - @Test  
93 - public void testDeleteProductUnit_notExists() {  
94 - // 准备参数  
95 - Long id = randomLongId();  
96 -  
97 - // 调用, 并断言异常  
98 - assertServiceException(() -> productUnitService.deleteProductUnit(id), PRODUCT_UNIT_NOT_EXISTS);  
99 - }  
100 -  
101 - @Test  
102 - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解  
103 - public void testGetProductUnitPage() {  
104 - // mock 数据  
105 - ErpProductUnitDO dbProductUnit = randomPojo(ErpProductUnitDO.class, o -> { // 等会查询到  
106 - o.setName(null);  
107 - o.setStatus(null);  
108 - o.setCreateTime(null);  
109 - });  
110 - productUnitMapper.insert(dbProductUnit);  
111 - // 测试 name 不匹配  
112 - productUnitMapper.insert(cloneIgnoreId(dbProductUnit, o -> o.setName(null)));  
113 - // 测试 status 不匹配  
114 - productUnitMapper.insert(cloneIgnoreId(dbProductUnit, o -> o.setStatus(null)));  
115 - // 测试 createTime 不匹配  
116 - productUnitMapper.insert(cloneIgnoreId(dbProductUnit, o -> o.setCreateTime(null)));  
117 - // 准备参数  
118 - ErpProductUnitPageReqVO reqVO = new ErpProductUnitPageReqVO();  
119 - reqVO.setName(null);  
120 - reqVO.setStatus(null);  
121 - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));  
122 -  
123 - // 调用  
124 - PageResult<ErpProductUnitDO> pageResult = productUnitService.getProductUnitPage(reqVO);  
125 - // 断言  
126 - assertEquals(1, pageResult.getTotal());  
127 - assertEquals(1, pageResult.getList().size());  
128 - assertPojoEquals(dbProductUnit, pageResult.getList().get(0));  
129 - }  
130 -  
131 -}  
132 \ No newline at end of file 0 \ No newline at end of file
yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/product/ProductServiceImplTest.java deleted
1 -package cn.iocoder.yudao.module.erp.service.product;  
2 -  
3 -import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductPageReqVO;  
4 -import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ProductSaveReqVO;  
5 -import org.junit.jupiter.api.Disabled;  
6 -import org.junit.jupiter.api.Test;  
7 -  
8 -import jakarta.annotation.Resource;  
9 -  
10 -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;  
11 -  
12 -import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;  
13 -import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductMapper;  
14 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
15 -  
16 -import org.springframework.context.annotation.Import;  
17 -  
18 -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;  
19 -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;  
20 -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*;  
21 -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;  
22 -import static org.junit.jupiter.api.Assertions.*;  
23 -  
24 -/**  
25 - * {@link ErpProductServiceImpl} 的单元测试类  
26 - *  
27 - * @author 芋道源码  
28 - */  
29 -@Import(ErpProductServiceImpl.class)  
30 -public class ProductServiceImplTest extends BaseDbUnitTest {  
31 -  
32 - @Resource  
33 - private ErpProductServiceImpl productService;  
34 -  
35 - @Resource  
36 - private ErpProductMapper productMapper;  
37 -  
38 - @Test  
39 - public void testCreateProduct_success() {  
40 - // 准备参数  
41 - ProductSaveReqVO createReqVO = randomPojo(ProductSaveReqVO.class).setId(null);  
42 -  
43 - // 调用  
44 - Long productId = productService.createProduct(createReqVO);  
45 - // 断言  
46 - assertNotNull(productId);  
47 - // 校验记录的属性是否正确  
48 - ErpProductDO product = productMapper.selectById(productId);  
49 - assertPojoEquals(createReqVO, product, "id");  
50 - }  
51 -  
52 - @Test  
53 - public void testUpdateProduct_success() {  
54 - // mock 数据  
55 - ErpProductDO dbProduct = randomPojo(ErpProductDO.class);  
56 - productMapper.insert(dbProduct);// @Sql: 先插入出一条存在的数据  
57 - // 准备参数  
58 - ProductSaveReqVO updateReqVO = randomPojo(ProductSaveReqVO.class, o -> {  
59 - o.setId(dbProduct.getId()); // 设置更新的 ID  
60 - });  
61 -  
62 - // 调用  
63 - productService.updateProduct(updateReqVO);  
64 - // 校验是否更新正确  
65 - ErpProductDO product = productMapper.selectById(updateReqVO.getId()); // 获取最新的  
66 - assertPojoEquals(updateReqVO, product);  
67 - }  
68 -  
69 - @Test  
70 - public void testUpdateProduct_notExists() {  
71 - // 准备参数  
72 - ProductSaveReqVO updateReqVO = randomPojo(ProductSaveReqVO.class);  
73 -  
74 - // 调用, 并断言异常  
75 - assertServiceException(() -> productService.updateProduct(updateReqVO), PRODUCT_NOT_EXISTS);  
76 - }  
77 -  
78 - @Test  
79 - public void testDeleteProduct_success() {  
80 - // mock 数据  
81 - ErpProductDO dbProduct = randomPojo(ErpProductDO.class);  
82 - productMapper.insert(dbProduct);// @Sql: 先插入出一条存在的数据  
83 - // 准备参数  
84 - Long id = dbProduct.getId();  
85 -  
86 - // 调用  
87 - productService.deleteProduct(id);  
88 - // 校验数据不存在了  
89 - assertNull(productMapper.selectById(id));  
90 - }  
91 -  
92 - @Test  
93 - public void testDeleteProduct_notExists() {  
94 - // 准备参数  
95 - Long id = randomLongId();  
96 -  
97 - // 调用, 并断言异常  
98 - assertServiceException(() -> productService.deleteProduct(id), PRODUCT_NOT_EXISTS);  
99 - }  
100 -  
101 - @Test  
102 - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解  
103 - public void testGetProductPage() {  
104 - // mock 数据  
105 - ErpProductDO dbProduct = randomPojo(ErpProductDO.class, o -> { // 等会查询到  
106 - o.setName(null);  
107 - o.setCategoryId(null);  
108 - o.setCreateTime(null);  
109 - });  
110 - productMapper.insert(dbProduct);  
111 - // 测试 name 不匹配  
112 - productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setName(null)));  
113 - // 测试 categoryId 不匹配  
114 - productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setCategoryId(null)));  
115 - // 测试 createTime 不匹配  
116 - productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setCreateTime(null)));  
117 - // 准备参数  
118 - ErpProductPageReqVO reqVO = new ErpProductPageReqVO();  
119 - reqVO.setName(null);  
120 - reqVO.setCategoryId(null);  
121 - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));  
122 -  
123 - // 调用  
124 - PageResult<ErpProductDO> pageResult = productService.getProductVOPage(reqVO);  
125 - // 断言  
126 - assertEquals(1, pageResult.getTotal());  
127 - assertEquals(1, pageResult.getList().size());  
128 - assertPojoEquals(dbProduct, pageResult.getList().get(0));  
129 - }  
130 -  
131 -}  
132 \ No newline at end of file 0 \ No newline at end of file
yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/sale/ErpCustomerServiceImplTest.java deleted
1 -package cn.iocoder.yudao.module.erp.service.sale;  
2 -  
3 -import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.customer.ErpCustomerPageReqVO;  
4 -import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.customer.ErpCustomerSaveReqVO;  
5 -import org.junit.jupiter.api.Disabled;  
6 -import org.junit.jupiter.api.Test;  
7 -  
8 -import jakarta.annotation.Resource;  
9 -  
10 -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;  
11 -  
12 -import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpCustomerDO;  
13 -import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpCustomerMapper;  
14 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
15 -  
16 -import org.springframework.context.annotation.Import;  
17 -  
18 -import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*;  
19 -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;  
20 -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;  
21 -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;  
22 -import static org.junit.jupiter.api.Assertions.*;  
23 -  
24 -/**  
25 - * {@link ErpCustomerServiceImpl} 的单元测试类  
26 - *  
27 - * @author 芋道源码  
28 - */  
29 -@Import(ErpCustomerServiceImpl.class)  
30 -public class ErpCustomerServiceImplTest extends BaseDbUnitTest {  
31 -  
32 - @Resource  
33 - private ErpCustomerServiceImpl customerService;  
34 -  
35 - @Resource  
36 - private ErpCustomerMapper customerMapper;  
37 -  
38 - @Test  
39 - public void testCreateCustomer_success() {  
40 - // 准备参数  
41 - ErpCustomerSaveReqVO createReqVO = randomPojo(ErpCustomerSaveReqVO.class).setId(null);  
42 -  
43 - // 调用  
44 - Long customerId = customerService.createCustomer(createReqVO);  
45 - // 断言  
46 - assertNotNull(customerId);  
47 - // 校验记录的属性是否正确  
48 - ErpCustomerDO customer = customerMapper.selectById(customerId);  
49 - assertPojoEquals(createReqVO, customer, "id");  
50 - }  
51 -  
52 - @Test  
53 - public void testUpdateCustomer_success() {  
54 - // mock 数据  
55 - ErpCustomerDO dbCustomer = randomPojo(ErpCustomerDO.class);  
56 - customerMapper.insert(dbCustomer);// @Sql: 先插入出一条存在的数据  
57 - // 准备参数  
58 - ErpCustomerSaveReqVO updateReqVO = randomPojo(ErpCustomerSaveReqVO.class, o -> {  
59 - o.setId(dbCustomer.getId()); // 设置更新的 ID  
60 - });  
61 -  
62 - // 调用  
63 - customerService.updateCustomer(updateReqVO);  
64 - // 校验是否更新正确  
65 - ErpCustomerDO customer = customerMapper.selectById(updateReqVO.getId()); // 获取最新的  
66 - assertPojoEquals(updateReqVO, customer);  
67 - }  
68 -  
69 - @Test  
70 - public void testUpdateCustomer_notExists() {  
71 - // 准备参数  
72 - ErpCustomerSaveReqVO updateReqVO = randomPojo(ErpCustomerSaveReqVO.class);  
73 -  
74 - // 调用, 并断言异常  
75 - assertServiceException(() -> customerService.updateCustomer(updateReqVO), CUSTOMER_NOT_EXISTS);  
76 - }  
77 -  
78 - @Test  
79 - public void testDeleteCustomer_success() {  
80 - // mock 数据  
81 - ErpCustomerDO dbCustomer = randomPojo(ErpCustomerDO.class);  
82 - customerMapper.insert(dbCustomer);// @Sql: 先插入出一条存在的数据  
83 - // 准备参数  
84 - Long id = dbCustomer.getId();  
85 -  
86 - // 调用  
87 - customerService.deleteCustomer(id);  
88 - // 校验数据不存在了  
89 - assertNull(customerMapper.selectById(id));  
90 - }  
91 -  
92 - @Test  
93 - public void testDeleteCustomer_notExists() {  
94 - // 准备参数  
95 - Long id = randomLongId();  
96 -  
97 - // 调用, 并断言异常  
98 - assertServiceException(() -> customerService.deleteCustomer(id), CUSTOMER_NOT_EXISTS);  
99 - }  
100 -  
101 - @Test  
102 - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解  
103 - public void testGetCustomerPage() {  
104 - // mock 数据  
105 - ErpCustomerDO dbCustomer = randomPojo(ErpCustomerDO.class, o -> { // 等会查询到  
106 - o.setName(null);  
107 - o.setMobile(null);  
108 - o.setTelephone(null);  
109 - });  
110 - customerMapper.insert(dbCustomer);  
111 - // 测试 name 不匹配  
112 - customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setName(null)));  
113 - // 测试 mobile 不匹配  
114 - customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setMobile(null)));  
115 - // 测试 telephone 不匹配  
116 - customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setTelephone(null)));  
117 - // 准备参数  
118 - ErpCustomerPageReqVO reqVO = new ErpCustomerPageReqVO();  
119 - reqVO.setName(null);  
120 - reqVO.setMobile(null);  
121 - reqVO.setTelephone(null);  
122 -  
123 - // 调用  
124 - PageResult<ErpCustomerDO> pageResult = customerService.getCustomerPage(reqVO);  
125 - // 断言  
126 - assertEquals(1, pageResult.getTotal());  
127 - assertEquals(1, pageResult.getList().size());  
128 - assertPojoEquals(dbCustomer, pageResult.getList().get(0));  
129 - }  
130 -  
131 -}  
132 \ No newline at end of file 0 \ No newline at end of file
yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/stock/ErpWarehouseServiceImplTest.java deleted
1 -package cn.iocoder.yudao.module.erp.service.stock;  
2 -  
3 -import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse.ErpWarehousePageReqVO;  
4 -import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse.ErpWarehouseSaveReqVO;  
5 -import org.junit.jupiter.api.Disabled;  
6 -import org.junit.jupiter.api.Test;  
7 -  
8 -import jakarta.annotation.Resource;  
9 -  
10 -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;  
11 -  
12 -import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpWarehouseDO;  
13 -import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpWarehouseMapper;  
14 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
15 -  
16 -import org.springframework.context.annotation.Import;  
17 -  
18 -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;  
19 -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;  
20 -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;  
21 -import static org.junit.jupiter.api.Assertions.*;  
22 -  
23 -/**  
24 - * {@link ErpWarehouseServiceImpl} 的单元测试类  
25 - *  
26 - * @author 芋道源码  
27 - */  
28 -@Import(ErpWarehouseServiceImpl.class)  
29 -public class ErpWarehouseServiceImplTest extends BaseDbUnitTest {  
30 -  
31 - @Resource  
32 - private ErpWarehouseServiceImpl warehouseService;  
33 -  
34 - @Resource  
35 - private ErpWarehouseMapper warehouseMapper;  
36 -  
37 - @Test  
38 - public void testCreateWarehouse_success() {  
39 - // 准备参数  
40 - ErpWarehouseSaveReqVO createReqVO = randomPojo(ErpWarehouseSaveReqVO.class).setId(null);  
41 -  
42 - // 调用  
43 - Long warehouseId = warehouseService.createWarehouse(createReqVO);  
44 - // 断言  
45 - assertNotNull(warehouseId);  
46 - // 校验记录的属性是否正确  
47 - ErpWarehouseDO warehouse = warehouseMapper.selectById(warehouseId);  
48 - assertPojoEquals(createReqVO, warehouse, "id");  
49 - }  
50 -  
51 - @Test  
52 - public void testUpdateWarehouse_success() {  
53 - // mock 数据  
54 - ErpWarehouseDO dbWarehouse = randomPojo(ErpWarehouseDO.class);  
55 - warehouseMapper.insert(dbWarehouse);// @Sql: 先插入出一条存在的数据  
56 - // 准备参数  
57 - ErpWarehouseSaveReqVO updateReqVO = randomPojo(ErpWarehouseSaveReqVO.class, o -> {  
58 - o.setId(dbWarehouse.getId()); // 设置更新的 ID  
59 - });  
60 -  
61 - // 调用  
62 - warehouseService.updateWarehouse(updateReqVO);  
63 - // 校验是否更新正确  
64 - ErpWarehouseDO warehouse = warehouseMapper.selectById(updateReqVO.getId()); // 获取最新的  
65 - assertPojoEquals(updateReqVO, warehouse);  
66 - }  
67 -  
68 - @Test  
69 - public void testUpdateWarehouse_notExists() {  
70 - // 准备参数  
71 - ErpWarehouseSaveReqVO updateReqVO = randomPojo(ErpWarehouseSaveReqVO.class);  
72 -  
73 - // 调用, 并断言异常  
74 - assertServiceException(() -> warehouseService.updateWarehouse(updateReqVO), WAREHOUSE_NOT_EXISTS);  
75 - }  
76 -  
77 - @Test  
78 - public void testDeleteWarehouse_success() {  
79 - // mock 数据  
80 - ErpWarehouseDO dbWarehouse = randomPojo(ErpWarehouseDO.class);  
81 - warehouseMapper.insert(dbWarehouse);// @Sql: 先插入出一条存在的数据  
82 - // 准备参数  
83 - Long id = dbWarehouse.getId();  
84 -  
85 - // 调用  
86 - warehouseService.deleteWarehouse(id);  
87 - // 校验数据不存在了  
88 - assertNull(warehouseMapper.selectById(id));  
89 - }  
90 -  
91 - @Test  
92 - public void testDeleteWarehouse_notExists() {  
93 - // 准备参数  
94 - Long id = randomLongId();  
95 -  
96 - // 调用, 并断言异常  
97 - assertServiceException(() -> warehouseService.deleteWarehouse(id), WAREHOUSE_NOT_EXISTS);  
98 - }  
99 -  
100 - @Test  
101 - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解  
102 - public void testGetWarehousePage() {  
103 - // mock 数据  
104 - ErpWarehouseDO dbWarehouse = randomPojo(ErpWarehouseDO.class, o -> { // 等会查询到  
105 - o.setName(null);  
106 - o.setStatus(null);  
107 - });  
108 - warehouseMapper.insert(dbWarehouse);  
109 - // 测试 name 不匹配  
110 - warehouseMapper.insert(cloneIgnoreId(dbWarehouse, o -> o.setName(null)));  
111 - // 测试 status 不匹配  
112 - warehouseMapper.insert(cloneIgnoreId(dbWarehouse, o -> o.setStatus(null)));  
113 - // 准备参数  
114 - ErpWarehousePageReqVO reqVO = new ErpWarehousePageReqVO();  
115 - reqVO.setName(null);  
116 - reqVO.setStatus(null);  
117 -  
118 - // 调用  
119 - PageResult<ErpWarehouseDO> pageResult = warehouseService.getWarehousePage(reqVO);  
120 - // 断言  
121 - assertEquals(1, pageResult.getTotal());  
122 - assertEquals(1, pageResult.getList().size());  
123 - assertPojoEquals(dbWarehouse, pageResult.getList().get(0));  
124 - }  
125 -  
126 -}  
127 \ No newline at end of file 0 \ No newline at end of file