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