package com.fdkankan.tracking.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.fdkankan.elasticsearch.service.DocumentService; import com.fdkankan.redis.constant.RedisKey; import com.fdkankan.redis.util.RedisUtil; import com.fdkankan.tracking.bean.TrackingBody; import com.fdkankan.tracking.vo.TrackingParamVo; import com.fdkankan.tracking.service.TrackingService; import com.fdkankan.web.response.ResultData; import com.fdkankan.web.util.WebUtil; import lombok.extern.slf4j.Slf4j; import org.elasticsearch.rest.RestStatus; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; import javax.servlet.http.HttpServletRequest; import java.net.URI; import java.util.*; import java.util.stream.Collectors; @Slf4j @Service public class TrackingServiceImpl implements TrackingService { @Autowired private DocumentService documentService; @Autowired private RedisUtil redisUtil; @Override public ResultData saveLog(TrackingParamVo param, HttpServletRequest request) throws Exception { String index = param.getProduct(); if(StrUtil.isEmpty(index)){ return ResultData.ok(); } TrackingBody trackingBody = param.getPayload(); if(ObjectUtils.isEmpty(trackingBody)){ return ResultData.ok(); } String appId = trackingBody.getAppId(); appId = index.concat(appId.substring(appId.indexOf("-"))); trackingBody.setAppId(appId); String redisIndex = redisUtil.hget(RedisKey.TRACK_APPID, appId); if(StrUtil.isEmpty(redisIndex) || !redisIndex.equals(index)){ return ResultData.ok(); } trackingBody.setUserAgent(request.getHeader("user-agent")); trackingBody.setUserIP(WebUtil.getIpAddress(request)); trackingBody.setTime(Calendar.getInstance().getTime()); trackingBody.setSource("FRONT"); JSONObject requestData = trackingBody.getRequestData(); if(Objects.nonNull(requestData)){ Object data = trackingBody.getRequestData().get("data"); //如果是数组,需要拆解成多条数据入库 if(data instanceof Iterable){ List dataList = (List)data; List list = dataList.stream().map(item -> { TrackingBody subBody = BeanUtil.copyProperties(trackingBody, TrackingBody.class); subBody.getRequestData().put("data", item); return JSON.parseObject(JSON.toJSONString(subBody)); }).collect(Collectors.toList()); if(CollUtil.isEmpty(list)){ return ResultData.ok("data为空"); } RestStatus restStatus = documentService.batchImportGoodsData(list, index); return ResultData.ok(restStatus.getStatus()); } } RestStatus restStatus = documentService.addDocument(index, null, JSON.toJSONString(trackingBody)); return ResultData.ok(restStatus.getStatus()); } public static void main(String[] args) { String appid = "7b5958d5-1ae6-4ad5-8a87-5fc8a4b92999"; System.out.println(appid.substring(appid.indexOf("-"))); } }