|
@@ -1,10 +1,34 @@
|
|
|
package com.chelvc.cloud.vehicle.server.service.impl;
|
|
|
|
|
|
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.chelvc.cloud.vehicle.api.constant.Constants;
|
|
|
+import com.chelvc.cloud.vehicle.api.dto.EnquireDTO;
|
|
|
+import com.chelvc.cloud.vehicle.api.param.EnquireModifyParam;
|
|
|
+import com.chelvc.cloud.vehicle.api.param.EnquirePagingParam;
|
|
|
+import com.chelvc.cloud.vehicle.server.copier.EnquireCopier;
|
|
|
import com.chelvc.cloud.vehicle.server.dao.EnquireMapper;
|
|
|
+import com.chelvc.cloud.vehicle.server.dao.MerchantMapper;
|
|
|
import com.chelvc.cloud.vehicle.server.entity.Enquire;
|
|
|
+import com.chelvc.cloud.vehicle.server.entity.Merchant;
|
|
|
import com.chelvc.cloud.vehicle.server.service.EnquireService;
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
+import com.chelvc.framework.base.context.SessionContextHolder;
|
|
|
+import com.chelvc.framework.base.util.ResourceUtils;
|
|
|
+import com.chelvc.framework.common.model.Pagination;
|
|
|
+import lombok.NonNull;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import org.apache.dubbo.config.annotation.DubboService;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.data.geo.Circle;
|
|
|
+import org.springframework.data.geo.GeoResult;
|
|
|
+import org.springframework.data.geo.Point;
|
|
|
+import org.springframework.data.redis.connection.RedisGeoCommands;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 询价业务操作实现
|
|
@@ -12,6 +36,86 @@ import org.springframework.stereotype.Service;
|
|
|
* @author Woody
|
|
|
* @date 2023/5/2
|
|
|
*/
|
|
|
-@Service
|
|
|
-public class EnquireServiceImpl extends ServiceImpl<EnquireMapper, Enquire> implements EnquireService {
|
|
|
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
|
|
|
+@DubboService(interfaceClass = com.chelvc.cloud.vehicle.api.service.EnquireService.class)
|
|
|
+public class EnquireServiceImpl extends ServiceImpl<EnquireMapper,Enquire> implements EnquireService,
|
|
|
+ com.chelvc.cloud.vehicle.api.service.EnquireService{
|
|
|
+
|
|
|
+ private final RedisTemplate redisTemplate;
|
|
|
+ private final MerchantMapper merchantMapper;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Long addEnquire(@NonNull EnquireModifyParam param) {
|
|
|
+ Enquire enquire = EnquireCopier.INSTANCE.copying(param);
|
|
|
+ this.save(enquire);
|
|
|
+ // 先检查redis中有不有商家的数据
|
|
|
+ if (! redisTemplate.hasKey(Constants.MERCHANT_REDIS_KEY)) {
|
|
|
+ // 查询所有商家
|
|
|
+ List<Merchant> merchants = new LambdaQueryChainWrapper<>(merchantMapper)
|
|
|
+ .select(Merchant::getId, Merchant::getLatitude, Merchant::getLongitude)
|
|
|
+ .list();
|
|
|
+ // 将商家的经纬度存入redis
|
|
|
+ List<RedisGeoCommands.GeoLocation<String>> locations = new ArrayList<>(merchants.size());
|
|
|
+ merchants.stream().forEach(merchant -> {
|
|
|
+ locations.add(new RedisGeoCommands.GeoLocation<String>(merchant.getId().toString(), new Point(merchant.getLatitude(), merchant.getLongitude())));
|
|
|
+ });
|
|
|
+ redisTemplate.opsForGeo().add(Constants.MERCHANT_REDIS_KEY, locations);
|
|
|
+ }
|
|
|
+ // 查询附近商家,50km内
|
|
|
+ List<GeoResult<RedisGeoCommands.GeoLocation<String>>> geoResults = redisTemplate.opsForGeo().radius(Constants.MERCHANT_REDIS_KEY,
|
|
|
+ new Circle(new Point(param.getLongitude(),
|
|
|
+ param.getLatitude()), 50),
|
|
|
+ // 添加命令:包含距离、升序排列
|
|
|
+ RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().sortAscending())
|
|
|
+ .getContent();
|
|
|
+ // 将该询价存入到对应商家可见列表中
|
|
|
+ geoResults.stream().forEach(result -> {
|
|
|
+ Merchant merchant = merchantMapper.selectById(result.getContent().getName());
|
|
|
+ if (merchant != null) {
|
|
|
+ redisTemplate.opsForList().leftPush(Constants.MERCHANT_ENQUIRE_REDIS_KEY_PREFIX + merchant.getReferrerId(), enquire.getId());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return enquire.getId();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updateEnquire(@NonNull Long id, @NonNull EnquireModifyParam param) {
|
|
|
+ Enquire enquire = ResourceUtils.required(this.getById(id), "询价不存在");
|
|
|
+ EnquireCopier.INSTANCE.copying(param, enquire);
|
|
|
+ this.updateById(enquire);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public EnquireDTO getEnquire(@NonNull Long id) {
|
|
|
+ return this.convert(this.getById(id));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Pagination<EnquireDTO> getEnquirePaging(@NonNull EnquirePagingParam param) {
|
|
|
+ Long userId = SessionContextHolder.getSession().getId();
|
|
|
+ int size = param.getPaging().getSize();
|
|
|
+ int number = param.getPaging().getNumber();
|
|
|
+ int start = (number - 1) * size;
|
|
|
+ // 从redis中获取可见的附近询价
|
|
|
+ List<Long> enquireIds = redisTemplate.opsForList().range(Constants.MERCHANT_ENQUIRE_REDIS_KEY_PREFIX + userId, start, size);
|
|
|
+ List<Enquire> enquireList = baseMapper.selectBatchIds(enquireIds);
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(enquireList)) {
|
|
|
+ return Pagination.empty();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 构建询价信息
|
|
|
+ List<EnquireDTO> enquires = enquireList.stream().map(this::convert).collect(Collectors.toList());
|
|
|
+ return new Pagination<>().convert(enquires);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换询价信息
|
|
|
+ *
|
|
|
+ * @param enquire 询价
|
|
|
+ * @return EnquireDTO 询价
|
|
|
+ */
|
|
|
+ private EnquireDTO convert(Enquire enquire) {
|
|
|
+ return EnquireCopier.INSTANCE.copying(enquire);
|
|
|
+ }
|
|
|
}
|