From ed8ed8c37b658c9368e2ed0c460d7c9674ef760c Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Thu, 6 Jun 2024 22:30:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=87=BA=E5=85=A5=E5=BA=93=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=20=E5=B7=A5=E5=8E=82=E5=91=98=E5=B7=A5=E5=BD=95=E5=85=A5=20?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/excel/core/util/ExcelUtils.java | 3 +- .../excel/core/util/SpinnerWriteHandler.java | 3 +- .../AttendanceWebSocketMessageListener.java | 14 +- .../system/enums/ErrorCodeConstants.java | 15 +- .../yudao-module-system-biz/pom.xml | 6 + .../AttendanceMachineController.java | 2 +- .../admin/equipment/UsersExtController.java | 9 +- .../vo/userExt/UsersExtSaveReqVO.java | 6 + .../equipment/vo/websocket/AddUserVO.java | 24 ++ .../equipment/vo/websocket/DeleteUserVO.java | 15 ++ .../admin/user/FactoryUserController.java | 179 ++++++++++++++ .../vo/factoryUser/FactoryUserPageReqVO.java | 31 +++ .../vo/factoryUser/FactoryUserRespVO.java | 36 +++ .../vo/factoryUser/FactoryUserSaveReqVO.java | 34 +++ .../convert/user/FactoryUserConvert.java | 73 ++++++ .../dal/dataobject/equipment/UsersExtDO.java | 6 + .../dal/mysql/user/AdminUserMapper.java | 10 + .../rpc/config/RpcConfiguration.java | 3 +- .../system/service/dept/DeptService.java | 9 + .../system/service/dict/DictDataService.java | 9 + .../service/dict/DictDataServiceImpl.java | 6 + .../equipment/AttendanceMachineService.java | 7 + .../AttendanceMachineServiceImpl.java | 18 +- .../service/equipment/UsersExtService.java | 24 +- .../equipment/UsersExtServiceImpl.java | 48 +++- .../system/service/user/AdminUserService.java | 9 + .../service/user/AdminUserServiceImpl.java | 17 ++ .../service/user/FactoryUserService.java | 33 +++ .../service/user/FactoryUserServiceImpl.java | 228 ++++++++++++++++++ .../service/websocket/WebsocketService.java | 15 ++ .../websocket/WebsocketServiceImpl.java | 95 ++++++++ .../api/factoryInfo/FactoryInfoApi.java | 29 +++ .../api/factoryInfo/dto/FactoryInfoDTO.java | 21 ++ .../smartfactory/enums/ApiConstants.java | 23 ++ .../api/factoryInfo/FactoryInfoApiImpl.java | 38 +++ .../factorydata/FactoryDataController.java | 7 +- .../factorydata/vo/FactoryDataImportVO.java | 9 +- .../factorydata/FactoryDataServiceImpl.java | 33 ++- .../factoryinfo/FactoryInfoService.java | 7 + .../factoryinfo/FactoryInfoServiceImpl.java | 6 + .../factorydata/FactoryDataSizeMapper.xml | 4 +- 41 files changed, 1109 insertions(+), 55 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/vo/websocket/AddUserVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/vo/websocket/DeleteUserVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/FactoryUserController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/factoryUser/FactoryUserPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/factoryUser/FactoryUserRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/factoryUser/FactoryUserSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/user/FactoryUserConvert.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/FactoryUserService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/FactoryUserServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/websocket/WebsocketService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/websocket/WebsocketServiceImpl.java create mode 100644 zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/api/factoryInfo/FactoryInfoApi.java create mode 100644 zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/api/factoryInfo/dto/FactoryInfoDTO.java create mode 100644 zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/enums/ApiConstants.java create mode 100644 zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/api/factoryInfo/FactoryInfoApiImpl.java diff --git a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java index e906dc5e..35fec2bb 100644 --- a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java +++ b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java @@ -38,7 +38,7 @@ public class ExcelUtils { .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度 .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度 - .excelType(ExcelTypeEnum.XLSX) + .excelType(ExcelTypeEnum.XLS) .sheet(sheetName) .doWrite(data); @@ -58,6 +58,7 @@ public class ExcelUtils { .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度 .registerWriteHandler(new SpinnerWriteHandler(col, value, col1, value1)) .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度 + .excelType(ExcelTypeEnum.XLS) .sheet(sheetName).doWrite(data); // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了 diff --git a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/SpinnerWriteHandler.java b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/SpinnerWriteHandler.java index b19de687..b81c567d 100644 --- a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/SpinnerWriteHandler.java +++ b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/SpinnerWriteHandler.java @@ -55,8 +55,9 @@ public class SpinnerWriteHandler implements SheetWriteHandler { DataValidation dataValidation = helper.createValidation(constraint, addressList); /*** 处理Excel兼容性问题 **/ if (dataValidation instanceof XSSFDataValidation) { - dataValidation.setSuppressDropDownArrow(true); + dataValidation.setSuppressDropDownArrow(true); //验证输入数据是否真确 dataValidation.setShowErrorBox(true); + dataValidation.setShowPromptBox(true); } else { dataValidation.setSuppressDropDownArrow(false); } diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/websocket/AttendanceWebSocketMessageListener.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/websocket/AttendanceWebSocketMessageListener.java index d9d3c579..ebf0c6d8 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/websocket/AttendanceWebSocketMessageListener.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/websocket/AttendanceWebSocketMessageListener.java @@ -20,6 +20,7 @@ import javax.annotation.Resource; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; @@ -90,6 +91,7 @@ public class AttendanceWebSocketMessageListener implements WebSocketMessageListe } if (object1.get("cmd").equals(AttendanceConstants.CMD_TO_CLIENT)) { + System.out.println("进来了"+ System.currentTimeMillis()); // 获取响应数据 DeviceResponseDTO dto = JsonUtils.parseObject2(object1.get("data").toString(), DeviceResponseDTO.class); @@ -133,11 +135,14 @@ public class AttendanceWebSocketMessageListener implements WebSocketMessageListe // 响应失败的情况 if (dto.getCode() != 0) { - if ("setPasswordRet".equals(dto.getCmd())) { + if (!object1.get("to").toString().isEmpty()) { + webSocketMessageSender.sendObject(object1.get("to").toString(), "attendance-message-send", object1); + }else { - redisTemplate.opsForValue().set(object1.get("from").toString() + "msg", dto.getCode() + "_" + dto.getMsg()); - redisTemplate.opsForValue().set(object1.get("from").toString(), "false"); + redisTemplate.opsForValue().set(object1.get("from").toString() + "msg", dto.getCode() + "_" + dto.getMsg(), 30, TimeUnit.SECONDS); + redisTemplate.opsForValue().set(object1.get("from").toString(), "false", 30, TimeUnit.SECONDS); } + return; } @@ -172,11 +177,10 @@ public class AttendanceWebSocketMessageListener implements WebSocketMessageListe String oldPassword = value.split("-")[0]; String newPassword = value.split("-")[1]; attendanceMachineApi.updateDevicePassword(object1.get("from").toString(), oldPassword, newPassword); - - redisTemplate.delete(object1.get("from").toString()); } break; } + redisTemplate.delete(object1.get("from").toString()); } if (!object1.get("to").toString().isEmpty()) { diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 5c0b7be6..eeef6f3b 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -42,6 +42,7 @@ public interface ErrorCodeConstants { ErrorCode USER_PASSWORD_FAILED = new ErrorCode(1_002_003_005, "用户密码校验失败"); ErrorCode USER_IS_DISABLE = new ErrorCode(1_002_003_006, "名字为【{}】的用户已被禁用"); ErrorCode USER_COUNT_MAX = new ErrorCode(1_002_003_008, "创建用户失败,原因:超过租户最大租户配额({})!"); + ErrorCode FACTORY_NOT_DEPT = new ErrorCode(1_002_003_009, "该工厂没有对应的部门,请联系管理员添加部门"); // ========== 部门模块 1-002-004-000 ========== ErrorCode DEPT_NAME_DUPLICATE = new ErrorCode(1_002_004_000, "已经存在该名字的部门"); @@ -235,13 +236,17 @@ public interface ErrorCodeConstants { ErrorCode THE_CORRESPONDING_ASSET_TYPE_WAS_NOT_FOUND = new ErrorCode(1_010_001_006, "未找到对应的资产类型!"); // ========== 考勤设备相关 1-011-001-001 ========== - ErrorCode USERS_EXT_NOT_EXISTS = new ErrorCode(1_011_001_001, "用户信息不存在"); + ErrorCode USERS_EXT_NOT_EXISTS = new ErrorCode(1_011_001_001, "用户信息不存在!"); - ErrorCode USERS_FACE_EXISTS = new ErrorCode(1_011_001_002, "用户人脸图片已存在"); + ErrorCode USERS_FACE_EXISTS = new ErrorCode(1_011_001_002, "用户人脸图片已存在!"); - ErrorCode ATTENDANCE_MACHINE_NOT_EXISTS = new ErrorCode(1_011_002_001, "设备不存在"); + ErrorCode USERS_EXT_EXISTS = new ErrorCode(1_011_001_003, "用户信息已存在!"); - ErrorCode ATTENDANCE_PASSWORD_NOT_EQUAL = new ErrorCode(1_011_002_002, "旧密码错误,请重新输入"); + ErrorCode ATTENDANCE_MACHINE_NOT_EXISTS = new ErrorCode(1_011_002_001, "设备不存在!"); - ErrorCode REQUEST_FAILURE = new ErrorCode(1_011_002_003, "请求失败"); + ErrorCode ATTENDANCE_PASSWORD_NOT_EQUAL = new ErrorCode(1_011_002_002, "旧密码错误,请重新输入!"); + + ErrorCode REQUEST_FAILURE = new ErrorCode(1_011_002_003, "请求失败!"); + + ErrorCode DEVICE_NO_EXISTS = new ErrorCode(1_011_002_004, "设备号已存在!"); } diff --git a/yudao-module-system/yudao-module-system-biz/pom.xml b/yudao-module-system/yudao-module-system-biz/pom.xml index ffe9265f..e9208e7f 100644 --- a/yudao-module-system/yudao-module-system-biz/pom.xml +++ b/yudao-module-system/yudao-module-system-biz/pom.xml @@ -176,6 +176,12 @@ com.github.binarywang wx-java-miniapp-spring-boot-starter + + cn.iocoder.cloud + zn-module-smartfactory-api + 2.0.0-jdk8-snapshot + compile + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/AttendanceMachineController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/AttendanceMachineController.java index d46487a5..288e2c2e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/AttendanceMachineController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/AttendanceMachineController.java @@ -118,7 +118,7 @@ public class AttendanceMachineController { } Long currentTime = System.currentTimeMillis(); - if (currentTime - startTime > 3000) { + if (currentTime - startTime > 5000) { throw exception(REQUEST_FAILURE); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/UsersExtController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/UsersExtController.java index 92aa46cd..baf60a71 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/UsersExtController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/UsersExtController.java @@ -76,14 +76,7 @@ public class UsersExtController { @Operation(summary = "上传照片") @Parameter(name = "createReqVO", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('system:users-ext:create')") - public CommonResult createUsersExt(@ModelAttribute UsersExtSaveReqVO createReqVO, @RequestParam("faceFile") MultipartFile file) throws Exception { - - if (file == null || file.isEmpty()) { - - usersExtService.deleteUserFaceImg(getLoginUserId()); - - return success(1L); - } + public CommonResult createUsersExt(@ModelAttribute UsersExtSaveReqVO createReqVO, @RequestParam("faceFile") MultipartFile file) throws Exception { UsersExtDO updateDO = BeanUtils.toBean(createReqVO, UsersExtDO.class); return success(usersExtService.createUsersExt(updateDO, file)); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/vo/userExt/UsersExtSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/vo/userExt/UsersExtSaveReqVO.java index 671c3f61..9c3ae567 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/vo/userExt/UsersExtSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/vo/userExt/UsersExtSaveReqVO.java @@ -21,6 +21,12 @@ public class UsersExtSaveReqVO { @NotNull(message = "部门编号不能为空") private Long deptId; + @Schema(description = "工种类型 | 字典值 参考user_work_type") + private Integer workType; + + @Schema(description = "图片地址") + private String faceImg; + @Schema(description = "绑定的考勤机设备号集合") private List attendanceMachineNos; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/vo/websocket/AddUserVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/vo/websocket/AddUserVO.java new file mode 100644 index 00000000..819d19bf --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/vo/websocket/AddUserVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.system.controller.admin.equipment.vo.websocket; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "下发用户命令 VO") +@Data +public class AddUserVO { + + @Schema(description = "指令") + private String cmd = "editUser"; + + @Schema(description = "用户id") + private String user_id; + + @Schema(description = "用户姓名") + private String name; + + @Schema(description = "人脸图片url") + private String face_template; + + @Schema(description = "人员有效期") + private String id_valid; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/vo/websocket/DeleteUserVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/vo/websocket/DeleteUserVO.java new file mode 100644 index 00000000..4b4036da --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/vo/websocket/DeleteUserVO.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.module.system.controller.admin.equipment.vo.websocket; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "删除用户命令 VO") +@Data +public class DeleteUserVO { + + @Schema(description = "指令") + private String cmd; + + @Schema(description = "用户id") + private String[] user_ids; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/FactoryUserController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/FactoryUserController.java new file mode 100644 index 00000000..f0da4d15 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/FactoryUserController.java @@ -0,0 +1,179 @@ +package cn.iocoder.yudao.module.system.controller.admin.user; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.smartfactory.api.factoryInfo.FactoryInfoApi; +import cn.iocoder.yudao.module.smartfactory.api.factoryInfo.dto.FactoryInfoDTO; +import cn.iocoder.yudao.module.system.controller.admin.equipment.vo.userExt.UsersExtRespVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.factoryUser.FactoryUserPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.factoryUser.FactoryUserRespVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.factoryUser.FactoryUserSaveReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserRespVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO; +import cn.iocoder.yudao.module.system.convert.user.FactoryUserConvert; +import cn.iocoder.yudao.module.system.convert.user.UserConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; +import cn.iocoder.yudao.module.system.dal.dataobject.equipment.UsersExtDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.system.service.dept.DeptService; +import cn.iocoder.yudao.module.system.service.dict.DictDataService; +import cn.iocoder.yudao.module.system.service.equipment.UsersExtService; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; +import cn.iocoder.yudao.module.system.service.user.FactoryUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.context.annotation.Lazy; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - 工厂用户") +@RestController +@RequestMapping("/system/factory-user") +@Validated +public class FactoryUserController { + + @Resource + private FactoryUserService factoryUserService; + + @Resource + private AdminUserService userService; + + @Resource + @Lazy + private DeptService deptService; + + @Resource + private DictDataService dictDataService; + + @Resource + @Lazy + private UsersExtService usersExtService; + + @Resource + private FactoryInfoApi factoryInfoApi; + + @PostMapping(value = "/create") + @Operation(summary = "新增工厂用户") + @PreAuthorize("@ss.hasPermission('system:factory-user:create')") + public CommonResult createUser(@RequestBody FactoryUserSaveReqVO reqVO) { + + String msg = factoryUserService.createUser(reqVO); + + if (msg == null) { + + return success("true"); + }else { + + return error(-1, msg); + } + } + + @PutMapping(value = "/update") + @Operation(summary = "修改工厂用户") + @PreAuthorize("@ss.hasPermission('system:factory-user:update')") + public CommonResult updateUser(@RequestBody FactoryUserSaveReqVO reqVO) { + + String msg = factoryUserService.updateUser(reqVO); + + if (msg == null) { + + return success("true"); + }else { + + return error(-1, msg); + } + } + + @DeleteMapping("/delete") + @Operation(summary = "删除工厂用户") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:factory-user:delete')") + public CommonResult deleteUser(@RequestParam("id") Long id) { + factoryUserService.deleteUser(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得工厂用户详情") + @Parameter(name = "id", description = "编号", required = true, example = "146") + @PreAuthorize("@ss.hasPermission('system:user:query')") + public CommonResult getUser(@RequestParam("id") Long id) { + + AdminUserDO user = userService.getUser(id); + + // 获得部门信息 + DeptDO deptDO = deptService.getDept(user.getDeptId()); + + // 获得工厂信息 + FactoryInfoDTO factoryInfoDTO = factoryInfoApi.getFactoryInfo(deptDO.getFactoryId()).getCheckedData(); + + // 获得拓展信息 + UsersExtDO usersExtDO = usersExtService.getUsersExtByUserId(user.getId()); + + // 获得工种 字典信息 + DictDataDO dictDataDO = dictDataService.getDictData("user_work_type", String.valueOf(usersExtDO.getWorkType())); + + return success(FactoryUserConvert.INSTANCE.convert(user, factoryInfoDTO, dictDataDO, usersExtDO)); + } + + @GetMapping("/page") + @Operation(summary = "获得工厂用户分页列表") + @PreAuthorize("@ss.hasPermission('system:user:list')") + public CommonResult> getUserPage(@Valid FactoryUserPageReqVO pageReqVO) { + + // 获得用户分页列表 + PageResult pageResult = userService.getFactoryUserPage(pageReqVO); + + if (pageResult.getList() == null || pageResult.getList().isEmpty()) { + return success(new PageResult<>(new ArrayList<>(), 0L)); + } + + // 部门信息 + List deptDOs = deptService.getDeptList(convertList(pageResult.getList(), AdminUserDO::getDeptId)); + // 获得工厂信息 + List factoryInfoDTOS = factoryInfoApi.getFactoryInfoList(convertList(deptDOs, DeptDO::getFactoryId)).getCheckedData(); + Map factoryInfoMap = new HashMap<>(); + if (factoryInfoDTOS != null && !factoryInfoDTOS.isEmpty()) { + + factoryInfoMap = deptDOs.stream() + .collect(Collectors.toMap(DeptDO::getId, + dept -> factoryInfoDTOS.stream(). + filter(info -> info.getId().equals(dept.getFactoryId())) + .findFirst().orElseGet(FactoryInfoDTO::new))); + } + + // 获得拓展信息 + List usersExtDOS = usersExtService.getListByUserId(convertList(pageResult.getList(), AdminUserDO::getId)); + Map usersExtDOMap = convertMap(usersExtDOS, UsersExtDO::getUserId); + + // 获得工种 字典信息 + List workTypes = usersExtDOS.stream().map(info -> info.getWorkType().toString()).collect(Collectors.toList()); + List dictDataDO = dictDataService.getDictDataList("user_work_type", workTypes); + + // 获得工种MAP + Map dictDataMap = convertMap(dictDataDO, DictDataDO::getValue); + + return success(new PageResult<>(FactoryUserConvert.INSTANCE.convertList(pageResult.getList(), factoryInfoMap, dictDataMap, usersExtDOMap), + pageResult.getTotal())); + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/factoryUser/FactoryUserPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/factoryUser/FactoryUserPageReqVO.java new file mode 100644 index 00000000..d0b1a862 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/factoryUser/FactoryUserPageReqVO.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.system.controller.admin.user.vo.factoryUser; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 工厂用户分页 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class FactoryUserPageReqVO extends PageParam { + + @Schema(description = "用户昵称,模糊匹配", example = "张三") + private String nickname; + + @Schema(description = "工厂ID", example = "1000009") + private Long factoryId; + + @Schema(description = "创建时间", example = "[2022-07-01 00:00:00, 2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/factoryUser/FactoryUserRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/factoryUser/FactoryUserRespVO.java new file mode 100644 index 00000000..0d6c471d --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/factoryUser/FactoryUserRespVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.system.controller.admin.user.vo.factoryUser; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 工厂用户信息 Response VO") +@Data +public class FactoryUserRespVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1") + private Long id; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + private String nickname; + + @Schema(description = "工厂ID", example = "1000009") + private Long factoryId; + + @Schema(description = "工厂名称", example = "IT 部") + private String shortName; + + @Schema(description = "工种编号") + private Integer workType; + + @Schema(description = "工种名称") + private String workTypeName; + + @Schema(description = "手机号码", example = "15601691300") + private String mobile; + + @Schema(description = "身份证号码") + private String idcard; + + @Schema(description = "人脸图片") + private String faceImg; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/factoryUser/FactoryUserSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/factoryUser/FactoryUserSaveReqVO.java new file mode 100644 index 00000000..fc7de185 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/factoryUser/FactoryUserSaveReqVO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.system.controller.admin.user.vo.factoryUser; + +import cn.iocoder.yudao.framework.common.validation.IdCard; +import cn.iocoder.yudao.framework.common.validation.Mobile; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 工厂用户创建/修改 Request VO") +@Data +public class FactoryUserSaveReqVO { + + @Schema(description = "用户编号", example = "146") + private Long id; + + @Schema(description = "用户名称", example = "张三") + private String nickname; + + @Schema(description = "工厂ID", example = "1000009") + private Long factoryId; + + @Schema(description = "手机号码", example = "15601691300") + @Mobile + private String mobile; + + @Schema(description = "身份证号码") + @IdCard + private String idcard; + + @Schema(description = "工种 | 字典值 参考user_work_type") + private Integer workType; + + @Schema(description = "人脸图片url") + private String faceImg; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/user/FactoryUserConvert.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/user/FactoryUserConvert.java new file mode 100644 index 00000000..8e6bfaef --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/user/FactoryUserConvert.java @@ -0,0 +1,73 @@ +package cn.iocoder.yudao.module.system.convert.user; + +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.smartfactory.api.factoryInfo.dto.FactoryInfoDTO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.factoryUser.FactoryUserRespVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserRespVO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; +import cn.iocoder.yudao.module.system.dal.dataobject.equipment.UsersExtDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface FactoryUserConvert { + + FactoryUserConvert INSTANCE = Mappers.getMapper(FactoryUserConvert.class); + + default List convertList(List list, + Map factoryInfoMap, + Map dictDataMap, + Map usersExtDOMap) { + + return CollectionUtils.convertList(list, user -> convert(user, factoryInfoMap.get(user.getDeptId()), dictDataMap, usersExtDOMap.get(user.getId()))); + } + + default FactoryUserRespVO convert(AdminUserDO user, FactoryInfoDTO factoryInfo, Map dict, UsersExtDO usersExt) { + + FactoryUserRespVO userVO = BeanUtils.toBean(user, FactoryUserRespVO.class); + if (factoryInfo != null) { + + userVO.setFactoryId(factoryInfo.getId()); + userVO.setShortName(factoryInfo.getShortName()); + } + + if (usersExt != null) { + + userVO.setFaceImg(usersExt.getFaceImg()); + userVO.setWorkType(usersExt.getWorkType()); + userVO.setWorkTypeName(dict.get(usersExt.getWorkType().toString()).getLabel()); + } + + return userVO; + } + + default FactoryUserRespVO convert(AdminUserDO user, FactoryInfoDTO factoryInfoDTO, DictDataDO dict, UsersExtDO usersExt) { + + FactoryUserRespVO userVO = BeanUtils.toBean(user, FactoryUserRespVO.class); + if (factoryInfoDTO != null) { + + userVO.setFactoryId(factoryInfoDTO.getId()); + userVO.setShortName(factoryInfoDTO.getShortName()); + } + + if (usersExt != null) { + + userVO.setWorkType(usersExt.getWorkType()); + userVO.setFaceImg(usersExt.getFaceImg()); + } + + if (dict != null) { + + userVO.setWorkTypeName(dict.getLabel()); + } + + return userVO; + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/equipment/UsersExtDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/equipment/UsersExtDO.java index ed40b5f8..0233b185 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/equipment/UsersExtDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/equipment/UsersExtDO.java @@ -39,6 +39,12 @@ public class UsersExtDO extends BaseDO { */ private Long deptId; + /** + * 工种编号 字典值 参考 user_work_type + * (针对工厂用户) + */ + private Integer workType; + /** * 人脸图片 */ diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java index c2f7d222..de5312e0 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.user; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.factoryUser.FactoryUserPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserRespVO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; @@ -43,6 +44,15 @@ public interface AdminUserMapper extends BaseMapperX { .orderByDesc(AdminUserDO::getId)); } + default PageResult selectFactoryUserPage(FactoryUserPageReqVO reqVO, Long deptId) { + + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(AdminUserDO::getNickname, reqVO.getNickname()) + .eqIfPresent(AdminUserDO::getDeptId, deptId) + .eq(AdminUserDO::getUserType, 2) + .orderByDesc(AdminUserDO::getId)); + } + default List selectListByNickname(String nickname) { return selectList(new LambdaQueryWrapperX().like(AdminUserDO::getNickname, nickname)); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/rpc/config/RpcConfiguration.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/rpc/config/RpcConfiguration.java index 57ba6740..9e7ca372 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/rpc/config/RpcConfiguration.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/rpc/config/RpcConfiguration.java @@ -2,10 +2,11 @@ package cn.iocoder.yudao.module.system.framework.rpc.config; import cn.iocoder.yudao.module.infra.api.file.FileApi; import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi; +import cn.iocoder.yudao.module.smartfactory.api.factoryInfo.FactoryInfoApi; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = false) -@EnableFeignClients(clients = {FileApi.class, WebSocketSenderApi.class}) +@EnableFeignClients(clients = {FileApi.class, WebSocketSenderApi.class, FactoryInfoApi.class}) public class RpcConfiguration { } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java index a229813d..15670acc 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java @@ -102,7 +102,16 @@ public interface DeptService { */ List getDeptByLeaderId(Long leaderUserId); + /** + * 获得 部门树 + * @return 部门列表 + */ List getDeptTree(); + /** + * 获得指定部门信息 + * @param factoryId 工厂编号 + * @return 部门信息 + */ DeptDO getDeptByFactoryId(Long factoryId); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java index a752476d..6ccf353e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java @@ -90,6 +90,15 @@ public interface DictDataService { */ DictDataDO getDictData(String dictType, String value); + /** + * 获得指定的字典数据列表 + * + * @param dictType 字典类型 + * @param value 字典数据值 + * @return 字典数据 + */ + List getDictDataList(String dictType, Collection value); + /** * 解析获得指定的字典数据,从缓存中 * diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java index b9b87f0c..ab1a7b91 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java @@ -164,6 +164,12 @@ public class DictDataServiceImpl implements DictDataService { return dictDataMapper.selectByDictTypeAndValue(dictType, value); } + @Override + public List getDictDataList(String dictType, Collection value) { + + return dictDataMapper.selectByDictTypeAndValues(dictType, value); + } + @Override public DictDataDO parseDictData(String dictType, String label) { return dictDataMapper.selectByDictTypeAndLabel(dictType, label); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineService.java index 967ad233..88fcd396 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineService.java @@ -84,4 +84,11 @@ public interface AttendanceMachineService { * @return 设备列表 */ List getListByStatus(); + + /** + * 获得指定部门绑定的设备列表 + * @param deptId 部门编号 + * @return 设备信息列表 + */ + List getListByDeptId(Long deptId); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineServiceImpl.java index 3a50f832..ea195af1 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineServiceImpl.java @@ -33,8 +33,7 @@ import java.util.Map; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.ATTENDANCE_MACHINE_NOT_EXISTS; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.ATTENDANCE_PASSWORD_NOT_EQUAL; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; /** * 考勤设备 Service 实现类 @@ -92,7 +91,7 @@ public class AttendanceMachineServiceImpl implements AttendanceMachineService { public void updateAttendanceMachine(AttendanceMachineSaveReqVO updateReqVO) { // 校验存在 - validateAttendanceMachineExists(updateReqVO.getId()); + validateAttendanceMachineExists(updateReqVO.getId(), updateReqVO.getDeviceNo()); //如果分配机构的情况, 则调用资产分配方法 if (updateReqVO.getDeptId() != null) { @@ -146,10 +145,15 @@ public class AttendanceMachineServiceImpl implements AttendanceMachineService { attendanceMachineMapper.update(attendanceMachineDO, new LambdaUpdateWrapper().eq(AttendanceMachineDO::getDeviceNo, updateReqVO.getDeviceNo())); } - private void validateAttendanceMachineExists(Long id) { + private void validateAttendanceMachineExists(Long id, String deviceNo) { + if (attendanceMachineMapper.selectById(id) == null) { throw exception(ATTENDANCE_MACHINE_NOT_EXISTS); } + + if (attendanceMachineMapper.selectCount(AttendanceMachineDO::getDeviceNo, deviceNo) > 0L) { + throw exception(DEVICE_NO_EXISTS); + } } @Override @@ -250,4 +254,10 @@ public class AttendanceMachineServiceImpl implements AttendanceMachineService { return attendanceMachineMapper.selectList(); } + + @Override + public List getListByDeptId(Long deptId) { + + return attendanceMachineMapper.selectList(AttendanceMachineDO::getDeptId, deptId); + } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/UsersExtService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/UsersExtService.java index 2c2a9dec..40561f58 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/UsersExtService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/UsersExtService.java @@ -20,13 +20,19 @@ import java.util.List; */ public interface UsersExtService { + /** + * 创建用户信息 + * @param createReqVO 创建信息 + */ + void createUsers(UsersExtSaveReqVO createReqVO); + /** * 创建用户信息拓展 * * @param updateDO 创建信息 * @return 编号 */ - Long createUsersExt(UsersExtDO updateDO, MultipartFile file) throws IOException; + String createUsersExt(UsersExtDO updateDO, MultipartFile file) throws IOException; /** * 更新用户信息拓展 @@ -35,6 +41,12 @@ public interface UsersExtService { */ void updateUsersExt(@Valid UsersExtSaveReqVO updateReqVO); + /** + * 修改用户信息 + * @param updateReqVO 更新信息 + */ + void updateUser(UsersExtSaveReqVO updateReqVO); + /** * 批量更新用户 所下发得设备信息 * @@ -45,7 +57,7 @@ public interface UsersExtService { /** * 删除用户人脸信息 */ - void deleteUserFaceImg(Long userId) throws Exception; + void deleteUser(Long userId); /** * 获得用户信息拓展 @@ -55,6 +67,14 @@ public interface UsersExtService { */ UsersExtDO getUsersExt(Long id); + /** + * 获得用户信息拓展 + * + * @param userId 用户编号 + * @return 用户信息拓展 + */ + UsersExtDO getUsersExtByUserId(Long userId); + /** * 获得指定得用户信息列表 * @param userId 用户编号 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/UsersExtServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/UsersExtServiceImpl.java index 2eede9a8..98e2bcfa 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/UsersExtServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/UsersExtServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.io.IoUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; import cn.iocoder.yudao.module.infra.api.file.FileApi; @@ -70,7 +71,19 @@ public class UsersExtServiceImpl implements UsersExtService { private DistributeRecordService recordService; @Override - public Long createUsersExt(UsersExtDO updateDO, MultipartFile file) throws IOException { + public void createUsers(UsersExtSaveReqVO createReqVO) { + + if (usersExtMapper.selectCount(UsersExtDO::getUserId, createReqVO.getUserId()) > 0L) { + + throw exception(USERS_EXT_EXISTS); + } + + UsersExtDO usersExtDO = BeanUtils.toBean(createReqVO, UsersExtDO.class); + usersExtMapper.insert(usersExtDO); + } + + @Override + public String createUsersExt(UsersExtDO updateDO, MultipartFile file) throws IOException { String url = null; String name = null; @@ -145,7 +158,7 @@ public class UsersExtServiceImpl implements UsersExtService { } // 返回 - return updateDO.getUserId(); + return url; } @Override @@ -158,6 +171,19 @@ public class UsersExtServiceImpl implements UsersExtService { usersExtMapper.updateById(updateObj); } + @Override + public void updateUser(UsersExtSaveReqVO updateReqVO) { + + // 校验存在 + validateUsersExtExists(updateReqVO.getUserId()); + + // 更新 + UsersExtDO updateObj = BeanUtils.toBean(updateReqVO, UsersExtDO.class); + + usersExtMapper.update(updateObj, + new LambdaQueryWrapperX().eq(UsersExtDO::getUserId, updateReqVO.getUserId())); + } + @Override public void updateListUsersExt(List updateDo) { @@ -166,18 +192,18 @@ public class UsersExtServiceImpl implements UsersExtService { } @Override - public void deleteUserFaceImg(Long userId) throws Exception { + public void deleteUser(Long userId) { //校验 当前用户人脸信息是否已存在 UsersExtDO usersExtDO = usersExtMapper.selectOne(UsersExtDO::getUserId, userId); + List deviceNos = new ArrayList<>(); if (usersExtDO != null) { - //删除 文件存储器中人脸图片 - fileApi.deleteBpmFile(usersExtDO.getFaceImg()); - - //更新 清空人脸图片信息 - usersExtMapper.updateFaceImg(usersExtDO.getId()); + deviceNos = usersExtDO.getAttendanceMachineNos(); + usersExtMapper.delete(UsersExtDO::getUserId, userId); } + + } private void validateUsersExtExists(Long userId) { @@ -193,6 +219,12 @@ public class UsersExtServiceImpl implements UsersExtService { return usersExtMapper.selectById(id); } + @Override + public UsersExtDO getUsersExtByUserId(Long userId) { + + return usersExtMapper.selectOne(UsersExtDO::getUserId, userId); + } + @Override public List getListByUserId(List userId) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java index 7580439a..64d1a474 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.service.user; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.factoryUser.FactoryUserPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; @@ -130,6 +131,14 @@ public interface AdminUserService { */ PageResult getUserPage(UserPageReqVO reqVO); + /** + * 获得工厂用户分页列表 + * + * @param reqVO 分页条件 + * @return 分页列表 + */ + PageResult getFactoryUserPage(FactoryUserPageReqVO reqVO); + /** * 通过用户 ID 查询用户 * diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java index 18b67c4d..97e645ea 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java @@ -13,6 +13,7 @@ import cn.iocoder.yudao.framework.common.util.string.DTO.IdCardDO; import cn.iocoder.yudao.framework.common.util.string.StrUtils; import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils; import cn.iocoder.yudao.module.infra.api.file.FileApi; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.factoryUser.FactoryUserPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; @@ -233,6 +234,8 @@ public class AdminUserServiceImpl implements AdminUserService { userMapper.deleteById(id); // 删除用户关联数据 permissionService.processUserDeleted(id); + // 删除用户拓展信息 + // 删除用户岗位 userPostMapper.deleteByUserId(id); } @@ -252,6 +255,20 @@ public class AdminUserServiceImpl implements AdminUserService { return userMapper.selectPage(reqVO, getDeptCondition(reqVO.getDeptId())); } + @Override + public PageResult getFactoryUserPage(FactoryUserPageReqVO reqVO) { + + // 根据工厂ID 获取 对应部门ID + DeptDO deptDO = deptService.getDeptByFactoryId(reqVO.getFactoryId()); + + if (reqVO.getFactoryId() != null && deptDO == null) { + + return new PageResult<>(); + } + + return userMapper.selectFactoryUserPage(reqVO, deptDO == null ? null : deptDO.getId()); + } + @Override public AdminUserDO getUser(Long id) { return userMapper.selectById(id); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/FactoryUserService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/FactoryUserService.java new file mode 100644 index 00000000..e5531b1b --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/FactoryUserService.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.system.service.user; + +import cn.iocoder.yudao.module.system.controller.admin.user.vo.factoryUser.FactoryUserSaveReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +/** + * 后台工厂用户 Service 接口 + */ +public interface FactoryUserService { + + /** + * 创建工厂用户 + * + * @param reqVO 创建信息 + * @return 用户ID + */ + String createUser(FactoryUserSaveReqVO reqVO); + + /** + * 修改工厂用户 + * @param reqVO 修改信息 + */ + String updateUser(FactoryUserSaveReqVO reqVO); + + /** + * 删除工厂用户 + * @param id 用户id + */ + void deleteUser(Long id); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/FactoryUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/FactoryUserServiceImpl.java new file mode 100644 index 00000000..0d71432a --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/FactoryUserServiceImpl.java @@ -0,0 +1,228 @@ +package cn.iocoder.yudao.module.system.service.user; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.infra.api.file.FileApi; +import cn.iocoder.yudao.module.system.controller.admin.equipment.vo.userExt.UsersExtSaveReqVO; +import cn.iocoder.yudao.module.system.controller.admin.equipment.vo.websocket.AddUserVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.factoryUser.FactoryUserSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.equipment.AttendanceMachineDO; +import cn.iocoder.yudao.module.system.dal.dataobject.equipment.UsersExtDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper; +import cn.iocoder.yudao.module.system.service.dept.DeptService; +import cn.iocoder.yudao.module.system.service.equipment.AttendanceMachineService; +import cn.iocoder.yudao.module.system.service.equipment.UsersExtService; +import cn.iocoder.yudao.module.system.service.tenant.TenantService; +import cn.iocoder.yudao.module.system.service.websocket.WebsocketService; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; + +/** + * 后台工厂用户 Service 实现类 + */ +@Service +@Slf4j +public class FactoryUserServiceImpl implements FactoryUserService{ + + @Resource + @Lazy // 延迟,避免循环依赖报错 + private TenantService tenantService; + + @Resource + private AdminUserMapper userMapper; + + @Resource + private PasswordEncoder passwordEncoder; + + @Resource + @Lazy + private UsersExtService usersExtService; + + @Resource + @Lazy + private DeptService deptService; + + @Resource + private AttendanceMachineService attendanceMachineService; + + @Resource + private WebsocketService websocketService; + + @Override + @Transactional(rollbackFor = Exception.class) // 异常回滚 + public String createUser(FactoryUserSaveReqVO createReqVO){ + + // 校验账户配合 + tenantService.handleTenantInfo(tenant -> { + long count = userMapper.selectCount(); + if (count >= tenant.getAccountCount()) { + throw exception(USER_COUNT_MAX, tenant.getAccountCount()); + } + }); + + // 校验手机号唯一 + validateMobileUnique(createReqVO.getMobile()); + + // 根据工厂ID 获取 对应部门ID + DeptDO deptDO = deptService.getDeptByFactoryId(createReqVO.getFactoryId()); + if (deptDO == null) { + throw exception(FACTORY_NOT_DEPT); + } + + // 插入用户 + AdminUserDO user = BeanUtils.toBean(createReqVO, AdminUserDO.class); + user.setDeptId(deptDO.getId()); + user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 + user.setPassword(encodePassword("123456")); // 设置默认密码 + user.setUserType(2); // 设置用户类型为 工厂用户 + userMapper.insert(user); + + // 查询部门下是否绑定考勤设备 + List attendanceMachineDOS = attendanceMachineService.getListByDeptId(deptDO.getId()); + + // 插入人脸图片 + UsersExtSaveReqVO usersExtDO = BeanUtils.toBean(createReqVO, UsersExtSaveReqVO.class); + usersExtDO.setUserId(user.getId()); + usersExtDO.setDeptId(deptDO.getId()); + usersExtDO.setAttendanceMachineNos(convertList(attendanceMachineDOS, AttendanceMachineDO::getDeviceNo)); + usersExtService.createUsers(usersExtDO); + + try { + + for (AttendanceMachineDO machineDO : attendanceMachineDOS) { + + // 设置下发命令 + AddUserVO addUserVO = new AddUserVO() + .setCmd("addUser") + .setUser_id(String.valueOf(user.getId())) + .setName(createReqVO.getNickname()) + .setFace_template(usersExtDO.getFaceImg()) + .setId_valid(""); + + // 发送指令至 考勤设备 下发员工 + websocketService.sendSn(machineDO.getDeviceNo(), addUserVO, 1); + } + } catch (RuntimeException ex) { + + return ex.getMessage(); + } + + return null; + } + + @VisibleForTesting + void validateMobileUnique(String mobile) { + if (StrUtil.isBlank(mobile)) { + return; + } + AdminUserDO user = userMapper.selectByMobile(mobile); + if (user == null) { + return; + } + + if (!user.getMobile().equals(mobile)) { + throw exception(USER_MOBILE_EXISTS); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) // 异常回滚 + public String updateUser(FactoryUserSaveReqVO reqVO) { + + // 校验是否存在 + validateId(reqVO.getId()); + + // 根据工厂ID 获取 对应部门ID + DeptDO deptDO = deptService.getDeptByFactoryId(reqVO.getFactoryId()); + if (deptDO == null) { + throw exception(FACTORY_NOT_DEPT); + } + + // 更新用户信息 + AdminUserDO userDO = BeanUtils.toBean(reqVO, AdminUserDO.class); + userDO.setDeptId(deptDO.getId()); + userMapper.updateById(userDO); + + // 查询部门下是否绑定考勤设备 + List attendanceMachineDOS = attendanceMachineService.getListByDeptId(deptDO.getId()); + + // 同步更新用户拓展表中 人脸信息 + UsersExtSaveReqVO usersExt = new UsersExtSaveReqVO() + .setUserId(reqVO.getId()) + .setDeptId(deptDO.getId()) + .setAttendanceMachineNos(convertList(attendanceMachineDOS, AttendanceMachineDO::getDeviceNo)) + .setWorkType(reqVO.getWorkType()) + .setFaceImg(reqVO.getFaceImg()); + usersExtService.updateUser(usersExt); + + try { + + // 如果修改人脸图片的情况 + for (AttendanceMachineDO machineDO : attendanceMachineDOS) { + + // 设置下发命令 + AddUserVO addUserVO = new AddUserVO() + .setCmd("addUser") + .setUser_id(String.valueOf(reqVO.getId())) + .setName(reqVO.getNickname()) + .setFace_template(reqVO.getFaceImg()) + .setId_valid(""); + + // 发送指令至 考勤设备 修改员工信息 + websocketService.sendSn(machineDO.getDeviceNo(), addUserVO, 1); + } + }catch (RuntimeException ex) { + + return ex.getMessage(); + } + + return null; + } + + @Override + public void deleteUser(Long id) { + + // 校验是否存在 + validateId(id); + + // 删除用户信息 + userMapper.deleteById(id); + + // 同步删除用户拓展信息 + usersExtService.deleteUser(id); + } + + private void validateId(Long id) { + + if (userMapper.selectCount(AdminUserDO::getId, id) == 0L) { + throw exception(USER_USERNAME_EXISTS); + } + } + + /** + * 对密码进行加密 + * + * @param password 密码 + * @return 加密后的密码 + */ + private String encodePassword(String password) { + return passwordEncoder.encode(password); + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/websocket/WebsocketService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/websocket/WebsocketService.java new file mode 100644 index 00000000..dbe20cf2 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/websocket/WebsocketService.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.module.system.service.websocket; + +/** + * websocket 指令发送service + */ +public interface WebsocketService { + + /** + * 发送指令至考勤设备 + * @param deviceNo 设备号 + * @param data 指令信息 + * @param type 命令类型 + */ + void sendSn(String deviceNo, Object data, Integer type); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/websocket/WebsocketServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/websocket/WebsocketServiceImpl.java new file mode 100644 index 00000000..48fccf12 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/websocket/WebsocketServiceImpl.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.system.service.websocket; + +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; +import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; +import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi; +import cn.iocoder.yudao.module.system.controller.admin.equipment.vo.websocket.WebsocketBaseVO; +import cn.iocoder.yudao.module.system.dal.dataobject.equipment.DistributeRecordDO; +import cn.iocoder.yudao.module.system.service.equipment.DistributeRecordService; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.xingyuv.http.util.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.Collections; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.REQUEST_FAILURE; + +/** + * websocket Service 实现类 + */ +@Service +@Slf4j +public class WebsocketServiceImpl implements WebsocketService{ + + @Resource + private DistributeRecordService recordService; + + @Resource + private WebSocketSenderApi webSocketSenderApi; + + @Resource + private StringRedisTemplate stringRedisTemplate; + + @Override + public void sendSn(String deviceNo, Object data, Integer type) { + + String requestId = IdWorker.get32UUID(); + + WebsocketBaseVO baseVO = new WebsocketBaseVO() + .setFrom("") + .setTo(deviceNo) + .setExtra(requestId + "_" + getLoginUserId()) + .setData(data); + + // 设置 设备下发记录 + DistributeRecordDO recordDO = new DistributeRecordDO(); + recordDO.setRequestId(requestId); + recordDO.setDeviceNo(deviceNo); + recordDO.setUserId(getLoginUserId()); + recordDO.setType(type); + recordDO.setResult("通讯失败"); + + // 更新下发记录信息 + recordService.createDistributeRecord(Collections.singletonList(recordDO)); + + // 设备租户ID + TenantContextHolder.setTenantId(1L); + stringRedisTemplate.opsForValue().set(deviceNo, "true"); + // 发送修改密码命令给设备 + webSocketSenderApi.sendSN(deviceNo, "attendance-message-send", JsonUtils.toJsonString(baseVO)); + + Long startTime = System.currentTimeMillis(); + while (true) { + String result = stringRedisTemplate.opsForValue().get(deviceNo); + if (StringUtil.isEmpty(result)) { + return; + } + + if ("false".equals(result)) { + String msg = stringRedisTemplate.opsForValue().get(deviceNo + "msg").split("_")[1]; + + // 清楚 redis缓存 + stringRedisTemplate.delete(deviceNo); + stringRedisTemplate.delete(deviceNo + "msg"); + + throw new RuntimeException(msg); + } + + try { + Thread.sleep(1000L); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + Long currentTime = System.currentTimeMillis(); + if (currentTime - startTime > 30000) { + throw exception(REQUEST_FAILURE); + } + } + } +} diff --git a/zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/api/factoryInfo/FactoryInfoApi.java b/zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/api/factoryInfo/FactoryInfoApi.java new file mode 100644 index 00000000..688887a9 --- /dev/null +++ b/zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/api/factoryInfo/FactoryInfoApi.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.smartfactory.api.factoryInfo; + + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.smartfactory.api.factoryInfo.dto.FactoryInfoDTO; +import cn.iocoder.yudao.module.smartfactory.enums.ApiConstants; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.Collection; +import java.util.List; + +@FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory = +@Tag(name = "RPC 服务 - 考勤设备") +public interface FactoryInfoApi { + + String PREFIX = ApiConstants.PREFIX + "/factory-info"; + + @GetMapping(PREFIX + "/get") + @Operation(summary = "获得工厂信息") + CommonResult getFactoryInfo(@RequestParam("factoryId") Long factoryId); + + @GetMapping(PREFIX + "/get-list") + @Operation(summary = "获得工厂信息列表") + CommonResult> getFactoryInfoList(@RequestParam("factoryId") Collection factoryId); +} diff --git a/zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/api/factoryInfo/dto/FactoryInfoDTO.java b/zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/api/factoryInfo/dto/FactoryInfoDTO.java new file mode 100644 index 00000000..fcb2160e --- /dev/null +++ b/zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/api/factoryInfo/dto/FactoryInfoDTO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.smartfactory.api.factoryInfo.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "RPC 服务 - 工厂信息 DTO") +@Data +public class FactoryInfoDTO { + + @Schema(description = "工厂编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "100009") + private Long id; + + @Schema(description = "工厂名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "江西省南昌市第一工厂") + private String name; + + @Schema(description = "工厂简称", requiredMode = Schema.RequiredMode.REQUIRED, example = "第一工厂") + private String shortName; + + @Schema(description = "工厂类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private String type; +} diff --git a/zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/enums/ApiConstants.java b/zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/enums/ApiConstants.java new file mode 100644 index 00000000..4b674b5b --- /dev/null +++ b/zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/enums/ApiConstants.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.module.smartfactory.enums; + +import cn.iocoder.yudao.framework.common.enums.RpcConstants; + +/** + * API 相关的枚举 + * + + */ +public class ApiConstants { + + /** + * 服务名 + * + * 注意,需要保证和 spring.application.name 保持一致 + */ + public static final String NAME = "smartfactory-server"; + + public static final String PREFIX = RpcConstants.RPC_API_PREFIX + "/smartfactory"; + + public static final String VERSION = "1.0.0"; + +} diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/api/factoryInfo/FactoryInfoApiImpl.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/api/factoryInfo/FactoryInfoApiImpl.java new file mode 100644 index 00000000..e74da7e1 --- /dev/null +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/api/factoryInfo/FactoryInfoApiImpl.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.smartfactory.api.factoryInfo; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.smartfactory.api.factoryInfo.dto.FactoryInfoDTO; +import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO; +import cn.iocoder.yudao.module.smartfactory.service.factoryinfo.FactoryInfoService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +import java.util.Collection; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@RestController // 提供 RESTful API 接口,给 Feign 调用 +@Validated +public class FactoryInfoApiImpl implements FactoryInfoApi { + + @Resource + private FactoryInfoService factoryInfoService; + + @Override + public CommonResult getFactoryInfo(Long factoryId) { + + FactoryInfoDO factoryInfoDO = factoryInfoService.getFactoryInfo(factoryId); + return success(BeanUtils.toBean(factoryInfoDO, FactoryInfoDTO.class)); + } + + @Override + public CommonResult> getFactoryInfoList(Collection factoryId) { + + List factoryInfoDOS = factoryInfoService.getFactoryList(factoryId); + return success(BeanUtils.toBean(factoryInfoDOS, FactoryInfoDTO.class)); + } +} diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/FactoryDataController.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/FactoryDataController.java index 301e86b3..9f755b1c 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/FactoryDataController.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/FactoryDataController.java @@ -32,6 +32,7 @@ import java.util.List; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; @Tag(name = "管理后台 - 工厂出库入库数据") @@ -146,15 +147,15 @@ public class FactoryDataController { // 获取工厂信息 List factoryInfoDOS = factoryInfoService.getFactoryListByType(); - List factory = factoryInfoDOS.stream().map(info -> info.getId() + ":" + info.getShortName()).collect(Collectors.toList()); + List factory = convertList(factoryInfoDOS, FactoryInfoDO::getShortName); // 获取规格信息 List sizeDOS = sizeService.getListSize(); List size = sizeDOS.stream().map(info -> info.getId() + ":" + info.getName()).collect(Collectors.toList()); // 输出 - ExcelUtils.write(response, "出入库数据导入模板.xlsx", "详情", - FactoryDataExportVO.class, null, + ExcelUtils.write(response, "出入库数据导入模板.xls", "详情", + FactoryDataImportVO.class, null, 0, factory, 2, size); } diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataImportVO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataImportVO.java index d78e2c25..a76e2ac5 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataImportVO.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataImportVO.java @@ -1,14 +1,20 @@ package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo; import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; +import javax.swing.border.TitledBorder; import java.time.LocalDate; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + /** * 出入库数据导入 VO */ @@ -22,7 +28,8 @@ public class FactoryDataImportVO { @ExcelProperty("工厂名称") private String factoryName; - @ExcelProperty("日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + @ExcelProperty(value = "日期") private LocalDate date; @ExcelProperty("规格") diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataServiceImpl.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataServiceImpl.java index cd9e3ab7..2120bbc1 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataServiceImpl.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataServiceImpl.java @@ -33,12 +33,14 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.*; @@ -225,7 +227,7 @@ public class FactoryDataServiceImpl implements FactoryDataService { groupedByFactoryIdAndDate.forEach((factoryId, dateMap) -> { //按日期倒叙 并遍历 - dateMap.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEach((date) -> { + dateMap.entrySet().stream().sorted(Map.Entry.>comparingByKey().reversed()).forEach((date) -> { FactoryDataDetailRespVO dataDetailRespVO = new FactoryDataDetailRespVO(); @@ -324,25 +326,25 @@ public class FactoryDataServiceImpl implements FactoryDataService { list.forEach(data -> { //校验,判断是否有不符合的原因 + Long factoryId = null; try { - validateFactoryForCreate(data.getFactoryName(), data.getSizeName(), data.getDate()); + factoryId = validateFactoryForCreate(data.getFactoryName(), data.getSizeName(), data.getDate()); } catch (ServiceException ex) { respVO.getFailureUsernames().put(data.getFactoryName(), ex.getMessage()); return; } - // 获取 工厂ID - Long factoryId = Long.valueOf(data.getFactoryName().split(":")[0]); // 获取 规格ID Long sizeId = Long.valueOf(data.getSizeName().split(":")[0]); // 获取 规格名称 String sizeName = data.getSizeName().split(":")[1]; PackageDO packageDO = packageService.getPackageByFactoryIdAndSize(factoryId, sizeId); - if (data.getNum() != null || data.getAutoNum() != null) { + if (packageDO != null && (data.getNum() != null || data.getAutoNum() != null)) { PackageDataDO packageDataDO = BeanUtils.toBean(packageDO, PackageDataDO.class); + packageDataDO.setId(null); packageDataDO.setPackageDate(data.getDate()); packageDataDO.setPackageId(packageDO.getId()); packageDataDO.setPackageName(packageDO.getName()); @@ -350,6 +352,9 @@ public class FactoryDataServiceImpl implements FactoryDataService { packageDataDO.setNum(data.getNum()); packageDataDO.setAutoNum(data.getAutoNum()); packageDataDO.setDamageNum(data.getDamageNum()); + packageDataDO.setCreator(getLoginUserId().toString()); + packageDataDO.setUpdater(null); + packageDataDO.setCreateTime(LocalDateTime.now()); //计算平方数 String[] size = sizeName.split("\\*"); @@ -372,7 +377,7 @@ public class FactoryDataServiceImpl implements FactoryDataService { FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO(); //设置规格信息 - dataSizeDO.setId(sizeId); + dataSizeDO.setSizeId(sizeId); dataSizeDO.setSizeName(sizeName); dataSizeDO.setSizePieces(packageDO == null ? null : packageDO.getSizePieces()); //设置工厂和日期 @@ -389,7 +394,7 @@ public class FactoryDataServiceImpl implements FactoryDataService { FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO(); //设置规格信息 - dataSizeDO.setId(sizeId); + dataSizeDO.setSizeId(sizeId); dataSizeDO.setSizeName(sizeName); dataSizeDO.setSizePieces(packageDO == null ? null : packageDO.getSizePieces()); //设置工厂和日期 @@ -406,7 +411,7 @@ public class FactoryDataServiceImpl implements FactoryDataService { FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO(); //设置规格信息 - dataSizeDO.setId(sizeId); + dataSizeDO.setSizeId(sizeId); dataSizeDO.setSizeName(sizeName); //设置工厂和日期 dataSizeDO.setFactoryId(factoryId); @@ -422,7 +427,7 @@ public class FactoryDataServiceImpl implements FactoryDataService { FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO(); //设置规格信息 - dataSizeDO.setId(sizeId); + dataSizeDO.setSizeId(sizeId); dataSizeDO.setSizeName(sizeName); //设置工厂和日期 dataSizeDO.setFactoryId(factoryId); @@ -443,7 +448,7 @@ public class FactoryDataServiceImpl implements FactoryDataService { return respVO; } - private void validateFactoryForCreate(String factoryName, String sizeName, LocalDate date) { + private Long validateFactoryForCreate(String factoryName, String sizeName, LocalDate date) { if (factoryName == null) { throw exception(FACTORY_INFO_NOT_EXISTS); @@ -453,13 +458,15 @@ public class FactoryDataServiceImpl implements FactoryDataService { throw exception(SIZE_NOT_EXISTS); } - String factoryId = factoryName.split(":")[0]; + FactoryInfoDO factoryInfoDO = factoryInfoService.getFactoryByName(factoryName); - Long count = factoryDataSizeMapper.selectCountByType(Long.valueOf(factoryId), date, Arrays.asList(1,2,3,4)); - List packageDOs = packageDataService.getListByFactoryIdAndDate(Long.valueOf(factoryId), date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); + Long count = factoryDataSizeMapper.selectCountByType(factoryInfoDO.getId(), date, Arrays.asList(1,2,3,4)); + List packageDOs = packageDataService.getListByFactoryIdAndDate(factoryInfoDO.getId(), date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); if (count > 0L || !packageDOs.isEmpty()) { throw exception(PACKAGE_DATA_EXISTS); } + + return factoryInfoDO.getId(); } } \ No newline at end of file diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factoryinfo/FactoryInfoService.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factoryinfo/FactoryInfoService.java index 076d8d09..dd583dc4 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factoryinfo/FactoryInfoService.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factoryinfo/FactoryInfoService.java @@ -105,4 +105,11 @@ public interface FactoryInfoService { * @return 工厂列表 */ List getFactoryListByAuthority(); + + /** + * 获得指定工厂信息 + * @param factoryName 工厂简称 + * @return 工厂信息 + */ + FactoryInfoDO getFactoryByName(String factoryName); } diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factoryinfo/FactoryInfoServiceImpl.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factoryinfo/FactoryInfoServiceImpl.java index e9a331bb..5b62f430 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factoryinfo/FactoryInfoServiceImpl.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factoryinfo/FactoryInfoServiceImpl.java @@ -216,4 +216,10 @@ public class FactoryInfoServiceImpl implements FactoryInfoService { return factoryInfoMapper.selectListByType(factoryIds); } + + @Override + public FactoryInfoDO getFactoryByName(String factoryName) { + + return factoryInfoMapper.selectOne(FactoryInfoDO::getShortName, factoryName); + } } \ No newline at end of file diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/mapper/factorydata/FactoryDataSizeMapper.xml b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/mapper/factorydata/FactoryDataSizeMapper.xml index bfb119de..3a33c06f 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/mapper/factorydata/FactoryDataSizeMapper.xml +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/mapper/factorydata/FactoryDataSizeMapper.xml @@ -77,7 +77,6 @@ - GROUP BY a.id,a.factory_id,a.package_name,a.package_date,a.size_id,a.size_name,a.size_pieces UNION @@ -109,7 +108,7 @@ FROM sf_package_data WHERE size_id = c.size_id - AND size_pieces != c.size_pieces + AND size_pieces = c.size_pieces AND package_date = c.date ) AND c.deleted = 0 @@ -133,6 +132,7 @@ GROUP BY c.factory_id,c.date,c.size_id,c.size_name + ORDER BY date DESC