123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- package service
- import (
- "context"
- "time"
- "github.com/gofiber/fiber/v3"
- "github.com/gofiber/fiber/v3/middleware/requestid"
- "github.com/rotisserie/eris"
- "github.com/rs/zerolog/log"
- "github.com/spf13/viper"
- v1 "sikey.com.cn/benew/ext/api/v1"
- "sikey.com.cn/benew/ext/internal/model"
- )
- type GpsService struct {
- conf *viper.Viper
- mapLocationModel *model.MapLocationModel
- locationService *LocationService
- }
- func NewGpsService(conf *viper.Viper, mapLocationModel *model.MapLocationModel, locationService *LocationService) *GpsService {
- return &GpsService{
- conf: conf,
- mapLocationModel: mapLocationModel,
- locationService: locationService,
- }
- }
- func (s *GpsService) Request(ctx context.Context, request *v1.PostLocationRequest) (*v1.PostLocationResponse, error) {
- requestId := requestid.FromContext(ctx.Value("fiberCtx").(fiber.Ctx))
- l := log.With().Str("requestId", requestId).Logger()
- location := request.Lon + "," + request.Lat
- location = s.locationService.convertGpsPoint(ctx, location)
- // 距离算法判断是否丢弃点位
- // 跟上一次的点位作比较, 如果点位的移动速度超过了 trainSpeed 阈值, 我们需要丢弃这个点位
- isInvalidPosition, err := s.locationService.previousPositionDiff(ctx, request, location, request.PositionTime)
- if err != nil {
- return nil, eris.Wrapf(err, "error select by previous")
- }
- if isInvalidPosition {
- l.Warn().Str("now", location).Msgf("定位命中距离算法判断, 丢弃点位")
- return nil, v1.ErrAMAPLocationFailed
- }
- radius := radiusCorrect(request.Radius)
- positionTime := time.UnixMilli(request.PositionTime)
- // 数据写入数据库
- if err := s.mapLocationModel.Insert(ctx, &model.MapLocationModel{
- ExtID: request.ID,
- InfoCode: 10000,
- Info: "OK",
- Location: location,
- Radius: int32(radius),
- PointType: request.AccessType,
- PositionTime: positionTime,
- CreatedAt: time.Now(),
- }); err != nil {
- return nil, eris.Wrap(err, "insert location error")
- }
- return &v1.PostLocationResponse{
- Type: 0,
- PointType: request.AccessType,
- IMEI: request.IMEI,
- Location: location,
- Radius: int32(request.Radius),
- }, nil
- }
|