diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/human/HumanManageController.java b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/human/HumanManageController.java index 9cfea403..3950251c 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/human/HumanManageController.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/human/HumanManageController.java @@ -1,14 +1,19 @@ package com.supervision.manage.controller.human; import com.supervision.manage.service.HumanManageService; +import com.supervision.model.Human; +import com.supervision.vo.manage.HumanReqVo; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @RequiredArgsConstructor @Tag(name = "数字人管理") +@RequestMapping("/humanManage") public class HumanManageController { private final HumanManageService humanManageService; @@ -17,4 +22,29 @@ public class HumanManageController { public void generateHuman(String humanId) throws Exception { humanManageService.generateHuman(humanId); } + + + @Operation(summary = "新增数字人", tags = "v1.3新增") + @PostMapping("/createHuman") + public boolean createHuman(@RequestBody HumanReqVo humanReqVo) { + return humanManageService.createHuman(humanReqVo); + } + + @Operation(summary = "查询数字人列表", tags = "v1.3新增") + @GetMapping("/list") + public List queryHumanList() { + return humanManageService.queryHumanList(); + } + + @Operation(summary = "修改数字人", tags = "v1.3新增") + @PostMapping("/updateHuman") + public boolean updateHuman(@RequestBody HumanReqVo human) { + return humanManageService.updateHuman(human); + } + + @Operation(summary = "删除数字人", tags = "v1.3新增") + @DeleteMapping("/deleteHuman") + public boolean deleteHuman(@RequestParam("id") String id) { + return humanManageService.deleteHuman(id); + } } diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/HumanManageService.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/HumanManageService.java index e8e3c476..3382c6f5 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/HumanManageService.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/HumanManageService.java @@ -1,6 +1,28 @@ package com.supervision.manage.service; +import com.supervision.model.Human; +import com.supervision.vo.manage.HumanReqVo; + +import java.util.List; + public interface HumanManageService { void generateHuman(String humanId) throws Exception; + + /** + * 查询数字人列表 + * @return + */ + List queryHumanList(); + + /** + * 新增数字人 + * @param humanReqVo 新增数字人请求 + * @return + */ + boolean createHuman(HumanReqVo humanReqVo); + + boolean updateHuman(HumanReqVo human); + + boolean deleteHuman(String id); } diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/HumanManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/HumanManageServiceImpl.java index 0175f57c..3b7ce85a 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/HumanManageServiceImpl.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/HumanManageServiceImpl.java @@ -2,6 +2,8 @@ package com.supervision.manage.service.impl; import cn.hutool.core.codec.Base64; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONUtil; @@ -11,7 +13,10 @@ import com.supervision.manage.service.FileManageService; import com.supervision.manage.service.HumanManageService; import com.supervision.model.FileResource; import com.supervision.model.Human; +import com.supervision.model.MedicalRec; import com.supervision.service.HumanService; +import com.supervision.service.MedicalRecService; +import com.supervision.vo.manage.HumanReqVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -19,13 +24,26 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.File; +import java.util.List; import java.util.Map; +import java.util.concurrent.*; @Slf4j @Service @RequiredArgsConstructor public class HumanManageServiceImpl implements HumanManageService { + /** + * 创建一个线程池,本意是用来异步调用数字人使用的 + * 核心线程数:2 + * 最大线程数:5 + * 队列长度:20 + */ + ThreadPoolExecutor humanExecutor = new ThreadPoolExecutor(2, 5, + 60L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue<>(20), ThreadUtil.newNamedThreadFactory("human", true), + new ThreadPoolExecutor.CallerRunsPolicy()); + private final HumanService humanService; private final FileManageService fileManageService; @Value("${humanGenerate.baseUrl}") @@ -34,6 +52,7 @@ public class HumanManageServiceImpl implements HumanManageService { private String silent; @Value("${humanGenerate.dynamic}") private String dynamic; + private final MedicalRecService medicalRecService; @Override @Transactional(rollbackFor = Exception.class) @@ -49,6 +68,78 @@ public class HumanManageServiceImpl implements HumanManageService { humanService.updateById(human); } + + + @Override + public List queryHumanList() { + return humanService.lambdaQuery().orderBy(true,false,Human::getCreateTime).list(); + } + + @Override + public boolean createHuman(HumanReqVo humanReqVo) { + + Assert.notEmpty(humanReqVo.getImageFileId(), "图片不能为空"); + Human human = new Human(); + human.setImageFileId(humanReqVo.getImageFileId()); + human.setDescription(humanReqVo.getDescription()); + humanService.save(human); + + // 异步调用生成数字人 + humanExecutor.submit(() -> { + try { + generateHuman(human.getId()); + } catch (Exception e) { + log.error("createHuman:生成数字人异常", e); + throw new BusinessException("生成数字人异常"); + } + }); + + return true; + } + + @Override + public boolean updateHuman(HumanReqVo human) { + Assert.notEmpty(human.getId(), "数字人id不能为空"); + Assert.notEmpty(human.getImageFileId(), "图片不能为空"); + + Human dbHuman = humanService.getById(human.getId()); + Assert.notEmpty(dbHuman.getId(), "数字人不存在"); + if (StrUtil.equals(dbHuman.getImageFileId(), human.getImageFileId())){ + // 只更新描述信息 + humanService.lambdaUpdate().eq(Human::getId, human.getId()) + .set(Human::getDescription, human.getDescription()).update(); + return true; + } + // 更新数字人状态 + dbHuman.setImageFileId(human.getImageFileId()); + dbHuman.setSilentTaskUid(null); + dbHuman.setDynamicTaskUid(null); + dbHuman.setDynamicVideoFileId(null); + dbHuman.setSilentVideoFileId(null); + dbHuman.setStatus(2); + dbHuman.setDescription(human.getDescription()); + humanService.updateById(dbHuman); + // 异步调用生成数字人 + humanExecutor.submit(() -> { + try { + generateHuman(human.getId()); + } catch (Exception e) { + log.error("createHuman:生成数字人异常", e); + throw new BusinessException("生成数字人异常"); + } + }); + + return true; + } + + @Override + public boolean deleteHuman(String id) { + Assert.notEmpty(id, "数字人id不能为空"); + Long count = medicalRecService.lambdaQuery().eq(MedicalRec::getHumanId, id).count(); + Assert.isTrue(count == 0, "该数字已被使用,不能删除"); + return humanService.removeById(id); + } + private void generateSilent(Human human, File imageFile) throws Exception { if (StrUtil.isAllBlank(human.getSilentVideoFileId(), human.getSilentTaskUid())) { HumanGenerateDTO silentDTO; @@ -74,7 +165,7 @@ public class HumanManageServiceImpl implements HumanManageService { } private void generateDynamic(Human human, File imageFile) throws Exception { - if (StrUtil.isAllNotBlank(human.getDynamicVideoFileId(), human.getDynamicTaskUid())) { + if (StrUtil.isAllBlank(human.getDynamicVideoFileId(), human.getDynamicTaskUid())) { HumanGenerateDTO dynamicDTO; try { String post = HttpUtil.post(humanBaseUrl + dynamic, Map.of("image", imageFile)); diff --git a/virtual-patient-model/src/main/java/com/supervision/model/Human.java b/virtual-patient-model/src/main/java/com/supervision/model/Human.java index 07a7de2f..173100de 100644 --- a/virtual-patient-model/src/main/java/com/supervision/model/Human.java +++ b/virtual-patient-model/src/main/java/com/supervision/model/Human.java @@ -32,7 +32,7 @@ public class Human implements Serializable { private String imageFileId; /** - * 静态图片ID + * 静态视频ID */ private String silentVideoFileId; diff --git a/virtual-patient-model/src/main/java/com/supervision/vo/manage/HumanReqVo.java b/virtual-patient-model/src/main/java/com/supervision/vo/manage/HumanReqVo.java new file mode 100644 index 00000000..2d24102c --- /dev/null +++ b/virtual-patient-model/src/main/java/com/supervision/vo/manage/HumanReqVo.java @@ -0,0 +1,17 @@ +package com.supervision.vo.manage; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class HumanReqVo { + + @Schema(description = "数字人ID") + private String id; + + @Schema(description = "静态图片ID") + private String imageFileId; + + @Schema(description = "描述") + private String description; +}