瀏覽代碼

扫码开门

LIVE_YE 6 月之前
父節點
當前提交
1ba65c1c11

+ 63 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/camera/CameraController.java

@@ -6,7 +6,9 @@ import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.hksdk.HCNetSDK;
@@ -27,6 +29,8 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
+import static com.ruoyi.common.constant.CommonConstants.LOGIN_USER_SMS;
+
 /**
  * 安防管理Controller
  *
@@ -43,6 +47,8 @@ public class CameraController extends BaseController {
     private IEquipmentConfigurationService equipmentConfigurationService;
     @Autowired
     private IOpeningDoorRecordService openingDoorRecordService;
+    @Autowired
+    private RedisCache redisCache;
 
     /**
      * 查询安防设备列表
@@ -166,4 +172,61 @@ public class CameraController extends BaseController {
     }
 
 
+    /**
+     * 设备打开
+     */
+    @GetMapping("/yzm/openDz")
+    public AjaxResult yzmOpenDz(EquipmentConfiguration equipmentConfiguration) {
+        //验证码校验
+        Object cacheObject = redisCache.getCacheObject(LOGIN_USER_SMS + equipmentConfiguration.getPhoneNumber());
+        if(ObjectUtils.isNotEmpty(cacheObject) || !equipmentConfiguration.getCode().equals(cacheObject)){
+            throw new ServiceException("验证码错误");
+        }
+        redisCache.deleteObject(LOGIN_USER_SMS + equipmentConfiguration.getPhoneNumber());
+        equipmentConfiguration = equipmentConfigurationService.selectEquipmentConfigurationByEquipmentName(equipmentConfiguration.getEquipmentName());
+        if(StringUtils.isEmpty(equipmentConfiguration.getEquipmentName())){
+            return AjaxResult.error("设备列表暂无当前设备");
+        }
+
+        String ip = equipmentConfiguration.getEquipmentIp();
+        short prot = (short) Short.parseShort(equipmentConfiguration.getEquipmentPort());
+        String login = equipmentConfiguration.getLoginName();
+        String pwd = equipmentConfiguration.getLoginPwd();
+
+        int tdh = Alarm.login_V40( ip, prot, login, pwd);;  //登录设备
+        //Alarm.setAlarm();
+        String ret="起竿失败!";
+        try {
+            HCNetSDK.NET_DVR_BARRIERGATE_CFG cfg = new HCNetSDK.NET_DVR_BARRIERGATE_CFG();
+            // cfg.read();
+            cfg.dwChannel=tdh;  //通道号
+            cfg.dwSize=cfg.size(); //结构体大小
+            cfg.byLaneNo=1; //道闸号:0-表示无效值(设备需要做有效值判断),1-道闸1
+            cfg.byBarrierGateCtrl=1; // 控制参数:0-关闭道闸,1-开启道闸,2-停止道闸,3-锁定道闸
+            cfg.byRes[0]=0; //保留,置为0
+            //起竿操作
+            Pointer name = cfg.getPointer();
+            cfg.write();
+            boolean a=Alarm.controlsDz(tdh, 3128,  name, cfg.size());
+            if(a) {
+                ret="起竿成功!";
+            }else {
+                ret="起竿失败!"+Alarm.controlsDzError();
+                //失败重新布防, 可以不布防
+                //new HikVisionService().run();
+            }
+            System.out.println("开闸结果--"+a+"-- 提示内容:"+ret);
+            //保存记录
+            OpeningDoorRecord openingDoorRecord = new OpeningDoorRecord();
+            openingDoorRecord.setEntranceGuardName(equipmentConfiguration.getEquipmentName());
+            openingDoorRecord.setType("1");
+            openingDoorRecordService.insertOpeningDoorRecord(openingDoorRecord);
+            //注销用户
+            boolean b=Alarm.logout(tdh);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return AjaxResult.success(ret);
+    }
+
 }

+ 11 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/clock/ClockUserInfoController.java

@@ -3,6 +3,7 @@ package com.ruoyi.web.controller.clock;
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 
+import com.ruoyi.common.core.domain.entity.SysUser;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -76,6 +77,16 @@ public class ClockUserInfoController extends BaseController {
         return toAjax(clockUserInfoService.insertClockUserInfo(clockUserInfo));
     }
 
+    /**
+     * 新增打卡人员信息(从账号里获取)
+     */
+    @PreAuthorize("@ss.hasPermi('system:info:add:all')")
+    @Log(title = "打卡人员信息", businessType = BusinessType.INSERT)
+    @PostMapping("/add/all")
+    public AjaxResult addAll(@RequestBody List<SysUser> sysUserList) {
+        return toAjax(clockUserInfoService.insertClockUserInfoList(sysUserList));
+    }
+
     /**
      * 修改打卡人员信息
      */

+ 51 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/SendSmsController.java

@@ -0,0 +1,51 @@
+package com.ruoyi.web.controller.common;
+
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginBody;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.SendSmsUtils;
+import com.ruoyi.system.service.ISysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.concurrent.TimeUnit;
+
+import static com.ruoyi.common.constant.CommonConstants.OPEN_DOOR;
+
+
+/**
+ * @Author: tjf
+ * @Date: 2024/03/05 17:15
+ * @Describe:
+ */
+@RestController
+@RequestMapping("/sendSms")
+public class SendSmsController {
+    @Autowired
+    private RedisCache redisCache;
+    @Autowired
+    private ISysUserService sysUserService;
+
+
+    /**
+     * 开门验证码
+     *
+     * @return
+     */
+    @PostMapping("/sendRegisterSms")
+    @RepeatSubmit(interval = 1000, message = "请求过于频繁")
+    public AjaxResult sendRegisterSms(@RequestBody LoginBody user) {
+        String code = SendSmsUtils.getCode(4);
+        //手机号
+        String username = user.getUsername();
+        redisCache.setCacheObject(OPEN_DOOR + username, code, 5, TimeUnit.MINUTES);
+        String msg = SendSmsUtils.sendPassword(code, username);
+        System.out.println(username + "登录短信发送回复:" + msg);
+        return AjaxResult.success(msg);
+    }
+}

+ 11 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java

@@ -65,6 +65,17 @@ public class SysUserController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 获取用户列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:list:noPage')")
+    @GetMapping("/list/noPage")
+    public TableDataInfo listNoPage(SysUser user)
+    {
+        List<SysUser> list = userService.selectUserList(user);
+        return getDataTable(list);
+    }
+
     @Log(title = "用户管理", businessType = BusinessType.EXPORT)
     @PreAuthorize("@ss.hasPermi('system:user:export')")
     @PostMapping("/export")

+ 7 - 0
ruoyi-common/pom.xml

@@ -155,6 +155,13 @@
             <version>3.9.0</version>
         </dependency>
 
+        <!--阿里短信服务-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dysmsapi20170525</artifactId>
+            <version>2.0.24</version>
+        </dependency>
+
 
     </dependencies>
 

+ 62 - 0
ruoyi-common/src/main/java/com/ruoyi/common/constant/CommonConstants.java

@@ -0,0 +1,62 @@
+package com.ruoyi.common.constant;
+
+/**公共常量
+ * @Author: tjf
+ * @Date: 2023/2/23 15:01
+ * @Describe:
+ */
+public class CommonConstants {
+    //数字常量
+    public static final String ONE = "1";
+    public static final String TWO = "2";
+    public static final String THR = "3";
+    public static final String FOR = "4";
+    public static final String FIV = "5";
+    public static final String SIX = "6";
+    public static final String SEV = "7";
+    public static final String EIG = "8";
+    public static final String NIN = "9";
+    public static final String TEN = "10";
+    public static final String ELE = "11";
+    public static final String TWE = "12";
+    public static final String THI = "13";
+    public static final String FOU = "14";
+    public static final String FIF = "15";
+    public static final String YES = "是";
+    public static final String NO = "否";
+    public static final String FRONT = "front";
+    public static final String BACK = "back";
+    public static final String RZDB = "RZDB";
+    public static final String A = "a";
+    public static final String B = "b";
+    public static final String C = "c";
+    public static final String D = "d";
+    public static final String E = "e";
+    public static final String F = "f";
+    public static final String Y = "Y";
+
+    //角色权限
+    //超级管理员
+    public static final String  ADMIN= "admin";
+    //平台管理员
+    public static final String  MANAGE= "manage";
+
+    /**
+     * 短信登录验证码前缀
+     */
+    public static final String LOGIN_USER_SMS = "login_user_sms:";
+
+    /**
+     * 验证码开门
+     */
+    public static final String OPEN_DOOR = "open_door:";
+    /**
+     * 密码加密16位秘钥
+     */
+    public static final String LOGIN_PASSWORD_AES = "qwertyuiopasdfgh";
+    /**
+     * 百度ACCESS_TOKEN
+     */
+    public static final String BAI_DU_ACCESS_TOKEN = "BAI_DU_ACCESS_TOKEN:";
+
+}

+ 11 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java

@@ -90,6 +90,9 @@ public class SysUser extends BaseEntity
     private Long roleId;
     private Long[] userIds;
 
+    /** 是否新增为考勤人员(Y:是,N:否) */
+    private String isclock;
+
     public Long[] getUserIds() {
         return userIds;
     }
@@ -306,6 +309,14 @@ public class SysUser extends BaseEntity
         this.roleId = roleId;
     }
 
+    public String getIsclock() {
+        return isclock;
+    }
+
+    public void setIsclock(String isclock) {
+        this.isclock = isclock;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 10 - 2
ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java

@@ -153,13 +153,21 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
     }
 
     /**
-     * 计算相差天数
+     * 计算相差天数 转换成正整数
      */
     public static int differentDaysByMillisecond(Date date1, Date date2)
     {
         return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
     }
 
+    /**
+     * 计算相差天数 小于就返回负数
+     */
+    public static int differentDays(Date date1, Date date2)
+    {
+        return (int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24));
+    }
+
     /**
      * 计算时间差
      *
@@ -374,7 +382,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         try {
             Date date1 = sdf.parse(str1);
             Date date2 = sdf.parse(str2);
-            return differentDaysByMillisecond(date1, date2);
+            return differentDays(date1, date2);
         } catch (ParseException e) {
             e.printStackTrace();
             return 0;

+ 133 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/SendSmsUtils.java

@@ -0,0 +1,133 @@
+package com.ruoyi.common.utils;
+
+
+import com.aliyun.dysmsapi20170525.models.SendBatchSmsRequest;
+import com.aliyun.dysmsapi20170525.models.SendBatchSmsResponse;
+import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
+import com.aliyun.tea.TeaException;
+
+/**阿里云
+ * @author tjf
+ * @Date: 2021/07/15/10:21
+ */
+public class SendSmsUtils {
+    //阿里云ACCESS_KEY短信参数
+    static final String ACCESS_KEY_ID = "LTAI5tNA2fcBJH6EWRH6Pxr6";
+    static final String ACCESS_KEY_SECRET = "5WdaPEOvC3u9LC7pwy2DQ9pgmJvgUr";
+
+
+    //生成X位验证码
+    public static String getCode(Integer num) {
+        String[] codes = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
+        StringBuilder code = new StringBuilder();
+        for (int i = 0; i < num; i++) {
+            int j = (int) (Math.random() * 10);
+            if (j <= 0) {
+                j = 1;
+            }
+            code.append(codes[j - 1]);
+
+        }
+        return code.toString();
+    }
+
+    /**
+     * 使用AK&SK初始化账号Client
+     *
+     * @return Client
+     * @throws Exception
+     */
+    public static com.aliyun.dysmsapi20170525.Client createClient() throws Exception {
+        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
+        // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
+                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
+                .setAccessKeyId(ACCESS_KEY_ID)
+                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
+                .setAccessKeySecret(ACCESS_KEY_SECRET);
+        // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
+        config.endpoint = "dysmsapi.aliyuncs.com";
+        return new com.aliyun.dysmsapi20170525.Client(config);
+    }
+
+
+    /**
+     * 发送短信消息
+     *
+     * @return
+     */
+    public static String sendSms(String phone, String templateCode, String smsCode) {
+        String code = "";
+        try {
+            // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
+            com.aliyun.dysmsapi20170525.Client client = SendSmsUtils.createClient();
+
+            com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
+                    //手机号码
+                    .setPhoneNumbers(phone)
+                    //短信签名名称。潜山市皖源融资担保
+                    .setSignName("潜山市皖源融资担保")
+                    //短信模板变量对应的实际值{"name": code}
+                    .setTemplateParam(smsCode)
+                    //短信模板CODE
+                    .setTemplateCode(templateCode);
+            // 复制代码运行请自行打印 API 的返回值
+            SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, new com.aliyun.teautil.models.RuntimeOptions());
+            code = sendSmsResponse.getBody().code;
+        } catch (Exception _error) {
+        }
+        return code;
+    }
+
+    /**
+     * 阿里云批量发送 短信接口,一次最多100个手机号码
+     *
+     * @return
+     * @throws
+     */
+    public static SendBatchSmsResponse sendBatchSms(SendBatchSmsRequest sendBatchSmsRequest) {
+        try {
+            com.aliyun.dysmsapi20170525.Client client = SendSmsUtils.createClient();
+            com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
+            SendBatchSmsResponse sendBatchSmsResponse = client.sendBatchSmsWithOptions(sendBatchSmsRequest, runtime);
+            return sendBatchSmsResponse;
+            // 复制代码运行请自行打印 API 的返回值
+        } catch (TeaException error) {
+            // 如有需要,请打印 error
+            com.aliyun.teautil.Common.assertAsString(error.message);
+        } catch (Exception _error) {
+            TeaException error = new TeaException(_error.getMessage(), _error);
+            // 如有需要,请打印 error
+            com.aliyun.teautil.Common.assertAsString(error.message);
+        }
+        return null;
+    }
+
+    /**
+     * 发送注册的随机密码
+     *
+     * @return
+     */
+    public static String sendPassword(String code, String phone) {
+        try {
+            // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
+            com.aliyun.dysmsapi20170525.Client client = SendSmsUtils.createClient();
+            String smsCode = "{\"code\":\"" + code + "\"}";
+            com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
+                    //手机号码
+                    .setPhoneNumbers(phone)
+                    //短信签名名称。潜山市皖源融资担保
+                    .setSignName("潜山市皖源融资担保")
+                    //短信模板CODE
+                    .setTemplateCode("SMS_219525380")
+                    //短信模板变量对应的实际值{"name": code}
+                    .setTemplateParam(smsCode);
+            // 复制代码运行请自行打印 API 的返回值
+            SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, new com.aliyun.teautil.models.RuntimeOptions());
+            code = sendSmsResponse.getBody().code;
+        } catch (Exception _error) {
+        }
+        return code;
+    }
+}
+

+ 27 - 1
ruoyi-system/src/main/java/com/ruoyi/system/domain/EquipmentConfiguration.java

@@ -38,7 +38,33 @@ public class EquipmentConfiguration extends BaseEntity
     @Excel(name = "设备ip", readConverterExp = "映=射的外网ip")
     private String equipmentIp;
 
-    public void setEquipmentId(Long equipmentId) 
+    /**
+     * 验证码
+     */
+    private String code;
+
+    /**
+     * 手机号
+     */
+    private String phoneNumber;
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getPhoneNumber() {
+        return phoneNumber;
+    }
+
+    public void setPhoneNumber(String phoneNumber) {
+        this.phoneNumber = phoneNumber;
+    }
+
+    public void setEquipmentId(Long equipmentId)
     {
         this.equipmentId = equipmentId;
     }

+ 4 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IClockUserInfoService.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.service;
 
 import java.util.List;
+
+import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.system.domain.ClockUserInfo;
 
 /**
@@ -60,4 +62,6 @@ public interface IClockUserInfoService
     public int deleteClockUserInfoByUserId(Long userId);
 
     List<ClockUserInfo> selectClockUserInfoRecordList(ClockUserInfo clockUserInfo);
+
+    int insertClockUserInfoList(List<SysUser> sysUserList);
 }

+ 120 - 120
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClockRecordServiceImpl.java

@@ -7,6 +7,7 @@ import java.util.stream.Collectors;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.entity.SysRole;
 import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.PageUtils;
 import com.ruoyi.common.utils.SecurityUtils;
@@ -79,6 +80,11 @@ public class ClockRecordServiceImpl implements IClockRecordService {
     @Override
     public int insertClockRecord(ClockRecord clockRecord) {
         SysUser user = SecurityUtils.getLoginUser().getUser();
+        //判断当前人员是否能考勤
+        ClockUserInfo clockUserInfo = clockUserInfoMapper.selectClockUserInfoByUserId(user.getUserId());
+        if (clockUserInfo == null) {
+            throw new ServiceException("当前账号无法打卡");
+        }
         clockRecord.setUserId(user.getUserId());
         clockRecord.setUserName(user.getNickName());
         clockRecord.setPhonenumber(user.getPhonenumber());
@@ -138,7 +144,10 @@ public class ClockRecordServiceImpl implements IClockRecordService {
         resultMap.put("name", clockUserInfo.getUserName());
         //查询最新打卡数据
         ClockRecord clockRecordNew = clockRecordMapper.selectClockRecordNew(clockRecord);
-        resultMap.put("time", clockRecordNew.getRecordDate());
+        resultMap.put("time", "");
+        if (clockRecordNew != null) {
+            resultMap.put("time", clockRecordNew.getRecordDate());
+        }
         //todo 上下班时间
         DutySchedule dutySchedule = dutyScheduleMapper.selectDutyScheduleByDutyNew();
         resultMap.put("workTime", dutySchedule.getStartWorkTime() + " - " + dutySchedule.getEndWorkTime());
@@ -201,7 +210,7 @@ public class ClockRecordServiceImpl implements IClockRecordService {
         clockHoliday.setYear(DateUtils.getYear());
         clockHoliday.setHolidayDate(clockRecord.getRecordDate());
         List<ClockHolidays> clockHolidaysList = clockHolidaysMapper.selectClockHolidaysMonthList(clockHoliday);
-        if(clockHolidaysList==null || clockHolidaysList.size()<0){
+        if (clockHolidaysList == null || clockHolidaysList.size() < 0) {
             clockHolidaysList = new ArrayList<>();
         }
         //放假数据
@@ -224,6 +233,9 @@ public class ClockRecordServiceImpl implements IClockRecordService {
         ClockUserInfo clockUserInfo = new ClockUserInfo();
         clockUserInfo.setDelFlag("0");
         List<ClockUserInfo> clockUserInfoList = clockUserInfoMapper.selectClockUserInfoList(clockUserInfo);
+        if(clockUserInfoList!=null && clockUserInfoList.size()>0){
+            dkzs = clockUserInfoList.size();
+        }
         //已打卡人数
         int ydk = 0;
         //未打卡人数
@@ -347,7 +359,7 @@ public class ClockRecordServiceImpl implements IClockRecordService {
             clockRecord.setRecordDate(clockUserInfo.getRecordDate() + "-01");
             Map<String, Object> resultMap = statistics(clockRecord);
             resultMap.put("name", userInfo.getUserName());
-            resultMap.put("userId",userInfo.getUserId());
+            resultMap.put("userId", userInfo.getUserId());
             listMap.add(resultMap);
         }
         return listMap;
@@ -384,15 +396,14 @@ public class ClockRecordServiceImpl implements IClockRecordService {
         List<String> jjrList = new ArrayList<>();
         List<String> bbList = new ArrayList<>();
         for (ClockHolidays clockHolidays : clockHolidaysList) {
-            if("NO".equals(clockHolidays.getType())){
+            if ("NO".equals(clockHolidays.getType())) {
                 jjrList.add(clockHolidays.getHolidayDate());
-            }else{
+            } else {
                 bbList.add(clockHolidays.getHolidayDate());
             }
         }
 
 
-
         //查询传入两个日期的所有日期
         List<Date> dayList = DateUtils.getDatesBetween(clockRecord.getStartTime(), clockRecord.getEndTime());
         for (ClockUserInfo userInfo : clockUserInfoList) {
@@ -405,65 +416,58 @@ public class ClockRecordServiceImpl implements IClockRecordService {
             if (dayList.size() > 0) {
                 for (Date day : dayList) {
                     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
-                    boolean bl = (DateUtils.dayForWeek(format.format(day))==6 || DateUtils.dayForWeek(format.format(day))==7);
-                    if(jjrList.contains(format.format(day)) || (bl && !bbList.contains(format.format(day)))){
+                    boolean bl = (DateUtils.dayForWeek(format.format(day)) == 6 || DateUtils.dayForWeek(format.format(day)) == 7);
+                    if (jjrList.contains(format.format(day)) || (bl && !bbList.contains(format.format(day)))) {
                         continue;
                     }
                     List<ClockRecord> clockRecordList = clockTime.get(format.format(day));
-                    if(clockRecordList==null || clockRecordList.size()<=0){
+                    if (clockRecordList == null || clockRecordList.size() <= 0) {
                         wdk++;
-                    }else{
+                    } else {
                         boolean sw = false;
                         boolean xw = false;
                         boolean bcd = false;
                         boolean bzt = false;
                         boolean bwq = false;
-                        if ("1".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
-                            sw = true;
-                            if ("3".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
-                                bcd = true;
-                            }
-                            if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
-                                bwq = true;
-                            }
-                        }
-                        if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
-                            xw = true;
-                            if ("4".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
-                                bzt = true;
-                            }
-                            if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
-                                bwq = true;
-                            }
-                        }
-                        if ("1".equals(clockRecordList.get(0).getType())) {
+
+                        Map<String, List<ClockRecord>> typMap = clockRecordList.stream().collect(Collectors.groupingBy(ClockRecord::getType));
+                        if (typMap.containsKey("1")) {
+                            //排序,时间倒序
+                            List<ClockRecord> clockRecordTyp = typMap.get("1");
+                            clockRecordTyp = clockRecordTyp.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
+                            //上班卡取最后一条
                             sw = true;
-                            if ("3".equals(clockRecordList.get(0).getIsOutwork())) {
+                            if ("3".equals(clockRecordTyp.get(clockRecordTyp.size() - 1).getIsOutwork())) {
                                 bcd = true;
                             }
-                            if ("2".equals(clockRecordList.get(0).getIsOutwork())) {
+                            if ("2".equals(clockRecordTyp.get(clockRecordTyp.size() - 1).getIsOutwork())) {
                                 bwq = true;
                             }
                         }
-                        if ("2".equals(clockRecordList.get(0).getType())) {
+                        if (typMap.containsKey("2")) {
+                            //排序,时间倒序
+                            List<ClockRecord> clockRecordTyp = typMap.get("2");
+                            clockRecordTyp = clockRecordTyp.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
+                            //下班卡取最第一条
                             xw = true;
-                            if ("4".equals(clockRecordList.get(0).getIsOutwork())) {
+                            if ("4".equals(clockRecordTyp.get(0).getIsOutwork())) {
                                 bzt = true;
                             }
-                            if ("2".equals(clockRecordList.get(0).getIsOutwork())) {
+                            if ("2".equals(clockRecordTyp.get(0).getIsOutwork())) {
                                 bwq = true;
                             }
+
                         }
-                        if(!sw || !xw){
+                        if (!sw || !xw) {
                             wdk++;
                         }
-                        if(bcd){
+                        if (bcd) {
                             cd++;
                         }
-                        if(bzt){
+                        if (bzt) {
                             zt++;
                         }
-                        if(bwq){
+                        if (bwq) {
                             wq++;
                         }
                     }
@@ -482,7 +486,7 @@ public class ClockRecordServiceImpl implements IClockRecordService {
     public AjaxResult details(ClockRecord clockRecord) {
         List<Map<String, Object>> listMap = new ArrayList<>();
         //查询人员打卡数据
-        clockRecord.setRecordDate(clockRecord.getRecordDate()+"-01");
+        clockRecord.setRecordDate(clockRecord.getRecordDate() + "-01");
         List<ClockRecord> clockRecords = clockRecordMapper.selectOrderFoodListRl(clockRecord);
         //按日期分类
         Map<String, List<ClockRecord>> clockTime = new HashMap<>();
@@ -499,70 +503,69 @@ public class ClockRecordServiceImpl implements IClockRecordService {
         List<String> jjrList = new ArrayList<>();
         List<String> bbList = new ArrayList<>();
         for (ClockHolidays clockHolidays : clockHolidaysList) {
-            if("NO".equals(clockHolidays.getType())){
+            if ("NO".equals(clockHolidays.getType())) {
                 jjrList.add(clockHolidays.getHolidayDate());
-            }else{
+            } else {
                 bbList.add(clockHolidays.getHolidayDate());
             }
         }
         for (String day : dayList) {
             Map<String, Object> resultMap = new HashMap<>();
-            boolean bl = (DateUtils.dayForWeek(day)==6 || DateUtils.dayForWeek(day)==7);
-            if(jjrList.contains(day) || (bl && !bbList.contains(day))){
+            boolean bl = (DateUtils.dayForWeek(day) == 6 || DateUtils.dayForWeek(day) == 7);
+            if (jjrList.contains(day) || (bl && !bbList.contains(day))) {
                 continue;
             }
             List<ClockRecord> clockRecordList = clockTime.get(day);
-            if(clockRecordList==null || clockRecordList.size()<=0){
-                resultMap.put("time",day);
-                resultMap.put("details","全天未打卡");
+            if (clockRecordList == null || clockRecordList.size() <= 0) {
+                resultMap.put("time", day);
+                resultMap.put("details", "全天未打卡");
                 listMap.add(resultMap);
-            }else{
-                resultMap.put("time",day);
+            } else {
+                resultMap.put("time", day);
                 StringBuilder sb = new StringBuilder();
-                if(clockRecordList.size()>2){
-                    if ("1".equals(clockRecordList.get(0).getType())) {
-                        if ("3".equals(clockRecordList.get(0).getIsOutwork())) {
-                            sb.append("上午:迟到");
-                        }
-                        if ("2".equals(clockRecordList.get(0).getIsOutwork())) {
-                            sb.append("上午:外勤");
-                        }
+
+                Map<String, List<ClockRecord>> typMap = clockRecordList.stream().collect(Collectors.groupingBy(ClockRecord::getType));
+                if (typMap.containsKey("1")) {
+                    //排序,时间倒序
+                    List<ClockRecord> clockRecordTyp = typMap.get("1");
+                    clockRecordTyp = clockRecordTyp.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
+                    //上班卡取最后一条
+                    if ("3".equals(clockRecordTyp.get(clockRecordTyp.size() - 1).getIsOutwork())) {
+                        sb.append("上午:迟到");
                     }
-                    if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
-                        if ("4".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
-                            if(StringUtils.isNotEmpty(sb.toString())){
-                                sb.append(",");
-                            }
-                            sb.append("下午:早退");
-                        }
-                        if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
-                            if(StringUtils.isNotEmpty(sb.toString())){
-                                sb.append(",");
-                            }
-                            sb.append("下午:外勤");
-                        }
+                    if ("2".equals(clockRecordTyp.get(clockRecordTyp.size() - 1).getIsOutwork())) {
+                        sb.append("上午:外勤");
                     }
                 }else{
-                    if ("1".equals(clockRecordList.get(0).getType())) {
-                        if ("3".equals(clockRecordList.get(0).getIsOutwork())) {
-                            sb.append("上午:迟到").append(",");
-                        }
-                        if ("2".equals(clockRecordList.get(0).getIsOutwork())) {
-                            sb.append("上午:外勤").append(",");
+                    sb.append("上午:缺卡");
+                }
+
+                if (typMap.containsKey("2")) {
+                    //排序,时间倒序
+                    List<ClockRecord> clockRecordTyp = typMap.get("2");
+                    clockRecordTyp = clockRecordTyp.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
+                    //下班卡取最第一条
+                    if ("4".equals(clockRecordTyp.get(0).getIsOutwork())) {
+                        if(StringUtils.isNotEmpty(sb.toString())){
+                            sb.append(",");
                         }
-                        sb.append("下午:缺卡");
+                        sb.append("下午:早退");
                     }
-                    if ("2".equals(clockRecordList.get(0).getType())) {
-                        sb.append("上午:缺卡");
-                        if ("4".equals(clockRecordList.get(0).getIsOutwork())) {
-                            sb.append(",").append("下午:早退");
-                        }
-                        if ("2".equals(clockRecordList.get(0).getIsOutwork())) {
-                            sb.append(",").append("下午:外勤");
+                    if ("2".equals(clockRecordTyp.get(0).getIsOutwork())) {
+                        if(StringUtils.isNotEmpty(sb.toString())){
+                            sb.append(",");
                         }
+                        sb.append("下午:外勤");
+                    }
+
+                }else{
+                    if(StringUtils.isNotEmpty(sb.toString())){
+                        sb.append(",");
                     }
+                    sb.append("下午:缺卡");
                 }
-                resultMap.put("details",sb.toString());
+
+                resultMap.put("details", sb.toString());
                 listMap.add(resultMap);
             }
         }
@@ -618,73 +621,70 @@ public class ClockRecordServiceImpl implements IClockRecordService {
         List<String> jjrList = new ArrayList<>();
         List<String> bbList = new ArrayList<>();
         for (ClockHolidays clockHolidays : clockHolidaysList) {
-            if("NO".equals(clockHolidays.getType())){
+            if ("NO".equals(clockHolidays.getType())) {
                 jjrList.add(clockHolidays.getHolidayDate());
-            }else{
+            } else {
                 bbList.add(clockHolidays.getHolidayDate());
             }
         }
 
         for (String s : dayList) {
-            if(DateUtils.compare(s,DateUtils.getDate())<0){
+            if (DateUtils.compare(s, DateUtils.getDate()) < 0) {
                 continue;
             }
             //判断当天是否需要上班
-            boolean bl = (DateUtils.dayForWeek(s)==6 || DateUtils.dayForWeek(s)==7);
-            if(bbList.contains(s) || (!bl && !jjrList.contains(s))){
+            boolean bl = (DateUtils.dayForWeek(s) == 6 || DateUtils.dayForWeek(s) == 7);
+            if (bbList.contains(s) || (!bl && !jjrList.contains(s))) {
                 //需要要上班(当天不是双休并且不在节假日内,或者需要补班)
-                if(!clockTime.containsKey(s)){
-                    wdk = wdk+2;
+                if (!clockTime.containsKey(s)) {
+                    wdk = wdk + 2;
                     continue;
                 }
                 List<ClockRecord> clockRecordList = clockTime.get(s);
                 clockRecordList = clockRecordList.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
                 boolean sw = false;
                 boolean xw = false;
-                if ("1".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
+                boolean swwq = false;
+                boolean xwwq = false;
+                Map<String, List<ClockRecord>> typMap = clockRecordList.stream().collect(Collectors.groupingBy(ClockRecord::getType));
+                if (typMap.containsKey("1")) {
+                    //排序,时间倒序
+                    List<ClockRecord> clockRecordTyp = typMap.get("1");
+                    clockRecordTyp = clockRecordTyp.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
+                    //上班卡取最后一条
                     sw = true;
-                    if ("3".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
+                    if ("3".equals(clockRecordTyp.get(clockRecordTyp.size() - 1).getIsOutwork())) {
                         cd++;
                     }
-                    if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
-                        wq++;
+                    if ("2".equals(clockRecordTyp.get(clockRecordTyp.size() - 1).getIsOutwork())) {
+                        swwq = true;
                     }
                 }
-                if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
+                if (typMap.containsKey("2")) {
+                    //排序,时间倒序
+                    List<ClockRecord> clockRecordTyp = typMap.get("2");
+                    clockRecordTyp = clockRecordTyp.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
+                    //下班卡取最第一条
                     xw = true;
-                    if ("4".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
+                    if ("4".equals(clockRecordTyp.get(0).getIsOutwork())) {
                         zt++;
                     }
-                    if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
-                        wq++;
+                    if ("2".equals(clockRecordTyp.get(0).getIsOutwork())) {
+                        xwwq = true;
                     }
+
                 }
-                if ("1".equals(clockRecordList.get(0).getType())) {
-                    sw = true;
-                    if ("3".equals(clockRecordList.get(0).getIsOutwork())) {
-                        cd++;
-                    }
-                    if ("2".equals(clockRecordList.get(0).getIsOutwork())) {
-                        wq++;
-                    }
+                if (!sw || !xw) {
+                    wdk++;
                 }
-                if ("2".equals(clockRecordList.get(0).getType())) {
-                    xw = true;
-                    if ("4".equals(clockRecordList.get(0).getIsOutwork())) {
-                        zt++;
-                    }
-                    if ("2".equals(clockRecordList.get(0).getIsOutwork())) {
-                        wq++;
-                    }
+                if (swwq) {
+                    wq++;
                 }
-                if(!sw || !xw){
-                    wdk++;
+                if (xwwq) {
+                    wq++;
                 }
             }
         }
-        /*for (String key : clockTime.keySet()) {
-
-        }*/
         resultMap.put("cd", cd);
         resultMap.put("zt", zt);
         resultMap.put("wq", wq);

+ 25 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClockUserInfoServiceImpl.java

@@ -6,6 +6,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.domain.ClockRecord;
@@ -152,4 +153,28 @@ public class ClockUserInfoServiceImpl implements IClockUserInfoService
         }
         return clockUserList;
     }
+
+    @Override
+    public int insertClockUserInfoList(List<SysUser> sysUserList) {
+        int i = 0;
+        if(sysUserList.size()>0){
+            for (SysUser sysUser : sysUserList) {
+                //判断当前人员是否存在
+                ClockUserInfo clockUser = clockUserInfoMapper.selectClockUserInfoByUserId(sysUser.getUserId());
+                if(clockUser!=null){
+                    continue;
+                }
+                ClockUserInfo clockUserInfo = new ClockUserInfo();
+                clockUserInfo.setUserId(sysUser.getUserId());
+                clockUserInfo.setDeptId(sysUser.getDeptId());
+                clockUserInfo.setUserName(sysUser.getNickName());
+                clockUserInfo.setPhonenumber(sysUser.getPhonenumber());
+                clockUserInfo.setDelFlag("0");
+                clockUserInfo.setCreateTime(DateUtils.getNowDate());
+                clockUserInfo.setUpdateTime(DateUtils.getNowDate());
+                i = clockUserInfoMapper.insertClockUserInfo(clockUserInfo);
+            }
+        }
+        return i;
+    }
 }

+ 18 - 5
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

@@ -6,6 +6,9 @@ import java.util.stream.Collectors;
 import javax.validation.Validator;
 
 import com.ruoyi.common.core.domain.entity.SysUserVo;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.system.domain.ClockUserInfo;
+import com.ruoyi.system.mapper.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,11 +27,6 @@ import com.ruoyi.common.utils.spring.SpringUtils;
 import com.ruoyi.system.domain.SysPost;
 import com.ruoyi.system.domain.SysUserPost;
 import com.ruoyi.system.domain.SysUserRole;
-import com.ruoyi.system.mapper.SysPostMapper;
-import com.ruoyi.system.mapper.SysRoleMapper;
-import com.ruoyi.system.mapper.SysUserMapper;
-import com.ruoyi.system.mapper.SysUserPostMapper;
-import com.ruoyi.system.mapper.SysUserRoleMapper;
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysUserService;
 
@@ -63,6 +61,9 @@ public class SysUserServiceImpl implements ISysUserService
     @Autowired
     protected Validator validator;
 
+    @Autowired
+    private ClockUserInfoMapper clockUserInfoMapper;
+
     /**
      * 根据条件分页查询用户列表
      * 
@@ -274,6 +275,18 @@ public class SysUserServiceImpl implements ISysUserService
         insertUserPost(user);
         // 新增用户与角色管理
         insertUserRole(user);
+        //是否新增为考勤人员
+        if(StringUtils.isNotEmpty(user.getIsclock()) && "Y".equals(user.getIsclock())){
+            ClockUserInfo clockUserInfo = new ClockUserInfo();
+            clockUserInfo.setUserId(user.getUserId());
+            clockUserInfo.setDeptId(user.getDeptId());
+            clockUserInfo.setUserName(user.getNickName());
+            clockUserInfo.setPhonenumber(user.getPhonenumber());
+            clockUserInfo.setDelFlag("0");
+            clockUserInfo.setCreateTime(DateUtils.getNowDate());
+            clockUserInfo.setUpdateTime(DateUtils.getNowDate());
+            clockUserInfoMapper.insertClockUserInfo(clockUserInfo);
+        }
         return rows;
     }
 

+ 2 - 0
ruoyi-system/src/main/resources/mapper/system/ClockUserInfoMapper.xml

@@ -43,6 +43,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <insert id="insertClockUserInfo" parameterType="ClockUserInfo" useGeneratedKeys="true" keyProperty="userId">
         insert into clock_user_info
         <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
             <if test="deptId != null">dept_id,</if>
             <if test="deptName != null">dept_name,</if>
             <if test="userName != null and userName != ''">user_name,</if>
@@ -56,6 +57,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="remark != null">remark,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
             <if test="deptId != null">#{deptId},</if>
             <if test="deptName != null">#{deptName},</if>
             <if test="userName != null and userName != ''">#{userName},</if>