From 41ab7abd0b0ec0fefb03b60bbaf42c02fbda666b Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 23 四月 2026 15:53:16 +0800
Subject: [PATCH] feat(production): 添加生产订单与销售台账关联功能

---
 src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java |   80 +++++++++++++++++-----------------------
 1 files changed, 34 insertions(+), 46 deletions(-)

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 5ea3085..48c6745 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java
@@ -1,40 +1,39 @@
 package com.ruoyi.staff.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.mapper.SysDeptMapper;
-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.PersonalAttendanceRecordsMapper;
+import com.ruoyi.staff.mapper.PersonalShiftMapper;
 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.PersonalShift;
 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 jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
 import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
-import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 /**
@@ -47,21 +46,14 @@
  */
 @Service
 @Transactional(rollbackFor = Exception.class)
+@RequiredArgsConstructor
 public class PersonalAttendanceRecordsServiceImpl extends ServiceImpl<PersonalAttendanceRecordsMapper, PersonalAttendanceRecords> implements PersonalAttendanceRecordsService {
-    @Autowired
-    private PersonalAttendanceRecordsMapper personalAttendanceRecordsMapper;
 
-    @Autowired
-    private StaffOnJobMapper staffOnJobMapper;
-
-    @Autowired
-    private PersonalAttendanceLocationConfigMapper personalAttendanceLocationConfigMapper;
-
-    @Autowired
-    private ISysDictDataService dictDataService;
-
-    @Autowired
-    private SysDeptMapper sysDeptMapper;
+    private final PersonalAttendanceRecordsMapper personalAttendanceRecordsMapper;
+    private final StaffOnJobMapper staffOnJobMapper;
+    private final PersonalAttendanceLocationConfigMapper personalAttendanceLocationConfigMapper;
+    private final SysDeptMapper sysDeptMapper;
+    private final PersonalShiftMapper personalShiftMapper;
 
     @Override
     public int add(PersonalAttendanceRecordsDto personalAttendanceRecordsDto) {
@@ -76,20 +68,24 @@
         if (staffOnJob == null) {
             throw new BaseException("褰撳墠鐢ㄦ埛娌℃湁瀵瑰簲鐨勫憳宸ヤ俊鎭�");
         }
-        /*鍒ゆ柇鎵撳崱浣嶇疆鏄惁鍦ㄨ鍒欒寖鍥村唴*/
-        List<PersonalAttendanceLocationConfig> personalAttendanceLocationConfigs = personalAttendanceLocationConfigMapper.selectList(Wrappers.<PersonalAttendanceLocationConfig>lambdaQuery()
-                .eq(PersonalAttendanceLocationConfig::getSysDeptId, staffOnJob.getSysDeptId())
-                .orderByDesc(PersonalAttendanceLocationConfig::getId));
-        if (personalAttendanceLocationConfigs == null || personalAttendanceLocationConfigs.isEmpty()) {
-            throw new BaseException("褰撳墠閮ㄩ棬娌℃湁璁剧疆鎵撳崱瑙勫垯");
+        //鍒ゆ柇鍒ゆ柇鍛樺伐褰撳ぉ鏄惁鏈夋帓鐝暟鎹�
+        List<PersonalShift> personalShifts = personalShiftMapper.selectList(Wrappers.<PersonalShift>lambdaQuery()
+                .eq(PersonalShift::getStaffOnJobId, staffOnJob.getId())
+                .eq(PersonalShift::getWorkTime, currentDate.atStartOfDay())
+                .isNotNull(PersonalShift::getPersonalAttendanceLocationConfigId));
+        if (CollectionUtil.isEmpty(personalShifts)){
+            throw new BaseException("褰撳墠鐢ㄦ埛褰撳ぉ娌℃湁鎺掔彮鏁版嵁");
         }
+        /*鍒ゆ柇鎵撳崱浣嶇疆鏄惁鍦ㄨ鍒欒寖鍥村唴*/
+        PersonalShift personalShift = personalShifts.get(0);
+
+        PersonalAttendanceLocationConfig locationConfig = personalAttendanceLocationConfigMapper.selectById(personalShift.getPersonalAttendanceLocationConfigId());
         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, // 鍛樺伐鎵撳崱鐨勭粡绾害
@@ -100,23 +96,12 @@
             throw new BaseException(String.format("鎵撳崱澶辫触锛氭偍褰撳墠浣嶇疆璺濈鑰冨嫟鐐�%.2f绫筹紝瓒呭嚭鍏佽鑼冨洿锛�%s绫筹級", actualDistance, allowedRadius));
         }
         /*鍒ゆ柇鎵撳崱鏃堕棿*/
-        LocalTime   endAt = locationConfig.getEndAt(); //涓嬬彮鏃堕棿
-        // 鑾峰彇鑰冨嫟涓嬬彮鏃堕棿鐐�
-        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(String.format("鎵撳崱澶辫触锛氭墦鍗℃椂闂翠笉鑳芥棭浜庝笅鐝椂闂达紙%02d:%02d锛�", standardHour, standardMinute));
-        }
         // 鏍规嵁鍛樺伐ID鍜屽綋鍓嶆棩鏈熸煡璇㈡墦鍗¤褰�
         QueryWrapper<PersonalAttendanceRecords> attendanceQueryWrapper = new QueryWrapper<>();
         attendanceQueryWrapper.eq("staff_on_job_id", staffOnJob.getId())
                 .eq("date", currentDate);
         PersonalAttendanceRecords attendanceRecord = personalAttendanceRecordsMapper.selectOne(attendanceQueryWrapper);
-        // 鏍规嵁瀛楀吀璁剧疆鐨勮�冨嫟鏃堕棿鍒ゆ柇杩熷埌鏃╅��
+        // 鏍规嵁鑰冨嫟鏃堕棿鍒ゆ柇杩熷埌鏃╅��
         if (attendanceRecord == null) {
             // 涓嶅瓨鍦ㄦ墦鍗¤褰曪紝鍒涘缓鏂拌褰�
             PersonalAttendanceRecords personalAttendanceRecords = new PersonalAttendanceRecords();
@@ -242,12 +227,15 @@
         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());
+        List<PersonalShift> personalShifts = personalShiftMapper.selectList(Wrappers.<PersonalShift>lambdaQuery()
+                .eq(PersonalShift::getStaffOnJobId, staffOnJob.getId())
+                .eq(PersonalShift::getWorkTime, currentDate.atStartOfDay())
+                .isNotNull(PersonalShift::getPersonalAttendanceLocationConfigId));
+        if (CollectionUtil.isNotEmpty(personalShifts)){
+            PersonalAttendanceLocationConfig personalAttendanceLocationConfig = personalAttendanceLocationConfigMapper.selectById(personalShifts.get(0).getPersonalAttendanceLocationConfigId());
+            resultDto.setStartAt(personalAttendanceLocationConfig.getStartAt());
+            resultDto.setEndAt(personalAttendanceLocationConfig.getEndAt());
+            resultDto.setShift(personalAttendanceLocationConfig.getShift());
         }
         return resultDto;
     }

--
Gitblit v1.9.3