Compare commits
14 Commits
083a8cb4c7
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3dd3e106dc | ||
|
|
1427538598 | ||
|
|
8f01832b65 | ||
|
|
379df40aee | ||
|
|
a0aa1432ab | ||
|
|
4da4b1f922 | ||
|
|
c12912f1c5 | ||
|
|
5e7cdc1bc4 | ||
|
|
4f39d3ec45 | ||
|
|
4ac409020a | ||
|
|
84324774da | ||
|
|
c74a46b110 | ||
|
|
ed0138c777 | ||
|
|
0a62e19d51 |
@@ -79,6 +79,18 @@ public class ProductController {
|
|||||||
return Result.success(productService.getProducts(categoryId, keyword, page, pageSize));
|
return Result.success(productService.getProducts(categoryId, keyword, page, pageSize));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有商品(包括下架的,用于管理)
|
||||||
|
*/
|
||||||
|
@GetMapping("/all")
|
||||||
|
public Result<Page<Product>> getAllProducts(
|
||||||
|
@RequestParam(required = false) String categoryId,
|
||||||
|
@RequestParam(required = false) String keyword,
|
||||||
|
@RequestParam(defaultValue = "1") Integer page,
|
||||||
|
@RequestParam(defaultValue = "20") Integer pageSize) {
|
||||||
|
return Result.success(productService.getAllProducts(categoryId, keyword, page, pageSize));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取商品详情
|
* 获取商品详情
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -70,5 +70,20 @@ public class CreateOrderRequest {
|
|||||||
* 销售单价(用户可自定义)
|
* 销售单价(用户可自定义)
|
||||||
*/
|
*/
|
||||||
private BigDecimal price;
|
private BigDecimal price;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 长度(cm)
|
||||||
|
*/
|
||||||
|
private BigDecimal length;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 宽度(cm)
|
||||||
|
*/
|
||||||
|
private BigDecimal width;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 面积(m²)
|
||||||
|
*/
|
||||||
|
private BigDecimal area;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,11 @@ public class Category {
|
|||||||
*/
|
*/
|
||||||
private String icon;
|
private String icon;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 描述
|
||||||
|
*/
|
||||||
|
private String description;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 状态: 1启用 0禁用
|
* 状态: 1启用 0禁用
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import lombok.Data;
|
|||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 订单实体类
|
* 订单实体类
|
||||||
@@ -109,4 +110,10 @@ public class Order {
|
|||||||
*/
|
*/
|
||||||
@TableField("deleted")
|
@TableField("deleted")
|
||||||
private Integer deleted;
|
private Integer deleted;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单明细(不存数据库,仅用于API返回)
|
||||||
|
*/
|
||||||
|
@TableField(exist = false)
|
||||||
|
private List<OrderItem> items;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,6 +86,21 @@ public class OrderItem {
|
|||||||
*/
|
*/
|
||||||
private BigDecimal subtotal;
|
private BigDecimal subtotal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 长度(cm)
|
||||||
|
*/
|
||||||
|
private BigDecimal length;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 宽度(cm)
|
||||||
|
*/
|
||||||
|
private BigDecimal width;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 面积(m²)
|
||||||
|
*/
|
||||||
|
private BigDecimal area;
|
||||||
|
|
||||||
@TableField(fill = FieldFill.INSERT)
|
@TableField(fill = FieldFill.INSERT)
|
||||||
private LocalDateTime createdAt;
|
private LocalDateTime createdAt;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,21 @@ public class Product {
|
|||||||
*/
|
*/
|
||||||
private BigDecimal price;
|
private BigDecimal price;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 长度(mm)
|
||||||
|
*/
|
||||||
|
private BigDecimal length;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 宽度(mm)
|
||||||
|
*/
|
||||||
|
private BigDecimal width;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 面积(m²)
|
||||||
|
*/
|
||||||
|
private BigDecimal area;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 成本价
|
* 成本价
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -37,6 +37,11 @@ public interface ProductService {
|
|||||||
*/
|
*/
|
||||||
Page<Product> getProducts(String categoryId, String keyword, Integer page, Integer pageSize);
|
Page<Product> getProducts(String categoryId, String keyword, Integer page, Integer pageSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有商品(包括下架的)
|
||||||
|
*/
|
||||||
|
Page<Product> getAllProducts(String categoryId, String keyword, Integer page, Integer pageSize);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取商品详情
|
* 获取商品详情
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -113,11 +113,14 @@ public class OrderServiceImpl implements OrderService {
|
|||||||
item.setDescription(product.getDescription());
|
item.setDescription(product.getDescription());
|
||||||
item.setPrice(price);
|
item.setPrice(price);
|
||||||
item.setQuantity(itemDTO.getQuantity());
|
item.setQuantity(itemDTO.getQuantity());
|
||||||
|
item.setLength(itemDTO.getLength());
|
||||||
|
item.setWidth(itemDTO.getWidth());
|
||||||
|
item.setArea(itemDTO.getArea());
|
||||||
item.setSubtotal(subtotal);
|
item.setSubtotal(subtotal);
|
||||||
orderItems.add(item);
|
orderItems.add(item);
|
||||||
|
|
||||||
// 4. 暂时不扣减库存,等确认完成时再扣减
|
// 4. 创建订单时立即扣减库存
|
||||||
// decreaseStock(product.getProductId(), itemDTO.getQuantity(), order.getOrderId(), operatorId);
|
decreaseStock(product.getProductId(), itemDTO.getQuantity(), order.getOrderId(), operatorId);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置订单原价
|
// 设置订单原价
|
||||||
@@ -188,7 +191,27 @@ public class OrderServiceImpl implements OrderService {
|
|||||||
wrapper.le(Order::getCreatedAt, endDate);
|
wrapper.le(Order::getCreatedAt, endDate);
|
||||||
}
|
}
|
||||||
wrapper.orderByDesc(Order::getCreatedAt);
|
wrapper.orderByDesc(Order::getCreatedAt);
|
||||||
return orderMapper.selectPage(pageParam, wrapper);
|
Page<Order> result = orderMapper.selectPage(pageParam, wrapper);
|
||||||
|
|
||||||
|
// 查询每个订单的明细
|
||||||
|
if (result.getRecords() != null && !result.getRecords().isEmpty()) {
|
||||||
|
for (Order order : result.getRecords()) {
|
||||||
|
try {
|
||||||
|
if (order.getOrderId() != null) {
|
||||||
|
List<OrderItem> items = orderItemMapper.selectList(
|
||||||
|
new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getOrderId, order.getOrderId()));
|
||||||
|
order.setItems(items);
|
||||||
|
} else {
|
||||||
|
order.setItems(new ArrayList<>());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 查询明细失败时设置空列表
|
||||||
|
order.setItems(new ArrayList<>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -230,7 +253,13 @@ public class OrderServiceImpl implements OrderService {
|
|||||||
throw new RuntimeException("订单状态不允许取消");
|
throw new RuntimeException("订单状态不允许取消");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 未完成订单没有扣减库存,不需要恢复
|
// 取消订单需要恢复库存(因为创建时已扣减库存)
|
||||||
|
List<OrderItem> items = orderItemMapper.selectList(new LambdaQueryWrapper<OrderItem>()
|
||||||
|
.eq(OrderItem::getOrderId, orderId));
|
||||||
|
for (OrderItem item : items) {
|
||||||
|
increaseStock(item.getProductId(), item.getQuantity(), orderId, operatorId);
|
||||||
|
}
|
||||||
|
|
||||||
// 更新订单状态
|
// 更新订单状态
|
||||||
order.setStatus(2); // 已取消
|
order.setStatus(2); // 已取消
|
||||||
orderMapper.updateById(order);
|
orderMapper.updateById(order);
|
||||||
@@ -279,14 +308,18 @@ public class OrderServiceImpl implements OrderService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (status == 1) {
|
if (status == 1) {
|
||||||
// 确认完成:扣减库存
|
// 确认完成:订单在创建时已扣减库存,此处不再扣减
|
||||||
|
// 只需更新状态为已完成
|
||||||
|
}
|
||||||
|
// 取消订单需要恢复库存(因为创建时已扣减)
|
||||||
|
if (status == 2) {
|
||||||
|
// 取消订单需要恢复库存(因为创建时已扣减)
|
||||||
List<OrderItem> items = orderItemMapper.selectList(new LambdaQueryWrapper<OrderItem>()
|
List<OrderItem> items = orderItemMapper.selectList(new LambdaQueryWrapper<OrderItem>()
|
||||||
.eq(OrderItem::getOrderId, orderId));
|
.eq(OrderItem::getOrderId, orderId));
|
||||||
for (OrderItem item : items) {
|
for (OrderItem item : items) {
|
||||||
decreaseStock(item.getProductId(), item.getQuantity(), orderId, operatorId);
|
increaseStock(item.getProductId(), item.getQuantity(), orderId, operatorId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 取消不需要恢复库存(因为创建时没扣减)
|
|
||||||
|
|
||||||
order.setStatus(status);
|
order.setStatus(status);
|
||||||
orderMapper.updateById(order);
|
orderMapper.updateById(order);
|
||||||
@@ -333,10 +366,17 @@ public class OrderServiceImpl implements OrderService {
|
|||||||
// 重新计算金额
|
// 重新计算金额
|
||||||
BigDecimal totalAmount = BigDecimal.ZERO;
|
BigDecimal totalAmount = BigDecimal.ZERO;
|
||||||
|
|
||||||
|
// 删除旧的订单明细前,先恢复库存
|
||||||
|
List<OrderItem> oldItems = orderItemMapper.selectList(new LambdaQueryWrapper<OrderItem>()
|
||||||
|
.eq(OrderItem::getOrderId, orderId));
|
||||||
|
for (OrderItem oldItem : oldItems) {
|
||||||
|
increaseStock(oldItem.getProductId(), oldItem.getQuantity(), orderId, operatorId);
|
||||||
|
}
|
||||||
|
|
||||||
// 删除旧的订单明细
|
// 删除旧的订单明细
|
||||||
orderItemMapper.delete(new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getOrderId, orderId));
|
orderItemMapper.delete(new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getOrderId, orderId));
|
||||||
|
|
||||||
// 重新创建订单明细
|
// 重新创建订单明细,并扣减库存
|
||||||
List<OrderItem> orderItems = new ArrayList<>();
|
List<OrderItem> orderItems = new ArrayList<>();
|
||||||
for (CreateOrderRequest.OrderItemDTO itemDTO : request.getItems()) {
|
for (CreateOrderRequest.OrderItemDTO itemDTO : request.getItems()) {
|
||||||
Product product = productMapper.selectById(itemDTO.getProductId());
|
Product product = productMapper.selectById(itemDTO.getProductId());
|
||||||
@@ -364,9 +404,14 @@ public class OrderServiceImpl implements OrderService {
|
|||||||
item.setDescription(product.getDescription());
|
item.setDescription(product.getDescription());
|
||||||
item.setPrice(price);
|
item.setPrice(price);
|
||||||
item.setQuantity(itemDTO.getQuantity());
|
item.setQuantity(itemDTO.getQuantity());
|
||||||
|
item.setLength(itemDTO.getLength());
|
||||||
|
item.setWidth(itemDTO.getWidth());
|
||||||
|
item.setArea(itemDTO.getArea());
|
||||||
item.setSubtotal(subtotal);
|
item.setSubtotal(subtotal);
|
||||||
orderItems.add(item);
|
orderItems.add(item);
|
||||||
orderItemMapper.insert(item);
|
orderItemMapper.insert(item);
|
||||||
|
// 扣减库存
|
||||||
|
decreaseStock(product.getProductId(), itemDTO.getQuantity(), orderId, operatorId);
|
||||||
}
|
}
|
||||||
|
|
||||||
order.setTotalAmount(totalAmount);
|
order.setTotalAmount(totalAmount);
|
||||||
|
|||||||
@@ -99,6 +99,20 @@ public class ProductServiceImpl implements ProductService {
|
|||||||
return productMapper.selectPage(pageParam, wrapper);
|
return productMapper.selectPage(pageParam, wrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Page<Product> getAllProducts(String categoryId, String keyword, Integer page, Integer pageSize) {
|
||||||
|
Page<Product> pageParam = new Page<>(page, pageSize);
|
||||||
|
LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>();
|
||||||
|
if (StringUtils.hasText(categoryId)) {
|
||||||
|
wrapper.eq(Product::getCategoryId, categoryId);
|
||||||
|
}
|
||||||
|
if (StringUtils.hasText(keyword)) {
|
||||||
|
wrapper.like(Product::getName, keyword);
|
||||||
|
}
|
||||||
|
wrapper.orderByDesc(Product::getCreatedAt);
|
||||||
|
return productMapper.selectPage(pageParam, wrapper);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取商品详情
|
* 获取商品详情
|
||||||
*/
|
*/
|
||||||
@@ -119,6 +133,15 @@ public class ProductServiceImpl implements ProductService {
|
|||||||
product.setProductId(UUID.randomUUID().toString());
|
product.setProductId(UUID.randomUUID().toString());
|
||||||
product.setStatus(1);
|
product.setStatus(1);
|
||||||
productMapper.insert(product);
|
productMapper.insert(product);
|
||||||
|
|
||||||
|
// 创建商品时自动创建库存记录
|
||||||
|
Stock stock = new Stock();
|
||||||
|
stock.setStockId(UUID.randomUUID().toString());
|
||||||
|
stock.setProductId(product.getProductId());
|
||||||
|
stock.setQuantity(0);
|
||||||
|
stock.setLockedQuantity(0);
|
||||||
|
stockMapper.insert(stock);
|
||||||
|
|
||||||
return product;
|
return product;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
-- 添加商品长度、宽度、面积字段
|
||||||
|
ALTER TABLE products ADD COLUMN length DECIMAL(10,2);
|
||||||
|
COMMENT ON COLUMN products.length IS '长度(mm)';
|
||||||
|
ALTER TABLE products ADD COLUMN width DECIMAL(10,2);
|
||||||
|
COMMENT ON COLUMN products.width IS '宽度(mm)';
|
||||||
|
ALTER TABLE products ADD COLUMN area DECIMAL(10,4);
|
||||||
|
COMMENT ON COLUMN products.area IS '面积(m²)';
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
-- 添加订单明细长度、宽度、面积字段
|
||||||
|
ALTER TABLE order_items ADD COLUMN length DECIMAL(10,2);
|
||||||
|
COMMENT ON COLUMN order_items.length IS '长度(mm)';
|
||||||
|
ALTER TABLE order_items ADD COLUMN width DECIMAL(10,2);
|
||||||
|
COMMENT ON COLUMN order_items.width IS '宽度(mm)';
|
||||||
|
ALTER TABLE order_items ADD COLUMN area DECIMAL(10,4);
|
||||||
|
COMMENT ON COLUMN order_items.area IS '面积(m²)';
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
-- 添加分类描述字段
|
||||||
|
ALTER TABLE categories ADD COLUMN IF NOT EXISTS description TEXT;
|
||||||
Reference in New Issue
Block a user