.gitignore
@@ -21,6 +21,7 @@ ### IntelliJ IDEA ### .idea .vscode *.iws *.iml *.ipr cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java
@@ -82,26 +82,6 @@ case "/aiot/51eaff10-c6b9-11f0-8b13-c14e8310d70b"://è¿ç¨è¯éªå®¤-çµé» mqCallback.collectBridgeService.dcResistanceDataAnalysis(parse); break; // case "/ztt/v3/2455220/publish": // //èä¸ï¼ç´æµçµé»æ°æ®è§£æNS-ER02001 // mqCallback.collectBridgeService.dcResistanceDataAnalysis(parse,"NS-ER02001"); // break; //// case "/aiot/8fac9fa0-c517-11f0-954c-255ce11213f1": //// //èä¸ï¼ç´æµçµé»æ°æ®è§£æNS-ER02002 //// mqCallback.collectBridgeService.dcResistanceDataAnalysis(parse,"NS-ER02002"); //// break; // case "/ztt/v3/2455221/publish": // //èä¸ï¼ä¼¸é¿çæ°æ®è§£æNS-FM05003 // mqCallback.collectBridgeService.elongationDataAnalysis(parse,"NS-FM05003"); //// break; //// case "/aiot/38568140-c697-11f0-8b13-c14e8310d70b": //// //èä¸ï¼ä¼¸é¿çæ°æ®è§£æNS-FM05002 //// mqCallback.collectBridgeService.elongationDataAnalysis(parse,"NS-FM05002"); // break; } } catch (Exception e) { e.printStackTrace(); cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
@@ -197,9 +197,6 @@ @Override public Result<?> dataAcquisition(HttpServletRequest request, DeviceCollectionDto dto) { // æ¥è¯¢æ£éªé¡¹ List<Integer> itemIds = dto.getItemIds(); if (CollectionUtils.isEmpty(itemIds)) { cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java
@@ -2,11 +2,13 @@ import cn.hutool.core.io.IORuntimeException; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.fasterxml.jackson.core.type.TypeReference; import com.ruoyi.common.core.domain.Result; import com.ruoyi.common.utils.RedisUtil; import com.ruoyi.device.constant.DCResistanceMqttConstants; @@ -130,16 +132,17 @@ break; case ".xls": case ".xlsx": case ".csv": map = analysisList(data, userMap, device, entrustCode, sampleCode); break; case ".serialPort": map = analysisSerialPortList(data, userMap, device, entrustCode, sampleCode); break; case ".pngInExcel": map = analysisPngInExcel(data, userMap, device, entrustCode, sampleCode); break; case ".txt": map = analysisTxt(data, userMap, device, entrustCode, sampleCode); break; case ".csv": map = analysisList(data, userMap, device, entrustCode, sampleCode); break; case ".mdb": // 夿æ¯å¦æ¯æåæºJCZX-ZB-FF01014 @@ -150,10 +153,8 @@ } break; case ".db": // map = analysisDb1(data, userMap, device); map = analysisDb(data, userMap, device); break; case ".mysql": case ".sqlserver": // map = analysisDb1(data, userMap, device); map = analysisDb(data, userMap, device); break; @@ -499,7 +500,7 @@ * @return */ public static Object calculationFormula(List<Object> list, DataConfig dataConfig, String insProductItem, Device device) { if (list.size() == 0) { if (list.isEmpty()) { Map<String, Object> hashMap = new HashMap<>(); hashMap.put("equipName", device.getDeviceName()); hashMap.put("equipValue", device.getManagementNumber()); @@ -666,6 +667,25 @@ return map; } /** * å¤ç䏲壿°æ® * * @param data ééå°çæä»¶å符串 * @param dataConfig ç¨æ·é 置好çx,yè½´å®ä½æ°æ®ä¸åç §ç© * @return */ public static Map<String, Object> analysisSerialPortList(String data, Map<String, List<DataConfig>> dataConfig, Device device, String entrustCode, String sampleCode) { Map<String, Object> map = new HashMap<>(); dataConfig.forEach((k, v) -> { List<Object> list = JSONObject.parseObject(data,new TypeReference<List<Object>>(){}.getType()); // è¿è¡å ¬å¼è®¡ç® Object resultValue = calculationFormula(list, v.get(0), k, device); map.put(k, resultValue); }); return map; } private static List<Object> analyzeDataEntrustCodAndSampleCode(String data, List<DataConfig> v, String k, String splitIdentifier, Device device, String entrustCodeValue, String sampleCodeValue) { entrustCodeValue = entrustCodeValue.replaceAll(" ", ""); @@ -751,117 +771,7 @@ public static String getRefer(String refer) { return ObjectUtils.isNotEmpty(refer) ? refer.replaceAll(" ", "") : ""; } /** * å§æç¼å·ä¸æ ·åç¼å·é½ä¸ºç©ºæ§è¡ * * @param data ééå°çæä»¶å符串 * @param v ç¨æ·é 置好çx,yè½´å®ä½æ°æ®ä¸åç §ç© * @param k æ£éªé¡¹åç§° * @param split åå²ç¬¦ * @return æåçæ°æ®å表 */ public static List<Object> analyzeData1(String data, List<DataConfig> v, String k, String split) { List<Object> list = new ArrayList<>(); // é¢å¤çæ°æ®ï¼ç§»é¤å¤ä½ç©ºæ ¼å¹¶ä¿çå ³é®åé符 String processedData = data.replaceAll("\\s+", " ").trim(); for (int configIndex = 0; configIndex < v.size(); configIndex++) { // åä¸¤ä¸ªç¨æ·é ç½®çåç §ç© String referx = getRefer(v.get(configIndex).getReferx()); String refery = getRefer(v.get(configIndex).getRefery()); if (ObjectUtils.isEmpty(refery) && ObjectUtils.isEmpty(referx)) { System.out.println("åç §ç©ä¸ºç©ºï¼è·³è¿å½åé ç½®ï¼k: " + k); continue; } // æç»ç»æ List<Object> result = new ArrayList<>(); // éè¿\nå°å符串åå²ä¸ºè¡ String[] aColumnY = processedData.replaceAll(" ", "").split("\n"); Integer end = null; // ééæ°æ®ï¼Yè½´ for (int i = 0; i < aColumnY.length; i++) { String line = aColumnY[i].trim(); if (line.isEmpty()) continue; // è·³è¿ç©ºè¡ // 妿Yåç §ä¸ä¸ºç©ºä¸Xåç §ä¸ºç©ºåæ§è¡ï¼åæ¶è¯¥è¡å å«Yåç § if (ObjectUtils.isNotEmpty(refery) && ObjectUtils.isEmpty(referx) && line.contains(refery)) { try { // åYåæ å¼ int y = getXOrY(v.get(configIndex).getY(), k, "Y"); String[] aLineX = line.split(split); for (int j = 0; j < aLineX.length; j++) { if (aLineX[j].contains(refery)) { if (i + y >= aColumnY.length) { System.err.println(k + "ï¼Yè½´å®ä½è¶ åºæ°æ®èå´ï¼å½åæ°æ®è¡æ°: " + aColumnY.length + "ï¼å°è¯è®¿é®è¡: " + (i + y)); continue; } String[] split1 = aColumnY[i + y].split(split); if (j >= split1.length) { System.err.println(k + "ï¼Xè½´å®ä½è¶ åºæ°æ®èå´ï¼å½åè¡å ç´ ä¸ªæ°: " + split1.length + "ï¼å°è¯è®¿é®ä½ç½®: " + j); continue; } result.add(split1[j]); } } } catch (Exception e) { System.err.println(k + "ï¼å¨å¤çä» Yåç §é»è¾æ¶åºç°å¼å¸¸: " + e.getMessage()); } } // 妿Yåç §ä¸ä¸ºç©ºä¸Xåç §ä¸ä¸ºç©ºåæ§è¡,æ¤å¤Yå®åºå else if (ObjectUtils.isNotEmpty(refery) && ObjectUtils.isNotEmpty(referx)) { try { // åxçå¼ï¼é²æ¢æ¥é int x = getXOrY(v.get(configIndex).getX(), k, "X"); // åYåæ å¼ int y = getXOrY(v.get(configIndex).getY(), k, "Y"); // ç¼åYçç»æå¼ if (ObjectUtils.isEmpty(end) && line.contains(refery)) { end = i + y; } // 夿æ¯å¦å¨åç §ç©ä¸ºèµ·ç¹ï¼Yåæ å¼ä¸ºæç»èå´ if (ObjectUtils.isNotEmpty(end) && i <= end) { String[] aLineX = line.split(split); for (int j = 0; j < aLineX.length; j++) { if (aLineX[j].contains(referx)) { if (j + x >= aLineX.length) { System.err.println(k + "ï¼Xè½´å®ä½è¶ åºæ°æ®èå´ï¼å½åè¡å ç´ ä¸ªæ°: " + aLineX.length + "ï¼å°è¯è®¿é®ä½ç½®: " + (j + x)); continue; } result.add(aLineX[j + x]); break; } } } } catch (Exception e) { System.err.println(k + "ï¼å¨å¤çXYåç §é»è¾æ¶åºç°å¼å¸¸: " + e.getMessage()); } } // 妿Xåç §ä¸ä¸ºç©ºåæ¶è¯¥è¡å å«Xåç §ï¼åæ§è¡ä¸é¢ç代ç else if (line.contains(referx) && ObjectUtils.isEmpty(refery)) { try { String[] aLineX = line.split(split); // åxçå¼ï¼é²æ¢æ¥é int x = getXOrY(v.get(configIndex).getX(), k, "X"); for (int j = 0; j < aLineX.length; j++) { if (aLineX[j].contains(referx)) { if (j + x >= aLineX.length) { System.err.println(k + "ï¼Xè½´å®ä½è¶ åºæ°æ®èå´ï¼å½åè¡å ç´ ä¸ªæ°: " + aLineX.length + "ï¼å°è¯è®¿é®ä½ç½®: " + (j + x)); continue; } result.add(aLineX[j + x]); } } } catch (Exception e) { System.err.println(k + "ï¼å¨å¤çä» Xåç §é»è¾æ¶åºç°å¼å¸¸: " + e.getMessage()); } } } // 鲿¢è®¡ç®å ¬å¼çæ¶ååºç°ï¼[null] è¿ç§æ°æ® if (ObjectUtils.isNotEmpty(result)) { list.addAll(result); } } return list; } /** * å§æç¼å·ä¸æ ·åç¼å·é½ä¸ºç©ºæ§è¡ * inspect-server/pom.xml
@@ -67,8 +67,6 @@ <artifactId>itextpdf</artifactId> <version>5.0.6</version> </dependency> </dependencies> <properties> inspect-server/src/main/java/com/ruoyi/inspect/controller/StaffAttendanceController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,81 @@ package com.ruoyi.inspect.controller; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.Result; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.inspect.dto.StaffAttendanceDTO; import com.ruoyi.inspect.pojo.StaffAttendanceTrackingRecord; import com.ruoyi.inspect.service.StaffAttendanceTrackingRecordService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; import java.util.Arrays; /** * 绩æç®¡ç-人åè夿¥å£ */ @Api(value = "绩æç®¡ç-人åè夿¥å£") @RestController @RequestMapping("/staff/attendance") public class StaffAttendanceController { @Autowired private StaffAttendanceTrackingRecordService trackingRecordService; @ApiOperation("æ¥è¯¢äººåæå¡è®°å½") @GetMapping("/getClockInRecord") public Result getClockInRecord(StaffAttendanceDTO staffAttendanceDTO){ return Result.success(trackingRecordService.getClockInRecord(staffAttendanceDTO)); } @ApiOperation("å页æ¥è¯¢èå¤è®°å½") @GetMapping("/pageAttendanceRecord") public Result pageAttendanceRecord(Page<StaffAttendanceTrackingRecord> page, StaffAttendanceDTO staffAttendanceDTO){ return Result.success(trackingRecordService.pageAttendanceRecord(page,staffAttendanceDTO)); } @ApiOperation("æ ¡éªéæ©çè夿¶é´æ¯å¦åå¨åä¸äººåçèå¤è®°å½,没æåè¿å人åå½å¤©ççæ¬¡ä¿¡æ¯") @GetMapping("/checkDutyDate") public Result checkDutyDate(StaffAttendanceDTO staffAttendanceDTO){ return Result.success(trackingRecordService.checkDutyDate(staffAttendanceDTO)); } @ApiOperation("ä¿åææ´æ°èå¤è®°å½") @PostMapping("/saveOrUpdateStaffAttendanceTrackingRecord") public Result saveStaffAttendanceTrackingRecord(@RequestBody StaffAttendanceDTO staffAttendanceDTO){ return Result.success(trackingRecordService.saveOrUpdateRecord(staffAttendanceDTO)); } @ApiOperation("å é¤èå¤è®°å½") @DeleteMapping("/removeStaffAttendanceTrackingRecord") public Result removeStaffAttendanceTrackingRecord(@RequestBody StaffAttendanceDTO staffAttendanceDTO){ return Result.success(trackingRecordService.removeByIds(Arrays.asList(staffAttendanceDTO.getWorkDataId(),staffAttendanceDTO.getOffWorkDataId()))); } @ApiOperation("忥èå¤è®°å½") @GetMapping("/syncAttendanceRecord") public Result syncAttendanceRecord(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startDate,@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endDate){ return Result.success(trackingRecordService.syncAttendanceRecord(startDate,endDate)); } @ApiOperation("ä¿®æ¹è¿åºè®°å½ç¶æ") @PostMapping("/changeEnableReport") public Result changeEnableReport(@RequestBody StaffAttendanceDTO staffAttendanceDTO){ if(ObjectUtils.isEmpty(staffAttendanceDTO.getId())){ throw new RuntimeException("ä¼ åå¼å¸¸ï¼ä¸»é®IDä¸è½ä¸ºç©ºï¼"); } StaffAttendanceTrackingRecord trackingRecord = new StaffAttendanceTrackingRecord(); trackingRecord.setId(staffAttendanceDTO.getId()); trackingRecord.setEnableReport(staffAttendanceDTO.getEnableReport()); return Result.success(trackingRecordService.updateById(trackingRecord)); } } inspect-server/src/main/java/com/ruoyi/inspect/dto/StaffAttendanceDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,87 @@ package com.ruoyi.inspect.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.inspect.pojo.StaffAttendanceTrackingRecord; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.NonNull; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; @Data public class StaffAttendanceDTO extends StaffAttendanceTrackingRecord { /** * å¼å§æ¶é´ */ @ApiModelProperty("å¼å§æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime startDate; /** * ç»ææ¶é´ */ @ApiModelProperty("ç»ææ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime endDate; /** * åå·¥åç§°/å·¥å· */ @ApiModelProperty("åå·¥åç§°/å·¥å·") private String keyword; /** * è夿¶é´ */ @ApiModelProperty("è夿¶é´") @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate swingDate; /** * çæ¬¡id */ @ApiModelProperty("çæ¬¡id") private String shiftId; /** * æ¯å¦çº³å ¥èå¤ç»è®¡ */ @ApiModelProperty("æ¯å¦çº³å ¥èå¤ç»è®¡") private Boolean enableReport; /** * ä¸çæ¶é´ */ @JsonFormat(pattern = "HH:mm") @DateTimeFormat(pattern = "HH:mm") @ApiModelProperty("ä¸çæ¶é´") private LocalTime workDateTime; /** * ä¸çæ¶é´ */ @JsonFormat(pattern = "HH:mm") @DateTimeFormat(pattern = "HH:mm") @ApiModelProperty("ä¸çæ¶é´") private LocalTime offWorkDateTime; /** * ä¸çè®°å½id */ @ApiModelProperty("ä¸çè®°å½id") private Long workDataId; /** * ä¸çè®°å½id */ @ApiModelProperty("ä¸çè®°å½id") private Long offWorkDataId; } inspect-server/src/main/java/com/ruoyi/inspect/mapper/StaffAttendanceTrackingRecordMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.ruoyi.inspect.mapper; import com.ruoyi.inspect.pojo.StaffAttendanceTrackingRecord; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import java.util.List; /** * @author 27233 * @description é对表ãstaff_attendance_tracking_record(人åèå¤-èå¤è®°å½)ãçæ°æ®åºæä½Mapper * @createDate 2026-03-20 14:42:09 * @Entity com.ruoyi.inspect.pojo.StaffAttendanceTrackingRecord */ public interface StaffAttendanceTrackingRecordMapper extends BaseMapper<StaffAttendanceTrackingRecord> { public List<Long> selectIccIdList(); } inspect-server/src/main/java/com/ruoyi/inspect/pojo/StaffAttendanceTrackingRecord.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,205 @@ package com.ruoyi.inspect.pojo; import com.baomidou.mybatisplus.annotation.*; import java.io.Serializable; import java.time.LocalDateTime; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; /** * 人åèå¤-èå¤è®°å½ * @TableName staff_attendance_tracking_record */ @TableName(value ="staff_attendance_tracking_record") @Data public class StaffAttendanceTrackingRecord implements Serializable { /** * 主é®id */ @TableId(type = IdType.AUTO) private Long id; /** * icc弿¾å¹³å°ä¸»é®id */ @JsonSerialize(using = ToStringSerializer.class) private Long iccId; /** * å·å¡æ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime swingTime; /** * åå·¥id */ @JsonSerialize(using = ToStringSerializer.class) private Long personId; /** * åå·¥ç¼å· */ private String personCode; /** * åå·¥å§å */ private String personName; /** * é¨é¨åç§° */ private String deptName; /** * èå¤ç»æ:0-å¼å¸¸,1-æ£å¸¸ */ private Integer result; /** * å¡å· */ private String cardNumber; /** * å¡ç¶æï¼-1-空ç½å¡ï¼0-æ£å¸¸å¡ï¼1-æå¤±å¡ï¼2-注éå¡ */ private Integer cardStatus; /** * ç±»åï¼0-ICå¡, 1-ææºRFID, 2-CPUå¡ */ private Integer cardType; /** * ééç¼ç */ private String channelCode; /** * ééåç§° */ private String channelName; /** * 设å¤ç¼ç */ private String deviceCode; /** * 设å¤åç§° */ private String deviceName; /** * è¿åºé¨ç±»åï¼1-è¿é¨, 2åºé¨, 3-è¿/åºé¨ */ private Integer enterOrExit; /** * 1-å é¨äººå, 2-访客ï¼å é¨äººåæ¯å¨äººå管ç䏿·»å ç人åï¼è®¿å®¢æ¯å¨è®¿å®¢åç³»ç»ä¸å½å ¥ç访客 */ private Integer imageType; /** * å¼é¨ç»æï¼0-失败ï¼1-æå */ private Integer openResult; /** * å¼é¨ç±»åï¼è¯¦è§ å¼é¨ç±»å åå ¸ */ private Integer openType; /** * è¯ä»¶å·ç ï¼ä¼è¿è¡è±æå¤ç */ private String paperNumber; /** * æå¾ï¼ç¸å¯¹è·¯å¾ï¼å®æ´è®¿é®è·¯å¾åèOSSæ¹å¼ç»è£ */ private String recordImageUrl; /** * æå¾ï¼ç»å¯¹è·¯å¾ï¼å ¼å®¹åå²çæ¬ï¼ä¸æ¨èä½¿ç¨ */ private String recordImage; /** * å¼é¨å¤±è´¥åå */ private String remark; /** * å£ç½©ç¶æ(3-带å£ç½©,2âæ²¡å¸¦å£ç½©,1-æªè¯å«) */ private Integer maskState; /** * æ¯å¦è¶ 温 */ private Integer overTemp; /** * 使¸© */ private Double curTemp; /** * æ¯å¦åæ¥(0ï¼åæ¥ 1ï¼æå¨æ°å¢) */ private Integer isSync; /** * æ¯å¦çº³å ¥èå¤ç»è®¡ */ private Boolean enableReport; /** * å建人 */ @TableField(fill = FieldFill.INSERT) private Integer createUser; /** * å建æ¶é´ */ @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; /** * æ´æ°äºº */ @TableField(fill = FieldFill.INSERT_UPDATE) private Integer updateUser; /** * æ´æ°æ¶é´ */ @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @TableField(exist = false) private static final long serialVersionUID = 1L; public StaffAttendanceTrackingRecord(Long id,LocalDateTime swingTime, String personCode, String personName, String deptName, Integer result, Integer enterOrExit, Integer isSync) { this.id = id; this.swingTime = swingTime; this.personCode = personCode; this.personName = personName; this.deptName = deptName; this.result = result; this.enterOrExit = enterOrExit; this.isSync = isSync; } public StaffAttendanceTrackingRecord() { } } inspect-server/src/main/java/com/ruoyi/inspect/service/StaffAttendanceTrackingRecordService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,31 @@ package com.ruoyi.inspect.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.inspect.dto.StaffAttendanceDTO; import com.ruoyi.inspect.pojo.StaffAttendanceTrackingRecord; import com.ruoyi.inspect.vo.StaffAttendanceVO; import com.ruoyi.inspect.vo.StaffClockInVO; import com.ruoyi.performance.dto.PerformanceShiftMapDto; import java.time.LocalDateTime; import java.util.List; /** * @author 27233 * @description é对表ãstaff_attendance_tracking_record(人åèå¤-èå¤è®°å½)ãçæ°æ®åºæä½Service * @createDate 2026-03-09 17:42:25 */ public interface StaffAttendanceTrackingRecordService extends IService<StaffAttendanceTrackingRecord> { boolean syncAttendanceRecord(LocalDateTime startDate, LocalDateTime endDate); IPage<StaffAttendanceVO> pageAttendanceRecord(Page<StaffAttendanceTrackingRecord> page, StaffAttendanceDTO staffAttendanceDTO); List<StaffAttendanceTrackingRecord> getClockInRecord(StaffAttendanceDTO staffAttendanceDTO); PerformanceShiftMapDto checkDutyDate(StaffAttendanceDTO staffAttendanceDTO); boolean saveOrUpdateRecord(StaffAttendanceDTO staffAttendanceDTO); } inspect-server/src/main/java/com/ruoyi/inspect/service/impl/IfsPartPropsRecordServiceImpl.java
@@ -18,7 +18,6 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
@@ -811,7 +811,7 @@ ) .ne(InsProduct::getIsBinding, 1)); insProducts.addAll(insProductMapper.selectFiberInsProduct(InsSampleIds, laboratory)); if (insProducts.size() > 0) { if (!insProducts.isEmpty()) { String str = ""; int count = 0; for (InsProduct product : insProducts) { inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
@@ -860,6 +860,7 @@ // ä¼ä¸å¾®ä¿¡éç¥ String message = ""; message += "æ£æµç»ææäº¤éç¥"; message += "\nIFSå: " + one.getContract(); message += "\næ¹æ¬¡å·: " + one.getUpdateBatchNo(); message += "\né¶ä»¶å·: " + one.getPartNo(); message += "\né¶ä»¶æè¿°: " + one.getPartDesc(); inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java
@@ -242,6 +242,7 @@ if(!validateValue){ throw new ErrorException("æ¥æ£å¤±è´¥ï¼éæ³çéå®è®¢ååç±»æä¸¾"); } validateUpdateBatchNo(ifsInventoryQuantity); //æ¹æ¬¡å·åæ¯è½¬å¤§å ifsInventoryQuantity.setUpdateBatchNo(ifsInventoryQuantity.getUpdateBatchNo().toUpperCase(Locale.ROOT)); ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate() @@ -266,6 +267,26 @@ WxCpUtils.informWebHook(wechatProperty.getExaminingUrl(), message); }); return 1; } /** * æ ¡éªå¤è´è®¢åæ¥æ£çæ¹æ¬¡å·æ¯å¦éå¤ * @param ifsInventoryQuantity */ public void validateUpdateBatchNo(IfsInventoryQuantity ifsInventoryQuantity){ if(StringUtils.equals(ifsInventoryQuantity.getOrderType(),OrderType.WG.getValue())){ //æ¥è¯¢åå²è®°å½ Long count = ifsInventoryQuantityMapper.selectCount(Wrappers.<IfsInventoryQuantity>lambdaQuery() .eq(IfsInventoryQuantity::getContract,ifsInventoryQuantity.getContract()) .eq(IfsInventoryQuantity::getPartNo,ifsInventoryQuantity.getPartNo()) .eq(IfsInventoryQuantity::getUpdateBatchNo,ifsInventoryQuantity.getUpdateBatchNo()) .eq(IfsInventoryQuantity::getOrderType,OrderType.WG.getValue()) .ne(IfsInventoryQuantity::getState,0) ); if(count>0){ throw new RuntimeException("æ¥æ£å¤±è´¥ï¼é¶ä»¶"+ifsInventoryQuantity.getPartNo()+"ææ¥æ£çæ¹æ¬¡å·ã"+ifsInventoryQuantity.getUpdateBatchNo()+"ãå·²åå¨ï¼"); } } } /** @@ -526,6 +547,7 @@ if(!OrderType.validateValue(ifsInventoryQuantity.getOrderType())){ throw new ErrorException("æ°å¢æ¥æ£ä¿¡æ¯å¤±è´¥ï¼éæ³çéå®è®¢ååç±»æä¸¾"); } validateUpdateBatchNo(ifsInventoryQuantity); ifsInventoryQuantityMapper.insert(ifsInventoryQuantity); } inspect-server/src/main/java/com/ruoyi/inspect/service/impl/StaffAttendanceTrackingRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,466 @@ package com.ruoyi.inspect.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; 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.core.domain.Result; import com.ruoyi.common.enums.ClockInState; import com.ruoyi.common.enums.EnterOrExitType; import com.ruoyi.common.enums.SyncStatus; import com.ruoyi.common.utils.api.icc.IccApiUtil; import com.ruoyi.common.utils.api.icc.model.GetResultPageRequest; import com.ruoyi.common.utils.api.icc.model.GetResultPageResponse; import com.ruoyi.inspect.dto.StaffAttendanceDTO; import com.ruoyi.inspect.mapper.StaffAttendanceTrackingRecordMapper; import com.ruoyi.inspect.pojo.StaffAttendanceTrackingRecord; import com.ruoyi.inspect.service.StaffAttendanceTrackingRecordService; import com.ruoyi.inspect.util.HourDiffCalculator; import com.ruoyi.inspect.vo.StaffAttendanceVO; import com.ruoyi.inspect.vo.StaffClockInVO; import com.ruoyi.performance.dto.PerformanceShiftMapDto; import com.ruoyi.performance.mapper.PerformanceShiftMapper; import com.ruoyi.performance.mapper.ShiftTimeMapper; import com.ruoyi.performance.pojo.ShiftTime; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; /** * @author 27233 * @description é对表ãstaff_attendance_tracking_record(人åèå¤-èå¤è®°å½)ãçæ°æ®åºæä½Serviceå®ç° * @createDate 2026-03-09 17:42:25 */ @Slf4j @Service public class StaffAttendanceTrackingRecordServiceImpl extends ServiceImpl<StaffAttendanceTrackingRecordMapper, StaffAttendanceTrackingRecord> implements StaffAttendanceTrackingRecordService { @Autowired private IccApiUtil iccApiUtil; @Autowired private PerformanceShiftMapper performanceShiftMapper; @Autowired private ShiftTimeMapper shiftTimeMapper; private DateTimeFormatter yyyMMdd = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private DateTimeFormatter HHmm = DateTimeFormatter.ofPattern("HH:mm"); private DateTimeFormatter yyyMMddHHmmss = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); /** è´¨éé¨id */ private final static String deptIds = "6"; // åºå®åç¼ private static final String PREFIX = "ZT-"; // æ°åé¨ååºå®é¿åº¦ private static final int DIGIT_LENGTH = 6; /** * 忥çé¨ç¦è®¾å¤å表 * channel_name device_code * 10.100.22.2_é¨ç¦éé_1 1001538 * 10.100.22.3_é¨ç¦éé_1 1001539 * 10.100.22.4_é¨ç¦éé_1 1001540 * 10.100.22.5_é¨ç¦éé_1 1001541 * 10.100.22.12_é¨ç¦éé_1 1001626 * 10.100.22.13_é¨ç¦éé_1 1001627 * 10.100.22.14_é¨ç¦éé_1 1001628 * 10.100.22.15_é¨ç¦éé_1 1001629 */ private final static List<String> syncDeviceCode = Arrays.asList("1001538", "1001539", "1001540", "1001541", "1001626", "1001627", "1001628", "1001629"); @Override @Transactional(rollbackFor = Exception.class) public boolean syncAttendanceRecord(LocalDateTime startDate, LocalDateTime endDate) { if (ObjectUtil.isAllEmpty(startDate, endDate)) { throw new RuntimeException("åæ¥æ¥æä¸è½ä¸ºç©º"); } // æ¥è¯¢å·²åæ¥çè®°å½ List<Long> trackingRecordIccIdList = baseMapper.selectIccIdList(); try { // æ¥è¯¢icc弿¾å¹³å°çèå¤è®°å½ GetResultPageRequest getResultPageRequest = new GetResultPageRequest(); getResultPageRequest.setPageNum(1); getResultPageRequest.setPageSize(9999); getResultPageRequest.setDeptIds(deptIds); getResultPageRequest.setStartSwingTime(startDate.format(yyyMMddHHmmss)); getResultPageRequest.setEndSwingTime(endDate.format(yyyMMddHHmmss)); GetResultPageResponse trackingRecordResponse = iccApiUtil.getAttendanceResultPage(getResultPageRequest); if (trackingRecordResponse.isSuccess()) { if (ObjectUtil.isNotNull(trackingRecordResponse.getData()) && !trackingRecordResponse.getData().getPageData().isEmpty()) { List<StaffAttendanceTrackingRecord> recordList = trackingRecordResponse.getData().getPageData() .stream() .filter(f -> !trackingRecordIccIdList.contains(f.getId()) && syncDeviceCode.contains(f.getDeviceCode())) .map(result -> { StaffAttendanceTrackingRecord trackingRecord = new StaffAttendanceTrackingRecord(); BeanUtil.copyProperties(result, trackingRecord); trackingRecord.setIccId(result.getId()); trackingRecord.setPersonCode(restorePersonCode(result.getPersonCode())); trackingRecord.setId(null); return trackingRecord; }).collect(Collectors.toList()); if (!recordList.isEmpty()) this.saveBatch(recordList); log.info("忥ICCèå¤è®°å½æ¡æ°->,{}", recordList.size()); } } else { log.error("忥ICC弿¾å¹³å°èå¤è®°å½é误,{}", trackingRecordResponse.getErrMsg()); } } catch (Exception e) { throw new RuntimeException(e); } return true; } @Override public IPage<StaffAttendanceVO> pageAttendanceRecord(Page<StaffAttendanceTrackingRecord> page, StaffAttendanceDTO staffAttendanceDTO) { // æ¥è¯¢æå¡è®°å½ System.out.println(staffAttendanceDTO.getStartDate()); System.out.println(staffAttendanceDTO.getEndDate()); System.out.println(ObjectUtils.allNotNull(staffAttendanceDTO.getStartDate(),staffAttendanceDTO.getEndDate())); Wrapper<StaffAttendanceTrackingRecord> queryWrapper = Wrappers.<StaffAttendanceTrackingRecord>lambdaQuery() .eq(StaffAttendanceTrackingRecord::getEnableReport, Boolean.TRUE) .between(ObjectUtils.allNotNull(staffAttendanceDTO.getStartDate(),staffAttendanceDTO.getEndDate()), StaffAttendanceTrackingRecord::getSwingTime, staffAttendanceDTO.getStartDate(),ObjectUtils.isNotEmpty(staffAttendanceDTO.getEndDate())?staffAttendanceDTO.getEndDate().plusDays(1L):null) .and(StringUtils.isNotEmpty(staffAttendanceDTO.getKeyword()), i -> i.like(StaffAttendanceTrackingRecord::getPersonCode, staffAttendanceDTO.getKeyword()) .or() .like(StaffAttendanceTrackingRecord::getPersonName, staffAttendanceDTO.getKeyword())); List<StaffAttendanceTrackingRecord> recordList = baseMapper.selectList(queryWrapper); // æ¥è¯¢ç次 List<PerformanceShiftMapDto> performanceShifts = performanceShiftMapper.selectListByWorkTime( staffAttendanceDTO.getStartDate(), staffAttendanceDTO.getEndDate(), staffAttendanceDTO.getKeyword()); // ç»è£ æ°æ® List<StaffAttendanceVO> resultList = new ArrayList<>(); for (int i = 0; i < performanceShifts.size(); i++) { PerformanceShiftMapDto p = performanceShifts.get(i); StaffAttendanceVO vo = new StaffAttendanceVO(); // è·å对åºçæ¬¡å°æ¶æ° if (ObjectUtil.isAllNotEmpty(p.getStartTime(), p.getEndTime()) && !recordList.isEmpty()) { double hourDiff = HourDiffCalculator.getHourDiff(p.getStartTime(), p.getEndTime()); /* * ä¸çæ¶é´åå¼ï¼ * æ£å¸¸ï¼å½åçæ¬¡å¼å§åæå䏿¬¡è¿é¨æ¶é´ * å¼å¸¸(è¿å°)ï¼æ å½åçæ¬¡å¼å§åè¿é¨è®°å½ï¼åå½åçæ¬¡å¼å§åç¬¬ä¸æ¬¡è¿é¨æ¶é´ * ä¸çæ¶é´åå¼ï¼ * æ£å¸¸ï¼å½åçæ¬¡ç»æåç¬¬ä¸æ¬¡åºé¨æ¶é´ * å¼å¸¸(æ©é)ï¼æ å½åçæ¬¡ç»æå°ä¸ä¸ç次å¼å§åçåºé¨è®°å½å¹¶ä¸æå䏿¬¡åºé¨å¨å½åçæ¬¡æ¶é´èå´å ï¼åå½åçæ¬¡æå䏿¬¡åºé¨æ¶é´ */ // å½åçæ¬¡å¼å§å¤©0ç¹æ¶é´ LocalDateTime startDateTime = LocalDateTime.of(p.getWorkTime().toLocalDate(), LocalTime.MIN); // å½åçæ¬¡ç»æå¤©24ç¹æ¶é´ LocalDateTime endDateTime = LocalDateTime.of(p.getWorkTime().toLocalDate(), LocalTime.MAX); // å½åçæ¬¡å¼å§æ¶é´ LocalTime currentShiftStartTime = LocalTime.parse(p.getStartTime(), HHmm); LocalDateTime currentShiftStartDateTime = LocalDateTime.of(p.getWorkTime().toLocalDate(), currentShiftStartTime); // å½åçæ¬¡ç»ææ¶é´ LocalTime currentShiftEndTime = LocalTime.parse(p.getEndTime(), HHmm); LocalDateTime currentShiftEndDateTime = LocalDateTime.of(endDateTime.toLocalDate(), currentShiftEndTime); // ä¸ä¸ç次å¼å§æ¶é´ LocalDateTime nextShiftStartDateTime = getShiftStartDateTime(i + 1, performanceShifts, startDateTime.plusDays(1L)); if (Double.compare(hourDiff, 0) == -1) { // 妿尿¶å·®ä¸ºè´æ°ï¼è¡¨ç¤ºè·¨å¤©ï¼ç»ææ¶é´éå ä¸ endDateTime = endDateTime.plusDays(1L); } // è¿æ»¤åºå½å人åå½åçæ¬¡çè¿/åºè®°å½ LocalDateTime workDateTime = null; LocalDateTime offWorkDateTime = null; List<StaffAttendanceTrackingRecord> enterRecords = filterAttendanceRecord(p.getPersonCode(), EnterOrExitType.ENTER.getValue(), startDateTime, endDateTime, recordList); if (!enterRecords.isEmpty()) { // ä¸çæ¶é´åç¶æ StaffAttendanceTrackingRecord enterRecord = enterRecords.stream() .filter(s -> !s.getSwingTime().isAfter(currentShiftStartDateTime)) .max(Comparator.comparing(StaffAttendanceTrackingRecord::getSwingTime)) .orElse(new StaffAttendanceTrackingRecord()); if (BeanUtil.isEmpty(enterRecord)) { enterRecord = enterRecords.stream() .filter(s -> (s.getSwingTime().isAfter(currentShiftStartDateTime) && s.getSwingTime().isBefore(currentShiftEndDateTime))) .min(Comparator.comparing(StaffAttendanceTrackingRecord::getSwingTime)) .orElse(new StaffAttendanceTrackingRecord()); workDateTime = enterRecord.getSwingTime(); vo.setWorkClockInState(ClockInState.ABNORMAL.getValue()); vo.setWorkDataId(enterRecord.getId()); } else { workDateTime = enterRecord.getSwingTime(); vo.setWorkClockInState(ClockInState.NORMAL.getValue()); vo.setWorkDataId(enterRecord.getId()); } } List<StaffAttendanceTrackingRecord> exitRecords = filterAttendanceRecord(p.getPersonCode(), EnterOrExitType.EXIT.getValue(), startDateTime, endDateTime, recordList); if (!exitRecords.isEmpty()) { // ä¸çæ¶é´åç¶æ StaffAttendanceTrackingRecord exitRecord = exitRecords.stream() .filter(s -> !s.getSwingTime().isBefore(currentShiftEndDateTime) && s.getSwingTime().isBefore(nextShiftStartDateTime)) .min(Comparator.comparing(StaffAttendanceTrackingRecord::getSwingTime)) .orElse(new StaffAttendanceTrackingRecord()); if (BeanUtil.isEmpty(exitRecord)) { exitRecord = exitRecords.stream() .filter(s -> (s.getSwingTime().isAfter(currentShiftStartDateTime) && s.getSwingTime().isBefore(currentShiftEndDateTime))) .max(Comparator.comparing(StaffAttendanceTrackingRecord::getSwingTime)) .orElse(new StaffAttendanceTrackingRecord()); offWorkDateTime = exitRecord.getSwingTime(); vo.setOffClockInState(ClockInState.ABNORMAL.getValue()); vo.setOffWorkDataId(exitRecord.getId()); } else { offWorkDateTime = exitRecord.getSwingTime(); vo.setOffClockInState(ClockInState.NORMAL.getValue()); vo.setOffWorkDataId(exitRecord.getId()); } } if (ObjectUtils.allNotNull(workDateTime, offWorkDateTime)) { vo.setActualWorkHours(HourDiffCalculator.getHourDiff(workDateTime.toLocalTime().format(HHmm), offWorkDateTime.toLocalTime().format(HHmm))); } // èµå¼ vo.setShiftId(p.getShift()); vo.setPersonCode(p.getPersonCode()); vo.setPersonName(p.getUserName()); vo.setPlannedWorkHours(hourDiff); vo.setSwingDate(startDateTime); vo.setWorkDateTime(workDateTime); vo.setOffWorkDateTime(offWorkDateTime); vo.setDeptName(recordList.get(0).getDeptName()); vo.setIsSync(recordList.get(0).getIsSync()); vo.setCreateUser(recordList.get(0).getCreateUser()); vo.setCreateTime(recordList.get(0).getCreateTime()); vo.setUpdateUser(recordList.get(0).getUpdateUser()); vo.setUpdateTime(recordList.get(0).getUpdateTime()); vo.setResult(ClockInState.ABNORMAL.getValue()); if(ObjectUtils.allNotNull(vo.getWorkClockInState(),vo.getOffClockInState())){ vo.setResult(Integer.min(vo.getWorkClockInState(),vo.getOffClockInState())); } // 计ç®ç¼ºå¤æ¶é¿ if (ObjectUtils.allNotNull(vo.getActualWorkHours(), vo.getPlannedWorkHours())) { double absenceWorkHours = BigDecimal.valueOf(vo.getPlannedWorkHours()) .subtract(BigDecimal.valueOf(vo.getActualWorkHours())).setScale(2, RoundingMode.HALF_EVEN) .doubleValue(); if (Double.compare(absenceWorkHours, 0) > 0) { vo.setAbsenceWorkHours(absenceWorkHours); } } if (!enterRecords.isEmpty() || !exitRecords.isEmpty()) resultList.add(vo); } } return limitPages(page, resultList); } @Override public List<StaffAttendanceTrackingRecord> getClockInRecord(StaffAttendanceDTO staffAttendanceDTO) { ShiftTime shiftTime = shiftTimeMapper.selectOne(Wrappers.<ShiftTime>lambdaQuery().eq(ShiftTime::getShift, staffAttendanceDTO.getShiftId())); if(ObjectUtils.isEmpty(shiftTime)){ throw new RuntimeException("æªæ¥è¯¢å°å½åçæ¬¡çæ¶é´é ç½®"); } LocalDateTime startDateTime = LocalDateTime.of(staffAttendanceDTO.getSwingDate(),LocalTime.MIN); LocalDateTime endDateTime = LocalDateTime.of(staffAttendanceDTO.getSwingDate(),LocalTime.MAX); //夿å½åçæ¬¡æ¯å¦è¦è·¨å¤© double hourDiff = HourDiffCalculator.getHourDiff(shiftTime.getStartTime(), shiftTime.getEndTime()); if(Double.compare(hourDiff,0)<0){ endDateTime = endDateTime.plusDays(1L); } return baseMapper.selectList(Wrappers.<StaffAttendanceTrackingRecord>lambdaQuery() .eq(StaffAttendanceTrackingRecord::getPersonCode,staffAttendanceDTO.getPersonCode()) .between(ObjectUtil.isAllNotEmpty(startDateTime, endDateTime),StaffAttendanceTrackingRecord::getSwingTime, startDateTime,endDateTime) .orderByAsc(StaffAttendanceTrackingRecord::getSwingTime) ); } @Override public PerformanceShiftMapDto checkDutyDate(StaffAttendanceDTO staffAttendanceDTO) { if(ObjectUtils.isEmpty(staffAttendanceDTO.getSwingDate())){ throw new RuntimeException("è夿¥æä¸è½ä¸ºç©º"); } LocalDateTime startDateTime = LocalDateTime.of(staffAttendanceDTO.getSwingDate(),LocalTime.MIN); LocalDateTime endDateTime = LocalDateTime.of(staffAttendanceDTO.getSwingDate(),LocalTime.MAX); Long count = baseMapper.selectCount(Wrappers.<StaffAttendanceTrackingRecord>lambdaQuery() .eq(StaffAttendanceTrackingRecord::getPersonCode, staffAttendanceDTO.getPersonCode()) .between(StaffAttendanceTrackingRecord::getSwingTime, startDateTime, endDateTime)); if(count>0){ throw new RuntimeException("æéæ¥æå·²åå¨èå¤è®°å½ï¼"); } //æ¥è¯¢äººåå½å¤©ç次é ç½® List<PerformanceShiftMapDto> shiftMapDtos = performanceShiftMapper.selectListByWorkTime(startDateTime, endDateTime, staffAttendanceDTO.getPersonCode()); if(shiftMapDtos.isEmpty()){ throw new RuntimeException("æªæ¾å°äººåæéè夿¶é´ççæ¬¡é ç½®ï¼è¯·å é ç½®çæ¬¡"); } return shiftMapDtos.get(0); } @Override @Transactional(rollbackFor = Exception.class) public boolean saveOrUpdateRecord(StaffAttendanceDTO staffAttendanceDTO) { if(ObjectUtils.isEmpty(staffAttendanceDTO)){ throw new RuntimeException("ä¼ åä¸è½ä¸ºç©º"); } LocalDateTime workDateTime = LocalDateTime.of(staffAttendanceDTO.getSwingDate(),staffAttendanceDTO.getWorkDateTime()); LocalDateTime offWorkDateTime = LocalDateTime.of(staffAttendanceDTO.getSwingDate(),staffAttendanceDTO.getOffWorkDateTime()); //æ ¡éªä¸ä¸çæ¶é´æ¯å¦è·¨å¤© double hourDiff = HourDiffCalculator.getHourDiff(staffAttendanceDTO.getWorkDateTime().format(HHmm), staffAttendanceDTO.getOffWorkDateTime().format(HHmm)); if(Double.compare(hourDiff,0)<0){ offWorkDateTime = offWorkDateTime.plusDays(1L); } //ç»è£ ä¸/ä¸çèå¤è®°å½ StaffAttendanceTrackingRecord workRecord = new StaffAttendanceTrackingRecord( staffAttendanceDTO.getWorkDataId(), workDateTime, staffAttendanceDTO.getPersonCode(), staffAttendanceDTO.getPersonName(), staffAttendanceDTO.getDeptName(), staffAttendanceDTO.getResult(), EnterOrExitType.ENTER.getValue(), SyncStatus.INERT.getValue()); StaffAttendanceTrackingRecord offWorkRecord = new StaffAttendanceTrackingRecord( staffAttendanceDTO.getOffWorkDataId(), offWorkDateTime, staffAttendanceDTO.getPersonCode(), staffAttendanceDTO.getPersonName(), staffAttendanceDTO.getDeptName(), staffAttendanceDTO.getResult(), EnterOrExitType.EXIT.getValue(), SyncStatus.INERT.getValue()); List<StaffAttendanceTrackingRecord> records = Arrays.asList(workRecord, offWorkRecord); return this.saveOrUpdateBatch(records); } /** * èªå®ä¹åé¡µæ¹æ³ * * @param page å页对象 * @param resultList æ°æ®å表 * @return */ private IPage<StaffAttendanceVO> limitPages(Page<StaffAttendanceTrackingRecord> page, List<StaffAttendanceVO> resultList) { IPage<StaffAttendanceVO> resultPage = new Page<>(); long current = page.getCurrent(); long size = page.getSize(); if (current < 1) current = 1; long total = resultList.size(); long pages = getPages(size,total); int startIndex = Math.toIntExact((current - 1) * size >= total ? (pages - 1) * size : (current - 1) * size); int endIndex = Math.toIntExact(Math.min(current * size, total)); List<StaffAttendanceVO> records = resultList.subList(startIndex, endIndex); resultPage.setRecords(records); resultPage.setTotal(total); resultPage.setSize(size); resultPage.setCurrent(current); if(current>=pages)resultPage.setCurrent(pages); return resultPage; } /** * å½åå页æ»é¡µæ° */ private long getPages(long size,long total) { if (size == 0) { return 0L; } long pages = total / size; if (total % size != 0) { pages++; } return pages; } /** * è·åæå®ä¸æ ççæ¬¡å¼å§æ¶é´ * * @param index * @param dtoList * @return */ private LocalDateTime getShiftStartDateTime(int index, List<PerformanceShiftMapDto> dtoList, LocalDateTime nextShiftTime) { if (dtoList.isEmpty() || index >= dtoList.size()) { return LocalDateTime.of(nextShiftTime.toLocalDate(), LocalTime.MAX); } LocalTime localTime = ObjectUtil.isNull(dtoList.get(index).getStartTime()) ? LocalTime.MAX : LocalTime.parse(dtoList.get(index).getStartTime(), HHmm); return LocalDateTime.of(nextShiftTime.toLocalDate(), localTime); } /** * è¿æ»¤æå®æ¶é´èå´çè¿åºè®°å½ * * @param personCode 人åç¼å· * @param enterOrExit è¿é¨/åºé¨ * @param startDateTime å¼å§æ¶é´ * @param endDateTime ç»ææ¶é´ * @param recordList è¿åºè®°å½å表 * @return */ public List<StaffAttendanceTrackingRecord> filterAttendanceRecord(String personCode, Integer enterOrExit, LocalDateTime startDateTime, LocalDateTime endDateTime, List<StaffAttendanceTrackingRecord> recordList) { if (recordList.isEmpty()) { return Collections.emptyList(); } return recordList.stream() .filter(s -> ObjectUtil.equal(s.getEnterOrExit(), enterOrExit)) .filter(s -> (s.getSwingTime().isAfter(startDateTime) && s.getSwingTime().isBefore(endDateTime)) && StringUtils.equals(s.getPersonCode(), personCode)) .collect(Collectors.toList()); } /** * å°çº¯æ°åå¤å为æ ååå·¥ç¼å· * * @param number ä¼ å ¥çæ°åï¼åå·¥ç¼å·å»é¤åç¼ååç½®0åçæ°åï¼æ¯æint/long/Stringç±»åï¼ * @return æ åæ ¼å¼åå·¥ç¼å·ï¼å¦è¾å ¥123 â ZT-000123ï¼ * @throws IllegalArgumentException ä¼ å ¥éæ°å/è´æ°æ¶æåºå¼å¸¸ */ public static String restorePersonCode(Object number) { // 1. ç©ºå¼æ ¡éª if (number == null) { throw new IllegalArgumentException("ä¼ å ¥æ°åä¸è½ä¸ºç©º"); } // 2. ç»ä¸è½¬æ¢ä¸ºå符串并å»é¤é¦å°¾ç©ºæ ¼ String numStr = number.toString().trim(); // 3. æ ¡éªæ¯å¦ä¸ºçº¯æ°åï¼æé¤è´æ°ãéæ°ååç¬¦ï¼ if (!numStr.matches("\\d+")) { throw new IllegalArgumentException("ä¼ å ¥ç䏿¯æææ£æ´æ°ï¼" + numStr); } // 4. è¡¥åç½®0å°æå®é¿åº¦ï¼6ä½ï¼ï¼è¶ åºåä¿çåæ°å String paddedNum = String.format("%0" + DIGIT_LENGTH + "d", Long.parseLong(numStr)); // 5. æ¼æ¥åç¼è¿å return PREFIX + paddedNum; } } inspect-server/src/main/java/com/ruoyi/inspect/task/SyncStaffAttendanceRecordSchedule.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,36 @@ package com.ruoyi.inspect.task; import com.ruoyi.inspect.service.StaffAttendanceTrackingRecordService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; /** * 忥æåicc弿¾å¹³å°èå¤è®°å½å®æ¶ä»»å¡ */ @Slf4j @Component public class SyncStaffAttendanceRecordSchedule { @Autowired private StaffAttendanceTrackingRecordService trackingRecordService; @Scheduled(cron = "0 0 1 * * ?") public void sync() { log.info("--------忥èå¤è®°å½å®æ¶ä»»å¡å¼å§--------"); LocalDate yesterday = LocalDate.now(ZoneId.of("Asia/Shanghai")).minusDays(1L); LocalDateTime startTime = LocalDateTime.of(yesterday, LocalTime.MIN); LocalDateTime endTime = LocalDateTime.of(yesterday, LocalTime.MAX); trackingRecordService.syncAttendanceRecord(startTime,endTime); log.info("--------忥èå¤è®°å½å®æ¶ä»»å¡ç»æ--------"); } } inspect-server/src/main/java/com/ruoyi/inspect/util/HourDiffCalculator.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,61 @@ package com.ruoyi.inspect.util; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Objects; import java.util.regex.Pattern; /** * æ¶åæ¶é´å·®è®¡ç®å·¥å ·ç±» * æ¯ææ ¼å¼ï¼HH:mmï¼24å°æ¶å¶ï¼ï¼å¦ 08:30ã23:59ã00:00 */ public class HourDiffCalculator { // æ ¡éªHH:mmæ ¼å¼çæ£åï¼24å°æ¶å¶ï¼å°æ¶00-23ï¼åé00-59ï¼ private static final Pattern TIME_PATTERN = Pattern.compile("^([01]?[0-9]|2[0-3]):[0-5][0-9]$"); /** * 计ç®ä¸¤ä¸ªæ¶åå符串ä¹é´çç¸éå°æ¶æ° * @param startTime å¼å§æ¶é´ï¼HH:mmï¼å¦ "08:30"ï¼ * @param endTime ç»ææ¶é´ï¼HH:mmï¼å¦ "17:45"ï¼ * @return ç¸éå°æ¶æ°ï¼ä¿ç2ä½å°æ°ï¼å¦ 9.25 å°æ¶ï¼ * @throws IllegalArgumentException æ¶é´æ ¼å¼éè¯¯æ¶æåºå¼å¸¸ */ public static double getHourDiff(String startTime, String endTime) { // 1. æ ¡éªæ¶é´æ ¼å¼ validateTimeFormat(startTime); validateTimeFormat(endTime); // 2. è§£ææ¶åå符串为æ»åéæ° int startMinutes = convertTimeToMinutes(startTime); int endMinutes = convertTimeToMinutes(endTime); // 3. 计ç®åéå·® int minuteDiff = endMinutes - startMinutes; // 4. 转æ¢ä¸ºå°æ¶æ°ï¼ä¿ç2ä½å°æ°ï¼é¿å ç²¾åº¦ä¸¢å¤±ï¼ BigDecimal hourDiff = new BigDecimal(minuteDiff) .divide(new BigDecimal(60), 2, RoundingMode.HALF_UP); return hourDiff.doubleValue(); } /** * æ ¡éªæ¶é´æ ¼å¼æ¯å¦ä¸ºHH:mm */ private static void validateTimeFormat(String time) { if (time == null || !TIME_PATTERN.matcher(time).matches()) { throw new IllegalArgumentException("æ¶é´æ ¼å¼é误ï¼é为HH:mmï¼24å°æ¶å¶ï¼ï¼" + time); } } /** * å°HH:mmå符串转æ¢ä¸ºæ»åéæ°ï¼å¦ 08:30 â 510 åéï¼ */ private static int convertTimeToMinutes(String time) { String[] parts = time.split(":"); int hour = Integer.parseInt(parts[0]); int minute = Integer.parseInt(parts[1]); return hour * 60 + minute; } } inspect-server/src/main/java/com/ruoyi/inspect/vo/StaffAttendanceVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,103 @@ package com.ruoyi.inspect.vo; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.time.LocalDateTime; @Data public class StaffAttendanceVO { /** * ä¸çæ°æ®ä¸»é®id */ private Long workDataId; /** * ä¸çæ°æ®ä¸»é®id */ private Long offWorkDataId; /** * 人åç¼å· */ private String personCode; /** * 人ååç§° */ private String personName; /** *é¨é¨åç§° */ private String deptName; /** *çæ¬¡id */ private String shiftId; /** *èå¤ç»æ */ private Integer result; /** *è夿¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd") private LocalDateTime swingDate; /** *ä¸çæ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime workDateTime; /** *ä¸çæ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime offWorkDateTime; /** *ä¸çæå¡ç¶æï¼0ï¼æ£å¸¸ï¼1ï¼å¼å¸¸ï¼ */ private Integer workClockInState; /** *ä¸çæå¡ç¶æï¼0ï¼æ£å¸¸ï¼1ï¼å¼å¸¸ï¼ */ private Integer offClockInState; /** * åºå¤æ¶é¿ */ private Double plannedWorkHours; /** * å®é æ¶é¿ */ private Double actualWorkHours; /** * ç¼ºå¤æ¶é¿ */ private Double absenceWorkHours; /** * æ¯å¦ä¸ºåæ¥æ°æ® */ private Integer isSync; private Integer createUser; private LocalDateTime createTime; private Integer updateUser; private LocalDateTime updateTime; } inspect-server/src/main/java/com/ruoyi/inspect/vo/StaffClockInVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,14 @@ package com.ruoyi.inspect.vo; import com.ruoyi.inspect.pojo.StaffAttendanceTrackingRecord; import lombok.Data; /** * 人åèå¤ï¼äººåæå¡è®°å½ååºå¯¹è±¡ */ @Data public class StaffClockInVO extends StaffAttendanceTrackingRecord { } inspect-server/src/main/resources/mapper/StaffAttendanceTrackingRecordMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,58 @@ <?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.inspect.mapper.StaffAttendanceTrackingRecordMapper"> <resultMap id="BaseResultMap" type="com.ruoyi.inspect.pojo.StaffAttendanceTrackingRecord"> <id property="id" column="id" jdbcType="BIGINT"/> <result property="iccId" column="icc_id" jdbcType="BIGINT"/> <result property="swingTime" column="swing_time" jdbcType="TIMESTAMP"/> <result property="personId" column="person_id" jdbcType="BIGINT"/> <result property="personCode" column="person_code" jdbcType="VARCHAR"/> <result property="personName" column="person_name" jdbcType="VARCHAR"/> <result property="deptName" column="dept_name" jdbcType="VARCHAR"/> <result property="result" column="result" jdbcType="INTEGER"/> <result property="cardNumber" column="card_number" jdbcType="VARCHAR"/> <result property="cardStatus" column="card_status" jdbcType="INTEGER"/> <result property="cardType" column="card_type" jdbcType="INTEGER"/> <result property="channelCode" column="channel_code" jdbcType="VARCHAR"/> <result property="channelName" column="channel_name" jdbcType="VARCHAR"/> <result property="deviceCode" column="device_code" jdbcType="VARCHAR"/> <result property="deviceName" column="device_name" jdbcType="VARCHAR"/> <result property="enterOrExit" column="enter_or_exit" jdbcType="INTEGER"/> <result property="imageType" column="image_type" jdbcType="INTEGER"/> <result property="openResult" column="open_result" jdbcType="INTEGER"/> <result property="openType" column="open_type" jdbcType="INTEGER"/> <result property="paperNumber" column="paper_number" jdbcType="VARCHAR"/> <result property="recordImageUrl" column="record_image_url" jdbcType="VARCHAR"/> <result property="recordImage" column="record_image" jdbcType="VARCHAR"/> <result property="remark" column="remark" jdbcType="VARCHAR"/> <result property="maskState" column="mask_state" jdbcType="INTEGER"/> <result property="overTemp" column="over_temp" jdbcType="TINYINT"/> <result property="curTemp" column="cur_temp" jdbcType="DOUBLE"/> <result property="isSync" column="is_sync" jdbcType="INTEGER"/> <result property="enableReport" column="enable_report" jdbcType="BOOLEAN"/> <result property="createUser" column="create_user" jdbcType="INTEGER"/> <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> <result property="updateUser" column="update_user" jdbcType="INTEGER"/> <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/> </resultMap> <sql id="Base_Column_List"> id,icc_id,swing_time, person_id,person_code,person_name, dept_name,result,card_number, card_status,card_type,channel_code, channel_name,device_code,device_name, enter_or_exit,image_type,open_result, open_type,paper_number,record_image_url, record_image,remark,mask_state, over_temp,cur_temp,is_sync,enable_report, create_user,create_time,update_user, update_time </sql> <select id="selectIccIdList" resultType="java.lang.Long"> select icc_id from staff_attendance_tracking_record where icc_id!='' and icc_id is not null </select> </mapper> performance-server/src/main/java/com/ruoyi/performance/dto/PerformanceShiftMapDto.java
@@ -12,6 +12,9 @@ @Data public class PerformanceShiftMapDto extends PerformanceShift { @ApiModelProperty("ç¨æ·ç¼å·") private String personCode; @ApiModelProperty("ç¨æ·åç§°") private String userName; @@ -35,4 +38,11 @@ @ApiModelProperty("æ¥æè¡¨å¤´å表") private List<Map<Object, Object>> headerList = new ArrayList<>(); @ApiModelProperty("çæ¬¡å¼å§æ¶é´") private String startTime; @ApiModelProperty("çæ¬¡ç»ææ¶é´") private String endTime; } performance-server/src/main/java/com/ruoyi/performance/mapper/PerformanceShiftMapper.java
@@ -5,9 +5,11 @@ import com.ruoyi.framework.mybatis_config.MyBaseMapper; import com.ruoyi.performance.dto.PerformanceShiftMapDto; import com.ruoyi.performance.pojo.PerformanceShift; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; import java.util.Map; @@ -19,6 +21,7 @@ * @author æ±èéµ·éç½ç»ç§ææéå ¬å¸ * @since 2024-05-08 09:12:04 */ @Mapper public interface PerformanceShiftMapper extends MyBaseMapper<PerformanceShift> { List<PerformanceShiftMapDto> performanceShift( @@ -39,4 +42,7 @@ List<PerformanceShiftMapDto> performanceShiftList(@Param("time") String time, @Param("userName") String userName, @Param("laboratory") String laboratory); String seldepLimsId(@Param("depLimsId") int depLimsId); List<PerformanceShiftMapDto> selectListByWorkTime(@Param("startTime") LocalDateTime startTime,@Param("endTime") LocalDateTime endTime,@Param("keyword") String keyword); } performance-server/src/main/java/com/ruoyi/performance/mapper/ShiftTimeMapper.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.performance.pojo.ShiftTime; import org.apache.ibatis.annotations.Mapper; /** * <p> @@ -11,6 +12,7 @@ * @author æ±èéµ·éç½ç»ç§ææéå ¬å¸ * @since 2024-07-24 11:22:17 */ @Mapper public interface ShiftTimeMapper extends BaseMapper<ShiftTime> { } performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml
@@ -145,4 +145,27 @@ from department_lims where id = #{depLimsId} </select> <select id="selectListByWorkTime" resultType="com.ruoyi.performance.dto.PerformanceShiftMapDto"> SELECT ps.id, ps.shift, ps.work_time, ps.user_id, u.name AS user_name, u.account AS person_code, st.start_time, st.end_time FROM performance_shift ps LEFT JOIN user u ON ps.user_id = u.id LEFT JOIN shift_time st ON ps.shift = st.shift <where> <if test="startTime!=null and endTime!=null"> AND ps.work_time BETWEEN #{startTime} AND #{endTime} </if> <if test="keyword!='' and keyword!=null"> AND (u.account like concat('%',#{keyword},'%') OR u.name like concat('%',#{keyword},'%')) </if> </where> ORDER BY ps.work_time </select> </mapper> pom.xml
@@ -51,7 +51,6 @@ <!-- ä¾èµå£°æ --> <dependencyManagement> <dependencies> <!-- è¦çSpringFrameworkçä¾èµé ç½®--> <dependency> <groupId>org.springframework</groupId> @@ -314,7 +313,12 @@ <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <!-- 对æ¥ICCå¹³å°--> <dependency> <groupId>com.dahuatech.icc</groupId> <artifactId>java-sdk-oauth</artifactId> <version>1.0.13.10</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> ruoyi-admin-ztns/src/main/java/com/ruoyi/web/controller/system/SysPostController.java
@@ -120,8 +120,8 @@ /** * è·åå²ä½éæ©æ¡å表 */ @GetMapping("/optionselect") public AjaxResult optionselect() @GetMapping("/optionSelect") public AjaxResult optionSelect() { List<SysPost> posts = postService.selectPostAll(); return success(posts); ruoyi-admin-ztns/src/main/java/com/ruoyi/web/controller/system/UserController.java
@@ -1,6 +1,7 @@ package com.ruoyi.web.controller.system; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.Result; import com.ruoyi.common.core.domain.entity.User; @@ -70,6 +71,11 @@ return Result.success(userService.delUserDepardLimsId(id)); } @ApiOperation(value = "æ¥è¯¢ææç¨æ·å表") @GetMapping("/selectAllUser") public Result selectAllUser(){ return Result.success(userService.list(Wrappers.<User>lambdaQuery().eq(User::getStatus,0))); } } ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/Custom.java
@@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Builder; @@ -20,6 +22,7 @@ @ApiModelProperty(value = "主é®") @TableId(type = IdType.AUTO) @JsonSerialize(using = ToStringSerializer.class) private Long id; @ApiModelProperty(value = "客æ·åç§°") ruoyi-common/src/main/java/com/ruoyi/common/enums/ClockInState.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.ruoyi.common.enums; import lombok.Getter; /** * ICC对æ¥ï¼æå¡ç¶ææä¸¾ */ @Getter public enum ClockInState { NORMAL("æ£å¸¸",1), ABNORMAL("䏿£å¸¸",0); private String desc; private Integer value; ClockInState(String desc, Integer value) { this.desc = desc; this.value = value; } } ruoyi-common/src/main/java/com/ruoyi/common/enums/EnterOrExitType.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ package com.ruoyi.common.enums; import lombok.Getter; /** * ICCå¹³å°å¯¹æ¥ï¼è¿åºé¨ç±»åæä¸¾ */ @Getter public enum EnterOrExitType { ENTER("è¿é¨",1), EXIT("åºé¨",2), ENTER_OR_EXIT("è¿/åºé¨",3); private String desc; private Integer value; EnterOrExitType(String desc, Integer value) { this.desc = desc; this.value = value; } } ruoyi-common/src/main/java/com/ruoyi/common/enums/SyncStatus.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ package com.ruoyi.common.enums; import lombok.Getter; @Getter public enum SyncStatus { SYNC("忥",0), INERT("æå¨æ°å¢",1); private String desc; private Integer value; SyncStatus(String desc, Integer value) { this.desc = desc; this.value = value; } } ruoyi-common/src/main/java/com/ruoyi/common/utils/api/IfsApiUtils.java
@@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; /** * @Author zhuo @@ -47,9 +48,10 @@ ObjectMapper objectMapper = new ObjectMapper(); try { Map map = objectMapper.readValue(body, Map.class); maps.addAll(objectMapper.readValue(JSONUtil.toJsonStr(map.get("LIST_INFO")), new TypeReference<List<Map<String, Object>>>() { })); log.info("è·åéè´è®¢å-->>" + maps); if(Objects.nonNull(map.get("SuccessFlag")) && map.get("SuccessFlag").equals("1")){ maps.addAll(objectMapper.readValue(JSONUtil.toJsonStr(map.get("LIST_INFO")), new TypeReference<List<Map<String, Object>>>() {})); log.info("忥çéè´è®¢åæ°é-->>,{}" , maps.size()); } } catch (JsonProcessingException e) { e.printStackTrace(); throw new RuntimeException(e); @@ -108,7 +110,7 @@ * @return */ public Result importPartLotAttr(String contract,String inAttr) { return getResult(contract,"IMPORT_PART_LOT_ATTR_STD", inAttr, "POST", "åºåç©ææ¹æ¬¡å±æ§æ°å¢ä¿®æ¹æ¥å£-->"); return getResult(contract,"IMPORT_PART_LOT_ATTR_STD", inAttr, "GET", "åºåç©ææ¹æ¬¡å±æ§æ°å¢ä¿®æ¹æ¥å£-->"); } /** ruoyi-common/src/main/java/com/ruoyi/common/utils/api/icc/IccApiUtil.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,40 @@ package com.ruoyi.common.utils.api.icc; import com.dahuatech.hutool.http.Method; import com.dahuatech.icc.exception.ClientException; import com.dahuatech.icc.oauth.model.v202010.OauthConfigUserPwdInfo; import com.dahuatech.icc.oauth.utils.HttpUtils; import com.ruoyi.common.utils.api.icc.config.OauthConfigUtil; import com.ruoyi.common.utils.api.icc.model.GetResultPageRequest; import com.ruoyi.common.utils.api.icc.model.GetResultPageResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** * 对æ¥ICC弿¾å¹³å°å·¥å · */ @Slf4j @Component public class IccApiUtil { /** * å页è·åé¨ç¦è¿åºç»æ * @param getResultPageRequest * @return * @throws ClientException */ public GetResultPageResponse getAttendanceResultPage(GetResultPageRequest getResultPageRequest) { OauthConfigUserPwdInfo config = OauthConfigUtil.getOauthConfig(); GetResultPageResponse response=null; try { response = HttpUtils.executeJson("/evo-apigw/evo-accesscontrol/1.0.0/card/accessControl/swingCardRecord/bycondition/combined", getResultPageRequest,null, Method.POST , config, GetResultPageResponse.class); } catch (ClientException e) { log.error(e.getErrMsg(), e); } if(!response.isSuccess()) { log.info("å页è·åé¨ç¦è¿åºå¤±è´¥:{}",response.getErrMsg()); } return response; } } ruoyi-common/src/main/java/com/ruoyi/common/utils/api/icc/config/OauthConfigUtil.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ package com.ruoyi.common.utils.api.icc.config; import com.dahuatech.icc.oauth.model.v202010.OauthConfigUserPwdInfo; public class OauthConfigUtil { /** * è·åOauthé ç½®ä¿¡æ¯ * * @return Oauthé ç½®ä¿¡æ¯ */ public static OauthConfigUserPwdInfo getOauthConfig() { PlatformConfig platformConfig = new PlatformConfig();//读åé ç½® OauthConfigUserPwdInfo oauthConfigUserPwdInfo = new OauthConfigUserPwdInfo( platformConfig.getHost(), platformConfig.getClientId(), platformConfig.getClientSecret(), platformConfig.getUsername(), platformConfig.getPassword(), false, platformConfig.getHttpsPort(), platformConfig.getHttpPort() ); oauthConfigUserPwdInfo.getHttpConfigInfo().setReadTimeout(platformConfig.getReadTimeout()); oauthConfigUserPwdInfo.getHttpConfigInfo().setConnectionTimeout(platformConfig.getConnectionTimeout()); return oauthConfigUserPwdInfo; } } ruoyi-common/src/main/java/com/ruoyi/common/utils/api/icc/config/PlatformConfig.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.ruoyi.common.utils.api.icc.config; import lombok.Getter; /** * å¹³å°ä¿¡æ¯é ç½® */ @Getter public class PlatformConfig { private final String clientId = "NS-LIMS";//åè¯IDèªå®ä¹ï¼é åç³è¯·åè¯æµç¨ç³è¯· private final String clientSecret = "3ca893c4-bfda-4d33-bd73-1eb5f3a68df1";//åè¯å¯é¥ï¼åèæ¤å°åç³è¯·https://open-icc.dahuatech.com/iccdoc/enterprisebase/5.0.15/wiki/common/quickstart.html#%E7%94%B3%E8%AF%B7OpenAPI%E7%94%A8%E6%88%B7 private final String username = "NS-LIMS";//å¹³å°ç»å½ç¨æ·å private final String password = "zttZTT123!";//å¹³å°ç»å½å¯ç private final String host = "10.100.23.241";//å¹³å°IPï¼èè°ç¯å¢IP private final String httpsPort = "443";//httpsé»è®¤ç«¯å£æ¯443ï¼èè°ç¯å¢443æ å°å¤ç½ç«¯å£ä¸º4077 private final String httpPort = "83";//httpé»è®¤ç«¯å£æ¯83ï¼ä½ä¸å¼å¯ï¼ï¼èè°ç¯å¢83æ å°å¤ç½ç«¯å£ä¸º4078ï¼éè¿ç»´ä¸å¿å¼å¯httpè°è¯æ¨¡å¼åææ¯æï¼isEnableHttpTest=trueæ¶ææï¼ private final Long connectionTimeout = -1L;//è¿æ¥è¶ æ¶ private final Long readTimeout = -1L;//读åè¶ æ¶ } ruoyi-common/src/main/java/com/ruoyi/common/utils/api/icc/model/GetResultPageRequest.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,68 @@ package com.ruoyi.common.utils.api.icc.model; import lombok.Data; import javax.validation.constraints.Max; import javax.validation.constraints.NotNull; import java.util.List; /** * program:java-sdk-demo * * @Author: 355079 * @Date:2024-04-29 13:48 * @Description: å页è·åèå¤ç»æè¯·æ±åæ° */ @Data public class GetResultPageRequest { /** 第å 页 */ @NotNull private Integer pageNum; /** æ¯é¡µæ¡æ° */ @NotNull private Integer pageSize; /** å¼å§æ¶é´(yyyy-MM-dd) */ @NotNull private String startSwingTime; /** ç»ææ¶é´(yyyy-MM-dd) */ @NotNull private String endSwingTime; /** å ¥åºå¼å§æ¶é´ï¼æ ¼å¼ï¼yyyy-MM-dd HH:mm:ssï¼V1.1.4æ°å¢ */ private String startCreateTime; /** å ¥åºç»ææ¶é´ï¼æ ¼å¼ï¼yyyy-MM-dd HH:mm:ssï¼V1.1.4æ°å¢ æ¨èåå½åæ¶é´å5åéææ´é¿æ¶é´ï¼å 为åå¨å®¢æ·æå¡å¨æ¶é´æ¯iccæå¡å¨æ¶é´å¿«ï¼æ¥è¯¢æ¶ææ°æ°æ®è¿å ¥å¯¼è´é¡µç 䏿»æ°ä¸åï¼æ°æ®éä½ */ private String endCreateTime; /** å¼é¨ç±»å, è¯¦è§ å¼é¨ç±»å åå ¸ */ private Integer openType; /** å¼é¨ç±»åå¤é, è¯¦è§ å¼é¨ç±»å åå ¸ï¼V1.1.4æ°å¢ */ private List<Integer> openTypes; /** å¡çç±»å, ä¸ä¼ -å ¨é¨, 0-ICå¡, 1-ææºRFID, 2-CPUå¡ */ private String category; /** 人ååç§°ï¼ä» å 许æ±å忝æ°å -_.@ */ @Max(value = 64,message = "人ååç§°æå¤§é¿åº¦éå¶64") private String personName; /** 人åç¼å·ï¼äººåç¼å·ä» æ¯æåæ¯ææ°å */ @Max(value = 64,message = "人åç¼å·æå¤§é¿åº¦éå¶64") private String personCode; /** ééç¼ç å表ï¼å¯éè¿è®¾å¤ç®¡çæ¥å£ï¼è·åunitType为7çchannelsï¼ */ @Max(value = 500,message = "ééç¼ç å表æå¤§é¿åº¦éå¶500") private List<String> channelCodes; /** é¨é¨ID, é¨é¨é´", "åé */ private String deptIds; /** å¡å·ï¼åæ¯ææ°å */ @Max(value = 64,message = "å¡å·æå¤§é¿åº¦éå¶64") private String cardNumber; /** äºä»¶ç±»å, ä¸ä¼ -å ¨é¨, 1-è¿é¨, 2åºé¨, 3-è¿/åºé¨ */ private Integer enterOrExit; /** å¼é¨ç»æ, ä¸ä¼ -å ¨é¨, 1-æå, 0-失败 */ private Integer openResult; /** æ¯å¦è¶ 温 */ private Boolean overTemp; /** 使¸©ä½é */ private Double curTempStart; /** 使¸©é«é */ private Double curTempEnd; /** å£ç½©ç¶æ 3-带å£ç½©,2âæ²¡å¸¦å£ç½©,1-æªè¯å« */ private Integer maskState; /** 访客çéï¼1 - åªæ¥è¯¢è®¿å®¢è®°å½ 2 - åªæ¥è¯¢éè®¿å®¢è®°å½ */ private Integer visitorFilter; } ruoyi-common/src/main/java/com/ruoyi/common/utils/api/icc/model/GetResultPageResponse.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,89 @@ package com.ruoyi.common.utils.api.icc.model; import com.dahuatech.icc.oauth.http.IccResponse; import lombok.Data; import java.util.List; /** * program:java-sdk-demo * * @Author: 355079 * @Date:2024-04-29 14:21 * @Description: å页è·åèå¤ç»æè¯·æ±åæ° */ @Data public class GetResultPageResponse extends IccResponse { private Data data; @lombok.Data public static class Data{ /** å½å页 */ private Integer currentPage; /** æ¯é¡µæ¡æ° */ private Integer pageSize; /** æ»é¡µæ° */ private Integer totalPage; /** æ»æ¡æ° */ private Integer totalRows; /**æ¯å¦å¯ç¨äºæ°æ®åºï¼false-ä¸å¯ç¨ï¼true-å¯ç¨*/ private Boolean enableCloudDB; /** åé¡µæ°æ® */ private List<PageData> pageData; @lombok.Data public static class PageData{ /**主é®id*/ private Long id; /** å·å¡æ¶é´ï¼æ ¼å¼ï¼yyyy-MM-dd HH:mm:ss */ private String swingTime; /** 人åID */ private Long personId; /** 人åç¼å· ï¼è¥ä¸ºè®¿å®¢éè¡è®°å½ï¼åæ¯è®¿å®¢é¢çº¦è®°å½id */ private String personCode; /** 人åå§å */ private String personName; /** é¨é¨åç§° ,为空æ¶ä»£è¡¨è®°å½ä¸ºè®¿å®¢éè¡è®°å½ï¼é空代表å é¨äººåéè¡è®°å½ */ private String deptName; /** å¡å· */ private String cardNumber; /** å¡ç¶æï¼-1-空ç½å¡ï¼0-æ£å¸¸å¡ï¼1-æå¤±å¡ï¼2-注éå¡ */ private Integer cardStatus; /** å¡ç±»åï¼0-ICå¡, 1-ææºRFID, 2-CPUå¡ */ private Integer cardType; /** ééç¼ç */ private String channelCode; /** ééåç§° */ private String channelName; /** 设å¤ç¼ç */ private String deviceCode; /** 设å¤åç§° */ private String deviceName; /** è¿åºé¨ç±»åï¼1-è¿é¨, 2åºé¨, 3-è¿/åºé¨ */ private Integer enterOrExit; /** 1-å é¨äººå, 2-访客ï¼å é¨äººåæ¯å¨äººå管ç䏿·»å ç人åï¼è®¿å®¢æ¯å¨è®¿å®¢åç³»ç»ä¸å½å ¥ç访客 */ private Integer imageType; /** å¼é¨ç»æï¼0-失败ï¼1-æå */ private Integer openResult; /** å¼é¨ç±»åï¼è¯¦è§ å¼é¨ç±»å åå ¸ */ private Integer openType; /** è¯ä»¶å·ç ï¼ä¼è¿è¡è±æå¤ç */ private String paperNumber; /** æå¾ï¼ç¸å¯¹è·¯å¾ï¼å®æ´è®¿é®è·¯å¾åèOSSæ¹å¼ç»è£ */ private String recordImageUrl; /** æå¾ï¼ç»å¯¹è·¯å¾ï¼å ¼å®¹åå²çæ¬ï¼ä¸æ¨èä½¿ç¨ */ private String recordImage; /** å¼é¨å¤±è´¥åå */ private String remark; /** å ¥åºæ¶é´ï¼æ ¼å¼ï¼yyyy-MM-dd HH:mm:ss */ private String createTime; /** å£ç½©ç¶æ(3-带å£ç½©,2âæ²¡å¸¦å£ç½©,1-æªè¯å«) */ private Integer maskState; /** æ¯å¦è¶ 温 */ private Boolean overTemp; /** 使¸© */ private Double curTemp; } } }