diff --git a/fys-admin/pom.xml b/fys-admin/pom.xml
index ff80564f..bb8fe450 100644
--- a/fys-admin/pom.xml
+++ b/fys-admin/pom.xml
@@ -133,6 +133,19 @@
1.5.7
compile
+
+
+ ws.schild
+ jave-core
+ 3.3.1
+
+
+
+
diff --git a/fys-admin/src/main/java/com/fuyuanshen/SimpleQR.java b/fys-admin/src/main/java/com/fuyuanshen/SimpleQR.java
new file mode 100644
index 00000000..7f0b4b51
--- /dev/null
+++ b/fys-admin/src/main/java/com/fuyuanshen/SimpleQR.java
@@ -0,0 +1,81 @@
+package com.fuyuanshen;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.File;
+
+public class SimpleQR {
+ public static void main(String[] args) throws Exception {
+ String text = "HELLO";
+ int size = 21; // 版本1的大小
+ boolean[][] qr = new boolean[size][size];
+
+ // 1. 三个定位标记
+ for (int i = 0; i < 7; i++)
+ for (int j = 0; j < 7; j++) {
+ boolean black = i == 0 || i == 6 || j == 0 || j == 6 || (i > 1 && i < 5 && j > 1 && j < 5);
+ qr[i][j] = qr[i][size - 1 - j] = qr[size - 1 - i][j] = black;
+ }
+
+ // 2. 定时图案(简化)
+ for (int i = 8; i < 13; i++) qr[i][6] = qr[6][i] = (i % 2 == 0);
+
+ // 3. 编码数据(极简编码)
+ byte[] data = text.getBytes();
+ int x = 20, y = 20, up = 1; // 从右下角开始
+ for (byte b : data)
+ for (int bit = 7; bit >= 0; bit--) {
+ while (qr[x][y] || (x == 6 && y < 9) || (y == 6 && x < 9) || (x < 9 && y < 9) ||
+ (x < 9 && y > size - 10) || (y < 9 && x > size - 10)) {
+ if (up > 0) {
+ if (--y < 0) {
+ y = 0;
+ x -= 2;
+ up = -1;
+ }
+ } else {
+ if (++y >= size) {
+ y = size - 1;
+ x -= 2;
+ up = 1;
+ }
+ }
+ if (x == 6) x--;
+ }
+ qr[x][y] = ((b >> bit) & 1) == 1;
+ if (up > 0) {
+ if (--y < 0) {
+ y = 0;
+ x -= 2;
+ up = -1;
+ }
+ } else {
+ if (++y >= size) {
+ y = size - 1;
+ x -= 2;
+ up = 1;
+ }
+ }
+ if (x == 6) x--;
+ }
+
+ // 4. 保存图像
+ int scale = 10, margin = 4;
+ BufferedImage img = new BufferedImage(
+ size * scale + margin * 2, size * scale + margin * 2, BufferedImage.TYPE_INT_RGB);
+ for (int i = 0; i < img.getWidth(); i++)
+ for (int j = 0; j < img.getHeight(); j++)
+ img.setRGB(i, j, 0xFFFFFF); // 白色背景
+
+ for (int i = 0; i < size; i++)
+ for (int j = 0; j < size; j++)
+ if (qr[i][j])
+ for (int di = 0; di < scale; di++)
+ for (int dj = 0; dj < scale; dj++)
+ img.setRGB(margin + i * scale + di, margin + j * scale + dj, 0x000000);
+
+ ImageIO.write(img, "PNG", new File("qr.png"));
+ System.out.println("二维码已生成");
+ }
+
+}
\ No newline at end of file
diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppFileController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppFileController.java
index a2de6185..fd072249 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppFileController.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppFileController.java
@@ -1,8 +1,8 @@
package com.fuyuanshen.app.controller;
-import com.fuyuanshen.app.domain.bo.AppBusinessFileBo;
+import com.fuyuanshen.equipment.domain.bo.AppBusinessFileBo;
import com.fuyuanshen.app.domain.dto.AppFileDto;
-import com.fuyuanshen.app.domain.vo.AppFileVo;
+import com.fuyuanshen.equipment.domain.vo.AppFileVo;
import com.fuyuanshen.app.service.AppFileService;
import com.fuyuanshen.common.core.domain.R;
import com.fuyuanshen.common.web.core.BaseController;
diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppOperationVideoController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppOperationVideoController.java
index 5338ba2c..bcba5c87 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppOperationVideoController.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppOperationVideoController.java
@@ -1,8 +1,8 @@
package com.fuyuanshen.app.controller;
-import com.fuyuanshen.app.domain.bo.AppOperationVideoBo;
-import com.fuyuanshen.app.domain.vo.AppOperationVideoVo;
-import com.fuyuanshen.app.service.IAppOperationVideoService;
+import com.fuyuanshen.equipment.domain.bo.AppOperationVideoBo;
+import com.fuyuanshen.equipment.domain.vo.AppOperationVideoVo;
+import com.fuyuanshen.equipment.service.IAppOperationVideoService;
import com.fuyuanshen.common.core.domain.R;
import com.fuyuanshen.common.core.domain.model.AppLoginUser;
import com.fuyuanshen.common.satoken.utils.AppLoginHelper;
diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppVideoController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppVideoController.java
index 63ddfb37..2c186f67 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppVideoController.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppVideoController.java
@@ -1,13 +1,20 @@
package com.fuyuanshen.app.controller;
import cn.dev33.satoken.annotation.SaIgnore;
+import com.fuyuanshen.app.domain.dto.AppAudioFileDto;
+import com.fuyuanshen.app.domain.dto.AppFileDto;
+import com.fuyuanshen.app.domain.dto.AppFileRenameDto;
+import com.fuyuanshen.app.domain.dto.TextToSpeechRequest;
import com.fuyuanshen.app.service.AudioProcessService;
import com.fuyuanshen.app.service.VideoProcessService;
import com.fuyuanshen.common.core.domain.R;
+import com.fuyuanshen.common.core.utils.StringUtils;
import com.fuyuanshen.common.idempotent.annotation.RepeatSubmit;
import com.fuyuanshen.common.web.core.BaseController;
+import com.fuyuanshen.equipment.domain.vo.AppFileVo;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -56,6 +63,7 @@ public class AppVideoController extends BaseController {
return R.ok(audioProcessService.generateStandardPcmData(text));
}
+
/**
* 提取文本内容(只支持txt/docx)
*/
@@ -65,4 +73,73 @@ public class AppVideoController extends BaseController {
return R.ok("Success",audioProcessService.extract(file));
}
+
+ /**
+ * 上传音频文件进行处理
+ * 支持MP3、WAV、PCM格式
+ */
+ @PostMapping("/uploadAudioToOss")
+ public R uploadAudioToOss(@ModelAttribute AppAudioFileDto bo) {
+ try {
+ bo.setSource("app");
+ String result = audioProcessService.uploadAudioToOss(bo);
+ return R.ok(result);
+ } catch (IllegalArgumentException e) {
+ return R.fail("文件格式错误: " + e.getMessage());
+ } catch (Exception e) {
+
+ return R.fail("上传处理失败: " + e.getMessage());
+ }
+ }
+
+ /**
+ * 文本转语音
+ * 支持MP3、WAV、PCM格式
+ */
+ @PostMapping("/ttsToOss")
+ public R textToSpeech(@RequestBody TextToSpeechRequest request) {
+ try {
+ if (request.getDeviceId() == null) {
+ return R.fail("设备ID不能为空");
+ }
+ if (StringUtils.isBlank(request.getText())) {
+ return R.fail("文本不能为空");
+ }
+
+ String result = audioProcessService.textToSpeech(
+ request.getDeviceId(),
+ request.getText(),
+ request.getFileSuffix(),
+ "app"
+ );
+ return R.ok(result);
+ } catch (Exception e) {
+ return R.fail("文本转语音失败: " + e.getMessage());
+ }
+ }
+
+
+ /**
+ * 查询语音文件列表
+ */
+ @GetMapping("/queryAudioFileList")
+ public R> queryAudioFileList(Long deviceId) {
+ return R.ok(audioProcessService.queryAudioFileList(deviceId,"app"));
+ }
+
+ /**
+ * 删除语音文件
+ */
+ @GetMapping("/deleteAudioFile")
+ public R deleteAudioFile(Long id) {
+ return audioProcessService.deleteAudioFile(id);
+ }
+
+ /**
+ * 文件重命名
+ */
+ @PostMapping("/renameAudioFile")
+ public R renameAudioFile(@RequestBody AppFileRenameDto bo) {
+ return audioProcessService.renameAudioFile(bo);
+ }
}
diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceXinghanController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceXinghanController.java
index 47f552a5..6746d867 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceXinghanController.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceXinghanController.java
@@ -26,6 +26,7 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
+import java.util.Map;
/**
* HBY670设备控制类
@@ -133,7 +134,7 @@ public class AppDeviceXinghanController extends BaseController {
}
// @Log("新增设备")
- @Operation(summary = "新增设备")
+ @Log(title = "新增设备")
@PostMapping(value = "/add")
public R addDevice(@RequestBody DeviceForm deviceForm) {
try {
@@ -144,4 +145,26 @@ public class AppDeviceXinghanController extends BaseController {
return R.ok();
}
+ @PostMapping(value = "/GetDeviceByName")
+ @Operation(summary = "通过蓝牙名/设备名称查询设备")
+ public R