From 426ba9ce8ac55c7fe93cb1867c4451d7eb4f96e5 Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期三, 11 二月 2026 10:23:51 +0800
Subject: [PATCH] 人员打卡签到增加配置
---
src/main/java/com/ruoyi/staff/mapper/PersonalAttendanceLocationConfigMapper.java | 18 ++
src/main/java/com/ruoyi/staff/service/PersonalAttendanceRecordsService.java | 2
src/main/java/com/ruoyi/staff/utils/LocationUtils.java | 37 +++++
src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceLocationConfigServiceImpl.java | 25 +++
src/main/java/com/ruoyi/CodeGenerator.java | 6
src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java | 110 ++++++++-------
src/main/java/com/ruoyi/staff/controller/PersonalAttendanceLocationConfigController.java | 43 ++++++
src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceLocationConfig.java | 59 ++++++++
src/main/java/com/ruoyi/staff/service/PersonalAttendanceLocationConfigService.java | 16 ++
src/main/resources/mapper/staff/PersonalAttendanceLocationConfigMapper.xml | 17 ++
src/main/java/com/ruoyi/staff/dto/PersonalAttendanceRecordsDto.java | 23 +++
src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java | 15 +-
12 files changed, 306 insertions(+), 65 deletions(-)
diff --git a/src/main/java/com/ruoyi/CodeGenerator.java b/src/main/java/com/ruoyi/CodeGenerator.java
index e670dbb..6356273 100644
--- a/src/main/java/com/ruoyi/CodeGenerator.java
+++ b/src/main/java/com/ruoyi/CodeGenerator.java
@@ -19,11 +19,11 @@
// 婕旂ず渚嬪瓙锛屾墽琛� main 鏂规硶鎺у埗鍙拌緭鍏ユā鍧楄〃鍚嶅洖杞﹁嚜鍔ㄧ敓鎴愬搴旈」鐩洰褰曚腑
public class CodeGenerator {
- public static String database_url = "jdbc:mysql://localhost:3306/product-inventory-management-new";
+ public static String database_url = "jdbc:mysql://1.15.17.182:9999/product-inventory-management-new";
public static String database_username = "root";
- public static String database_password= "123456";
+ public static String database_password= "xd@123456..";
public static String author = "鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃";
- public static String model = "purchase"; // 妯″潡
+ public static String model = "staff"; // 妯″潡
public static String setParent = "com.ruoyi."+ model; // 鍖呰矾寰�
public static String tablePrefix = ""; // 璁剧疆杩囨护琛ㄥ墠缂�
public static void main(String[] args) {
diff --git a/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceLocationConfigController.java b/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceLocationConfigController.java
new file mode 100644
index 0000000..d55ec63
--- /dev/null
+++ b/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceLocationConfigController.java
@@ -0,0 +1,43 @@
+package com.ruoyi.staff.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.staff.dto.PersonalAttendanceRecordsDto;
+import com.ruoyi.staff.pojo.PersonalAttendanceLocationConfig;
+import com.ruoyi.staff.pojo.PersonalAttendanceRecords;
+import com.ruoyi.staff.service.PersonalAttendanceLocationConfigService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 浜哄憳鎵撳崱瑙勫垯閰嶇疆 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-02-11 09:41:34
+ */
+@RestController
+@RequestMapping("/personalAttendanceLocationConfig")
+@Api(tags = "浜哄憳鎵撳崱瑙勫垯閰嶇疆")
+public class PersonalAttendanceLocationConfigController {
+
+ @Autowired
+ private PersonalAttendanceLocationConfigService personalAttendanceLocationConfigService;
+
+ @ApiOperation("鏂板/淇敼浜哄憳鎵撳崱瑙勫垯閰嶇疆")
+ @PostMapping("/add")
+ public R add(@RequestBody PersonalAttendanceLocationConfig personalAttendanceLocationConfig){
+ return R.ok(personalAttendanceLocationConfigService.saveOrUpdate(personalAttendanceLocationConfig));
+ }
+
+ @ApiOperation("鍒嗛〉鏌ヨ鎵撳崱绛惧埌")
+ @GetMapping("/listPage")
+ public R listPage(Page page){
+ return R.ok(personalAttendanceLocationConfigService.page(page));
+ }
+
+}
diff --git a/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java b/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
index 67a0c12..d6a8ce3 100644
--- a/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
+++ b/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
@@ -6,6 +6,7 @@
import com.ruoyi.staff.pojo.PersonalAttendanceRecords;
import com.ruoyi.staff.service.PersonalAttendanceRecordsService;
import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@@ -21,30 +22,30 @@
*/
@RestController
@RequestMapping("/personalAttendanceRecords")
-@Api(tags = "鎵撳崱绛惧埌")
+@Api(tags = "浜哄憳鎵撳崱绛惧埌")
public class PersonalAttendanceRecordsController {
@Resource
private PersonalAttendanceRecordsService personalAttendanceRecordsService;
- // 鏂板
+ @ApiOperation("鏂板鎵撳崱绛惧埌")
@PostMapping("")
- public AjaxResult add(@RequestBody PersonalAttendanceRecords personalAttendanceRecord){
- return AjaxResult.success(personalAttendanceRecordsService.add(personalAttendanceRecord));
+ public AjaxResult add(@RequestBody PersonalAttendanceRecordsDto personalAttendanceRecordsDto){
+ return AjaxResult.success(personalAttendanceRecordsService.add(personalAttendanceRecordsDto));
}
- // 鍒楄〃鏌ヨ
+ @ApiOperation("鍒嗛〉鏌ヨ鎵撳崱绛惧埌")
@GetMapping("/listPage")
public AjaxResult listPage(Page page, PersonalAttendanceRecordsDto personalAttendanceRecordsDto){
return AjaxResult.success(personalAttendanceRecordsService.listPage(page, personalAttendanceRecordsDto));
}
- // 浠婃棩鑰冨嫟鏁版嵁
+ @ApiOperation("鑾峰彇褰撳墠浜虹殑鑰冨嫟鐩稿叧鏁版嵁")
@GetMapping("/today")
public AjaxResult todayInfo(PersonalAttendanceRecordsDto personalAttendanceRecordsDto){
return AjaxResult.success(personalAttendanceRecordsService.todayInfo(personalAttendanceRecordsDto));
}
- // 瀵煎嚭
+ @ApiOperation("瀵煎嚭鎵撳崱绛惧埌")
@PostMapping("/export")
public void export(HttpServletResponse response, PersonalAttendanceRecordsDto personalAttendanceRecordsDto) {
personalAttendanceRecordsService.export(response, personalAttendanceRecordsDto);
diff --git a/src/main/java/com/ruoyi/staff/dto/PersonalAttendanceRecordsDto.java b/src/main/java/com/ruoyi/staff/dto/PersonalAttendanceRecordsDto.java
index 4232ad5..7da7e54 100644
--- a/src/main/java/com/ruoyi/staff/dto/PersonalAttendanceRecordsDto.java
+++ b/src/main/java/com/ruoyi/staff/dto/PersonalAttendanceRecordsDto.java
@@ -1,10 +1,17 @@
package com.ruoyi.staff.dto;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.staff.pojo.PersonalAttendanceRecords;
+import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
@Data
+@ExcelIgnoreUnannotated
public class PersonalAttendanceRecordsDto extends PersonalAttendanceRecords {
@Excel(name = "濮撳悕", sort = 3)
private String staffName;
@@ -16,4 +23,20 @@
private String deptName;
private Long deptId;
+
+ //鎵撳崱鐨勭粡搴�
+ private Double longitude;
+
+ //鎵撳崱鐨勭含搴�
+ private Double latitude;
+
+ //鏍囧噯涓婄彮鏃堕棿
+ @JsonFormat(pattern = "HH:mm")
+ @DateTimeFormat(pattern = "HH:mm")
+ private LocalDateTime startAt;
+
+ //鏍囧噯涓嬬彮鏃堕棿
+ @JsonFormat(pattern = "HH:mm")
+ @DateTimeFormat(pattern = "HH:mm")
+ private LocalDateTime endAt;
}
diff --git a/src/main/java/com/ruoyi/staff/mapper/PersonalAttendanceLocationConfigMapper.java b/src/main/java/com/ruoyi/staff/mapper/PersonalAttendanceLocationConfigMapper.java
new file mode 100644
index 0000000..e71efcd
--- /dev/null
+++ b/src/main/java/com/ruoyi/staff/mapper/PersonalAttendanceLocationConfigMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.staff.mapper;
+
+import com.ruoyi.staff.pojo.PersonalAttendanceLocationConfig;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 浜哄憳鎵撳崱瑙勫垯閰嶇疆 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-02-11 09:41:34
+ */
+@Mapper
+public interface PersonalAttendanceLocationConfigMapper extends BaseMapper<PersonalAttendanceLocationConfig> {
+
+}
diff --git a/src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceLocationConfig.java b/src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceLocationConfig.java
new file mode 100644
index 0000000..2c27a17
--- /dev/null
+++ b/src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceLocationConfig.java
@@ -0,0 +1,59 @@
+package com.ruoyi.staff.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * <p>
+ * 浜哄憳鎵撳崱瑙勫垯閰嶇疆
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-02-11 09:41:34
+ */
+@Getter
+@Setter
+@TableName("personal_attendance_location_config")
+@ApiModel(value = "PersonalAttendanceLocationConfig瀵硅薄", description = "浜哄憳鎵撳崱瑙勫垯閰嶇疆")
+public class PersonalAttendanceLocationConfig implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("閮ㄩ棬id")
+ private Integer sysDeptId;
+
+ @ApiModelProperty("鍦扮偣鍚嶇О")
+ private String locationName;
+
+ @ApiModelProperty("缁忓害")
+ private Double longitude;
+
+ @ApiModelProperty("绾害")
+ private Double latitude;
+
+ @ApiModelProperty("鎵撳崱鑼冨洿")
+ private Double radius;
+
+ @ApiModelProperty("涓婄彮鏃堕棿")
+ @JsonFormat(pattern = "HH:mm")
+ @DateTimeFormat(pattern = "HH:mm")
+ private LocalDateTime startAt;
+
+ @ApiModelProperty("涓嬬彮鏃堕棿")
+ @JsonFormat(pattern = "HH:mm")
+ @DateTimeFormat(pattern = "HH:mm")
+ private LocalDateTime endAt;
+}
diff --git a/src/main/java/com/ruoyi/staff/service/PersonalAttendanceLocationConfigService.java b/src/main/java/com/ruoyi/staff/service/PersonalAttendanceLocationConfigService.java
new file mode 100644
index 0000000..14afa19
--- /dev/null
+++ b/src/main/java/com/ruoyi/staff/service/PersonalAttendanceLocationConfigService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.staff.service;
+
+import com.ruoyi.staff.pojo.PersonalAttendanceLocationConfig;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 浜哄憳鎵撳崱瑙勫垯閰嶇疆 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-02-11 09:41:34
+ */
+public interface PersonalAttendanceLocationConfigService extends IService<PersonalAttendanceLocationConfig> {
+
+}
diff --git a/src/main/java/com/ruoyi/staff/service/PersonalAttendanceRecordsService.java b/src/main/java/com/ruoyi/staff/service/PersonalAttendanceRecordsService.java
index 3a68b6e..7b8cd58 100644
--- a/src/main/java/com/ruoyi/staff/service/PersonalAttendanceRecordsService.java
+++ b/src/main/java/com/ruoyi/staff/service/PersonalAttendanceRecordsService.java
@@ -21,7 +21,7 @@
public interface PersonalAttendanceRecordsService extends IService<PersonalAttendanceRecords> {
IPage<PersonalAttendanceRecordsDto> listPage(Page page, PersonalAttendanceRecordsDto personalAttendanceRecordsDto);
- int add(PersonalAttendanceRecords personalAttendanceRecords);
+ int add(PersonalAttendanceRecordsDto personalAttendanceRecordsDto);
PersonalAttendanceRecordsDto todayInfo(PersonalAttendanceRecordsDto personalAttendanceRecordsDto);
diff --git a/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceLocationConfigServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceLocationConfigServiceImpl.java
new file mode 100644
index 0000000..b1dffca
--- /dev/null
+++ b/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceLocationConfigServiceImpl.java
@@ -0,0 +1,25 @@
+package com.ruoyi.staff.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.staff.pojo.PersonalAttendanceLocationConfig;
+import com.ruoyi.staff.mapper.PersonalAttendanceLocationConfigMapper;
+import com.ruoyi.staff.service.PersonalAttendanceLocationConfigService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 浜哄憳鎵撳崱瑙勫垯閰嶇疆 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-02-11 09:41:34
+ */
+@Service
+public class PersonalAttendanceLocationConfigServiceImpl extends ServiceImpl<PersonalAttendanceLocationConfigMapper, PersonalAttendanceLocationConfig> implements PersonalAttendanceLocationConfigService {
+
+}
diff --git a/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java
index a0cf8f2..8b2a7d2 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.exception.base.BaseException;
@@ -12,13 +13,16 @@
import com.ruoyi.project.system.service.ISysDictDataService;
import com.ruoyi.staff.dto.PersonalAttendanceRecordsDto;
import com.ruoyi.staff.dto.StaffOnJobDto;
+import com.ruoyi.staff.mapper.PersonalAttendanceLocationConfigMapper;
import com.ruoyi.staff.mapper.StaffOnJobMapper;
+import com.ruoyi.staff.pojo.PersonalAttendanceLocationConfig;
import com.ruoyi.staff.pojo.PersonalAttendanceRecords;
import com.ruoyi.staff.mapper.PersonalAttendanceRecordsMapper;
import com.ruoyi.staff.pojo.StaffOnJob;
import com.ruoyi.staff.service.PersonalAttendanceRecordsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.staff.task.PersonalAttendanceRecordsTask;
+import com.ruoyi.staff.utils.LocationUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -41,6 +45,7 @@
* @since 2026-02-09 01:20:07
*/
@Service
+@Transactional(rollbackFor = Exception.class)
public class PersonalAttendanceRecordsServiceImpl extends ServiceImpl<PersonalAttendanceRecordsMapper, PersonalAttendanceRecords> implements PersonalAttendanceRecordsService {
@Autowired
private PersonalAttendanceRecordsMapper personalAttendanceRecordsMapper;
@@ -49,7 +54,7 @@
private StaffOnJobMapper staffOnJobMapper;
@Autowired
- private PersonalAttendanceRecordsTask personalAttendanceRecordsTask;
+ private PersonalAttendanceLocationConfigMapper personalAttendanceLocationConfigMapper;
@Autowired
private ISysDictDataService dictDataService;
@@ -58,37 +63,52 @@
private SysDeptMapper sysDeptMapper;
@Override
- @Transactional(rollbackFor = Exception.class)
- public int add(PersonalAttendanceRecords personalAttendanceRecords) {
+ public int add(PersonalAttendanceRecordsDto personalAttendanceRecordsDto) {
// 褰撳墠鏃堕棿
LocalDate currentDate = LocalDate.now();
-
- // 棣栧厛鏍规嵁鐢ㄦ埛ID鏌ヨ鍛樺伐淇℃伅
+ LocalDateTime currentDateTime = LocalDateTime.now();
+ /*鏌ヨ鍛樺伐淇℃伅*/
QueryWrapper<StaffOnJob> staffQueryWrapper = new QueryWrapper<>();
staffQueryWrapper.eq("staff_no", SecurityUtils.getUsername());
StaffOnJob staffOnJob = staffOnJobMapper.selectOne(staffQueryWrapper);
if (staffOnJob == null) {
throw new BaseException("褰撳墠鐢ㄦ埛娌℃湁瀵瑰簲鐨勫憳宸ヤ俊鎭�");
}
-
- // 褰撳墠鏃堕棿
- LocalDateTime currentDateTime = LocalDateTime.now();
-
- // 濡傛灉鎵撳崱鏃堕棿瓒呰繃鑰冨嫟涓嬬彮鏃堕棿涓嶈兘鎵撳崱
+ /*鍒ゆ柇鎵撳崱浣嶇疆鏄惁鍦ㄨ鍒欒寖鍥村唴*/
+ List<PersonalAttendanceLocationConfig> personalAttendanceLocationConfigs = personalAttendanceLocationConfigMapper.selectList(Wrappers.<PersonalAttendanceLocationConfig>lambdaQuery()
+ .eq(PersonalAttendanceLocationConfig::getSysDeptId, staffOnJob.getSysDeptId())
+ .orderByDesc(PersonalAttendanceLocationConfig::getId));
+ if (personalAttendanceLocationConfigs == null || personalAttendanceLocationConfigs.isEmpty()) {
+ throw new BaseException("褰撳墠閮ㄩ棬娌℃湁璁剧疆鎵撳崱瑙勫垯");
+ }
+ Double punchLongitude = personalAttendanceRecordsDto.getLongitude(); //鎵撳崱鐨勭粡搴�
+ Double punchLatitude = personalAttendanceRecordsDto.getLatitude(); // 鎵撳崱鐨勭含搴�
+ if (punchLongitude == null || punchLatitude == null) {
+ throw new BaseException("鎵撳崱澶辫触锛氭湭鑾峰彇鍒版偍鐨勪綅缃俊鎭紝璇峰紑鍚畾浣嶆潈闄�");
+ }
+ //璁$畻鎵撳崱浣嶇疆涓庤�冨嫟鐐圭殑璺濈
+ PersonalAttendanceLocationConfig locationConfig = personalAttendanceLocationConfigs.get(0);//鑾峰彇鏈�鏂扮殑涓�鏉℃暟鎹�
+ double allowedRadius = locationConfig.getRadius(); // 鍏佽鐨勮寖鍥达紙绫筹級
+ double actualDistance = LocationUtils.calculateDistance(
+ punchLatitude, punchLongitude, // 鍛樺伐鎵撳崱鐨勭粡绾害
+ locationConfig.getLatitude(), locationConfig.getLongitude() // 鑰冨嫟鐐圭殑缁忕含搴�
+ );
+ //鍒ゆ柇鏄惁鍦ㄨ寖鍥村唴
+ if (actualDistance > allowedRadius) {
+ throw new BaseException(String.format("鎵撳崱澶辫触锛氭偍褰撳墠浣嶇疆璺濈鑰冨嫟鐐�%.2f绫筹紝瓒呭嚭鍏佽鑼冨洿锛�%s绫筹級", actualDistance, allowedRadius));
+ }
+ /*鍒ゆ柇鎵撳崱鏃堕棿*/
+ LocalDateTime endAt = locationConfig.getEndAt(); //涓嬬彮鏃堕棿
// 鑾峰彇鑰冨嫟涓嬬彮鏃堕棿鐐�
- String[] timeConfigs = getAttendanceTimeConfig();
- String timeConfig = timeConfigs[1];
- String[] timeParts = timeConfig.split(":");
- int standardHour = Integer.parseInt(timeParts[0]);
- int standardMinute = Integer.parseInt(timeParts[1]);
+ int standardHour = endAt.getHour();
+ int standardMinute = endAt.getMinute();
// 褰撳墠鏃堕棿
int actualHour = currentDateTime.getHour();
int actualMinute = currentDateTime.getMinute();
// 鍒ゆ柇鎵撳崱鏃堕棿鏄惁鏅氫簬褰撳墠鏃堕棿
if (actualHour > standardHour || (actualHour == standardHour && actualMinute > standardMinute)) {
- throw new BaseException("鎵撳崱鏃堕棿涓嶈兘鏅氫簬涓嬬彮鏃堕棿");
+ throw new BaseException(String.format("鎵撳崱澶辫触锛氭墦鍗℃椂闂翠笉鑳芥櫄浜庝笅鐝椂闂达紙%02d:%02d锛�", standardHour, standardMinute));
}
-
// 鏍规嵁鍛樺伐ID鍜屽綋鍓嶆棩鏈熸煡璇㈡墦鍗¤褰�
QueryWrapper<PersonalAttendanceRecords> attendanceQueryWrapper = new QueryWrapper<>();
attendanceQueryWrapper.eq("staff_on_job_id", staffOnJob.getId())
@@ -97,10 +117,11 @@
// 鏍规嵁瀛楀吀璁剧疆鐨勮�冨嫟鏃堕棿鍒ゆ柇杩熷埌鏃╅��
if (attendanceRecord == null) {
// 涓嶅瓨鍦ㄦ墦鍗¤褰曪紝鍒涘缓鏂拌褰�
+ PersonalAttendanceRecords personalAttendanceRecords = new PersonalAttendanceRecords();
personalAttendanceRecords.setStaffOnJobId(staffOnJob.getId());
personalAttendanceRecords.setDate(currentDate);
personalAttendanceRecords.setWorkStartAt(currentDateTime);
- personalAttendanceRecords.setStatus(determineAttendanceStatus(personalAttendanceRecords, true));
+ personalAttendanceRecords.setStatus(determineAttendanceStatus(personalAttendanceRecords, true,locationConfig));
personalAttendanceRecords.setRemark(personalAttendanceRecords.getRemark());
personalAttendanceRecords.setTenantId(staffOnJob.getTenantId());
return personalAttendanceRecordsMapper.insert(personalAttendanceRecords);
@@ -117,7 +138,7 @@
.divide(BigDecimal.valueOf(60), 2, RoundingMode.HALF_UP);
attendanceRecord.setWorkHours(workHours);
// 鏇存柊鑰冨嫟鐘舵��
- attendanceRecord.setStatus(determineAttendanceStatus(attendanceRecord, false));
+ attendanceRecord.setStatus(determineAttendanceStatus(attendanceRecord, false,locationConfig));
return personalAttendanceRecordsMapper.updateById(attendanceRecord);
} else {
throw new BaseException("鎮ㄥ凡缁忔墦杩囧崱浜�,鏃犻渶閲嶅鎵撳崱!!!");
@@ -125,46 +146,22 @@
}
}
- // 鑾峰彇鑰冨嫟鏃堕棿閰嶇疆
- private String[] getAttendanceTimeConfig() {
- String[] timeConfigs = new String[2];
- try {
- String dictType = "sys_work_time";
-
- // 鑾峰彇涓婄彮鏃堕棿閰嶇疆锛岄粯璁や负09:00
- String startTimeConfig = dictDataService.selectDictLabel(dictType, "start_at");
- timeConfigs[0] = (startTimeConfig == null || startTimeConfig.trim().isEmpty()) ? "09:00" : startTimeConfig;
-
- // 鑾峰彇涓嬬彮鏃堕棿閰嶇疆锛岄粯璁や负18:00
- String endTimeConfig = dictDataService.selectDictLabel(dictType, "end_at");
- timeConfigs[1] = (endTimeConfig == null || endTimeConfig.trim().isEmpty()) ? "18:00" : endTimeConfig;
-
- return timeConfigs;
- } catch (Exception e) {
- timeConfigs[0] = "09:00"; // 榛樿涓婄彮鏃堕棿
- timeConfigs[1] = "18:00"; // 榛樿涓嬬彮鏃堕棿
- return timeConfigs;
- }
- }
-
// 鏍规嵁瀹為檯鏃堕棿鍜屾槸鍚︿笂鐝椂闂村垽鏂�冨嫟鐘舵��
// 0 姝e父 1 杩熷埌 2 鏃╅�� 3 杩熷埌鏃╅�� 4 缂哄嫟
- private Integer determineAttendanceStatus(PersonalAttendanceRecords attendanceRecord, boolean isStart) {
+ private Integer determineAttendanceStatus(PersonalAttendanceRecords attendanceRecord, boolean isStart,PersonalAttendanceLocationConfig locationConfig) {
+ //鍒ゆ柇鏄笂鐝墦鍗¤繕鏄笅鐝墦鍗�
LocalDateTime actualTime = isStart ? attendanceRecord.getWorkStartAt() : attendanceRecord.getWorkEndAt();
try {
// 鑾峰彇鑰冨嫟鏃堕棿閰嶇疆
- String[] timeConfigs = getAttendanceTimeConfig();
- String timeConfig = isStart ? timeConfigs[0] : timeConfigs[1];
-
- // 瑙f瀽鏍囧噯鏃堕棿
- String[] timeParts = timeConfig.split(":");
- int standardHour = Integer.parseInt(timeParts[0]);
- int standardMinute = Integer.parseInt(timeParts[1]);
-
+ LocalDateTime startAt = locationConfig.getStartAt();//涓婄彮鏃堕棿
+ LocalDateTime endAt = locationConfig.getEndAt();//涓嬬彮鏃堕棿
+ LocalDateTime timeConfig = isStart ? startAt : endAt;
+ // 瑙f瀽灏忔椂鍜屽垎閽�
+ int standardHour = timeConfig.getHour();
+ int standardMinute = timeConfig.getMinute();
// 鑾峰彇瀹為檯鏃堕棿鐨勬椂鍒�
int actualHour = actualTime.getHour();
int actualMinute = actualTime.getMinute();
-
// 鍒ゆ柇鐘舵��
if (isStart) {
// 涓婄彮鎵撳崱锛氳秴杩囨爣鍑嗘椂闂寸畻杩熷埌
@@ -180,9 +177,7 @@
return 2; // 鏃╅��
}
}
-
return 0; // 姝e父
-
} catch (Exception e) {
// 濡傛灉鑾峰彇閰嶇疆澶辫触锛岄粯璁よ繑鍥炴甯哥姸鎬�
log.warn("鑾峰彇鑰冨嫟鏃堕棿閰嶇疆澶辫触锛屼娇鐢ㄩ粯璁ょ姸鎬侊細" + e.getMessage());
@@ -240,7 +235,14 @@
resultDto.setDeptId(staffOnJob.getSysDeptId() != null ? staffOnJob.getSysDeptId() : null);
SysDept dept = sysDeptMapper.selectDeptById(staffOnJob.getSysDeptId());
resultDto.setDeptName(dept != null ? dept.getDeptName() : null);
-
+ //鑾峰彇璇ュ憳宸ュ搴旂殑鎵撳崱瑙勫垯
+ List<PersonalAttendanceLocationConfig> personalAttendanceLocationConfigs = personalAttendanceLocationConfigMapper.selectList(Wrappers.<PersonalAttendanceLocationConfig>lambdaQuery()
+ .eq(PersonalAttendanceLocationConfig::getSysDeptId, staffOnJob.getSysDeptId())
+ .orderByDesc(PersonalAttendanceLocationConfig::getId));
+ if (personalAttendanceLocationConfigs.size()>0){
+ resultDto.setStartAt(personalAttendanceLocationConfigs.get(0).getStartAt());
+ resultDto.setEndAt(personalAttendanceLocationConfigs.get(0).getEndAt());
+ }
return resultDto;
}
diff --git a/src/main/java/com/ruoyi/staff/utils/LocationUtils.java b/src/main/java/com/ruoyi/staff/utils/LocationUtils.java
new file mode 100644
index 0000000..d335235
--- /dev/null
+++ b/src/main/java/com/ruoyi/staff/utils/LocationUtils.java
@@ -0,0 +1,37 @@
+package com.ruoyi.staff.utils;
+
+// 宸ュ叿绫伙細璁$畻涓や釜缁忕含搴︿箣闂寸殑璺濈锛堢悆闈㈣窛绂伙級
+public class LocationUtils {
+ private static final double EARTH_RADIUS = 6371000; // 鍦扮悆鍗婂緞锛屽崟浣嶇背
+
+ /**
+ * 璁$畻涓や釜缁忕含搴︿箣闂寸殑璺濈锛堢背锛�
+ * @param lat1 绗竴涓偣绾害
+ * @param lon1 绗竴涓偣缁忓害
+ * @param lat2 绗簩涓偣绾害
+ * @param lon2 绗簩涓偣缁忓害
+ * @return 璺濈锛堢背锛�
+ */
+ public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
+ // 杞姬搴�
+ double radLat1 = Math.toRadians(lat1);
+ double radLon1 = Math.toRadians(lon1);
+ double radLat2 = Math.toRadians(lat2);
+ double radLon2 = Math.toRadians(lon2);
+
+ // 宸��
+ double deltaLat = radLat1 - radLat2;
+ double deltaLon = radLon1 - radLon2;
+
+ // 鐞冮潰璺濈鍏紡
+ double distance = 2 * Math.asin(Math.sqrt(
+ Math.pow(Math.sin(deltaLat / 2), 2) +
+ Math.cos(radLat1) * Math.cos(radLat2) *
+ Math.pow(Math.sin(deltaLon / 2), 2)
+ ));
+ distance = distance * EARTH_RADIUS;
+ // 淇濈暀涓や綅灏忔暟
+ distance = Math.round(distance * 100) / 100.0;
+ return distance;
+ }
+}
diff --git a/src/main/resources/mapper/staff/PersonalAttendanceLocationConfigMapper.xml b/src/main/resources/mapper/staff/PersonalAttendanceLocationConfigMapper.xml
new file mode 100644
index 0000000..ef68e68
--- /dev/null
+++ b/src/main/resources/mapper/staff/PersonalAttendanceLocationConfigMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.staff.mapper.PersonalAttendanceLocationConfigMapper">
+
+ <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+ <resultMap id="BaseResultMap" type="com.ruoyi.staff.pojo.PersonalAttendanceLocationConfig">
+ <id column="id" property="id" />
+ <result column="sys_dept_id" property="sysDeptId" />
+ <result column="location_name" property="locationName" />
+ <result column="longitude" property="longitude" />
+ <result column="latitude" property="latitude" />
+ <result column="radius" property="radius" />
+ <result column="start_at" property="startAt" />
+ <result column="end_at" property="endAt" />
+ </resultMap>
+
+</mapper>
--
Gitblit v1.9.3