From 53cd3038e041b3c5447dcee53f2fb8adbf880a74 Mon Sep 17 00:00:00 2001 From: "1378012178@qq.com" <1378012178@qq.com> Date: Fri, 15 Aug 2025 14:19:55 +0800 Subject: [PATCH] =?UTF-8?q?=E9=95=BF=E8=80=85=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/nu/dto/ElderTagAsyncMQDto.java | 49 +++ .../main/java/com/nu/dto/ElderTagMQDto.java | 23 ++ .../main/java/com/nu/utils/NuFileUtils.java | 101 ++++++ .../nu-elder-api/nu-elder-local-api/pom.xml | 25 ++ nursing-unit-elder/nu-elder-api/pom.xml | 24 ++ nursing-unit-elder/nu-elder-biz/pom.xml | 47 +++ .../controller/ElderTagController.java | 259 ++++++++++++++++ .../nu/modules/eldertag/entity/ElderTag.java | 99 ++++++ .../eldertag/mapper/ElderTagMapper.java | 17 ++ .../eldertag/mapper/xml/ElderTagMapper.xml | 8 + .../eldertag/service/IElderTagService.java | 24 ++ .../service/impl/ElderTagServiceImpl.java | 108 +++++++ .../ElderTagMQExceptionHandler.java | 28 ++ .../listener/DynamicQueueNameProvider.java | 42 +++ .../eldertag/listener/ElderTagMQListener.java | 289 ++++++++++++++++++ nursing-unit-elder/pom.xml | 20 ++ .../ConfigServiceDirectiveServiceImpl.java | 109 +------ .../listener/DirectiveMQListener.java | 4 +- nursing-unit-system/nu-system-start/pom.xml | 6 + pom.xml | 2 + 20 files changed, 1187 insertions(+), 97 deletions(-) create mode 100644 nursing-unit-common/src/main/java/com/nu/dto/ElderTagAsyncMQDto.java create mode 100644 nursing-unit-common/src/main/java/com/nu/dto/ElderTagMQDto.java create mode 100644 nursing-unit-common/src/main/java/com/nu/utils/NuFileUtils.java create mode 100644 nursing-unit-elder/nu-elder-api/nu-elder-local-api/pom.xml create mode 100644 nursing-unit-elder/nu-elder-api/pom.xml create mode 100644 nursing-unit-elder/nu-elder-biz/pom.xml create mode 100644 nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/controller/ElderTagController.java create mode 100644 nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/entity/ElderTag.java create mode 100644 nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/mapper/ElderTagMapper.java create mode 100644 nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/mapper/xml/ElderTagMapper.xml create mode 100644 nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/service/IElderTagService.java create mode 100644 nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/service/impl/ElderTagServiceImpl.java create mode 100644 nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/mq/eldertag/exceptionhandler/ElderTagMQExceptionHandler.java create mode 100644 nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/mq/eldertag/listener/DynamicQueueNameProvider.java create mode 100644 nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/mq/eldertag/listener/ElderTagMQListener.java create mode 100644 nursing-unit-elder/pom.xml diff --git a/nursing-unit-common/src/main/java/com/nu/dto/ElderTagAsyncMQDto.java b/nursing-unit-common/src/main/java/com/nu/dto/ElderTagAsyncMQDto.java new file mode 100644 index 0000000..4e44062 --- /dev/null +++ b/nursing-unit-common/src/main/java/com/nu/dto/ElderTagAsyncMQDto.java @@ -0,0 +1,49 @@ +package com.nu.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * @Description: 长者标签 + * @Author: zmy + * @Date: 2025-08-13 + * @Version: V1.0 + */ +@Data +public class ElderTagAsyncMQDto implements Serializable { + + /**id*/ + private String id; + /**标签类型*/ + private String type; + /**标签名称*/ + private String tagName; + /**价格*/ + private BigDecimal price; + /**图标*/ + private String pic; + /**图标md5值*/ + private String picMd5; + /**排序*/ + private Integer sort; + /**是否启用*/ + private String izEnabled; + /**是否删除*/ + private String delFlag; + /**创建人*/ + private String createBy; + /**创建日期*/ + private Date createTime; + /**更新人*/ + private String updateBy; + /**更新日期*/ + private Date updateTime; + /**所属机构*/ + private String sysOrgCode; + /**资源请求接口域名+项目上下文路径 */ + private String api; + +} diff --git a/nursing-unit-common/src/main/java/com/nu/dto/ElderTagMQDto.java b/nursing-unit-common/src/main/java/com/nu/dto/ElderTagMQDto.java new file mode 100644 index 0000000..71ca09f --- /dev/null +++ b/nursing-unit-common/src/main/java/com/nu/dto/ElderTagMQDto.java @@ -0,0 +1,23 @@ +package com.nu.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class ElderTagMQDto { + private boolean izInc;//是否为增量 否则为全量 + private String orgCode;//机构编码 + private String idStr; + private List idList; + + //同步主表id + private String asyncId; + //同步子表code + private String code; + + //指令集合 + private List elderTagList; + //是否同步指令资源 + private boolean izSyncMedia; +} diff --git a/nursing-unit-common/src/main/java/com/nu/utils/NuFileUtils.java b/nursing-unit-common/src/main/java/com/nu/utils/NuFileUtils.java new file mode 100644 index 0000000..04aa7b2 --- /dev/null +++ b/nursing-unit-common/src/main/java/com/nu/utils/NuFileUtils.java @@ -0,0 +1,101 @@ +package com.nu.utils; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.io.InputStream; +import java.nio.file.Files; +import java.security.MessageDigest; +import java.util.HashMap; +import java.util.Map; + +@Component +public class NuFileUtils { + + private static String uploadpath; + + // 通过Setter注入静态字段 + @Value("${jeecg.path.upload}") + public void setUploadpath(String path) { + uploadpath = path; + } + + /** + * 将文件转存到静态资源目录中 + * + * @param targetDir 目标目录 + * @param filePath 文件路径 + * @return 如果路径有变化返回新路径,否则返回null + */ + public static Map processFile(String targetDir, String filePath) { + if (StringUtils.isBlank(filePath)) { + return null; + } + + try { + // 检查文件路径是否以目标目录开头 + if (!filePath.startsWith(targetDir + "/")) { + // 获取文件名(路径的最后一部分) + String fileName = filePath.substring(filePath.lastIndexOf('/') + 1); + + // 构建新的完整路径 + String newRelativePath = targetDir + "/" + fileName; + String oldFullPath = uploadpath + "/" + filePath; + String newFullPath = uploadpath + "/" + newRelativePath; + + // 创建目标目录(如果不存在) + File targetDirectory = new File(uploadpath + "/" + targetDir); + if (!targetDirectory.exists()) { + targetDirectory.mkdirs(); + } + + // 移动文件 + File oldFile = new File(oldFullPath); + if (oldFile.exists()) { + // 计算原文件的MD5 + String md5 = calculateMD5(oldFile); + + File newFile = new File(newFullPath); + + // 如果目标文件已存在,先删除 + if (newFile.exists()) { + newFile.delete(); + } + + // 移动文件 + Files.move(oldFile.toPath(), newFile.toPath()); + + // 返回包含新路径和MD5的Map + Map result = new HashMap<>(); + result.put("path", newRelativePath); + result.put("md5", md5); + return result; + } + } + } catch (Exception e) { + // 处理异常,可以根据实际需求记录日志或抛出 + e.printStackTrace(); + } + + return null; + } + + private static String calculateMD5(File file) throws Exception { + try (InputStream is = Files.newInputStream(file.toPath())) { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] buffer = new byte[8192]; + int read; + while ((read = is.read(buffer)) != -1) { + md.update(buffer, 0, read); + } + byte[] md5 = md.digest(); + StringBuilder sb = new StringBuilder(); + for (byte b : md5) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + } + } +} diff --git a/nursing-unit-elder/nu-elder-api/nu-elder-local-api/pom.xml b/nursing-unit-elder/nu-elder-api/nu-elder-local-api/pom.xml new file mode 100644 index 0000000..5ffb314 --- /dev/null +++ b/nursing-unit-elder/nu-elder-api/nu-elder-local-api/pom.xml @@ -0,0 +1,25 @@ + + + + com.nursingunit.boot + nu-elder-api + 2.0.0 + + 4.0.0 + nu-elder-local-api + + + com.nursingunit.boot + nursing-unit-common + + + com.nursingunit.boot + nu-system-local-api + 2.0.0 + compile + + + + diff --git a/nursing-unit-elder/nu-elder-api/pom.xml b/nursing-unit-elder/nu-elder-api/pom.xml new file mode 100644 index 0000000..f973df1 --- /dev/null +++ b/nursing-unit-elder/nu-elder-api/pom.xml @@ -0,0 +1,24 @@ + + + + com.nursingunit.boot + nursing-unit-elder + 2.0.0 + + 4.0.0 + nu-elder-api + pom + + + nu-elder-local-api + + + + + com.nursingunit.boot + nursing-unit-base-core + + + diff --git a/nursing-unit-elder/nu-elder-biz/pom.xml b/nursing-unit-elder/nu-elder-biz/pom.xml new file mode 100644 index 0000000..4e57946 --- /dev/null +++ b/nursing-unit-elder/nu-elder-biz/pom.xml @@ -0,0 +1,47 @@ + + + com.nursingunit.boot + nursing-unit-elder + 2.0.0 + + 4.0.0 + nu-elder-biz + + + + com.nursingunit.boot + nu-elder-local-api + ${nursingunit.version} + + + org.hibernate + hibernate-core + + + org.jeecgframework.boot + hibernate-re + + + + + org.jeecgframework + weixin4j + + + com.nursingunit.boot + nu-admin-biz + 2.0.0 + compile + + + com.nursingunit.boot + nu-admin-biz + 2.0.0 + compile + + + + + diff --git a/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/controller/ElderTagController.java b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/controller/ElderTagController.java new file mode 100644 index 0000000..5afa007 --- /dev/null +++ b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/controller/ElderTagController.java @@ -0,0 +1,259 @@ +package com.nu.modules.eldertag.controller; + +import java.util.Arrays; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.nu.dto.DirectiveAsyncMQDto; +import com.nu.dto.ElderTagAsyncMQDto; +import com.nu.utils.RabbitMQUtil; +import org.apache.commons.lang.StringUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.api.ISysBaseAPI; +import org.jeecg.common.system.query.QueryGenerator; +import com.nu.modules.eldertag.entity.ElderTag; +import com.nu.modules.eldertag.service.IElderTagService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + +/** + * @Description: 长者标签 + * @Author: zmy + * @Date: 2025-08-13 + * @Version: V1.0 + */ +@Api(tags = "长者标签") +@RestController +@RequestMapping("/elder/elderTag") +@Slf4j +public class ElderTagController extends JeecgController { + @Autowired + private IElderTagService elderTagService; + @Autowired + private ISysBaseAPI sysBaseAPI; + @Autowired + private RabbitMQUtil rabbitMQUtil; + + /** + * 分页列表查询 + * + * @param elderTag + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "长者标签-分页列表查询") + @ApiOperation(value = "长者标签-分页列表查询", notes = "长者标签-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(ElderTag elderTag, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(elderTag, req.getParameterMap()); + queryWrapper.orderByAsc("sort"); + Page page = new Page(pageNo, pageSize); + IPage pageList = elderTagService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 分页列表查询-更换数据源 + * + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @ApiOperation(value = "长者标签-分页列表查询", notes = "长者标签-分页列表查询") + @GetMapping(value = "/listByDS") + @DS("#dataSourceCode") + public Result> queryPageListByDS(@RequestParam(name = "dataSourceCode") String dataSourceCode, ElderTag et, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { + if (StringUtils.isBlank(dataSourceCode)) { + return Result.ok(new Page()); + } + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(et, req.getParameterMap()); + if (StringUtils.isNotBlank(et.getExcludeIds())) { + queryWrapper.notIn("id", et.getExcludeIds().split(",")); + } + queryWrapper.orderByAsc("sort"); + Page page = new Page(pageNo, pageSize); + IPage list = elderTagService.page(page, queryWrapper); + return Result.OK(list); + } + + + /** + * 查询目标平台已有标签 + * + * @param dataSourceCode + * @return + */ + @GetMapping(value = "/idListByDS") + @DS("#dataSourceCode") + public Result> idListByDS(@RequestParam(name = "dataSourceCode") String dataSourceCode, ElderTag et) { + if (StringUtils.isBlank(dataSourceCode)) { + return Result.ok(new Page<>()); + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("id"); + if (StringUtils.isNotBlank(et.getExcludeIds())) { + queryWrapper.notIn("id", et.getExcludeIds().split(",")); + } + Page page = new Page<>(1, -1); + IPage list = elderTagService.page(page, queryWrapper); + return Result.OK(list); + } + + /** + * 添加 + * + * @param elderTag + * @return + */ + @AutoLog(value = "长者标签-添加") + @ApiOperation(value = "长者标签-添加", notes = "长者标签-添加") + @RequiresPermissions("eldertag:nu_elder_tag:add") + @PostMapping(value = "/add") + public Result add(@RequestBody ElderTag elderTag) { + JSONObject deptInfo = sysBaseAPI.getDeptInfo(); + elderTag.setId(deptInfo.getString("code") + IdUtil.simpleUUID()); + elderTag.setSysOrgCode(deptInfo.getString("code")); + //处理静态资源 + elderTagService.handleMediaFile(elderTag); + elderTagService.save(elderTag); + + //同步给管理平台 + { + ElderTagAsyncMQDto elderTagAsyncMQDto = new ElderTagAsyncMQDto(); + BeanUtils.copyProperties(elderTag, elderTagAsyncMQDto); + rabbitMQUtil.sendToExchange("hldy.eldettag", "hldy.eldettag.newadd", elderTagAsyncMQDto); + } + + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param elderTag + * @return + */ + @AutoLog(value = "长者标签-编辑") + @ApiOperation(value = "长者标签-编辑", notes = "长者标签-编辑") + @RequiresPermissions("eldertag:nu_elder_tag:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST}) + public Result edit(@RequestBody ElderTag elderTag) { + //处理静态资源 + elderTagService.handleMediaFile(elderTag); + elderTagService.updateById(elderTag); + + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "长者标签-通过id删除") + @ApiOperation(value = "长者标签-通过id删除", notes = "长者标签-通过id删除") + @RequiresPermissions("eldertag:nu_elder_tag:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name = "id", required = true) String id) { + elderTagService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "长者标签-批量删除") + @ApiOperation(value = "长者标签-批量删除", notes = "长者标签-批量删除") + @RequiresPermissions("eldertag:nu_elder_tag:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + this.elderTagService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "长者标签-通过id查询") + @ApiOperation(value = "长者标签-通过id查询", notes = "长者标签-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name = "id", required = true) String id) { + ElderTag elderTag = elderTagService.getById(id); + if (elderTag == null) { + return Result.error("未找到对应数据"); + } + return Result.OK(elderTag); + } + + /** + * 导出excel + * + * @param request + * @param elderTag + */ + @RequiresPermissions("eldertag:nu_elder_tag:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, ElderTag elderTag) { + return super.exportXls(request, elderTag, ElderTag.class, "长者标签"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("eldertag:nu_elder_tag:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, ElderTag.class); + } + + /** + * @return + */ + @AutoLog(value = "长者标签-标签同步") + @ApiOperation(value = "长者标签-标签同步", notes = "长者标签-标签同步") + @PostMapping(value = "/syncElderTag") + public Result syncElderTag(@RequestParam(name = "sourceOrgCode") String sourceOrgCode, @RequestBody ElderTag dto) { + //同步 + if (StringUtils.isNotBlank(dto.getSyncIds())) { + new Thread(() -> { + service.syncElderTag(sourceOrgCode, dto.getSyncIds()); + }).start(); + } + //发送消息 + return Result.ok(); + } +} diff --git a/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/entity/ElderTag.java b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/entity/ElderTag.java new file mode 100644 index 0000000..d84c76d --- /dev/null +++ b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/entity/ElderTag.java @@ -0,0 +1,99 @@ +package com.nu.modules.eldertag.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.*; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: 长者标签 + * @Author: zmy + * @Date: 2025-08-13 + * @Version: V1.0 + */ +@Data +@TableName("nu_elder_tag") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="nu_elder_tag对象", description="长者标签") +public class ElderTag implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private java.lang.String id; + /**标签类型*/ + @Excel(name = "标签类型", width = 15) + @ApiModelProperty(value = "标签类型") + @Dict(dicCode = "elder_tag_type") + private java.lang.String type; + /**标签名称*/ + @Excel(name = "标签名称", width = 15) + @ApiModelProperty(value = "标签名称") + private java.lang.String tagName; + /**价格*/ + @Excel(name = "价格", width = 15) + @ApiModelProperty(value = "价格") + private java.math.BigDecimal price; + /**图标*/ + @Excel(name = "图标", width = 15) + @ApiModelProperty(value = "图标") + private java.lang.String pic; + /**图标md5值*/ + @ApiModelProperty(value = "图标md5值") + private java.lang.String picMd5; + /**排序*/ + @Excel(name = "排序", width = 15) + @ApiModelProperty(value = "排序") + private java.lang.Integer sort; + /**是否启用*/ + @Excel(name = "是否启用", width = 15) + @ApiModelProperty(value = "是否启用") + @Dict(dicCode = "iz_enabled") + private java.lang.String izEnabled; + /**是否删除*/ + @Excel(name = "是否删除", width = 15) + @ApiModelProperty(value = "是否删除") + @TableLogic + private java.lang.String delFlag; + /**创建人*/ + @ApiModelProperty(value = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @ApiModelProperty(value = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新日期") + private java.util.Date updateTime; + /**所属机构*/ + @ApiModelProperty(value = "所属机构") + private java.lang.String sysOrgCode; + + /**需要排除的id */ + @TableField(exist = false) + private String excludeIds; + /**需要同步的id */ + @TableField(exist = false) + private String SyncIds; +} diff --git a/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/mapper/ElderTagMapper.java b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/mapper/ElderTagMapper.java new file mode 100644 index 0000000..630d601 --- /dev/null +++ b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/mapper/ElderTagMapper.java @@ -0,0 +1,17 @@ +package com.nu.modules.eldertag.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.nu.modules.eldertag.entity.ElderTag; + +import java.util.List; + +/** + * @Description: 长者标签 + * @Author: zmy + * @Date: 2025-08-13 + * @Version: V1.0 + */ +public interface ElderTagMapper extends BaseMapper { + + List allData(); +} diff --git a/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/mapper/xml/ElderTagMapper.xml b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/mapper/xml/ElderTagMapper.xml new file mode 100644 index 0000000..c2ae65e --- /dev/null +++ b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/mapper/xml/ElderTagMapper.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/service/IElderTagService.java b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/service/IElderTagService.java new file mode 100644 index 0000000..e843a79 --- /dev/null +++ b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/service/IElderTagService.java @@ -0,0 +1,24 @@ +package com.nu.modules.eldertag.service; + +import com.nu.dto.ElderTagMQDto; +import com.nu.modules.eldertag.entity.ElderTag; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * @Description: 长者标签 + * @Author: zmy + * @Date: 2025-08-13 + * @Version: V1.0 + */ +public interface IElderTagService extends IService { + + void handleMediaFile(ElderTag elderTag); + + ElderTagMQDto syncElderTag(String sourceOrgCode, String syncIds); + + List allData(); + + void insertAllDirectives(List needAddETList); +} diff --git a/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/service/impl/ElderTagServiceImpl.java b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/service/impl/ElderTagServiceImpl.java new file mode 100644 index 0000000..e2c3467 --- /dev/null +++ b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/eldertag/service/impl/ElderTagServiceImpl.java @@ -0,0 +1,108 @@ +package com.nu.modules.eldertag.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.nu.dto.*; +import com.nu.modules.eldertag.entity.ElderTag; +import com.nu.modules.eldertag.mapper.ElderTagMapper; +import com.nu.modules.eldertag.service.IElderTagService; +import com.nu.modules.mq.eldertag.listener.ElderTagMQListener; +import com.nu.modules.sysconfig.ISysConfigApi; +import com.nu.utils.HttpRequestUtil; +import com.nu.utils.NuFileUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.io.File; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * @Description: 长者标签 + * @Author: zmy + * @Date: 2025-08-13 + * @Version: V1.0 + */ +@Service +public class ElderTagServiceImpl extends ServiceImpl implements IElderTagService { + + @Lazy + @Autowired + private ElderTagMQListener elderTagMQListener; + @Autowired + private ISysConfigApi sysConfigApi; + + /** + * 将资源放到静态目录中 + * + * @param elderTag + */ + @Override + public void handleMediaFile(ElderTag elderTag) { + //需要存储的路径 + String mediaFileSavePath = "/eldertag/" + elderTag.getTagName() + elderTag.getId(); + //图标 + String previewFile = elderTag.getPic(); + // 处理文件并获取更新后的路径 + Map newFileMap = NuFileUtils.processFile(mediaFileSavePath, previewFile); + if (newFileMap != null) { + elderTag.setPic(newFileMap.get("path")); + elderTag.setPicMd5(newFileMap.get("md5")); + } + } + + @Override + @DS("#sourceOrgCode") + public ElderTagMQDto syncElderTag(String sourceOrgCode, String syncIds) { + ElderTagMQDto etMQDto = new ElderTagMQDto(); + QueryWrapper qw = new QueryWrapper<>(); + qw.in("id",syncIds.split(",")); + List elderTags = baseMapper.selectList(qw); + etMQDto.setElderTagList(BeanUtil.copyToList(elderTags, ElderTagAsyncMQDto.class)); + elderTagMQListener.handleIncremental2( etMQDto); + + String apiAddress = ""; + //查询源数据平台的接口api地址 + { + //各平台api地址都存在管理系统中 管理系统api地址在系统参数配置中 “ope_open_url” + JSONObject opeOpenUrl = sysConfigApi.getByKeyByDS("master", "ope_open_url"); + String opeApiAddress = opeOpenUrl.getString("configValue"); + if (opeApiAddress.endsWith("/")) { + opeApiAddress = opeApiAddress.substring(0, opeApiAddress.length() - 1); + } + String bizApiAddress = opeApiAddress + "/api/baseInfo/getOrgApiAddress?orgCode=" + sourceOrgCode; + + try { + String res = HttpRequestUtil.doGet(bizApiAddress, HttpRequestUtil.createDefaultHeaders()); + JSONObject jsonResponse = JSON.parseObject(res); + JSONObject result = jsonResponse.getJSONObject("result"); + apiAddress = result.getString("url"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + elderTagMQListener.handleCreateMedia2(etMQDto, apiAddress); + //给对应业务平台发送消息 + return etMQDto; + } + + @Override + public List allData() { + return baseMapper.allData(); + } + + @Override + public void insertAllDirectives(List needAddETList) { + needAddETList.stream().forEach(et -> { + baseMapper.insert(et); + }); + } +} diff --git a/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/mq/eldertag/exceptionhandler/ElderTagMQExceptionHandler.java b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/mq/eldertag/exceptionhandler/ElderTagMQExceptionHandler.java new file mode 100644 index 0000000..0b6ae3e --- /dev/null +++ b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/mq/eldertag/exceptionhandler/ElderTagMQExceptionHandler.java @@ -0,0 +1,28 @@ +package com.nu.modules.mq.eldertag.exceptionhandler; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.AmqpRejectAndDontRequeueException; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.listener.api.RabbitListenerErrorHandler; +import org.springframework.amqp.rabbit.support.ListenerExecutionFailedException; +import org.springframework.stereotype.Component; + +@Slf4j +@Component("elderTagMQErrorHandler") +public class ElderTagMQExceptionHandler implements RabbitListenerErrorHandler { + + @Override + public Object handleError(Message message, org.springframework.messaging.Message message1, ListenerExecutionFailedException e) { + log.error("MQ消息处理失败 | 消息体: {} | 异常原因: {}", new String(message.getBody()), e.getCause().getMessage()); + + // 根据异常类型选择处理策略 +// if (isRetryable(e)) { +// // 可重试异常:抛出异常触发重试 +// throw e; +// } else { + // 不可恢复异常:拒绝消息且不重新入队 + throw new AmqpRejectAndDontRequeueException("消息处理失败且禁止重试", e); +// } + } + +} diff --git a/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/mq/eldertag/listener/DynamicQueueNameProvider.java b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/mq/eldertag/listener/DynamicQueueNameProvider.java new file mode 100644 index 0000000..694309e --- /dev/null +++ b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/mq/eldertag/listener/DynamicQueueNameProvider.java @@ -0,0 +1,42 @@ +package com.nu.modules.mq.eldertag.listener; + +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang.StringUtils; +import org.jeecg.common.system.api.ISysBaseAPI; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component("elderTagAsyncDQNP") +public class DynamicQueueNameProvider { + + @Autowired + private ISysBaseAPI sysBaseAPI; + + public String getCreateMediaQueueName() { + JSONObject deptInfo = sysBaseAPI.getDeptInfo(); + String orgCode = deptInfo.getString("code"); + if (StringUtils.isNotBlank(orgCode)) { + return orgCode + ".eldertag.createmedia"; + } else { + return ""; + } + } + + public String getCreateMediaKeyName() { + return getCreateMediaQueueName(); + } + + public String getSyncElderTagQueueName() { + JSONObject deptInfo = sysBaseAPI.getDeptInfo(); + String orgCode = deptInfo.getString("code"); + if (StringUtils.isNotBlank(orgCode)) { + return orgCode + ".eldertag.synceldertag"; + } else { + return ""; + } + } + + public String getSyncElderTagKeyName() { + return getSyncElderTagQueueName(); + } +} diff --git a/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/mq/eldertag/listener/ElderTagMQListener.java b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/mq/eldertag/listener/ElderTagMQListener.java new file mode 100644 index 0000000..55d1889 --- /dev/null +++ b/nursing-unit-elder/nu-elder-biz/src/main/java/com/nu/modules/mq/eldertag/listener/ElderTagMQListener.java @@ -0,0 +1,289 @@ +package com.nu.modules.mq.eldertag.listener; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.nu.dto.ElderTagMQDto; +import com.nu.dto.StatusMQDto; +import com.nu.enums.MQStatus; +import com.nu.modules.eldertag.entity.ElderTag; +import com.nu.modules.eldertag.service.IElderTagService; +import com.nu.modules.mediaasyncerrorlog.entity.MediaAsyncErrorLog; +import com.nu.modules.mediaasyncerrorlog.service.IMediaAsyncErrorLogService; +import com.nu.utils.FileDownloader; +import com.nu.utils.RabbitMQUtil; +import com.nu.utils.SafetyUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang.StringUtils; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.io.File; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@Slf4j +@Component +public class ElderTagMQListener { + + @Value("${jeecg.path.upload}") + private String upLoadPath; + @Autowired + private RabbitMQUtil rabbitMQUtil; + @Autowired + private IElderTagService elderTagService; + @Autowired + private IMediaAsyncErrorLogService mediaAsyncErrorLogService; + + @RabbitListener(bindings = @QueueBinding(value = @Queue(name = "#{elderTagAsyncDQNP.getSyncElderTagQueueName()}"), exchange = @Exchange(name = "hldy.eldertag", type = ExchangeTypes.DIRECT), key = "#{elderTagAsyncDQNP.getSyncElderTagKeyName()}"), errorHandler = "elderTagMQErrorHandler") + @Transactional(rollbackFor = {Exception.class}) + public void handleAuditResult(ElderTagMQDto dto) { + dto.setIzInc(true); + dto.setIdStr(dto.getElderTagList().stream().map(d -> d.getId()).collect(Collectors.joining(","))); + try { + //增量处理数据 + handleIncremental(dto); + //数据处理出错的话就不能继续处理标签资源了 所以方法放到这个位置 + handleCreateMedia(dto); + } catch (Exception e) { + e.printStackTrace(); + //返回错误日志 + StatusMQDto statusMQDto = new StatusMQDto(); + statusMQDto.setStatus(MQStatus.PROCESS_FAILED.getCode()); + statusMQDto.setMessage(e.getMessage()); + statusMQDto.setAsyncId(dto.getAsyncId()); + statusMQDto.setCode("data"); + rabbitMQUtil.sendToExchange("hldy.eldertag", "eldertag.async.result", statusMQDto); + //这里就不会再执行文件的逻辑 要把文件按同步失败处理 + StatusMQDto statusMQDtoFile = new StatusMQDto(); + statusMQDtoFile.setStatus(MQStatus.PROCESS_FAILED.getCode()); + statusMQDtoFile.setMessage("文件同步失败,不再处理资源"); + statusMQDtoFile.setAsyncId(dto.getAsyncId()); + statusMQDtoFile.setCode("file"); + rabbitMQUtil.sendToExchange("hldy.eldertag", "eldertag.async.result", statusMQDtoFile); + throw new RuntimeException("数据同步失败"); + } + //在这里返回数据成功和日志 + StatusMQDto statusMQDto = new StatusMQDto(); + statusMQDto.setStatus(MQStatus.SUCCESS.getCode()); + statusMQDto.setMessage("数据同步成功!"); + statusMQDto.setAsyncId(dto.getAsyncId()); + statusMQDto.setCode("data"); + rabbitMQUtil.sendToExchange("hldy.eldertag", "eldertag.async.result", statusMQDto); + //资源日志在handleCreateMedia中有处理 + } + + /** + * 拉取标签资源 + * + * @param mqDto + */ + @RabbitListener(bindings = @QueueBinding(value = @Queue(name = "#{elderTagAsyncDQNP.getCreateMediaQueueName()}"), exchange = @Exchange(name = "hldy.eldertag", type = ExchangeTypes.DIRECT), key = "#{elderTagAsyncDQNP.getCreateMediaKeyName()}"), errorHandler = "elderTagMQErrorHandler") + public void handleCreateMedia(ElderTagMQDto mqDto) { + try { + mqDto.getElderTagList().stream().forEach(dto -> { + //查询现有长者标签 + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("id", dto.getId()); + ElderTag currentElderTag = elderTagService.getOne(qw); + + //更新长者标签媒体资源字段 + ElderTag et = new ElderTag(); + et.setId(dto.getId()); + + //拉取媒体资源至本地目录 + { + //接口协议域名+上下文访问路径 + String baseUrl = dto.getApi(); + + //处理长者标签图片 + if (StringUtils.isNotBlank(dto.getPicMd5()) && !dto.getPicMd5().equals(currentElderTag.getPicMd5())) { + String pic = dto.getPic(); + if (StringUtils.isNotBlank(pic)) { + String url = baseUrl + "/sys/common/open/static/" + URLEncoder.encode(pic, StandardCharsets.UTF_8).replace("%2F", "/") + "?name=" + SafetyUtil.getSecureKey(); + if (upLoadPath.endsWith("/") || upLoadPath.endsWith("\\")) { + upLoadPath = upLoadPath.substring(0, upLoadPath.length() - 1); + } + String filePath = pic.substring(0, pic.lastIndexOf("/")); + String fileName = pic.substring(pic.lastIndexOf("/") + 1); + if (filePath.startsWith("/") || filePath.startsWith("\\")) { + filePath = filePath.substring(1); + } + try { + FileDownloader.downloadFile(url, upLoadPath + File.separator + filePath, fileName); + et.setPic(dto.getPic());//长者标签图片 + et.setPicMd5(dto.getPicMd5()); + } catch (Exception e) { + e.printStackTrace(); + MediaAsyncErrorLog mediaAsyncErrorLog = new MediaAsyncErrorLog(); + mediaAsyncErrorLog.setMediaid(pic); + mediaAsyncErrorLog.setMsg(e.getMessage()); + mediaAsyncErrorLogService.save(mediaAsyncErrorLog); + throw new RuntimeException("长者标签图片文件拉取错误,标签id" + currentElderTag.getId()); + } + } + } + elderTagService.updateById(et); + } + }); + //在这里返回数据成功和日志 + StatusMQDto statusMQDto = new StatusMQDto(); + statusMQDto.setStatus(MQStatus.SUCCESS.getCode()); + statusMQDto.setMessage("文件同步成功!"); + statusMQDto.setAsyncId(mqDto.getAsyncId()); + statusMQDto.setCode("file"); + rabbitMQUtil.sendToExchange("hldy.eldertag", "eldertag.async.result", statusMQDto); + } catch (Exception e) { + e.printStackTrace(); + //返回错误日志 + StatusMQDto statusMQDto = new StatusMQDto(); + statusMQDto.setStatus(MQStatus.PROCESS_FAILED.getCode()); + statusMQDto.setMessage(e.getMessage()); + statusMQDto.setAsyncId(mqDto.getAsyncId()); + statusMQDto.setCode("file"); + rabbitMQUtil.sendToExchange("hldy.eldertag", "eldertag.async.result", statusMQDto); + } + + } + + /** + * 处理增量同步数据 + * + * @param dto + * @throws Exception + */ + private void handleIncremental(ElderTagMQDto dto) { + //增量:传过来的是已勾选的全部数据,需将重复部分去除 + //先查出所有标签id 然后进行去重 + List tempList = elderTagService.allData(); + Set existingIds = tempList.stream().map(ElderTag::getId).map(String::valueOf).collect(Collectors.toSet()); + + String idStr = dto.getIdStr(); + List inputIds = Arrays.asList(idStr.split(",")); + + List uniqueIds = inputIds.stream().filter(id -> !existingIds.contains(id)).collect(Collectors.toList()); + + dto.setIdList(uniqueIds); + + handleData(dto); + } + + /** + * 处理数据 + * 每一项都会筛选 只留下需要新增的数据 + * + * @param dto + */ + private void handleData(ElderTagMQDto dto) { + if (dto.getIdList() != null && !dto.getIdList().isEmpty()) { + //长者标签 + List needAddETList = Lists.newArrayList(); + //需要新增的标签id + List needAddIds = dto.getIdList(); + //传来的全部标签集合 + List allData = BeanUtil.copyToList(dto.getElderTagList(), ElderTag.class); + //获取到需要新增的标签集合 + for (ElderTag elderTag : allData) { + if (needAddIds.contains(elderTag.getId())) { + //这里都是新增的标签 不存储标签资源字段 在标签资源mq中会存储这个值 + elderTag.setPic(null); + elderTag.setPicMd5(null); + needAddETList.add(elderTag); + } + } + //新增到数据库 + if (needAddETList != null && !needAddETList.isEmpty()) { + elderTagService.insertAllDirectives(needAddETList); + } + } + } + + @DS("master") + public void handleCreateMedia2(ElderTagMQDto mqDto, String apiAddress) { + try { + mqDto.getElderTagList().stream().forEach(dto -> { + //查询现有长者标签 + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("id", dto.getId()); + ElderTag currentElderTag = elderTagService.getOne(qw); + + //更新长者标签媒体资源字段 + ElderTag et = new ElderTag(); + et.setId(dto.getId()); + + //拉取媒体资源至本地目录 + { + //处理长者标签图片 + if (StringUtils.isNotBlank(dto.getPicMd5()) && !dto.getPicMd5().equals(currentElderTag.getPicMd5())) { + String pic = dto.getPic(); + if (StringUtils.isNotBlank(pic)) { + String url = apiAddress + "/sys/common/open/static/" + URLEncoder.encode(pic, StandardCharsets.UTF_8).replace("%2F", "/") + "?name=" + SafetyUtil.getSecureKey(); + if (upLoadPath.endsWith("/") || upLoadPath.endsWith("\\")) { + upLoadPath = upLoadPath.substring(0, upLoadPath.length() - 1); + } + String filePath = pic.substring(0, pic.lastIndexOf("/")); + String fileName = pic.substring(pic.lastIndexOf("/") + 1); + if (filePath.startsWith("/") || filePath.startsWith("\\")) { + filePath = filePath.substring(1); + } + try { + FileDownloader.downloadFile(url, upLoadPath + File.separator + filePath, fileName); + et.setPic(dto.getPic());//长者标签图片 + et.setPicMd5(dto.getPicMd5()); + } catch (Exception e) { + e.printStackTrace(); + MediaAsyncErrorLog mediaAsyncErrorLog = new MediaAsyncErrorLog(); + mediaAsyncErrorLog.setMediaid(pic); + mediaAsyncErrorLog.setMsg(e.getMessage()); + mediaAsyncErrorLogService.save(mediaAsyncErrorLog); + throw new RuntimeException("长者标签图片文件拉取错误,标签id" + currentElderTag.getId()); + } + } + } + elderTagService.updateById(et); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + /** + * 处理增量同步数据 + * + * @param dto + * @throws Exception + */ + @DS("master") + public void handleIncremental2(ElderTagMQDto dto) { + //增量:传过来的是已勾选的全部数据,需将重复部分去除 + //先查出所有标签id 然后进行去重 + List tempList = elderTagService.allData(); + Set existingIds = tempList.stream().map(ElderTag::getId).map(String::valueOf).collect(Collectors.toSet()); + + dto.setIzInc(true); + dto.setIdStr(dto.getElderTagList().stream().map(d -> d.getId()).collect(Collectors.joining(","))); + String idStr = dto.getIdStr(); + List inputIds = Arrays.asList(idStr.split(",")); + + List uniqueIds = inputIds.stream().filter(id -> !existingIds.contains(id)).collect(Collectors.toList()); + + dto.setIdList(uniqueIds); + + handleData(dto); + } + +} diff --git a/nursing-unit-elder/pom.xml b/nursing-unit-elder/pom.xml new file mode 100644 index 0000000..289847b --- /dev/null +++ b/nursing-unit-elder/pom.xml @@ -0,0 +1,20 @@ + + + + com.nursingunit.boot + nursing-unit-parent + 2.0.0 + + 长者模块 + 4.0.0 + nursing-unit-elder + pom + + + nu-elder-api + nu-elder-biz + + + diff --git a/nursing-unit-services/nu-services-biz/src/main/java/com/nu/modules/servicedirective/service/impl/ConfigServiceDirectiveServiceImpl.java b/nursing-unit-services/nu-services-biz/src/main/java/com/nu/modules/servicedirective/service/impl/ConfigServiceDirectiveServiceImpl.java index 3174423..11a88a7 100644 --- a/nursing-unit-services/nu-services-biz/src/main/java/com/nu/modules/servicedirective/service/impl/ConfigServiceDirectiveServiceImpl.java +++ b/nursing-unit-services/nu-services-biz/src/main/java/com/nu/modules/servicedirective/service/impl/ConfigServiceDirectiveServiceImpl.java @@ -29,6 +29,7 @@ import com.nu.modules.servicetype.service.IConfigServiceTypeService; import com.nu.modules.sysconfig.ISysConfigApi; import com.nu.mq.directive.listener.DirectiveMQListener; import com.nu.utils.HttpRequestUtil; +import com.nu.utils.NuFileUtils; import com.nu.utils.RabbitMQUtil; import org.apache.commons.compress.utils.Lists; import org.apache.commons.lang.StringUtils; @@ -59,9 +60,6 @@ import java.util.stream.Collectors; @Service public class ConfigServiceDirectiveServiceImpl extends ServiceImpl implements IConfigServiceDirectiveService { - @Value(value = "${jeecg.path.upload}") - private String uploadpath; - @Autowired private ISysConfigApi sysConfigApi; @Autowired @@ -280,8 +278,6 @@ public class ConfigServiceDirectiveServiceImpl extends ServiceImpl newPreviewFileMap = processFile(path, mediaFileSavePath, previewFile); - Map newImmediateFileMap = processFile(path, mediaFileSavePath, immediateFile); - Map newMp3FileMap = processFile(path, mediaFileSavePath, mp3File); - Map newMp4FileMap = processFile(path, mediaFileSavePath, mp4File); + Map newPreviewFileMap = NuFileUtils.processFile(mediaFileSavePath, previewFile); + Map newImmediateFileMap = NuFileUtils.processFile(mediaFileSavePath, immediateFile); + Map newMp3FileMap = NuFileUtils.processFile(mediaFileSavePath, mp3File); + Map newMp4FileMap = NuFileUtils.processFile(mediaFileSavePath, mp4File); // 如果有变化,更新ConfigServiceDirective对象 if (newPreviewFileMap != null) { @@ -318,83 +314,6 @@ public class ConfigServiceDirectiveServiceImpl extends ServiceImpl processFile(String basePath, String targetDir, String filePath) { - if (StringUtils.isBlank(filePath)) { - return null; - } - - try { - // 检查文件路径是否以目标目录开头 - if (!filePath.startsWith(targetDir + "/")) { - // 获取文件名(路径的最后一部分) - String fileName = filePath.substring(filePath.lastIndexOf('/') + 1); - - // 构建新的完整路径 - String newRelativePath = targetDir + "/" + fileName; - String oldFullPath = basePath + "/" + filePath; - String newFullPath = basePath + "/" + newRelativePath; - - // 创建目标目录(如果不存在) - File targetDirectory = new File(basePath + "/" + targetDir); - if (!targetDirectory.exists()) { - targetDirectory.mkdirs(); - } - - // 移动文件 - File oldFile = new File(oldFullPath); - if (oldFile.exists()) { - // 计算原文件的MD5 - String md5 = calculateMD5(oldFile); - - File newFile = new File(newFullPath); - - // 如果目标文件已存在,先删除 - if (newFile.exists()) { - newFile.delete(); - } - - // 移动文件 - Files.move(oldFile.toPath(), newFile.toPath()); - - // 返回包含新路径和MD5的Map - Map result = new HashMap<>(); - result.put("path", newRelativePath); - result.put("md5", md5); - return result; - } - } - } catch (Exception e) { - // 处理异常,可以根据实际需求记录日志或抛出 - e.printStackTrace(); - } - - return null; - } - - private String calculateMD5(File file) throws Exception { - try (InputStream is = Files.newInputStream(file.toPath())) { - MessageDigest md = MessageDigest.getInstance("MD5"); - byte[] buffer = new byte[8192]; - int read; - while ((read = is.read(buffer)) != -1) { - md.update(buffer, 0, read); - } - byte[] md5 = md.digest(); - StringBuilder sb = new StringBuilder(); - for (byte b : md5) { - sb.append(String.format("%02x", b)); - } - return sb.toString(); - } - } @Override public void auditPass(DirectiveAsyncMQDto dto) { @@ -479,7 +398,7 @@ public class ConfigServiceDirectiveServiceImpl extends ServiceImpl catList = catMap.get(inst.getId()); if (catList != null) { catList.sort(Comparator.comparingInt(ConfigServiceCategory::getSort)); @@ -488,7 +407,7 @@ public class ConfigServiceDirectiveServiceImpl extends ServiceImpl typeList = typeMap.get(cat.getId()); if (typeList != null) { typeList.sort(Comparator.comparingInt(ConfigServiceType::getSort)); @@ -497,7 +416,7 @@ public class ConfigServiceDirectiveServiceImpl extends ServiceImpl dirList = directiveMap.get(tp.getId()); if (dirList != null) { dirList.sort(Comparator.comparingInt(ConfigServiceDirective::getSort)); @@ -505,12 +424,12 @@ public class ConfigServiceDirectiveServiceImpl extends ServiceImpl d.getId()).collect(Collectors.joining(","))); //增量:传过来的是已勾选的全部数据,需将重复部分去除 diff --git a/nursing-unit-system/nu-system-start/pom.xml b/nursing-unit-system/nu-system-start/pom.xml index 4d37072..593bb9b 100644 --- a/nursing-unit-system/nu-system-start/pom.xml +++ b/nursing-unit-system/nu-system-start/pom.xml @@ -54,6 +54,12 @@ nu-services-biz ${nursingunit.version} + + + com.nursingunit.boot + nu-elder-biz + ${nursingunit.version} + com.nursingunit.boot diff --git a/pom.xml b/pom.xml index 99c44c3..476d576 100644 --- a/pom.xml +++ b/pom.xml @@ -86,6 +86,8 @@ nursing-unit-admin nursing-unit-services + + nursing-unit-elder nursing-unit-api