Merge remote-tracking branch 'origin/master'

This commit is contained in:
zjf committed 2026-09-28 22:20:25 +08:00
commit 5a13e7d71a
6 files changed
+97

No files matched your search

@@ -0,0 +1,18 @@
package com.bsd.pjcloud.hard.api.vo.order;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* App 订单页用餐人胶囊的数量聚合:按实际用餐人分组统计当前筛选条件下的订单数。
*/
@Data
@Schema(description = "用餐人订单数量聚合")
public class HardOrderDinerCountVo {
@Schema(description = "用餐人用户ID")
private Long userId;
@Schema(description = "符合当前筛选条件的订单数量")
private Long count;
}
@@ -43,6 +43,7 @@ import com.bsd.pjcloud.hard.api.dto.order.remote.HardUpdateTakeOutStatusDto;
import com.bsd.pjcloud.hard.api.dto.order.remote.DailyMenuNetSoldQueryDTO;
import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity;
import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo;
import com.bsd.pjcloud.hard.api.vo.order.HardOrderDinerCountVo;
import com.bsd.pjcloud.hard.api.vo.order.HardOrderStatisticsVo;
import com.bsd.pjcloud.hard.api.vo.order.HardPendingReservationCountVo;
import com.bsd.pjcloud.hard.api.vo.order.DailyMenuNetSoldVO;
@@ -301,6 +302,22 @@ public class HardOrderController {
return R.ok(result);
}
@Operation(summary = "app查询用餐人订单数量", description = "订单页用餐人胶囊计数:按实际用餐人分组一次返回,替代逐人分页探测")
@ApiCryptoAes
@GetMapping("/app/diner-order-count")
public R<List<HardOrderDinerCountVo>> appDinerOrderCount(@ParameterObject HardOrderDto dto) {
PjcloudUser user = SecurityUtils.getUser();
hardwareOrderService.configureAppVisibility(dto, user.getId());
// 与订单列表同口径:仅食堂与共富商城订单进入胶囊计数。
dto.setMchTypeCodes(
List.of(
MerchantTypeEnum.CANTEEN.getType(),
MerchantTypeEnum.FARMER.getType()
)
);
return R.ok(hardwareOrderService.appDinerOrderCount(dto));
}
@Operation(summary = "app查询超市订单列表", description = "app查询订单列表")
@ApiCryptoAes
@GetMapping("/app/sup-page-join")
@@ -188,6 +188,18 @@ public interface HardOrderMapper extends PjcloudBaseMapper<HardOrderEntity> {
*/
Long appVisibilityCount(@Param("dto") HardOrderDto dto, DataScope dataScope);
/**
* 按 App 可见范围和全部筛选条件分组统计各用餐人的订单数量,供订单页胶囊一次请求取回全部计数。
*
* <p>与 {@link #appVisibilityCount} 完全同口径,仅增加按实际用餐人分组;
* dto.userIds 为目标用餐人集合(已由服务层限定为本人和关系图谱用户)。</p>
*
* @param dto 订单筛选、App 可见范围及目标用餐人集合条件
* @param dataScope 保留的数据范围参数;当前 App 调用传 {@code null}
* @return 有订单的用餐人及其数量;无订单的用餐人不返回行,由调用方按 0 处理
*/
List<HardOrderDinerCountVo> appDinerOrderCount(@Param("dto") HardOrderDto dto, DataScope dataScope);
List<HardOrderVo> scopeList(@Param("dto") HardOrderDto dto, DataScope dataScope);
/**
@@ -32,6 +32,7 @@ import com.bsd.pjcloud.hard.api.vo.order.HardCreateHardQrCodeScanOrderVo;
import com.bsd.pjcloud.hard.api.vo.order.HardAggregateOrderCodePayStatusVo;
import com.bsd.pjcloud.hard.api.vo.order.HardAggregateOrderCodePayVo;
import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo;
import com.bsd.pjcloud.hard.api.vo.order.HardOrderDinerCountVo;
import com.bsd.pjcloud.hard.api.vo.order.HardPendingReservationCountVo;
import com.bsd.pjcloud.hard.api.vo.order.WardMenuMapDayVo;
import com.bsd.pjcloud.hard.api.vo.order.app.HardAppCreateShopOrderVo;
@@ -116,6 +117,15 @@ public interface HardOrderService extends IService<HardOrderEntity> {
*/
void configureAppVisibility(HardOrderDto dto, Long viewerUserId);
/**
* App 订单页按实际用餐人分组统计订单数量,供顶部胶囊一次请求取回全部计数;
* 计数对象限定为本人和关系图谱用户,查询口径与订单列表 app/page-join 一致。
*
* @param dto 已由接口层写入可见范围、商户类型与状态筛选,userIds 为请求计数的用餐人集合
* @return 有订单的用餐人及其数量;无订单的用餐人不返回行,由调用方按 0 处理
*/
List<HardOrderDinerCountVo> appDinerOrderCount(HardOrderDto dto);
/**
* 校验当前用户是否可以查看订单。
*/
@@ -91,6 +91,7 @@ import com.bsd.pjcloud.hard.api.vo.order.HardAggregateOrderCodePayStatusVo;
import com.bsd.pjcloud.hard.api.vo.order.HardAggregateOrderCodePayVo;
import com.bsd.pjcloud.hard.api.vo.order.HardCreateHardQrCodeScanOrderVo;
import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo;
import com.bsd.pjcloud.hard.api.vo.order.HardOrderDinerCountVo;
import com.bsd.pjcloud.hard.api.vo.order.WardMenuMapDayVo;
import com.bsd.pjcloud.hard.api.vo.order.HardPendingReservationCountVo;
import com.bsd.pjcloud.hard.api.vo.order.app.HardAppCreateShopOrderVo;
@@ -599,6 +600,32 @@ public class HardOrderServiceImpl extends ServiceImpl<HardOrderMapper, HardOrder
dto.setAppRelatedUserIds(listRelatedUserIds(viewerUserId, false));
}
/**
* App 订单页用餐人胶囊计数:与订单列表同口径地按实际用餐人分组统计,
* 一次请求返回全部用餐人数量,替代此前前端逐人发起的分页 count 探测。
*/
@Override
public List<HardOrderDinerCountVo> appDinerOrderCount(HardOrderDto dto) {
if (ObjectUtil.isEmpty(dto.getUserIds()) || dto.getAppViewerUserId() == null) {
return List.of();
}
// 计数对象限定为本人与关系图谱用户(与胶囊来源同口径),越权 ID 直接剔除;
// 可见范围装配时已查询过关系图谱,非空时直接复用,避免同一请求重复远程调用。
Set<Long> allowedUserIds = new HashSet<>();
allowedUserIds.add(dto.getAppViewerUserId());
if (dto.getAppRelatedUserIds() != null) {
allowedUserIds.addAll(dto.getAppRelatedUserIds());
} else {
allowedUserIds.addAll(listRelatedUserIds(dto.getAppViewerUserId(), false));
}
List<Long> dinerUserIds = dto.getUserIds().stream().filter(allowedUserIds::contains).distinct().toList();
if (dinerUserIds.isEmpty()) {
return List.of();
}
dto.setUserIds(dinerUserIds);
return baseMapper.appDinerOrderCount(dto, null);
}
/**
* 根据父购物车付款人和实际用餐人生成 App 操作权限。
*
@@ -615,6 +615,19 @@
</where>
</select>
<!-- App 订单页用餐人胶囊计数:与 appVisibilityCount 完全同口径,仅按实际用餐人分组,一次请求返回全部人数。 -->
<select id="appDinerOrderCount" resultType="com.bsd.pjcloud.hard.api.vo.order.HardOrderDinerCountVo">
select a.user_id as userId,
count(0) as count
from hard_order a
<where>
<include refid="whereA"/>
<include refid="appVisibilityWhere"/>
<include refid="appRelationFilterWhere"/>
</where>
group by a.user_id
</select>
<select id="scopeList" resultType="com.bsd.pjcloud.hard.api.vo.order.HardOrderVo">
<include refid="pageList"/>
</select>