钉钉相关调整

This commit is contained in:
andy 2026-07-04 10:00:47 +08:00
parent 5f6fc4216b
commit ce60d0986f
15 changed files with 143 additions and 47 deletions

View File

@ -101,9 +101,11 @@ public class KQDeviceExchangeProcessor implements PunchTheClockStrategyExchangeP
//如果最后一条数据的卡类型为下班卡则返回上班卡和加班卡权限 or 检查当前人员是否存在特殊加班中 或者 检查当前人员部门是否开启加班 or 暂时取消这个判定 当天打过加班卡 ( || rzAttendanceDetailMapper.checkOverTimeCard(sysStaff.getUserId(), new Date()) > 0) //如果最后一条数据的卡类型为下班卡则返回上班卡和加班卡权限 or 检查当前人员是否存在特殊加班中 或者 检查当前人员部门是否开启加班 or 暂时取消这个判定 当天打过加班卡 ( || rzAttendanceDetailMapper.checkOverTimeCard(sysStaff.getUserId(), new Date()) > 0)
if(ObjectUtils.isNotEmpty(eqOverStaffMapper.selectEqOverStaffByUserId(sysStaff.getUserId())) || ObjectUtils.isEmpty(sysDeptMapper.selectOne(new LambdaQueryWrapper<SysDept>().eq(SysDept::getDeptId, sysStaff.getDeptId()).eq(SysDept::getIsOverTime,"1")))){ if(ObjectUtils.isNotEmpty(eqOverStaffMapper.selectEqOverStaffByUserId(sysStaff.getUserId())) || ObjectUtils.isEmpty(sysDeptMapper.selectOne(new LambdaQueryWrapper<SysDept>().eq(SysDept::getDeptId, sysStaff.getDeptId()).eq(SysDept::getIsOverTime,"1")))){
//如果存在特殊加班, 或者当前部门没有开启加班 或者当天打过加班, 则无法打加班卡 //如果存在特殊加班, 或者当前部门没有开启加班 或者当天打过加班, 则无法打加班卡
return initMessage(0,"验证通过", "111000000"); // return initMessage(0,"验证通过", "111000000");
return initMessage(0,"验证通过", "000000000");
} }
return initMessage(0,"验证通过", "111100000"); // return initMessage(0,"验证通过", "111100000");
return initMessage(0,"验证通过", "00100000");
}else{ }else{
return initMessage(0,"验证通过", "000011000"); return initMessage(0,"验证通过", "000011000");
} }
@ -211,11 +213,13 @@ public class KQDeviceExchangeProcessor implements PunchTheClockStrategyExchangeP
} }
public Boolean checkToDayCard(String userId, String rules, Date date){ public Boolean checkToDayCard(String userId, String rules, Date date){
return ObjectUtils.isNotEmpty(rzAttendanceDetailService.getOne(new LambdaQueryWrapper<RzAttendanceDetail>() //原位getOne, 修正钉钉打打卡后 会出现多条记录, 所以改为list
return ObjectUtils.isNotEmpty(rzAttendanceDetailService.list(new LambdaQueryWrapper<RzAttendanceDetail>()
.like(RzAttendanceDetail::getButtonType,"%"+rules+"%") .like(RzAttendanceDetail::getButtonType,"%"+rules+"%")
.eq(RzAttendanceDetail::getStaffId, Long.valueOf(userId)) .eq(RzAttendanceDetail::getStaffId, Long.valueOf(userId))
.eq(RzAttendanceDetail::getDelFlag, Constants.DELETE_FLAG_0) .eq(RzAttendanceDetail::getDelFlag, Constants.DELETE_FLAG_0)
.apply(" date_format(date_time,'%Y%m%d') = date_format({0},'%Y%m%d') ", date))); .apply(" date_format(date_time,'%Y%m%d') = date_format({0},'%Y%m%d') ", date)
.orderByDesc(RzAttendanceDetail::getCreateTime)));
} }

View File

@ -80,7 +80,7 @@ public class RzAttendanceDetailServiceImpl extends ServiceImpl<RzAttendanceDetai
//.apply( " DATE_FORMAT(date_time,'%Y%m%d') = DATE_FORMAT({0},'%Y%m%d')", date) //.apply( " DATE_FORMAT(date_time,'%Y%m%d') = DATE_FORMAT({0},'%Y%m%d')", date)
//以下为特殊规则, 只针对下班卡起作用 //以下为特殊规则, 只针对下班卡起作用
.orderByAsc("下班卡".equals(rules), RzAttendanceDetail::getDateTime) .orderByAsc("下班卡".equals(rules), RzAttendanceDetail::getDateTime)
.last("下班卡".equals(rules)," limit 1 ") .last(" limit 1 ")
); );
} }

View File

@ -30,6 +30,9 @@ import com.evo.system.mapper.SysDeptMapper;
import com.evo.system.mapper.SysStaffMapper; import com.evo.system.mapper.SysStaffMapper;
import com.evo.system.service.ISysStaffService; import com.evo.system.service.ISysStaffService;
import com.evo.wechat.service.SendClientService; import com.evo.wechat.service.SendClientService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
@ -146,6 +149,19 @@ public class RzAttendanceServiceImpl extends ServiceImpl<RzAttendanceMapper, RzA
*/ */
@Override @Override
public int attendenceCount() { public int attendenceCount() {
// Map<String, String> addressMap = ParamUtils.checkKqAddressCount();
// Map<String, Integer> resultMap = Collections.emptyMap();
// ObjectMapper mapper = new ObjectMapper();
// addressMap.keySet().stream().forEach(key -> {
// try {
// Map<String, String> limitMap = mapper.readValue(addressMap.get(key), new TypeReference<Map<String, String>>() {});
// limitMap.get()
// resultMap.put(key, getBaseMapper().attendenceCount())
// } catch (JsonProcessingException e) {
// throw new RuntimeException(e);
// }
// });
List<RzAttendance> list = getBaseMapper().attendenceCount(); List<RzAttendance> list = getBaseMapper().attendenceCount();
return list.size(); return list.size();
} }

View File

@ -7,6 +7,9 @@ import com.evo.attendance.service.IRzSysParamService;
import com.evo.personnelMatters.domain.RzHoliday; import com.evo.personnelMatters.domain.RzHoliday;
import com.evo.personnelMatters.service.IRzHolidayService; import com.evo.personnelMatters.service.IRzHolidayService;
import com.evo.system.service.ISysDictDataService; import com.evo.system.service.ISysDictDataService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -198,7 +201,16 @@ public class ParamUtils {
* @return * @return
*/ */
public static List<String> getTsDevSn(){ public static List<String> getTsDevSn(){
RzSysParam param= paramService.getRzSysParam("获取特殊类型的打卡机型号", "ts_device_sn","ET74336,ET74335","获取特殊类型的打卡机型号, 多个参数使用,隔开"); RzSysParam param= paramService.getRzSysParam("获取特殊类型的打卡机型号", "ts_device_sn","T71474,RT64815","获取特殊类型的打卡机型号, 多个参数使用,隔开");
return Collections.asList(param.getParamValue().split(","));
}
/***
* 获取餐厅设备信息
* @return
*/
public static List<String> getRestaurantDevSn(){
RzSysParam param= paramService.getRzSysParam("获取餐厅打卡机型号", "restaurant_device_sn","T71474,RT64815","获取餐厅打卡机型号, 多个参数使用,隔开");
return Collections.asList(param.getParamValue().split(",")); return Collections.asList(param.getParamValue().split(","));
} }
@ -217,6 +229,24 @@ public class ParamUtils {
if(StringUtils.isEmpty(rulesVal)) return false; if(StringUtils.isEmpty(rulesVal)) return false;
return Collections.asList(rulesVal.split(",")).contains(rules); return Collections.asList(rulesVal.split(",")).contains(rules);
} }
/***
* 检查各厂考勤人数
* sn 设备号
* rules 规则
* @return
*/
public static Map<String, String> checkKqAddressCount(){
try {
RzSysParam param= paramService.getRzSysParam("检查各厂考勤人数规则", "check_kq_address_count","{\"北厂\":\"{\"longScope\":\"123-456\",\"latScope\":\"123-456\"}\"}","特殊打卡机的打卡按钮规则, 使用json格式, 如果打卡机存在多个按钮规则用,分割");
String val = param.getParamValue();
ObjectMapper mapper = new ObjectMapper();
// 第一层外层 Map<String, String>
return mapper.readValue(param.getParamValue(), new TypeReference<Map<String, String>>() {});
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/*** /***
* 获取特殊加班的考勤规则 * 获取特殊加班的考勤规则
* sn 设备号 * sn 设备号

View File

@ -1,5 +1,6 @@
package com.evo.ding.processor.callback.impl; package com.evo.ding.processor.callback.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.dingtalk.api.response.OapiAttendanceGroupQueryResponse; import com.dingtalk.api.response.OapiAttendanceGroupQueryResponse;
import com.dingtalk.api.response.OapiAttendanceShiftQueryResponse; import com.dingtalk.api.response.OapiAttendanceShiftQueryResponse;
@ -45,6 +46,8 @@ public class DingCallBackGroupChangeExchangeProcessor implements DingCallBackExc
@Autowired @Autowired
DingShiftGroupService dingShiftGroupService; DingShiftGroupService dingShiftGroupService;
@Override @Override
public boolean accept(String eventType) { public boolean accept(String eventType) {
return EVENT_TYPE_ATTEND_GROUP_CHANGE.equals(eventType); return EVENT_TYPE_ATTEND_GROUP_CHANGE.equals(eventType);
@ -79,7 +82,7 @@ public class DingCallBackGroupChangeExchangeProcessor implements DingCallBackExc
for (Long shiftId : groupDetail.getShiftIds()) { for (Long shiftId : groupDetail.getShiftIds()) {
String strShiftId = String.valueOf(shiftId); String strShiftId = String.valueOf(shiftId);
if(map.containsKey(strShiftId)){ if(map.containsKey(strShiftId)){
DingShift dingShift = dingShiftService.selectByDingId(strShiftId); DingShift dingShift = dingShiftService.selectByDingIdEmptyCreate(strShiftId);
for (DingShiftGroup dingShiftGroup : map.get(strShiftId)){ for (DingShiftGroup dingShiftGroup : map.get(strShiftId)){
dingShiftGroup.setCheckTime(("OnDuty".equals(dingShiftGroup.getType()) ? dingShift.getOnDutyCheckTime() : dingShift.getOffDutyCheckTime())); dingShiftGroup.setCheckTime(("OnDuty".equals(dingShiftGroup.getType()) ? dingShift.getOnDutyCheckTime() : dingShift.getOffDutyCheckTime()));
dingShiftGroupService.updateById(dingShiftGroup); dingShiftGroupService.updateById(dingShiftGroup);
@ -97,7 +100,7 @@ public class DingCallBackGroupChangeExchangeProcessor implements DingCallBackExc
} }
} }
public void crateDingShiftGroup(String groupId, String shiftId){ public void crateDingShiftGroup(String groupId, String shiftId){
DingShift dingShift = dingShiftService.selectByDingId(shiftId); DingShift dingShift = dingShiftService.selectByDingIdEmptyCreate(shiftId);
//直接更新上班, 下班 //直接更新上班, 下班
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
DingShiftGroup dingShiftGroup = new DingShiftGroup(); DingShiftGroup dingShiftGroup = new DingShiftGroup();

View File

@ -18,5 +18,7 @@ public interface DingShiftService extends IService<DingShift> {
public DingShift selectByDingId(String dingId); public DingShift selectByDingId(String dingId);
public DingShift selectByDingIdEmptyCreate(String dingId);
public List<DingShift> selectList(DingShift dingShift); public List<DingShift> selectList(DingShift dingShift);
} }

View File

@ -1,12 +1,17 @@
package com.evo.ding.service.impl; package com.evo.ding.service.impl;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evo.common.utils.Collections;
import com.evo.ding.domain.DingShift; import com.evo.ding.domain.DingShift;
import com.evo.ding.domain.DingShiftGroup; import com.evo.ding.domain.DingShiftGroup;
import com.evo.ding.mapper.DingShiftGroupMapper; import com.evo.ding.mapper.DingShiftGroupMapper;
import com.evo.ding.mapper.DingShiftMapper; import com.evo.ding.mapper.DingShiftMapper;
import com.evo.ding.processor.callback.impl.DingCallBackShiftChangeExchangeProcessor;
import com.evo.ding.service.DingShiftGroupService; import com.evo.ding.service.DingShiftGroupService;
import com.evo.ding.service.DingShiftService; import com.evo.ding.service.DingShiftService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
@ -21,11 +26,24 @@ import java.util.List;
*/ */
@Service @Service
public class DingShiftServiceImpl extends ServiceImpl<DingShiftMapper, DingShift> implements DingShiftService { public class DingShiftServiceImpl extends ServiceImpl<DingShiftMapper, DingShift> implements DingShiftService {
@Autowired
@Lazy
DingCallBackShiftChangeExchangeProcessor dingCallBackShiftChangeExchangeProcessor;
@Override @Override
public DingShift selectByDingId(String dingId) { public DingShift selectByDingId(String dingId) {
return getBaseMapper().selectByDingId(dingId); return getBaseMapper().selectByDingId(dingId);
} }
@Override
public DingShift selectByDingIdEmptyCreate(String dingId) {
DingShift dingShift = getBaseMapper().selectByDingId(dingId);
if(dingShift == null){
dingCallBackShiftChangeExchangeProcessor.exchange(JSONObject.from(Collections.asMap("id", dingId)));
return selectByDingId(dingId);
}
return dingShift;
}
@Override @Override
public List<DingShift> selectList(DingShift dingShift) { public List<DingShift> selectList(DingShift dingShift) {
return getBaseMapper().selectList(dingShift); return getBaseMapper().selectList(dingShift);

View File

@ -2,6 +2,7 @@ package com.evo.equipment.service.impl;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.evo.common.utils.ParamUtils;
import com.evo.equipment.constant.Constants; import com.evo.equipment.constant.Constants;
import com.evo.common.core.domain.AjaxResult; import com.evo.common.core.domain.AjaxResult;
import com.evo.common.utils.DateUtils; import com.evo.common.utils.DateUtils;
@ -113,7 +114,7 @@ public class EqImagesServiceImpl implements IEqImagesService
//定义公共打卡机 //定义公共打卡机
List<String> dkj_list = new ArrayList<String>(); List<String> dkj_list = new ArrayList<String>();
dkj_list.add(Constants.EQ_DEVICE_CODE); //食堂 dkj_list.addAll(ParamUtils.getRestaurantDevSn()); //食堂
// dkj_list.add(Constants.EQ_DEVICE_PUBLIC_CODE); //公共 // dkj_list.add(Constants.EQ_DEVICE_PUBLIC_CODE); //公共
dkj_list.add(eqImages.getTimeClock()); dkj_list.add(eqImages.getTimeClock());
@ -265,7 +266,7 @@ public class EqImagesServiceImpl implements IEqImagesService
Row row = sheet.getRow(p); Row row = sheet.getRow(p);
if(StringUtils.isNotNull(row)){ if(StringUtils.isNotNull(row)){
dkj_list = new ArrayList<String>(); dkj_list = new ArrayList<String>();
dkj_list.add(Constants.EQ_DEVICE_CODE); //食堂 dkj_list.addAll(ParamUtils.getRestaurantDevSn()); //食堂
// dkj_list.add(Constants.EQ_DEVICE_PUBLIC_CODE); //公共 // dkj_list.add(Constants.EQ_DEVICE_PUBLIC_CODE); //公共
dkj_list.add(row.getCell(4).getStringCellValue()); dkj_list.add(row.getCell(4).getStringCellValue());
cau = new StaffDto(); cau = new StaffDto();

View File

@ -46,7 +46,7 @@ import java.util.stream.Collectors;
* @date 2024-08-07 * @date 2024-08-07
*/ */
@Service @Service
public class EqSnDetailServiceImpl extends ServiceImpl<EqSnDetailMapper, EqSnDetail> implements IEqSnDetailService, ApplicationRunner public class EqSnDetailServiceImpl extends ServiceImpl<EqSnDetailMapper, EqSnDetail> implements IEqSnDetailService
{ {
@Resource @Resource
private SysStaffMapper sysStaffMapper; private SysStaffMapper sysStaffMapper;
@ -118,8 +118,15 @@ public class EqSnDetailServiceImpl extends ServiceImpl<EqSnDetailMapper, EqSnDet
public EqSnDetail selectEqSnDetailBySn(String sn){ public EqSnDetail selectEqSnDetailBySn(String sn){
return getBaseMapper().selectEqSnDetailBySn(sn); return getBaseMapper().selectEqSnDetailBySn(sn);
} }
//com.evo.equipment.constant.Constants.EQ_DEVICE_PUBLIC_CODE, //com.evo.equipment.constant.Constants.EQ_DEVICE_PUBLIC_CODE, Collections.asList(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE)
static List<String> tsSn = Collections.asList(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE); static List<String> tsSn = Collections.emptyList();
public List<String> getTsSn(){
tsSn.clear();
tsSn.addAll(ParamUtils.getTsDevSn());
tsSn.addAll(ParamUtils.getRestaurantDevSn());
return tsSn;
}
private List<Map<String, String>> getPhoto(List<SysStaff> userList){ private List<Map<String, String>> getPhoto(List<SysStaff> userList){
List<Map<String, String>> userPhotoList = Collections.emptyList(); List<Map<String, String>> userPhotoList = Collections.emptyList();
@ -141,11 +148,12 @@ public class EqSnDetailServiceImpl extends ServiceImpl<EqSnDetailMapper, EqSnDet
public Map<String, List<Map<String, String>>> initTsDkDevice(String deviceSn){ public Map<String, List<Map<String, String>>> initTsDkDevice(String deviceSn){
Map<String, List<Map<String, String>>> snUserPhotoList = Collections.emptyMap(); Map<String, List<Map<String, String>>> snUserPhotoList = Collections.emptyMap();
//如果有且只有一个设备信息, 并且设备信息为公共打卡机, 或者是 食堂打卡机 //如果有且只有一个设备信息, 并且设备信息为公共打卡机, 或者是 食堂打卡机
if(tsSn.contains(deviceSn)) { if(getTsSn().contains(deviceSn)) {
List<Map<String, String>> userPhotoList = Collections.emptyList(); List<Map<String, String>> userPhotoList = Collections.emptyList();
List<SysStaff> userList = Collections.emptyList(); List<SysStaff> userList = Collections.emptyList();
//deviceSn.equals(com.evo.equipment.constant.Constants.EQ_DEVICE_PUBLIC_CODE) || //deviceSn.equals(com.evo.equipment.constant.Constants.EQ_DEVICE_PUBLIC_CODE) ||
if (deviceSn.equals(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE)) { //deviceSn.equals(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE)
if (ParamUtils.getRestaurantDevSn().contains(deviceSn)) {
//获取所有未删除的, 没有离职的员工信息 //获取所有未删除的, 没有离职的员工信息
userList = sysStaffMapper.selectList(new LambdaQueryWrapper<SysStaff>().eq(SysStaff::getDelFlag, Constants.DELETE_FLAG_0).ne(SysStaff::getStatus, Constants.JOB_STATIS_11).select(SysStaff::getUserId, SysStaff::getDeptId, SysStaff::getName)); userList = sysStaffMapper.selectList(new LambdaQueryWrapper<SysStaff>().eq(SysStaff::getDelFlag, Constants.DELETE_FLAG_0).ne(SysStaff::getStatus, Constants.JOB_STATIS_11).select(SysStaff::getUserId, SysStaff::getDeptId, SysStaff::getName));
} }
@ -154,8 +162,8 @@ public class EqSnDetailServiceImpl extends ServiceImpl<EqSnDetailMapper, EqSnDet
List<Long> userIds = eqOverStaffMapper.selectList(new LambdaQueryWrapper<EqOverStaff>().eq(EqOverStaff::getDelFlag, Constants.DELETE_FLAG_0).select(EqOverStaff::getUserId)).stream().map(EqOverStaff::getUserId).collect(Collectors.toList()); List<Long> userIds = eqOverStaffMapper.selectList(new LambdaQueryWrapper<EqOverStaff>().eq(EqOverStaff::getDelFlag, Constants.DELETE_FLAG_0).select(EqOverStaff::getUserId)).stream().map(EqOverStaff::getUserId).collect(Collectors.toList());
userList = sysStaffMapper.selectList((new LambdaQueryWrapper<SysStaff>().in(SysStaff::getUserId, userIds).eq(SysStaff::getDelFlag, Constants.DELETE_FLAG_0).ne(SysStaff::getStatus, Constants.JOB_STATIS_11).select(SysStaff::getUserId, SysStaff::getDeptId, SysStaff::getName))); userList = sysStaffMapper.selectList((new LambdaQueryWrapper<SysStaff>().in(SysStaff::getUserId, userIds).eq(SysStaff::getDelFlag, Constants.DELETE_FLAG_0).ne(SysStaff::getStatus, Constants.JOB_STATIS_11).select(SysStaff::getUserId, SysStaff::getDeptId, SysStaff::getName)));
} }
//如果是下发的食堂打卡机, 则需要查找餐饮人员的数据 //如果是下发的食堂打卡机, 则需要查找餐饮人员的数据 deviceSn.equals(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE)deviceSn.equals(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE)
if (deviceSn.equals(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE)) { if (ParamUtils.getRestaurantDevSn().contains(deviceSn)) {
List<RzRestaurantImages> list = rzRestaurantImagesMapper.selectList(new LambdaQueryWrapper<RzRestaurantImages>().eq(RzRestaurantImages::getDelFlag, Constants.DELETE_FLAG_0)); List<RzRestaurantImages> list = rzRestaurantImagesMapper.selectList(new LambdaQueryWrapper<RzRestaurantImages>().eq(RzRestaurantImages::getDelFlag, Constants.DELETE_FLAG_0));
for (RzRestaurantImages img : list) { for (RzRestaurantImages img : list) {
userPhotoList.add(Collections.asMap("userId", String.valueOf(img.getId()), "name", img.getName(), "photoUrl", img.getImageUrl(), "deptName", "实习生")); userPhotoList.add(Collections.asMap("userId", String.valueOf(img.getId()), "name", img.getName(), "photoUrl", img.getImageUrl(), "deptName", "实习生"));
@ -204,14 +212,14 @@ public class EqSnDetailServiceImpl extends ServiceImpl<EqSnDetailMapper, EqSnDet
Map<String, List<Map<String, String>>> snUserPhotoList = Collections.emptyMap(); Map<String, List<Map<String, String>>> snUserPhotoList = Collections.emptyMap();
if(Collections.isEmpty(userPhotoList)){ if(Collections.isEmpty(userPhotoList)){
//如果有且只有一个设备信息, 并且设备信息为公共打卡机, 或者是 食堂打卡机 //如果有且只有一个设备信息, 并且设备信息为公共打卡机, 或者是 食堂打卡机
if(snList.size() ==1 && tsSn.contains(snList.get(0))){ if(snList.size() ==1 && getTsSn().contains(snList.get(0))){
snUserPhotoList.putAll(initTsDkDevice(snList.get(0))); snUserPhotoList.putAll(initTsDkDevice(snList.get(0)));
}else{ }else{
List<String> allSnList = new ArrayList<String>(){{addAll(snList);}}; List<String> allSnList = new ArrayList<String>(){{addAll(snList);}};
List<String> tsDeviceSn = Collections.findDuplicatesList(allSnList, tsSn); List<String> tsDeviceSn = Collections.findDuplicatesList(allSnList, getTsSn());
//所有所有不是特殊打卡机人员信息 //所有所有不是特殊打卡机人员信息
snList.remove(tsDeviceSn); snList.remove(tsDeviceSn);
snList.stream().filter(sn-> !tsSn.contains(sn)).forEach(sn ->{ snList.stream().filter(sn-> !getTsSn().contains(sn)).forEach(sn ->{
//获取所有未删除的, 没有离职的员工信息 //获取所有未删除的, 没有离职的员工信息
List<SysStaff> userList = sysStaffMapper.selectList((new LambdaQueryWrapper<SysStaff>().like(SysStaff::getTimeClock, sn).eq(SysStaff::getDelFlag, Constants.DELETE_FLAG_0).ne(SysStaff::getStatus,Constants.JOB_STATIS_11).select(SysStaff::getUserId, SysStaff::getDeptId, SysStaff::getName))); List<SysStaff> userList = sysStaffMapper.selectList((new LambdaQueryWrapper<SysStaff>().like(SysStaff::getTimeClock, sn).eq(SysStaff::getDelFlag, Constants.DELETE_FLAG_0).ne(SysStaff::getStatus,Constants.JOB_STATIS_11).select(SysStaff::getUserId, SysStaff::getDeptId, SysStaff::getName)));
snUserPhotoList.put(sn, getPhoto(userList)); snUserPhotoList.put(sn, getPhoto(userList));
@ -304,8 +312,10 @@ public class EqSnDetailServiceImpl extends ServiceImpl<EqSnDetailMapper, EqSnDet
update(new UpdateWrapper<EqSnDetail>().set("type","连接已断开").set("session_id","").eq( "session_id", sessionId)); update(new UpdateWrapper<EqSnDetail>().set("type","连接已断开").set("session_id","").eq( "session_id", sessionId));
} }
@Override //
public void run(ApplicationArguments args) throws Exception { // @Override
tsSn.addAll(ParamUtils.getTsDevSn()); // public void run(ApplicationArguments args) throws Exception {
} // tsSn.addAll(ParamUtils.getTsDevSn());
// tsSn.addAll(ParamUtils.getRestaurantDevSn());
// }
} }

View File

@ -54,6 +54,8 @@ public class RzRestaurantDetail extends BaseEntity
/** 删除标记 */ /** 删除标记 */
private String delFlag; private String delFlag;
private String deviceSn;
@Override @Override
public String toString() { public String toString() {

View File

@ -83,7 +83,6 @@ public class RzRestaurantDetailServiceImpl extends ServiceImpl<RzRestaurantDetai
@Override @Override
public String insertRzRestaurantDetail(String json) public String insertRzRestaurantDetail(String json)
{ {
System.out.println(json.toString());
//需要返回的对象 //需要返回的对象
RestaurantVo cfiv = new RestaurantVo(); RestaurantVo cfiv = new RestaurantVo();
RestaurantData cfd = new RestaurantData(); RestaurantData cfd = new RestaurantData();
@ -98,7 +97,6 @@ public class RzRestaurantDetailServiceImpl extends ServiceImpl<RzRestaurantDetai
if(!ParamUtils.getCanteenOpenHour().contains(hour)){ if(!ParamUtils.getCanteenOpenHour().contains(hour)){
cfiv.setResult(2); cfiv.setResult(2);
cfiv.setMsg("不在打卡时间内"); cfiv.setMsg("不在打卡时间内");
System.out.println(JSONObject.toJSONString(cfiv));
return JSONObject.toJSONString(cfiv); return JSONObject.toJSONString(cfiv);
} }
@ -132,6 +130,7 @@ public class RzRestaurantDetailServiceImpl extends ServiceImpl<RzRestaurantDetai
RzRestaurantStatistics restaurantStatistics = rzRestaurantStatisticsMapper.selectRzRestaurantStatisticsByUserIdAndDate(Long.valueOf(userId),new Date()); RzRestaurantStatistics restaurantStatistics = rzRestaurantStatisticsMapper.selectRzRestaurantStatisticsByUserIdAndDate(Long.valueOf(userId),new Date());
//增加打卡记录 //增加打卡记录
RzRestaurantDetail cyFaceInfo = new RzRestaurantDetail(); RzRestaurantDetail cyFaceInfo = new RzRestaurantDetail();
cyFaceInfo.setDeviceSn(jsonObject.getString("sn"));
cyFaceInfo.setDate(new Date()); cyFaceInfo.setDate(new Date());
cyFaceInfo.setStaffId(restaurantStatistics.getStaffId()); cyFaceInfo.setStaffId(restaurantStatistics.getStaffId());
cyFaceInfo.setName(restaurantStatistics.getName()); cyFaceInfo.setName(restaurantStatistics.getName());

View File

@ -5,10 +5,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evo.common.constant.Constants; import com.evo.common.constant.Constants;
import com.evo.common.core.domain.AjaxResult; import com.evo.common.core.domain.AjaxResult;
import com.evo.common.core.domain.entity.RzUpload; import com.evo.common.core.domain.entity.RzUpload;
import com.evo.common.utils.Collections; import com.evo.common.utils.*;
import com.evo.common.utils.DateUtils;
import com.evo.common.utils.SecurityUtils;
import com.evo.common.utils.StringUtils;
import com.evo.common.utils.file.FileUploadUtils; import com.evo.common.utils.file.FileUploadUtils;
import com.evo.equipment.domain.vo.StaffData; import com.evo.equipment.domain.vo.StaffData;
import com.evo.equipment.domain.vo.StaffDto; import com.evo.equipment.domain.vo.StaffDto;
@ -22,6 +19,7 @@ import com.evo.restaurant.service.IRzRestaurantImagesService;
import com.evo.restaurant.service.IRzRestaurantStatisticsService; import com.evo.restaurant.service.IRzRestaurantStatisticsService;
import com.evo.system.service.RzUploadService; import com.evo.system.service.RzUploadService;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -45,6 +43,9 @@ public class RzRestaurantImagesServiceImpl extends ServiceImpl<RzRestaurantImage
private IEqSnDetailService eqSnDetailService;//餐饮统计 private IEqSnDetailService eqSnDetailService;//餐饮统计
@Resource @Resource
private RzUploadService rzUploadService;//文件上传 private RzUploadService rzUploadService;//文件上传
@Autowired
private ParamUtils paramUtils;
/** /**
* 查询餐饮照片管理列表 * 查询餐饮照片管理列表
* *
@ -68,8 +69,7 @@ public class RzRestaurantImagesServiceImpl extends ServiceImpl<RzRestaurantImage
{ {
//根据id查询信息 //根据id查询信息
RzRestaurantImages rzRestaurantImages = getBaseMapper().selectRzRestaurantImagesById(id); RzRestaurantImages rzRestaurantImages = getBaseMapper().selectRzRestaurantImagesById(id);
//删除打卡机照片
String message = "";
//需要返回的对象 //需要返回的对象
StaffDto cau = new StaffDto(); StaffDto cau = new StaffDto();
//发送的数据 //发送的数据
@ -78,8 +78,6 @@ public class RzRestaurantImagesServiceImpl extends ServiceImpl<RzRestaurantImage
cau.setCmd("to_device"); cau.setCmd("to_device");
//无用值空串 //无用值空串
cau.setForm(""); cau.setForm("");
//设备号
cau.setTo(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE);
//给服务端预留的补充字段设备端不处理这个字段内容设备在响应这条指令时原样返回 //给服务端预留的补充字段设备端不处理这个字段内容设备在响应这条指令时原样返回
cau.setExtra(""); cau.setExtra("");
//发送的数据 //发送的数据
@ -88,7 +86,12 @@ public class RzRestaurantImagesServiceImpl extends ServiceImpl<RzRestaurantImage
caud.setUser_id(id+""); caud.setUser_id(id+"");
cau.setData(caud); cau.setData(caud);
//调用websocket推送给设备 //调用websocket推送给设备
WebSocketUsers.sendMessageToUsersByText(JSONObject.toJSONString(cau)); ParamUtils.getRestaurantDevSn().stream().forEach(deviceNo ->{
//设备号 com.evo.equipment.constant.Constants.EQ_DEVICE_CODE
cau.setTo(deviceNo);
WebSocketUsers.sendMessageToUsersByText(JSONObject.toJSONString(cau));
});
//删除照片 //删除照片
String img_name = rzRestaurantImages.getImageUrl().substring(rzRestaurantImages.getImageUrl().lastIndexOf("/")+1); String img_name = rzRestaurantImages.getImageUrl().substring(rzRestaurantImages.getImageUrl().lastIndexOf("/")+1);
File file = new File(com.evo.equipment.constant.Constants.STAFF_IMAGE_ADDRESS + img_name); File file = new File(com.evo.equipment.constant.Constants.STAFF_IMAGE_ADDRESS + img_name);
@ -134,7 +137,7 @@ public class RzRestaurantImagesServiceImpl extends ServiceImpl<RzRestaurantImage
log.error("处理上传照片信息出现错误", e); log.error("处理上传照片信息出现错误", e);
} }
//下发照片 //下发照片
eqSnDetailService.sendPhoto(Collections.asList(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE), eqSnDetailService.sendPhoto(Collections.asList(ParamUtils.getRestaurantDevSn()),
Collections.asList(Collections.asMap("userId", String.valueOf(rzRestaurantImages.getId()), Collections.asList(Collections.asMap("userId", String.valueOf(rzRestaurantImages.getId()),
"name", rzRestaurantImages.getName(), "photoUrl", rzRestaurantImages.getImageUrl()))); "name", rzRestaurantImages.getName(), "photoUrl", rzRestaurantImages.getImageUrl())));
} }

View File

@ -166,12 +166,12 @@ public class SysStaffServiceImpl extends ServiceImpl<SysStaffMapper, SysStaff> i
if(CollectionUtils.isNotEmpty(sysStaff.getTimeClockList())){ if(CollectionUtils.isNotEmpty(sysStaff.getTimeClockList())){
sysStaff.setTimeClock(sysStaff.getTimeClockList().stream().collect(Collectors.joining(","))); sysStaff.setTimeClock(sysStaff.getTimeClockList().stream().collect(Collectors.joining(",")));
} }
//新增员工信息到金蝶 // //新增员工信息到金蝶
if(StringUtils.isNotEmpty(sysStaff.getJobCode())){ // if(StringUtils.isNotEmpty(sysStaff.getJobCode())){
sysStaff.setExtended(KingdeeRequestUtils.employeeSave(Collections.asMap("userName", sysStaff.getName(), "userCode", sysStaff.getCode(), "jobCode", sysStaff.getJobCode().split("_")[0],"deptCode", sysStaff.getJobCode().split("_")[1]))); // sysStaff.setExtended(KingdeeRequestUtils.employeeSave(Collections.asMap("userName", sysStaff.getName(), "userCode", sysStaff.getCode(), "jobCode", sysStaff.getJobCode().split("_")[0],"deptCode", sysStaff.getJobCode().split("_")[1])));
}else if(StringUtils.isEmpty(sysStaff.getJobCode())){ // }else if(StringUtils.isEmpty(sysStaff.getJobCode())){
sysStaff.setExtended(KingdeeRequestUtils.employeeSaveEmptyJob(Collections.asMap("userName", sysStaff.getName(), "userCode", sysStaff.getCode()))); // sysStaff.setExtended(KingdeeRequestUtils.employeeSaveEmptyJob(Collections.asMap("userName", sysStaff.getName(), "userCode", sysStaff.getCode())));
} // }
int i = getBaseMapper().insertSysStaff(sysStaff); int i = getBaseMapper().insertSysStaff(sysStaff);
if(i < 1){ if(i < 1){
@ -281,13 +281,19 @@ public class SysStaffServiceImpl extends ServiceImpl<SysStaffMapper, SysStaff> i
//不为空, 准备下发 //不为空, 准备下发
if(upload != null){ if(upload != null){
List<String> dkj_list = new ArrayList<String>(); List<String> dkj_list = new ArrayList<String>();
dkj_list.add(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE); //食堂 dkj_list.addAll(ParamUtils.getRestaurantDevSn()); //食堂
// dkj_list.add(com.evo.equipment.constant.Constants.EQ_DEVICE_PUBLIC_CODE); //公共 // dkj_list.add(com.evo.equipment.constant.Constants.EQ_DEVICE_PUBLIC_CODE); //公共
dkj_list.addAll(sysStaff.getTimeClockList()); if(Collections.isNotEmpty(sysStaff.getTimeClockList())){
dkj_list.addAll(sysStaff.getTimeClockList());
}
// dkj_list.add(sysStaff.getTimeClockList().get(1)); // dkj_list.add(sysStaff.getTimeClockList().get(1));
//下发照片 //下发照片
SysDept sysDept = deptMapper.selectDeptById(sysStaff.getDeptId()); SysDept sysDept = deptMapper.selectDeptById(sysStaff.getDeptId());
eqSnDetailService.sendPhoto(dkj_list, Collections.asList(Collections.asMap("userId", String.valueOf(sysStaff.getUserId()), "name", sysStaff.getName(), "photoUrl", ParamUtils.getGlobalStaticUrl()+upload.getFileName(), "deptName", sysDept.getDeptName()))); try {
eqSnDetailService.sendPhoto(dkj_list, Collections.asList(Collections.asMap("userId", String.valueOf(sysStaff.getUserId()), "name", sysStaff.getName(), "photoUrl", ParamUtils.getGlobalStaticUrl()+upload.getFileName(), "deptName", sysDept.getDeptName())));
} catch (Exception e) {
throw new RuntimeException("员工新增成功, 但是照片下发失败了,请截图联系管理员: 直白原因: "+ e.getMessage());
}
} }
} }

View File

@ -32,7 +32,7 @@ spring:
druid: druid:
# 主库数据源 # 主库数据源
master: master:
url: jdbc:mysql://localhost:3306/evo_cw_dev_ding?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:mysql://localhost:3306/evo_cw_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root username: root
password: hbyt123456 password: hbyt123456
#username: root #username: root

View File

@ -20,7 +20,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap> </resultMap>
<sql id="selectRzRestaurantDetailVo"> <sql id="selectRzRestaurantDetailVo">
select id, staff_id,name, date, time, sign, del_flag, create_by, create_time, update_by, update_time from rz_restaurant_detail select id, staff_id,name, date, time, sign, del_flag, device_sn, create_by, create_time, update_by, update_time from rz_restaurant_detail
</sql> </sql>
<select id="selectRzRestaurantDetailList" parameterType="RzRestaurantDetail" resultMap="RzRestaurantDetailResult"> <select id="selectRzRestaurantDetailList" parameterType="RzRestaurantDetail" resultMap="RzRestaurantDetailResult">
@ -57,6 +57,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="time != null">time,</if> <if test="time != null">time,</if>
<if test="sign != null">sign,</if> <if test="sign != null">sign,</if>
<if test="delFlag != null">del_flag,</if> <if test="delFlag != null">del_flag,</if>
<if test="deviceSn != null">device_sn,</if>
<if test="createBy != null">create_by,</if> <if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if> <if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if> <if test="updateBy != null">update_by,</if>
@ -69,6 +70,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="time != null">#{time},</if> <if test="time != null">#{time},</if>
<if test="sign != null">#{sign},</if> <if test="sign != null">#{sign},</if>
<if test="delFlag != null">#{delFlag},</if> <if test="delFlag != null">#{delFlag},</if>
<if test="deviceSn != null">#{deviceSn},</if>
<if test="createBy != null">#{createBy},</if> <if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if> <if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if> <if test="updateBy != null">#{updateBy},</if>