From cecfb60e71512c1460fffa713804d2461ef6d4b2 Mon Sep 17 00:00:00 2001 From: lcj <2331845269@qq.com> Date: Thu, 16 Oct 2025 17:55:48 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E9=83=A8=E9=97=A8=E5=85=B3?= =?UTF-8?q?=E8=81=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.yml | 1 + .../src/main/resources/application-prod.yml | 3 +- .../job/cycle/IncSyncYs7DeviceData.java | 4 +- .../DeviceWebSocketServer.java | 5 ++- .../project/domain/BusProjectDept.java | 29 +++++++++++++ .../dto/project/BusProjectCreateReq.java | 6 +++ .../dto/project/BusProjectQueryReq.java | 5 +++ .../domain/vo/project/BusProjectVo.java | 6 +++ .../project/mapper/BusProjectDeptMapper.java | 14 +++++++ .../service/IBusProjectDeptService.java | 13 ++++++ .../BusAttendanceMachineUserServiceImpl.java | 12 ++++-- .../impl/BusProjectDeptServiceImpl.java | 20 +++++++++ .../service/impl/BusProjectServiceImpl.java | 41 ++++++++++++++++++- .../mapper/project/BusProjectDeptMapper.xml | 7 ++++ 14 files changed, 157 insertions(+), 9 deletions(-) create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusProjectDept.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/BusProjectDeptMapper.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectDeptService.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectDeptServiceImpl.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/BusProjectDeptMapper.xml diff --git a/xinnengyuan/ruoyi-admin/src/main/resources/application-dev.yml b/xinnengyuan/ruoyi-admin/src/main/resources/application-dev.yml index 4514f562..c9346ea9 100644 --- a/xinnengyuan/ruoyi-admin/src/main/resources/application-dev.yml +++ b/xinnengyuan/ruoyi-admin/src/main/resources/application-dev.yml @@ -324,6 +324,7 @@ ys7: app-secret: 09e29c70ae1161fbc3ce2030fc09ba2e job: capture-enabled: false # 控制是否启用萤石抓拍任务 + device-sync-enabled: false # 控制是否同步萤石设备 #ys7: # app-key: 081b0d6d5f7f4de8bc5c7fa350fb26ec # app-secret: caa37b9f60ef02deb57e563bc190e6db diff --git a/xinnengyuan/ruoyi-admin/src/main/resources/application-prod.yml b/xinnengyuan/ruoyi-admin/src/main/resources/application-prod.yml index 0650b550..40d0586e 100644 --- a/xinnengyuan/ruoyi-admin/src/main/resources/application-prod.yml +++ b/xinnengyuan/ruoyi-admin/src/main/resources/application-prod.yml @@ -321,12 +321,13 @@ weather: api-host: n35rk53njv.re.qweatherapi.com # dxf转 geojson 执行文件名 dxf2GeoJson: - file-name: main.exe + file-name: main ys7: app-key: 3acf9f1a43dc4209841e0893003db0a2 app-secret: 09e29c70ae1161fbc3ce2030fc09ba2e job: capture-enabled: true # 控制是否启用萤石抓拍任务 + device-sync-enabled: true # 控制是否同步萤石设备 # 斯巴达算法 sparta: url: http://119.3.204.120:8040 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncYs7DeviceData.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncYs7DeviceData.java index 8a98faaf..8d279aae 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncYs7DeviceData.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncYs7DeviceData.java @@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.manager.ys7manager.Ys7Manager; import org.dromara.manager.ys7manager.vo.Ys7QueryDeviceResponseVo; import org.dromara.other.service.IOthYs7DeviceService; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -17,7 +18,8 @@ import java.util.List; * @date 2025/6/17 9:33 */ @Slf4j -//@Component +@Component +@ConditionalOnProperty(prefix = "ys7.job", name = "device-sync-enabled", havingValue = "true") public class IncSyncYs7DeviceData { @Resource diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/mobileAttendanceMachine/DeviceWebSocketServer.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/mobileAttendanceMachine/DeviceWebSocketServer.java index 17581e9c..fc345d92 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/mobileAttendanceMachine/DeviceWebSocketServer.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/mobileAttendanceMachine/DeviceWebSocketServer.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.websocket.*; import jakarta.websocket.server.ServerEndpoint; import lombok.extern.log4j.Log4j2; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.SpringUtils; import org.dromara.project.service.IBusAttendanceMachineService; import org.springframework.stereotype.Component; @@ -466,7 +467,8 @@ public class DeviceWebSocketServer { // 2. 发送请求 boolean sendSuccess = sendMessageToDevice(sn, uuid, payload); if (!sendSuccess) { - throw new Exception("发送请求失败,设备不在线或连接异常,SN: " + sn); + log.error("发送请求失败,设备不在线或连接异常,SN: {}", sn); + throw new ServiceException("发送请求失败,设备不在线或连接异常,SN: " + sn); } // 3. 等待响应(10秒超时) @@ -475,6 +477,7 @@ public class DeviceWebSocketServer { log.error("等待响应超时,SN: {},UUID: {}", sn, uuid); responseChannels.remove(uuid); snToUuids.get(sn).remove(uuid); + log.error("等待响应超时(10秒),SN: {}", sn, e); throw new Exception("等待响应超时(10秒),SN: " + sn, e); } finally { // 4. 清理响应通道(防止内存泄漏) diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusProjectDept.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusProjectDept.java new file mode 100644 index 00000000..5ca44d4b --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusProjectDept.java @@ -0,0 +1,29 @@ +package org.dromara.project.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 项目与部门关联对象 bus_project_dept + * + * @author lilemy + * @date 2025-10-16 + */ +@Data +@TableName("bus_project_dept") +public class BusProjectDept { + + /** + * 项目ID + */ + @TableId(type = IdType.INPUT) + private Long projectId; + + /** + * 部门ID + */ + private Long deptId; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectCreateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectCreateReq.java index e2fd6f3b..8d83f563 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectCreateReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectCreateReq.java @@ -4,6 +4,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; +import java.util.List; /** * @author lilemy @@ -134,4 +135,9 @@ public class BusProjectCreateReq implements Serializable { * 位置信息 */ private String position; + + /** + * 所属部门列表 + */ + private List deptIds; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectQueryReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectQueryReq.java index fef23ae5..e94f7b89 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectQueryReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectQueryReq.java @@ -69,4 +69,9 @@ public class BusProjectQueryReq implements Serializable { * 显示隐藏(0显示 1隐藏) */ private String showHidden; + + /** + * 部门id + */ + private Long deptId; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectVo.java index f0240958..556c29af 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectVo.java @@ -8,6 +8,7 @@ import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import org.dromara.project.domain.BusProject; import org.dromara.project.domain.bo.Punchrange; +import org.dromara.system.domain.vo.SysDeptVo; import java.io.Serial; import java.io.Serializable; @@ -212,4 +213,9 @@ public class BusProjectVo implements Serializable { private String position; + /** + * 所属部门 + */ + private List deptList; + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/BusProjectDeptMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/BusProjectDeptMapper.java new file mode 100644 index 00000000..eddb2bbd --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/BusProjectDeptMapper.java @@ -0,0 +1,14 @@ +package org.dromara.project.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.project.domain.BusProjectDept; + +/** + * 项目与部门关联Mapper接口 + * + * @author lilemy + * @date 2025-10-16 + */ +public interface BusProjectDeptMapper extends BaseMapperPlus { + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectDeptService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectDeptService.java new file mode 100644 index 00000000..28fcd4ba --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectDeptService.java @@ -0,0 +1,13 @@ +package org.dromara.project.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.dromara.project.domain.BusProjectDept; + +/** + * 项目与部门关联Service接口 + * + * @author lilemy + * @date 2025-10-16 + */ +public interface IBusProjectDeptService extends IService { +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceMachineUserServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceMachineUserServiceImpl.java index 493eeeeb..4134b924 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceMachineUserServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceMachineUserServiceImpl.java @@ -2,6 +2,7 @@ package org.dromara.project.service.impl; import cn.hutool.core.collection.CollUtil; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.HttpStatus; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StringUtils; @@ -33,6 +34,7 @@ import java.util.stream.Collectors; * @author lilemy * @date 2025-10-15 */ +@Slf4j @RequiredArgsConstructor @Service public class BusAttendanceMachineUserServiceImpl implements IBusAttendanceMachineUserService { @@ -74,18 +76,20 @@ public class BusAttendanceMachineUserServiceImpl implements IBusAttendanceMachin throw new ServiceException("所选班组与考勤机不匹配", HttpStatus.NOT_FOUND); } // 获取考勤机里的用户 - Set userIdList = new HashSet<>(); + Set userIdList = new HashSet<>(); try { KqjEntity.CommonResponse response = deviceMessageSender.getAllUsers(machine.getSn()); int code = response.getData().getCode(); if (code == 0 || code == 200) { + log.info("获取考勤机数据成功:{}", response.getData()); String[] userIds = response.getData().getUserIds(); - userIdList = Arrays.stream(userIds).map(Long::parseLong).collect(Collectors.toSet()); + userIdList = Arrays.stream(userIds).collect(Collectors.toSet()); } } catch (Exception e) { + log.error("获取考勤机用户失败,sn:{}", machine.getSn(), e); throw new ServiceException("获取考勤机用户失败", HttpStatus.ERROR); } - Set finalUserIdList = userIdList; + Set finalUserIdList = userIdList; return teamMemberList.stream().map(member -> { BusAttendanceMachineUserVo vo = new BusAttendanceMachineUserVo(); vo.setMachineId(req.getMachineId()); @@ -94,7 +98,7 @@ public class BusAttendanceMachineUserServiceImpl implements IBusAttendanceMachin vo.setUserName(member.getMemberName()); if (CollUtil.isEmpty(finalUserIdList)) { vo.setIdentifying(0); - } else if (finalUserIdList.contains(member.getMemberId())) { + } else if (finalUserIdList.contains(member.getMemberId().toString())) { vo.setIdentifying(1); } else { vo.setIdentifying(0); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectDeptServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectDeptServiceImpl.java new file mode 100644 index 00000000..d924e2e2 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectDeptServiceImpl.java @@ -0,0 +1,20 @@ +package org.dromara.project.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import org.dromara.project.domain.BusProjectDept; +import org.dromara.project.mapper.BusProjectDeptMapper; +import org.dromara.project.service.IBusProjectDeptService; +import org.springframework.stereotype.Service; + +/** + * 项目与部门关联Service业务层处理 + * + * @author lilemy + * @date 2025-10-16 + */ +@RequiredArgsConstructor +@Service +public class BusProjectDeptServiceImpl extends ServiceImpl + implements IBusProjectDeptService { +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java index 84831ccc..1ef8e281 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java @@ -3,6 +3,7 @@ package org.dromara.project.service.impl; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.util.PhoneUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.json.JSONUtil; @@ -56,7 +57,9 @@ import org.dromara.project.mapper.BusProjectMapper; import org.dromara.project.service.*; import org.dromara.quality.service.IQltKnowledgeDocumentService; import org.dromara.safety.service.IHseKnowledgeDocumentService; +import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.service.ISysDeptService; import org.dromara.system.service.ISysDictDataService; import org.dromara.workflow.service.IFlwDefinitionService; import org.dromara.xzd.utilS.IdWorker; @@ -147,6 +150,13 @@ public class BusProjectServiceImpl extends ServiceImpl deptIds = req.getDeptIds(); + if (CollUtil.isNotEmpty(deptIds)) { + List projectDeptList = deptIds.stream().map(deptId -> { + BusProjectDept projectDept = new BusProjectDept(); + projectDept.setDeptId(deptId); + projectDept.setProjectId(projectId); + return projectDept; + }).toList(); + boolean saveBatch = projectDeptService.saveBatch(projectDeptList); + if (!saveBatch) { + throw new ServiceException("保存项目与部门的关联失败", HttpStatus.ERROR); + } + } // 异步执行数据同步 self.insertProjectSyncThing(projectId) .thenAccept(result -> log.info("项目[{}-{}]异步执行数据同步成功", req.getProjectName(), projectId)) @@ -694,6 +718,7 @@ public class BusProjectServiceImpl extends ServiceImpl list = StringUtils.splitTo(sysDeptVo.getAncestors(), Convert::toLong); + List projectDepts = new ArrayList<>(); + if (list.size() >= 2) { + projectDepts = projectDeptService.lambdaQuery() + .eq(BusProjectDept::getDeptId, list.get(1)) + .list() + .stream().map(BusProjectDept::getProjectId).toList(); + } + lqw.in(CollUtil.isNotEmpty(projectDepts), BusProject::getId, projectDepts); + } // 排序 lqw.orderByAsc(BusProject::getSort); return lqw; @@ -1186,7 +1223,7 @@ public class BusProjectServiceImpl extends ServiceImpl map2 = new HashMap<>(); map2.put("lng", project.getLng()); map2.put("lat", project.getLat()); - map2.put("position",project.getPosition()); + map2.put("position", project.getPosition()); map2.put("projectId", project.getId().toString()); map1.put(project.getProjectName(), map2); //当满足条件时删除该元素 @@ -1248,7 +1285,7 @@ public class BusProjectServiceImpl extends ServiceImpl().set(BusProject::getPosition, dto.getPosition()).eq(BusProject::getId, dto.getProjectId())) >0; + return baseMapper.update(new LambdaUpdateWrapper().set(BusProject::getPosition, dto.getPosition()).eq(BusProject::getId, dto.getProjectId())) > 0; } /** diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/BusProjectDeptMapper.xml b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/BusProjectDeptMapper.xml new file mode 100644 index 00000000..1432832f --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/BusProjectDeptMapper.xml @@ -0,0 +1,7 @@ + + + + +