From 11de822474370c6dc702a6d3760cb72ddc151379 Mon Sep 17 00:00:00 2001 From: Gauthier LO Date: Mon, 31 Mar 2025 11:29:23 +0200 Subject: [PATCH] feat : invoice number reservation --- .../controller/admin/CreditController.java | 1 - .../InvoiceNumberReservationController.java | 163 ++++++++++++++++++ .../ShippingInvoiceFactory.java | 11 +- .../entity/InvoiceNumberReservation.java | 67 +++++++ .../InvoiceNumberReservationMapper.java | 16 ++ .../mapper/ShippingInvoiceMapper.java | 4 + .../xml/InvoiceNumberReservationMapper.xml | 5 + .../mapper/xml/ShippingInvoiceMapper.xml | 16 ++ .../IInvoiceNumberReservationService.java | 17 ++ .../service/IShippingInvoiceService.java | 4 + .../service/impl/CreditServiceImpl.java | 8 +- .../InvoiceNumberReservationServiceImpl.java | 103 +++++++++++ .../impl/ShippingInvoiceServiceImpl.java | 10 ++ .../purchase/PurchaseOrderServiceImpl.java | 11 +- 14 files changed, 423 insertions(+), 13 deletions(-) create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/InvoiceNumberReservationController.java create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/InvoiceNumberReservation.java create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/InvoiceNumberReservationMapper.java create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/InvoiceNumberReservationMapper.xml create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IInvoiceNumberReservationService.java create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/InvoiceNumberReservationServiceImpl.java 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 15899b1cb..3451b05de 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 @@ -145,7 +145,6 @@ public class CreditController extends JeecgController { log.error("User {}, tried to access /credit/edit but is not authorized.", loginUser.getUsername()); return Result.error(HttpStatus.SC_FORBIDDEN,"Access denied"); } - // we want the balance to update so we can use it later when we generate the invoice log.info("editing credit"); Credit lastCredit = creditService.getLastCredit(credit.getClientId(), credit.getCurrencyId()); Credit creditToEdit = creditService.getById(credit.getId()); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/InvoiceNumberReservationController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/InvoiceNumberReservationController.java new file mode 100644 index 000000000..1aed59498 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/InvoiceNumberReservationController.java @@ -0,0 +1,163 @@ +package org.jeecg.modules.business.controller.admin; + +import java.util.Arrays; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.modules.business.entity.InvoiceNumberReservation; +import org.jeecg.modules.business.service.IInvoiceNumberReservationService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + + /** + * @Description: invoice number reservation + * @Author: jeecg-boot + * @Date: 2025-03-28 + * @Version: V1.0 + */ +@Api(tags="invoice number reservation") +@RestController +@RequestMapping("/business/invoiceNumberReservation") +@Slf4j +public class InvoiceNumberReservationController extends JeecgController { + @Autowired + private IInvoiceNumberReservationService invoiceNumberReservationService; + + /** + * 分页列表查询 + * + * @param invoiceNumberReservation + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "invoice number reservation-分页列表查询") + @ApiOperation(value="invoice number reservation-分页列表查询", notes="invoice number reservation-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(InvoiceNumberReservation invoiceNumberReservation, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(invoiceNumberReservation, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = invoiceNumberReservationService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param invoiceNumberReservation + * @return + */ + @AutoLog(value = "invoice number reservation-添加") + @ApiOperation(value="invoice number reservation-添加", notes="invoice number reservation-添加") + @RequiresPermissions("business:invoice_number_reservation:add") + @PostMapping(value = "/add") + public Result add(@RequestBody InvoiceNumberReservation invoiceNumberReservation) { + invoiceNumberReservationService.save(invoiceNumberReservation); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param invoiceNumberReservation + * @return + */ + @AutoLog(value = "invoice number reservation-编辑") + @ApiOperation(value="invoice number reservation-编辑", notes="invoice number reservation-编辑") + @RequiresPermissions("business:invoice_number_reservation:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody InvoiceNumberReservation invoiceNumberReservation) { + invoiceNumberReservationService.updateById(invoiceNumberReservation); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "invoice number reservation-通过id删除") + @ApiOperation(value="invoice number reservation-通过id删除", notes="invoice number reservation-通过id删除") + @RequiresPermissions("business:invoice_number_reservation:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + invoiceNumberReservationService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "invoice number reservation-批量删除") + @ApiOperation(value="invoice number reservation-批量删除", notes="invoice number reservation-批量删除") + @RequiresPermissions("business:invoice_number_reservation:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.invoiceNumberReservationService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "invoice number reservation-通过id查询") + @ApiOperation(value="invoice number reservation-通过id查询", notes="invoice number reservation-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + InvoiceNumberReservation invoiceNumberReservation = invoiceNumberReservationService.getById(id); + if(invoiceNumberReservation==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(invoiceNumberReservation); + } + + /** + * 导出excel + * + * @param request + * @param invoiceNumberReservation + */ + @RequiresPermissions("business:invoice_number_reservation:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, InvoiceNumberReservation invoiceNumberReservation) { + return super.exportXls(request, invoiceNumberReservation, InvoiceNumberReservation.class, "invoice number reservation"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("business:invoice_number_reservation:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, InvoiceNumberReservation.class); + } + +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/shippingInvoice/ShippingInvoiceFactory.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/shippingInvoice/ShippingInvoiceFactory.java index 4b572e7b7..9134e4d6c 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/shippingInvoice/ShippingInvoiceFactory.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/shippingInvoice/ShippingInvoiceFactory.java @@ -35,6 +35,7 @@ import java.util.stream.Collectors; import static cn.hutool.core.date.DateTime.now; import static java.util.stream.Collectors.*; +import static org.jeecg.modules.business.entity.Invoice.InvoiceType.*; @Slf4j @Component @@ -75,6 +76,8 @@ public class ShippingInvoiceFactory { @Autowired private EmailService emailService; @Autowired + private IInvoiceNumberReservationService invoiceNumberReservationService; + @Autowired private Environment env; private final SimpleDateFormat SUBJECT_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); @@ -237,7 +240,7 @@ public class ShippingInvoiceFactory { Map shopPackageMatFeeMap = new HashMap<>(); shops.forEach(shop -> shopServiceFeeMap.put(shop.getId(), shop.getOrderServiceFee())); shops.forEach(shop -> shopPackageMatFeeMap.put(shop.getId(), shop.getPackagingMaterialFee())); - String invoiceCode = generateCompleteInvoiceCode(); + String invoiceCode = invoiceNumberReservationService.getLatestInvoiceNumberByType(COMPLETE.getType()); log.info("New invoice code: {}", invoiceCode); calculateFees(balance, logisticChannelMap, orderAndContent, channelPriceMap, countryList, skuRealWeights, skuServiceFees, latestDeclaredValues, client, shopServiceFeeMap, shopPackageMatFeeMap, invoiceCode); @@ -317,7 +320,7 @@ public class ShippingInvoiceFactory { Map shopPackageMatFeeMap = new HashMap<>(); shops.forEach(shop -> shopServiceFeeMap.put(shop.getId(), shop.getOrderServiceFee())); shops.forEach(shop -> shopPackageMatFeeMap.put(shop.getId(), shop.getPackagingMaterialFee())); - String invoiceCode = generateCompleteInvoiceCode(); + String invoiceCode = invoiceNumberReservationService.getLatestInvoiceNumberByType(COMPLETE.getType()); log.info("New invoice code: {}", invoiceCode); @@ -572,7 +575,7 @@ public class ShippingInvoiceFactory { Map shopPackageMatFeeMap = new HashMap<>(); shops.forEach(shop -> shopServiceFeeMap.put(shop.getId(), shop.getOrderServiceFee())); shops.forEach(shop -> shopPackageMatFeeMap.put(shop.getId(), shop.getPackagingMaterialFee())); - String invoiceCode = generateInvoiceCode(); + String invoiceCode = invoiceNumberReservationService.getLatestInvoiceNumberByType(SHIPPING.getType()); log.info("New invoice code: {}", invoiceCode); Map> errorMsg = calculateFees(null, logisticChannelMap, orderAndContent, channelPriceMap, countryList, skuRealWeights, skuServiceFees, latestDeclaredValues, client, shopServiceFeeMap, shopPackageMatFeeMap, invoiceCode); @@ -646,7 +649,7 @@ public class ShippingInvoiceFactory { Map shopPackageMatFeeMap = new HashMap<>(); shops.forEach(shop -> shopServiceFeeMap.put(shop.getId(), shop.getOrderServiceFee())); shops.forEach(shop -> shopPackageMatFeeMap.put(shop.getId(), shop.getPackagingMaterialFee())); - String invoiceCode = generateInvoiceCode(); + String invoiceCode = invoiceNumberReservationService.getLatestInvoiceNumberByType(SHIPPING.getType()); log.info("New invoice code: {}", invoiceCode); Map> ordersWithPB = calculateFees(balance, logisticChannelMap, orderAndContent, channelPriceMap, countryList, skuRealWeights, skuServiceFees, latestDeclaredValues, client, shopServiceFeeMap, shopPackageMatFeeMap, invoiceCode); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/InvoiceNumberReservation.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/InvoiceNumberReservation.java new file mode 100644 index 000000000..84f776f89 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/InvoiceNumberReservation.java @@ -0,0 +1,67 @@ +package org.jeecg.modules.business.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: invoice number reservation + * @Author: jeecg-boot + * @Date: 2025-03-28 + * @Version: V1.0 + */ +@Data +@TableName("invoice_number_reservation") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="invoice_number_reservation对象", description="invoice number reservation") +public class InvoiceNumberReservation implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "主键") + private java.lang.String id; + /**创建人*/ + @ApiModelProperty(value = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @ApiModelProperty(value = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新日期") + private java.util.Date updateTime; + /**invoice type*/ + @Excel(name = "invoice type", width = 15) + @ApiModelProperty(value = "invoice type") + private java.lang.Integer type; + /**invoice number*/ + @Excel(name = "invoice number", width = 15) + @ApiModelProperty(value = "invoice number") + private java.lang.Integer number; + /**year*/ + @Excel(name = "year", width = 15) + @ApiModelProperty(value = "year") + private java.lang.String year; + /**month*/ + @Excel(name = "month", width = 15) + @ApiModelProperty(value = "month") + private java.lang.String month; +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/InvoiceNumberReservationMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/InvoiceNumberReservationMapper.java new file mode 100644 index 000000000..4f1ea2473 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/InvoiceNumberReservationMapper.java @@ -0,0 +1,16 @@ +package org.jeecg.modules.business.mapper; + +import org.jeecg.modules.business.entity.InvoiceNumberReservation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springframework.stereotype.Repository; + +/** + * @Description: invoice number reservation + * @Author: jeecg-boot + * @Date: 2025-03-28 + * @Version: V1.0 + */ +@Repository +public interface InvoiceNumberReservationMapper extends BaseMapper { + +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ShippingInvoiceMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ShippingInvoiceMapper.java index d3c3d4db6..8218b20ff 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ShippingInvoiceMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ShippingInvoiceMapper.java @@ -33,4 +33,8 @@ public interface ShippingInvoiceMapper extends BaseMapper { Period getInvoicePeriod(@Param("shops") List shopIdList); void cancelInvoice(@Param("id") String invoiceId); + + String findLatestInvoiceNumber(); + + String findLatestCompleteInvoiceNumber(); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/InvoiceNumberReservationMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/InvoiceNumberReservationMapper.xml new file mode 100644 index 000000000..71d063604 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/InvoiceNumberReservationMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file 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 36f638e50..5fb18707c 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 @@ -117,4 +117,20 @@ SET status = 0 WHERE id = #{id}; + + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IInvoiceNumberReservationService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IInvoiceNumberReservationService.java new file mode 100644 index 000000000..4c210f52b --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IInvoiceNumberReservationService.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.business.service; + +import org.jeecg.modules.business.entity.InvoiceNumberReservation; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.transaction.annotation.Transactional; + +/** + * @Description: invoice number reservation + * @Author: jeecg-boot + * @Date: 2025-03-28 + * @Version: V1.0 + */ +public interface IInvoiceNumberReservationService extends IService { + + @Transactional + String getLatestInvoiceNumberByType(int invoiceType); +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IShippingInvoiceService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IShippingInvoiceService.java index f53f29983..915562b57 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IShippingInvoiceService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IShippingInvoiceService.java @@ -53,4 +53,8 @@ public interface IShippingInvoiceService extends IService { Period getInvoicePeriod(List shopIdList); void cancelInvoice(String invoiceId); + + String findLatestInvoiceNumber(); + + String findLatestCompleteInvoiceNumber(); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/CreditServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/CreditServiceImpl.java index 51d91247b..4a0de65e0 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/CreditServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/CreditServiceImpl.java @@ -4,7 +4,6 @@ import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpStatus; import org.apache.shiro.SecurityUtils; import org.jeecg.common.system.vo.LoginUser; -import org.jeecg.modules.business.domain.codeGeneration.CreditInvoiceCodeRule; import org.jeecg.modules.business.domain.credit.CreditInvoice; import org.jeecg.modules.business.domain.credit.CreditInvoiceFactory; import org.jeecg.modules.business.entity.Balance; @@ -32,6 +31,8 @@ import java.nio.file.StandardCopyOption; import java.text.SimpleDateFormat; import java.util.List; +import static org.jeecg.modules.business.entity.Invoice.InvoiceType.CREDIT; + /** * @Description: credit * @Author: jeecg-boot @@ -55,6 +56,8 @@ public class CreditServiceImpl extends ServiceImpl impleme private CreditInvoiceFactory factory; @Autowired private ICurrencyService currencyService; + @Autowired + private IInvoiceNumberReservationService invoiceNumberReservationService; @Override public Credit getLastCredit(String clientId,String currencyId) { @@ -85,8 +88,7 @@ public class CreditServiceImpl extends ServiceImpl impleme res.setStatus(HttpStatus.SC_NOT_FOUND); return res; } - String lastInvoiceNumber = getLatestInvoiceNumber(); - String invoiceNumber = new CreditInvoiceCodeRule().next(lastInvoiceNumber); + String invoiceNumber = invoiceNumberReservationService.getLatestInvoiceNumberByType(CREDIT.getType()); credit.setInvoiceNumber(invoiceNumber); save(credit); balanceService.updateBalance(credit.getClientId(), credit.getId(), credit.getAmount(), credit.getCurrencyId()); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/InvoiceNumberReservationServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/InvoiceNumberReservationServiceImpl.java new file mode 100644 index 000000000..17f7c62c5 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/InvoiceNumberReservationServiceImpl.java @@ -0,0 +1,103 @@ +package org.jeecg.modules.business.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.modules.business.domain.codeGeneration.CompleteInvoiceCodeRule; +import org.jeecg.modules.business.domain.codeGeneration.CreditInvoiceCodeRule; +import org.jeecg.modules.business.domain.codeGeneration.PurchaseInvoiceCodeRule; +import org.jeecg.modules.business.domain.codeGeneration.ShippingInvoiceCodeRule; +import org.jeecg.modules.business.entity.InvoiceNumberReservation; +import org.jeecg.modules.business.mapper.CreditMapper; +import org.jeecg.modules.business.mapper.InvoiceNumberReservationMapper; +import org.jeecg.modules.business.mapper.PurchaseOrderMapper; +import org.jeecg.modules.business.service.IInvoiceNumberReservationService; +import org.jeecg.modules.business.service.IPlatformOrderService; +import org.jeecg.modules.business.entity.Invoice.InvoiceType; +import org.jeecg.modules.business.service.IShippingInvoiceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Calendar; + +/** + * @Description: invoice number reservation + * @Author: jeecg-boot + * @Date: 2025-03-28 + * @Version: V1.0 + */ +@Service +@Slf4j +public class InvoiceNumberReservationServiceImpl extends ServiceImpl implements IInvoiceNumberReservationService { + @Autowired + private CreditMapper creditMapper; + @Autowired + private IPlatformOrderService platformOrderService; + @Autowired + private PurchaseOrderMapper purchaseOrderMapper; + @Autowired + private IShippingInvoiceService shippingInvoiceService; + + /** + * Generates a new invoice number based on the current date and the specified invoice type. + * This method will create a new invoice number reservation by committing the transaction regardless of the current transaction state of the caller. + * @param invoiceType 1: Purchase Invoice, 2: Shipping Invoice, 7: Complete Invoice, 8: Credit Invoice + * @return + */ + @Transactional(propagation = Propagation.REQUIRES_NEW) + @Override + public String getLatestInvoiceNumberByType(int invoiceType) { + String latestInvoiceCode, newInvoiceCode; + Calendar calendar = Calendar.getInstance(); + int year = calendar.get(Calendar.YEAR); + int month = calendar.get(Calendar.MONTH) + 1; + String yearStr = String.valueOf(year); + String monthStr = String.format("%02d", month); + int newNumber; + InvoiceNumberReservation latestInvoiceNumberReservation = this.getOne( + new QueryWrapper().eq("type", invoiceType)); + if (latestInvoiceNumberReservation != null) { + if(latestInvoiceNumberReservation.getYear().equals(yearStr) && latestInvoiceNumberReservation.getMonth().equals(monthStr)) { + newNumber = latestInvoiceNumberReservation.getNumber() + 1; + } else { + newNumber = 1; + } + newInvoiceCode = yearStr + "-" + monthStr + "-" + invoiceType + String.format("%03d", newNumber); + + latestInvoiceNumberReservation.setNumber(newNumber); + latestInvoiceNumberReservation.setYear(yearStr); + latestInvoiceNumberReservation.setMonth(monthStr); + update(latestInvoiceNumberReservation, new QueryWrapper().eq("type", invoiceType)); + } else { + if(invoiceType == InvoiceType.SHIPPING.getType()) { + latestInvoiceCode = shippingInvoiceService.findLatestInvoiceNumber(); + newInvoiceCode = new ShippingInvoiceCodeRule().next(latestInvoiceCode); + } else if(invoiceType == InvoiceType.COMPLETE.getType()) { + latestInvoiceCode = shippingInvoiceService.findLatestCompleteInvoiceNumber(); + newInvoiceCode = new CompleteInvoiceCodeRule().next(latestInvoiceCode); + } else if(invoiceType == InvoiceType.PURCHASE.getType()) { + latestInvoiceCode = purchaseOrderMapper.lastInvoiceNumber(); + newInvoiceCode = new PurchaseInvoiceCodeRule().next(latestInvoiceCode); + } else if(invoiceType == InvoiceType.CREDIT.getType()) { + latestInvoiceCode = creditMapper.getLatestInvoiceNumber(); + newInvoiceCode = new CreditInvoiceCodeRule().next(latestInvoiceCode); + } + else { + throw new IllegalArgumentException("Invalid invoice type: " + invoiceType); + + } + newNumber = Integer.parseInt(newInvoiceCode.substring(newInvoiceCode.lastIndexOf("-") + 2)); + InvoiceNumberReservation newNumberReservation = new InvoiceNumberReservation(); + newNumberReservation.setNumber(newNumber); + newNumberReservation.setType(invoiceType); + newNumberReservation.setYear(yearStr); + newNumberReservation.setMonth(monthStr); + + save(newNumberReservation); + } + return newInvoiceCode; + } +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ShippingInvoiceServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ShippingInvoiceServiceImpl.java index 9999fb0c5..18886bcd0 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ShippingInvoiceServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ShippingInvoiceServiceImpl.java @@ -246,4 +246,14 @@ public class ShippingInvoiceServiceImpl extends ServiceImpl