| | |
| | | package com.xiaopeng.maintenance.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.xiaopeng.api.model.maintenance.XpCheckLocation; |
| | | import com.xiaopeng.api.model.maintenance.XpClockIn; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.xiaopeng.api.model.maintenance.XpShift; |
| | | import com.xiaopeng.common.core.domain.R; |
| | | import com.xiaopeng.common.core.utils.DateUtils; |
| | | import com.xiaopeng.common.core.utils.GeodesyUtil; |
| | | import com.xiaopeng.maintenance.dto.ClockDTO; |
| | | import com.xiaopeng.maintenance.dto.VerifyRangeDTO; |
| | | import com.xiaopeng.maintenance.mapper.XpCheckLocationMapper; |
| | | import com.xiaopeng.maintenance.mapper.XpClockInMapper; |
| | | import com.xiaopeng.maintenance.mapper.XpShiftMapper; |
| | | import com.xiaopeng.maintenance.service.IXpClockInService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | | * <p> |
| | |
| | | @Service |
| | | public class XpClockInServiceImpl extends ServiceImpl<XpClockInMapper, XpClockIn> implements IXpClockInService { |
| | | |
| | | @Autowired |
| | | private XpCheckLocationMapper xpCheckLocationMapper; |
| | | @Autowired |
| | | private XpShiftMapper xpShiftMapper; |
| | | @Autowired |
| | | private XpClockInMapper xpClockInMapper; |
| | | |
| | | @Override |
| | | public Boolean verifyRange(VerifyRangeDTO dto) { |
| | | |
| | | XpCheckLocation xpCheckLocation = xpCheckLocationMapper.selectById(dto.getLocationId()); |
| | | |
| | | Map<String, Double> distance = GeodesyUtil.getDistance(dto.getUserLon()+","+dto.getUserLat(), xpCheckLocation.getLocationLon()+","+xpCheckLocation.getLocationLat()); |
| | | if (null != distance) { |
| | | Double distance1 = distance.get("WGS84"); |
| | | if (BigDecimal.valueOf(distance1).compareTo(xpCheckLocation.getLocationRange())>0) { |
| | | return false; |
| | | }else { |
| | | return true; |
| | | } |
| | | } else { |
| | | log.error("调用高德计算距离出错"); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public R<String> clockIn(ClockDTO dto) { |
| | | |
| | | XpCheckLocation xpCheckLocation = xpCheckLocationMapper.selectById(dto.getLocationId()); |
| | | |
| | | Map<String, Double> distance = GeodesyUtil.getDistance(dto.getUserLon()+","+dto.getUserLat(), xpCheckLocation.getLocationLon()+","+xpCheckLocation.getLocationLat()); |
| | | if (null != distance) { |
| | | Double distance1 = distance.get("WGS84"); |
| | | if (BigDecimal.valueOf(distance1).compareTo(xpCheckLocation.getLocationRange()) > 0) { |
| | | return R.fail("不在打卡范围内"); |
| | | } |
| | | }else { |
| | | return R.fail("打卡失败"); |
| | | } |
| | | |
| | | // 查询班次 |
| | | XpShift xpShift = xpShiftMapper.selectById(dto.getShiftId()); |
| | | if (null == xpShift) { |
| | | return R.fail("班次不存在"); |
| | | } |
| | | // 开始打卡时间 |
| | | String startTime = xpShift.getStartTime(); |
| | | LocalDateTime startLocalDateTime = DateUtils.stringToLocalDateTime(LocalDate.now() + " " + startTime + ":00"); |
| | | |
| | | XpClockIn xpClockIn = new XpClockIn(); |
| | | xpClockIn.setAppUserId(dto.getOperationsUserId()); |
| | | xpClockIn.setClockInTime(LocalDateTime.now()); |
| | | xpClockIn.setClockInLon(dto.getUserLon()); |
| | | xpClockIn.setClockInLat(dto.getUserLat()); |
| | | xpClockIn.setShiftId(dto.getShiftId()); |
| | | if (xpClockIn.getClockInTime().isAfter(startLocalDateTime)) { |
| | | xpClockIn.setClockInResult(2); |
| | | }else { |
| | | xpClockIn.setClockInResult(1); |
| | | } |
| | | this.save(xpClockIn); |
| | | return R.ok(); |
| | | } |
| | | |
| | | @Override |
| | | public R<String> clockOut(ClockDTO dto) { |
| | | |
| | | XpCheckLocation xpCheckLocation = xpCheckLocationMapper.selectById(dto.getLocationId()); |
| | | Map<String, Double> distance = GeodesyUtil.getDistance(dto.getUserLon()+","+dto.getUserLat(), xpCheckLocation.getLocationLon()+","+xpCheckLocation.getLocationLat()); |
| | | if (null != distance) { |
| | | Double distance1 = distance.get("WGS84"); |
| | | if (BigDecimal.valueOf(distance1).compareTo(xpCheckLocation.getLocationRange()) > 0) { |
| | | return R.fail("不在打卡范围内"); |
| | | } |
| | | }else { |
| | | return R.fail("打卡失败"); |
| | | } |
| | | |
| | | // 查询上班打卡信息 |
| | | XpClockIn xpClockIn = xpClockInMapper.selectOne(Wrappers.lambdaQuery(XpClockIn.class) |
| | | .eq(XpClockIn::getAppUserId, dto.getOperationsUserId()) |
| | | .likeRight(XpClockIn::getClockInTime, LocalDate.now()) |
| | | .last("LIMIT 1")); |
| | | if(Objects.isNull(xpClockIn)){ |
| | | return R.fail("请先上班打卡"); |
| | | } |
| | | |
| | | // 查询班次 |
| | | XpShift xpShift = xpShiftMapper.selectById(xpClockIn.getShiftId()); |
| | | if (null == xpShift) { |
| | | return R.fail("班次不存在"); |
| | | } |
| | | // 开始打卡时间 |
| | | String endTime = xpShift.getEndTime(); |
| | | LocalDateTime endLocalDateTime = DateUtils.stringToLocalDateTime(LocalDate.now() + " " + endTime + ":00"); |
| | | |
| | | xpClockIn.setClockOutTime(LocalDateTime.now()); |
| | | xpClockIn.setClockOutLon(dto.getUserLon()); |
| | | xpClockIn.setClockOutLat(dto.getUserLat()); |
| | | |
| | | if (xpClockIn.getClockOutTime().isBefore(endLocalDateTime)) { |
| | | xpClockIn.setClockInResult(2); |
| | | }else { |
| | | xpClockIn.setClockInResult(1); |
| | | } |
| | | this.updateById(xpClockIn); |
| | | return R.ok(); |
| | | } |
| | | } |