package com.chuanghai.ihotel.component; import com.chuanghai.ihotel.common.exception.BizCodeEnume; import com.chuanghai.ihotel.common.exception.RRException; import com.chuanghai.ihotel.config.DoorLockConfig; import com.chuanghai.ihotel.dto.DoorLockAddPasswordRequestDTO; import com.chuanghai.ihotel.dto.DoorLockAddPasswordDataDTO; import com.chuanghai.ihotel.util.DoorLockAESUtil; import com.chuanghai.ihotel.util.DoorLockMD5Util; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.Map; /** * 门锁服务 */ @Slf4j @Service public class DoorLockComponent { private String sign; private ObjectMapper objectMapper = new ObjectMapper(); @Autowired private DoorLockConfig doorLockConfig; /** * 下发密码 * @param addPasswordDTO * @return * @throws JsonProcessingException */ public DoorLockAddPasswordDataDTO addPassword(DoorLockAddPasswordRequestDTO addPasswordDTO) { String uri = "open/api/v2/lock/addPassword"; addPasswordDTO.setCategoryId(doorLockConfig.getCategoryId()); try { String dataJsonStr = doRequest(uri, addPasswordDTO); DoorLockAddPasswordDataDTO dto = objectMapper.readValue(dataJsonStr, DoorLockAddPasswordDataDTO.class); return dto; } catch (Exception e) { throw new RRException(BizCodeEnume.THIRD_PARTY_SERVICE_CALL_FAILED, "门锁服务-请求密码失败-" + e.getMessage()); } } /** * 删除锁用户 * @param lockId * @param lockUserId */ public void deleteLockUser(String lockId, String lockUserId) { String uri = "open/api/v2/lock/deleteLockUser"; Map param = new HashMap<>(); param.put("categoryId", doorLockConfig.getCategoryId()); param.put("luid", lockId); param.put("id", lockUserId); try { doRequest(uri, param); } catch (Exception e) { throw new RRException(BizCodeEnume.THIRD_PARTY_SERVICE_CALL_FAILED, "门锁服务-删除用户密码失败-" + e.getMessage()); } } /** * 发送请求 * @param uri 请求地址 * @param param 参数 * @throws JsonProcessingException * @return */ private String doRequest(String uri, Object param) throws JsonProcessingException { String url = doorLockConfig.getServiceHost() + uri; String encrypt = DoorLockAESUtil.encrypt(objectMapper.writeValueAsString(param), doorLockConfig.getAppSecret()); RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); headers.add("appId", doorLockConfig.getAppId()); headers.add("sign", getSign()); HttpEntity formEntity = new HttpEntity<>(encrypt, headers); ResponseEntity responseEntity = restTemplate.postForEntity(url, formEntity, String.class); String body = responseEntity.getBody(); log.info("门锁服务请求结果【{}】", body); JsonNode jsonNode = objectMapper.readTree(body); String result = jsonNode.get("result").asText(); if (!"1".equals(result)) { throw new RRException(BizCodeEnume.THIRD_PARTY_SERVICE_CALL_FAILED, "门锁服务-请求结果状态不为1"); } String dataJsonStr = jsonNode.get("data").toString(); return dataJsonStr; } private String getSign() { if (StringUtils.hasText(sign)) { return sign; } else { sign = DoorLockMD5Util.getMD5(doorLockConfig.getAppId() + doorLockConfig.getAppSecret()); return sign; } } }