From 5fd8f535ef44ef055d91673740491b9c9177aa89 Mon Sep 17 00:00:00 2001
From: seatonwan9
Date: 星期日, 24 八月 2025 20:32:01 +0800
Subject: [PATCH] 交易管理

---
 src/main/java/com/webmanage/service/OrderInfoService.java          |   68 ++
 src/main/resources/mapper/OrderInfoMapper.xml                      |    2 
 src/main/java/com/webmanage/dto/OrderApprovalDTO.java              |   37 +
 src/main/java/com/webmanage/controller/ProductController.java      |  184 ++++++
 src/main/java/com/webmanage/entity/Product.java                    |  143 +++++
 src/main/java/com/webmanage/controller/FileController.java         |   82 ++
 src/main/java/com/webmanage/controller/OrderController.java        |  122 ++++
 src/main/java/com/webmanage/dto/UpdateOrderDetailDTO.java          |   56 ++
 src/main/java/com/webmanage/entity/OrderApproval.java              |   68 ++
 src/main/java/com/webmanage/mapper/ProductMapper.java              |   58 ++
 src/main/java/com/webmanage/service/impl/ProductServiceImpl.java   |  106 +++
 src/main/java/com/webmanage/service/ProductService.java            |   85 +++
 src/main/java/com/webmanage/mapper/OrderApprovalMapper.java        |   12 
 src/main/java/com/webmanage/service/impl/OrderInfoServiceImpl.java |  541 +++++++++++++++++++
 src/main/java/com/webmanage/dto/FileCheckDTO.java                  |   35 +
 15 files changed, 1,572 insertions(+), 27 deletions(-)

diff --git a/src/main/java/com/webmanage/controller/FileController.java b/src/main/java/com/webmanage/controller/FileController.java
index c3d3292..429b28b 100644
--- a/src/main/java/com/webmanage/controller/FileController.java
+++ b/src/main/java/com/webmanage/controller/FileController.java
@@ -61,11 +61,11 @@
     }
 
     /**
-     * 涓嬭浇鏂囦欢
+     * 涓嬭浇鏂囦欢锛堣矾寰勫弬鏁版柟寮忥級
      */
     @GetMapping("/download/{fileName}")
-    @ApiOperation("涓嬭浇鏂囦欢")
-    public ResponseEntity<InputStreamResource> downloadFile(
+    @ApiOperation("涓嬭浇鏂囦欢锛堣矾寰勫弬鏁帮級")
+    public ResponseEntity<InputStreamResource> downloadFileByPath(
             @ApiParam("鏂囦欢鍚�") @PathVariable String fileName,
             @ApiParam("鍘熷鏂囦欢鍚�") @RequestParam(required = false) String originalName) {
         try {
@@ -95,11 +95,60 @@
     }
 
     /**
-     * 鑾峰彇鏂囦欢棰勮URL
+     * 涓嬭浇鏂囦欢锛堟煡璇㈠弬鏁版柟寮忥級
+     */
+    @GetMapping("/download")
+    @ApiOperation("涓嬭浇鏂囦欢锛堟煡璇㈠弬鏁帮級")
+    public ResponseEntity<InputStreamResource> downloadFile(
+            @ApiParam("鏂囦欢鍚�") @RequestParam String fileName,
+            @ApiParam("鍘熷鏂囦欢鍚�") @RequestParam(required = false) String originalName) {
+        try {
+            InputStream inputStream = minioService.downloadFile(fileName);
+            
+            // 濡傛灉娌℃湁鎻愪緵鍘熷鏂囦欢鍚嶏紝浠庤矾寰勪腑鎻愬彇
+            if (originalName == null || originalName.isEmpty()) {
+                String[] parts = fileName.split("/");
+                originalName = parts[parts.length - 1];
+            }
+            
+            // 璁剧疆鍝嶅簲澶�
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+            headers.setContentDispositionFormData("attachment", 
+                    URLEncoder.encode(originalName, StandardCharsets.UTF_8.toString()));
+            
+            InputStreamResource resource = new InputStreamResource(inputStream);
+            
+            return ResponseEntity.ok()
+                    .headers(headers)
+                    .body(resource);
+        } catch (Exception e) {
+            log.error("鏂囦欢涓嬭浇澶辫触: ", e);
+            return ResponseEntity.notFound().build();
+        }
+    }
+
+    /**
+     * 鑾峰彇鏂囦欢棰勮URL锛堣矾寰勫弬鏁版柟寮忥級
      */
     @GetMapping("/preview/{fileName}")
-    @ApiOperation("鑾峰彇鏂囦欢棰勮URL")
-    public Result<String> getPreviewUrl(@ApiParam("鏂囦欢鍚�") @PathVariable String fileName) {
+    @ApiOperation("鑾峰彇鏂囦欢棰勮URL锛堣矾寰勫弬鏁帮級")
+    public Result<String> getPreviewUrlByPath(@ApiParam("鏂囦欢鍚�") @PathVariable String fileName) {
+        try {
+            String previewUrl = minioService.getPreviewUrl(fileName);
+            return Result.success("鑾峰彇棰勮URL鎴愬姛", previewUrl);
+        } catch (Exception e) {
+            log.error("鑾峰彇棰勮URL澶辫触: ", e);
+            return Result.error("鑾峰彇棰勮URL澶辫触: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 鑾峰彇鏂囦欢棰勮URL锛堟煡璇㈠弬鏁版柟寮忥級
+     */
+    @GetMapping("/preview")
+    @ApiOperation("鑾峰彇鏂囦欢棰勮URL锛堟煡璇㈠弬鏁帮級")
+    public Result<String> getPreviewUrl(@ApiParam("鏂囦欢鍚�") @RequestParam String fileName) {
         try {
             String previewUrl = minioService.getPreviewUrl(fileName);
             return Result.success("鑾峰彇棰勮URL鎴愬姛", previewUrl);
@@ -125,11 +174,26 @@
     }
  
     /**
-     * 鍒犻櫎鏂囦欢
+     * 鍒犻櫎鏂囦欢锛堣矾寰勫弬鏁版柟寮忥級
      */
     @DeleteMapping("/delete/{fileName}")
-    @ApiOperation("鍒犻櫎鏂囦欢")
-    public Result<Boolean> deleteFile(@ApiParam("鏂囦欢鍚�") @PathVariable String fileName) {
+    @ApiOperation("鍒犻櫎鏂囦欢锛堣矾寰勫弬鏁帮級")
+    public Result<Boolean> deleteFileByPath(@ApiParam("鏂囦欢鍚�") @PathVariable String fileName) {
+        try {
+            minioService.deleteFile(fileName);
+            return Result.success("鏂囦欢鍒犻櫎鎴愬姛", true);
+        } catch (Exception e) {
+            log.error("鏂囦欢鍒犻櫎澶辫触: ", e);
+            return Result.error("鏂囦欢鍒犻櫎澶辫触: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 鍒犻櫎鏂囦欢锛堟煡璇㈠弬鏁版柟寮忥級
+     */
+    @DeleteMapping("/delete")
+    @ApiOperation("鍒犻櫎鏂囦欢锛堟煡璇㈠弬鏁帮級")
+    public Result<Boolean> deleteFile(@ApiParam("鏂囦欢鍚�") @RequestParam String fileName) {
         try {
             minioService.deleteFile(fileName);
             return Result.success("鏂囦欢鍒犻櫎鎴愬姛", true);
diff --git a/src/main/java/com/webmanage/controller/OrderController.java b/src/main/java/com/webmanage/controller/OrderController.java
index d2d30e7..f66ad4d 100644
--- a/src/main/java/com/webmanage/controller/OrderController.java
+++ b/src/main/java/com/webmanage/controller/OrderController.java
@@ -2,8 +2,10 @@
 
 import com.webmanage.common.Result;
 import com.webmanage.dto.CreateOrderDTO;
+import com.webmanage.dto.FileCheckDTO;
 import com.webmanage.dto.OrderQueryDTO;
 import com.webmanage.entity.OrderInfo;
+import com.webmanage.dto.UpdateOrderDetailDTO;
 import com.webmanage.service.OrderInfoService;
 import com.webmanage.service.TokenService;
 import com.webmanage.service.OrderNoService;
@@ -19,6 +21,7 @@
 import javax.validation.Valid;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
+import com.webmanage.dto.OrderApprovalDTO;
 
 /**
  * 璁㈠崟绠$悊Controller
@@ -80,6 +83,34 @@
         }
     }
 
+
+
+    @PostMapping("/status/next")
+    @ApiOperation("鏇存柊璁㈠崟鐘舵�佸埌涓嬩竴涓姸鎬�")
+    public Result<Object> updateOrderStatusToNext(
+            @ApiParam("璁㈠崟ID") @RequestParam @NotBlank String orderId) {
+        try {
+            boolean success = orderInfoService.updateOrderStatusToNext(orderId);
+            return success ? Result.success("璁㈠崟鐘舵�佹洿鏂板埌涓嬩竴涓姸鎬佹垚鍔�") : Result.error("璁㈠崟鐘舵�佹洿鏂板け璐�");
+        } catch (Exception e) {
+            log.error("鏇存柊璁㈠崟鐘舵�佸埌涓嬩竴涓姸鎬佸け璐�", e);
+            return Result.error("鏇存柊璁㈠崟鐘舵�佸埌涓嬩竴涓姸鎬佸け璐ワ細" + e.getMessage());
+        }
+    }
+
+    @PostMapping("/status/previous")
+    @ApiOperation("鏇存柊璁㈠崟鐘舵�佸埌涓婁竴涓姸鎬�")
+    public Result<Object> updateOrderStatusToPrevious(
+            @ApiParam("璁㈠崟ID") @RequestParam @NotBlank String orderId) {
+        try {
+            boolean success = orderInfoService.updateOrderStatusToPrevious(orderId);
+            return success ? Result.success("璁㈠崟鐘舵�佹洿鏂板埌涓婁竴涓姸鎬佹垚鍔�") : Result.error("璁㈠崟鐘舵�佹洿鏂板け璐�");
+        } catch (Exception e) {
+            log.error("鏇存柊璁㈠崟鐘舵�佸埌涓婁竴涓姸鎬佸け璐�", e);
+            return Result.error("鏇存柊璁㈠崟鐘舵�佸埌涓婁竴涓姸鎬佸け璐ワ細" + e.getMessage());
+        }
+    }
+
     @PostMapping("/seller/page")
     @ApiOperation("鍒嗛〉鏌ヨ鍗栧璁㈠崟鍒楄〃")
     public Result<Object> getSellerOrderPage(@Valid @RequestBody OrderQueryDTO queryDTO) {
@@ -120,7 +151,7 @@
 
     @PostMapping("/attachment/upload")
     @ApiOperation("涓婁紶璁㈠崟闄勪欢")
-    public Result<Boolean> uploadOrderAttachment(
+    public Result<Long> uploadOrderAttachment(
             @ApiParam("璁㈠崟ID") @RequestParam @NotBlank String orderId,
             @ApiParam("鏂囦欢鍚�") @RequestParam @NotBlank String fileName,
             @ApiParam("鍘熷鏂囦欢鍚�") @RequestParam String originalName,
@@ -134,11 +165,11 @@
             @ApiParam("闄勪欢绫诲瀷") @RequestParam String attachmentType,
             @ApiParam("闄勪欢鎻忚堪") @RequestParam String description) {
         try {
-            boolean result = orderInfoService.uploadOrderAttachment(
+            Long attachmentId = orderInfoService.uploadOrderAttachment(
                 orderId, fileName, originalName, fileType, fileSize, fileUrl,
                 bucketName, objectName, uploadUserId, uploadUserName, attachmentType, description
             );
-            return result ? Result.success(true) : Result.error("涓婁紶璁㈠崟闄勪欢澶辫触");
+            return Result.success("涓婁紶璁㈠崟闄勪欢鎴愬姛", attachmentId);
         } catch (Exception e) {
             log.error("涓婁紶璁㈠崟闄勪欢澶辫触锛岃鍗旾D: {}", orderId, e);
             return Result.error("涓婁紶璁㈠崟闄勪欢澶辫触锛�" + e.getMessage());
@@ -198,4 +229,89 @@
             return Result.error("鍥炲璇勪环澶辫触锛�" + e.getMessage());
         }
     }
+
+    @PostMapping("/detail/update")
+    @ApiOperation("鏇存柊璁㈠崟璇︽儏")
+    public Result<Boolean> updateOrderDetail(@Valid @RequestBody UpdateOrderDetailDTO updateOrderDetailDTO) {
+        try {
+            boolean result = orderInfoService.updateOrderDetail(updateOrderDetailDTO);
+            return result ? Result.success(true) : Result.error("鏇存柊璁㈠崟璇︽儏澶辫触");
+        } catch (Exception e) {
+            log.error("鏇存柊璁㈠崟璇︽儏澶辫触锛岃鍗旾D: {}", updateOrderDetailDTO.getOrderId(), e);
+            return Result.error("鏇存柊璁㈠崟璇︽儏澶辫触锛�" + e.getMessage());
+        }
+    }
+
+    @PostMapping("/detail/remarks/update")
+    @ApiOperation("鍙洿鏂拌鍗曡鎯呯殑澶囨敞淇℃伅")
+    public Result<Boolean> updateOrderDetailRemarksOnly(@Valid @RequestBody UpdateOrderDetailDTO.UpdateOrderDetailRemarksOnlyDTO updateOrderDetailDTO) {
+        try {
+            boolean result = orderInfoService.updateOrderDetailRemarksOnly(updateOrderDetailDTO);
+            return result ? Result.success(true) : Result.error("鏇存柊璁㈠崟璇︽儏澶囨敞澶辫触");
+        } catch (Exception e) {
+            log.error("鏇存柊璁㈠崟璇︽儏澶囨敞澶辫触锛岃鍗旾D: {}", updateOrderDetailDTO.getOrderId(), e);
+            return Result.error("鏇存柊璁㈠崟璇︽儏澶囨敞澶辫触锛�" + e.getMessage());
+        }
+    }
+
+    @PostMapping("/trade/checkFiles")
+    @ApiOperation("鏂囦欢鏍告煡")
+    public Result<Boolean> checkFiles(@Valid @RequestBody FileCheckDTO fileCheckDTO) {
+        try {
+            boolean result = orderInfoService.checkFiles(fileCheckDTO);
+            return result ? Result.success(true) : Result.error("鏂囦欢鏍告煡澶辫触");
+        } catch (Exception e) {
+            log.error("鏂囦欢鏍告煡澶辫触锛岃鍗旾D: {}", fileCheckDTO.getOrderId(), e);
+            return Result.error("鏂囦欢鏍告煡澶辫触锛�" + e.getMessage());
+        }
+    }
+
+    @DeleteMapping("/attachment/delete/{attachmentId}")
+    @ApiOperation("鍒犻櫎璁㈠崟闄勪欢")
+    public Result<Boolean> deleteOrderAttachment(@ApiParam("闄勪欢ID") @PathVariable @NotNull Long attachmentId) {
+        try {
+            boolean result = orderInfoService.deleteOrderAttachment(attachmentId);
+            return result ? Result.success(true) : Result.error("鍒犻櫎璁㈠崟闄勪欢澶辫触");
+        } catch (Exception e) {
+            log.error("鍒犻櫎璁㈠崟闄勪欢澶辫触锛岄檮浠禝D: {}", attachmentId, e);
+            return Result.error("鍒犻櫎璁㈠崟闄勪欢澶辫触锛�" + e.getMessage());
+        }
+    }
+
+    @PostMapping("/trade/approve")
+    @ApiOperation("瀹℃壒閫氳繃")
+    public Result<Boolean> approveOrder(@Valid @RequestBody OrderApprovalDTO orderApprovalDTO) {
+        try {
+            boolean result = orderInfoService.approveOrder(orderApprovalDTO);
+            return result ? Result.success(true) : Result.error("瀹℃壒閫氳繃澶辫触");
+        } catch (Exception e) {
+            log.error("瀹℃壒閫氳繃澶辫触锛岃鍗旾D: {}", orderApprovalDTO.getOrderId(), e);
+            return Result.error("瀹℃壒閫氳繃澶辫触锛�" + e.getMessage());
+        }
+    }
+
+    @GetMapping("/agreement/check/{orderId}")
+    @ApiOperation("妫�鏌ヨ鍗曟槸鍚﹀寘鍚崗璁被鍨嬬殑瀛愯鍗�")
+    public Result<Boolean> checkAgreementPriceType(
+            @ApiParam("璁㈠崟ID") @PathVariable @NotBlank String orderId) {
+        try {
+            boolean hasAgreement = orderInfoService.hasAgreementPriceType(orderId);
+            return Result.success(hasAgreement);
+        } catch (Exception e) {
+            log.error("妫�鏌ヨ鍗曞崗璁被鍨嬪け璐ワ紝璁㈠崟ID: {}", orderId, e);
+            return Result.error("妫�鏌ヨ鍗曞崗璁被鍨嬪け璐ワ細" + e.getMessage());
+        }
+    }
+
+    @DeleteMapping("/cancel/{orderId}")
+    @ApiOperation("鍙栨秷璁㈠崟")
+    public Result<Boolean> cancelOrder(@ApiParam("璁㈠崟ID") @PathVariable @NotBlank String orderId) {
+        try {
+            boolean result = orderInfoService.cancelOrder(orderId);
+            return result ? Result.success(true) : Result.error("鍙栨秷璁㈠崟澶辫触");
+        } catch (Exception e) {
+            log.error("鍙栨秷璁㈠崟澶辫触锛岃鍗旾D: {}", orderId, e);
+            return Result.error("鍙栨秷璁㈠崟澶辫触锛�" + e.getMessage());
+        }
+    }
 }
diff --git a/src/main/java/com/webmanage/controller/ProductController.java b/src/main/java/com/webmanage/controller/ProductController.java
new file mode 100644
index 0000000..927a13e
--- /dev/null
+++ b/src/main/java/com/webmanage/controller/ProductController.java
@@ -0,0 +1,184 @@
+package com.webmanage.controller;
+
+import com.webmanage.common.Result;
+import com.webmanage.entity.Product;
+import com.webmanage.service.ProductService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 浜у搧绠$悊鎺у埗鍣�
+ * 
+ * @author webmanage
+ * @date 2024-08-07
+ */
+@Slf4j
+@RestController
+@RequestMapping("/product")
+@Api(tags = "浜у搧绠$悊")
+public class ProductController {
+
+    @Autowired
+    private ProductService productService;
+
+    /**
+     * 鑾峰彇浜у搧鍒楄〃
+     */
+    @GetMapping("/list")
+    @ApiOperation("鑾峰彇浜у搧鍒楄〃")
+    public Result<List<Product>> getProductList(
+            @ApiParam("浜у搧鍚嶇О") @RequestParam(required = false) String productName,
+            @ApiParam("浜у搧绫诲瀷") @RequestParam(required = false) String productType,
+            @ApiParam("浜у搧鐘舵��") @RequestParam(required = false) String status,
+            @ApiParam("鎻愪緵鑰匢D") @RequestParam(required = false) Long providerId) {
+        
+        try {
+            List<Product> productList = productService.getProductList(productName, productType, status, providerId);
+            return Result.success(productList);
+        } catch (Exception e) {
+            log.error("鑾峰彇浜у搧鍒楄〃澶辫触", e);
+            return Result.error("鑾峰彇浜у搧鍒楄〃澶辫触: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 鏍规嵁ID鑾峰彇浜у搧璇︽儏
+     */
+    @GetMapping("/{id}")
+    @ApiOperation("鏍规嵁ID鑾峰彇浜у搧璇︽儏")
+    public Result<Product> getProductById(@ApiParam("浜у搧ID") @PathVariable Long id) {
+        try {
+            Product product = productService.getProductById(id);
+            if (product == null) {
+                return Result.error("浜у搧涓嶅瓨鍦�");
+            }
+            return Result.success(product);
+        } catch (Exception e) {
+            log.error("鑾峰彇浜у搧璇︽儏澶辫触", e);
+            return Result.error("鑾峰彇浜у搧璇︽儏澶辫触: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 鍒涘缓浜у搧
+     */
+    @PostMapping
+    @ApiOperation("鍒涘缓浜у搧")
+    public Result<Boolean> createProduct(@RequestBody Product product) {
+        try {
+            boolean result = productService.createProduct(product);
+            if (result) {
+                return Result.success("浜у搧鍒涘缓鎴愬姛", true);
+            } else {
+                return Result.error("浜у搧鍒涘缓澶辫触");
+            }
+        } catch (Exception e) {
+            log.error("鍒涘缓浜у搧澶辫触", e);
+            return Result.error("鍒涘缓浜у搧澶辫触: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 鏇存柊浜у搧淇℃伅
+     */
+    @PutMapping("/{id}")
+    @ApiOperation("鏇存柊浜у搧淇℃伅")
+    public Result<Boolean> updateProduct(@ApiParam("浜у搧ID") @PathVariable Long id, @RequestBody Product product) {
+        try {
+            product.setId(id);
+            boolean result = productService.updateProduct(product);
+            if (result) {
+                return Result.success("浜у搧鏇存柊鎴愬姛", true);
+            } else {
+                return Result.error("浜у搧鏇存柊澶辫触");
+            }
+        } catch (Exception e) {
+            log.error("鏇存柊浜у搧澶辫触", e);
+            return Result.error("鏇存柊浜у搧澶辫触: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 鍒犻櫎浜у搧
+     */
+    @DeleteMapping("/{id}")
+    @ApiOperation("鍒犻櫎浜у搧")
+    public Result<Boolean> deleteProduct(@ApiParam("浜у搧ID") @PathVariable Long id) {
+        try {
+            boolean result = productService.deleteProduct(id);
+            if (result) {
+                return Result.success("浜у搧鍒犻櫎鎴愬姛", true);
+            } else {
+                return Result.error("浜у搧鍒犻櫎澶辫触");
+            }
+        } catch (Exception e) {
+            log.error("鍒犻櫎浜у搧澶辫触", e);
+            return Result.error("鍒犻櫎浜у搧澶辫触: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 鏇存柊浜у搧鐘舵��
+     */
+    @PutMapping("/{id}/status")
+    @ApiOperation("鏇存柊浜у搧鐘舵��")
+    public Result<Boolean> updateProductStatus(
+            @ApiParam("浜у搧ID") @PathVariable Long id,
+            @ApiParam("浜у搧鐘舵��") @RequestParam String status) {
+        try {
+            boolean result = productService.updateProductStatus(id, status);
+            if (result) {
+                return Result.success("浜у搧鐘舵�佹洿鏂版垚鍔�", true);
+            } else {
+                return Result.error("浜у搧鐘舵�佹洿鏂板け璐�");
+            }
+        } catch (Exception e) {
+            log.error("鏇存柊浜у搧鐘舵�佸け璐�", e);
+            return Result.error("鏇存柊浜у搧鐘舵�佸け璐�: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 鏇存柊浜у搧瀹℃牳鐘舵��
+     */
+    @PutMapping("/{id}/audit-status")
+    @ApiOperation("鏇存柊浜у搧瀹℃牳鐘舵��")
+    public Result<Boolean> updateProductAuditStatus(
+            @ApiParam("浜у搧ID") @PathVariable Long id,
+            @ApiParam("瀹℃牳鐘舵��") @RequestParam String auditStatus) {
+        try {
+            boolean result = productService.updateProductAuditStatus(id, auditStatus);
+            if (result) {
+                return Result.success("浜у搧瀹℃牳鐘舵�佹洿鏂版垚鍔�", true);
+            } else {
+                return Result.error("浜у搧瀹℃牳鐘舵�佹洿鏂板け璐�");
+            }
+        } catch (Exception e) {
+            log.error("鏇存柊浜у搧瀹℃牳鐘舵�佸け璐�", e);
+            return Result.error("鏇存柊浜у搧瀹℃牳鐘舵�佸け璐�: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 妫�鏌ヤ骇鍝佺紪鐮佹槸鍚﹀瓨鍦�
+     */
+    @GetMapping("/check-code")
+    @ApiOperation("妫�鏌ヤ骇鍝佺紪鐮佹槸鍚﹀瓨鍦�")
+    public Result<Boolean> checkProductCodeExists(
+            @ApiParam("浜у搧缂栫爜") @RequestParam String productCode,
+            @ApiParam("鎺掗櫎鐨勪骇鍝両D") @RequestParam(required = false) Long excludeId) {
+        try {
+            boolean exists = productService.checkProductCodeExists(productCode, excludeId);
+            return Result.success(exists);
+        } catch (Exception e) {
+            log.error("妫�鏌ヤ骇鍝佺紪鐮佸け璐�", e);
+            return Result.error("妫�鏌ヤ骇鍝佺紪鐮佸け璐�: " + e.getMessage());
+        }
+    }
+}
diff --git a/src/main/java/com/webmanage/dto/FileCheckDTO.java b/src/main/java/com/webmanage/dto/FileCheckDTO.java
new file mode 100644
index 0000000..7f3a6a8
--- /dev/null
+++ b/src/main/java/com/webmanage/dto/FileCheckDTO.java
@@ -0,0 +1,35 @@
+package com.webmanage.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 鏂囦欢鏍告煡DTO
+ */
+@Data
+@ApiModel(value = "FileCheckDTO", description = "鏂囦欢鏍告煡")
+public class FileCheckDTO {
+
+    @ApiModelProperty("璁㈠崟ID")
+    @NotBlank(message = "璁㈠崟ID涓嶈兘涓虹┖")
+    private String orderId;
+
+    @ApiModelProperty("鏄惁閫氳繃")
+    @NotNull(message = "瀹℃壒缁撴灉涓嶈兘涓虹┖")
+    private Boolean isApprove;
+
+    @ApiModelProperty("瀹℃壒鎰忚")
+    private String approvalOpinion;
+
+    @ApiModelProperty("瀹℃壒浜篒D")
+    @NotNull(message = "瀹℃壒浜篒D涓嶈兘涓虹┖")
+    private Long approverId;
+
+    @ApiModelProperty("瀹℃壒浜哄鍚�")
+    @NotBlank(message = "瀹℃壒浜哄鍚嶄笉鑳戒负绌�")
+    private String approverName;
+}
diff --git a/src/main/java/com/webmanage/dto/OrderApprovalDTO.java b/src/main/java/com/webmanage/dto/OrderApprovalDTO.java
new file mode 100644
index 0000000..3846aba
--- /dev/null
+++ b/src/main/java/com/webmanage/dto/OrderApprovalDTO.java
@@ -0,0 +1,37 @@
+package com.webmanage.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel("璁㈠崟瀹℃壒DTO")
+public class OrderApprovalDTO {
+
+    @ApiModelProperty("璁㈠崟ID")
+    @NotBlank(message = "璁㈠崟ID涓嶈兘涓虹┖")
+    private String orderId;
+
+    @ApiModelProperty("瀹℃壒鎰忚")
+    @NotBlank(message = "瀹℃壒鎰忚涓嶈兘涓虹┖")
+    private String approvalOpinion;
+
+    @ApiModelProperty("瀹℃壒浜篒D")
+    @NotNull(message = "瀹℃壒浜篒D涓嶈兘涓虹┖")
+    private Long approverId;
+
+    @ApiModelProperty("瀹℃壒浜哄鍚�")
+    @NotBlank(message = "瀹℃壒浜哄鍚嶄笉鑳戒负绌�")
+    private String approverName;
+
+    @ApiModelProperty("瀹℃壒绫诲瀷锛氬鎵�/鎺堟潈")
+    @NotBlank(message = "瀹℃壒绫诲瀷涓嶈兘涓虹┖")
+    private String approvalType;
+
+    @ApiModelProperty("瀹℃壒缁撴灉锛氶�氳繃/椹冲洖")
+    @NotBlank(message = "瀹℃壒缁撴灉涓嶈兘涓虹┖")
+    private String approvalResult;
+}
diff --git a/src/main/java/com/webmanage/dto/UpdateOrderDetailDTO.java b/src/main/java/com/webmanage/dto/UpdateOrderDetailDTO.java
new file mode 100644
index 0000000..f6f82ec
--- /dev/null
+++ b/src/main/java/com/webmanage/dto/UpdateOrderDetailDTO.java
@@ -0,0 +1,56 @@
+package com.webmanage.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * 鏇存柊璁㈠崟璇︽儏DTO
+ */
+@Data
+@ApiModel(value = "UpdateOrderDetailDTO", description = "鏇存柊璁㈠崟璇︽儏")
+public class UpdateOrderDetailDTO {
+
+    @ApiModelProperty("璁㈠崟ID")
+    @NotBlank(message = "璁㈠崟ID涓嶈兘涓虹┖")
+    private String orderId;
+
+    @ApiModelProperty("璁㈠崟鐘舵��")
+    @NotBlank(message = "璁㈠崟鐘舵�佷笉鑳戒负绌�")
+    private String orderStatus;
+
+    @ApiModelProperty("璁㈠崟璇︽儏鍒楄〃")
+    @NotNull(message = "璁㈠崟璇︽儏鍒楄〃涓嶈兘涓虹┖")
+    private List<UpdateOrderDetailItemDTO> orderDetails;
+
+    @Data
+    @ApiModel(value = "UpdateOrderDetailItemDTO", description = "鏇存柊璁㈠崟璇︽儏椤�")
+    public static class UpdateOrderDetailItemDTO {
+        @ApiModelProperty("璁㈠崟璇︽儏ID")
+        @NotNull(message = "璁㈠崟璇︽儏ID涓嶈兘涓虹┖")
+        private Long id;
+
+        @ApiModelProperty("澶囨敞")
+        private String remarks;
+    }
+
+    /**
+     * 鍙洿鏂拌鍗曡鎯呭娉ㄧ殑DTO锛堜笉鏇存柊璁㈠崟鐘舵�侊級
+     */
+    @Data
+    @ApiModel(value = "UpdateOrderDetailRemarksOnlyDTO", description = "鍙洿鏂拌鍗曡鎯呭娉�")
+    public static class UpdateOrderDetailRemarksOnlyDTO {
+
+        @ApiModelProperty("璁㈠崟ID")
+        @NotBlank(message = "璁㈠崟ID涓嶈兘涓虹┖")
+        private String orderId;
+
+        @ApiModelProperty("璁㈠崟璇︽儏鍒楄〃")
+        @NotNull(message = "璁㈠崟璇︽儏鍒楄〃涓嶈兘涓虹┖")
+        private List<UpdateOrderDetailItemDTO> orderDetails;
+    }
+}
diff --git a/src/main/java/com/webmanage/entity/OrderApproval.java b/src/main/java/com/webmanage/entity/OrderApproval.java
new file mode 100644
index 0000000..d4d2558
--- /dev/null
+++ b/src/main/java/com/webmanage/entity/OrderApproval.java
@@ -0,0 +1,68 @@
+package com.webmanage.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+
+/**
+ * 璁㈠崟瀹℃壒璁板綍瀹炰綋绫�
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("order_approval")
+@ApiModel(value = "OrderApproval", description = "璁㈠崟瀹℃壒璁板綍")
+public class OrderApproval {
+
+    @ApiModelProperty("涓婚敭ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("鍏宠仈璁㈠崟ID")
+    @TableField("order_id")
+    private String orderId;
+
+    @ApiModelProperty("瀹℃壒姝ラ")
+    @TableField("approval_step")
+    private String approvalStep;
+
+    @ApiModelProperty("瀹℃壒绫诲瀷锛氬鎵�/鎺堟潈")
+    @TableField("approval_type")
+    private String approvalType;
+
+    @ApiModelProperty("瀹℃壒缁撴灉锛氶�氳繃/椹冲洖")
+    @TableField("approval_result")
+    private String approvalResult;
+
+    @ApiModelProperty("瀹℃壒浜篒D")
+    @TableField("approver_id")
+    private Long approverId;
+
+    @ApiModelProperty("瀹℃壒浜哄鍚�")
+    @TableField("approver_name")
+    private String approverName;
+
+    @ApiModelProperty("瀹℃壒鎰忚")
+    @TableField("approval_opinion")
+    private String approvalOpinion;
+
+    @ApiModelProperty("瀹℃壒鏃堕棿")
+    @TableField("approval_time")
+    private LocalDateTime approvalTime;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(value = "created_at", fill = FieldFill.INSERT)
+    private LocalDateTime createdAt;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    @TableField(value = "updated_at", fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updatedAt;
+
+    @ApiModelProperty("閫昏緫鍒犻櫎锛�1-宸插垹闄わ紝0-鏈垹闄�")
+    @TableLogic
+    @TableField("deleted")
+    private Integer deleted;
+}
diff --git a/src/main/java/com/webmanage/entity/Product.java b/src/main/java/com/webmanage/entity/Product.java
new file mode 100644
index 0000000..13e1f42
--- /dev/null
+++ b/src/main/java/com/webmanage/entity/Product.java
@@ -0,0 +1,143 @@
+package com.webmanage.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 浜у搧瀹炰綋
+ * 
+ * @author webmanage
+ * @date 2024-08-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("product")
+public class Product implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 浜у搧鍚嶇О
+     */
+    @TableField("product_name")
+    private String productName;
+
+    /**
+     * 浜у搧缂栫爜
+     */
+    @TableField("product_code")
+    private String productCode;
+
+    /**
+     * 浜у搧绫诲瀷
+     */
+    @TableField("product_type")
+    private String productType;
+
+    /**
+     * 浜у搧鍒嗙被
+     */
+    @TableField("category")
+    private String category;
+
+    /**
+     * 浜у搧鎻忚堪
+     */
+    @TableField("description")
+    private String description;
+
+    /**
+     * 鎻愪緵鑰匢D
+     */
+    @TableField("provider_id")
+    private Long providerId;
+
+    /**
+     * 鎻愪緵鑰呭悕绉�
+     */
+    @TableField("provider_name")
+    private String providerName;
+
+    /**
+     * 鎻愪緵鑰呯被鍨�
+     */
+    @TableField("provider_type")
+    private String providerType;
+
+    /**
+     * 浜у搧鐘舵��
+     */
+    @TableField("status")
+    private String status;
+
+    /**
+     * 瀹℃牳鐘舵��
+     */
+    @TableField("audit_status")
+    private String auditStatus;
+
+    /**
+     * 浜у搧鏍囩
+     */
+    @TableField("tags")
+    private String tags;
+
+    /**
+     * 灏侀潰鍥剧墖
+     */
+    @TableField("cover_image")
+    private String coverImage;
+
+    /**
+     * 婕旂ず鍦板潃
+     */
+    @TableField("demo_url")
+    private String demoUrl;
+
+    /**
+     * 鏂囨。鍦板潃
+     */
+    @TableField("doc_url")
+    private String docUrl;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @TableField(value = "created_at", fill = FieldFill.INSERT)
+    private LocalDateTime createdAt;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @TableField(value = "updated_at", fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updatedAt;
+
+    /**
+     * 鍒涘缓浜篒D
+     */
+    @TableField("created_by")
+    private Long createdBy;
+
+    /**
+     * 鏇存柊浜篒D
+     */
+    @TableField("updated_by")
+    private Long updatedBy;
+
+    /**
+     * 閫昏緫鍒犻櫎
+     */
+    @TableLogic
+    @TableField("deleted")
+    private Integer deleted;
+}
diff --git a/src/main/java/com/webmanage/mapper/OrderApprovalMapper.java b/src/main/java/com/webmanage/mapper/OrderApprovalMapper.java
new file mode 100644
index 0000000..d426943
--- /dev/null
+++ b/src/main/java/com/webmanage/mapper/OrderApprovalMapper.java
@@ -0,0 +1,12 @@
+package com.webmanage.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.webmanage.entity.OrderApproval;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 璁㈠崟瀹℃壒璁板綍Mapper鎺ュ彛
+ */
+@Mapper
+public interface OrderApprovalMapper extends BaseMapper<OrderApproval> {
+}
diff --git a/src/main/java/com/webmanage/mapper/ProductMapper.java b/src/main/java/com/webmanage/mapper/ProductMapper.java
new file mode 100644
index 0000000..7b5d722
--- /dev/null
+++ b/src/main/java/com/webmanage/mapper/ProductMapper.java
@@ -0,0 +1,58 @@
+package com.webmanage.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.webmanage.entity.Product;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 浜у搧Mapper鎺ュ彛
+ * 
+ * @author webmanage
+ * @date 2024-08-07
+ */
+@Mapper
+public interface ProductMapper extends BaseMapper<Product> {
+
+    /**
+     * 鏍规嵁鏉′欢鏌ヨ浜у搧鍒楄〃
+     * 
+     * @param productName 浜у搧鍚嶇О锛堟ā绯婃煡璇級
+     * @param productType 浜у搧绫诲瀷
+     * @param status 浜у搧鐘舵��
+     * @param providerId 鎻愪緵鑰匢D
+     * @return 浜у搧鍒楄〃
+     */
+    List<Product> selectProductList(@Param("productName") String productName,
+                                   @Param("productType") String productType,
+                                   @Param("status") String status,
+                                   @Param("providerId") Long providerId);
+
+    /**
+     * 鏍规嵁ID鏌ヨ浜у搧璇︽儏
+     * 
+     * @param id 浜у搧ID
+     * @return 浜у搧璇︽儏
+     */
+    Product selectProductById(@Param("id") Long id);
+
+    /**
+     * 鏇存柊浜у搧鐘舵��
+     * 
+     * @param id 浜у搧ID
+     * @param status 鏂扮姸鎬�
+     * @return 鏇存柊缁撴灉
+     */
+    int updateProductStatus(@Param("id") Long id, @Param("status") String status);
+
+    /**
+     * 鏇存柊浜у搧瀹℃牳鐘舵��
+     * 
+     * @param id 浜у搧ID
+     * @param auditStatus 鏂板鏍哥姸鎬�
+     * @return 鏇存柊缁撴灉
+     */
+    int updateProductAuditStatus(@Param("id") Long id, @Param("auditStatus") String auditStatus);
+}
diff --git a/src/main/java/com/webmanage/service/OrderInfoService.java b/src/main/java/com/webmanage/service/OrderInfoService.java
index d50282a..63de046 100644
--- a/src/main/java/com/webmanage/service/OrderInfoService.java
+++ b/src/main/java/com/webmanage/service/OrderInfoService.java
@@ -3,9 +3,12 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.webmanage.common.PageResult;
 import com.webmanage.dto.CreateOrderDTO;
+import com.webmanage.dto.FileCheckDTO;
 import com.webmanage.dto.OrderQueryDTO;
+import com.webmanage.dto.UpdateOrderDetailDTO;
 import com.webmanage.entity.OrderInfo;
 import com.webmanage.vo.OrderDetailVO;
+import com.webmanage.dto.OrderApprovalDTO;
 
 /**
  * 璁㈠崟淇℃伅Service鎺ュ彛
@@ -40,10 +43,10 @@
     /**
      * 涓婁紶璁㈠崟闄勪欢
      */
-    boolean uploadOrderAttachment(String orderId, String fileName, String originalName, 
-                                String fileType, Long fileSize, String fileUrl, 
-                                String bucketName, String objectName, Long uploadUserId, 
-                                String uploadUserName, String attachmentType, String description);
+    Long uploadOrderAttachment(String orderId, String fileName, String originalName, 
+                             String fileType, Long fileSize, String fileUrl, 
+                             String bucketName, String objectName, Long uploadUserId, 
+                             String uploadUserName, String attachmentType, String description);
 
     /**
      * 娣诲姞璁㈠崟璇勪环
@@ -54,6 +57,27 @@
                              Boolean isAnonymous);
 
     /**
+     * 鏇存柊璁㈠崟鐘舵�佸埌涓嬩竴涓姸鎬�
+     * @param orderId 璁㈠崟ID
+     * @return 鏄惁鏇存柊鎴愬姛
+     */
+    boolean updateOrderStatusToNext(String orderId);
+
+    /**
+     * 鍒犻櫎璁㈠崟闄勪欢
+     * @param attachmentId 闄勪欢ID
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    boolean deleteOrderAttachment(Long attachmentId);
+
+    /**
+     * 鏇存柊璁㈠崟鐘舵�佸埌涓婁竴涓姸鎬�
+     * @param orderId 璁㈠崟ID
+     * @return 鏄惁鏇存柊鎴愬姛
+     */
+    boolean updateOrderStatusToPrevious(String orderId);
+
+    /**
      * 浜ゆ槗纭
      */
     boolean confirmTransaction(String orderId, Long userId);
@@ -62,4 +86,40 @@
      * 鍥炲璇勪环
      */
     boolean replyEvaluation(Long evaluationId, String replyContent, Long replyUserId);
+
+    /**
+     * 鏇存柊璁㈠崟璇︽儏锛堝寘鍚鍗曠姸鎬佸拰璇︽儏澶囨敞锛�
+     */
+    boolean updateOrderDetail(UpdateOrderDetailDTO updateOrderDetailDTO);
+
+    /**
+     * 鏂囦欢鏍告煡
+     */
+    boolean checkFiles(FileCheckDTO fileCheckDTO);
+
+    /**
+     * 瀹℃壒閫氳繃
+     */
+    boolean approveOrder(OrderApprovalDTO orderApprovalDTO);
+
+    /**
+     * 妫�鏌ヨ鍗曟槸鍚﹀寘鍚崗璁被鍨嬬殑瀛愯鍗�
+     * @param orderId 璁㈠崟ID
+     * @return 鏄惁鍖呭惈鍗忚绫诲瀷瀛愯鍗�
+     */
+    boolean hasAgreementPriceType(String orderId);
+
+    /**
+     * 鍙洿鏂拌鍗曡鎯呯殑澶囨敞淇℃伅锛堜笉鏇存柊璁㈠崟鐘舵�侊級
+     * @param updateOrderDetailDTO 鏇存柊璁㈠崟璇︽儏DTO
+     * @return 鏄惁鏇存柊鎴愬姛
+     */
+    boolean updateOrderDetailRemarksOnly(UpdateOrderDetailDTO.UpdateOrderDetailRemarksOnlyDTO updateOrderDetailDTO);
+
+    /**
+     * 鍙栨秷璁㈠崟
+     * @param orderId 璁㈠崟ID
+     * @return 鏄惁鍙栨秷鎴愬姛
+     */
+    boolean cancelOrder(String orderId);
 }
diff --git a/src/main/java/com/webmanage/service/ProductService.java b/src/main/java/com/webmanage/service/ProductService.java
new file mode 100644
index 0000000..a02abe0
--- /dev/null
+++ b/src/main/java/com/webmanage/service/ProductService.java
@@ -0,0 +1,85 @@
+package com.webmanage.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.webmanage.entity.Product;
+
+import java.util.List;
+
+/**
+ * 浜у搧鏈嶅姟鎺ュ彛
+ * 
+ * @author webmanage
+ * @date 2024-08-07
+ */
+public interface ProductService extends IService<Product> {
+
+    /**
+     * 鑾峰彇浜у搧鍒楄〃
+     * 
+     * @param productName 浜у搧鍚嶇О锛堟ā绯婃煡璇級
+     * @param productType 浜у搧绫诲瀷
+     * @param status 浜у搧鐘舵��
+     * @param providerId 鎻愪緵鑰匢D
+     * @return 浜у搧鍒楄〃
+     */
+    List<Product> getProductList(String productName, String productType, String status, Long providerId);
+
+    /**
+     * 鏍规嵁ID鑾峰彇浜у搧璇︽儏
+     * 
+     * @param id 浜у搧ID
+     * @return 浜у搧璇︽儏
+     */
+    Product getProductById(Long id);
+
+    /**
+     * 鍒涘缓浜у搧
+     * 
+     * @param product 浜у搧淇℃伅
+     * @return 鍒涘缓缁撴灉
+     */
+    boolean createProduct(Product product);
+
+    /**
+     * 鏇存柊浜у搧淇℃伅
+     * 
+     * @param product 浜у搧淇℃伅
+     * @return 鏇存柊缁撴灉
+     */
+    boolean updateProduct(Product product);
+
+    /**
+     * 鍒犻櫎浜у搧
+     * 
+     * @param id 浜у搧ID
+     * @return 鍒犻櫎缁撴灉
+     */
+    boolean deleteProduct(Long id);
+
+    /**
+     * 鏇存柊浜у搧鐘舵��
+     * 
+     * @param id 浜у搧ID
+     * @param status 鏂扮姸鎬�
+     * @return 鏇存柊缁撴灉
+     */
+    boolean updateProductStatus(Long id, String status);
+
+    /**
+     * 鏇存柊浜у搧瀹℃牳鐘舵��
+     * 
+     * @param id 浜у搧ID
+     * @param auditStatus 鏂板鏍哥姸鎬�
+     * @return 鏇存柊缁撴灉
+     */
+    boolean updateProductAuditStatus(Long id, String auditStatus);
+
+    /**
+     * 妫�鏌ヤ骇鍝佺紪鐮佹槸鍚﹀瓨鍦�
+     * 
+     * @param productCode 浜у搧缂栫爜
+     * @param excludeId 鎺掗櫎鐨勪骇鍝両D锛堢敤浜庢洿鏂版椂妫�鏌ワ級
+     * @return 鏄惁瀛樺湪
+     */
+    boolean checkProductCodeExists(String productCode, Long excludeId);
+}
diff --git a/src/main/java/com/webmanage/service/impl/OrderInfoServiceImpl.java b/src/main/java/com/webmanage/service/impl/OrderInfoServiceImpl.java
index c981a09..7ec425c 100644
--- a/src/main/java/com/webmanage/service/impl/OrderInfoServiceImpl.java
+++ b/src/main/java/com/webmanage/service/impl/OrderInfoServiceImpl.java
@@ -8,17 +8,23 @@
 import com.webmanage.common.PageResult;
 import com.webmanage.dto.CreateOrderDTO;
 import com.webmanage.dto.CreateOrderItemDTO;
+import com.webmanage.dto.FileCheckDTO;
+import com.webmanage.dto.OrderApprovalDTO;
 import com.webmanage.dto.OrderQueryDTO;
+import com.webmanage.dto.UpdateOrderDetailDTO;
+import com.webmanage.entity.OrderApproval;
 import com.webmanage.entity.OrderAttachment;
 import com.webmanage.entity.OrderDetail;
 import com.webmanage.entity.OrderEvaluation;
 import com.webmanage.entity.OrderInfo;
+import com.webmanage.mapper.OrderApprovalMapper;
 import com.webmanage.mapper.OrderAttachmentMapper;
 import com.webmanage.mapper.OrderDetailMapper;
 import com.webmanage.mapper.OrderEvaluationMapper;
 import com.webmanage.mapper.OrderInfoMapper;
 import com.webmanage.service.OrderInfoService;
 import com.webmanage.service.OrderNoService;
+import com.webmanage.service.MinioService;
 import com.webmanage.vo.OrderAttachmentVO;
 import com.webmanage.vo.OrderDetailItemVO;
 import com.webmanage.vo.OrderDetailVO;
@@ -53,7 +59,13 @@
     private OrderEvaluationMapper orderEvaluationMapper;
 
     @Resource
+    private OrderApprovalMapper orderApprovalMapper;
+
+    @Resource
     private OrderNoService orderNoService;
+
+    @Resource
+    private MinioService minioService;
 
     @Override
     public PageResult<OrderInfo> getBuyerOrderPage(OrderQueryDTO queryDTO) {
@@ -90,8 +102,8 @@
     @Override
     public PageResult<OrderInfo> getSellerOrderPage(OrderQueryDTO queryDTO) {
         // 鍙傛暟鏍¢獙
-        if (queryDTO.getUserId() == null) {
-            throw new BusinessException("鐢ㄦ埛ID涓嶈兘涓虹┖");
+        if (queryDTO.getProviderId() == null) {
+            throw new BusinessException("鎻愪緵鑰匢D涓嶈兘涓虹┖");
         }
 
         // 鍒涘缓鍒嗛〉瀵硅薄
@@ -99,7 +111,7 @@
 
         // 鎵ц鍒嗛〉鏌ヨ
         IPage<OrderInfo> result = baseMapper.selectSellerOrderPage(
-            page, queryDTO.getUserId(), queryDTO.getOrderStatus(), queryDTO.getPaymentStatus(),
+            page, queryDTO.getProviderId(), queryDTO.getOrderStatus(), queryDTO.getPaymentStatus(),
             queryDTO.getProductName(), queryDTO.getOrderId(),
             queryDTO.getApplyTimeStart() != null ? queryDTO.getApplyTimeStart().toString() : null,
             queryDTO.getApplyTimeEnd() != null ? queryDTO.getApplyTimeEnd().toString() : null,
@@ -219,7 +231,11 @@
         orderInfo.setUserId(createOrderDTO.getUserId());
         orderInfo.setUnitId(createOrderDTO.getUnitId());
         orderInfo.setApplyTime(LocalDateTime.now());
-        orderInfo.setOrderStatus("寰呭鎵�");
+        
+        // 鏍规嵁璁㈠崟鏄庣粏涓槸鍚﹀寘鍚崗璁环鏍肩被鍨嬫潵鍐冲畾鍒濆鐘舵��
+        String initialStatus = determineInitialOrderStatus(createOrderDTO.getItems());
+        orderInfo.setOrderStatus(initialStatus);
+        
         orderInfo.setTotalAmount(createOrderDTO.getTotalAmount() != null ? createOrderDTO.getTotalAmount() : totalAmount);
         orderInfo.setPaymentType(createOrderDTO.getPaymentType());
         orderInfo.setPaymentStatus("鏈敮浠�");
@@ -263,10 +279,10 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean uploadOrderAttachment(String orderId, String fileName, String originalName, 
-                                      String fileType, Long fileSize, String fileUrl, 
-                                      String bucketName, String objectName, Long uploadUserId, 
-                                      String uploadUserName, String attachmentType, String description) {
+    public Long uploadOrderAttachment(String orderId, String fileName, String originalName, 
+                                    String fileType, Long fileSize, String fileUrl, 
+                                    String bucketName, String objectName, Long uploadUserId, 
+                                    String uploadUserName, String attachmentType, String description) {
         // 鍙傛暟鏍¢獙
         if (!StringUtils.hasText(orderId)) {
             throw new BusinessException("璁㈠崟ID涓嶈兘涓虹┖");
@@ -296,8 +312,13 @@
         attachment.setAttachmentType(attachmentType);
         attachment.setDescription(description);
 
-        // 淇濆瓨闄勪欢
-        return orderAttachmentMapper.insert(attachment) > 0;
+        // 淇濆瓨闄勪欢骞惰繑鍥為檮浠禝D
+        int result = orderAttachmentMapper.insert(attachment);
+        if (result > 0) {
+            return attachment.getId();
+        } else {
+            throw new BusinessException("淇濆瓨闄勪欢澶辫触");
+        }
     }
 
     @Override
@@ -419,4 +440,504 @@
         // 淇濆瓨璇勪环
         return orderEvaluationMapper.updateById(evaluation) > 0;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateOrderDetail(UpdateOrderDetailDTO updateOrderDetailDTO) {
+        // 鍙傛暟鏍¢獙
+        if (updateOrderDetailDTO == null) {
+            throw new BusinessException("鏇存柊鍙傛暟涓嶈兘涓虹┖");
+        }
+        if (!StringUtils.hasText(updateOrderDetailDTO.getOrderId())) {
+            throw new BusinessException("璁㈠崟ID涓嶈兘涓虹┖");
+        }
+        if (!StringUtils.hasText(updateOrderDetailDTO.getOrderStatus())) {
+            throw new BusinessException("璁㈠崟鐘舵�佷笉鑳戒负绌�");
+        }
+        if (CollectionUtils.isEmpty(updateOrderDetailDTO.getOrderDetails())) {
+            throw new BusinessException("璁㈠崟璇︽儏鍒楄〃涓嶈兘涓虹┖");
+        }
+
+        // 鏌ヨ璁㈠崟淇℃伅
+        OrderInfo orderInfo = this.getById(updateOrderDetailDTO.getOrderId());
+        if (orderInfo == null) {
+            throw new BusinessException("璁㈠崟涓嶅瓨鍦�");
+        }
+
+        // 鏇存柊璁㈠崟鐘舵��
+        orderInfo.setOrderStatus(updateOrderDetailDTO.getOrderStatus());
+        orderInfo.setUpdatedAt(LocalDateTime.now());
+        int orderUpdated = this.baseMapper.updateById(orderInfo);
+        if (orderUpdated <= 0) {
+            throw new BusinessException("鏇存柊璁㈠崟鐘舵�佸け璐�");
+        }
+
+        // 鏇存柊璁㈠崟璇︽儏澶囨敞
+        for (UpdateOrderDetailDTO.UpdateOrderDetailItemDTO itemDTO : updateOrderDetailDTO.getOrderDetails()) {
+            if (itemDTO.getId() == null) {
+                continue;
+            }
+            
+            OrderDetail orderDetail = orderDetailMapper.selectById(itemDTO.getId());
+            if (orderDetail == null) {
+                log.warn("璁㈠崟璇︽儏涓嶅瓨鍦紝ID: {}", itemDTO.getId());
+                continue;
+            }
+            
+            // 鏇存柊澶囨敞
+            orderDetail.setRemarks(itemDTO.getRemarks());
+            orderDetail.setUpdatedAt(LocalDateTime.now());
+            
+            int detailUpdated = orderDetailMapper.updateById(orderDetail);
+            if (detailUpdated <= 0) {
+                log.warn("鏇存柊璁㈠崟璇︽儏澶辫触锛孖D: {}", itemDTO.getId());
+            }
+        }
+
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean checkFiles(FileCheckDTO fileCheckDTO) {
+        // 鍙傛暟鏍¢獙
+        if (fileCheckDTO == null) {
+            throw new BusinessException("鏂囦欢鏍告煡鍙傛暟涓嶈兘涓虹┖");
+        }
+        if (!StringUtils.hasText(fileCheckDTO.getOrderId())) {
+            throw new BusinessException("璁㈠崟ID涓嶈兘涓虹┖");
+        }
+        if (fileCheckDTO.getIsApprove() == null) {
+            throw new BusinessException("瀹℃壒缁撴灉涓嶈兘涓虹┖");
+        }
+        if (fileCheckDTO.getApproverId() == null) {
+            throw new BusinessException("瀹℃壒浜篒D涓嶈兘涓虹┖");
+        }
+        if (!StringUtils.hasText(fileCheckDTO.getApproverName())) {
+            throw new BusinessException("瀹℃壒浜哄鍚嶄笉鑳戒负绌�");
+        }
+
+        // 鏌ヨ璁㈠崟淇℃伅
+        OrderInfo orderInfo = this.getById(fileCheckDTO.getOrderId());
+        if (orderInfo == null) {
+            throw new BusinessException("璁㈠崟涓嶅瓨鍦�");
+        }
+
+        // 妫�鏌ヨ鍗曠姸鎬佹槸鍚︿负"寰呮巿鏉�"
+        if (!"寰呮巿鏉�".equals(orderInfo.getOrderStatus())) {
+            throw new BusinessException("璁㈠崟鐘舵�佷笉姝g‘锛屽綋鍓嶇姸鎬佷负锛�" + orderInfo.getOrderStatus());
+        }
+
+        // 鏇存柊璁㈠崟鐘舵��
+        if (fileCheckDTO.getIsApprove()) {
+            // 閫氳繃锛氭洿鏂颁负"寰呬氦鏄撶‘璁�"
+            orderInfo.setOrderStatus("寰呬氦鏄撶‘璁�");
+        } else {
+            // 椹冲洖锛氭洿鏂颁负"寰呬笂浼犳枃浠�"(闇�瑕侀噸鏂颁笂浼�)
+            orderInfo.setOrderStatus("寰呬笂浼犳枃浠�");
+        }
+        orderInfo.setUpdatedAt(LocalDateTime.now());
+
+        // 淇濆瓨璁㈠崟
+        int updated = this.baseMapper.updateById(orderInfo);
+        if (updated <= 0) {
+            throw new BusinessException("鏇存柊璁㈠崟鐘舵�佸け璐�");
+        }
+
+        log.info("鏂囦欢鏍告煡瀹屾垚锛岃鍗旾D: {}, 瀹℃壒缁撴灉: {}, 瀹℃壒浜�: {}, 瀹℃壒鎰忚: {}", 
+                fileCheckDTO.getOrderId(), 
+                fileCheckDTO.getIsApprove() ? "閫氳繃" : "椹冲洖",
+                fileCheckDTO.getApproverName(), 
+                fileCheckDTO.getApprovalOpinion());
+        
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean approveOrder(OrderApprovalDTO orderApprovalDTO) {
+        // 鍙傛暟鏍¢獙
+        if (orderApprovalDTO == null) {
+            throw new BusinessException("瀹℃壒鍙傛暟涓嶈兘涓虹┖");
+        }
+        if (!StringUtils.hasText(orderApprovalDTO.getOrderId())) {
+            throw new BusinessException("璁㈠崟ID涓嶈兘涓虹┖");
+        }
+        if (!StringUtils.hasText(orderApprovalDTO.getApprovalOpinion())) {
+            throw new BusinessException("瀹℃壒鎰忚涓嶈兘涓虹┖");
+        }
+        if (orderApprovalDTO.getApproverId() == null) {
+            throw new BusinessException("瀹℃壒浜篒D涓嶈兘涓虹┖");
+        }
+        if (!StringUtils.hasText(orderApprovalDTO.getApproverName())) {
+            throw new BusinessException("瀹℃壒浜哄鍚嶄笉鑳戒负绌�");
+        }
+        if (!StringUtils.hasText(orderApprovalDTO.getApprovalType())) {
+            throw new BusinessException("瀹℃壒绫诲瀷涓嶈兘涓虹┖");
+        }
+        if (!StringUtils.hasText(orderApprovalDTO.getApprovalResult())) {
+            throw new BusinessException("瀹℃壒缁撴灉涓嶈兘涓虹┖");
+        }
+
+        // 鏌ヨ璁㈠崟淇℃伅
+        OrderInfo orderInfo = this.getById(orderApprovalDTO.getOrderId());
+        if (orderInfo == null) {
+            throw new BusinessException("璁㈠崟涓嶅瓨鍦�");
+        }
+
+        // 鍒涘缓瀹℃壒璁板綍
+        OrderApproval orderApproval = new OrderApproval();
+        orderApproval.setOrderId(orderApprovalDTO.getOrderId());
+        orderApproval.setApprovalStep("瀹℃壒鎺堟潈");
+        orderApproval.setApprovalType(orderApprovalDTO.getApprovalType());
+        orderApproval.setApprovalResult(orderApprovalDTO.getApprovalResult());
+        orderApproval.setApproverId(orderApprovalDTO.getApproverId());
+        orderApproval.setApproverName(orderApprovalDTO.getApproverName());
+        orderApproval.setApprovalOpinion(orderApprovalDTO.getApprovalOpinion());
+        orderApproval.setApprovalTime(LocalDateTime.now());
+
+        // 鎻掑叆瀹℃壒璁板綍
+        int insertResult = orderApprovalMapper.insert(orderApproval);
+        if (insertResult <= 0) {
+            throw new BusinessException("鎻掑叆瀹℃壒璁板綍澶辫触");
+        }
+
+        log.info("瀹℃壒璁板綍娣诲姞鎴愬姛锛岃鍗旾D: {}, 瀹℃壒绫诲瀷: {}, 瀹℃壒缁撴灉: {}, 瀹℃壒浜�: {}, 瀹℃壒鎰忚: {}", 
+                orderApprovalDTO.getOrderId(),
+                orderApprovalDTO.getApprovalType(),
+                orderApprovalDTO.getApprovalResult(),
+                orderApprovalDTO.getApproverName(), 
+                orderApprovalDTO.getApprovalOpinion());
+        
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateOrderStatusToNext(String orderId) {
+        // 鍙傛暟鏍¢獙
+        if (!StringUtils.hasText(orderId)) {
+            throw new BusinessException("璁㈠崟ID涓嶈兘涓虹┖");
+        }
+
+        // 鏌ヨ璁㈠崟淇℃伅
+        OrderInfo orderInfo = this.getById(orderId);
+        if (orderInfo == null) {
+            throw new BusinessException("璁㈠崟涓嶅瓨鍦�");
+        }
+
+        // 鑾峰彇褰撳墠鐘舵��
+        String currentStatus = orderInfo.getOrderStatus();
+        if (!StringUtils.hasText(currentStatus)) {
+            throw new BusinessException("璁㈠崟褰撳墠鐘舵�佷负绌�");
+        }
+
+        // 鑾峰彇涓嬩竴涓姸鎬�
+        String nextStatus = getNextOrderStatus(currentStatus);
+        if (nextStatus == null) {
+            throw new BusinessException("褰撳墠鐘舵�� " + currentStatus + " 宸叉槸鏈�缁堢姸鎬侊紝鏃犳硶缁х画娴佽浆");
+        }
+
+        // 鏇存柊璁㈠崟鐘舵��
+        orderInfo.setOrderStatus(nextStatus);
+        orderInfo.setUpdatedAt(LocalDateTime.now());
+
+        int updated = this.baseMapper.updateById(orderInfo);
+        if (updated <= 0) {
+            throw new BusinessException("鏇存柊璁㈠崟鐘舵�佸け璐�");
+        }
+
+        log.info("璁㈠崟鐘舵�佹洿鏂版垚鍔燂紝璁㈠崟ID: {}, 浠� {} 鏇存柊涓� {}", orderId, currentStatus, nextStatus);
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateOrderStatusToPrevious(String orderId) {
+        // 鍙傛暟鏍¢獙
+        if (!StringUtils.hasText(orderId)) {
+            throw new BusinessException("璁㈠崟ID涓嶈兘涓虹┖");
+        }
+
+        // 鏌ヨ璁㈠崟淇℃伅
+        OrderInfo orderInfo = this.getById(orderId);
+        if (orderInfo == null) {
+            throw new BusinessException("璁㈠崟涓嶅瓨鍦�");
+        }
+
+        // 鑾峰彇褰撳墠鐘舵��
+        String currentStatus = orderInfo.getOrderStatus();
+        if (!StringUtils.hasText(currentStatus)) {
+            throw new BusinessException("璁㈠崟褰撳墠鐘舵�佷负绌�");
+        }
+
+        // 鑾峰彇涓婁竴涓姸鎬�
+        String previousStatus = getPreviousOrderStatus(currentStatus);
+        if (previousStatus == null) {
+            throw new BusinessException("褰撳墠鐘舵�� " + currentStatus + " 宸叉槸鍒濆鐘舵�侊紝鏃犳硶鍥為��");
+        }
+
+        // 鏇存柊璁㈠崟鐘舵��
+        orderInfo.setOrderStatus(previousStatus);
+        orderInfo.setUpdatedAt(LocalDateTime.now());
+
+        int updated = this.baseMapper.updateById(orderInfo);
+        if (updated <= 0) {
+            throw new BusinessException("鏇存柊璁㈠崟鐘舵�佸け璐�");
+        }
+
+        log.info("璁㈠崟鐘舵�佹洿鏂版垚鍔燂紝璁㈠崟ID: {}, 浠� {} 鍥為��涓� {}", orderId, currentStatus, previousStatus);
+        return true;
+    }
+
+    /**
+     * 鏍规嵁璁㈠崟鏄庣粏纭畾鍒濆璁㈠崟鐘舵��
+     * @param items 璁㈠崟鏄庣粏鍒楄〃
+     * @return 鍒濆鐘舵��
+     */
+    private String determineInitialOrderStatus(List<CreateOrderItemDTO> items) {
+        // 妫�鏌ユ槸鍚︽湁浠锋牸绫诲瀷涓�"鍗忚"鐨勬槑缁嗛」
+        boolean hasAgreementPrice = items.stream()
+                .anyMatch(item -> "鍗忚".equals(item.getPriceType()));
+        
+        // 濡傛灉鏈夊崗璁环鏍硷紝浠�"寰呬笂浼犳枃浠�"寮�濮嬶紝鍚﹀垯浠�"寰呮巿鏉�"寮�濮�
+        String initialStatus = hasAgreementPrice ? "寰呬笂浼犳枃浠�" : "寰呮巿鏉�";
+        
+        log.info("璁㈠崟鍒濆鐘舵�佺‘瀹氫负: {}, 鏄惁鍖呭惈鍗忚浠锋牸: {}", initialStatus, hasAgreementPrice);
+        return initialStatus;
+    }
+
+    /**
+     * 鑾峰彇涓嬩竴涓鍗曠姸鎬�
+     * @param currentStatus 褰撳墠鐘舵��
+     * @return 涓嬩竴涓姸鎬侊紝濡傛灉鏄渶缁堢姸鎬佸垯杩斿洖null
+     */
+    private String getNextOrderStatus(String currentStatus) {
+        switch (currentStatus) {
+            case "寰呬笂浼犳枃浠�":
+                return "寰呮巿鏉�";
+            case "寰呮巿鏉�":
+                return "寰呬氦鏄撶‘璁�";
+            case "寰呬氦鏄撶‘璁�":
+                return "宸插畬鎴�";
+            case "宸插畬鎴�":
+                return "宸茶瘎浠�";
+            case "宸茶瘎浠�":
+                return null; // 鏈�缁堢姸鎬�
+            default:
+                throw new BusinessException("鏈煡鐨勮鍗曠姸鎬侊細" + currentStatus);
+        }
+    }
+
+    /**
+     * 鑾峰彇涓婁竴涓鍗曠姸鎬�
+     * @param currentStatus 褰撳墠鐘舵��
+     * @return 涓婁竴涓姸鎬侊紝濡傛灉鏄垵濮嬬姸鎬佸垯杩斿洖null
+     */
+    private String getPreviousOrderStatus(String currentStatus) {
+        switch (currentStatus) {
+            case "寰呬笂浼犳枃浠�":
+                return null; // 鍒濆鐘舵��
+            case "寰呮巿鏉�":
+                return "寰呬笂浼犳枃浠�";
+            case "寰呬氦鏄撶‘璁�":
+                return "寰呮巿鏉�";
+            case "宸插畬鎴�":
+                return "寰呬氦鏄撶‘璁�";
+            case "宸茶瘎浠�":
+                return "宸插畬鎴�";
+            default:
+                throw new BusinessException("鏈煡鐨勮鍗曠姸鎬侊細" + currentStatus);
+        }
+    }
+
+    @Override
+    public boolean hasAgreementPriceType(String orderId) {
+        // 鍙傛暟鏍¢獙
+        if (!StringUtils.hasText(orderId)) {
+            throw new BusinessException("璁㈠崟ID涓嶈兘涓虹┖");
+        }
+
+        // 鏌ヨ璁㈠崟璇︽儏锛屾鏌ユ槸鍚︽湁浠锋牸绫诲瀷涓�"鍗忚"鐨勫瓙璁㈠崟
+        QueryWrapper<OrderDetail> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("order_id", orderId);
+        queryWrapper.eq("price_type", "鍗忚");
+        queryWrapper.eq("deleted", 0);
+
+        List<OrderDetail> agreementDetails = orderDetailMapper.selectList(queryWrapper);
+        
+        boolean hasAgreement = !CollectionUtils.isEmpty(agreementDetails);
+        log.info("妫�鏌ヨ鍗曞崗璁被鍨嬶紝璁㈠崟ID: {}, 鏄惁鍖呭惈鍗忚绫诲瀷: {}", orderId, hasAgreement);
+        
+        return hasAgreement;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateOrderDetailRemarksOnly(UpdateOrderDetailDTO.UpdateOrderDetailRemarksOnlyDTO updateOrderDetailDTO) {
+        // 鍙傛暟鏍¢獙
+        if (updateOrderDetailDTO == null) {
+            throw new BusinessException("鏇存柊鍙傛暟涓嶈兘涓虹┖");
+        }
+        if (!StringUtils.hasText(updateOrderDetailDTO.getOrderId())) {
+            throw new BusinessException("璁㈠崟ID涓嶈兘涓虹┖");
+        }
+        if (CollectionUtils.isEmpty(updateOrderDetailDTO.getOrderDetails())) {
+            throw new BusinessException("璁㈠崟璇︽儏鍒楄〃涓嶈兘涓虹┖");
+        }
+
+        // 鏌ヨ璁㈠崟淇℃伅锛堥獙璇佽鍗曞瓨鍦級
+        OrderInfo orderInfo = this.getById(updateOrderDetailDTO.getOrderId());
+        if (orderInfo == null) {
+            throw new BusinessException("璁㈠崟涓嶅瓨鍦�");
+        }
+
+        // 鍙洿鏂拌鍗曡鎯呭娉紝涓嶆洿鏂拌鍗曠姸鎬�
+        for (UpdateOrderDetailDTO.UpdateOrderDetailItemDTO itemDTO : updateOrderDetailDTO.getOrderDetails()) {
+            if (itemDTO.getId() == null) {
+                continue;
+            }
+            
+            OrderDetail orderDetail = orderDetailMapper.selectById(itemDTO.getId());
+            if (orderDetail == null) {
+                log.warn("璁㈠崟璇︽儏涓嶅瓨鍦紝ID: {}", itemDTO.getId());
+                continue;
+            }
+            
+            // 鏇存柊澶囨敞
+            orderDetail.setRemarks(itemDTO.getRemarks());
+            orderDetail.setUpdatedAt(LocalDateTime.now());
+            
+            int detailUpdated = orderDetailMapper.updateById(orderDetail);
+            if (detailUpdated <= 0) {
+                log.warn("鏇存柊璁㈠崟璇︽儏澶辫触锛孖D: {}", itemDTO.getId());
+            }
+        }
+
+        log.info("璁㈠崟璇︽儏澶囨敞鏇存柊鎴愬姛锛岃鍗旾D: {}", updateOrderDetailDTO.getOrderId());
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean deleteOrderAttachment(Long attachmentId) {
+        // 鍙傛暟鏍¢獙
+        if (attachmentId == null) {
+            throw new BusinessException("闄勪欢ID涓嶈兘涓虹┖");
+        }
+
+        log.info("寮�濮嬪垹闄よ鍗曢檮浠讹紝闄勪欢ID: {}", attachmentId);
+
+        // 鏌ヨ闄勪欢淇℃伅
+        OrderAttachment attachment = orderAttachmentMapper.selectById(attachmentId);
+        if (attachment == null) {
+            log.error("闄勪欢涓嶅瓨鍦紝闄勪欢ID: {}", attachmentId);
+            throw new BusinessException("闄勪欢涓嶅瓨鍦�");
+        }
+
+        log.info("鏌ヨ鍒伴檮浠朵俊鎭�: ID={}, 鏂囦欢鍚�={}, 瀵硅薄鍚嶇О={}, 褰撳墠鍒犻櫎鐘舵��={}", 
+                attachment.getId(), attachment.getFileName(), attachment.getObjectName(), attachment.getDeleted());
+
+        try {
+            // 1. 鍒犻櫎MinIO涓殑鏂囦欢
+            if (StringUtils.hasText(attachment.getObjectName())) {
+                log.info("寮�濮嬪垹闄inIO鏂囦欢锛屽璞″悕绉�: {}", attachment.getObjectName());
+                minioService.deleteFile(attachment.getObjectName());
+                log.info("MinIO鏂囦欢鍒犻櫎鎴愬姛锛屽璞″悕绉�: {}", attachment.getObjectName());
+            } else {
+                log.warn("闄勪欢瀵硅薄鍚嶇О涓虹┖锛岃烦杩嘙inIO鏂囦欢鍒犻櫎");
+            }
+
+            // 2. 鍒犻櫎鏁版嵁搴撲腑鐨勯檮浠惰褰曪紙閫昏緫鍒犻櫎锛�
+            log.info("寮�濮嬮�昏緫鍒犻櫎鏁版嵁搴撹褰曪紝闄勪欢ID: {}", attachmentId);
+            
+            // 浣跨敤MyBatis-Plus鐨勯�昏緫鍒犻櫎鏂规硶
+            int result = orderAttachmentMapper.deleteById(attachmentId);
+            log.info("鏁版嵁搴撻�昏緫鍒犻櫎缁撴灉: 褰卞搷琛屾暟={}", result);
+            
+            if (result > 0) {
+                log.info("璁㈠崟闄勪欢鍒犻櫎鎴愬姛锛岄檮浠禝D: {}, 鏂囦欢鍚�: {}", attachmentId, attachment.getFileName());
+                return true;
+            } else {
+                log.error("鏁版嵁搴撴洿鏂板け璐ワ紝褰卞搷琛屾暟涓�0锛岄檮浠禝D: {}", attachmentId);
+                throw new BusinessException("鍒犻櫎闄勪欢璁板綍澶辫触");
+            }
+        } catch (Exception e) {
+            log.error("鍒犻櫎璁㈠崟闄勪欢澶辫触锛岄檮浠禝D: {}", attachmentId, e);
+            throw new BusinessException("鍒犻櫎璁㈠崟闄勪欢澶辫触锛�" + e.getMessage());
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean cancelOrder(String orderId) {
+        // 鍙傛暟鏍¢獙
+        if (!StringUtils.hasText(orderId)) {
+            throw new BusinessException("璁㈠崟ID涓嶈兘涓虹┖");
+        }
+
+        log.info("寮�濮嬪彇娑堣鍗曪紝璁㈠崟ID: {}", orderId);
+
+        // 鏌ヨ璁㈠崟淇℃伅
+        OrderInfo orderInfo = this.getById(orderId);
+        if (orderInfo == null) {
+            throw new BusinessException("璁㈠崟涓嶅瓨鍦�");
+        }
+
+        // 妫�鏌ヨ鍗曠姸鎬侊紝鍙湁"宸插畬鎴�"鐘舵�佸墠鐨勮鍗曟墠鑳藉彇娑�
+        String currentStatus = orderInfo.getOrderStatus();
+        if ("宸插畬鎴�".equals(currentStatus) || "宸茶瘎浠�".equals(currentStatus)) {
+            throw new BusinessException("宸插畬鎴愭垨宸茶瘎浠风殑璁㈠崟涓嶈兘鍙栨秷");
+        }
+
+        try {
+            // 1. 鍒犻櫎璁㈠崟闄勪欢锛堝寘鎷琈inIO鏂囦欢鍜屾暟鎹簱璁板綍锛�
+            log.info("寮�濮嬪垹闄よ鍗曢檮浠讹紝璁㈠崟ID: {}", orderId);
+            List<OrderAttachment> attachments = orderAttachmentMapper.selectByOrderId(orderId);
+            for (OrderAttachment attachment : attachments) {
+                try {
+                    // 鍒犻櫎MinIO涓殑鏂囦欢
+                    if (StringUtils.hasText(attachment.getObjectName())) {
+                        log.info("鍒犻櫎MinIO鏂囦欢锛屽璞″悕绉�: {}", attachment.getObjectName());
+                        minioService.deleteFile(attachment.getObjectName());
+                    }
+                    // 鍒犻櫎鏁版嵁搴撹褰�
+                    orderAttachmentMapper.deleteById(attachment.getId());
+                    log.info("鍒犻櫎闄勪欢璁板綍鎴愬姛锛岄檮浠禝D: {}", attachment.getId());
+                } catch (Exception e) {
+                    log.error("鍒犻櫎闄勪欢澶辫触锛岄檮浠禝D: {}, 閿欒: {}", attachment.getId(), e.getMessage());
+                    // 缁х画鍒犻櫎鍏朵粬闄勪欢锛屼笉涓柇鏁翠釜娴佺▼
+                }
+            }
+
+            // 2. 閫昏緫鍒犻櫎璁㈠崟璇︽儏
+            log.info("寮�濮嬮�昏緫鍒犻櫎璁㈠崟璇︽儏锛岃鍗旾D: {}", orderId);
+            // 鍏堟煡璇㈣鍗曡鎯呭垪琛紝鐒跺悗閫愪釜閫昏緫鍒犻櫎
+            List<OrderDetail> orderDetails = orderDetailMapper.selectByOrderId(orderId);
+            int detailDeleted = 0;
+            for (OrderDetail detail : orderDetails) {
+                int result = orderDetailMapper.deleteById(detail.getId());
+                if (result > 0) {
+                    detailDeleted++;
+                }
+            }
+            log.info("閫昏緫鍒犻櫎璁㈠崟璇︽儏瀹屾垚锛屽奖鍝嶈鏁�: {}", detailDeleted);
+
+            // 3. 鍒犻櫎璁㈠崟淇℃伅锛堥�昏緫鍒犻櫎锛�
+            log.info("寮�濮嬪垹闄よ鍗曚俊鎭紝璁㈠崟ID: {}", orderId);
+            int orderDeleted = this.baseMapper.deleteById(orderId);
+            log.info("鍒犻櫎璁㈠崟淇℃伅瀹屾垚锛屽奖鍝嶈鏁�: {}", orderDeleted);
+
+            if (orderDeleted > 0) {
+                log.info("璁㈠崟鍙栨秷鎴愬姛锛岃鍗旾D: {}", orderId);
+                return true;
+            } else {
+                log.error("鍒犻櫎璁㈠崟淇℃伅澶辫触锛屽奖鍝嶈鏁颁负0锛岃鍗旾D: {}", orderId);
+                throw new BusinessException("鍒犻櫎璁㈠崟淇℃伅澶辫触");
+            }
+        } catch (Exception e) {
+            log.error("鍙栨秷璁㈠崟澶辫触锛岃鍗旾D: {}", orderId, e);
+            throw new BusinessException("鍙栨秷璁㈠崟澶辫触锛�" + e.getMessage());
+        }
+    }
 }
diff --git a/src/main/java/com/webmanage/service/impl/ProductServiceImpl.java b/src/main/java/com/webmanage/service/impl/ProductServiceImpl.java
new file mode 100644
index 0000000..9a3ca36
--- /dev/null
+++ b/src/main/java/com/webmanage/service/impl/ProductServiceImpl.java
@@ -0,0 +1,106 @@
+package com.webmanage.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.webmanage.entity.Product;
+import com.webmanage.mapper.ProductMapper;
+import com.webmanage.service.ProductService;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+
+/**
+ * 浜у搧鏈嶅姟瀹炵幇绫�
+ * 
+ * @author webmanage
+ * @date 2024-08-07
+ */
+@Service
+public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
+
+    @Override
+    public List<Product> getProductList(String productName, String productType, String status, Long providerId) {
+        LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
+        
+        // 娣诲姞鏌ヨ鏉′欢
+        if (StringUtils.hasText(productName)) {
+            queryWrapper.like(Product::getProductName, productName);
+        }
+        if (StringUtils.hasText(productType)) {
+            queryWrapper.eq(Product::getProductType, productType);
+        }
+        if (StringUtils.hasText(status)) {
+            queryWrapper.eq(Product::getStatus, status);
+        }
+        if (providerId != null) {
+            queryWrapper.eq(Product::getProviderId, providerId);
+        }
+        
+        // 鎸夊垱寤烘椂闂村�掑簭鎺掑垪
+        queryWrapper.orderByDesc(Product::getCreatedAt);
+        
+        return this.list(queryWrapper);
+    }
+
+    @Override
+    public Product getProductById(Long id) {
+        return this.getById(id);
+    }
+
+    @Override
+    public boolean createProduct(Product product) {
+        // 妫�鏌ヤ骇鍝佺紪鐮佹槸鍚﹀凡瀛樺湪
+        if (checkProductCodeExists(product.getProductCode(), null)) {
+            throw new RuntimeException("浜у搧缂栫爜宸插瓨鍦�");
+        }
+        
+        return this.save(product);
+    }
+
+    @Override
+    public boolean updateProduct(Product product) {
+        // 妫�鏌ヤ骇鍝佺紪鐮佹槸鍚﹀凡瀛樺湪锛堟帓闄ゅ綋鍓嶄骇鍝侊級
+        if (checkProductCodeExists(product.getProductCode(), product.getId())) {
+            throw new RuntimeException("浜у搧缂栫爜宸插瓨鍦�");
+        }
+        
+        return this.updateById(product);
+    }
+
+    @Override
+    public boolean deleteProduct(Long id) {
+        return this.removeById(id);
+    }
+
+    @Override
+    public boolean updateProductStatus(Long id, String status) {
+        LambdaUpdateWrapper<Product> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(Product::getId, id)
+                    .set(Product::getStatus, status);
+        
+        return this.update(updateWrapper);
+    }
+
+    @Override
+    public boolean updateProductAuditStatus(Long id, String auditStatus) {
+        LambdaUpdateWrapper<Product> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(Product::getId, id)
+                    .set(Product::getAuditStatus, auditStatus);
+        
+        return this.update(updateWrapper);
+    }
+
+    @Override
+    public boolean checkProductCodeExists(String productCode, Long excludeId) {
+        LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Product::getProductCode, productCode);
+        
+        if (excludeId != null) {
+            queryWrapper.ne(Product::getId, excludeId);
+        }
+        
+        return this.count(queryWrapper) > 0;
+    }
+}
diff --git a/src/main/resources/mapper/OrderInfoMapper.xml b/src/main/resources/mapper/OrderInfoMapper.xml
index e1c3538..0d38b6a 100644
--- a/src/main/resources/mapper/OrderInfoMapper.xml
+++ b/src/main/resources/mapper/OrderInfoMapper.xml
@@ -152,7 +152,7 @@
         <include refid="Base_Column_List"/>
         FROM order_info
         WHERE deleted = 0
-        AND order_status IN ('寰呭鎵�', '寰呭鎵规巿鏉�', '寰呮巿鏉�')
+        AND order_status IN ('寰呬笂浼犳枃浠�', '寰呮巿鏉�', '寰呬氦鏄撶‘璁�', '宸插畬鎴�', '宸茶瘎浠�')
         <if test="orderStatus != null and orderStatus != ''">
             AND order_status = #{orderStatus}
         </if>

--
Gitblit v1.8.0