docs/sql/config_export_all_20260904.sql
@@ -4401,7 +4401,7 @@ `no` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '忬¾ç¼å·', `plan_id` bigint DEFAULT NULL COMMENT '忬¾è®¡åç¼å·', `customer_id` bigint NOT NULL COMMENT '客æ·ç¼å·', `contract_id` bigint NOT NULL COMMENT 'ååç¼å·', `contract_id` bigint DEFAULT NULL COMMENT 'ååç¼å·', `invoice_id` bigint DEFAULT NULL COMMENT 'å ³èçå¼ç¥¨ç¼å·ï¼å ³è crm_invoice.id', `owner_user_id` bigint DEFAULT NULL COMMENT 'è´è´£äººç¼å·', `return_time` datetime DEFAULT NULL COMMENT '忬¾æ¥æ', docs/sql/crm_receivable_optional_contract.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,11 @@ -- 忬¾ç®¡ççãåååç§°ããå ³èå¼ç¥¨ãæ¹ä¸ºéå¿ å¡« -- -- èæ¯ï¼ä¸å¡å 许ä¸å ³èååãä¸å ³èå¼ç¥¨ç´æ¥ç»è®°å款ã -- 代ç ä¾§å·²å»ææ ¡éªï¼ä½ crm_receivable.contract_id ä»ä¸º NOT NULLï¼ -- 䏿¾å¼ä¼å¯¼è´æ°å¢ï¼æ ååï¼åæ¬¾æ¶æ¥ Field 'contract_id' doesn't have a default valueã -- invoice_id æ¬èº«å·²æ¯ NULL å¯ç©ºï¼æ éå¤çã -- -- æ¬èæ¬å¹çï¼å¯é夿§è¡ã ALTER TABLE crm_receivable MODIFY COLUMN contract_id bigint DEFAULT NULL COMMENT 'ååç¼å·'; yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/receivable/CrmReceivableSaveReqVO.java
@@ -27,14 +27,12 @@ @DiffLogField(name = "客æ·", function = CrmCustomerParseFunction.NAME) private Long customerId; // è¯¥åæ®µä¸éè¿åç«¯ä¼ éï¼èæ¯ contractId æ¥è¯¢åºæ¥è®¾ç½®è¿å» @Schema(description = "ååç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") @Schema(description = "ååç¼å·", example = "2") @DiffLogField(name = "åå", function = CrmContractParseFunction.NAME) @NotNull(message = "ååç¼å·ä¸è½ä¸ºç©º") private Long contractId; @Schema(description = "å ³èçå¼ç¥¨ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "25787") @Schema(description = "å ³èçå¼ç¥¨ç¼å·", example = "25787") @DiffLogField(name = "å ³èå¼ç¥¨", function = CrmInvoiceParseFunction.NAME) @NotNull(message = "å ³èå¼ç¥¨ç¼å·ä¸è½ä¸ºç©º") private Long invoiceId; @Schema(description = "忬¾è®¡åç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivableServiceImpl.java
@@ -80,12 +80,17 @@ public Long createReceivable(CrmReceivableSaveReqVO createReqVO) { // 1.1 æ ¡éªå ³èæ°æ®åå¨ validateRelationDataExists(createReqVO); // 1.2 æ ¡éªå ³èå¼ç¥¨åæ ¼ï¼å®¡æ¹éè¿ + å·²ä¸ä¼ å票éä»¶ + ä¸ååå¹é ï¼ validateInvoiceForReceivable(createReqVO); // 1.3 æ ¡éªå¯å款éé¢ä¸è¶ è¿ååå©ä½å¯å款éé¢ validateReceivablePriceExceedsLimit(createReqVO); // 1.4 æ ¡éªå¯å款éé¢ä¸è¶ è¿è¯¥å¼ç¥¨å©ä½å¯å款éé¢ï¼å å¼ç¥¨å忬¾ï¼ validateReceivablePriceExceedsInvoiceRemaining(createReqVO); // 1.2 ååãå ³èå¼ç¥¨å为éå¿ å¡«ï¼æªéæ©æ¶è·³è¿å¯¹åºæ ¡éªï¼ä» æå·²å¡«åç维度约æéé¢ if (createReqVO.getContractId() != null) { // æ ¡éªå¯å款éé¢ä¸è¶ è¿ååå©ä½å¯å款éé¢ validateReceivablePriceExceedsLimit(createReqVO); } if (createReqVO.getInvoiceId() != null) { // æ ¡éªå ³èå¼ç¥¨åæ ¼ï¼å®¡æ¹éè¿ + å·²ä¸ä¼ å票éä»¶ + ä¸ååå¹é ï¼ validateInvoiceForReceivable(createReqVO); // æ ¡éªå¯å款éé¢ä¸è¶ è¿è¯¥å¼ç¥¨å©ä½å¯å款éé¢ï¼å å¼ç¥¨å忬¾ï¼ validateReceivablePriceExceedsInvoiceRemaining(createReqVO); } // 1.5 çæå款ç¼å· String no = noRedisDAO.generate(CrmNoRedisDAO.RECEIVABLE_PREFIX); if (receivableMapper.selectByNo(no) != null) { @@ -220,12 +225,17 @@ if (updateReqVO.getInvoiceId() == null) { updateReqVO.setInvoiceId(oldReceivable.getInvoiceId()); } // 1.3 æ ¡éªå¯å款éé¢ä¸è¶ è¿ååå©ä½å¯å款éé¢ validateReceivablePriceExceedsLimit(updateReqVO); // 1.4 æ ¡éªå ³èå¼ç¥¨åæ ¼ validateInvoiceForReceivable(updateReqVO); // 1.5 æ ¡éªå¯å款éé¢ä¸è¶ è¿è¯¥å¼ç¥¨å©ä½å¯å款éé¢ validateReceivablePriceExceedsInvoiceRemaining(updateReqVO); // 1.3 ååãå ³èå¼ç¥¨å为éå¿ å¡«ï¼æªå¡«åæ¶è·³è¿å¯¹åºæ ¡éª if (updateReqVO.getContractId() != null) { // æ ¡éªå¯å款éé¢ä¸è¶ è¿ååå©ä½å¯å款éé¢ validateReceivablePriceExceedsLimit(updateReqVO); } if (updateReqVO.getInvoiceId() != null) { // æ ¡éªå ³èå¼ç¥¨åæ ¼ validateInvoiceForReceivable(updateReqVO); // æ ¡éªå¯å款éé¢ä¸è¶ è¿è¯¥å¼ç¥¨å©ä½å¯å款éé¢ validateReceivablePriceExceedsInvoiceRemaining(updateReqVO); } // 1.6 åªææªå®¡æ ¸ï¼å¯ä»¥ç¼è¾ï¼ if (ObjectUtil.notEqual(oldReceivable.getAuditStatus(), CrmAuditStatusEnum.PROCESS.getStatus())) {