NumberServiceImpl.java 7.87 KB
package com.uccc.number.service.impl;


import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.uccc.number.domain.*;
import com.uccc.number.domain.Number;
import com.uccc.number.mapper.NumberMapper;
import com.uccc.number.service.NumberService;
import com.uccc.pretty.common.Result;
import com.uccc.pretty.common.Store;
import io.searchbox.client.JestClient;
import io.searchbox.core.Search;
import io.searchbox.core.SearchResult;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

@Service
public class NumberServiceImpl implements NumberService {

    final private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private NumberMapper numberMapper;
    @Autowired
    private JestClient jestClient;

    @Value("${elasticsearch.index}")
    private String indexName;

    @Override
    public Result getESNumbers(NumberQuery query) {
        logger.info("indexName:{}", indexName);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().trackTotalHits(true);
        ;
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        queryBuilder.must(QueryBuilders.matchPhraseQuery("is_delete", false));
        //已售出和未售出的号码,其他不显示
//        queryBuilder.must(QueryBuilders.rangeQuery("status").gte(1));
//        queryBuilder.must(QueryBuilders.rangeQuery("status").lte(2));
        if (query.getStatus() != -1) {
            queryBuilder.must(QueryBuilders.rangeQuery("status").gte(query.getStatus()).lt(query.getStatus()+1));
        }
        if (!StringUtils.isEmpty(query.getProvince()) && !"归属地".equals(query.getProvince())) {
            if (!StringUtils.isEmpty(query.getCity()))
                queryBuilder.must(QueryBuilders.matchPhraseQuery("city", query.getCity()));
            else queryBuilder.must(QueryBuilders.matchPhraseQuery("province", query.getProvince()));
        }
        if (query.getMinPrice() > 0) queryBuilder.must(QueryBuilders.rangeQuery("price").gte(query.getMinPrice()));
        if (query.getMaxPrice() > 0) queryBuilder.must(QueryBuilders.rangeQuery("price").lte(query.getMaxPrice()));
        if (!StringUtils.isEmpty(query.getNetwork()))
            queryBuilder.must(QueryBuilders.matchPhraseQuery("service", query.getNetwork()));
        if (!StringUtils.isEmpty(query.getVague()))
            queryBuilder.must(QueryBuilders.wildcardQuery("number", "*" + query.getVague() + "*"));
        String tags = "";
        if (!StringUtils.isEmpty(query.getPosition())) {
            if (Position.AFTER.toString().equals(query.getPosition())) tags = Position.AFTER.toString();
            if (Position.LATER.toString().equals(query.getPosition())) tags = Position.LATER.toString();
        }
        if (!StringUtils.isEmpty(query.getLaw())) {
            tags = tags + query.getLaw();
            queryBuilder.must(QueryBuilders.matchPhraseQuery("tags", tags));
        }
        //遍历排除和包含
        if (!CollectionUtils.isEmpty(query.getExclude())) {
            query.getExclude().stream().forEach(b -> {
                queryBuilder.must(QueryBuilders.matchPhraseQuery("tags", b));
            });
        }
        if (!CollectionUtils.isEmpty(query.getInclude())) {
            query.getInclude().stream().forEach(b -> {
                queryBuilder.must(QueryBuilders.matchPhraseQuery("tags", b));
            });
        }
        if (!StringUtils.isEmpty(query.getType())) {
            //情侣、生日、秒杀
            if (!Tag.ALL.toString().equals(query.getType()))
                queryBuilder.must(QueryBuilders.matchPhraseQuery("tags", query.getType()));
        }
        searchSourceBuilder.query(queryBuilder);
        //排序
        if (query.getSort() == 1) searchSourceBuilder.sort("price", SortOrder.ASC);
        if (query.getSort() == 2) searchSourceBuilder.sort("price", SortOrder.DESC);
        if (query.getSort() == 3) searchSourceBuilder.sort("cts", SortOrder.DESC);
        /**
         * 分页
         */
        searchSourceBuilder.size(query.getPageSize() == 0 ? 20 : query.getPageSize());
        searchSourceBuilder.from(query.getCurrentPage());
        System.out.println(searchSourceBuilder.toString());
        Search search = new Search.Builder(searchSourceBuilder.toString())
                .addIndex(indexName)
                .build();
        try {
            SearchResult result = jestClient.execute(search);
            JsonObject jsonObject = result.getJsonObject();
            JsonElement jsonElement = jsonObject.get("hits").getAsJsonObject().get("total").getAsJsonObject().get("value");
            List<SearchResult.Hit<NumberEntity, Void>> hits = result.getHits(NumberEntity.class);
            List<NumberEntity> lists = new ArrayList<>();
            hits.stream().forEach(b -> lists.add(b.source));
            PageInfo pageInfo = new PageInfo(query.getCurrentPage(), query.getPageSize(), jsonElement.getAsLong(), lists);
            return new Result().success(pageInfo);
        } catch (Exception e) {
            logger.error("es number data err: {}", e.getMessage());
        }
        return new Result().fail();

    }

    @Override
    public int updateNumber(Number number) {
        logger.info("number:{}", number.toString());
        List<String> numbers = number.getNumbers();
        AtomicInteger count = new AtomicInteger();
        numbers.forEach(d->{
            number.setNumber(d);
            int updateRes = numberMapper.updateNumber(number);
            count.addAndGet(updateRes);
            //福袋号码删除处理
            if (number.isDelete()) {
                deleteBlessNum(d);
            }
            //---
        });
        return count.get();
    }

    @Override
    public StatusCount getStatusCount() {
        return numberMapper.selectStatusCount();
    }

    @Override
    public void bindBlessNumbers(BindBlessNum bindBlessNum) {
        List<String> numbers = bindBlessNum.getNumbers();
        numbers.forEach(d->{
            int numRepeat = numberMapper.selectBlessBindByUserId(bindBlessNum.getUserId(), d);
            if (numRepeat == 0) {
                numberMapper.insertUserBless(bindBlessNum.getUserId(), d, bindBlessNum.getBlessPrice());
            }
        });
    }

    @Override
    public void unbindBlessNumbers(BindBlessNum bindBlessNum) {
        List<String> numbers = bindBlessNum.getNumbers();
        numbers.forEach(d->{
            numberMapper.deleteBindBlessNum(bindBlessNum.getUserId(), d);
        });
    }

    @Override
    public void deleteBlessNum(String number) {
        numberMapper.deleteBlessNum(number);
        numberMapper.deleteBindBlessNum(null, number);
    }

    @Override
    public List<BlessNumberEntity> getBlessNumList(String city, String province, Long userId, Integer pageSize, Integer currentPage) {
        List<BlessNumberEntity> list = numberMapper.selectBlessNumList(city, province, userId, pageSize, currentPage);
        list.forEach(d->{
                if (userId == null) {
                    d.setBlessPrice(null);
                }
        });
        return list;
    }

    @Override
    public int getBlessNumListCount(String city, String province, Long userId) {
        return numberMapper.selectBlessNumListCount(city, province, userId);
    }

    @Override
    public Store checkStoreByMid(Long storeId) {
        return numberMapper.checkStoreByMid(storeId);
    }
}