From b3afa3cfd7e5e230c86cb9fe4134320771eaa814 Mon Sep 17 00:00:00 2001 From: cwchen <1048842385@qq.com> Date: Tue, 16 Jul 2024 18:16:31 +0800 Subject: [PATCH] =?UTF-8?q?mongodb=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bonus/system/api/RemoteFileService.java | 14 +- bonus-common/bonus-common-core/pom.xml | 6 + .../core/constant/BusinessConstants.java | 17 ++ .../common/core/utils/UploadCheckUtils.java | 100 +++++++ .../entity/bracelet/BraceletParamsDto.java | 22 +- .../common/entity/bracelet/vo/PersonVo.java | 49 +++- .../common/entity/file/ResourceFileVo.java | 49 ++++ .../security/utils/ValidatorsUtils.java | 100 +++++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + bonus-modules/bonus-bracelet/pom.xml | 6 + .../bracelet/BonusBraceletApplication.java | 3 +- .../controller/PersonMgeController.java | 51 +++- .../bracelet/mapper/PersonMgeMapper.java | 65 +++++ .../bracelet/mapper/ResourceFileMapper.java | 34 +++ .../bracelet/service/IPersonMgeService.java | 51 +++- .../service/impl/PersonMgeServiceImpl.java | 256 ++++++++++++++++++ .../mapper/bracelet/PersonMgeMapper.xml | 93 +++++++ .../mapper/bracelet/ResourceFileMapper.xml | 41 +++ .../mongodb/util/MongodbFileBase64Util.java | 2 +- 19 files changed, 943 insertions(+), 17 deletions(-) create mode 100644 bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/constant/BusinessConstants.java create mode 100644 bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/UploadCheckUtils.java create mode 100644 bonus-common/bonus-common-entity/src/main/java/com/bonus/common/entity/file/ResourceFileVo.java create mode 100644 bonus-common/bonus-common-security/src/main/java/com/bonus/common/security/utils/ValidatorsUtils.java create mode 100644 bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/mapper/ResourceFileMapper.java create mode 100644 bonus-modules/bonus-bracelet/src/main/resources/mapper/bracelet/ResourceFileMapper.xml diff --git a/bonus-api/bonus-api-system/src/main/java/com/bonus/system/api/RemoteFileService.java b/bonus-api/bonus-api-system/src/main/java/com/bonus/system/api/RemoteFileService.java index 34637f3..195f41e 100644 --- a/bonus-api/bonus-api-system/src/main/java/com/bonus/system/api/RemoteFileService.java +++ b/bonus-api/bonus-api-system/src/main/java/com/bonus/system/api/RemoteFileService.java @@ -40,7 +40,7 @@ public interface RemoteFileService * @author cwchen * @date 2024/3/21 15:24 */ - @PostMapping(value = "/file/getImgBase64") + @PostMapping(value = "/mongoFile/getImgBase64") public R getImgBase64(@RequestBody String fileId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); @@ -54,7 +54,7 @@ public interface RemoteFileService * @author cwchen * @date 2024/3/21 15:24 */ - @PostMapping(value = "/file/getFileBast64") + @PostMapping(value = "/mongoFile/getFileBast64") public R getFileBast64(@RequestBody String fileId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); /** @@ -64,7 +64,7 @@ public interface RemoteFileService * @param source * @return */ - @PostMapping(value = "/file/getFileByte") + @PostMapping(value = "/mongoFile/getFileByte") public R getFileByte(@RequestBody String fileId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); @@ -78,7 +78,7 @@ public interface RemoteFileService * @author cwchen * @date 2024/3/21 17:25 */ - @PostMapping(value = "/file/singleUploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @PostMapping(value = "/mongoFile/singleUploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public R singleUploadFile(@RequestPart(value = "file") MultipartFile file, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); /** @@ -91,7 +91,7 @@ public interface RemoteFileService * @author cwchen * @date 2024/3/21 17:25 */ - @PostMapping(value = "/file/mostUploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @PostMapping(value = "/mongoFile/mostUploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public R mostUploadFile(@RequestPart(value = "files") MultipartFile[] files, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); /** @@ -104,7 +104,7 @@ public interface RemoteFileService * @author cwchen * @date 2024/3/21 17:27 */ - @PostMapping(value = "/file/delFile") + @PostMapping(value = "/mongoFile/delFile") public R delFile(@RequestBody String fileId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); /** @@ -115,6 +115,6 @@ public interface RemoteFileService * @author cwchen * @date 2024/6/11 10:22 */ - @PostMapping(value = "/file/uploadFileByBase64", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @PostMapping(value = "/mongoFile/uploadFileByBase64", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public R uploadFileByBase64(@RequestPart(value = "base64") String base64, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); } diff --git a/bonus-common/bonus-common-core/pom.xml b/bonus-common/bonus-common-core/pom.xml index 97680c8..7dc51c1 100644 --- a/bonus-common/bonus-common-core/pom.xml +++ b/bonus-common/bonus-common-core/pom.xml @@ -126,6 +126,12 @@ nacos-client + + org.hibernate + hibernate-validator + 6.0.18.Final + + diff --git a/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/constant/BusinessConstants.java b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/constant/BusinessConstants.java new file mode 100644 index 0000000..75b6b78 --- /dev/null +++ b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/constant/BusinessConstants.java @@ -0,0 +1,17 @@ +package com.bonus.common.core.constant; + +/** + * @className:CommonConstants + * @author:cwchen + * @date:2024-07-16-13:32 + * @version:1.0 + * @description:业务常量 + */ +public class BusinessConstants { + + public static final int TYPE = 1; + public static final int TYPE2 = 2; + + /** 资源类型 1-人员*/ + public static final String RESOURCE_TYPE_USER = "1"; +} diff --git a/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/UploadCheckUtils.java b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/UploadCheckUtils.java new file mode 100644 index 0000000..cbc9a69 --- /dev/null +++ b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/UploadCheckUtils.java @@ -0,0 +1,100 @@ +package com.bonus.common.core.utils; + + +import org.springframework.web.multipart.MultipartFile; + +import java.util.Arrays; +import java.util.Locale; + +/** + * 文件上传校验的公共方法 + * + * @author:cwchen + * @date:2024-03-11-10:11 + * @version:1.0 + * @description:文件上传校验的公共方法 + */ +public class UploadCheckUtils { + + /** + * 文件大小 10MB(可用于图片和视频区分) + */ + public static final long IMG_FILE_SIZE = 10 * 1024 * 1024; + + /** + * 只支持图片格式 + */ + public static final String[] YES_IMAGE_SUPPORT = {".jpg", ".jpeg", ".png"}; + + /** + * 只支持视频格式 + */ + public static final String[] YES_VIDEO_SUPPORT = {".mp4", ".avi", ".mp3"}; + + /** + * 只支持音频格式 + */ + public static final String[] YES_AUDIO_SUPPORT = {".mp3"}; + + /** + * 只支持文件格式 + */ + public static final String[] YES_FILE_SUPPORT = {".xlsx", ".xls", ".doc", ".docx", ".txt", ".csv"}; + + + /** + * 全部文件(普通文件,图片, 视频,音频)后缀 支持的类型 + */ + public static final String[] FILE_SUFFIX_SUPPORT = {".xlsx", ".xls", ".doc", ".docx", ".txt", ".csv", + ".jpg", ".jpeg", ".png", ".mp4", ".avi", ".mp3"}; + + /** + * 文件名字 需要排除的字符 + * 废弃: "(", ")","",".", "——", "_","-" + */ + public static final String[] FILE_NAME_EXCLUDE = { + "`", "!", "@", "#", "$", "%", "^", "&", "*", "=", "+", + "~", "·", "!", "¥", "……", "(", ")", + "?", ",", "<", ">", ":", ";", "[", "]", "{", "}", "/", "\\", "|", + "?", ",", "。", "《", "》", ":", ";", "【", "】", "、" + }; + + public static final String SUFFIX = "."; + + /** + * 图片上传文件校验大小、名字、后缀 + * + * @param multipartFile multipartFile + */ + public static String uploadImgVerify(MultipartFile multipartFile) { + // 校验文件是否为空 + if (multipartFile == null) { + return "上传图片不能为空"; + } + // 校验文件名字 + String originalFilename = multipartFile.getOriginalFilename(); + if (originalFilename == null) { + return "上传图片名字不能为空"; + } + for (String realKey : FILE_NAME_EXCLUDE) { + if (originalFilename.contains(realKey)) { + return "上传图片名称不允许出现"+realKey+"关键字"; + } + } + // 校验文件后缀 + if (!originalFilename.contains(SUFFIX)) { + return "图片不能没有后缀"; + } + String suffix = originalFilename.substring(originalFilename.lastIndexOf('.')); + /*校验: 文件格式是否符合要求*/ + if (!Arrays.asList(YES_IMAGE_SUPPORT).contains(suffix.toLowerCase(Locale.ROOT))) { + return "图片格式仅支持" + Arrays.asList(YES_IMAGE_SUPPORT).toString(); + } + Long fileSize = multipartFile.getSize(); + if (fileSize > IMG_FILE_SIZE) { + return "图片大小仅支持10MB以内"; + } + return null; + } + +} diff --git a/bonus-common/bonus-common-entity/src/main/java/com/bonus/common/entity/bracelet/BraceletParamsDto.java b/bonus-common/bonus-common-entity/src/main/java/com/bonus/common/entity/bracelet/BraceletParamsDto.java index 10bc95f..da5c651 100644 --- a/bonus-common/bonus-common-entity/src/main/java/com/bonus/common/entity/bracelet/BraceletParamsDto.java +++ b/bonus-common/bonus-common-entity/src/main/java/com/bonus/common/entity/bracelet/BraceletParamsDto.java @@ -11,6 +11,11 @@ import lombok.Data; */ @Data public class BraceletParamsDto { + + /** + * id + */ + private Long id; /** * 班组名称 */ @@ -20,6 +25,16 @@ public class BraceletParamsDto { */ private String teamLeader; + /** + * 姓名 + */ + private String name; + + /** + * 性别 + */ + private Integer sex; + /** * 角色编码 */ @@ -33,5 +48,10 @@ public class BraceletParamsDto { /** * 班组ID */ - private Integer teamId; + private Long teamId; + + /** + * 资源类型 + */ + private String sourceType; } diff --git a/bonus-common/bonus-common-entity/src/main/java/com/bonus/common/entity/bracelet/vo/PersonVo.java b/bonus-common/bonus-common-entity/src/main/java/com/bonus/common/entity/bracelet/vo/PersonVo.java index da6b626..75ffac3 100644 --- a/bonus-common/bonus-common-entity/src/main/java/com/bonus/common/entity/bracelet/vo/PersonVo.java +++ b/bonus-common/bonus-common-entity/src/main/java/com/bonus/common/entity/bracelet/vo/PersonVo.java @@ -2,7 +2,12 @@ package com.bonus.common.entity.bracelet.vo; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.Range; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; import java.util.Date; /** @@ -22,37 +27,49 @@ public class PersonVo { /** * 姓名 */ + @NotBlank(message = "姓名不能为空", groups = {Query.class}) + @Length(max = 32, message = "姓名字符长度不能超过32", groups = {Query.class}) private String name; /** * 性别 0 女 1 男 2 其他 */ + @NotNull(message = "性别不能为空", groups = {Query.class}) + @Range(min = 0, max = 2, message = "性别: 0 女 1 男 2 其他", groups = {Query.class}) private Integer sex; /** * 身份证号码 */ + @NotBlank(message = "身份证号码不能为空", groups = {Query.class}) + @Length(max = 20, message = "身份证号码字符长度不能超过20", groups = {Query.class}) + @Pattern(regexp = "[1-9]\\d{5}(19|20)\\d{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2]\\d|3[0-1])|(04|06|09|11)(0[1-9]|[1-2]\\d|30)|02(0[1-9]|[1-2]\\d))\\d{3}[\\dXx]", message = "身份证号码格式不正确", groups = {Query.class}) private String idCard; /** - * 手机号 + * 电话 */ + @NotBlank(message = "电话不能为空", groups = {Query.class}) + @Length(max = 20, message = "电话字符长度不能超过20", groups = {Query.class}) + @Pattern(regexp = "(0|86|17951)?(13[0-9]|19[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}", message = "电话格式不正确", groups = {Query.class}) private String phone; /** * 安全帽编号 */ + @Length(max = 10, message = "安全帽编号字符长度不能超过20", groups = {Query.class}) private String aqmCode; /** * 马甲编号 */ + @Length(max = 10, message = "马甲编号字符长度不能超过20", groups = {Query.class}) private String mjCode; /** * 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private Date createTime; + private Date createTime = new Date(); /** * 修改时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private Date updateTime; + private Date updateTime = new Date(); /** * 创建人 */ @@ -65,4 +82,30 @@ public class PersonVo { * 所属班组ID */ private Long teamId; + + /** + * 删除的文件ID + */ + private String delFiles; + + /** + * 删除的资源文件ID + */ + private Long fileId; + + /** + * 文件ID + */ + private String filePath; + + /** + * 文件BASE64地址 + */ + private String base64Url; + + /** + * 查询条件限制 + */ + public interface Query { + } } diff --git a/bonus-common/bonus-common-entity/src/main/java/com/bonus/common/entity/file/ResourceFileVo.java b/bonus-common/bonus-common-entity/src/main/java/com/bonus/common/entity/file/ResourceFileVo.java new file mode 100644 index 0000000..211d9b7 --- /dev/null +++ b/bonus-common/bonus-common-entity/src/main/java/com/bonus/common/entity/file/ResourceFileVo.java @@ -0,0 +1,49 @@ +package com.bonus.common.entity.file; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * @author:cwchen + * @date:2024-03-12-9:29 + * @version:1.0 + * @description:文件资源-vo + */ +@Data +public class ResourceFileVo { + + @ApiModelProperty(value = "文件名称") + private String fileName; + + @ApiModelProperty(value = "文件后缀") + private String fileSuffix; + + @ApiModelProperty(value = "文件id/路径") + private String filePath; + + @ApiModelProperty(value = "文件类型 0 文件 1图片") + private Integer fileType; + + @ApiModelProperty(value = "业务id") + private String sourceId; + + @ApiModelProperty(value = "业务类型") + private String sourceType; + + @ApiModelProperty(value = "创建日期") + private Date createTime = new Date(); + + @ApiModelProperty(value = "创建人") + private Long createUser; + + @ApiModelProperty(value = "修改日期") + private Date updateTime = new Date(); + + @ApiModelProperty(value = "修改人") + private Long updateUser; + + @ApiModelProperty(value = "是否删除") + private Integer delFlag = 0; +} diff --git a/bonus-common/bonus-common-security/src/main/java/com/bonus/common/security/utils/ValidatorsUtils.java b/bonus-common/bonus-common-security/src/main/java/com/bonus/common/security/utils/ValidatorsUtils.java new file mode 100644 index 0000000..0864e5a --- /dev/null +++ b/bonus-common/bonus-common-security/src/main/java/com/bonus/common/security/utils/ValidatorsUtils.java @@ -0,0 +1,100 @@ +package com.bonus.common.security.utils; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.validation.ConstraintViolation; +import javax.validation.Validator; +import java.util.List; +import java.util.Set; + +/** + * @description:
+ * 通用Server validation方法 + *

+ *
+ * @author: Qz1997 + * @create 2021/2/9 14:41 + */ +@SuppressWarnings("unused") +@Component(value = "ValidatorsUtils") +public final class ValidatorsUtils { + @Resource + private Validator validator; + + /** + * 验证实体 + * + * @param obj 实体 + * @param 实体类类型 + * @return 结果 + */ + public String valid(T obj) { + return this.valid(obj, new Class[]{}); + } + + /** + * 验证实体 + * + * @param obj 实体 + * @param group 实体组 + * @param 实体类类型 + * @return 结果 + */ + public String valid(T obj, Class... group) { + Set> violations; + if (ArrayUtils.isEmpty(group)) { + violations = validator.validate(obj); + } else { + violations = validator.validate(obj, group); + } + if (CollectionUtils.isNotEmpty(violations)) { + for (ConstraintViolation constraintViolation : violations) { + return constraintViolation.getMessage(); + } + } + return null; + } + + /** + * 校验list + * + * @param objList list + * @param 实体类类型 + * @return 结果 + */ + public String validList(List objList) { + return this.validList(objList, new Class[]{}); + } + + /** + * 校验list + * + * @param objList list + * @param group 组 + * @param 实体类类型 + * @return 结果 + */ + public String validList(List objList, Class... group) { + if (CollectionUtils.isEmpty(objList)) { + return "对象空"; + } + String result; + for (T t : objList) { + if (ArrayUtils.isEmpty(group)) { + result = this.valid(t); + } else { + result = this.valid(t, group); + } + if (!StringUtils.isBlank(result)) { + return result; + } + } + return null; + } +} + + diff --git a/bonus-common/bonus-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/bonus-common/bonus-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 0cd11e0..7a457ea 100644 --- a/bonus-common/bonus-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/bonus-common/bonus-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -4,3 +4,4 @@ com.bonus.common.security.service.TokenService com.bonus.common.security.aspect.PreAuthorizeAspect com.bonus.common.security.aspect.InnerAuthAspect com.bonus.common.security.handler.GlobalExceptionHandler +com.bonus.common.security.utils.ValidatorsUtils \ No newline at end of file diff --git a/bonus-modules/bonus-bracelet/pom.xml b/bonus-modules/bonus-bracelet/pom.xml index 181e4b0..f5b5b2b 100644 --- a/bonus-modules/bonus-bracelet/pom.xml +++ b/bonus-modules/bonus-bracelet/pom.xml @@ -88,6 +88,12 @@ 24.6.0 compile + + com.bonus + bonus-common-security + 24.6.0 + compile + diff --git a/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/BonusBraceletApplication.java b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/BonusBraceletApplication.java index 8d157b6..b9bb9d4 100644 --- a/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/BonusBraceletApplication.java +++ b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/BonusBraceletApplication.java @@ -5,6 +5,7 @@ import com.bonus.common.security.annotation.EnableRyFeignClients; import com.bonus.common.swagger.annotation.EnableCustomSwagger2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; /** * 手环模块 @@ -14,7 +15,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @EnableCustomConfig @EnableCustomSwagger2 @EnableRyFeignClients -@SpringBootApplication +@SpringBootApplication(exclude = MongoAutoConfiguration.class ) public class BonusBraceletApplication { public static void main(String[] args) { SpringApplication.run(BonusBraceletApplication.class, args); diff --git a/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/controller/PersonMgeController.java b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/controller/PersonMgeController.java index 493d583..3351c3b 100644 --- a/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/controller/PersonMgeController.java +++ b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/controller/PersonMgeController.java @@ -1,11 +1,21 @@ package com.bonus.bracelet.controller; import com.bonus.bracelet.service.IPersonMgeService; +import com.bonus.common.core.web.controller.BaseController; +import com.bonus.common.core.web.domain.AjaxResult; +import com.bonus.common.core.web.page.TableDataInfo; +import com.bonus.common.entity.bracelet.BraceletParamsDto; +import com.bonus.common.entity.bracelet.vo.PersonVo; +import com.bonus.common.log.annotation.SysLog; +import com.bonus.common.log.enums.OperaType; +import com.bonus.common.security.annotation.RequiresPermissions; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.List; /** * @className:PersonMgeController @@ -17,8 +27,43 @@ import javax.annotation.Resource; @RestController @RequestMapping("/person/") @Slf4j -public class PersonMgeController { +public class PersonMgeController extends BaseController { @Resource(name = "IPersonMgeService") private IPersonMgeService service; + + @RequiresPermissions("basic:person:list") + @GetMapping("list") + @SysLog(title = "人员管理", businessType = OperaType.QUERY,logType = 0,module = "基础管理->人员管理",details ="查询人员列表") + public TableDataInfo list(BraceletParamsDto dto) { + startPage(); + List list = service.getPersonLists(dto); + return getDataTable(list); + } + + @RequiresPermissions("basic:person:add") + @PostMapping("addPerson") + @SysLog(title = "人员管理", businessType = OperaType.INSERT,logType = 0,module = "基础管理->人员管理",details ="新增人员" ) + public AjaxResult add(HttpServletRequest request, @RequestParam(value = "file", required = false) MultipartFile file, String params) { + return service.addPerson(file, params); + } + + @RequiresPermissions("basic:person:edit") + @PostMapping("editPerson") + @SysLog(title = "人员管理", businessType = OperaType.INSERT,logType = 0,module = "基础管理->人员管理",details ="修改人员" ) + public AjaxResult editPerson(HttpServletRequest request, @RequestParam(value = "file", required = false) MultipartFile file, String params) { + return service.editPerson(file, params); + } + + @PostMapping("getPersonInfo") + public AjaxResult getPersonInfo(@RequestBody BraceletParamsDto dto) { + return service.getPersonInfo(dto); + } + + @RequiresPermissions("basic:person:del") + @PostMapping("delPerson") + @SysLog(title = "人员管理", businessType = OperaType.INSERT,logType = 0,module = "基础管理->人员管理",details ="删除人员" ) + public AjaxResult delPerson(@RequestBody BraceletParamsDto dto) { + return service.delPerson(dto); + } } diff --git a/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/mapper/PersonMgeMapper.java b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/mapper/PersonMgeMapper.java index 7afc73d..b8e3bdf 100644 --- a/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/mapper/PersonMgeMapper.java +++ b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/mapper/PersonMgeMapper.java @@ -1,7 +1,13 @@ package com.bonus.bracelet.mapper; +import com.bonus.common.entity.bracelet.BraceletParamsDto; +import com.bonus.common.entity.bracelet.vo.PersonVo; +import org.apache.ibatis.annotations.MapKey; import org.springframework.stereotype.Repository; +import java.util.List; +import java.util.Map; + /** * @className:PersonMgeMapper * @author:cwchen @@ -11,4 +17,63 @@ import org.springframework.stereotype.Repository; */ @Repository(value = "PersonMgeMapper") public interface PersonMgeMapper { + /** + * 人员身份证号是否存在 + * + * @param vo + * @return List> + * @author cwchen + * @date 2024/7/16 13:15 + */ + @MapKey("id") + List> personIsExist(PersonVo vo); + + /** + * 新增人员 + * + * @param vo + * @return void + * @author cwchen + * @date 2024/7/16 14:26 + */ + void addPerson(PersonVo vo); + + /** + * 修改人员 + * + * @param vo + * @return void + * @author cwchen + * @date 2024/7/16 14:35 + */ + void editPerson(PersonVo vo); + + /** + * 人员详情 + * + * @param dto + * @return PersonVo + * @author cwchen + * @date 2024/7/16 15:15 + */ + PersonVo getPersonInfo(BraceletParamsDto dto); + + /** + * 删除人员 + * + * @param dto + * @return void + * @author cwchen + * @date 2024/7/16 15:38 + */ + void delPerson(BraceletParamsDto dto); + + /** + * 查询人员列表 + * @param dto + * @return List + * @author cwchen + * @date 2024/7/16 15:45 + */ + List getPersonLists(BraceletParamsDto dto); } diff --git a/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/mapper/ResourceFileMapper.java b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/mapper/ResourceFileMapper.java new file mode 100644 index 0000000..5abdf68 --- /dev/null +++ b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/mapper/ResourceFileMapper.java @@ -0,0 +1,34 @@ +package com.bonus.bracelet.mapper; + +import com.bonus.common.entity.bracelet.vo.PersonVo; +import com.bonus.common.entity.file.ResourceFileVo; +import org.springframework.stereotype.Repository; + +/** + * @className:ResourceFileMapper + * @author:cwchen + * @date:2024-07-16-13:57 + * @version:1.0 + * @description:文件上传-mapper + */ +@Repository(value = "ResourceFileMapper") +public interface ResourceFileMapper { + /** + * 添加文件资源 + * + * @param fileVo + * @return void + * @author cwchen + * @date 2024/7/16 14:01 + */ + void addFile(ResourceFileVo fileVo); + + /** + * 删除资源文件 + * @param vo + * @return void + * @author cwchen + * @date 2024/7/16 15:07 + */ + void delResourceFile(PersonVo vo); +} diff --git a/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/service/IPersonMgeService.java b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/service/IPersonMgeService.java index 64ee61b..13dd04d 100644 --- a/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/service/IPersonMgeService.java +++ b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/service/IPersonMgeService.java @@ -1,5 +1,12 @@ package com.bonus.bracelet.service; +import com.bonus.common.core.web.domain.AjaxResult; +import com.bonus.common.entity.bracelet.BraceletParamsDto; +import com.bonus.common.entity.bracelet.vo.PersonVo; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + /** * @className:PersonMgeService * @author:cwchen @@ -7,5 +14,47 @@ package com.bonus.bracelet.service; * @version:1.0 * @description:人员-service */ -public interface IPersonMgeService{ +public interface IPersonMgeService { + /** + * 新增人员 + * + * @param file + * @param params + * @return AjaxResult + * @author cwchen + * @date 2024/7/16 12:57 + */ + AjaxResult addPerson(MultipartFile file, String params); + + /** + * 修改人员 + * + * @param file + * @param params + * @return AjaxResult + * @author cwchen + * @date 2024/7/16 14:28 + */ + AjaxResult editPerson(MultipartFile file, String params); + + /** + * 人员详情 + * + * @param dto + * @return AjaxResult + * @author cwchen + * @date 2024/7/16 15:10 + */ + AjaxResult getPersonInfo(BraceletParamsDto dto); + + /** + * 删除人员 + * @param dto + * @return AjaxResult + * @author cwchen + * @date 2024/7/16 15:34 + */ + AjaxResult delPerson(BraceletParamsDto dto); + + List getPersonLists(BraceletParamsDto dto); } diff --git a/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/service/impl/PersonMgeServiceImpl.java b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/service/impl/PersonMgeServiceImpl.java index 029f292..c5414e2 100644 --- a/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/service/impl/PersonMgeServiceImpl.java +++ b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/service/impl/PersonMgeServiceImpl.java @@ -1,11 +1,37 @@ package com.bonus.bracelet.service.impl; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; import com.bonus.bracelet.mapper.PersonMgeMapper; +import com.bonus.bracelet.mapper.ResourceFileMapper; import com.bonus.bracelet.service.IPersonMgeService; +import com.bonus.common.core.constant.BusinessConstants; +import com.bonus.common.core.constant.HttpStatus; +import com.bonus.common.core.constant.SecurityConstants; +import com.bonus.common.core.domain.R; +import com.bonus.common.core.utils.UploadCheckUtils; +import com.bonus.common.core.utils.encryption.Sm4Utils; +import com.bonus.common.core.utils.uuid.IdUtils; +import com.bonus.common.core.web.domain.AjaxResult; +import com.bonus.common.entity.bracelet.BraceletParamsDto; +import com.bonus.common.entity.bracelet.vo.PersonVo; +import com.bonus.common.entity.file.ResourceFileVo; +import com.bonus.common.security.utils.ValidatorsUtils; import com.bonus.system.api.RemoteFileService; +import com.bonus.system.api.domain.SysFile; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; /** * @className:PersonMgeServiceImpl @@ -15,11 +41,241 @@ import javax.annotation.Resource; * @description:人员-serviceImpl */ @Service(value = "IPersonMgeService") +@Slf4j public class PersonMgeServiceImpl implements IPersonMgeService { @Resource(name = "PersonMgeMapper") private PersonMgeMapper mapper; + @Resource(name = "ResourceFileMapper") + private ResourceFileMapper resourceFileMapper; + + @Resource(name = "ValidatorsUtils") + private ValidatorsUtils validatorsUtils; + @Resource private RemoteFileService remoteFileService; + + @Override + public List getPersonLists(BraceletParamsDto dto) { + dto.setSourceType(BusinessConstants.RESOURCE_TYPE_USER); + List list = new ArrayList<>(); + try { + list = mapper.getPersonLists(dto); + for (PersonVo vo : list) { + vo = handleData(vo); + } + } catch (Exception e) { + log.error("查询人员列表",e); + } + return list; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public AjaxResult addPerson(MultipartFile file, String params) { + // 文件ID + String delFileId = null; + try { + PersonVo vo = JSON.parseObject(params, PersonVo.class); + String validResult = validatorsUtils.valid(vo, PersonVo.Query.class); + if (StringUtils.isNotBlank(validResult)) { + return AjaxResult.error(validResult); + } + // 验证身份证是否重复、手机号 + List> list = mapper.personIsExist(vo); + if (idCardIsExist(list, vo, 1)) { + return AjaxResult.error("身份证号码" + vo.getIdCard() + "已存在"); + } + if (idCardIsExist(list, vo, 2)) { + return AjaxResult.error("电话" + vo.getPhone() + "已存在"); + } + // 校验文件、上传文件 + if (file == null) { + return AjaxResult.error("人员照片未上传"); + } else { + String isVerify = UploadCheckUtils.uploadImgVerify(file); + if (StringUtils.isNotBlank(isVerify)) { + return AjaxResult.error(isVerify); + } + } + // 对身份证号、手机号 进行 sm4加密 保存人员数据、保存文件资源 + vo.setIdCard(Sm4Utils.encode(vo.getIdCard())); + vo.setPhone(Sm4Utils.encode(vo.getPhone())); + mapper.addPerson(vo); + delFileId = uploadFile(file, vo); + } catch (Exception e) { + log.error("新增人员", e); + // 添加失败-删除文件 + if (StringUtils.isNotEmpty(delFileId)) { + remoteFileService.delFile(delFileId, SecurityConstants.INNER); + } + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error(); + } + return AjaxResult.success(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public AjaxResult editPerson(MultipartFile file, String params) { + // 文件ID + String delFileId = null; + try { + PersonVo vo = JSON.parseObject(params, PersonVo.class); + String validResult = validatorsUtils.valid(vo, PersonVo.Query.class); + if (StringUtils.isNotBlank(validResult)) { + return AjaxResult.error(validResult); + } + // 验证身份证是否重复、手机号 + List> list = mapper.personIsExist(vo); + if (idCardIsExist(list, vo, 1)) { + return AjaxResult.error("身份证号码" + vo.getIdCard() + "已存在"); + } + if (idCardIsExist(list, vo, 2)) { + return AjaxResult.error("电话" + vo.getPhone() + "已存在"); + } + // 校验文件、上传文件 + if (file == null && StringUtils.isNotBlank(vo.getDelFiles())) { + return AjaxResult.error("人员照片未上传"); + } else if (file != null) { + String isVerify = UploadCheckUtils.uploadImgVerify(file); + if (StringUtils.isNotBlank(isVerify)) { + return AjaxResult.error(isVerify); + } + } + // 对身份证号、手机号 进行 sm4加密 保存人员数据 保存文件资源 删除文件 + vo.setIdCard(Sm4Utils.encode(vo.getIdCard())); + vo.setPhone(Sm4Utils.encode(vo.getPhone())); + mapper.editPerson(vo); + delFileId = uploadFile(file, vo); + if (StringUtils.isNotEmpty(vo.getDelFiles())) { + String[] delFiles = vo.getDelFiles().split(","); + for (String fileId : delFiles) { + resourceFileMapper.delResourceFile(vo); + remoteFileService.delFile(fileId, SecurityConstants.INNER); + } + } + } catch (Exception e) { + log.error("修改人员", e); + // 添加失败-删除文件 + if (StringUtils.isNotEmpty(delFileId)) { + remoteFileService.delFile(delFileId, SecurityConstants.INNER); + } + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error(); + } + return AjaxResult.success(); + } + + @Override + public AjaxResult getPersonInfo(BraceletParamsDto dto) { + try { + dto.setSourceType(BusinessConstants.RESOURCE_TYPE_USER); + PersonVo vo = mapper.getPersonInfo(dto); + PersonVo handleData = handleData(vo); + return AjaxResult.success(handleData); + } catch (Exception e) { + log.error("人员详情", e); + return AjaxResult.error(); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public AjaxResult delPerson(BraceletParamsDto dto) { + try { + if (dto.getTeamId() != null) { + return AjaxResult.error("该人员已分配班组,请先从班组中移除该人员"); + } + mapper.delPerson(dto); + return AjaxResult.success(); + } catch (Exception e) { + log.error("删除人员", e); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error(); + } + } + + /** + * 验证身份证号是否存在 + * + * @param list + * @return boolean + * @author cwchen + * @date 2024/7/16 13:21 + */ + public boolean idCardIsExist(List> list, PersonVo vo, int type) { + if (CollectionUtils.isEmpty(list)) { + return false; + } else { + String encodeValue = Sm4Utils.encode(type == BusinessConstants.TYPE ? vo.getIdCard() : vo.getPhone()); + for (Map map : list) { + String value = type == BusinessConstants.TYPE ? map.get("value") : map.get("phone"); + if (Objects.equals(encodeValue, map.get("value"))) { + return true; + } + } + return false; + } + } + + /** + * 文件上传 + * + * @param file + * @param vo + * @return void + * @author cwchen + * @date 2024/7/16 14:46 + */ + public String uploadFile(MultipartFile file, PersonVo vo) { + R result = remoteFileService.singleUploadFile(file, SecurityConstants.INNER); + if (result != null && result.getCode() == HttpStatus.ERROR) { + log.error("人员照片上传失败"); + return null; + } else if (result != null && result.getCode() == HttpStatus.SUCCESS && result.getData() != null) { + String jsonString = JSON.toJSONString(result.getData()); + JSONObject item = JSON.parseObject(jsonString); + if (item != null) { + ResourceFileVo fileVo = setResourceFileData(item, vo); + resourceFileMapper.addFile(fileVo); + } + return item.getString("fileId"); + } + return null; + } + + public PersonVo handleData(PersonVo vo){ + vo.setIdCard(Sm4Utils.decode(vo.getIdCard())); + vo.setPhone(Sm4Utils.decode(vo.getPhone())); + R result = remoteFileService.getImgBase64(vo.getFilePath(), SecurityConstants.INNER); + if (result != null && result.getCode() == HttpStatus.SUCCESS && result.getData() != null) { + String jsonString = JSON.toJSONString(result.getData()); + JSONObject item = JSON.parseObject(jsonString); + String base64 = item.getString("url"); + vo.setBase64Url(base64); + } + return vo; + } + + /** + * 资源文件赋值 + * + * @param item + * @return ResourceFileVo + * @author cwchen + * @date 2024/7/16 13:49 + */ + public ResourceFileVo setResourceFileData(JSONObject item, PersonVo vo) { + ResourceFileVo fileVo = new ResourceFileVo(); + String resourceId = IdUtils.simpleUUID(); + fileVo.setFileType(1); + fileVo.setFilePath(item.getString("fileId")); + fileVo.setFileSuffix(item.getString("suffix")); + fileVo.setFileName(item.getString("fileName")); + fileVo.setSourceId(vo.getId() + ""); + fileVo.setSourceType("1"); + return fileVo; + } } diff --git a/bonus-modules/bonus-bracelet/src/main/resources/mapper/bracelet/PersonMgeMapper.xml b/bonus-modules/bonus-bracelet/src/main/resources/mapper/bracelet/PersonMgeMapper.xml index 6bff1c1..a664c46 100644 --- a/bonus-modules/bonus-bracelet/src/main/resources/mapper/bracelet/PersonMgeMapper.xml +++ b/bonus-modules/bonus-bracelet/src/main/resources/mapper/bracelet/PersonMgeMapper.xml @@ -3,5 +3,98 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + INSERT INTO tb_people + + name, + sex, + id_card, + phone, + aqm_code, + mj_code, + create_time, + create_user, + update_time, + update_user, + del_flag, + id + + + #{name}, + #{sex}, + #{idCard}, + #{phone}, + #{aqmCode}, + #{mjCode}, + #{createTime}, + #{createUser}, + #{updateTime}, + #{updateUser}, + 0, + null + + + + + UPDATE tb_people SET name = #{name},sex = #{sex},id_card = #{idCard},phone = #{phone},aqm_code = #{aqmCode},mj_code = #{mjCode},update_time = #{updateTime},update_user = #{updateUser} WHERE id = #{id} + + + + UPDATE tb_people SET del_flag = 1 WHERE id = #{id} + + + + + + + \ No newline at end of file diff --git a/bonus-modules/bonus-bracelet/src/main/resources/mapper/bracelet/ResourceFileMapper.xml b/bonus-modules/bonus-bracelet/src/main/resources/mapper/bracelet/ResourceFileMapper.xml new file mode 100644 index 0000000..d93e977 --- /dev/null +++ b/bonus-modules/bonus-bracelet/src/main/resources/mapper/bracelet/ResourceFileMapper.xml @@ -0,0 +1,41 @@ + + + + + + + INSERT INTO sys_file_source + + file_name, + file_suffix, + file_path, + file_type, + source_id, + source_type, + create_time, + create_user, + update_time, + update_user, + del_flag + + + #{fileName}, + #{fileSuffix}, + #{filePath}, + #{filePath}, + #{sourceId}, + #{sourceType}, + #{createTime}, + #{createUser}, + #{updateTime}, + #{updateUser}, + #{delFlag} + + + + + UPDATE sys_file_source SET del_flag = 1 WHERE id = #{id} + + \ No newline at end of file diff --git a/bonus-modules/bonus-file/src/main/java/com/bonus/file/mongodb/util/MongodbFileBase64Util.java b/bonus-modules/bonus-file/src/main/java/com/bonus/file/mongodb/util/MongodbFileBase64Util.java index 844eee7..fd18422 100644 --- a/bonus-modules/bonus-file/src/main/java/com/bonus/file/mongodb/util/MongodbFileBase64Util.java +++ b/bonus-modules/bonus-file/src/main/java/com/bonus/file/mongodb/util/MongodbFileBase64Util.java @@ -1,6 +1,6 @@ package com.bonus.file.mongodb.util; -import com.securitycontrol.entity.file.FileExportVo; +import com.bonus.common.entity.file.FileExportVo; import lombok.extern.slf4j.Slf4j; import org.springframework.util.Base64Utils;