From 411f3275d09e2963eb1150b0c9dd559a4abfd9e3 Mon Sep 17 00:00:00 2001
From: wujianwei <wjw@11.com>
Date: 星期三, 13 八月 2025 14:38:08 +0800
Subject: [PATCH] 新增日志

---
 service/src/main/resources/mapper/cwgl/EstimatedReceivableLogMapper.xml                      |  113 +++
 service/src/main/java/com/ruoyi/cwgl/service/IEstimatedReceivableBillLogService.java         |  102 +++
 service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableBillLogServiceImpl.java |  181 +++++
 service/src/main/java/com/ruoyi/cwgl/domain/EstimatedReceivableLog.java                      |   48 +
 service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableServiceImpl.java        |   73 ++
 service/src/main/java/com/ruoyi/cwgl/service/IEstimatedReceivableService.java                |   21 
 ui/admin-ui3/src/api/cwgl/estimatedReceivableLog.ts                                          |   67 ++
 service/src/main/java/com/ruoyi/cwgl/domain/EstimatedReceivableBillLog.java                  |   48 +
 service/src/main/java/com/ruoyi/cwgl/mapper/EstimatedReceivableBillLogMapper.java            |   87 ++
 service/src/main/java/com/ruoyi/cwgl/controller/EstimatedReceivableLogController.java        |  108 +++
 service/src/main/resources/mapper/cwgl/EstimatedReceivableBillLogMapper.xml                  |  113 +++
 ui/admin-ui3/src/api/cwgl/estimatedReceivableBillLog.ts                                      |   67 ++
 service/src/main/java/com/ruoyi/cwgl/controller/EstimatedReceivableBillLogController.java    |  108 +++
 service/src/main/java/com/ruoyi/cwgl/controller/EstimatedReceivableController.java           |   30 
 service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableLogServiceImpl.java     |  194 ++++++
 ui/admin-ui3/src/views/cwgl/estimatedReceivableBillLog/index.vue                             |  127 ++++
 service/src/main/java/com/ruoyi/cwgl/service/IEstimatedReceivableLogService.java             |  104 +++
 service/src/main/java/com/ruoyi/cwgl/mapper/EstimatedReceivableLogMapper.java                |   87 ++
 ui/admin-ui3/src/views/cwgl/estimatedReceivableLog/index.vue                                 |  127 ++++
 19 files changed, 1,804 insertions(+), 1 deletions(-)

diff --git a/service/src/main/java/com/ruoyi/cwgl/controller/EstimatedReceivableBillLogController.java b/service/src/main/java/com/ruoyi/cwgl/controller/EstimatedReceivableBillLogController.java
new file mode 100644
index 0000000..556bd9c
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/controller/EstimatedReceivableBillLogController.java
@@ -0,0 +1,108 @@
+package com.ruoyi.cwgl.controller;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.utils.file.DownloadExportUtil;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.cwgl.domain.EstimatedReceivableBillLog;
+import com.ruoyi.cwgl.service.IEstimatedReceivableBillLogService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 棰勪及搴旀敹璐﹀崟鏃ュ織Controller
+ *
+ * @author ruoyi
+ * @date 2025-08-13
+ */
+@RestController
+@RequestMapping("/cwgl/estimatedReceivableBillLog")
+public class EstimatedReceivableBillLogController extends BaseController
+{
+    @Autowired
+    private IEstimatedReceivableBillLogService estimatedReceivableBillLogService;
+
+
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹璐﹀崟鏃ュ織鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:estimatedReceivableBillLog:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(EstimatedReceivableBillLog estimatedReceivableBillLog)
+    {
+        startPage();
+        List<EstimatedReceivableBillLog> list = estimatedReceivableBillLogService.selectEstimatedReceivableBillLogList(estimatedReceivableBillLog);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭棰勪及搴旀敹璐﹀崟鏃ュ織鍒楄〃
+     * @param estimatedReceivableBillLog 鏌ヨ鏉′欢瀵硅薄
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:estimatedReceivableBillLog:export')")
+    @Log(title = "棰勪及搴旀敹璐﹀崟鏃ュ織", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(EstimatedReceivableBillLog estimatedReceivableBillLog,String exportKey)
+    {
+        estimatedReceivableBillLogService.export(estimatedReceivableBillLog,exportKey);
+        return AjaxResult.success("瀵煎嚭璇锋眰鎴愬姛锛岃绋嶅悗鐐瑰嚮涓嬭浇...!");
+    }
+
+
+
+    /**
+     * 鑾峰彇棰勪及搴旀敹璐﹀崟鏃ュ織璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:estimatedReceivableBillLog:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Integer id)
+    {
+        return AjaxResult.success(estimatedReceivableBillLogService.selectEstimatedReceivableBillLogById(id));
+    }
+
+    /**
+     * 鏂板棰勪及搴旀敹璐﹀崟鏃ュ織
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:estimatedReceivableBillLog:add')")
+    @Log(title = "棰勪及搴旀敹璐﹀崟鏃ュ織", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody EstimatedReceivableBillLog estimatedReceivableBillLog)
+    {
+        return toAjax(estimatedReceivableBillLogService.insertEstimatedReceivableBillLog(estimatedReceivableBillLog));
+    }
+
+    /**
+     * 淇敼棰勪及搴旀敹璐﹀崟鏃ュ織
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:estimatedReceivableBillLog:edit')")
+    @Log(title = "棰勪及搴旀敹璐﹀崟鏃ュ織", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody EstimatedReceivableBillLog estimatedReceivableBillLog)
+    {
+        return toAjax(estimatedReceivableBillLogService.updateEstimatedReceivableBillLog(estimatedReceivableBillLog));
+    }
+
+    /**
+     * 鍒犻櫎棰勪及搴旀敹璐﹀崟鏃ュ織
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:estimatedReceivableBillLog:remove')")
+    @Log(title = "棰勪及搴旀敹璐﹀崟鏃ュ織", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Integer[] ids)
+    {
+        return toAjax(estimatedReceivableBillLogService.deleteEstimatedReceivableBillLogByIds(ids));
+    }
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/controller/EstimatedReceivableController.java b/service/src/main/java/com/ruoyi/cwgl/controller/EstimatedReceivableController.java
index 736e2be..fc08480 100644
--- a/service/src/main/java/com/ruoyi/cwgl/controller/EstimatedReceivableController.java
+++ b/service/src/main/java/com/ruoyi/cwgl/controller/EstimatedReceivableController.java
@@ -74,6 +74,36 @@
     }
 
     /**
+     * 纭
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:estimatedReceivable:confirm')")
+    @GetMapping(value = "confirm/{id}")
+    public AjaxResult confirm(@PathVariable("id") Integer id)
+    {
+        return toAjax(estimatedReceivableService.confirm(id));
+    }
+
+    /**
+     * 鍙栨秷
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:estimatedReceivable:cancel')")
+    @GetMapping(value = "cancel/{id}")
+    public AjaxResult cancel(@PathVariable("id") Integer id)
+    {
+        return toAjax(estimatedReceivableService.cancel(id));
+    }
+
+    /**
+     * 浣滃簾
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:estimatedReceivable:invalid')")
+    @GetMapping(value = "invalid/{id}")
+    public AjaxResult invalid(@PathVariable("id") Integer id)
+    {
+        return toAjax(estimatedReceivableService.invalid(id));
+    }
+
+    /**
      * 鏂板棰勪及搴旀敹绠$悊
      */
     @PreAuthorize("@ss.hasPermi('cwgl:estimatedReceivable:add')")
diff --git a/service/src/main/java/com/ruoyi/cwgl/controller/EstimatedReceivableLogController.java b/service/src/main/java/com/ruoyi/cwgl/controller/EstimatedReceivableLogController.java
new file mode 100644
index 0000000..3cc4bde
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/controller/EstimatedReceivableLogController.java
@@ -0,0 +1,108 @@
+package com.ruoyi.cwgl.controller;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.utils.file.DownloadExportUtil;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.cwgl.domain.EstimatedReceivableLog;
+import com.ruoyi.cwgl.service.IEstimatedReceivableLogService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 棰勪及搴旀敹绠$悊鏃ュ織Controller
+ *
+ * @author ruoyi
+ * @date 2025-08-13
+ */
+@RestController
+@RequestMapping("/cwgl/estimatedReceivableLog")
+public class EstimatedReceivableLogController extends BaseController
+{
+    @Autowired
+    private IEstimatedReceivableLogService estimatedReceivableLogService;
+
+
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹绠$悊鏃ュ織鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:estimatedReceivableLog:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(EstimatedReceivableLog estimatedReceivableLog)
+    {
+        startPage();
+        List<EstimatedReceivableLog> list = estimatedReceivableLogService.selectEstimatedReceivableLogList(estimatedReceivableLog);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭棰勪及搴旀敹绠$悊鏃ュ織鍒楄〃
+     * @param estimatedReceivableLog 鏌ヨ鏉′欢瀵硅薄
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:estimatedReceivableLog:export')")
+    @Log(title = "棰勪及搴旀敹绠$悊鏃ュ織", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(EstimatedReceivableLog estimatedReceivableLog,String exportKey)
+    {
+        estimatedReceivableLogService.export(estimatedReceivableLog,exportKey);
+        return AjaxResult.success("瀵煎嚭璇锋眰鎴愬姛锛岃绋嶅悗鐐瑰嚮涓嬭浇...!");
+    }
+
+
+
+    /**
+     * 鑾峰彇棰勪及搴旀敹绠$悊鏃ュ織璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:estimatedReceivableLog:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Integer id)
+    {
+        return AjaxResult.success(estimatedReceivableLogService.selectEstimatedReceivableLogById(id));
+    }
+
+    /**
+     * 鏂板棰勪及搴旀敹绠$悊鏃ュ織
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:estimatedReceivableLog:add')")
+    @Log(title = "棰勪及搴旀敹绠$悊鏃ュ織", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody EstimatedReceivableLog estimatedReceivableLog)
+    {
+        return toAjax(estimatedReceivableLogService.insertEstimatedReceivableLog(estimatedReceivableLog));
+    }
+
+    /**
+     * 淇敼棰勪及搴旀敹绠$悊鏃ュ織
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:estimatedReceivableLog:edit')")
+    @Log(title = "棰勪及搴旀敹绠$悊鏃ュ織", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody EstimatedReceivableLog estimatedReceivableLog)
+    {
+        return toAjax(estimatedReceivableLogService.updateEstimatedReceivableLog(estimatedReceivableLog));
+    }
+
+    /**
+     * 鍒犻櫎棰勪及搴旀敹绠$悊鏃ュ織
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:estimatedReceivableLog:remove')")
+    @Log(title = "棰勪及搴旀敹绠$悊鏃ュ織", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Integer[] ids)
+    {
+        return toAjax(estimatedReceivableLogService.deleteEstimatedReceivableLogByIds(ids));
+    }
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/domain/EstimatedReceivableBillLog.java b/service/src/main/java/com/ruoyi/cwgl/domain/EstimatedReceivableBillLog.java
new file mode 100644
index 0000000..7c729bd
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/domain/EstimatedReceivableBillLog.java
@@ -0,0 +1,48 @@
+package com.ruoyi.cwgl.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.annotation.Excel;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.util.Date;
+import lombok.Data;
+/**
+ * 棰勪及搴旀敹璐﹀崟鏃ュ織瀵硅薄 estimated_receivable_bill_log
+ *
+ * @author ruoyi
+ * @date 2025-08-13
+ */
+@Data
+public class EstimatedReceivableBillLog{
+
+
+    /** 涓婚敭 */
+        @TableField("id")
+    private Integer id;
+
+
+    /** 璐﹀崟id */
+    @Excel(name = "璐﹀崟id")
+
+        @TableField("bill_id")
+    private Integer billId;
+
+
+    /** 鍒涘缓鑰� */
+        @TableField("create_by")
+    private String createBy;
+
+
+    /** 鍒涘缓鏃堕棿 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        @TableField("create_time")
+    private Date createTime;
+
+
+    /** 鎿嶄綔璇存槑 */
+    @Excel(name = "鎿嶄綔璇存槑")
+
+        @TableField("operation")
+    private String operation;
+
+
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/domain/EstimatedReceivableLog.java b/service/src/main/java/com/ruoyi/cwgl/domain/EstimatedReceivableLog.java
new file mode 100644
index 0000000..3d37162
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/domain/EstimatedReceivableLog.java
@@ -0,0 +1,48 @@
+package com.ruoyi.cwgl.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.annotation.Excel;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.util.Date;
+import lombok.Data;
+/**
+ * 棰勪及搴旀敹绠$悊鏃ュ織瀵硅薄 estimated_receivable_log
+ *
+ * @author ruoyi
+ * @date 2025-08-13
+ */
+@Data
+public class EstimatedReceivableLog{
+
+
+    /** 涓婚敭 */
+        @TableField("id")
+    private Integer id;
+
+
+    /** 棰勪及搴旀敹绠$悊琛╥d */
+    @Excel(name = "棰勪及搴旀敹绠$悊琛╥d")
+
+        @TableField("estimated_id")
+    private Integer estimatedId;
+
+
+    /** 鍒涘缓鑰� */
+        @TableField("create_by")
+    private String createBy;
+
+
+    /** 鍒涘缓鏃堕棿 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField("create_time")
+    private Date createTime;
+
+
+    /** 鎿嶄綔璇存槑 */
+    @Excel(name = "鎿嶄綔璇存槑")
+
+        @TableField("operation")
+    private String operation;
+
+
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/mapper/EstimatedReceivableBillLogMapper.java b/service/src/main/java/com/ruoyi/cwgl/mapper/EstimatedReceivableBillLogMapper.java
new file mode 100644
index 0000000..850b4bc
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/mapper/EstimatedReceivableBillLogMapper.java
@@ -0,0 +1,87 @@
+package com.ruoyi.cwgl.mapper;
+
+import java.util.List;
+import com.ruoyi.cwgl.domain.EstimatedReceivableBillLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * 棰勪及搴旀敹璐﹀崟鏃ュ織Mapper鎺ュ彛
+ * 
+ * @author ruoyi
+ * @date 2025-08-13
+ */
+public interface EstimatedReceivableBillLogMapper  extends BaseMapper<EstimatedReceivableBillLog>
+{
+    /**
+     * 鏌ヨ棰勪及搴旀敹璐﹀崟鏃ュ織
+     * 
+     * @param id 棰勪及搴旀敹璐﹀崟鏃ュ織ID
+     * @return 棰勪及搴旀敹璐﹀崟鏃ュ織
+     */
+    public EstimatedReceivableBillLog selectEstimatedReceivableBillLogById(Integer id);
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹璐﹀崟鏃ュ織 璁板綍鏁�
+     *
+     * @param estimatedReceivableBillLog 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 棰勪及搴旀敹璐﹀崟鏃ュ織闆嗗悎
+     */
+    public int selectEstimatedReceivableBillLogCount(EstimatedReceivableBillLog estimatedReceivableBillLog);
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹璐﹀崟鏃ュ織鍒楄〃
+     * 
+     * @param estimatedReceivableBillLog 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 棰勪及搴旀敹璐﹀崟鏃ュ織闆嗗悎
+     */
+    public List<EstimatedReceivableBillLog> selectEstimatedReceivableBillLogList(EstimatedReceivableBillLog estimatedReceivableBillLog);
+
+    /**
+     * 鏂板棰勪及搴旀敹璐﹀崟鏃ュ織
+     * 
+     * @param estimatedReceivableBillLog 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 缁撴灉
+     */
+    public int insertEstimatedReceivableBillLog(EstimatedReceivableBillLog estimatedReceivableBillLog);
+
+    /**
+     * 鏂板棰勪及搴旀敹璐﹀崟鏃ュ織[鎵归噺]
+     *
+     * @param estimatedReceivableBillLogs 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 缁撴灉
+     */
+    public int insertEstimatedReceivableBillLogBatch(List<EstimatedReceivableBillLog> estimatedReceivableBillLogs);
+
+    /**
+     * 淇敼棰勪及搴旀敹璐﹀崟鏃ュ織
+     * 
+     * @param estimatedReceivableBillLog 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 缁撴灉
+     */
+    public int updateEstimatedReceivableBillLog(EstimatedReceivableBillLog estimatedReceivableBillLog);
+
+    /**
+     * 淇敼棰勪及搴旀敹璐﹀崟鏃ュ織[鎵归噺]
+     *
+     * @param estimatedReceivableBillLogs 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 缁撴灉
+     */
+    public int updateEstimatedReceivableBillLogBatch(List<EstimatedReceivableBillLog> estimatedReceivableBillLogs);
+
+    /**
+     * 鍒犻櫎棰勪及搴旀敹璐﹀崟鏃ュ織
+     * 
+     * @param id 棰勪及搴旀敹璐﹀崟鏃ュ織ID
+     * @return 缁撴灉
+     */
+    public int deleteEstimatedReceivableBillLogById(Integer id);
+
+    /**
+     * 鎵归噺鍒犻櫎棰勪及搴旀敹璐﹀崟鏃ュ織
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteEstimatedReceivableBillLogByIds(Integer[] ids);
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/mapper/EstimatedReceivableLogMapper.java b/service/src/main/java/com/ruoyi/cwgl/mapper/EstimatedReceivableLogMapper.java
new file mode 100644
index 0000000..31bd426
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/mapper/EstimatedReceivableLogMapper.java
@@ -0,0 +1,87 @@
+package com.ruoyi.cwgl.mapper;
+
+import java.util.List;
+import com.ruoyi.cwgl.domain.EstimatedReceivableLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * 棰勪及搴旀敹绠$悊鏃ュ織Mapper鎺ュ彛
+ * 
+ * @author ruoyi
+ * @date 2025-08-13
+ */
+public interface EstimatedReceivableLogMapper  extends BaseMapper<EstimatedReceivableLog>
+{
+    /**
+     * 鏌ヨ棰勪及搴旀敹绠$悊鏃ュ織
+     * 
+     * @param id 棰勪及搴旀敹绠$悊鏃ュ織ID
+     * @return 棰勪及搴旀敹绠$悊鏃ュ織
+     */
+    public EstimatedReceivableLog selectEstimatedReceivableLogById(Integer id);
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹绠$悊鏃ュ織 璁板綍鏁�
+     *
+     * @param estimatedReceivableLog 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 棰勪及搴旀敹绠$悊鏃ュ織闆嗗悎
+     */
+    public int selectEstimatedReceivableLogCount(EstimatedReceivableLog estimatedReceivableLog);
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹绠$悊鏃ュ織鍒楄〃
+     * 
+     * @param estimatedReceivableLog 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 棰勪及搴旀敹绠$悊鏃ュ織闆嗗悎
+     */
+    public List<EstimatedReceivableLog> selectEstimatedReceivableLogList(EstimatedReceivableLog estimatedReceivableLog);
+
+    /**
+     * 鏂板棰勪及搴旀敹绠$悊鏃ュ織
+     * 
+     * @param estimatedReceivableLog 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 缁撴灉
+     */
+    public int insertEstimatedReceivableLog(EstimatedReceivableLog estimatedReceivableLog);
+
+    /**
+     * 鏂板棰勪及搴旀敹绠$悊鏃ュ織[鎵归噺]
+     *
+     * @param estimatedReceivableLogs 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 缁撴灉
+     */
+    public int insertEstimatedReceivableLogBatch(List<EstimatedReceivableLog> estimatedReceivableLogs);
+
+    /**
+     * 淇敼棰勪及搴旀敹绠$悊鏃ュ織
+     * 
+     * @param estimatedReceivableLog 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 缁撴灉
+     */
+    public int updateEstimatedReceivableLog(EstimatedReceivableLog estimatedReceivableLog);
+
+    /**
+     * 淇敼棰勪及搴旀敹绠$悊鏃ュ織[鎵归噺]
+     *
+     * @param estimatedReceivableLogs 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 缁撴灉
+     */
+    public int updateEstimatedReceivableLogBatch(List<EstimatedReceivableLog> estimatedReceivableLogs);
+
+    /**
+     * 鍒犻櫎棰勪及搴旀敹绠$悊鏃ュ織
+     * 
+     * @param id 棰勪及搴旀敹绠$悊鏃ュ織ID
+     * @return 缁撴灉
+     */
+    public int deleteEstimatedReceivableLogById(Integer id);
+
+    /**
+     * 鎵归噺鍒犻櫎棰勪及搴旀敹绠$悊鏃ュ織
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteEstimatedReceivableLogByIds(Integer[] ids);
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/IEstimatedReceivableBillLogService.java b/service/src/main/java/com/ruoyi/cwgl/service/IEstimatedReceivableBillLogService.java
new file mode 100644
index 0000000..63747c1
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/service/IEstimatedReceivableBillLogService.java
@@ -0,0 +1,102 @@
+package com.ruoyi.cwgl.service;
+
+import java.util.List;
+import com.ruoyi.cwgl.domain.EstimatedReceivableBillLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+/**
+ * 棰勪及搴旀敹璐﹀崟鏃ュ織Service鎺ュ彛
+ * 
+ * @author ruoyi
+ * @date 2025-08-13
+ */
+public interface IEstimatedReceivableBillLogService extends IService<EstimatedReceivableBillLog>
+{
+    /**
+     * 鏌ヨ棰勪及搴旀敹璐﹀崟鏃ュ織
+     * 
+     * @param id 棰勪及搴旀敹璐﹀崟鏃ュ織ID
+     * @return 棰勪及搴旀敹璐﹀崟鏃ュ織
+     */
+    public EstimatedReceivableBillLog selectEstimatedReceivableBillLogById(Integer id);
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹璐﹀崟鏃ュ織 璁板綍鏁�
+     *
+     * @param estimatedReceivableBillLog 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 棰勪及搴旀敹璐﹀崟鏃ュ織闆嗗悎
+     */
+    public int selectEstimatedReceivableBillLogCount(EstimatedReceivableBillLog estimatedReceivableBillLog);
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹璐﹀崟鏃ュ織鍒楄〃
+     * 
+     * @param estimatedReceivableBillLog 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 棰勪及搴旀敹璐﹀崟鏃ュ織闆嗗悎
+     */
+    public List<EstimatedReceivableBillLog> selectEstimatedReceivableBillLogList(EstimatedReceivableBillLog estimatedReceivableBillLog);
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹璐﹀崟鏃ュ織鍒楄〃 寮傛 瀵煎嚭
+     *
+     * @param estimatedReceivableBillLog 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @param exportKey 瀵煎嚭鍔熻兘鐨勫敮涓�鏍囪瘑
+     * @return 棰勪及搴旀敹璐﹀崟鏃ュ織闆嗗悎
+     */
+    public void export(EstimatedReceivableBillLog estimatedReceivableBillLog, String exportKey) ;
+
+
+    /**
+     * 鏂板棰勪及搴旀敹璐﹀崟鏃ュ織
+     * 
+     * @param estimatedReceivableBillLog 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 缁撴灉
+     */
+    public int insertEstimatedReceivableBillLog(EstimatedReceivableBillLog estimatedReceivableBillLog);
+
+    /**
+     * 鏂板棰勪及搴旀敹璐﹀崟鏃ュ織[鎵归噺]
+     *
+     * @param estimatedReceivableBillLogs 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 缁撴灉
+     */
+    public int insertEstimatedReceivableBillLogBatch(List<EstimatedReceivableBillLog> estimatedReceivableBillLogs);
+
+    /**
+     * 淇敼棰勪及搴旀敹璐﹀崟鏃ュ織
+     * 
+     * @param estimatedReceivableBillLog 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 缁撴灉
+     */
+    public int updateEstimatedReceivableBillLog(EstimatedReceivableBillLog estimatedReceivableBillLog);
+
+    /**
+     * 淇敼棰勪及搴旀敹璐﹀崟鏃ュ織[鎵归噺]
+     *
+     * @param estimatedReceivableBillLogs 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 缁撴灉
+     */
+    public int updateEstimatedReceivableBillLogBatch(List<EstimatedReceivableBillLog> estimatedReceivableBillLogs);
+    /**
+     * 鎵归噺鍒犻櫎棰勪及搴旀敹璐﹀崟鏃ュ織
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteEstimatedReceivableBillLogByIds(String ids);
+
+    /**
+     * 鎵归噺鍒犻櫎棰勪及搴旀敹璐﹀崟鏃ュ織
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteEstimatedReceivableBillLogByIds(Integer[] ids);
+
+    /**
+     * 鍒犻櫎棰勪及搴旀敹璐﹀崟鏃ュ織淇℃伅
+     * 
+     * @param id 棰勪及搴旀敹璐﹀崟鏃ュ織ID
+     * @return 缁撴灉
+     */
+    public int deleteEstimatedReceivableBillLogById(Integer id);
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/IEstimatedReceivableLogService.java b/service/src/main/java/com/ruoyi/cwgl/service/IEstimatedReceivableLogService.java
new file mode 100644
index 0000000..2965182
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/service/IEstimatedReceivableLogService.java
@@ -0,0 +1,104 @@
+package com.ruoyi.cwgl.service;
+
+import java.util.List;
+import com.ruoyi.cwgl.domain.EstimatedReceivableLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+/**
+ * 棰勪及搴旀敹绠$悊鏃ュ織Service鎺ュ彛
+ * 
+ * @author ruoyi
+ * @date 2025-08-13
+ */
+public interface IEstimatedReceivableLogService extends IService<EstimatedReceivableLog>
+{
+    /**
+     * 鏌ヨ棰勪及搴旀敹绠$悊鏃ュ織
+     * 
+     * @param id 棰勪及搴旀敹绠$悊鏃ュ織ID
+     * @return 棰勪及搴旀敹绠$悊鏃ュ織
+     */
+    public EstimatedReceivableLog selectEstimatedReceivableLogById(Integer id);
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹绠$悊鏃ュ織 璁板綍鏁�
+     *
+     * @param estimatedReceivableLog 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 棰勪及搴旀敹绠$悊鏃ュ織闆嗗悎
+     */
+    public int selectEstimatedReceivableLogCount(EstimatedReceivableLog estimatedReceivableLog);
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹绠$悊鏃ュ織鍒楄〃
+     * 
+     * @param estimatedReceivableLog 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 棰勪及搴旀敹绠$悊鏃ュ織闆嗗悎
+     */
+    public List<EstimatedReceivableLog> selectEstimatedReceivableLogList(EstimatedReceivableLog estimatedReceivableLog);
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹绠$悊鏃ュ織鍒楄〃 寮傛 瀵煎嚭
+     *
+     * @param estimatedReceivableLog 棰勪及搴旀敹绠$悊鏃ュ織
+     * @param exportKey 瀵煎嚭鍔熻兘鐨勫敮涓�鏍囪瘑
+     * @return 棰勪及搴旀敹绠$悊鏃ュ織闆嗗悎
+     */
+    public void export(EstimatedReceivableLog estimatedReceivableLog, String exportKey) ;
+
+
+    /**
+     * 鏂板棰勪及搴旀敹绠$悊鏃ュ織
+     * 
+     * @param estimatedReceivableLog 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 缁撴灉
+     */
+    public int insertEstimatedReceivableLog(EstimatedReceivableLog estimatedReceivableLog);
+
+    /**
+     * 鏂板棰勪及搴旀敹绠$悊鏃ュ織[鎵归噺]
+     *
+     * @param estimatedReceivableLogs 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 缁撴灉
+     */
+    public int insertEstimatedReceivableLogBatch(List<EstimatedReceivableLog> estimatedReceivableLogs);
+
+    /**
+     * 淇敼棰勪及搴旀敹绠$悊鏃ュ織
+     * 
+     * @param estimatedReceivableLog 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 缁撴灉
+     */
+    public int updateEstimatedReceivableLog(EstimatedReceivableLog estimatedReceivableLog);
+
+    /**
+     * 淇敼棰勪及搴旀敹绠$悊鏃ュ織[鎵归噺]
+     *
+     * @param estimatedReceivableLogs 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 缁撴灉
+     */
+    public int updateEstimatedReceivableLogBatch(List<EstimatedReceivableLog> estimatedReceivableLogs);
+    /**
+     * 鎵归噺鍒犻櫎棰勪及搴旀敹绠$悊鏃ュ織
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteEstimatedReceivableLogByIds(String ids);
+
+    /**
+     * 鎵归噺鍒犻櫎棰勪及搴旀敹绠$悊鏃ュ織
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteEstimatedReceivableLogByIds(Integer[] ids);
+
+    /**
+     * 鍒犻櫎棰勪及搴旀敹绠$悊鏃ュ織淇℃伅
+     * 
+     * @param id 棰勪及搴旀敹绠$悊鏃ュ織ID
+     * @return 缁撴灉
+     */
+    public int deleteEstimatedReceivableLogById(Integer id);
+
+    void insertEstimatedReceivableLog(String operation, Integer id,String userName);
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/IEstimatedReceivableService.java b/service/src/main/java/com/ruoyi/cwgl/service/IEstimatedReceivableService.java
index 67f14d0..6d12e19 100644
--- a/service/src/main/java/com/ruoyi/cwgl/service/IEstimatedReceivableService.java
+++ b/service/src/main/java/com/ruoyi/cwgl/service/IEstimatedReceivableService.java
@@ -99,4 +99,25 @@
      * @return 缁撴灉
      */
     public int deleteEstimatedReceivableById(Integer id);
+
+    /**
+     * 纭
+     * @param id
+     * @return
+     */
+    int confirm(Integer id);
+
+    /**
+     * 鍙栨秷
+     * @param id
+     * @return
+     */
+    int cancel(Integer id);
+
+    /**
+     * 浣滃簾
+     * @param id
+     * @return
+     */
+    int invalid(Integer id);
 }
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableBillLogServiceImpl.java b/service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableBillLogServiceImpl.java
new file mode 100644
index 0000000..fde855a
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableBillLogServiceImpl.java
@@ -0,0 +1,181 @@
+package com.ruoyi.cwgl.service.impl;
+
+import java.util.List;
+
+import com.ruoyi.common.utils.DateUtils;
+import javax.annotation.Resource;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.stereotype.Service;
+import org.springframework.scheduling.annotation.Async;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import com.ruoyi.common.utils.PageUtils;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.annotation.DataSource;
+import com.ruoyi.common.enums.DataSourceType;
+import com.ruoyi.common.core.service.BaseService;
+
+import com.ruoyi.cwgl.mapper.EstimatedReceivableBillLogMapper;
+import com.ruoyi.cwgl.domain.EstimatedReceivableBillLog;
+import com.ruoyi.cwgl.service.IEstimatedReceivableBillLogService;
+import com.ruoyi.common.core.text.Convert;
+
+/**
+ * 棰勪及搴旀敹璐﹀崟鏃ュ織Service涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2025-08-13
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class EstimatedReceivableBillLogServiceImpl  extends BaseService<EstimatedReceivableBillLogMapper, EstimatedReceivableBillLog> implements IEstimatedReceivableBillLogService
+{
+    protected final Logger logger = LoggerFactory.getLogger(getClass());
+    @Resource
+    private EstimatedReceivableBillLogMapper estimatedReceivableBillLogMapper;
+
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹璐﹀崟鏃ュ織
+     *
+     * @param id 棰勪及搴旀敹璐﹀崟鏃ュ織ID
+     * @return 棰勪及搴旀敹璐﹀崟鏃ュ織
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public EstimatedReceivableBillLog selectEstimatedReceivableBillLogById(Integer id)
+    {
+        return estimatedReceivableBillLogMapper.selectEstimatedReceivableBillLogById(id);
+    }
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹璐﹀崟鏃ュ織 璁板綍鏁�
+     *
+     * @param estimatedReceivableBillLog 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 棰勪及搴旀敹璐﹀崟鏃ュ織闆嗗悎
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public int selectEstimatedReceivableBillLogCount(EstimatedReceivableBillLog estimatedReceivableBillLog)
+    {
+        return estimatedReceivableBillLogMapper.selectEstimatedReceivableBillLogCount(estimatedReceivableBillLog);
+    }
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹璐﹀崟鏃ュ織鍒楄〃
+     *
+     * @param estimatedReceivableBillLog 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 棰勪及搴旀敹璐﹀崟鏃ュ織
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public List<EstimatedReceivableBillLog> selectEstimatedReceivableBillLogList(EstimatedReceivableBillLog estimatedReceivableBillLog)
+    {
+        return estimatedReceivableBillLogMapper.selectEstimatedReceivableBillLogList(estimatedReceivableBillLog);
+    }
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹璐﹀崟鏃ュ織鍒楄〃 寮傛 瀵煎嚭
+     *
+     * @param estimatedReceivableBillLog 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @param exportKey 瀵煎嚭鍔熻兘鐨勫敮涓�鏍囪瘑
+     * @return 棰勪及搴旀敹璐﹀崟鏃ュ織闆嗗悎
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Async
+    @Override
+    public void export(EstimatedReceivableBillLog estimatedReceivableBillLog,String exportKey) {
+
+        super.export(EstimatedReceivableBillLog.class,exportKey,"estimatedReceivableBillLogData",(pageNum)->{
+            PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE);
+            return selectEstimatedReceivableBillLogList(estimatedReceivableBillLog);
+        });
+    }
+
+
+    /**
+     * 鏂板棰勪及搴旀敹璐﹀崟鏃ュ織
+     *
+     * @param estimatedReceivableBillLog 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertEstimatedReceivableBillLog(EstimatedReceivableBillLog estimatedReceivableBillLog)
+    {
+        estimatedReceivableBillLog.setCreateTime(DateUtils.getNowDate());
+        return estimatedReceivableBillLogMapper.insertEstimatedReceivableBillLog(estimatedReceivableBillLog);
+    }
+
+    /**
+     * 鏂板棰勪及搴旀敹璐﹀崟鏃ュ織[鎵归噺]
+     *
+     * @param estimatedReceivableBillLogs 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertEstimatedReceivableBillLogBatch(List<EstimatedReceivableBillLog> estimatedReceivableBillLogs)
+    {
+        int rows = estimatedReceivableBillLogMapper.insertEstimatedReceivableBillLogBatch(estimatedReceivableBillLogs);
+        return rows;
+    }
+
+    /**
+     * 淇敼棰勪及搴旀敹璐﹀崟鏃ュ織
+     *
+     * @param estimatedReceivableBillLog 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateEstimatedReceivableBillLog(EstimatedReceivableBillLog estimatedReceivableBillLog)
+    {
+        return estimatedReceivableBillLogMapper.updateEstimatedReceivableBillLog(estimatedReceivableBillLog);
+    }
+
+    /**
+     * 淇敼棰勪及搴旀敹璐﹀崟鏃ュ織[鎵归噺]
+     *
+     * @param estimatedReceivableBillLogs 棰勪及搴旀敹璐﹀崟鏃ュ織
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateEstimatedReceivableBillLogBatch(List<EstimatedReceivableBillLog> estimatedReceivableBillLogs){
+        return estimatedReceivableBillLogMapper.updateEstimatedReceivableBillLogBatch(estimatedReceivableBillLogs);
+    }
+
+    /**
+     * 鍒犻櫎棰勪及搴旀敹璐﹀崟鏃ュ織瀵硅薄
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteEstimatedReceivableBillLogByIds(String ids)
+    {
+        return deleteEstimatedReceivableBillLogByIds(Convert.toIntArray(ids));
+    }
+
+    /**
+     * 鍒犻櫎棰勪及搴旀敹璐﹀崟鏃ュ織瀵硅薄
+     *
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteEstimatedReceivableBillLogByIds(Integer[] ids)
+    {
+        return estimatedReceivableBillLogMapper.deleteEstimatedReceivableBillLogByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎棰勪及搴旀敹璐﹀崟鏃ュ織淇℃伅
+     *
+     * @param id 棰勪及搴旀敹璐﹀崟鏃ュ織ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteEstimatedReceivableBillLogById(Integer id)
+    {
+        return estimatedReceivableBillLogMapper.deleteEstimatedReceivableBillLogById(id);
+    }
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableLogServiceImpl.java b/service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableLogServiceImpl.java
new file mode 100644
index 0000000..3876dbf
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableLogServiceImpl.java
@@ -0,0 +1,194 @@
+package com.ruoyi.cwgl.service.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import com.ruoyi.common.utils.DateUtils;
+import javax.annotation.Resource;
+
+import com.ruoyi.common.utils.SecurityUtils;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.stereotype.Service;
+import org.springframework.scheduling.annotation.Async;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import com.ruoyi.common.utils.PageUtils;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.annotation.DataSource;
+import com.ruoyi.common.enums.DataSourceType;
+import com.ruoyi.common.core.service.BaseService;
+
+import com.ruoyi.cwgl.mapper.EstimatedReceivableLogMapper;
+import com.ruoyi.cwgl.domain.EstimatedReceivableLog;
+import com.ruoyi.cwgl.service.IEstimatedReceivableLogService;
+import com.ruoyi.common.core.text.Convert;
+
+/**
+ * 棰勪及搴旀敹绠$悊鏃ュ織Service涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2025-08-13
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class EstimatedReceivableLogServiceImpl  extends BaseService<EstimatedReceivableLogMapper, EstimatedReceivableLog> implements IEstimatedReceivableLogService
+{
+    protected final Logger logger = LoggerFactory.getLogger(getClass());
+    @Resource
+    private EstimatedReceivableLogMapper estimatedReceivableLogMapper;
+
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹绠$悊鏃ュ織
+     *
+     * @param id 棰勪及搴旀敹绠$悊鏃ュ織ID
+     * @return 棰勪及搴旀敹绠$悊鏃ュ織
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public EstimatedReceivableLog selectEstimatedReceivableLogById(Integer id)
+    {
+        return estimatedReceivableLogMapper.selectEstimatedReceivableLogById(id);
+    }
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹绠$悊鏃ュ織 璁板綍鏁�
+     *
+     * @param estimatedReceivableLog 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 棰勪及搴旀敹绠$悊鏃ュ織闆嗗悎
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public int selectEstimatedReceivableLogCount(EstimatedReceivableLog estimatedReceivableLog)
+    {
+        return estimatedReceivableLogMapper.selectEstimatedReceivableLogCount(estimatedReceivableLog);
+    }
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹绠$悊鏃ュ織鍒楄〃
+     *
+     * @param estimatedReceivableLog 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 棰勪及搴旀敹绠$悊鏃ュ織
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public List<EstimatedReceivableLog> selectEstimatedReceivableLogList(EstimatedReceivableLog estimatedReceivableLog)
+    {
+        return estimatedReceivableLogMapper.selectEstimatedReceivableLogList(estimatedReceivableLog);
+    }
+
+    /**
+     * 鏌ヨ棰勪及搴旀敹绠$悊鏃ュ織鍒楄〃 寮傛 瀵煎嚭
+     *
+     * @param estimatedReceivableLog 棰勪及搴旀敹绠$悊鏃ュ織
+     * @param exportKey 瀵煎嚭鍔熻兘鐨勫敮涓�鏍囪瘑
+     * @return 棰勪及搴旀敹绠$悊鏃ュ織闆嗗悎
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Async
+    @Override
+    public void export(EstimatedReceivableLog estimatedReceivableLog,String exportKey) {
+
+        super.export(EstimatedReceivableLog.class,exportKey,"estimatedReceivableLogData",(pageNum)->{
+            PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE);
+            return selectEstimatedReceivableLogList(estimatedReceivableLog);
+        });
+    }
+
+
+    /**
+     * 鏂板棰勪及搴旀敹绠$悊鏃ュ織
+     *
+     * @param estimatedReceivableLog 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertEstimatedReceivableLog(EstimatedReceivableLog estimatedReceivableLog)
+    {
+        estimatedReceivableLog.setCreateTime(DateUtils.getNowDate());
+        return estimatedReceivableLogMapper.insertEstimatedReceivableLog(estimatedReceivableLog);
+    }
+
+    /**
+     * 鏂板棰勪及搴旀敹绠$悊鏃ュ織[鎵归噺]
+     *
+     * @param estimatedReceivableLogs 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertEstimatedReceivableLogBatch(List<EstimatedReceivableLog> estimatedReceivableLogs)
+    {
+        int rows = estimatedReceivableLogMapper.insertEstimatedReceivableLogBatch(estimatedReceivableLogs);
+        return rows;
+    }
+
+    /**
+     * 淇敼棰勪及搴旀敹绠$悊鏃ュ織
+     *
+     * @param estimatedReceivableLog 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateEstimatedReceivableLog(EstimatedReceivableLog estimatedReceivableLog)
+    {
+        return estimatedReceivableLogMapper.updateEstimatedReceivableLog(estimatedReceivableLog);
+    }
+
+    /**
+     * 淇敼棰勪及搴旀敹绠$悊鏃ュ織[鎵归噺]
+     *
+     * @param estimatedReceivableLogs 棰勪及搴旀敹绠$悊鏃ュ織
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateEstimatedReceivableLogBatch(List<EstimatedReceivableLog> estimatedReceivableLogs){
+        return estimatedReceivableLogMapper.updateEstimatedReceivableLogBatch(estimatedReceivableLogs);
+    }
+
+    /**
+     * 鍒犻櫎棰勪及搴旀敹绠$悊鏃ュ織瀵硅薄
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteEstimatedReceivableLogByIds(String ids)
+    {
+        return deleteEstimatedReceivableLogByIds(Convert.toIntArray(ids));
+    }
+
+    /**
+     * 鍒犻櫎棰勪及搴旀敹绠$悊鏃ュ織瀵硅薄
+     *
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteEstimatedReceivableLogByIds(Integer[] ids)
+    {
+        return estimatedReceivableLogMapper.deleteEstimatedReceivableLogByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎棰勪及搴旀敹绠$悊鏃ュ織淇℃伅
+     *
+     * @param id 棰勪及搴旀敹绠$悊鏃ュ織ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteEstimatedReceivableLogById(Integer id)
+    {
+        return estimatedReceivableLogMapper.deleteEstimatedReceivableLogById(id);
+    }
+
+    @Override
+    public void insertEstimatedReceivableLog(String operation, Integer id,String userName ) {
+        EstimatedReceivableLog estimatedReceivableLog = new EstimatedReceivableLog();
+        estimatedReceivableLog.setCreateBy(userName);
+        estimatedReceivableLog.setCreateTime(new Date());
+        estimatedReceivableLog.setEstimatedId(id);
+        estimatedReceivableLog.setOperation(operation);
+        estimatedReceivableLogMapper.insertEstimatedReceivableLog(estimatedReceivableLog);
+    }
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableServiceImpl.java b/service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableServiceImpl.java
index 765e21a..d3fa8a3 100644
--- a/service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableServiceImpl.java
+++ b/service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableServiceImpl.java
@@ -1,9 +1,16 @@
 package com.ruoyi.cwgl.service.impl;
 
+import java.util.Date;
 import java.util.List;
 
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.DateUtils;
 import javax.annotation.Resource;
+
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.cwgl.mapper.EstimatedReceivableLogMapper;
+import com.ruoyi.cwgl.service.IEstimatedReceivableLogService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.stereotype.Service;
 import org.springframework.scheduling.annotation.Async;
@@ -33,7 +40,8 @@
     protected final Logger logger = LoggerFactory.getLogger(getClass());
     @Resource
     private EstimatedReceivableMapper estimatedReceivableMapper;
-
+    @Autowired
+    private IEstimatedReceivableLogService logService;
 
     /**
      * 鏌ヨ棰勪及搴旀敹绠$悊
@@ -129,6 +137,8 @@
     public int updateEstimatedReceivable(EstimatedReceivable estimatedReceivable)
     {
         estimatedReceivable.setUpdateTime(DateUtils.getNowDate());
+        String username = SecurityUtils.getUsername();
+        logService.insertEstimatedReceivableLog("淇敼搴旀敹",estimatedReceivable.getId(),username);
         return estimatedReceivableMapper.updateEstimatedReceivable(estimatedReceivable);
     }
 
@@ -179,4 +189,65 @@
     {
         return estimatedReceivableMapper.deleteEstimatedReceivableById(id);
     }
+
+    @Override
+    public int confirm(Integer id) {
+        EstimatedReceivable estimatedReceivable = estimatedReceivableMapper.selectEstimatedReceivableById(id);
+        if (estimatedReceivable==null){
+            throw new ServiceException("鏁版嵁涓嶅瓨鍦�");
+        }
+        if (estimatedReceivable.getIsConfirmed().equals(2)) {
+            throw new ServiceException("璇ユ暟鎹凡浣滃簾");
+
+        }
+        if (estimatedReceivable.getIsConfirmed().equals(1)) {
+            throw new ServiceException("鏃犻渶閲嶅纭");
+
+        }
+        String username = SecurityUtils.getUsername();
+
+        logService.insertEstimatedReceivableLog("纭搴旀敹",id,username);
+        estimatedReceivable.setIsConfirmed(1);
+        estimatedReceivable.setConfirmBy(username);
+        estimatedReceivable.setConfirmTime(new Date());
+        return estimatedReceivableMapper.updateEstimatedReceivable(estimatedReceivable);
+    }
+
+    @Override
+    public int cancel(Integer id) {
+        EstimatedReceivable estimatedReceivable = estimatedReceivableMapper.selectEstimatedReceivableById(id);
+        if (estimatedReceivable==null){
+            throw new ServiceException("鏁版嵁涓嶅瓨鍦�");
+        }
+        if (estimatedReceivable.getIsConfirmed().equals(2)) {
+            throw new ServiceException("璇ユ暟鎹凡浣滃簾");
+
+        }
+        if (estimatedReceivable.getIsConfirmed().equals(0)) {
+            throw new ServiceException("鏃犻渶閲嶅鍙栨秷");
+
+        }
+        String username = SecurityUtils.getUsername();
+
+        logService.insertEstimatedReceivableLog("鍙栨秷搴旀敹",id,username);
+        estimatedReceivable.setIsConfirmed(0);
+        return estimatedReceivableMapper.updateEstimatedReceivable(estimatedReceivable);
+    }
+
+    @Override
+    public int invalid(Integer id) {
+        EstimatedReceivable estimatedReceivable = estimatedReceivableMapper.selectEstimatedReceivableById(id);
+        if (estimatedReceivable==null){
+            throw new ServiceException("鏁版嵁涓嶅瓨鍦�");
+        }
+        if (estimatedReceivable.getIsConfirmed().equals(2)) {
+            throw new ServiceException("鏃犻渶閲嶅浣滃簾");
+
+        }
+        String username = SecurityUtils.getUsername();
+
+        logService.insertEstimatedReceivableLog("浣滃簾搴旀敹",id,username);
+        estimatedReceivable.setIsConfirmed(2);
+        return estimatedReceivableMapper.updateEstimatedReceivable(estimatedReceivable);
+    }
 }
diff --git a/service/src/main/resources/mapper/cwgl/EstimatedReceivableBillLogMapper.xml b/service/src/main/resources/mapper/cwgl/EstimatedReceivableBillLogMapper.xml
new file mode 100644
index 0000000..e53c414
--- /dev/null
+++ b/service/src/main/resources/mapper/cwgl/EstimatedReceivableBillLogMapper.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.cwgl.mapper.EstimatedReceivableBillLogMapper">
+
+    <resultMap type="com.ruoyi.cwgl.domain.EstimatedReceivableBillLog" id="EstimatedReceivableBillLogResult">
+        <result property="id"    column="id"    />
+        <result property="billId"    column="bill_id"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="operation"    column="operation"    />
+    </resultMap>
+
+    <sql id="selectEstimatedReceivableBillLogVo">
+        select thisTab.id, thisTab.bill_id, thisTab.create_by, thisTab.create_time, thisTab.operation from estimated_receivable_bill_log AS thisTab
+    </sql>
+    <sql id="selectEstimatedReceivableBillLogVoCount">
+        select count(0) from estimated_receivable_bill_log as thisTab
+    </sql>
+
+    <sql id="whereCondition">
+        <if test="billId != null "> and thisTab.bill_id = #{billId}</if>
+        <if test="operation != null  and operation != ''"> and thisTab.operation = #{operation}</if>
+    </sql>
+
+    <!--鏌ヨ-->
+    <select id="selectEstimatedReceivableBillLogById" parameterType="Integer" resultMap="EstimatedReceivableBillLogResult">
+        <include refid="selectEstimatedReceivableBillLogVo"/>
+        where id = #{id}
+    </select>
+
+    <select id="selectEstimatedReceivableBillLogCount" parameterType="com.ruoyi.cwgl.domain.EstimatedReceivableBillLog" resultType="int">
+        <include refid="selectEstimatedReceivableBillLogVoCount"/>
+        <where>
+            <include refid="whereCondition"/>
+        </where>
+    </select>
+
+    <select id="selectEstimatedReceivableBillLogList" parameterType="com.ruoyi.cwgl.domain.EstimatedReceivableBillLog" resultMap="EstimatedReceivableBillLogResult">
+        <include refid="selectEstimatedReceivableBillLogVo"/>
+        <where>
+            <include refid="whereCondition"/>
+        </where>
+        order by thisTab.id desc
+    </select>
+
+    <!-- 鏂板 -->
+    <insert id="insertEstimatedReceivableBillLog" parameterType="com.ruoyi.cwgl.domain.EstimatedReceivableBillLog"  useGeneratedKeys="true" keyProperty="id">
+        insert into estimated_receivable_bill_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="billId != null">bill_id,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="operation != null">operation,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="billId != null">#{billId},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="operation != null">#{operation},</if>
+         </trim>
+    </insert>
+
+    <insert id="insertEstimatedReceivableBillLogBatch" parameterType="java.util.List"  useGeneratedKeys="true" keyProperty="id">
+        insert into estimated_receivable_bill_log
+        <trim prefix="(" suffix=") values" suffixOverrides=",">
+            id,bill_id,create_by,create_time,operation,
+        </trim>
+        <foreach item="item" index="index" collection="list" separator=",">
+            <trim prefix="(" suffix=") " suffixOverrides=",">
+                #{item.id},#{item.billId},#{item.createBy},#{item.createTime},#{item.operation},
+            </trim>
+        </foreach>
+    </insert>
+
+    <!-- 淇敼 -->
+    <update id="updateEstimatedReceivableBillLog" parameterType="com.ruoyi.cwgl.domain.EstimatedReceivableBillLog">
+        update estimated_receivable_bill_log
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="billId != null">bill_id = #{billId},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="operation != null">operation = #{operation},</if>
+        </trim>
+        where id = #{id}
+    </update>
+    <!-- 淇敼 -->
+    <update id="updateEstimatedReceivableBillLogBatch" parameterType="java.util.List">
+        <foreach collection="list" item="item" index="index" separator=";">
+            update estimated_receivable_bill_log
+            <trim prefix="SET" suffixOverrides=",">
+                <if test="item.billId != null">bill_id = #{item.billId},</if>
+                <if test="item.createBy != null">create_by = #{item.createBy},</if>
+                <if test="item.createTime != null">create_time = #{item.createTime},</if>
+                <if test="item.operation != null">operation = #{item.operation},</if>
+            </trim>
+        where id = #{item.id}
+        </foreach>
+    </update>
+
+    <!--鍒犻櫎-->
+    <delete id="deleteEstimatedReceivableBillLogById" parameterType="Integer">
+        delete from estimated_receivable_bill_log where id = #{id}
+    </delete>
+    <delete id="deleteEstimatedReceivableBillLogByIds" parameterType="Integer">
+        delete from estimated_receivable_bill_log where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>
\ No newline at end of file
diff --git a/service/src/main/resources/mapper/cwgl/EstimatedReceivableLogMapper.xml b/service/src/main/resources/mapper/cwgl/EstimatedReceivableLogMapper.xml
new file mode 100644
index 0000000..3e4dbdf
--- /dev/null
+++ b/service/src/main/resources/mapper/cwgl/EstimatedReceivableLogMapper.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.cwgl.mapper.EstimatedReceivableLogMapper">
+
+    <resultMap type="com.ruoyi.cwgl.domain.EstimatedReceivableLog" id="EstimatedReceivableLogResult">
+        <result property="id"    column="id"    />
+        <result property="estimatedId"    column="estimated_id"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="operation"    column="operation"    />
+    </resultMap>
+
+    <sql id="selectEstimatedReceivableLogVo">
+        select thisTab.id, thisTab.estimated_id, thisTab.create_by, thisTab.create_time, thisTab.operation from estimated_receivable_log AS thisTab
+    </sql>
+    <sql id="selectEstimatedReceivableLogVoCount">
+        select count(0) from estimated_receivable_log as thisTab
+    </sql>
+
+    <sql id="whereCondition">
+        <if test="estimatedId != null "> and thisTab.estimated_id = #{estimatedId}</if>
+        <if test="operation != null  and operation != ''"> and thisTab.operation = #{operation}</if>
+    </sql>
+
+    <!--鏌ヨ-->
+    <select id="selectEstimatedReceivableLogById" parameterType="Integer" resultMap="EstimatedReceivableLogResult">
+        <include refid="selectEstimatedReceivableLogVo"/>
+        where id = #{id}
+    </select>
+
+    <select id="selectEstimatedReceivableLogCount" parameterType="com.ruoyi.cwgl.domain.EstimatedReceivableLog" resultType="int">
+        <include refid="selectEstimatedReceivableLogVoCount"/>
+        <where>
+            <include refid="whereCondition"/>
+        </where>
+    </select>
+
+    <select id="selectEstimatedReceivableLogList" parameterType="com.ruoyi.cwgl.domain.EstimatedReceivableLog" resultMap="EstimatedReceivableLogResult">
+        <include refid="selectEstimatedReceivableLogVo"/>
+        <where>
+            <include refid="whereCondition"/>
+        </where>
+        order by thisTab.id desc
+    </select>
+
+    <!-- 鏂板 -->
+    <insert id="insertEstimatedReceivableLog" parameterType="com.ruoyi.cwgl.domain.EstimatedReceivableLog"  useGeneratedKeys="true" keyProperty="id">
+        insert into estimated_receivable_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="estimatedId != null">estimated_id,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="operation != null">operation,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="estimatedId != null">#{estimatedId},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="operation != null">#{operation},</if>
+         </trim>
+    </insert>
+
+    <insert id="insertEstimatedReceivableLogBatch" parameterType="java.util.List"  useGeneratedKeys="true" keyProperty="id">
+        insert into estimated_receivable_log
+        <trim prefix="(" suffix=") values" suffixOverrides=",">
+            id,estimated_id,create_by,create_time,operation,
+        </trim>
+        <foreach item="item" index="index" collection="list" separator=",">
+            <trim prefix="(" suffix=") " suffixOverrides=",">
+                #{item.id},#{item.estimatedId},#{item.createBy},#{item.createTime},#{item.operation},
+            </trim>
+        </foreach>
+    </insert>
+
+    <!-- 淇敼 -->
+    <update id="updateEstimatedReceivableLog" parameterType="com.ruoyi.cwgl.domain.EstimatedReceivableLog">
+        update estimated_receivable_log
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="estimatedId != null">estimated_id = #{estimatedId},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="operation != null">operation = #{operation},</if>
+        </trim>
+        where id = #{id}
+    </update>
+    <!-- 淇敼 -->
+    <update id="updateEstimatedReceivableLogBatch" parameterType="java.util.List">
+        <foreach collection="list" item="item" index="index" separator=";">
+            update estimated_receivable_log
+            <trim prefix="SET" suffixOverrides=",">
+                <if test="item.estimatedId != null">estimated_id = #{item.estimatedId},</if>
+                <if test="item.createBy != null">create_by = #{item.createBy},</if>
+                <if test="item.createTime != null">create_time = #{item.createTime},</if>
+                <if test="item.operation != null">operation = #{item.operation},</if>
+            </trim>
+        where id = #{item.id}
+        </foreach>
+    </update>
+
+    <!--鍒犻櫎-->
+    <delete id="deleteEstimatedReceivableLogById" parameterType="Integer">
+        delete from estimated_receivable_log where id = #{id}
+    </delete>
+    <delete id="deleteEstimatedReceivableLogByIds" parameterType="Integer">
+        delete from estimated_receivable_log where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>
\ No newline at end of file
diff --git a/ui/admin-ui3/src/api/cwgl/estimatedReceivableBillLog.ts b/ui/admin-ui3/src/api/cwgl/estimatedReceivableBillLog.ts
new file mode 100644
index 0000000..2d3a150
--- /dev/null
+++ b/ui/admin-ui3/src/api/cwgl/estimatedReceivableBillLog.ts
@@ -0,0 +1,67 @@
+import request,{download,requestType} from "@/utils/request";
+import {BaseEntityInterface} from "@/utils/globalInterface";
+export interface EstimatedReceivableBillLogI extends BaseEntityInterface{
+            id ?:  number   ,            billId ?:  number   ,            createBy ?:  string   ,            createTime ?:  string   ,            operation ?:  string       }
+
+
+/**
+ * 鏌ヨ棰勪及搴旀敹璐﹀崟鏃ュ織鍒楄〃
+ */
+export const listEstimatedReceivableBillLog:requestType = (query) => {
+    return request({
+        url: '/cwgl/estimatedReceivableBillLog/list',
+        method:'get',
+        params:query
+    })
+}
+/**
+ * 鏌ヨ棰勪及搴旀敹璐﹀崟鏃ュ織璇︾粏
+ */
+export const getEstimatedReceivableBillLog:requestType = (id) => {
+    return request({
+        url: '/cwgl/estimatedReceivableBillLog/' + id,
+        method:'get'
+    })
+}
+
+/**
+ * 鏂板棰勪及搴旀敹璐﹀崟鏃ュ織
+ */
+export const addEstimatedReceivableBillLog:requestType = (data) => {
+    return request({
+        url: '/cwgl/estimatedReceivableBillLog',
+        method: 'post',
+        data
+    })
+}
+
+/**
+ * 淇敼棰勪及搴旀敹璐﹀崟鏃ュ織
+ */
+export const updateEstimatedReceivableBillLog:requestType = (data) => {
+    return request({
+        url: '/cwgl/estimatedReceivableBillLog',
+        method: 'put',
+        data
+    })
+}
+
+/**
+ * 鍒犻櫎棰勪及搴旀敹璐﹀崟鏃ュ織
+ */
+export const delEstimatedReceivableBillLog:requestType = (id) => {
+    return request({
+        url: '/cwgl/estimatedReceivableBillLog/' + id,
+        method: 'delete'
+    })
+}
+
+
+/**
+ * 瀵煎嚭棰勪及搴旀敹璐﹀崟鏃ュ織
+ */
+export const exportEstimatedReceivableBillLog:requestType = (query) => {
+    return new Promise<any>(()=>{
+        download('/cwgl/estimatedReceivableBillLog/export',query);
+    })
+}
diff --git a/ui/admin-ui3/src/api/cwgl/estimatedReceivableLog.ts b/ui/admin-ui3/src/api/cwgl/estimatedReceivableLog.ts
new file mode 100644
index 0000000..b2761d0
--- /dev/null
+++ b/ui/admin-ui3/src/api/cwgl/estimatedReceivableLog.ts
@@ -0,0 +1,67 @@
+import request,{download,requestType} from "@/utils/request";
+import {BaseEntityInterface} from "@/utils/globalInterface";
+export interface EstimatedReceivableLogI extends BaseEntityInterface{
+            id ?:  number   ,            estimatedId ?:  number   ,            createBy ?:  string   ,            createTime ?:  string   ,            operation ?:  string       }
+
+
+/**
+ * 鏌ヨ棰勪及搴旀敹绠$悊鏃ュ織鍒楄〃
+ */
+export const listEstimatedReceivableLog:requestType = (query) => {
+    return request({
+        url: '/cwgl/estimatedReceivableLog/list',
+        method:'get',
+        params:query
+    })
+}
+/**
+ * 鏌ヨ棰勪及搴旀敹绠$悊鏃ュ織璇︾粏
+ */
+export const getEstimatedReceivableLog:requestType = (id) => {
+    return request({
+        url: '/cwgl/estimatedReceivableLog/' + id,
+        method:'get'
+    })
+}
+
+/**
+ * 鏂板棰勪及搴旀敹绠$悊鏃ュ織
+ */
+export const addEstimatedReceivableLog:requestType = (data) => {
+    return request({
+        url: '/cwgl/estimatedReceivableLog',
+        method: 'post',
+        data
+    })
+}
+
+/**
+ * 淇敼棰勪及搴旀敹绠$悊鏃ュ織
+ */
+export const updateEstimatedReceivableLog:requestType = (data) => {
+    return request({
+        url: '/cwgl/estimatedReceivableLog',
+        method: 'put',
+        data
+    })
+}
+
+/**
+ * 鍒犻櫎棰勪及搴旀敹绠$悊鏃ュ織
+ */
+export const delEstimatedReceivableLog:requestType = (id) => {
+    return request({
+        url: '/cwgl/estimatedReceivableLog/' + id,
+        method: 'delete'
+    })
+}
+
+
+/**
+ * 瀵煎嚭棰勪及搴旀敹绠$悊鏃ュ織
+ */
+export const exportEstimatedReceivableLog:requestType = (query) => {
+    return new Promise<any>(()=>{
+        download('/cwgl/estimatedReceivableLog/export',query);
+    })
+}
diff --git a/ui/admin-ui3/src/views/cwgl/estimatedReceivableBillLog/index.vue b/ui/admin-ui3/src/views/cwgl/estimatedReceivableBillLog/index.vue
new file mode 100644
index 0000000..64392b8
--- /dev/null
+++ b/ui/admin-ui3/src/views/cwgl/estimatedReceivableBillLog/index.vue
@@ -0,0 +1,127 @@
+<template>
+  <basicContainer >
+    <avue-crud
+        :option="option"
+        :table-loading="pageF.loading"
+        :data="tableData"
+        :page="page"
+        :permission="permissionList"
+        :before-open="beforeOpen"
+        v-model="form"
+        ref="crudRef"
+        @row-update="rowUpdate"
+        @row-save="rowSave"
+        @refresh-change="refreshChange"
+        @row-del="rowDel"
+        @search-change="searchChange"
+        @search-reset="searchReset"
+        @selection-change="selectionChange"
+        @current-change="currentChange"
+        @size-change="sizeChange"
+        @on-load="onLoad"
+    >
+      <template #menu-left>
+        <el-button
+            type="success"
+            icon="Edit"
+            :disabled="pageF.single"
+            v-hasPermi="['cwgl:estimatedReceivableBillLog:edit']"
+            @click="handleUpdate">淇敼
+        </el-button>
+        <el-button
+            type="danger"
+            icon="Delete"
+            :disabled="pageF.multiple"
+            @click="handleDelete"
+            v-hasPermi="['cwgl:estimatedReceivableBillLog:remove']"
+        >鍒犻櫎
+        </el-button>
+        <el-button
+            type="warning"
+            plain
+            icon="Download"
+            @click="handleExport"
+            v-hasPermi="['cwgl:estimatedReceivableBillLog:export']"
+        >瀵煎嚭
+        </el-button>
+      </template>
+    </avue-crud>
+  </basicContainer>
+</template>
+
+<script setup name="estimatedReceivableBillLog" lang="ts">
+  import {EstimatedReceivableBillLogI,addEstimatedReceivableBillLog, delEstimatedReceivableBillLog, exportEstimatedReceivableBillLog, getEstimatedReceivableBillLog, listEstimatedReceivableBillLog, updateEstimatedReceivableBillLog} from "@/api/cwgl/estimatedReceivableBillLog";
+  import useCurrentInstance from "@/utils/useCurrentInstance";
+  import {computed,reactive, ref, toRefs} from "vue";
+  import {PagesInterface, PageQueryInterface} from "@/utils/globalInterface";
+  import {usePagePlus} from "@/hooks/usePagePlus";
+  import {hasPermission} from "@/utils/permissionUtils";
+
+  const { proxy } = useCurrentInstance();
+  const crudRef = ref();
+
+  const permissionList = computed(()=>{
+    return {
+      addBtn: hasPermission(["cwgl:estimatedReceivableBillLog:add"]),
+      delBtn: hasPermission(["cwgl:estimatedReceivableBillLog:remove"]),
+      editBtn: hasPermission(["cwgl:estimatedReceivableBillLog:edit"]),
+      viewBtn: hasPermission(["cwgl:estimatedReceivableBillLog:query"]),
+    }
+  })
+
+  const data = reactive({
+    form:<EstimatedReceivableBillLogI>{},
+    queryParams:<EstimatedReceivableBillLogI&PageQueryInterface>{},
+    page: <PagesInterface>{
+      pageSize: 10,
+      total: 0,
+      currentPage: 1,
+    },
+    selectionList:[],
+  })
+  const {queryParams,form,page,selectionList} = toRefs(data);
+  const option = ref({
+    pageKey: 'EstimatedReceivableBillLog',
+    rowKey: 'id',
+    column: {
+                                id: {
+          label: '涓婚敭',
+                            },
+                                billId: {
+          label: '璐﹀崟id',
+                            },
+                                createBy: {
+          label: '鍒涘缓鑰�',
+                            },
+                                createTime: {
+          label: '鍒涘缓鏃堕棿',
+                            },
+                                operation: {
+          label: '鎿嶄綔璇存槑',
+                            },
+          }
+  })
+
+  const { tableData,pageF,rowSave,rowUpdate,rowDel,beforeOpen,searchChange,
+    searchReset,selectionChange,onLoad,currentChange,sizeChange,handleDelete,handleExport,handleUpdate,refreshChange} = usePagePlus({
+    form:form,
+    option:option,
+    queryParams:queryParams,
+    idKey:'id',
+    page:page.value,
+    getListApi:listEstimatedReceivableBillLog,
+    getDetailApi:getEstimatedReceivableBillLog,
+    exportApi:exportEstimatedReceivableBillLog,
+    deleteApi:delEstimatedReceivableBillLog,
+    addApi:addEstimatedReceivableBillLog,
+    updateApi:updateEstimatedReceivableBillLog,
+    handleUpdateFunc:()=>{
+      crudRef.value.rowEdit(selectionList.value[0]);
+    },
+    handleSelectionChangeFunc:(selection:any)=>{
+      selectionList.value = selection;
+    }
+  })
+
+
+</script>
diff --git a/ui/admin-ui3/src/views/cwgl/estimatedReceivableLog/index.vue b/ui/admin-ui3/src/views/cwgl/estimatedReceivableLog/index.vue
new file mode 100644
index 0000000..a1b301e
--- /dev/null
+++ b/ui/admin-ui3/src/views/cwgl/estimatedReceivableLog/index.vue
@@ -0,0 +1,127 @@
+<template>
+  <basicContainer >
+    <avue-crud
+        :option="option"
+        :table-loading="pageF.loading"
+        :data="tableData"
+        :page="page"
+        :permission="permissionList"
+        :before-open="beforeOpen"
+        v-model="form"
+        ref="crudRef"
+        @row-update="rowUpdate"
+        @row-save="rowSave"
+        @refresh-change="refreshChange"
+        @row-del="rowDel"
+        @search-change="searchChange"
+        @search-reset="searchReset"
+        @selection-change="selectionChange"
+        @current-change="currentChange"
+        @size-change="sizeChange"
+        @on-load="onLoad"
+    >
+      <template #menu-left>
+        <el-button
+            type="success"
+            icon="Edit"
+            :disabled="pageF.single"
+            v-hasPermi="['cwgl:estimatedReceivableLog:edit']"
+            @click="handleUpdate">淇敼
+        </el-button>
+        <el-button
+            type="danger"
+            icon="Delete"
+            :disabled="pageF.multiple"
+            @click="handleDelete"
+            v-hasPermi="['cwgl:estimatedReceivableLog:remove']"
+        >鍒犻櫎
+        </el-button>
+        <el-button
+            type="warning"
+            plain
+            icon="Download"
+            @click="handleExport"
+            v-hasPermi="['cwgl:estimatedReceivableLog:export']"
+        >瀵煎嚭
+        </el-button>
+      </template>
+    </avue-crud>
+  </basicContainer>
+</template>
+
+<script setup name="estimatedReceivableLog" lang="ts">
+  import {EstimatedReceivableLogI,addEstimatedReceivableLog, delEstimatedReceivableLog, exportEstimatedReceivableLog, getEstimatedReceivableLog, listEstimatedReceivableLog, updateEstimatedReceivableLog} from "@/api/cwgl/estimatedReceivableLog";
+  import useCurrentInstance from "@/utils/useCurrentInstance";
+  import {computed,reactive, ref, toRefs} from "vue";
+  import {PagesInterface, PageQueryInterface} from "@/utils/globalInterface";
+  import {usePagePlus} from "@/hooks/usePagePlus";
+  import {hasPermission} from "@/utils/permissionUtils";
+
+  const { proxy } = useCurrentInstance();
+  const crudRef = ref();
+
+  const permissionList = computed(()=>{
+    return {
+      addBtn: hasPermission(["cwgl:estimatedReceivableLog:add"]),
+      delBtn: hasPermission(["cwgl:estimatedReceivableLog:remove"]),
+      editBtn: hasPermission(["cwgl:estimatedReceivableLog:edit"]),
+      viewBtn: hasPermission(["cwgl:estimatedReceivableLog:query"]),
+    }
+  })
+
+  const data = reactive({
+    form:<EstimatedReceivableLogI>{},
+    queryParams:<EstimatedReceivableLogI&PageQueryInterface>{},
+    page: <PagesInterface>{
+      pageSize: 10,
+      total: 0,
+      currentPage: 1,
+    },
+    selectionList:[],
+  })
+  const {queryParams,form,page,selectionList} = toRefs(data);
+  const option = ref({
+    pageKey: 'EstimatedReceivableLog',
+    rowKey: 'id',
+    column: {
+                                id: {
+          label: '涓婚敭',
+                            },
+                                estimatedId: {
+          label: '棰勪及搴旀敹绠$悊琛╥d',
+                            },
+                                createBy: {
+          label: '鍒涘缓鑰�',
+                            },
+                                createTime: {
+          label: '鍒涘缓鏃堕棿',
+                            },
+                                operation: {
+          label: '鎿嶄綔璇存槑',
+                            },
+          }
+  })
+
+  const { tableData,pageF,rowSave,rowUpdate,rowDel,beforeOpen,searchChange,
+    searchReset,selectionChange,onLoad,currentChange,sizeChange,handleDelete,handleExport,handleUpdate,refreshChange} = usePagePlus({
+    form:form,
+    option:option,
+    queryParams:queryParams,
+    idKey:'id',
+    page:page.value,
+    getListApi:listEstimatedReceivableLog,
+    getDetailApi:getEstimatedReceivableLog,
+    exportApi:exportEstimatedReceivableLog,
+    deleteApi:delEstimatedReceivableLog,
+    addApi:addEstimatedReceivableLog,
+    updateApi:updateEstimatedReceivableLog,
+    handleUpdateFunc:()=>{
+      crudRef.value.rowEdit(selectionList.value[0]);
+    },
+    handleSelectionChangeFunc:(selection:any)=>{
+      selectionList.value = selection;
+    }
+  })
+
+
+</script>

--
Gitblit v1.8.0