diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java index 1c83aeaae..33c64697d 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java @@ -59,4 +59,14 @@ public class HardOrderDto extends HardOrderEntity implements BaseIsIncludeTreeIn private String createTimeStr; + /** + * 是否查询时间段为空的数据 + */ + private Boolean hourTypeIsNotEmpty = false; + + /** + * 是否查询商品描述不为空的数据 + */ + private Boolean productDescIsNotEmpty = false; + } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCanteenProductTotalVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCanteenProductTotalVo.java index 0ca96af49..3543aa620 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCanteenProductTotalVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCanteenProductTotalVo.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.time.LocalDateTime; +import java.util.List; @Data public class HardCanteenProductTotalVo { @@ -11,6 +12,12 @@ public class HardCanteenProductTotalVo { @Schema(description = "唯一编号") private String uniqueCode; + @Schema(description = "商户id") + private Long mchId; + + @Schema(description = "商户名称") + private String mchName; + @Schema(description = "部门id") private Long userDeptId; @@ -35,4 +42,9 @@ public class HardCanteenProductTotalVo { @Schema(description = "购买次数") private Long timeCount; + @Schema(description = "用餐部门总数") + private Integer deptCount; + + private List children; + } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenDeptTotalController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenDeptTotalController.java new file mode 100644 index 000000000..3f9cb1525 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenDeptTotalController.java @@ -0,0 +1,48 @@ +package com.bsd.pjcloud.hard.controller.order; + +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.hard.api.dto.order.HardOrderDto; +import com.bsd.pjcloud.hard.api.vo.order.HardCanteenProductTotalVo; +import com.bsd.pjcloud.hard.service.HardCanteenTotalService; +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.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 食堂部门统计 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/hard-canteen-total-dept") +@Tag(description = "hard-canteen-total-dept", name = "食堂部门统计") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class HardCanteenDeptTotalController { + + private final HardCanteenTotalService canteenTotalService; + + @Operation(summary = "食堂菜品购买部门统计", description = "食堂菜品购买部门统计") + @PostMapping("/list-by-dept") + public R> listByDept(@RequestBody HardOrderDto dto) { + DataScope dataScope = null; + return R.ok(canteenTotalService.listByDept(dto, dataScope)); + } + + @Operation(summary = "食堂菜品购买用餐时间段统计", description = "食堂菜品购买用餐时间段统计") + @PostMapping("/list-by-hour-type") + public R> listByHourType(@RequestBody HardOrderDto dto) { + DataScope dataScope = null; + return R.ok(canteenTotalService.listByHourType(dto, dataScope)); + } + +} 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 28b19fd94..e91c553c6 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 @@ -29,4 +29,8 @@ public interface HardCarMapper extends PjcloudBaseMapper { Page productTotal(Page page, @Param("dto") HardOrderDto dto, DataScope dataScope); Page proudctQuery(Page page, @Param("dto") HardCarDto dto); + + List listByDept(@Param("dto") HardOrderDto dto, DataScope dataScope); + + List listByHourType(@Param("dto") HardOrderDto 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 8af5f1274..14951e329 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 @@ -26,4 +26,14 @@ public interface HardCanteenTotalService { * 菜品出售统计 */ Page proudctQuery(Page page, HardCarDto dto); + + /** + * 食堂菜品购买部门统计 + */ + List listByDept(HardOrderDto dto, DataScope dataScope); + + /** + * 食堂菜品购买用餐时间段统计 + */ + List listByHourType(HardOrderDto dto, DataScope dataScope); } 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 663ee7012..db89480a3 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 @@ -1,10 +1,11 @@ package com.bsd.pjcloud.hard.service.impl.order; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.admin.api.entity.SysDept; import com.bsd.pjcloud.admin.api.feign.RemoteDeptService; -import com.bsd.pjcloud.canteen.api.feign.RemoteCanteenSpuService; +import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.dto.order.HardCarDto; @@ -14,14 +15,22 @@ import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; import com.bsd.pjcloud.hard.mapper.order.HardCarMapper; import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; import com.bsd.pjcloud.hard.service.HardCanteenTotalService; +import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; +import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; +import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** @@ -39,6 +48,7 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { private final HardCarMapper hardCarMapper; private final RemoteDeptService remoteDeptService; + private final RemoteMchService remoteMchService; /** * 根据部门 食堂菜品购买统计 @@ -47,21 +57,7 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { public List productTotalByDept(Page page, HardOrderDto dto, DataScope dataScope) { dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); List list = hardCarMapper.productTotalByDept(dto, dataScope); - if (ObjectUtil.isNotEmpty(list)) { - // 查询部门名 - List userDeptList = list.stream().map(HardCanteenProductTotalVo::getUserDeptId).distinct().filter(ObjectUtil::isNotEmpty).toList(); - if(ObjectUtil.isNotEmpty(userDeptList)){ - Map userDeptMap = remoteDeptService.getDeptByDeptIds(userDeptList).getData(); - if (ObjectUtil.isNotEmpty(userDeptMap)) { - for (HardCanteenProductTotalVo v : list) { - SysDept sysDept = userDeptMap.get(v.getUserDeptId()); - if (ObjectUtil.isNotEmpty(sysDept)) { - v.setUserDeptName(sysDept.getName()); - } - } - } - } - } + hardCanteenProductTotalVoSetDeptData(list); return list; } @@ -89,4 +85,101 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); return hardCarMapper.proudctQuery(page, dto); } + + /** + * 食堂菜品购买部门统计 + */ + @Override + public List listByDept(HardOrderDto dto, DataScope dataScope) { + dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); + // 查询所有的自营食堂 + List mchList = remoteMchService.getByTypes(List.of(MerchantTypeEnum.CANTEEN.getType())).getData(); + if (ObjectUtil.isEmpty(mchList)) return null; + dto.setMchIds(mchList.stream().map(MchManageVo::getId).toList()); + List list = hardCarMapper.listByDept(dto, dataScope); + if (ObjectUtil.isNotEmpty(list)) { + // 限制最大线程数为10 + int threadCount = Math.min(list.size(), 10); + ExecutorService executorService = Executors.newFixedThreadPool(threadCount); + try { + List> futures = list.stream() + .map(v -> CompletableFuture.runAsync(() -> { + // 查询时间段 + HardOrderDto deptQuery = BeanUtil.toBean(dto, HardOrderDto.class); + deptQuery.setMerchantId(v.getMchId()); + List deptList = hardCarMapper.listByHourType(deptQuery); + + for (HardCanteenProductTotalVo j : deptList) { + if (ObjectUtil.isNotEmpty(v.getMchId())) j.setMchId(v.getMchId()); + } + + v.setDeptCount(deptList.stream().map(HardCanteenProductTotalVo::getUserDeptId).distinct().toList().size()); + v.setChildren(deptList); + }, executorService)) + .toList(); + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); + } finally { + executorService.shutdown(); + } + } + + // 添加商户信息 + hardCanteenProductTotalVoSetMchData(list); + // 添加部门信息 + hardCanteenProductTotalVoSetDeptData(list); + return list; + } + + /** + * 食堂菜品购买用餐时间段统计 + */ + @Override + public List listByHourType(HardOrderDto dto, DataScope dataScope) { + return List.of(); + } + + /** + * 为HardCanteenProductTotalVo增加部门信息 + */ + private void hardCanteenProductTotalVoSetDeptData(List list) { + if (ObjectUtil.isEmpty(list)) return; + // 查询部门名 + List userDeptList = new ArrayList<>(); + for (HardCanteenProductTotalVo i : list) { + if (ObjectUtil.isNotEmpty(i.getUserDeptId())) userDeptList.add(i.getUserDeptId()); + if (ObjectUtil.isNotEmpty(i.getChildren())) { + for (HardCanteenProductTotalVo j : i.getChildren()) { + if (ObjectUtil.isNotEmpty(j.getUserDeptId())) userDeptList.add(j.getUserDeptId()); + } + } + } + userDeptList = userDeptList.stream().distinct().toList(); + if (ObjectUtil.isNotEmpty(userDeptList)) { + Map userDeptMap = remoteDeptService.getDeptByDeptIds(userDeptList).getData(); + if (ObjectUtil.isNotEmpty(userDeptMap)) { + for (HardCanteenProductTotalVo v : list) { + SysDept sysDept = userDeptMap.get(v.getUserDeptId()); + if (ObjectUtil.isNotEmpty(sysDept)) { + v.setUserDeptName(sysDept.getName()); + } + if (ObjectUtil.isNotEmpty(v.getChildren())) { + hardCanteenProductTotalVoSetDeptData(v.getChildren()); + } + } + } + } + } + + private void hardCanteenProductTotalVoSetMchData(List list) { + if (ObjectUtil.isEmpty(list)) return; + // 查询商户名 + List mchIdList = list.stream().map(HardCanteenProductTotalVo::getMchId).distinct().filter(ObjectUtil::isNotEmpty).toList(); + if (ObjectUtil.isEmpty(mchIdList)) return; + List mchList = remoteMchService.getByIds(mchIdList).getData(); + if (ObjectUtil.isNotEmpty(mchList)) { + for (HardCanteenProductTotalVo i : list) { + mchList.stream().filter(m -> ObjectUtil.equals(i.getMchId(), m.getId())).findFirst().ifPresent(mch -> i.setMchName(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 8ffe3902e..7f7f0dd45 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 @@ -218,4 +218,63 @@ group by a.product_id order by SUM(a.product_count) desc + + + + + \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml index 613d4c93d..2ce89e880 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml @@ -97,6 +97,15 @@ and a.hour_type = #{dto.hourType} + + and ( a.hour_type is not null and a.hour_type not in ('-1') ) + + + and ( a.product_desc != '' ) + + + and a.user_id = #{dto.userId} + and a.dept_id = #{dto.deptId} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteMchService.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteMchService.java index c46548a55..b451d7360 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteMchService.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteMchService.java @@ -14,6 +14,10 @@ import java.util.List; @FeignClient(contextId = "remoteMchService", value = ServiceNameConstants.WALLET_SERVICE) public interface RemoteMchService { + @NoToken + @GetMapping("/mch-manage/get-by-types") + R> getByTypes(@RequestParam List types); + @NoToken @GetMapping("/mch-manage/get-by-id") R getById(@RequestParam Long id); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java index c6654c568..1a8662974 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java @@ -54,6 +54,14 @@ public class MchManageController { private final RemoteUserService remoteUserService; /* ************************************* start 远程调用 start ************************************* */ + @Inner + @GetMapping("/get-by-types") + public R> getByTypes(@RequestParam List types) { + List list = mchManageService.list(MchManageDto.builder().typesList(types).build()); + if (ObjectUtil.isEmpty(list)) return R.failed("商户不存在"); + return R.ok(list); + } + @Inner @GetMapping("/get-by-id") public R getById(@RequestParam Long id) {