From 0ef7a6b7f63a1f7b866bccef4eabf64041d5bbad Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期三, 23 七月 2025 09:29:47 +0800
Subject: [PATCH] yys  新增生产模块

---
 src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java           |  170 +++++
 src/main/java/com/ruoyi/production/pojo/SalesLedgerProductionAccounting.java                    |  109 +++
 src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml                  |   53 +
 src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingDto.java                            |  119 +++
 pom.xml                                                                                         |    6 
 src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java                                |   52 +
 src/main/java/com/ruoyi/production/service/impl/SalesLedgerProductionAccountingServiceImpl.java |   30 
 src/main/java/com/ruoyi/production/controller/SalesLedgerSchedulingController.java              |   93 +++
 src/main/resources/mapper/production/SalesLedgerSchedulingMapper.xml                            |  113 +++
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java                          |   16 
 src/main/java/com/ruoyi/production/controller/SalesLedgerProductionAccountingController.java    |   39 +
 src/main/resources/application-dev.yml                                                          |    2 
 src/main/java/com/ruoyi/production/dto/ProductionDispatchAddDto.java                            |   41 +
 src/main/java/com/ruoyi/production/dto/SalesLedgerProductDto.java                               |   72 ++
 src/main/java/com/ruoyi/production/service/impl/SalesLedgerWorkServiceImpl.java                 |  129 ++++
 src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java                    |   32 +
 src/main/resources/mapper/production/SalesLedgerWorkMapper.xml                                  |   53 +
 src/main/java/com/ruoyi/production/pojo/SalesLedgerScheduling.java                              |   95 +++
 src/main/java/com/ruoyi/production/dto/SalesLedgerProductionAccountingDto.java                  |   64 ++
 src/main/java/com/ruoyi/production/dto/ProductionReportDto.java                                 |   41 +
 src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java                     |  132 ++++
 src/main/java/com/ruoyi/production/service/SalesLedgerProductionAccountingService.java          |   19 
 src/main/java/com/ruoyi/production/service/SalesLedgerWorkService.java                          |   26 
 src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java                    |   71 ++
 src/main/java/com/ruoyi/production/pojo/SalesLedgerWork.java                                    |  110 +++
 src/main/java/com/ruoyi/production/mapper/SalesLedgerProductionAccountingMapper.java            |   20 
 src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java                                  |   73 ++
 src/main/java/com/ruoyi/production/mapper/SalesLedgerSchedulingMapper.java                      |   40 +
 src/main/java/com/ruoyi/production/mapper/SalesLedgerWorkMapper.java                            |   24 
 src/main/resources/application.yml                                                              |    2 
 30 files changed, 1,842 insertions(+), 4 deletions(-)

diff --git a/pom.xml b/pom.xml
index 51d1a67..5518a5e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -46,6 +46,12 @@
     </properties>
 
     <dependencies>
+        <!-- ruoyi-springboot2 / swagger knife4j 閰嶇疆 -->
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-spring-boot-starter</artifactId>
+            <version>3.0.3</version>
+        </dependency>
 
         <!-- SpringBoot 鏍稿績鍖� -->
         <dependency>
diff --git a/src/main/java/com/ruoyi/production/controller/SalesLedgerProductionAccountingController.java b/src/main/java/com/ruoyi/production/controller/SalesLedgerProductionAccountingController.java
new file mode 100644
index 0000000..ed7ac26
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/controller/SalesLedgerProductionAccountingController.java
@@ -0,0 +1,39 @@
+package com.ruoyi.production.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.production.dto.SalesLedgerProductionAccountingDto;
+import com.ruoyi.production.pojo.SalesLedgerProductionAccounting;
+import com.ruoyi.production.service.impl.SalesLedgerProductionAccountingServiceImpl;
+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 : 2025/7/21 14:43
+ */
+@RestController
+@Api(tags = "鐢熶骇鏍哥畻")
+@RequestMapping("/salesLedger/productionAccounting")
+public class SalesLedgerProductionAccountingController extends BaseController {
+
+    @Autowired
+    private SalesLedgerProductionAccountingServiceImpl salesLedgerProductionAccountingService;
+
+    @GetMapping("/listPage")
+    @ApiOperation("鐢熶骇鏍哥畻-鍒嗛〉鏌ヨ")
+    @Log(title = "鐢熶骇鏍哥畻-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
+    public AjaxResult listPage(Page page, SalesLedgerProductionAccountingDto salesLedgerProductionAccountingDto) {
+        IPage<SalesLedgerProductionAccountingDto> list = salesLedgerProductionAccountingService.listPage(page, salesLedgerProductionAccountingDto);
+        return AjaxResult.success(list);
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/production/controller/SalesLedgerSchedulingController.java b/src/main/java/com/ruoyi/production/controller/SalesLedgerSchedulingController.java
new file mode 100644
index 0000000..22b96b4
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/controller/SalesLedgerSchedulingController.java
@@ -0,0 +1,93 @@
+package com.ruoyi.production.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.procurementrecord.dto.ProcurementDto;
+import com.ruoyi.production.dto.ProcessSchedulingDto;
+import com.ruoyi.production.dto.ProductionDispatchAddDto;
+import com.ruoyi.production.dto.SalesLedgerSchedulingDto;
+import com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto;
+import com.ruoyi.production.service.impl.SalesLedgerSchedulingServiceImpl;
+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;
+
+/**
+ * @author :yys
+ * @date : 2025/7/21 14:43
+ */
+@RestController
+@Api(tags = "鐢熶骇璁㈠崟")
+@RequestMapping("/salesLedger/scheduling")
+public class SalesLedgerSchedulingController extends BaseController {
+
+    @Autowired
+    private SalesLedgerSchedulingServiceImpl salesLedgerSchedulingService;
+
+
+    @GetMapping("/listPage")
+    @Log(title = "鐢熶骇绠$悊-鐢熶骇璁㈠崟-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
+    @ApiOperation("鐢熶骇绠$悊-鐢熶骇璁㈠崟-鍒嗛〉鏌ヨ")
+    public AjaxResult listPage(Page page, SalesLedgerSchedulingDto salesLedgerSchedulingDto) {
+        IPage<SalesLedgerSchedulingDto> result = salesLedgerSchedulingService.listPage(page,salesLedgerSchedulingDto);
+        return AjaxResult.success(result);
+    }
+
+    /**
+     * 瀵煎嚭
+     * @param response
+     */
+    @PostMapping("/export")
+    @ApiOperation("鐢熶骇绠$悊-鐢熶骇璁㈠崟-瀵煎嚭")
+    public void export(HttpServletResponse response) {
+        salesLedgerSchedulingService.export(response);
+    }
+
+    @PostMapping("/productionDispatch")
+    @Log(title = "鐢熶骇绠$悊-鐢熶骇璁㈠崟-鐢熶骇娲惧伐", businessType = BusinessType.INSERT)
+    @ApiOperation("鐢熶骇绠$悊-鐢熶骇璁㈠崟-鐢熶骇娲惧伐")
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult productionDispatch(@RequestBody ProductionDispatchAddDto productionDispatchAddDto) {
+        int result = salesLedgerSchedulingService.productionDispatch(productionDispatchAddDto);
+        return AjaxResult.success(result);
+    }
+
+    @GetMapping("/listPageProcess")
+    @Log(title = "鐢熶骇绠$悊-宸ュ簭鎺掍骇-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
+    @ApiOperation("鐢熶骇绠$悊-宸ュ簭鎺掍骇-鍒嗛〉鏌ヨ")
+    public AjaxResult listPageProcess(Page page, SalesLedgerSchedulingProcessDto salesLedgerSchedulingDto) {
+        IPage<SalesLedgerSchedulingProcessDto> result = salesLedgerSchedulingService.listPageProcess(page,salesLedgerSchedulingDto);
+        return AjaxResult.success(result);
+    }
+
+
+    @DeleteMapping("/productionDispatchDelete")
+    @Log(title = "鐢熶骇绠$悊-宸ュ簭鎺掍骇-鍙栨秷鎺掍骇", businessType = BusinessType.DELETE)
+    @ApiOperation("鐢熶骇绠$悊-宸ュ簭鎺掍骇-鍙栨秷鎺掍骇")
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult productionDispatchDelete(@RequestBody List<Long> ids) {
+        int result = salesLedgerSchedulingService.productionDispatchDelete(ids);
+        return AjaxResult.success(result);
+    }
+
+
+    @PostMapping("/processScheduling")
+    @Log(title = "鐢熶骇绠$悊-宸ュ簭鎺掍骇", businessType = BusinessType.INSERT)
+    @ApiOperation("鐢熶骇绠$悊-宸ュ簭鎺掍骇")
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult processScheduling(@RequestBody List<ProcessSchedulingDto> processSchedulingDto) {
+        int result = salesLedgerSchedulingService.processScheduling(processSchedulingDto);
+        return AjaxResult.success(result);
+    }
+
+
+}
diff --git a/src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java b/src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java
new file mode 100644
index 0000000..866970e
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java
@@ -0,0 +1,71 @@
+package com.ruoyi.production.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.production.dto.ProcessSchedulingDto;
+import com.ruoyi.production.dto.ProductionReportDto;
+import com.ruoyi.production.dto.SalesLedgerWorkDto;
+import com.ruoyi.production.pojo.SalesLedgerWork;
+import com.ruoyi.production.service.SalesLedgerWorkService;
+import com.ruoyi.production.service.impl.SalesLedgerWorkServiceImpl;
+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 java.util.List;
+
+/**
+ * @author :yys
+ * @date : 2025/7/21 14:43
+ */
+@RestController
+@Api(tags = "鐢熶骇鎶ュ伐(鎺掍骇璁板綍)")
+@RequestMapping("/salesLedger/work")
+public class SalesLedgerWorkController extends BaseController {
+
+
+    @Autowired
+    private SalesLedgerWorkServiceImpl salesLedgerWorkService;
+
+    @GetMapping("/listPage")
+    @Log(title = "鐢熶骇鎶ュ伐-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
+    @ApiOperation("鐢熶骇鎶ュ伐-鍒嗛〉鏌ヨ")
+    public AjaxResult listPage(Page page, SalesLedgerWorkDto salesLedgerWorkDto) {
+        IPage<SalesLedgerWorkDto> listPage = salesLedgerWorkService.listPage(page, salesLedgerWorkDto);
+        return AjaxResult.success(listPage);
+    }
+
+    @GetMapping("/list")
+    @Log(title = "鐢熶骇鎶ュ伐-鏌ヨ", businessType = BusinessType.OTHER)
+    @ApiOperation("鐢熶骇鎶ュ伐-鏌ヨ")
+    public AjaxResult list(@RequestParam("id") Long id) {
+        List<ProductionReportDto> list = salesLedgerWorkService.getList(id);
+        return AjaxResult.success(list);
+    }
+
+    @PostMapping("/productionReport")
+    @Log(title = "鐢熶骇绠$悊-鐢熶骇鎶ュ伐", businessType = BusinessType.INSERT)
+    @ApiOperation("鐢熶骇绠$悊-鐢熶骇鎶ュ伐")
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult productionReport(@RequestBody ProductionReportDto productionReportDto) {
+        int result = salesLedgerWorkService.productionReport(productionReportDto);
+        return AjaxResult.success(result);
+    }
+
+
+    @PostMapping("/productionReportUpdate")
+    @Log(title = "鐢熶骇绠$悊-鐢熶骇鎶ュ伐-淇敼", businessType = BusinessType.UPDATE)
+    @ApiOperation("鐢熶骇绠$悊-鐢熶骇鎶ュ伐-淇敼")
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult productionReportUpdate(@RequestBody ProductionReportDto productionReportDto) {
+        int result = salesLedgerWorkService.productionReportUpdate(productionReportDto);
+        return AjaxResult.success(result);
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java b/src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java
new file mode 100644
index 0000000..6cf971e
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java
@@ -0,0 +1,52 @@
+package com.ruoyi.production.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @author :yys
+ * @date : 2025/7/22 9:19
+ */
+@Data
+@ApiModel
+public class ProcessSchedulingDto {
+
+    private Long id;
+
+    /**
+     * 鎺掍骇浜篿d
+     */
+    @ApiModelProperty(value = "鎺掍骇浜篿d")
+    private Long schedulingUserId;
+
+
+    /**
+     * 鎺掍骇鏁伴噺
+     */
+    @ApiModelProperty(value = "鎺掍骇鏁伴噺")
+    private BigDecimal schedulingNum;
+
+
+    /**
+     * 宸ユ椂瀹氶
+     */
+    @ApiModelProperty(value = "宸ユ椂瀹氶")
+    private BigDecimal workHours;
+
+    /**
+     * 宸ュ簭
+     */
+    @ApiModelProperty(value = "宸ュ簭")
+    private String process;
+    /**
+     * 鎺掍骇鏃ユ湡
+     */
+    @ApiModelProperty(value = "鎺掍骇鏃ユ湡")
+    private String schedulingDate;
+
+
+}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionDispatchAddDto.java b/src/main/java/com/ruoyi/production/dto/ProductionDispatchAddDto.java
new file mode 100644
index 0000000..e78d868
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/ProductionDispatchAddDto.java
@@ -0,0 +1,41 @@
+package com.ruoyi.production.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author :yys
+ * @date : 2025/7/21 16:28
+ */
+@Data
+@ApiModel
+public class ProductionDispatchAddDto {
+
+    @ApiModelProperty(value = "閿�鍞彴璐D")
+    private Long salesLedgerId;
+
+    @ApiModelProperty(value = "閿�鍞骇鍝両D")
+    private Long salesLedgerProductId;
+
+    /**
+     * 鎺掍骇鏁伴噺
+     */
+    @ApiModelProperty(value = "鎺掍骇鏁伴噺")
+    private BigDecimal schedulingNum;
+
+    /**
+     * 鎺掍骇浜�
+     */
+    @ApiModelProperty(value = "鎺掍骇浜�")
+    private Long schedulingUserId;
+
+    /**
+     * 鎺掍骇鏃ユ湡
+     */
+    @ApiModelProperty(value = "鎺掍骇鏃ユ湡")
+    private String schedulingDate;
+
+}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionReportDto.java b/src/main/java/com/ruoyi/production/dto/ProductionReportDto.java
new file mode 100644
index 0000000..6b5e164
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/ProductionReportDto.java
@@ -0,0 +1,41 @@
+package com.ruoyi.production.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author :yys
+ * @date : 2025/7/22 10:24
+ */
+@Data
+@ApiModel
+public class ProductionReportDto {
+
+    private Long id;
+    /**
+     * 鎺掍骇浜篿d
+     */
+    @ApiModelProperty(value = "鐢熶骇浜篿d")
+    private Long schedulingUserId;
+
+    /**
+     * 鎺掍骇鏁伴噺
+     */
+    private BigDecimal schedulingNum;
+
+    /**
+     * 鐢熶骇鏁伴噺
+     */
+    @ApiModelProperty(value = "鐢熶骇鏁伴噺")
+    private BigDecimal finishedNum;
+
+    /**
+     * 鐢熶骇鏃ユ湡
+     */
+    @ApiModelProperty(value = "鐢熶骇鏃ユ湡")
+    private String schedulingDate;
+
+}
diff --git a/src/main/java/com/ruoyi/production/dto/SalesLedgerProductDto.java b/src/main/java/com/ruoyi/production/dto/SalesLedgerProductDto.java
new file mode 100644
index 0000000..33e758d
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/SalesLedgerProductDto.java
@@ -0,0 +1,72 @@
+package com.ruoyi.production.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @author :yys
+ * @date : 2025/7/22 9:35
+ */
+@Data
+@ApiModel
+public class SalesLedgerProductDto {
+
+    /**
+     * 閿�鍞悎鍚屽彿
+     */
+    @Excel(name = "閿�鍞悎鍚屽彿")
+    @ApiModelProperty(value = "閿�鍞悎鍚屽彿")
+    private String salesContractNo;
+
+    /**
+     * 瀹㈡埛鍚堝悓鍙�
+     */
+    @Excel(name = "瀹㈡埛鍚堝悓鍙�")
+    @ApiModelProperty(value = "瀹㈡埛鍚堝悓鍙�")
+    private String customerContractNo;
+
+    /**
+     * 椤圭洰鍚嶇О
+     */
+    @Excel(name = "椤圭洰鍚嶇О")
+    @ApiModelProperty(value = "椤圭洰鍚嶇О")
+    private String projectName;
+
+
+    /**
+     * 瀹㈡埛鍚嶇О
+     */
+    @Excel(name = "瀹㈡埛鍚嶇О")
+    @ApiModelProperty(value = "瀹㈡埛鍚嶇О")
+    private String customerName;
+
+
+    /**
+     * 浜у搧澶х被
+     */
+    @Excel(name = "浜у搧澶х被")
+    @ApiModelProperty(value = "浜у搧澶х被")
+    private String productCategory;
+
+    /**
+     * 瑙勬牸鍨嬪彿
+     */
+    @Excel(name = "瑙勬牸鍨嬪彿")
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
+    private String specificationModel;
+
+    /**
+     * 鍗曚綅
+     */
+    @Excel(name = "鍗曚綅")
+    @ApiModelProperty(value = "鍗曚綅")
+    private String unit;
+
+
+}
diff --git a/src/main/java/com/ruoyi/production/dto/SalesLedgerProductionAccountingDto.java b/src/main/java/com/ruoyi/production/dto/SalesLedgerProductionAccountingDto.java
new file mode 100644
index 0000000..d590eaf
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/SalesLedgerProductionAccountingDto.java
@@ -0,0 +1,64 @@
+package com.ruoyi.production.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author :yys
+ * @date : 2025/7/22 13:55
+ */
+@Data
+@ApiModel
+public class SalesLedgerProductionAccountingDto extends SalesLedgerProductDto{
+
+    /**
+     * 鐢熶骇浜篿d
+     */
+    @ApiModelProperty(value = "鐢熶骇浜篿d")
+    private Long schedulingUserId;
+
+    /**
+     * 鎺掍骇浜哄悕绉�
+     */
+    @ApiModelProperty(value = "鐢熶骇浜哄悕绉�")
+    private String schedulingUserName;
+
+
+    /**
+     * 宸ヨ祫
+     */
+    @ApiModelProperty(value = "宸ヨ祫")
+    private BigDecimal wages;
+
+    /**
+     * 鐢熶骇鏁伴噺
+     */
+    @ApiModelProperty(value = "鐢熶骇鏁伴噺")
+    private BigDecimal finishedNum;
+
+    /**
+     * 宸ユ椂瀹氶
+     */
+    @ApiModelProperty(value = "宸ユ椂瀹氶")
+    private BigDecimal workHours;
+
+    /**
+     * 宸ュ簭
+     */
+    @ApiModelProperty(value = "宸ュ簭")
+    private String process;
+    /**
+     * 鎺掍骇鏃ユ湡
+     */
+    @ApiModelProperty(value = "鎺掍骇鏃ユ湡")
+    private String schedulingDate;
+
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    private String schedulingDateStart;
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    private String schedulingDateEnd;
+
+}
diff --git a/src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingDto.java b/src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingDto.java
new file mode 100644
index 0000000..accffb0
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingDto.java
@@ -0,0 +1,119 @@
+package com.ruoyi.production.dto;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+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.time.LocalDate;
+import java.util.Date;
+
+/**
+ * @author :yys
+ * @date : 2025/7/21 15:42
+ */
+@Data
+@ApiModel
+public class SalesLedgerSchedulingDto {
+
+    @ApiModelProperty(value = "閿�鍞骇鍝両D")
+    private Long salesLedgerProductId;
+
+    @ApiModelProperty(value = "閿�鍞彴璐D")
+    private Long salesLedgerId;
+
+    /**
+     * 閿�鍞悎鍚屽彿
+     */
+    @Excel(name = "閿�鍞悎鍚屽彿")
+    @ApiModelProperty(value = "閿�鍞悎鍚屽彿")
+    private String salesContractNo;
+
+    /**
+     * 瀹㈡埛鍚堝悓鍙�
+     */
+    @Excel(name = "瀹㈡埛鍚堝悓鍙�")
+    @ApiModelProperty(value = "瀹㈡埛鍚堝悓鍙�")
+    private String customerContractNo;
+
+    /**
+     * 椤圭洰鍚嶇О
+     */
+    @Excel(name = "椤圭洰鍚嶇О")
+    @ApiModelProperty(value = "椤圭洰鍚嶇О")
+    private String projectName;
+
+    /**
+     * 褰曞叆鏃ユ湡
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "褰曞叆鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "褰曞叆鏃ユ湡")
+    private Date entryDate;
+
+    @ApiModelProperty(value = "褰曞叆鏃ユ湡寮�濮�")
+    private String entryDateStart;
+
+    @ApiModelProperty(value = "褰曞叆鏃ユ湡缁撴潫")
+    private String entryDateEnd;
+
+    /**
+     * 瀹㈡埛鍚嶇О
+     */
+    @Excel(name = "瀹㈡埛鍚嶇О")
+    @ApiModelProperty(value = "瀹㈡埛鍚嶇О")
+    private String customerName;
+
+
+    /**
+     * 浜у搧澶х被
+     */
+    @Excel(name = "浜у搧澶х被")
+    @ApiModelProperty(value = "浜у搧澶х被")
+    private String productCategory;
+
+    /**
+     * 瑙勬牸鍨嬪彿
+     */
+    @Excel(name = "瑙勬牸鍨嬪彿")
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
+    private String specificationModel;
+
+    /**
+     * 鍗曚綅
+     */
+    @Excel(name = "鍗曚綅")
+    @ApiModelProperty(value = "鍗曚綅")
+    private String unit;
+
+    /**
+     * 鏁伴噺
+     */
+    @Excel(name = "鏁伴噺")
+    @ApiModelProperty(value = "鏁伴噺")
+    private BigDecimal quantity;
+
+    /**
+     * 鎺掍骇鏁伴噺
+     */
+    @Excel(name = "鎺掍骇鏁伴噺")
+    @ApiModelProperty(value = "鎺掍骇鏁伴噺")
+    private BigDecimal schedulingNum;
+
+    /**
+     * 瀹屽伐鏁伴噺
+     */
+    @Excel(name = "瀹屽伐鏁伴噺")
+    @ApiModelProperty(value = "瀹屽伐鏁伴噺")
+    private BigDecimal successNum;
+
+    @ApiModelProperty(value = "绉熸埛ID")
+    private Long tenantId;
+
+}
diff --git a/src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java b/src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java
new file mode 100644
index 0000000..56adc8e
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java
@@ -0,0 +1,132 @@
+package com.ruoyi.production.dto;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+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 : 2025/7/21 16:47
+ */
+@Data
+@ApiModel
+public class SalesLedgerSchedulingProcessDto {
+
+    @ApiModelProperty(value = "閿�鍞骇鍝両D")
+    private Long salesLedgerProductId;
+
+    @ApiModelProperty(value = "閿�鍞彴璐D")
+    private Long salesLedgerId;
+
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    private String schedulingDateStart;
+
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    private String schedulingDateEnd;
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 閿�鍞悎鍚屽彿
+     */
+    @Excel(name = "閿�鍞悎鍚屽彿")
+    @ApiModelProperty(value = "閿�鍞悎鍚屽彿")
+    private String salesContractNo;
+
+    /**
+     * 瀹㈡埛鍚堝悓鍙�
+     */
+    @Excel(name = "瀹㈡埛鍚堝悓鍙�")
+    @ApiModelProperty(value = "瀹㈡埛鍚堝悓鍙�")
+    private String customerContractNo;
+
+    /**
+     * 椤圭洰鍚嶇О
+     */
+    @Excel(name = "椤圭洰鍚嶇О")
+    @ApiModelProperty(value = "椤圭洰鍚嶇О")
+    private String projectName;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "娲惧伐鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "娲惧伐鏃ユ湡")
+    private Date schedulingDate;
+
+    /**
+     * 瀹㈡埛鍚嶇О
+     */
+    @Excel(name = "瀹㈡埛鍚嶇О")
+    @ApiModelProperty(value = "瀹㈡埛鍚嶇О")
+    private String customerName;
+
+
+    /**
+     * 浜у搧澶х被
+     */
+    @Excel(name = "浜у搧澶х被")
+    @ApiModelProperty(value = "浜у搧澶х被")
+    private String productCategory;
+
+    /**
+     * 瑙勬牸鍨嬪彿
+     */
+    @Excel(name = "瑙勬牸鍨嬪彿")
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
+    private String specificationModel;
+
+    /**
+     * 鍗曚綅
+     */
+    @Excel(name = "鍗曚綅")
+    @ApiModelProperty(value = "鍗曚綅")
+    private String unit;
+
+    /**
+     * 鐘舵��
+     */
+    @Excel(name = "鐘舵��")
+    @ApiModelProperty(value = "鐘舵��")
+    private Integer status;
+
+    /**
+     * 娲惧伐浜�
+     */
+    @Excel(name = "娲惧伐浜�")
+    @ApiModelProperty(value = "娲惧伐浜�")
+    private String schedulingUserName;
+
+    /**
+     * 娲惧伐浜�
+     */
+    @ApiModelProperty(value = "娲惧伐浜篿d")
+    private Long schedulingUserId;
+
+
+    /**
+     * 鎺掍骇鏁伴噺
+     */
+    @Excel(name = "鎺掍骇鏁伴噺")
+    @ApiModelProperty(value = "鎺掍骇鏁伴噺")
+    private BigDecimal schedulingNum;
+
+    /**
+     * 宸叉帓浜ф暟閲�
+     */
+    @ApiModelProperty(value = "宸叉帓浜ф暟閲�")
+    private BigDecimal successNum;
+
+    private Long tenantId;
+
+}
diff --git a/src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java b/src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java
new file mode 100644
index 0000000..bf9e9d5
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java
@@ -0,0 +1,73 @@
+package com.ruoyi.production.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * @author :yys
+ * @date : 2025/7/22 9:33
+ */
+@Data
+@ApiModel
+public class SalesLedgerWorkDto extends SalesLedgerProductDto{
+
+    private Long id;
+
+    /**
+     * 鎺掍骇浜篿d
+     */
+    @ApiModelProperty(value = "鎺掍骇浜篿d")
+    private Long schedulingUserId;
+
+    /**
+     * 鎺掍骇浜哄悕绉�
+     */
+    @ApiModelProperty(value = "鎺掍骇浜哄悕绉�")
+    private String schedulingUserName;
+
+
+    /**
+     * 鎺掍骇鏁伴噺
+     */
+    @ApiModelProperty(value = "鎺掍骇鏁伴噺")
+    private BigDecimal schedulingNum;
+
+    /**
+     * 鐢熶骇鏁伴噺
+     */
+    @ApiModelProperty(value = "鐢熶骇鏁伴噺")
+    private BigDecimal finishedNum;
+
+    /**
+     * 宸ユ椂瀹氶
+     */
+    @ApiModelProperty(value = "宸ユ椂瀹氶")
+    private BigDecimal workHours;
+
+    /**
+     * 宸ュ簭
+     */
+    @ApiModelProperty(value = "宸ュ簭")
+    private String process;
+    /**
+     * 鎺掍骇鏃ユ湡
+     */
+    @ApiModelProperty(value = "鎺掍骇鏃ユ湡")
+    private String schedulingDate;
+
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    private String schedulingDateStart;
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    private String schedulingDateEnd;
+
+    /**
+     * 鎶ュ伐鐘舵�侊紙1-寰呯敓浜� 2-宸叉姤宸ワ級
+     */
+    @ApiModelProperty(value = "鎶ュ伐鐘舵��")
+    private Integer status;
+
+}
diff --git a/src/main/java/com/ruoyi/production/mapper/SalesLedgerProductionAccountingMapper.java b/src/main/java/com/ruoyi/production/mapper/SalesLedgerProductionAccountingMapper.java
new file mode 100644
index 0000000..64477b5
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/mapper/SalesLedgerProductionAccountingMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.production.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.production.dto.SalesLedgerProductionAccountingDto;
+import com.ruoyi.production.pojo.SalesLedgerProductionAccounting;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author :yys
+ * @date : 2025/7/21 14:38
+ */
+public interface SalesLedgerProductionAccountingMapper extends BaseMapper<SalesLedgerProductionAccounting> {
+
+
+    IPage<SalesLedgerProductionAccountingDto> listPage(Page page,@Param("salesLedgerDto") SalesLedgerProductionAccountingDto salesLedgerProductionAccountingDto);
+
+
+}
diff --git a/src/main/java/com/ruoyi/production/mapper/SalesLedgerSchedulingMapper.java b/src/main/java/com/ruoyi/production/mapper/SalesLedgerSchedulingMapper.java
new file mode 100644
index 0000000..140de3d
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/mapper/SalesLedgerSchedulingMapper.java
@@ -0,0 +1,40 @@
+package com.ruoyi.production.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.production.dto.SalesLedgerSchedulingDto;
+import com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto;
+import com.ruoyi.production.pojo.SalesLedgerScheduling;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author :yys
+ * @date : 2025/7/21 14:37
+ */
+public interface SalesLedgerSchedulingMapper  extends BaseMapper<SalesLedgerScheduling> {
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page
+     * @param salesLedgerSchedulingDto
+     * @return
+     */
+    IPage<SalesLedgerSchedulingDto> listPage(Page page,@Param("salesLedgerDto") SalesLedgerSchedulingDto salesLedgerSchedulingDto);
+
+    /**
+     * 瀵煎嚭
+     * @return
+     */
+    List<SalesLedgerSchedulingDto> list();
+
+    /**
+     * 鍒嗛〉鏌ヨ宸ュ簭鎺掍骇
+     * @param page
+     * @param salesLedgerSchedulingDto
+     * @return
+     */
+    IPage<SalesLedgerSchedulingProcessDto> listPageProcess(Page page,@Param("salesLedgerDto") SalesLedgerSchedulingProcessDto salesLedgerSchedulingDto);
+}
diff --git a/src/main/java/com/ruoyi/production/mapper/SalesLedgerWorkMapper.java b/src/main/java/com/ruoyi/production/mapper/SalesLedgerWorkMapper.java
new file mode 100644
index 0000000..adf5dc3
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/mapper/SalesLedgerWorkMapper.java
@@ -0,0 +1,24 @@
+package com.ruoyi.production.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.production.dto.SalesLedgerWorkDto;
+import com.ruoyi.production.pojo.SalesLedgerWork;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author :yys
+ * @date : 2025/7/21 14:37
+ */
+public interface SalesLedgerWorkMapper extends BaseMapper<SalesLedgerWork> {
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page
+     * @param salesLedgerWorkDto
+     * @return
+     */
+    IPage<SalesLedgerWorkDto> listPage(Page page,@Param("salesLedgerDto") SalesLedgerWorkDto salesLedgerWorkDto);
+
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/SalesLedgerProductionAccounting.java b/src/main/java/com/ruoyi/production/pojo/SalesLedgerProductionAccounting.java
new file mode 100644
index 0000000..2959e4d
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/pojo/SalesLedgerProductionAccounting.java
@@ -0,0 +1,109 @@
+package com.ruoyi.production.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Builder;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * @author :yys
+ * @date : 2025/7/8 13:24
+ */
+@TableName("sales_ledger_production_accounting")
+@Data
+@Builder
+public class SalesLedgerProductionAccounting {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 閿�鍞帓浜�-鎶ュ伐琛╥d
+     */
+    private Long salesLedgerWorkId;
+
+    /**
+     * 閿�鍞帓浜ц〃id
+     */
+    private Long salesLedgerSchedulingId;
+
+    /**
+     * 閿�鍞彴璐d
+     */
+    private Long salesLedgerId;
+
+    /**
+     * 閿�鍞骇鍝乮d
+     */
+    private Long salesLedgerProductId;
+
+    /**
+     * 鐢熶骇浜篿d
+     */
+    private Long schedulingUserId;
+
+    /**
+     * 鐢熶骇浜哄悕绉�
+     */
+    private String schedulingUserName;
+
+    /**
+     * 鐢熶骇鏁伴噺
+     */
+    private BigDecimal finishedNum;
+
+    /**
+     * 宸ユ椂瀹氶
+     */
+    private BigDecimal workHours;
+
+    /**
+     * 宸ュ簭
+     */
+    private String process;
+    /**
+     * 鐢熶骇鏃ユ湡
+     */
+    private LocalDate schedulingDate;
+
+    /**
+     *
+     */
+    private Integer status;
+
+    /**
+     * 鍒涘缓鑰�
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    /**
+     * 淇敼鑰�
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    private Integer updateUser;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime updateTime;
+
+    /**
+     * 绉熸埛ID
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/SalesLedgerScheduling.java b/src/main/java/com/ruoyi/production/pojo/SalesLedgerScheduling.java
new file mode 100644
index 0000000..937ff7f
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/pojo/SalesLedgerScheduling.java
@@ -0,0 +1,95 @@
+package com.ruoyi.production.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Builder;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * @author :yys
+ * @date : 2025/7/8 13:24
+ */
+@TableName("sales_ledger_scheduling")
+@Data
+@Builder
+public class SalesLedgerScheduling {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 閿�鍞彴璐d
+     */
+    private Long salesLedgerId;
+
+    /**
+     * 閿�鍞骇鍝乮d
+     */
+    private Long salesLedgerProductId;
+
+    /**
+     * 娲惧伐浜篿d
+     */
+    private Long schedulingUserId;
+
+    /**
+     * 娲惧伐浜哄悕绉�
+     */
+    private String schedulingUserName;
+
+
+    /**
+     * 鎺掍骇鏁伴噺
+     */
+    private BigDecimal schedulingNum;
+
+    /**
+     * 宸叉帓浜ф暟閲�
+     */
+    private BigDecimal finishedNum;
+    /**
+     * 娲惧伐鏃ユ湡
+     */
+    private LocalDate schedulingDate;
+
+    /**
+     * 鎺掍骇鐘舵�侊紙1-寰呮帓浜� 2-鎺掍骇涓� 3-宸叉帓浜э級
+     */
+    private Integer status;
+
+    /**
+     * 鍒涘缓鑰�
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    /**
+     * 淇敼鑰�
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    /**
+     * 绉熸埛ID
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/SalesLedgerWork.java b/src/main/java/com/ruoyi/production/pojo/SalesLedgerWork.java
new file mode 100644
index 0000000..b722105
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/pojo/SalesLedgerWork.java
@@ -0,0 +1,110 @@
+package com.ruoyi.production.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Builder;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * @author :yys
+ * @date : 2025/7/8 13:24
+ */
+@TableName("sales_ledger_work")
+@Data
+@Builder
+public class SalesLedgerWork {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 閿�鍞帓浜ц〃id
+     */
+    private Long salesLedgerSchedulingId;
+
+    /**
+     * 閿�鍞彴璐d
+     */
+    private Long salesLedgerId;
+
+    /**
+     * 閿�鍞骇鍝乮d
+     */
+    private Long salesLedgerProductId;
+
+    /**
+     * 鎺掍骇浜篿d
+     */
+    private Long schedulingUserId;
+
+    /**
+     * 鎺掍骇浜哄悕绉�
+     */
+    private String schedulingUserName;
+
+
+    /**
+     * 鎺掍骇鏁伴噺
+     */
+    private BigDecimal schedulingNum;
+
+    /**
+     * 鐢熶骇鏁伴噺
+     */
+    private BigDecimal finishedNum;
+
+    /**
+     * 宸ユ椂瀹氶
+     */
+    private BigDecimal workHours;
+
+    /**
+     * 宸ュ簭
+     */
+    private String process;
+    /**
+     * 鎺掍骇鏃ユ湡
+     */
+    private LocalDate schedulingDate;
+
+    /**
+     * 鎶ュ伐鐘舵�侊紙1-寰呯敓浜� 2-鐢熶骇涓� 3-宸叉姤宸ワ級
+     */
+    private Integer status;
+
+    /**
+     * 鍒涘缓鑰�
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    /**
+     * 淇敼鑰�
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    private Integer updateUser;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime updateTime;
+
+    /**
+     * 绉熸埛ID
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+}
diff --git a/src/main/java/com/ruoyi/production/service/SalesLedgerProductionAccountingService.java b/src/main/java/com/ruoyi/production/service/SalesLedgerProductionAccountingService.java
new file mode 100644
index 0000000..11c62f4
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/SalesLedgerProductionAccountingService.java
@@ -0,0 +1,19 @@
+package com.ruoyi.production.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.production.dto.SalesLedgerProductionAccountingDto;
+import com.ruoyi.production.pojo.SalesLedgerProductionAccounting;
+
+/**
+ * @author :yys
+ * @date : 2025/7/21 14:39
+ */
+public interface SalesLedgerProductionAccountingService extends IService<SalesLedgerProductionAccounting> {
+
+
+    IPage<SalesLedgerProductionAccountingDto> listPage(Page page, SalesLedgerProductionAccountingDto salesLedgerProductionAccountingDto);
+
+
+}
diff --git a/src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java b/src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java
new file mode 100644
index 0000000..484bd23
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java
@@ -0,0 +1,32 @@
+package com.ruoyi.production.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.production.dto.ProcessSchedulingDto;
+import com.ruoyi.production.dto.ProductionDispatchAddDto;
+import com.ruoyi.production.dto.SalesLedgerSchedulingDto;
+import com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto;
+import com.ruoyi.production.pojo.SalesLedgerScheduling;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * @author :yys
+ * @date : 2025/7/21 14:39
+ */
+public interface SalesLedgerSchedulingService extends IService<SalesLedgerScheduling> {
+
+    IPage<SalesLedgerSchedulingDto> listPage(Page page, SalesLedgerSchedulingDto salesLedgerSchedulingDto);
+
+    void export(HttpServletResponse response);
+
+    int productionDispatch(ProductionDispatchAddDto productionDispatchAddDto);
+
+    IPage<SalesLedgerSchedulingProcessDto> listPageProcess(Page page, SalesLedgerSchedulingProcessDto salesLedgerSchedulingDto);
+
+    int productionDispatchDelete(List<Long> ids);
+
+    int processScheduling(List<ProcessSchedulingDto> processSchedulingDto);
+}
diff --git a/src/main/java/com/ruoyi/production/service/SalesLedgerWorkService.java b/src/main/java/com/ruoyi/production/service/SalesLedgerWorkService.java
new file mode 100644
index 0000000..b219515
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/SalesLedgerWorkService.java
@@ -0,0 +1,26 @@
+package com.ruoyi.production.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.production.dto.ProductionReportDto;
+import com.ruoyi.production.dto.SalesLedgerWorkDto;
+import com.ruoyi.production.pojo.SalesLedgerWork;
+
+import java.util.List;
+
+/**
+ * @author :yys
+ * @date : 2025/7/21 14:38
+ */
+public interface SalesLedgerWorkService extends IService<SalesLedgerWork> {
+
+    IPage<SalesLedgerWorkDto> listPage(Page page, SalesLedgerWorkDto salesLedgerWorkDto);
+
+    int productionReport(ProductionReportDto productionReportDto);
+
+    int productionReportUpdate(ProductionReportDto productionReportDto);
+
+    List<ProductionReportDto> getList(Long id);
+}
diff --git a/src/main/java/com/ruoyi/production/service/impl/SalesLedgerProductionAccountingServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/SalesLedgerProductionAccountingServiceImpl.java
new file mode 100644
index 0000000..3d510b8
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/impl/SalesLedgerProductionAccountingServiceImpl.java
@@ -0,0 +1,30 @@
+package com.ruoyi.production.service.impl;
+
+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.production.dto.SalesLedgerProductionAccountingDto;
+import com.ruoyi.production.mapper.SalesLedgerProductionAccountingMapper;
+import com.ruoyi.production.pojo.SalesLedgerProductionAccounting;
+import com.ruoyi.production.service.SalesLedgerProductionAccountingService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author :yys
+ * @date : 2025/7/21 14:41
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class SalesLedgerProductionAccountingServiceImpl extends ServiceImpl<SalesLedgerProductionAccountingMapper, SalesLedgerProductionAccounting> implements SalesLedgerProductionAccountingService {
+  
+    private final SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
+  
+    @Override
+    public IPage<SalesLedgerProductionAccountingDto> listPage(Page page, SalesLedgerProductionAccountingDto salesLedgerProductionAccountingDto) {
+        IPage<SalesLedgerProductionAccountingDto> list = salesLedgerProductionAccountingMapper.listPage(page, salesLedgerProductionAccountingDto);
+        return list;
+    }
+}
diff --git a/src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
new file mode 100644
index 0000000..a275a3d
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
@@ -0,0 +1,170 @@
+package com.ruoyi.production.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.common.utils.poi.ExcelUtil;
+import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto;
+import com.ruoyi.production.dto.ProcessSchedulingDto;
+import com.ruoyi.production.dto.ProductionDispatchAddDto;
+import com.ruoyi.production.dto.SalesLedgerSchedulingDto;
+import com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto;
+import com.ruoyi.production.mapper.SalesLedgerSchedulingMapper;
+import com.ruoyi.production.mapper.SalesLedgerWorkMapper;
+import com.ruoyi.production.pojo.SalesLedgerScheduling;
+import com.ruoyi.production.pojo.SalesLedgerWork;
+import com.ruoyi.production.service.SalesLedgerSchedulingService;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysUserMapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author :yys
+ * @date : 2025/7/21 14:41
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class SalesLedgerSchedulingServiceImpl extends ServiceImpl<SalesLedgerSchedulingMapper, SalesLedgerScheduling> implements SalesLedgerSchedulingService {
+
+    private final SalesLedgerSchedulingMapper salesLedgerSchedulingMapper;
+
+    private final SalesLedgerWorkMapper salesLedgerWorkMapper;
+
+    @Override
+    public IPage<SalesLedgerSchedulingDto> listPage(Page page, SalesLedgerSchedulingDto salesLedgerSchedulingDto) {
+        IPage<SalesLedgerSchedulingDto> list = salesLedgerSchedulingMapper.listPage(page, salesLedgerSchedulingDto);
+        if(list.getTotal() == 0){
+            return list;
+        }
+        Set<Long> collect = list.getRecords().stream().map(SalesLedgerSchedulingDto::getSalesLedgerProductId).collect(Collectors.toSet());
+        LambdaQueryWrapper<SalesLedgerWork> salesLedgerWorkLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        salesLedgerWorkLambdaQueryWrapper.in(SalesLedgerWork::getSalesLedgerProductId, collect)
+                .ne(SalesLedgerWork::getStatus, 1);
+        List<SalesLedgerWork> salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper);
+        list.getRecords().forEach(i -> {
+            // 鑾峰彇瀹屾垚鏁伴噺
+            i.setSuccessNum(salesLedgerWorks
+                    .stream()
+                    .filter(j -> j.getSalesLedgerProductId().equals(i.getSalesLedgerProductId()))
+                    .map(SalesLedgerWork::getFinishedNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add));
+        });
+        return list;
+    }
+
+    @Override
+    public void export(HttpServletResponse response) {
+        List<SalesLedgerSchedulingDto> list = salesLedgerSchedulingMapper.list();
+        if(CollectionUtils.isEmpty(list)){
+            throw new RuntimeException("鏃犲鍑烘暟鎹�");
+        }
+        Set<Long> collect = list.stream().map(SalesLedgerSchedulingDto::getSalesLedgerProductId).collect(Collectors.toSet());
+        LambdaQueryWrapper<SalesLedgerWork> salesLedgerWorkLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        salesLedgerWorkLambdaQueryWrapper.in(SalesLedgerWork::getSalesLedgerProductId, collect)
+                .ne(SalesLedgerWork::getStatus, 1);
+        List<SalesLedgerWork> salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper);
+        list.forEach(i -> {
+            // 鑾峰彇瀹屾垚鏁伴噺
+            i.setSuccessNum(salesLedgerWorks
+                    .stream()
+                    .filter(j -> j.getSalesLedgerProductId().equals(i.getSalesLedgerProductId()))
+                    .map(SalesLedgerWork::getFinishedNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add));
+        });
+        ExcelUtil<SalesLedgerSchedulingDto> util = new ExcelUtil<>(SalesLedgerSchedulingDto.class);
+        util.exportExcel(response, list, "鐢熶骇璁㈠崟");
+    }
+
+    private final SysUserMapper sysUserMapper;
+
+    @Override
+    public int productionDispatch(ProductionDispatchAddDto productionDispatchAddDto) {
+        SysUser sysUser = sysUserMapper.selectUserById(productionDispatchAddDto.getSchedulingUserId());
+        if(sysUser == null) throw new RuntimeException("鎺掍骇浜轰笉瀛樺湪");
+        SalesLedgerScheduling salesLedgerScheduling = SalesLedgerScheduling.builder()
+                .salesLedgerId(productionDispatchAddDto.getSalesLedgerId())
+                .salesLedgerProductId(productionDispatchAddDto.getSalesLedgerProductId())
+                .schedulingUserId(productionDispatchAddDto.getSchedulingUserId())
+                .schedulingUserName(sysUser.getNickName())
+                .schedulingNum(productionDispatchAddDto.getSchedulingNum())
+                .schedulingDate(LocalDate.parse(productionDispatchAddDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE))
+                .status(1)
+                .build();
+        return salesLedgerSchedulingMapper.insert(salesLedgerScheduling);
+    }
+
+    @Override
+    public IPage<SalesLedgerSchedulingProcessDto> listPageProcess(Page page, SalesLedgerSchedulingProcessDto salesLedgerSchedulingDto) {
+        IPage<SalesLedgerSchedulingProcessDto> list = salesLedgerSchedulingMapper.listPageProcess(page, salesLedgerSchedulingDto);
+        Set<Long> collect = list.getRecords().stream().map(SalesLedgerSchedulingProcessDto::getSalesLedgerProductId).collect(Collectors.toSet());
+        LambdaQueryWrapper<SalesLedgerWork> salesLedgerWorkLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        salesLedgerWorkLambdaQueryWrapper.in(SalesLedgerWork::getSalesLedgerProductId, collect)
+                .ne(SalesLedgerWork::getStatus, 1);
+        List<SalesLedgerWork> salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper);
+        list.getRecords().forEach(i -> {
+            // 鑾峰彇瀹屾垚鏁伴噺
+            i.setSuccessNum(salesLedgerWorks
+                    .stream()
+                    .filter(j -> j.getSalesLedgerProductId().equals(i.getSalesLedgerProductId()))
+                    .map(SalesLedgerWork::getFinishedNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add));
+        });
+        return list;
+    }
+
+    @Override
+    public int productionDispatchDelete(List<Long> ids) {
+        LambdaQueryWrapper<SalesLedgerScheduling> salesLedgerSchedulingLambdaQueryWrapper = new LambdaQueryWrapper<SalesLedgerScheduling>();
+        salesLedgerSchedulingLambdaQueryWrapper.in(SalesLedgerScheduling::getId, ids);
+        List<SalesLedgerScheduling> salesLedgerSchedulings = salesLedgerSchedulingMapper.selectList(salesLedgerSchedulingLambdaQueryWrapper);
+        if(CollectionUtils.isEmpty(salesLedgerSchedulings)) throw new RuntimeException("鎺掍骇涓嶅瓨鍦�");
+        List<SalesLedgerScheduling> collect = salesLedgerSchedulings.stream().filter(i -> !i.getStatus().equals(1)).collect(Collectors.toList());
+        if(!CollectionUtils.isEmpty(collect)) throw new RuntimeException("鎺掍骇宸插紑濮嬶紝璇峰嬁鍒犻櫎");
+        salesLedgerSchedulingMapper.deleteBatchIds(ids);
+        return 0;
+    }
+
+    @Override
+    public int processScheduling(List<ProcessSchedulingDto> processSchedulingDtos) {
+        for (ProcessSchedulingDto processSchedulingDto : processSchedulingDtos) {
+            SalesLedgerScheduling salesLedgerScheduling = salesLedgerSchedulingMapper.selectById(processSchedulingDto.getId());
+            if(salesLedgerScheduling == null) throw new RuntimeException("鎺掍骇涓嶅瓨鍦�");
+            if(salesLedgerScheduling.getStatus().equals(3)) throw new RuntimeException("鎺掍骇宸插畬鎴愶紝璇峰嬁閲嶅鎺掍骇");
+            SysUser sysUser = sysUserMapper.selectUserById(processSchedulingDto.getSchedulingUserId());
+            if(sysUser == null) throw new RuntimeException("鎺掍骇浜轰笉瀛樺湪");
+            salesLedgerScheduling.setFinishedNum(salesLedgerScheduling.getFinishedNum().add(processSchedulingDto.getSchedulingNum()));
+            if(salesLedgerScheduling.getSchedulingNum().compareTo(salesLedgerScheduling.getFinishedNum()) <= 0){
+                salesLedgerScheduling.setStatus(3);
+            }else{
+                salesLedgerScheduling.setStatus(2);
+            }
+            salesLedgerSchedulingMapper.updateById(salesLedgerScheduling);
+            SalesLedgerWork.SalesLedgerWorkBuilder salesLedgerWorkBuilder = SalesLedgerWork.builder()
+                    .salesLedgerSchedulingId(salesLedgerScheduling.getId())
+                    .salesLedgerId(salesLedgerScheduling.getSalesLedgerId())
+                    .salesLedgerProductId(salesLedgerScheduling.getSalesLedgerProductId())
+                    .schedulingUserId(salesLedgerScheduling.getSchedulingUserId())
+                    .schedulingUserName(sysUser.getNickName())
+                    .schedulingNum(processSchedulingDto.getSchedulingNum())
+                    .workHours(processSchedulingDto.getWorkHours())
+                    .process(processSchedulingDto.getProcess())
+                    .status(1)
+                    .schedulingDate(LocalDate.parse(processSchedulingDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE));
+            salesLedgerWorkMapper.insert(salesLedgerWorkBuilder.build());
+        }
+        return 0;
+    }
+}
diff --git a/src/main/java/com/ruoyi/production/service/impl/SalesLedgerWorkServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/SalesLedgerWorkServiceImpl.java
new file mode 100644
index 0000000..e565d49
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/impl/SalesLedgerWorkServiceImpl.java
@@ -0,0 +1,129 @@
+package com.ruoyi.production.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.framework.web.domain.AjaxResult;
+import com.ruoyi.production.dto.ProductionReportDto;
+import com.ruoyi.production.dto.SalesLedgerWorkDto;
+import com.ruoyi.production.mapper.SalesLedgerProductionAccountingMapper;
+import com.ruoyi.production.mapper.SalesLedgerWorkMapper;
+import com.ruoyi.production.pojo.SalesLedgerProductionAccounting;
+import com.ruoyi.production.pojo.SalesLedgerWork;
+import com.ruoyi.production.service.SalesLedgerProductionAccountingService;
+import com.ruoyi.production.service.SalesLedgerWorkService;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysUserMapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author :yys
+ * @date : 2025/7/21 14:40
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class SalesLedgerWorkServiceImpl extends ServiceImpl<SalesLedgerWorkMapper, SalesLedgerWork> implements SalesLedgerWorkService {
+
+    private final SalesLedgerWorkMapper salesLedgerWorkMapper;
+
+    private final SysUserMapper sysUserMapper;
+
+    private final SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
+
+    @Override
+    public IPage<SalesLedgerWorkDto> listPage(Page page, SalesLedgerWorkDto salesLedgerWorkDto) {
+        IPage<SalesLedgerWorkDto> iPage = salesLedgerWorkMapper.listPage(page, salesLedgerWorkDto);
+        return iPage;
+    }
+
+    @Override
+    public int productionReport(ProductionReportDto productionReportDto) {
+        SalesLedgerWork salesLedgerWork = salesLedgerWorkMapper.selectById(productionReportDto.getId());
+        SysUser sysUser = sysUserMapper.selectUserById(productionReportDto.getSchedulingUserId());
+        if (salesLedgerWork == null) throw new RuntimeException("鎶ュ伐鏁版嵁涓嶅瓨鍦�");
+        if (salesLedgerWork.getStatus() == 3) throw new RuntimeException("鎶ュ伐宸插畬鎴�");
+        if (sysUser == null) throw new RuntimeException("鐢熶骇浜轰笉瀛樺湪");
+        salesLedgerWork.setFinishedNum(salesLedgerWork.getFinishedNum().add(productionReportDto.getFinishedNum()));
+        if(salesLedgerWork.getSchedulingNum().compareTo(salesLedgerWork.getFinishedNum()) <= 0){
+            salesLedgerWork.setStatus(3);
+        }else{
+            salesLedgerWork.setStatus(2);
+        }
+        salesLedgerWorkMapper.updateById(salesLedgerWork);
+        // 鏂板鎶ュ伐鏁版嵁
+        SalesLedgerProductionAccounting.SalesLedgerProductionAccountingBuilder builder = SalesLedgerProductionAccounting.builder()
+                .salesLedgerWorkId(salesLedgerWork.getId())
+                .salesLedgerSchedulingId(salesLedgerWork.getSalesLedgerSchedulingId())
+                .salesLedgerId(salesLedgerWork.getSalesLedgerId())
+                .salesLedgerProductId(salesLedgerWork.getSalesLedgerProductId())
+                .schedulingUserId(sysUser.getUserId())
+                .schedulingUserName(sysUser.getNickName())
+                .finishedNum(productionReportDto.getFinishedNum())
+                .workHours(salesLedgerWork.getWorkHours())
+                .process(salesLedgerWork.getProcess())
+                .schedulingDate(LocalDate.parse(productionReportDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE));
+        salesLedgerProductionAccountingMapper.insert(builder.build());
+        return 0;
+    }
+
+    @Override
+    public int productionReportUpdate(ProductionReportDto productionReportDto) {
+        SalesLedgerWork salesLedgerWork = salesLedgerWorkMapper.selectById(productionReportDto.getId());
+        if(salesLedgerWork == null) throw new RuntimeException("鎶ュ伐鏁版嵁涓嶅瓨鍦�");
+        SysUser sysUser = sysUserMapper.selectUserById(productionReportDto.getSchedulingUserId());
+        if(sysUser == null) throw new RuntimeException("鐢熶骇浜轰笉瀛樺湪");
+        salesLedgerWork.setFinishedNum(productionReportDto.getFinishedNum());
+        if(salesLedgerWork.getSchedulingNum().compareTo(salesLedgerWork.getFinishedNum()) <= 0){
+            salesLedgerWork.setStatus(3);
+        }else{
+            salesLedgerWork.setStatus(2);
+        }
+        salesLedgerWork.setSchedulingUserId(sysUser.getUserId());
+        salesLedgerWork.setSchedulingUserName(sysUser.getNickName());
+        salesLedgerWork.setSchedulingDate(LocalDate.parse(productionReportDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE));
+        salesLedgerWorkMapper.updateById(salesLedgerWork);
+
+        // 鏇存柊鏍哥畻鏁版嵁
+        LambdaQueryWrapper<SalesLedgerProductionAccounting> salesLedgerProductionAccountingLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        salesLedgerProductionAccountingLambdaQueryWrapper.eq(SalesLedgerProductionAccounting::getSalesLedgerWorkId, salesLedgerWork.getId())
+                .orderByDesc(SalesLedgerProductionAccounting::getCreateTime)
+                .last("limit 1");
+        SalesLedgerProductionAccounting salesLedgerProductionAccounting = salesLedgerProductionAccountingMapper.selectOne(salesLedgerProductionAccountingLambdaQueryWrapper);
+        if(salesLedgerProductionAccounting != null){
+            salesLedgerProductionAccounting.setFinishedNum(productionReportDto.getFinishedNum());
+            salesLedgerProductionAccounting.setSchedulingUserId(sysUser.getUserId());
+            salesLedgerProductionAccounting.setSchedulingUserName(sysUser.getNickName());
+            salesLedgerProductionAccounting.setSchedulingDate(LocalDate.parse(productionReportDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE));
+            salesLedgerProductionAccountingMapper.updateById(salesLedgerProductionAccounting);
+        }
+        return 0;
+    }
+
+    @Override
+    public List<ProductionReportDto> getList(Long id) {
+        SalesLedgerWork salesLedgerWork = salesLedgerWorkMapper.selectById(id);
+        if(salesLedgerWork == null) throw new RuntimeException("鎶ュ伐鏁版嵁涓嶅瓨鍦�");
+        LambdaQueryWrapper<SalesLedgerProductionAccounting> salesLedgerProductionAccountingLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        salesLedgerProductionAccountingLambdaQueryWrapper.eq(SalesLedgerProductionAccounting::getSalesLedgerWorkId, id);
+        List<SalesLedgerProductionAccounting> salesLedgerProductionAccountingList = salesLedgerProductionAccountingMapper.selectList(salesLedgerProductionAccountingLambdaQueryWrapper);
+        if(CollectionUtils.isEmpty(salesLedgerProductionAccountingList)) throw new RuntimeException("娌℃湁鐢熶骇璁板綍鏁版嵁");
+        return salesLedgerProductionAccountingList.stream().map(salesLedgerProductionAccounting -> {
+            ProductionReportDto productionReportDto = new ProductionReportDto();
+            BeanUtils.copyProperties(salesLedgerProductionAccounting, productionReportDto);
+            productionReportDto.setSchedulingDate(salesLedgerProductionAccounting.getSchedulingDate().format(DateTimeFormatter.ISO_LOCAL_DATE));
+            productionReportDto.setSchedulingNum(salesLedgerWork.getSchedulingNum());
+            return productionReportDto;
+        }).collect(Collectors.toList());
+    }
+}
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index a6e9f20..b6c43ed 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -16,6 +16,8 @@
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.other.mapper.TempFileMapper;
 import com.ruoyi.other.pojo.TempFile;
+import com.ruoyi.production.mapper.SalesLedgerSchedulingMapper;
+import com.ruoyi.production.pojo.SalesLedgerScheduling;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.mapper.SysDeptMapper;
 import com.ruoyi.sales.dto.MonthlyAmountDto;
@@ -74,6 +76,8 @@
     private final ReceiptPaymentMapper receiptPaymentMapper;
 
     private final InvoiceLedgerMapper invoiceLedgerMapper;
+
+    private final SalesLedgerSchedulingMapper salesLedgerSchedulingMapper;
 
     @Autowired
     private SysDeptMapper sysDeptMapper;
@@ -312,15 +316,23 @@
         List<Long> idList = Arrays.stream(ids)
                 .filter(Objects::nonNull)
                 .collect(Collectors.toList());
-
         if (CollectionUtils.isEmpty(idList)) {
             return 0;
+        }
+        // 鐢熶骇璁㈠崟鏈夊緟鎺掍骇鏁版嵁锛屽彴璐︿笉鍙垹闄�
+        LambdaQueryWrapper<SalesLedgerScheduling> salesLedgerSchedulingLambdaQueryWrapper = new LambdaQueryWrapper<SalesLedgerScheduling>()
+                .in(SalesLedgerScheduling::getSalesLedgerId, idList);
+        if (salesLedgerSchedulingMapper.selectCount(salesLedgerSchedulingLambdaQueryWrapper) > 0) {
+            throw new BaseException("鏈夋帓浜ф暟鎹紝涓嶅彲鍒犻櫎");
         }
         // 1. 鍏堝垹闄ゅ瓙琛ㄦ暟鎹�
         LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>();
         productWrapper.in(SalesLedgerProduct::getSalesLedgerId, idList);
         salesLedgerProductMapper.delete(productWrapper);
-
+        // 鍒犻櫎鐢熶骇璁㈠崟鏁版嵁
+        LambdaQueryWrapper<SalesLedgerScheduling> in = new LambdaQueryWrapper<SalesLedgerScheduling>()
+                .in(SalesLedgerScheduling::getSalesLedgerId, idList);
+        salesLedgerSchedulingMapper.delete(in);
         // 2. 鍐嶅垹闄や富琛ㄦ暟鎹�
         return salesLedgerMapper.deleteBatchIds(idList);
     }
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index dd92f63..a0b7864 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -188,7 +188,7 @@
 # Swagger閰嶇疆
 swagger:
   # 鏄惁寮�鍚痵wagger
-  enabled: false
+  enabled: true
   # 璇锋眰鍓嶇紑
   pathMapping: /dev-api
 
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index a87ef6b..a6ce03c 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,4 +1,4 @@
 # Spring閰嶇疆
 spring:
   profiles:
-    active: prod
\ No newline at end of file
+    active: dev
\ No newline at end of file
diff --git a/src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml b/src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml
new file mode 100644
index 0000000..9528922
--- /dev/null
+++ b/src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml
@@ -0,0 +1,53 @@
+<?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.production.mapper.SalesLedgerProductionAccountingMapper">
+
+    <select id="listPage" resultType="com.ruoyi.production.dto.SalesLedgerProductionAccountingDto">
+        SELECT
+        t4.id,
+        t4.finished_num * t4.work_hours as wages,
+        t4.scheduling_user_id,
+        t4.scheduling_user_name,
+        t4.scheduling_date,
+        t4.finished_num,
+        t4.work_hours,
+        t4.process,
+        T1.sales_contract_no,
+        T1.customer_contract_no,
+        T1.project_name,
+        T1.customer_name,
+        t3.product_category,
+        t3.specification_model,
+        t3.unit
+        FROM
+        sales_ledger_production_accounting t4
+        LEFT JOIN sales_ledger T1 ON T1.id = t4.sales_ledger_id
+        left join sales_ledger_product t3 on t4.sales_ledger_product_id = t3.id
+        <where>
+            1 = 1
+            <if test="salesLedgerDto.schedulingUserName != null and salesLedgerDto.schedulingUserName != '' ">
+                AND  t4.scheduling_user_uame LIKE CONCAT('%',#{salesLedgerDto.schedulingUserName},'%')
+            </if>
+            <if test="salesLedgerDto.customerName != null and salesLedgerDto.customerName != '' ">
+                AND  T1.customer_name LIKE CONCAT('%',#{salesLedgerDto.customerName},'%')
+            </if>
+            <if test="salesLedgerDto.customerContractNo != null and salesLedgerDto.customerContractNo !='' ">
+                AND  T1.customer_contract_no LIKE CONCAT('%',#{salesLedgerDto.customerContractNo},'%')
+            </if>
+            <if test="salesLedgerDto.salesContractNo != null and salesLedgerDto.salesContractNo != '' ">
+                AND  T1.sales_contract_no LIKE CONCAT('%',#{salesLedgerDto.salesContractNo},'%')
+            </if>
+            <if test="salesLedgerDto.projectName != null and salesLedgerDto.projectName != '' ">
+                AND T1.project_name LIKE CONCAT('%',#{salesLedgerDto.projectName},'%')
+            </if>
+            <if test="salesLedgerDto.schedulingDateStart != null and salesLedgerDto.schedulingDateStart != '' ">
+                AND t4.scheduling_date &gt;= DATE_FORMAT(#{salesLedgerDto.entryDateStart},'%Y-%m-%d')
+            </if>
+            <if test="salesLedgerDto.schedulingDateEnd != null and salesLedgerDto.schedulingDateEnd != '' ">
+                AND  t4.scheduling_date &lt;= DATE_FORMAT(#{salesLedgerDto.entryDateEnd},'%Y-%m-%d')
+            </if>
+        </where>
+        group by t4.id
+        order by t4.update_time desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/production/SalesLedgerSchedulingMapper.xml b/src/main/resources/mapper/production/SalesLedgerSchedulingMapper.xml
new file mode 100644
index 0000000..bcf4b64
--- /dev/null
+++ b/src/main/resources/mapper/production/SalesLedgerSchedulingMapper.xml
@@ -0,0 +1,113 @@
+<?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.production.mapper.SalesLedgerSchedulingMapper">
+
+    <select id="listPage" resultType="com.ruoyi.production.dto.SalesLedgerSchedulingDto">
+        SELECT
+        T2.id as salesLedgerProductId,
+        T1.id as salesLedgerId,
+        ifNull(sum(t3.scheduling_num),0) AS schedulingNum,
+        T1.sales_contract_no,
+        T1.customer_contract_no,
+        T1.project_name,
+        T1.entry_date,
+        T1.customer_name,
+        T2.quantity,
+        T2.product_category,
+        T2.specification_model,
+        T2.unit
+        FROM
+        sales_ledger_product T2
+        LEFT join sales_ledger_scheduling t3 on T2.id = t3.sales_ledger_product_id
+        LEFT JOIN sales_ledger T1 ON T1.id = T2.sales_ledger_id
+        <where>
+            T1.id is not null
+            <if test="salesLedgerDto.customerName != null and salesLedgerDto.customerName != '' ">
+                AND  T1.customer_name LIKE CONCAT('%',#{salesLedgerDto.customerName},'%')
+            </if>
+            <if test="salesLedgerDto.customerContractNo != null and salesLedgerDto.customerContractNo !='' ">
+                AND  T1.customer_contract_no LIKE CONCAT('%',#{salesLedgerDto.customerContractNo},'%')
+            </if>
+            <if test="salesLedgerDto.salesContractNo != null and salesLedgerDto.salesContractNo != '' ">
+                AND  T1.sales_contract_no LIKE CONCAT('%',#{salesLedgerDto.salesContractNo},'%')
+            </if>
+            <if test="salesLedgerDto.projectName != null and salesLedgerDto.projectName != '' ">
+                AND T1.project_name LIKE CONCAT('%',#{salesLedgerDto.projectName},'%')
+            </if>
+            <if test="salesLedgerDto.entryDateStart != null and salesLedgerDto.entryDateStart != '' ">
+                AND T1.entry_date &gt;= DATE_FORMAT(#{salesLedgerDto.entryDateStart},'%Y-%m-%d')
+            </if>
+            <if test="salesLedgerDto.entryDateEnd != null and salesLedgerDto.entryDateEnd != '' ">
+                AND  T1.entry_date &lt;= DATE_FORMAT(#{salesLedgerDto.entryDateEnd},'%Y-%m-%d')
+            </if>
+        </where>
+        GROUP BY T2.id
+    </select>
+    <select id="list" resultType="com.ruoyi.production.dto.SalesLedgerSchedulingDto">
+        SELECT
+            T2.id,
+            ifNull(sum(t3.scheduling_num),0) AS schedulingNum,
+            T1.sales_contract_no,
+            T1.customer_contract_no,
+            T1.project_name,
+            T1.entry_date,
+            T1.customer_name,
+            T2.quantity,
+            T2.product_category,
+            T2.specification_model,
+            T2.unit
+        FROM
+            sales_ledger_product T2
+                LEFT JOIN sales_ledger T1 ON T1.id = T2.sales_ledger_id
+                LEFT join sales_ledger_scheduling t3 on T1.id = t3.sales_ledger_id
+        where T1.id is not null
+        GROUP BY T2.id
+    </select>
+    <select id="listPageProcess" resultType="com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto">
+        SELECT
+        t3.id as salesLedgerProductId,
+        T1.id as salesLedgerId,
+        T2.id,
+        T2.status,
+        T2.scheduling_user_id,
+        T2.scheduling_user_name,
+        T2.scheduling_date,
+        ifNull(T2.scheduling_num,0) AS schedulingNum,
+        T1.sales_contract_no,
+        T1.customer_contract_no,
+        T1.project_name,
+        T1.customer_name,
+        t3.product_category,
+        t3.specification_model,
+        t3.unit
+        FROM
+        sales_ledger_scheduling T2
+        LEFT JOIN sales_ledger T1 ON T1.id = T2.sales_ledger_id
+        left join sales_ledger_product t3 on T2.sales_ledger_product_id = t3.id
+        <where>
+            1 = 1
+            <if test="salesLedgerDto.status != null and salesLedgerDto.status != '' ">
+                AND  T2.status = #{salesLedgerDto.status}
+            </if>
+            <if test="salesLedgerDto.customerName != null and salesLedgerDto.customerName != '' ">
+                AND  T1.customer_name LIKE CONCAT('%',#{salesLedgerDto.customerName},'%')
+            </if>
+            <if test="salesLedgerDto.customerContractNo != null and salesLedgerDto.customerContractNo !='' ">
+                AND  T1.customer_contract_no LIKE CONCAT('%',#{salesLedgerDto.customerContractNo},'%')
+            </if>
+            <if test="salesLedgerDto.salesContractNo != null and salesLedgerDto.salesContractNo != '' ">
+                AND  T1.sales_contract_no LIKE CONCAT('%',#{salesLedgerDto.salesContractNo},'%')
+            </if>
+            <if test="salesLedgerDto.projectName != null and salesLedgerDto.projectName != '' ">
+                AND T1.project_name LIKE CONCAT('%',#{salesLedgerDto.projectName},'%')
+            </if>
+            <if test="salesLedgerDto.schedulingDateStart != null and salesLedgerDto.schedulingDateStart != '' ">
+                AND T2.scheduling_date &gt;= DATE_FORMAT(#{salesLedgerDto.entryDateStart},'%Y-%m-%d')
+            </if>
+            <if test="salesLedgerDto.schedulingDateEnd != null and salesLedgerDto.schedulingDateEnd != '' ">
+                AND  T2.scheduling_date &lt;= DATE_FORMAT(#{salesLedgerDto.entryDateEnd},'%Y-%m-%d')
+            </if>
+        </where>
+        order by T2.update_time desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/production/SalesLedgerWorkMapper.xml b/src/main/resources/mapper/production/SalesLedgerWorkMapper.xml
new file mode 100644
index 0000000..e2c884b
--- /dev/null
+++ b/src/main/resources/mapper/production/SalesLedgerWorkMapper.xml
@@ -0,0 +1,53 @@
+<?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.production.mapper.SalesLedgerWorkMapper">
+
+    <select id="listPage" resultType="com.ruoyi.production.dto.SalesLedgerWorkDto">
+        SELECT
+        t4.id,
+        t4.status,
+        t4.scheduling_user_id,
+        t4.scheduling_user_name,
+        t4.scheduling_date,
+        t4.scheduling_num,
+        t4.finished_num,
+        t4.work_hours,
+        t4.process,
+        T1.sales_contract_no,
+        T1.customer_contract_no,
+        T1.project_name,
+        T1.customer_name,
+        t3.product_category,
+        t3.specification_model,
+        t3.unit
+        FROM
+        sales_ledger_work t4
+        LEFT JOIN sales_ledger T1 ON T1.id = t4.sales_ledger_id
+        left join sales_ledger_product t3 on t4.sales_ledger_product_id = t3.id
+        <where>
+            1 = 1
+            <if test="salesLedgerDto.status != null and salesLedgerDto.status != '' ">
+                AND  t4.status = #{salesLedgerDto.status}
+            </if>
+            <if test="salesLedgerDto.customerName != null and salesLedgerDto.customerName != '' ">
+                AND  T1.customer_name LIKE CONCAT('%',#{salesLedgerDto.customerName},'%')
+            </if>
+            <if test="salesLedgerDto.customerContractNo != null and salesLedgerDto.customerContractNo !='' ">
+                AND  T1.customer_contract_no LIKE CONCAT('%',#{salesLedgerDto.customerContractNo},'%')
+            </if>
+            <if test="salesLedgerDto.salesContractNo != null and salesLedgerDto.salesContractNo != '' ">
+                AND  T1.sales_contract_no LIKE CONCAT('%',#{salesLedgerDto.salesContractNo},'%')
+            </if>
+            <if test="salesLedgerDto.projectName != null and salesLedgerDto.projectName != '' ">
+                AND T1.project_name LIKE CONCAT('%',#{salesLedgerDto.projectName},'%')
+            </if>
+            <if test="salesLedgerDto.schedulingDateStart != null and salesLedgerDto.schedulingDateStart != '' ">
+                AND t4.scheduling_date &gt;= DATE_FORMAT(#{salesLedgerDto.entryDateStart},'%Y-%m-%d')
+            </if>
+            <if test="salesLedgerDto.schedulingDateEnd != null and salesLedgerDto.schedulingDateEnd != '' ">
+                AND  t4.scheduling_date &lt;= DATE_FORMAT(#{salesLedgerDto.entryDateEnd},'%Y-%m-%d')
+            </if>
+        </where>
+        order by t4.update_time desc
+    </select>
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.3