From 6fe8ffea92d0de7b2daa0d3c4525c0fa4d899e36 Mon Sep 17 00:00:00 2001 From: Gauthier LO Date: Fri, 23 May 2025 17:02:39 +0200 Subject: [PATCH] feat: client cancel invoice --- db/views/transaction.sql | 16 +++++-- .../controller/admin/CreditController.java | 3 +- .../admin/InvoiceViewController.java | 48 +++++++++++++++++-- .../shippingInvoice/InvoiceController.java | 8 +++- .../admin/shippingInvoice/InvoiceDatas.java | 3 +- .../modules/business/entity/Transaction.java | 12 +++++ .../business/mapper/PlatformOrderMapper.java | 2 +- .../mapper/xml/ShippingInvoiceMapper.xml | 2 +- .../modules/business/mapper/xml/SkuMapper.xml | 14 +++--- .../business/service/InvoiceService.java | 2 +- .../service/impl/InvoiceServiceImpl.java | 34 ++++++++++++- 11 files changed, 122 insertions(+), 22 deletions(-) diff --git a/db/views/transaction.sql b/db/views/transaction.sql index 1e1cc9d8a..be7332294 100644 --- a/db/views/transaction.sql +++ b/db/views/transaction.sql @@ -11,7 +11,9 @@ SELECT combined.id, shipping_fee, purchase_fee, amount, - currency.code AS currency + currency.code AS currency, + ordered, + status FROM ( SELECT id, create_by, @@ -25,7 +27,9 @@ FROM ( NULL AS shipping_fee, NULL AS purchase_fee, amount, - currency_id + currency_id, + null AS ordered, + status FROM credit UNION ALL SELECT id, @@ -40,7 +44,9 @@ FROM ( total_amount AS shipping_fee, pt.total AS purchase_fee, COALESCE(pt.total + si.total_amount, si.total_amount) AS amount, - currency_id + currency_id, + null AS ordered, + status FROM shipping_invoice si LEFT JOIN ( SELECT po.shipping_invoice_number, SUM(poc.purchase_fee) AS total @@ -65,7 +71,9 @@ FROM ( NULL AS shipping_fee, final_amount AS purchase_fee, final_amount AS amount, - currency_id + currency_id, + ordered, + status FROM purchase_order WHERE invoice_number LIKE '%-%-1%' AND client_id IS NOT NULL diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/CreditController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/CreditController.java index 3451b05de..f2eece17d 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/CreditController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/CreditController.java @@ -203,7 +203,7 @@ public class CreditController extends JeecgController { if(!credit.getId().equals(latestCredit.getId())) { return Result.error(409, "Credit cannot be deleted, unless it's the last record."); } - invoiceService.cancelInvoice(credit.getId(), credit.getInvoiceNumber(), credit.getClientId()); + invoiceService.cancelInvoice(credit.getId(), credit.getInvoiceNumber(), credit.getClientId(), true); return Result.OK("sys.api.entryDeleteSuccess"); } @@ -340,6 +340,7 @@ public class CreditController extends JeecgController { } invoiceDatas.setInvoiceNumber(credit.getInvoiceNumber()); invoiceDatas.setDescription(credit.getDescription()); + invoiceDatas.setStatus(credit.getStatus()); return Result.OK(invoiceDatas); } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/InvoiceViewController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/InvoiceViewController.java index c8a1c775c..1b77c362a 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/InvoiceViewController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/InvoiceViewController.java @@ -5,15 +5,17 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpStatus; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.modules.business.entity.Client; import org.jeecg.modules.business.entity.Invoice; import org.jeecg.modules.business.service.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; -import java.util.List; +import java.util.*; @Api(tags = "发票") @RestController @@ -22,19 +24,59 @@ import java.util.List; public class InvoiceViewController { @Autowired private InvoiceService invoiceService; + @Autowired + private IClientService clientService; + @Autowired + private ISecurityService securityService; + @GetMapping(value = "/list") public Result list(Invoice invoice, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { - QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(invoice, req.getParameterMap()); + boolean isEmployee = securityService.checkIsEmployee(); + Map parameterMap = new HashMap<>(req.getParameterMap()); + for(String key : req.getParameterMap().keySet()) { + if(key.equals("clientId") && !isEmployee) { + parameterMap.remove("clientId"); + } + if(key.equals("createBy") && !isEmployee) { + parameterMap.remove("createBy"); + } + } + if(!isEmployee) { + Client currentClient = clientService.getCurrentClient(); + if (currentClient == null) { + return Result.error(HttpStatus.SC_UNAUTHORIZED, "Client is not registered as a user"); + } + parameterMap.put("clientId", new String[]{currentClient.getId()}); + } + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(invoice, parameterMap); Page page = new Page<>(pageNo, pageSize); IPage pageList = invoiceService.page(page, queryWrapper); return Result.ok(pageList); } @DeleteMapping(value = "/cancelInvoice") public Result cancelInvoice(@RequestParam("id") String id, @RequestParam("invoiceNumber") String invoiceNumber, @RequestParam("clientId") String clientId) { + boolean isEmployee = securityService.checkIsEmployee(); + Client client = clientService.getById(clientId); + Client currentClient; + if(client == null) { + log.error("Client {} not found", clientId); + return Result.error(HttpStatus.SC_NOT_FOUND, "Client not found"); + } + if (!isEmployee) { + currentClient = clientService.getCurrentClient(); + if (currentClient == null) { + log.error("Client is not registered as a user : {}", clientId); + return Result.error(HttpStatus.SC_UNAUTHORIZED, "Client is not registered as a user"); + } + if(!clientId.equals(currentClient.getId())) { + log.error("Client {} is not authorized to download invoice detail for client {}", currentClient.getInternalCode(), client.getInternalCode()); + return Result.error(HttpStatus.SC_NOT_FOUND, "Invoice not found"); + } + } log.info("Cancelling invoice number : {}", invoiceNumber); - boolean invoiceCancelled = invoiceService.cancelInvoice(id, invoiceNumber, clientId); + boolean invoiceCancelled = invoiceService.cancelInvoice(id, invoiceNumber, clientId, isEmployee); return Result.ok(invoiceCancelled ? "sys.api.invoiceCancelSuccess" : "sys.api.invoiceCancelSuccessFileDeleteFail"); } @DeleteMapping(value="/cancelBatchInvoice") diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java index a66109993..28a08b797 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java @@ -328,7 +328,7 @@ public class InvoiceController { try { List skuQuantities = skuService.getSkuQuantitiesFromOrderIds(param.orderIds()); if(skuQuantities.isEmpty()) { - return Result.error("Nothing to invoice."); + return Result.error(404, "Nothing to invoice."); } String purchaseId = purchaseOrderService.addPurchase(skuQuantities ,param.orderIds()); metaData = purchaseOrderService.makeInvoice(purchaseId); @@ -1142,6 +1142,7 @@ public class InvoiceController { invoiceDatas.setInsuranceFee(insuranceFee); invoiceDatas.setFeeAndQtyPerCountry(feeAndQtyPerCountry); invoiceDatas.setExtraFees(extraFeesMap); + invoiceDatas.setStatus(invoice.getStatus()); return Result.OK(invoiceDatas); } @@ -1153,12 +1154,15 @@ public class InvoiceController { InvoiceDatas invoiceDatas = new InvoiceDatas(); List invoices = purchaseOrderService.getPurchasesByInvoiceNumber(invoiceNumber); + int invoiceStatus = 1; if(invoices == null) { return Result.error("No data for product found."); } List invoiceData = new ArrayList<>(); for(PurchaseOrder order : invoices) { invoiceData.addAll(purchaseOrderContentMapper.selectInvoiceDataByID(order.getId())); + if(order.getStatus() == 0) + invoiceStatus = 0; } List refundList = iSavRefundService.getRefundAmount(invoiceNumber); Map feeAndQtyPerSku = new HashMap<>(); // it maps number of order and purchase fee per item : >, > @@ -1205,7 +1209,7 @@ public class InvoiceController { invoiceDatas.setRefund(refund); invoiceDatas.setFinalAmountEur(invoices.stream().map(PurchaseOrder::getFinalAmount).reduce(BigDecimal.ZERO, BigDecimal::add)); invoiceDatas.setFeeAndQtyPerSku(feeAndQtyPerSku); - + invoiceDatas.setStatus(invoiceStatus); return Result.OK(invoiceDatas); } public String countryNameFormatting(String country) { diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceDatas.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceDatas.java index 23ceac815..a5729e626 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceDatas.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceDatas.java @@ -37,7 +37,8 @@ public class InvoiceDatas { private BigDecimal finalAmount; @JSONField(name = "extraFees") private Map extraFees; - + @JSONField(name = "status") + private Integer status; } @Data @Builder diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/Transaction.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/Transaction.java index 28b22ad09..14a3a1a06 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/Transaction.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/Transaction.java @@ -105,4 +105,16 @@ public class Transaction implements Serializable { @Excel(name = "currency", width = 15) @ApiModelProperty(value = "currency") private java.lang.String currency; + /** + * 0: cancelled, 1: normal (default) + */ + @Excel(name = "status", width = 15) + @ApiModelProperty(value = "status") + private java.lang.Integer status; + /** + * 0: not ordered, 1: ordered + */ + @Excel(name = "ordered", width = 15) + @ApiModelProperty(value = "ordered") + private java.lang.Integer ordered; } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java index b7a315791..30454f389 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java @@ -256,7 +256,7 @@ public interface PlatformOrderMapper extends BaseMapper { @Param("start") String startDate, @Param("end") String endDate, @Param("order") String order, @Param("column") String column, @Param("offset") Integer offset, @Param("size") Integer pageSize); - void selectBatchIdsForUpdate(@Param("ids") List orderIds); + List selectBatchIdsForUpdate(@Param("ids") List orderIds); @MapKey("id") Map selectBatchUninvoicedIdsForUpdate(@Param("ids") List orderIds); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ShippingInvoiceMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ShippingInvoiceMapper.xml index 5fb18707c..595f140e9 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ShippingInvoiceMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ShippingInvoiceMapper.xml @@ -15,7 +15,7 @@ WHERE invoice_number = #{invoiceNumber} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/SkuMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/SkuMapper.xml index dc9266eba..5666bbf25 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/SkuMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/SkuMapper.xml @@ -129,15 +129,17 @@