src/main/java/com/ruoyi/basic/controller/CustomerController.java
@@ -8,7 +8,6 @@ import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -91,8 +90,19 @@ * å é¤å®¢æ·æ¡£æ¡ */ @Log(title = "å®¢æ·æ¡£æ¡", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { @DeleteMapping("/delCustomer") public AjaxResult remove(@RequestBody Long[] ids) { if (ids == null || ids.length == 0) { return AjaxResult.error("è¯·ä¼ å ¥è¦å é¤çID"); } return toAjax(customerService.deleteCustomerByIds(ids)); } /** * æ¥è¯¢å®¢æ· */ @GetMapping("/customerList") public List customerList(Customer customer) { return customerService.customerList(customer); } } src/main/java/com/ruoyi/basic/pojo/Customer.java
@@ -79,4 +79,7 @@ @TableField(exist = false) private Long[] ids; @TableField(exist = false) private String addressPhone; } src/main/java/com/ruoyi/basic/service/ICustomerService.java
@@ -53,4 +53,11 @@ int deleteCustomerByIds(Long[] ids); List<Customer> selectCustomerListByIds(Long[] ids); /** * æ¥è¯¢å®¢æ·ä¿¡æ¯ * * @return ç»æ */ List customerList(Customer customer); } src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
@@ -2,12 +2,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.mapper.CustomerMapper; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.basic.service.ICustomerService; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.security.LoginUser; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -15,6 +17,8 @@ import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** @@ -49,11 +53,17 @@ @Override public List<Customer> selectCustomerList(Customer customer) { LambdaQueryWrapper<Customer> queryWrapper = new LambdaQueryWrapper<>(); if (customer.getCustomerName() != null && !customer.getCustomerName().isEmpty()) { if (StringUtils.isNotBlank(customer.getCustomerName())) { queryWrapper.eq(Customer::getCustomerName, customer.getCustomerName()); } List<Customer> customerList = customerMapper.selectList(queryWrapper); return customerList; // ä½¿ç¨ Stream ä¿®æ¹æ¯ä¸ª Customer ç addressPhone åæ®µ return customerList.stream().peek(c -> c.setAddressPhone(c.getCompanyAddress() + "( " + c.getCompanyPhone() + " )") ).collect(Collectors.toList()); } /** @@ -102,4 +112,42 @@ queryWrapper.in(Customer::getId, Arrays.asList(ids)); return customerMapper.selectList(queryWrapper); } @Override public List<Map<String, Object>> customerList(Customer customer) { LambdaQueryWrapper<Customer> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.select(Customer::getId, Customer::getCustomerName,Customer::getTaxpayerIdentificationNumber); // è·ååå§æ¥è¯¢ç»æ List<Map<String, Object>> result = customerMapper.selectMaps(queryWrapper); // å°ä¸å线å½å转æ¢ä¸ºé©¼å³°å½å return result.stream().map(map -> map.entrySet().stream() .collect(Collectors.toMap( entry -> underlineToCamel(entry.getKey()), Map.Entry::getValue)) ).collect(Collectors.toList()); } /** * ä¸å线å½å转驼峰å½å */ private String underlineToCamel(String param) { if (param == null || "".equals(param.trim())) { return ""; } int len = param.length(); StringBuilder sb = new StringBuilder(len); for (int i = 0; i < len; i++) { char c = param.charAt(i); if (c == '_') { if (++i < len) { sb.append(Character.toUpperCase(param.charAt(i))); } } else { sb.append(Character.toLowerCase(c)); } } return sb.toString(); } } src/main/java/com/ruoyi/common/config/MyBaseMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.ruoyi.common.config; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import java.util.List; public interface MyBaseMapper<T> extends BaseMapper<T> { /** * æ¹éæå ¥ï¼ä» æå ¥éç©ºåæ®µï¼ * @param list å®ä½å表 * @return æå ¥æåçè®°å½æ° */ int insertBatchSomeColumn(List<T> list); /** * æ¹éæ´æ°ï¼ä» æ´æ°éç©ºåæ®µï¼ */ int updateBatchSomeColumn(List<T> list); } src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java
@@ -144,7 +144,8 @@ { int dirLastIndex = RuoYiConfig.getProfile().length() + 1; String currentDir = StringUtils.substring(uploadDir, dirLastIndex); return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; // return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; return currentDir + "/" + fileName; } /** src/main/java/com/ruoyi/common/vo/FileVo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,31 @@ package com.ruoyi.common.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDateTime; @Data public class FileVo { @ApiModelProperty(value = "æä»¶åç§°") private String fileName; @ApiModelProperty(value = "æä»¶è·¯å¾") private String filePath; @ApiModelProperty(value = "æä»¶å¤§å°") private int fileSize; @ApiModelProperty(value = "å建æ¶é´") private LocalDateTime createTime; @ApiModelProperty(value = "ä¿®æ¹æ¶é´") private LocalDateTime updateTime; @ApiModelProperty(value = "åå»ºç¨æ·") private Integer createUser; @ApiModelProperty(value = "ä¿®æ¹ç¨æ·") private Integer updateUser; } src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,73 @@ package com.ruoyi.purchase.controller; import javax.servlet.http.HttpServletResponse; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.purchase.service.IPurchaseLedgerService; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; 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.page.TableDataInfo; import java.util.List; /** * éè´å°è´¦Controller * * @author ruoyi * @date 2025-05-09 */ @RestController @RequestMapping("/system/ledger") @AllArgsConstructor public class PurchaseLedgerController extends BaseController { private IPurchaseLedgerService purchaseLedgerService; /** * æ¥è¯¢éè´å°è´¦å表 */ @GetMapping("/list") public TableDataInfo list(PurchaseLedger purchaseLedger) { startPage(); List<PurchaseLedger> list = purchaseLedgerService.selectPurchaseLedgerList(purchaseLedger); return getDataTable(list); } /** * 导åºéè´å°è´¦å表 */ @Log(title = "éè´å°è´¦", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, PurchaseLedger purchaseLedger) { List<PurchaseLedger> list = purchaseLedgerService.selectPurchaseLedgerList(purchaseLedger); ExcelUtil<PurchaseLedger> util = new ExcelUtil<PurchaseLedger>(PurchaseLedger.class); util.exportExcel(response, list, "ã请填ååè½åç§°ãæ°æ®"); } /** * æ°å¢ä¿®æ¹éè´å°è´¦ */ @Log(title = "éè´å°è´¦", businessType = BusinessType.INSERT) @PostMapping ("/addOrEditPurchase") public AjaxResult addOrEditPurchase(@RequestBody PurchaseLedger purchaseLedger) { return toAjax(purchaseLedgerService.addOrEditPurchase(purchaseLedger)); } /** * å é¤éè´å°è´¦ */ @Log(title = "éè´å°è´¦", businessType = BusinessType.DELETE) @DeleteMapping("/delPurchase") public AjaxResult remove(@RequestBody Long[] ids) { return toAjax(purchaseLedgerService.deletePurchaseLedgerByIds(ids)); } } src/main/java/com/ruoyi/purchase/mapper/PurchaseLedgerMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ package com.ruoyi.purchase.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; /** * éè´å°è´¦Mapperæ¥å£ * * @author ruoyi * @date 2025-05-09 */ public interface PurchaseLedgerMapper extends BaseMapper<PurchaseLedger> { } src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,97 @@ package com.ruoyi.purchase.pojo; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import lombok.Data; /** * éè´å°è´¦å¯¹è±¡ purchase_ledger * * @author ruoyi * @date 2025-05-09 */ @TableName("purchase_ledger") @Data public class PurchaseLedger { private static final long serialVersionUID = 1L; /** * èªå¢ä¸»é®ID */ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * éè´ååå· */ @Excel(name = "éè´ååå·") private String purchaseContractNumber; /** * ä¾åºååç§° */ @Excel(name = "ä¾åºååç§°") private String supplierName; /** * å½å ¥äººå§å */ @Excel(name = "å½å ¥äººå§å") private String recorderName; /** * éå®ååå· */ @Excel(name = "éå®ååå·") private String salesContractNo; /** * 项ç®åç§° */ @Excel(name = "项ç®åç§°") private String projectName; /** * å½å ¥æ¥æ */ @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "å½å ¥æ¥æ", width = 30, dateFormat = "yyyy-MM-dd") private Date entryDate; /** * 夿³¨ */ @Excel(name = "夿³¨") private String remarks; /** * éä»¶ææè·¯å¾æåç§° */ @Excel(name = "éä»¶ææè·¯å¾æåç§°") private String attachmentMaterials; /** * è®°å½å建æ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "è®°å½å建æ¶é´", width = 30, dateFormat = "yyyy-MM-dd") private Date createdAt; /** * è®°å½æåæ´æ°æ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "è®°å½æåæ´æ°æ¶é´", width = 30, dateFormat = "yyyy-MM-dd") private Date updatedAt; /** * å ³èéå®å°è´¦ä¸»è¡¨ä¸»é® */ private Long salesLedgerId; } src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,23 @@ package com.ruoyi.purchase.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.purchase.pojo.PurchaseLedger; import java.util.List; /** * éè´å°è´¦Serviceæ¥å£ * * @author ruoyi * @date 2025-05-09 */ public interface IPurchaseLedgerService extends IService<PurchaseLedger> { List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger); int addOrEditPurchase(PurchaseLedger purchaseLedger); int deletePurchaseLedgerByIds(Long[] ids); } src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,44 @@ package com.ruoyi.purchase.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.purchase.service.IPurchaseLedgerService; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.List; /** * éè´å°è´¦Serviceä¸å¡å±å¤ç * * @author ruoyi * @date 2025-05-09 */ @Service @AllArgsConstructor public class PurchaseLedgerServiceImpl extends ServiceImpl<PurchaseLedgerMapper, PurchaseLedger> implements IPurchaseLedgerService { private PurchaseLedgerMapper purchaseLedgerMapper; @Override public List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger) { return purchaseLedgerMapper.selectList(new LambdaQueryWrapper<>()); } @Override public int addOrEditPurchase(PurchaseLedger purchaseLedger) { if (purchaseLedger.getId() == null) { return purchaseLedgerMapper.insert(purchaseLedger); } else { return purchaseLedgerMapper.updateById(purchaseLedger); } } @Override public int deletePurchaseLedgerByIds(Long[] ids) { return purchaseLedgerMapper.deleteBatchIds(Arrays.asList(ids)); } } src/main/java/com/ruoyi/sales/controller/InvoiceLedgerController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,100 @@ package com.ruoyi.sales.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.sales.dto.InvoiceLedgerDto; import com.ruoyi.sales.service.InvoiceLedgerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.List; @RestController @RequestMapping("/invoiceLedger") public class InvoiceLedgerController { @Autowired private InvoiceLedgerService invoiceLedgerService; /** * å¼ç¥¨å°è´¦æ°å¢ * @param invoiceLedgerDto * @return */ @PostMapping("/add") public AjaxResult invoiceLedgerAdd(@RequestBody InvoiceLedgerDto invoiceLedgerDto) { invoiceLedgerService.invoiceLedgerAdd(invoiceLedgerDto); return AjaxResult.success(); } /** * å¼ç¥¨å°è´¦å é¤ * @param ids * @return */ @DeleteMapping("/del") public AjaxResult invoiceLedgerDel(@RequestParam List<Integer> ids) { invoiceLedgerService.invoiceLedgerDel(ids); return AjaxResult.success(); } /** * å¼ç¥¨å°è´¦ä¿®æ¹ * @param invoiceLedgerDto * @return */ @PostMapping("/update") public AjaxResult invoiceLedgerUpdate(@RequestBody InvoiceLedgerDto invoiceLedgerDto) { invoiceLedgerService.invoiceLedgerUpdate(invoiceLedgerDto); return AjaxResult.success(); } /** * å¼ç¥¨å°è´¦å页æ¥è¯¢ * @param page * @param invoiceLedgerDto * @return */ @GetMapping("/page") public AjaxResult invoiceLedgerPage(Page page, InvoiceLedgerDto invoiceLedgerDto) { return AjaxResult.success(invoiceLedgerService.invoiceLedgerPage(page, invoiceLedgerDto)); } /** * å¼ç¥¨å°è´¦æä»¶æ¥è¯¢ * @param invoiceLedgerId * @return */ @GetMapping("/fileList") public AjaxResult invoiceLedgerFileList(Integer invoiceLedgerId) { return AjaxResult.success(invoiceLedgerService.invoiceLedgerFileList(invoiceLedgerId)); } /** * å¼ç¥¨å°è´¦æä»¶ä¸ä¼ * @param file * @return */ @PostMapping("/uploadFile") public AjaxResult invoiceLedgerUploadFile(MultipartFile file) { try { return AjaxResult.success(invoiceLedgerService.invoiceLedgerUploadFile(file)); }catch (Exception e) { return AjaxResult.error(e.getMessage()); } } /** * éä»¶ä¸è½½ * @param response * @param invoiceLedgerDto * @return */ @GetMapping("/downloadFile") public void invoiceLedgerDownloadFile(HttpServletResponse response, InvoiceLedgerDto invoiceLedgerDto) { invoiceLedgerService.invoiceLedgerDownload(response, invoiceLedgerDto); } } src/main/java/com/ruoyi/sales/controller/InvoiceRegistrationController.java
@@ -34,7 +34,7 @@ * @return */ @DeleteMapping("/del") public AjaxResult invoiceRegistrationDel(List<Integer> ids) { public AjaxResult invoiceRegistrationDel(@RequestParam List<Integer> ids) { invoiceRegistrationService.invoiceRegistrationDel(ids); return AjaxResult.success(); } src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,63 @@ package com.ruoyi.sales.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.sales.dto.ReceiptPaymentDto; import com.ruoyi.sales.pojo.ReceiptPayment; import com.ruoyi.sales.service.ReceiptPaymentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/receiptPayment") public class ReceiptPaymentController { @Autowired private ReceiptPaymentService receiptPaymentService; /** * 忬¾ç»è®°æ°å¢ * @param receiptPayment * @return */ @PostMapping("/add") public AjaxResult receiptPaymentAdd (@RequestBody ReceiptPayment receiptPayment) { receiptPaymentService.receiptPaymentAdd(receiptPayment); return AjaxResult.success(); } /** * 忬¾ç»è®°ä¿®æ¹ * @param receiptPayment * @return */ @PostMapping("/update") public AjaxResult receiptPaymentUpdate (@RequestBody ReceiptPayment receiptPayment) { return AjaxResult.success(receiptPaymentService.receiptPaymentUpdate(receiptPayment)); } /** * 忬¾ç»è®°å é¤ * @param ids * @return */ @DeleteMapping("/del") public AjaxResult receiptPaymentDel (@RequestBody List<Integer> ids) { return AjaxResult.success(receiptPaymentService.receiptPaymentDel(ids)); } /** * 忬¾ç»è®°å页æ¥è¯¢ * @param page * @param receiptPaymentDto * @return */ @GetMapping("/listPage") public AjaxResult receiptPaymentListPage (Page page, ReceiptPaymentDto receiptPaymentDto) { return AjaxResult.success(receiptPaymentService.receiptPaymentListPage(page,receiptPaymentDto)); } } src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -4,13 +4,12 @@ import javax.servlet.http.HttpServletResponse; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.service.ISalesLedgerService; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -47,6 +46,17 @@ } /** * æ¥è¯¢éå®å°è´¦å产åç¶åå表 */ @GetMapping("/getSalesLedgerWithProducts") public TableDataInfo getSalesLedgerWithProducts() { startPage(); List<SalesLedgerDto> list = salesLedgerService.getSalesLedgerWithProducts(); return getDataTable(list); } /** * 导åºéå®å°è´¦å表 */ @Log(title = "éå®å°è´¦", businessType = BusinessType.EXPORT) @@ -68,32 +78,25 @@ } /** * æ°å¢éå®å°è´¦ * æ°å¢ä¿®æ¹éå®å°è´¦ */ @Log(title = "éå®å°è´¦", businessType = BusinessType.INSERT) @PostMapping ("/insertSalesLedger") public AjaxResult add(@RequestBody SalesLedger salesLedger) @PostMapping ("/addOrUpdateSalesLedger") public AjaxResult add(@RequestBody SalesLedgerDto salesLedgerDto) { return toAjax(salesLedgerService.insertSalesLedger(salesLedger)); } /** * ä¿®æ¹éå®å°è´¦ */ @Log(title = "éå®å°è´¦", businessType = BusinessType.UPDATE) @PostMapping ("/updateSalesLedger") public AjaxResult edit(@RequestBody SalesLedger salesLedger) { return toAjax(salesLedgerService.updateSalesLedger(salesLedger)); return toAjax(salesLedgerService.addOrUpdateSalesLedger(salesLedgerDto)); } /** * å é¤éå®å°è´¦ */ @Log(title = "éå®å°è´¦", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) @DeleteMapping("/delLedger") public AjaxResult remove(@RequestBody Long[] ids) { if (ids == null || ids.length == 0) { return AjaxResult.error("è¯·ä¼ å ¥è¦å é¤çID"); } return toAjax(salesLedgerService.deleteSalesLedgerByIds(ids)); } } src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,91 @@ package com.ruoyi.sales.controller; import javax.servlet.http.HttpServletResponse; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ISalesLedgerProductService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; 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.page.TableDataInfo; import java.util.List; /** * 产åä¿¡æ¯Controller * * @author ruoyi * @date 2025-05-08 */ @RestController @RequestMapping("/sales/product") public class SalesLedgerProductController extends BaseController { @Autowired private ISalesLedgerProductService salesLedgerProductService; /** * æ¥è¯¢äº§åä¿¡æ¯å表 */ @GetMapping("/list") public TableDataInfo list(SalesLedgerProduct salesLedgerProduct) { startPage(); List<SalesLedgerProduct> list = salesLedgerProductService.selectSalesLedgerProductList(salesLedgerProduct); return getDataTable(list); } /** * 导åºäº§åä¿¡æ¯å表 */ @Log(title = "产åä¿¡æ¯", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, SalesLedgerProduct salesLedgerProduct) { List<SalesLedgerProduct> list = salesLedgerProductService.selectSalesLedgerProductList(salesLedgerProduct); ExcelUtil<SalesLedgerProduct> util = new ExcelUtil<SalesLedgerProduct>(SalesLedgerProduct.class); util.exportExcel(response, list, "产åä¿¡æ¯æ°æ®"); } /** * è·å产åä¿¡æ¯è¯¦ç»ä¿¡æ¯ */ @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { return success(salesLedgerProductService.selectSalesLedgerProductById(id)); } /** * æ°å¢ä¿®æ¹äº§åä¿¡æ¯ */ @Log(title = "产åä¿¡æ¯", businessType = BusinessType.INSERT) @PostMapping ("/addOrUpdateSalesLedgerProduct") public AjaxResult add(@RequestBody SalesLedgerProduct salesLedgerProduct) { return toAjax(salesLedgerProductService.addOrUpdateSalesLedgerProduct(salesLedgerProduct)); } /** * å é¤äº§åä¿¡æ¯ */ @Log(title = "产åä¿¡æ¯", businessType = BusinessType.DELETE) @DeleteMapping("/delProduct") public AjaxResult remove(@RequestBody Long[] ids) { if (ids == null || ids.length == 0) { return AjaxResult.error("è¯·ä¼ å ¥è¦å é¤çID"); } return toAjax(salesLedgerProductService.deleteSalesLedgerProductByIds(ids)); } } src/main/java/com/ruoyi/sales/dto/InvoiceLedgerDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ package com.ruoyi.sales.dto; import com.ruoyi.common.vo.FileVo; import com.ruoyi.sales.pojo.InvoiceLedger; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data public class InvoiceLedgerDto extends InvoiceLedger { private List<FileVo> fileList; @ApiModelProperty(value = "æ¥è¯¢ææ¬") private String searchText; @ApiModelProperty(value = "客æ·åç§°") private String customerName; } src/main/java/com/ruoyi/sales/dto/ReceiptPaymentDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ package com.ruoyi.sales.dto; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.sales.pojo.ReceiptPayment; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDateTime; @Data public class ReceiptPaymentDto extends ReceiptPayment { } src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -1,4 +1,26 @@ package com.ruoyi.sales.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.sales.pojo.SalesLedgerProduct; import lombok.Data; import java.util.Date; import java.util.List; @Data public class SalesLedgerDto { private Long id; private String salesContractNo; private String customerContractNo; private String projectName; @JsonFormat(pattern = "yyyy-MM-dd") private Date entryDate; private String salesman; private Long customerId; private String customerName; private String entryPerson; private String remarks; private String attachmentMaterials; private Boolean hasChildren = false; private List<SalesLedgerProduct> productData; } src/main/java/com/ruoyi/sales/dto/SalesLedgerProductDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,4 @@ package com.ruoyi.sales.dto; public class SalesLedgerProductDTO { } src/main/java/com/ruoyi/sales/excel/InvoiceLedgerExcelDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,42 @@ package com.ruoyi.sales.excel; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.vo.FileVo; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import com.ruoyi.sales.pojo.InvoiceLedger; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; @Data public class InvoiceLedgerExcelDto { @Excel(name = "éå®ååå·") private String salesContractNo; @Excel(name = "客æ·åç§°") private String customerName; @Excel(name = "å票å·") private String invoiceNo; @Excel(name = "å票éé¢") private BigDecimal invoiceAmount; @Excel(name = "ç¨ç") private BigDecimal taxRate; @Excel(name = "å¼ç¥¨äºº") private String invoicePerson; @Excel(name = "å¼ç¥¨æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime invoiceDate; } src/main/java/com/ruoyi/sales/mapper/InvoiceLedgerFileMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,8 @@ package com.ruoyi.sales.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.sales.pojo.InvoiceLedger; import com.ruoyi.sales.pojo.InvoiceLedgerFile; public interface InvoiceLedgerFileMapper extends BaseMapper<InvoiceLedgerFile> { } src/main/java/com/ruoyi/sales/mapper/InvoiceLedgerMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,29 @@ package com.ruoyi.sales.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.sales.dto.InvoiceLedgerDto; import com.ruoyi.sales.pojo.InvoiceLedger; import org.apache.ibatis.annotations.Param; import java.util.List; public interface InvoiceLedgerMapper extends BaseMapper<InvoiceLedger> { /** * å¼ç¥¨å°è´¦å页æ¥è¯¢ * @param page * @param invoiceLedgerDto * @return */ IPage<InvoiceLedgerDto> invoiceLedgerPage(Page page, @Param("invoiceLedgerDto") InvoiceLedgerDto invoiceLedgerDto); /** * å¼ç¥¨å°è´¦æ¥è¯¢ * @param invoiceLedgerDto * @return */ List<InvoiceLedgerDto> invoiceLedgerList(@Param("invoiceLedgerDto") InvoiceLedgerDto invoiceLedgerDto); } src/main/java/com/ruoyi/sales/mapper/ReceiptPaymentMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,13 @@ package com.ruoyi.sales.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.sales.dto.ReceiptPaymentDto; import com.ruoyi.sales.pojo.ReceiptPayment; import org.apache.ibatis.annotations.Param; public interface ReceiptPaymentMapper extends BaseMapper<ReceiptPayment> { IPage<ReceiptPaymentDto> receiptPaymentListPage(Page page, @Param("receiptPaymentDto") ReceiptPaymentDto receiptPaymentDto); } src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java
@@ -3,6 +3,7 @@ import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.sales.pojo.SalesLedger; import org.apache.ibatis.annotations.Param; /** @@ -12,4 +13,10 @@ * @date 2025-05-08 */ public interface SalesLedgerMapper extends BaseMapper<SalesLedger> { /** * æ¥è¯¢æå®æ¥æçææåååºåå· * @param datePart æ¥æé¨åï¼æ ¼å¼ï¼yyyyMMddï¼ * @return åºåå·å表 */ List<Integer> selectSequencesByDate(@Param("datePart") String datePart); } src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,13 @@ package com.ruoyi.sales.mapper; import com.ruoyi.common.config.MyBaseMapper; import com.ruoyi.sales.pojo.SalesLedgerProduct; /** * 产åä¿¡æ¯Mapperæ¥å£ * * @author ruoyi * @date 2025-05-08 */ public interface SalesLedgerProductMapper extends MyBaseMapper<SalesLedgerProduct> { } src/main/java/com/ruoyi/sales/pojo/InvoiceLedger.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,72 @@ package com.ruoyi.sales.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.text.Format; import java.time.LocalDate; import java.time.LocalDateTime; @Data public class InvoiceLedger { /** * åºå· */ @TableId(type = IdType.AUTO) private Integer id; @ApiModelProperty(value = "éå®å°è´¦sales_ledger") private Integer salesLedgerId; @ApiModelProperty(value = "éå®ååå·") private String salesContractNo; @ApiModelProperty(value = "客æ·åç§°ID") private Integer customerId; @ApiModelProperty(value = "å票å·") private String invoiceNo; @ApiModelProperty(value = "å票éé¢") private BigDecimal invoiceAmount; @ApiModelProperty(value = "ç¨ç") private BigDecimal taxRate; @ApiModelProperty(value = "å¼ç¥¨äºº") private String invoicePerson; @ApiModelProperty(value = "å¼ç¥¨æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime invoiceDate; @ApiModelProperty(value = "å建æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty(value = "åå»ºç¨æ·") @TableField(fill = FieldFill.INSERT) private Integer createUser; @ApiModelProperty(value = "ä¿®æ¹æ¶é´") @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @ApiModelProperty(value = "ä¿®æ¹ç¨æ·") @TableField(fill = FieldFill.INSERT_UPDATE) private Integer updateUser; @ApiModelProperty(value = "ç§æ·ID") @TableField(fill = FieldFill.INSERT) private Integer tenantId; } src/main/java/com/ruoyi/sales/pojo/InvoiceLedgerFile.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,44 @@ package com.ruoyi.sales.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDateTime; @Data public class InvoiceLedgerFile { @ApiModelProperty(value = "æä»¶åç§°") private String fileName; @ApiModelProperty(value = "æä»¶è·¯å¾") private String filePath; @ApiModelProperty(value = "æä»¶å¤§å°") private int fileSize; @ApiModelProperty(value = "å¼ç¥¨å°è´¦ID") private Integer invoiceLedgerId; @ApiModelProperty(value = "å建æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty(value = "ä¿®æ¹æ¶é´") @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @ApiModelProperty(value = "åå»ºç¨æ·") @TableField(fill = FieldFill.INSERT) private Integer createUser; @ApiModelProperty(value = "ä¿®æ¹ç¨æ·") @TableField(fill = FieldFill.INSERT_UPDATE) private Integer updateUser; @ApiModelProperty(value = "ç§æ·ID") @TableField(fill = FieldFill.INSERT) private Integer tenantId; } src/main/java/com/ruoyi/sales/pojo/ReceiptPayment.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,79 @@ package com.ruoyi.sales.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDateTime; @Data public class ReceiptPayment { /** * åºå· */ @TableId(type = IdType.AUTO) private Integer id; @ApiModelProperty(value = "éå®å°è´¦sales_ledger") private Integer salesLedgerId; @ApiModelProperty(value = "éå®ååå·") private String salesContractNo; @ApiModelProperty(value = "客æ·åç§°ID") private Integer customerId; @ApiModelProperty(value = "å票å·") private String invoiceNo; @ApiModelProperty(value = "å票éé¢") private BigDecimal invoiceAmount; @ApiModelProperty(value = "ç¨ç") private BigDecimal taxRate; @ApiModelProperty(value = "忬¾å½¢å¼ 0çµæ±1æ¿å ") private String receiptPaymentType; @ApiModelProperty(value = "忬¾éé¢") private BigDecimal receiptPaymentAmount; @ApiModelProperty(value = "ç»è®°äºº") private String registrant; @ApiModelProperty(value = "invoice_ledgerå¼ç¥¨å°è´¦ä¸»é®ID") private Integer invoiceLedgerId; @ApiModelProperty(value = "æ¥æ¬¾æ¥æ") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime receiptPaymentDate; @ApiModelProperty(value = "å建æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty(value = "åå»ºç¨æ·") @TableField(fill = FieldFill.INSERT) private Integer createUser; @ApiModelProperty(value = "ä¿®æ¹æ¶é´") @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @ApiModelProperty(value = "ä¿®æ¹ç¨æ·") @TableField(fill = FieldFill.INSERT_UPDATE) private Integer updateUser; @ApiModelProperty(value = "ç§æ·ID") @TableField(fill = FieldFill.INSERT) private Integer tenantId; } src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -1,11 +1,10 @@ package com.ruoyi.sales.pojo; import java.math.BigDecimal; import java.util.Date; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import lombok.Data; @@ -60,6 +59,11 @@ /** * 客æ·åç§° */ private Long customerId; /** * 客æ·åç§° */ @Excel(name = "客æ·åç§°") private String customerName; @@ -78,8 +82,16 @@ /** * éä»¶ææï¼å卿件åçç¸å ³ä¿¡æ¯ */ @Excel(name = "éä»¶ææï¼å卿件åçç¸å ³ä¿¡æ¯") private String attachmentMaterials; @TableField(fill = FieldFill.INSERT) private Long tenantId; /** * ååéé¢ï¼äº§åå«ç¨æ»ä»·ï¼ */ @Excel(name = "ç¨ç") private BigDecimal contractAmount; } src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,87 @@ package com.ruoyi.sales.pojo; import java.math.BigDecimal; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import lombok.Data; /** * 产åä¿¡æ¯å¯¹è±¡ sales_ledger_product * * @author ruoyi * @date 2025-05-08 */ @TableName("sales_ledger_product") @Data public class SalesLedgerProduct { private static final long serialVersionUID = 1L; /** * 产åä¿¡æ¯ä¸»é® */ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * å ³èéå®å°è´¦ä¸»è¡¨ä¸»é® */ @Excel(name = "å ³èéå®å°è´¦ä¸»è¡¨ä¸»é®") private Long salesLedgerId; /** * 产å大类 */ @Excel(name = "产å大类") private String productCategory; /** * è§æ ¼åå· */ @Excel(name = "è§æ ¼åå·") private String specificationModel; /** * åä½ */ @Excel(name = "åä½") private String unit; /** * æ°é */ @Excel(name = "æ°é") private BigDecimal quantity; /** * ç¨ç */ @Excel(name = "ç¨ç") private BigDecimal taxRate; /** * å«ç¨åä»· */ @Excel(name = "å«ç¨åä»·") private BigDecimal taxInclusiveUnitPrice; /** * å«ç¨æ»ä»· */ @Excel(name = "å«ç¨æ»ä»·") private BigDecimal taxInclusiveTotalPrice; /** * ä¸å«ç¨æ»ä»· */ @Excel(name = "ä¸å«ç¨æ»ä»·") private BigDecimal taxExclusiveTotalPrice; /** * å票类å */ @Excel(name = "å票类å") private String invoiceType; } src/main/java/com/ruoyi/sales/service/ISalesLedgerProductService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,23 @@ package com.ruoyi.sales.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.sales.pojo.SalesLedgerProduct; import java.util.List; /** * 产åä¿¡æ¯Serviceæ¥å£ * * @author ruoyi * @date 2025-05-08 */ public interface ISalesLedgerProductService extends IService<SalesLedgerProduct> { SalesLedgerProduct selectSalesLedgerProductById(Long id); List<SalesLedgerProduct> selectSalesLedgerProductList(SalesLedgerProduct salesLedgerProduct); int deleteSalesLedgerProductByIds(Long[] ids); int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct); } src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -3,6 +3,7 @@ import java.util.List; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.pojo.SalesLedger; /** @@ -19,7 +20,7 @@ int deleteSalesLedgerByIds(Long[] ids); int insertSalesLedger(SalesLedger salesLedger); int addOrUpdateSalesLedger(SalesLedgerDto salesLedgerDto); int updateSalesLedger(SalesLedger salesLedger); List<SalesLedgerDto> getSalesLedgerWithProducts(); } src/main/java/com/ruoyi/sales/service/InvoiceLedgerService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,66 @@ package com.ruoyi.sales.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.vo.FileVo; import com.ruoyi.sales.dto.InvoiceLedgerDto; import com.ruoyi.sales.pojo.InvoiceLedger; import com.ruoyi.sales.pojo.InvoiceLedgerFile; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.List; public interface InvoiceLedgerService { /** * å¼ç¥¨å°è´¦æ°å¢ * @param invoiceLedgerDto * @return */ int invoiceLedgerAdd( InvoiceLedgerDto invoiceLedgerDto); /** * å¼ç¥¨å°è´¦å é¤ * @param ids * @return */ int invoiceLedgerDel(List<Integer> ids); /** * å¼ç¥¨å°è´¦ä¿®æ¹ * @param invoiceLedgerDto * @return */ int invoiceLedgerUpdate(InvoiceLedgerDto invoiceLedgerDto); /** * å¼ç¥¨å°è´¦å页æ¥è¯¢ * @param page * @param invoiceLedgerDto * @return */ IPage<InvoiceLedgerDto> invoiceLedgerPage(Page page, InvoiceLedgerDto invoiceLedgerDto); /** * å¼ç¥¨å°è´¦æä»¶æ¥è¯¢ * @param invoiceLedgerId * @return */ List<InvoiceLedgerFile> invoiceLedgerFileList(Integer invoiceLedgerId); /** * å¼ç¥¨å°è´¦æä»¶ä¸ä¼ * @param file * @return */ FileVo invoiceLedgerUploadFile(MultipartFile file); /** * éä»¶ä¸è½½ * @param response * @param invoiceLedgerDto * @return */ void invoiceLedgerDownload(HttpServletResponse response ,InvoiceLedgerDto invoiceLedgerDto); } src/main/java/com/ruoyi/sales/service/ReceiptPaymentService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,40 @@ package com.ruoyi.sales.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.sales.dto.ReceiptPaymentDto; import com.ruoyi.sales.pojo.ReceiptPayment; import java.util.List; public interface ReceiptPaymentService { /** * 忬¾ç»è®°æ°å¢ * @param receiptPayment * @return */ int receiptPaymentAdd(ReceiptPayment receiptPayment); /** * 忬¾ç»è®°ä¿®æ¹ * @param receiptPayment * @return */ int receiptPaymentUpdate(ReceiptPayment receiptPayment); /** * 忬¾ç»è®°å é¤ * @param ids * @return */ int receiptPaymentDel(List<Integer> ids); /** * 忬¾ç»è®°å页æ¥è¯¢ * @param page * @param receiptPaymentDto * @return */ IPage<ReceiptPaymentDto> receiptPaymentListPage (Page page, ReceiptPaymentDto receiptPaymentDto); } src/main/java/com/ruoyi/sales/service/impl/InvoiceLedgerServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,171 @@ package com.ruoyi.sales.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.dto.SupplierManageDto; import com.ruoyi.basic.excel.SupplierManageExcelDto; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.vo.FileVo; import com.ruoyi.sales.dto.InvoiceLedgerDto; import com.ruoyi.sales.excel.InvoiceLedgerExcelDto; import com.ruoyi.sales.mapper.InvoiceLedgerFileMapper; import com.ruoyi.sales.mapper.InvoiceLedgerMapper; import com.ruoyi.sales.pojo.InvoiceLedger; import com.ruoyi.sales.pojo.InvoiceLedgerFile; import com.ruoyi.sales.service.InvoiceLedgerService; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.util.List; import java.util.stream.Collectors; @Service public class InvoiceLedgerServiceImpl extends ServiceImpl<InvoiceLedgerMapper, InvoiceLedger> implements InvoiceLedgerService { @Value("${ruoyi.profile}") private String uploadFile; @Autowired private InvoiceLedgerMapper invoiceLedgerMapper; @Autowired private InvoiceLedgerFileMapper invoiceLedgerFileMapper; /** * å¼ç¥¨å°è´¦æ°å¢ * @param invoiceLedgerDto * @return */ @Override @Transactional(rollbackFor = Exception.class) public int invoiceLedgerAdd(InvoiceLedgerDto invoiceLedgerDto) { InvoiceLedger invoiceLedger = new InvoiceLedger(); BeanUtils.copyProperties(invoiceLedgerDto, invoiceLedger); int result = invoiceLedgerMapper.insert(invoiceLedger); List<FileVo> fileList = invoiceLedgerDto.getFileList(); if(CollectionUtils.isNotEmpty(fileList)){ fileList.forEach(fileVo -> { InvoiceLedgerFile invoiceLedgerFile = new InvoiceLedgerFile(); BeanUtils.copyProperties(fileVo, invoiceLedgerFile); invoiceLedgerFile.setInvoiceLedgerId(invoiceLedger.getId()); invoiceLedgerFileMapper.insert(invoiceLedgerFile); }); } return result; } /** * å¼ç¥¨å°è´¦å é¤ * @param ids * @return */ @Override public int invoiceLedgerDel(List<Integer> ids) { LambdaQueryWrapper<InvoiceLedger> delWrapper = new LambdaQueryWrapper<>(); delWrapper.in(InvoiceLedger::getId, ids); return invoiceLedgerMapper.delete(delWrapper); } /** * å¼ç¥¨å°è´¦ä¿®æ¹ * @param invoiceLedgerDto * @return */ @Override @Transactional(rollbackFor = Exception.class) public int invoiceLedgerUpdate(InvoiceLedgerDto invoiceLedgerDto) { InvoiceLedger invoiceLedger = new InvoiceLedger(); BeanUtils.copyProperties(invoiceLedgerDto, invoiceLedger); int result = invoiceLedgerMapper.updateById(invoiceLedger); // å é¤å ³èéä»¶ LambdaQueryWrapper<InvoiceLedgerFile> delWrapper = new LambdaQueryWrapper<>(); delWrapper.eq(InvoiceLedgerFile::getInvoiceLedgerId, invoiceLedger.getId()); invoiceLedgerFileMapper.delete(delWrapper); // éæ°æå ¥éä»¶å ³è表 List<FileVo> fileList = invoiceLedgerDto.getFileList(); if(CollectionUtils.isNotEmpty(fileList)){ fileList.forEach(fileVo -> { InvoiceLedgerFile invoiceLedgerFile = new InvoiceLedgerFile(); BeanUtils.copyProperties(fileVo, invoiceLedgerFile); invoiceLedgerFile.setInvoiceLedgerId(invoiceLedger.getId()); invoiceLedgerFileMapper.insert(invoiceLedgerFile); }); } return result; } /** * å¼ç¥¨å°è´¦å页æ¥è¯¢ * @param page * @param invoiceLedgerDto * @return */ @Override public IPage<InvoiceLedgerDto> invoiceLedgerPage(Page page, InvoiceLedgerDto invoiceLedgerDto) { return invoiceLedgerMapper.invoiceLedgerPage(page, invoiceLedgerDto); } /** * å¼ç¥¨å°è´¦æä»¶æ¥è¯¢ * @param invoiceLedgerId * @return */ @Override public List<InvoiceLedgerFile> invoiceLedgerFileList(Integer invoiceLedgerId) { LambdaQueryWrapper<InvoiceLedgerFile> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(InvoiceLedgerFile::getInvoiceLedgerId, invoiceLedgerId); return invoiceLedgerFileMapper.selectList(queryWrapper); } /** * å¼ç¥¨å°è´¦æä»¶ä¸ä¼ * @param file * @return */ @Override public FileVo invoiceLedgerUploadFile(MultipartFile file) { FileVo fileVo = new FileVo(); try { String baseDir = uploadFile + File.separatorChar + "invoiceLedger"; String filePath = FileUploadUtils.upload(baseDir, file); fileVo.setFileName(file.getOriginalFilename()); fileVo.setFilePath(filePath); fileVo.setFileSize((int)file.getSize()); }catch (Exception e){ e.printStackTrace(); throw new RuntimeException("æä»¶ä¸ä¼ 失败"); } return fileVo; } /** * éä»¶ä¸è½½ * @param response * @param invoiceLedgerDto * @return */ @Override public void invoiceLedgerDownload(HttpServletResponse response, InvoiceLedgerDto invoiceLedgerDto) { List<InvoiceLedgerDto> invoiceLedgerDtoList = invoiceLedgerMapper.invoiceLedgerList(invoiceLedgerDto); List<InvoiceLedgerExcelDto> invoiceLedgerExcelDtoList = invoiceLedgerDtoList.stream().map(item -> { InvoiceLedgerExcelDto invoiceLedgerExcelDto = new InvoiceLedgerExcelDto(); BeanUtils.copyProperties(item, invoiceLedgerExcelDto); return invoiceLedgerExcelDto; }).collect(Collectors.toList()); ExcelUtil<InvoiceLedgerExcelDto> util = new ExcelUtil<InvoiceLedgerExcelDto>(InvoiceLedgerExcelDto.class); util.exportExcel(response, invoiceLedgerExcelDtoList, "ä¾åºå导åº"); } } src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java
@@ -16,8 +16,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Collections; import java.util.List; @Service src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,64 @@ package com.ruoyi.sales.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.sales.dto.ReceiptPaymentDto; import com.ruoyi.sales.mapper.ReceiptPaymentMapper; import com.ruoyi.sales.pojo.ReceiptPayment; import com.ruoyi.sales.service.ReceiptPaymentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class ReceiptPaymentServiceImpl extends ServiceImpl<ReceiptPaymentMapper,ReceiptPayment> implements ReceiptPaymentService { @Autowired private ReceiptPaymentMapper receiptPaymentMapper; /** * 忬¾ç»è®°æ°å¢ * @param receiptPayment * @return */ @Override public int receiptPaymentAdd(ReceiptPayment receiptPayment) { return receiptPaymentMapper.insert(receiptPayment); } /** * 忬¾ç»è®°ä¿®æ¹ * @param receiptPayment * @return */ @Override public int receiptPaymentUpdate(ReceiptPayment receiptPayment) { return receiptPaymentMapper.updateById(receiptPayment); } /** * 忬¾ç»è®°å é¤ * @param ids * @return */ @Override public int receiptPaymentDel(List<Integer> ids) { LambdaQueryWrapper<ReceiptPayment> delQuery = new LambdaQueryWrapper<>(); delQuery.in(ReceiptPayment::getId, ids); return receiptPaymentMapper.delete(delQuery); } /** * 忬¾ç»è®°å页æ¥è¯¢ * @param page * @param receiptPaymentDto * @return */ @Override public IPage<ReceiptPaymentDto> receiptPaymentListPage(Page page, ReceiptPaymentDto receiptPaymentDto) { return receiptPaymentMapper.receiptPaymentListPage(page, receiptPaymentDto); } } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,50 @@ package com.ruoyi.sales.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ISalesLedgerProductService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.List; /** * 产åä¿¡æ¯Serviceä¸å¡å±å¤ç * * @author ruoyi * @date 2025-05-08 */ @Service public class SalesLedgerProductServiceImpl extends ServiceImpl<SalesLedgerProductMapper, SalesLedgerProduct> implements ISalesLedgerProductService { @Autowired private SalesLedgerProductMapper salesLedgerProductMapper; @Override public SalesLedgerProduct selectSalesLedgerProductById(Long id) { return salesLedgerProductMapper.selectById(id); } @Override public List<SalesLedgerProduct> selectSalesLedgerProductList(SalesLedgerProduct salesLedgerProduct) { LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId,salesLedgerProduct.getSalesLedgerId()); return salesLedgerProductMapper.selectList(queryWrapper); } @Override public int deleteSalesLedgerProductByIds(Long[] ids) { return salesLedgerProductMapper.deleteBatchIds(Arrays.asList(ids)); } @Override public int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct) { if (salesLedgerProduct.getId() == null){ return salesLedgerProductMapper.insert(salesLedgerProduct); }else { return salesLedgerProductMapper.updateById(salesLedgerProduct); } } } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -1,15 +1,29 @@ package com.ruoyi.sales.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.mapper.CustomerMapper; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ISalesLedgerService; import org.springframework.beans.factory.annotation.Autowired; import lombok.AllArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; import java.util.List; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** * éå®å°è´¦Serviceä¸å¡å±å¤ç @@ -18,13 +32,44 @@ * @date 2025-05-08 */ @Service @AllArgsConstructor public class SalesLedgerServiceImpl extends ServiceImpl<SalesLedgerMapper, SalesLedger> implements ISalesLedgerService { @Autowired private SalesLedgerMapper salesLedgerMapper; private CustomerMapper customerMapper; private SalesLedgerProductMapper salesLedgerProductMapper; private static final String LOCK_PREFIX = "contract_no_lock:"; private static final long LOCK_WAIT_TIMEOUT = 10; // éçå¾ è¶ æ¶æ¶é´ï¼ç§ï¼ private static final long LOCK_EXPIRE_TIME = 30; // éèªå¨è¿ææ¶é´ï¼ç§ï¼ private final RedisTemplate<String, String> redisTemplate; @Override public List<SalesLedger> selectSalesLedgerList(SalesLedger salesLedger) { return salesLedgerMapper.selectList(new LambdaQueryWrapper<>()); } public List<SalesLedgerDto> getSalesLedgerWithProducts() { List<SalesLedger> ledgers = salesLedgerMapper.selectList(new LambdaQueryWrapper<>()); List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<>()); Map<Long, List<SalesLedgerProduct>> productMap = products.stream() .collect(Collectors.groupingBy(SalesLedgerProduct::getSalesLedgerId)); return ledgers.stream().map(ledger -> { SalesLedgerDto dto = new SalesLedgerDto(); org.springframework.beans.BeanUtils.copyProperties(ledger, dto); List<SalesLedgerProduct> ledgerProducts = productMap.getOrDefault(ledger.getId(), Collections.emptyList()); if (!ledgerProducts.isEmpty()) { dto.setHasChildren(true); dto.setProductData(ledgerProducts); } return dto; }).collect(Collectors.toList()); } @Override @@ -33,17 +78,139 @@ } @Override @Transactional(rollbackFor = Exception.class) public int deleteSalesLedgerByIds(Long[] ids) { return salesLedgerMapper.deleteBatchIds(Arrays.asList(ids)); List<Long> idList = Arrays.stream(ids) .filter(Objects::nonNull) .collect(Collectors.toList()); if (CollectionUtils.isEmpty(idList)) { return 0; } // 1. å å é¤åè¡¨æ°æ® LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>(); productWrapper.in(SalesLedgerProduct::getSalesLedgerId, idList); salesLedgerProductMapper.delete(productWrapper); // 2. åå é¤ä¸»è¡¨æ°æ® return salesLedgerMapper.deleteBatchIds(idList); } @Override public int insertSalesLedger(SalesLedger salesLedger) { return salesLedgerMapper.insert(salesLedger); @Transactional(rollbackFor = Exception.class) public int addOrUpdateSalesLedger(SalesLedgerDto salesLedgerDto) { // 1. æ ¡éªå®¢æ·ä¿¡æ¯ Customer customer = customerMapper.selectById(salesLedgerDto.getCustomerId()); if (customer == null) { throw new BaseException("客æ·ä¸åå¨"); } // 2. DTO转Entity SalesLedger salesLedger = convertToEntity(salesLedgerDto); salesLedger.setCustomerName(customer.getCustomerName()); salesLedger.setTenantId(customer.getTenantId()); // 3. æ°å¢ææ´æ°ä¸»è¡¨ if (salesLedger.getId() == null) { // çæååç¼å· String contractNo = generateSalesContractNo(); salesLedger.setSalesContractNo(contractNo); salesLedgerMapper.insert(salesLedger); } else { salesLedgerMapper.updateById(salesLedger); } // 4. å¤çåè¡¨æ°æ® if (salesLedgerDto.getProductData() != null && !salesLedgerDto.getProductData().isEmpty()) { handleSalesLedgerProducts(salesLedger.getId(), salesLedgerDto.getProductData()); } return 1; // æä½æåè¿å1 } @Override public int updateSalesLedger(SalesLedger salesLedger) { return salesLedgerMapper.updateById(salesLedger); private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products) { // æIDåç»ï¼åºåæ°å¢åæ´æ°çè®°å½ Map<Boolean, List<SalesLedgerProduct>> partitionedProducts = products.stream() .peek(p -> p.setSalesLedgerId(salesLedgerId)) .collect(Collectors.partitioningBy(p -> p.getId() != null)); List<SalesLedgerProduct> updateList = partitionedProducts.get(true); List<SalesLedgerProduct> insertList = partitionedProducts.get(false); // æ§è¡æ´æ°æä½ if (!updateList.isEmpty()) { salesLedgerProductMapper.updateBatchSomeColumn(updateList); } // æ§è¡æå ¥æä½ if (!insertList.isEmpty()) { salesLedgerProductMapper.insertBatchSomeColumn(insertList); } } private SalesLedger convertToEntity(SalesLedgerDto dto) { SalesLedger entity = new SalesLedger(); BeanUtils.copyProperties(dto, entity); return entity; } @Transactional(readOnly = true) public String generateSalesContractNo() { LocalDate currentDate = LocalDate.now(); String datePart = currentDate.format(DateTimeFormatter.BASIC_ISO_DATE); String lockKey = LOCK_PREFIX + datePart; String lockValue = Thread.currentThread().getId() + "-" + System.nanoTime(); // å¯ä¸æ è¯éææè try { // 1. å°è¯è·ååå¸å¼éï¼å¾ªç¯ç´å°è¶ æ¶ï¼ long startWaitTime = System.currentTimeMillis(); while (System.currentTimeMillis() - startWaitTime < LOCK_WAIT_TIMEOUT * 1000) { // SET key value NX PX 30000ï¼ä» å½éä¸å卿¶è·åï¼è®¾ç½®30ç§è¿æ Boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, lockValue, LOCK_EXPIRE_TIME, TimeUnit.SECONDS); if (Boolean.TRUE.equals(locked)) { break; // æåè·åé } // çæä¼ç é¿å å¿çå¾ try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new RuntimeException("è·åéæ¶è¢«ä¸æ", e); } } if (!redisTemplate.hasKey(lockKey)) { throw new RuntimeException("è·åååç¼å·çæé失败ï¼è¶ æ¶"); } // 2. æ¥è¯¢å½å¤©å·²åå¨çåºåå·ï¼ä¸åé»è¾ä¸è´ï¼ List<Integer> existingSequences = salesLedgerMapper.selectSequencesByDate(datePart); int nextSequence = findFirstMissingSequence(existingSequences); return datePart + String.format("%02d", nextSequence); } finally { // 3. éæ¾éï¼ä½¿ç¨Luaèæ¬ä¿è¯ååæ§ï¼é¿å 误å å ¶ä»çº¿ç¨çéï¼ String luaScript = "if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('DEL', KEYS[1]) else return 0 end"; redisTemplate.execute( new DefaultRedisScript<>(luaScript, Long.class), Collections.singletonList(lockKey), lockValue // åªæææç¸åå¼ççº¿ç¨æè½å é¤é ); } } private int findFirstMissingSequence(List<Integer> sequences) { if (sequences.isEmpty()) { return 1; } // æåºåæ¥æ¾ç¬¬ä¸ä¸ªç¼ºå¤±çæ£æ´æ°ï¼ä¸åé»è¾ä¸è´ï¼ sequences.sort(Integer::compareTo); int next = 1; for (int seq : sequences) { if (seq == next) { next++; } else if (seq > next) { break; } } return next; } } src/main/resources/application.yml
@@ -100,7 +100,7 @@ # MyBatis Plusé ç½® mybatis-plus: # æç´¢æå®å å«å æ ¹æ®èªå·±çé¡¹ç®æ¥ typeAliasesPackage: com.ruoyi.basic.**.pojo typeAliasesPackage: com.ruoyi.**.pojo # é ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ mapperLocations: classpath*:mapper/**/*Mapper.xml # å è½½å ¨å±çé ç½®æä»¶ src/main/resources/mapper/sales/InvoiceLedgerMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,69 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.sales.mapper.InvoiceLedgerMapper"> <select id="invoiceLedgerPage" resultType="com.ruoyi.sales.dto.InvoiceLedgerDto"> SELECT T1.id , T1.sales_ledger_id , T1.sales_contract_no , T1.customer_id , T1.invoice_no , T1.invoice_amount , T1.tax_rate , T1.invoice_person , T1.invoice_date , T1.create_time , T1.create_user , T1.update_time , T1.update_user , T1.tenant_id , T2.customer_name FROM invoice_ledger T1 LEFT JOIN customer T2 ON T1.customer_id = T2.id <where> <if test="invoiceLedgerDto.searchText != null and invoiceLedgerDto.searchText != ''"> AND ( T2.customer_name LIKE CONCAT('%',#{invoiceLedgerDto.searchText},'%') OR T1.sales_contract_no LIKE CONCAT('%',#{invoiceLedgerDto.searchText},'%') ) </if> <if test="invoiceLedgerDto.invoiceDate != null"> AND DATE_FORMAT(T1.invoice_date,'%Y-%m-%d') = DATE_FORMAT(#{invoiceLedgerDto.invoiceDate},'%Y-%m-%d') </if> </where> </select> <select id="invoiceLedgerList" resultType="com.ruoyi.sales.dto.InvoiceLedgerDto"> SELECT T1.id , T1.sales_ledger_id , T1.sales_contract_no , T1.customer_id , T1.invoice_no , T1.invoice_amount , T1.tax_rate , T1.invoice_person , T1.invoice_date , T1.create_time , T1.create_user , T1.update_time , T1.update_user , T1.tenant_id , T2.customer_name FROM invoice_ledger T1 LEFT JOIN customer T2 ON T1.customer_id = T2.id <where> <if test="invoiceLedgerDto.searchText != null and invoiceLedgerDto.searchText != ''"> AND ( T2.customer_name LIKE CONCAT('%',#{invoiceLedgerDto.searchText},'%') OR T1.sales_contract_no LIKE CONCAT('%',#{invoiceLedgerDto.searchText},'%') ) </if> <if test="invoiceLedgerDto.invoiceDate != null"> AND DATE_FORMAT(T1.invoice_date,'%Y-%m-%d') = DATE_FORMAT(#{invoiceLedgerDto.invoiceDate},'%Y-%m-%d') </if> </where> </select> </mapper> src/main/resources/mapper/sales/ReceiptPaymentMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.sales.mapper.ReceiptPaymentMapper"> <select id="invoiceLedgerPage" resultType="com.ruoyi.sales.dto.ReceiptPaymentDto"> SELECT T1.id , T1.sales_ledger_id , T1.sales_contract_no , T1.customer_id , T1.invoice_no , T1.invoice_amount , T1.tax_rate , T1.receipt_payment_type , T1.receipt_payment_amount , T1.registrant , T1.receipt_payment_date , T1.create_time , T1.create_user , T1.update_time , T1.update_user , T1.tenant_id , FROM receipt_payment T1 LEFT JOIN customer T2 ON T1.customer_id = T2.id </select> </mapper> src/main/resources/mapper/sales/SalesLedgerMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,12 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.sales.mapper.SalesLedgerMapper"> <select id="selectSequencesByDate" resultType="java.lang.Integer"> SELECT CAST(SUBSTR(sales_contract_no, 9, 2) AS SIGNED) FROM sales_ledger WHERE SUBSTR(sales_contract_no, 1, 8) = #{datePart} </select> </mapper>