From 9fef8f0a0ae35e002e14176c4157b3c2c619fb6c Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 13 Aug 2025 19:04:28 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat:=E4=B8=AA=E4=BA=BA=E5=96=9C=E5=A5=BD?= =?UTF-8?q?=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/800pjcloudx_hardware.sql | 22 ++++++ .../api/constant/order/HardPayTypeEnum.java | 2 + .../order/app/HardAppProductLikeTopDto.java | 13 ++++ .../vo/order/app/HardAppProductLikeTopVo.java | 27 +++++++ .../order/HardCanteenTotalController.java | 22 +++++- .../hard/mapper/order/HardCarMapper.java | 7 ++ .../hard/service/HardCanteenTotalService.java | 10 ++- .../order/HardCanteenTotalServiceImpl.java | 78 +++++++++++++------ .../resources/mapper/order/HardCarMapper.xml | 22 ++++++ 9 files changed, 176 insertions(+), 27 deletions(-) create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppProductLikeTopDto.java create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/app/HardAppProductLikeTopVo.java diff --git a/db/800pjcloudx_hardware.sql b/db/800pjcloudx_hardware.sql index e5f62a7c3..34f17dad5 100644 --- a/db/800pjcloudx_hardware.sql +++ b/db/800pjcloudx_hardware.sql @@ -388,6 +388,28 @@ CREATE TABLE hard_appt PRIMARY KEY (id) ) ENGINE = InnoDB COMMENT ='设备预约管理'; + +-- ---------------------------- +-- Table structure for hard_table_manage +-- ---------------------------- +DROP TABLE IF EXISTS hard_table_manage; +CREATE TABLE hard_table_manage +( + id bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + merchant_id bigint COMMENT '商户id', + code varchar(128) NOT NULL COMMENT '编号', + enable char(1) NOT NULL COMMENT '是否启用', + qr_code varchar(256) DEFAULT NULL COMMENT '二维码', + remark varchar(256) DEFAULT NULL COMMENT '备注', + create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + create_time datetime DEFAULT NULL COMMENT '创建时间', + update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', + update_time datetime DEFAULT NULL COMMENT '修改时间', + del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + tenant_id bigint DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (id) +) ENGINE = InnoDB COMMENT ='预约桌子管理'; + -- ---------------------------- -- Table structure for hard_auth -- ---------------------------- diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardPayTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardPayTypeEnum.java index 8af6ad3c4..879744831 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardPayTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardPayTypeEnum.java @@ -26,6 +26,8 @@ public enum HardPayTypeEnum { HARD_DOOR_FREE_PAY("9", "智能柜免密支付"), WECHANT_SELF_QR_CODE_PAY("10", "微信付款码支付"), ALI_SELF_QR_CODE_PAY("11", "支付宝付款码支付"), + ZYY("12", "中医院"), + RMYY("13", "人民医院"), ; private final String type; private final String description; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppProductLikeTopDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppProductLikeTopDto.java new file mode 100644 index 000000000..1eb28df7c --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppProductLikeTopDto.java @@ -0,0 +1,13 @@ +package com.bsd.pjcloud.hard.api.dto.order.app; + +import lombok.Data; + +/** + * 个人菜品喜好排行 + */ +@Data +public class HardAppProductLikeTopDto { + + private Long userId; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/app/HardAppProductLikeTopVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/app/HardAppProductLikeTopVo.java new file mode 100644 index 000000000..94aef0d1f --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/app/HardAppProductLikeTopVo.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.hard.api.vo.order.app; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 菜品销量按照分类查询 + */ +@Data +public class HardAppProductLikeTopVo { + + @Schema(description = "分类id") + private Long classifyId; + + @Schema(description = "分类名") + private String classifyName; + + @Schema(description = "商品id") + private Long productId; + + @Schema(description = "商品名") + private String productName; + + @Schema(description = "购买总数") + private Long payCount; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java index 8fa6f4d99..1f686ef7d 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java @@ -1,17 +1,22 @@ package com.bsd.pjcloud.hard.controller.order; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.hard.api.dto.order.HardCarDto; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppProductByCanteenDto; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppProductByClassifyDto; +import com.bsd.pjcloud.hard.api.dto.order.app.HardAppProductLikeTopDto; import com.bsd.pjcloud.hard.api.vo.order.HardCanteenProductTotalVo; import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductByCanteenVo; import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductByClassifyVo; +import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductLikeTopVo; import com.bsd.pjcloud.hard.service.HardCanteenTotalService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -22,6 +27,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Map; /** * 食堂统计 @@ -52,10 +58,24 @@ public class HardCanteenTotalController { @Inner(value = false) @Operation(summary = "近一周各个食堂菜品购买统计", description = "近一周各个食堂菜品购买统计") @PostMapping("/app/product-by-canteen") - public R> productByCanteen(@RequestBody HardAppProductByCanteenDto dto) { + public R>>> productByCanteen(@RequestBody HardAppProductByCanteenDto dto) { return R.ok(canteenTotalService.productByCanteen(dto)); } + /** + * 个人菜品喜好排行 + */ + @Inner(value = false) + @Operation(summary = "个人菜品喜好排行", description = "个人菜品喜好排行") + @PostMapping("/app/product-like-top") + public R> productLikeTop(@RequestBody HardAppProductLikeTopDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + if (ObjectUtil.isNotEmpty(user)) { + dto.setUserId(user.getId()); + } + return R.ok(canteenTotalService.productLikeTop(dto)); + } + /* ************************************* start app start ************************************* */ @Operation(summary = "根据部门 食堂菜品购买统计", description = "根据部门 食堂菜品购买统计") @PostMapping("/proudct-total-by-dept") diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardCarMapper.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardCarMapper.java index 27c926595..477c6b4fe 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardCarMapper.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardCarMapper.java @@ -5,6 +5,7 @@ import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppProductByCanteenDto; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppProductByClassifyDto; +import com.bsd.pjcloud.hard.api.dto.order.app.HardAppProductLikeTopDto; import com.bsd.pjcloud.hard.api.vo.order.HardCanteenProductTotalVo; import com.bsd.pjcloud.hard.api.dto.order.HardCarDto; import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; @@ -12,6 +13,7 @@ import com.bsd.pjcloud.hard.api.entity.order.HardCarEntity; import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductByCanteenVo; import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductByClassifyVo; +import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductLikeTopVo; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -47,4 +49,9 @@ public interface HardCarMapper extends PjcloudBaseMapper { * 各个食堂菜品购买统计 */ List productByCanteen(@Param("dto") HardAppProductByCanteenDto dto); + + /** + * 个人菜品喜好排行 + */ + List productLikeTop(@Param("dto") HardAppProductLikeTopDto dto); } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCanteenTotalService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCanteenTotalService.java index 26d280a1d..52a674546 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCanteenTotalService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCanteenTotalService.java @@ -6,13 +6,16 @@ import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.hard.api.dto.order.HardCarDto; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppProductByCanteenDto; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppProductByClassifyDto; +import com.bsd.pjcloud.hard.api.dto.order.app.HardAppProductLikeTopDto; import com.bsd.pjcloud.hard.api.vo.order.HardCanteenProductTotalVo; import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductByCanteenVo; import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductByClassifyVo; +import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductLikeTopVo; import java.util.List; +import java.util.Map; public interface HardCanteenTotalService { @@ -24,7 +27,12 @@ public interface HardCanteenTotalService { /** * 近一周各个食堂菜品购买统计 */ - List productByCanteen(HardAppProductByCanteenDto dto); + List>> productByCanteen(HardAppProductByCanteenDto dto); + + /** + * 个人菜品喜好排行 + */ + List productLikeTop(HardAppProductLikeTopDto dto); /** * 根据部门 食堂菜品购买统计 diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java index c92b12600..b54ac130b 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java @@ -15,11 +15,13 @@ import com.bsd.pjcloud.hard.api.constant.total.DateRangeTypeEnum; import com.bsd.pjcloud.hard.api.dto.order.HardCarDto; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppProductByCanteenDto; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppProductByClassifyDto; +import com.bsd.pjcloud.hard.api.dto.order.app.HardAppProductLikeTopDto; import com.bsd.pjcloud.hard.api.vo.order.HardCanteenProductTotalVo; import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductByCanteenVo; import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductByClassifyVo; +import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductLikeTopVo; import com.bsd.pjcloud.hard.mapper.order.HardCarMapper; import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; import com.bsd.pjcloud.hard.service.HardCanteenTotalService; @@ -83,7 +85,7 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { * 近一周各个食堂菜品购买统计 */ @Override - public List productByCanteen(HardAppProductByCanteenDto dto) { + public List>> productByCanteen(HardAppProductByCanteenDto dto) { dto.setPayTimeList(new LocalDate[]{LocalDate.now().minusWeeks(1), LocalDate.now()}); // 查询近一周的时间 List dateList = new LinkedList<>(); @@ -95,22 +97,47 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { dateList.add(entity); currentDate = currentDate.plusDays(1); } + + // 查询自营食堂 + List mchList = remoteMchService.getByTypes(List.of(MerchantTypeEnum.CANTEEN.getType())).getData(); + if (ObjectUtil.isEmpty(mchList)) return null; + List>> result = new ArrayList<>(); + for (MchManageVo vo : mchList) { + result.add(Map.of(vo.getName(), dateList)); + } + List totalList = hardCarMapper.productByCanteen(dto); + if (ObjectUtil.isNotEmpty(totalList)) { - for (HardAppProductByCanteenVo vo : totalList) { - if (ObjectUtil.isEmpty(vo.getTime())) continue; - dateList.stream().filter(item -> ObjectUtil.equals(item.getTime(), vo.getTime())).findFirst().ifPresent(target -> { - target.setCanteenId(vo.getCanteenId()); - target.setPayCount(vo.getPayCount()); - target.setTotalPrice(vo.getTotalPrice()); - target.setTimeCount(vo.getTimeCount()); - target.setPayUserCount(vo.getPayUserCount()); - }); + for (Map> map : result) { + for (Map.Entry> entry : map.entrySet()) { + String canteenName = entry.getKey(); + List canteenList = entry.getValue(); + for (HardAppProductByCanteenVo vo : canteenList) { + dateList.stream().filter(item -> ObjectUtil.equals(item.getCanteenName(), canteenName) && ObjectUtil.equals(item.getTime(), vo.getTime())).findFirst().ifPresent(target -> { + target.setCanteenId(vo.getCanteenId()); + target.setCanteenName(canteenName); + target.setPayCount(vo.getPayCount()); + target.setTotalPrice(vo.getTotalPrice()); + target.setTimeCount(vo.getTimeCount()); + target.setPayUserCount(vo.getPayUserCount()); + }); + } + } } } - // 处理一下 - disposeProductByCanteen(dateList); - return dateList; + + return result; + } + + /** + * 个人菜品喜好排行 + */ + @Override + public List productLikeTop(HardAppProductLikeTopDto dto) { + List totalList = hardCarMapper.productLikeTop(dto); + disposeProductLikeTop(totalList); + return totalList; } /** @@ -287,22 +314,23 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { } } - private void disposeProductByCanteen(List list) { + private void disposeProductLikeTop(List list) { if (ObjectUtil.isEmpty(list)) return; - // 处理商户 - List canteenIdList = list.stream().map(HardAppProductByCanteenVo::getCanteenId).toList(); - if (ObjectUtil.isNotEmpty(canteenIdList)) { - List mchList = remoteMchService.getByIds(canteenIdList).getData(); - if (ObjectUtil.isNotEmpty(mchList)) { - Map categoryMap = mchList.stream().collect(Collectors.toMap(MchManageVo::getId, v -> v)); - for (HardAppProductByCanteenVo i : list) { - MchManageVo category = categoryMap.get(i.getCanteenId()); - if (ObjectUtil.isNotEmpty(category)) { - i.setCanteenName(category.getName()); + // 处理菜品分类 + List classifyList = list.stream().map(HardAppProductLikeTopVo::getClassifyId).filter(ObjectUtil::isNotEmpty).distinct().toList(); + if (ObjectUtil.isNotEmpty(classifyList)) { + List categoryList = canteenCategoryService.getAllSimple(null, null).getData(); + if (ObjectUtil.isNotEmpty(categoryList)) { + Map categoryMap = categoryList.stream().collect(Collectors.toMap(CanteenCategoryEntity::getId, v -> v)); + if (ObjectUtil.isNotEmpty(categoryMap)) { + for (HardAppProductLikeTopVo i : list) { + CanteenCategoryEntity category = categoryMap.get(i.getClassifyId()); + if (ObjectUtil.isNotEmpty(category)) { + i.setClassifyName(category.getName()); + } } } } } } - } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml index 1a34a9df6..896850e49 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml @@ -349,4 +349,26 @@ order by DATE_FORMAT(o.pay_time, '%Y-%m-%d') + \ No newline at end of file From f0412a73cfc7fcab3b9b2c03d20ab92ce66cad84 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 13 Aug 2025 20:25:22 +0800 Subject: [PATCH 2/5] =?UTF-8?q?feat:=E4=B8=AA=E4=BA=BA=E5=96=9C=E5=A5=BD?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/app/HardAppProductByCanteenDto.java | 7 ++-- .../app/HardAppProductByClassifyDto.java | 3 ++ .../order/HardCanteenTotalController.java | 8 ++++ .../controller/sync/HardSyncController.java | 40 ++++++++++++++++++ .../pjcloud/hard/service/HardSyncService.java | 12 ++++++ .../order/HardCanteenTotalServiceImpl.java | 17 +++++--- .../impl/sync/HardSyncServiceImpl.java | 41 +++++++++++++++++++ .../resources/mapper/order/HardCarMapper.xml | 6 +++ 8 files changed, 126 insertions(+), 8 deletions(-) create mode 100644 pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/sync/HardSyncController.java create mode 100644 pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSyncService.java create mode 100644 pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/sync/HardSyncServiceImpl.java diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppProductByCanteenDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppProductByCanteenDto.java index 8e228b3eb..483819972 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppProductByCanteenDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppProductByCanteenDto.java @@ -1,11 +1,9 @@ package com.bsd.pjcloud.hard.api.dto.order.app; -import com.bsd.pjcloud.hard.api.constant.total.DateRangeTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.List; /** @@ -14,8 +12,11 @@ import java.util.List; @Data public class HardAppProductByCanteenDto { + @Schema(description = "用户Id") + private Long userId; + @Schema(description = "食堂id") - private List canteenIdList; + private List canteenIdList; @Schema(description = "用餐时间段") private String hourType; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppProductByClassifyDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppProductByClassifyDto.java index 3f7bdf37f..fa9a7ddf7 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppProductByClassifyDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppProductByClassifyDto.java @@ -13,6 +13,9 @@ import java.util.List; @Data public class HardAppProductByClassifyDto { + @Schema(description = "用户Id") + private Long userId; + @Schema(description = "食堂id") private List canteenIdList; diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java index 1f686ef7d..5a2c7bd46 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java @@ -49,6 +49,10 @@ public class HardCanteenTotalController { @Operation(summary = "菜品销量按照分类查询", description = "菜品销量按照分类查询") @PostMapping("/app/product-by-classify") public R> productByClassify(@RequestBody HardAppProductByClassifyDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + if (ObjectUtil.isNotEmpty(user)) { + dto.setUserId(user.getId()); + } return R.ok(canteenTotalService.productByClassify(dto)); } @@ -59,6 +63,10 @@ public class HardCanteenTotalController { @Operation(summary = "近一周各个食堂菜品购买统计", description = "近一周各个食堂菜品购买统计") @PostMapping("/app/product-by-canteen") public R>>> productByCanteen(@RequestBody HardAppProductByCanteenDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + if (ObjectUtil.isNotEmpty(user)) { + dto.setUserId(user.getId()); + } return R.ok(canteenTotalService.productByCanteen(dto)); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/sync/HardSyncController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/sync/HardSyncController.java new file mode 100644 index 000000000..cdc932000 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/sync/HardSyncController.java @@ -0,0 +1,40 @@ +package com.bsd.pjcloud.hard.controller.sync; + +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.idempotent.annotation.Idempotent; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.hard.service.HardSyncService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 设备同步 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/hard-sync") +@Tag(description = "hard-sync", name = "设备同步") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class HardSyncController { + + private final HardSyncService hardSyncService; + + @Operation(summary = "同步超市分类商品和同步", description = "同步超市分类商品和同步") + @SysLog("同步超市分类商品和同步") + @Idempotent(expireTime = 3, info = "正在同步中,请勿重复操作") + @GetMapping("/sync-supermarket") + public R syncSupermarket() { + PjcloudUser user = SecurityUtils.getUser(); + hardSyncService.syncSupermarket(user); + return R.ok(); + } + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSyncService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSyncService.java new file mode 100644 index 000000000..dd2ede6d6 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSyncService.java @@ -0,0 +1,12 @@ +package com.bsd.pjcloud.hard.service; + +import com.bsd.pjcloud.common.security.service.PjcloudUser; + +public interface HardSyncService { + + /** + * 同步超市分类商品和同步 + */ + void syncSupermarket(PjcloudUser user); + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java index b54ac130b..6d6492112 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java @@ -9,6 +9,7 @@ import com.bsd.pjcloud.admin.api.feign.RemoteDeptService; import com.bsd.pjcloud.canteen.api.feign.RemoteCanteenCategoryService; import com.bsd.pjcloud.canteen.entity.CanteenCategoryEntity; import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; +import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.constant.total.DateRangeTypeEnum; @@ -86,6 +87,14 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { */ @Override public List>> productByCanteen(HardAppProductByCanteenDto dto) { + // 查询自营食堂并且在移动端显示的 + List canteenList = remoteMchService.getByTypes(List.of(MerchantTypeEnum.CANTEEN.getType())).getData(); + if (ObjectUtil.isEmpty(canteenList)) return null; + canteenList = canteenList.stream().filter(v -> ObjectUtil.equals(v.getVisibleMobile(), YesNoEnum.YES.getCode())).toList(); + if (ObjectUtil.isNotEmpty(canteenList)) { + List canteenIdList = canteenList.stream().map(MchManageVo::getId).toList(); + dto.setCanteenIdList(canteenIdList); + } dto.setPayTimeList(new LocalDate[]{LocalDate.now().minusWeeks(1), LocalDate.now()}); // 查询近一周的时间 List dateList = new LinkedList<>(); @@ -99,10 +108,8 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { } // 查询自营食堂 - List mchList = remoteMchService.getByTypes(List.of(MerchantTypeEnum.CANTEEN.getType())).getData(); - if (ObjectUtil.isEmpty(mchList)) return null; List>> result = new ArrayList<>(); - for (MchManageVo vo : mchList) { + for (MchManageVo vo : canteenList) { result.add(Map.of(vo.getName(), dateList)); } @@ -112,8 +119,8 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { for (Map> map : result) { for (Map.Entry> entry : map.entrySet()) { String canteenName = entry.getKey(); - List canteenList = entry.getValue(); - for (HardAppProductByCanteenVo vo : canteenList) { + List currentCanteenList = entry.getValue(); + for (HardAppProductByCanteenVo vo : currentCanteenList) { dateList.stream().filter(item -> ObjectUtil.equals(item.getCanteenName(), canteenName) && ObjectUtil.equals(item.getTime(), vo.getTime())).findFirst().ifPresent(target -> { target.setCanteenId(vo.getCanteenId()); target.setCanteenName(canteenName); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/sync/HardSyncServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/sync/HardSyncServiceImpl.java new file mode 100644 index 000000000..8c0eae4e1 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/sync/HardSyncServiceImpl.java @@ -0,0 +1,41 @@ +package com.bsd.pjcloud.hard.service.impl.sync; + +import cn.hutool.core.util.ObjectUtil; +import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.hard.service.HardSyncService; +import com.bsd.pjcloud.mqtt.api.feign.RemoteMqttEventService; +import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; +import com.bsd.pjcloud.wallet.api.vo.MchManageVo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +@Validated +@Slf4j +@RequiredArgsConstructor +@Service +public class HardSyncServiceImpl implements HardSyncService { + + private final RemoteMchService remoteMchService; + private final RemoteMqttEventService mqttEventService; + + /** + * 同步超市分类商品和同步 + */ + @Override + public void syncSupermarket(PjcloudUser user) { + if (ObjectUtil.isEmpty(user)) throw new RuntimeException("当前登录用户错误"); + Long deptId = user.getDeptId(); + // 查询该用户属于的超市 + MchManageVo targetMch = remoteMchService.getFirstMchByDeptId(deptId, MerchantTypeEnum.CANTEEN).getData(); + if (ObjectUtil.isEmpty(targetMch) || ObjectUtil.notEqual(targetMch.getTypes(), MerchantTypeEnum.CANTEEN.getType())) { + throw new RuntimeException("您不是超市用户,无法操作"); + } + mqttEventService.sendSupermarketClassifyChangeMsg(deptId); + mqttEventService.sendSupermarketProductChangeMsg(deptId); + } + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml index 896850e49..0fac99a77 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml @@ -300,6 +300,9 @@ left join pjcloudx_canteen.canteen_spu s on a.product_id = s.id a.del_flag = '0' + + and o.user_id = #{dto.userId} + and o.hour_type = #{dto.hourType} @@ -332,6 +335,9 @@ a.del_flag = '0' and o.pay_time is not null + + and o.user_id = #{dto.userId} + and o.merchant_id in From 307b332e4a239c53788ab8b464877c9e4dc5cfaf Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 13 Aug 2025 21:13:20 +0800 Subject: [PATCH 3/5] 11 --- .../controller/CanteenCategoryController.java | 2 +- .../order/HardCanteenTotalController.java | 4 +-- .../order/HardCanteenTotalServiceImpl.java | 34 +++++++++++++++---- .../resources/mapper/order/HardCarMapper.xml | 3 ++ 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenCategoryController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenCategoryController.java index fe9b76cb8..7950861e2 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenCategoryController.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenCategoryController.java @@ -145,7 +145,7 @@ public class CanteenCategoryController { wrapper.like(StringUtils.isNotBlank(name), CanteenCategoryEntity::getName, name); wrapper.orderByAsc(CanteenCategoryEntity::getSort); wrapper.apply(StringUtils.isNotEmpty(categoryType), "FIND_IN_SET({0}, your_column_name)", categoryType); - List list = canteenCategoryService.listScope(wrapper); + List list = canteenCategoryService.list(wrapper); return R.ok(list); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java index 5a2c7bd46..c2628bbf1 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java @@ -59,13 +59,12 @@ public class HardCanteenTotalController { /** * 近一周各个食堂菜品购买统计 */ - @Inner(value = false) @Operation(summary = "近一周各个食堂菜品购买统计", description = "近一周各个食堂菜品购买统计") @PostMapping("/app/product-by-canteen") public R>>> productByCanteen(@RequestBody HardAppProductByCanteenDto dto) { PjcloudUser user = SecurityUtils.getUser(); if (ObjectUtil.isNotEmpty(user)) { - dto.setUserId(user.getId()); + // dto.setUserId(user.getId()); } return R.ok(canteenTotalService.productByCanteen(dto)); } @@ -73,7 +72,6 @@ public class HardCanteenTotalController { /** * 个人菜品喜好排行 */ - @Inner(value = false) @Operation(summary = "个人菜品喜好排行", description = "个人菜品喜好排行") @PostMapping("/app/product-like-top") public R> productLikeTop(@RequestBody HardAppProductLikeTopDto dto) { diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java index 6d6492112..466b7dbf1 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java @@ -10,6 +10,7 @@ import com.bsd.pjcloud.canteen.api.feign.RemoteCanteenCategoryService; import com.bsd.pjcloud.canteen.entity.CanteenCategoryEntity; import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; +import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.constant.total.DateRangeTypeEnum; @@ -114,6 +115,7 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { } List totalList = hardCarMapper.productByCanteen(dto); + disposeProductByCanteen(totalList); if (ObjectUtil.isNotEmpty(totalList)) { for (Map> map : result) { @@ -121,13 +123,13 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { String canteenName = entry.getKey(); List currentCanteenList = entry.getValue(); for (HardAppProductByCanteenVo vo : currentCanteenList) { - dateList.stream().filter(item -> ObjectUtil.equals(item.getCanteenName(), canteenName) && ObjectUtil.equals(item.getTime(), vo.getTime())).findFirst().ifPresent(target -> { - target.setCanteenId(vo.getCanteenId()); - target.setCanteenName(canteenName); - target.setPayCount(vo.getPayCount()); - target.setTotalPrice(vo.getTotalPrice()); - target.setTimeCount(vo.getTimeCount()); - target.setPayUserCount(vo.getPayUserCount()); + totalList.stream().filter(item -> ObjectUtil.equals(item.getCanteenName(), canteenName) && ObjectUtil.equals(item.getTime(), vo.getTime())).findFirst().ifPresent(target -> { + vo.setCanteenId(target.getCanteenId()); + vo.setCanteenName(canteenName); + vo.setPayCount(target.getPayCount()); + vo.setTotalPrice(target.getTotalPrice()); + vo.setTimeCount(target.getTimeCount()); + vo.setPayUserCount(target.getPayUserCount()); }); } } @@ -340,4 +342,22 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { } } } + + private void disposeProductByCanteen(List list) { + if (ObjectUtil.isEmpty(list)) return; + // 处理商户 + List canteenIdList = list.stream().map(HardAppProductByCanteenVo::getCanteenId).filter(ObjectUtil::isNotEmpty).distinct().toList(); + if (ObjectUtil.isNotEmpty(canteenIdList)) { + List mchList = remoteMchService.getByIds(canteenIdList).getData(); + if (ObjectUtil.isNotEmpty(mchList)) { + Map mchMap = CollectionUtils.convertMap(mchList, MchManageVo::getId); + for (HardAppProductByCanteenVo i : list) { + MchManageVo mch = mchMap.get(i.getCanteenId()); + if (ObjectUtil.isNotEmpty(mch)) { + i.setCanteenName(mch.getName()); + } + } + } + } + } } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml index 0fac99a77..84a3b8377 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml @@ -300,6 +300,7 @@ left join pjcloudx_canteen.canteen_spu s on a.product_id = s.id a.del_flag = '0' + and s.category_id is not null and o.user_id = #{dto.userId} @@ -318,6 +319,7 @@ group by s.category_id order by s.category_id + limit 5