feat: 采购订单/采购申请/销售订单/报价单/开票/销售合同/采购来票 支持自定义编号
- 5 个 SaveReqVO 增加 no 字段:ErpPurchaseOrder / ErpPurchaseRequest / ErpSaleOrder /
ErpPurchaseInvoice / CrmContract(CrmInvoice、CrmSaleQuotation 原本已有)
- 6 个 create 方法改为「前端填写则用自定义单号,留空则自动生成」并校验唯一性:
ErpPurchaseOrderServiceImpl / ErpPurchaseRequestServiceImpl /
ErpSaleOrderServiceImpl /
ErpPurchaseInvoiceServiceImpl / CrmInvoiceServiceImpl / CrmContractServiceImpl
(ErpPurchaseInvoiceServiceImpl 补 StrUtil import)
| | |
| | | @Schema(description = "合同编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") |
| | | private Long id; |
| | | |
| | | @Schema(description = "合同编号(业务单号)", example = "HT20260101001") |
| | | private String no; |
| | | |
| | | @Schema(description = "合同名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") |
| | | @DiffLogField(name = "合同名称") |
| | | @NotNull(message = "合同名称不能为空") |
| | |
| | | List<CrmContractProductDO> contractProducts = validateContractProducts(createReqVO.getProducts()); |
| | | // 1.2 校验关联字段 |
| | | validateRelationDataExists(createReqVO); |
| | | // 1.3 生成序号 |
| | | String no = noRedisDAO.generate(CrmNoRedisDAO.CONTRACT_NO_PREFIX); |
| | | // 1.3 确定合同编号(前端填写则用自定义单号,留空则自动生成),并校验唯一性 |
| | | String customNo = StrUtil.trim(createReqVO.getNo()); |
| | | String no = StrUtil.isNotBlank(customNo) ? customNo |
| | | : noRedisDAO.generate(CrmNoRedisDAO.CONTRACT_NO_PREFIX); |
| | | if (contractMapper.selectByNo(no) != null) { |
| | | throw exception(CONTRACT_NO_EXISTS); |
| | | } |
| | |
| | | validateInvoicePriceExceedsLimit(createReqVO); |
| | | // 1.2 校验关联数据存在 |
| | | validateRelationDataExists(createReqVO); |
| | | // 1.3 生成开票编号 |
| | | String no = noRedisDAO.generate(CrmNoRedisDAO.INVOICE_PREFIX); |
| | | // 1.3 确定开票编号(前端填写则用自定义单号,留空则自动生成),并校验唯一性 |
| | | String customNo = StrUtil.trim(createReqVO.getNo()); |
| | | String no = StrUtil.isNotBlank(customNo) ? customNo |
| | | : noRedisDAO.generate(CrmNoRedisDAO.INVOICE_PREFIX); |
| | | if (invoiceMapper.selectByNo(no) != null) { |
| | | throw exception(INVOICE_NO_EXISTS); |
| | | } |
| | |
| | | @Schema(description = "编号", example = "25787") |
| | | private Long id; |
| | | |
| | | @Schema(description = "来票编号", example = "PI20260101001") |
| | | private String no; |
| | | |
| | | @Schema(description = "供应商编号", example = "29399") |
| | | private Long supplierId; // 该字段不通过前端传递,而是 purchaseOrderId 查询出来设置进去 |
| | | |
| | |
| | | @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17386") |
| | | private Long id; |
| | | |
| | | @Schema(description = "订单编号", example = "PO20260101001") |
| | | private String no; |
| | | |
| | | @Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1724") |
| | | @NotNull(message = "供应商编号不能为空") |
| | | private Long supplierId; |
| | |
| | | @Schema(description = "编号(修改时必填)", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "申请编号", example = "PR20260101001") |
| | | private String no; |
| | | |
| | | @Schema(description = "申请时间", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "申请时间不能为空") |
| | | private LocalDateTime requestTime; |
| | |
| | | @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17386") |
| | | private Long id; |
| | | |
| | | @Schema(description = "订单编号", example = "SO20260101001") |
| | | private String no; |
| | | |
| | | @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1724") |
| | | @NotNull(message = "客户编号不能为空") |
| | | private Long customerId; |
| | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.lang.Assert; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.invoice.ErpPurchaseInvoicePageReqVO; |
| | |
| | | validateRelationDataExists(createReqVO); |
| | | // 1.2 校验可开票金额超过上限 |
| | | validatePurchaseInvoicePriceExceedsLimit(createReqVO); |
| | | // 1.3 生成来票编号 |
| | | String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_INVOICE_NO_PREFIX); |
| | | // 1.3 确定来票编号(前端填写则用自定义单号,留空则自动生成),并校验唯一性 |
| | | String customNo = StrUtil.trim(createReqVO.getNo()); |
| | | String no = StrUtil.isNotBlank(customNo) ? customNo |
| | | : noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_INVOICE_NO_PREFIX); |
| | | if (invoiceMapper.selectByNo(no) != null) { |
| | | throw exception(PURCHASE_INVOICE_NO_EXISTS); |
| | | } |
| | |
| | | if (createReqVO.getAccountId() != null) { |
| | | accountService.validateAccount(createReqVO.getAccountId()); |
| | | } |
| | | // 1.4 生成订单号,并校验唯一性 |
| | | String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_ORDER_NO_PREFIX); |
| | | // 1.4 确定订单号(前端填写则用自定义单号,留空则自动生成),并校验唯一性 |
| | | String customNo = StrUtil.trim(createReqVO.getNo()); |
| | | String no = StrUtil.isNotBlank(customNo) ? customNo |
| | | : noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_ORDER_NO_PREFIX); |
| | | if (purchaseOrderMapper.selectByNo(no) != null) { |
| | | throw exception(PURCHASE_ORDER_NO_EXISTS); |
| | | } |
| | |
| | | if (createReqVO.getSupplierId() != null) { |
| | | supplierService.validateSupplier(createReqVO.getSupplierId()); |
| | | } |
| | | // 3. 生成申请单号 |
| | | String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_REQUEST_NO_PREFIX); |
| | | // 3. 确定申请单号(前端填写则用自定义单号,留空则自动生成),并校验唯一性 |
| | | String customNo = StrUtil.trim(createReqVO.getNo()); |
| | | String no = StrUtil.isNotBlank(customNo) ? customNo |
| | | : noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_REQUEST_NO_PREFIX); |
| | | if (purchaseRequestMapper.selectByNo(no) != null) { |
| | | throw exception(PURCHASE_REQUEST_NO_EXISTS); |
| | | } |
| | |
| | | if (createReqVO.getSaleUserId() != null) { |
| | | adminUserApi.validateUser(createReqVO.getSaleUserId()); |
| | | } |
| | | // 1.5 生成订单号,并校验唯一性 |
| | | String no = noRedisDAO.generate(ErpNoRedisDAO.SALE_ORDER_NO_PREFIX); |
| | | // 1.5 确定订单号(前端填写则用自定义单号,留空则自动生成),并校验唯一性 |
| | | String customNo = StrUtil.trim(createReqVO.getNo()); |
| | | String no = StrUtil.isNotBlank(customNo) ? customNo |
| | | : noRedisDAO.generate(ErpNoRedisDAO.SALE_ORDER_NO_PREFIX); |
| | | if (saleOrderMapper.selectByNo(no) != null) { |
| | | throw exception(SALE_ORDER_NO_EXISTS); |
| | | } |