【流程自动化】

数字人生成
jinan_master_by_release_3.0.0
longbao 6 months ago
parent 3a6d9b753c
commit 7c3c46d260

@ -0,0 +1,401 @@
package com.supervision.util;
import okhttp3.*;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.net.URLEncoder;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import com.alibaba.fastjson.JSON;
/**
* @Authorlongbao
* @Date2024/11/05 18:06
* @Description:
*/
public class OkHttpUtils {
private static volatile OkHttpClient okHttpClient = null;
private static volatile Semaphore semaphore = null;
private Map<String, String> headerMap;
private Map<String, String> paramMap;
private Map<String, Object> paramMapObj;
private String url;
private Request.Builder request;
/**
* okHttpClienthttps访
*/
private OkHttpUtils() {
if (okHttpClient == null) {
synchronized (OkHttpUtils.class) {
if (okHttpClient == null) {
TrustManager[] trustManagers = buildTrustManagers();
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(1500, TimeUnit.SECONDS)
.writeTimeout(300, TimeUnit.SECONDS)
.readTimeout(300, TimeUnit.SECONDS)
.sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager) trustManagers[0])
.hostnameVerifier((hostName, session) -> true)
.retryOnConnectionFailure(true)
.build();
addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
}
}
}
}
/**
* 访线
*
* @return
*/
private static Semaphore getSemaphoreInstance() {
//只能1个线程同时访问
synchronized (OkHttpUtils.class) {
if (semaphore == null) {
semaphore = new Semaphore(0);
}
}
return semaphore;
}
/**
* OkHttpUtils
*
* @return
*/
public static OkHttpUtils builder() {
return new OkHttpUtils();
}
/**
* https
*
* @return
*/
private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustAllCerts) {
SSLSocketFactory ssfFactory = null;
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
ssfFactory = sc.getSocketFactory();
} catch (Exception e) {
e.printStackTrace();
}
return ssfFactory;
}
private static TrustManager[] buildTrustManagers() {
return new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
}
};
}
public static void main(String[] args) {
// get请求方法顺序按照这种方式切记选择post/get一定要放在倒数第二同步或者异步倒数第一才会正确执行
OkHttpUtils.builder().url("请求地址http/https都可以")
// 有参数的话添加参数,可多个
.addParam("参数名", "参数值")
.addParam("参数名", "参数值")
// 也可以添加多个
.addHeader("Content-Type", "application/json; charset=utf-8")
.get()
// 可选择是同步请求还是异步请求
//.async();
.sync();
// post请求分为两种一种是普通表单提交一种是json提交
OkHttpUtils.builder().url("请求地址http/https都可以")
// 有参数的话添加参数,可多个
.addParam("参数名", "参数值")
.addParam("参数名", "参数值")
// 也可以添加多个
.addHeader("Content-Type", "application/json; charset=utf-8")
// 如果是true的话会类似于postman中post提交方式的raw用json的方式提交不是表单
// 如果是false的话传统的表单提交
.post(true)
.sync();
// 选择异步有两个方法,一个是带回调接口,一个是直接返回结果
OkHttpUtils.builder().url("")
.post(false)
.async();
OkHttpUtils.builder().url("").post(false).async(new ICallBack() {
@Override
public void onSuccessful(Call call, String data) {
// 请求成功后的处理
}
@Override
public void onFailure(Call call, String errorMsg) {
// 请求失败后的处理
}
});
}
/**
* url
*
* @param url
* @return
*/
public OkHttpUtils url(String url) {
this.url = url;
return this;
}
/**
*
*
* @param key
* @param value
* @return
*/
public OkHttpUtils addParam(String key, String value) {
if (paramMap == null) {
paramMap = new LinkedHashMap<>(16);
}
paramMap.put(key, value);
return this;
}
public OkHttpUtils addParamObj(String key, Object value) {
if (paramMapObj == null) {
paramMapObj = new LinkedHashMap<>(16);
}
paramMapObj.put(key, value);
return this;
}
public OkHttpUtils addParamMap(Map requestMap) {
if (paramMap == null) {
paramMap = new LinkedHashMap<>(16);
}
paramMap.putAll(requestMap);
return this;
}
public OkHttpUtils addParamMapToObj(Map<String, Object> requestMap) {
if (paramMapObj == null) {
paramMapObj = new LinkedHashMap<>(16);
}
paramMapObj.putAll(requestMap);
return this;
}
/**
*
*
* @param key
* @param value
* @return
*/
public OkHttpUtils addHeader(String key, String value) {
if (headerMap == null) {
headerMap = new LinkedHashMap<>(16);
}
headerMap.put(key, value);
return this;
}
/**
* get
*
* @return
*/
public OkHttpUtils get() {
request = new Request.Builder().get();
StringBuilder urlBuilder = new StringBuilder(url);
if (paramMap != null) {
urlBuilder.append("?");
try {
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
urlBuilder.append(URLEncoder.encode(entry.getKey(), "utf-8")).
append("=").
append(URLEncoder.encode(entry.getValue(), "utf-8")).
append("&");
}
} catch (Exception e) {
e.printStackTrace();
}
urlBuilder.deleteCharAt(urlBuilder.length() - 1);
}
request.url(urlBuilder.toString());
return this;
}
/**
* post
*
* @param isJsonPost truejsonpostmanpostraw
* false
* @return
*/
public OkHttpUtils post(boolean isJsonPost) {
RequestBody requestBody;
if (isJsonPost) {
String json = "";
if (paramMap != null) {
json = JSON.toJSONString(paramMap);
}
requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
} else {
FormBody.Builder formBody = new FormBody.Builder();
if (paramMap != null) {
paramMap.forEach(formBody::add);
}
requestBody = formBody.build();
}
request = new Request.Builder().post(requestBody).url(url);
return this;
}
/**
* post
*
* @param isJsonPost truejsonpostmanpostraw
* false
* @return
*/
public OkHttpUtils put(boolean isJsonPost) {
RequestBody requestBody;
if (isJsonPost) {
String json = "";
if (paramMap != null) {
json = JSON.toJSONString(paramMap);
}
requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
} else {
FormBody.Builder formBody = new FormBody.Builder();
if (paramMap != null) {
paramMap.forEach(formBody::add);
}
requestBody = formBody.build();
}
request = new Request.Builder().put(requestBody).url(url);
return this;
}
/**
*
*
* @return
*/
public String sync() {
setHeader(request);
try {
Response response = okHttpClient.newCall(request.build()).execute();
assert response.body() != null;
return response.body().string();
} catch (IOException e) {
e.printStackTrace();
return "请求失败:" + e.getMessage();
}
}
/**
*
*/
public String async() {
StringBuilder buffer = new StringBuilder("");
setHeader(request);
okHttpClient.newCall(request.build()).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
buffer.append("请求出错:").append(e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
assert response.body() != null;
buffer.append(response.body().string());
getSemaphoreInstance().release();
}
});
try {
getSemaphoreInstance().acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
return buffer.toString();
}
/**
*
*
* @param callBack
*/
public void async(ICallBack callBack) {
setHeader(request);
okHttpClient.newCall(request.build()).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
callBack.onFailure(call, e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
assert response.body() != null;
callBack.onSuccessful(call, response.body().string());
}
});
}
/**
* request
*
* @param request
*/
private void setHeader(Request.Builder request) {
if (headerMap != null) {
try {
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
request.addHeader(entry.getKey(), entry.getValue());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public OkHttpUtils postJson(String jsonStr) {
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonStr);
request = new Request.Builder().post(requestBody).url(url);
return this;
}
/**
*
*/
public interface ICallBack {
void onSuccessful(Call call, String data);
void onFailure(Call call, String errorMsg);
}
}

@ -0,0 +1,15 @@
package com.supervision.manage.dto;
import lombok.Data;
@Data
public class HumanGenerateDTO {
private Integer code;
private String message;
private String uid;
private String video;
}

@ -0,0 +1,31 @@
package com.supervision.manage.human;
import com.supervision.manage.service.HumanManageService;
import com.supervision.model.Human;
import com.supervision.vo.manage.HumanCreateReqVo;
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.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.FileInputStream;
import java.util.List;
@RestController
@RequiredArgsConstructor
@Tag(name = "数字人管理")
@RequestMapping("/humanManage")
public class HumanManageController {
private final HumanManageService humanManageService;
@Operation(summary = "新增数字人")
@PostMapping(value = "/createHuman",consumes = "multipart/form-data")
public boolean createHuman(@RequestParam("file") MultipartFile imageFile, String medicalId) {
return humanManageService.createHuman(imageFile, medicalId);
}
}

@ -0,0 +1,33 @@
package com.supervision.manage.service;
import com.supervision.model.Human;
import com.supervision.vo.manage.HumanReqVo;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
public interface HumanManageService {
void generateHuman(String humanId, String medicalId) throws Exception;
/**
*
* @return
*/
List<Human> queryHumanList();
/**
*
* @param humanReqVo
* @return
*/
boolean createHuman(HumanReqVo humanReqVo);
boolean createHuman(MultipartFile imageFile, String medicalId);
boolean updateHuman(HumanReqVo human);
boolean deleteHuman(String id);
}

@ -0,0 +1,279 @@
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;
import com.supervision.enums.EnumMedicalRec;
import com.supervision.exception.BusinessException;
import com.supervision.manage.dto.HumanGenerateDTO;
import com.supervision.manage.service.FileManageService;
import com.supervision.manage.service.HumanManageService;
import com.supervision.model.AskPatientAnswer;
import com.supervision.model.FileResource;
import com.supervision.model.Human;
import com.supervision.model.MedicalRec;
import com.supervision.service.AskPatientAnswerService;
import com.supervision.service.HumanService;
import com.supervision.service.MedicalRecService;
import com.supervision.util.UserUtil;
import com.supervision.vo.manage.HumanReqVo;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@Slf4j
@Service
@RequiredArgsConstructor
public class HumanManageServiceImpl implements HumanManageService {
private final HumanService humanService;
private final FileManageService fileManageService;
private final MedicalRecService medicalRecService;
private final AskPatientAnswerService askPatientAnswerService;
/**
* 线使
* 线2
* 线5
* 20
*/
ThreadPoolExecutor humanExecutor = new ThreadPoolExecutor(2, 5,
60L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(20), ThreadUtil.newNamedThreadFactory("human", true),
new ThreadPoolExecutor.CallerRunsPolicy());
@Value("${humanGenerate.baseUrl}")
private String humanBaseUrl;
@Value("${humanGenerate.silent}")
private String silent;
@Value("${humanGenerate.dynamic}")
private String dynamic;
@Override
@Transactional(rollbackFor = Exception.class)
public void generateHuman(String humanId, String medicalId) throws Exception {
Human human = humanService.getOptById(humanId).orElseThrow(() -> new BusinessException("数字人形象不存在"));
File imageFile = fileManageService.downloadFile(human.getImageFileId());
// 创建一个图片临时文件
log.info("提交文件生成,文件名:{}", FileUtil.getName(imageFile));
generateSilent(human, imageFile, medicalId);
generateDynamic(human, imageFile, medicalId);
humanService.updateById(human);
}
@Override
public List<Human> 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.setImageName(humanReqVo.getImageName());
human.setImageFileId(humanReqVo.getImageFileId());
human.setDescription(humanReqVo.getDescription());
humanService.save(human);
// 异步调用生成数字人
humanExecutor.submit(() -> {
try {
generateHuman(human.getId(), null);
} 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())
.set(Human::getImageName, human.getImageName())
.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(), null);
} 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, String medicalId) throws Exception {
if (StrUtil.isAllBlank(human.getSilentVideoFileId(), human.getSilentTaskUid())) {
HumanGenerateDTO silentDTO;
try {
String post = HttpUtil.post(humanBaseUrl + silent, Map.of("image", imageFile));
silentDTO = JSONUtil.toBean(post, HumanGenerateDTO.class);
} catch (Exception e) {
throw new BusinessException("生成数字人静态视频异常");
}
// 保存静态视频
if (silentDTO.getCode() == 200) {
if (StrUtil.isNotBlank(silentDTO.getVideo())) {
// 如果已经生成了视频,那么直接拿到这个视频
FileResource fileResource = convertBase64ToFile("silent", FileUtil.getName(imageFile), silentDTO.getVideo());
human.setSilentVideoFileId(fileResource.getId());
human.setImageName(fileResource.getFileName());
// 诊断闻讯绑定静态视频
AskPatientAnswer askPatientAnswer = askPatientAnswerService.queryAnswerIdByMedicalId(medicalId, "静态视频");
AskPatientAnswer patientAnswer = new AskPatientAnswer();
patientAnswer.setId(askPatientAnswer.getId());
patientAnswer.setAnswerResourceId(fileResource.getId());
askPatientAnswerService.updateById(patientAnswer);
// 完成
MedicalRec medicalRec1 = new MedicalRec();
medicalRec1.setMedicalStatus(EnumMedicalRec.ESTABLISHED_RECORD.getCode());
medicalRec1.setId(medicalId);
medicalRecService.updateById(medicalRec1);
}
human.setSilentTaskUid(silentDTO.getUid());
}
}
}
private void generateDynamic(Human human, File imageFile, String medicalId) throws Exception {
if (StrUtil.isAllBlank(human.getDynamicVideoFileId(), human.getDynamicTaskUid())) {
HumanGenerateDTO dynamicDTO;
try {
String post = HttpUtil.post(humanBaseUrl + dynamic, Map.of("image", imageFile));
dynamicDTO = JSONUtil.toBean(post, HumanGenerateDTO.class);
} catch (Exception e) {
throw new BusinessException("生成数字人动态视频异常");
}
if (dynamicDTO.getCode() == 200) {
if (StrUtil.isNotBlank(dynamicDTO.getVideo())) {
// 如果已经生成了视频,那么直接拿到这个视频
FileResource fileResource = convertBase64ToFile("dynamic", FileUtil.getName(imageFile), dynamicDTO.getVideo());
human.setDynamicVideoFileId(fileResource.getId());
human.setImageName(fileResource.getFileName());
// 诊断闻讯绑定动态视频
AskPatientAnswer askPatientAnswer = askPatientAnswerService.queryAnswerIdByMedicalId(medicalId, "动态视频");
AskPatientAnswer patientAnswer = new AskPatientAnswer();
patientAnswer.setId(askPatientAnswer.getId());
patientAnswer.setAnswerResourceId(fileResource.getId());
askPatientAnswerService.updateById(patientAnswer);
// 完成
MedicalRec medicalRec1 = new MedicalRec();
medicalRec1.setMedicalStatus(EnumMedicalRec.COMPLETE.getCode());
medicalRec1.setId(medicalId);
medicalRecService.updateById(medicalRec1);
}
human.setDynamicTaskUid(dynamicDTO.getUid());
}
}
}
private FileResource convertBase64ToFile(String prefixName, String imageFileName, String base64) throws Exception {
String prefix = FileUtil.getPrefix(imageFileName);
// 创建一个图片临时文件
File tempFile = FileUtil.createTempFile(prefixName + "_" + prefix, ".mp4", true);
Base64.decodeToFile(base64, tempFile);
return fileManageService.uploadFile(tempFile);
}
@SneakyThrows
@Override
@Transactional
public boolean createHuman(MultipartFile imageFile, String medicalId) {
// 查询病例状态
MedicalRec medicalRec = medicalRecService.lambdaQuery()
.eq(MedicalRec::getMedicalStatus, EnumMedicalRec.DIGITAL_HUMAN_CREATED.getCode())
.eq(MedicalRec::getId, medicalId)
.one();
Assert.isTrue(null == medicalRec, "请先导入病例后再操作");
// 上传图片
FileResource fileResource = fileManageService.uploadFile(imageFile, imageFile.getContentType());
// 生成数字人
Human human = new Human();
human.setImageFileId(fileResource.getId());
human.setImageName(fileResource.getFileName());
human.setCreateUserId(UserUtil.getUser().getId());
human.setUpdateUserId(UserUtil.getUser().getId());
humanService.save(human);
// 异步调用生成数字人
humanExecutor.submit(() -> {
try {
generateHuman(human.getId(), medicalId);
} catch (Exception e) {
log.error("createHuman:生成数字人异常", e);
throw new BusinessException("生成数字人异常");
}
});
// 绑定病例
MedicalRec medicalRec1 = new MedicalRec();
medicalRec1.setMedicalStatus(EnumMedicalRec.ESTABLISHED_RECORD.getCode());
medicalRec1.setHumanId(human.getId());
medicalRec1.setId(medicalId);
medicalRecService.updateById(medicalRec1);
return true;
}
}

@ -9,8 +9,7 @@ public enum EnumMedicalRec {
DIGITAL_HUMAN_CREATED("已创建病例", "00"),
ESTABLISHED_RECORD("数字人生成中", "01"),
MEDICAL_RECORD_ESTABLISHED("已生成数字人", "02"),
COMPLETE("完成", "03"),
COMPLETE("完成", "02"),
;
private String description;

@ -3,14 +3,18 @@ package com.supervision.mapper;
import com.supervision.model.AskPatientAnswer;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
/**
* @author flevance
* @description vp_ask_patient_answer(-)Mapper
* @createDate 2023-11-03 11:13:26
* @Entity com.supervision.model.AskPatientAnswer
*/
* @author flevance
* @description vp_ask_patient_answer(-)Mapper
* @createDate 2023-11-03 11:13:26
* @Entity com.supervision.model.AskPatientAnswer
*/
public interface AskPatientAnswerMapper extends BaseMapper<AskPatientAnswer> {
AskPatientAnswer queryAnswerIdByMedicalId(String medicalId, String vidioType);
}

@ -0,0 +1,12 @@
package com.supervision.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.supervision.model.Human;
/**
* @Authorlongbao
* @Date2024/11/5 21:56
* @Description:
*/
public interface HumanMapper extends BaseMapper<Human> {
}

@ -0,0 +1,89 @@
package com.supervision.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
/**
*
* @TableName vp_human
*/
@Data
@TableName(value = "vp_human")
public class Human extends Model<Human> implements Serializable {
/**
*
*/
@TableId
private String id;
/**
* ,1使 1 2
*/
private Integer status;
/**
* ID
*/
public String imageFileId;
/**
* ID
*/
private String silentVideoFileId;
/**
* UID
*/
private String silentTaskUid;
/**
* ID
*/
private String dynamicVideoFileId;
/**
* UID
*/
private String dynamicTaskUid;
/**
*
*/
private String imageName;
/**
*
*/
private String description;
/**
* ID
*/
private String createUserId;
/**
*
*/
private LocalDateTime createTime;
/**
* ID
*/
private String updateUserId;
/**
*
*/
private Date updateTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

@ -30,6 +30,10 @@ public class MedicalRec extends Model<MedicalRec> implements Serializable {
*/
private String no;
@Schema(description = "数字人id")
private String humanId;
/**
*
*/

@ -3,6 +3,8 @@ package com.supervision.service;
import com.supervision.model.AskPatientAnswer;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* @author flevance
* @description vp_ask_patient_answer(-)Service
@ -10,4 +12,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface AskPatientAnswerService extends IService<AskPatientAnswer> {
/**
*
*
* @param medicalId id
* @param vidioType
*/
AskPatientAnswer queryAnswerIdByMedicalId(String medicalId, String vidioType);
}

@ -0,0 +1,13 @@
package com.supervision.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.supervision.model.Human;
/**
* @author Administrator
* @description vp_human()Service
* @createDate 2024-06-20 15:51:59
*/
public interface HumanService extends IService<Human> {
}

@ -4,17 +4,31 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.model.AskPatientAnswer;
import com.supervision.service.AskPatientAnswerService;
import com.supervision.mapper.AskPatientAnswerMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author flevance
* @description vp_ask_patient_answer(-)Service
* @createDate 2023-11-03 11:13:26
*/
* @author flevance
* @description vp_ask_patient_answer(-)Service
* @createDate 2023-11-03 11:13:26
*/
@Service
@Slf4j
public class AskPatientAnswerServiceImpl extends ServiceImpl<AskPatientAnswerMapper, AskPatientAnswer>
implements AskPatientAnswerService{
implements AskPatientAnswerService {
/**
*
*
* @param medicalId id
* @param vidioType
*/
@Override
public AskPatientAnswer queryAnswerIdByMedicalId(String medicalId, String vidioType) {
return this.baseMapper.queryAnswerIdByMedicalId(medicalId, vidioType);
}
}

@ -0,0 +1,25 @@
package com.supervision.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.mapper.AskCirculationDetailMapper;
import com.supervision.mapper.HumanMapper;
import com.supervision.model.AskCirculationDetail;
import com.supervision.model.Human;
import com.supervision.service.AskCirculationDetailService;
import com.supervision.service.HumanService;
import org.springframework.stereotype.Service;
/**
* @Authorlongbao
* @Date2024/11/5 21:56
* @Description:
*/
@Service
public class HumanServiceImpl extends ServiceImpl<HumanMapper, Human>
implements HumanService {
}

@ -0,0 +1,17 @@
package com.supervision.vo.manage;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
import java.io.FileInputStream;
@Data
public class HumanCreateReqVo {
@Schema(description = "静态图片")
private FileInputStream imageFile;
@Schema(description = "病例id")
private String medicalId;
}

@ -0,0 +1,20 @@
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 = "数字人名")
private String imageName;
@Schema(description = "静态图片ID")
private String imageFileId;
@Schema(description = "描述")
private String description;
}

@ -5,23 +5,41 @@
<mapper namespace="com.supervision.mapper.AskPatientAnswerMapper">
<resultMap id="BaseResultMap" type="com.supervision.model.AskPatientAnswer">
<id property="id" column="id" jdbcType="VARCHAR"/>
<result property="medicalId" column="medical_id" jdbcType="VARCHAR"/>
<result property="libraryQuestionId" column="library_question_id" jdbcType="VARCHAR"/>
<result property="question" column="question" jdbcType="VARCHAR"/>
<result property="answer" column="answer" jdbcType="VARCHAR"/>
<result property="code" column="code" jdbcType="VARCHAR"/>
<result property="answerResourceId" column="answer_resources_id" jdbcType="VARCHAR"/>
<result property="answerType" column="answer_type" jdbcType="INTEGER"/>
<result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
<id property="id" column="id" jdbcType="VARCHAR"/>
<result property="medicalId" column="medical_id" jdbcType="VARCHAR"/>
<result property="libraryQuestionId" column="library_question_id" jdbcType="VARCHAR"/>
<result property="question" column="question" jdbcType="VARCHAR"/>
<result property="answer" column="answer" jdbcType="VARCHAR"/>
<result property="code" column="code" jdbcType="VARCHAR"/>
<result property="answerResourceId" column="answer_resources_id" jdbcType="VARCHAR"/>
<result property="answerType" column="answer_type" jdbcType="INTEGER"/>
<result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
</resultMap>
<sql id="Base_Column_List">
id,medical_id,library_question_id,code,question,
id
,medical_id,library_question_id,code,question,
answer,answer_resources_id,answer_type,create_user_id,
create_time,update_user_id,update_time
</sql>
<select id="queryAnswerIdByMedicalId" resultType="com.supervision.model.AskPatientAnswer"
parameterType="java.lang.String">
select ql.question, apa.id, apa.answer_resource_id, apa.medical_id
from vp_ask_patient_answer apa
left join (select id, question
from vp_ask_template_question_library
where dict_id in
(select id
from vp_common_dic
where code in ('system_silent', 'system_dynamic'))) ql
on apa.library_question_id = ql.id
where medical_id = #{medicalId}
and ql.question = '["' + #{vidioType} + '"]'
order by apa.medical_id
</select>
</mapper>

Loading…
Cancel
Save