xiongzhu 4 лет назад
Родитель
Сommit
0dae90c42f

+ 12 - 0
src/main/java/com/x1ongzhu/wisFactory/domain/Department.java

@@ -24,4 +24,16 @@ public class Department extends BaseEntity {
     @Searchable
     @ApiModelProperty(value = "部门名称", name = "name")
     private String name;
+
+    private double hours;
+
+    @Enumerated(EnumType.STRING)
+    @Column(length = 20)
+    private AttendanceType attendanceType;
+
+    private String workDay;
+
+    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+    @JoinColumn(name = "departmentId")
+    private List<Shift> shifts = new ArrayList<>();
 }

+ 23 - 0
src/main/java/com/x1ongzhu/wisFactory/domain/Shift.java

@@ -1,12 +1,18 @@
 package com.x1ongzhu.wisFactory.domain;
 
+import com.x1ongzhu.wisFactory.enums.AttendanceType;
+import com.x1ongzhu.wisFactory.enums.PrecisionUnit;
 import io.swagger.annotations.ApiModel;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import java.math.RoundingMode;
 import java.time.LocalTime;
 
 @Data
@@ -16,6 +22,10 @@ import java.time.LocalTime;
 @Builder
 @ApiModel
 public class Shift extends BaseEntity {
+    @Enumerated(EnumType.STRING)
+    @Column(length = 20)
+    private AttendanceType attendanceType;
+
     private String name;
 
     private Long departmentId;
@@ -26,4 +36,17 @@ public class Shift extends BaseEntity {
 
     private double hours;
 
+    private LocalTime overtimeStart;
+
+    private double maxOvertime;
+
+    private double prc;
+
+    @Enumerated(EnumType.STRING)
+    private PrecisionUnit prcUnit;
+
+    @Enumerated(EnumType.STRING)
+    private RoundingMode roundingMode;
+
+    private LocalTime acrossTime;
 }

+ 2 - 0
src/main/java/com/x1ongzhu/wisFactory/domain/StaffInfo.java

@@ -43,5 +43,7 @@ public class StaffInfo extends BaseEntity {
     @ApiModelProperty("联系方式")
     private String phone;
 
+    private long rev;
+
     private boolean inside;
 }

+ 15 - 0
src/main/java/com/x1ongzhu/wisFactory/enums/PrecisionUnit.java

@@ -0,0 +1,15 @@
+package com.x1ongzhu.wisFactory.enums;
+
+public enum PrecisionUnit {
+    MINUTE("分钟"),
+    HOUR("小时");
+    private final String description;
+
+    PrecisionUnit(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 20 - 1
src/main/java/com/x1ongzhu/wisFactory/repo/StaffAccessRepo.java

@@ -3,8 +3,10 @@ package com.x1ongzhu.wisFactory.repo;
 import com.x1ongzhu.wisFactory.domain.StaffAccess;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
+import javax.transaction.Transactional;
 import java.time.LocalDateTime;
 import java.util.List;
 
@@ -26,6 +28,23 @@ public interface StaffAccessRepo extends JpaRepository<StaffAccess, Long>, JpaSp
             "    staff_access.name      = staff_info.name " +
             "where staff_access.name is null " +
             "  and pass = true " +
-            "  and staff_access.card_no is not null ")
+            "  and staff_access.card_no is not null " +
+            "  and DATE_SUB(CURDATE(), INTERVAL 60 DAY) <= date(staff_access.access_time)")
+    @Modifying
+    @Transactional
     void setInfo();
+
+    @Query(nativeQuery = true, value = "update staff_access " +
+            "    join staff_info on staff_access.employ_no = staff_info.employ_no " +
+            "set staff_access.employ_no = staff_info.employ_no, " +
+            "    staff_access.name      = staff_info.name " +
+            "where staff_access.name is null " +
+            "  and staff_access.employ_no is not null " +
+            "  and pass = true " +
+            "  and DATE_SUB(CURDATE(), INTERVAL 60 DAY) <= date(staff_access.access_time)")
+    @Modifying
+    @Transactional
+    void setInfo1();
+
+    List<StaffAccess> findByAccessTimeAfterAndPassTrueAndEmployNoNotNullAndNameNull(LocalDateTime time);
 }

+ 2 - 1
src/main/java/com/x1ongzhu/wisFactory/repo/StaffInfoRepo.java

@@ -1,6 +1,5 @@
 package com.x1ongzhu.wisFactory.repo;
 
-import com.x1ongzhu.wisFactory.domain.DepartmentStat;
 import com.x1ongzhu.wisFactory.domain.StaffInfo;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@@ -23,6 +22,8 @@ StaffInfoRepo extends JpaRepository<StaffInfo, Long>, JpaSpecificationExecutor<S
 
     List<StaffInfo> findByDepartment(String department);
 
+    List<StaffInfo> findByEmployNoIn(Iterable<String> employNos);
+
     @Transactional
     @Modifying
     @Query("update StaffInfo s set s.inside = ?2 where s.id = ?1")

+ 17 - 2
src/main/java/com/x1ongzhu/wisFactory/service/DepartmentService.java

@@ -3,12 +3,12 @@ package com.x1ongzhu.wisFactory.service;
 import com.x1ongzhu.wisFactory.domain.Department;
 import com.x1ongzhu.wisFactory.domain.Shift;
 import com.x1ongzhu.wisFactory.enums.AttendanceType;
+import com.x1ongzhu.wisFactory.enums.PrecisionUnit;
 import com.x1ongzhu.wisFactory.repo.DepartmentRepo;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
 
+import java.math.RoundingMode;
 import java.time.LocalTime;
 import java.util.ArrayList;
 import java.util.List;
@@ -26,6 +26,21 @@ public class DepartmentService {
             if (department == null) {
                 department = Department.builder()
                         .name(d)
+                        .attendanceType(AttendanceType.FIX)
+                        .hours(8)
+                        .workDay("1,2,3,4,5")
+                        .shifts(new ArrayList<Shift>() {{
+                            add(Shift.builder()
+                                    .attendanceType(AttendanceType.FIX)
+                                    .start(LocalTime.of(8, 30))
+                                    .end(LocalTime.of(17, 30))
+                                    .overtimeStart(LocalTime.of(18, 0))
+                                    .maxOvertime(3)
+                                    .prc(0.5)
+                                    .prcUnit(PrecisionUnit.HOUR)
+                                    .roundingMode(RoundingMode.CEILING)
+                                    .build());
+                        }})
                         .build();
                 departmentRepo.save(department);
             }

+ 38 - 19
src/main/java/com/x1ongzhu/wisFactory/service/StaffAccessService.java

@@ -1,11 +1,9 @@
 package com.x1ongzhu.wisFactory.service;
 
 import com.x1ongzhu.wisFactory.domain.EventUploadReq;
-import com.x1ongzhu.wisFactory.domain.ProductivityHistory;
 import com.x1ongzhu.wisFactory.domain.StaffAccess;
 import com.x1ongzhu.wisFactory.domain.StaffInfo;
 import com.x1ongzhu.wisFactory.exception.BusinessException;
-import com.x1ongzhu.wisFactory.repo.ProductivityHistoryRepo;
 import com.x1ongzhu.wisFactory.repo.StaffAccessRepo;
 import com.x1ongzhu.wisFactory.repo.StaffInfoRepo;
 import com.x1ongzhu.wisFactory.service.storage.StorageService;
@@ -14,25 +12,31 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 @Service
 @AllArgsConstructor
 public class StaffAccessService {
 
-    private StaffAccessRepo            staffAccessRepo;
-    private StorageService             storageService;
-    private StaffInfoRepo              staffInfoRepo;
-    private ProductivityHistoryService productivityHistoryService;
+    private StaffAccessRepo staffAccessRepo;
+    private StorageService  storageService;
+    private StaffInfoRepo   staffInfoRepo;
 
     public void access(Boolean pass, String direction, String ip, String cardNo, String employNo,
                        String doorNo, String readerNo, String channel, String pic, LocalDateTime time) {
         Optional<StaffInfo> staffInfo = Optional.empty();
-        if (cardNo != null) {
-            staffInfo = staffInfoRepo.findByCardsContains(cardNo);
+        if (StringUtils.isEmpty(employNo)) {
+            if (cardNo != null) {
+                staffInfo = staffInfoRepo.findByCardsContains(cardNo);
+            }
+        } else {
+            staffInfo = staffInfoRepo.findFirstByEmployNo(employNo.replaceFirst("^0+(?!$)", ""));
         }
         StaffAccess staffAccess = StaffAccess.builder()
                 .pass(pass)
@@ -44,19 +48,11 @@ public class StaffAccessService {
                 .readerNo(readerNo)
                 .channel(channel)
                 .accessTime(time)
-                .employNo(staffInfo.map(StaffInfo::getEmployNo).orElse(null))
+                .employNo(staffInfo.map(StaffInfo::getEmployNo).orElse(StringUtils.isEmpty(employNo) ? null : employNo))
                 .build();
         if (StringUtils.isNotBlank(pic)) {
             staffAccess.setPhoto(storageService.uploadBase64(pic));
         }
-        if (staffInfo.isPresent()) {
-            if ("IN".equalsIgnoreCase(direction)) {
-                staffInfoRepo.setInside(staffInfo.get().getId(), true);
-            } else if ("OUT".equalsIgnoreCase(direction)) {
-                staffInfoRepo.setInside(staffInfo.get().getId(), false);
-            }
-            productivityHistoryService.updateToday();
-        }
         staffAccessRepo.save(staffAccess);
     }
 
@@ -65,7 +61,7 @@ public class StaffAccessService {
                 .findByIpAndAccessTimeBetween(req.getIp(), req.getStartTime(), req.getEndTime());
         List<StaffAccess> add = new ArrayList<>();
         for (StaffAccess staffAccess : req.getEvents()) {
-            StaffAccess s = list.stream().filter(i -> i.getEmployNo() != null
+            StaffAccess s = list.stream().filter(i -> i.getIp().equals(staffAccess.getIp())
                     && i.getAccessTime().equals(staffAccess.getAccessTime()))
                     .findAny().orElse(null);
             if (s == null) {
@@ -76,6 +72,8 @@ public class StaffAccessService {
             }
         }
         staffAccessRepo.saveAll(add);
+
+        setInfo();
     }
 
     public void retroactive(String employNo, String direction, LocalDateTime accessTime, String remark) {
@@ -95,6 +93,27 @@ public class StaffAccessService {
 
     @Scheduled(cron = "0 30 4 * * ?")
     public void setInfo() {
-        staffAccessRepo.setInfo();
+//        staffAccessRepo.setInfo();
+//        staffAccessRepo.setInfo1();
+
+        List<StaffAccess> list = staffAccessRepo
+                .findByAccessTimeAfterAndPassTrueAndEmployNoNotNullAndNameNull(
+                        LocalDate.now().minusMonths(3).atStartOfDay());
+        Set<String> employNos = list.stream().map(StaffAccess::getEmployNo).collect(Collectors.toSet());
+        if (!employNos.isEmpty()) {
+            List<StaffInfo> staffInfos = staffInfoRepo.findByEmployNoIn(employNos);
+            List<StaffAccess> update = new ArrayList<>();
+            for (StaffAccess staffAccess : list) {
+                staffInfos.stream().filter(staffInfo -> staffInfo.getEmployNo().equals(staffAccess.getEmployNo()))
+                        .findAny().ifPresent(staffInfo -> {
+                    staffAccess.setName(staffInfo.getName());
+                    update.add(staffAccess);
+                });
+            }
+            if (!update.isEmpty()) {
+                staffAccessRepo.saveAll(update);
+            }
+        }
+
     }
 }

+ 10 - 3
src/main/java/com/x1ongzhu/wisFactory/service/StaffInfoService.java

@@ -22,6 +22,7 @@ public class StaffInfoService {
 
     private StaffInfoRepo     staffInfoRepo;
     private DepartmentService departmentService;
+    private StaffAccessService staffAccessService;
 
     public StaffInfo saveStaffInfo(String name, String cardNo, String department, String idNo) {
         if (name != null) name = name.trim();
@@ -38,11 +39,13 @@ public class StaffInfoService {
     }
 
     public void importStaff(MultipartFile file) throws IOException {
+        long rev = System.currentTimeMillis();
         List<StaffInfoImportModel> list = EasyExcel.read(file.getInputStream()).head(StaffInfoImportModel.class)
                 .sheet().doReadSync();
         list.stream().parallel().forEach(model -> {
+            String employNo = model.getEmployNo().replaceFirst("^0+(?!$)", "");
             model.setDepartment(model.getDepartment().replace("'", ""));
-            StaffInfo staffInfo = staffInfoRepo.findFirstByEmployNo(model.getEmployNo()).orElse(null);
+            StaffInfo staffInfo = staffInfoRepo.findFirstByEmployNo(employNo).orElse(null);
             List<String> cards = new ArrayList<>();
             if (StringUtils.isNotBlank(model.getCardNo())) {
                 cards = Arrays.stream(model.getCardNo().split(";"))
@@ -55,21 +58,25 @@ public class StaffInfoService {
                         .name(model.getName())
                         .sex(model.getSex().equals("1") ? "男" : (model.getSex().equals("2") ? "女" : null))
                         .department(model.getDepartment())
-                        .employNo(model.getEmployNo())
+                        .employNo(employNo)
                         .phone(model.getPhone())
+                        .rev(rev)
                         .build();
             } else {
                 staffInfo.setCards(cards);
                 staffInfo.setName(model.getName());
                 staffInfo.setSex(model.getSex().equals("1") ? "男" : (model.getSex().equals("2") ? "女" : null));
                 staffInfo.setDepartment(model.getDepartment());
-                staffInfo.setEmployNo(model.getEmployNo());
+                staffInfo.setEmployNo(employNo);
                 staffInfo.setPhone(model.getPhone());
+                staffInfo.setRev(rev);
             }
             staffInfoRepo.save(staffInfo);
         });
         departmentService.importDepartment(list.stream()
                 .map(StaffInfoImportModel::getDepartment)
                 .collect(Collectors.toSet()));
+
+        staffAccessService.setInfo();
     }
 }

+ 2 - 2
src/main/java/com/x1ongzhu/wisFactory/web/DepartmentController.java

@@ -1,14 +1,14 @@
 package com.x1ongzhu.wisFactory.web;
+
 import com.x1ongzhu.wisFactory.domain.Department;
-import com.x1ongzhu.wisFactory.service.DepartmentService;
 import com.x1ongzhu.wisFactory.dto.PageQuery;
 import com.x1ongzhu.wisFactory.exception.BusinessException;
 import com.x1ongzhu.wisFactory.repo.DepartmentRepo;
+import com.x1ongzhu.wisFactory.service.DepartmentService;
 import com.x1ongzhu.wisFactory.utils.ObjUtils;
 import com.x1ongzhu.wisFactory.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;

+ 6 - 0
src/main/java/com/x1ongzhu/wisFactory/web/StaffAccessController.java

@@ -92,5 +92,11 @@ public class StaffAccessController extends BaseController {
     public void retroactive(@RequestParam String employNo, @RequestParam String direction, @RequestParam LocalDateTime accessTime, @RequestParam String remark) {
         staffAccessService.retroactive(employNo, direction, accessTime, remark);
     }
+
+    @GetMapping("/setInfo")
+    public String setInfo() {
+        staffAccessService.setInfo();
+        return "ok";
+    }
 }
 

+ 0 - 3
src/main/java/com/x1ongzhu/wisFactory/web/StaffInfoController.java

@@ -1,10 +1,7 @@
 package com.x1ongzhu.wisFactory.web;
 
-import com.alibaba.excel.EasyExcel;
-import com.x1ongzhu.wisFactory.domain.Department;
 import com.x1ongzhu.wisFactory.domain.StaffInfo;
 import com.x1ongzhu.wisFactory.dto.PageQuery;
-import com.x1ongzhu.wisFactory.dto.StaffInfoImportModel;
 import com.x1ongzhu.wisFactory.exception.BusinessException;
 import com.x1ongzhu.wisFactory.repo.StaffInfoRepo;
 import com.x1ongzhu.wisFactory.service.StaffInfoService;