diff --git a/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/controller/admin/recordaudio/RecordAudioController.java b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/controller/admin/recordaudio/RecordAudioController.java new file mode 100644 index 0000000..e943805 --- /dev/null +++ b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/controller/admin/recordaudio/RecordAudioController.java @@ -0,0 +1,89 @@ +package cn.iocoder.yudao.module.interphone.controller.admin.recordaudio; + +import org.springframework.web.bind.annotation.*; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import jakarta.validation.constraints.*; +import jakarta.validation.*; +import jakarta.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.interphone.controller.admin.recordaudio.vo.*; +import cn.iocoder.yudao.module.interphone.dal.dataobject.recordaudio.RecordAudioDO; +import cn.iocoder.yudao.module.interphone.service.recordaudio.RecordAudioService; + +@Tag(name = "管理后台 - 实时录音记录") +@RestController +@RequestMapping("/interphone/record-audio") +@Validated +public class RecordAudioController { + + @Resource + private RecordAudioService recordAudioService; + + @PostMapping("/create") + @Operation(summary = "创建实时录音记录") + @PreAuthorize("@ss.hasPermission('interphone:record-audio:create')") + public CommonResult createRecordAudio(@Valid @RequestBody RecordAudioSaveReqVO createReqVO) { + return success(recordAudioService.createRecordAudio(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新实时录音记录") + @PreAuthorize("@ss.hasPermission('interphone:record-audio:update')") + public CommonResult updateRecordAudio(@Valid @RequestBody RecordAudioSaveReqVO updateReqVO) { + recordAudioService.updateRecordAudio(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除实时录音记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('interphone:record-audio:delete')") + public CommonResult deleteRecordAudio(@RequestParam("id") Long id) { + recordAudioService.deleteRecordAudio(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除实时录音记录") + @PreAuthorize("@ss.hasPermission('interphone:record-audio:delete')") + public CommonResult deleteRecordAudioList(@RequestParam("ids") List ids) { + recordAudioService.deleteRecordAudioListByIds(ids); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得实时录音记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('interphone:record-audio:query')") + public CommonResult getRecordAudio(@RequestParam("id") Long id) { + RecordAudioDO recordAudio = recordAudioService.getRecordAudio(id); + return success(BeanUtils.toBean(recordAudio, RecordAudioRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得实时录音记录分页") + @PreAuthorize("@ss.hasPermission('interphone:record-audio:query')") + public CommonResult> getRecordAudioPage(@Valid RecordAudioPageReqVO pageReqVO) { + PageResult pageResult = recordAudioService.getRecordAudioPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, RecordAudioRespVO.class)); + } + +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/controller/admin/recordaudio/vo/RecordAudioPageReqVO.java b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/controller/admin/recordaudio/vo/RecordAudioPageReqVO.java new file mode 100644 index 0000000..b9183bf --- /dev/null +++ b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/controller/admin/recordaudio/vo/RecordAudioPageReqVO.java @@ -0,0 +1,66 @@ +package cn.iocoder.yudao.module.interphone.controller.admin.recordaudio.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 实时录音记录分页 Request VO") +@Data +public class RecordAudioPageReqVO extends PageParam { + + @Schema(description = "第三方录音ID", example = "29527") + private String thirdId; + + @Schema(description = "终端ID", example = "13888") + private Integer tId; + + @Schema(description = "用户ID", example = "5926") + private Long userId; + + @Schema(description = "用户名", example = "芋艿") + private String userName; + + @Schema(description = "群组ID", example = "4378") + private Long groupId; + + @Schema(description = "群组名称", example = "张三") + private String groupName; + + @Schema(description = "群组类型", example = "2") + private Integer groupType; + + @Schema(description = "组织ID", example = "12968") + private Long orgId; + + @Schema(description = "录音时长毫秒") + private Integer durationMs; + + @Schema(description = "音频路径") + private String audioPath; + + @Schema(description = "完整音频OSS URL", example = "https://www.iocoder.cn") + private String audioOssUrl; + + @Schema(description = "编码格式") + private String codeFormat; + + @Schema(description = "录音时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] audioTime; + + @Schema(description = "ASR状态 0未处理 1处理中 2完成 3失败", example = "2") + private Integer asrStatus; + + @Schema(description = "语音识别结果") + private String asrText; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/controller/admin/recordaudio/vo/RecordAudioRespVO.java b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/controller/admin/recordaudio/vo/RecordAudioRespVO.java new file mode 100644 index 0000000..7965a82 --- /dev/null +++ b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/controller/admin/recordaudio/vo/RecordAudioRespVO.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.module.interphone.controller.admin.recordaudio.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 实时录音记录 Response VO") +@Data +@ExcelIgnoreUnannotated +public class RecordAudioRespVO { + + @Schema(description = "用户名", example = "芋艿") + @ExcelProperty("用户名") + private String userName; + + @Schema(description = "群组名称", example = "张三") + @ExcelProperty("群组名称") + private String groupName; + + @Schema(description = "群组类型", example = "2") + @ExcelProperty("群组类型") + private Integer groupType; + + @Schema(description = "录音时长毫秒") + @ExcelProperty("录音时长毫秒") + private Integer durationMs; + + @Schema(description = "音频路径") + @ExcelProperty("音频路径") + private String audioPath; + + @Schema(description = "完整音频OSS URL", example = "https://www.iocoder.cn") + @ExcelProperty("完整音频OSS URL") + private String audioOssUrl; + + @Schema(description = "编码格式") + @ExcelProperty("编码格式") + private String codeFormat; + + @Schema(description = "录音时间") + @ExcelProperty("录音时间") + private LocalDateTime audioTime; + + @Schema(description = "ASR状态 0未处理 1处理中 2完成 3失败", example = "2") + @ExcelProperty("ASR状态 0未处理 1处理中 2完成 3失败") + private Integer asrStatus; + + @Schema(description = "语音识别结果") + @ExcelProperty("语音识别结果") + private String asrText; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/controller/admin/recordaudio/vo/RecordAudioSaveReqVO.java b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/controller/admin/recordaudio/vo/RecordAudioSaveReqVO.java new file mode 100644 index 0000000..286ec68 --- /dev/null +++ b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/controller/admin/recordaudio/vo/RecordAudioSaveReqVO.java @@ -0,0 +1,12 @@ +package cn.iocoder.yudao.module.interphone.controller.admin.recordaudio.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import jakarta.validation.constraints.*; + +@Schema(description = "管理后台 - 实时录音记录新增/修改 Request VO") +@Data +public class RecordAudioSaveReqVO { + +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/dal/dataobject/recordaudio/RecordAudioDO.java b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/dal/dataobject/recordaudio/RecordAudioDO.java new file mode 100644 index 0000000..562ab78 --- /dev/null +++ b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/dal/dataobject/recordaudio/RecordAudioDO.java @@ -0,0 +1,93 @@ +package cn.iocoder.yudao.module.interphone.dal.dataobject.recordaudio; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 实时录音记录 DO + * + * @author 超级管理员 + */ +@TableName("interphone_record_audio") +@KeySequence("interphone_record_audio_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RecordAudioDO extends BaseDO { + + /** + * 本地ID + */ + @TableId + private Long id; + /** + * 第三方录音ID + */ + private String thirdId; + /** + * 终端ID + */ + private Integer tId; + /** + * 用户ID + */ + private Long userId; + /** + * 用户名 + */ + private String userName; + /** + * 群组ID + */ + private Long groupId; + /** + * 群组名称 + */ + private String groupName; + /** + * 群组类型 + */ + private Integer groupType; + /** + * 组织ID + */ + private Long orgId; + /** + * 录音时长毫秒 + */ + private Integer durationMs; + /** + * 音频路径 + */ + private String audioPath; + /** + * 完整音频OSS URL + */ + private String audioOssUrl; + /** + * 编码格式 + */ + private String codeFormat; + /** + * 录音时间 + */ + private LocalDateTime audioTime; + /** + * ASR状态 0未处理 1处理中 2完成 3失败 + */ + private Integer asrStatus; + /** + * 语音识别结果 + */ + private String asrText; + + +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/dal/mysql/recordaudio/RecordAudioMapper.java b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/dal/mysql/recordaudio/RecordAudioMapper.java new file mode 100644 index 0000000..86c607b --- /dev/null +++ b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/dal/mysql/recordaudio/RecordAudioMapper.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.interphone.dal.mysql.recordaudio; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.interphone.dal.dataobject.recordaudio.RecordAudioDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.interphone.controller.admin.recordaudio.vo.*; + +/** + * 实时录音记录 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface RecordAudioMapper extends BaseMapperX { + + default PageResult selectPage(RecordAudioPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(RecordAudioDO::getThirdId, reqVO.getThirdId()) + .eqIfPresent(RecordAudioDO::getTId, reqVO.getTId()) + .eqIfPresent(RecordAudioDO::getUserId, reqVO.getUserId()) + .likeIfPresent(RecordAudioDO::getUserName, reqVO.getUserName()) + .eqIfPresent(RecordAudioDO::getGroupId, reqVO.getGroupId()) + .likeIfPresent(RecordAudioDO::getGroupName, reqVO.getGroupName()) + .eqIfPresent(RecordAudioDO::getGroupType, reqVO.getGroupType()) + .eqIfPresent(RecordAudioDO::getOrgId, reqVO.getOrgId()) + .eqIfPresent(RecordAudioDO::getDurationMs, reqVO.getDurationMs()) + .eqIfPresent(RecordAudioDO::getAudioPath, reqVO.getAudioPath()) + .eqIfPresent(RecordAudioDO::getAudioOssUrl, reqVO.getAudioOssUrl()) + .eqIfPresent(RecordAudioDO::getCodeFormat, reqVO.getCodeFormat()) + .betweenIfPresent(RecordAudioDO::getAudioTime, reqVO.getAudioTime()) + .eqIfPresent(RecordAudioDO::getAsrStatus, reqVO.getAsrStatus()) + .eqIfPresent(RecordAudioDO::getAsrText, reqVO.getAsrText()) + .betweenIfPresent(RecordAudioDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(RecordAudioDO::getId)); + } + +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/enums/ErrorCodeConstants.java b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/enums/ErrorCodeConstants.java new file mode 100644 index 0000000..87d8672 --- /dev/null +++ b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/enums/ErrorCodeConstants.java @@ -0,0 +1,7 @@ +package cn.iocoder.yudao.module.interphone.enums; + +import cn.iocoder.yudao.framework.common.exception.ErrorCode; + +public interface ErrorCodeConstants { + ErrorCode RECORD_AUDIO_NOT_EXISTS = new ErrorCode(1000101, "实时录音记录不存在"); +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/service/recordaudio/RecordAudioService.java b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/service/recordaudio/RecordAudioService.java new file mode 100644 index 0000000..ea36e28 --- /dev/null +++ b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/service/recordaudio/RecordAudioService.java @@ -0,0 +1,62 @@ +package cn.iocoder.yudao.module.interphone.service.recordaudio; + +import java.util.*; +import jakarta.validation.*; +import cn.iocoder.yudao.module.interphone.controller.admin.recordaudio.vo.*; +import cn.iocoder.yudao.module.interphone.dal.dataobject.recordaudio.RecordAudioDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 实时录音记录 Service 接口 + * + * @author 超级管理员 + */ +public interface RecordAudioService { + + /** + * 创建实时录音记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createRecordAudio(@Valid RecordAudioSaveReqVO createReqVO); + + /** + * 更新实时录音记录 + * + * @param updateReqVO 更新信息 + */ + void updateRecordAudio(@Valid RecordAudioSaveReqVO updateReqVO); + + /** + * 删除实时录音记录 + * + * @param id 编号 + */ + void deleteRecordAudio(Long id); + + /** + * 批量删除实时录音记录 + * + * @param ids 编号 + */ + void deleteRecordAudioListByIds(List ids); + + /** + * 获得实时录音记录 + * + * @param id 编号 + * @return 实时录音记录 + */ + RecordAudioDO getRecordAudio(Long id); + + /** + * 获得实时录音记录分页 + * + * @param pageReqVO 分页查询 + * @return 实时录音记录分页 + */ + PageResult getRecordAudioPage(RecordAudioPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/service/recordaudio/RecordAudioServiceImpl.java b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/service/recordaudio/RecordAudioServiceImpl.java new file mode 100644 index 0000000..afaa681 --- /dev/null +++ b/cc-admin-master/yudao-module-interphone/src/main/java/cn/iocoder/yudao/module/interphone/service/recordaudio/RecordAudioServiceImpl.java @@ -0,0 +1,81 @@ +package cn.iocoder.yudao.module.interphone.service.recordaudio; + +import cn.hutool.core.collection.CollUtil; +import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.interphone.controller.admin.recordaudio.vo.*; +import cn.iocoder.yudao.module.interphone.dal.dataobject.recordaudio.RecordAudioDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.interphone.dal.mysql.recordaudio.RecordAudioMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList; +import static cn.iocoder.yudao.module.interphone.enums.ErrorCodeConstants.*; + +/** + * 实时录音记录 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class RecordAudioServiceImpl implements RecordAudioService { + + @Resource + private RecordAudioMapper recordAudioMapper; + + @Override + public Long createRecordAudio(RecordAudioSaveReqVO createReqVO) { + // 插入 + RecordAudioDO recordAudio = BeanUtils.toBean(createReqVO, RecordAudioDO.class); + recordAudioMapper.insert(recordAudio); + + // 返回 + return recordAudio.getId(); + } + + @Override + public void updateRecordAudio(RecordAudioSaveReqVO updateReqVO) { + + } + + @Override + public void deleteRecordAudio(Long id) { + // 校验存在 + validateRecordAudioExists(id); + // 删除 + recordAudioMapper.deleteById(id); + } + + @Override + public void deleteRecordAudioListByIds(List ids) { + // 删除 + recordAudioMapper.deleteByIds(ids); + } + + + private void validateRecordAudioExists(Long id) { + if (recordAudioMapper.selectById(id) == null) { + throw exception(RECORD_AUDIO_NOT_EXISTS); + } + } + + @Override + public RecordAudioDO getRecordAudio(Long id) { + return recordAudioMapper.selectById(id); + } + + @Override + public PageResult getRecordAudioPage(RecordAudioPageReqVO pageReqVO) { + return recordAudioMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-interphone/src/main/resources/mapper/recordaudio/RecordAudioMapper.xml b/cc-admin-master/yudao-module-interphone/src/main/resources/mapper/recordaudio/RecordAudioMapper.xml new file mode 100644 index 0000000..7a75cb6 --- /dev/null +++ b/cc-admin-master/yudao-module-interphone/src/main/resources/mapper/recordaudio/RecordAudioMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file