.gitignore
@@ -11,6 +11,7 @@ ###################################################################### # Claude Code .claude/ .mcp.json ### STS ### docs/ÐÂÔö¸¶¿î½Ó¿ÚÁªµ÷Îĵµ.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,104 @@ # æ°å¢ä»æ¬¾æ¥å£èè°ææ¡£ ## æ¦è¿° å¨ä»æ¬¾å°è´¦é¡µé¢ï¼`src/views/procurementManagement/paymentLedger/index.vue`ï¼å³ä¾§ä¾åºåæç»è¡¨æ ¼ä¸ï¼æ¯æ¡æ°æ®æ°å¢äºãæ°å¢ä»æ¬¾ãæä½æé®ãç¹å»åå¼¹åºè¡¨åï¼å¡«å仿¬¾ä¿¡æ¯å¹¶æäº¤ã --- ## æ¥å£ä¿¡æ¯ - **URL**: `/purchase/report/savePayment` - **Method**: `POST` - **Content-Type**: `application/json` --- ## 请æ±åæ° | åæ®µ | ç±»å | å¿ å¡« | 说æ | |------|------|------|------| | `supplierId` | String | æ¯ | ä¾åºåIDï¼æ¥èªä¸»è¡¨ï¼å·¦ä¾§ï¼å½åéä¸è¡ç `supplierId` | | `purchaseContractNumber` | String | æ¯ | éè´ååå·ï¼æ¥èªæç»è¡ï¼å³ä¾§ï¼æ°æ®ç `purchaseContractNumber` | | `paymentDate` | String | æ¯ | 仿¬¾æ¥æï¼æ ¼å¼ `YYYY-MM-DD` | | `paymentAmount` | Number | æ¯ | 仿¬¾éé¢ï¼ä¿ç两ä½å°æ°ï¼æå°å¼ 0.01 | | `paymentMethod` | String | æ¯ | 仿¬¾æ¹å¼ï¼å¯éå¼è§ä¸æ¹æä¸¾è¡¨ | | `remark` | String | å¦ | 夿³¨ä¿¡æ¯ | ### 仿¬¾æ¹å¼æä¸¾å¼ | å¼ | 说æ | |------|------| | `é¶è¡è½¬è´¦` | é¶è¡è½¬è´¦ | | `ç°é` | ç°é | | `æ¯ç¥¨` | æ¯ç¥¨ | | `微信/æ¯ä»å®` | 微信/æ¯ä»å® | | `å ¶ä»` | å ¶ä»æ¹å¼ | --- ## 请æ±ç¤ºä¾ ```json { "supplierId": "SUPP001", "purchaseContractNumber": "CG-2024-0001", "paymentDate": "2024-08-12", "paymentAmount": 50000.00, "paymentMethod": "é¶è¡è½¬è´¦", "remark": "ååç¬¬ä¸æä»æ¬¾" } ``` --- ## ååºæ ¼å¼ ### æå ```json { "code": 200, "msg": "æä½æå", "data": null } ``` ### 失败 ```json { "code": 500, "msg": "å ·ä½é误信æ¯", "data": null } ``` --- ## å端è°ç¨æµç¨ 1. ç¨æ·å¨å·¦ä¾§ä¸»è¡¨ç¹å»æä¾åºåè¡ï¼å³ä¾§å 载该ä¾åºåçååæç» 2. ç¨æ·å¨å³ä¾§æç»è¡¨ç¹å»æè¡çãæ°å¢ä»æ¬¾ãæé® 3. å¼¹åºå¯¹è¯æ¡ï¼å±ç¤ºå½åååçéè´ååå·ï¼åªè¯»ï¼ 4. ç¨æ·å¡«å仿¬¾æ¥æãéé¢ãæ¹å¼ã夿³¨åç¹å»ç¡®è®¤ 5. å端è°ç¨ `POST /purchase/report/savePayment` 6. æååå ³éå¼¹æ¡ï¼èªå¨å·æ°å·¦ä¾§ä¾åºåæ±æ»è¡¨åå³ä¾§æç»è¡¨ 7. 失败åæç¤ºå端è¿åç `msg` éè¯¯ä¿¡æ¯ --- ## åç«¯è¡¨åæ ¡éªè§å | åæ®µ | è§å | |------|------| | `paymentDate` | å¿ å¡«ï¼æªéæ©æ¶æç¤º"è¯·éæ©ä»æ¬¾æ¥æ" | | `paymentAmount` | å¿ å¡«ï¼ä¸è½è¶ è¿å¯ä»æ¬¾ä½é¢ï¼åºä»éé¢ - 仿¬¾éé¢ï¼ï¼è¶ éæ¶æç¤º"仿¬¾éé¢ä¸è½è¶ è¿å¯ä»æ¬¾ä½é¢ XXX å " | | `paymentMethod` | å¿ å¡«ï¼æªéæ©æ¶æç¤º"è¯·éæ©ä»æ¬¾æ¹å¼" | | `remark` | éå¡«ï¼æ æ ¡éª | ### å¯ä»æ¬¾ä½é¢è®¡ç® å½åè¡å¯ä»æ¬¾ä½é¢ = `payableAmount`ï¼åºä»éé¢ï¼ - `paymentAmount`ï¼ä»æ¬¾éé¢ï¼ æ¯æ¬¡æå¼æ°å¢ä»æ¬¾å¼¹æ¡æ¶ï¼ä»æ¬¾éé¢è¾å ¥æ¡ä¸æ¹ä¼æ¾ç¤ºé»è²æç¤ºæå"å½åå¯ä»æ¬¾ä½é¢ï¼XXX å "ã docs/ÐÂÔö»Ø¿î½Ó¿ÚÁªµ÷Îĵµ.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,97 @@ # æ°å¢å款æ¥å£èè°ææ¡£ ## æ¦è¿° 卿¶ä»æ¬¾å°è´¦é¡µé¢ï¼`src/views/salesManagement/receiptPaymentLedger/index.vue`ï¼å³ä¾§å®¢æ·æç»è¡¨æ ¼ä¸ï¼æ¯æ¡æ°æ®æ°å¢äºãæ°å¢å款ãæä½æé®ãç¹å»åå¼¹åºè¡¨åï¼å¡«å忬¾ä¿¡æ¯å¹¶æäº¤ã --- ## æ¥å£ä¿¡æ¯ - **URL**: `/metricStatistics/saveReceiptPayment` - **Method**: `POST` - **Content-Type**: `application/json` --- ## 请æ±åæ° | åæ®µ | ç±»å | å¿ å¡« | 说æ | |------|------|------|------| | `customerId` | String | æ¯ | 客æ·IDï¼æ¥èªä¸»è¡¨ï¼å·¦ä¾§ï¼å½åéä¸è¡ç `customerId` | | `salesContractNo` | String | æ¯ | éå®ååå·ï¼æ¥èªæç»è¡ï¼å³ä¾§ï¼æ°æ®ç `salesContractNo` | | `paymentDate` | String | æ¯ | 忬¾æ¥æï¼æ ¼å¼ `YYYY-MM-DD` | | `paymentAmount` | Number | æ¯ | 忬¾éé¢ï¼ä¿ç两ä½å°æ°ï¼æå°å¼ 0.01 | | `paymentMethod` | String | æ¯ | 忬¾æ¹å¼ï¼å¯éå¼è§ä¸æ¹æä¸¾è¡¨ | | `remark` | String | å¦ | 夿³¨ä¿¡æ¯ | ### 忬¾æ¹å¼æä¸¾å¼ | å¼ | 说æ | |------|------| | `é¶è¡è½¬è´¦` | é¶è¡è½¬è´¦ | | `ç°é` | ç°é | | `æ¯ç¥¨` | æ¯ç¥¨ | | `微信/æ¯ä»å®` | 微信/æ¯ä»å® | | `å ¶ä»` | å ¶ä»æ¹å¼ | --- ## 请æ±ç¤ºä¾ ```json { "customerId": "CUST001", "salesContractNo": "XS-2024-0001", "paymentDate": "2024-08-12", "paymentAmount": 50000.00, "paymentMethod": "é¶è¡è½¬è´¦", "remark": "ååç¬¬ä¸æåæ¬¾" } ``` --- ## ååºæ ¼å¼ ### æå ```json { "code": 200, "msg": "æä½æå", "data": null } ``` ### 失败 ```json { "code": 500, "msg": "å ·ä½é误信æ¯", "data": null } ``` --- ## å端è°ç¨æµç¨ 1. ç¨æ·å¨å³ä¾§æç»è¡¨ç¹å»æè¡çãæ°å¢å款ãæé® 2. å¼¹åºå¯¹è¯æ¡ï¼å±ç¤ºå½åååçéå®ååå·ï¼åªè¯»ï¼ 3. ç¨æ·å¡«å忬¾æ¥æãéé¢ãæ¹å¼ã夿³¨åç¹å»ç¡®è®¤ 4. å端è°ç¨ `POST /metricStatistics/saveReceiptPayment` 5. æååå ³éå¼¹æ¡ï¼èªå¨å·æ°å·¦ä¾§å®¢æ·æ±æ»è¡¨åå³ä¾§æç»è¡¨ 6. 失败åæç¤ºå端è¿åç `msg` éè¯¯ä¿¡æ¯ --- ## åç«¯è¡¨åæ ¡éªè§å | åæ®µ | è§å | |------|------| | `paymentDate` | å¿ å¡«ï¼æªéæ©æ¶æç¤º"è¯·éæ©åæ¬¾æ¥æ" | | `paymentAmount` | å¿ å¡«ï¼æªè¾å ¥æ¶æç¤º"请è¾å ¥å款éé¢" | | `paymentMethod` | å¿ å¡«ï¼æªéæ©æ¶æç¤º"è¯·éæ©åæ¬¾æ¹å¼" | | `remark` | éå¡«ï¼æ æ ¡éª | src/main/java/com/ruoyi/account/mapper/purchase/AccountPurchasePaymentMapper.java
@@ -26,4 +26,11 @@ IPage<AccountPurchasePaymentVo> listPageAccountPurchasePayment(Page page, @Param("req") AccountPurchasePaymentDto accountPurchasePaymentDto); List<IncomeExpenseAnalysisDto> selectPayment(@Param("startStr") String startStr, @Param("endStr") String endStr, @Param("dateFormat") String dateFormat); /** * æ¥è¯¢æéè´å°è´¦ä¸å·²å®¡æ¹çéè´å ¥åºè®°å½idå表 * @param purchaseLedgerId éè´å°è´¦id * @return å ¥åºè®°å½idå表 */ List<Long> selectStockInRecordIdsByPurchaseLedgerId(@Param("purchaseLedgerId") Long purchaseLedgerId); } src/main/java/com/ruoyi/account/mapper/sales/AccountSalesCollectionMapper.java
@@ -32,4 +32,11 @@ List<SalesOutboundVo> getOutboundBatchesByCustomer(@Param("customerId") Integer customerId); List<IncomeExpenseAnalysisDto> selectIncomeStats(@Param("startStr") String startStr, @Param("endStr") String endStr, @Param("dateFormat") String dateFormat); /** * æ¥è¯¢æéå®å°è´¦ä¸å·²å®¡æ¹çéå®åºåºè®°å½idå表 * @param salesLedgerId éå®å°è´¦id * @return åºåºè®°å½idå表 */ List<Long> selectStockOutRecordIdsBySalesLedgerId(@Param("salesLedgerId") Long salesLedgerId); } src/main/java/com/ruoyi/account/service/impl/purchase/AccountPurchasePaymentServiceImpl.java
@@ -1,10 +1,11 @@ package com.ruoyi.account.service.impl.purchase; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.xiaoymin.knife4j.core.util.CollectionUtils; import com.ruoyi.account.bean.dto.purchase.AccountPurchasePaymentDto; import com.ruoyi.account.bean.vo.purchase.AccountPurchasePaymentVo; import com.ruoyi.account.mapper.AccountStatementDetailsMapper; @@ -17,15 +18,20 @@ import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.purchase.dto.SavePaymentDto; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Random; import java.util.stream.Collectors; /** * <p> @@ -43,6 +49,7 @@ private final AccountPurchasePaymentMapper accountPurchasePaymentMapper; private final AccountStatementDetailsMapper accountStatementDetailsMapper; private final AccountPaymentApplicationMapper accountPaymentApplicationMapper; private final PurchaseLedgerMapper purchaseLedgerMapper; @Override public IPage<AccountPurchasePaymentVo> listPageAccountPurchasePayment(Page page, AccountPurchasePaymentDto accountPurchasePaymentDto) { @@ -84,6 +91,63 @@ return removeByIds(ids); } @Override @Transactional(rollbackFor = Exception.class) public boolean savePayment(SavePaymentDto dto) { if (dto.getPaymentDate() == null) { throw new ServiceException("è¯·éæ©ä»æ¬¾æ¥æ"); } if (dto.getPaymentAmount() == null || dto.getPaymentAmount().compareTo(BigDecimal.valueOf(0.01)) < 0) { throw new ServiceException("请è¾å ¥ä»æ¬¾éé¢"); } if (StringUtils.isEmpty(dto.getPurchaseContractNumber())) { throw new ServiceException("éè´ååå·ä¸è½ä¸ºç©º"); } if (dto.getSupplierId() == null) { throw new ServiceException("ä¾åºåä¸è½ä¸ºç©º"); } PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>() .eq(PurchaseLedger::getPurchaseContractNumber, dto.getPurchaseContractNumber())); if (purchaseLedger == null) { throw new ServiceException("éè´ååä¸åå¨"); } if (purchaseLedger.getSupplierId() == null || purchaseLedger.getSupplierId().longValue() != dto.getSupplierId().longValue()) { throw new ServiceException("ä¾åºåä¸ååä¸å¹é "); } List<Long> stockInRecordIds = accountPurchasePaymentMapper.selectStockInRecordIdsByPurchaseLedgerId(purchaseLedger.getId()); if (CollectionUtils.isEmpty(stockInRecordIds)) { throw new ServiceException("该ååææ å¯ä»æ¬¾çéè´å ¥åºè®°å½"); } AccountPaymentApplication application = new AccountPaymentApplication(); application.setSupplierId(dto.getSupplierId().intValue()); application.setStockInRecordIds(stockInRecordIds.stream().map(String::valueOf).collect(Collectors.joining(","))); application.setInvoiceApplicationNo(genPaymentApplicationNo()); application.setPaymentMethod(dto.getPaymentMethod()); application.setPaymentContent(dto.getPurchaseContractNumber()); application.setApplyDate(dto.getPaymentDate()); application.setRemark(dto.getRemark()); application.setStatus(1); application.setPaymentAmount(dto.getPaymentAmount()); accountPaymentApplicationMapper.insert(application); AccountPurchasePayment payment = new AccountPurchasePayment(); payment.setAccountPaymentApplicationId(application.getId()); payment.setSupplierId(dto.getSupplierId().intValue()); payment.setPaymentDate(dto.getPaymentDate()); payment.setPaymentMethod(dto.getPaymentMethod()); payment.setPaymentAmount(dto.getPaymentAmount()); payment.setPaymentNumber(genAccountPurchasePaymentNo()); payment.setRemark(dto.getRemark()); return save(payment); } private String genPaymentApplicationNo() { return "FK" + LocalDateTime.now().format(CODE_TIME_FORMATTER) + new Random().nextInt(10); } private String genAccountPurchasePaymentNo() { return "SK" + LocalDateTime.now().format(CODE_TIME_FORMATTER) + new Random().nextInt(10); } src/main/java/com/ruoyi/account/service/impl/sales/AccountSalesCollectionServiceImpl.java
@@ -1,5 +1,6 @@ package com.ruoyi.account.service.impl.sales; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -16,15 +17,20 @@ import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.sales.dto.SaveReceiptPaymentDto; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.pojo.SalesLedger; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.stream.Collectors; /** * <p> @@ -40,6 +46,7 @@ private final AccountSalesCollectionMapper accountSalesCollectionMapper; private final AccountStatementDetailsMapper accountStatementDetailsMapper; private final SalesLedgerMapper salesLedgerMapper; private static final DateTimeFormatter CODE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyMMddHHmmss"); @@ -90,6 +97,46 @@ return accountSalesCollectionMapper.getOutboundBatchesByCustomer(customerId); } @Override public boolean saveReceiptPayment(SaveReceiptPaymentDto dto) { if (dto.getPaymentDate() == null) { throw new ServiceException("è¯·éæ©åæ¬¾æ¥æ"); } if (dto.getPaymentAmount() == null || dto.getPaymentAmount().compareTo(BigDecimal.valueOf(0.01)) < 0) { throw new ServiceException("请è¾å ¥å款éé¢"); } if (StringUtils.isEmpty(dto.getSalesContractNo())) { throw new ServiceException("éå®ååå·ä¸è½ä¸ºç©º"); } if (dto.getCustomerId() == null) { throw new ServiceException("客æ·ä¸è½ä¸ºç©º"); } SalesLedger salesLedger = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>() .eq(SalesLedger::getSalesContractNo, dto.getSalesContractNo())); if (salesLedger == null) { throw new ServiceException("éå®ååä¸åå¨"); } if (salesLedger.getCustomerId() == null || salesLedger.getCustomerId().longValue() != dto.getCustomerId().longValue()) { throw new ServiceException("客æ·ä¸ååä¸å¹é "); } List<Long> stockOutRecordIds = accountSalesCollectionMapper.selectStockOutRecordIdsBySalesLedgerId(salesLedger.getId()); if (CollectionUtils.isEmpty(stockOutRecordIds)) { throw new ServiceException("该ååææ å¯å款çéå®åºåºè®°å½"); } AccountSalesCollection collection = new AccountSalesCollection(); collection.setCustomerId(dto.getCustomerId().intValue()); collection.setStockOutRecordIds(stockOutRecordIds.stream().map(String::valueOf).collect(Collectors.joining(","))); collection.setCollectionDate(dto.getPaymentDate()); collection.setCollectionAmount(dto.getPaymentAmount()); collection.setCollectionMethod(dto.getPaymentMethod()); collection.setCollectionNumber(genAccountSalesCollectionNo()); collection.setRemark(dto.getRemark()); return save(collection); } private String genAccountSalesCollectionNo() { return "SK" + LocalDateTime.now().format(CODE_TIME_FORMATTER) + new Random().nextInt(10); } src/main/java/com/ruoyi/account/service/purchase/AccountPurchasePaymentService.java
@@ -5,6 +5,7 @@ import com.ruoyi.account.bean.dto.purchase.AccountPurchasePaymentDto; import com.ruoyi.account.bean.vo.purchase.AccountPurchasePaymentVo; import com.ruoyi.account.pojo.purchase.AccountPurchasePayment; import com.ruoyi.purchase.dto.SavePaymentDto; import com.baomidou.mybatisplus.extension.service.IService; import jakarta.servlet.http.HttpServletResponse; @@ -27,4 +28,12 @@ void exportAccountPurchasePayment(HttpServletResponse response, AccountPurchasePaymentDto accountPurchasePaymentDto); boolean deleteAccountPurchasePayment(List<Long> ids); /** * éè´ç®¡ç--ä¾åºå徿¥ æ°å¢ä»æ¬¾ * * @param dto 仿¬¾è¯·æ±åæ° * @return æ¯å¦æå */ boolean savePayment(SavePaymentDto dto); } src/main/java/com/ruoyi/account/service/sales/AccountSalesCollectionService.java
@@ -6,6 +6,7 @@ import com.ruoyi.account.bean.vo.sales.AccountSalesCollectionVo; import com.ruoyi.account.bean.vo.sales.SalesOutboundVo; import com.ruoyi.account.pojo.sales.AccountSalesCollection; import com.ruoyi.sales.dto.SaveReceiptPaymentDto; import com.baomidou.mybatisplus.extension.service.IService; import jakarta.servlet.http.HttpServletResponse; @@ -30,4 +31,12 @@ boolean deleteAccountSalesCollection(List<Long> ids); List<SalesOutboundVo> getOutboundBatchesByCustomer(Integer customerId); /** * è¥é管ç--客æ·å¾æ¥ æ°å¢å款 * * @param dto 忬¾è¯·æ±åæ° * @return æ¯å¦æå */ boolean saveReceiptPayment(SaveReceiptPaymentDto dto); } src/main/java/com/ruoyi/purchase/controller/AccountingReportController.java
@@ -1,11 +1,13 @@ package com.ruoyi.purchase.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.account.service.purchase.AccountPurchasePaymentService; import com.ruoyi.basic.service.ISupplierService; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.R; import com.ruoyi.purchase.dto.SavePaymentDto; import com.ruoyi.purchase.dto.VatDto; import com.ruoyi.purchase.service.PurchaseReportService; import com.ruoyi.purchase.vo.PurchaseReportVo; @@ -15,6 +17,7 @@ import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -28,6 +31,7 @@ private final ISupplierService supplierService; private final PurchaseReportService purchaseReportService; private final AccountPurchasePaymentService accountPurchasePaymentService; @GetMapping("/list") @@ -74,4 +78,11 @@ public R supplierTransactionsDetails(Page page, Long supplierId) { return R.ok(supplierService.supplierTransactionsDetails(page,supplierId)); } @PostMapping("/savePayment") @Log(title = "æ°å¢ä»æ¬¾", businessType = BusinessType.INSERT) @Operation(summary = "æ°å¢ä»æ¬¾") public R savePayment(@RequestBody SavePaymentDto dto) { return R.ok(accountPurchasePaymentService.savePayment(dto)); } } src/main/java/com/ruoyi/purchase/dto/SavePaymentDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,35 @@ package com.ruoyi.purchase.dto; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDate; /** * éè´ç®¡ç--ä¾åºå徿¥ æ°å¢ä»æ¬¾è¯·æ±åæ° */ @Data @Schema(name = "SavePaymentDto", description = "æ°å¢ä»æ¬¾è¯·æ±åæ°") public class SavePaymentDto { @Schema(description = "ä¾åºåID") private Long supplierId; @Schema(description = "éè´ååå·") private String purchaseContractNumber; @Schema(description = "仿¬¾æ¥æ") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate paymentDate; @Schema(description = "仿¬¾éé¢") private BigDecimal paymentAmount; @Schema(description = "仿¬¾æ¹å¼") private String paymentMethod; @Schema(description = "夿³¨") private String remark; } src/main/java/com/ruoyi/sales/controller/MetricStatisticsController.java
@@ -1,18 +1,22 @@ package com.ruoyi.sales.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.account.service.sales.AccountSalesCollectionService; import com.ruoyi.basic.service.ICustomerService; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.domain.R; import com.ruoyi.sales.dto.SaveReceiptPaymentDto; import com.ruoyi.sales.dto.StatisticsTableDto; import com.ruoyi.sales.service.impl.MetricStatisticsServiceImpl; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -28,6 +32,7 @@ private final MetricStatisticsServiceImpl metricStatisticsService; private final ICustomerService customerService; private final AccountSalesCollectionService accountSalesCollectionService; @Operation(summary = "头鍿»è®¡") @GetMapping("/total") @@ -55,4 +60,11 @@ return R.ok(customerService.customewTransactionsDetails(page,customerId)); } @PostMapping("/saveReceiptPayment") @Log(title = "æ°å¢å款", businessType = BusinessType.INSERT) @Operation(summary = "æ°å¢å款") public R saveReceiptPayment(@RequestBody SaveReceiptPaymentDto dto) { return R.ok(accountSalesCollectionService.saveReceiptPayment(dto)); } } src/main/java/com/ruoyi/sales/dto/SaveReceiptPaymentDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,35 @@ package com.ruoyi.sales.dto; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDate; /** * è¥é管ç--客æ·å¾æ¥ æ°å¢å款请æ±åæ° */ @Data @Schema(name = "SaveReceiptPaymentDto", description = "æ°å¢å款请æ±åæ°") public class SaveReceiptPaymentDto { @Schema(description = "客æ·ID") private Long customerId; @Schema(description = "éå®ååå·") private String salesContractNo; @Schema(description = "忬¾æ¥æ") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate paymentDate; @Schema(description = "忬¾éé¢") private BigDecimal paymentAmount; @Schema(description = "忬¾æ¹å¼") private String paymentMethod; @Schema(description = "夿³¨") private String remark; } src/main/resources/mapper/account/purchase/AccountPurchasePaymentMapper.xml
@@ -54,5 +54,13 @@ GROUP BY dateStr ORDER BY dateStr </select> <select id="selectStockInRecordIdsByPurchaseLedgerId" resultType="java.lang.Long"> SELECT sir.id FROM stock_in_record sir LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id WHERE sir.approval_status = 1 AND sir.record_type IN ('7','10') AND IF(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id) = #{purchaseLedgerId} </select> </mapper> src/main/resources/mapper/account/sales/AccountSalesCollectionMapper.xml
@@ -97,5 +97,13 @@ GROUP BY dateStr ORDER BY dateStr </select> <select id="selectStockOutRecordIdsBySalesLedgerId" resultType="java.lang.Long"> SELECT sor.id FROM stock_out_record sor JOIN shipping_info s ON sor.record_id = s.id WHERE s.sales_ledger_id = #{salesLedgerId} AND sor.record_type = '13' AND sor.approval_status = 1 </select> </mapper> src/main/resources/mapper/basic/CustomerMapper.xml
@@ -174,14 +174,20 @@ left join ( select sl.id, sum(ascc.collection_amount) as receiptPaymentAmount from account_sales_collection ascc left join stock_out_record sor on FIND_IN_SET(sor.id, ascc.stock_out_record_ids) > 0 left join shipping_info s on sor.record_id = s.id LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id WHERE sor.record_type='13' and sor.approval_status=1 group by sl.id sum(t.collection_amount) as receiptPaymentAmount from ( select ascc.collection_amount, s.sales_ledger_id from account_sales_collection ascc left join stock_out_record sor on FIND_IN_SET(sor.id, ascc.stock_out_record_ids) > 0 left join shipping_info s on sor.record_id = s.id where sor.record_type='13' and sor.approval_status=1 group by ascc.id, s.sales_ledger_id ) t left join sales_ledger sl on t.sales_ledger_id = sl.id group by sl.id )T1 on T1.id = sl.id left join ( SELECT src/main/resources/mapper/basic/SupplierManageMapper.xml
@@ -121,17 +121,25 @@ left join ( select pl.id, sum(app.payment_amount) as paymentAmount from account_purchase_payment app left join account_payment_application apa on app.account_payment_application_id = apa.id left join stock_in_record sir on FIND_IN_SET(sir.id, apa.stock_in_record_ids) > 0 -- 10 ç±»åæå ³èè´¨æ£è¡¨ LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id -- å¨æå ³èéè´ï¼èªå¨éé 7 å 10ï¼ LEFT JOIN purchase_ledger pl ON pl.id = IF(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id) WHERE sir.approval_status = 1 AND sir.record_type IN ('7','10') sum(t.payment_amount) as paymentAmount from ( select app.id, app.payment_amount, pl.id as purchase_ledger_id from account_purchase_payment app left join account_payment_application apa on app.account_payment_application_id = apa.id left join stock_in_record sir on FIND_IN_SET(sir.id, apa.stock_in_record_ids) > 0 -- 10 ç±»åæå ³èè´¨æ£è¡¨ LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id -- å¨æå ³èéè´ï¼èªå¨éé 7 å 10ï¼ LEFT JOIN purchase_ledger pl ON pl.id = IF(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id) WHERE sir.approval_status = 1 AND sir.record_type IN ('7','10') group by app.id, pl.id ) t left join purchase_ledger pl on t.purchase_ledger_id = pl.id group by pl.id )T1 on T1.id = pl.id left join (