From 774dc07d1aff6206de4e83ab1c659ad8eb200d1f Mon Sep 17 00:00:00 2001 From: dzq Date: Thu, 17 Apr 2025 09:18:29 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=95=86=E5=93=81=E7=AE=A1=E7=90=86):=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=95=86=E5=93=81=E4=B8=8E=E6=9F=9C=E6=9C=BA?= =?UTF-8?q?=E6=A0=BC=E5=8F=A3=E5=85=B3=E8=81=94=E6=9F=A5=E8=AF=A2=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在商品管理模块中,新增了查询商品及其关联的柜机格口信息的功能。该功能通过新增的 `SearchGoodsWithCabinetDO` 数据对象、`getGoodsWithCabinetList` 方法以及相应的 SQL 查询实现,支持在客户端按柜机格口显示商品列表。同时,调整了 `ShopController` 中的商品列表获取逻辑,以适配新的查询方式。 --- .../api/controller/ShopController.java | 24 ++++++++++++-- .../api/response/ShopGoodsResponse.java | 3 +- .../cell/query/SearchCabinetCellQuery.java | 1 + .../query/SearchSmartCabinetQuery.java | 1 + .../agileboot/domain/mqtt/MqttService.java | 12 ++++--- .../shop/category/dto/ShopCategoryDTO.java | 2 ++ .../shop/goods/GoodsApplicationService.java | 6 ++++ .../goods/db/SearchGoodsWithCabinetDO.java | 33 +++++++++++++++++++ .../domain/shop/goods/db/ShopGoodsMapper.java | 11 +++++++ .../shop/goods/db/ShopGoodsService.java | 2 ++ .../shop/goods/db/ShopGoodsServiceImpl.java | 5 +++ sql/20250328_return_approval.sql | 3 ++ 12 files changed, 95 insertions(+), 8 deletions(-) create mode 100644 agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/db/SearchGoodsWithCabinetDO.java diff --git a/agileboot-api/src/main/java/com/agileboot/api/controller/ShopController.java b/agileboot-api/src/main/java/com/agileboot/api/controller/ShopController.java index 2d2cd4e..1016070 100644 --- a/agileboot-api/src/main/java/com/agileboot/api/controller/ShopController.java +++ b/agileboot-api/src/main/java/com/agileboot/api/controller/ShopController.java @@ -4,10 +4,16 @@ import com.agileboot.api.response.ShopGoodsResponse; import com.agileboot.common.constant.WeixinConstants; import com.agileboot.common.core.dto.ResponseDTO; import com.agileboot.domain.shop.category.CategoryApplicationService; +import com.agileboot.domain.shop.category.db.ShopCategoryEntity; import com.agileboot.domain.shop.category.dto.ShopCategoryDTO; import com.agileboot.domain.shop.goods.GoodsApplicationService; +import com.agileboot.domain.shop.goods.db.SearchGoodsWithCabinetDO; import com.agileboot.domain.shop.goods.db.ShopGoodsEntity; + +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; + import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; @@ -28,7 +34,7 @@ public class ShopController { @GetMapping("/goods") public ResponseDTO getShopGoodsInfo() { - // 获取商品列表 + /*// 获取商品列表 List goodsList = goodsApplicationService.getGoodsAll(); goodsList.forEach(goods -> { // 最多只能购买一件 @@ -37,10 +43,22 @@ public class ShopController { } }); // 获取分类列表 - List categoryList = categoryApplicationService.getCategoryAll(); + List categoryList = categoryApplicationService.getCategoryAll();*/ + // 客户端显示商品列表按柜机格口 + List goodsWithCabinetList = goodsApplicationService.getGoodsWithCabinetList(); + goodsWithCabinetList.forEach(goodsWithCabinet -> { + goodsWithCabinet.setCategoryId(goodsWithCabinet.getCabinetId()); + }); - return ResponseDTO.ok(new ShopGoodsResponse(goodsList, categoryList, "0")); + List categoryList = goodsWithCabinetList.stream().map(g -> { + ShopCategoryDTO categoryDTO = new ShopCategoryDTO(new ShopCategoryEntity()); + categoryDTO.setCategoryId(g.getCategoryId()); + categoryDTO.setCategoryName(g.getCabinetName()); + return categoryDTO; + }).distinct().collect(Collectors.toList()); + + return ResponseDTO.ok(new ShopGoodsResponse(goodsWithCabinetList, categoryList, "0")); } @GetMapping("/wechatAuth") diff --git a/agileboot-api/src/main/java/com/agileboot/api/response/ShopGoodsResponse.java b/agileboot-api/src/main/java/com/agileboot/api/response/ShopGoodsResponse.java index 05e24a6..fd9083e 100644 --- a/agileboot-api/src/main/java/com/agileboot/api/response/ShopGoodsResponse.java +++ b/agileboot-api/src/main/java/com/agileboot/api/response/ShopGoodsResponse.java @@ -2,6 +2,7 @@ package com.agileboot.api.response; import com.agileboot.domain.shop.category.dto.ShopCategoryDTO; +import com.agileboot.domain.shop.goods.db.SearchGoodsWithCabinetDO; import com.agileboot.domain.shop.goods.db.ShopGoodsEntity; import java.util.List; import lombok.AllArgsConstructor; @@ -10,7 +11,7 @@ import lombok.Data; @Data @AllArgsConstructor public class ShopGoodsResponse { - private List goodsList; + private List goodsList; private List categoryList; private String res; } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/cell/query/SearchCabinetCellQuery.java b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/cell/query/SearchCabinetCellQuery.java index 26a1fd8..15a8b61 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/cell/query/SearchCabinetCellQuery.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/cell/query/SearchCabinetCellQuery.java @@ -31,6 +31,7 @@ public class SearchCabinetCellQuery extends AbstractPageQuery { .eq(cellType != null, "cell_type", cellType) .eq(usageStatus != null, "usage_status", usageStatus) .eq(availableStatus != null, "available_status", availableStatus) + .eq("deleted", false) .between(startTime != null && endTime != null, "create_time", startTime, endTime); this.timeRangeColumn = "create_time"; diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/smartCabinet/query/SearchSmartCabinetQuery.java b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/smartCabinet/query/SearchSmartCabinetQuery.java index 02a6a5c..9c665bf 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/smartCabinet/query/SearchSmartCabinetQuery.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/smartCabinet/query/SearchSmartCabinetQuery.java @@ -25,6 +25,7 @@ public class SearchSmartCabinetQuery extends AbstractPageQuery { .like(StrUtil.isNotEmpty(cabinetName), "cabinet_name", cabinetName) .eq(cabinetType != null, "cabinet_type", cabinetType) .eq(StrUtil.isNotEmpty(templateNo), "template_no", templateNo) + .eq("deleted", false) .between(startTime != null && endTime != null, "create_time", startTime, endTime); this.timeRangeColumn = "create_time"; diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/mqtt/MqttService.java b/agileboot-domain/src/main/java/com/agileboot/domain/mqtt/MqttService.java index 5e7a196..98a5587 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/mqtt/MqttService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/mqtt/MqttService.java @@ -13,10 +13,14 @@ import org.eclipse.paho.client.mqttv3.*; @RequiredArgsConstructor public class MqttService implements MqttCallback { private static final String SERVER_URL = "tcp://221.7.159.46:1883"; - private static final String USERNAME = "lock"; - private static final String PASSWORD = "lock@ys#6785$"; - private static final String TOPIC_FILTER = "lock/up/S4202414S"; - private static final String TOPIC = "lock/down/S4202414S"; +// private static final String USERNAME = "lock"; +// private static final String PASSWORD = "lock@ys#6785$"; +// private static final String TOPIC_FILTER = "lock/up/S4202414S"; +// private static final String TOPIC = "lock/down/S4202414S"; + private static final String USERNAME = "sell"; + private static final String PASSWORD = "sell@ys#6785$"; + private static final String TOPIC_FILTER = "lock/up/S5200184S"; + private static final String TOPIC = "lock/down/S5200184S"; private MqttClient client; // 设置自定义消息处理器 diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/category/dto/ShopCategoryDTO.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/category/dto/ShopCategoryDTO.java index c7b0536..0828ecb 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/category/dto/ShopCategoryDTO.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/category/dto/ShopCategoryDTO.java @@ -6,9 +6,11 @@ import com.agileboot.common.annotation.ExcelSheet; import com.agileboot.domain.shop.category.db.ShopCategoryEntity; import java.util.Date; import lombok.Data; +import lombok.EqualsAndHashCode; @ExcelSheet(name = "商品分类列表") @Data +@EqualsAndHashCode(of = {"categoryId", "categoryName"}) public class ShopCategoryDTO { public ShopCategoryDTO(ShopCategoryEntity entity) { diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/GoodsApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/GoodsApplicationService.java index 55d0a2b..021fa04 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/GoodsApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/GoodsApplicationService.java @@ -5,6 +5,7 @@ import com.agileboot.domain.common.command.BulkOperationCommand; import com.agileboot.domain.shop.goods.command.AddGoodsCommand; import com.agileboot.domain.shop.goods.command.UpdateGoodsCommand; import com.agileboot.domain.shop.goods.db.SearchGoodsDO; +import com.agileboot.domain.shop.goods.db.SearchGoodsWithCabinetDO; import com.agileboot.domain.shop.goods.db.ShopGoodsEntity; import com.agileboot.domain.shop.goods.db.ShopGoodsService; import com.agileboot.domain.shop.goods.dto.ShopGoodsDTO; @@ -59,4 +60,9 @@ public class GoodsApplicationService { public List getGoodsAll(){ return shopGoodsService.selectAll(); } + + + public List getGoodsWithCabinetList() { + return shopGoodsService.getGoodsWithCabinetList(); + } } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/db/SearchGoodsWithCabinetDO.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/db/SearchGoodsWithCabinetDO.java new file mode 100644 index 0000000..996c049 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/db/SearchGoodsWithCabinetDO.java @@ -0,0 +1,33 @@ +package com.agileboot.domain.shop.goods.db; + +import com.agileboot.common.core.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import java.math.BigDecimal; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("shop_goods") +public class SearchGoodsWithCabinetDO extends BaseEntity { + + private Long goodsId; + private String goodsName; + private Long categoryId; + private BigDecimal price; + private Integer stock; + private Integer status; + private String coverImg; + private String goodsDetail; + private String remark; + + @TableField("sc.cabinet_id") + private Long cabinetId; + + @TableField("sc.cabinet_name") + private String cabinetName; + + @TableField("cc.cell_id") + private Long cellId; +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/db/ShopGoodsMapper.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/db/ShopGoodsMapper.java index 9e29330..deae2d6 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/db/ShopGoodsMapper.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/db/ShopGoodsMapper.java @@ -45,4 +45,15 @@ public interface ShopGoodsMapper extends BaseMapper { "WHERE deleted = 0 " + "ORDER BY create_time DESC") List selectAll(); + + /** + * 查询商品及其关联的柜机格口信息 + * @return 商品列表 + */ + @Select("SELECT g.*, sc.cabinet_id, sc.cabinet_name, cc.cell_id " + + "FROM shop_goods g " + + "LEFT JOIN cabinet_cell cc ON g.goods_id = cc.goods_id " + + "LEFT JOIN smart_cabinet sc ON cc.cabinet_id = sc.cabinet_id " + + "WHERE g.deleted = 0 AND sc.deleted = 0 AND cc.deleted = 0 AND cc.goods_id IS NOT NULL ") + List getGoodsWithCabinetList(); } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/db/ShopGoodsService.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/db/ShopGoodsService.java index 6f01653..9260f3a 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/db/ShopGoodsService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/db/ShopGoodsService.java @@ -17,4 +17,6 @@ public interface ShopGoodsService extends IService { Page getGoodsList(AbstractPageQuery query); List selectAll(); + + List getGoodsWithCabinetList(); } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/db/ShopGoodsServiceImpl.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/db/ShopGoodsServiceImpl.java index e84af18..a481b31 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/db/ShopGoodsServiceImpl.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/goods/db/ShopGoodsServiceImpl.java @@ -29,4 +29,9 @@ public class ShopGoodsServiceImpl extends ServiceImpl selectAll() { return baseMapper.selectAll(); } + + @Override + public List getGoodsWithCabinetList() { + return baseMapper.getGoodsWithCabinetList(); + } } diff --git a/sql/20250328_return_approval.sql b/sql/20250328_return_approval.sql index 5434cb9..c9e77a2 100644 --- a/sql/20250328_return_approval.sql +++ b/sql/20250328_return_approval.sql @@ -66,3 +66,6 @@ ADD COLUMN `is_internal` TINYINT(1) DEFAULT 0 COMMENT '是否内部用户(0否 ALTER TABLE `shop_order` ADD COLUMN `userid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '企业微信用户ID或汇邦云用户ID' AFTER `mobile`; + +ALTER TABLE `cabinet_cell` +ADD COLUMN `stock` INT NOT NULL DEFAULT 0 COMMENT '库存数量' AFTER `pin_no`;