From 68080571113a3a84ff8e637224b942036240cf20 Mon Sep 17 00:00:00 2001 From: lcj <2331845269@qq.com> Date: Wed, 15 Oct 2025 23:57:32 +0800 Subject: [PATCH] =?UTF-8?q?=E8=80=83=E5=8B=A4=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-prod.yml | 4 +- .../MatMaterialsInventoryServiceImpl.java | 2 +- .../DeviceMessageSender.java | 14 +- .../DeviceWebSocketServer.java | 18 +- .../BusAttendanceMachineController.java | 94 +++++++ .../BusAttendanceMachineUserController.java | 65 +++++ .../project/domain/BusAttendanceMachine.java | 65 +++++ .../domain/BusAttendanceMachineUser.java | 56 ++++ .../BusAttendanceMachineQueryReq.java | 37 +++ .../BusAttendanceMachineUpdateReq.java | 40 +++ .../BusAttendanceMachineSendInfoUserReq.java | 32 +++ .../BusAttendanceMachineUserQueryReq.java | 40 +++ .../BusAttendanceMachineUserRemoveReq.java | 31 ++ .../domain/vo/BusAttendanceMachineUserVo.java | 46 +++ .../domain/vo/BusAttendanceMachineVo.java | 87 ++++++ .../mapper/BusAttendanceMachineMapper.java | 15 + .../service/IBusAttendanceMachineService.java | 78 +++++ .../IBusAttendanceMachineUserService.java | 41 +++ .../impl/BusAttendanceMachineServiceImpl.java | 266 ++++++++++++++++++ .../BusAttendanceMachineUserServiceImpl.java | 163 +++++++++++ .../controller/system/SysUserController.java | 2 +- .../project/BusAttendanceMachineMapper.xml | 7 + 22 files changed, 1189 insertions(+), 14 deletions(-) create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceMachineController.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceMachineUserController.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusAttendanceMachine.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusAttendanceMachineUser.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachine/BusAttendanceMachineQueryReq.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachine/BusAttendanceMachineUpdateReq.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachineuser/BusAttendanceMachineSendInfoUserReq.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachineuser/BusAttendanceMachineUserQueryReq.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachineuser/BusAttendanceMachineUserRemoveReq.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/BusAttendanceMachineUserVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/BusAttendanceMachineVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/BusAttendanceMachineMapper.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceMachineService.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceMachineUserService.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceMachineServiceImpl.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceMachineUserServiceImpl.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/BusAttendanceMachineMapper.xml diff --git a/xinnengyuan/ruoyi-admin/src/main/resources/application-prod.yml b/xinnengyuan/ruoyi-admin/src/main/resources/application-prod.yml index fba67693..0650b550 100644 --- a/xinnengyuan/ruoyi-admin/src/main/resources/application-prod.yml +++ b/xinnengyuan/ruoyi-admin/src/main/resources/application-prod.yml @@ -324,9 +324,9 @@ dxf2GeoJson: file-name: main.exe ys7: app-key: 3acf9f1a43dc4209841e0893003db0a2 - app-secret: 4bbf3e9394f55d3af6e3af27b2d3db36 + app-secret: 09e29c70ae1161fbc3ce2030fc09ba2e job: - capture-enabled: false # 控制是否启用萤石抓拍任务 + capture-enabled: true # 控制是否启用萤石抓拍任务 # 斯巴达算法 sparta: url: http://119.3.204.120:8040 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsInventoryServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsInventoryServiceImpl.java index 1641cbbf..29f3eebc 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsInventoryServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsInventoryServiceImpl.java @@ -355,7 +355,7 @@ public class MatMaterialsInventoryServiceImpl extends ServiceImpl connectedDevices = new ConcurrentHashMap<>(); // 响应通道:key=UUID,value=响应结果容器 @@ -212,7 +215,6 @@ public class DeviceWebSocketServer { // registerFuture.complete(true); // 标记注册成功 // log.info("设备注册成功,SN: {},IP: {}:{},会话ID: {}", sn, ip, port, session.getId()); // } - private void handleRegisterStage(String message, String cmd) throws Exception { // 非DECLARE消息直接拒绝 if (!DECLARE.equals(cmd)) { @@ -382,6 +384,11 @@ public class DeviceWebSocketServer { // TODO: 替换为真实的业务服务调用(如Spring Bean注入后调用) log.info("【业务服务】设备注册,SN: {}", sn); // 示例:BusAttendanceMachineService.register(sn); + if (attendanceMachineService != null) { + attendanceMachineService.insertBySn(sn); + } else { + log.error("IBusAttendanceMachineService 为空,无法进行设备注册"); + } } catch (Exception e) { log.error("【业务服务】设备注册失败,SN: {}", sn, e); } @@ -395,6 +402,11 @@ public class DeviceWebSocketServer { // TODO: 替换为真实的业务服务调用 log.info("【业务服务】更新设备状态,SN: {},状态: {}", sn, status); // 示例:BusAttendanceMachineService.changeStatus(sn, status); + if (attendanceMachineService != null) { + attendanceMachineService.changeStatus(sn, status); + } else { + log.error("IBusAttendanceMachineService 为空,无法更新设备状态"); + } } catch (Exception e) { log.error("【业务服务】更新设备状态失败,SN: {}", sn, e); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceMachineController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceMachineController.java new file mode 100644 index 00000000..1a842e40 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceMachineController.java @@ -0,0 +1,94 @@ +package org.dromara.project.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.project.domain.dto.attendancemachine.BusAttendanceMachineQueryReq; +import org.dromara.project.domain.dto.attendancemachine.BusAttendanceMachineUpdateReq; +import org.dromara.project.domain.vo.BusAttendanceMachineVo; +import org.dromara.project.service.IBusAttendanceMachineService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 考勤机 + * + * @author lilemy + * @date 2025-10-15 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/project/attendanceMachine") +public class BusAttendanceMachineController extends BaseController { + + private final IBusAttendanceMachineService busAttendanceMachineService; + + /** + * 查询考勤机列表 + */ + @SaCheckPermission("project:attendanceMachine:list") + @GetMapping("/list") + public TableDataInfo list(BusAttendanceMachineQueryReq req, PageQuery pageQuery) { + return busAttendanceMachineService.queryPageList(req, pageQuery); + } + + /** + * 导出考勤机列表 + */ + @SaCheckPermission("project:attendanceMachine:export") + @Log(title = "考勤机", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusAttendanceMachineQueryReq req, HttpServletResponse response) { + List list = busAttendanceMachineService.queryList(req); + ExcelUtil.exportExcel(list, "考勤机", BusAttendanceMachineVo.class, response); + } + + /** + * 获取考勤机详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("project:attendanceMachine:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busAttendanceMachineService.queryById(id)); + } + + /** + * 修改考勤机 + */ + @SaCheckPermission("project:attendanceMachine:edit") + @Log(title = "考勤机", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated @RequestBody BusAttendanceMachineUpdateReq req) { + return toAjax(busAttendanceMachineService.updateByBo(req)); + } + + /** + * 删除考勤机 + * + * @param ids 主键串 + */ + @SaCheckPermission("project:attendanceMachine:remove") + @Log(title = "考勤机", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busAttendanceMachineService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceMachineUserController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceMachineUserController.java new file mode 100644 index 00000000..a534a8f4 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceMachineUserController.java @@ -0,0 +1,65 @@ +package org.dromara.project.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.web.core.BaseController; +import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineSendInfoUserReq; +import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineUserQueryReq; +import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineUserRemoveReq; +import org.dromara.project.domain.vo.BusAttendanceMachineUserVo; +import org.dromara.project.service.IBusAttendanceMachineUserService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 考勤机用户 + * + * @author lilemy + * @date 2025-10-15 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/project/attendanceMachineUser") +public class BusAttendanceMachineUserController extends BaseController { + + private final IBusAttendanceMachineUserService busAttendanceMachineUserService; + + /** + * 查询考勤机用户列表 + */ + @SaCheckPermission("project:attendanceMachineUser:list") + @GetMapping("/list") + public R> list(BusAttendanceMachineUserQueryReq req) { + return R.ok(busAttendanceMachineUserService.queryList(req)); + } + + /** + * 下发用户到考勤机中 + */ + @SaCheckPermission("project:attendanceMachineUser:add") + @Log(title = "考勤机用户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/send") + public R sendPersonInfo(@Validated @RequestBody BusAttendanceMachineSendInfoUserReq req) { + return R.ok(busAttendanceMachineUserService.sendPersonInfo(req)); + } + + /** + * 删除考勤机用户 + */ + @SaCheckPermission("project:attendanceMachineUser:remove") + @Log(title = "考勤机用户", businessType = BusinessType.DELETE) + @RepeatSubmit() + @DeleteMapping() + public R remove(@Validated @RequestBody BusAttendanceMachineUserRemoveReq req) { + return toAjax(busAttendanceMachineUserService.remove(req)); + } + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusAttendanceMachine.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusAttendanceMachine.java new file mode 100644 index 00000000..c71fb2cf --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusAttendanceMachine.java @@ -0,0 +1,65 @@ +package org.dromara.project.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 考勤机对象 bus_attendance_machine + * + * @author lilemy + * @date 2025-10-15 + */ +@Data +@TableName("bus_attendance_machine") +public class BusAttendanceMachine implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 设备sn + */ + private String sn; + + /** + * 是否在线(0-no 1-yes) + */ + private String status; + + /** + * 班组id,多个逗号分隔 + */ + private String teams; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusAttendanceMachineUser.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusAttendanceMachineUser.java new file mode 100644 index 00000000..c7e340b8 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusAttendanceMachineUser.java @@ -0,0 +1,56 @@ +package org.dromara.project.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 考勤机用户对象 bus_attendance_machine_user + * + * @author lilemy + * @date 2025-10-15 + */ +@Data +public class BusAttendanceMachineUser implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + private Long id; + + /** + * 考勤机主键ID + */ + private Long machineId; + + /** + * 班组ID + */ + private Long teamId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 标识(是否下发) + */ + private Integer identifying; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachine/BusAttendanceMachineQueryReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachine/BusAttendanceMachineQueryReq.java new file mode 100644 index 00000000..83456084 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachine/BusAttendanceMachineQueryReq.java @@ -0,0 +1,37 @@ +package org.dromara.project.domain.dto.attendancemachine; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025-10-15 16:18 + */ +@Data +public class BusAttendanceMachineQueryReq implements Serializable { + + @Serial + private static final long serialVersionUID = 6296359812022907365L; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 设备sn + */ + private String sn; + + /** + * 是否在线(0-no 1-yes) + */ + private String status; + + /** + * 班组id,多个逗号分隔 + */ + private String teams; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachine/BusAttendanceMachineUpdateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachine/BusAttendanceMachineUpdateReq.java new file mode 100644 index 00000000..d8f774d4 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachine/BusAttendanceMachineUpdateReq.java @@ -0,0 +1,40 @@ +package org.dromara.project.domain.dto.attendancemachine; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025-10-15 16:15 + */ +@Data +public class BusAttendanceMachineUpdateReq implements Serializable { + + @Serial + private static final long serialVersionUID = 4764015594443520162L; + + /** + * 主键ID + */ + @NotNull(message = "主键ID不能为空") + private Long id; + + /** + * 项目ID + */ + @NotNull(message = "项目ID不能为空") + private Long projectId; + + /** + * 班组id,多个逗号分隔 + */ + private String teams; + + /** + * 备注 + */ + private String remark; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachineuser/BusAttendanceMachineSendInfoUserReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachineuser/BusAttendanceMachineSendInfoUserReq.java new file mode 100644 index 00000000..0b43618f --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachineuser/BusAttendanceMachineSendInfoUserReq.java @@ -0,0 +1,32 @@ +package org.dromara.project.domain.dto.attendancemachineuser; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author lilemy + * @date 2025-10-15 17:43 + */ +@Data +public class BusAttendanceMachineSendInfoUserReq implements Serializable { + + @Serial + private static final long serialVersionUID = -6517799483848691652L; + + /** + * 考勤机主键ID + */ + @NotNull(message = "考勤机不能为空") + private Long machineId; + + /** + * 用户ID列表 + */ + @NotNull(message = "用户列表不能为空") + private List userIds; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachineuser/BusAttendanceMachineUserQueryReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachineuser/BusAttendanceMachineUserQueryReq.java new file mode 100644 index 00000000..bec22d37 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachineuser/BusAttendanceMachineUserQueryReq.java @@ -0,0 +1,40 @@ +package org.dromara.project.domain.dto.attendancemachineuser; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025-10-15 19:22 + */ +@Data +public class BusAttendanceMachineUserQueryReq implements Serializable { + + @Serial + private static final long serialVersionUID = -1629819732452840391L; + + /** + * 考勤机主键ID + */ + @NotNull(message = "考勤机不能为空") + private Long machineId; + + /** + * 班组ID + */ + @NotNull(message = "班组不能为空") + private Long teamId; + + /** + * 用户名称 + */ + private String userName; + + /** + * 标识(是否下发) + */ + private Integer identifying; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachineuser/BusAttendanceMachineUserRemoveReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachineuser/BusAttendanceMachineUserRemoveReq.java new file mode 100644 index 00000000..19ffa59b --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/attendancemachineuser/BusAttendanceMachineUserRemoveReq.java @@ -0,0 +1,31 @@ +package org.dromara.project.domain.dto.attendancemachineuser; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author lilemy + * @date 2025-10-15 19:56 + */ +@Data +public class BusAttendanceMachineUserRemoveReq implements Serializable { + + @Serial + private static final long serialVersionUID = -8880884070612972760L; + + /** + * 考勤机主键ID + */ + @NotNull(message = "考勤机不能为空") + private Long machineId; + + /** + * 用户ID列表 + */ + @NotNull(message = "用户列表不能为空") + private List userIds; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/BusAttendanceMachineUserVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/BusAttendanceMachineUserVo.java new file mode 100644 index 00000000..66a5560f --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/BusAttendanceMachineUserVo.java @@ -0,0 +1,46 @@ +package org.dromara.project.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 考勤机用户视图对象 bus_attendance_machine_user + * + * @author lilemy + * @date 2025-10-15 + */ +@Data +public class BusAttendanceMachineUserVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 考勤机主键ID + */ + private Long machineId; + + /** + * 班组ID + */ + private Long teamId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 用户名称 + */ + private String userName; + + /** + * 标识(是否下发) + */ + private Integer identifying; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/BusAttendanceMachineVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/BusAttendanceMachineVo.java new file mode 100644 index 00000000..d49fe642 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/BusAttendanceMachineVo.java @@ -0,0 +1,87 @@ +package org.dromara.project.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.project.domain.BusAttendanceMachine; +import org.dromara.project.domain.vo.projectteam.BusProjectTeamVo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 考勤机视图对象 bus_attendance_machine + * + * @author lilemy + * @date 2025-10-15 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusAttendanceMachine.class) +public class BusAttendanceMachineVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty(value = "主键ID") + private Long id; + + /** + * 项目ID + */ + @ExcelProperty(value = "项目ID") + private Long projectId; + + /** + * 项目名称 + */ + @Translation(type = TransConstant.PROJECT_ID_TO_NAME, mapper = "projectId") + private String projectName; + + /** + * 设备sn + */ + @ExcelProperty(value = "设备sn") + private String sn; + + /** + * 是否在线(0-no 1-yes) + */ + @ExcelProperty(value = "是否在线", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=-no,1=-yes") + private String status; + + /** + * 班组id,多个逗号分隔 + */ + @ExcelProperty(value = "班组id,多个逗号分隔") + private String teams; + + /** + * 班组列表 + */ + private List teamsList; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/BusAttendanceMachineMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/BusAttendanceMachineMapper.java new file mode 100644 index 00000000..7991b89f --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/BusAttendanceMachineMapper.java @@ -0,0 +1,15 @@ +package org.dromara.project.mapper; + +import org.dromara.project.domain.BusAttendanceMachine; +import org.dromara.project.domain.vo.BusAttendanceMachineVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 考勤机Mapper接口 + * + * @author lilemy + * @date 2025-10-15 + */ +public interface BusAttendanceMachineMapper extends BaseMapperPlus { + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceMachineService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceMachineService.java new file mode 100644 index 00000000..78eec5ce --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceMachineService.java @@ -0,0 +1,78 @@ +package org.dromara.project.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.project.domain.BusAttendanceMachine; +import org.dromara.project.domain.dto.attendancemachine.BusAttendanceMachineQueryReq; +import org.dromara.project.domain.dto.attendancemachine.BusAttendanceMachineUpdateReq; +import org.dromara.project.domain.vo.BusAttendanceMachineVo; + +import java.util.Collection; +import java.util.List; + +/** + * 考勤机Service接口 + * + * @author lilemy + * @date 2025-10-15 + */ +public interface IBusAttendanceMachineService extends IService { + + /** + * 查询考勤机 + * + * @param id 主键 + * @return 考勤机 + */ + BusAttendanceMachineVo queryById(Long id); + + /** + * 分页查询考勤机列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 考勤机分页列表 + */ + TableDataInfo queryPageList(BusAttendanceMachineQueryReq req, PageQuery pageQuery); + + /** + * 查询符合条件的考勤机列表 + * + * @param req 查询条件 + * @return 考勤机列表 + */ + List queryList(BusAttendanceMachineQueryReq req); + + /** + * 根据sn新增考勤机 + * + * @param sn 考勤机sn + */ + void insertBySn(String sn); + + /** + * 修改考勤机 + * + * @param req 考勤机 + * @return 是否修改成功 + */ + Boolean updateByBo(BusAttendanceMachineUpdateReq req); + + /** + * 修改考勤机状态 + * + * @param sn 考勤机sn + * @param status 考勤机状态 + */ + void changeStatus(String sn, String status); + + /** + * 校验并批量删除考勤机信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceMachineUserService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceMachineUserService.java new file mode 100644 index 00000000..9b4d751e --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceMachineUserService.java @@ -0,0 +1,41 @@ +package org.dromara.project.service; + +import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineSendInfoUserReq; +import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineUserQueryReq; +import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineUserRemoveReq; +import org.dromara.project.domain.vo.BusAttendanceMachineUserVo; + +import java.util.List; + +/** + * 考勤机用户Service接口 + * + * @author lilemy + * @date 2025-10-15 + */ +public interface IBusAttendanceMachineUserService { + + /** + * 查询符合条件的考勤机用户列表 + * + * @param req 查询条件 + * @return 考勤机用户列表 + */ + List queryList(BusAttendanceMachineUserQueryReq req); + + /** + * 下发用户到考勤机中 + * + * @param req 下发用户参数 + * @return 下发结果 + */ + String sendPersonInfo(BusAttendanceMachineSendInfoUserReq req); + + /** + * 删除考勤机用户 + * + * @param req 删除参数 + * @return 删除结果 + */ + Boolean remove(BusAttendanceMachineUserRemoveReq req); +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceMachineServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceMachineServiceImpl.java new file mode 100644 index 00000000..20c86a1f --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceMachineServiceImpl.java @@ -0,0 +1,266 @@ +package org.dromara.project.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jakarta.annotation.Resource; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.mobileAttendanceMachine.DeviceMessageSender; +import org.dromara.project.domain.BusAttendanceMachine; +import org.dromara.project.domain.BusProject; +import org.dromara.project.domain.BusProjectTeam; +import org.dromara.project.domain.BusProjectTeamMember; +import org.dromara.project.domain.dto.attendancemachine.BusAttendanceMachineQueryReq; +import org.dromara.project.domain.dto.attendancemachine.BusAttendanceMachineUpdateReq; +import org.dromara.project.domain.vo.BusAttendanceMachineVo; +import org.dromara.project.domain.vo.projectteam.BusProjectTeamVo; +import org.dromara.project.mapper.BusAttendanceMachineMapper; +import org.dromara.project.service.IBusAttendanceMachineService; +import org.dromara.project.service.IBusProjectService; +import org.dromara.project.service.IBusProjectTeamMemberService; +import org.dromara.project.service.IBusProjectTeamService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 考勤机Service业务层处理 + * + * @author lilemy + * @date 2025-10-15 + */ +@RequiredArgsConstructor +@Service +public class BusAttendanceMachineServiceImpl extends ServiceImpl + implements IBusAttendanceMachineService { + + @Resource + private IBusProjectService projectService; + + @Resource + private IBusProjectTeamService projectTeamService; + + @Resource + private IBusProjectTeamMemberService projectTeamMemberService; + + @Resource + private DeviceMessageSender deviceMessageSender; + + /** + * 查询考勤机 + * + * @param id 主键 + * @return 考勤机 + */ + @Override + public BusAttendanceMachineVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 分页查询考勤机列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 考勤机分页列表 + */ + @Override + public TableDataInfo queryPageList(BusAttendanceMachineQueryReq req, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(req); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + List records = result.getRecords(); + List teamIds = records.stream() + .map(BusAttendanceMachineVo::getTeams) + .filter(StringUtils::isNotBlank) + .flatMap(team -> Arrays.stream(team.split(",")) // flatMap 展开内部 stream + .map(Long::parseLong)) + .toList(); + if (CollUtil.isEmpty(teamIds)) { + return TableDataInfo.build(result); + } + List projectTeams = projectTeamService.listByIds(teamIds); + Map teamMap = projectTeams.stream() + .collect(Collectors.toMap(BusProjectTeam::getId, BusProjectTeam::getTeamName)); + records.forEach(machine -> { + String teams = machine.getTeams(); + if (StringUtils.isNotBlank(teams)) { + List t = Arrays.stream(teams.split(",")).map(Long::parseLong).toList(); + List teamVoList = t.stream().map(teamId -> { + BusProjectTeamVo vo = new BusProjectTeamVo(); + vo.setId(teamId); + vo.setTeamName(teamMap.getOrDefault(teamId, "未命名")); + return vo; + }).toList(); + machine.setTeamsList(teamVoList); + } + }); + result.setRecords(records); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的考勤机列表 + * + * @param req 查询条件 + * @return 考勤机列表 + */ + @Override + public List queryList(BusAttendanceMachineQueryReq req) { + LambdaQueryWrapper lqw = buildQueryWrapper(req); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusAttendanceMachineQueryReq req) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByDesc(BusAttendanceMachine::getId); + lqw.eq(req.getProjectId() != null, BusAttendanceMachine::getProjectId, req.getProjectId()); + lqw.isNull(req.getProjectId() == null, BusAttendanceMachine::getProjectId); + lqw.eq(StringUtils.isNotBlank(req.getSn()), BusAttendanceMachine::getSn, req.getSn()); + lqw.eq(StringUtils.isNotBlank(req.getStatus()), BusAttendanceMachine::getStatus, req.getStatus()); + lqw.like(StringUtils.isNotBlank(req.getTeams()), BusAttendanceMachine::getTeams, req.getTeams()); + return lqw; + } + + /** + * 根据sn新增考勤机 + * + * @param sn 考勤机sn + */ + @Override + public void insertBySn(String sn) { + BusAttendanceMachine machine = new BusAttendanceMachine(); + // 判断考勤机是否存在 + BusAttendanceMachine oldMachine = this.lambdaQuery() + .eq(BusAttendanceMachine::getSn, sn) + .one(); + if (oldMachine != null) { + machine.setId(oldMachine.getId()); + } + machine.setSn(sn); + machine.setStatus("1"); + this.saveOrUpdate(machine); + } + + /** + * 修改考勤机 + * + * @param req 考勤机 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(BusAttendanceMachineUpdateReq req) { + Long id = req.getId(); + BusAttendanceMachine oldMachine = this.getById(id); + if (oldMachine == null) { + throw new ServiceException("考勤机不存在", HttpStatus.NOT_FOUND); + } + BusAttendanceMachine machine = new BusAttendanceMachine(); + BeanUtils.copyProperties(req, machine); + // 判断班组是否属于所选项目 + Long projectId = req.getProjectId(); + BusProject project = projectService.getById(projectId); + if (project == null) { + throw new ServiceException("所选项目不存在", HttpStatus.NOT_FOUND); + } + String teams = req.getTeams(); + if (StringUtils.isBlank(teams) && StringUtils.isBlank(oldMachine.getTeams())) { + throw new ServiceException("请选择班组", HttpStatus.BAD_REQUEST); + } + if (StringUtils.isNotBlank(teams)) { + List teamIds = Arrays.stream(teams.split(",")) + .map(Long::parseLong) + .distinct() + .toList(); + List projectTeams = projectTeamService.listByIds(teamIds); + if (projectTeams.size() != teamIds.size()) { + throw new ServiceException("所选班组不存在", HttpStatus.NOT_FOUND); + } + String oldTeams = oldMachine.getTeams(); + if (StringUtils.isNotBlank(oldTeams)) { + List oldTeamIds = Arrays.stream(oldTeams.split(",")) + .map(Long::parseLong) + .distinct() + .toList(); + // 获取新增的班组ID + List added = teamIds.stream() + .filter(t -> !oldTeamIds.contains(t)) + .toList(); + // 获取删除的班组ID + List deleted = oldTeamIds.stream() + .filter(t -> !teamIds.contains(t)) + .toList(); + // 删除的班组不为空时,删除考勤机中对应的人数 + if (CollUtil.isNotEmpty(deleted)) { + // 获取待删除的班组的所有用户id + List userIds = projectTeamMemberService.lambdaQuery() + .select(BusProjectTeamMember::getMemberId) + .in(BusProjectTeamMember::getTeamId, deleted) + .list() + .stream().map(BusProjectTeamMember::getMemberId).toList(); + if (CollUtil.isNotEmpty(userIds)) { + String[] userIdArray = userIds.stream() + .map(String::valueOf) // 将 Long 转成 String + .toArray(String[]::new); + try { + deviceMessageSender.batchDeleteUsers(machine.getSn(), userIdArray); + } catch (Exception e) { + throw new ServiceException("删除考勤机用户失败", HttpStatus.ERROR); + } + } + } + } + projectTeams.forEach(team -> { + if (!team.getProjectId().equals(projectId)) { + throw new ServiceException(team.getTeamName() + "不属于所选项目", HttpStatus.BAD_REQUEST); + } + }); + } + return this.updateById(machine); + } + + /** + * 修改考勤机状态 + * + * @param sn 考勤机sn + * @param status 考勤机状态 + */ + @Override + public void changeStatus(String sn, String status) { + BusAttendanceMachine machine = this.lambdaQuery() + .eq(BusAttendanceMachine::getSn, sn) + .one(); + if (machine == null) { + machine = new BusAttendanceMachine(); + machine.setSn(sn); + } + machine.setStatus(status); + this.saveOrUpdate(machine); + } + + /** + * 校验并批量删除考勤机信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} 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 new file mode 100644 index 00000000..493eeeeb --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceMachineUserServiceImpl.java @@ -0,0 +1,163 @@ +package org.dromara.project.service.impl; + +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.contractor.domain.SubConstructionUser; +import org.dromara.contractor.service.ISubConstructionUserService; +import org.dromara.mobileAttendanceMachine.DeviceMessageSender; +import org.dromara.mobileAttendanceMachine.KqjEntity; +import org.dromara.project.domain.BusAttendanceMachine; +import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineSendInfoUserReq; +import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineUserQueryReq; +import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineUserRemoveReq; +import org.dromara.project.domain.dto.projectteammember.BusProjectTeamMemberQueryReq; +import org.dromara.project.domain.vo.BusAttendanceMachineUserVo; +import org.dromara.project.domain.vo.projectteammember.BusProjectTeamMemberVo; +import org.dromara.project.service.IBusAttendanceMachineService; +import org.dromara.project.service.IBusAttendanceMachineUserService; +import org.dromara.project.service.IBusProjectTeamMemberService; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 考勤机用户Service业务层处理 + * + * @author lilemy + * @date 2025-10-15 + */ +@RequiredArgsConstructor +@Service +public class BusAttendanceMachineUserServiceImpl implements IBusAttendanceMachineUserService { + + private final IBusAttendanceMachineService attendanceMachineService; + + private final DeviceMessageSender deviceMessageSender; + + private final ISubConstructionUserService constructionUserService; + + private final IBusProjectTeamMemberService projectTeamMemberService; + + /** + * 查询符合条件的考勤机用户列表 + * + * @param req 查询条件 + * @return 考勤机用户列表 + */ + @Override + public List queryList(BusAttendanceMachineUserQueryReq req) { + BusProjectTeamMemberQueryReq query = new BusProjectTeamMemberQueryReq(); + query.setTeamId(req.getTeamId()); + query.setMemberName(req.getUserName()); + List teamMemberList = projectTeamMemberService.queryList(query); + if (CollUtil.isEmpty(teamMemberList)) { + return CollUtil.newArrayList(); + } + BusAttendanceMachine machine = attendanceMachineService.getById(req.getMachineId()); + if (machine == null) { + throw new ServiceException("考勤机不存在", HttpStatus.NOT_FOUND); + } + // 判断选择班组和考勤机是否一致 + if (StringUtils.isBlank(machine.getTeams())) { + throw new ServiceException("考勤机未绑定班组", HttpStatus.NOT_FOUND); + } + if (!Arrays.stream(machine.getTeams().split(",")) + .map(Long::parseLong) + .collect(Collectors.toSet()).contains(req.getTeamId())) { + throw new ServiceException("所选班组与考勤机不匹配", HttpStatus.NOT_FOUND); + } + // 获取考勤机里的用户 + Set userIdList = new HashSet<>(); + try { + KqjEntity.CommonResponse response = deviceMessageSender.getAllUsers(machine.getSn()); + int code = response.getData().getCode(); + if (code == 0 || code == 200) { + String[] userIds = response.getData().getUserIds(); + userIdList = Arrays.stream(userIds).map(Long::parseLong).collect(Collectors.toSet()); + } + } catch (Exception e) { + throw new ServiceException("获取考勤机用户失败", HttpStatus.ERROR); + } + Set finalUserIdList = userIdList; + return teamMemberList.stream().map(member -> { + BusAttendanceMachineUserVo vo = new BusAttendanceMachineUserVo(); + vo.setMachineId(req.getMachineId()); + vo.setTeamId(req.getTeamId()); + vo.setUserId(member.getMemberId()); + vo.setUserName(member.getMemberName()); + if (CollUtil.isEmpty(finalUserIdList)) { + vo.setIdentifying(0); + } else if (finalUserIdList.contains(member.getMemberId())) { + vo.setIdentifying(1); + } else { + vo.setIdentifying(0); + } + return vo; + }).toList(); + } + + /** + * 下发用户到考勤机中 + * + * @param req 下发用户参数 + * @return 下发结果 + */ + @Override + public String sendPersonInfo(BusAttendanceMachineSendInfoUserReq req) { + Long machineId = req.getMachineId(); + List userIds = req.getUserIds(); + BusAttendanceMachine machine = attendanceMachineService.getById(machineId); + if (machine == null) { + throw new ServiceException("考勤机不存在", HttpStatus.NOT_FOUND); + } + List userList = constructionUserService.lambdaQuery() + .in(SubConstructionUser::getSysUserId, userIds) + .list(); + // 返回数据 + StringBuilder sb = new StringBuilder(); + sb.append("用户:["); + int count = 0; + for (SubConstructionUser user : userList) { + Boolean result = deviceMessageSender.sendPersonnelInformation(machine.getSn(), + user.getSysUserId().toString(), user.getUserName(), user.getFacePic()); + if (!result) { + sb.append(user.getUserName()).append(" "); + count++; + } + } + sb.append("] 下发失败"); + return count == 0 ? "下发成功" : sb.toString(); + } + + /** + * 删除考勤机用户 + * + * @param req 删除参数 + * @return 删除结果 + */ + @Override + public Boolean remove(BusAttendanceMachineUserRemoveReq req) { + Long machineId = req.getMachineId(); + List userIds = req.getUserIds(); + BusAttendanceMachine machine = attendanceMachineService.getById(machineId); + if (machine == null) { + throw new ServiceException("考勤机不存在", HttpStatus.NOT_FOUND); + } + String[] userIdArray = userIds.stream() + .map(String::valueOf) // 将 Long 转成 String + .toArray(String[]::new); + try { + KqjEntity.CommonResponse response = deviceMessageSender.batchDeleteUsers(machine.getSn(), userIdArray); + return response.getData().getCode() == 0 || response.getData().getCode() == 200; + } catch (Exception e) { + throw new ServiceException("删除考勤机用户失败", HttpStatus.ERROR); + } + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java index db8cd249..2f06ef47 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -273,7 +273,7 @@ public class SysUserController extends BaseController { @Log(title = "用户管理", businessType = BusinessType.UPDATE) @PutMapping("/resetPwd") public R resetPwd(@RequestBody SysUserBo user) { - userService.checkUserAllowed(user.getUserId()); +// userService.checkUserAllowed(user.getUserId()); userService.checkUserDataScope(user.getUserId()); user.setPassword(BCrypt.hashpw(user.getPassword())); return toAjax(userService.resetUserPwd(user.getUserId(), user.getPassword())); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/BusAttendanceMachineMapper.xml b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/BusAttendanceMachineMapper.xml new file mode 100644 index 00000000..913ca1ac --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/BusAttendanceMachineMapper.xml @@ -0,0 +1,7 @@ + + + + +