From 30a4a720cfdd57248514f50d141dfd51519aa75d Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期五, 16 一月 2026 08:58:57 +0800
Subject: [PATCH] yys 销售指标,采购报表

---
 src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java              |   73 +++++
 src/main/java/com/ruoyi/account/pojo/AccountIncome.java                                  |   10 
 src/main/java/com/ruoyi/CodeGenerator.java                                               |    4 
 src/main/java/com/ruoyi/sales/dto/StatisticsTableDto.java                                |   31 ++
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java             |   30 --
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                               |    2 
 src/main/java/com/ruoyi/account/service/BorrowInfoService.java                           |   27 +
 src/main/java/com/ruoyi/account/service/impl/BorrowInfoServiceImpl.java                  |  132 +++++++++
 src/main/java/com/ruoyi/purchase/service/impl/ProcurementBusinessSummaryServiceImpl.java |   26 +
 src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java        |   22 +
 src/main/java/com/ruoyi/purchase/controller/ProcurementBusinessSummaryController.java    |   32 ++
 src/main/java/com/ruoyi/sales/controller/MetricStatisticsController.java                 |   38 ++
 src/main/resources/mapper/sales/SalesLedgerProductMapper.xml                             |   30 ++
 src/main/java/com/ruoyi/sales/dto/SalesTrendDto.java                                     |   19 +
 src/main/java/com/ruoyi/account/mapper/BorrowInfoMapper.java                             |   18 +
 src/main/java/com/ruoyi/framework/security/service/SysLoginService.java                  |   14 
 src/main/java/com/ruoyi/account/controller/BorrowInfoController.java                     |   84 ++++++
 src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java                              |   32 ++
 src/main/resources/mapper/system/SysUserMapper.xml                                       |    2 
 src/main/java/com/ruoyi/purchase/dto/ProcurementBusinessSummaryDto.java                  |   76 +++++
 src/main/java/com/ruoyi/account/pojo/BorrowInfo.java                                     |   93 ++++++
 src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java                       |    3 
 src/main/resources/mapper/account/BorrowInfoMapper.xml                                   |   22 +
 23 files changed, 776 insertions(+), 44 deletions(-)

diff --git a/src/main/java/com/ruoyi/CodeGenerator.java b/src/main/java/com/ruoyi/CodeGenerator.java
index 9e75ced..cca67a2 100644
--- a/src/main/java/com/ruoyi/CodeGenerator.java
+++ b/src/main/java/com/ruoyi/CodeGenerator.java
@@ -19,11 +19,11 @@
 // 婕旂ず渚嬪瓙锛屾墽琛� main 鏂规硶鎺у埗鍙拌緭鍏ユā鍧楄〃鍚嶅洖杞﹁嚜鍔ㄧ敓鎴愬搴旈」鐩洰褰曚腑
 public class CodeGenerator {
 
-    public static String database_url = "jdbc:mysql://127.0.0.1:3306/product-inventory-management";
+    public static String database_url = "jdbc:mysql://127.0.0.1:3306/product-inventory-management-new";
     public static String database_username = "root";
     public static String database_password= "123456";
     public static String author = "鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃";
-    public static String model = "quality"; // 妯″潡
+    public static String model = "account"; // 妯″潡
     public static String setParent = "com.ruoyi."+ model; // 鍖呰矾寰�
     public static String tablePrefix = ""; // 璁剧疆杩囨护琛ㄥ墠缂�
     public static void main(String[] args) {
diff --git a/src/main/java/com/ruoyi/account/controller/BorrowInfoController.java b/src/main/java/com/ruoyi/account/controller/BorrowInfoController.java
new file mode 100644
index 0000000..b9fe0a1
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/controller/BorrowInfoController.java
@@ -0,0 +1,84 @@
+package com.ruoyi.account.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.account.pojo.BorrowInfo;
+import com.ruoyi.account.service.BorrowInfoService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍊熸淇℃伅琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-01-15 02:57:29
+ */
+@Api(tags = "鍊熸淇℃伅琛�")
+@RestController
+@RequestMapping("/borrowInfo")
+public class BorrowInfoController {
+
+    @Autowired
+    private BorrowInfoService borrowInfoService;
+
+    @GetMapping("/listPage")
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    public AjaxResult listPage(Page page, BorrowInfo borrowInfo) {
+        return borrowInfoService.listPage(page,borrowInfo);
+    }
+
+    /**
+     * 鏂板
+     */
+    @PostMapping("/add")
+    @Transactional(rollbackFor = Exception.class)
+    @Log(title = "鏂板鍊熸淇℃伅", businessType = BusinessType.INSERT)
+    public AjaxResult add(@RequestBody BorrowInfo borrowInfo) {
+        return borrowInfoService.add(borrowInfo);
+    }
+
+    /**
+     * 淇敼
+     */
+    @PostMapping("/update")
+    @Transactional(rollbackFor = Exception.class)
+    @Log(title = "淇敼鍊熸淇℃伅", businessType = BusinessType.UPDATE)
+    public AjaxResult updateBorrowInfo(@RequestBody BorrowInfo borrowInfo) {
+        return borrowInfoService.updateBorrowInfo(borrowInfo);
+    }
+
+
+    /**
+     * 鍒犻櫎
+     */
+    @DeleteMapping("/delete")
+    @Transactional(rollbackFor = Exception.class)
+    @Log(title = "鍒犻櫎鍊熸淇℃伅", businessType = BusinessType.DELETE)
+    public AjaxResult delete(@RequestBody List<Long> ids) {
+        return borrowInfoService.delete(ids);
+    }
+
+    /**
+     * 瀵煎嚭
+     */
+    @PostMapping("/export")
+    @ApiOperation(value = "瀵煎嚭鍊熸淇℃伅")
+    public void export(HttpServletResponse response, BorrowInfo borrowInfo) {
+        List<BorrowInfo> list = borrowInfoService.list();
+        ExcelUtil<BorrowInfo> util = new ExcelUtil<>(BorrowInfo.class);
+        util.exportExcel(response,list, "鍊熸淇℃伅鏁版嵁");
+    }
+
+
+}
diff --git a/src/main/java/com/ruoyi/account/mapper/BorrowInfoMapper.java b/src/main/java/com/ruoyi/account/mapper/BorrowInfoMapper.java
new file mode 100644
index 0000000..bcac543
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/mapper/BorrowInfoMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.account.mapper;
+
+import com.ruoyi.account.pojo.BorrowInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 鍊熸淇℃伅琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-01-15 02:57:29
+ */
+@Mapper
+public interface BorrowInfoMapper extends BaseMapper<BorrowInfo> {
+
+}
diff --git a/src/main/java/com/ruoyi/account/pojo/AccountIncome.java b/src/main/java/com/ruoyi/account/pojo/AccountIncome.java
index e5d6c37..ff89f7b 100644
--- a/src/main/java/com/ruoyi/account/pojo/AccountIncome.java
+++ b/src/main/java/com/ruoyi/account/pojo/AccountIncome.java
@@ -30,6 +30,16 @@
     private Long id;
 
     /**
+     * 涓氬姟id
+     */
+    private Long businessId;
+
+    /**
+     * 涓氬姟绫诲瀷 1-鍥炴 2-鍊熸
+     */
+    private Integer businessType;
+
+    /**
      * 鏀跺叆鏃ユ湡
      */
     @JsonFormat(pattern = "yyyy-MM-dd")
diff --git a/src/main/java/com/ruoyi/account/pojo/BorrowInfo.java b/src/main/java/com/ruoyi/account/pojo/BorrowInfo.java
new file mode 100644
index 0000000..889cc4f
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/pojo/BorrowInfo.java
@@ -0,0 +1,93 @@
+package com.ruoyi.account.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.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.dto.DateQueryDto;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * <p>
+ * 鍊熸淇℃伅琛�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-01-15 02:57:29
+ */
+@Getter
+@Setter
+@TableName("borrow_info")
+@ApiModel(value = "BorrowInfo瀵硅薄", description = "鍊熸淇℃伅琛�")
+public class BorrowInfo extends DateQueryDto implements Serializable{
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("鍊熸璁板綍涓婚敭ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("鍊熸浜哄鍚�")
+    @Excel(name = "鍊熸浜哄鍚�")
+    private String borrowerName;
+
+    @ApiModelProperty("鍊熸閲戦锛堝厓锛�")
+    @Excel(name = "鍊熸閲戦锛堝厓锛�")
+    private BigDecimal borrowAmount;
+
+    @ApiModelProperty("鍊熸鍒╃巼锛堝锛�5.85 浠h〃5.85%锛�")
+    @Excel(name = "鍊熸鍒╃巼")
+    private BigDecimal interestRate;
+
+    @ApiModelProperty("鍊熸鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "鍊熸鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    private LocalDate borrowDate;
+
+    @ApiModelProperty("瀹為檯杩樻鏃ユ湡锛堣繕娆惧悗濉厖锛�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "瀹為檯杩樻鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    private LocalDate repayDate;
+
+    @ApiModelProperty("鍊熸鐘舵�侊細1=寰呰繕娆撅紝2=宸茶繕娆�")
+    @Excel(name = "鍊熸鐘舵��", readConverterExp = "1=寰呰繕娆�,2=宸茶繕娆�")
+    private Integer status;
+
+    @ApiModelProperty("澶囨敞锛堝�熸璇存槑锛�")
+    @Excel(name = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鍒涘缓鑰匢D")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("淇敼鑰匢D")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("绉熸埛id")
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+}
diff --git a/src/main/java/com/ruoyi/account/service/BorrowInfoService.java b/src/main/java/com/ruoyi/account/service/BorrowInfoService.java
new file mode 100644
index 0000000..eb1c83b
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/service/BorrowInfoService.java
@@ -0,0 +1,27 @@
+package com.ruoyi.account.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.account.pojo.BorrowInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.framework.web.domain.AjaxResult;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鍊熸淇℃伅琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-01-15 02:57:29
+ */
+public interface BorrowInfoService extends IService<BorrowInfo> {
+
+    AjaxResult listPage(Page page, BorrowInfo borrowInfo);
+
+    AjaxResult add(BorrowInfo borrowInfo);
+
+    AjaxResult updateBorrowInfo(BorrowInfo borrowInfo);
+
+    AjaxResult delete(List<Long> ids);
+}
diff --git a/src/main/java/com/ruoyi/account/service/impl/BorrowInfoServiceImpl.java b/src/main/java/com/ruoyi/account/service/impl/BorrowInfoServiceImpl.java
new file mode 100644
index 0000000..ee69c6f
--- /dev/null
+++ b/src/main/java/com/ruoyi/account/service/impl/BorrowInfoServiceImpl.java
@@ -0,0 +1,132 @@
+package com.ruoyi.account.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.account.pojo.AccountExpense;
+import com.ruoyi.account.pojo.AccountIncome;
+import com.ruoyi.account.pojo.BorrowInfo;
+import com.ruoyi.account.mapper.BorrowInfoMapper;
+import com.ruoyi.account.service.AccountExpenseService;
+import com.ruoyi.account.service.AccountIncomeService;
+import com.ruoyi.account.service.BorrowInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.sales.service.ReceiptPaymentService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鍊熸淇℃伅琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-01-15 02:57:29
+ */
+@Service
+@Slf4j
+public class BorrowInfoServiceImpl extends ServiceImpl<BorrowInfoMapper, BorrowInfo> implements BorrowInfoService {
+
+    @Autowired
+    private BorrowInfoMapper borrowInfoMapper;
+
+    @Autowired
+    private AccountIncomeService accountIncomeService;
+
+    @Autowired
+    private AccountExpenseService accountExpenseService;
+
+    @Override
+    public AjaxResult listPage(Page page, BorrowInfo borrowInfo) {
+        LambdaQueryWrapper<BorrowInfo> borrowInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        if(borrowInfo != null){
+            if(StringUtils.isNotEmpty(borrowInfo.getEntryDateStart()) && StringUtils.isNotEmpty(borrowInfo.getEntryDateEnd())){
+                borrowInfoLambdaQueryWrapper.ge(BorrowInfo::getBorrowDate, borrowInfo.getEntryDateStart());
+                borrowInfoLambdaQueryWrapper.le(BorrowInfo::getBorrowDate, borrowInfo.getEntryDateEnd());
+            }
+            if(borrowInfo.getStatus() != null){
+                borrowInfoLambdaQueryWrapper.eq(BorrowInfo::getStatus, borrowInfo.getStatus());
+            }
+            if(StringUtils.isNotEmpty(borrowInfo.getBorrowerName())){
+                borrowInfoLambdaQueryWrapper.like(BorrowInfo::getBorrowerName, borrowInfo.getBorrowerName());
+            }
+        }
+        return AjaxResult.success(borrowInfoMapper.selectPage(page, borrowInfoLambdaQueryWrapper));
+    }
+
+    @Override
+    public AjaxResult add(BorrowInfo borrowInfo) {
+        int insert = borrowInfoMapper.insert(borrowInfo);
+        if(insert > 0){
+            // 娣诲姞鎴愬姛锛岃繘鍏ユ敹鍏ョ鐞�
+            AccountIncome accountIncome = new AccountIncome();
+            accountIncome.setBusinessId(borrowInfo.getId());
+            accountIncome.setBusinessType(2);
+            accountIncome.setIncomeDate(DateUtils.toDate(borrowInfo.getBorrowDate()));
+            accountIncome.setIncomeType("2");
+            accountIncome.setIncomeMoney(borrowInfo.getBorrowAmount());
+            accountIncome.setIncomeDescribed("鍊熸");
+            accountIncome.setIncomeMethod("3");
+            accountIncome.setInputTime(DateUtils.getNowDate());
+            accountIncome.setInputUser(borrowInfo.getBorrowerName());
+            accountIncomeService.save(accountIncome);
+            return AjaxResult.success("娣诲姞鎴愬姛");
+        }
+        return AjaxResult.success("娣诲姞澶辫触");
+    }
+
+    @Override
+    public AjaxResult updateBorrowInfo(BorrowInfo borrowInfo) {
+        int update = borrowInfoMapper.updateById(borrowInfo);
+        if(update > 0){
+            // 淇敼鎴愬姛锛屼慨鏀规敹鍏ョ鐞�
+            AccountIncome one = accountIncomeService.getOne(new LambdaQueryWrapper<AccountIncome>()
+                    .eq(AccountIncome::getBusinessId, borrowInfo.getId())
+                    .eq(AccountIncome::getBusinessType, 2)
+                    .last("limit 1"));
+            if(one != null){
+                one.setIncomeMoney(borrowInfo.getBorrowAmount());
+                accountIncomeService.updateById(one);
+            }
+            // 鏄惁涓鸿繕娆�
+            if(borrowInfo.getStatus() != null && borrowInfo.getStatus() == 2){
+                // 鏂板鏀嚭璁板綍
+                AccountExpense accountExpense = new AccountExpense();
+                accountExpense.setBusinessId(borrowInfo.getId());
+                accountExpense.setBusinessType(2);
+                accountExpense.setExpenseDate(DateUtils.toDate(borrowInfo.getRepayDate()));
+                accountExpense.setExpenseType("4");
+                accountExpense.setExpenseMoney(borrowInfo.getBorrowAmount());
+                accountExpense.setExpenseDescribed("杩樻");
+                accountExpense.setExpenseMethod("3");
+                accountExpense.setInputTime(DateUtils.getNowDate());
+                accountExpense.setInputUser(borrowInfo.getBorrowerName());
+                accountExpenseService.save(accountExpense);
+            }
+            return AjaxResult.success("淇敼鎴愬姛");
+        }
+        return  AjaxResult.success("淇敼澶辫触");
+    }
+
+    @Override
+    public AjaxResult delete(List<Long> ids) {
+        int delete = borrowInfoMapper.deleteBatchIds(ids);
+        if(delete > 0){
+            // 鍒犻櫎鎴愬姛锛屽垹闄ゆ敹鍏ョ鐞�
+            accountIncomeService.remove(new LambdaQueryWrapper<AccountIncome>()
+                    .in(AccountIncome::getBusinessId, ids)
+                    .eq(AccountIncome::getBusinessType, 2));
+            // 鍒犻櫎鏀嚭绠$悊
+            accountExpenseService.remove(new LambdaQueryWrapper<AccountExpense>()
+                    .in(AccountExpense::getBusinessId, ids)
+                    .eq(AccountExpense::getBusinessType, 2));
+            return AjaxResult.success("鍒犻櫎鎴愬姛");
+        }
+        return  AjaxResult.success("鍒犻櫎澶辫触");
+    }
+}
diff --git a/src/main/java/com/ruoyi/framework/security/service/SysLoginService.java b/src/main/java/com/ruoyi/framework/security/service/SysLoginService.java
index f379b7f..6a7874a 100644
--- a/src/main/java/com/ruoyi/framework/security/service/SysLoginService.java
+++ b/src/main/java/com/ruoyi/framework/security/service/SysLoginService.java
@@ -270,13 +270,13 @@
         LoginUser loginUser = (LoginUser) authentication.getPrincipal();
         recordLoginInfo(loginUser.getUserId());
         // 鏇存柊鐢ㄦ埛淇℃伅锛屼慨鏀瑰綋鍓嶉�変腑鍏徃
-        SysUser user = loginUser.getUser();
-        if(factoryId != null){
-            user.setTenantId(factoryId);
-        }else{
-            user.setTenantId(tokenService.getDeptIdsByUserId(user.getUserId())[0]);
-        }
-        sysUserMapper.updateUser(user);
+//        SysUser user = loginUser.getUser();
+//        if(factoryId != null){
+//            user.setTenantId(factoryId);
+//        }else{
+//            user.setTenantId(tokenService.getDeptIdsByUserId(user.getUserId())[0]);
+//        }
+//        sysUserMapper.updateUser(user);
         // 鐢熸垚token
         return tokenService.createToken(loginUser);
     }
diff --git a/src/main/java/com/ruoyi/purchase/controller/ProcurementBusinessSummaryController.java b/src/main/java/com/ruoyi/purchase/controller/ProcurementBusinessSummaryController.java
new file mode 100644
index 0000000..f58c331
--- /dev/null
+++ b/src/main/java/com/ruoyi/purchase/controller/ProcurementBusinessSummaryController.java
@@ -0,0 +1,32 @@
+package com.ruoyi.purchase.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto;
+import com.ruoyi.purchase.service.impl.ProcurementBusinessSummaryServiceImpl;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author :yys
+ * @date : 2026/1/15 13:29
+ */
+@Api(tags = "閲囪喘涓氬姟姹囨��")
+@RestController
+@RequestMapping("/procurementBusinessSummary")
+public class ProcurementBusinessSummaryController extends BaseController {
+
+
+    @Autowired
+    private ProcurementBusinessSummaryServiceImpl procurementBusinessSummaryService;
+
+    @GetMapping("/listPage")
+    public AjaxResult listPage(Page page, ProcurementBusinessSummaryDto procurementBusinessSummaryDto) {
+        return procurementBusinessSummaryService.listPage(page, procurementBusinessSummaryDto);
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/purchase/dto/ProcurementBusinessSummaryDto.java b/src/main/java/com/ruoyi/purchase/dto/ProcurementBusinessSummaryDto.java
new file mode 100644
index 0000000..310ca78
--- /dev/null
+++ b/src/main/java/com/ruoyi/purchase/dto/ProcurementBusinessSummaryDto.java
@@ -0,0 +1,76 @@
+package com.ruoyi.purchase.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.basic.dto.ProductDto;
+import com.ruoyi.basic.dto.ProductModelDto;
+import com.ruoyi.basic.pojo.Product;
+import com.ruoyi.basic.pojo.ProductModel;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import com.ruoyi.purchase.pojo.PurchaseLedger;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author :yys
+ * @date : 2026/1/15 13:34
+ */
+@Data
+@ApiModel
+public class ProcurementBusinessSummaryDto {
+
+    private String productCategory;
+
+    /**
+     * 瑙勬牸鍨嬪彿
+     */
+    private String specificationModel;
+
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date entryDateStart;
+
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date entryDateEnd;
+
+    /**
+     * 閲囪喘鏁伴噺
+     */
+    private BigDecimal purchaseNum;
+
+    /**
+     * 閲囪喘閲戦
+     */
+    private BigDecimal purchaseAmount;
+
+    /**
+     * 閲囪喘娆℃暟
+     */
+    private Integer purchaseTimes;
+
+    /**
+     * 骞冲潎鍗曚环
+     */
+    private BigDecimal averagePrice;
+
+
+    /**
+     * 渚涘簲鍟嗗悕绉�
+     */
+    private String supplierName;
+
+    /**
+     * 褰曞叆鏃ユ湡
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date entryDate;
+
+}
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java
index d6504cd..ec3be20 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java
@@ -6,6 +6,9 @@
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.account.mapper.AccountExpenseMapper;
+import com.ruoyi.account.pojo.AccountExpense;
+import com.ruoyi.account.service.AccountExpenseService;
 import com.ruoyi.basic.mapper.SupplierManageMapper;
 import com.ruoyi.basic.pojo.SupplierManage;
 import com.ruoyi.common.utils.DateUtils;
@@ -60,6 +63,8 @@
 
     private ProductRecordMapper productRecordMapper;
 
+    private AccountExpenseService accountExpenseService;
+
     /**
      * 鏌ヨ浠樻鐧昏
      *
@@ -98,7 +103,7 @@
      */
     @Override
     public int insertPaymentRegistration(List<PaymentRegistration> paymentRegistrationList) {
-        Long userId = SecurityUtils.getLoginUser().getUser().getUserId();
+        LoginUser userId = SecurityUtils.getLoginUser();
         for (PaymentRegistration paymentRegistration : paymentRegistrationList) {
             PaymentRegistration byId = paymentRegistration;
             if (!ObjectUtils.isEmpty(paymentRegistration.getId())){
@@ -114,11 +119,24 @@
             }
             paymentRegistration.setCreateTime(DateUtils.getNowDate());
             paymentRegistration.setUpdateTime(DateUtils.getNowDate());
-            paymentRegistration.setRegistrantId(userId);
+            paymentRegistration.setRegistrantId(userId.getUserId());
             salesLedgerProduct.setTicketsTotal(salesLedgerProduct.getTicketsTotal().add(paymentRegistration.getCurrentPaymentAmount()));
             salesLedgerProduct.setPendingTicketsTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getTicketsTotal()));
             paymentRegistrationMapper.insert(paymentRegistration);
             salesLedgerProductMapper.updateById(salesLedgerProduct);
+            // 2. 澶勭悊璐︽埛鏀跺叆
+            AccountExpense accountExpense = new AccountExpense();
+            accountExpense.setExpenseDate(purchaseLedger.getEntryDate());
+            accountExpense.setExpenseType("0");
+            accountExpense.setSupplierName(purchaseLedger.getSupplierName());
+            accountExpense.setExpenseMoney(paymentRegistration.getCurrentPaymentAmount());
+            accountExpense.setExpenseDescribed("浠樻鏀嚭");
+            accountExpense.setExpenseMethod("0");
+            accountExpense.setBusinessId(paymentRegistration.getId());
+            accountExpense.setBusinessType(1);
+            accountExpense.setInputTime(new Date());
+            accountExpense.setInputUser(userId.getNickName());
+            accountExpenseService.save(accountExpense);
         }
         return 1;
 
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/ProcurementBusinessSummaryServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/ProcurementBusinessSummaryServiceImpl.java
new file mode 100644
index 0000000..96945f3
--- /dev/null
+++ b/src/main/java/com/ruoyi/purchase/service/impl/ProcurementBusinessSummaryServiceImpl.java
@@ -0,0 +1,26 @@
+package com.ruoyi.purchase.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author :yys
+ * @date : 2026/1/15 13:30
+ */
+@Service
+@Slf4j
+public class ProcurementBusinessSummaryServiceImpl {
+
+    @Autowired
+    private SalesLedgerProductMapper salesLedgerProductMapper;
+
+    public AjaxResult listPage(Page page, ProcurementBusinessSummaryDto procurementBusinessSummaryDto) {
+        return AjaxResult.success(salesLedgerProductMapper.procurementBusinessSummaryListPage(page, procurementBusinessSummaryDto));
+    }
+}
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index 22b2501..55ea7ae 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -191,41 +191,11 @@
         purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId());
         purchaseLedger.setRecorderName(sysUser.getNickName());
         purchaseLedger.setPhoneNumber(sysUser.getPhonenumber());
-        // 2. 澶勭悊璐︽埛鏀跺叆
-        AccountExpense accountExpense = new AccountExpense();
-        accountExpense.setExpenseDate(purchaseLedger.getEntryDate());
-        accountExpense.setExpenseType("0");
-        accountExpense.setSupplierName(purchaseLedger.getSupplierName());
-        accountExpense.setExpenseMoney(purchaseLedger.getContractAmount());
-        accountExpense.setExpenseDescribed("閲囪喘鍚堝悓锛�" + purchaseLedger.getPurchaseContractNumber());
-        accountExpense.setExpenseMethod("0");
-        accountExpense.setInvoiceNumber(purchaseLedger.getPurchaseContractNumber());
-        accountExpense.setInputTime(new Date());
-        accountExpense.setInputUser(loginUser.getNickName());
-
-
         // 3. 鏂板鎴栨洿鏂颁富琛�
         if (purchaseLedger.getId() == null) {
             purchaseLedgerMapper.insert(purchaseLedger);
-//            accountIncomeService.save(accountIncome);
-            accountExpenseService.save(accountExpense);
         } else {
             purchaseLedgerMapper.updateById(purchaseLedger);
-            PurchaseLedger purchaseLedgerDB = purchaseLedgerMapper.selectById(purchaseLedger.getId());
-            List<AccountExpense> accountExpenseDBs = accountExpenseService.getByInvoiceNumberList(purchaseLedger.getPurchaseContractNumber());
-            if (!CollectionUtils.isEmpty(accountExpenseDBs)) {
-                accountExpenseDBs.forEach(accountExpenseDB ->{
-                    accountExpenseDB.setExpenseDate(purchaseLedgerDB.getEntryDate());
-                    accountExpenseDB.setExpenseType("0");
-                    accountExpenseDB.setSupplierName(purchaseLedgerDB.getSupplierName());
-                    accountExpenseDB.setExpenseMoney(purchaseLedgerDB.getContractAmount());
-                    accountExpenseDB.setExpenseDescribed("閲囪喘鍚堝悓锛�" + purchaseLedgerDB.getPurchaseContractNumber());
-                    accountExpenseDB.setExpenseMethod("0");
-                    accountExpenseDB.setInvoiceNumber(purchaseLedgerDB.getPurchaseContractNumber());
-                    accountExpenseService.updateById(accountExpenseDB);
-                });
-            }
-
         }
 
         // 4. 澶勭悊瀛愯〃鏁版嵁
diff --git a/src/main/java/com/ruoyi/sales/controller/MetricStatisticsController.java b/src/main/java/com/ruoyi/sales/controller/MetricStatisticsController.java
new file mode 100644
index 0000000..3c610a1
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/controller/MetricStatisticsController.java
@@ -0,0 +1,38 @@
+package com.ruoyi.sales.controller;
+
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.sales.dto.StatisticsTableDto;
+import com.ruoyi.sales.service.impl.MetricStatisticsServiceImpl;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author :yys
+ * @date : 2026/1/15 9:39
+ */
+@Api(tags = "鎸囨爣缁熻")
+@RestController
+@RequestMapping("/metricStatistics")
+public class MetricStatisticsController extends BaseController {
+
+    @Autowired
+    private MetricStatisticsServiceImpl metricStatisticsService;
+
+    @ApiOperation("澶撮儴鎬昏")
+    @GetMapping("/total")
+    public AjaxResult total() {
+        return metricStatisticsService.total();
+    }
+
+    @ApiOperation("缁熻琛�")
+    @GetMapping("/statisticsTable")
+    public AjaxResult statisticsTable(StatisticsTableDto statisticsTableDto) {
+        return metricStatisticsService.statisticsTable(statisticsTableDto);
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesTrendDto.java b/src/main/java/com/ruoyi/sales/dto/SalesTrendDto.java
new file mode 100644
index 0000000..36a8290
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/dto/SalesTrendDto.java
@@ -0,0 +1,19 @@
+package com.ruoyi.sales.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author :yys
+ * @date : 2026/1/15 10:34
+ */
+@Data
+public class SalesTrendDto {
+
+    private String month; // 鏈堜唤锛堝2024-12锛�
+    private Integer orderCount; // 璁㈠崟鏁�
+    private BigDecimal salesAmount; // 閿�鍞
+    private BigDecimal shipRate;
+
+}
diff --git a/src/main/java/com/ruoyi/sales/dto/StatisticsTableDto.java b/src/main/java/com/ruoyi/sales/dto/StatisticsTableDto.java
new file mode 100644
index 0000000..702bc00
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/dto/StatisticsTableDto.java
@@ -0,0 +1,31 @@
+package com.ruoyi.sales.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.dto.DateQueryDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author :yys
+ * @date : 2026/1/15 10:18
+ */
+@Data
+@ApiModel
+public class StatisticsTableDto{
+
+    private String customerName;
+
+    private String productCategory;
+
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date entryDateStart;
+
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date entryDateEnd;
+
+}
diff --git a/src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java
index a0a0b1f..6e4aee6 100644
--- a/src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java
+++ b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java
@@ -6,8 +6,11 @@
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.sales.dto.SalesLedgerDto;
+import com.ruoyi.sales.dto.SalesTrendDto;
+import com.ruoyi.sales.dto.StatisticsTableDto;
 import com.ruoyi.sales.pojo.SalesLedger;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -45,4 +48,33 @@
      * @return
      */
     IPage<SalesLedger> selectSalesLedgerListPage(Page page, @Param("salesLedgerDto") SalesLedgerDto salesLedgerDto);
+
+    /**
+     * 鎸夋湀浠界粺璁¤鍗曟暟銆侀攢鍞锛堟敮鎸佷骇鍝佸ぇ绫汇�佸鎴峰悕绉扮瓫閫夛級
+     * @param statisticsTableDto 缁熻鏌ヨ鍙傛暟DTO
+     * @return 閿�鍞秼鍔跨粺璁$粨鏋�
+     */
+    @Select("<script>" +
+            "SELECT " +
+            "DATE_FORMAT(sl.entry_date, '%Y-%m') AS month, " +
+            "COUNT(DISTINCT sl.id) AS order_count, " +  // 鎬昏鍗曟暟
+            "SUM(slp.tax_inclusive_total_price) AS sales_amount, " +  // 閿�鍞
+            // 鍙戣揣鐜� = 鍙戣揣璁㈠崟鏁� * 100 / 鎬昏鍗曟暟锛堜繚鐣�2浣嶅皬鏁帮紝閬垮厤闄�0鎶ラ敊锛�
+            "ROUND(IF(COUNT(DISTINCT sl.id) = 0, 0, " +
+            "SUM(CASE WHEN slp.approve_status = 2 THEN 1 ELSE 0 END) / COUNT(DISTINCT sl.id) * 100), 2) AS ship_rate " +
+            "FROM sales_ledger sl " +
+            "LEFT JOIN sales_ledger_product slp ON sl.id = slp.sales_ledger_id " +
+            "WHERE sl.entry_date BETWEEN #{statisticsTableDto.entryDateStart} AND #{statisticsTableDto.entryDateEnd} " +
+            // 浜у搧澶х被绛涢��
+            "<if test='statisticsTableDto.productCategory != null and statisticsTableDto.productCategory != \"\"'>" +
+            "AND slp.product_category = #{statisticsTableDto.productCategory} " +
+            "</if>" +
+            // 瀹㈡埛鍚嶇О绛涢��
+            "<if test='statisticsTableDto.customerName != null and statisticsTableDto.customerName != \"\"'>" +
+            "AND sl.customer_name = #{statisticsTableDto.customerName} " +
+            "</if>" +
+            "GROUP BY DATE_FORMAT(sl.entry_date, '%Y-%m') " +
+            "ORDER BY month" +
+            "</script>")
+    List<SalesTrendDto> statisticsTable(@Param("statisticsTableDto")StatisticsTableDto statisticsTableDto);
 }
diff --git a/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
index 8777851..e765f71 100644
--- a/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
+++ b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.config.MyBaseMapper;
+import com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto;
 import com.ruoyi.sales.dto.SalesLedgerProductDto;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import org.apache.ibatis.annotations.Param;
@@ -23,4 +24,6 @@
     IPage<SalesLedgerProductDto> listPage(Page page, @Param("req") SalesLedgerProductDto salesLedgerProduct);
 
     IPage<SalesLedgerProductDto> listPagePurchaseLedger(Page page,@Param("req") SalesLedgerProductDto salesLedgerProduct);
+
+    IPage<ProcurementBusinessSummaryDto> procurementBusinessSummaryListPage(Page page,@Param("req") ProcurementBusinessSummaryDto procurementBusinessSummaryDto);
 }
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index 409a048..c528b55 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -207,7 +207,7 @@
      * 鍙戣揣瀹℃壒鐘舵��
      */
 //    @TableField(exist = false)
-    @ApiModelProperty(value = "瀹℃壒鐘舵�侊細0鏈敓浜�,1宸茬敓浜�,2寰呭鏍�(瀹℃牳涓�),3瀹℃牳瀹屾垚,4瀹℃牳澶辫触")
+    @ApiModelProperty(value = "瀹℃壒鐘舵�侊細0鏈敓浜�,1宸茬敓浜�,2宸插彂璐�")
     private Integer approveStatus;
 
     @ApiModelProperty(value = "寰呭洖娆炬�婚噾棰�")
diff --git a/src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java
new file mode 100644
index 0000000..efa3909
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java
@@ -0,0 +1,73 @@
+package com.ruoyi.sales.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.sales.dto.SalesTrendDto;
+import com.ruoyi.sales.dto.StatisticsTableDto;
+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 lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author :yys
+ * @date : 2026/1/15 9:41
+ */
+@Service
+@Slf4j
+public class MetricStatisticsServiceImpl {
+
+    @Autowired
+    private SalesLedgerMapper salesLedgerMapper;
+
+    @Autowired
+    private SalesLedgerProductMapper salesLedgerProductMapper;
+
+    public AjaxResult total() {
+        List<SalesLedger> salesLedgers = salesLedgerMapper.selectList(null);
+        if(CollectionUtils.isEmpty(salesLedgers)) return AjaxResult.success(salesLedgers);
+        Map<String, Object> map = new HashMap<>();
+        // 閿�鍞
+        map.put("contractAmountTotal", salesLedgers.stream().map(SalesLedger::getContractAmount).reduce(BigDecimal.ZERO, BigDecimal::add));
+        // 璁㈠崟鏁伴噺
+        map.put("total", new BigDecimal(salesLedgers.size()));
+        // 鍙戣揣鐜�
+        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
+                .eq(SalesLedgerProduct::getType, 1));
+        map.put("shipRate", "0%");
+        if(CollectionUtils.isEmpty(salesLedgerProducts)) return AjaxResult.success(map);
+        // 鍙戣揣鏁伴噺
+        long count = salesLedgerProducts.stream()
+                .filter(salesLedgerProduct -> salesLedgerProduct.getApproveStatus().equals(2))
+                .count();
+        map.put("shipRate", String.format("%.2f", count * 100.0 / salesLedgerProducts.size()) + "%");
+        return AjaxResult.success(map);
+    }
+
+    public AjaxResult statisticsTable(StatisticsTableDto statisticsTableDto) {
+        Map<String, Object> map = new HashMap<>();
+        if (statisticsTableDto.getEntryDateStart() == null || statisticsTableDto.getEntryDateEnd() == null) {
+            Calendar calendar = Calendar.getInstance();
+            // 缁撴潫鏃堕棿榛樿鏄綋鍓嶆椂闂�
+            statisticsTableDto.setEntryDateEnd(new Date());
+            // 寮�濮嬫椂闂撮粯璁ゆ槸6涓湀鍓�
+            calendar.add(Calendar.MONTH, -6);
+            statisticsTableDto.setEntryDateStart(calendar.getTime());
+        }
+        List<SalesTrendDto> salesTrendDtos = salesLedgerMapper.statisticsTable(statisticsTableDto);
+        if(CollectionUtils.isEmpty(salesTrendDtos)) return AjaxResult.success(map);
+        map.put("dateList", salesTrendDtos.stream().map(SalesTrendDto::getMonth).collect(Collectors.toList()));
+        map.put("orderCountList", salesTrendDtos.stream().map(SalesTrendDto::getOrderCount).collect(Collectors.toList()));
+        map.put("salesAmountList", salesTrendDtos.stream().map(SalesTrendDto::getSalesAmount).collect(Collectors.toList()));
+        map.put("shippingRateList", salesTrendDtos.stream().map(SalesTrendDto::getShipRate).collect(Collectors.toList()));
+        return AjaxResult.success(map);
+    }
+}
diff --git a/src/main/resources/mapper/account/BorrowInfoMapper.xml b/src/main/resources/mapper/account/BorrowInfoMapper.xml
new file mode 100644
index 0000000..f21c8d7
--- /dev/null
+++ b/src/main/resources/mapper/account/BorrowInfoMapper.xml
@@ -0,0 +1,22 @@
+<?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.account.mapper.BorrowInfoMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.account.pojo.BorrowInfo">
+        <id column="id" property="id" />
+        <result column="borrower_name" property="borrowerName" />
+        <result column="borrow_amount" property="borrowAmount" />
+        <result column="interest_rate" property="interestRate" />
+        <result column="borrow_date" property="borrowDate" />
+        <result column="repay_date" property="repayDate" />
+        <result column="status" property="status" />
+        <result column="remark" property="remark" />
+        <result column="create_time" property="createTime" />
+        <result column="create_user" property="createUser" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_user" property="updateUser" />
+        <result column="tenant_id" property="tenantId" />
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
index b2a18d8..2579a18 100644
--- a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -96,4 +96,34 @@
         </where>
         order by slp.register_date desc
     </select>
+    <select id="procurementBusinessSummaryListPage"
+            resultType="com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto">
+        SELECT
+        slp.product_category AS productCategory,
+        slp.specification_model AS specificationModel,
+        sl.supplier_name AS supplierName,
+        SUM(slp.quantity) AS purchaseNum,
+        SUM(slp.tax_inclusive_total_price) AS purchaseAmount,
+        COUNT(DISTINCT slp.sales_ledger_id) AS purchaseTimes,
+        <!-- 骞冲潎鍗曚环 = 鎬婚噰璐噾棰�/鎬婚噰璐暟閲忥紝淇濈暀2浣嶅皬鏁帮紝閬垮厤闄�0 -->
+        ROUND(IF(SUM(slp.quantity) = 0, 0, SUM(slp.tax_inclusive_total_price) / SUM(slp.quantity)), 2) AS averagePrice,
+        <!-- 璇ヤ骇鍝佸ぇ绫讳笅鏈�鍚庝竴涓綍鍏ユ棩鏈燂紙鍙栧彴璐︿富琛ㄧ殑entry_date锛� -->
+        MAX(sl.entry_date) AS entryDate
+        FROM sales_ledger_product slp
+        <!-- 鍏宠仈鍙拌处涓昏〃锛氳幏鍙栧綍鍏ユ棩鏈焑ntry_date -->
+        LEFT JOIN purchase_ledger sl ON slp.sales_ledger_id = sl.id
+        WHERE slp.type = 2 <!-- 鍥哄畾绛涢�夛細閲囪喘鍙拌处锛坱ype=2锛� -->
+        <!-- 閲囪喘鏃ユ湡绛涢�夛細鍙�夋潯浠� -->
+        <if test="req.entryDateStart != null and req.entryDateEnd != null">
+            AND sl.entry_date BETWEEN #{req.entryDateStart} AND #{req.entryDateEnd} <!-- 鏃堕棿鑼冨洿锛氶潪绌烘湁鏁� -->
+        </if>
+        <!-- 浜у搧澶х被绛涢�夛細鍙�夋潯浠� -->
+        <if test="req.productCategory != null and req.productCategory != ''">
+            AND slp.product_category = #{req.productCategory}
+        </if>
+        <!-- 鎸変骇鍝佸ぇ绫诲垎缁勮仛鍚� -->
+        GROUP BY slp.product_category
+        <!-- 鎸変骇鍝佸ぇ绫绘帓搴� -->
+        ORDER BY slp.product_category
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/system/SysUserMapper.xml b/src/main/resources/mapper/system/SysUserMapper.xml
index 8f66fd3..d0a03fb 100644
--- a/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/src/main/resources/mapper/system/SysUserMapper.xml
@@ -190,7 +190,6 @@
 	<insert id="insertUser" parameterType="com.ruoyi.project.system.domain.SysUser" useGeneratedKeys="true" keyProperty="userId">
  		insert into sys_user(
  			<if test="userId != null and userId != 0">user_id,</if>
- 			<if test="deptId != null and deptId != 0">dept_id,</if>
  			<if test="userName != null and userName != ''">user_name,</if>
  			<if test="nickName != null and nickName != ''">nick_name,</if>
  			<if test="email != null and email != ''">email,</if>
@@ -205,7 +204,6 @@
  			create_time
  		)values(
  			<if test="userId != null and userId != ''">#{userId},</if>
- 			<if test="deptId != null and deptId != ''">#{deptId},</if>
  			<if test="userName != null and userName != ''">#{userName},</if>
  			<if test="nickName != null and nickName != ''">#{nickName},</if>
  			<if test="email != null and email != ''">#{email},</if>

--
Gitblit v1.9.3