Blame view

service-community/src/main/java/com/java110/community/cmd/room/QueryRoomsByAppCmd.java 5.7 KB
88e030b7   王彪总   init project
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
  /**
   * 查询房屋信息命令类
   * 
   * 该类是一个基于Java110框架的命令处理器,专门用于处理通过APP查询房屋信息的请求。
   * 主要功能包括参数验证、房屋数据查询、数据清理和响应结果封装。
   * 该类仅对微信业主端和小程序业主端开放访问权限。
   * 
   * @author Java110
   * @version 1.0
   * @see Cmd
   * @see IRoomV1InnerServiceSMO
   */
  package com.java110.community.cmd.room;
  
  import com.alibaba.fastjson.JSONObject;
  import com.java110.core.annotation.Java110Cmd;
  import com.java110.core.context.CmdContextUtils;
  import com.java110.core.context.ICmdDataFlowContext;
  import com.java110.core.event.cmd.Cmd;
  import com.java110.core.event.cmd.CmdEvent;
  import com.java110.dto.app.AppDto;
  import com.java110.dto.room.RoomDto;
  import com.java110.intf.community.IRoomV1InnerServiceSMO;
  import com.java110.utils.exception.CmdException;
  import com.java110.utils.util.Assert;
  import com.java110.utils.util.BeanConvertUtil;
  import com.java110.utils.util.ListUtil;
  import com.java110.vo.ResultVo;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.http.HttpStatus;
  import org.springframework.http.ResponseEntity;
  
  import java.text.ParseException;
  import java.util.ArrayList;
  import java.util.List;
  
  @Java110Cmd(serviceCode = "room.queryRoomsByApp")
  public class QueryRoomsByAppCmd extends Cmd {
  
      @Autowired
      private IRoomV1InnerServiceSMO roomV1InnerServiceSMOImpl;
  
      /**
       * 请求参数验证方法
       * 
       * 验证请求参数是否完整和有效,包括必填字段检查和APP权限验证。
       * 仅允许微信业主端和小程序业主端调用此接口。
       * 
       * @param event 命令事件对象,包含请求相关信息
       * @param context 命令数据流上下文,用于获取和设置请求/响应数据
       * @param reqJson 请求参数的JSON对象
       * @throws CmdException 当参数验证失败或权限不足时抛出
       * @throws ParseException 当参数解析异常时抛出
       */
      @Override
      public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
          // 验证必填参数是否存在
          Assert.jsonObjectHaveKey(reqJson, "communityId", "请求中未包含communityId信息");
          //Assert.jsonObjectHaveKey(reqJson, "floorId", "请求中未包含floorId信息");
          Assert.jsonObjectHaveKey(reqJson, "page", "请求报文中未包含page节点");
          Assert.jsonObjectHaveKey(reqJson, "row", "请求报文中未包含row节点");
          Assert.hasKeyAndValue(reqJson, "unitId", "未包含单元");
  
          // 验证APP权限,仅允许业主端访问
          String appId = CmdContextUtils.getAppId(context);
          if (!AppDto.WECHAT_OWNER_APP_ID.equals(appId) && !AppDto.WECHAT_MINA_OWNER_APP_ID.equals(appId)) {
              throw new CmdException("此接口用户端专用");
          }
      }
  
      /**
       * 命令执行方法
       * 
       * 执行房屋查询业务逻辑,包括参数转换、数据查询、数据清理和响应封装。
       * 支持分页查询,返回格式化后的房屋信息列表。
       * 
       * @param event 命令事件对象
       * @param context 命令数据流上下文
       * @param reqJson 请求参数的JSON对象
       * @throws CmdException 当命令执行异常时抛出
       * @throws ParseException 当数据解析异常时抛出
       */
      @Override
      public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
          // 将请求参数转换为RoomDto对象
          RoomDto roomDto = BeanConvertUtil.covertBean(reqJson, RoomDto.class);
          roomDto.setUserId(""); // 清空用户ID,确保查询条件正确
  
          // 查询总记录数
          int total = roomV1InnerServiceSMOImpl.queryRoomsCount(roomDto);
          List<RoomDto> roomDtoList = null;
          
          // 根据查询结果决定是否查询详细数据
          if (total > 0) {
              roomDtoList = roomV1InnerServiceSMOImpl.queryRooms(roomDto);
          } else {
              roomDtoList = new ArrayList<>();
          }
  
          // 清理房屋数据,格式化显示信息
          roomDtoList = clearRoomDatas(roomDtoList);
  
          // 计算总页数并封装返回结果
          ResultVo resultVo = new ResultVo((int) Math.ceil((double) total / (double) reqJson.getInteger("row")), total, roomDtoList);
  
          // 设置HTTP响应
          ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
          context.setResponseEntity(responseEntity);
      }
  
      /**
       * 清理房屋数据方法
       * 
       * 对查询到的房屋数据进行清理和格式化处理,只保留必要的字段信息,
       * 并将楼层号、单元号和房间号组合成完整的房间名称。
       * 
       * @param roomDtoList 原始房屋数据列表
       * @return 清理后的房屋数据列表,包含房间ID和格式化后的房间名称
       */
      private List<RoomDto> clearRoomDatas(List<RoomDto> roomDtoList) {
          // 如果输入列表为空,直接返回
          if(ListUtil.isNull(roomDtoList)){
              return roomDtoList;
          }
          
          List<RoomDto> roomDtos = new ArrayList<>();
          RoomDto tmpRoomDto = null;
          
          // 遍历原始数据,创建新的简化数据对象
          for(RoomDto roomDto:roomDtoList){
              tmpRoomDto = new RoomDto();
              tmpRoomDto.setRoomId(roomDto.getRoomId()); // 保留房间ID
              // 格式化房间名称:楼层号-单元号-房间号
              tmpRoomDto.setRoomName(roomDto.getFloorNum()+"-"+roomDto.getUnitNum()+"-"+roomDto.getRoomNum());
              roomDtos.add(tmpRoomDto);
          }
          return roomDtos;
      }
  }